From 0274398d2b428f5dcad03b248f07020e90ed7c52 Mon Sep 17 00:00:00 2001 From: Arpit Date: Thu, 6 Oct 2022 11:42:18 +0530 Subject: [PATCH] [improvements] Table - exposed active filters and add an event (#4138) * exposed active filters * adds onFilterChanged event * default value for filters should be an empty array * remove column id from exposed filter variables --- .../src/Editor/Components/Table/Filter.jsx | 18 ++++++++++++++---- frontend/src/Editor/Components/Table/Table.jsx | 8 ++++++++ .../src/Editor/WidgetManager/widgetConfig.js | 2 ++ frontend/src/_helpers/appUtils.js | 1 + 4 files changed, 25 insertions(+), 4 deletions(-) diff --git a/frontend/src/Editor/Components/Table/Filter.jsx b/frontend/src/Editor/Components/Table/Filter.jsx index 7b31aedf51..4929d177ef 100644 --- a/frontend/src/Editor/Components/Table/Filter.jsx +++ b/frontend/src/Editor/Components/Table/Filter.jsx @@ -1,16 +1,19 @@ import React from 'react'; import SelectSearch, { fuzzySearch } from 'react-select-search'; import { useTranslation } from 'react-i18next'; +import { useMounted } from '@/_hooks/use-mount'; export function Filter(props) { + const mounted = useMounted(); const { t } = useTranslation(); - const { mergeToFilterDetails, filterDetails, setAllFilters } = props; + const { mergeToFilterDetails, filterDetails, setAllFilters, fireEvent } = props; const { filters } = filterDetails; - function filterColumnChanged(index, value) { + function filterColumnChanged(index, value, name) { const newFilters = filters; newFilters[index].id = value; + newFilters[index].value.where = name; mergeToFilterDetails({ filters: newFilters, }); @@ -61,6 +64,13 @@ export function Filter(props) { setAllFilters([]); } + React.useEffect(() => { + if (mounted) { + fireEvent('onFilterChanged'); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [filters.length]); + return (
@@ -84,8 +94,8 @@ export function Filter(props) { options={props.columns} value={filter.id} search={true} - onChange={(value) => { - filterColumnChanged(index, value); + onChange={(value, item) => { + filterColumnChanged(index, value, item.name); }} filterOptions={fuzzySearch} placeholder={t('globals.select', 'Select') + '...'} diff --git a/frontend/src/Editor/Components/Table/Table.jsx b/frontend/src/Editor/Components/Table/Table.jsx index 475ad8487d..121dfaa886 100644 --- a/frontend/src/Editor/Components/Table/Table.jsx +++ b/frontend/src/Editor/Components/Table/Table.jsx @@ -79,6 +79,13 @@ export function Table({ const mergeToTableDetails = (payload) => dispatch(reducerActions.mergeToTableDetails(payload)); const mergeToFilterDetails = (payload) => dispatch(reducerActions.mergeToFilterDetails(payload)); + useEffect(() => { + setExposedVariable( + 'filters', + tableDetails.filterDetails.filters.map((filter) => filter.value) + ); + }, [JSON.stringify(tableDetails.filterDetails.filters)]); + useEffect( () => mergeToTableDetails({ columnProperties: component?.definition?.properties?.columns?.value }), [component?.definition?.properties] @@ -601,6 +608,7 @@ export function Table({ filterDetails={tableDetails.filterDetails} darkMode={darkMode} setAllFilters={setAllFilters} + fireEvent={fireEvent} /> )}
diff --git a/frontend/src/Editor/WidgetManager/widgetConfig.js b/frontend/src/Editor/WidgetManager/widgetConfig.js index 053ece1683..4bfb4b85cf 100644 --- a/frontend/src/Editor/WidgetManager/widgetConfig.js +++ b/frontend/src/Editor/WidgetManager/widgetConfig.js @@ -225,6 +225,7 @@ export const widgets = [ onBulkUpdate: { displayName: 'Bulk update' }, onPageChanged: { displayName: 'Page changed' }, onSearch: { displayName: 'Search' }, + onFilterChanged: { displayName: 'Filter changed' }, }, styles: { textColor: { @@ -295,6 +296,7 @@ export const widgets = [ pageIndex: 1, searchText: '', selectedRows: [], + filters: [], }, actions: [ { diff --git a/frontend/src/_helpers/appUtils.js b/frontend/src/_helpers/appUtils.js index 7c0c22eddf..0ee805ee23 100644 --- a/frontend/src/_helpers/appUtils.js +++ b/frontend/src/_helpers/appUtils.js @@ -512,6 +512,7 @@ export async function onEvent(_ref, eventName, options, mode = 'edit') { 'onOpen', 'onClose', 'onRowClicked', + 'onFilterChanged', ].includes(eventName) ) { const { component } = options;