@wavemaker/react-runtime 11.14.3-rc.6401 → 11.15.0-1.246

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 (245) hide show
  1. package/actions/base-action.js +5 -7
  2. package/actions/login-action.js +7 -8
  3. package/actions/logout-action.js +5 -7
  4. package/actions/navigation-action.js +73 -18
  5. package/actions/notification-action.js +22 -8
  6. package/actions/timer-action.js +13 -15
  7. package/actions/toast.js +4 -2
  8. package/actions/toast.service.js +1 -2
  9. package/components/advanced/carousel/index.js +1 -1
  10. package/components/advanced/carousel/template.js +1 -1
  11. package/components/basic/anchor/index.js +31 -11
  12. package/components/basic/html/index.js +115 -24
  13. package/components/basic/icon/index.js +2 -1
  14. package/components/basic/iframe/index.js +2 -1
  15. package/components/basic/label/index.js +12 -9
  16. package/components/basic/message/index.js +12 -3
  17. package/components/basic/picture/index.js +11 -4
  18. package/components/basic/progress-bar/index.js +4 -1
  19. package/components/basic/progress-circle/index.js +34 -28
  20. package/components/basic/progress-circle/props.js +10 -2
  21. package/components/basic/richtexteditor/index.js +95 -94
  22. package/components/basic/search/index.js +401 -156
  23. package/components/basic/search/providers.js +126 -61
  24. package/components/basic/spinner/index.js +2 -1
  25. package/components/basic/tree/index.js +34 -34
  26. package/components/basic/tree/utils.js +10 -4
  27. package/components/chart/components/barColumnChart/index.js +36 -33
  28. package/components/chart/components/bubbleChart/index.js +35 -25
  29. package/components/chart/components/chartLegend/utils.js +2 -1
  30. package/components/chart/components/cumulativeLineChart/index.js +30 -26
  31. package/components/chart/components/lineAreaChart/index.js +50 -32
  32. package/components/chart/components/pieDonutChart/index.js +13 -4
  33. package/components/chart/hooks/useXAxisConfig.js +15 -8
  34. package/components/chart/index.js +223 -53
  35. package/components/chart/utils.js +12 -1
  36. package/components/constants.js +5 -2
  37. package/components/container/accordion/accordion-pane/index.js +17 -12
  38. package/components/container/accordion/index.js +9 -4
  39. package/components/container/alignment-utils.js +56 -1
  40. package/components/container/index.js +49 -20
  41. package/components/container/panel/components/panel-header/index.js +3 -4
  42. package/components/container/panel/index.js +15 -10
  43. package/components/container/repeat-template/index.js +33 -0
  44. package/components/container/tabs/index.js +83 -14
  45. package/components/container/tabs/tab-pane/index.js +33 -10
  46. package/components/container/tabs/utils.js +51 -0
  47. package/components/container/wizard/components/StepComponents.js +2 -1
  48. package/components/container/wizard/components/WizardStep.js +2 -1
  49. package/components/container/wizard/index.js +64 -35
  50. package/components/container/wizard/utils.js +46 -1
  51. package/components/container/wizard/wizard-step/index.js +11 -1
  52. package/components/data/card/card-content/index.js +1 -1
  53. package/components/data/form/base-form/index.js +985 -183
  54. package/components/data/form/base-form/props.js +3 -1
  55. package/components/data/form/base-form/utils.js +159 -1
  56. package/components/data/form/dynamic-fields/constant.js +53 -0
  57. package/components/data/form/dynamic-fields/index.js +10 -45
  58. package/components/data/form/dynamic-fields/utils.js +37 -2
  59. package/components/data/form/form-action/index.js +5 -4
  60. package/components/data/form/form-context.js +5 -1
  61. package/components/data/form/form-controller/utils.js +84 -0
  62. package/components/data/form/form-controller/validation-contrustor.js +402 -189
  63. package/components/data/form/form-controller/withFormController.js +191 -52
  64. package/components/data/form/form-field/base-field.js +67 -45
  65. package/components/data/form/form-field/index.js +28 -5
  66. package/components/data/form/form-header/index.js +3 -4
  67. package/components/data/form/index.js +20 -1
  68. package/components/data/list/components/ListDND.js +2 -1
  69. package/components/data/list/components/ListItem.js +6 -2
  70. package/components/data/list/components/ListItemWithTemplate.js +46 -2
  71. package/components/data/list/components/ListItems.js +17 -26
  72. package/components/data/list/components/ListPagination.js +3 -3
  73. package/components/data/list/components/StandardListItems.js +3 -4
  74. package/components/data/list/hooks/useListEffects.js +55 -14
  75. package/components/data/list/hooks/useListEventHandlers.js +3 -1
  76. package/components/data/list/hooks/useListState.js +3 -1
  77. package/components/data/list/hooks/usePaginatedGroupedData.js +18 -5
  78. package/components/data/list/index.js +74 -55
  79. package/components/data/list/utils/list-helpers.js +73 -35
  80. package/components/data/list/utils/list-widget-methods.js +138 -95
  81. package/components/data/live-filter/index.js +26 -15
  82. package/components/data/live-form/index.js +51 -18
  83. package/components/data/live-form/props.js +1 -1
  84. package/components/data/pagination/components/BasicPagination.js +71 -16
  85. package/components/data/pagination/components/PageSizeSelector.js +8 -3
  86. package/components/data/pagination/components/TotalRecords.js +1 -5
  87. package/components/data/pagination/hooks/usePagination.js +349 -66
  88. package/components/data/pagination/index.js +137 -19
  89. package/components/data/table/components/AddNewRow.js +5 -1
  90. package/components/data/table/components/EditableCell.js +2 -2
  91. package/components/data/table/components/RowCells.js +64 -0
  92. package/components/data/table/components/RowExpansionButton.js +2 -2
  93. package/components/data/table/components/SummaryCell.js +111 -0
  94. package/components/data/table/components/SummaryRow.js +54 -0
  95. package/components/data/table/components/SummaryRowFooter.js +46 -0
  96. package/components/data/table/components/TableBody.js +61 -59
  97. package/components/data/table/components/TableDataRow.js +109 -0
  98. package/components/data/table/components/TableFilters.js +225 -121
  99. package/components/data/table/components/TableHeader.js +291 -23
  100. package/components/data/table/components/TablePanelHeading.js +139 -8
  101. package/components/data/table/components/index.js +22 -1
  102. package/components/data/table/hooks/use-edited-rows.js +141 -0
  103. package/components/data/table/hooks/useCellState.js +5 -12
  104. package/components/data/table/hooks/useFormWidget.js +58 -52
  105. package/components/data/table/hooks/usePaginationState.js +45 -24
  106. package/components/data/table/hooks/usePanelStructure.js +4 -4
  107. package/components/data/table/hooks/useRowHandlers.js +39 -5
  108. package/components/data/table/hooks/useRowSelection.js +244 -50
  109. package/components/data/table/hooks/useServerSideSorting.js +81 -37
  110. package/components/data/table/hooks/useTableColumns.js +211 -118
  111. package/components/data/table/hooks/useTableData.js +54 -9
  112. package/components/data/table/hooks/useTableEdit.js +272 -97
  113. package/components/data/table/hooks/useTableEffects.js +31 -13
  114. package/components/data/table/hooks/useTableFilter.js +1 -1
  115. package/components/data/table/hooks/useTableInitialization.js +23 -22
  116. package/components/data/table/hooks/useTableState.js +11 -5
  117. package/components/data/table/hooks/useTableStateManager.js +140 -65
  118. package/components/data/table/index.js +637 -274
  119. package/components/data/table/live-table/index.js +54 -22
  120. package/components/data/table/table-action/index.js +1 -1
  121. package/components/data/table/table-group/index.js +26 -0
  122. package/components/data/table/table-row-action/index.js +32 -18
  123. package/components/data/table/utils/buildSelectionColumns.js +12 -21
  124. package/components/data/table/utils/columnBuilder.js +29 -14
  125. package/components/data/table/utils/columnProxy.js +68 -1
  126. package/components/data/table/utils/constants.js +6 -2
  127. package/components/data/table/utils/crud-handlers.js +68 -63
  128. package/components/data/table/utils/groupHeaderUtils.js +102 -0
  129. package/components/data/table/utils/index.js +210 -21
  130. package/components/data/table/utils/renderDisplayCell.js +6 -6
  131. package/components/data/table/utils/selectionUtils.js +25 -26
  132. package/components/data/table/utils/validation.js +1 -0
  133. package/components/data/utils/filter-field-util.js +3 -3
  134. package/components/dialogs/alert-dialog/index.js +1 -1
  135. package/components/dialogs/confirm-dialog/index.js +1 -1
  136. package/components/dialogs/dialog/index.js +4 -1
  137. package/components/dialogs/dialog-content/index.js +3 -1
  138. package/components/dialogs/dialog-header/index.js +2 -2
  139. package/components/dialogs/iframe-dialog/index.js +11 -5
  140. package/components/dialogs/index.js +1 -1
  141. package/components/dialogs/login-dialog/index.js +1 -1
  142. package/components/dialogs/page-dialog/index.js +1 -1
  143. package/components/form/button/index.js +33 -7
  144. package/components/input/calendar/index.js +18 -6
  145. package/components/input/chips/index.js +99 -28
  146. package/components/input/chips/utils.js +34 -4
  147. package/components/input/color-picker/index.js +74 -25
  148. package/components/input/composite/index.js +3 -3
  149. package/components/input/currency/index.js +35 -49
  150. package/components/input/default/checkbox/index.js +23 -28
  151. package/components/input/default/checkboxset/index.js +38 -18
  152. package/components/input/default/checkboxset/utils.js +30 -0
  153. package/components/input/default/radioset/index.js +36 -39
  154. package/components/input/default/switch/index.js +30 -13
  155. package/components/input/epoch/date/index.js +130 -69
  156. package/components/input/epoch/date/utils.js +94 -1
  157. package/components/input/epoch/datetime/index.js +72 -22
  158. package/components/input/epoch/datetime/utils.js +49 -10
  159. package/components/input/epoch/time/index.js +68 -19
  160. package/components/input/epoch/time/utils.js +62 -14
  161. package/components/input/fileupload/Utils.js +12 -7
  162. package/components/input/fileupload/components/MultiUpload.js +2 -6
  163. package/components/input/fileupload/components/SingleUpload.js +3 -7
  164. package/components/input/fileupload/index.js +6 -10
  165. package/components/input/fileupload/useFileUpload.js +16 -5
  166. package/components/input/number/index.js +158 -43
  167. package/components/input/rating/index.js +90 -7
  168. package/components/input/select/index.js +209 -72
  169. package/components/input/slider/index.js +84 -26
  170. package/components/input/text/index.js +38 -18
  171. package/components/input/text/util.js +283 -130
  172. package/components/input/textarea/index.js +13 -10
  173. package/components/input/upload/index.js +124 -0
  174. package/components/input/upload/props.js +5 -0
  175. package/components/input/util/index.js +11 -0
  176. package/components/navbar/index.js +51 -3
  177. package/components/navbar/nav/index.js +46 -16
  178. package/components/navbar/nav-item/index.js +11 -5
  179. package/components/navigation/menu/components/ListItems.js +3 -0
  180. package/components/navigation/menu/constants.js +2 -1
  181. package/components/navigation/menu/hooks/useHoverState.hook.js +48 -0
  182. package/components/navigation/menu/hooks/useKeyboardMovements.hook.js +37 -0
  183. package/components/navigation/menu/hooks/useTransformedDataset.hook.js +15 -0
  184. package/components/navigation/menu/index.js +326 -188
  185. package/components/navigation/menu/utils/action-task.js +14 -0
  186. package/components/navigation/menu/utils/role-filter.js +76 -0
  187. package/components/navigation/popover/index.js +105 -32
  188. package/components/page/partial-container/index.js +34 -5
  189. package/components/prefab/index.js +2 -4
  190. package/context/PrefabContext.js +10 -6
  191. package/context/WidgetProvider.js +30 -31
  192. package/core/app.service.js +1 -1
  193. package/core/constants/events.js +57 -1
  194. package/core/dialog.service.js +1 -2
  195. package/core/event-notifier.js +1 -2
  196. package/core/formatter/array-formatters.js +33 -0
  197. package/core/formatter/date-formatters.js +2 -4
  198. package/core/formatter/index.js +2 -1
  199. package/core/formatter/number-formatters.js +5 -10
  200. package/core/formatter/security-formatters.js +2 -4
  201. package/core/formatter/string-formatters.js +3 -6
  202. package/core/proxy-service.js +85 -13
  203. package/core/script-registry.js +108 -48
  204. package/core/util/common.js +4 -4
  205. package/core/util/compare.js +30 -0
  206. package/core/util/dom.js +8 -8
  207. package/core/util/index.js +16 -6
  208. package/core/util/safe-is-equal.js +156 -0
  209. package/core/util/security.js +1 -2
  210. package/core/util/utils.js +16 -7
  211. package/higherOrder/BaseApp.js +108 -65
  212. package/higherOrder/BaseDateTime.js +31 -13
  213. package/higherOrder/BasePage.js +268 -144
  214. package/higherOrder/BasePartial.js +1 -1
  215. package/higherOrder/BasePrefab.js +33 -15
  216. package/higherOrder/DataNav.js +99 -16
  217. package/higherOrder/helper.js +41 -3
  218. package/higherOrder/withBaseWrapper.js +41 -28
  219. package/hooks/useAuth.js +11 -5
  220. package/hooks/useHttp.js +280 -94
  221. package/mui-config/theme-provider.js +1 -1
  222. package/mui-config/theme.js +1 -1
  223. package/package-lock.json +307 -266
  224. package/package.json +8 -8
  225. package/store/bindActions/i18nActions.js +18 -0
  226. package/store/index.js +3 -1
  227. package/store/slices/appConfigSlice.js +2 -2
  228. package/store/slices/authSlice.js +31 -28
  229. package/store/slices/i18nSlice.js +2 -2
  230. package/store/slices/navigationSlice.js +35 -0
  231. package/store/viewport.service.js +255 -0
  232. package/utils/attr.js +35 -0
  233. package/utils/dataset-util.js +1 -2
  234. package/utils/form-state.util.js +43 -12
  235. package/utils/form-utils.js +47 -2
  236. package/utils/format-util.js +28 -13
  237. package/utils/page-params-util.js +33 -1
  238. package/utils/state-persistance.js +72 -13
  239. package/utils/transformedDataset-utils.js +35 -24
  240. package/variables/base-variable.js +12 -14
  241. package/variables/crud-variable.js +225 -0
  242. package/variables/live-variable.js +56 -20
  243. package/variables/metadata.service.js +123 -0
  244. package/variables/model-variable.js +21 -15
  245. package/variables/service-variable.js +88 -83
@@ -8,9 +8,9 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports["default"] = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
12
11
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
13
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
  var _clsx = _interopRequireDefault(require("clsx"));
16
16
  var _Box = _interopRequireDefault(require("@mui/material/Box"));
@@ -18,12 +18,19 @@ var _Button = _interopRequireDefault(require("@mui/material/Button"));
18
18
  var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
19
19
  var _withBaseWrapper = require("@wavemaker/react-runtime/higherOrder/withBaseWrapper");
20
20
  var _transformedDatasetUtils = require("@wavemaker/react-runtime/utils/transformedDataset-utils");
21
+ var _useAuth = require("@wavemaker/react-runtime/hooks/useAuth");
21
22
  var _constants = require("./constants");
22
23
  var _lodash = require("lodash");
23
- var _link = _interopRequireDefault(require("next/link"));
24
+ var _Link = _interopRequireDefault(require("@mui/material/Link"));
24
25
  var _ListItems = require("./components/ListItems");
25
26
  var _utils = require("@wavemaker/react-runtime/core/util/utils");
26
27
  var _navigation = require("next/navigation");
28
+ var _actionTask = require("@wavemaker/react-runtime/components/navigation/menu/utils/action-task");
29
+ var _roleFilter = require("@wavemaker/react-runtime/components/navigation/menu/utils/role-filter");
30
+ var _useKeyboardMovements = require("./hooks/useKeyboardMovements.hook");
31
+ var _useTransformedDataset = require("./hooks/useTransformedDataset.hook");
32
+ var _useHoverState2 = require("./hooks/useHoverState.hook");
33
+ var _constants2 = require("@wavemaker/react-runtime/core/constants");
27
34
  var _excluded = ["menualign", "menuposition", "menulayout", "menuclass", "linktarget", "iconclass", "type", "animateitems", "disableMenuContext", "showonhover", "panelPosition", "autoclose", "autoopen", "hint", "arialabel", "width", "height", "iconposition", "caption", "shortcutkey", "onClick", "onSelect", "navNodes", "styles", "conditionalstyles", "className", "children", "listener", "name", "resetNavNodes", "nodes$", "dataset", "orderby", "itemlabel", "itemlink", "itemicon", "itemaction", "userrole", "itemchildren", "isactive", "displayValue", "onActionsclick", "dataPath", "isFromNav", "onNavItemActivate"];
28
35
  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); }
29
36
  var __jsx = _react["default"].createElement;
@@ -32,115 +39,21 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
32
39
  var isPathMatchingLink = function isPathMatchingLink(path, link) {
33
40
  return new RegExp(link.replace("#", "").replace(/[.*+?^${}()|[\]\\]/g, "\\$&"), "i").test(path);
34
41
  };
35
- var hasLinkToCurrentPage = function hasLinkToCurrentPage(nodes, currentPath) {
42
+ var _hasLinkToCurrentPage = function hasLinkToCurrentPage(nodes, currentPath) {
36
43
  if (!nodes || !Array.isArray(nodes)) return false;
37
44
  return nodes.some(function (node) {
38
45
  if (node.link === currentPath) return true;
39
- return node.children && hasLinkToCurrentPage(node.children, currentPath);
46
+ return node.children && _hasLinkToCurrentPage(node.children, currentPath);
40
47
  });
41
48
  };
42
49
 
43
- // Custom hooks
44
- var useKeyboardMovements = function useKeyboardMovements(menuposition) {
45
- return (0, _react.useMemo)(function () {
46
- switch (menuposition) {
47
- case _constants.POSITION.UP_RIGHT:
48
- return _objectSpread(_objectSpread({}, _constants.KEYBOARD_MOVEMENTS), {}, {
49
- MOVE_UP: "DOWN-ARROW",
50
- MOVE_DOWN: "UP-ARROW"
51
- });
52
- case _constants.POSITION.UP_LEFT:
53
- return _objectSpread(_objectSpread({}, _constants.KEYBOARD_MOVEMENTS), {}, {
54
- MOVE_UP: "DOWN-ARROW",
55
- MOVE_DOWN: "UP-ARROW",
56
- MOVE_LEFT: "RIGHT-ARROW",
57
- MOVE_RIGHT: "LEFT-ARROW"
58
- });
59
- case _constants.POSITION.DOWN_LEFT:
60
- return _objectSpread(_objectSpread({}, _constants.KEYBOARD_MOVEMENTS), {}, {
61
- MOVE_LEFT: "RIGHT-ARROW",
62
- MOVE_RIGHT: "LEFT-ARROW"
63
- });
64
- default:
65
- return _constants.KEYBOARD_MOVEMENTS;
66
- }
67
- }, [menuposition]);
68
- };
69
- var useTransformedDataset = function useTransformedDataset(dataset, itemlabel, orderby, itemchildren, dataPath) {
70
- return (0, _react.useMemo)(function () {
71
- if (!dataset) return _constants.DEFAULT_DATASET;
72
- return (0, _transformedDatasetUtils.transformDataset)(dataset, undefined, itemlabel, undefined, undefined, orderby, null, dataPath, itemchildren);
73
- }, [dataset, itemlabel, orderby]);
74
- };
75
- var useHoverState = function useHoverState() {
76
- var _useState = (0, _react.useState)(new Set()),
77
- hoveredNodes = _useState[0],
78
- setHoveredNodes = _useState[1];
79
- var leaveTimerRef = (0, _react.useRef)(null);
80
- var enterTimerRef = (0, _react.useRef)(null);
81
- var handleNodeMouseEnter = (0, _react.useCallback)(function (node) {
82
- if (leaveTimerRef.current) {
83
- clearTimeout(leaveTimerRef.current);
84
- leaveTimerRef.current = null;
85
- }
86
-
87
- // Clear any pending enter timer
88
- if (enterTimerRef.current) {
89
- clearTimeout(enterTimerRef.current);
90
- enterTimerRef.current = null;
91
- }
92
-
93
- // Add node to hovered set immediately
94
- setHoveredNodes(function (prev) {
95
- return new Set([].concat((0, _toConsumableArray2["default"])(prev), [node]));
96
- });
97
- }, []);
98
- var handleNodeMouseLeave = (0, _react.useCallback)(function (node, event) {
99
- var _relatedTarget$classL, _relatedTarget$closes;
100
- var relatedTarget = event === null || event === void 0 ? void 0 : event.relatedTarget;
101
- var isMovingToChild = relatedTarget && (((_relatedTarget$classL = relatedTarget.classList) === null || _relatedTarget$classL === void 0 ? void 0 : _relatedTarget$classL.contains("dropdown-menu")) || ((_relatedTarget$closes = relatedTarget.closest) === null || _relatedTarget$closes === void 0 ? void 0 : _relatedTarget$closes.call(relatedTarget, ".dropdown-menu")) !== null);
102
-
103
- // if (!isMovingToChild) {
104
- // Clear any pending enter timer
105
- if (enterTimerRef.current) {
106
- clearTimeout(enterTimerRef.current);
107
- enterTimerRef.current = null;
108
- }
109
-
110
- // Set a delay before removing the node from hovered set
111
- // leaveTimerRef.current = setTimeout(() => {
112
- setHoveredNodes(function (prev) {
113
- var newSet = new Set(prev);
114
- newSet["delete"](node);
115
- return newSet;
116
- });
117
- // }, HOVER_LEAVE_DELAY);
118
- // }
119
- }, []);
120
- (0, _react.useEffect)(function () {
121
- return function () {
122
- if (leaveTimerRef.current) {
123
- clearTimeout(leaveTimerRef.current);
124
- }
125
- if (enterTimerRef.current) {
126
- clearTimeout(enterTimerRef.current);
127
- }
128
- };
129
- }, []);
130
- return {
131
- hoveredNodes: hoveredNodes,
132
- handleNodeMouseEnter: handleNodeMouseEnter,
133
- handleNodeMouseLeave: handleNodeMouseLeave
134
- };
135
- };
136
-
137
50
  // Main component
138
51
  var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
139
52
  var _listener$appLocale;
140
53
  var _props$menualign = props.menualign,
141
54
  menualign = _props$menualign === void 0 ? "left" : _props$menualign,
142
55
  _props$menuposition = props.menuposition,
143
- menuposition = _props$menuposition === void 0 ? "down,right" : _props$menuposition,
56
+ initialMenuPosition = _props$menuposition === void 0 ? "down,right" : _props$menuposition,
144
57
  _props$menulayout = props.menulayout,
145
58
  menulayout = _props$menulayout === void 0 ? "vertical" : _props$menulayout,
146
59
  menuclass = props.menuclass,
@@ -199,29 +112,58 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
199
112
  isFromNav = _props$isFromNav === void 0 ? false : _props$isFromNav,
200
113
  onNavItemActivate = props.onNavItemActivate,
201
114
  restProps = (0, _objectWithoutProperties2["default"])(props, _excluded);
115
+
116
+ // deeply cloning the dataset, it was getting mutated in the useTransformedDataset hook
117
+ var deepCloneDataset = (0, _lodash.cloneDeep)(dataset);
118
+ var itemLabelWrapper = typeof itemlabel === "function" ? function (rest) {
119
+ return itemlabel(_objectSpread({
120
+ App: listener === null || listener === void 0 ? void 0 : listener.App
121
+ }, rest));
122
+ } : itemlabel;
202
123
  var path = (0, _navigation.usePathname)();
124
+
125
+ // Get current user information
126
+ var _useCurrentUser = (0, _useAuth.useCurrentUser)(),
127
+ user = _useCurrentUser.user;
128
+
203
129
  // State
204
- var _useState2 = (0, _react.useState)(false),
205
- open = _useState2[0],
206
- setOpen = _useState2[1];
207
- var _useState3 = (0, _react.useState)(null),
208
- activeItem = _useState3[0],
209
- setActiveItem = _useState3[1];
210
- var _useState4 = (0, _react.useState)(-1),
211
- focusedIndex = _useState4[0],
212
- setFocusedIndex = _useState4[1];
130
+ var _useState = (0, _react.useState)(false),
131
+ open = _useState[0],
132
+ setOpen = _useState[1];
133
+ var _useState2 = (0, _react.useState)(null),
134
+ activeItem = _useState2[0],
135
+ setActiveItem = _useState2[1];
136
+ var _useState3 = (0, _react.useState)(-1),
137
+ focusedIndex = _useState3[0],
138
+ setFocusedIndex = _useState3[1];
139
+ var _useState4 = (0, _react.useState)(initialMenuPosition),
140
+ menuPosition = _useState4[0],
141
+ setMenuPosition = _useState4[1];
213
142
 
214
143
  // Refs
215
144
  var buttonRef = (0, _react.useRef)(null);
216
145
  var menuRef = (0, _react.useRef)(null);
217
146
 
218
147
  // Custom hooks
219
- var keyboardMovements = useKeyboardMovements(menuposition);
220
- var transformedDataset = useTransformedDataset(dataset, itemlabel, orderby, itemchildren, dataPath);
221
- var _useHoverState = useHoverState(),
222
- hoveredNodes = _useHoverState.hoveredNodes,
223
- handleNodeMouseEnter = _useHoverState.handleNodeMouseEnter,
224
- handleNodeMouseLeave = _useHoverState.handleNodeMouseLeave;
148
+ var keyboardMovements = (0, _useKeyboardMovements.useKeyboardMovements)(menuPosition);
149
+ var transformedDataset = (0, _useTransformedDataset.useTransformedDataset)(deepCloneDataset, itemLabelWrapper, orderby, itemchildren, dataPath);
150
+
151
+ // Apply role-based filtering if userrole prop is provided
152
+ var filteredDataset = (0, _react.useMemo)(function () {
153
+ if (!userrole || !transformedDataset) {
154
+ return transformedDataset;
155
+ }
156
+
157
+ // Get user roles from the logged-in user
158
+ var userRoles = (user === null || user === void 0 ? void 0 : user.roles) || [];
159
+
160
+ // Apply role filtering with the dynamic userrole key
161
+ return (0, _roleFilter.filterMenuNodesByRole)(transformedDataset, userRoles, userrole);
162
+ }, [transformedDataset, userrole, user === null || user === void 0 ? void 0 : user.roles]);
163
+ var _useHoverState = (0, _useHoverState2.useHoverState)(),
164
+ hoveredPaths = _useHoverState.hoveredPaths,
165
+ handlePathMouseEnter = _useHoverState.handlePathMouseEnter,
166
+ handlePathMouseLeave = _useHoverState.handlePathMouseLeave;
225
167
 
226
168
  // Hover handlers for showonhover functionality
227
169
  var handleContainerMouseEnter = (0, _react.useCallback)(function () {
@@ -230,10 +172,10 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
230
172
  }
231
173
  }, [showonhover]);
232
174
  var handleContainerMouseLeave = (0, _react.useCallback)(function (event) {
233
- var _relatedTarget$classL2, _relatedTarget$closes2, _relatedTarget$closes3;
175
+ var _relatedTarget$classL, _relatedTarget$closes, _relatedTarget$closes2;
234
176
  if (!showonhover) return;
235
177
  var relatedTarget = event === null || event === void 0 ? void 0 : event.relatedTarget;
236
- var isMovingToMenu = relatedTarget && (((_relatedTarget$classL2 = relatedTarget.classList) === null || _relatedTarget$classL2 === void 0 ? void 0 : _relatedTarget$classL2.contains("dropdown-menu")) || ((_relatedTarget$closes2 = relatedTarget.closest) === null || _relatedTarget$closes2 === void 0 ? void 0 : _relatedTarget$closes2.call(relatedTarget, ".dropdown-menu")) !== null || ((_relatedTarget$closes3 = relatedTarget.closest) === null || _relatedTarget$closes3 === void 0 ? void 0 : _relatedTarget$closes3.call(relatedTarget, ".app-menu")) !== null);
178
+ var isMovingToMenu = relatedTarget && (((_relatedTarget$classL = relatedTarget.classList) === null || _relatedTarget$classL === void 0 ? void 0 : _relatedTarget$classL.contains("dropdown-menu")) || ((_relatedTarget$closes = relatedTarget.closest) === null || _relatedTarget$closes === void 0 ? void 0 : _relatedTarget$closes.call(relatedTarget, ".dropdown-menu")) !== null || ((_relatedTarget$closes2 = relatedTarget.closest) === null || _relatedTarget$closes2 === void 0 ? void 0 : _relatedTarget$closes2.call(relatedTarget, ".app-menu")) !== null);
237
179
  if (!isMovingToMenu) {
238
180
  setOpen(false);
239
181
  setFocusedIndex(-1);
@@ -244,24 +186,33 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
244
186
  // Memoized values
245
187
  var transformChildrenDataset = (0, _react.useCallback)(function (children) {
246
188
  if (!children || !Array.isArray(children)) return [];
247
- return (0, _transformedDatasetUtils.transformDataset)(children, "", itemlabel, undefined, undefined, orderby, undefined, undefined, itemchildren);
248
- }, [itemlabel, orderby]);
189
+ return (0, _transformedDatasetUtils.transformDataset)(children, "", itemLabelWrapper, undefined, undefined, orderby, undefined, undefined, itemchildren);
190
+ }, [itemLabelWrapper, orderby]);
249
191
  var createRefsForNodes = (0, _react.useCallback)(function (nodes) {
250
192
  if (!nodes || !Array.isArray(nodes)) return [];
251
193
  return nodes.map(function (node) {
194
+ var _dataObject;
252
195
  var nodeWithRef = _objectSpread({}, node);
253
196
  if (!nodeWithRef.nodeRef) {
254
197
  nodeWithRef.nodeRef = /*#__PURE__*/_react["default"].createRef();
255
198
  }
256
- if (nodeWithRef.children && nodeWithRef.children.length) {
257
- nodeWithRef.children = createRefsForNodes(transformChildrenDataset(nodeWithRef.children));
199
+
200
+ // Check for children at node.children first, then at dataObject.children (where datasetItems stores them)
201
+ var existingChildren = nodeWithRef.children || ((_dataObject = nodeWithRef.dataObject) === null || _dataObject === void 0 ? void 0 : _dataObject.children);
202
+ if (existingChildren && existingChildren.length) {
203
+ var _existingChildren$;
204
+ // If children already have dataObject (already transformed by datasetItems), just add refs
205
+ // Otherwise, transform them first
206
+ var alreadyTransformed = ((_existingChildren$ = existingChildren[0]) === null || _existingChildren$ === void 0 ? void 0 : _existingChildren$.dataObject) !== undefined;
207
+ var processedChildren = alreadyTransformed ? existingChildren : transformChildrenDataset(existingChildren);
208
+ nodeWithRef.children = createRefsForNodes(processedChildren);
258
209
  }
259
210
  return nodeWithRef;
260
211
  });
261
212
  }, [transformChildrenDataset]);
262
213
  var nodesWithRefs = (0, _react.useMemo)(function () {
263
- return createRefsForNodes(transformedDataset);
264
- }, [transformedDataset, createRefsForNodes]);
214
+ return createRefsForNodes(filteredDataset);
215
+ }, [filteredDataset, createRefsForNodes]);
265
216
  var flattenNodes = (0, _react.useCallback)(function (nodes) {
266
217
  if (!nodes || !Array.isArray(nodes)) return [];
267
218
  return nodes.reduce(function (acc, node) {
@@ -281,15 +232,15 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
281
232
  var children;
282
233
 
283
234
  // Handle itemlabel - can be a string (field name) or function (expression)
284
- if (typeof itemlabel === "function") {
235
+ if (typeof itemLabelWrapper === "function") {
285
236
  try {
286
- label = itemlabel(dataObject);
237
+ label = itemLabelWrapper(dataObject);
287
238
  } catch (error) {
288
239
  console.warn("Error evaluating itemlabel expression:", error);
289
240
  label = (node === null || node === void 0 ? void 0 : node["label"]) || dataObject["label"];
290
241
  }
291
242
  } else {
292
- label = (node === null || node === void 0 ? void 0 : node[itemlabel]) || dataObject[itemlabel];
243
+ label = (node === null || node === void 0 ? void 0 : node[itemLabelWrapper]) || dataObject[itemLabelWrapper];
293
244
  }
294
245
 
295
246
  // Handle itemchildren - can be a string (field name) or function (expression)
@@ -306,7 +257,9 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
306
257
  children = (node === null || node === void 0 ? void 0 : node["children"]) || dataObject["children"];
307
258
  }
308
259
  } else {
309
- children = (node === null || node === void 0 ? void 0 : node[itemchildren]) || dataObject[itemchildren];
260
+ // First check for already-transformed children (stored at 'children' by datasetItems),
261
+ // then fall back to raw data at the itemchildren key
262
+ children = (node === null || node === void 0 ? void 0 : node.children) || (dataObject === null || dataObject === void 0 ? void 0 : dataObject.children) || (node === null || node === void 0 ? void 0 : node[itemchildren]) || (dataObject === null || dataObject === void 0 ? void 0 : dataObject[itemchildren]);
310
263
  }
311
264
  return {
312
265
  label: label,
@@ -374,6 +327,8 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
374
327
  }, [onClick, listener, name, open, isFromNav, onNavItemActivate]);
375
328
  var handleMenuItemClick = (0, _react.useCallback)(function (event, item) {
376
329
  var _item$dataObject, _item$dataObject2, _item$dataObject3;
330
+ // since event is a synthetic event, we need to convert it to a native event to support the angular behavior
331
+ event = event.nativeEvent;
377
332
  var _getNodeProperties = getNodeProperties(item),
378
333
  label = _getNodeProperties.label,
379
334
  icon = _getNodeProperties.icon,
@@ -390,6 +345,7 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
390
345
  if (index !== -1) {
391
346
  setFocusedIndex(index);
392
347
  }
348
+ (0, _actionTask.executeActionTaskFromItem)(item, listener);
393
349
  if (item.children && item.children.length > 0) {
394
350
  item.expanded = !item.expanded;
395
351
  }
@@ -419,16 +375,21 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
419
375
  datavalue: label
420
376
  });
421
377
  }
422
- // Then trigger item action (executes action and/or navigates to link)
423
- // Use setTimeout to ensure onSelect navigation completes first, then dataset link navigation happens
424
- setTimeout(function () {
425
- (0, _utils.triggerItemAction)(simplifiedItem);
426
- }, 0);
378
+ var routeName = (0, _constants2.hyperLinkMofify)((0, _utils.getRouteNameFromLink)((simplifiedItem === null || simplifiedItem === void 0 ? void 0 : simplifiedItem.link) || ""));
379
+ // Check if target route is the current page - skip navigation to prevent refresh
380
+ var currentPath = window.location.pathname;
381
+ if (routeName !== currentPath) {
382
+ // timeout is used so that onSelect can perform its actions before the navigation happens
383
+ setTimeout(function () {
384
+ // this function is used to navigate when menuitem is expected to work as anchor
385
+ (0, _utils.triggerItemAction)(simplifiedItem);
386
+ }, 0);
387
+ }
427
388
  if (autoclose === _constants.AUTO_CLOSE.ALWAYS && (!item.children || item.children.length === 0)) {
428
389
  setOpen(false);
429
390
  setFocusedIndex(-1);
430
391
  }
431
- onActionsclick === null || onActionsclick === void 0 || onActionsclick(event, item);
392
+ onActionsclick === null || onActionsclick === void 0 || onActionsclick(item);
432
393
  }, [flattenedNodes, onSelect, props, name, listener, autoclose, getNodeProperties, isFromNav, onNavItemActivate]);
433
394
 
434
395
  // Keyboard navigation
@@ -578,7 +539,22 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
578
539
  }, [open, flattenedNodes.length, toggleMenu, handleArrowDown, handleArrowUp, handleEnterOrSpace, handleEscape, closeMenu, handleArrowRight, handleArrowLeft]);
579
540
 
580
541
  // Render functions
542
+ /**
543
+ * Recursively renders menu items with path-based hover tracking.
544
+ *
545
+ * @param nodes - Array of menu nodes to render
546
+ * @param pathPrefix - Parent path prefix for generating unique item paths
547
+ * e.g., "" for root, "0" for first item's children, "0-1" for nested
548
+ *
549
+ * Path structure examples:
550
+ * - Root item 0: "0"
551
+ * - Root item 1: "1"
552
+ * - First child of item 0: "0-0"
553
+ * - Second child of item 1: "1-1"
554
+ * - Grandchild: "0-0-0"
555
+ */
581
556
  var renderMenuItems = (0, _react.useCallback)(function (nodes) {
557
+ var pathPrefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "";
582
558
  if (!nodes || !Array.isArray(nodes)) return null;
583
559
  return nodes.map(function (node, index) {
584
560
  var _value;
@@ -589,71 +565,83 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
589
565
  hint = _getNodeProperties2.hint,
590
566
  disabled = _getNodeProperties2.disabled,
591
567
  children = _getNodeProperties2.children;
568
+
569
+ // Generate unique path for this menu item by combining parent path with index
570
+ var itemPath = pathPrefix ? "".concat(pathPrefix, "-").concat(index) : "".concat(index);
592
571
  var nodeValueLink = node === null || node === void 0 || (_value = node.value) === null || _value === void 0 ? void 0 : _value.link;
593
572
  var isActive = nodeValueLink && typeof nodeValueLink === "string" ? isPathMatchingLink(path, nodeValueLink) : link ? isPathMatchingLink(path, link) : false;
594
- var _menuposition$split = menuposition.split(","),
595
- _menuposition$split2 = (0, _slicedToArray2["default"])(_menuposition$split, 2),
596
- verticalPos = _menuposition$split2[0],
597
- horizontalPos = _menuposition$split2[1];
598
- var isHovered = hoveredNodes.has(node);
599
- var isSubmenuOpen = node.expanded || hoveredNodes.has(node);
600
- var submenuClassName = (0, _ListItems.buildMenuListClasses)(iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuposition, isHovered);
573
+ var _menuPosition$split = menuPosition.split(","),
574
+ _menuPosition$split2 = (0, _slicedToArray2["default"])(_menuPosition$split, 2),
575
+ verticalPos = _menuPosition$split2[0],
576
+ horizontalPos = _menuPosition$split2[1];
577
+
578
+ // Check if this specific path is currently hovered
579
+ var isHovered = hoveredPaths.has(itemPath);
580
+
581
+ // Submenu opens when item is expanded OR hovered
582
+ var isSubmenuOpen = node.expanded || isHovered;
583
+ var submenuClassName = (0, _ListItems.buildMenuListClasses)(iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuPosition, isHovered);
601
584
  return __jsx(_Box["default"], {
602
585
  component: "li",
603
586
  key: index,
604
587
  className: (0, _clsx["default"])(children && children.length > 0 && "dropdown-submenu", "app-menu-item", {
605
588
  active: isActive,
606
- hovered: hoveredNodes.has(node)
607
- }),
589
+ hovered: isHovered
590
+ })
591
+ // Track hover state for this item's path
592
+ ,
608
593
  onMouseEnter: function onMouseEnter() {
609
- return handleNodeMouseEnter(node);
594
+ return handlePathMouseEnter(itemPath);
610
595
  },
611
596
  onMouseLeave: function onMouseLeave(e) {
612
- return handleNodeMouseLeave(node, e);
597
+ return handlePathMouseLeave(itemPath, e);
613
598
  },
614
599
  style: {
615
600
  position: "relative"
616
601
  }
617
- }, __jsx(_link["default"], {
602
+ }, __jsx(_Link["default"], {
618
603
  title: label,
619
604
  className: disabled ? "disabled" : "",
620
- href: "#",
621
605
  onClick: function onClick(event) {
622
606
  handleMenuItemClick(event, node);
623
- },
624
- prefetch: false
607
+ }
625
608
  }, children && children.length > 0 && __jsx("span", {
626
609
  className: (0, _clsx["default"])("pull-right fa caret", _constants.menuAlignClass[menualign] || "fa-caret-right")
627
610
  }), icon && __jsx("i", {
628
611
  className: "app-icon ".concat(icon)
629
612
  }), __jsx("span", {
630
613
  className: "anchor-caption"
631
- }, label || itemlabel)), children && children.length > 0 && (type !== "anchor" ? __jsx(_ListItems.CollapsibleMenu, {
614
+ }, label)), children && children.length > 0 && (type !== "anchor" ? __jsx(_ListItems.CollapsibleMenu, {
632
615
  isOpen: isSubmenuOpen,
633
616
  verticalPos: verticalPos,
634
617
  className: submenuClassName,
635
- style: getMenuLayoutStyles(),
618
+ style: getMenuLayoutStyles()
619
+ // IMPORTANT: Submenu container also tracks the PARENT's path
620
+ // This keeps the parent in hover state when mouse moves to submenu
621
+ ,
636
622
  onMouseEnter: function onMouseEnter() {
637
- return handleNodeMouseEnter(node);
623
+ return handlePathMouseEnter(itemPath);
638
624
  },
639
625
  onMouseLeave: function onMouseLeave(e) {
640
- return handleNodeMouseLeave(node, e);
626
+ return handlePathMouseLeave(itemPath, e);
641
627
  }
642
- }, renderMenuItems(children)) : isSubmenuOpen && open && __jsx(_ListItems.MenuList, {
628
+ }, renderMenuItems(children, itemPath)) : isSubmenuOpen && open && __jsx(_ListItems.MenuList, {
643
629
  className: submenuClassName,
644
- style: getMenuLayoutStyles(),
630
+ style: getMenuLayoutStyles()
631
+ // Same hover tracking for anchor-type menus
632
+ ,
645
633
  onMouseEnter: function onMouseEnter() {
646
- return handleNodeMouseEnter(node);
634
+ return handlePathMouseEnter(itemPath);
647
635
  },
648
636
  onMouseLeave: function onMouseLeave(e) {
649
- return handleNodeMouseLeave(node, e);
637
+ return handlePathMouseLeave(itemPath, e);
650
638
  },
651
639
  onClick: function onClick(event) {
652
- return onActionsclick(event, node);
640
+ return onActionsclick === null || onActionsclick === void 0 ? void 0 : onActionsclick(node);
653
641
  }
654
- }, renderMenuItems(children))));
642
+ }, renderMenuItems(children, itemPath))));
655
643
  });
656
- }, [getNodeProperties, menuposition, hoveredNodes, handleNodeMouseEnter, handleNodeMouseLeave, hint, handleMenuItemClick, activeItem, linktarget, iconposition, animateitems, menualign, getMenuLayoutStyles, type, open, panelPosition]);
644
+ }, [getNodeProperties, menuPosition, hoveredPaths, handlePathMouseEnter, handlePathMouseLeave, hint, handleMenuItemClick, activeItem, linktarget, iconposition, animateitems, menualign, getMenuLayoutStyles, type, open, panelPosition]);
657
645
 
658
646
  // Effects
659
647
  (0, _react.useEffect)(function () {
@@ -665,22 +653,22 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
665
653
  if (autoopen === _constants.AUTO_OPEN.ALWAYS) {
666
654
  setOpen(true);
667
655
  } else if (autoopen === _constants.AUTO_OPEN.ACTIVE_PAGE) {
668
- var hasActiveItem = transformedDataset.some(function (node) {
669
- return hasLinkToCurrentPage([node], window.location.pathname);
656
+ var hasActiveItem = filteredDataset.some(function (node) {
657
+ return _hasLinkToCurrentPage([node], window.location.pathname);
670
658
  });
671
659
  if (hasActiveItem) {
672
660
  setOpen(true);
673
661
  }
674
662
  }
675
- }, [transformedDataset, autoopen]);
663
+ }, [filteredDataset, autoopen]);
676
664
  var notifiedPathRef = (0, _react.useRef)(null);
677
665
  (0, _react.useEffect)(function () {
678
- if (!isFromNav || !onNavItemActivate || !transformedDataset || transformedDataset.length === 0) {
666
+ if (!isFromNav || !onNavItemActivate || !filteredDataset || filteredDataset.length === 0) {
679
667
  return;
680
668
  }
681
669
 
682
670
  // Check if any menu item is active using the same logic as renderMenuItems
683
- var checkIfActive = function checkIfActive(nodes) {
671
+ var _checkIfActive = function checkIfActive(nodes) {
684
672
  if (!nodes || !Array.isArray(nodes)) return false;
685
673
  return nodes.some(function (node) {
686
674
  var _value2;
@@ -691,12 +679,12 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
691
679
  var isActive = nodeValueLink && typeof nodeValueLink === "string" ? isPathMatchingLink(path, nodeValueLink) : link ? isPathMatchingLink(path, link) : false;
692
680
  if (isActive) return true;
693
681
  if (children && children.length > 0) {
694
- return checkIfActive(children);
682
+ return _checkIfActive(children);
695
683
  }
696
684
  return false;
697
685
  });
698
686
  };
699
- var hasActiveItem = checkIfActive(transformedDataset);
687
+ var hasActiveItem = _checkIfActive(filteredDataset);
700
688
 
701
689
  // Notify nav if there's an active item and we haven't notified for this path yet
702
690
  if (hasActiveItem && notifiedPathRef.current !== path) {
@@ -707,10 +695,10 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
707
695
  // Reset when no active item found
708
696
  notifiedPathRef.current = null;
709
697
  }
710
- }, [path, transformedDataset, isFromNav, onNavItemActivate, getNodeProperties]);
698
+ }, [path, filteredDataset, isFromNav, onNavItemActivate, getNodeProperties]);
711
699
  (0, _react.useEffect)(function () {
712
700
  // Handle outside click for both "outsideClick" and "always" autoclose modes
713
- if (!open || autoclose === _constants.AUTO_CLOSE.NEVER) return;
701
+ if (!open || autoclose === _constants.AUTO_CLOSE.NEVER || autoclose === _constants.AUTO_CLOSE.DISABLED) return;
714
702
  var handleOutsideClick = function handleOutsideClick(event) {
715
703
  var _menuRef$current, _buttonRef$current2;
716
704
  if (!event.target) return;
@@ -747,12 +735,45 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
747
735
  window.removeEventListener("keydown", handleShortcutKey);
748
736
  };
749
737
  }, [shortcutkey]);
738
+
739
+ // Fallback: run action task once when nodes$ is absent and an active item exists in the dataset
740
+ var executedInitialActiveRef = (0, _react.useRef)(false);
741
+ (0, _react.useEffect)(function () {
742
+ if (nodes$ && typeof nodes$.subscribe === "function") return; // nodes$ flow will handle it
743
+ if (executedInitialActiveRef.current) return;
744
+ if (!transformedDataset || transformedDataset.length === 0) return;
745
+ var itemFound = false;
746
+ var _getItem = function getItem(nodes) {
747
+ if (!nodes || !Array.isArray(nodes)) return;
748
+ nodes.forEach(function (item) {
749
+ var _dataObject2;
750
+ if (itemFound) return;
751
+ if (item !== null && item !== void 0 && item.isactive || item !== null && item !== void 0 && (_dataObject2 = item.dataObject) !== null && _dataObject2 !== void 0 && _dataObject2.isactive) {
752
+ itemFound = true;
753
+ if (listener !== null && listener !== void 0 && listener.Widgets && name && onSelect) {
754
+ var widget = listener.Widgets[name];
755
+ if (widget) {
756
+ onSelect({}, widget, item);
757
+ }
758
+ }
759
+ (0, _actionTask.executeActionTaskFromItem)(item, listener);
760
+ }
761
+ if (item.children && !(0, _lodash.isEmpty)(item.children)) {
762
+ _getItem(item.children);
763
+ }
764
+ });
765
+ };
766
+ _getItem(transformedDataset);
767
+ if (itemFound) {
768
+ executedInitialActiveRef.current = true;
769
+ }
770
+ }, []);
750
771
  (0, _react.useEffect)(function () {
751
772
  if (!nodes$ || typeof nodes$.subscribe !== "function") return;
752
773
  var datasetSubscription = nodes$.subscribe(function () {
753
774
  if (!dataset) return;
754
775
  var itemFound = false;
755
- var getItem = function getItem(nodes) {
776
+ var _getItem2 = function getItem(nodes) {
756
777
  if (!nodes || !Array.isArray(nodes)) return;
757
778
  nodes.forEach(function (item) {
758
779
  if (itemFound) return;
@@ -767,11 +788,11 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
767
788
  return false;
768
789
  }
769
790
  if (item.children && !(0, _lodash.isEmpty)(item.children)) {
770
- getItem(item.children);
791
+ _getItem2(item.children);
771
792
  }
772
793
  });
773
794
  };
774
- getItem(dataset);
795
+ _getItem2(dataset);
775
796
  });
776
797
  return function () {
777
798
  if (datasetSubscription && typeof datasetSubscription.unsubscribe === "function") {
@@ -780,14 +801,130 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
780
801
  };
781
802
  }, [dataset, nodes$, name, listener, onSelect]);
782
803
 
804
+ // ============ Exposed Methods Implementation ============
805
+ // 1. onShow - Lifecycle callback triggered when menu opens
806
+ var onShowCallback = (0, _react.useCallback)(function () {
807
+ // Similar to Angular's @HostListener('onShown') - lines 121-129
808
+ // Focus first item if opened via keyboard
809
+ if (open && flattenedNodes.length > 0 && focusedIndex === 0) {
810
+ setTimeout(function () {
811
+ var _flattenedNodes$;
812
+ (_flattenedNodes$ = flattenedNodes[0]) === null || _flattenedNodes$ === void 0 || (_flattenedNodes$ = _flattenedNodes$.nodeRef) === null || _flattenedNodes$ === void 0 || (_flattenedNodes$ = _flattenedNodes$.current) === null || _flattenedNodes$ === void 0 || _flattenedNodes$.focus();
813
+ }, 0);
814
+ }
815
+
816
+ // add the open class to the menu
817
+ setOpen(true);
818
+ }, [open, flattenedNodes, focusedIndex, props, listener, name]);
819
+
820
+ // 2. onHide - Lifecycle callback triggered when menu closes
821
+ var onHideCallback = (0, _react.useCallback)(function () {
822
+ // Similar to Angular's @HostListener('onHidden') - lines 130-137
823
+ // Reset menu state
824
+ setFocusedIndex(-1);
825
+ setActiveItem(null);
826
+
827
+ // Reset menuposition to original value
828
+ setMenuPosition(initialMenuPosition);
829
+
830
+ // remove the open class from the menu
831
+ setOpen(false);
832
+ }, [initialMenuPosition, props, listener, name]);
833
+
834
+ // 3. resetNodes - Method to reset/rebuild menu items
835
+ var resetNodesMethod = (0, _react.useCallback)(function () {
836
+ // Similar to Angular's resetNodes() - lines 227-233
837
+ // Call the parent resetNavNodes if available
838
+ if (resetNavNodes) {
839
+ resetNavNodes();
840
+ }
841
+
842
+ // Auto-open logic from Angular implementation
843
+ if (autoopen === _constants.AUTO_OPEN.ACTIVE_PAGE && _hasLinkToCurrentPage(transformedDataset, path)) {
844
+ setOpen(true);
845
+ } else if (autoopen === _constants.AUTO_OPEN.ALWAYS) {
846
+ setOpen(true);
847
+ }
848
+ }, [resetNavNodes, autoopen, transformedDataset, path]);
849
+
850
+ // 4. setMenuPosition - Method to programmatically change menu position
851
+ var setMenuPositionMethod = (0, _react.useCallback)(function (position) {
852
+ // Similar to Angular's setMenuPosition() - lines 261-287
853
+ var validPositions = [_constants.POSITION.DOWN_RIGHT, _constants.POSITION.DOWN_LEFT, _constants.POSITION.UP_RIGHT, _constants.POSITION.UP_LEFT, _constants.POSITION.INLINE];
854
+ if (validPositions.includes(position)) {
855
+ setMenuPosition(position);
856
+ } else {
857
+ console.warn("Invalid menu position: ".concat(position, ". Valid positions are: ").concat(validPositions.join(", ")));
858
+ }
859
+ }, []);
860
+
861
+ // 5. onKeyDown - Expose keyboard handler
862
+ var onKeyDownMethod = (0, _react.useCallback)(function (event, eventAction) {
863
+ // Similar to Angular's onKeyDown($event, eventAction) - lines 145-173
864
+ // This matches Angular's signature: onKeyDown($event, eventAction)
865
+ if (eventAction) {
866
+ // Handle specific event action if provided
867
+ }
868
+ handleKeyDown(event);
869
+ }, [handleKeyDown]);
870
+
871
+ // 6. onMenuItemSelect - Expose menu item select handler
872
+ var onMenuItemSelectMethod = (0, _react.useCallback)(function (event, item) {
873
+ var _listener$Widgets;
874
+ // Similar to Angular's onMenuItemSelect(args) - lines 289-293
875
+ // This matches Angular's signature: onMenuItemSelect({ $event, $item })
876
+ if (onSelect && listener !== null && listener !== void 0 && (_listener$Widgets = listener.Widgets) !== null && _listener$Widgets !== void 0 && _listener$Widgets[name]) {
877
+ onSelect(event, listener.Widgets[name], item);
878
+ }
879
+ }, [onSelect, listener, name]);
880
+
881
+ // ============ Expose Methods to Widget Proxy ============
882
+ // This makes methods accessible via Page.Widgets.menu4.methodName
883
+ (0, _react.useEffect)(function () {
884
+ if (listener !== null && listener !== void 0 && listener.onChange && name) {
885
+ Object.defineProperty(onShowCallback, "name", {
886
+ value: "onShow",
887
+ writable: false
888
+ });
889
+ Object.defineProperty(onHideCallback, "name", {
890
+ value: "onHide",
891
+ writable: false
892
+ });
893
+ Object.defineProperty(onKeyDownMethod, "name", {
894
+ value: "onKeyDown",
895
+ writable: false
896
+ });
897
+ Object.defineProperty(resetNodesMethod, "name", {
898
+ value: "resetNodes",
899
+ writable: false
900
+ });
901
+ Object.defineProperty(setMenuPositionMethod, "name", {
902
+ value: "setMenuPosition",
903
+ writable: false
904
+ });
905
+ Object.defineProperty(onMenuItemSelectMethod, "name", {
906
+ value: "onMenuItemSelect",
907
+ writable: false
908
+ });
909
+ listener.onChange(name, {
910
+ onShow: onShowCallback,
911
+ onHide: onHideCallback,
912
+ onKeyDown: onKeyDownMethod,
913
+ resetNodes: resetNodesMethod,
914
+ setMenuPosition: setMenuPositionMethod,
915
+ onMenuItemSelect: onMenuItemSelectMethod
916
+ });
917
+ }
918
+ }, []);
919
+
783
920
  // Memoized class names and styles
784
- var _menuposition$split3 = menuposition.split(","),
785
- _menuposition$split4 = (0, _slicedToArray2["default"])(_menuposition$split3, 2),
786
- verticalPos = _menuposition$split4[0],
787
- horizontalPos = _menuposition$split4[1];
921
+ var _menuPosition$split3 = menuPosition.split(","),
922
+ _menuPosition$split4 = (0, _slicedToArray2["default"])(_menuPosition$split3, 2),
923
+ verticalPos = _menuPosition$split4[0],
924
+ horizontalPos = _menuPosition$split4[1];
788
925
  var mainMenuClassName = (0, _react.useMemo)(function () {
789
- return (0, _ListItems.buildMenuListClasses)(iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuposition);
790
- }, [iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuposition]);
926
+ return (0, _ListItems.buildMenuListClasses)(iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuPosition);
927
+ }, [iconposition, menulayout, horizontalPos, panelPosition, animateitems, menuPosition]);
791
928
  var hoverEventHandlers = showonhover ? {
792
929
  onMouseEnter: handleContainerMouseEnter,
793
930
  onMouseLeave: handleContainerMouseLeave
@@ -797,14 +934,16 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
797
934
  return __jsx("div", (0, _extends2["default"])({
798
935
  caption: caption,
799
936
  ref: menuRef,
800
- className: (0, _clsx["default"])("dropdown", "app-menu", menuclass, className, "menu-layout-".concat(menulayout), "menu-align-".concat(menualign), open ? "open" : "", menuposition !== null && menuposition !== void 0 && menuposition.startsWith("up") ? "dropup" : "", menuposition === _constants.POSITION.INLINE ? "dropinline-menu" : "")
937
+ className: (0, _clsx["default"])("dropdown", "app-menu", {
938
+ open: open
939
+ })
801
940
  }, hoverEventHandlers, {
802
- style: _objectSpread(_objectSpread({}, buttonStyles), menuContainerStyles),
803
941
  onKeyDown: handleKeyDown,
804
942
  role: "menu",
805
943
  "aria-label": arialabel || "Menu",
806
944
  "aria-expanded": open,
807
- type: type
945
+ type: type,
946
+ name: name
808
947
  }), __jsx(_Tooltip["default"], {
809
948
  title: hint || "",
810
949
  enterDelay: _constants.TOOLTIP_ENTER_DELAY,
@@ -832,9 +971,9 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
832
971
  }, "".concat(caption, " ").concat(listener === null || listener === void 0 || (_listener$appLocale = listener.appLocale) === null || _listener$appLocale === void 0 ? void 0 : _listener$appLocale.LABEL_ICON)), __jsx("span", {
833
972
  className: "anchor-caption"
834
973
  }, caption || ""), __jsx("span", {
835
- className: "pull-right caret fa ".concat(_constants.CARET_CLS.DOWN)
974
+ className: (0, _clsx["default"])("pull-right caret fa", menuPosition !== null && menuPosition !== void 0 && menuPosition.startsWith("up") ? _constants.CARET_CLS.UP : _constants.CARET_CLS.DOWN)
836
975
  })) : __jsx(_Button["default"], (0, _extends2["default"])({
837
- className: (0, _clsx["default"])("btn dropdown-toggle", "icon-position-".concat(iconposition)),
976
+ className: (0, _clsx["default"])("btn dropdown-toggle", "icon-position-".concat(iconposition), "app-button", menuclass, className, "menu-layout-".concat(menulayout), "menu-align-".concat(menualign), open ? "open" : "", menuPosition !== null && menuPosition !== void 0 && menuPosition.startsWith("up") ? "dropup" : "", menuPosition === _constants.POSITION.INLINE ? "dropinline-menu" : ""),
838
977
  ref: buttonRef,
839
978
  onClick: handleMenuClick,
840
979
  "aria-haspopup": "true",
@@ -842,18 +981,17 @@ var WmMenu = /*#__PURE__*/(0, _react.memo)(function (props) {
842
981
  "aria-label": arialabel || "Menu",
843
982
  accessKey: shortcutkey,
844
983
  tabIndex: props.tabindex,
845
- style: {
984
+ style: _objectSpread(_objectSpread({
846
985
  width: width !== undefined ? typeof width === "number" ? "".concat(width, "px") : width : undefined,
847
- height: height !== undefined ? typeof height === "number" ? "".concat(height, "px") : height : undefined,
848
- textAlign: menualign
849
- }
986
+ height: height !== undefined ? typeof height === "number" ? "".concat(height, "px") : height : undefined
987
+ }, buttonStyles), menuContainerStyles)
850
988
  }, restProps), iconclass && __jsx("i", {
851
989
  className: (0, _clsx["default"])("app-icon", iconclass),
852
990
  "aria-hidden": "true"
853
991
  }), __jsx("span", {
854
- className: "caption"
855
- }, children || caption || "Menu"), __jsx("span", {
856
- className: (0, _clsx["default"])("pull-right caret fa", (menuposition === null || menuposition === void 0 ? void 0 : menuposition.startsWith("up")) !== open ? _constants.CARET_CLS.UP : _constants.CARET_CLS.DOWN)
992
+ className: "btn-caption"
993
+ }, caption), __jsx("span", {
994
+ className: (0, _clsx["default"])("pull-right caret fa", menuPosition !== null && menuPosition !== void 0 && menuPosition.startsWith("up") ? _constants.CARET_CLS.UP : _constants.CARET_CLS.DOWN)
857
995
  }))), type !== "anchor" ? __jsx(_ListItems.CollapsibleMenu, (0, _extends2["default"])({
858
996
  isOpen: open,
859
997
  verticalPos: verticalPos,