FLOPPY: Plugin for localStorage, sessionStorage, IndexedDB storage, List Creation/Manipulation, Iteration, and More! Now with even more video docs!

I already removed pretty much everything, I had things structured in the wrong ways, duplicates and unnecessary. Thank you for your help

1 Like

Howdy @keith!

I’m experiencing a similar bug (as the one I had before) with the Floppy Reader bugging out when I try to store a key list using a Search For, through the “Store Keys Floppy Reader” action.

In the test I’m trying to store 3 key lists (I tested them individually). Key Lists 1 and 2 works cause the List of Things are already cached, Key List 3 will bug out cause it’s a Search.

Here’s the error log from Chrome:

run_debug.js:6 page is loaded after 1.759 seconds
VM4093 Floppy--localStorage--Lists---more--initialize--Floppy-Reader-.js:187 Uncaught (in promise) m {not_ready_key: L, suppress_dependency_error: undefined}
actionStoreKeys @ VM4093 Floppy--localStorage--Lists---more--initialize--Floppy-Reader-.js:187
eval @ Floppy--localStorage--Lists---more--element_action--Floppy-Reader-Store-Keys-.js:8
(anonymous) @ run_debug.js:6
x @ run_debug.js:6
(anonymous) @ run_debug.js:6
n.run_without_catching_not_ready @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
evaluate @ run_debug.js:6
v @ run_debug.js:6
y @ run_debug.js:6
n.run_once @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
n.run_once @ run_debug.js:6
run @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
run @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t.run_subsequent_actions @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
resolve @ run_debug.js:6
(anonymous) @ run_debug.js:6
t @ run_debug.js:6
evaluate @ run_debug.js:6
run_me @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
s.traceSpan @ run_debug.js:6
o @ run_debug.js:6
requestAnimationFrame (async)
(anonymous) @ run_debug.js:6
invalidate @ run_debug.js:6
invalidate @ run_debug.js:6
_was_updated @ run_debug.js:6
_dec @ run_debug.js:6
notify @ run_debug.js:6
_was_updated @ run_debug.js:6
turn @ run_debug.js:6
handle_results @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
resolve @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
O @ run_debug.js:6
b.wait_for_lib @ run_debug.js:6
g.recheck_uid @ run_debug.js:6
(anonymous) @ run_debug.js:6
i @ run_debug.js:2
fireWith @ run_debug.js:2
A @ run_debug.js:4
(anonymous) @ run_debug.js:4
load (async)
send @ run_debug.js:4
ajax @ run_debug.js:4
a.ajax @ static.js:4
request @ run_debug.js:6
post @ run_debug.js:6
elasticsearch @ run_debug.js:6
load @ run_debug.js:6
load_get_children @ run_debug.js:6
execute_call_get_children @ run_debug.js:6
(anonymous) @ run_debug.js:6
execute_get_children @ run_debug.js:6
execute_query @ run_debug.js:6
execute_with_dependency @ run_debug.js:6
(anonymous) @ run_debug.js:6
_with_eval_node @ run_debug.js:6
get_children @ run_debug.js:6
all @ run_debug.js:6
make_static @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
evaluate @ run_debug.js:6
v @ run_debug.js:6
y @ run_debug.js:6
n.run_once @ run_debug.js:6
run @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
run @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t.run_subsequent_actions @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t._run_workflow @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t.start_custom_workflow @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t.run_subsequent_actions @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
t._run_workflow @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
r @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
freeze_workflows @ run_debug.js:6
t.run_workflows @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
n.run_once @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
freeze_workflows @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
(anonymous) @ run_debug.js:6
_attach_success @ run_debug.js:6
then @ run_debug.js:6
callback @ run_debug.js:6
n.run_once @ run_debug.js:6
r.run_element_workflow @ run_debug.js:6
(anonymous) @ run_debug.js:6
dispatch @ run_debug.js:3
q.handle @ run_debug.js:3

Thanks in advance!

Yep, you’re correct. Sorry about that. Fixed in just-published 1.8.8. Let me know if you find any other weirdness after updating, @ihsanzainal84!

(1.8.8 also includes a new utility action: Utility: Make Numeric List mostly for demo purposes for an upcoming video, but it’s also useful on its own.)

1 Like

Thanks for the quick fix @keith!

Working as intended so far and I will definitely let you know if any other weirdness does pop up!

1 Like

@ihsanzainal84 I had tested, but not thoroughly enough, I guess! :man_shrugging:

(Oh… psst… Floppy is on sale today, just because it’s Halloween. Permanently license it in a project for just $7… that offer expires later today so don’t sleep on it…)

Howdy howdy… Two things (1) I recently published an update (1.8.8) which fixes a data loading issue in Floppy Reader, and also adds a new “Utility: Make Numeric List” action, which is used in the video below.

(2) The new Floppy instructional video below covers iteration and looping with Floppy using Step Mode. There’s a long intro in which I talk about iteration in general, then go on to show how to use Step Mode to iteratively run a simple workflow. I then compare Step Mode to using Floppy’s List Math and Code: Array Method actions (List Math and Code: Array Method are orders of magnitude faster than doing simple calculations iteratively in a workflow):

And the page I am building/playing with in this video is here: https://list-shifter-dev-test.bubbleapps.io/version-test/floppy_step_demo_build?debug_mode=true

4 Likes

MORE FLOPPY VIDEO DOCS: Here’s a video talking about a not-uncommon problem: How can we sort some list of Things based on the number of items in some list-type subfield? (Heck, how can we even get a :count for each of those fields!?) Floppy’s “Utility: Count Each Field/Sort Action” helps to solve this.

(Note: In the last part of this video, I found a little bug with using “Custom Count List” and fixed it, but that fix is in Floppy version 1.8.9 which for some reason is under review with Bubble, so it’s not available just yet. Typically, dot releases don’t trigger a review, so :man_shrugging:.)

3 Likes

UPDATE TIME (again)!: I just pushed Floppy version 1.8.14, which adds a new server-side action version of Floppy’s Utility: List Math action. It’s named List Math SSA (clever, no?).

List Math SSA has the same interface as the client-side action, but lets you do basic math operations on numeric lists in backend workflows. I’ll talk about this in a future video, but you use it exactly like List Math (demonstrated in this previous Floppy video about Step Mode).

5 Likes

Sorry that there seems to be a new Floppy update every day! Since plugin publishing was a little disrupted the day before yesterday, I think that there might have been a regression in some of Floppy’s code (specifically, fixes I made to the Count Each Field/Sort action, which is explained in the video here).

So, I just published Floppy 1.8.17 which ensures that the actual code for Floppy includes all of those changes. Also, this new version includes a new option in List Math SSA that can optionally make it report how long, in milliseconds, the computation took (literally the time from the start of the function once it’s running in its AWS container, to the moment just before it returns its results).

2 Likes

UPDATE TIME AGAIN: Just published Floppy 1.8.21 which fixes Floppy’s “automatic retrieval” and Retrieve Action (which I seem to have broken with a very dumb copy/paste error some versions back that’s just been hanging around in the code ever since). Apologies!

Definitely upgrade to 1.8.21 and there’s a bigger update with some new SSAs coming soon!

1 Like

Aside: Floppy will stabilize soon (and update frequency will go to a more normal pace) but I wish it had about 100 more users so that if something boneheaded happens like that again, someone will notice immediately and tear me a new one here in the forum.

Next update will include SSA versions of Make Numeric List and Count Fields/Sort actions, which might be useful sometimes in backend workflows.

1 Like

If you want 1000 more customers, add in a new type of repeating group that has none of the existing flaws :), but a lot of new features.

Other than that, I’ll pick floppy up soon.

Ha ha. Plugins with visual elements are a shitshow. Anyway, List Shifter is pretty much THE headless repeating group solution so no reason to hoe that row again. Also, I already offered you an app install for Floppy, @troy.roberge, so just lemme know where you want an install.

1 Like

I buy good stuff bud. There are enough half baked plugins that are on the market stating “unfortunately our plugin doesn’t do xyz basic feature”.

Thanks, but I’d rather support hard working solo guys vs low grade big guys.

3 Likes

Tip ‘o’ the hat, @troy.roberge :billed_cap:!

UPDATE TIME AGAIN: Just published Floppy 1.8.22 which restores correct code for Floppy Reader, which was borked in 1.8.21. Sigh.

1 Like

ANOTHER UPDATE… this time with new features: I just pushed update 1.8.25 which adds two new actions:

  • Make Numeric List SSA: Which is (you guessed it) a Server-Side Action version of Floppy’s “Utility: Make Numeric List” action.

  • Count Each Field/Sort SSA: Which is a Server-Side Action version of Floppy’s “Utility: Count Each Field/Sort” action.

These are intended only for use in backend/API workflows. Obviously, you can test them in a client-side (in page) workflow, but they’re intended for when want to do these sorts of actions on the backend. (Because of cold start time, SSAs aren’t really appropriate for use in client-side workflows.)

Also, a few caveats with these (which would also apply to the List Math SSA and some of which apply to the client-side versions as well):

While you could, with “Make Numeric List SSA” make some absolutely gigantic lists of numbers, keep in mind that, at the time of this writing, list-type fields on Bubble Things can hold a maximum of 100,000 values. Attempting to set a list field to a list larger than 100,000 items will fail (mostly silently). The same goes for “add list” and “plus item” – if the resulting list will be larger than 100,000 items those operations will fail.

So, while these SSAs could be used to generate and operate on truly huge lists of numbers, you might have a hard time storing the output of an operation that results in more than 100,000 items. (You’d have to chunk a larger list up and store the results in multiple fields.)

Also, note that the number of items that you might possibly input to these actions will be essentially governed by your app’s capacity. That is to say, at some point Searches will time out. I find that on a personal plan one can usually do searches that result in as much as 10K-20K results, but searches that result in numbers of results higher than that will time out (and they take quite long to run).

The SSAs themselves are very, very fast, however, and the processing time within these plugins (once it is spun up) is very short. For example, Make Numeric List will make a list of 10,000 numbers in just 1 millisecond. But the total time to run a workflow that does Make Numeric List and then takes that list and creates a new Thing with a number list field on it, setting that field to the results of Make Numeric List, will be about 1500 ms. (Measured as the time from when the backend workflow is launched until the newly-created object is detected in a page.)

All that aside, these are very useful tools to have at your disposal (particularly List Math).

Note that I intend to make more SSA versions of various Floppy actions (like SSA versions of the various actions that let you manipulate Floppy’s RAM List) over time. The code parts are easy, but building the UI parts in the plugin builder is extremely tedious (especially since one can’t just copy the interface from some existing action one has already built and paste it somewhere new – we literally have to manually redefine all the fields from scratch which makes me crazy).

6 Likes

Just want to say thanks for all the quick fixes and awesome feature updates. You and @vini_brito are my 2 most favourite plugin builders!

I think you are already nuts but don’t get too crazy on us @keith

1 Like

You’re welcome! I appreciate you using it and suffering through early adopter times. (It was actually very stable in the first released version but when I added IndexedDB support that had a lot of complexities I hadn’t fully anticipated.) It’s in a pretty good place right now, however!

There are a few things I’m rethinking (like, there’s no option to automatically push Floppy’s storage values into the RAM scalar/RAM list at initialization, which was intentional, but after using it more I’m like, damn that would be handy and save a lot of workflow steps in some applications).

Appreciate ongoing feedback!

2 Likes

Hey @keith Long time lurker - I’m working with large lists a lot to either import client information for processing and to support a backend service (bubble acts as the front end for a product I make)

I haven’t jumped yet because these were managed as BE workflows and from what I understood you were doing the processing in the browser.

The SSA stuff changes this. One of my big challenges in when I import data I’ve processed externally I need to match back UID’s of around 4000 records and do a little processing on the data (as TEXT isn’t recognised as a date for example with the bulkload API) . With recursive workflows this can take an hour or more. Is this the kind of thing you are looking at tackling down the track with Floppy?

Cheers - John

1 Like