@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wavemaker-ai/react-runtime",
3
- "version": "1.0.0-rc.314",
3
+ "version": "1.0.0-rc.319",
4
4
  "description": "React runtime package for Wavemaker",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -57,7 +57,8 @@
57
57
  "@mui/x-date-pickers": "8.5.3",
58
58
  "@reduxjs/toolkit": "2.9.1",
59
59
  "@tanstack/react-table": "8.21.3",
60
- "@wavemaker-ai/react-codegen": "1.0.0-rc.314",
60
+ "@wavemaker-ai/react-codegen": "1.0.0-rc.319",
61
+ "@wavemaker-ai/variables": "1.0.0-rc.319",
61
62
  "@wavemaker/nvd3": "1.8.16",
62
63
  "axios": "1.15.1",
63
64
  "d3": "7.8.5",
@@ -96,7 +97,6 @@
96
97
  "@types/react-dom": "19.2.3",
97
98
  "@vitejs/plugin-react": "5.1.4",
98
99
  "@vitest/coverage-v8": "3.2.4",
99
- "@wavemaker-ai/variables": "1.0.0-rc.314",
100
100
  "axe-core": "4.11.1",
101
101
  "esbuild": "0.27.5",
102
102
  "eslint": "9",
@@ -99,7 +99,7 @@ async function loadAppScript() {
99
99
  }
100
100
  async function loadAppVariables() {
101
101
  var _a;
102
- return (_a = await fetchResource("./app.variables.json", true, true)) != null ? _a : {};
102
+ return (_a = await fetchResource("./app.variables.json", true)) != null ? _a : {};
103
103
  }
104
104
  async function loadCustomFormatters() {
105
105
  const js = await fetchOptionalText("./extensions/formatters.js");
@@ -1,7 +1,6 @@
1
1
  import { useState, useEffect, useCallback, useRef } from "react";
2
2
  import { getComponentRef, getPrefabConfig } from "../services/component-ref-provider";
3
3
  import { ComponentType } from "../services/fragment-url";
4
- import { getComponentFromCache, setComponentInCache } from "../services/cache";
5
4
  import { buildBasePageLikeComponent } from "../factories/build-base-page-like-component";
6
5
  import { buildPrefabComponent } from "../factories/prefab-factory";
7
6
  const builders = {
@@ -9,44 +8,33 @@ const builders = {
9
8
  [ComponentType.PARTIAL]: (name, fragment) => buildBasePageLikeComponent("partial", name, fragment),
10
9
  [ComponentType.PREFAB]: (name, fragment, prefabOutboundDefaults) => buildPrefabComponent(name, fragment, prefabOutboundDefaults != null ? prefabOutboundDefaults : {})
11
10
  };
12
- function getCachedComponent(componentType, name) {
13
- if (!name) return void 0;
14
- return getComponentFromCache(componentType, name);
15
- }
16
- function resolveInitialState(componentName, componentType) {
17
- const cached = getCachedComponent(componentType, componentName);
18
- if (cached) return { Component: cached, isLoading: false, error: null };
19
- return { Component: null, isLoading: !!componentName, error: null };
20
- }
21
- function getFragmentFetchOptions(componentType, prefabNameOption, resolvedName) {
22
- if (componentType !== ComponentType.PREFAB) return void 0;
23
- return { prefabName: prefabNameOption || resolvedName };
24
- }
25
11
  function useDynamicComponent(componentName, componentType, options) {
26
- const [state, setState] = useState(
27
- () => resolveInitialState(componentName, componentType)
28
- );
12
+ const [state, setState] = useState({
13
+ Component: null,
14
+ isLoading: !!componentName,
15
+ error: null
16
+ });
29
17
  const activeRequestRef = useRef(0);
30
18
  const load = useCallback(
31
19
  async (name) => {
32
- const cached = getCachedComponent(componentType, name);
33
- if (cached) {
34
- setState({ Component: cached, isLoading: false, error: null });
35
- return;
36
- }
37
20
  const requestId = ++activeRequestRef.current;
38
21
  setState({ Component: null, isLoading: true, error: null });
39
22
  try {
40
- const fetchOptions = getFragmentFetchOptions(componentType, options == null ? void 0 : options.prefabName, name);
23
+ const fetchOptions = componentType === ComponentType.PREFAB ? { prefabName: (options == null ? void 0 : options.prefabName) || name } : void 0;
41
24
  let prefabOutboundDefaults;
42
25
  if (componentType === ComponentType.PREFAB) {
43
26
  prefabOutboundDefaults = await getPrefabConfig(name) || {};
44
27
  }
45
28
  const fragment = await getComponentRef(name, componentType, fetchOptions);
29
+ if (!fragment) {
30
+ if (requestId === activeRequestRef.current) {
31
+ setState({ Component: null, isLoading: false, error: null });
32
+ }
33
+ return;
34
+ }
46
35
  const builder = builders[componentType];
47
36
  if (!builder) throw new Error(`No builder registered for component type: ${componentType}`);
48
37
  const Component = await builder(name, fragment, prefabOutboundDefaults);
49
- setComponentInCache(componentType, name, Component);
50
38
  if (requestId === activeRequestRef.current) {
51
39
  setState({ Component, isLoading: false, error: null });
52
40
  }
@@ -61,13 +49,6 @@ function useDynamicComponent(componentName, componentType, options) {
61
49
  );
62
50
  useEffect(() => {
63
51
  if (!componentName) return;
64
- const cached = getCachedComponent(componentType, componentName);
65
- if (cached) {
66
- setState(
67
- (prev) => prev.Component === cached ? prev : { Component: cached, isLoading: false, error: null }
68
- );
69
- return;
70
- }
71
52
  load(componentName);
72
53
  }, [componentName, load, componentType]);
73
54
  return state;
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { DecodedFragment } from "../services/cache";
2
+ import type { DecodedFragment } from "../services/component-ref-provider";
3
3
  export type BasePageLikeKind = "page" | "partial";
4
4
  /**
5
5
  * Shared path for dynamically loaded pages and partials: both wrap codegen output
@@ -65,10 +65,18 @@ function createDynamicComponent({
65
65
  if (styles) {
66
66
  scopeComponentStyles(componentName, componentType, styles);
67
67
  }
68
+ let id = null;
68
69
  if (appState) {
69
- appState.pageReady();
70
+ if (componentType.toLowerCase() === "page") {
71
+ id = setTimeout(() => {
72
+ appState.pageReady();
73
+ }, 1e3);
74
+ } else {
75
+ appState.pageReady();
76
+ }
70
77
  }
71
78
  return () => {
79
+ if (id) clearTimeout(id);
72
80
  removeComponentStyles(componentName, componentType);
73
81
  };
74
82
  }, []);
@@ -1,3 +1,3 @@
1
1
  import React from "react";
2
- import type { DecodedFragment } from "../services/cache";
2
+ import type { DecodedFragment } from "../services/component-ref-provider";
3
3
  export declare function buildPrefabComponent(prefabName: string, fragment: DecodedFragment, defaultPrefabProps: Record<string, unknown>): Promise<React.ComponentType<any>>;
@@ -2,7 +2,7 @@ import React from "react";
2
2
  import { ScriptScope } from "../services/script-executor";
3
3
  import { buildStartupInfo } from "./startup-info";
4
4
  import type { TranspileOptions } from "../services/markup-transpiler";
5
- import type { DecodedFragment } from "../services/cache";
5
+ import type { DecodedFragment } from "../services/component-ref-provider";
6
6
  export interface DynamicComponentConfig {
7
7
  componentName: string;
8
8
  componentType: "page" | "partial" | "prefab";
@@ -1,5 +1,4 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
- import React from "react";
3
2
  import { createRoot } from "react-dom/client";
4
3
  import wmGlobalsCss from "@wavemaker-ai/react-codegen/styles/wm-styles.css";
5
4
  import { App, initPreviewRuntimeRouter } from "./App";
@@ -30,8 +29,7 @@ async function bootstrap() {
30
29
  throw new Error("Root element #app-root not found");
31
30
  }
32
31
  const root = createRoot(container);
33
- const tree = process.env.NODE_ENV === "development" ? /* @__PURE__ */ jsx(React.StrictMode, { children: /* @__PURE__ */ jsx(App, {}) }) : /* @__PURE__ */ jsx(App, {});
34
- root.render(tree);
32
+ root.render(/* @__PURE__ */ jsx(App, {}));
35
33
  console.timeEnd("bootstrap");
36
34
  window.addEventListener("unload", () => {
37
35
  root.unmount();
@@ -1,12 +1,27 @@
1
1
  import { ComponentType } from "./fragment-url";
2
- import type { DecodedFragment } from "./cache";
2
+ export interface PageMinJSON {
3
+ markup: string;
4
+ script: string;
5
+ styles: string;
6
+ variables: string;
7
+ config?: string;
8
+ error?: string;
9
+ }
10
+ export interface DecodedFragment {
11
+ markup: string;
12
+ script: string;
13
+ styles: string;
14
+ variables: Record<string, unknown>;
15
+ config?: Record<string, unknown>;
16
+ error?: string;
17
+ }
3
18
  export interface GetComponentOptions {
4
19
  prefabName?: string;
5
20
  }
6
- export declare function getComponentRef(componentName: string, componentType: ComponentType, options?: GetComponentOptions): Promise<DecodedFragment>;
21
+ export declare function getComponentRef(componentName: string, componentType: ComponentType, options?: GetComponentOptions): Promise<DecodedFragment | undefined>;
7
22
  export declare function getPrefabConfig(prefabName: string): Promise<Record<string, unknown>>;
8
23
  /**
9
- * Clears fetched fragments, built components, resource HTTP cache, prefab injected assets,
10
- * transpiled markup cache, and compiled variable factories so the next load rebuilds from disk.
24
+ * Resets injected prefab assets and transpile/variable caches so the next
25
+ * load rebuilds from the server.
11
26
  */
12
27
  export declare function clearComponentRefCache(): void;
@@ -1,28 +1,12 @@
1
1
  import isString from "lodash-es/isString";
2
2
  import { transformEx } from "@wavemaker-ai/react-codegen/transpiler";
3
- import { fetchResource, clearResourceCache } from "./resource-manager";
3
+ import { fetchResource } from "./resource-manager";
4
4
  import { getFragmentUrl, getPrefabConfigUrl } from "./fragment-url";
5
- import {
6
- getFragmentFromCache,
7
- setFragmentInCache,
8
- deleteFragmentFromCache,
9
- clearAllCaches,
10
- getPrefabConfigFromCache,
11
- setPrefabConfigInCache,
12
- deletePrefabConfigFromCache
13
- } from "./cache";
14
5
  import { decodeURIComponentSafe, parseJsonSafe } from "../utils";
15
6
  import { clearPrefabResourcesLoaded, loadPrefabResourcesFromConfig } from "./prefab-resources";
16
7
  import { clearTranspileCache } from "./markup-transpiler";
17
8
  import { clearVariablesCache } from "./variable-transpiler";
18
- function getOrCreateCachedPromise(get, set, del, key, create) {
19
- const existing = get(key);
20
- if (existing) return existing;
21
- const pending = create();
22
- set(key, pending);
23
- pending.catch(() => del(key));
24
- return pending;
25
- }
9
+ import { appManager } from "@wavemaker-ai/variables";
26
10
  function decodeFragment(raw) {
27
11
  return {
28
12
  markup: decodeURIComponentSafe(raw.markup || ""),
@@ -33,14 +17,20 @@ function decodeFragment(raw) {
33
17
  };
34
18
  }
35
19
  async function loadFragment(componentName, componentType, prefabName) {
20
+ var _a, _b, _c;
36
21
  const url = getFragmentUrl(componentName, componentType, prefabName);
37
- return getOrCreateCachedPromise(
38
- getFragmentFromCache,
39
- setFragmentInCache,
40
- deleteFragmentFromCache,
41
- url,
42
- () => fetchResource(url, true).then(decodeFragment)
43
- );
22
+ try {
23
+ const raw = await fetchResource(url);
24
+ return decodeFragment(raw);
25
+ } catch (err) {
26
+ if (((_a = err.response) == null ? void 0 : _a.status) === 401) {
27
+ return void 0;
28
+ }
29
+ const errorMsg = isString(err) ? err : "";
30
+ console.error(`Failed to load ${componentType} component '${componentName}':`, err);
31
+ (_c = (_b = appManager) == null ? void 0 : _b.notifyApp) == null ? void 0 : _c.call(_b, errorMsg, "error");
32
+ return void 0;
33
+ }
44
34
  }
45
35
  async function getComponentRef(componentName, componentType, options) {
46
36
  return loadFragment(componentName, componentType, options == null ? void 0 : options.prefabName);
@@ -69,21 +59,11 @@ function buildDynamicPrefabProps(result) {
69
59
  }
70
60
  async function getPrefabConfig(prefabName) {
71
61
  const url = getPrefabConfigUrl(prefabName);
72
- return getOrCreateCachedPromise(
73
- getPrefabConfigFromCache,
74
- setPrefabConfigInCache,
75
- deletePrefabConfigFromCache,
76
- url,
77
- async () => {
78
- const raw = await fetchResource(url, true);
79
- await loadPrefabResourcesFromConfig(prefabName, raw);
80
- return buildDynamicPrefabProps(raw);
81
- }
82
- );
62
+ const raw = await fetchResource(url);
63
+ await loadPrefabResourcesFromConfig(prefabName, raw);
64
+ return buildDynamicPrefabProps(raw);
83
65
  }
84
66
  function clearComponentRefCache() {
85
- clearResourceCache();
86
- clearAllCaches();
87
67
  clearPrefabResourcesLoaded();
88
68
  clearTranspileCache();
89
69
  clearVariablesCache();
@@ -1,4 +1,4 @@
1
- export { fetchResource, clearResourceCache } from "./resource-manager";
1
+ export { fetchResource } from "./resource-manager";
2
2
  export { ComponentType, getFragmentUrl, getPrefabBaseUrl, getPrefabConfigUrl, isPrefabSelfPreview, } from "./fragment-url";
3
3
  export { getComponentRef, clearComponentRefCache } from "./component-ref-provider";
4
4
  export { getPrefabResourceUrl } from "./prefab-resources";
@@ -6,5 +6,4 @@ export { buildAddPageScript } from "./script-executor";
6
6
  export { transpileAndBuildGetVariables, clearVariablesCache } from "./variable-transpiler";
7
7
  export { scopeComponentStyles, removeComponentStyles } from "./css-scoping";
8
8
  export { loadAppExtensions } from "./app-extension-provider";
9
- export type { PageMinJSON, DecodedFragment } from "./cache";
10
- export { getFragmentFromCache, setFragmentInCache, getComponentFromCache, setComponentInCache, getScriptFromCache, setScriptInCache, clearAllCaches, } from "./cache";
9
+ export type { PageMinJSON, DecodedFragment } from "./component-ref-provider";
@@ -1,4 +1,4 @@
1
- import { fetchResource, clearResourceCache } from "./resource-manager";
1
+ import { fetchResource } from "./resource-manager";
2
2
  import {
3
3
  ComponentType,
4
4
  getFragmentUrl,
@@ -12,37 +12,20 @@ import { buildAddPageScript } from "./script-executor";
12
12
  import { transpileAndBuildGetVariables, clearVariablesCache } from "./variable-transpiler";
13
13
  import { scopeComponentStyles, removeComponentStyles } from "./css-scoping";
14
14
  import { loadAppExtensions } from "./app-extension-provider";
15
- import {
16
- getFragmentFromCache,
17
- setFragmentInCache,
18
- getComponentFromCache,
19
- setComponentInCache,
20
- getScriptFromCache,
21
- setScriptInCache,
22
- clearAllCaches
23
- } from "./cache";
24
15
  export {
25
16
  ComponentType,
26
17
  buildAddPageScript,
27
- clearAllCaches,
28
18
  clearComponentRefCache,
29
- clearResourceCache,
30
19
  clearVariablesCache,
31
20
  fetchResource,
32
- getComponentFromCache,
33
21
  getComponentRef,
34
- getFragmentFromCache,
35
22
  getFragmentUrl,
36
23
  getPrefabBaseUrl,
37
24
  getPrefabConfigUrl,
38
25
  getPrefabResourceUrl,
39
- getScriptFromCache,
40
26
  isPrefabSelfPreview,
41
27
  loadAppExtensions,
42
28
  removeComponentStyles,
43
29
  scopeComponentStyles,
44
- setComponentInCache,
45
- setFragmentInCache,
46
- setScriptInCache,
47
30
  transpileAndBuildGetVariables
48
31
  };
@@ -1,3 +1,2 @@
1
- export declare function fetchResource<T = unknown>(url: string, useCache?: boolean, optional?: false): Promise<T>;
2
- export declare function fetchResource<T = unknown>(url: string, useCache: boolean, optional: true): Promise<T | null>;
3
- export declare function clearResourceCache(): void;
1
+ export declare function fetchResource<T = unknown>(url: string, optional?: false): Promise<T>;
2
+ export declare function fetchResource<T = unknown>(url: string, optional: true): Promise<T | null>;
@@ -1,35 +1,31 @@
1
1
  import axios from "axios";
2
2
  import { resolvePreviewFetchUrl } from "../preview-resource-base";
3
3
  import { handle401 } from "../../core/app.service";
4
- const cache = /* @__PURE__ */ new Map();
5
- async function fetchResource(url, useCache = true, optional = false) {
6
- var _a;
4
+ import { store } from "../../store";
5
+ async function fetchResource(url, optional = false) {
6
+ var _a, _b;
7
7
  const resolvedUrl = resolvePreviewFetchUrl(url);
8
- if (useCache && cache.has(resolvedUrl)) {
9
- return cache.get(resolvedUrl);
10
- }
11
8
  try {
12
9
  const response = await axios.get(resolvedUrl);
13
- const { data } = response;
14
- if (useCache) {
15
- cache.set(resolvedUrl, data);
16
- }
17
- return data;
10
+ return response.data;
18
11
  } catch (error) {
19
12
  if (optional) {
20
13
  return null;
21
14
  }
22
15
  const status = (_a = error == null ? void 0 : error.response) == null ? void 0 : _a.status;
23
- if (status === 401 || status === 403) {
16
+ if (status === 401) {
24
17
  handle401();
18
+ throw error;
25
19
  }
26
- throw error;
20
+ const appLocale = (_b = store.getState().i18n) == null ? void 0 : _b.appLocale;
21
+ const errorMessages = {
22
+ 404: (appLocale == null ? void 0 : appLocale.MESSAGE_PAGE_NOT_FOUND) || "Page not available",
23
+ 403: (appLocale == null ? void 0 : appLocale.LABEL_ACCESS_DENIED) || "Access Denied"
24
+ };
25
+ const errorMessage = errorMessages[status] || "An error occurred";
26
+ throw errorMessage || "Unknown error loading component";
27
27
  }
28
28
  }
29
- function clearResourceCache() {
30
- cache.clear();
31
- }
32
29
  export {
33
- clearResourceCache,
34
30
  fetchResource
35
31
  };
@@ -1,7 +1,6 @@
1
1
  import * as lodash from "lodash-es";
2
2
  import moment from "moment";
3
3
  import { Utils } from "../../core/util/utils";
4
- import { getScriptFromCache, setScriptInCache } from "./cache";
5
4
  var ScriptScope = /* @__PURE__ */ ((ScriptScope2) => {
6
5
  ScriptScope2["PAGE"] = "Page";
7
6
  ScriptScope2["PARTIAL"] = "Partial";
@@ -43,15 +42,15 @@ function prepareScript(raw) {
43
42
  function buildAddPageScript(script, scopeKind, componentName) {
44
43
  if (!script) return () => {
45
44
  };
46
- const cacheKey = `${scopeKind}:${componentName}`;
47
- const cached = getScriptFromCache(cacheKey);
48
- if (cached) return cached;
49
45
  try {
50
46
  const cleanScript = prepareScript(script);
51
47
  const allNames = [...Object.keys(SCRIPT_GLOBALS), ...DEFERRED_GLOBALS];
52
- const compiledFn = new Function("App", scopeKind, ...allNames, cleanScript);
48
+ const wrappedScript = `{
49
+ ${cleanScript}
50
+ }`;
51
+ const compiledFn = new Function("App", scopeKind, ...allNames, wrappedScript);
53
52
  const staticValues = Object.keys(SCRIPT_GLOBALS).map((k) => SCRIPT_GLOBALS[k]);
54
- const boundFn = (app, page) => {
53
+ return (app, page) => {
55
54
  try {
56
55
  const deferredValues = DEFERRED_GLOBALS.map((k) => window[k]);
57
56
  compiledFn(app, page, ...staticValues, ...deferredValues);
@@ -62,8 +61,6 @@ function buildAddPageScript(script, scopeKind, componentName) {
62
61
  );
63
62
  }
64
63
  };
65
- setScriptInCache(cacheKey, boundFn);
66
- return boundFn;
67
64
  } catch (compileError) {
68
65
  console.error(
69
66
  `[script-executor] Compilation error in ${scopeKind} script "${componentName}":`,
@@ -51,15 +51,14 @@ const SCOPE_MAP = {
51
51
  const EMPTY_RESULT = { Variables: {}, Actions: {} };
52
52
  function createLazyPartial(partialName) {
53
53
  return lazy(async () => {
54
- const { getComponentFromCache, setComponentInCache } = await import("./cache");
55
54
  const { ComponentType: FType } = await import("./fragment-url");
56
55
  const { getComponentRef } = await import("./component-ref-provider");
57
56
  const { buildBasePageLikeComponent } = await import("../factories/build-base-page-like-component");
58
- const cached = getComponentFromCache(FType.PARTIAL, partialName);
59
- if (cached) return { default: cached };
60
57
  const fragment = await getComponentRef(partialName, FType.PARTIAL);
58
+ if (!fragment) {
59
+ return { default: () => null };
60
+ }
61
61
  const Built = await buildBasePageLikeComponent("partial", partialName, fragment);
62
- setComponentInCache(FType.PARTIAL, partialName, Built);
63
62
  return { default: Built };
64
63
  });
65
64
  }
package/utils/attr.js CHANGED
@@ -4,24 +4,16 @@ const INTERNAL_ATTRIBUTES = /* @__PURE__ */ new Set([
4
4
  "conditionalstyle",
5
5
  "dataset",
6
6
  "destroy",
7
- "eventCallback",
8
7
  "formfield",
9
- "forwardedRef",
10
8
  "inbound",
11
9
  "iswidget",
12
- "listener",
13
- "onHeaderclick",
14
- "onHeaderClick",
15
- "onLoad",
16
- "onDestroy",
17
- "onNavHeightChange",
18
10
  "onRender",
19
11
  "outbound",
20
12
  "prefab",
21
13
  "ref",
22
14
  "showindevice",
23
15
  "styles",
24
- "viewParent"
16
+ "onLeftPanelAnimationChange"
25
17
  ]);
26
18
  const SAFE_ATTRIBUTES = /* @__PURE__ */ new Set([
27
19
  "accessKey",
@@ -43,7 +43,10 @@ async function buildCustomExpressionComponentsMap(options) {
43
43
  const results = await Promise.all(
44
44
  keys.map(async (key) => {
45
45
  const transformedMarkup = normalizeTransformedMarkupRowBinding(
46
- tm(columnSource[key].customExpression)
46
+ tm(columnSource[key].customExpression, {
47
+ appUrl: "",
48
+ insideTableColumn: true
49
+ })
47
50
  );
48
51
  const component = await parseFn(transformedMarkup, listener);
49
52
  return { key, component };
@@ -18,8 +18,8 @@ function extractMarkupComponents(markup) {
18
18
  }
19
19
  function resolveCustomExpressionScope(imports, fragment, markupForInference) {
20
20
  const fr = fragment;
21
- const names = ["React", "fragment", "row", "Widgets", "Variables"];
22
- const values = [React, fragment, void 0, fr == null ? void 0 : fr.Widgets, fr == null ? void 0 : fr.Variables];
21
+ const names = ["React", "fragment", "row", "rowData", "Widgets", "Variables"];
22
+ const values = [React, fragment, void 0, void 0, fr == null ? void 0 : fr.Widgets, fr == null ? void 0 : fr.Variables];
23
23
  const seen = new Set(names);
24
24
  for (const importDef of imports) {
25
25
  const binding = importDef.as || importDef.name;
@@ -87,6 +87,7 @@ return __render__();`;
87
87
  ${jsxInner}`
88
88
  );
89
89
  const rowIdx = names.indexOf("row");
90
+ const rowDataIdx = names.indexOf("rowData");
90
91
  const fragmentIdx = names.indexOf("fragment");
91
92
  const widgetsIdx = names.indexOf("Widgets");
92
93
  const variablesIdx = names.indexOf("Variables");
@@ -110,6 +111,7 @@ ${jsxInner}`
110
111
  try {
111
112
  const args = templateValues.slice();
112
113
  args[rowIdx] = rowData;
114
+ if (rowDataIdx >= 0) args[rowDataIdx] = rowData;
113
115
  const fr = fragment;
114
116
  if (fragmentIdx >= 0) args[fragmentIdx] = fragment;
115
117
  if (widgetsIdx >= 0) args[widgetsIdx] = fr == null ? void 0 : fr.Widgets;
@@ -194,11 +194,10 @@ const formatOnBlur = (datavalue, rawInputValue, trailingzero, decimalplaces) =>
194
194
  };
195
195
  const handleValidatedValueUpdate = (value, name, inputElCurrent, onChangeProp, listenerProp, prevDatavalueState, setPrevDatavalueState, widgetProps) => {
196
196
  const stringifiedValue = value === null ? "" : value.toString();
197
- const widgetInfo = name && (listenerProp == null ? void 0 : listenerProp.Widgets) ? listenerProp.Widgets[name] : void 0;
198
197
  if (listenerProp == null ? void 0 : listenerProp.onChange) {
199
- listenerProp.onChange(name, __spreadProps(__spreadValues({}, widgetInfo || widgetProps), {
198
+ listenerProp.onChange(name, {
200
199
  datavalue: stringifiedValue
201
- }));
200
+ });
202
201
  }
203
202
  setPrevDatavalueState(value);
204
203
  const updatedProps = __spreadProps(__spreadValues({}, widgetProps), {
@@ -1,5 +1,5 @@
1
1
  export type StorageType = "localStorage" | "sessionStorage" | "URL" | "none";
2
- type WidgetType = "accordion" | "tabs" | "list" | "table";
2
+ type WidgetType = "accordion" | "tabs" | "list" | "table" | "tree";
3
3
  interface StateConfig {
4
4
  name: string;
5
5
  type: WidgetType;
@@ -1,29 +0,0 @@
1
- import type React from "react";
2
- import { ComponentType } from "./fragment-url";
3
- export interface PageMinJSON {
4
- markup: string;
5
- script: string;
6
- styles: string;
7
- variables: string;
8
- config?: string;
9
- }
10
- export interface DecodedFragment {
11
- markup: string;
12
- script: string;
13
- styles: string;
14
- variables: Record<string, unknown>;
15
- config?: Record<string, unknown>;
16
- }
17
- type ScriptFn = (...args: unknown[]) => void;
18
- export declare const getPrefabConfigFromCache: (url: string) => Promise<Record<string, unknown>> | undefined;
19
- export declare function setPrefabConfigInCache(url: string, config: Promise<Record<string, unknown>>): void;
20
- export declare function deletePrefabConfigFromCache(url: string): void;
21
- export declare const getFragmentFromCache: (url: string) => Promise<DecodedFragment> | undefined;
22
- export declare function setFragmentInCache(url: string, fragment: Promise<DecodedFragment>): void;
23
- export declare function deleteFragmentFromCache(url: string): void;
24
- export declare const getComponentFromCache: (componentType: ComponentType, componentName: string) => React.ComponentType<any> | undefined;
25
- export declare function setComponentInCache(componentType: ComponentType, componentName: string, component: React.ComponentType<any>): void;
26
- export declare const getScriptFromCache: (identifier: string) => ScriptFn | undefined;
27
- export declare function setScriptInCache(identifier: string, scriptFn: ScriptFn): void;
28
- export declare function clearAllCaches(): void;
29
- export {};
@@ -1,51 +0,0 @@
1
- const fragmentCache = /* @__PURE__ */ new Map();
2
- const componentCache = /* @__PURE__ */ new Map();
3
- const scriptCache = /* @__PURE__ */ new Map();
4
- const prefabConfigCache = /* @__PURE__ */ new Map();
5
- const getPrefabConfigFromCache = (url) => prefabConfigCache.get(url);
6
- function setPrefabConfigInCache(url, config) {
7
- prefabConfigCache.set(url, config);
8
- }
9
- function deletePrefabConfigFromCache(url) {
10
- prefabConfigCache.delete(url);
11
- }
12
- const getFragmentFromCache = (url) => fragmentCache.get(url);
13
- function setFragmentInCache(url, fragment) {
14
- fragmentCache.set(url, fragment);
15
- }
16
- function deleteFragmentFromCache(url) {
17
- fragmentCache.delete(url);
18
- }
19
- const getComponentFromCache = (componentType, componentName) => {
20
- var _a;
21
- return (_a = componentCache.get(componentType)) == null ? void 0 : _a.get(componentName);
22
- };
23
- function setComponentInCache(componentType, componentName, component) {
24
- if (!componentCache.has(componentType)) {
25
- componentCache.set(componentType, /* @__PURE__ */ new Map());
26
- }
27
- componentCache.get(componentType).set(componentName, component);
28
- }
29
- const getScriptFromCache = (identifier) => scriptCache.get(identifier);
30
- function setScriptInCache(identifier, scriptFn) {
31
- scriptCache.set(identifier, scriptFn);
32
- }
33
- function clearAllCaches() {
34
- fragmentCache.clear();
35
- componentCache.clear();
36
- scriptCache.clear();
37
- prefabConfigCache.clear();
38
- }
39
- export {
40
- clearAllCaches,
41
- deleteFragmentFromCache,
42
- deletePrefabConfigFromCache,
43
- getComponentFromCache,
44
- getFragmentFromCache,
45
- getPrefabConfigFromCache,
46
- getScriptFromCache,
47
- setComponentInCache,
48
- setFragmentInCache,
49
- setPrefabConfigInCache,
50
- setScriptInCache
51
- };