Re-sort the submitted entity IDs by the tabledrag weight inputs before
massaging them into field values. Drupal's AJAX submit path can bypass the
JS hidden-field sync, so the weight inputs are the authoritative source for
row order after a drag operation.
Controller: inject EntityTypeBundleInfoInterface; use bundle label in dialog titles
Widget: inject EntityTypeBundleInfoInterface; for single bundle show direct link button; for multiple bundles show + button picker; remove nested-dialog Add suppression so nested widgets always show Add JS: add removeEmptyPlaceholder() helper to clear #empty placeholder row on first item add; handle iefd-add-bundle-button click to open correct bundle form via temporary link CSS: add .iefd-bundle-picker flex layout
Rename service ID to inline_entity_form_dialog.hooks with explicit arguments
Controller: open nested dialogs in unique per-widget elements instead of #drupal-modal
Hooks: persist and resolve dialog selector through form state; close correct dialog on save; pass iefd_dialog_selector on edit URL
Widget: detect inside-dialog context; suppress Add button when nested; use #type link for Add button; pass unique dialog selector for nested Edit links
JS: update existing row label in-place on edit instead of skipping