kevinchappell / formBuilder

A jQuery plugin for drag and drop form creation
https://formbuilder.online
MIT License
2.61k stars 1.39k forks source link

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

Open IntuzJatanTrivedi opened 4 months ago

IntuzJatanTrivedi commented 4 months ago

Description:

Expected Behavior

Actual Behavior

Steps to Reproduce

lucasnetau commented 4 months ago

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 commented 4 months ago

@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 commented 4 months ago

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

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

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

IntuzJatanTrivedi commented 4 months ago

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 commented 3 months ago

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