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;