From 4bc17297af59bfe38a85d9e4b1e0e1dbd298c20d Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Thu, 9 Jan 2025 12:53:36 +0300 Subject: [PATCH 01/13] Prevent duplicating field from breaking field group limit --- js/formidable_admin.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index ced22ca6c9..5236ab3689 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2101,11 +2101,28 @@ function frmAdminBuildJS() { } } + function canDuplicateField( field ) { + const fieldGroup = field.closest( 'li.frm_field_box:not(.form-field)' ); + if ( ! fieldGroup ) { + return true; + } + const fieldsInGroup = fieldGroup.querySelectorAll( 'li.form-field' ).length; + return fieldsInGroup < 6; + } + + function showFieldGroupLimitModal() { + alert( __( 'You can only have a maximum of 6 fields in a field group.', 'formidable' ) ); + } + function duplicateField() { let $field, fieldId, children, newRowId, fieldOrder; $field = jQuery( this ).closest( 'li.form-field' ); + if ( ! canDuplicateField( $field[0] ) ) { + showFieldGroupLimitModal(); + return; + } if ( $field.hasClass( 'frm-page-collapsed' ) ) { return false; } From 7b94f0f1867eaa7347ab3592567da8e5ab55f12c Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Thu, 9 Jan 2025 14:41:46 +0300 Subject: [PATCH 02/13] Replace alert with modal --- js/formidable_admin.js | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 5236ab3689..689c43a420 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2101,7 +2101,18 @@ function frmAdminBuildJS() { } } + /** + * Returns true if a field can be duplicated. + * + * @since x.x + * + * @param {HTMLElement} field + * @returns {Boolean} + */ function canDuplicateField( field ) { + if ( field.classList.contains( 'frm-page-collapsed' ) ) { + return false; + } const fieldGroup = field.closest( 'li.frm_field_box:not(.form-field)' ); if ( ! fieldGroup ) { return true; @@ -2110,22 +2121,15 @@ function frmAdminBuildJS() { return fieldsInGroup < 6; } - function showFieldGroupLimitModal() { - alert( __( 'You can only have a maximum of 6 fields in a field group.', 'formidable' ) ); - } - function duplicateField() { let $field, fieldId, children, newRowId, fieldOrder; $field = jQuery( this ).closest( 'li.form-field' ); if ( ! canDuplicateField( $field[0] ) ) { - showFieldGroupLimitModal(); + infoModal( __( 'You can only have a maximum of 6 fields in a field group. Delete or move out a field from the group and try again.', 'formidable' ) ); return; } - if ( $field.hasClass( 'frm-page-collapsed' ) ) { - return false; - } closeOpenFieldDropdowns(); fieldId = $field.data( 'fid' ); From 3efdd7b7dcb9fcc47f08f5f13838bfba71a1df3d Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Thu, 6 Feb 2025 10:52:40 +0300 Subject: [PATCH 03/13] Use placeholder and a constant to make translation maintenance easier --- js/formidable_admin.js | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 689c43a420..ea51e3c78a 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2107,9 +2107,11 @@ function frmAdminBuildJS() { * @since x.x * * @param {HTMLElement} field + * @param {number} maxFieldsInGroup + * * @returns {Boolean} */ - function canDuplicateField( field ) { + function canDuplicateField( field, maxFieldsInGroup ) { if ( field.classList.contains( 'frm-page-collapsed' ) ) { return false; } @@ -2118,16 +2120,18 @@ function frmAdminBuildJS() { return true; } const fieldsInGroup = fieldGroup.querySelectorAll( 'li.form-field' ).length; - return fieldsInGroup < 6; + return fieldsInGroup < maxFieldsInGroup; } function duplicateField() { let $field, fieldId, children, newRowId, fieldOrder; + const maxFieldsInGroup = 6; $field = jQuery( this ).closest( 'li.form-field' ); - if ( ! canDuplicateField( $field[0] ) ) { - infoModal( __( 'You can only have a maximum of 6 fields in a field group. Delete or move out a field from the group and try again.', 'formidable' ) ); + if ( ! canDuplicateField( $field[0], maxFieldsInGroup ) ) { + /* translators: %1$d: Maximum number of fields allowed in a field group. */ + infoModal( sprintf( __( 'You can only have a maximum of %1$d fields in a field group. Delete or move out a field from the group and try again.', 'formidable' ), maxFieldsInGroup ) ); return; } From 39db09736d5dfebe96a7a86a302bbf3510fd082d Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Mon, 10 Feb 2025 18:42:43 +0300 Subject: [PATCH 04/13] Improve reliability of field group count --- js/formidable_admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index ea51e3c78a..311164c3d9 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2119,7 +2119,7 @@ function frmAdminBuildJS() { if ( ! fieldGroup ) { return true; } - const fieldsInGroup = fieldGroup.querySelectorAll( 'li.form-field' ).length; + const fieldsInGroup = getFieldsInRow( jQuery( fieldGroup.querySelector( 'ul' ) ) ).length; return fieldsInGroup < maxFieldsInGroup; } From 3de793d3fd53da8c4ea5eec568210fed8cab1ba5 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Tue, 11 Feb 2025 16:27:14 +0300 Subject: [PATCH 05/13] Use jQuery method to get the HTML element --- js/formidable_admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 311164c3d9..ff17b496d0 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2129,7 +2129,7 @@ function frmAdminBuildJS() { $field = jQuery( this ).closest( 'li.form-field' ); - if ( ! canDuplicateField( $field[0], maxFieldsInGroup ) ) { + if ( ! canDuplicateField( $field.get( 0 ), maxFieldsInGroup ) ) { /* translators: %1$d: Maximum number of fields allowed in a field group. */ infoModal( sprintf( __( 'You can only have a maximum of %1$d fields in a field group. Delete or move out a field from the group and try again.', 'formidable' ), maxFieldsInGroup ) ); return; From a6f095039f27dcf1eb617aac2e0ecbd2ae72326d Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Tue, 11 Feb 2025 21:06:27 +0300 Subject: [PATCH 06/13] Synce layout classes after duplicating field inside a field group --- classes/controllers/FrmFieldsController.php | 4 +++- js/formidable_admin.js | 26 ++++++++++++++++++--- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/classes/controllers/FrmFieldsController.php b/classes/controllers/FrmFieldsController.php index 1f4feaa1df..6fb48c81bd 100644 --- a/classes/controllers/FrmFieldsController.php +++ b/classes/controllers/FrmFieldsController.php @@ -200,8 +200,10 @@ private static function get_classes_for_builder_field( $field, $display, $field_ $li_classes = $field_info->form_builder_classes( $display['type'] ); $li_classes .= ' frm_form_field frmstart '; - if ( isset( $field['classes'] ) ) { + if ( ! empty( $field['classes'] ) ) { $li_classes .= trim( $field['classes'] ) . ' '; + } else { + $li_classes .= FrmAppHelper::get_param( 'field_classes', '', 'post', 'sanitize_text_field' ) . ' '; } $li_classes .= 'frmend'; diff --git a/js/formidable_admin.js b/js/formidable_admin.js index ce32902db2..46c4cd552b 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2124,7 +2124,7 @@ function frmAdminBuildJS() { } function duplicateField() { - let $field, fieldId, children, newRowId, fieldOrder; + let $field, fieldId, children, newRowId, fieldOrder, fieldClasses; const maxFieldsInGroup = 6; $field = jQuery( this ).closest( 'li.form-field' ); @@ -2144,6 +2144,11 @@ function frmAdminBuildJS() { fieldOrder = this.getAttribute( 'frm-field-order' ); } + const hoverTarget = $field.get(0).closest( '.frm-field-group-hover-target' ); + if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { + fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; + } + jQuery.ajax({ type: 'POST', url: ajaxurl, @@ -2152,13 +2157,14 @@ function frmAdminBuildJS() { field_id: fieldId, form_id: thisFormId, children: children, - nonce: frmGlobal.nonce + nonce: frmGlobal.nonce, + field_classes : fieldClasses }, success: function( msg ) { let newRow; let replaceWith; - + if ( null !== newRowId ) { newRow = document.getElementById( newRowId ); if ( null !== newRow ) { @@ -2176,6 +2182,13 @@ function frmAdminBuildJS() { } ); afterAddField( msg, false ); + if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { + fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; + if ( ! replaceWith.get( 0 ).className.includes( fieldClasses ) ) { + replaceWith.get( 0 ).className += ' ' + fieldClasses; + document.getElementById( 'frm_classes_' + replaceWith.get( 0 ).dataset.fid ).value = fieldClasses; + } + } return; } } @@ -2197,6 +2210,13 @@ function frmAdminBuildJS() { maybeDuplicateUnsavedSettings( fieldId, msg ); toggleOneSectionHolder( replaceWith.find( '.start_divider' ) ); $field[0].querySelector( '.frm-dropdown-menu.dropdown-menu-right' )?.classList.remove( 'show' ); + if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { + fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; + if ( ! replaceWith.get( 0 ).className.includes( fieldClasses ) ) { + replaceWith.get( 0 ).className += ' ' + fieldClasses; + document.getElementById( 'frm_classes_' + replaceWith.get( 0 ).dataset.fid ).value = fieldClasses; + } + } } }); return false; From 6e5aaa1e6ccc876bff8d1c32d6e3d58018434991 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:37:35 +0300 Subject: [PATCH 07/13] Move repeated logic to a new function --- js/formidable_admin.js | 34 +++++++++++++++------------------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 46c4cd552b..c184ae8ae4 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2143,11 +2143,6 @@ function frmAdminBuildJS() { if ( null !== newRowId ) { fieldOrder = this.getAttribute( 'frm-field-order' ); } - - const hoverTarget = $field.get(0).closest( '.frm-field-group-hover-target' ); - if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { - fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; - } jQuery.ajax({ type: 'POST', @@ -2182,13 +2177,7 @@ function frmAdminBuildJS() { } ); afterAddField( msg, false ); - if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { - fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; - if ( ! replaceWith.get( 0 ).className.includes( fieldClasses ) ) { - replaceWith.get( 0 ).className += ' ' + fieldClasses; - document.getElementById( 'frm_classes_' + replaceWith.get( 0 ).dataset.fid ).value = fieldClasses; - } - } + setLayoutClassesForField( $field.get( 0 ), replaceWith.get( 0 ) ); return; } } @@ -2210,18 +2199,25 @@ function frmAdminBuildJS() { maybeDuplicateUnsavedSettings( fieldId, msg ); toggleOneSectionHolder( replaceWith.find( '.start_divider' ) ); $field[0].querySelector( '.frm-dropdown-menu.dropdown-menu-right' )?.classList.remove( 'show' ); - if ( hoverTarget && isFieldGroup( hoverTarget.parentElement ) ) { - fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; - if ( ! replaceWith.get( 0 ).className.includes( fieldClasses ) ) { - replaceWith.get( 0 ).className += ' ' + fieldClasses; - document.getElementById( 'frm_classes_' + replaceWith.get( 0 ).dataset.fid ).value = fieldClasses; - } - } + setLayoutClassesForField( $field.get( 0 ), replaceWith.get( 0 ) ); } }); return false; } + function setLayoutClassesForField( field, newField ) { + const hoverTarget = field.closest( '.frm-field-group-hover-target' ); + if ( ! hoverTarget || ! isFieldGroup( hoverTarget.parentElement ) ) { + return; + } + const fieldId = field.dataset.fid; + const fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; + if ( ! newField.className.includes( fieldClasses ) ) { + newField.className += ' ' + fieldClasses; + document.getElementById( 'frm_classes_' + newField.dataset.fid ).value = fieldClasses; + } + } + function maybeDuplicateUnsavedSettings( originalFieldId, newFieldHtml ) { let originalSettings, newFieldId, copySettings, fieldOptionKeys, originalDefault, copyDefault; From 8d729d0ffa2da1a0deb4ff6c640cc8976642b66a Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 09:47:07 +0300 Subject: [PATCH 08/13] Avoid copying frm_first class to the duplicated field --- js/formidable_admin.js | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index c184ae8ae4..146ebba49f 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2177,7 +2177,7 @@ function frmAdminBuildJS() { } ); afterAddField( msg, false ); - setLayoutClassesForField( $field.get( 0 ), replaceWith.get( 0 ) ); + setLayoutClassesForFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); return; } } @@ -2199,19 +2199,31 @@ function frmAdminBuildJS() { maybeDuplicateUnsavedSettings( fieldId, msg ); toggleOneSectionHolder( replaceWith.find( '.start_divider' ) ); $field[0].querySelector( '.frm-dropdown-menu.dropdown-menu-right' )?.classList.remove( 'show' ); - setLayoutClassesForField( $field.get( 0 ), replaceWith.get( 0 ) ); + setLayoutClassesForFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); } }); return false; } - function setLayoutClassesForField( field, newField ) { + /** + * Sets the layout classes for a field that is duplicated copying it from the original field. + * + * @param {HTMLElement} field The original field. + * @param {HTMLElement} newField The duplicated field. + * + * @returns {void} + */ + function setLayoutClassesForFieldInGroup( field, newField ) { const hoverTarget = field.closest( '.frm-field-group-hover-target' ); if ( ! hoverTarget || ! isFieldGroup( hoverTarget.parentElement ) ) { return; } - const fieldId = field.dataset.fid; - const fieldClasses = document.getElementById( 'frm_classes_' + fieldId ).value; + const fieldId = field.dataset.fid; + let fieldClasses = document.getElementById( 'frm_classes_' + fieldId )?.value; + if ( ! fieldClasses ) { + return; + } + fieldClasses = fieldClasses.replace( 'frm_first', '' ); if ( ! newField.className.includes( fieldClasses ) ) { newField.className += ' ' + fieldClasses; document.getElementById( 'frm_classes_' + newField.dataset.fid ).value = fieldClasses; From 6d0447871d66c24e951a0a635cf33c3178e52050 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:16:40 +0300 Subject: [PATCH 09/13] Get rid of abandoned solution --- classes/controllers/FrmFieldsController.php | 4 +--- js/formidable_admin.js | 5 ++--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/classes/controllers/FrmFieldsController.php b/classes/controllers/FrmFieldsController.php index 6fb48c81bd..1f4feaa1df 100644 --- a/classes/controllers/FrmFieldsController.php +++ b/classes/controllers/FrmFieldsController.php @@ -200,10 +200,8 @@ private static function get_classes_for_builder_field( $field, $display, $field_ $li_classes = $field_info->form_builder_classes( $display['type'] ); $li_classes .= ' frm_form_field frmstart '; - if ( ! empty( $field['classes'] ) ) { + if ( isset( $field['classes'] ) ) { $li_classes .= trim( $field['classes'] ) . ' '; - } else { - $li_classes .= FrmAppHelper::get_param( 'field_classes', '', 'post', 'sanitize_text_field' ) . ' '; } $li_classes .= 'frmend'; diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 146ebba49f..1d017dfe85 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2124,7 +2124,7 @@ function frmAdminBuildJS() { } function duplicateField() { - let $field, fieldId, children, newRowId, fieldOrder, fieldClasses; + let $field, fieldId, children, newRowId, fieldOrder; const maxFieldsInGroup = 6; $field = jQuery( this ).closest( 'li.form-field' ); @@ -2152,8 +2152,7 @@ function frmAdminBuildJS() { field_id: fieldId, form_id: thisFormId, children: children, - nonce: frmGlobal.nonce, - field_classes : fieldClasses + nonce: frmGlobal.nonce }, success: function( msg ) { let newRow; From b2373873407900e0ce6ad711defdd1ebce0dc3f5 Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:18:27 +0300 Subject: [PATCH 10/13] Remove trailing spaces --- js/formidable_admin.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 1d017dfe85..6cccee232f 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2143,7 +2143,7 @@ function frmAdminBuildJS() { if ( null !== newRowId ) { fieldOrder = this.getAttribute( 'frm-field-order' ); } - + jQuery.ajax({ type: 'POST', url: ajaxurl, @@ -2158,7 +2158,7 @@ function frmAdminBuildJS() { let newRow; let replaceWith; - + if ( null !== newRowId ) { newRow = document.getElementById( newRowId ); if ( null !== newRow ) { From d80477e0698620aa96eef8698e0d1f73733e4adb Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:20:06 +0300 Subject: [PATCH 11/13] Make function description clear --- js/formidable_admin.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 6cccee232f..d95414017d 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2205,7 +2205,7 @@ function frmAdminBuildJS() { } /** - * Sets the layout classes for a field that is duplicated copying it from the original field. + * Sets the layout classes for a duplicated field in a field group from the layout classes of the original field. * * @param {HTMLElement} field The original field. * @param {HTMLElement} newField The duplicated field. From b2fae8af0d2ec717684c46320745e1a5109190ea Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:21:55 +0300 Subject: [PATCH 12/13] Make function name more descriptive --- js/formidable_admin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index d95414017d..9c931f5901 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2176,7 +2176,7 @@ function frmAdminBuildJS() { } ); afterAddField( msg, false ); - setLayoutClassesForFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); + setLayoutClassesForDuplicatedFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); return; } } @@ -2198,7 +2198,7 @@ function frmAdminBuildJS() { maybeDuplicateUnsavedSettings( fieldId, msg ); toggleOneSectionHolder( replaceWith.find( '.start_divider' ) ); $field[0].querySelector( '.frm-dropdown-menu.dropdown-menu-right' )?.classList.remove( 'show' ); - setLayoutClassesForFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); + setLayoutClassesForDuplicatedFieldInGroup( $field.get( 0 ), replaceWith.get( 0 ) ); } }); return false; @@ -2212,7 +2212,7 @@ function frmAdminBuildJS() { * * @returns {void} */ - function setLayoutClassesForFieldInGroup( field, newField ) { + function setLayoutClassesForDuplicatedFieldInGroup( field, newField ) { const hoverTarget = field.closest( '.frm-field-group-hover-target' ); if ( ! hoverTarget || ! isFieldGroup( hoverTarget.parentElement ) ) { return; From 470f5a95c4f26582bd09363eb1ab76f647d990ca Mon Sep 17 00:00:00 2001 From: Abdi Tolessa <41271840+AbdiTolesa@users.noreply.github.com> Date: Fri, 14 Feb 2025 11:41:37 +0300 Subject: [PATCH 13/13] Rule out field groups from field limit warning --- js/formidable_admin.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 9c931f5901..2f7bbbaefa 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2127,9 +2127,10 @@ function frmAdminBuildJS() { let $field, fieldId, children, newRowId, fieldOrder; const maxFieldsInGroup = 6; - $field = jQuery( this ).closest( 'li.form-field' ); + $field = jQuery( this ).closest( 'li.form-field' ); + newRowId = this.getAttribute( 'frm-target-row-id' ); - if ( ! canDuplicateField( $field.get( 0 ), maxFieldsInGroup ) ) { + if ( ! ( newRowId && newRowId.startsWith( 'frm_field_group_' ) ) && ! canDuplicateField( $field.get( 0 ), maxFieldsInGroup ) ) { /* translators: %1$d: Maximum number of fields allowed in a field group. */ infoModal( sprintf( __( 'You can only have a maximum of %1$d fields in a field group. Delete or move out a field from the group and try again.', 'formidable' ), maxFieldsInGroup ) ); return; @@ -2138,7 +2139,6 @@ function frmAdminBuildJS() { closeOpenFieldDropdowns(); fieldId = $field.data( 'fid' ); children = fieldsInSection( fieldId ); - newRowId = this.getAttribute( 'frm-target-row-id' ); if ( null !== newRowId ) { fieldOrder = this.getAttribute( 'frm-field-order' );