Forum Academy Marketplace Showcase Pricing Features

List Shifter: Reverse, Rotate, Swap and ITERATE (Loop) Over Bubble Lists | Now at v1.4: Adds Numeric Option, GET INDEX Action

Slightly off-topic dept.: List Shifter fans will likely be interested in my new (paid) plugin Parallels, a plugin for date/date list/date range/range list manipulation. Bubble is still “reviewing” the plugin, but it will be available soon. Official thread here:

1 Like


Is it possible to shift items up and down from different pages when List Shifter is in Pagination mode?

I’ve tried multiple ways - I know it is by design based on Keith’s video and I’ve also tried to use 2 list shifters at the same time, but no dice.

Anybody come up against the same use case?

Well, this is just really tricky to do as it’s not supported by List Shifter. The reason being that List Shifter (in general) does not know, nor does it care, the VALUES of the items in your list. This is part of the magic.

Consider the following:

Q: What do I need to know to swap two items in an array? Do I need to know their values?

A: No, I do not need to know their values. I need only know that you want to take item X in the list and swap its position with item Y in the list. And this is what SWAP does.

When LS is in Pagination mode, there is (at present) no concept of X’s position in the full list versus where it is in the currently displayed page.

It’s not impossible to know this, it’s just something that List Shifter doesn’t handle right now.

Hi Keith:

I really love your plugin and the expertise and elan with which you put it together. I really appreciate it. I’m trying to get an MVP up and monetize and am definitely wanting to buy you a cup of coffee or round of drinks. (FYI, if you have a Paypal account, I’d love that as it is waaaay easier.)

I figured that my ask wasn’t something easy to put together due to the logic under which List Shifter and bubble pagination operates. I’ve tried a couple hacks and have tried to work around it but - it’s not entirely clear what workaround that would be.

I’m creating a document builder and users may need to move part of the text up or down as they edit and create the document. This is my main problem right now and this is what prompted me to write to the group.

Later on, I’ll need to group items together and then process and save them to a new list - but I figure I can do this with some of your posts about featuring the process function. If I understand the logic properly, this should work.

Would you point me in the right direction? I’m not sure where I should investigate at the moment for moving some items from one page of List Shifter to another. (Or perhaps I could use 2 Listshifters and then sort on an item tagged with an incremental number, then make changes to the number when it is shifted up or down. I’m not sure, will have to think on it.)

P. S. I know you must be very busy. I know it took time to learn what you know and you are very generous to share it with the community. I understand this and I appreciate it. Regardless of any reply, I appreciate your making this plugin karmaware so that entrepreneurs like me can figure out how to use it and if we have an MVP. Hopefully I can monetize and do more than just a cup of coffee or round of drinks; I see the love and care you put into this project and I recognize it. Thank you for your commitment to community and your passion for quality.

Hello @keith
I asking myself how to sort a rg by a first criteria then a second one with the plugin ?
I need to filter first by emergency (yes/no) then by priority (number).
Hope you can help

Hi @keith and thank you for this amazing plugin,
Hi @ListShifterlovers,

After a few days trying (and failing) to store the results printed in a repeating group (see link below), some skilled bubblers pointed me to your direction.

To make a long story short, i want to print a graph (and for that I need a list) with data calculated and printed within a repeating group. Not possible to make that list outside the RG as the data is a running balance, each amount being linked with the previous row of the RG.

Would it be possible to hack this problem with one of the so many List Shifter’s features?

Thank you so much,

Hi @keith and thanks for your contribution.
Is there any way I could use List Shifter to sort a RG by a text element (Distance) which value does not come from the database.

I’d like to sort the RG by distance. The distance does not come from the database but from an expression placed in the RG cell.


Yes, you’d use the PROCESS List action to build your list of running balances. See my introductory video to Process List.

1 Like

Yes, @axelngabe, List Shifter’s SORT action lets you sort one list by another list.

So instead of computing your distances in the cell of the RG, you could use PROCESS List to build that list instead (just like Run JavaScript you can execute your own code in a Process List step — though this is an advanced feature that I’ve not really demonstrated anywhere).

(Put your locations into List Shifter as the source/original list. Use PROCESS List to build the the list of distances and publish that to List Shifter’s Processed List output.)

And then, having your list of distances, you could use the SORT action to sort your locations by that list of distances. (Using List Shifter’s Processed List as the “Sort by List” in the SORT action’s interface.) The list of locations, sorted by the distances, will be available at List Shifter’s Shifted List output.

One thing to note is that, in the current version, List Shifter does not also publish a list of the sorted version of the “sort by” list. (This would be a nice thing to have, but it’s not necessary, just note that the way you’d make your constructed list of distances match up with your sorted list of locations is to just do that sort in Bubble. E.g., List Shifter's Processed List:sorted.)

And then, you see, any given location’s (for example List Shifter's Shifted List:item n) distance is List Shifter's Processed List:sorted:item n.

1 Like

@keith Thanks for the awesome plugin! Stumbled upon it yesterday, and think it is what I need.

A quick question for you: I’m using PROCESS LIST to divide numbers in my original list by numbers in my “LS Type List Constant” and sending the output to my Processed List. However, I found that when the denominator is 0 (which is technically an error), the output seems to be omitted from the Processed List altogether.

Is there a way to display “Error” or control what is stated as the result in a scenario like this?


@keith, awesome plugin with a lot of promise for my use case !

For now I can’t make the ITERATE function work for me and I can’t tell the nature of the error. I don’t want to push my luck and have you do detailed tech support on a karmaware plugin, but from these error messages, would you be able to tell the *general direction* of the errors ?

I’ve put a Debug Buddy event before the ITERATE event (“Iterate recurrence is about to start”) and at the beginning of the iteration itself (“recurrence iteration has started”)
The error messages are inscrutable to me, but I’m guessing an error happens just before the iteration starts, and then the first iterate loop fails ?

You’ve talked previously about the potential slowness of having data actions like Create inside an ITERATE loop, but it doesn’t seem to be the problem here. I’ve tried leaving the page open for a while in case the server side wasn’t finished, and I’m not getting a “you have unsaved changes on this page” error message either.

For reference, here’s what I’m trying to do :

  • users are in a popup menu above a calendar, in which they can create a recurrent event, like in Google agenda
  • when they save such an event, the app creates the first event and then triggers the ITERATE
  • ITERATE operates on a ListShifter that holds the number of days by which to offset the subsequent events (eg 7, 14, 21 if the event repeats every week)
  • for each offset days value, the ITERATE loop should create an event with identical data with the offset date.
  • then close popup and reset all relevant groups.

Appreciate. Hope it’s not too much of a bother.

So I did manage to make it work, thought I’d post an update in case somebody is in the same situation as me.

It seems like my problem was coming from the popup resetting before the ITERATE loop could run, since it apparently runs separately from the main workflow.
I don’t know exactly in which order bubble / ListShifter do things, but even though the “reset popup” step was after the ITERATE, it executed before. And since the ListShifter element was on the popup and the ITERATE used values from the popup’s input fields, it wouldn’t work.

I solved the issue by getting the ListShifter safely out of the popup at the bottom of the page, and making the ITERATE reference a database element rather than fields. I still have to fix a few other workflows, but otherwise it seems to be behaving as expected.

I still don’t know what these console errors mean, but it doesn’t seem to impede the functionality.

Can You Run Nested Interates With Listshifter???

Hi @keith

I figured out how to make a karma contribution so disregard the note I sent directly to you asking for a URL. In the interim, I have also lost confidence that I have figured out how to make Listshifter (together with some of your other plugins e.g. Parallels) do what I need.

I have tried creating a loop within a loop (ie. One Listshifter Iterate calling another Listshifter Iterate) but can’t get that to work and am not clear if it is even possible.

What I thought I might also be able to do was iterate a second list within a Processor but can’t figure out how.

What I am trying to do is take a list of date ranges (which would ideally be part of a larger custom Data type) and see if the date ranges within another list) are “contained by” that first range.
@alix.ladent - I get the impression that we are trying to do very similar things with recurring events.

1.) Can one do embedded Listshifters - first loop creates Custom State as current iteration list one and calles a second Iterate that compares that CS value against all values in the second list.

2.) Can I use Processor to select an item in a second list, using one of the functions, a counter to select date ranges (or entire records ) as “current” records held in another Listshift to compare with the current iteration of the processor?

Thanks in advance for your help.
To all other on this thread - if you have any insights to offer please let me know.



Seems like at least one person tried to do iteration-in-an-iteration thing, with no news as to whether it worked.

From my limited experience playing around with listshifter, I don’t think it will be possible unless you can tell a workflow to ‘pause’ until the nested loop has finished running. Loops and workflows don’t seem to run in a neat sequence, and it’s possible your nested loops will try to all run at once after your initial loops are finished.

I have not tried using Processor for anything else than basic math so can’t help you with that.

Hey @keith and the bubble gang.

I’m slowly getting my head around the List Shifter plugin (or at least trying to), the capability looks awesome but I wondered, can/how can List Shifter be used to group list items and spit out a new grouped list?

Bubble’s native :group_by is incredibly slow, even on 100-200 records and I wondered given that ListShifter is able to crank out some amazing performance if this would work, and if so, how?

My thought is to load all the data into list shifter then have it group the data based on a user specified variable (eg: creation date). The purpose is to show grouped datapoints in a line chart with filters for day, month, year, 5 years, All Time

Thanks in advance for any guidance :pray:

Hey @keith,

Congratulations for the excellent job with List Shifter!

I am in the development stage and would like to know if List Shift could help me with list complex calculation.

Could you give us more information or a guide on how to use “eval(x) aka Run Javascript”?

I already tried a simple example, see bellow:

Original List: {5, 10, 15}

Step Operand X: Long Text Constant

Operator 1: eval(x) aka Run Javascript

Push RS1 to Proc List: “yes”

Long Text Constant:

var re = test( This ListShifterKW´s Shifted List + 0)

function test(x){

var d = x * 2 + 0;

return d;



Response on Repeat Group: {10, 10, 10}

Should Be: {10, 20, 30}

Problem: For some reason the function does not iterate over the list. It is repeating the first item result.

I appreciate any help and will recognise you when my app goes live…

Hey @keith,
I need your help in how to use “eval(x) aka Run Javascript” in a Process List.

Could you share some guide, documentation, video, link, etc?

Thanks for the attention!

In short, import your code via the long text constant field (where you’ll find a note about a few reserved variables you can use to access, for example, the current Item, the result of some previous step, etc.).

Then, in a step, set Operand X to “Long Text Constant” and select “eval(x)” as the operator. (Now the step runs eval() on the code defined in Long Text Constant.)

The value returned by your code becomes the Result of that step.

(This is just as in Run JavaScript, where the returned value of the last statement, or an explicit return statement, is the value returned.)

Hey @keith,

Thanks for the feedback.

I already follow the steps you said.
But, I still have problems with Process List Result.

In my system I have:

Data Type “tbl_parceiro” with a numeric field: “prc_tempo_espera”

Actual data in Data Type: [10, 11, 12, 13, 14, 15, 16, 17, 18]

I have a List Shifter LS1

In workflow I use “Initialized/Updated” then in Step 1 “PROCESS List LS1”

I have Repeat Group in a Pop up to show the Process List Result

  • The result should be: [20, 22, 24, 26, 28, 30, 32, 34, 36]

Some questions:

1- What is the option (variable) to use in list shifter LS1 in the field: Long Text Constant?
Here is the formula:
var result = test(This ListShifterKW´s Original List);

function test(x){
var d = x * 2;
return d;

  • I already tried:
    • This ListShifterKW´s Selected Item Number = no result
    • This ListShifterKW´s Current Iteration Item = no result
    • This ListShifterKW´s Original List = only push first data from list
    • This ListShifterKW´s Shifted List = only push first data from list

2- What I need to do to “Process List” iterate over my list?

It only use the first data of my Data Type (table).

Thanks in advance!

Hey @keith,

I still need your help.

TLDR: How can I use “Dynamic Data from Original List” with “eval(x) aka Run Javascript” properly?

At the moment “eval(x) aka Run Javascript” only uses the first list item.
See Process List Result on previous reply.

What am I missing…