@wavemaker/react-runtime 11.15.3-rc.647481 → 11.15.4-rc.250

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 (46) hide show
  1. package/components/basic/richtexteditor/index.js +53 -9
  2. package/components/chart/index.js +2 -11
  3. package/components/common/AppSpinner.js +4 -1
  4. package/components/container/panel/components/panel-content/index.js +18 -0
  5. package/components/container/wizard/index.js +1 -1
  6. package/components/data/form/base-form/index.js +156 -105
  7. package/components/data/form/form-context.js +17 -1
  8. package/components/data/form/form-controller/hooks/index.js +127 -0
  9. package/components/data/form/form-controller/utils.js +52 -1
  10. package/components/data/form/form-controller/withFormController.js +10 -162
  11. package/components/data/form/form-dynamic-section/index.js +46 -0
  12. package/components/data/form/form-dynamic-section/props.js +5 -0
  13. package/components/data/form/index.js +5 -0
  14. package/components/data/list/hooks/useListEffects.js +10 -3
  15. package/components/data/list/hooks/useListEventHandlers.js +20 -15
  16. package/components/data/list/index.js +7 -8
  17. package/components/data/list/utils/list-helpers.js +21 -1
  18. package/components/data/list/utils/list-widget-methods.js +2 -0
  19. package/components/data/list/utils/widget-instance-utils.js +82 -0
  20. package/components/data/pagination/components/BasicPagination.js +1 -0
  21. package/components/data/pagination/components/PageSizeSelector.js +11 -3
  22. package/components/data/pagination/index.js +1 -2
  23. package/components/data/table/hooks/useServerSideSorting.js +10 -16
  24. package/components/data/table/index.js +55 -57
  25. package/components/data/table/utils/buildSelectionColumns.js +23 -32
  26. package/components/data/table/utils/index.js +7 -2
  27. package/components/dialogs/index.js +6 -0
  28. package/components/input/default/checkbox/index.js +5 -2
  29. package/components/input/epoch/date/components/DatePickerPopover.js +17 -2
  30. package/components/input/epoch/date/index.js +21 -17
  31. package/components/input/epoch/datetime/index.js +2 -4
  32. package/components/navigation/popover/index.js +8 -21
  33. package/components/page/partial-container/index.js +19 -1
  34. package/context/WidgetProvider.js +28 -14
  35. package/core/proxy-service.js +1 -2
  36. package/core/util/compare.js +6 -0
  37. package/higherOrder/BasePage.js +1 -1
  38. package/higherOrder/withBaseWrapper.js +22 -8
  39. package/libs/index.js +3 -10
  40. package/libs/prefab/index.js +20 -0
  41. package/package-lock.json +119 -90
  42. package/package.json +2 -2
  43. package/utils/lib-error-skipper.js +5 -2
  44. package/utils/state-persistance.js +42 -33
  45. package/utils/widget-cleanup-util.js +30 -0
  46. package/variables/live-variable.js +18 -0
@@ -1,9 +1,15 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.extractDynamicValidationProps = extractDynamicValidationProps;
8
+ exports.shouldShowErrorMessage = exports.processFieldValue = exports.getErrorState = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
11
+ 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; }
12
+ 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; }
7
13
  function resolveValue(value) {
8
14
  if (value === null || value === undefined) return undefined;
9
15
  if (typeof value === "function") {
@@ -81,4 +87,49 @@ function extractDynamicValidationProps(validators, rules) {
81
87
  result.excludedays = result.excludedays.join(",");
82
88
  }
83
89
  return result;
84
- }
90
+ }
91
+
92
+ // Utility functions
93
+ var processFieldValue = exports.processFieldValue = function processFieldValue(fieldValue, type, datafield) {
94
+ // If fieldValue is an object and datafield is specified, extract the value
95
+ if (fieldValue && (0, _typeof2["default"])(fieldValue) === "object" && !Array.isArray(fieldValue) && datafield) {
96
+ fieldValue = datafield === "All Fields" ? fieldValue : fieldValue[datafield];
97
+ }
98
+ if (type === "number") {
99
+ return fieldValue === "" || fieldValue === null || fieldValue === undefined ? "" : fieldValue;
100
+ }
101
+ return fieldValue;
102
+ };
103
+ var getErrorState = exports.getErrorState = function getErrorState(fieldState, validationType, touched) {
104
+ switch (validationType) {
105
+ case "default":
106
+ return {
107
+ error: touched && !!fieldState.error,
108
+ errorMessage: touched && fieldState.error ? fieldState.error.message : undefined,
109
+ fieldState: fieldState
110
+ };
111
+ case "html":
112
+ return {
113
+ error: touched && !!fieldState.error,
114
+ errorMessage: touched && fieldState.error ? fieldState.error.message : undefined,
115
+ fieldState: fieldState
116
+ };
117
+ case "none":
118
+ return {
119
+ error: false,
120
+ errorMessage: undefined,
121
+ fieldState: _objectSpread(_objectSpread({}, fieldState), {}, {
122
+ error: undefined
123
+ })
124
+ };
125
+ default:
126
+ return {
127
+ error: false,
128
+ errorMessage: undefined,
129
+ fieldState: undefined
130
+ };
131
+ }
132
+ };
133
+ var shouldShowErrorMessage = exports.shouldShowErrorMessage = function shouldShowErrorMessage(validationType, fieldState, touched) {
134
+ return validationType !== "none" && (validationType === "default" && fieldState.error || validationType === "html" && fieldState.error);
135
+ };
@@ -8,171 +8,20 @@ Object.defineProperty(exports, "__esModule", {
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 _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
11
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
12
  var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
14
- var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
15
14
  var _reactHookForm = require("react-hook-form");
16
15
  var _clsx = _interopRequireDefault(require("clsx"));
17
- var _validationContrustor = require("@wavemaker/react-runtime/components/data/form/form-controller/validation-contrustor");
18
16
  var _WidgetProvider = require("@wavemaker/react-runtime/context/WidgetProvider");
19
17
  var _formContext = require("@wavemaker/react-runtime/components/data/form/form-context");
20
18
  var _utils = require("./utils");
19
+ var _hooks = require("./hooks");
21
20
  var _excluded = ["formRef", "formKey", "name", "datavalue", "maxDataValue", "isMaxWidget", "defaultvalue", "validators", "asyncValidators", "required", "maxchars", "minvalue", "maxvalue", "regexp", "validationmessage", "hint", "type", "observe", "onBlur", "fieldName"];
22
21
  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); }
23
22
  var __jsx = _react["default"].createElement;
24
23
  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; }
25
24
  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; }
26
- // Custom hooks for better separation of concerns
27
- var useFormRegistration = function useFormRegistration(name, fieldProxy, contextFormRef) {
28
- var hasRegisteredRef = (0, _react.useRef)(false);
29
- (0, _react.useEffect)(function () {
30
- if (contextFormRef !== null && contextFormRef !== void 0 && contextFormRef.registerFormWidget && fieldProxy && !hasRegisteredRef.current) {
31
- contextFormRef.registerFormWidget(name, fieldProxy);
32
- hasRegisteredRef.current = true;
33
- }
34
- }, [fieldProxy, name, contextFormRef]);
35
- };
36
- var useExternalDataSync = function useExternalDataSync(datavalue, fieldRef) {
37
- (0, _react.useEffect)(function () {
38
- if (fieldRef.current && datavalue !== undefined) {
39
- var currentValue = fieldRef.current.value;
40
- if (currentValue !== datavalue) {
41
- fieldRef.current.onChange(datavalue);
42
- }
43
- }
44
- }, [datavalue]);
45
- };
46
- var useDefaultValueSync = function useDefaultValueSync(defaultvalue, datavalue, fieldRef) {
47
- var hasInitializedRef = (0, _react.useRef)(false);
48
- (0, _react.useEffect)(function () {
49
- // Only sync defaultvalue if:
50
- // 1. We haven't initialized yet
51
- // 2. There's a defaultvalue provided
52
- // 3. There's no datavalue (datavalue takes precedence)
53
- // 4. The field is registered
54
- if (!hasInitializedRef.current && defaultvalue !== undefined && datavalue === undefined && fieldRef.current) {
55
- var currentValue = fieldRef.current.value;
56
- if (currentValue === undefined || currentValue === null || currentValue === "") {
57
- fieldRef.current.onChange(defaultvalue);
58
- hasInitializedRef.current = true;
59
- }
60
- }
61
- }, [defaultvalue, datavalue]);
62
- };
63
- var useValidationRules = function useValidationRules(validationType, validators, asyncValidators, required, maxchars, regexp, validationmessage, minvalue, maxvalue, form) {
64
- if (validationType === "none") {
65
- return {};
66
- }
67
- var combinedValidators = [].concat((0, _toConsumableArray2["default"])(validators || []), (0, _toConsumableArray2["default"])(asyncValidators || []));
68
- var hasValidatorType = function hasValidatorType(type) {
69
- return validators === null || validators === void 0 ? void 0 : validators.some(function (v) {
70
- return typeof v !== "function" && v.type === type;
71
- });
72
- };
73
- if (required && !hasValidatorType("required")) {
74
- combinedValidators.push({
75
- type: "required",
76
- validator: true,
77
- errorMessage: validationmessage || "This field is required"
78
- });
79
- }
80
- if (maxchars !== undefined) {
81
- combinedValidators.push({
82
- type: "maxchars",
83
- validator: maxchars,
84
- errorMessage: validationmessage || "Maximum length is ".concat(maxchars, " characters.")
85
- });
86
- }
87
- var normalizedMin = minvalue !== undefined && minvalue !== null && minvalue !== "" ? Number(minvalue) : undefined;
88
- var normalizedMax = maxvalue !== undefined && maxvalue !== null && maxvalue !== "" ? Number(maxvalue) : undefined;
89
- if (normalizedMin !== undefined && !Number.isNaN(normalizedMin)) {
90
- combinedValidators.push({
91
- type: "minvalue",
92
- validator: normalizedMin,
93
- errorMessage: validationmessage || "Value must be greater than or equal to ".concat(normalizedMin, ".")
94
- });
95
- }
96
- if (normalizedMax !== undefined && !Number.isNaN(normalizedMax)) {
97
- combinedValidators.push({
98
- type: "maxvalue",
99
- validator: normalizedMax,
100
- errorMessage: validationmessage || "Value must be less than or equal to ".concat(normalizedMax, ".")
101
- });
102
- }
103
- if (regexp) {
104
- combinedValidators.push({
105
- type: "regexp",
106
- validator: regexp,
107
- errorMessage: validationmessage || "Invalid format."
108
- });
109
- }
110
- return (0, _validationContrustor.createValidationRules)(combinedValidators, form);
111
- };
112
- var useHTMLValidationProps = function useHTMLValidationProps(validationType, required, maxchars, regexp) {
113
- return (0, _react.useMemo)(function () {
114
- if (validationType !== "html") {
115
- return {};
116
- }
117
- var htmlProps = {};
118
- if (required) {
119
- htmlProps.required = true;
120
- }
121
- if (maxchars) {
122
- htmlProps.maxLength = maxchars;
123
- }
124
- if (regexp) {
125
- htmlProps.pattern = typeof regexp === "string" ? regexp : regexp.source;
126
- }
127
- return htmlProps;
128
- }, [validationType, required, maxchars, regexp]);
129
- };
130
-
131
- // Utility functions
132
- var processFieldValue = function processFieldValue(fieldValue, type, datafield) {
133
- // If fieldValue is an object and datafield is specified, extract the value
134
- if (fieldValue && (0, _typeof2["default"])(fieldValue) === "object" && !Array.isArray(fieldValue) && datafield) {
135
- fieldValue = datafield === "All Fields" ? fieldValue : fieldValue[datafield];
136
- }
137
- if (type === "number") {
138
- return fieldValue === "" || fieldValue === null || fieldValue === undefined ? "" : fieldValue;
139
- }
140
- return fieldValue;
141
- };
142
- var getErrorState = function getErrorState(fieldState, validationType, touched) {
143
- switch (validationType) {
144
- case "default":
145
- return {
146
- error: touched && !!fieldState.error,
147
- errorMessage: touched && fieldState.error ? fieldState.error.message : undefined,
148
- fieldState: fieldState
149
- };
150
- case "html":
151
- return {
152
- error: touched && !!fieldState.error,
153
- errorMessage: touched && fieldState.error ? fieldState.error.message : undefined,
154
- fieldState: fieldState
155
- };
156
- case "none":
157
- return {
158
- error: false,
159
- errorMessage: undefined,
160
- fieldState: _objectSpread(_objectSpread({}, fieldState), {}, {
161
- error: undefined
162
- })
163
- };
164
- default:
165
- return {
166
- error: false,
167
- errorMessage: undefined,
168
- fieldState: undefined
169
- };
170
- }
171
- };
172
- var shouldShowErrorMessage = function shouldShowErrorMessage(validationType, fieldState, touched) {
173
- return validationType !== "none" && (validationType === "default" && fieldState.error || validationType === "html" && fieldState.error);
174
- };
175
-
176
25
  // HOC function
177
26
  var withFormController = function withFormController(WrappedComponent) {
178
27
  var WithFormControllerComponent = /*#__PURE__*/(0, _react.memo)(function (props) {
@@ -230,17 +79,16 @@ var withFormController = function withFormController(WrappedComponent) {
230
79
  var validationType = (form === null || form === void 0 ? void 0 : form.validationtype) || (formRef === null || formRef === void 0 ? void 0 : formRef.validationtype) || "default";
231
80
 
232
81
  // Custom hooks
233
- useFormRegistration(name, fieldProxy, contextFormRef);
82
+ (0, _hooks.useFormRegistration)(name, fieldProxy, contextFormRef);
234
83
  // For max widgets: only sync maxdatavalue (don't sync datavalue as it shouldn't change)
235
84
  // For regular widgets: sync datavalue
236
85
  var syncValue = isMaxWidget ? maxDataValue !== undefined ? maxDataValue : undefined // Only sync maxDataValue for max widgets
237
86
  : datavalue !== undefined ? datavalue : undefined; // Sync datavalue for regular widgets
238
- useExternalDataSync(syncValue, fieldRef);
239
- useDefaultValueSync(defaultvalue, datavalue, fieldRef);
87
+ (0, _hooks.useDefaultValueSync)(defaultvalue, datavalue, fieldRef);
240
88
  // ignoring min/max range validation for Radioset and Checkboxset widgets
241
89
  var widget = WrappedComponent === null || WrappedComponent === void 0 ? void 0 : WrappedComponent.displayName;
242
90
  var ignoreRange = ["WmRadioset", "WmCheckboxset"].includes(widget !== null && widget !== void 0 ? widget : "");
243
- var validationRules = useValidationRules(validationType, validators, asyncValidators, required, maxchars, regexp, validationmessage, ignoreRange ? undefined : minvalue, ignoreRange ? undefined : maxvalue, form);
91
+ var validationRules = (0, _hooks.useValidationRules)(validationType, validators, asyncValidators, required, maxchars, regexp, validationmessage, ignoreRange ? undefined : minvalue, ignoreRange ? undefined : maxvalue, form);
244
92
  var rules = {
245
93
  required: required,
246
94
  maxchars: maxchars,
@@ -255,7 +103,7 @@ var withFormController = function withFormController(WrappedComponent) {
255
103
  maxdate: props.maxdate
256
104
  };
257
105
  var extractedValidatorProps = (0, _utils.extractDynamicValidationProps)(validators || [], rules);
258
- var htmlValidationProps = useHTMLValidationProps(validationType, required, maxchars, regexp);
106
+ var htmlValidationProps = (0, _hooks.useHTMLValidationProps)(validationType, required, maxchars, regexp);
259
107
 
260
108
  // Update observeRef when observe changes
261
109
  (0, _react.useEffect)(function () {
@@ -348,8 +196,8 @@ var withFormController = function withFormController(WrappedComponent) {
348
196
  fieldRef.current = field;
349
197
 
350
198
  // Process field value and get error state
351
- var processedValue = processFieldValue(field.value, type, props.datafield);
352
- var errorState = getErrorState(fieldState, validationType, touched);
199
+ var processedValue = (0, _utils.processFieldValue)(field.value, type, props.datafield);
200
+ var errorState = (0, _utils.getErrorState)(fieldState, validationType, touched);
353
201
 
354
202
  // Determine the value to use with proper fallback chain
355
203
  // Priority: field.value (if not undefined) -> datavalue (if not undefined) -> defaultvalue
@@ -428,7 +276,7 @@ var withFormController = function withFormController(WrappedComponent) {
428
276
  }
429
277
  }
430
278
  return value;
431
- }()), hint && !shouldShowErrorMessage(validationType, fieldState, touched) && __jsx("p", {
279
+ }()), hint && !(0, _utils.shouldShowErrorMessage)(validationType, fieldState, touched) && __jsx("p", {
432
280
  className: "help-block",
433
281
  "aria-hidden": "true",
434
282
  role: "alert",
@@ -437,7 +285,7 @@ var withFormController = function withFormController(WrappedComponent) {
437
285
  textAlign: "start",
438
286
  width: "100%"
439
287
  }
440
- }, hint), shouldShowErrorMessage(validationType, fieldState, touched) && __jsx("p", {
288
+ }, hint), (0, _utils.shouldShowErrorMessage)(validationType, fieldState, touched) && __jsx("p", {
441
289
  className: "help-block text-danger",
442
290
  "aria-hidden": "false",
443
291
  role: "alert",
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _formBody = _interopRequireDefault(require("../form-body"));
11
+ var _container = _interopRequireDefault(require("@wavemaker/react-runtime/components/container"));
12
+ var _dynamicFields = _interopRequireDefault(require("../dynamic-fields"));
13
+ 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); }
14
+ var __jsx = _react["default"].createElement;
15
+ var DYNAMIC_FORM_BODY_SUFFIX = "_dynamic_form_body";
16
+ var DYNAMIC_FORM_CONTAINER_SUFFIX = "_dynamic_form_container";
17
+ var DYNAMIC_FIELDS_SUFFIX = "_dynamic_fields";
18
+ function FormDynamicFieldsSectionComponent(_ref) {
19
+ var formName = _ref.formName,
20
+ metadata = _ref.metadata,
21
+ listener = _ref.listener;
22
+ var formBodyName = formName + DYNAMIC_FORM_BODY_SUFFIX;
23
+ var containerName = formName + DYNAMIC_FORM_CONTAINER_SUFFIX;
24
+ var dynamicFieldsName = formName + DYNAMIC_FIELDS_SUFFIX;
25
+ return __jsx(_formBody["default"], {
26
+ name: formBodyName,
27
+ listener: listener,
28
+ "data-widget-id": "widget-".concat(formName, "-dynamic-body")
29
+ }, __jsx(_container["default"], {
30
+ name: containerName,
31
+ listener: listener,
32
+ "data-widget-id": "widget-".concat(formName, "-dynamic-container"),
33
+ className: "dynamic-form-container"
34
+ }, __jsx(_dynamicFields["default"], {
35
+ name: dynamicFieldsName,
36
+ metadata: metadata,
37
+ listener: listener,
38
+ "data-widget-id": "widget-".concat(formName, "-dynamic-fields")
39
+ })));
40
+ }
41
+ function propsAreEqual(prev, next) {
42
+ return prev.formName === next.formName && prev.metadata === next.metadata;
43
+ }
44
+ var FormDynamicFieldsSection = /*#__PURE__*/(0, _react.memo)(FormDynamicFieldsSectionComponent, propsAreEqual);
45
+ FormDynamicFieldsSection.displayName = "FormDynamicFieldsSection";
46
+ var _default = exports["default"] = FormDynamicFieldsSection;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -12,6 +12,7 @@ var _withBaseWrapper = _interopRequireDefault(require("@wavemaker/react-runtime/
12
12
  var _message = require("@wavemaker/react-runtime/components/basic/message");
13
13
  var _baseForm = _interopRequireDefault(require("./base-form"));
14
14
  var _formHeader = _interopRequireDefault(require("./form-header"));
15
+ var _formDynamicSection = _interopRequireDefault(require("./form-dynamic-section"));
15
16
  var _attr = require("@wavemaker/react-runtime/utils/attr");
16
17
  var __jsx = _react["default"].createElement;
17
18
  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; }
@@ -19,6 +20,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
19
20
  var WmForm = function WmForm(props) {
20
21
  var _props$headerActions, _props$statusMessage, _props$statusMessage2, _props$statusMessage3, _props$statusMessage4;
21
22
  var shouldHideHeader = props.isLayoutDialog || props.isInsideWizard;
23
+ var shouldInjectDynamicFields = Array.isArray(props.metadata) && props.metadata.length > 0;
22
24
  return __jsx("form", (0, _extends2["default"])({}, (0, _attr.removeInvalidAttributes)(props), {
23
25
  hidden: props.hidden || false,
24
26
  name: props.name,
@@ -51,6 +53,9 @@ var WmForm = function WmForm(props) {
51
53
  close: props === null || props === void 0 ? void 0 : props.clearMessage,
52
54
  name: "",
53
55
  listener: {}
56
+ }), shouldInjectDynamicFields && __jsx(_formDynamicSection["default"], {
57
+ formName: props.name,
58
+ metadata: props.metadata
54
59
  }), props.children);
55
60
  };
56
61
  WmForm.displayName = "WmForm";
@@ -10,6 +10,7 @@ var _react = require("react");
10
10
  var _constants = require("../utils/constants");
11
11
  var _listHelpers = require("../utils/list-helpers");
12
12
  var _WidgetProvider = require("@wavemaker/react-runtime/context/WidgetProvider");
13
+ var _widgetInstanceUtils = require("../utils/widget-instance-utils");
13
14
  var useListEffects = exports.useListEffects = function useListEffects(props) {
14
15
  var name = props.name,
15
16
  navigation = props.navigation,
@@ -185,7 +186,13 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
185
186
  // Delay onSelect to ensure it fires after onRender
186
187
  // onRender is called synchronously in the ListItems component
187
188
  var timer = setTimeout(function () {
188
- onSelect(widgetInstance, listState.selectedItems[0]);
189
+ var selectedItem = listState.selectedItems[0];
190
+
191
+ // Attach context information to widget instance
192
+ if (selectedItem) {
193
+ (0, _widgetInstanceUtils.setWidgetIndexWithContext)(widgetInstance, items, selectedItem);
194
+ }
195
+ onSelect(widgetInstance, selectedItem);
189
196
  }, 0);
190
197
  return function () {
191
198
  return clearTimeout(timer);
@@ -193,8 +200,7 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
193
200
  }
194
201
  }
195
202
  }
196
- }, [selectfirstitem, listState.selectedItems]);
197
-
203
+ }, [selectfirstitem, listState.selectedItems, items]);
198
204
  // Effect 6: Handle selectfirstitem for grouped data
199
205
  (0, _react.useEffect)(function () {
200
206
  if (selectfirstitem && groupby && groupedData && groupedData.length > 0) {
@@ -210,6 +216,7 @@ var useListEffects = exports.useListEffects = function useListEffects(props) {
210
216
  // Delay onSelect to ensure it fires after onRender
211
217
  // onRender is called synchronously in the ListItems component
212
218
  var timer = setTimeout(function () {
219
+ (0, _widgetInstanceUtils.setWidgetIndexWithContext)(widgetInstance, items, firstItemInGroup);
213
220
  onSelect(widgetInstance, firstItemInGroup);
214
221
  }, 0);
215
222
  return function () {
@@ -11,6 +11,7 @@ var _react = require("react");
11
11
  var _lodashEs = require("lodash-es");
12
12
  var _listHelpers = require("../utils/list-helpers");
13
13
  var _WidgetProvider = require("@wavemaker/react-runtime/context/WidgetProvider");
14
+ var _widgetInstanceUtils = require("../utils/widget-instance-utils");
14
15
  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; }
15
16
  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; }
16
17
  /**
@@ -63,18 +64,15 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
63
64
 
64
65
  // Helper function to call onSelect and mark as user-initiated
65
66
  var callOnSelect = (0, _react.useCallback)(function (selectedItem) {
66
- if (onSelect && widgetInstance) {
67
+ if (onSelect && widgetInstance && selectedItem) {
67
68
  if (userInitiatedSelectionRef) {
68
69
  userInitiatedSelectionRef.current = true;
69
70
  }
70
- if (listener !== null && listener !== void 0 && listener.onChange) {
71
- listener.onChange(name, {
72
- selecteditem: multiselect ? selectedItemsRef.current : selectedItem
73
- });
74
- }
71
+ // Set $index on widget instance
72
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, selectedItem);
75
73
  onSelect(widgetInstance, selectedItem);
76
74
  }
77
- }, [onSelect, widgetInstance, userInitiatedSelectionRef]);
75
+ }, [onSelect, userInitiatedSelectionRef, items]);
78
76
  var handleListItemClick = (0, _react.useCallback)(function (event, item) {
79
77
  if (disableitem) return;
80
78
  var selectCount = selectedItems.length;
@@ -94,6 +92,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
94
92
  var end = (0, _lodashEs.max)([firstIndex, lastIndex]);
95
93
  var rangeCount = end - start + 1;
96
94
  if (selectionlimit > 0 && rangeCount > selectionlimit) {
95
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
97
96
  onSelectionlimitexceed === null || onSelectionlimitexceed === void 0 || onSelectionlimitexceed(event, widgetInstance);
98
97
  return;
99
98
  }
@@ -105,6 +104,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
105
104
  if (!isItemActive) {
106
105
  callOnSelect(item); // Pass the current item that triggered the range selection
107
106
  }
107
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
108
108
  onClick === null || onClick === void 0 || onClick(event, widgetInstance); // Use widgetInstance instead of item
109
109
  return;
110
110
  }
@@ -113,6 +113,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
113
113
  // Handle Ctrl+Click for individual item selection toggle
114
114
  if (event.ctrlKey) {
115
115
  if (selectionlimit > 0 && selectCount >= selectionlimit && !isItemSelected) {
116
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
116
117
  onSelectionlimitexceed === null || onSelectionlimitexceed === void 0 || onSelectionlimitexceed(event, widgetInstance);
117
118
  return;
118
119
  }
@@ -171,21 +172,21 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
171
172
  // If item is already selected, do nothing (don't deselect)
172
173
  }
173
174
  (0, _listHelpers.getSelectedItemWidgets)(event, listener, name || "", item || null, Widgets);
174
- if (widgetInstance) {
175
- delete widgetInstance._wmListItemId;
176
- widgetInstance.item = item;
177
- }
175
+ (0, _widgetInstanceUtils.setWidgetItem)(widgetInstance, items, item);
178
176
  onClick === null || onClick === void 0 || onClick(event, widgetInstance); // Use widgetInstance instead of item
179
177
  }, [disableitem, selectedItems, multiselect, firstSelectedItem, items, selectionlimit, activeItems, setSelectedItems, setActiveItems, setFirstSelectedItem, onSelectionlimitexceed, onClick, callOnSelect]);
180
178
  var handleListItemDoubleClick = (0, _react.useCallback)(function (event, item) {
179
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
181
180
  onDblclick === null || onDblclick === void 0 || onDblclick(event, widgetInstance); // Use widgetInstance instead of item
182
- }, [onDblclick]);
181
+ }, [onDblclick, items]);
183
182
  var handleListItemMouseEnter = (0, _react.useCallback)(function (event, item) {
183
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
184
184
  onMouseEnter === null || onMouseEnter === void 0 || onMouseEnter(event, widgetInstance); // Use widgetInstance instead of item
185
- }, [onMouseEnter]);
185
+ }, [onMouseEnter, items]);
186
186
  var handleListItemMouseLeave = (0, _react.useCallback)(function (event, item) {
187
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
187
188
  onMouseLeave === null || onMouseLeave === void 0 || onMouseLeave(event, widgetInstance); // Use widgetInstance instead of item
188
- }, [onMouseLeave]);
189
+ }, [onMouseLeave, items]);
189
190
  var handleHeaderClick = (0, _react.useCallback)(function (groupKey) {
190
191
  if (collapsible) {
191
192
  setGroupCollapsed(_objectSpread(_objectSpread({}, groupCollapsed), {}, (0, _defineProperty2["default"])({}, groupKey, !groupCollapsed[groupKey])));
@@ -197,6 +198,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
197
198
  setCurrentPage(index);
198
199
 
199
200
  // Trigger the callbacks - datasource handling is now done in usePagination hook
201
+ (0, _widgetInstanceUtils.setWidgetPageIndex)(widgetInstance, index);
200
202
  onPaginationchange === null || onPaginationchange === void 0 || onPaginationchange(event, widgetInstance, index);
201
203
  onPageChange === null || onPageChange === void 0 || onPageChange(event, index);
202
204
  }
@@ -204,9 +206,10 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
204
206
  var handleSetRecord = (0, _react.useCallback)(function (event, widget, index, data) {
205
207
  if (index) {
206
208
  setCurrentPage(index);
209
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, data);
207
210
  onSetrecord === null || onSetrecord === void 0 || onSetrecord(event, widgetInstance, index, data);
208
211
  }
209
- }, [setCurrentPage, onSetrecord]);
212
+ }, [setCurrentPage, onSetrecord, items]);
210
213
  var handlePageChange = (0, _react.useCallback)(function (page) {
211
214
  // Update the current page
212
215
  setCurrentPage(page);
@@ -222,6 +225,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
222
225
  });
223
226
  Promise.resolve(invokeResult).then(function () {
224
227
  // Trigger the callbacks after successful data fetch
228
+ (0, _widgetInstanceUtils.setWidgetPageIndex)(widgetInstance, page);
225
229
  onPaginationchange === null || onPaginationchange === void 0 || onPaginationchange(null, widgetInstance, page);
226
230
  onPageChange === null || onPageChange === void 0 || onPageChange(null, page);
227
231
  setIsLoadingMore(false);
@@ -233,6 +237,7 @@ var useListEventHandlers = exports.useListEventHandlers = function useListEventH
233
237
  });
234
238
  } else {
235
239
  // For client-side pagination, just trigger callbacks
240
+ (0, _widgetInstanceUtils.setWidgetPageIndex)(widgetInstance, page);
236
241
  onPaginationchange === null || onPaginationchange === void 0 || onPaginationchange(null, widgetInstance, page);
237
242
  onPageChange === null || onPageChange === void 0 || onPageChange(null, page);
238
243
  }
@@ -33,7 +33,7 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
33
33
  // Import components
34
34
  // Import utilities
35
35
  var WmList = function WmList(props) {
36
- var _listener$Widgets, _paginationState$pagi5, _paginationState$pagi6;
36
+ var _listener$Widgets, _paginationState$pagi5, _paginationState$pagi6, _datasource$loading;
37
37
  // ==================== PROPS DESTRUCTURING ====================
38
38
  var className = props.className,
39
39
  styles = props.styles,
@@ -161,10 +161,11 @@ var WmList = function WmList(props) {
161
161
  var _useState = (0, _react.useState)(false),
162
162
  isDatasetFromModalVariable = _useState[0],
163
163
  setIsDatasetFromModalVariable = _useState[1];
164
+ var resolvedDataset = (0, _listHelpers.getSafeDataset)(dataset);
164
165
 
165
166
  // Calculate hash of dataset content to detect mutations
166
167
  // This runs every render but is lightweight compared to recalculating safeDataset
167
- var datasetHash = Array.isArray(dataset) && (dataset !== null && dataset !== void 0 ? dataset : []).map(function (item, idx) {
168
+ var datasetHash = Array.isArray(resolvedDataset) && (resolvedDataset !== null && resolvedDataset !== void 0 ? resolvedDataset : []).map(function (item, idx) {
168
169
  if (!item || (0, _typeof2["default"])(item) !== "object") {
169
170
  return "".concat(idx, ":").concat(item);
170
171
  }
@@ -172,8 +173,7 @@ var WmList = function WmList(props) {
172
173
  return "".concat(idx, ":").concat(Object.values(item).join("-"));
173
174
  }).join("|");
174
175
  var safeDataset = (0, _react.useMemo)(function () {
175
- var data = (0, _listHelpers.getSafeDataset)(dataset);
176
- return (0, _utils.addUniqueRowIds)(data, {
176
+ return (0, _utils.addUniqueRowIds)(resolvedDataset, {
177
177
  type: "list"
178
178
  });
179
179
  }, [datasetHash]);
@@ -520,11 +520,10 @@ var WmList = function WmList(props) {
520
520
  title: title,
521
521
  subheading: subheading,
522
522
  iconclass: iconclass
523
- }), datasource !== null && datasource !== void 0 && datasource.loading ? __jsx(_common.AppSpinner, {
524
- show: true,
523
+ }), __jsx(_common.AppSpinner, {
524
+ show: (_datasource$loading = datasource === null || datasource === void 0 ? void 0 : datasource.loading) !== null && _datasource$loading !== void 0 ? _datasource$loading : false,
525
525
  spinnermessages: [loadingdatamsg]
526
- }) : /* Main Content */
527
- __jsx(_components.InlineNavigation, {
526
+ }), __jsx(_components.InlineNavigation, {
528
527
  navigation: navigation,
529
528
  currentPage: paginationState.currentPage,
530
529
  totalPages: paginationState.effectiveTotalPages,
@@ -55,13 +55,33 @@ var getTextAlignClass = exports.getTextAlignClass = function getTextAlignClass(a
55
55
  return "text-left";
56
56
  }
57
57
  };
58
+ var flattenIfArrayOfArrays = function flattenIfArrayOfArrays(arr) {
59
+ if (arr.length === 0) return arr;
60
+ var first = arr[0];
61
+ if (Array.isArray(first) && arr.every(function (x) {
62
+ return Array.isArray(x);
63
+ })) {
64
+ return arr.flat();
65
+ }
66
+ return Array.isArray(arr) ? arr : [];
67
+ };
58
68
 
59
69
  /**
60
70
  * Get safe dataset ensuring it's always an array
61
71
  * @param dataset - Input dataset of any type
62
72
  * @returns Array dataset with proper typing
63
73
  */
64
- var getSafeDataset = exports.getSafeDataset = function getSafeDataset(dataset) {
74
+ var _getSafeDataset = exports.getSafeDataset = function getSafeDataset(dataset) {
75
+ if (typeof dataset === "function") {
76
+ try {
77
+ return _getSafeDataset(dataset());
78
+ } catch (_unused) {
79
+ return [];
80
+ }
81
+ }
82
+ if (Array.isArray(dataset)) {
83
+ return flattenIfArrayOfArrays(dataset);
84
+ }
65
85
  if (typeof dataset === "string") {
66
86
  try {
67
87
  var parsedData = dataset.split(",").map(function (str) {
@@ -7,6 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.useListWidgetMethods = void 0;
8
8
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
9
9
  var _lodashEs = require("lodash-es");
10
+ var _widgetInstanceUtils = require("./widget-instance-utils");
10
11
  var useListWidgetMethods = exports.useListWidgetMethods = function useListWidgetMethods(items, listState, multiselect, onSelect, widgetInstance, listener, userInitiatedSelectionRef, name, Widgets, size, setIsListCleared, handlePageSizeChange) {
11
12
  // Return methods object directly without useMemo to avoid infinite re-renders
12
13
  // Methods always have access to current values through closure
@@ -56,6 +57,7 @@ var useListWidgetMethods = exports.useListWidgetMethods = function useListWidget
56
57
  listState.setFirstSelectedItem(item);
57
58
  }
58
59
  if (onSelect && widgetInstance && !statePersistenceTriggered) {
60
+ (0, _widgetInstanceUtils.setWidgetIndex)(widgetInstance, items, item);
59
61
  onSelect(widgetInstance, item);
60
62
  }
61
63
  }