@wavemaker/react-runtime 11.14.2-rc.6311 → 12.0.0-next.28533

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.
Files changed (244) hide show
  1. package/actions/base-action.js +5 -7
  2. package/actions/login-action.js +7 -8
  3. package/actions/logout-action.js +5 -7
  4. package/actions/navigation-action.js +32 -10
  5. package/actions/notification-action.js +22 -8
  6. package/actions/timer-action.js +13 -15
  7. package/actions/toast.js +4 -2
  8. package/actions/toast.service.js +1 -2
  9. package/components/advanced/carousel/index.js +1 -1
  10. package/components/advanced/carousel/template.js +1 -1
  11. package/components/basic/anchor/index.js +26 -9
  12. package/components/basic/html/index.js +115 -24
  13. package/components/basic/icon/index.js +2 -1
  14. package/components/basic/iframe/index.js +2 -1
  15. package/components/basic/label/index.js +12 -9
  16. package/components/basic/message/index.js +12 -3
  17. package/components/basic/picture/index.js +11 -4
  18. package/components/basic/progress-bar/index.js +1 -1
  19. package/components/basic/progress-circle/index.js +34 -28
  20. package/components/basic/progress-circle/props.js +10 -2
  21. package/components/basic/richtexteditor/index.js +95 -94
  22. package/components/basic/search/index.js +401 -156
  23. package/components/basic/search/providers.js +126 -61
  24. package/components/basic/spinner/index.js +2 -1
  25. package/components/basic/tree/index.js +34 -34
  26. package/components/basic/tree/utils.js +10 -4
  27. package/components/chart/components/barColumnChart/index.js +36 -33
  28. package/components/chart/components/bubbleChart/index.js +35 -25
  29. package/components/chart/components/chartLegend/utils.js +2 -1
  30. package/components/chart/components/cumulativeLineChart/index.js +30 -26
  31. package/components/chart/components/lineAreaChart/index.js +50 -32
  32. package/components/chart/components/pieDonutChart/index.js +13 -4
  33. package/components/chart/hooks/useXAxisConfig.js +15 -8
  34. package/components/chart/index.js +223 -53
  35. package/components/chart/utils.js +12 -1
  36. package/components/constants.js +5 -2
  37. package/components/container/accordion/accordion-pane/index.js +17 -12
  38. package/components/container/accordion/index.js +9 -4
  39. package/components/container/alignment-utils.js +56 -1
  40. package/components/container/index.js +49 -20
  41. package/components/container/panel/components/panel-header/index.js +3 -4
  42. package/components/container/panel/index.js +15 -10
  43. package/components/container/tabs/index.js +92 -14
  44. package/components/container/tabs/tab-pane/index.js +15 -8
  45. package/components/container/tabs/utils.js +51 -0
  46. package/components/container/wizard/components/StepComponents.js +2 -1
  47. package/components/container/wizard/components/WizardStep.js +2 -1
  48. package/components/container/wizard/index.js +64 -35
  49. package/components/container/wizard/utils.js +46 -1
  50. package/components/container/wizard/wizard-step/index.js +11 -1
  51. package/components/data/card/card-content/index.js +1 -1
  52. package/components/data/form/base-form/index.js +991 -180
  53. package/components/data/form/base-form/props.js +3 -1
  54. package/components/data/form/base-form/utils.js +159 -1
  55. package/components/data/form/dynamic-fields/constant.js +53 -0
  56. package/components/data/form/dynamic-fields/index.js +10 -45
  57. package/components/data/form/dynamic-fields/utils.js +37 -2
  58. package/components/data/form/form-action/index.js +5 -4
  59. package/components/data/form/form-context.js +5 -1
  60. package/components/data/form/form-controller/utils.js +84 -0
  61. package/components/data/form/form-controller/validation-contrustor.js +402 -189
  62. package/components/data/form/form-controller/withFormController.js +191 -52
  63. package/components/data/form/form-field/base-field.js +54 -33
  64. package/components/data/form/form-field/index.js +28 -5
  65. package/components/data/form/form-header/index.js +3 -4
  66. package/components/data/form/index.js +20 -1
  67. package/components/data/list/components/ListDND.js +2 -1
  68. package/components/data/list/components/ListItem.js +6 -2
  69. package/components/data/list/components/ListItemWithTemplate.js +46 -2
  70. package/components/data/list/components/ListItems.js +17 -26
  71. package/components/data/list/components/ListPagination.js +3 -3
  72. package/components/data/list/components/StandardListItems.js +3 -4
  73. package/components/data/list/hooks/useListEffects.js +55 -14
  74. package/components/data/list/hooks/useListEventHandlers.js +3 -1
  75. package/components/data/list/hooks/useListState.js +3 -1
  76. package/components/data/list/hooks/usePaginatedGroupedData.js +18 -5
  77. package/components/data/list/index.js +74 -55
  78. package/components/data/list/utils/list-helpers.js +73 -35
  79. package/components/data/list/utils/list-widget-methods.js +138 -95
  80. package/components/data/live-filter/index.js +26 -15
  81. package/components/data/live-form/index.js +23 -7
  82. package/components/data/live-form/props.js +1 -1
  83. package/components/data/pagination/components/BasicPagination.js +71 -16
  84. package/components/data/pagination/components/PageSizeSelector.js +8 -3
  85. package/components/data/pagination/components/TotalRecords.js +1 -5
  86. package/components/data/pagination/hooks/usePagination.js +349 -66
  87. package/components/data/pagination/index.js +137 -19
  88. package/components/data/table/components/AddNewRow.js +5 -1
  89. package/components/data/table/components/EditableCell.js +2 -2
  90. package/components/data/table/components/RowCells.js +64 -0
  91. package/components/data/table/components/RowExpansionButton.js +2 -2
  92. package/components/data/table/components/SummaryCell.js +111 -0
  93. package/components/data/table/components/SummaryRow.js +54 -0
  94. package/components/data/table/components/SummaryRowFooter.js +46 -0
  95. package/components/data/table/components/TableBody.js +61 -59
  96. package/components/data/table/components/TableDataRow.js +109 -0
  97. package/components/data/table/components/TableFilters.js +225 -121
  98. package/components/data/table/components/TableHeader.js +291 -23
  99. package/components/data/table/components/TablePanelHeading.js +139 -8
  100. package/components/data/table/components/index.js +22 -1
  101. package/components/data/table/hooks/use-edited-rows.js +141 -0
  102. package/components/data/table/hooks/useCellState.js +5 -12
  103. package/components/data/table/hooks/useFormWidget.js +58 -51
  104. package/components/data/table/hooks/usePaginationState.js +45 -24
  105. package/components/data/table/hooks/usePanelStructure.js +4 -4
  106. package/components/data/table/hooks/useRowHandlers.js +39 -5
  107. package/components/data/table/hooks/useRowSelection.js +244 -50
  108. package/components/data/table/hooks/useServerSideSorting.js +81 -37
  109. package/components/data/table/hooks/useTableColumns.js +211 -118
  110. package/components/data/table/hooks/useTableData.js +54 -9
  111. package/components/data/table/hooks/useTableEdit.js +272 -97
  112. package/components/data/table/hooks/useTableEffects.js +31 -13
  113. package/components/data/table/hooks/useTableFilter.js +1 -1
  114. package/components/data/table/hooks/useTableInitialization.js +23 -22
  115. package/components/data/table/hooks/useTableState.js +11 -5
  116. package/components/data/table/hooks/useTableStateManager.js +140 -65
  117. package/components/data/table/index.js +637 -274
  118. package/components/data/table/live-table/index.js +54 -22
  119. package/components/data/table/table-action/index.js +1 -1
  120. package/components/data/table/table-group/index.js +26 -0
  121. package/components/data/table/table-row-action/index.js +32 -18
  122. package/components/data/table/utils/buildSelectionColumns.js +12 -21
  123. package/components/data/table/utils/columnBuilder.js +29 -14
  124. package/components/data/table/utils/columnProxy.js +68 -1
  125. package/components/data/table/utils/constants.js +6 -2
  126. package/components/data/table/utils/crud-handlers.js +68 -63
  127. package/components/data/table/utils/groupHeaderUtils.js +102 -0
  128. package/components/data/table/utils/index.js +210 -21
  129. package/components/data/table/utils/renderDisplayCell.js +6 -6
  130. package/components/data/table/utils/selectionUtils.js +25 -26
  131. package/components/data/table/utils/validation.js +1 -0
  132. package/components/data/utils/filter-field-util.js +3 -3
  133. package/components/dialogs/alert-dialog/index.js +1 -1
  134. package/components/dialogs/confirm-dialog/index.js +1 -1
  135. package/components/dialogs/dialog/index.js +4 -1
  136. package/components/dialogs/dialog-content/index.js +3 -1
  137. package/components/dialogs/dialog-header/index.js +2 -2
  138. package/components/dialogs/iframe-dialog/index.js +11 -5
  139. package/components/dialogs/index.js +1 -1
  140. package/components/dialogs/login-dialog/index.js +1 -1
  141. package/components/dialogs/page-dialog/index.js +1 -1
  142. package/components/form/button/index.js +33 -7
  143. package/components/input/calendar/index.js +18 -6
  144. package/components/input/chips/index.js +99 -28
  145. package/components/input/chips/utils.js +34 -4
  146. package/components/input/color-picker/index.js +74 -25
  147. package/components/input/composite/index.js +3 -3
  148. package/components/input/currency/index.js +35 -49
  149. package/components/input/default/checkbox/index.js +23 -28
  150. package/components/input/default/checkboxset/index.js +38 -18
  151. package/components/input/default/checkboxset/utils.js +30 -0
  152. package/components/input/default/radioset/index.js +36 -39
  153. package/components/input/default/switch/index.js +30 -13
  154. package/components/input/epoch/date/index.js +130 -69
  155. package/components/input/epoch/date/utils.js +94 -1
  156. package/components/input/epoch/datetime/index.js +72 -22
  157. package/components/input/epoch/datetime/utils.js +49 -10
  158. package/components/input/epoch/time/index.js +68 -19
  159. package/components/input/epoch/time/utils.js +62 -14
  160. package/components/input/fileupload/Utils.js +12 -7
  161. package/components/input/fileupload/components/MultiUpload.js +2 -6
  162. package/components/input/fileupload/components/SingleUpload.js +3 -7
  163. package/components/input/fileupload/index.js +6 -10
  164. package/components/input/fileupload/useFileUpload.js +16 -5
  165. package/components/input/number/index.js +158 -43
  166. package/components/input/rating/index.js +90 -7
  167. package/components/input/select/index.js +147 -70
  168. package/components/input/slider/index.js +84 -26
  169. package/components/input/text/index.js +38 -18
  170. package/components/input/text/util.js +283 -130
  171. package/components/input/textarea/index.js +13 -10
  172. package/components/input/upload/index.js +124 -0
  173. package/components/input/upload/props.js +5 -0
  174. package/components/input/util/index.js +11 -0
  175. package/components/navbar/index.js +51 -3
  176. package/components/navbar/nav/index.js +46 -16
  177. package/components/navbar/nav-item/index.js +11 -5
  178. package/components/navigation/menu/components/ListItems.js +3 -0
  179. package/components/navigation/menu/constants.js +2 -1
  180. package/components/navigation/menu/hooks/useHoverState.hook.js +48 -0
  181. package/components/navigation/menu/hooks/useKeyboardMovements.hook.js +37 -0
  182. package/components/navigation/menu/hooks/useTransformedDataset.hook.js +15 -0
  183. package/components/navigation/menu/index.js +326 -188
  184. package/components/navigation/menu/utils/action-task.js +14 -0
  185. package/components/navigation/menu/utils/role-filter.js +76 -0
  186. package/components/navigation/popover/index.js +99 -26
  187. package/components/page/partial-container/index.js +34 -5
  188. package/components/prefab/index.js +2 -4
  189. package/context/PrefabContext.js +10 -6
  190. package/context/WidgetProvider.js +30 -31
  191. package/core/app.service.js +1 -1
  192. package/core/constants/events.js +57 -1
  193. package/core/dialog.service.js +1 -2
  194. package/core/event-notifier.js +1 -2
  195. package/core/formatter/array-formatters.js +33 -0
  196. package/core/formatter/date-formatters.js +2 -4
  197. package/core/formatter/index.js +2 -1
  198. package/core/formatter/number-formatters.js +5 -10
  199. package/core/formatter/security-formatters.js +2 -4
  200. package/core/formatter/string-formatters.js +3 -6
  201. package/core/proxy-service.js +84 -13
  202. package/core/script-registry.js +108 -48
  203. package/core/util/common.js +4 -4
  204. package/core/util/compare.js +30 -0
  205. package/core/util/dom.js +8 -8
  206. package/core/util/index.js +16 -6
  207. package/core/util/safe-is-equal.js +156 -0
  208. package/core/util/security.js +1 -2
  209. package/core/util/utils.js +16 -7
  210. package/higherOrder/BaseApp.js +108 -65
  211. package/higherOrder/BaseDateTime.js +31 -13
  212. package/higherOrder/BasePage.js +268 -144
  213. package/higherOrder/BasePartial.js +1 -1
  214. package/higherOrder/BasePrefab.js +33 -15
  215. package/higherOrder/DataNav.js +99 -16
  216. package/higherOrder/helper.js +5 -0
  217. package/higherOrder/withBaseWrapper.js +41 -28
  218. package/hooks/useAuth.js +11 -5
  219. package/hooks/useHttp.js +280 -94
  220. package/mui-config/theme-provider.js +1 -1
  221. package/mui-config/theme.js +1 -1
  222. package/package-lock.json +824 -724
  223. package/package.json +8 -8
  224. package/store/bindActions/i18nActions.js +18 -0
  225. package/store/index.js +3 -1
  226. package/store/slices/appConfigSlice.js +2 -2
  227. package/store/slices/authSlice.js +31 -28
  228. package/store/slices/i18nSlice.js +2 -2
  229. package/store/slices/navigationSlice.js +35 -0
  230. package/store/viewport.service.js +255 -0
  231. package/utils/attr.js +35 -0
  232. package/utils/dataset-util.js +1 -2
  233. package/utils/form-state.util.js +43 -12
  234. package/utils/form-utils.js +47 -2
  235. package/utils/format-util.js +28 -13
  236. package/utils/page-params-util.js +33 -1
  237. package/utils/state-persistance.js +72 -13
  238. package/utils/transformedDataset-utils.js +35 -24
  239. package/variables/base-variable.js +12 -14
  240. package/variables/crud-variable.js +225 -0
  241. package/variables/live-variable.js +56 -20
  242. package/variables/metadata.service.js +123 -0
  243. package/variables/model-variable.js +21 -15
  244. package/variables/service-variable.js +88 -83
@@ -8,9 +8,78 @@ exports.TableFilterRow = exports.GlobalSearchFilter = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
9
  var _material = require("@mui/material");
10
10
  var _lodashEs = require("lodash-es");
11
- var _utils = require("../../utils");
11
+ var _utils = require("@wavemaker/react-runtime/components/data/utils");
12
12
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t2 in e) "default" !== _t2 && {}.hasOwnProperty.call(e, _t2) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t2)) && (i.get || i.set) ? o(f, _t2, i) : f[_t2] = e[_t2]); return f; })(e, t); }
13
13
  var __jsx = _react["default"].createElement;
14
+ // Constants
15
+ var ACTION_COLUMN_IDS = ["actions", "row-operations", "multiSelect", "radioSelect", "row-index"];
16
+ var DEFAULT_MATCH_MODE = "anywhereignorecase";
17
+ var DATA_TYPES = {
18
+ NUMBER: "number",
19
+ DATE: "date",
20
+ STRING: "string"
21
+ };
22
+
23
+ // Menu popup styles for Bootstrap dropdown compatibility
24
+ var MENU_POPUP_STYLES = {
25
+ paper: {
26
+ style: {
27
+ zIndex: 1040,
28
+ background: "transparent",
29
+ boxShadow: "none",
30
+ overflow: "visible"
31
+ }
32
+ }
33
+ };
34
+ var MENU_LIST_STYLES = {
35
+ style: {
36
+ padding: 0
37
+ }
38
+ };
39
+
40
+ // Utility: Get data type from widget configuration
41
+ var getDataType = function getDataType(widgetType, editInputType) {
42
+ // Check edit input type first
43
+ if (editInputType === DATA_TYPES.NUMBER) return DATA_TYPES.NUMBER;
44
+ if ((0, _lodashEs.includes)(["date", "datetime-local", "time"], editInputType)) {
45
+ return DATA_TYPES.DATE;
46
+ }
47
+
48
+ // Check widget type
49
+ if ((0, _lodashEs.includes)(["number", "currency", "integer"], widgetType)) {
50
+ return DATA_TYPES.NUMBER;
51
+ }
52
+ if ((0, _lodashEs.includes)(["date", "datetime", "time", "timestamp"], widgetType)) {
53
+ return DATA_TYPES.DATE;
54
+ }
55
+ return DATA_TYPES.STRING;
56
+ };
57
+
58
+ // Utility: Get input group CSS class based on data type
59
+ var getInputGroupClass = function getInputGroupClass(dataType) {
60
+ switch (dataType) {
61
+ case DATA_TYPES.NUMBER:
62
+ return "input-group number input-group-sm";
63
+ case DATA_TYPES.DATE:
64
+ return "input-group date input-group-sm";
65
+ default:
66
+ return "input-group text input-group-sm";
67
+ }
68
+ };
69
+
70
+ // Utility: Check if column should be filtered
71
+ var isFilterableColumn = function isFilterableColumn(column) {
72
+ var columnId = (0, _lodashEs.defaultTo)(column.id, column.accessorKey);
73
+ var isActionColumn = (0, _lodashEs.includes)(ACTION_COLUMN_IDS, columnId) || column.isRowIndex;
74
+ return !isActionColumn && column.enableColumnFilter !== false && !(0, _lodashEs.isEmpty)(column.accessorKey);
75
+ };
76
+
77
+ // Utility: Shallow comparison helper for memo
78
+ var shallowEqual = function shallowEqual(prev, next, keys) {
79
+ return keys.every(function (key) {
80
+ return prev[key] === next[key];
81
+ });
82
+ };
14
83
  var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.memo)(function (_ref) {
15
84
  var value = _ref.value,
16
85
  onChange = _ref.onChange,
@@ -18,7 +87,11 @@ var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.me
18
87
  onColumnChange = _ref.onColumnChange,
19
88
  columns = _ref.columns,
20
89
  _ref$searchLabel = _ref.searchLabel,
21
- searchLabel = _ref$searchLabel === void 0 ? "Search" : _ref$searchLabel;
90
+ searchLabel = _ref$searchLabel === void 0 ? "Search" : _ref$searchLabel,
91
+ name = _ref.name,
92
+ _ref$filteronkeypress = _ref.filteronkeypress,
93
+ filteronkeypress = _ref$filteronkeypress === void 0 ? false : _ref$filteronkeypress,
94
+ listener = _ref.listener;
22
95
  // Local state for input value
23
96
  var _useState = (0, _react.useState)(value),
24
97
  inputValue = _useState[0],
@@ -37,27 +110,63 @@ var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.me
37
110
  (0, _react.useEffect)(function () {
38
111
  setLocalSelectedColumn(selectedColumn);
39
112
  }, [selectedColumn]);
113
+ var clearLocalSearchControls = (0, _react.useCallback)(function () {
114
+ setInputValue("");
115
+ setLocalSelectedColumn("");
116
+ }, []);
117
+ (0, _react.useEffect)(function () {
118
+ if (listener !== null && listener !== void 0 && listener.onChange && name) {
119
+ listener.onChange(name, {
120
+ clearFilter: clearLocalSearchControls
121
+ });
122
+ }
123
+ }, [clearLocalSearchControls, name]);
40
124
 
41
- // Filter out non-data columns for the dropdown using lodash
42
- var actionColumnIds = ["actions", "row-operations", "multiSelect", "radioSelect", "row-index"];
43
- var searchableColumns = (0, _lodashEs.filter)(columns || [], function (col) {
44
- return (col === null || col === void 0 ? void 0 : col.accessorKey) && !(0, _lodashEs.includes)(actionColumnIds, col === null || col === void 0 ? void 0 : col.id);
45
- });
46
- var handleSearch = function handleSearch() {
47
- // Always update the value when search is triggered
48
- onChange(inputValue);
125
+ // Filter searchable columns - memoize to prevent recalculation
126
+ var searchableColumns = (0, _react.useMemo)(function () {
127
+ return (0, _lodashEs.filter)((0, _lodashEs.defaultTo)(columns, []), function (col) {
128
+ return !(0, _lodashEs.isEmpty)(col === null || col === void 0 ? void 0 : col.accessorKey) && !(0, _lodashEs.includes)(ACTION_COLUMN_IDS, col === null || col === void 0 ? void 0 : col.id);
129
+ });
130
+ }, [columns]);
49
131
 
50
- // Update column selection if it changed
132
+ // Apply filter with current column selection
133
+ var applyFilter = (0, _react.useCallback)(function (value) {
134
+ onChange(value);
51
135
  if (localSelectedColumn !== selectedColumn) {
52
136
  onColumnChange(localSelectedColumn);
53
137
  }
54
- };
55
- var handleKeyDown = function handleKeyDown(e) {
138
+ }, [onChange, onColumnChange, localSelectedColumn, selectedColumn]);
139
+ var handleColumnChange = (0, _react.useCallback)(function (e) {
140
+ var newColumn = e.target.value;
141
+ setLocalSelectedColumn(newColumn);
142
+
143
+ // If filteronkeypress is true, apply filter immediately when column changes
144
+ if (filteronkeypress && inputValue) {
145
+ onColumnChange(newColumn);
146
+ onChange(inputValue);
147
+ }
148
+ }, [filteronkeypress, inputValue, onColumnChange, onChange]);
149
+ var handleSearch = (0, _react.useCallback)(function () {
150
+ applyFilter(inputValue);
151
+ }, [applyFilter, inputValue]);
152
+ var handleInputChange = (0, _react.useCallback)(function (e) {
153
+ var newValue = e.target.value;
154
+ setInputValue(newValue);
155
+
156
+ // If filteronkeypress is true, apply filter on every keystroke
157
+ if (filteronkeypress) {
158
+ applyFilter(newValue);
159
+ }
160
+ }, [filteronkeypress, applyFilter]);
161
+ var handleKeyDown = (0, _react.useCallback)(function (e) {
56
162
  if (e.key === "Enter") {
57
163
  e.preventDefault();
58
- handleSearch();
164
+ // Only trigger search manually if filteronkeypress is false
165
+ if (!filteronkeypress) {
166
+ handleSearch();
167
+ }
59
168
  }
60
- };
169
+ }, [filteronkeypress, handleSearch]);
61
170
  return __jsx(_material.Box, {
62
171
  component: "form",
63
172
  className: "form-search form-inline",
@@ -71,11 +180,16 @@ var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.me
71
180
  className: "form-control app-textbox",
72
181
  placeholder: searchLabel,
73
182
  value: inputValue,
74
- onChange: function onChange(e) {
75
- return setInputValue(e.target.value);
76
- },
183
+ onChange: handleInputChange,
77
184
  onKeyDown: handleKeyDown,
78
- size: "small"
185
+ size: "small",
186
+ sx: {
187
+ "& input::placeholder": {
188
+ color: "text.secondary",
189
+ opacity: 0.7,
190
+ fontWeight: "normal"
191
+ }
192
+ }
79
193
  })), __jsx(_material.Box, {
80
194
  className: "input-append input-group input-group-sm",
81
195
  component: "div"
@@ -85,15 +199,13 @@ var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.me
85
199
  "data-element": "dgFilterValue",
86
200
  className: "form-control app-select input-sm",
87
201
  value: localSelectedColumn,
88
- onChange: function onChange(e) {
89
- return setLocalSelectedColumn(e.target.value);
90
- }
202
+ onChange: handleColumnChange
91
203
  }, __jsx("option", {
92
204
  value: "",
93
205
  className: "placeholder"
94
206
  }, "Select Field"), (0, _lodashEs.map)(searchableColumns, function (column, index) {
95
207
  return __jsx("option", {
96
- key: column.id || column.accessorKey,
208
+ key: (0, _lodashEs.defaultTo)(column.id, column.accessorKey),
97
209
  value: column.accessorKey,
98
210
  "data-coldef-index": index
99
211
  }, column.header);
@@ -111,6 +223,8 @@ var GlobalSearchFilter = exports.GlobalSearchFilter = /*#__PURE__*/(0, _react.me
111
223
  component: "i",
112
224
  className: "wi wi-search"
113
225
  })))));
226
+ }, function (prevProps, nextProps) {
227
+ return shallowEqual(prevProps, nextProps, ["value", "selectedColumn", "columns", "searchLabel", "name", "filteronkeypress", "onChange", "onColumnChange"]);
114
228
  });
115
229
  GlobalSearchFilter.displayName = "GlobalSearchFilter";
116
230
  // Component to handle individual column filter with local state
@@ -130,110 +244,95 @@ var ColumnFilterCell = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
130
244
  var _useState4 = (0, _react.useState)(null),
131
245
  anchorEl = _useState4[0],
132
246
  setAnchorEl = _useState4[1];
133
- var _useState5 = (0, _react.useState)("anywhereignorecase"),
247
+ var _useState5 = (0, _react.useState)(DEFAULT_MATCH_MODE),
134
248
  selectedMatchMode = _useState5[0],
135
249
  setSelectedMatchMode = _useState5[1];
136
250
  var filterButtonRef = (0, _react.useRef)(null);
251
+
252
+ // Sync local value with prop changes
137
253
  (0, _react.useEffect)(function () {
138
254
  setLocalValue(value);
139
255
  }, [value]);
140
- var handleApplyFilter = function handleApplyFilter() {
141
- // Only trigger onChange if the value has actually changed
142
- if (localValue !== value) {
143
- onChange(columnId, localValue, selectedMatchMode);
256
+
257
+ // Memoize data type, match modes, and CSS classes
258
+ var dataType = (0, _react.useMemo)(function () {
259
+ return getDataType(widgetType, columnMeta.editinputtype);
260
+ }, [widgetType, columnMeta.editinputtype]);
261
+ var matchModes = (0, _react.useMemo)(function () {
262
+ var matchModeMap = (0, _utils.getMatchModeTypesMap)();
263
+ return (0, _lodashEs.get)(matchModeMap, dataType, (0, _lodashEs.get)(matchModeMap, "default", []));
264
+ }, [dataType]);
265
+ var matchModeMessages = (0, _react.useMemo)(function () {
266
+ return (0, _utils.getMatchModeMsgs)(listener === null || listener === void 0 ? void 0 : listener.appLocale);
267
+ }, [listener === null || listener === void 0 ? void 0 : listener.appLocale]);
268
+ var inputGroupClass = (0, _react.useMemo)(function () {
269
+ return getInputGroupClass(dataType);
270
+ }, [dataType]);
271
+
272
+ // Event handlers
273
+ var handleApplyFilter = (0, _react.useCallback)(function (e) {
274
+ var inputValue = (0, _lodashEs.defaultTo)(e.target.value, localValue);
275
+ if (inputValue !== value) {
276
+ onChange(columnId, inputValue, selectedMatchMode);
144
277
  }
145
- };
146
- var handleKeyDown = function handleKeyDown(e) {
278
+ }, [localValue, value, columnId, selectedMatchMode, onChange]);
279
+ var handleKeyDown = (0, _react.useCallback)(function (e) {
147
280
  if (e.key === "Enter") {
148
281
  e.preventDefault();
149
- handleApplyFilter();
282
+ handleApplyFilter(e);
150
283
  }
151
- e.stopPropagation(); // Prevent table keyboard shortcuts
152
- };
153
- var handleFilterIconClick = function handleFilterIconClick(e) {
284
+ e.stopPropagation();
285
+ }, [handleApplyFilter]);
286
+ var handleFilterIconClick = (0, _react.useCallback)(function (e) {
154
287
  e.stopPropagation();
155
288
  setAnchorEl(filterButtonRef.current);
156
- };
157
- var handleClosePopover = function handleClosePopover() {
289
+ }, []);
290
+ var handleClosePopover = (0, _react.useCallback)(function () {
158
291
  setAnchorEl(null);
159
- };
160
- var handleMatchModeSelect = function handleMatchModeSelect(matchMode) {
292
+ }, []);
293
+ var handleMatchModeSelect = (0, _react.useCallback)(function (matchMode) {
161
294
  setSelectedMatchMode(matchMode);
162
- if (onMatchModeChange) {
163
- onMatchModeChange(columnId, matchMode);
164
- }
165
- // Apply the filter with new match mode if there's a value
295
+ onMatchModeChange === null || onMatchModeChange === void 0 || onMatchModeChange(columnId, matchMode);
166
296
  if (localValue) {
167
297
  onChange(columnId, localValue, matchMode);
168
298
  }
169
299
  handleClosePopover();
170
- };
171
-
172
- // Get the data type from widget type
173
- var getDataTypeFromWidget = function getDataTypeFromWidget(widget) {
174
- var editType = columnMeta.editinputtype;
175
-
176
- // Check edit input type first
177
- if (editType === "number") return "number";
178
- if (editType === "date" || editType === "datetime-local" || editType === "time") return "date";
179
-
180
- // Check widget type
181
- switch (widget) {
182
- case "number":
183
- case "currency":
184
- case "integer":
185
- return "number";
186
- case "date":
187
- case "datetime":
188
- case "time":
189
- case "timestamp":
190
- return "date";
191
- case "text":
192
- case "textarea":
193
- case "string":
194
- default:
195
- return "string";
196
- }
197
- };
198
-
199
- // Get available match modes for the column type
200
- var getMatchModes = function getMatchModes() {
201
- var dataType = getDataTypeFromWidget(widgetType);
202
- var matchModeMap = (0, _utils.getMatchModeTypesMap)();
203
- return matchModeMap[dataType] || matchModeMap["default"] || [];
204
- };
205
- var matchModes = getMatchModes();
206
- var matchModeMessages = (0, _utils.getMatchModeMsgs)(listener === null || listener === void 0 ? void 0 : listener.appLocale);
207
-
208
- // Get CSS class based on widget type
209
- var getInputGroupClass = function getInputGroupClass() {
210
- var dataType = getDataTypeFromWidget(widgetType);
211
- switch (dataType) {
212
- case "number":
213
- return "input-group number input-group-sm";
214
- case "date":
215
- return "input-group date input-group-sm";
216
- default:
217
- return "input-group text input-group-sm";
218
- }
219
- };
220
- return __jsx(_material.Box, {
221
- component: "div",
300
+ }, [columnId, localValue, onChange, onMatchModeChange, handleClosePopover]);
301
+ var handleClearFilterIconClick = (0, _react.useCallback)(function () {
302
+ onChange(columnId, "", selectedMatchMode);
303
+ setLocalValue("");
304
+ }, [columnId, selectedMatchMode, onChange]);
305
+ var handleLocalValueChange = (0, _react.useCallback)(function (value) {
306
+ setLocalValue(value);
307
+ }, []);
308
+ return __jsx("div", {
222
309
  "data-col-identifier": columnAccessorKey,
223
- className: getInputGroupClass()
310
+ className: inputGroupClass
224
311
  }, __jsx(_material.Box, {
312
+ component: "div",
313
+ tabIndex: 0,
225
314
  onBlur: handleApplyFilter,
226
315
  onKeyDown: handleKeyDown,
227
316
  onClick: function onClick(e) {
228
317
  return e.stopPropagation();
229
318
  }
230
- }, renderFormWidget(columnId, widgetType, localValue, function (value) {
231
- return setLocalValue(value);
232
- }, {
319
+ }, renderFormWidget(columnId, widgetType, localValue, handleLocalValueChange, {
233
320
  placeholder: "",
234
321
  sessionKey: "filter_".concat(columnId),
235
322
  column: columnMeta
236
- })), __jsx(_material.Box, {
323
+ })), __jsx("span", {
324
+ className: "input-group-addon filter-clear-icon"
325
+ }, __jsx(_material.Box, {
326
+ hidden: (0, _lodashEs.isEmpty)(localValue),
327
+ component: "button",
328
+ type: "button",
329
+ className: "btn-transparent btn app-button",
330
+ "aria-haspopup": "true",
331
+ "aria-expanded": Boolean(anchorEl),
332
+ onClick: handleClearFilterIconClick
333
+ }, __jsx("i", {
334
+ className: "app-icon wi wi-clear"
335
+ }))), __jsx(_material.Box, {
237
336
  component: "span",
238
337
  className: "input-group-addon"
239
338
  }, __jsx(_material.Box, {
@@ -247,16 +346,22 @@ var ColumnFilterCell = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
247
346
  }, __jsx(_material.Box, {
248
347
  component: "i",
249
348
  className: "app-icon wi wi-filter-list"
250
- })), Boolean(anchorEl) && __jsx(_material.ClickAwayListener, {
251
- onClickAway: handleClosePopover
349
+ })), __jsx(_material.Menu, {
350
+ anchorEl: anchorEl,
351
+ open: Boolean(anchorEl),
352
+ onClose: handleClosePopover,
353
+ anchorOrigin: {
354
+ vertical: "bottom",
355
+ horizontal: "right"
356
+ },
357
+ transformOrigin: {
358
+ vertical: "top",
359
+ horizontal: "right"
360
+ },
361
+ slotProps: MENU_POPUP_STYLES,
362
+ MenuListProps: MENU_LIST_STYLES
252
363
  }, __jsx(_material.Box, {
253
- className: "dropdown open show",
254
- style: {
255
- position: "absolute",
256
- top: "100%",
257
- right: 0,
258
- zIndex: 1000
259
- }
364
+ className: "dropdown open show"
260
365
  }, __jsx(_material.Box, {
261
366
  component: "ul",
262
367
  className: "matchmode-dropdown dropdown-menu"
@@ -267,6 +372,7 @@ var ColumnFilterCell = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
267
372
  className: selectedMatchMode === mode ? "active" : ""
268
373
  }, __jsx(_material.Box, {
269
374
  component: "a",
375
+ href: "javascript:void(0);",
270
376
  onClick: function onClick() {
271
377
  return handleMatchModeSelect(mode);
272
378
  },
@@ -274,8 +380,10 @@ var ColumnFilterCell = /*#__PURE__*/(0, _react.memo)(function (_ref2) {
274
380
  cursor: "pointer",
275
381
  textDecoration: "none"
276
382
  }
277
- }, matchModeMessages[mode] || mode));
383
+ }, (0, _lodashEs.get)(matchModeMessages, mode, mode)));
278
384
  }))))));
385
+ }, function (prevProps, nextProps) {
386
+ return shallowEqual(prevProps, nextProps, ["columnId", "value", "widgetType", "columnMeta", "columnAccessorKey", "onChange", "renderFormWidget", "onMatchModeChange"]);
279
387
  });
280
388
  ColumnFilterCell.displayName = "ColumnFilterCell";
281
389
  var TableFilterRow = exports.TableFilterRow = /*#__PURE__*/(0, _react.memo)(function (_ref3) {
@@ -291,28 +399,22 @@ var TableFilterRow = exports.TableFilterRow = /*#__PURE__*/(0, _react.memo)(func
291
399
  return __jsx("tr", {
292
400
  className: "table-filter-row"
293
401
  }, (0, _lodashEs.map)(columns, function (column, index) {
294
- var _columnFilters$column;
295
- // Use accessorKey as the column ID if id is not present
296
- var columnId = column.id || column.accessorKey;
402
+ var columnId = (0, _lodashEs.defaultTo)(column.id, column.accessorKey);
297
403
 
298
- // Skip filter for action columns or columns that are not filterable
299
- var actionColumnIds = ["actions", "row-operations", "multiSelect", "radioSelect", "row-index"];
300
- var isActionColumn = (0, _lodashEs.includes)(actionColumnIds, columnId) || column.isRowIndex;
301
- if (isActionColumn || column.enableColumnFilter === false || !column.accessorKey) {
404
+ // Skip non-filterable columns
405
+ if (!isFilterableColumn(column)) {
302
406
  return __jsx("th", {
303
407
  key: columnId
304
408
  });
305
409
  }
306
-
307
- // Get the original column metadata if available
308
- var columnMeta = column.meta || {};
309
- var widgetType = columnMeta.editWidgetType || columnMeta.widgetType || "text";
410
+ var columnMeta = (0, _lodashEs.defaultTo)(column.meta, {});
411
+ var widgetType = (0, _lodashEs.defaultTo)(columnMeta.editWidgetType, (0, _lodashEs.defaultTo)(columnMeta.widgetType, "text"));
310
412
  return __jsx("th", {
311
413
  key: columnId,
312
414
  "data-col-id": index + 1
313
415
  }, __jsx(ColumnFilterCell, {
314
416
  columnId: columnId,
315
- value: ((_columnFilters$column = columnFilters[columnId]) === null || _columnFilters$column === void 0 ? void 0 : _columnFilters$column.value) || "",
417
+ value: (0, _lodashEs.get)(columnFilters, [columnId, "value"], ""),
316
418
  onChange: onColumnFilterChange,
317
419
  widgetType: widgetType,
318
420
  columnMeta: columnMeta,
@@ -321,5 +423,7 @@ var TableFilterRow = exports.TableFilterRow = /*#__PURE__*/(0, _react.memo)(func
321
423
  listener: listener
322
424
  }));
323
425
  }));
426
+ }, function (prevProps, nextProps) {
427
+ return shallowEqual(prevProps, nextProps, ["columns", "columnFilters", "filterMode", "onColumnFilterChange", "renderFormWidget"]);
324
428
  });
325
429
  TableFilterRow.displayName = "TableFilterRow";