@wavemaker-ai/react-runtime 1.0.0-rc.314 → 1.0.0-rc.319

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 (207) hide show
  1. package/actions/navigation-action.d.ts +1 -0
  2. package/actions/navigation-action.js +34 -9
  3. package/components/advanced/carousel/index.d.ts +2 -0
  4. package/components/advanced/carousel/template.d.ts +2 -0
  5. package/components/advanced/login/index.d.ts +2 -0
  6. package/components/advanced/marquee/index.d.ts +2 -0
  7. package/components/auth/RoleAuthGuard.d.ts +6 -0
  8. package/components/auth/RoleAuthGuard.js +66 -0
  9. package/components/basic/anchor/index.d.ts +2 -0
  10. package/components/basic/anchor/index.js +1 -1
  11. package/components/basic/audio/index.d.ts +2 -0
  12. package/components/basic/html/index.d.ts +2 -0
  13. package/components/basic/icon/index.d.ts +2 -0
  14. package/components/basic/iframe/index.d.ts +2 -0
  15. package/components/basic/label/index.d.ts +2 -0
  16. package/components/basic/label/index.js +17 -3
  17. package/components/basic/picture/index.d.ts +2 -0
  18. package/components/basic/picture/index.js +20 -1
  19. package/components/basic/progress-bar/index.d.ts +2 -0
  20. package/components/basic/progress-circle/index.d.ts +2 -0
  21. package/components/basic/progress-circle/index.js +2 -1
  22. package/components/basic/richtexteditor/index.d.ts +4 -0
  23. package/components/basic/richtexteditor/index.js +16 -15
  24. package/components/basic/search/index.d.ts +4 -0
  25. package/components/basic/search/index.js +2 -1
  26. package/components/basic/search/providers.js +2 -2
  27. package/components/basic/spinner/index.d.ts +2 -0
  28. package/components/basic/tile/index.d.ts +2 -0
  29. package/components/basic/tree/Components/TreeNodeComponent.d.ts +1 -1
  30. package/components/basic/tree/Components/TreeNodeComponent.js +14 -8
  31. package/components/basic/tree/hooks/useTreePersistedState.d.ts +3 -0
  32. package/components/basic/tree/hooks/useTreePersistedState.js +38 -0
  33. package/components/basic/tree/index.d.ts +3 -0
  34. package/components/basic/tree/index.js +105 -30
  35. package/components/basic/tree/props.d.ts +18 -1
  36. package/components/basic/tree/utils.d.ts +16 -1
  37. package/components/basic/tree/utils.js +111 -0
  38. package/components/basic/video/index.d.ts +2 -0
  39. package/components/chart/index.d.ts +2 -0
  40. package/components/chart/src/dataUtils.js +1 -1
  41. package/components/common/customTemplate/useCustomTemplate.js +1 -1
  42. package/components/common/index.d.ts +2 -0
  43. package/components/common/index.js +5 -1
  44. package/components/common/wm-skeleton.d.ts +95 -0
  45. package/components/common/wm-skeleton.js +346 -0
  46. package/components/container/accordion/accordion-pane/index.d.ts +2 -0
  47. package/components/container/accordion/index.d.ts +4 -0
  48. package/components/container/accordion/index.js +23 -1
  49. package/components/container/accordion/props.d.ts +10 -0
  50. package/components/container/index.d.ts +2 -0
  51. package/components/container/index.js +2 -4
  52. package/components/container/layout-grid/grid-column/index.d.ts +2 -0
  53. package/components/container/layout-grid/grid-column/index.js +2 -1
  54. package/components/container/layout-grid/grid-row/index.d.ts +2 -0
  55. package/components/container/layout-grid/index.d.ts +2 -0
  56. package/components/container/linear-layout/index.d.ts +2 -0
  57. package/components/container/linear-layout/linear-layout-item/index.d.ts +2 -0
  58. package/components/container/panel/index.d.ts +2 -0
  59. package/components/container/repeat-template/index.d.ts +2 -0
  60. package/components/container/tabs/index.d.ts +4 -0
  61. package/components/container/tabs/index.js +23 -1
  62. package/components/container/tabs/props.d.ts +10 -0
  63. package/components/container/tabs/tab-pane/index.d.ts +2 -0
  64. package/components/container/wizard/index.d.ts +8 -0
  65. package/components/container/wizard/index.js +27 -3
  66. package/components/container/wizard/props.d.ts +10 -0
  67. package/components/container/wizard/wizard-step/index.d.ts +2 -0
  68. package/components/data/card/card-actions/index.d.ts +2 -0
  69. package/components/data/card/card-content/index.d.ts +2 -0
  70. package/components/data/card/card-footer/index.d.ts +2 -0
  71. package/components/data/card/index.d.ts +2 -0
  72. package/components/data/card/index.js +12 -6
  73. package/components/data/form/base-form/hooks/useFormOperations.d.ts +1 -1
  74. package/components/data/form/base-form/hooks/useFormOperations.js +3 -3
  75. package/components/data/form/base-form/index.js +33 -26
  76. package/components/data/form/base-form/props.d.ts +1 -1
  77. package/components/data/form/dynamic-fields/index.js +3 -0
  78. package/components/data/form/form-action/index.d.ts +4 -0
  79. package/components/data/form/form-controller/hooks/index.js +2 -1
  80. package/components/data/form/form-controller/withFormController.js +14 -23
  81. package/components/data/form/form-field/base-field.js +0 -5
  82. package/components/data/form/form-field/index.js +99 -13
  83. package/components/data/form/form-field/props.d.ts +8 -0
  84. package/components/data/form/index.js +13 -0
  85. package/components/data/list/index.d.ts +7 -0
  86. package/components/data/list/index.js +18 -0
  87. package/components/data/list/props.d.ts +7 -0
  88. package/components/data/pagination/hooks/usePagination.js +0 -1
  89. package/components/data/table/components/RowCells.js +4 -1
  90. package/components/data/table/hooks/useDynamicColumns.js +3 -1
  91. package/components/data/table/hooks/useResponsiveColumns.d.ts +2 -0
  92. package/components/data/table/index.d.ts +8 -0
  93. package/components/data/table/index.js +20 -2
  94. package/components/data/table/live-table/index.d.ts +2 -0
  95. package/components/data/table/props.d.ts +10 -0
  96. package/components/data/table/table-action/index.d.ts +2 -0
  97. package/components/data/table/table-column/index.d.ts +2 -0
  98. package/components/data/table/table-row/index.d.ts +2 -0
  99. package/components/data/table/table-row-action/index.d.ts +2 -0
  100. package/components/data/table/utils/columnBuilder.d.ts +1 -1
  101. package/components/data/table/utils/columnBuilder.js +7 -4
  102. package/components/data/table/utils/crud-handlers.js +10 -10
  103. package/components/data/table/utils/index.d.ts +11 -8
  104. package/components/data/table/utils/index.js +90 -12
  105. package/components/dialogs/alert-dialog/index.d.ts +4 -0
  106. package/components/dialogs/confirm-dialog/index.d.ts +4 -0
  107. package/components/dialogs/dialog/index.d.ts +4 -0
  108. package/components/dialogs/dialog-actions/index.d.ts +2 -0
  109. package/components/dialogs/dialog-body/index.d.ts +2 -0
  110. package/components/dialogs/dialog-content/index.d.ts +2 -0
  111. package/components/dialogs/dialog-header/index.d.ts +2 -0
  112. package/components/dialogs/iframe-dialog/index.d.ts +4 -0
  113. package/components/dialogs/login-dialog/index.d.ts +4 -0
  114. package/components/dialogs/page-dialog/index.d.ts +4 -0
  115. package/components/form/button/index.d.ts +2 -0
  116. package/components/form/button/index.js +10 -1
  117. package/components/form/button-group/index.d.ts +2 -0
  118. package/components/input/calendar/index.d.ts +4 -0
  119. package/components/input/calendar/index.js +2 -1
  120. package/components/input/chips/index.d.ts +4 -0
  121. package/components/input/color-picker/index.d.ts +4 -0
  122. package/components/input/color-picker/index.js +18 -7
  123. package/components/input/composite/index.d.ts +2 -0
  124. package/components/input/currency/index.d.ts +4 -0
  125. package/components/input/default/checkbox/index.d.ts +4 -0
  126. package/components/input/default/checkboxset/index.d.ts +4 -0
  127. package/components/input/default/checkboxset/index.js +7 -5
  128. package/components/input/default/radioset/index.d.ts +4 -0
  129. package/components/input/default/radioset/index.js +2 -1
  130. package/components/input/default/switch/index.d.ts +4 -0
  131. package/components/input/default/switch/index.js +17 -13
  132. package/components/input/epoch/date/index.d.ts +2 -0
  133. package/components/input/epoch/date/index.js +30 -14
  134. package/components/input/epoch/datetime/index.d.ts +2 -0
  135. package/components/input/epoch/datetime/index.js +12 -8
  136. package/components/input/epoch/time/index.d.ts +2 -0
  137. package/components/input/epoch/time/index.js +21 -15
  138. package/components/input/fileupload/index.d.ts +2 -0
  139. package/components/input/number/index.d.ts +4 -0
  140. package/components/input/number/index.js +4 -3
  141. package/components/input/rating/index.d.ts +4 -0
  142. package/components/input/select/index.d.ts +4 -0
  143. package/components/input/slider/index.d.ts +4 -0
  144. package/components/input/slider/index.js +4 -2
  145. package/components/input/text/index.d.ts +4 -0
  146. package/components/input/text/index.js +16 -8
  147. package/components/input/textarea/index.d.ts +4 -0
  148. package/components/input/upload/index.d.ts +4 -0
  149. package/components/input/upload/index.js +6 -4
  150. package/components/layout/leftnav/index.js +21 -2
  151. package/components/layout/leftnav/props.d.ts +9 -0
  152. package/components/layout/leftnav/utils/page-class-util.d.ts +9 -0
  153. package/components/layout/leftnav/utils/page-class-util.js +28 -0
  154. package/components/navbar/index.d.ts +2 -0
  155. package/components/navbar/nav/index.d.ts +2 -0
  156. package/components/navbar/nav-item/index.d.ts +2 -0
  157. package/components/navigation/breadcrumb/index.d.ts +2 -0
  158. package/components/navigation/menu/index.d.ts +2 -0
  159. package/components/navigation/menu/index.js +2 -2
  160. package/components/navigation/popover/index.d.ts +2 -0
  161. package/components/navigation/popover/index.js +1 -0
  162. package/components/page/index.js +22 -6
  163. package/components/page/page-context.d.ts +4 -0
  164. package/components/page/page-context.js +5 -0
  165. package/components/page/partial/index.d.ts +2 -0
  166. package/components/page/partial-container/index.js +1 -4
  167. package/context/AppContext.d.ts +2 -0
  168. package/context/AppContext.js +20 -1
  169. package/context/WidgetProvider.js +0 -3
  170. package/core/proxy-service.d.ts +2 -0
  171. package/core/proxy-service.js +25 -0
  172. package/higherOrder/BaseApp.js +5 -6
  173. package/higherOrder/BaseAppProps.d.ts +1 -0
  174. package/higherOrder/BasePage.js +4 -12
  175. package/higherOrder/props.d.ts +10 -0
  176. package/higherOrder/withBaseWrapper.js +3 -0
  177. package/hooks/useAuth.js +3 -0
  178. package/hooks/useDataSourceSubscription.js +1 -1
  179. package/hooks/useHttp.js +0 -4
  180. package/hooks/useLayoutSize.d.ts +6 -0
  181. package/hooks/useLayoutSize.js +12 -0
  182. package/package-lock.json +229 -203
  183. package/package.json +3 -3
  184. package/runtime-dynamic/app-initializer.js +1 -1
  185. package/runtime-dynamic/components/use-dynamic-component.js +12 -31
  186. package/runtime-dynamic/factories/build-base-page-like-component.d.ts +1 -1
  187. package/runtime-dynamic/factories/dynamic-component.js +9 -1
  188. package/runtime-dynamic/factories/prefab-factory.d.ts +1 -1
  189. package/runtime-dynamic/factories/utils.d.ts +1 -1
  190. package/runtime-dynamic/main.js +1 -3
  191. package/runtime-dynamic/services/component-ref-provider.d.ts +19 -4
  192. package/runtime-dynamic/services/component-ref-provider.js +18 -38
  193. package/runtime-dynamic/services/index.d.ts +2 -3
  194. package/runtime-dynamic/services/index.js +1 -18
  195. package/runtime-dynamic/services/resource-manager.d.ts +2 -3
  196. package/runtime-dynamic/services/resource-manager.js +13 -17
  197. package/runtime-dynamic/services/script-executor.js +5 -8
  198. package/runtime-dynamic/services/variable-registry.js +3 -4
  199. package/utils/attr.js +1 -9
  200. package/utils/custom-expression/index.js +4 -1
  201. package/utils/custom-expression/parser.js +4 -2
  202. package/utils/format-util.js +2 -3
  203. package/utils/state-persistance.d.ts +1 -1
  204. package/runtime-dynamic/services/cache.d.ts +0 -29
  205. package/runtime-dynamic/services/cache.js +0 -51
  206. package/utils/form-state.util.d.ts +0 -62
  207. package/utils/form-state.util.js +0 -109
@@ -39,8 +39,12 @@ const TreeNodeComponent = React.memo(
39
39
  depth = 0,
40
40
  treeName,
41
41
  template,
42
- listener
42
+ listener,
43
+ urlExpansionOverlay,
44
+ urlSelectedId
43
45
  }) => {
46
+ const isNodeOpen = node.open || !!(urlExpansionOverlay == null ? void 0 : urlExpansionOverlay.has(node.nodeId));
47
+ const isSelected = (selectedItem == null ? void 0 : selectedItem.nodeId) === node.nodeId || urlSelectedId === node.nodeId;
44
48
  const hasChildren = node.children && node.children.length > 0;
45
49
  const disabledClassName = useMemo(() => {
46
50
  return isTreeNodeDisabled(node.data) ? "wm-tree-node-disabled" : "";
@@ -79,7 +83,7 @@ const TreeNodeComponent = React.memo(
79
83
  "button",
80
84
  `level${depth}`,
81
85
  "switch",
82
- depth === 0 ? node.open ? "roots_open" : "roots_close" : node.open ? "bottom_open" : "bottom_close",
86
+ depth === 0 ? isNodeOpen ? "roots_open" : "roots_close" : isNodeOpen ? "bottom_open" : "bottom_close",
83
87
  treeicons,
84
88
  "treenode_switch",
85
89
  disabledClassName
@@ -156,7 +160,7 @@ const TreeNodeComponent = React.memo(
156
160
  `level${depth}`,
157
161
  !template && "glyphicon",
158
162
  !template && (node.icon || "glyphicon-music"),
159
- { curSelectedNode: (selectedItem == null ? void 0 : selectedItem.nodeId) === node.nodeId },
163
+ { curSelectedNode: isSelected },
160
164
  "treenode_a",
161
165
  disabledClassName
162
166
  ),
@@ -181,7 +185,7 @@ const TreeNodeComponent = React.memo(
181
185
  };
182
186
  const renderChildNodes = () => {
183
187
  if (!hasChildren) return null;
184
- return /* @__PURE__ */ jsx(Collapse, { in: !!node.open, timeout: "auto", unmountOnExit: false, children: /* @__PURE__ */ jsx(
188
+ return /* @__PURE__ */ jsx(Collapse, { in: isNodeOpen, timeout: "auto", unmountOnExit: false, children: /* @__PURE__ */ jsx(
185
189
  Box,
186
190
  {
187
191
  component: "ul",
@@ -189,7 +193,7 @@ const TreeNodeComponent = React.memo(
189
193
  `level${depth}`,
190
194
  "line",
191
195
  "wm-tree-children-list",
192
- node.open ? "wm-tree-children-open" : "wm-tree-children-closed"
196
+ isNodeOpen ? "wm-tree-children-open" : "wm-tree-children-closed"
193
197
  ),
194
198
  id: `${node.tId}_ul`,
195
199
  children: node.children && node.children.map((childNode) => /* @__PURE__ */ jsx(
@@ -207,7 +211,9 @@ const TreeNodeComponent = React.memo(
207
211
  depth: depth + 1,
208
212
  treeName,
209
213
  template,
210
- listener
214
+ listener,
215
+ urlExpansionOverlay,
216
+ urlSelectedId
211
217
  },
212
218
  childNode.nodeId
213
219
  ))
@@ -219,10 +225,10 @@ const TreeNodeComponent = React.memo(
219
225
  __spreadProps(__spreadValues({
220
226
  component: "li",
221
227
  className: clsx(`level${depth}`, {
222
- selected: (selectedItem == null ? void 0 : selectedItem.nodeId) === node.nodeId
228
+ selected: isSelected
223
229
  }),
224
230
  id: node.tId,
225
- tabIndex: (selectedItem == null ? void 0 : selectedItem.nodeId) === node.nodeId ? 0 : -1
231
+ tabIndex: isSelected ? 0 : -1
226
232
  }, { treenode: "true" }), {
227
233
  children: [
228
234
  !template && renderExpandCollapseIcon(),
@@ -0,0 +1,3 @@
1
+ import { type Dispatch, type SetStateAction } from "react";
2
+ import type { TreeUrlState } from "../props";
3
+ export declare function useTreePersistedState(name: string, statehandler: string | undefined): readonly [TreeUrlState | null, Dispatch<SetStateAction<TreeUrlState | null>>];
@@ -0,0 +1,38 @@
1
+ import { useCallback, useEffect, useState } from "react";
2
+ import { getTreeState, saveTreeState } from "../utils";
3
+ const storageType = (statehandler) => {
4
+ if (statehandler === "localStorage" || statehandler === "sessionStorage" || statehandler === "URL") {
5
+ return statehandler;
6
+ }
7
+ return null;
8
+ };
9
+ function useTreePersistedState(name, statehandler) {
10
+ const storage = storageType(statehandler);
11
+ const [persisted, setPersisted] = useState(null);
12
+ useEffect(() => {
13
+ if (!storage || typeof window === "undefined") {
14
+ setPersisted(null);
15
+ return;
16
+ }
17
+ try {
18
+ setPersisted(getTreeState(name, storage));
19
+ } catch (e) {
20
+ setPersisted(null);
21
+ }
22
+ }, [name, storage]);
23
+ const setPersistedState = useCallback(
24
+ (update) => {
25
+ if (!storage) return;
26
+ setPersisted((prev) => {
27
+ const next = typeof update === "function" ? update(prev) : update;
28
+ saveTreeState(name, storage, next);
29
+ return next;
30
+ });
31
+ },
32
+ [name, storage]
33
+ );
34
+ return [persisted, setPersistedState];
35
+ }
36
+ export {
37
+ useTreePersistedState
38
+ };
@@ -30,6 +30,7 @@ declare const _default: React.ComponentType<{
30
30
  onSelect?: (event: React.MouseEvent, widget: any, item: any, path: string) => void;
31
31
  onCheck?: (event: React.MouseEvent, widget: any, item: any, checked: boolean) => void;
32
32
  template?: string;
33
+ statehandler?: string;
33
34
  standalone?: boolean;
34
35
  ref?: React.RefObject<HTMLElement> | React.RefObject<null>;
35
36
  animation?: string;
@@ -79,5 +80,7 @@ declare const _default: React.ComponentType<{
79
80
  updateon?: string;
80
81
  dataset?: any;
81
82
  prefabName?: string;
83
+ loading?: boolean;
84
+ showSkeleton?: boolean;
82
85
  }>;
83
86
  export default _default;
@@ -17,6 +17,18 @@ var __spreadValues = (a, b) => {
17
17
  return a;
18
18
  };
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
+ var __objRest = (source, exclude) => {
21
+ var target = {};
22
+ for (var prop in source)
23
+ if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
24
+ target[prop] = source[prop];
25
+ if (source != null && __getOwnPropSymbols)
26
+ for (var prop of __getOwnPropSymbols(source)) {
27
+ if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
28
+ target[prop] = source[prop];
29
+ }
30
+ return target;
31
+ };
20
32
  import { jsx } from "react/jsx-runtime";
21
33
  import { useState, useEffect, useMemo, useCallback, useRef } from "react";
22
34
  import clsx from "clsx";
@@ -34,11 +46,16 @@ import {
34
46
  generateUniqueNodeId,
35
47
  findNodeById,
36
48
  toggleExpansionInTree,
37
- isTreeNodeDisabled
49
+ isTreeNodeDisabled,
50
+ migrateLegacyTreeUrlState,
51
+ normalizeExpandedIds,
52
+ collectExpandedNodeIdsForUrl
38
53
  } from "./utils";
39
54
  import { useCustomTemplate } from "../../common/customTemplate";
55
+ import { useTreePersistedState } from "./hooks/useTreePersistedState";
40
56
  const DEFAULT_CLASS = "app-tree";
41
57
  const DEFAULT_TREE_ICON_CLASS = "plus-minus";
58
+ const persistenceEnabledFor = (statehandler) => statehandler === "URL" || statehandler === "localStorage" || statehandler === "sessionStorage";
42
59
  const WmTree = (props) => {
43
60
  var _a, _b;
44
61
  const {
@@ -64,8 +81,11 @@ const WmTree = (props) => {
64
81
  listener,
65
82
  width,
66
83
  height,
67
- template
84
+ template,
85
+ statehandler
68
86
  } = props;
87
+ const [persistedState, setPersistedState] = useTreePersistedState(name, statehandler);
88
+ const persistenceEnabled = persistenceEnabledFor(statehandler);
69
89
  const isCheckboxTree = (_a = className == null ? void 0 : className.includes("Checkbox")) != null ? _a : false;
70
90
  const isRadioTree = (_b = className == null ? void 0 : className.includes("Radio")) != null ? _b : false;
71
91
  const [treeNodes, setTreeNodes] = useState([]);
@@ -74,6 +94,7 @@ const WmTree = (props) => {
74
94
  const { templateName, setTemplate } = useCustomTemplate({ content: template, name });
75
95
  const treeNodesRef = useRef([]);
76
96
  treeNodesRef.current = treeNodes;
97
+ const skipNextPersistRef = useRef(false);
77
98
  const usedNodeIds = useRef(/* @__PURE__ */ new Set());
78
99
  const getNodesFromString = useCallback(
79
100
  (value) => {
@@ -128,7 +149,7 @@ const WmTree = (props) => {
128
149
  }, []);
129
150
  const toggleNodeExpansion = useCallback(
130
151
  (event, node) => {
131
- var _a2;
152
+ var _a2, _b2, _c;
132
153
  const ev = event != null ? event : {
133
154
  preventDefault: () => {
134
155
  },
@@ -144,34 +165,53 @@ const WmTree = (props) => {
144
165
  const after_nodeUpdate = findNodeById(updatedNodes, node.nodeId);
145
166
  treeNodesRef.current = updatedNodes;
146
167
  setTreeNodes(updatedNodes);
168
+ if (persistenceEnabled) {
169
+ setPersistedState((prevPersist) => {
170
+ const base = prevPersist && typeof prevPersist === "object" ? prevPersist : {};
171
+ return __spreadProps(__spreadValues({}, base), {
172
+ expanded: collectExpandedNodeIdsForUrl(updatedNodes)
173
+ });
174
+ });
175
+ }
147
176
  if (after_nodeUpdate && ev && name) {
148
177
  const path = getPath(after_nodeUpdate);
149
178
  if (after_nodeUpdate.open) {
150
179
  if (onExpand) {
151
- onExpand(ev, listener == null ? void 0 : listener.Widgets[name], after_nodeUpdate.data, path);
180
+ onExpand(ev, (_b2 = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _b2[name], after_nodeUpdate.data, path);
152
181
  }
153
182
  } else if (onCollapse) {
154
- onCollapse(ev, listener == null ? void 0 : listener.Widgets[name], after_nodeUpdate.data, path);
183
+ onCollapse(ev, (_c = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _c[name], after_nodeUpdate.data, path);
155
184
  }
156
185
  }
157
186
  },
158
- [getPath, name, onCollapse, onExpand]
187
+ [getPath, name, onCollapse, onExpand, persistenceEnabled]
159
188
  );
160
189
  const selectNode = useCallback(
161
190
  (event, node) => {
162
- var _a2, _b2;
191
+ var _a2, _b2, _c;
163
192
  if (!node) return;
164
193
  const resolvedTreeNode = (_a2 = findNodeById(treeNodesRef.current, node.nodeId)) != null ? _a2 : node;
165
194
  if (isTreeNodeDisabled(resolvedTreeNode.data)) return;
166
195
  setSelectedItem(resolvedTreeNode);
196
+ if (persistenceEnabled && !skipNextPersistRef.current) {
197
+ setPersistedState((prevPersist) => {
198
+ const base = prevPersist && typeof prevPersist === "object" ? prevPersist : {};
199
+ return __spreadProps(__spreadValues({}, base), { selected: resolvedTreeNode.nodeId });
200
+ });
201
+ }
167
202
  if (event && nodeclick === "expand" && ((_b2 = resolvedTreeNode.children) == null ? void 0 : _b2.length)) {
168
203
  toggleNodeExpansion(event, resolvedTreeNode);
169
204
  }
170
205
  if (onSelect && event && name) {
171
- onSelect(event, listener == null ? void 0 : listener.Widgets[name], resolvedTreeNode.data, getPath(resolvedTreeNode));
206
+ onSelect(
207
+ event,
208
+ (_c = listener == null ? void 0 : listener.Widgets) == null ? void 0 : _c[name],
209
+ resolvedTreeNode.data,
210
+ getPath(resolvedTreeNode)
211
+ );
172
212
  }
173
213
  },
174
- [name, nodeclick, onSelect, toggleNodeExpansion]
214
+ [name, nodeclick, onSelect, toggleNodeExpansion, persistenceEnabled]
175
215
  );
176
216
  const handleNodeClick = useCallback(
177
217
  (event, node) => {
@@ -274,32 +314,41 @@ const WmTree = (props) => {
274
314
  (nodeId) => {
275
315
  if (!nodeId) {
276
316
  setSelectedItem(null);
317
+ if (persistenceEnabled) {
318
+ setPersistedState((prevPersist) => {
319
+ if (!prevPersist || typeof prevPersist !== "object") return prevPersist;
320
+ const _a2 = prevPersist, { selected: _s } = _a2, rest = __objRest(_a2, ["selected"]);
321
+ return rest;
322
+ });
323
+ }
277
324
  return;
278
325
  }
279
326
  const node = findNodeById(treeNodes, nodeId);
280
327
  if (node) {
281
328
  if (isTreeNodeDisabled(node.data)) return;
329
+ skipNextPersistRef.current = true;
282
330
  selectNode(void 0, node);
331
+ skipNextPersistRef.current = false;
332
+ let working = treeNodesRef.current;
283
333
  if (isRadioTree) {
284
334
  setRadioSelectedNodeId(node.nodeId);
285
335
  const updateRadioState = (nodes, selectedNodeId) => {
286
- return nodes.map((node2) => {
336
+ return nodes.map((n) => {
287
337
  var _a2;
288
- const isChecked = node2.nodeId === selectedNodeId;
289
- const updatedNode = __spreadProps(__spreadValues({}, node2), {
338
+ const isChecked = n.nodeId === selectedNodeId;
339
+ const updatedNode = __spreadProps(__spreadValues({}, n), {
290
340
  checked: isChecked
291
341
  });
292
342
  if (updatedNode.data) {
293
343
  updatedNode.data = __spreadProps(__spreadValues({}, updatedNode.data), { checked: isChecked });
294
344
  }
295
- if ((_a2 = node2.children) == null ? void 0 : _a2.length) {
296
- updatedNode.children = updateRadioState(node2.children, selectedNodeId);
345
+ if ((_a2 = n.children) == null ? void 0 : _a2.length) {
346
+ updatedNode.children = updateRadioState(n.children, selectedNodeId);
297
347
  }
298
348
  return updatedNode;
299
349
  });
300
350
  };
301
- const updatedNodes = updateRadioState(treeNodes, node.nodeId);
302
- setTreeNodes(updatedNodes);
351
+ working = updateRadioState(working, node.nodeId);
303
352
  }
304
353
  let currentNode = node.parent;
305
354
  const nodesToExpand = [];
@@ -308,29 +357,46 @@ const WmTree = (props) => {
308
357
  currentNode = currentNode.parent;
309
358
  }
310
359
  if (nodesToExpand.length) {
311
- const updateNodeOpenState = (nodes, nodesToExpand2) => {
312
- return nodes.map((node2) => {
360
+ const updateNodeOpenState = (nodes, toExpand) => {
361
+ return nodes.map((n) => {
313
362
  var _a2;
314
- if (nodesToExpand2.some((n) => n.nodeId === node2.nodeId)) {
315
- return __spreadProps(__spreadValues({}, node2), {
363
+ if (toExpand.some((x) => x.nodeId === n.nodeId)) {
364
+ return __spreadProps(__spreadValues({}, n), {
316
365
  open: true,
317
- children: node2.children ? updateNodeOpenState(node2.children, nodesToExpand2) : void 0
366
+ children: n.children ? updateNodeOpenState(n.children, toExpand) : void 0
318
367
  });
319
- } else if ((_a2 = node2.children) == null ? void 0 : _a2.length) {
320
- return __spreadProps(__spreadValues({}, node2), { children: updateNodeOpenState(node2.children, nodesToExpand2) });
368
+ } else if ((_a2 = n.children) == null ? void 0 : _a2.length) {
369
+ return __spreadProps(__spreadValues({}, n), { children: updateNodeOpenState(n.children, toExpand) });
321
370
  }
322
- return node2;
371
+ return n;
323
372
  });
324
373
  };
325
- const updatedNodes = updateNodeOpenState(treeNodes, nodesToExpand);
326
- setTreeNodes(updatedNodes);
374
+ working = updateNodeOpenState(working, nodesToExpand);
375
+ }
376
+ treeNodesRef.current = working;
377
+ setTreeNodes(working);
378
+ if (persistenceEnabled) {
379
+ setPersistedState((prevPersist) => {
380
+ const base = prevPersist && typeof prevPersist === "object" ? prevPersist : {};
381
+ return __spreadProps(__spreadValues({}, base), {
382
+ selected: node.nodeId,
383
+ expanded: collectExpandedNodeIdsForUrl(working)
384
+ });
385
+ });
327
386
  }
328
387
  }
329
388
  },
330
- [isRadioTree, selectNode, treeNodes]
389
+ [isRadioTree, selectNode, persistenceEnabled, treeNodes]
331
390
  );
332
391
  const deselectById = useCallback(() => {
333
392
  setSelectedItem(null);
393
+ if (persistenceEnabled) {
394
+ setPersistedState((prevPersist) => {
395
+ if (!prevPersist || typeof prevPersist !== "object") return prevPersist;
396
+ const _a2 = prevPersist, { selected: _s } = _a2, rest = __objRest(_a2, ["selected"]);
397
+ return rest;
398
+ });
399
+ }
334
400
  if (isRadioTree) {
335
401
  setRadioSelectedNodeId(null);
336
402
  const clearCheckedState = (nodes) => {
@@ -348,8 +414,15 @@ const WmTree = (props) => {
348
414
  };
349
415
  setTreeNodes(clearCheckedState(treeNodes));
350
416
  }
351
- }, [isRadioTree]);
417
+ }, [isRadioTree, persistenceEnabled, treeNodes]);
352
418
  const sortedTreeNodes = useMemo(() => treeNodes, [treeNodes]);
419
+ const urlExpansionOverlay = useMemo(() => {
420
+ if (!persistenceEnabled || !sortedTreeNodes.length || !persistedState) return void 0;
421
+ const raw = Array.isArray(persistedState.expanded) && persistedState.expanded.length > 0 ? persistedState.expanded.map(String) : migrateLegacyTreeUrlState(persistedState);
422
+ if (!raw.length) return void 0;
423
+ return normalizeExpandedIds(sortedTreeNodes, raw);
424
+ }, [persistenceEnabled, sortedTreeNodes, persistedState]);
425
+ const urlSelectedId = persistenceEnabled ? persistedState == null ? void 0 : persistedState.selected : void 0;
353
426
  const prevDatasetRef = useRef(void 0);
354
427
  const prevGetNodesRef = useRef(null);
355
428
  useEffect(() => {
@@ -409,7 +482,7 @@ const WmTree = (props) => {
409
482
  setTemplate
410
483
  });
411
484
  }
412
- }, [selectById, deselectById]);
485
+ }, [name]);
413
486
  return /* @__PURE__ */ jsx(
414
487
  Box,
415
488
  {
@@ -438,7 +511,9 @@ const WmTree = (props) => {
438
511
  handleRadioSelect,
439
512
  treeName: name,
440
513
  template: template || templateName,
441
- listener
514
+ listener,
515
+ urlExpansionOverlay,
516
+ urlSelectedId
442
517
  },
443
518
  node.nodeId
444
519
  )) : /* @__PURE__ */ jsx("li", { className: "wm-tree-empty-message", children: "No tree data available" })
@@ -29,6 +29,17 @@ export interface TreeItem {
29
29
  tId?: string;
30
30
  isParent?: boolean;
31
31
  }
32
+ /** Persisted tree widget state shape (URL / localStorage / sessionStorage via wm_state). */
33
+ export type TreeUrlState = {
34
+ /** Node ids that are expanded (nested shells open). Ancestors need not be listed; they are implied. */
35
+ expanded?: string[];
36
+ /** Last selected node id (optional). */
37
+ selected?: string;
38
+ /** @deprecated Legacy shape — migrated on read */
39
+ id?: string;
40
+ open?: boolean;
41
+ parentNode?: string[];
42
+ };
32
43
  /**
33
44
  * Base props specific to the WmTree component.
34
45
  */
@@ -90,6 +101,8 @@ export interface TreeProps {
90
101
  **template**: partial name for custom node rendering .
91
102
  */
92
103
  template?: string;
104
+ /** Persist expansion/selection via `URL`, `localStorage`, or `sessionStorage` (wm_state). */
105
+ statehandler?: string;
93
106
  }
94
107
  /**
95
108
  * Combined props for the WmTree component, including base WaveMaker props.
@@ -113,7 +126,11 @@ export interface TreeNodeComponentProps {
113
126
  /** Partial name from {@link TreeProps.template}; replaces default row with partial UI when set */
114
127
  template?: string;
115
128
  /** Page / fragment listener for partial container + widget registry */
116
- listener?: Record<string, unknown>;
129
+ listener?: Record<string, unknown> | undefined;
130
+ /** Normalized expanded ids from URL (overlay until tree state hydrates) */
131
+ urlExpansionOverlay?: Set<string> | undefined;
132
+ /** Selected node id from URL persistence */
133
+ urlSelectedId?: string | undefined;
117
134
  }
118
135
  export type TreePartialNodeApi = {
119
136
  select: () => void;
@@ -1,4 +1,5 @@
1
- import { TreeNodeData, TreeItem, TreePartialNodeApi } from "./props";
1
+ import { type StorageType } from "@wavemaker-ai/react-runtime/utils/state-persistance";
2
+ import { TreeNodeData, TreeItem, TreePartialNodeApi, TreeUrlState } from "./props";
2
3
  /** Whether the dataset row (`node.data`) is disabled via its `disabled` property. */
3
4
  export declare const isTreeNodeDisabled: (data: TreeNodeData | undefined | null) => boolean;
4
5
  export declare const getNestedPropertyLocal: (obj: any, path: string) => any;
@@ -17,6 +18,20 @@ export declare const findNodeById: (nodes: TreeItem[], id: string) => TreeItem |
17
18
  * Used so partial templates can expand/collapse by id even when the passed-in `TreeItem`
18
19
  */
19
20
  export declare const toggleExpansionInTree: (nodes: TreeItem[], nodeId: string) => TreeItem[];
21
+ /** Migrate legacy `{ id, open, parentNode }` URL payloads to an `expanded` id list. */
22
+ export declare const migrateLegacyTreeUrlState: (raw: TreeUrlState | null | undefined) => string[];
23
+ /**
24
+ * Ensures all ancestors of every expanded id are included so nested paths reopen after refresh.
25
+ */
26
+ export declare const normalizeExpandedIds: (tree: TreeItem[], expandedIds: Iterable<string>) => Set<string>;
27
+ /**
28
+ * Node ids that are expanded **in the visible tree** (parent chain must be open / pre-open).
29
+ * Descendants of a collapsed branch are omitted even if `open` flags were left true internally.
30
+ */
31
+ export declare const collectExpandedNodeIdsForUrl: (nodes: TreeItem[]) => string[];
32
+ export declare const saveTreeState: (name: string, storage: StorageType, stateToSave: Partial<TreeUrlState> | null) => void;
33
+ export declare const getTreeState: (name: string, storage: StorageType) => TreeUrlState | null;
34
+ export declare const clearTreeState: (name: string, storage: StorageType) => void;
20
35
  /**
21
36
  * Dataset row fields for `pageParams.item` (no methods — those are merged in the hook as {@link TreePartialNodeApi}).
22
37
  */
@@ -20,6 +20,11 @@ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  import isArray from "lodash-es/isArray";
21
21
  import cloneDeep from "lodash-es/cloneDeep";
22
22
  import get from "lodash-es/get";
23
+ import {
24
+ clearWidgetState,
25
+ getWidgetState,
26
+ setWidgetState
27
+ } from "../../../utils/state-persistance";
23
28
  const isTreeNodeDisabled = (data) => {
24
29
  if (!data) return false;
25
30
  const disabled_node = data.disabled;
@@ -144,6 +149,106 @@ const toggleExpansionInTree = (nodes, nodeId) => {
144
149
  return n;
145
150
  });
146
151
  };
152
+ const migrateLegacyTreeUrlState = (raw) => {
153
+ if (!raw || typeof raw !== "object") return [];
154
+ if (Array.isArray(raw.expanded) && raw.expanded.length) {
155
+ return raw.expanded.map((id) => String(id));
156
+ }
157
+ const ids = /* @__PURE__ */ new Set();
158
+ if (Array.isArray(raw.parentNode)) {
159
+ for (const x of raw.parentNode) {
160
+ if (x != null && x !== "") ids.add(String(x));
161
+ }
162
+ }
163
+ if (raw.open && raw.id != null && raw.id !== "") {
164
+ ids.add(String(raw.id));
165
+ }
166
+ return [...ids];
167
+ };
168
+ const normalizeExpandedIds = (tree, expandedIds) => {
169
+ const set = /* @__PURE__ */ new Set();
170
+ for (const id of expandedIds) {
171
+ if (id == null || id === "") continue;
172
+ const node = findNodeById(tree, String(id));
173
+ if (!node) continue;
174
+ let current = node;
175
+ while (current) {
176
+ set.add(String(current.nodeId));
177
+ current = current.parent;
178
+ }
179
+ }
180
+ return set;
181
+ };
182
+ const collectExpandedNodeIdsForUrl = (nodes) => {
183
+ const out = [];
184
+ const walk = (list, branchOpen) => {
185
+ var _a;
186
+ for (const n of list) {
187
+ if (!branchOpen) continue;
188
+ if (n.open) {
189
+ out.push(n.nodeId);
190
+ if ((_a = n.children) == null ? void 0 : _a.length) {
191
+ walk(n.children, true);
192
+ }
193
+ }
194
+ }
195
+ };
196
+ walk(nodes, true);
197
+ return out;
198
+ };
199
+ const encodeNodeIdForUrl = (id) => {
200
+ try {
201
+ return btoa(unescape(encodeURIComponent(id))).replace(/=+$/, "");
202
+ } catch (e) {
203
+ return id;
204
+ }
205
+ };
206
+ const decodeNodeIdFromUrl = (token) => {
207
+ try {
208
+ return decodeURIComponent(escape(atob(token)));
209
+ } catch (e) {
210
+ return token;
211
+ }
212
+ };
213
+ const toTreeStatePayload = (storage, state) => {
214
+ var _a;
215
+ if (storage !== "URL") return state;
216
+ const out = {};
217
+ if ((_a = state.expanded) == null ? void 0 : _a.length) {
218
+ out.expanded = [...new Set(state.expanded.map(String))].map(encodeNodeIdForUrl);
219
+ }
220
+ if (state.selected) out.selected = encodeNodeIdForUrl(String(state.selected));
221
+ return out;
222
+ };
223
+ const fromTreeStatePayload = (storage, raw) => {
224
+ var _a, _b;
225
+ if (raw == null || typeof raw !== "object" || Array.isArray(raw)) return null;
226
+ const state = raw;
227
+ if (storage !== "URL") return state;
228
+ const out = {};
229
+ if ((_a = state.expanded) == null ? void 0 : _a.length) {
230
+ out.expanded = [...new Set(state.expanded.map((id) => decodeNodeIdFromUrl(String(id))))];
231
+ }
232
+ if (state.selected) out.selected = decodeNodeIdFromUrl(String(state.selected));
233
+ return ((_b = out.expanded) == null ? void 0 : _b.length) || out.selected ? out : null;
234
+ };
235
+ const saveTreeState = (name, storage, stateToSave) => {
236
+ const config = { name, type: "tree", storage };
237
+ if (stateToSave == null) {
238
+ clearWidgetState(config);
239
+ return;
240
+ }
241
+ if (storage === "URL") {
242
+ clearWidgetState(config);
243
+ }
244
+ setWidgetState(config, toTreeStatePayload(storage, stateToSave));
245
+ };
246
+ const getTreeState = (name, storage) => {
247
+ return fromTreeStatePayload(storage, getWidgetState({ name, type: "tree", storage }));
248
+ };
249
+ const clearTreeState = (name, storage) => {
250
+ clearWidgetState({ name, type: "tree", storage });
251
+ };
147
252
  const getTreePartialRowPayload = (node) => {
148
253
  var _a;
149
254
  const raw = node.data;
@@ -205,12 +310,18 @@ export {
205
310
  assembleTreePartialItem,
206
311
  buildTreePartialSnapshot,
207
312
  buildTreePathFromRoot,
313
+ clearTreeState,
314
+ collectExpandedNodeIdsForUrl,
208
315
  computeTreeNodeDepthFromRoot,
209
316
  findNodeById,
210
317
  generateUniqueNodeId,
211
318
  getNestedPropertyLocal,
212
319
  getTreePartialRowPayload,
320
+ getTreeState,
213
321
  isTreeNodeDisabled,
322
+ migrateLegacyTreeUrlState,
323
+ normalizeExpandedIds,
214
324
  processNode,
325
+ saveTreeState,
215
326
  toggleExpansionInTree
216
327
  };
@@ -75,5 +75,7 @@ declare const _default: React.ComponentType<{
75
75
  formfield?: boolean;
76
76
  updateon?: string;
77
77
  dataset?: any;
78
+ loading?: boolean;
79
+ showSkeleton?: boolean;
78
80
  }>;
79
81
  export default _default;
@@ -125,5 +125,7 @@ declare const _default: React.ComponentType<{
125
125
  formfield?: boolean;
126
126
  updateon?: string;
127
127
  prefabName?: string;
128
+ loading?: boolean;
129
+ showSkeleton?: boolean;
128
130
  }>;
129
131
  export default _default;
@@ -428,7 +428,7 @@ const getAggregatedData = (datasource, groupby, aggregation, aggregationcolumn,
428
428
  }
429
429
  ];
430
430
  }
431
- datasource.execute("getAggregatedData", {
431
+ datasource == null ? void 0 : datasource.execute("getAggregatedData", {
432
432
  aggregations: data,
433
433
  sort: sortExpr
434
434
  }).then(
@@ -6,7 +6,7 @@ function useCustomTemplate({ content, name, listener }) {
6
6
  if ((listener == null ? void 0 : listener.onChange) && typeof listener.onChange === "function") {
7
7
  listener.onChange(name, { setTemplate });
8
8
  }
9
- }, [name, listener == null ? void 0 : listener.onChange]);
9
+ }, [name]);
10
10
  useEffect(() => {
11
11
  stableOnChange();
12
12
  }, [stableOnChange]);
@@ -1 +1,3 @@
1
1
  export { AppSpinner } from "./AppSpinner";
2
+ export { WmSkeleton, SKELETON_REGISTRY, shouldShowSkeleton } from "./wm-skeleton";
3
+ export type { WmSkeletonProps, SkeletonConfig } from "./wm-skeleton";
@@ -1,4 +1,8 @@
1
1
  import { AppSpinner } from "./AppSpinner";
2
+ import { WmSkeleton, SKELETON_REGISTRY, shouldShowSkeleton } from "./wm-skeleton";
2
3
  export {
3
- AppSpinner
4
+ AppSpinner,
5
+ SKELETON_REGISTRY,
6
+ WmSkeleton,
7
+ shouldShowSkeleton
4
8
  };