diff --git a/.eslintignore b/.eslintignore index b505f64e4b..5530b00a96 100644 --- a/.eslintignore +++ b/.eslintignore @@ -10,9 +10,11 @@ js/addons-page.js js/formidable_styles.js js/formidable_admin.js js/bootstrap-multiselect.js +js/formidable-settings-components.js # Config files *.config.js +webpack*.js **/node_modules/** **/vendor/** diff --git a/.eslintrc.json b/.eslintrc.json index 861d81ed76..42f6dd024b 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -34,7 +34,7 @@ "window": true, "document": true }, - "plugins": ["react", "jsx-a11y", "sonarjs", "cypress", "no-jquery", "compat"], + "plugins": ["react", "jsx-a11y", "sonarjs", "cypress", "no-jquery", "compat", "jsdoc"], "settings": { "import/resolver": { "webpack": { @@ -94,7 +94,7 @@ "@wordpress/no-global-active-element": "off", "no-alert": "off", "no-undef": "off", - "jsdoc/no-undefined-types": "off", + "jsdoc/check-tag-names": "error", "no-shadow": "off", "sonarjs/no-duplicate-string": "off", "sonarjs/prefer-single-boolean-return": "off", diff --git a/.github/workflows/qadeploy.yml b/.github/workflows/qadeploy.yml index 6de738b906..f31d465f26 100644 --- a/.github/workflows/qadeploy.yml +++ b/.github/workflows/qadeploy.yml @@ -13,11 +13,18 @@ jobs: - name: 🚚 Get latest code uses: actions/checkout@v3.5.0 + - name: 🔄 Sanitize branch name + id: sanitize + run: | + BRANCH="${{ github.event.pull_request.head.ref }}" + SANITIZED_BRANCH="${BRANCH//\//-}" + echo "sanitized_branch=$SANITIZED_BRANCH" >> $GITHUB_OUTPUT + - name: 📂 Sync files uses: SamKirkland/FTP-Deploy-Action@4.3.1 with: server: ${{ secrets.FRM_FTP_HOST }} - server-dir: ${{ github.event.repository.name }}-${{ github.event.pull_request.head.ref }}/ + server-dir: ${{ github.event.repository.name }}-${{ steps.sanitize.outputs.sanitized_branch }}/ username: ${{ secrets.FRM_FTP_USERNAME }} password: ${{ secrets.FRM_FTP_PASSWORD }} exclude: | diff --git a/.stylelintrc.json b/.stylelintrc.json index bc653169a6..6601165993 100644 --- a/.stylelintrc.json +++ b/.stylelintrc.json @@ -6,6 +6,7 @@ "selector-id-pattern": null, "font-family-name-quotes": null, "function-url-quotes": null, + "no-duplicate-selectors": null, "value-keyword-case": [ "lower", { diff --git a/classes/controllers/FrmAppController.php b/classes/controllers/FrmAppController.php index f41893bc08..1b5a1c37ab 100644 --- a/classes/controllers/FrmAppController.php +++ b/classes/controllers/FrmAppController.php @@ -784,6 +784,29 @@ public static function admin_js() { wp_register_script( 'formidable_addons', $plugin_url . '/js/admin/addons.js', array( 'formidable_admin', 'wp-dom-ready' ), $version, true ); wp_enqueue_script( 'formidable_addons' ); } + + self::enqueue_builder_assets( $plugin_url, $version ); + } + + /** + * Enqueue the Form Builder assets. + * + * @since x.x + * + * @param string $plugin_url The plugin URL. + * @param string $version The plugin version. + * @return void + */ + private static function enqueue_builder_assets( $plugin_url, $version ) { + wp_register_style( 'formidable-settings-components', $plugin_url . '/css/admin/frm-settings-components.css', array( 'formidable-admin', 'formidable-grids' ), $version ); + wp_register_script( 'formidable-settings-components', $plugin_url . '/js/formidable-settings-components.js', array( 'formidable_admin' ), $version, true ); + + if ( ! FrmAppHelper::is_form_builder_page() ) { + return; + } + + wp_enqueue_style( 'formidable-settings-components' ); + wp_enqueue_script( 'formidable-settings-components' ); } /** diff --git a/classes/controllers/FrmFieldsController.php b/classes/controllers/FrmFieldsController.php index bddc6c50e9..0f1c87f6c8 100644 --- a/classes/controllers/FrmFieldsController.php +++ b/classes/controllers/FrmFieldsController.php @@ -391,28 +391,30 @@ private static function default_value_types( $field, $atts ) { 'default_value' => array( 'class' => '', 'icon' => 'frm_icon_font frm_text2_icon', - 'title' => __( 'Default Value (Text)', 'formidable' ), + 'title' => __( 'Default Value', 'formidable' ), 'data' => array( 'frmshow' => '#default-value-for-', ), ), 'calc' => array( - 'class' => 'frm_show_upgrade frm_noallow', - 'title' => __( 'Default Value (Calculation)', 'formidable' ), - 'icon' => 'frm_icon_font frm_calculator_icon', - 'data' => array( + 'class' => 'frm_show_upgrade frm_noallow', + 'title' => __( 'Calculate Value', 'formidable' ), + 'icon' => 'frm_icon_font frm_calculator_icon', + 'data' => array( 'medium' => 'calculations', 'upgrade' => __( 'Calculator forms', 'formidable' ), ), + 'tooltip' => __( 'Automatically calculate the value of this field based on values from other fields.', 'formidable' ), ), 'get_values_field' => array( - 'class' => 'frm_show_upgrade frm_noallow', - 'title' => __( 'Default Value (Lookup)', 'formidable' ), - 'icon' => 'frm_icon_font frm_search_icon', - 'data' => array( + 'class' => 'frm_show_upgrade frm_noallow', + 'title' => __( 'Lookup', 'formidable' ), + 'icon' => 'frm_icon_font frm_search_icon', + 'data' => array( 'medium' => 'lookup', 'upgrade' => __( 'Lookup fields', 'formidable' ), ), + 'tooltip' => __( 'Dynamically retrieve the value of this field from a lookup field.', 'formidable' ), ), ); @@ -422,9 +424,11 @@ private static function default_value_types( $field, $atts ) { $settings = array_keys( $types ); $active = 'default_value'; - foreach ( $settings as $type ) { - if ( ! empty( $field[ $type ] ) ) { - $active = $type; + if ( FrmAppHelper::pro_is_connected() ) { + foreach ( $settings as $type ) { + if ( ! empty( $field[ $type ] ) ) { + $active = $type; + } } } diff --git a/classes/controllers/FrmFormsController.php b/classes/controllers/FrmFormsController.php index c6557a75f9..9002a13941 100644 --- a/classes/controllers/FrmFormsController.php +++ b/classes/controllers/FrmFormsController.php @@ -68,7 +68,7 @@ public static function logic_tip() { $data_message .= ' ' . esc_attr__( 'Conditional Logic options', 'formidable' ) . ''; echo ''; esc_html_e( 'Conditional Logic', 'formidable' ); - FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown6_icon', array( 'aria-hidden' => 'true' ) ); + FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown8_icon', array( 'aria-hidden' => 'true' ) ); echo ''; } diff --git a/classes/controllers/FrmStylesController.php b/classes/controllers/FrmStylesController.php index ca99ad416d..40d6b5d541 100644 --- a/classes/controllers/FrmStylesController.php +++ b/classes/controllers/FrmStylesController.php @@ -1265,13 +1265,11 @@ public static function do_accordion_sections( $screen, $context, $data_object )
  • diff --git a/classes/helpers/FrmAppHelper.php b/classes/helpers/FrmAppHelper.php index 8638cd5f7d..b868099e79 100644 --- a/classes/helpers/FrmAppHelper.php +++ b/classes/helpers/FrmAppHelper.php @@ -1540,6 +1540,7 @@ public static function show_search_box( $atts ) { 'text' => __( 'Search', 'formidable' ), 'input_id' => '', 'value' => false, + 'class' => '', ); $atts = array_merge( $defaults, $atts ); @@ -1574,13 +1575,11 @@ public static function show_search_box( $atts ) { $input_atts['autocomplete'] = 'off'; } ?> -
    '; parent::show_after_default( $args ); + echo '
    '; /** * @var array $field diff --git a/classes/models/fields/FrmFieldType.php b/classes/models/fields/FrmFieldType.php index 7f260d2ee9..fdfd1f4bfd 100644 --- a/classes/models/fields/FrmFieldType.php +++ b/classes/models/fields/FrmFieldType.php @@ -500,6 +500,7 @@ public function show_field_options( $args ) { $should_hide_bulk_edit = apply_filters( 'frm_should_hide_bulk_edit', $display_format === '1', $display_format, $args ); include FrmAppHelper::plugin_path() . '/classes/views/frm-fields/back-end/field-options.php'; + FrmFieldsHelper::render_ai_generate_options_button( $args, $should_hide_bulk_edit ); } /** @@ -595,13 +596,6 @@ protected function get_bulk_edit_string() { return __( 'Bulk Edit Options', 'formidable' ); } - /** - * @since 4.04 - */ - protected function get_add_option_string() { - return __( 'Add Option', 'formidable' ); - } - /** * @since 4.04 */ @@ -658,7 +652,7 @@ protected function field_choices_heading( $args ) { esc_html__( '%s Options', 'formidable' ), esc_html( $all_field_types[ $args['display']['type'] ]['name'] ) ); - FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown6_icon', array( 'aria-hidden' => 'true' ) ); + FrmAppHelper::icon_by_class( 'frmfont frm_arrowdown8_icon', array( 'aria-hidden' => 'true' ) ); ?> get_select_attributes( $values ); } + + /** + * @since 4.04 + * @deprecated x.x + */ + protected function get_add_option_string() { + _deprecated_function( __METHOD__, 'x.x' ); + return __( 'Add Option', 'formidable' ); + } } diff --git a/classes/views/frm-fields/back-end/combo-field/sub-field-options.php b/classes/views/frm-fields/back-end/combo-field/sub-field-options.php index b4e2cab4fe..38f6ba52c1 100644 --- a/classes/views/frm-fields/back-end/combo-field/sub-field-options.php +++ b/classes/views/frm-fields/back-end/combo-field/sub-field-options.php @@ -26,9 +26,9 @@ class="" data-sub-field-name="" data-field-id="" > -