Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
4042358
Temp commit
truongwp Dec 30, 2025
af5226a
Add forms list settings
truongwp Jan 13, 2026
76a715b
Move Pro columns to Pro
truongwp Jan 13, 2026
ade05d5
Fix JS error of forms list settings
truongwp Jan 28, 2026
24151a2
Completed the forms list settings
truongwp Feb 3, 2026
cc596c2
Improve styling of forms list settings
truongwp Feb 3, 2026
3be6c58
Show form description
truongwp Feb 3, 2026
807b3a0
Merge branch 'master' into redesigned-forms-table
truongwp Feb 4, 2026
53a9e94
Fix typo
truongwp Feb 6, 2026
555d8f2
Fix Rector
truongwp Feb 6, 2026
52a53b8
Fix eslint
truongwp Feb 6, 2026
f3cbfd0
Fix PHPCS
truongwp Feb 6, 2026
7e4c261
Fix PHP CS Fixer
truongwp Feb 6, 2026
184738d
Fix PHPCS
truongwp Feb 10, 2026
8a65f76
Update js/admin/forms-list.js
truongwp Feb 10, 2026
942927e
Update js/admin/forms-list.js
truongwp Feb 10, 2026
5b2df14
Move use strict to global scope
truongwp Feb 10, 2026
417981f
Fix Eslint
truongwp Feb 10, 2026
758a889
Move HTML to a view file
truongwp Feb 10, 2026
ecdf1ee
Temp commit
truongwp Mar 4, 2026
bac5bab
Improve the forms list dropdown
truongwp Mar 4, 2026
8f91df4
Fix show desc not work
truongwp Mar 4, 2026
45fa63a
Merge branch 'master' into redesigned-forms-table
Crabcyborg Mar 16, 2026
2844cc8
Run stylelint and eslint fixes
Crabcyborg Mar 16, 2026
b02b0ba
Merge branch 'master' into redesigned-forms-table
Crabcyborg Mar 16, 2026
d93cdf0
Use double quotes (consistency)
Crabcyborg Mar 16, 2026
9c8aee0
Make the forms list columns setting work with screen options disabled
truongwp Mar 17, 2026
8056141
Merge branch 'redesigned-forms-table' of github.com:Strategy11/formid…
truongwp Mar 17, 2026
52ba979
Make show form desc and forms per page work without Screen Options
truongwp Mar 17, 2026
201e4df
Fix DeepScan
truongwp Mar 17, 2026
ec543f2
Merge branch 'master' into redesigned-forms-table
truongwp Mar 18, 2026
5860232
Fix eslint and Psalm
truongwp Mar 18, 2026
1e37371
Escape the form desc
truongwp Mar 18, 2026
cc4e20e
Use FrmAppHelper::kses
truongwp Mar 18, 2026
4d90a89
Fix PHP CS Fixer
truongwp Mar 18, 2026
e998061
Use Frm settings icon instead of dashicon
truongwp Mar 23, 2026
ae3f4dc
Improve styling of columns setting dropdown
truongwp Mar 25, 2026
1193fc7
Show views count instead of the eye icon
truongwp Apr 3, 2026
2e2f79e
Move form action links
truongwp Apr 6, 2026
8b24b1c
Update forms list column width
truongwp Apr 6, 2026
95060ae
Fix the forms list value not show after enabling a column
truongwp Apr 7, 2026
38a41f7
Merge branch 'master' into redesigned-forms-table
truongwp Apr 7, 2026
98a585c
Check for views add-on exists
truongwp Apr 7, 2026
8994551
Add stubs
truongwp Apr 7, 2026
eedc219
Fix PHPCS
truongwp Apr 7, 2026
32f0d4a
Fix PHPCS
truongwp Apr 7, 2026
43472a5
Fix typo
truongwp Apr 7, 2026
cf4cc86
Fix PHPCS
truongwp Apr 7, 2026
8f13a96
Add Oxlint
truongwp Apr 7, 2026
2d28f44
Skip DeepSource PHP error
truongwp Apr 7, 2026
0c995cb
Skip DeepSource PHP error
truongwp Apr 7, 2026
0ebd048
Add animation to forms list settings
truongwp Apr 13, 2026
a15cc7a
Add animation to columns setting header icon
truongwp Apr 13, 2026
4652e94
Add collapsing animation to column checkboxes
truongwp Apr 13, 2026
3f978ba
Change date column format when show form description
truongwp Apr 13, 2026
a09376d
Remove forms list view switcher
truongwp Apr 13, 2026
51cefca
Improve column checkboxes list styling
truongwp Apr 14, 2026
4042186
Add hover color to columns list settings
truongwp Apr 14, 2026
8f37adb
Add transition to background color
truongwp Apr 14, 2026
3646510
Only deprecate Actions column if Pro is updated
truongwp Apr 14, 2026
2eaf7de
Fix PHP Cs Fixer
truongwp Apr 14, 2026
0a55bb0
Fix PHPCS
truongwp Apr 14, 2026
ed6bd35
Remove e2e test for excerpt view
truongwp Apr 14, 2026
de509f9
Fix PHPStan
truongwp Apr 14, 2026
6c89c4b
Remove more e2e test
truongwp Apr 14, 2026
80c01ad
Merge branch 'master' into redesigned-forms-table
truongwp Apr 17, 2026
83eea01
Reuse view mode instead new user option for form description
truongwp Apr 21, 2026
44d531c
Revert changes in entry count
truongwp Apr 21, 2026
575b5ed
Fix PHPStan
truongwp Apr 21, 2026
c37add0
Change padding of items per page input
truongwp Apr 21, 2026
e473848
Merge branch 'master' into redesigned-forms-table
Crabcyborg Apr 21, 2026
4ed5375
Merge branch 'master' into redesigned-forms-table
Crabcyborg Apr 21, 2026
8a9c6ef
Run phpcbf with new sniff fix
Crabcyborg Apr 21, 2026
65451e0
Remove unnecessary code
truongwp Apr 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions classes/controllers/FrmAppController.php
Original file line number Diff line number Diff line change
Expand Up @@ -729,9 +729,20 @@ public static function admin_js() {

wp_register_script( 'formidable_admin', $plugin_url . '/js/formidable_admin.js', self::get_admin_js_dependencies(), $version, true );

wp_register_script(
'formidable_forms_list',
$plugin_url . '/js/admin/forms-list.js',
array(
'formidable_dom',
),
$version,
true
);

if ( FrmAppHelper::on_form_listing_page() ) {
// For the existing page dropdown in the Form embed modal.
wp_enqueue_script( 'jquery-ui-autocomplete' );
wp_enqueue_script( 'formidable_forms_list' );
}

wp_register_script( 'bootstrap-multiselect', $plugin_url . '/js/bootstrap-multiselect.js', array( 'jquery', 'bootstrap_tooltip', 'popper' ), '2.0', true );
Expand Down
66 changes: 65 additions & 1 deletion classes/controllers/FrmFormsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,13 @@ public static function maybe_load_listing_hooks() {
add_filter( 'manage_toplevel_page_formidable_sortable_columns', 'FrmFormsController::get_sortable_columns' );
}

/**
* Runs on admin head of the formidable forms page.
*
* @since x.x This adds screen options.
*
* @return void
*/
public static function head() {
if ( wp_is_mobile() ) {
wp_enqueue_script( 'jquery-touch-punch' );
Expand Down Expand Up @@ -1233,15 +1240,24 @@ public static function get_columns( $columns ) {
$columns['cb'] = '<input type="checkbox" />';
$columns['name'] = esc_html__( 'Form Title', 'formidable' );
$columns['entries'] = esc_html__( 'Entries', 'formidable' );
$columns['views'] = esc_html__( 'Views', 'formidable' );
$columns['id'] = 'ID';
$columns['form_key'] = esc_html__( 'Key', 'formidable' );

if ( 'trash' !== FrmAppHelper::simple_get( 'form_type' ) ) {
if ( 'trash' !== FrmAppHelper::simple_get( 'form_type' ) && has_filter( 'frm_form_list_actions' ) ) {
// If there is any filters added, keep this column.
$columns['shortcode'] = esc_html__( 'Actions', 'formidable' );
}

$columns['created_at'] = esc_html__( 'Date', 'formidable' );

if ( 'trash' !== FrmAppHelper::simple_get( 'form_type' ) ) {
$columns['settings'] = '<div class="frm-forms-list-settings-btn-wrapper"><a href="#" class="frm-forms-list-settings-btn">';
$columns['settings'] .= FrmAppHelper::icon_by_class( 'frmfont frm_settings_icon', array( 'echo' => false ) );
$columns['settings'] .= '<span class="screen-reader-text">' . esc_html__( 'List settings', 'formidable' ) . '</span>';
$columns['settings'] .= '</a></div>';
}

Comment thread
coderabbitai[bot] marked this conversation as resolved.
add_screen_option(
'per_page',
array(
Expand Down Expand Up @@ -3695,6 +3711,54 @@ function () {
);
}

/**
* Prints necessary templates for the forms list page.
*
* @since x.x
*
* @return void
*/
public static function print_forms_list_templates() {
if ( ! FrmAppHelper::on_form_listing_page() ) {
return;
}

$screen = get_current_screen();

if ( ! $screen ) {
return;
}

$columns = get_column_headers( $screen );
$hidden = get_hidden_columns( $screen );
$skip_cols = array( 'cb', 'name', 'settings' );
$per_page = get_user_option( 'formidable_page_formidable_per_page' );
$show_screen_options = $screen->show_screen_options();

if ( $per_page < 1 ) {
$per_page = 20;
}

include FrmAppHelper::plugin_path() . '/classes/views/frm-forms/forms-list-settings.php';
}

/**
* Adds custom screen options.
*
* @since x.x
*
* @param string $settings_html Settings HTML.
*
* @return string
*/
public static function add_screen_options( $settings_html ) {
if ( ! FrmAppHelper::on_form_listing_page() ) {
return $settings_html;
}

return $settings_html;
}

/**
* @deprecated 4.0
*
Expand Down
2 changes: 2 additions & 0 deletions classes/controllers/FrmHooksController.php
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,9 @@ public static function load_admin_hooks() {
add_filter( 'frm_fields_in_form_builder', 'FrmFormsController::update_form_builder_fields' );

add_filter( 'set-screen-option', 'FrmFormsController::save_per_page', 10, 3 );
add_filter( 'screen_settings', 'FrmFormsController::add_screen_options' );
add_action( 'admin_footer', 'FrmFormsController::insert_form_popup' );
add_action( 'admin_footer', 'FrmFormsController::print_forms_list_templates' );

// Elementor.
add_action( 'elementor/editor/footer', 'FrmElementorController::admin_init' );
Expand Down
2 changes: 1 addition & 1 deletion classes/helpers/FrmEntriesListHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,7 @@ public function single_row( $item, $style = '' ) {
}

if ( in_array( $column_name, $hidden, true ) ) {
$class .= ' frm_hidden';
$class .= ' hidden';
} elseif ( ! $action_col && ! in_array( $column_name, $action_columns, true ) ) {
$action_col = $column_name;
}
Expand Down
2 changes: 1 addition & 1 deletion classes/helpers/FrmFormsHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -1248,7 +1248,7 @@ public static function get_action_links( $form_id, $form ) {
} else {
$actions['duplicate'] = array(
'url' => wp_nonce_url( $duplicate_link ),
'label' => __( 'Duplicate Form', 'formidable' ),
'label' => __( 'Duplicate', 'formidable' ),
'icon' => 'frmfont frm_clone_icon',
);
}
Expand Down
132 changes: 85 additions & 47 deletions classes/helpers/FrmFormsListHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,13 @@ public function prepare_items() {
$page = $this->get_pagenum();
$per_page = $this->get_items_per_page( 'formidable_page_formidable_per_page' );

$mode = self::get_param(
$mode = self::get_param(
array(
'param' => 'mode',
'default' => 'list',
)
);

$orderby = self::get_param(
array(
'param' => 'orderby',
Expand Down Expand Up @@ -223,21 +224,6 @@ public function get_views() {
return $links;
}

/**
* @param string $which
*
* @return void
*/
public function pagination( $which ) {
global $mode;

parent::pagination( $which );

if ( 'top' === $which ) {
$this->view_switcher( $mode );
}
}

/**
* @param stdClass $item
* @param string $style
Expand All @@ -254,17 +240,8 @@ public function single_row( $item, $style = '' ) {
$this->get_actions( $actions, $item, $edit_link );

$action_links = $this->row_actions( $actions );

// Set up the checkbox ( because the user is editable, otherwise its empty )
$checkbox = '<input type="checkbox" name="item-action[]" id="cb-item-action-' . absint( $item->id ) . '" value="' . esc_attr( $item->id ) . '" />';
$checkbox_label_text = sprintf(
// translators: Form title
__( 'Select %s', 'formidable' ),
! empty( $item->name ) ? $item->name : FrmFormsHelper::get_no_title_text()
);

$checkbox .= '<label for="cb-item-action-' . absint( $item->id ) . '"><span class="screen-reader-text">' . esc_html( $checkbox_label_text ) . '</span></label>';
$r = '<tr id="item-action-' . absint( $item->id ) . '"' . $style . '>';
$checkbox = $this->get_row_checkbox( $item );
$r = '<tr id="item-action-' . absint( $item->id ) . '"' . $style . '>';

list( $columns, $hidden ) = $this->get_column_info();

Expand All @@ -279,16 +256,15 @@ public function single_row( $item, $style = '' ) {
$style = '';

if ( in_array( $column_name, $hidden, true ) ) {
$class .= ' frm_hidden';
$class .= ' hidden';
}

if ( $column_name === 'name' ) {
$class .= ' column-primary';
}

$class = 'class="' . esc_attr( $class ) . '"';
$data_colname = ' data-colname="' . esc_attr( $column_display_name ) . '"';
$attributes = $class . $style . $data_colname;
$class = 'class="' . esc_attr( $class ) . '"';
$attributes = $class . $style . $this->get_column_data_attr( $column_name, $column_display_name );

switch ( $column_name ) {
case 'cb':
Expand All @@ -307,19 +283,7 @@ public function single_row( $item, $style = '' ) {
$val = '<abbr title="' . esc_attr( gmdate( 'Y/m/d g:i:s A', strtotime( $item->created_at ) ) ) . '">' . $date . '</abbr>';
break;
case 'entries':
if ( ! empty( $item->options['no_save'] ) ) {
$val = FrmAppHelper::icon_by_class(
'frmfont frm_forbid_icon frm_bstooltip',
array(
'title' => __( 'Saving entries is disabled for this form', 'formidable' ),
'echo' => false,
)
);
} else {
$text = FrmEntry::getRecordCount( $item->id );
$val = current_user_can( 'frm_view_entries' ) ? '<a href="' . esc_url( admin_url( 'admin.php?page=formidable-entries&form=' . $item->id ) ) . '">' . $text . '</a>' : $text; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
unset( $text );
}
$val = $this->get_entries_column_value( $item );
break;
default:
if ( method_exists( $this, 'column_' . $column_name ) ) {
Expand All @@ -338,17 +302,72 @@ public function single_row( $item, $style = '' ) {
return $r . '</tr>';
}

/**
* @param string $column_name
* @param string $column_display_name
*
* @return string
*/
private function get_column_data_attr( $column_name, $column_display_name ) {
if ( 'settings' === $column_name ) {
return ' data-colname="' . esc_attr( trim( strip_tags( $column_display_name ) ) ) . '"';
}
return ' data-colname="' . esc_attr( $column_display_name ) . '"';
}

/**
* @param object $item
*
* @return string
*/
private function get_entries_column_value( $item ) {
if ( ! empty( $item->options['no_save'] ) ) {
return (string) FrmAppHelper::icon_by_class(
'frmfont frm_forbid_icon frm_bstooltip',
array(
'title' => __( 'Saving entries is disabled for this form', 'formidable' ),
'echo' => false,
)
);
}

$text = intval( FrmEntry::getRecordCount( $item->id ) );
return current_user_can( 'frm_view_entries' ) ? '<a href="' . esc_url( admin_url( 'admin.php?page=formidable-entries&form=' . $item->id ) ) . '">' . $text . '</a>' : (string) $text; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
}

/**
* @param object $item
*
* @return string
*/
private function get_row_checkbox( $item ) {
// Set up the checkbox (because the user is editable, otherwise it's empty).
$checkbox = '<input type="checkbox" name="item-action[]" id="cb-item-action-' . absint( $item->id ) . '" value="' . esc_attr( $item->id ) . '" />';
$checkbox_label_text = sprintf(
// translators: Form title
__( 'Select %s', 'formidable' ),
! empty( $item->name ) ? $item->name : FrmFormsHelper::get_no_title_text()
);

return $checkbox . '<label for="cb-item-action-' . absint( $item->id ) . '"><span class="screen-reader-text">' . esc_html( $checkbox_label_text ) . '</span></label>';
}

/**
* Get the HTML for the Actions column in the form list.
* This includes multiple icons for triggering the embed modal, the visual styler, and an active landing page.
*
* @since 6.0
* @deprecated x.x We moved these actions to other places. This column will show if there is a filter added to the hook.
*
* @param stdClass $form
*
* @return string
*/
protected function column_shortcode( $form ) {
if ( method_exists( 'FrmProFormsListHelper', 'column_embeds' ) ) {
_deprecated_function( __METHOD__, 'x.x' );
}

$val = '<a href="#" class="frm-embed-form" role="button" aria-label="' . esc_attr__( 'Embed Form', 'formidable' ) . '">' . FrmAppHelper::icon_by_class( 'frmfont frm_code_icon', array( 'echo' => false ) ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
$val .= $this->column_style( $form );
$val .= $this->column_views( $form );
Expand Down Expand Up @@ -404,13 +423,31 @@ protected function column_views( $form ) {
'target' => '_blank',
);

if ( class_exists( 'FrmViewsDisplay' ) ) {
$view_ids = FrmViewsDisplay::get_display_ids_by_form( $form->id );
$view_count = $view_ids ? count( $view_ids ) : 0;
} else {
$view_count = 0;
}

// phpcs:disable Generic.WhiteSpace.ScopeIndent
return '<a ' . FrmAppHelper::array_to_html_params( $attributes ) . '>
' . FrmAppHelper::icon_by_class( 'frmfont frm_eye_icon', array( 'echo' => false ) ) .
' . intval( $view_count ) .
'</a>';
// phpcs:enable Generic.WhiteSpace.ScopeIndent
}

/**
* Get the HTML for the Settings column in the form list.
*
* @since x.x
*
* @return string
*/
protected function column_settings() {
return '&nbsp;';
}

/**
* @param array $actions
* @param object $item
Expand All @@ -435,8 +472,9 @@ private function get_actions( &$actions, $item, $edit_link ) {
$actions['frm_settings'] = '<a href="' . esc_url( '?page=formidable&frm_action=settings&id=' . $item->id ) . '">' . esc_html__( 'Settings', 'formidable' ) . '</a>';
}

$actions = array_merge( $actions, $new_actions );
$actions['view'] = '<a href="' . esc_url( FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" target="_blank">' . esc_html__( 'Preview', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
$actions = array_merge( $actions, $new_actions );
$actions['embed'] = '<a href="#" class="frm-embed-form" role="button" aria-label="' . esc_attr__( 'Embed Form', 'formidable' ) . '">' . esc_html__( 'Embed', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
$actions['view'] = '<a href="' . esc_url( FrmFormsHelper::get_direct_link( $item->form_key, $item ) ) . '" target="_blank">' . esc_html__( 'Preview', 'formidable' ) . '</a>'; // phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
}

/**
Expand Down
Loading
Loading