From 1644735ef18631435ce61329858d336c24062254 Mon Sep 17 00:00:00 2001 From: Sherv Date: Sun, 12 Jan 2025 20:23:10 +0300 Subject: [PATCH 01/29] Add: QoL #2 --- css/frm_admin.css | 6 +++++- js/formidable_admin.js | 2 ++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/css/frm_admin.css b/css/frm_admin.css index 7f6b242263..7ec62e58db 100644 --- a/css/frm_admin.css +++ b/css/frm_admin.css @@ -6747,10 +6747,13 @@ tr.frm_options_heading td { font-size: var(--text-md); box-sizing: border-box; border: 1px dashed var(--grey-300); + outline: 2px solid transparent; } .frm-over-droppable + .frm_no_fields { border-style: solid; + border-color: var(--primary-500); + outline-color: var(--primary-500); } .frm_no_section_fields { @@ -6777,7 +6780,8 @@ tr.frm_options_heading td { visibility: hidden; } -.frm-has-fields .frm_no_fields { +.frm-has-fields .frm_no_fields, +#frm_form_editor_container:not(.frm-has-fields) #frm_drag_placeholder { display: none; } diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 2f6c6f99e5..ef9404d5a6 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -2546,6 +2546,8 @@ function frmAdminBuildJS() { deselectFields(); initiateMultiselect(); + document.getElementById( 'frm-show-fields' ).classList.remove( 'frm-over-droppable' ); + const addedEvent = new Event( 'frm_added_field', { bubbles: false }); addedEvent.frmField = field; addedEvent.frmSection = section; From 6c5d269ed9c7ccb23fed53d01abfd5c9167e64c7 Mon Sep 17 00:00:00 2001 From: Sherv Date: Tue, 14 Jan 2025 15:02:00 +0300 Subject: [PATCH 02/29] Complete QoL #3 --- css/frm_admin.css | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/css/frm_admin.css b/css/frm_admin.css index 7ec62e58db..51676f8b23 100644 --- a/css/frm_admin.css +++ b/css/frm_admin.css @@ -1706,6 +1706,10 @@ input.frm_insert_in_template { margin-right: auto; } +.frm-mr-2xs { + margin-right: var(--gap-2xs) !important; +} + .frm-mx-0 { margin-left: 0 !important; margin-right: 0 !important; @@ -1771,6 +1775,10 @@ input.frm_insert_in_template { padding-top: var(--gap-sm) !important; } +.frm-pt-md { + padding-top: var(--gap-md) !important; +} + .frm-pt-xl { padding-top: var(--gap-xl) !important; } @@ -1781,6 +1789,12 @@ input.frm_insert_in_template { .frm-pb-sm { padding-bottom: var(--gap-sm) !important; } + +.frm-px-sm { + padding-right: var(--gap-sm) !important; + padding-left: var(--gap-sm) !important; +} + .frm-px-md { padding-right: var(--gap-md) !important; padding-left: var(--gap-md) !important; @@ -1846,6 +1860,10 @@ input.frm_insert_in_template { width: 100% !important; } +.frm-w-half { + width: 50% !important; +} + .frm_block, /* deprecated */ .frm-block { display: block; @@ -1877,7 +1895,6 @@ input.frm_insert_in_template { gap: var(--gap-sm); } - .frm-flex-col { display: flex; flex-direction: column; @@ -1978,6 +1995,10 @@ input.frm_insert_in_template { cursor: pointer; } +.frm-align-baseline { + vertical-align: baseline !important; +} + /* End Generic Classes, Start Forced Generic Classes */ .frm-fields p > label.frm_hidden, From 36b4bdb843f231b7c878602506e13da51c88f098 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 15 Jan 2025 10:04:20 +0300 Subject: [PATCH 03/29] Complete QoL #4 --- classes/views/frm-fields/back-end/settings.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/classes/views/frm-fields/back-end/settings.php b/classes/views/frm-fields/back-end/settings.php index 03929a7424..a83fcc13b0 100644 --- a/classes/views/frm-fields/back-end/settings.php +++ b/classes/views/frm-fields/back-end/settings.php @@ -202,6 +202,8 @@ include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/field-description.php'; } + do_action( 'frm_field_options_after_description', compact( 'field', 'display', 'values' ) ); + // Field Size if ( $display['size'] && ! in_array( $field['type'], array( 'select', 'data', 'time' ), true ) ) { $display_max = $display['max']; From fd271f96ae920824966a1f5fb048ebd8480d667e Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 15 Jan 2025 13:29:00 +0300 Subject: [PATCH 04/29] Refactor: Add `$display_smart_values_icon` --- classes/views/frm-fields/back-end/default-value-setting.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/classes/views/frm-fields/back-end/default-value-setting.php b/classes/views/frm-fields/back-end/default-value-setting.php index b1fa1b61c3..8ed14c53f3 100644 --- a/classes/views/frm-fields/back-end/default-value-setting.php +++ b/classes/views/frm-fields/back-end/default-value-setting.php @@ -12,7 +12,11 @@ class="frm-has-modal frm-default-value-wrapper default-value-section- display_smart_values_modal_trigger_icon( $field ); + $display_smart_values_icon = isset( $display_smart_values_icon ) ? $display_smart_values_icon : true; + + if ( $display_smart_values_icon ) { + $field_obj->display_smart_values_modal_trigger_icon( $field ); + } if ( isset( $display['default_value'] ) && $display['default_value'] ) { $default_name = 'field_options[dyn_default_value_' . $field['id'] . ']'; From 7a6e38b449d2b80d2c7efa8f76f8132d688fb8a7 Mon Sep 17 00:00:00 2001 From: Sherv Date: Thu, 16 Jan 2025 12:53:03 +0300 Subject: [PATCH 05/29] Complete QoL #7 --- classes/controllers/FrmAppController.php | 45 ++++++++++++++++++++++ classes/controllers/FrmHooksController.php | 1 + 2 files changed, 46 insertions(+) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index b00550a184..2a155faeee 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1353,6 +1353,51 @@ public static function filter_admin_notices() { } } + /** + * Remembers and applies user-specific sorting preferences. + * + * @return void + */ + public static function remember_custom_sort() { + $screen = get_current_screen(); + + if ( ! $screen || ! self::in_our_pages() ) { + return; + } + + $orderby = FrmAppHelper::get_param( 'orderby' ); + $order = FrmAppHelper::get_param( 'order' ); + + $user_id = get_current_user_id(); + $meta_key = 'frm_preferred_list_sort_' . $screen->id; + + // Save custom sort if specified. + if ( $orderby ) { + $preferred_list_sort = array( + 'orderby' => $orderby, + 'order' => $order, + ); + + update_user_meta( $user_id, $meta_key, $preferred_list_sort ); + return; + } + + $preferred_list_sort = get_user_meta( $user_id, $meta_key, true ); + + if ( is_array( $preferred_list_sort ) && ! empty( $preferred_list_sort['orderby'] ) ) { + $orderby = $preferred_list_sort['orderby']; + $order = ! empty( $preferred_list_sort['order'] ) ? $preferred_list_sort['order'] : 'asc'; + } else { + $orderby = FrmAppHelper::get_param( 'orderby', 'name' ); + $order = FrmAppHelper::get_param( 'order', 'desc' ); + } + + $_GET['orderby'] = $orderby; + $_GET['order'] = $order; + $_REQUEST['orderby'] = $orderby; + $_REQUEST['order'] = $order; + } + /** * Validate that the callback name is ours not from third-party. * diff --git a/classes/controllers/FrmHooksController.php b/classes/controllers/FrmHooksController.php index ec99052bff..de5f9278c0 100644 --- a/classes/controllers/FrmHooksController.php +++ b/classes/controllers/FrmHooksController.php @@ -127,6 +127,7 @@ public static function load_admin_hooks() { add_filter( 'admin_footer_text', 'FrmAppController::set_footer_text' ); add_action( 'admin_footer', 'FrmAppController::add_admin_footer_links' ); add_action( 'current_screen', 'FrmAppController::filter_admin_notices' ); + add_action( 'current_screen', 'FrmAppController::remember_custom_sort', 0 ); // Entries Controller. add_action( 'admin_menu', 'FrmEntriesController::menu', 12 ); From 2f2f6abac7289340cf6c6f13ea00d3a086c23f26 Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 17 Jan 2025 11:29:19 +0300 Subject: [PATCH 06/29] Complete QoL # 8 --- classes/helpers/FrmFormsListHelper.php | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/classes/helpers/FrmFormsListHelper.php b/classes/helpers/FrmFormsListHelper.php index 875d7bd9f2..c87599b2f5 100644 --- a/classes/helpers/FrmFormsListHelper.php +++ b/classes/helpers/FrmFormsListHelper.php @@ -335,6 +335,7 @@ public function single_row( $item, $style = '' ) { protected function column_shortcode( $form ) { $val = '' . FrmAppHelper::icon_by_class( 'frmfont frm_code_icon', array( 'echo' => false ) ) . ''; $val .= $this->column_style( $form ); + $val .= $this->view_form_icon( $form ); $val = apply_filters( 'frm_form_list_actions', $val, array( 'form' => $form ) ); // Remove the space hard coded in Landing pages. $val = str_replace( ' ', '', $val ); @@ -370,6 +371,21 @@ protected function column_style( $form ) { return '' . FrmAppHelper::icon_by_class( 'frmfont frm_pallet_icon', array( 'echo' => false ) ) . ''; } + /** + * Generate the HTML for the "view form icon" action link. + * + * @since x.x + * + * @param stdClass $form Form object. + * @return string HTML string for the view icon link. + */ + protected function view_form_icon( $form ) { + $href = FrmFormsHelper::get_direct_link( $form->form_key, $form ); + return ' + ' . FrmAppHelper::icon_by_class( 'frmfont frm_eye_icon', array( 'echo' => false ) ) . + ''; + } + /** * @param array $actions * @param object $item From 457e53df7c62cc833ce5c9a8f994c036af97256f Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 17 Jan 2025 11:59:50 +0300 Subject: [PATCH 07/29] Fix search button hover style --- css/frm_admin.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/css/frm_admin.css b/css/frm_admin.css index b3640ea56c..6047c0d5c4 100644 --- a/css/frm_admin.css +++ b/css/frm_admin.css @@ -1496,7 +1496,8 @@ body.frm-hidden-overflow { .wp-core-ui.frm-white-body .button-secondary:hover, .wp-core-ui.frm-white-body .button-secondary:focus, .wp-core-ui.frm-white-body .tablenav .button:hover, -.frm_wrap .preview > .button:hover { +.frm_wrap .preview > .button:hover, +.frm-white-body #search-submit:hover { border-color: var(--grey-300) !important; color: var(--grey-800); background: var(--grey-50) !important; From ad76f9796bd49904a331aa8d2dad0497132571f5 Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 17 Jan 2025 12:08:52 +0300 Subject: [PATCH 08/29] Complete QoL #10 --- classes/helpers/FrmListHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/helpers/FrmListHelper.php b/classes/helpers/FrmListHelper.php index d3a0a9e051..615e8d805f 100644 --- a/classes/helpers/FrmListHelper.php +++ b/classes/helpers/FrmListHelper.php @@ -391,7 +391,7 @@ protected function bulk_actions( $which = '' ) { $verify = $this->confirm_bulk_delete(); if ( $verify ) { - echo ""; + echo ""; } } From fc2ff49d009ae230cc4b96deb6c2f6111dd6715c Mon Sep 17 00:00:00 2001 From: Sherv Date: Tue, 21 Jan 2025 13:42:54 +0300 Subject: [PATCH 09/29] Init: QoL #1 --- js/formidable_admin.js | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index ef9404d5a6..f63db1e93b 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -10339,7 +10339,6 @@ function frmAdminBuildJS() { } } - /** * Initializes and manages the visibility of dependent elements based on the selected options in dropdowns with the 'frm_select_with_dependency' class. * It sets up initial visibility at page load and updates it on each dropdown change. @@ -10372,7 +10371,33 @@ function frmAdminBuildJS() { // Update dependencies visibility on dropdown change frmDom.util.documentOn( 'change', 'select.frm_select_with_dependency', ( event ) => toggleDependencyVisibility( event.target ) ); - }; + } + + /** + * Handles "Enter" key navigation by processing the given choiceField + * and then focusing on the next field in the sequence. + * + * @param {HTMLElement} choiceField The currently selected choice field element. + */ + function handleEnterKeyNavigation( choiceField ) { + const singleSettings = choiceField.closest( '.frm-single-settings' ); + const fields = singleSettings.querySelectorAll( '[name^="field_options["]' ); + const fieldsArray = Array.from( fields ); + + // Find the index of the current choiceField + const currentIndex = fieldsArray.indexOf( choiceField ); + + if ( currentIndex >= 0 ) { + if ( choiceField.type === 'checkbox' || choiceField.type === 'radio' ) { + choiceField.checked = ! choiceField.checked; + } + + // Focus on the next field if it exists + if ( currentIndex < fieldsArray.length - 1 ) { + fieldsArray[ currentIndex + 1 ].focus(); + } + } + } return { init: function() { @@ -10706,6 +10731,17 @@ function frmAdminBuildJS() { frmDom.util.documentOn( 'click', '.frm-show-field-settings', clickVis ); frmDom.util.documentOn( 'change', 'select.frm_phone_type_dropdown', maybeUpdatePhoneFormatInput ); + // Handle Enter key navigation on a choice field + $builderForm.on( + 'keydown', + '.frm-single-settings input[type="checkbox"][name^="field_options"], .frm-single-settings input[type="radio"][name^="field_options"], .frm-single-settings select[name^="field_options"]', + ( event ) => { + if ( 'Enter' === event.key ) { + handleEnterKeyNavigation( event.currentTarget ); + } + } + ); + initBulkOptionsOverlay(); hideEmptyEle(); maybeHideQuantityProductFieldOption(); From 5c9727f1712ff3745a674e5d013efcf7af92a1cd Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 22 Jan 2025 13:08:35 +0300 Subject: [PATCH 10/29] Complete QoL #1 --- js/formidable_admin.js | 51 +++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index f63db1e93b..6d50c28693 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -8569,7 +8569,7 @@ function frmAdminBuildJS() { * @returns {Boolean} */ function isContextualShortcode( item ) { - const shortcode = item.querySelector( 'a' ).dataset.code; + const shortcode = item.querySelector( 'a' )?.dataset?.code; return frmAdminJs.contextualShortcodes.address.includes( shortcode ) || frmAdminJs.contextualShortcodes.body.includes( shortcode ); } @@ -10374,27 +10374,32 @@ function frmAdminBuildJS() { } /** - * Handles "Enter" key navigation by processing the given choiceField - * and then focusing on the next field in the sequence. + * Moves the focus to the next single option input field in the list and positions the cursor at the end of the text. * - * @param {HTMLElement} choiceField The currently selected choice field element. + * @param {HTMLElement} currentInput The currently focused input element. */ - function handleEnterKeyNavigation( choiceField ) { - const singleSettings = choiceField.closest( '.frm-single-settings' ); - const fields = singleSettings.querySelectorAll( '[name^="field_options["]' ); - const fieldsArray = Array.from( fields ); + function focusNextSingleOptionInput( currentInput ) { + const optionsList = currentInput.closest( '.frm_single_option' ).parentElement; + const inputs = optionsList.querySelectorAll( '.frm_single_option input[name^="field_options[" ], .frm_single_option input[name^="rows_"]' ); + const inputsArray = Array.from( inputs ); - // Find the index of the current choiceField - const currentIndex = fieldsArray.indexOf( choiceField ); + // Find the index of the currently focused input + const currentIndex = inputsArray.indexOf( currentInput ); if ( currentIndex >= 0 ) { - if ( choiceField.type === 'checkbox' || choiceField.type === 'radio' ) { - choiceField.checked = ! choiceField.checked; - } + // Find the next visible input field + const nextInput = inputsArray.slice( currentIndex + 1 ).find( input => + input.offsetParent !== null && + input.offsetWidth > 0 && + input.offsetHeight > 0 + ); + + if ( nextInput ) { + nextInput.focus(); - // Focus on the next field if it exists - if ( currentIndex < fieldsArray.length - 1 ) { - fieldsArray[ currentIndex + 1 ].focus(); + // Move the cursor to the end of the text in the next input field + const textLength = nextInput.value.length; + nextInput.setSelectionRange( textLength, textLength ); } } } @@ -10731,16 +10736,12 @@ function frmAdminBuildJS() { frmDom.util.documentOn( 'click', '.frm-show-field-settings', clickVis ); frmDom.util.documentOn( 'change', 'select.frm_phone_type_dropdown', maybeUpdatePhoneFormatInput ); - // Handle Enter key navigation on a choice field - $builderForm.on( - 'keydown', - '.frm-single-settings input[type="checkbox"][name^="field_options"], .frm-single-settings input[type="radio"][name^="field_options"], .frm-single-settings select[name^="field_options"]', - ( event ) => { - if ( 'Enter' === event.key ) { - handleEnterKeyNavigation( event.currentTarget ); - } + // Navigate to the next input field on pressing Enter in a single option field + $builderForm.on( 'keydown', '.frm_single_option input[name^="field_options["], .frm_single_option input[name^="rows_"]', event => { + if ( 'Enter' === event.key ) { + focusNextSingleOptionInput( event.currentTarget ); } - ); + }); initBulkOptionsOverlay(); hideEmptyEle(); From 8126f76e05f15e29c7155a54de9a3d0b7a0a2558 Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 7 Feb 2025 12:26:29 +0300 Subject: [PATCH 11/29] Consolidate hooks into handle_current_screen --- classes/controllers/FrmAppController.php | 20 ++++++++++++++++---- classes/controllers/FrmHooksController.php | 3 +-- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index 2a155faeee..257f366c55 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1320,15 +1320,27 @@ private static function in_our_pages() { } /** - * Hide all third-parties admin notices only in our admin pages. + * Handles actions related to the current screen. * + * @since x.x + * * @return void */ - public static function filter_admin_notices() { + public static function handle_current_screen() { if ( ! self::in_our_pages() ) { return; } + self::filter_admin_notices(); + self::remember_custom_sort(); + } + + /** + * Hide all third-parties admin notices only in our admin pages. + * + * @return void + */ + private static function filter_admin_notices() { $actions = array( 'admin_notices', 'network_admin_notices', @@ -1358,10 +1370,10 @@ public static function filter_admin_notices() { * * @return void */ - public static function remember_custom_sort() { + private static function remember_custom_sort() { $screen = get_current_screen(); - if ( ! $screen || ! self::in_our_pages() ) { + if ( ! $screen ) { return; } diff --git a/classes/controllers/FrmHooksController.php b/classes/controllers/FrmHooksController.php index de5f9278c0..ee4bc506cd 100644 --- a/classes/controllers/FrmHooksController.php +++ b/classes/controllers/FrmHooksController.php @@ -126,8 +126,7 @@ public static function load_admin_hooks() { add_filter( 'plugin_action_links_' . FrmAppHelper::plugin_folder() . '/formidable.php', 'FrmAppController::settings_link' ); add_filter( 'admin_footer_text', 'FrmAppController::set_footer_text' ); add_action( 'admin_footer', 'FrmAppController::add_admin_footer_links' ); - add_action( 'current_screen', 'FrmAppController::filter_admin_notices' ); - add_action( 'current_screen', 'FrmAppController::remember_custom_sort', 0 ); + add_action( 'current_screen', 'FrmAppController::handle_current_screen' ); // Entries Controller. add_action( 'admin_menu', 'FrmEntriesController::menu', 12 ); From 9d0bad2170801d2880075f3e7bbe0fc58ffe2cd9 Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 7 Feb 2025 12:31:58 +0300 Subject: [PATCH 12/29] Refactor to early return for reduced indentation --- js/formidable_admin.js | 28 +++++++++++++++------------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 9e4d7b9dc7..5ff886f92c 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -10391,21 +10391,23 @@ function frmAdminBuildJS() { // Find the index of the currently focused input const currentIndex = inputsArray.indexOf( currentInput ); - if ( currentIndex >= 0 ) { - // Find the next visible input field - const nextInput = inputsArray.slice( currentIndex + 1 ).find( input => - input.offsetParent !== null && - input.offsetWidth > 0 && - input.offsetHeight > 0 - ); + if ( currentIndex < 0 ) { + return; + } + + // Find the next visible input field + const nextInput = inputsArray.slice( currentIndex + 1 ).find( input => + input.offsetParent !== null && + input.offsetWidth > 0 && + input.offsetHeight > 0 + ); - if ( nextInput ) { - nextInput.focus(); + if ( nextInput ) { + nextInput.focus(); - // Move the cursor to the end of the text in the next input field - const textLength = nextInput.value.length; - nextInput.setSelectionRange( textLength, textLength ); - } + // Move the cursor to the end of the text in the next input field + const textLength = nextInput.value.length; + nextInput.setSelectionRange( textLength, textLength ); } } From e914ed0acf42a23d2da475a2b7461018a193ee14 Mon Sep 17 00:00:00 2001 From: Sherv Date: Fri, 7 Feb 2025 12:38:49 +0300 Subject: [PATCH 13/29] Remove unnecessary visibility checks --- js/formidable_admin.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/js/formidable_admin.js b/js/formidable_admin.js index 5ff886f92c..a6429651f7 100644 --- a/js/formidable_admin.js +++ b/js/formidable_admin.js @@ -10394,13 +10394,9 @@ function frmAdminBuildJS() { if ( currentIndex < 0 ) { return; } - + // Find the next visible input field - const nextInput = inputsArray.slice( currentIndex + 1 ).find( input => - input.offsetParent !== null && - input.offsetWidth > 0 && - input.offsetHeight > 0 - ); + const nextInput = inputsArray.slice( currentIndex + 1 ).find( input => input.offsetParent !== null ); if ( nextInput ) { nextInput.focus(); From 406f4af58a89062dbf5ef74b050d954249b26346 Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 10 Feb 2025 16:43:24 +0300 Subject: [PATCH 14/29] Add column_views --- classes/helpers/FrmFormsListHelper.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/classes/helpers/FrmFormsListHelper.php b/classes/helpers/FrmFormsListHelper.php index c87599b2f5..258b99db25 100644 --- a/classes/helpers/FrmFormsListHelper.php +++ b/classes/helpers/FrmFormsListHelper.php @@ -335,7 +335,7 @@ public function single_row( $item, $style = '' ) { protected function column_shortcode( $form ) { $val = '' . FrmAppHelper::icon_by_class( 'frmfont frm_code_icon', array( 'echo' => false ) ) . ''; $val .= $this->column_style( $form ); - $val .= $this->view_form_icon( $form ); + $val .= $this->column_views( $form ); $val = apply_filters( 'frm_form_list_actions', $val, array( 'form' => $form ) ); // Remove the space hard coded in Landing pages. $val = str_replace( ' ', '', $val ); @@ -372,16 +372,21 @@ protected function column_style( $form ) { } /** - * Generate the HTML for the "view form icon" action link. + * Generate the HTML for the form Views page. * * @since x.x * * @param stdClass $form Form object. - * @return string HTML string for the view icon link. + * @return string */ - protected function view_form_icon( $form ) { - $href = FrmFormsHelper::get_direct_link( $form->form_key, $form ); - return ' + protected function column_views( $form ) { + $attributes = array( + 'href' => admin_url( 'admin.php?page=formidable-views&form=' . absint( $form->id ) ), + 'title' => __( 'View Form', 'formidable' ), + 'target' => '_blank', + ); + + return ' ' . FrmAppHelper::icon_by_class( 'frmfont frm_eye_icon', array( 'echo' => false ) ) . ''; } From e85e95431e51fd1ea61f04d531a8802405e9bd7c Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 17 Feb 2025 18:27:56 +0300 Subject: [PATCH 15/29] Refactor remember_custom_sort --- classes/controllers/FrmAppController.php | 44 ++++++------------------ 1 file changed, 11 insertions(+), 33 deletions(-) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index d8adefdb4f..c15c76de6b 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1328,7 +1328,7 @@ private static function in_our_pages() { * Handles actions related to the current screen. * * @since x.x - * + * * @return void */ public static function handle_current_screen() { @@ -1376,43 +1376,21 @@ private static function filter_admin_notices() { * @return void */ private static function remember_custom_sort() { - $screen = get_current_screen(); - - if ( ! $screen ) { - return; - } - + $screen = get_current_screen(); $orderby = FrmAppHelper::get_param( 'orderby' ); - $order = FrmAppHelper::get_param( 'order' ); - - $user_id = get_current_user_id(); - $meta_key = 'frm_preferred_list_sort_' . $screen->id; - - // Save custom sort if specified. - if ( $orderby ) { - $preferred_list_sort = array( - 'orderby' => $orderby, - 'order' => $order, - ); - update_user_meta( $user_id, $meta_key, $preferred_list_sort ); + if ( ! $screen || ! $orderby ) { return; } - $preferred_list_sort = get_user_meta( $user_id, $meta_key, true ); - - if ( is_array( $preferred_list_sort ) && ! empty( $preferred_list_sort['orderby'] ) ) { - $orderby = $preferred_list_sort['orderby']; - $order = ! empty( $preferred_list_sort['order'] ) ? $preferred_list_sort['order'] : 'asc'; - } else { - $orderby = FrmAppHelper::get_param( 'orderby', 'name' ); - $order = FrmAppHelper::get_param( 'order', 'desc' ); - } - - $_GET['orderby'] = $orderby; - $_GET['order'] = $order; - $_REQUEST['orderby'] = $orderby; - $_REQUEST['order'] = $order; + update_user_meta( + get_current_user_id(), + 'frm_preferred_list_sort_' . $screen->id, + array( + 'orderby' => $orderby, + 'order' => FrmAppHelper::get_param( 'order' ), + ) + ); } /** From 7e9de8b02b97de15fadebad39d6ddfabffaef611 Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 17 Feb 2025 18:29:10 +0300 Subject: [PATCH 16/29] Load saved sorting preferences for the forms list --- classes/helpers/FrmFormsListHelper.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/classes/helpers/FrmFormsListHelper.php b/classes/helpers/FrmFormsListHelper.php index 258b99db25..1e5b0c7a38 100644 --- a/classes/helpers/FrmFormsListHelper.php +++ b/classes/helpers/FrmFormsListHelper.php @@ -46,6 +46,21 @@ public function prepare_items() { 'default' => 'ASC', ) ); + + $screen = get_current_screen(); + if ( $screen ) { + $user_id = get_current_user_id(); + $preferred_list_sort = get_user_meta( $user_id, 'frm_preferred_list_sort_' . $screen->id, true ); + + if ( is_array( $preferred_list_sort ) && ! empty( $preferred_list_sort['orderby'] ) ) { + $orderby = $preferred_list_sort['orderby']; + + if ( ! empty( $preferred_list_sort['order'] ) ) { + $order = $preferred_list_sort['order']; + } + } + } + $start = self::get_param( array( 'param' => 'start', From 5ab72b045ec1dc610ca71a0291d40d17ae622f87 Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 17 Feb 2025 22:46:50 +0300 Subject: [PATCH 17/29] Add apply_saved_sort_preference method --- classes/controllers/FrmAppController.php | 31 ++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index c15c76de6b..08534b383d 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1393,6 +1393,37 @@ private static function remember_custom_sort() { ); } + /** + * Retrieve and apply any saved sorting preferences for the current screen. + * + * @since x.x + * + * @param string &$orderby Reference to the current 'orderby' parameter. + * @param string &$order Reference to the current 'order' parameter. + * @return void + */ + public static function apply_saved_sort_preference( &$orderby, &$order ) { + if ( ! function_exists( 'get_current_screen' ) ) { + return; + } + + $screen = get_current_screen(); + if ( ! $screen ) { + return; + } + + $user_id = get_current_user_id(); + $preferred_list_sort = get_user_meta( $user_id, 'frm_preferred_list_sort_' . $screen->id, true ); + + if ( is_array( $preferred_list_sort ) && ! empty( $preferred_list_sort['orderby'] ) ) { + $orderby = $preferred_list_sort['orderby']; + + if ( ! empty( $preferred_list_sort['order'] ) ) { + $order = $preferred_list_sort['order']; + } + } + } + /** * Validate that the callback name is ours not from third-party. * From 50c6a0f3e8658167bf9ba18abef9464ce712f659 Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 17 Feb 2025 22:47:54 +0300 Subject: [PATCH 18/29] Apply saved sort preferences to Forms and History lists --- classes/helpers/FrmEntriesListHelper.php | 2 ++ classes/helpers/FrmFormsListHelper.php | 14 +------------- 2 files changed, 3 insertions(+), 13 deletions(-) diff --git a/classes/helpers/FrmEntriesListHelper.php b/classes/helpers/FrmEntriesListHelper.php index b30eea8940..fda63caa03 100644 --- a/classes/helpers/FrmEntriesListHelper.php +++ b/classes/helpers/FrmEntriesListHelper.php @@ -109,6 +109,8 @@ protected function get_order_by() { ) ); + FrmAppController::apply_saved_sort_preference( $orderby, $order ); + return FrmDb::esc_order( $orderby . ' ' . $order ); } diff --git a/classes/helpers/FrmFormsListHelper.php b/classes/helpers/FrmFormsListHelper.php index 1e5b0c7a38..3dc00b2cc6 100644 --- a/classes/helpers/FrmFormsListHelper.php +++ b/classes/helpers/FrmFormsListHelper.php @@ -47,19 +47,7 @@ public function prepare_items() { ) ); - $screen = get_current_screen(); - if ( $screen ) { - $user_id = get_current_user_id(); - $preferred_list_sort = get_user_meta( $user_id, 'frm_preferred_list_sort_' . $screen->id, true ); - - if ( is_array( $preferred_list_sort ) && ! empty( $preferred_list_sort['orderby'] ) ) { - $orderby = $preferred_list_sort['orderby']; - - if ( ! empty( $preferred_list_sort['order'] ) ) { - $order = $preferred_list_sort['order']; - } - } - } + FrmAppController::apply_saved_sort_preference( $orderby, $order ); $start = self::get_param( array( From 03129e2f51a32b3ccf3afb8ca7f9685758354969 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 11:12:08 +0300 Subject: [PATCH 19/29] Add PHPDoc for `frm_field_options_after_description` action --- classes/views/frm-fields/back-end/settings.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/classes/views/frm-fields/back-end/settings.php b/classes/views/frm-fields/back-end/settings.php index 9fde48fa14..ac540e1a5f 100644 --- a/classes/views/frm-fields/back-end/settings.php +++ b/classes/views/frm-fields/back-end/settings.php @@ -212,6 +212,19 @@ include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/field-description.php'; } + /** + * Fires after displaying the field description in a form settings. + * + * @since x.x + * + * @param array $args { + * Array containing the field data. + * + * @type array $field The field settings. + * @type array $display The display settings for the field. + * @type array $values The values associated with the field. + * } + */ do_action( 'frm_field_options_after_description', compact( 'field', 'display', 'values' ) ); // Field Size From be4b9b3be091ac8fb57e1135227aa8a2ded15c78 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 11:22:01 +0300 Subject: [PATCH 20/29] Refactor: Use FrmAppHelper::array_to_html_params for confirm bulk delete element --- classes/helpers/FrmListHelper.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/classes/helpers/FrmListHelper.php b/classes/helpers/FrmListHelper.php index 615e8d805f..0676e3bd43 100644 --- a/classes/helpers/FrmListHelper.php +++ b/classes/helpers/FrmListHelper.php @@ -390,8 +390,20 @@ protected function bulk_actions( $which = '' ) { if ( isset( $this->_actions['bulk_delete'] ) ) { $verify = $this->confirm_bulk_delete(); + $confirm_delete_attributes = array( + 'id' => 'confirm-bulk-delete-' . $which, + 'class' => 'frm-hidden', + 'tabindex' => '-1', + 'aria-hidden' => 'true', + 'href' => 'confirm-bulk-delete', + 'data-loaded-from' => $this->loaded_from(), + 'data-frmverify' => $verify, + 'data-frmverify-btn' => 'frm-button-red', + ); + if ( $verify ) { - echo ""; + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped + echo ''; } } From 508794a470e30acb3cc7850bd61f2fd3601e1761 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 11:23:18 +0300 Subject: [PATCH 21/29] Revert filter_admin_notices visibility --- classes/controllers/FrmAppController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index 08534b383d..515aad168c 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1345,7 +1345,7 @@ public static function handle_current_screen() { * * @return void */ - private static function filter_admin_notices() { + public static function filter_admin_notices() { $actions = array( 'admin_notices', 'network_admin_notices', From b3e0ce8a59c93b18d96d08e563f402ba180a0acb Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 11:52:04 +0300 Subject: [PATCH 22/29] Add is_admin_list_page --- classes/controllers/FrmUsageController.php | 13 +----------- classes/helpers/FrmAppHelper.php | 23 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/classes/controllers/FrmUsageController.php b/classes/controllers/FrmUsageController.php index f17550c88a..cc1e76eb5f 100644 --- a/classes/controllers/FrmUsageController.php +++ b/classes/controllers/FrmUsageController.php @@ -106,18 +106,7 @@ public static function load_scripts() { * @return bool */ private static function is_forms_list_page() { - if ( ! FrmAppHelper::is_admin_page() ) { - return false; - } - - // Check Trash page. - $form_type = FrmAppHelper::simple_get( 'form_type' ); - if ( $form_type && 'published' !== $form_type ) { - return false; - } - - // Check edit or settings page. - return ! FrmAppHelper::simple_get( 'frm_action' ); + return FrmAppHelper::is_admin_list_page(); } /** diff --git a/classes/helpers/FrmAppHelper.php b/classes/helpers/FrmAppHelper.php index bf5c5610cb..b2705b71bb 100644 --- a/classes/helpers/FrmAppHelper.php +++ b/classes/helpers/FrmAppHelper.php @@ -331,6 +331,29 @@ public static function is_formidable_admin() { return $is_formidable; } + /** + * Checks if is a list page. + * + * @since x.x + * + * @param string $page The name of the page to check. + * @return bool + */ + public static function is_admin_list_page( $page = 'formidable' ) { + if ( ! self::is_admin_page( $page ) ) { + return false; + } + + // Check Trash page. + $form_type = self::simple_get( 'form_type' ); + if ( $form_type && 'published' !== $form_type ) { + return false; + } + + // Check edit or settings page. + return ! self::simple_get( 'frm_action' ); + } + /** * Check for certain page in Formidable settings * From 62667c1bc8e87f02ca97846d4cc630ef0c4ead95 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 11:52:44 +0300 Subject: [PATCH 23/29] Execute remember_custom_sort only on admin list pages --- classes/controllers/FrmAppController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index 515aad168c..4763375b63 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1376,6 +1376,10 @@ public static function filter_admin_notices() { * @return void */ private static function remember_custom_sort() { + if ( ! FrmAppHelper::is_admin_list_page() && ! FrmAppHelper::is_admin_list_page( 'formidable-entries' ) ) { + return; + } + $screen = get_current_screen(); $orderby = FrmAppHelper::get_param( 'orderby' ); From d05e62f2fbbcb0fdd3371450b2143f06de1d3bd2 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 19 Feb 2025 12:49:32 +0300 Subject: [PATCH 24/29] Fix the issue where the sorted column icon was not active --- classes/helpers/FrmListHelper.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/classes/helpers/FrmListHelper.php b/classes/helpers/FrmListHelper.php index 0676e3bd43..a4b557f39a 100644 --- a/classes/helpers/FrmListHelper.php +++ b/classes/helpers/FrmListHelper.php @@ -907,6 +907,8 @@ public function print_column_headers( $with_id = true ) { $current_order = 'asc'; } + FrmAppController::apply_saved_sort_preference( $current_orderby, $current_order ); + if ( ! empty( $columns['cb'] ) ) { static $cb_counter = 1; $columns['cb'] = ''; From 1e6af9a8d54ec3fd9c59a394645cd1d40eaf8b71 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 26 Feb 2025 11:43:05 +0300 Subject: [PATCH 25/29] Revert default-value-setting.php changes --- classes/views/frm-fields/back-end/default-value-setting.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/classes/views/frm-fields/back-end/default-value-setting.php b/classes/views/frm-fields/back-end/default-value-setting.php index 8ed14c53f3..b1fa1b61c3 100644 --- a/classes/views/frm-fields/back-end/default-value-setting.php +++ b/classes/views/frm-fields/back-end/default-value-setting.php @@ -12,11 +12,7 @@ class="frm-has-modal frm-default-value-wrapper default-value-section- display_smart_values_modal_trigger_icon( $field ); - } + $field_obj->display_smart_values_modal_trigger_icon( $field ); if ( isset( $display['default_value'] ) && $display['default_value'] ) { $default_name = 'field_options[dyn_default_value_' . $field['id'] . ']'; From 1a5ca0355f41f3d1ed3c0615a15fe8cf92977762 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 26 Feb 2025 14:18:58 +0300 Subject: [PATCH 26/29] Prevent redundant DB updates on sort refresh --- classes/controllers/FrmAppController.php | 35 ++++++++++++++++++------ 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index 5c39d47848..73b5df43b9 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -1376,25 +1376,42 @@ public static function filter_admin_notices() { * @return void */ private static function remember_custom_sort() { + $screen = get_current_screen(); + if ( ! $screen ) { + return; + } + if ( ! FrmAppHelper::is_admin_list_page() && ! FrmAppHelper::is_admin_list_page( 'formidable-entries' ) ) { return; } - $screen = get_current_screen(); $orderby = FrmAppHelper::get_param( 'orderby' ); - if ( ! $screen || ! $orderby ) { + if ( ! $orderby ) { return; } - update_user_meta( - get_current_user_id(), - 'frm_preferred_list_sort_' . $screen->id, - array( - 'orderby' => $orderby, - 'order' => FrmAppHelper::get_param( 'order' ), - ) + $user_id = get_current_user_id(); + $meta_key = 'frm_preferred_list_sort_' . $screen->id; + $order = FrmAppHelper::get_param( 'order' ); + + $new_sort = array( + 'orderby' => $orderby, + 'order' => $order, ); + + $current_sort = get_user_meta( $user_id, $meta_key, true ); + + if ( $new_sort !== $current_sort ) { + update_user_meta( + $user_id, + $meta_key, + array( + 'orderby' => $orderby, + 'order' => $order, + ) + ); + } } /** From 9bb18f58a53d9bc956a3a666af56a57393f0fd44 Mon Sep 17 00:00:00 2001 From: Sherv Date: Mon, 3 Mar 2025 10:08:38 +0300 Subject: [PATCH 27/29] Adjust utility classes order --- css/frm_admin.css | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/css/frm_admin.css b/css/frm_admin.css index 7651566400..39da3494bc 100644 --- a/css/frm_admin.css +++ b/css/frm_admin.css @@ -1746,14 +1746,14 @@ input.frm_insert_in_template { margin-bottom: var(--gap-2xs) !important; } -.frm-mb-xs { - margin-bottom: var(--gap-xs) !important; -} - .frm-mb-sm { margin-bottom: var(--gap-sm) !important; } +.frm-mb-xs { + margin-bottom: var(--gap-xs) !important; +} + .frm-mb-md { margin-bottom: var(--gap-md) !important; } From 004c3deb23be6b28db2ab8e61e4f4f6af2fcd5df Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 5 Mar 2025 22:45:45 +0300 Subject: [PATCH 28/29] Add 'show_nav=1' to 'View Form" url --- classes/helpers/FrmFormsListHelper.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/helpers/FrmFormsListHelper.php b/classes/helpers/FrmFormsListHelper.php index 3dc00b2cc6..45531739dc 100644 --- a/classes/helpers/FrmFormsListHelper.php +++ b/classes/helpers/FrmFormsListHelper.php @@ -384,7 +384,7 @@ protected function column_style( $form ) { */ protected function column_views( $form ) { $attributes = array( - 'href' => admin_url( 'admin.php?page=formidable-views&form=' . absint( $form->id ) ), + 'href' => admin_url( 'admin.php?page=formidable-views&form=' . absint( $form->id ) . '&show_nav=1' ), 'title' => __( 'View Form', 'formidable' ), 'target' => '_blank', ); From 4c0f9f67049bfdced53244156a61d976a1861743 Mon Sep 17 00:00:00 2001 From: Sherv Date: Wed, 5 Mar 2025 22:48:52 +0300 Subject: [PATCH 29/29] Move $confirm_delete_attributes inside the $verify condition check --- classes/helpers/FrmListHelper.php | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/classes/helpers/FrmListHelper.php b/classes/helpers/FrmListHelper.php index a4b557f39a..84ce4745fa 100644 --- a/classes/helpers/FrmListHelper.php +++ b/classes/helpers/FrmListHelper.php @@ -390,18 +390,18 @@ protected function bulk_actions( $which = '' ) { if ( isset( $this->_actions['bulk_delete'] ) ) { $verify = $this->confirm_bulk_delete(); - $confirm_delete_attributes = array( - 'id' => 'confirm-bulk-delete-' . $which, - 'class' => 'frm-hidden', - 'tabindex' => '-1', - 'aria-hidden' => 'true', - 'href' => 'confirm-bulk-delete', - 'data-loaded-from' => $this->loaded_from(), - 'data-frmverify' => $verify, - 'data-frmverify-btn' => 'frm-button-red', - ); - if ( $verify ) { + $confirm_delete_attributes = array( + 'id' => 'confirm-bulk-delete-' . $which, + 'class' => 'frm-hidden', + 'tabindex' => '-1', + 'aria-hidden' => 'true', + 'href' => 'confirm-bulk-delete', + 'data-loaded-from' => $this->loaded_from(), + 'data-frmverify' => $verify, + 'data-frmverify-btn' => 'frm-button-red', + ); + // phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped echo ''; }