@wavemaker/react-runtime 11.14.2-rc.6311 → 12.0.0-next.28533
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.
- package/actions/base-action.js +5 -7
- package/actions/login-action.js +7 -8
- package/actions/logout-action.js +5 -7
- package/actions/navigation-action.js +32 -10
- package/actions/notification-action.js +22 -8
- package/actions/timer-action.js +13 -15
- package/actions/toast.js +4 -2
- package/actions/toast.service.js +1 -2
- package/components/advanced/carousel/index.js +1 -1
- package/components/advanced/carousel/template.js +1 -1
- package/components/basic/anchor/index.js +26 -9
- package/components/basic/html/index.js +115 -24
- package/components/basic/icon/index.js +2 -1
- package/components/basic/iframe/index.js +2 -1
- package/components/basic/label/index.js +12 -9
- package/components/basic/message/index.js +12 -3
- package/components/basic/picture/index.js +11 -4
- package/components/basic/progress-bar/index.js +1 -1
- package/components/basic/progress-circle/index.js +34 -28
- package/components/basic/progress-circle/props.js +10 -2
- package/components/basic/richtexteditor/index.js +95 -94
- package/components/basic/search/index.js +401 -156
- package/components/basic/search/providers.js +126 -61
- package/components/basic/spinner/index.js +2 -1
- package/components/basic/tree/index.js +34 -34
- package/components/basic/tree/utils.js +10 -4
- package/components/chart/components/barColumnChart/index.js +36 -33
- package/components/chart/components/bubbleChart/index.js +35 -25
- package/components/chart/components/chartLegend/utils.js +2 -1
- package/components/chart/components/cumulativeLineChart/index.js +30 -26
- package/components/chart/components/lineAreaChart/index.js +50 -32
- package/components/chart/components/pieDonutChart/index.js +13 -4
- package/components/chart/hooks/useXAxisConfig.js +15 -8
- package/components/chart/index.js +223 -53
- package/components/chart/utils.js +12 -1
- package/components/constants.js +5 -2
- package/components/container/accordion/accordion-pane/index.js +17 -12
- package/components/container/accordion/index.js +9 -4
- package/components/container/alignment-utils.js +56 -1
- package/components/container/index.js +49 -20
- package/components/container/panel/components/panel-header/index.js +3 -4
- package/components/container/panel/index.js +15 -10
- package/components/container/tabs/index.js +92 -14
- package/components/container/tabs/tab-pane/index.js +15 -8
- package/components/container/tabs/utils.js +51 -0
- package/components/container/wizard/components/StepComponents.js +2 -1
- package/components/container/wizard/components/WizardStep.js +2 -1
- package/components/container/wizard/index.js +64 -35
- package/components/container/wizard/utils.js +46 -1
- package/components/container/wizard/wizard-step/index.js +11 -1
- package/components/data/card/card-content/index.js +1 -1
- package/components/data/form/base-form/index.js +991 -180
- package/components/data/form/base-form/props.js +3 -1
- package/components/data/form/base-form/utils.js +159 -1
- package/components/data/form/dynamic-fields/constant.js +53 -0
- package/components/data/form/dynamic-fields/index.js +10 -45
- package/components/data/form/dynamic-fields/utils.js +37 -2
- package/components/data/form/form-action/index.js +5 -4
- package/components/data/form/form-context.js +5 -1
- package/components/data/form/form-controller/utils.js +84 -0
- package/components/data/form/form-controller/validation-contrustor.js +402 -189
- package/components/data/form/form-controller/withFormController.js +191 -52
- package/components/data/form/form-field/base-field.js +54 -33
- package/components/data/form/form-field/index.js +28 -5
- package/components/data/form/form-header/index.js +3 -4
- package/components/data/form/index.js +20 -1
- package/components/data/list/components/ListDND.js +2 -1
- package/components/data/list/components/ListItem.js +6 -2
- package/components/data/list/components/ListItemWithTemplate.js +46 -2
- package/components/data/list/components/ListItems.js +17 -26
- package/components/data/list/components/ListPagination.js +3 -3
- package/components/data/list/components/StandardListItems.js +3 -4
- package/components/data/list/hooks/useListEffects.js +55 -14
- package/components/data/list/hooks/useListEventHandlers.js +3 -1
- package/components/data/list/hooks/useListState.js +3 -1
- package/components/data/list/hooks/usePaginatedGroupedData.js +18 -5
- package/components/data/list/index.js +74 -55
- package/components/data/list/utils/list-helpers.js +73 -35
- package/components/data/list/utils/list-widget-methods.js +138 -95
- package/components/data/live-filter/index.js +26 -15
- package/components/data/live-form/index.js +23 -7
- package/components/data/live-form/props.js +1 -1
- package/components/data/pagination/components/BasicPagination.js +71 -16
- package/components/data/pagination/components/PageSizeSelector.js +8 -3
- package/components/data/pagination/components/TotalRecords.js +1 -5
- package/components/data/pagination/hooks/usePagination.js +349 -66
- package/components/data/pagination/index.js +137 -19
- package/components/data/table/components/AddNewRow.js +5 -1
- package/components/data/table/components/EditableCell.js +2 -2
- package/components/data/table/components/RowCells.js +64 -0
- package/components/data/table/components/RowExpansionButton.js +2 -2
- package/components/data/table/components/SummaryCell.js +111 -0
- package/components/data/table/components/SummaryRow.js +54 -0
- package/components/data/table/components/SummaryRowFooter.js +46 -0
- package/components/data/table/components/TableBody.js +61 -59
- package/components/data/table/components/TableDataRow.js +109 -0
- package/components/data/table/components/TableFilters.js +225 -121
- package/components/data/table/components/TableHeader.js +291 -23
- package/components/data/table/components/TablePanelHeading.js +139 -8
- package/components/data/table/components/index.js +22 -1
- package/components/data/table/hooks/use-edited-rows.js +141 -0
- package/components/data/table/hooks/useCellState.js +5 -12
- package/components/data/table/hooks/useFormWidget.js +58 -51
- package/components/data/table/hooks/usePaginationState.js +45 -24
- package/components/data/table/hooks/usePanelStructure.js +4 -4
- package/components/data/table/hooks/useRowHandlers.js +39 -5
- package/components/data/table/hooks/useRowSelection.js +244 -50
- package/components/data/table/hooks/useServerSideSorting.js +81 -37
- package/components/data/table/hooks/useTableColumns.js +211 -118
- package/components/data/table/hooks/useTableData.js +54 -9
- package/components/data/table/hooks/useTableEdit.js +272 -97
- package/components/data/table/hooks/useTableEffects.js +31 -13
- package/components/data/table/hooks/useTableFilter.js +1 -1
- package/components/data/table/hooks/useTableInitialization.js +23 -22
- package/components/data/table/hooks/useTableState.js +11 -5
- package/components/data/table/hooks/useTableStateManager.js +140 -65
- package/components/data/table/index.js +637 -274
- package/components/data/table/live-table/index.js +54 -22
- package/components/data/table/table-action/index.js +1 -1
- package/components/data/table/table-group/index.js +26 -0
- package/components/data/table/table-row-action/index.js +32 -18
- package/components/data/table/utils/buildSelectionColumns.js +12 -21
- package/components/data/table/utils/columnBuilder.js +29 -14
- package/components/data/table/utils/columnProxy.js +68 -1
- package/components/data/table/utils/constants.js +6 -2
- package/components/data/table/utils/crud-handlers.js +68 -63
- package/components/data/table/utils/groupHeaderUtils.js +102 -0
- package/components/data/table/utils/index.js +210 -21
- package/components/data/table/utils/renderDisplayCell.js +6 -6
- package/components/data/table/utils/selectionUtils.js +25 -26
- package/components/data/table/utils/validation.js +1 -0
- package/components/data/utils/filter-field-util.js +3 -3
- package/components/dialogs/alert-dialog/index.js +1 -1
- package/components/dialogs/confirm-dialog/index.js +1 -1
- package/components/dialogs/dialog/index.js +4 -1
- package/components/dialogs/dialog-content/index.js +3 -1
- package/components/dialogs/dialog-header/index.js +2 -2
- package/components/dialogs/iframe-dialog/index.js +11 -5
- package/components/dialogs/index.js +1 -1
- package/components/dialogs/login-dialog/index.js +1 -1
- package/components/dialogs/page-dialog/index.js +1 -1
- package/components/form/button/index.js +33 -7
- package/components/input/calendar/index.js +18 -6
- package/components/input/chips/index.js +99 -28
- package/components/input/chips/utils.js +34 -4
- package/components/input/color-picker/index.js +74 -25
- package/components/input/composite/index.js +3 -3
- package/components/input/currency/index.js +35 -49
- package/components/input/default/checkbox/index.js +23 -28
- package/components/input/default/checkboxset/index.js +38 -18
- package/components/input/default/checkboxset/utils.js +30 -0
- package/components/input/default/radioset/index.js +36 -39
- package/components/input/default/switch/index.js +30 -13
- package/components/input/epoch/date/index.js +130 -69
- package/components/input/epoch/date/utils.js +94 -1
- package/components/input/epoch/datetime/index.js +72 -22
- package/components/input/epoch/datetime/utils.js +49 -10
- package/components/input/epoch/time/index.js +68 -19
- package/components/input/epoch/time/utils.js +62 -14
- package/components/input/fileupload/Utils.js +12 -7
- package/components/input/fileupload/components/MultiUpload.js +2 -6
- package/components/input/fileupload/components/SingleUpload.js +3 -7
- package/components/input/fileupload/index.js +6 -10
- package/components/input/fileupload/useFileUpload.js +16 -5
- package/components/input/number/index.js +158 -43
- package/components/input/rating/index.js +90 -7
- package/components/input/select/index.js +147 -70
- package/components/input/slider/index.js +84 -26
- package/components/input/text/index.js +38 -18
- package/components/input/text/util.js +283 -130
- package/components/input/textarea/index.js +13 -10
- package/components/input/upload/index.js +124 -0
- package/components/input/upload/props.js +5 -0
- package/components/input/util/index.js +11 -0
- package/components/navbar/index.js +51 -3
- package/components/navbar/nav/index.js +46 -16
- package/components/navbar/nav-item/index.js +11 -5
- package/components/navigation/menu/components/ListItems.js +3 -0
- package/components/navigation/menu/constants.js +2 -1
- package/components/navigation/menu/hooks/useHoverState.hook.js +48 -0
- package/components/navigation/menu/hooks/useKeyboardMovements.hook.js +37 -0
- package/components/navigation/menu/hooks/useTransformedDataset.hook.js +15 -0
- package/components/navigation/menu/index.js +326 -188
- package/components/navigation/menu/utils/action-task.js +14 -0
- package/components/navigation/menu/utils/role-filter.js +76 -0
- package/components/navigation/popover/index.js +99 -26
- package/components/page/partial-container/index.js +34 -5
- package/components/prefab/index.js +2 -4
- package/context/PrefabContext.js +10 -6
- package/context/WidgetProvider.js +30 -31
- package/core/app.service.js +1 -1
- package/core/constants/events.js +57 -1
- package/core/dialog.service.js +1 -2
- package/core/event-notifier.js +1 -2
- package/core/formatter/array-formatters.js +33 -0
- package/core/formatter/date-formatters.js +2 -4
- package/core/formatter/index.js +2 -1
- package/core/formatter/number-formatters.js +5 -10
- package/core/formatter/security-formatters.js +2 -4
- package/core/formatter/string-formatters.js +3 -6
- package/core/proxy-service.js +84 -13
- package/core/script-registry.js +108 -48
- package/core/util/common.js +4 -4
- package/core/util/compare.js +30 -0
- package/core/util/dom.js +8 -8
- package/core/util/index.js +16 -6
- package/core/util/safe-is-equal.js +156 -0
- package/core/util/security.js +1 -2
- package/core/util/utils.js +16 -7
- package/higherOrder/BaseApp.js +108 -65
- package/higherOrder/BaseDateTime.js +31 -13
- package/higherOrder/BasePage.js +268 -144
- package/higherOrder/BasePartial.js +1 -1
- package/higherOrder/BasePrefab.js +33 -15
- package/higherOrder/DataNav.js +99 -16
- package/higherOrder/helper.js +5 -0
- package/higherOrder/withBaseWrapper.js +41 -28
- package/hooks/useAuth.js +11 -5
- package/hooks/useHttp.js +280 -94
- package/mui-config/theme-provider.js +1 -1
- package/mui-config/theme.js +1 -1
- package/package-lock.json +824 -724
- package/package.json +8 -8
- package/store/bindActions/i18nActions.js +18 -0
- package/store/index.js +3 -1
- package/store/slices/appConfigSlice.js +2 -2
- package/store/slices/authSlice.js +31 -28
- package/store/slices/i18nSlice.js +2 -2
- package/store/slices/navigationSlice.js +35 -0
- package/store/viewport.service.js +255 -0
- package/utils/attr.js +35 -0
- package/utils/dataset-util.js +1 -2
- package/utils/form-state.util.js +43 -12
- package/utils/form-utils.js +47 -2
- package/utils/format-util.js +28 -13
- package/utils/page-params-util.js +33 -1
- package/utils/state-persistance.js +72 -13
- package/utils/transformedDataset-utils.js +35 -24
- package/variables/base-variable.js +12 -14
- package/variables/crud-variable.js +225 -0
- package/variables/live-variable.js +56 -20
- package/variables/metadata.service.js +123 -0
- package/variables/model-variable.js +21 -15
- 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
|
|
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
|
|
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 &&
|
|
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
|
-
|
|
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
|
|
205
|
-
open =
|
|
206
|
-
setOpen =
|
|
207
|
-
var
|
|
208
|
-
activeItem =
|
|
209
|
-
setActiveItem =
|
|
210
|
-
var
|
|
211
|
-
focusedIndex =
|
|
212
|
-
setFocusedIndex =
|
|
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(
|
|
220
|
-
var transformedDataset = useTransformedDataset(
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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$
|
|
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$
|
|
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, "",
|
|
248
|
-
}, [
|
|
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
|
-
|
|
257
|
-
|
|
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(
|
|
264
|
-
}, [
|
|
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
|
|
235
|
+
if (typeof itemLabelWrapper === "function") {
|
|
285
236
|
try {
|
|
286
|
-
label =
|
|
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[
|
|
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
|
-
|
|
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
|
-
|
|
423
|
-
//
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
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(
|
|
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
|
|
595
|
-
|
|
596
|
-
verticalPos =
|
|
597
|
-
horizontalPos =
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
var
|
|
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:
|
|
607
|
-
})
|
|
589
|
+
hovered: isHovered
|
|
590
|
+
})
|
|
591
|
+
// Track hover state for this item's path
|
|
592
|
+
,
|
|
608
593
|
onMouseEnter: function onMouseEnter() {
|
|
609
|
-
return
|
|
594
|
+
return handlePathMouseEnter(itemPath);
|
|
610
595
|
},
|
|
611
596
|
onMouseLeave: function onMouseLeave(e) {
|
|
612
|
-
return
|
|
597
|
+
return handlePathMouseLeave(itemPath, e);
|
|
613
598
|
},
|
|
614
599
|
style: {
|
|
615
600
|
position: "relative"
|
|
616
601
|
}
|
|
617
|
-
}, __jsx(
|
|
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
|
|
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
|
|
623
|
+
return handlePathMouseEnter(itemPath);
|
|
638
624
|
},
|
|
639
625
|
onMouseLeave: function onMouseLeave(e) {
|
|
640
|
-
return
|
|
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
|
|
634
|
+
return handlePathMouseEnter(itemPath);
|
|
647
635
|
},
|
|
648
636
|
onMouseLeave: function onMouseLeave(e) {
|
|
649
|
-
return
|
|
637
|
+
return handlePathMouseLeave(itemPath, e);
|
|
650
638
|
},
|
|
651
639
|
onClick: function onClick(event) {
|
|
652
|
-
return onActionsclick(
|
|
640
|
+
return onActionsclick === null || onActionsclick === void 0 ? void 0 : onActionsclick(node);
|
|
653
641
|
}
|
|
654
|
-
}, renderMenuItems(children))));
|
|
642
|
+
}, renderMenuItems(children, itemPath))));
|
|
655
643
|
});
|
|
656
|
-
}, [getNodeProperties,
|
|
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 =
|
|
669
|
-
return
|
|
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
|
-
}, [
|
|
663
|
+
}, [filteredDataset, autoopen]);
|
|
676
664
|
var notifiedPathRef = (0, _react.useRef)(null);
|
|
677
665
|
(0, _react.useEffect)(function () {
|
|
678
|
-
if (!isFromNav || !onNavItemActivate || !
|
|
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
|
|
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
|
|
682
|
+
return _checkIfActive(children);
|
|
695
683
|
}
|
|
696
684
|
return false;
|
|
697
685
|
});
|
|
698
686
|
};
|
|
699
|
-
var hasActiveItem =
|
|
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,
|
|
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
|
|
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
|
-
|
|
791
|
+
_getItem2(item.children);
|
|
771
792
|
}
|
|
772
793
|
});
|
|
773
794
|
};
|
|
774
|
-
|
|
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
|
|
785
|
-
|
|
786
|
-
verticalPos =
|
|
787
|
-
horizontalPos =
|
|
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,
|
|
790
|
-
}, [iconposition, menulayout, horizontalPos, panelPosition, animateitems,
|
|
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",
|
|
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
|
|
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
|
-
|
|
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
|
-
},
|
|
856
|
-
className: (0, _clsx["default"])("pull-right caret fa",
|
|
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,
|