@wavemaker/react-runtime 11.14.1-rc.241 → 11.14.2-1.6423

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 (73) hide show
  1. package/actions/navigation-action.js +5 -3
  2. package/actions/notification-action.js +6 -3
  3. package/components/basic/anchor/index.js +6 -7
  4. package/components/basic/label/index.js +2 -2
  5. package/components/basic/search/index.js +7 -3
  6. package/components/chart/components/barColumnChart/index.js +2 -4
  7. package/components/chart/components/pieDonutChart/index.js +3 -1
  8. package/components/chart/hooks/useBarYAxisExtras.js +52 -0
  9. package/components/chart/hooks/useXAxisConfig.js +98 -0
  10. package/components/chart/index.js +72 -39
  11. package/components/chart/utils.js +23 -12
  12. package/components/container/index.js +6 -7
  13. package/components/container/panel/components/panel-header/index.js +3 -2
  14. package/components/container/panel/index.js +13 -9
  15. package/components/container/tabs/index.js +1 -0
  16. package/components/container/tabs/tab-pane/index.js +39 -3
  17. package/components/container/wizard/index.js +187 -57
  18. package/components/container/wizard/utils.js +1 -1
  19. package/components/container/wizard/wizard-action/index.js +9 -4
  20. package/components/container/wizard/wizard-step/index.js +21 -8
  21. package/components/data/form/base-form/index.js +51 -11
  22. package/components/data/form/form-controller/withFormController.js +7 -10
  23. package/components/data/list/components/GroupedListItems.js +5 -1
  24. package/components/data/list/components/ListItemWithTemplate.js +4 -1
  25. package/components/data/list/hooks/useListEffects.js +34 -14
  26. package/components/data/list/hooks/useListEventHandlers.js +18 -2
  27. package/components/data/list/hooks/useListState.js +15 -2
  28. package/components/data/list/index.js +1 -0
  29. package/components/data/list/utils/list-helpers.js +3 -5
  30. package/components/data/list/utils/list-widget-methods.js +1 -1
  31. package/components/data/live-filter/index.js +6 -5
  32. package/components/data/live-form/index.js +24 -14
  33. package/components/data/table/components/TableBody.js +5 -21
  34. package/components/data/table/components/TableHeader.js +5 -1
  35. package/components/data/table/index.js +21 -5
  36. package/components/data/utils/field-data-utils.js +1 -1
  37. package/components/dialogs/index.js +14 -16
  38. package/components/input/currency/index.js +11 -7
  39. package/components/input/default/checkbox/index.js +2 -3
  40. package/components/input/default/checkboxset/index.js +2 -22
  41. package/components/input/default/radioset/index.js +5 -4
  42. package/components/input/epoch/datetime/index.js +6 -2
  43. package/components/input/epoch/time/index.js +2 -1
  44. package/components/input/number/index.js +2 -2
  45. package/components/input/text/util.js +2 -0
  46. package/components/input/textarea/index.js +22 -24
  47. package/components/layout/leftnav/index.js +1 -1
  48. package/components/navbar/nav/index.js +97 -7
  49. package/components/navbar/nav-item/index.js +5 -2
  50. package/components/navigation/menu/index.js +73 -12
  51. package/components/navigation/popover/index.js +2 -0
  52. package/components/page/error-boundary/index.js +1 -0
  53. package/components/prefab/container/index.js +10 -3
  54. package/context/LocalizationProvider.js +1 -0
  55. package/context/PrefabContext.js +138 -13
  56. package/context/WidgetProvider.js +2 -2
  57. package/core/constants/events.js +12 -6
  58. package/core/constants/index.js +6 -11
  59. package/core/formatter/number-formatters.js +1 -1
  60. package/core/proxy-service.js +72 -36
  61. package/core/util/utils.js +23 -4
  62. package/higherOrder/BaseApp.js +60 -18
  63. package/higherOrder/BasePage.js +99 -77
  64. package/higherOrder/BasePrefab.js +13 -5
  65. package/higherOrder/withBaseWrapper.js +3 -3
  66. package/hooks/useDataSourceSubscription.js +1 -1
  67. package/hooks/useHttp.js +20 -13
  68. package/mui-config/theme.js +3 -0
  69. package/package-lock.json +781 -669
  70. package/package.json +3 -3
  71. package/store/index.js +5 -1
  72. package/utils/lib-error-skipper.js +196 -0
  73. package/variables/service-variable.js +17 -14
@@ -19,7 +19,6 @@ var _set = _interopRequireDefault(require("lodash-es/set"));
19
19
  var _props = require("./props");
20
20
  var _utils = require("./utils");
21
21
  var _formContext = require("../form-context");
22
- var _utils2 = require("../../utils");
23
22
  var _lodashEs = require("lodash-es");
24
23
  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" != _typeof3(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); }
25
24
  var __jsx = _react["default"].createElement;
@@ -28,10 +27,10 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
28
27
  var DEFAULT_CLASS = "panel app-panel app-form";
29
28
  var BaseForm = function BaseForm(WrappedComponent) {
30
29
  var ControlledForm = function ControlledForm(FormProps) {
30
+ var _props$listener4;
31
31
  // setting up default props for form
32
32
  var props = _objectSpread(_objectSpread({}, _props.defaultProps), FormProps);
33
33
  var isInsideWizard = props.isInsideWizard || false;
34
- var primaryKeyRef = (0, _react.useRef)([]);
35
34
  var formRef = (0, _react.useRef)(null);
36
35
  var _useState = (0, _react.useState)({}),
37
36
  formfields = _useState[0],
@@ -70,6 +69,7 @@ var BaseForm = function BaseForm(WrappedComponent) {
70
69
  reset = _useForm.reset,
71
70
  watch = _useForm.watch,
72
71
  trigger = _useForm.trigger,
72
+ getValues = _useForm.getValues,
73
73
  clearErrors = _useForm.clearErrors;
74
74
 
75
75
  // update the form data when the formdata prop changes
@@ -165,14 +165,13 @@ var BaseForm = function BaseForm(WrappedComponent) {
165
165
  }, [trigger]);
166
166
  var handleFormSubmit = /*#__PURE__*/function () {
167
167
  var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(data, e, operation) {
168
- var isValid, _props$listener2, result, FormData, _props$listener3, operationType;
168
+ var isValid, _props$listener2, result, FormData, _props$listener3;
169
169
  return _regenerator["default"].wrap(function _callee$(_context) {
170
170
  while (1) switch (_context.prev = _context.next) {
171
171
  case 0:
172
172
  if (!e) {
173
173
  e = new Event("submit");
174
174
  }
175
-
176
175
  // check form is valid or not
177
176
  _context.next = 3;
178
177
  return validateFieldsOnSubmit();
@@ -216,17 +215,22 @@ var BaseForm = function BaseForm(WrappedComponent) {
216
215
  }
217
216
 
218
217
  // get the operation type
219
- operationType = props.widgettype === "live-form" && !operation ? (0, _utils2.findOperationType)(FormData, primaryKeyRef.current) : operation;
220
218
  props.formSubmit(FormData, function (data) {
221
- if (props.widgettype === "live-form" && operationType === "insert") {
219
+ if (props.widgettype === "live-form" && data.operationType === "insert") {
222
220
  reset(data);
223
221
  }
224
222
  onResultCb((0, _get["default"])(data, "params"), "success");
223
+ var hasCustomOnSuccess = props.onSuccess !== _props.defaultProps.onSuccess;
224
+ if (!hasCustomOnSuccess && props.widgettype === "live-form") {
225
+ var successMsg = data.operationType === "insert" && props.insertmessage || data.operationType === "update" && props.updatemessage || data.operationType === "delete" && props.deletemessage || props.postmessage;
226
+ toggleMessage(true, successMsg, "success");
227
+ return;
228
+ }
225
229
  toggleMessage(true, props.postmessage, "success");
226
230
  }, function (error) {
227
231
  toggleMessage(true, props.errormessage || error || error.message, "error");
228
232
  onResultCb(error, "");
229
- }, operationType);
233
+ });
230
234
  }
231
235
  if (props !== null && props !== void 0 && props.onSubmit) {
232
236
  props.onSubmit(e, props, FormData);
@@ -375,7 +379,10 @@ var BaseForm = function BaseForm(WrappedComponent) {
375
379
  cancel: cancel,
376
380
  "new": create,
377
381
  edit: edit,
378
- setShowViewMode: setShowViewMode
382
+ setShowViewMode: setShowViewMode,
383
+ dataoutput: getValues(),
384
+ save: submit,
385
+ reset: reset
379
386
  });
380
387
  var conditionalProps = _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, props.target && {
381
388
  target: props.target
@@ -419,13 +426,23 @@ var BaseForm = function BaseForm(WrappedComponent) {
419
426
  function cancel() {
420
427
  setShowViewMode(true);
421
428
  }
429
+ var fields = (0, _get["default"])((_props$listener4 = props.listener) === null || _props$listener4 === void 0 ? void 0 : _props$listener4.Widgets[props.name], "formfields", {});
430
+ var FormFields = (0, _react.useMemo)(function () {
431
+ var newFields = [];
432
+ Object.keys(fields).forEach(function (key) {
433
+ if (!key.includes("formWidget") && fields[key]) {
434
+ newFields.push(fields[key]);
435
+ }
436
+ });
437
+ return newFields;
438
+ }, [fields]);
422
439
 
423
440
  // Call onDataSourceChange when formfields change
424
441
  (0, _react.useEffect)(function () {
425
- if (props.onDataSourceChange && Object.keys(formfields).length > 0) {
426
- props.onDataSourceChange(formfields);
442
+ if (props.onDataSourceChange && FormFields.length > 0) {
443
+ props.onDataSourceChange(FormFields);
427
444
  }
428
- }, [formfields, props.onDataSourceChange]);
445
+ }, [FormFields, props.onDataSourceChange]);
429
446
 
430
447
  // Determine form classes based on wizard context
431
448
  var formClassName = (0, _react.useMemo)(function () {
@@ -434,6 +451,29 @@ var BaseForm = function BaseForm(WrappedComponent) {
434
451
  }
435
452
  return (0, _clsx["default"])(DEFAULT_CLASS, props.className);
436
453
  }, [isInsideWizard, props.className]);
454
+
455
+ // Notify parent containers (wizard) about validity changes
456
+ (0, _react.useEffect)(function () {
457
+ var el = formRef.current;
458
+ if (!el) return;
459
+ var emit = function emit() {
460
+ el.dispatchEvent(new CustomEvent("wm:form-validity", {
461
+ bubbles: true,
462
+ detail: {
463
+ isValid: isValid
464
+ }
465
+ }));
466
+ };
467
+ emit();
468
+ var unsubscribe = watch(function () {
469
+ return emit();
470
+ });
471
+ return function () {
472
+ if (typeof unsubscribe === "function") {
473
+ unsubscribe();
474
+ }
475
+ };
476
+ }, [watch, isValid]);
437
477
  return __jsx("form", (0, _extends2["default"])({
438
478
  name: props.name,
439
479
  defaultmode: props.defaultmode,
@@ -14,7 +14,6 @@ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
14
14
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
15
  var _reactHookForm = require("react-hook-form");
16
16
  var _clsx = _interopRequireDefault(require("clsx"));
17
- var _Box = _interopRequireDefault(require("@mui/material/Box"));
18
17
  var _validationContrustor = require("@wavemaker/react-runtime/components/data/form/form-controller/validation-contrustor");
19
18
  var _WidgetProvider = require("@wavemaker/react-runtime/context/WidgetProvider");
20
19
  var _formContext = require("@wavemaker/react-runtime/components/data/form/form-context");
@@ -201,7 +200,7 @@ var withFormController = function withFormController(WrappedComponent) {
201
200
  }
202
201
 
203
202
  // If the incoming value is an object and we have a datafield, extract the value
204
- if (valueToSet && (0, _typeof2["default"])(valueToSet) === "object" && !Array.isArray(valueToSet) && props.datafield) {
203
+ if (valueToSet && (0, _typeof2["default"])(valueToSet) === "object" && !Array.isArray(valueToSet) && props.datafield && props.datafield !== "All Fields") {
205
204
  valueToSet = valueToSet[props.datafield];
206
205
  }
207
206
  if (type === "number") {
@@ -267,9 +266,9 @@ var withFormController = function withFormController(WrappedComponent) {
267
266
  hidden: contextFormRef === null || contextFormRef === void 0 ? void 0 : contextFormRef.isViewMode
268
267
  })
269
268
  });
270
- return __jsx(_Box["default"], {
271
- sx: {
272
- width: "inherit"
269
+ return __jsx("div", {
270
+ style: {
271
+ width: "100%"
273
272
  }
274
273
  }, __jsx(WrappedComponent, (0, _extends2["default"])({}, controlledProps, {
275
274
  dataset: props.dataset,
@@ -290,8 +289,7 @@ var withFormController = function withFormController(WrappedComponent) {
290
289
  }
291
290
  }
292
291
  return value;
293
- }()), hint && !shouldShowErrorMessage(validationType, fieldState, touched) && __jsx(_Box["default"], {
294
- component: "p",
292
+ }()), hint && !shouldShowErrorMessage(validationType, fieldState, touched) && __jsx("p", {
295
293
  className: "help-block",
296
294
  "aria-hidden": "true",
297
295
  role: "alert",
@@ -300,13 +298,12 @@ var withFormController = function withFormController(WrappedComponent) {
300
298
  textAlign: "start",
301
299
  width: "100%"
302
300
  }
303
- }, hint), shouldShowErrorMessage(validationType, fieldState, touched) && __jsx(_Box["default"], {
304
- component: "p",
301
+ }, hint), shouldShowErrorMessage(validationType, fieldState, touched) && __jsx("p", {
305
302
  className: "help-block text-danger",
306
303
  "aria-hidden": "false",
307
304
  role: "alert",
308
305
  "aria-live": "assertive",
309
- sx: {
306
+ style: {
310
307
  textAlign: "start",
311
308
  width: "100%"
312
309
  }
@@ -50,6 +50,10 @@ var GroupedListItems = exports.GroupedListItems = function GroupedListItems(_ref
50
50
  return __jsx(_react["default"].Fragment, null, groupsToRender.map(function (groupObj) {
51
51
  var isGroupCollapsed = groupCollapsed[groupObj.key] || false;
52
52
  var displayCount = groupObj.originalDataLength || groupObj.data.length;
53
+ // Build itemclass for grouped items: if function, wrap to append group class
54
+ var groupedItemClass = typeof itemclass === "function" ? function (it) {
55
+ return (0, _clsx["default"])(itemclass(it), "group-list-item");
56
+ } : (0, _clsx["default"])(itemclass, "group-list-item");
53
57
  return __jsx("li", {
54
58
  key: "group_".concat(groupObj.key),
55
59
  className: "app-list-item-group clearfix"
@@ -80,7 +84,7 @@ var GroupedListItems = exports.GroupedListItems = function GroupedListItems(_ref
80
84
  isFirst: isFirst,
81
85
  isLast: isLast,
82
86
  disableitem: disableitem,
83
- itemclass: (0, _clsx["default"])(itemclass, "group-list-item"),
87
+ itemclass: groupedItemClass,
84
88
  itemsPerRowClass: itemsPerRowClass,
85
89
  name: "".concat(name, "_group_").concat(groupObj.key),
86
90
  tabIndex: tabIndex,
@@ -36,11 +36,14 @@ var ListItemWithTemplate = exports.ListItemWithTemplate = function ListItemWithT
36
36
  onItemMouseEnter = _ref.onItemMouseEnter,
37
37
  onItemMouseLeave = _ref.onItemMouseLeave;
38
38
  var templateContent = renderItem ? renderItem(item, globalIndex !== null && globalIndex !== void 0 ? globalIndex : index) : itemTemplate || __jsx(_mediaTemplate.MediaWmListtemplate, null);
39
+
40
+ // Resolve item class: support string or function callback
41
+ var resolvedItemClass = typeof itemclass === "function" ? itemclass(item) : itemclass;
39
42
  return __jsx(_ListItem.WmListItem, {
40
43
  key: itemId,
41
44
  item: item,
42
45
  disableItem: disableitem,
43
- itemClass: (0, _clsx["default"])(itemclass, itemsPerRowClass),
46
+ itemClass: (0, _clsx["default"])(resolvedItemClass, itemsPerRowClass),
44
47
  index: globalIndex !== null && globalIndex !== void 0 ? globalIndex : index,
45
48
  isFirst: isFirst,
46
49
  isLast: isLast,
@@ -52,7 +52,8 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
52
52
  var _useState = (0, _react.useState)(paginationState.currentPageSize),
53
53
  lastPageSize = _useState[0],
54
54
  setLastPageSize = _useState[1];
55
-
55
+ var rafRef1 = (0, _react.useRef)(null);
56
+ var rafRef2 = (0, _react.useRef)(null);
56
57
  // Effect 1: Accumulate data for On-Demand navigation
57
58
  (0, _react.useEffect)(function () {
58
59
  if (navigation === _constants.LIST_NAVIGATION_TYPES.ON_DEMAND && datasource && safeDataset.length > 0) {
@@ -105,11 +106,19 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
105
106
  getIndex: widgetMethods.getIndex,
106
107
  clear: widgetMethods.clear,
107
108
  getWidgets: widgetMethods.getWidgets,
108
- showNavigation: showNavigation,
109
+ showNavigation: showNavigation
110
+ });
111
+ }
112
+ }, []);
113
+
114
+ // Effect 3: Expose methods through widget instance
115
+ (0, _react.useEffect)(function () {
116
+ if (listener !== null && listener !== void 0 && listener.onChange) {
117
+ listener.onChange(name, {
109
118
  selecteditem: listState.selectedItems[0]
110
119
  });
111
120
  }
112
- }, [widgetMethods.selectItem, widgetMethods.deselectItem, widgetMethods.getItem, widgetMethods.getIndex, widgetMethods.clear, widgetMethods.getWidgets, listState.selectedItems, listState.activeItems]);
121
+ }, [listState.selectedItems]);
113
122
 
114
123
  // Effect 3b: Update selected item widgets for state restoration (not selectfirstitem)
115
124
  var hasInitialWidgetUpdateRun = (0, _react.useRef)(false);
@@ -124,18 +133,22 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
124
133
  hasInitialWidgetUpdateRun.current = true;
125
134
 
126
135
  // Use double RAF to ensure DOM is fully updated
127
- requestAnimationFrame(function () {
128
- (0, _listHelpers.getSelectedItemWidgets)(null, listener, name);
136
+ rafRef1.current = requestAnimationFrame(function () {
137
+ // getSelectedItemWidgets(null, listener, name);
138
+ rafRef2.current = requestAnimationFrame(function () {
139
+ (0, _listHelpers.getSelectedItemWidgets)(null, listener, name);
140
+ });
129
141
  });
142
+ return function () {
143
+ if (rafRef1.current) {
144
+ cancelAnimationFrame(rafRef1.current);
145
+ }
146
+ if (rafRef2.current) {
147
+ cancelAnimationFrame(rafRef2.current);
148
+ }
149
+ };
130
150
  }, [name, listState.selectedItems.length, initialRender, selectfirstitem]);
131
151
 
132
- // Effect 4: Handle widgetInstance.selecteditem
133
- (0, _react.useEffect)(function () {
134
- if ((widgetInstance === null || widgetInstance === void 0 ? void 0 : widgetInstance.selecteditem) != undefined) {
135
- widgetMethods.selectItem(widgetInstance.selecteditem);
136
- }
137
- }, [widgetInstance === null || widgetInstance === void 0 ? void 0 : widgetInstance.selecteditem]);
138
-
139
152
  // Effect 5: Handle selectfirstitem with onSelect
140
153
  (0, _react.useEffect)(function () {
141
154
  if (selectfirstitem && widgetInstance && onSelect && listState.selectedItems.length > 0) {
@@ -271,8 +284,15 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
271
284
  // Merge current state with existing state
272
285
  var stateToSave = stateManager.mergeWithExisting(stateManager.currentState, existingState);
273
286
 
274
- // Save the state
275
- (0, _listHelpers.saveListState)(name, statehandler, stateToSave);
287
+ // Compare state content, not object references
288
+ var existingStateStr = JSON.stringify(existingState);
289
+ var stateToSaveStr = JSON.stringify(stateToSave);
290
+ var statesAreEqual = existingStateStr === stateToSaveStr;
291
+
292
+ // Save the state only if content has actually changed
293
+ if (!statesAreEqual) {
294
+ (0, _listHelpers.saveListState)(name, statehandler, stateToSave);
295
+ }
276
296
  }
277
297
  }, [listState.selectedItems, paginationState.currentPage, items, name, navigation, hasBeenReordered, statehandler]);
278
298
  (0, _react.useEffect)(function () {
@@ -54,6 +54,10 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
54
54
  setOnDemandCurrentPage = props.setOnDemandCurrentPage,
55
55
  listener = props.listener,
56
56
  name = props.name;
57
+ var selectedItemsRef = (0, _react.useRef)(selectedItems);
58
+ (0, _react.useEffect)(function () {
59
+ selectedItemsRef.current = selectedItems;
60
+ }, [selectedItems]);
57
61
 
58
62
  // Helper function to call onSelect and mark as user-initiated
59
63
  var callOnSelect = (0, _react.useCallback)(function (selectedItem) {
@@ -61,6 +65,11 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
61
65
  if (userInitiatedSelectionRef) {
62
66
  userInitiatedSelectionRef.current = true;
63
67
  }
68
+ if (listener !== null && listener !== void 0 && listener.onChange) {
69
+ listener.onChange(name, {
70
+ selecteditem: multiselect ? selectedItemsRef.current : selectedItem
71
+ });
72
+ }
64
73
  onSelect(widgetInstance, selectedItem);
65
74
  }
66
75
  }, [onSelect, widgetInstance, userInitiatedSelectionRef]);
@@ -87,6 +96,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
87
96
  return;
88
97
  }
89
98
  var rangeItems = (0, _lodashEs.slice)(items, start, end + 1);
99
+ selectedItemsRef.current = rangeItems;
90
100
  setSelectedItems(rangeItems);
91
101
  setActiveItems(new Set(rangeItems));
92
102
  // Only call onSelect if this is a new selection (not already active)
@@ -108,12 +118,14 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
108
118
  var newSelectedItems = (0, _lodashEs.filter)(selectedItems, function (selectedItem) {
109
119
  return selectedItem !== item;
110
120
  });
121
+ selectedItemsRef.current = newSelectedItems;
111
122
  setSelectedItems(newSelectedItems);
112
123
  var newActiveItems = new Set(activeItems);
113
124
  newActiveItems["delete"](item);
114
125
  setActiveItems(newActiveItems);
115
126
  } else {
116
127
  var _newSelectedItems = [].concat((0, _toConsumableArray2["default"])(selectedItems), [item]);
128
+ selectedItemsRef.current = _newSelectedItems;
117
129
  setSelectedItems(_newSelectedItems);
118
130
  var _newActiveItems = new Set(activeItems);
119
131
  _newActiveItems.add(item);
@@ -128,7 +140,9 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
128
140
  // Normal click without Ctrl - select item without deselecting if already selected
129
141
  if (!isItemSelected) {
130
142
  // If clicking an unselected item, select only this item
131
- setSelectedItems([item]);
143
+ var _newSelectedItems2 = [item];
144
+ selectedItemsRef.current = _newSelectedItems2;
145
+ setSelectedItems(_newSelectedItems2);
132
146
  setActiveItems(new Set([item]));
133
147
  setFirstSelectedItem(item);
134
148
  // Only call onSelect if this is a new selection (not already active)
@@ -142,7 +156,9 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
142
156
  // Single select mode - only select, don't deselect on normal click
143
157
  if (!isItemSelected) {
144
158
  // If clicking an unselected item, select it
145
- setSelectedItems([item]);
159
+ var _newSelectedItems3 = [item];
160
+ selectedItemsRef.current = _newSelectedItems3;
161
+ setSelectedItems(_newSelectedItems3);
146
162
  setActiveItems(new Set([item]));
147
163
  setFirstSelectedItem(item);
148
164
  // Only call onSelect if this is a new selection (not already active)
@@ -42,6 +42,8 @@ var useListState = exports.useListState = function useListState(dataset, pagesiz
42
42
  isLoadingMore = _useState8[0],
43
43
  setIsLoadingMore = _useState8[1];
44
44
  var isInitialMount = (0, _react.useRef)(true);
45
+ var rafRef1 = (0, _react.useRef)(null);
46
+ var rafRef2 = (0, _react.useRef)(null);
45
47
  (0, _react.useEffect)(function () {
46
48
  // Ensure dataset is a valid array
47
49
  var validDataset = Array.isArray(dataset) ? dataset : [];
@@ -71,12 +73,23 @@ var useListState = exports.useListState = function useListState(dataset, pagesiz
71
73
 
72
74
  // Update selected item widgets after DOM is painted
73
75
  if (listener !== null && listener !== void 0 && listener.onChange && name) {
74
- requestAnimationFrame(function () {
75
- (0, _listHelpers.getSelectedItemWidgets)(null, listener, name);
76
+ rafRef1.current = requestAnimationFrame(function () {
77
+ // getSelectedItemWidgets(null, listener, name);
78
+ rafRef2.current = requestAnimationFrame(function () {
79
+ (0, _listHelpers.getSelectedItemWidgets)(null, listener, name);
80
+ });
76
81
  });
77
82
  }
78
83
  }
79
84
  }
85
+ return function () {
86
+ if (rafRef1.current) {
87
+ cancelAnimationFrame(rafRef1.current);
88
+ }
89
+ if (rafRef2.current) {
90
+ cancelAnimationFrame(rafRef2.current);
91
+ }
92
+ };
80
93
  }, [dataset, selectfirstitem, name]);
81
94
  return {
82
95
  selectedItems: selectedItems,
@@ -495,6 +495,7 @@ var WmList = function WmList(props) {
495
495
  }),
496
496
  component: "div",
497
497
  "data-name": name,
498
+ name: name,
498
499
  "data-navigation": navigation
499
500
  }, __jsx(_components2.ListHeader, {
500
501
  title: title,
@@ -164,10 +164,8 @@ var getSelectedItemWidgets = exports.getSelectedItemWidgets = function getSelect
164
164
  return result;
165
165
  }, {});
166
166
  if (listener) {
167
- setTimeout(function () {
168
- listener.onChange(name, {
169
- selectedItemWidgets: currentItemWidgets
170
- });
171
- }, 0);
167
+ listener.onChange(name, {
168
+ selectedItemWidgets: currentItemWidgets
169
+ });
172
170
  }
173
171
  };
@@ -49,7 +49,7 @@ var useListWidgetMethods = exports.useListWidgetMethods = function useListWidget
49
49
  onSelect(widgetInstance, item);
50
50
  }
51
51
  }
52
- }, [listState.activeItems]);
52
+ }, [listState.activeItems, getItemByIndexOrModel]);
53
53
  var deselectItem = (0, _react.useCallback)(function (val) {
54
54
  var item = getItemByIndexOrModel(val);
55
55
  if (!item) {
@@ -15,7 +15,6 @@ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/de
15
15
  var _lodashEs = require("lodash-es");
16
16
  var _util = require("../../../core/util");
17
17
  var _form = _interopRequireDefault(require("../form"));
18
- var _withBaseWrapper = _interopRequireDefault(require("../../../higherOrder/withBaseWrapper"));
19
18
  var _props = require("./props");
20
19
  var _types = require("../types");
21
20
  var _utils = require("../utils");
@@ -238,10 +237,12 @@ var WmLiveFilter = function WmLiveFilter(prop) {
238
237
  }));
239
238
  return _Livefilter.apply(this, arguments);
240
239
  }
241
- function onDataSourceChange() {
240
+ function onDataSourceChange(formFields) {
242
241
  if (isDataSourceUpdatedRef.current) return;
243
- var fields = (0, _lodashEs.get)(props.listener.Widgets[props.name], "formfields", []);
244
- var formFields = (0, _lodashEs.isArray)(fields) ? fields : Object.values(fields || {});
242
+ // const fields = get(props.listener.Widgets[props.name], "formfields", []);
243
+
244
+ // let formFields = isArray(fields) ? fields : Object.values(fields || {});
245
+
245
246
  if ((0, _lodashEs.get)(formFields, "length")) {
246
247
  isDataSourceUpdatedRef.current = true;
247
248
  }
@@ -276,4 +277,4 @@ var WmLiveFilter = function WmLiveFilter(prop) {
276
277
  );
277
278
  };
278
279
  WmLiveFilter.displayName = "WmLiveFilter";
279
- var _default = exports["default"] = (0, _withBaseWrapper["default"])(WmLiveFilter);
280
+ var _default = exports["default"] = WmLiveFilter;
@@ -1,44 +1,56 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
- var _typeof = require("@babel/runtime/helpers/typeof");
4
+ var _typeof3 = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports["default"] = void 0;
9
9
  var _react = _interopRequireWildcard(require("react"));
10
10
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
12
13
  var _props = require("./props");
13
14
  var _form = _interopRequireDefault(require("../form"));
14
- var _get = _interopRequireDefault(require("lodash-es/get"));
15
- var _isArray = _interopRequireDefault(require("lodash-es/isArray"));
16
15
  var _fieldDataUtils = require("../utils/field-data-utils");
17
16
  var _replace = _interopRequireDefault(require("lodash-es/replace"));
18
- 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); }
17
+ var _utils = require("../utils");
18
+ 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" != _typeof3(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); }
19
19
  var __jsx = _react["default"].createElement;
20
20
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
21
21
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
22
  var WmLiveForm = function WmLiveForm(prop) {
23
- var _props$listener;
24
23
  var props = _objectSpread(_objectSpread({}, _props.DEFAULT_PROPS), prop);
25
24
  var dynamicFieldsRef = (0, _react.useRef)([]);
26
25
  var isDataSourceUpdatedRef = (0, _react.useRef)(false);
27
- var dataSource = (_props$listener = props.listener) === null || _props$listener === void 0 || (_props$listener = _props$listener.Variables) === null || _props$listener === void 0 ? void 0 : _props$listener[props.datasource];
28
- function formSubmit(formData, success, error, operation) {
26
+ var dataSource = props.datasource;
27
+ function formSubmit(formData, success, error) {
28
+ var primaryKeys = dataSource.execute("getPrimaryKey");
29
+ var operationType = (0, _utils.findOperationType)(formData, primaryKeys);
29
30
  if (dynamicFieldsRef.current.length > 0) {
30
31
  dynamicFieldsRef.current.forEach(function (field) {
31
32
  var item = field.formKey;
32
33
  formData[item] = field.dataset[formData[item] - 1];
33
34
  });
34
35
  }
35
- if (operation === "delete") {
36
- props.formSubmit(formData, operation, success, error);
36
+ var successWithOperationType = function successWithOperationType(res) {
37
+ var payload = res && (0, _typeof2["default"])(res) === "object" ? _objectSpread(_objectSpread({}, res), {}, {
38
+ operationType: operationType
39
+ }) : {
40
+ operationType: operationType
41
+ };
42
+ if (typeof success === "function") {
43
+ success(payload);
44
+ }
45
+ return payload;
46
+ };
47
+ if (operationType === "delete") {
48
+ props.formSubmit(formData, operationType, successWithOperationType, error);
37
49
  return;
38
50
  }
39
51
  props.formSubmit({
40
52
  inputFields: formData
41
- }, operation, success, error);
53
+ }, operationType, successWithOperationType, error);
42
54
  }
43
55
  function getRelatedTableData(formField) {
44
56
  dataSource && dataSource.execute("getRelatedTableData", {
@@ -62,11 +74,9 @@ var WmLiveForm = function WmLiveForm(prop) {
62
74
  });
63
75
  });
64
76
  }
65
- function onDataSourceChange() {
77
+ function onDataSourceChange(formFields) {
66
78
  if (isDataSourceUpdatedRef.current) return;
67
- var fields = (0, _get["default"])(props.listener.Widgets[props.name], "formfields", []);
68
- var formFields = (0, _isArray["default"])(fields) ? fields : Object.values(fields || {});
69
- if ((0, _get["default"])(formFields, "length")) {
79
+ if (formFields.length > 0) {
70
80
  isDataSourceUpdatedRef.current = true;
71
81
  }
72
82
  formFields.forEach(function (field) {
@@ -254,26 +254,10 @@ var TableBodyComponentBase = function TableBodyComponentBase(_ref4) {
254
254
  className: "app-grid-content ".concat(_utils.TABLE_CSS_CLASSES.gridBody)
255
255
  }, formposition === "top" && renderAddNewRow(), renderTableContent(), formposition === "bottom" && renderAddNewRow());
256
256
  };
257
- var TableBodyComponent = exports.TableBodyComponent = /*#__PURE__*/(0, _react.memo)(TableBodyComponentBase, function (prevProps, nextProps) {
258
- // Since table key forces rebuilds on pagination, we can use simpler memoization
259
- // Just prevent re-renders from function reference changes
260
-
261
- // Allow re-render for these critical changes
262
- if (prevProps.isLoading !== nextProps.isLoading) return false;
263
- if (prevProps.rowClass !== nextProps.rowClass) return false;
264
- if (prevProps.formposition !== nextProps.formposition) return false;
265
- if (prevProps.nodatamessage !== nextProps.nodatamessage) return false;
266
-
267
- // Check expandedRows
268
- if (prevProps.expandedRows !== nextProps.expandedRows) {
269
- var _prevProps$expandedRo, _nextProps$expandedRo;
270
- var prevSize = ((_prevProps$expandedRo = prevProps.expandedRows) === null || _prevProps$expandedRo === void 0 ? void 0 : _prevProps$expandedRo.size) || 0;
271
- var nextSize = ((_nextProps$expandedRo = nextProps.expandedRows) === null || _nextProps$expandedRo === void 0 ? void 0 : _nextProps$expandedRo.size) || 0;
272
- if (prevSize !== nextSize) return false;
273
- }
274
-
275
- // Block re-render only for function reference changes (prevents infinite loops)
276
- // Table key handles pagination rebuilds, so we don't need complex row comparisons
277
- return true; // Prevent re-render for function reference changes only
257
+ var TableBodyComponent = exports.TableBodyComponent = /*#__PURE__*/(0, _react.memo)(TableBodyComponentBase, function (prev, current) {
258
+ var keys = ["isLoading", "rowClass", "formposition", "nodatamessage", "loadingdatamsg", "rowsVersion", "tableData", "ColClassSignature"];
259
+ return keys.every(function (key) {
260
+ return prev[key] === current[key];
261
+ });
278
262
  });
279
263
  TableBodyComponent.displayName = "TableBodyComponent";
@@ -86,6 +86,7 @@ var TableHeaderComponent = exports.TableHeaderComponent = /*#__PURE__*/(0, _reac
86
86
  key: headerGroup.id,
87
87
  className: "".concat(_utils.TABLE_CSS_CLASSES.tableRow, " ").concat(rowClass)
88
88
  }, headerGroup.headers.map(function (header, headerIndex) {
89
+ var _header$column$column;
89
90
  var cells = [];
90
91
 
91
92
  // Insert expansion header before this cell if it's at the calculated position
@@ -104,7 +105,7 @@ var TableHeaderComponent = exports.TableHeaderComponent = /*#__PURE__*/(0, _reac
104
105
  // Add the regular header cell
105
106
  cells.push(__jsx(_material.TableCell, {
106
107
  key: header.id,
107
- className: _utils.TABLE_CSS_CLASSES.headerCell,
108
+ className: "".concat(_utils.TABLE_CSS_CLASSES.headerCell, " ").concat(((_header$column$column = header.column.columnDef) === null || _header$column$column === void 0 || (_header$column$column = _header$column$column.meta) === null || _header$column$column === void 0 ? void 0 : _header$column$column.className) || "").trim(),
108
109
  style: {
109
110
  cursor: enablesort && header.column.getCanSort() ? "pointer" : "default",
110
111
  userSelect: "none",
@@ -147,6 +148,9 @@ var TableHeaderComponent = exports.TableHeaderComponent = /*#__PURE__*/(0, _reac
147
148
  // Compare props including the sorting state
148
149
  var prevSorting = prevProps.sorting || [];
149
150
  var nextSorting = nextProps.sorting || [];
151
+ if (prevProps.ColClassSignature !== nextProps.ColClassSignature) {
152
+ return false;
153
+ }
150
154
 
151
155
  // Deep compare sorting arrays
152
156
  var sortingEqual = prevSorting.length === nextSorting.length && prevSorting.every(function (prevSort, index) {