Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Can I provide custom order(alphabetical) to the fields? #1557

Open
IntuzJatanTrivedi opened this issue Apr 30, 2024 · 6 comments
Open

Can I provide custom order(alphabetical) to the fields? #1557

IntuzJatanTrivedi opened this issue Apr 30, 2024 · 6 comments

Comments

@IntuzJatanTrivedi
Copy link

Description:

  • I want to render the fields in an alphabetical order. Is there any way I can achieve that?

Environment Details:

  • formBuilder Version: 3.19.1
  • Browser: Google Chrome - Version 124.0.6367.60 (Official Build) (64-bit)
  • OS: Ubuntu 22.04.4 LTS(64-bit)

Expected Behavior

  • All the fields that we are passing dynamically must be rendered in an alphabetical order.

Actual Behavior

  • Despite of the field's array that we are getting from the API is in alphabetical order, the rendered outcome is not the same. It renders the fields in some random order.
  • Also I have tried and given the controlOrder and allowStageSort props in the options but nothing works as expeced.
  • The controlOrder prop orders according to the type of the element, i.e Text, textarea, etc. but I do not want that.

Steps to Reproduce

  • The fields array must be dynamic.
  • Pass the fields array during the mounting of the builder i.e in the useEffect if you are using one or simply where the formBuilder ref is being access to render the component.
 setFormBuilder(
        $(fb.current).formBuilder({
          ...options(),
          fields, // here is the dynamic array
        })
      );
  • Make sure the array you are giving is in the alphabetical order.
  • Try to pass the controlOrder prop in options object. Note that this does not have any relative effect but thought to mention it.
@lucasnetau
Copy link
Collaborator

Dynamic fields are essentially pre-configured versions of their base type, once they are on the stage they are identical to their base type. They are internally keyed as -dddd where dddd is a 4 digit number. When orderFields(controls) processes the controls, these fields are inserted into the sort place of their base. For example a select field will be select-1234 and it will be sorted to the position one after select.

If you are using custom controls which have a fixed name, then these can be sorted.

As this is a fairly unique configuration, your best option would be to hook into the resolved formBuilder promise and sort the control li's in the way you want them to be sorted.

@IntuzJatanTrivedi
Copy link
Author

@lucasnetau I request you to please share an example or a demonstration which shows how can I access the promise of the formBuilder if possible.

I understood the direction of your thought but I cannot find a way to access the promise you suggested.

@lucasnetau
Copy link
Collaborator

https://formbuilder.online/docs/formBuilder/promise/

$('#selector).formBuilder(config).promise.then(formBuilder => {
    //Controls are rendered and you can now sort them
});

@IntuzJatanTrivedi
Copy link
Author

Thanks for the update! I will get back to you as soon as I implement this.

@IntuzJatanTrivedi
Copy link
Author

Hey @lucasnetau
I tried implementing your suggested solution but I am afraid I could not achieve the goal. I also tried the exact implementation as in the promise's documentation in your site but still that does not work.

const formBuilder = $(fb.current).formBuilder({ fields, ...options() });

      try {
        console.log('formBuilder.formData: 101', formBuilder.formData);
      } catch (err) {
        console.warn('formData not available yet.101');
        console.error('Error: 101', err);
      }

      formBuilder.promise.then(function (fb) {
        console.log('fb.formData: 101', fb);
      });

Now here is the implementation and the logs I kept for debugging. I could not find any method by which I could sort the fields. Also I tried putting fields and options differently using different promises but it did not work as expected.

When I put the formData in the promise all the fields renders in the drop-area and I think it's completely normal behaviour and so I understand that formData is not something I need to touch. So I pass the fields as fields parameter only.

@lucasnetau
Copy link
Collaborator

I think you misunderstood me. You cannot control the order of the fields through the fields config option.

In the formBuilder promise then() call you need to do custom sorting List Items of the ul.frmb-control element

https://stackoverflow.com/questions/304396/what-is-the-easiest-way-to-order-a-ul-ol-in-jquery

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants