rez-table-listing-mui 1.3.3 → 1.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "rez-table-listing-mui",
3
- "version": "1.3.3",
3
+ "version": "1.3.4",
4
4
  "type": "module",
5
5
  "description": "A rez table listing component built on TanStack Table",
6
6
  "main": "dist/index.js",
@@ -10,6 +10,7 @@ import {
10
10
  import {
11
11
  AttributesFilterProps,
12
12
  FilterMasterStateProps,
13
+ FilterStateProps,
13
14
  } from "../../../types/filter";
14
15
  import CustomSearch from "./search";
15
16
  import { useMemo } from "react";
@@ -64,7 +65,7 @@ const AttributesFilter = ({
64
65
  );
65
66
  if (!matchingColumn) return;
66
67
 
67
- let updatedFilters = [...filters];
68
+ let updatedFilters: FilterStateProps[] = [...filters];
68
69
  let updatedRadio: string[] = [];
69
70
 
70
71
  if (value === "") {
@@ -85,15 +86,15 @@ const AttributesFilter = ({
85
86
  filter_value: [value],
86
87
  };
87
88
 
88
- const exists = filters.some(
89
- (f) => f.filter_attribute === matchingColumn.attribute_key
89
+ const exists = filters?.some(
90
+ (f) => f?.filter_attribute === matchingColumn?.attribute_key
90
91
  );
91
92
  if (exists) {
92
- updatedFilters = filters.map((f) =>
93
- f.filter_attribute === matchingColumn.attribute_key ? newFilter : f
94
- );
93
+ updatedFilters = filters?.map((f) =>
94
+ f?.filter_attribute === matchingColumn?.attribute_key ? newFilter : f
95
+ ) as FilterStateProps[];
95
96
  } else {
96
- updatedFilters = [...filters, newFilter];
97
+ updatedFilters = [...filters, newFilter] as FilterStateProps[];
97
98
  }
98
99
 
99
100
  updatedRadio = [value];
@@ -28,7 +28,7 @@ const FormDatePicker = ({
28
28
  <LocalizationProvider dateAdapter={AdapterDateFns}>
29
29
  <Box display="flex" gap={1}>
30
30
  <Controller
31
- name={`${filter?.name}.value`}
31
+ name={`${filter?.filter_attribute_name}.value`}
32
32
  control={control}
33
33
  defaultValue={
34
34
  isRange
@@ -27,9 +27,9 @@ const FormDropdown = ({
27
27
  }: FormDropdownProps) => {
28
28
  return (
29
29
  <Controller
30
- name={`${filter?.name}.operator`}
30
+ name={`${filter?.filter_attribute_name}.operator`}
31
31
  control={control}
32
- defaultValue={filter.filter_operator || dropdownList?.[0]?.value || ""}
32
+ defaultValue={filter?.filter_operator || dropdownList?.[0]?.value || ""}
33
33
  render={({ field }) => (
34
34
  <FormControl sx={sx} size="small">
35
35
  <Select
@@ -57,26 +57,27 @@ const FormDropdown = ({
57
57
  field.onChange(e);
58
58
 
59
59
  if (
60
- (filter.data_type === "date" || filter.data_type === "year") &&
60
+ (filter?.filter_attribute_data_type === "date" ||
61
+ filter?.filter_attribute_data_type === "year") &&
61
62
  newOperator !== oldOperator
62
63
  ) {
63
64
  if (newOperator === "today") {
64
65
  setValue(
65
- `${filter.name}.value`,
66
+ `${filter?.filter_attribute_name}.value`,
66
67
  moment().format("YYYY-MM-DD"),
67
68
  {
68
69
  shouldDirty: true,
69
70
  }
70
71
  );
71
72
  } else if (newOperator === "between") {
72
- setValue(`${filter.name}.value`, ["", ""], {
73
+ setValue(`${filter?.filter_attribute_name}.value`, ["", ""], {
73
74
  shouldDirty: true,
74
75
  });
75
76
  } else if (
76
77
  oldOperator === "between" ||
77
78
  oldOperator === "today"
78
79
  ) {
79
- setValue(`${filter.name}.value`, "", {
80
+ setValue(`${filter?.filter_attribute_name}.value`, "", {
80
81
  shouldDirty: true,
81
82
  });
82
83
  }
@@ -73,11 +73,13 @@ const FilterCriteria = ({
73
73
 
74
74
  const newSelectedFilter = {
75
75
  ...newFilter,
76
- id: attribute.id,
77
- name: attribute.name,
78
- data_type: attribute.element_type,
76
+ id: attribute?.id,
77
+ filter_attribute_name: attribute?.name,
78
+ filter_attribute_data_type: attribute?.element_type,
79
+ datasource_list: attribute?.datasource_list,
79
80
  dropdown_list: matchingDropdownList,
80
81
  filter_entity_name: selectedFilterEntity?.label,
82
+ attribute_key: attribute?.attribute_key,
81
83
  };
82
84
 
83
85
  setFilters((prev) => [...prev, newSelectedFilter]);
@@ -27,7 +27,7 @@ const FormMultiSelect = ({
27
27
 
28
28
  return (
29
29
  <Controller
30
- name={`${filter?.name}.value`}
30
+ name={`${filter?.filter_attribute_name}.value`}
31
31
  control={control}
32
32
  defaultValue={
33
33
  Array.isArray(filter.filter_value)
@@ -26,7 +26,7 @@ const FormSelect = ({
26
26
 
27
27
  return (
28
28
  <Controller
29
- name={`${filter?.name}.value`}
29
+ name={`${filter?.filter_attribute_name}.value`}
30
30
  control={control}
31
31
  defaultValue={filter.filter_value || ""}
32
32
  render={({ field }) => (
@@ -18,7 +18,7 @@ const FormTextfield = ({
18
18
  }: FormTextfieldProps) => {
19
19
  return (
20
20
  <Controller
21
- name={`${filter?.name}.value`}
21
+ name={`${filter?.filter_attribute_name}.value`}
22
22
  control={control}
23
23
  defaultValue={filter.filter_value || ""}
24
24
  render={({ field }) => (
@@ -33,7 +33,7 @@ const FormTextfield = ({
33
33
  padding: "12px 20px",
34
34
  },
35
35
  }}
36
- type={filter.data_type || "text"}
36
+ type={filter?.filter_attribute_data_type || "text"}
37
37
  placeholder={"Enter value"}
38
38
  disabled={isLoading}
39
39
  onChange={(e) => {
@@ -81,11 +81,11 @@ const FilterForm = ({
81
81
 
82
82
  const defaultValues = useMemo(() => {
83
83
  const filterValues = filters?.reduce((acc, curr) => {
84
- if (curr.name) {
85
- acc[curr.name] = {
86
- value: curr.filter_value ?? "",
84
+ if (curr?.filter_attribute_name) {
85
+ acc[curr?.filter_attribute_name] = {
86
+ value: curr?.filter_value ?? "",
87
87
  operator:
88
- curr.filter_operator ?? curr.dropdown_list?.[0]?.value ?? "",
88
+ curr?.filter_operator ?? curr?.dropdown_list?.[0]?.value ?? "",
89
89
  };
90
90
  }
91
91
  return acc;
@@ -131,8 +131,11 @@ const FilterForm = ({
131
131
 
132
132
  const updateFiltersFromForm = useCallback(() => {
133
133
  const updatedFilters = filters?.map((filter) => {
134
- if (filter.name && typeof formValues[filter.name] === "object") {
135
- const filterValue = formValues[filter.name] as {
134
+ if (
135
+ filter?.filter_attribute_name &&
136
+ typeof formValues[filter?.filter_attribute_name] === "object"
137
+ ) {
138
+ const filterValue = formValues[filter?.filter_attribute_name] as {
136
139
  value: string | string[];
137
140
  operator: string;
138
141
  };
@@ -154,8 +157,8 @@ const FilterForm = ({
154
157
  return () => {
155
158
  reset();
156
159
  filters?.forEach((filter) => {
157
- if (filter.name) {
158
- unregister(filter.name);
160
+ if (filter?.filter_attribute_name) {
161
+ unregister(filter?.filter_attribute_name);
159
162
  }
160
163
  });
161
164
  };
@@ -179,9 +182,9 @@ const FilterForm = ({
179
182
 
180
183
  // unregister all fields belonging to this entity type
181
184
  filters?.forEach((f) => {
182
- if (f.filter_entity_name === entityType && f.name) {
183
- unregister(`${f.name}.value`);
184
- unregister(`${f.name}.operator`);
185
+ if (f?.filter_entity_name === entityType && f?.filter_attribute_name) {
186
+ unregister(`${f?.filter_attribute_name}.value`);
187
+ unregister(`${f?.filter_attribute_name}.operator`);
185
188
  }
186
189
  });
187
190
 
@@ -319,7 +322,7 @@ const FilterForm = ({
319
322
  {filters
320
323
  .filter(
321
324
  (filter) =>
322
- filter.name
325
+ filter?.filter_attribute_name
323
326
  ?.toLowerCase()
324
327
  .includes(searchTerm.toLowerCase()) ||
325
328
  filter.filter_value
@@ -339,7 +342,7 @@ const FilterForm = ({
339
342
  <Typography
340
343
  sx={filterFormStyles.formListItemHeaderName}
341
344
  >
342
- {filter.name}
345
+ {filter?.filter_attribute_name}
343
346
  </Typography>
344
347
  <FormDropdown
345
348
  filter={filter}
@@ -352,8 +355,12 @@ const FilterForm = ({
352
355
  <IconButton
353
356
  sx={{ marginLeft: "auto" }}
354
357
  onClick={() => {
355
- unregister(`${filter.name}.value`);
356
- unregister(`${filter.name}.operator`);
358
+ unregister(
359
+ `${filter?.filter_attribute_name}.value`
360
+ );
361
+ unregister(
362
+ `${filter?.filter_attribute_name}.operator`
363
+ );
357
364
 
358
365
  // ✅ Toggle dummy field to force form dirty
359
366
  const dummy = watch("dummyChange");
@@ -374,48 +381,51 @@ const FilterForm = ({
374
381
  </Box>
375
382
 
376
383
  <Box>
377
- {filter.data_type === "text" ||
378
- filter.data_type === "number" ? (
384
+ {filter?.filter_attribute_data_type === "text" ||
385
+ filter?.filter_attribute_data_type === "number" ? (
379
386
  <FormTextfield
380
387
  filter={filter}
381
388
  control={control}
382
389
  onValueChange={updateFiltersFromForm}
383
390
  />
384
- ) : filter.data_type === "year" ? (
391
+ ) : filter?.filter_attribute_data_type === "year" ? (
385
392
  <FormDatePicker
386
393
  filter={filter}
387
394
  control={control}
388
395
  views={["year"]}
389
396
  onValueChange={updateFiltersFromForm}
390
397
  />
391
- ) : filter.data_type === "date" ? (
398
+ ) : filter?.filter_attribute_data_type === "date" ? (
392
399
  <FormDatePicker
393
400
  filter={filter}
394
401
  control={control}
395
402
  onValueChange={updateFiltersFromForm}
396
403
  />
397
- ) : filter.data_type === "select" ? (
404
+ ) : filter?.filter_attribute_data_type ===
405
+ "select" ? (
398
406
  <FormMultiSelect
399
407
  filter={filter}
400
408
  control={control}
401
409
  dropdownData={dropdownData}
402
410
  onValueChange={updateFiltersFromForm}
403
411
  />
404
- ) : filter.data_type === "multiselect" ? (
412
+ ) : filter?.filter_attribute_data_type ===
413
+ "multiselect" ? (
405
414
  <FormMultiSelect
406
415
  filter={filter}
407
416
  control={control}
408
417
  dropdownData={dropdownData}
409
418
  onValueChange={updateFiltersFromForm}
410
419
  />
411
- ) : filter.data_type === "radio" ? (
420
+ ) : filter?.filter_attribute_data_type === "radio" ? (
412
421
  <FormMultiSelect
413
422
  filter={filter}
414
423
  control={control}
415
424
  dropdownData={dropdownData}
416
425
  onValueChange={updateFiltersFromForm}
417
426
  />
418
- ) : filter.data_type === "checkbox" ? (
427
+ ) : filter?.filter_attribute_data_type ===
428
+ "checkbox" ? (
419
429
  <FormMultiSelect
420
430
  filter={filter}
421
431
  control={control}
@@ -47,6 +47,7 @@ export function TableFilter({
47
47
 
48
48
  const defaultOptions: FilterComponentOptions = {
49
49
  showMainHeader: true,
50
+ mainHeaderTitle: "Filter",
50
51
  showTabs: true,
51
52
  tabOptions: {
52
53
  mainFilter: {
@@ -65,6 +66,7 @@ export function TableFilter({
65
66
  );
66
67
 
67
68
  const showMainHeader = finalComponentOptions?.showMainHeader;
69
+ const mainHeaderTitle = finalComponentOptions?.mainHeaderTitle;
68
70
  const showTabs = finalComponentOptions?.showTabs;
69
71
  const showMainFilter = showTabs && finalComponentOptions?.showMainFilter;
70
72
  const showSavedFilter = showTabs && finalComponentOptions?.showSavedFilter;
@@ -157,7 +159,7 @@ export function TableFilter({
157
159
  {showMainHeader && (
158
160
  <Box sx={filterStyles.filterMainHeader}>
159
161
  <Typography variant="h6" fontWeight="bold" fontSize="18px">
160
- Filter
162
+ {mainHeaderTitle}
161
163
  </Typography>
162
164
  <IconButton
163
165
  onClick={(e) => {
@@ -211,12 +211,9 @@ export const useUpdateFilterAPI = () => {
211
211
  return { updateMutation };
212
212
  };
213
213
 
214
- export const useCommonDropdownAPI = (
215
- metaData?: FilterColumnsDataProps,
216
- value?: string
217
- ) => {
214
+ export const useCommonDropdownAPI = (column_list?: any, value?: string) => {
218
215
  // Step 1: Extract all keys and query types
219
- const dropdownConfigs = (metaData?.column_list || [])
216
+ const dropdownConfigs = (column_list || [])
220
217
  .filter((col) => col?.datasource_list)
221
218
  .map((col) => ({
222
219
  key: col.attribute_key,
@@ -163,7 +163,9 @@ export const viewSettingsDropDown = async ({
163
163
  };
164
164
 
165
165
  export const getFilterEntityList = async (entity_type: string) => {
166
- const response = await api.get(`/entity-relation/${entity_type}`);
166
+ const response = await api.get(
167
+ `/entity-relation/${entity_type}?include=true`
168
+ );
167
169
 
168
170
  return response.data;
169
171
  };
@@ -70,6 +70,7 @@ export interface FilterComponentOptionsMainFilterOptions {
70
70
  export type FilterComponentOptions =
71
71
  | {
72
72
  showMainHeader?: boolean;
73
+ mainHeaderTitle?: string;
73
74
  showTabs?: true; // when true → additional fields allowed
74
75
  showMainFilter?: boolean;
75
76
  showSavedFilter?: boolean;
@@ -80,6 +81,7 @@ export type FilterComponentOptions =
80
81
  }
81
82
  | {
82
83
  showMainHeader?: boolean;
84
+ mainHeaderTitle?: string;
83
85
  showTabs?: false; // explicitly false or omitted
84
86
  tabOptions?: {
85
87
  mainFilter?: FilterComponentOptionsMainFilterOptions;
@@ -133,8 +135,8 @@ export interface FilterStateProps {
133
135
  filter_operator: string;
134
136
  filter_value: string | string[];
135
137
  id: string | number;
136
- name: string | undefined;
137
- data_type: FilterInputDataTypes | undefined;
138
+ filter_attribute_name: string | undefined;
139
+ filter_attribute_data_type: FilterInputDataTypes | undefined;
138
140
  attribute_key?: string;
139
141
  dropdown_list?: {
140
142
  label?: string;
@@ -148,12 +150,6 @@ export interface FilterStateProps {
148
150
  filter_entity_name?: string;
149
151
  }
150
152
 
151
- interface FilterDetail {
152
- filter_attribute: string;
153
- filter_operator: string;
154
- filter_value: string | string[];
155
- }
156
-
157
153
  export interface createSavedFilterPayload {
158
154
  name: string;
159
155
  organization_id?: number;
@@ -163,7 +159,7 @@ export interface createSavedFilterPayload {
163
159
  mapped_entity_type: string;
164
160
  status?: string;
165
161
  entity_type: string;
166
- filterDetails: FilterDetail[];
162
+ filterDetails: FilterStateProps[];
167
163
  }
168
164
 
169
165
  export interface deleteSavedFilterPayload {
@@ -182,13 +178,7 @@ export interface updateSavedFilterPayload {
182
178
  status?: string;
183
179
  entity_type: string;
184
180
  mapped_entity_type: string;
185
- filterDetails: FilterDetail[];
186
- }
187
-
188
- interface FilterDetail {
189
- filter_attribute: string;
190
- filter_operator: string;
191
- filter_value: string | string[];
181
+ filterDetails: FilterStateProps[];
192
182
  }
193
183
 
194
184
  export interface FilterFormComponentProps {
@@ -257,6 +247,7 @@ export interface FilterDataMainFilterEntityWiseCriteriaProps {
257
247
  name: string;
258
248
  attribute_key: string;
259
249
  element_type: FilterInputDataTypes;
250
+ datasource_list: any;
260
251
  }
261
252
 
262
253
  export interface FilterDataProps {
@@ -4,7 +4,7 @@ import { useGetNavigationLayoutAPI } from "../listing/libs/hooks/useGetNavigatio
4
4
  import { ENTITY_TYPE } from "../listing/libs/utils/common";
5
5
  import {
6
6
  useDeleteFilterAPI,
7
- useGetFilterEntityList,
7
+ useGetFilterEntityListAndCriteria,
8
8
  useSavedFilterAPI,
9
9
  useUpdateFilterAPI,
10
10
  } from "../listing/libs/hooks/useEntityTableAPI";
@@ -12,18 +12,19 @@ import {
12
12
  FilterColumnsDataProps,
13
13
  FilterComponentOptions,
14
14
  FilterDropdownDataProps,
15
- FilterDataProps,
16
15
  FilterMasterStateProps,
17
16
  } from "../listing/types/filter";
18
17
  import { onFilterChangeFunctionProps } from "../listing/types/common";
19
18
 
20
19
  const CraftTableFilterWrapper = ({
20
+ onClose,
21
21
  tableStates,
22
22
  dropdownData,
23
23
  onChangeFunction,
24
24
  columnsData,
25
25
  filterComponentOptions,
26
26
  }: {
27
+ onClose?: () => void;
27
28
  tableStates: CraftTableOptionsProps;
28
29
  columnsData: FilterColumnsDataProps;
29
30
  dropdownData: FilterDropdownDataProps;
@@ -41,34 +42,51 @@ const CraftTableFilterWrapper = ({
41
42
  setFilterMaster,
42
43
  filterToDelete,
43
44
  setFilterData,
45
+ selectedFilterEntity,
44
46
  } = tableStates;
45
47
 
46
48
  const { savedMutation } = useSavedFilterAPI(); //API CALL FOR SAVED FILTER
47
49
  const { updateMutation } = useUpdateFilterAPI(); //API FOR UPDATE FILTER
48
50
  const { deleteMutation } = useDeleteFilterAPI(tableStates); //API FOR DELETING FILTER
49
- const filterEntityList: any = useGetFilterEntityList({
50
- entity_type: ENTITY_TYPE,
51
- });
51
+ const { filterEntityList, filterEntityWiseCriteria } =
52
+ useGetFilterEntityListAndCriteria({
53
+ entity_type: ENTITY_TYPE,
54
+ selectedFilterEntity,
55
+ });
52
56
 
53
57
  useEffect(() => {
54
- if (filterEntityList?.data) {
55
- setFilterData((prev: FilterDataProps | null) => ({
56
- ...prev,
57
- mainFilter: {
58
- ...prev?.mainFilter,
59
- entityList: filterEntityList?.data,
58
+ const data: any = filterEntityList?.data;
59
+
60
+ setFilterData((prev: any) => ({
61
+ ...prev,
62
+ mainFilter: {
63
+ ...prev?.mainFilter,
64
+ entityList: {
65
+ data: data ?? [],
66
+ isPending: filterEntityList?.isPending ?? false,
60
67
  },
61
- }));
62
- }
68
+ },
69
+ }));
63
70
  }, [filterEntityList?.data, filterEntityList?.isPending]);
64
71
 
72
+ useEffect(() => {
73
+ const data = filterEntityWiseCriteria?.data?.data?.attribute_list;
74
+
75
+ setFilterData((prev: any) => ({
76
+ ...prev,
77
+ mainFilter: {
78
+ ...prev?.mainFilter,
79
+ entityWiseCriteria: {
80
+ data: data ?? [],
81
+ isPending: filterEntityWiseCriteria?.isPending ?? false,
82
+ },
83
+ },
84
+ }));
85
+ }, [filterEntityWiseCriteria?.data, filterEntityWiseCriteria?.isPending]);
86
+
65
87
  // API to handle saving a filter
66
88
  const handleSaveFilter = (name: string) => {
67
- const quickFilter = filters.map((f: any) => ({
68
- filter_attribute: f.filter_attribute,
69
- filter_operator: f.filter_operator,
70
- filter_value: f.filter_value,
71
- }));
89
+ const quickFilter = filters.map((f: any) => ({ ...f }));
72
90
 
73
91
  const payload = {
74
92
  name,
@@ -154,7 +172,10 @@ const CraftTableFilterWrapper = ({
154
172
  return (
155
173
  <CraftTableFilter
156
174
  tableStates={tableStates}
157
- onClose={() => tableStates.setShowTableFilter(false)}
175
+ onClose={() => {
176
+ tableStates.setShowTableFilter(false);
177
+ onClose && onClose();
178
+ }}
158
179
  columnsData={columnsData}
159
180
  dropdownData={dropdownData || []}
160
181
  onUpdateFilter={handleUpdateFilter}
@@ -58,7 +58,12 @@ function ListingView() {
58
58
  const { deleteMutation } = useDeleteFilterAPI(tableStates); //API FOR DELETING FILTER
59
59
  const { updateMutation } = useUpdateFilterAPI(); //API FOR UPDATE FILTER
60
60
  const { saveSettingsDataMutation } = useSaveSettingsDataAPI(ENTITY_TYPE);
61
- const { dropdownData } = useCommonDropdownAPI(metaQuery.data);
61
+ const memoizedFilters = useMemo(() => filters, [filters]);
62
+
63
+ // const { dropdownData } = useCommonDropdownAPI(
64
+ // dropdownColumnList || metaQuery.data.column_list
65
+ // );
66
+ const { dropdownData } = useCommonDropdownAPI(memoizedFilters);
62
67
  const { settingsTabDropdownData, settingsTabDropdownPending } =
63
68
  useSettingsDropDownAPI({
64
69
  entity_type: ENTITY_TYPE,