@fluxo-dev/shell 0.0.29 → 0.0.30
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/index.esm.css +136 -0
- package/index.esm.js +1738 -47
- package/package.json +7 -7
- package/src/index.d.ts +1 -1
- package/src/lib/app.d.ts +8 -0
- package/src/lib/layouts/main/app-bar.d.ts +2 -0
- package/src/lib/layouts/main/app-layout.d.ts +3 -0
- package/src/lib/layouts/main/content.d.ts +2 -0
- package/src/lib/layouts/main/navbar.d.ts +5 -1
package/index.esm.js
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
|
-
import React__default, { useState, Suspense, forwardRef, createElement as createElement$2, useEffect, useCallback, createContext,
|
|
3
|
+
import React__default, { useState, Suspense, forwardRef, createElement as createElement$2, useEffect, useCallback, useMemo, createContext, useRef, useLayoutEffect, useReducer, useContext, useImperativeHandle, Fragment as Fragment$1, cloneElement, memo, isValidElement, lazy } from 'react';
|
|
4
4
|
import { useSelector, Provider } from 'react-redux';
|
|
5
5
|
import { useLocation, Navigate, Outlet, useNavigate, Link, useOutlet, Route, useSearchParams, createBrowserRouter, RouterProvider } from 'react-router-dom';
|
|
6
6
|
import { DataCard, useFlxNavigate, NoData, ConfirmModal, ShellPage, ErrorPage as ErrorPage$1, WaitData, FlxRoutes } from '@fluxo-dev/ui-components';
|
|
7
7
|
import { ModuleLoader } from '@fluxo-dev/shell-mfe';
|
|
8
|
-
import { Text, TextInput, ActionIcon, useMantineTheme, AppShell, Stack, Group, Burger, Badge, Drawer, NavLink, Popover, Avatar, Center, Divider, Button, Tabs, Anchor, Tooltip, Space, useMantineColorScheme, UnstyledButton, Box, ThemeIcon, Collapse, ScrollArea, rem, Loader, Grid, PasswordInput, ColorSwatch, FileButton, NumberInput, Alert, ColorInput, Checkbox, Modal, Switch, Select, Chip, LoadingOverlay, Image as Image$1, Menu, Table, MultiSelect, Card, MantineProvider } from '@mantine/core';
|
|
8
|
+
import { Text, TextInput, ActionIcon, useMantineTheme, AppShell, Stack, Group, Burger, Badge, Drawer, NavLink, Popover, Avatar, Center, Divider, Button, Tabs, Anchor, Tooltip, Space, useMantineColorScheme, UnstyledButton, Box, ThemeIcon, Collapse, ScrollArea, rem, Loader, Grid, PasswordInput, ColorSwatch, FileButton, NumberInput, Alert, ColorInput, Checkbox, Modal, Switch, Select, Chip, LoadingOverlay, Image as Image$1, Menu as Menu$1, Table, MultiSelect, Card, MantineProvider } from '@mantine/core';
|
|
9
9
|
import { openSpotlight, Spotlight } from '@mantine/spotlight';
|
|
10
10
|
import { useOs, useHotkeys, useIdle } from '@mantine/hooks';
|
|
11
11
|
import { AppType, AppState, FluxoStateDispatcher, FluxoClientSys, UserService, AppMenuContextType, ApiKeyService, DomainRoleService, EmailServerProviderType } from '@fluxo-dev/api-client-base';
|
|
12
12
|
import { showNotification, Notifications } from '@mantine/notifications';
|
|
13
13
|
import { useAppSelector, store as store$4 } from '@fluxo-dev/state';
|
|
14
|
+
import { unstable_batchedUpdates, flushSync as flushSync$1, createPortal } from 'react-dom';
|
|
14
15
|
import { useForm } from '@mantine/form';
|
|
15
16
|
import { RestApiDocumentation } from '@fluxo-dev/shell-korebi';
|
|
16
17
|
import { DatePickerInput, DatesProvider } from '@mantine/dates';
|
|
@@ -4449,7 +4450,7 @@ function AppBar(props) {
|
|
|
4449
4450
|
backgroundColor: (_b = (_a = props.previewMode) === null || _a === void 0 ? void 0 : _a.headerColor) !== null && _b !== void 0 ? _b : fluxoTheme.colors['brand'][7]
|
|
4450
4451
|
},
|
|
4451
4452
|
children: [jsxs(Group, {
|
|
4452
|
-
children: [jsx(Burger, {
|
|
4453
|
+
children: [props.shellUi.navigation === ShellUINavigation.Sidebar && jsx(Burger, {
|
|
4453
4454
|
tabIndex: -1,
|
|
4454
4455
|
disabled: props.previewMode !== undefined,
|
|
4455
4456
|
color: '#fff',
|
|
@@ -4841,7 +4842,10 @@ function AppContent(props) {
|
|
|
4841
4842
|
}
|
|
4842
4843
|
}
|
|
4843
4844
|
}, [location]);
|
|
4844
|
-
return jsx(
|
|
4845
|
+
return jsx("div", {
|
|
4846
|
+
style: {
|
|
4847
|
+
top: props.shellUi.navigation === ShellUINavigation.Sidebar ? 48 : 96
|
|
4848
|
+
},
|
|
4845
4849
|
children: props.withMultipleSessions ? jsxs(Tabs, {
|
|
4846
4850
|
value: sessionContext.getCurrentSessionId(),
|
|
4847
4851
|
keepMounted: true,
|
|
@@ -5174,7 +5178,1592 @@ IconFactory.icons = [{
|
|
|
5174
5178
|
})
|
|
5175
5179
|
}];
|
|
5176
5180
|
|
|
5177
|
-
|
|
5181
|
+
const isMenuOpen = state => !!state && state[0] === 'o';
|
|
5182
|
+
const batchedUpdates = unstable_batchedUpdates || (callback => callback());
|
|
5183
|
+
const values = Object.values || (obj => Object.keys(obj).map(key => obj[key]));
|
|
5184
|
+
const floatEqual = (a, b, diff = 0.0001) => Math.abs(a - b) < diff;
|
|
5185
|
+
const getTransition = (transition, name) => transition === true || !!(transition && transition[name]);
|
|
5186
|
+
const safeCall = (fn, arg) => typeof fn === 'function' ? fn(arg) : fn;
|
|
5187
|
+
const internalKey = '_szhsinMenu';
|
|
5188
|
+
const getName = component => component[internalKey];
|
|
5189
|
+
const mergeProps = (target, source) => {
|
|
5190
|
+
source && Object.keys(source).forEach(key => {
|
|
5191
|
+
const targetProp = target[key];
|
|
5192
|
+
const sourceProp = source[key];
|
|
5193
|
+
if (typeof sourceProp === 'function' && targetProp) {
|
|
5194
|
+
target[key] = (...arg) => {
|
|
5195
|
+
sourceProp(...arg);
|
|
5196
|
+
targetProp(...arg);
|
|
5197
|
+
};
|
|
5198
|
+
} else {
|
|
5199
|
+
target[key] = sourceProp;
|
|
5200
|
+
}
|
|
5201
|
+
});
|
|
5202
|
+
return target;
|
|
5203
|
+
};
|
|
5204
|
+
const parsePadding = paddingStr => {
|
|
5205
|
+
if (typeof paddingStr !== 'string') return {
|
|
5206
|
+
top: 0,
|
|
5207
|
+
right: 0,
|
|
5208
|
+
bottom: 0,
|
|
5209
|
+
left: 0
|
|
5210
|
+
};
|
|
5211
|
+
const padding = paddingStr.trim().split(/\s+/, 4).map(parseFloat);
|
|
5212
|
+
const top = !isNaN(padding[0]) ? padding[0] : 0;
|
|
5213
|
+
const right = !isNaN(padding[1]) ? padding[1] : top;
|
|
5214
|
+
return {
|
|
5215
|
+
top,
|
|
5216
|
+
right,
|
|
5217
|
+
bottom: !isNaN(padding[2]) ? padding[2] : top,
|
|
5218
|
+
left: !isNaN(padding[3]) ? padding[3] : right
|
|
5219
|
+
};
|
|
5220
|
+
};
|
|
5221
|
+
const getScrollAncestor = node => {
|
|
5222
|
+
while (node) {
|
|
5223
|
+
node = node.parentNode;
|
|
5224
|
+
if (!node || node === document.body || !node.parentNode) return;
|
|
5225
|
+
const {
|
|
5226
|
+
overflow,
|
|
5227
|
+
overflowX,
|
|
5228
|
+
overflowY
|
|
5229
|
+
} = getComputedStyle(node);
|
|
5230
|
+
if (/auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX)) return node;
|
|
5231
|
+
}
|
|
5232
|
+
};
|
|
5233
|
+
function commonProps(isDisabled, isHovering) {
|
|
5234
|
+
return {
|
|
5235
|
+
'aria-disabled': isDisabled || undefined,
|
|
5236
|
+
tabIndex: isHovering ? 0 : -1
|
|
5237
|
+
};
|
|
5238
|
+
}
|
|
5239
|
+
function indexOfNode(nodeList, node) {
|
|
5240
|
+
for (let i = 0; i < nodeList.length; i++) {
|
|
5241
|
+
if (nodeList[i] === node) return i;
|
|
5242
|
+
}
|
|
5243
|
+
return -1;
|
|
5244
|
+
}
|
|
5245
|
+
|
|
5246
|
+
const stylePropTypes = name => ({
|
|
5247
|
+
[name ? `${name}ClassName` : 'className']: propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.func])
|
|
5248
|
+
});
|
|
5249
|
+
const menuPropTypes = {
|
|
5250
|
+
className: propTypes.exports.string,
|
|
5251
|
+
...stylePropTypes('menu'),
|
|
5252
|
+
arrowProps: propTypes.exports.object,
|
|
5253
|
+
focusProps: propTypes.exports.object,
|
|
5254
|
+
menuStyle: propTypes.exports.object,
|
|
5255
|
+
arrow: propTypes.exports.bool,
|
|
5256
|
+
setDownOverflow: propTypes.exports.bool,
|
|
5257
|
+
gap: propTypes.exports.number,
|
|
5258
|
+
shift: propTypes.exports.number,
|
|
5259
|
+
align: /*#__PURE__*/propTypes.exports.oneOf(['start', 'center', 'end']),
|
|
5260
|
+
direction: /*#__PURE__*/propTypes.exports.oneOf(['left', 'right', 'top', 'bottom']),
|
|
5261
|
+
position: /*#__PURE__*/propTypes.exports.oneOf(['auto', 'anchor', 'initial']),
|
|
5262
|
+
overflow: /*#__PURE__*/propTypes.exports.oneOf(['auto', 'visible', 'hidden'])
|
|
5263
|
+
};
|
|
5264
|
+
const rootMenuPropTypes = {
|
|
5265
|
+
...menuPropTypes,
|
|
5266
|
+
containerProps: propTypes.exports.object,
|
|
5267
|
+
initialMounted: propTypes.exports.bool,
|
|
5268
|
+
unmountOnClose: propTypes.exports.bool,
|
|
5269
|
+
transition: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.bool, /*#__PURE__*/propTypes.exports.exact({
|
|
5270
|
+
open: propTypes.exports.bool,
|
|
5271
|
+
close: propTypes.exports.bool,
|
|
5272
|
+
item: propTypes.exports.bool
|
|
5273
|
+
})]),
|
|
5274
|
+
transitionTimeout: propTypes.exports.number,
|
|
5275
|
+
boundingBoxRef: propTypes.exports.object,
|
|
5276
|
+
boundingBoxPadding: propTypes.exports.string,
|
|
5277
|
+
reposition: /*#__PURE__*/propTypes.exports.oneOf(['auto', 'initial']),
|
|
5278
|
+
repositionFlag: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.number]),
|
|
5279
|
+
viewScroll: /*#__PURE__*/propTypes.exports.oneOf(['auto', 'close', 'initial']),
|
|
5280
|
+
submenuOpenDelay: propTypes.exports.number,
|
|
5281
|
+
submenuCloseDelay: propTypes.exports.number,
|
|
5282
|
+
portal: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.bool, /*#__PURE__*/propTypes.exports.exact({
|
|
5283
|
+
target: propTypes.exports.object,
|
|
5284
|
+
stablePosition: propTypes.exports.bool
|
|
5285
|
+
})]),
|
|
5286
|
+
theming: propTypes.exports.string,
|
|
5287
|
+
onItemClick: propTypes.exports.func
|
|
5288
|
+
};
|
|
5289
|
+
const uncontrolledMenuPropTypes = {
|
|
5290
|
+
instanceRef: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.object, propTypes.exports.func]),
|
|
5291
|
+
onMenuChange: propTypes.exports.func
|
|
5292
|
+
};
|
|
5293
|
+
|
|
5294
|
+
const useBEM = ({
|
|
5295
|
+
block,
|
|
5296
|
+
element,
|
|
5297
|
+
modifiers,
|
|
5298
|
+
className
|
|
5299
|
+
}) => useMemo(() => {
|
|
5300
|
+
const blockElement = element ? `${block}__${element}` : block;
|
|
5301
|
+
let classString = blockElement;
|
|
5302
|
+
modifiers && Object.keys(modifiers).forEach(name => {
|
|
5303
|
+
const value = modifiers[name];
|
|
5304
|
+
if (value) classString += ` ${blockElement}--${value === true ? name : `${name}-${value}`}`;
|
|
5305
|
+
});
|
|
5306
|
+
let expandedClassName = typeof className === 'function' ? className(modifiers) : className;
|
|
5307
|
+
if (typeof expandedClassName === 'string') {
|
|
5308
|
+
expandedClassName = expandedClassName.trim();
|
|
5309
|
+
if (expandedClassName) classString += ` ${expandedClassName}`;
|
|
5310
|
+
}
|
|
5311
|
+
return classString;
|
|
5312
|
+
}, [block, element, modifiers, className]);
|
|
5313
|
+
|
|
5314
|
+
const menuContainerClass = 'szh-menu-container';
|
|
5315
|
+
const menuClass = 'szh-menu';
|
|
5316
|
+
const menuArrowClass = 'arrow';
|
|
5317
|
+
const menuItemClass = 'item';
|
|
5318
|
+
const HoverItemContext = /*#__PURE__*/createContext();
|
|
5319
|
+
const MenuListItemContext = /*#__PURE__*/createContext({});
|
|
5320
|
+
const MenuListContext = /*#__PURE__*/createContext({});
|
|
5321
|
+
const EventHandlersContext = /*#__PURE__*/createContext({});
|
|
5322
|
+
const RadioGroupContext = /*#__PURE__*/createContext({});
|
|
5323
|
+
const SettingsContext = /*#__PURE__*/createContext({});
|
|
5324
|
+
const Keys = /*#__PURE__*/Object.freeze({
|
|
5325
|
+
ENTER: 'Enter',
|
|
5326
|
+
ESC: 'Escape',
|
|
5327
|
+
SPACE: ' ',
|
|
5328
|
+
HOME: 'Home',
|
|
5329
|
+
END: 'End',
|
|
5330
|
+
LEFT: 'ArrowLeft',
|
|
5331
|
+
RIGHT: 'ArrowRight',
|
|
5332
|
+
UP: 'ArrowUp',
|
|
5333
|
+
DOWN: 'ArrowDown'
|
|
5334
|
+
});
|
|
5335
|
+
const HoverActionTypes = /*#__PURE__*/Object.freeze({
|
|
5336
|
+
RESET: 0,
|
|
5337
|
+
SET: 1,
|
|
5338
|
+
UNSET: 2,
|
|
5339
|
+
INCREASE: 3,
|
|
5340
|
+
DECREASE: 4,
|
|
5341
|
+
FIRST: 5,
|
|
5342
|
+
LAST: 6,
|
|
5343
|
+
SET_INDEX: 7
|
|
5344
|
+
});
|
|
5345
|
+
const CloseReason = /*#__PURE__*/Object.freeze({
|
|
5346
|
+
CLICK: 'click',
|
|
5347
|
+
CANCEL: 'cancel',
|
|
5348
|
+
BLUR: 'blur',
|
|
5349
|
+
SCROLL: 'scroll'
|
|
5350
|
+
});
|
|
5351
|
+
const FocusPositions = /*#__PURE__*/Object.freeze({
|
|
5352
|
+
FIRST: 'first',
|
|
5353
|
+
LAST: 'last'
|
|
5354
|
+
});
|
|
5355
|
+
const MenuStateMap = /*#__PURE__*/Object.freeze({
|
|
5356
|
+
entering: 'opening',
|
|
5357
|
+
entered: 'open',
|
|
5358
|
+
exiting: 'closing',
|
|
5359
|
+
exited: 'closed'
|
|
5360
|
+
});
|
|
5361
|
+
const positionAbsolute = 'absolute';
|
|
5362
|
+
const roleNone = 'presentation';
|
|
5363
|
+
const roleMenuitem = 'menuitem';
|
|
5364
|
+
const dummyItemProps = {
|
|
5365
|
+
'aria-hidden': true,
|
|
5366
|
+
role: roleMenuitem
|
|
5367
|
+
};
|
|
5368
|
+
|
|
5369
|
+
const MenuContainer = ({
|
|
5370
|
+
className,
|
|
5371
|
+
containerRef,
|
|
5372
|
+
containerProps,
|
|
5373
|
+
children,
|
|
5374
|
+
isOpen,
|
|
5375
|
+
theming,
|
|
5376
|
+
transition,
|
|
5377
|
+
onClose
|
|
5378
|
+
}) => {
|
|
5379
|
+
const itemTransition = getTransition(transition, 'item');
|
|
5380
|
+
const onKeyDown = ({
|
|
5381
|
+
key
|
|
5382
|
+
}) => {
|
|
5383
|
+
switch (key) {
|
|
5384
|
+
case Keys.ESC:
|
|
5385
|
+
safeCall(onClose, {
|
|
5386
|
+
key,
|
|
5387
|
+
reason: CloseReason.CANCEL
|
|
5388
|
+
});
|
|
5389
|
+
break;
|
|
5390
|
+
}
|
|
5391
|
+
};
|
|
5392
|
+
const onBlur = e => {
|
|
5393
|
+
if (isOpen && !e.currentTarget.contains(e.relatedTarget)) {
|
|
5394
|
+
safeCall(onClose, {
|
|
5395
|
+
reason: CloseReason.BLUR
|
|
5396
|
+
});
|
|
5397
|
+
}
|
|
5398
|
+
};
|
|
5399
|
+
return /*#__PURE__*/jsx("div", {
|
|
5400
|
+
...mergeProps({
|
|
5401
|
+
onKeyDown,
|
|
5402
|
+
onBlur
|
|
5403
|
+
}, containerProps),
|
|
5404
|
+
className: useBEM({
|
|
5405
|
+
block: menuContainerClass,
|
|
5406
|
+
modifiers: useMemo(() => ({
|
|
5407
|
+
theme: theming,
|
|
5408
|
+
itemTransition
|
|
5409
|
+
}), [theming, itemTransition]),
|
|
5410
|
+
className
|
|
5411
|
+
}),
|
|
5412
|
+
style: {
|
|
5413
|
+
position: 'absolute',
|
|
5414
|
+
...(containerProps == null ? void 0 : containerProps.style)
|
|
5415
|
+
},
|
|
5416
|
+
ref: containerRef,
|
|
5417
|
+
children: children
|
|
5418
|
+
});
|
|
5419
|
+
};
|
|
5420
|
+
|
|
5421
|
+
const createSubmenuCtx = () => {
|
|
5422
|
+
let timer,
|
|
5423
|
+
count = 0;
|
|
5424
|
+
return {
|
|
5425
|
+
toggle: isOpen => {
|
|
5426
|
+
isOpen ? count++ : count--;
|
|
5427
|
+
count = Math.max(count, 0);
|
|
5428
|
+
},
|
|
5429
|
+
on: (closeDelay, pending, settled) => {
|
|
5430
|
+
if (count) {
|
|
5431
|
+
if (!timer) timer = setTimeout(() => {
|
|
5432
|
+
timer = 0;
|
|
5433
|
+
pending();
|
|
5434
|
+
}, closeDelay);
|
|
5435
|
+
} else {
|
|
5436
|
+
settled == null || settled();
|
|
5437
|
+
}
|
|
5438
|
+
},
|
|
5439
|
+
off: () => {
|
|
5440
|
+
if (timer) {
|
|
5441
|
+
clearTimeout(timer);
|
|
5442
|
+
timer = 0;
|
|
5443
|
+
}
|
|
5444
|
+
}
|
|
5445
|
+
};
|
|
5446
|
+
};
|
|
5447
|
+
|
|
5448
|
+
const useItems = (menuRef, focusRef) => {
|
|
5449
|
+
const [hoverItem, setHoverItem] = useState();
|
|
5450
|
+
const stateRef = useRef({
|
|
5451
|
+
items: [],
|
|
5452
|
+
hoverIndex: -1,
|
|
5453
|
+
sorted: false
|
|
5454
|
+
});
|
|
5455
|
+
const mutableState = stateRef.current;
|
|
5456
|
+
const updateItems = useCallback((item, isMounted) => {
|
|
5457
|
+
const {
|
|
5458
|
+
items
|
|
5459
|
+
} = mutableState;
|
|
5460
|
+
if (!item) {
|
|
5461
|
+
mutableState.items = [];
|
|
5462
|
+
} else if (isMounted) {
|
|
5463
|
+
items.push(item);
|
|
5464
|
+
} else {
|
|
5465
|
+
const index = items.indexOf(item);
|
|
5466
|
+
if (index > -1) {
|
|
5467
|
+
items.splice(index, 1);
|
|
5468
|
+
if (item.contains(document.activeElement)) {
|
|
5469
|
+
focusRef.current.focus();
|
|
5470
|
+
setHoverItem();
|
|
5471
|
+
}
|
|
5472
|
+
}
|
|
5473
|
+
}
|
|
5474
|
+
mutableState.hoverIndex = -1;
|
|
5475
|
+
mutableState.sorted = false;
|
|
5476
|
+
}, [mutableState, focusRef]);
|
|
5477
|
+
const dispatch = useCallback((actionType, item, nextIndex) => {
|
|
5478
|
+
const {
|
|
5479
|
+
items,
|
|
5480
|
+
hoverIndex
|
|
5481
|
+
} = mutableState;
|
|
5482
|
+
const sortItems = () => {
|
|
5483
|
+
if (mutableState.sorted) return;
|
|
5484
|
+
const orderedNodes = menuRef.current.querySelectorAll('.szh-menu__item');
|
|
5485
|
+
items.sort((a, b) => indexOfNode(orderedNodes, a) - indexOfNode(orderedNodes, b));
|
|
5486
|
+
mutableState.sorted = true;
|
|
5487
|
+
};
|
|
5488
|
+
let index = -1,
|
|
5489
|
+
newItem = undefined;
|
|
5490
|
+
switch (actionType) {
|
|
5491
|
+
case HoverActionTypes.RESET:
|
|
5492
|
+
break;
|
|
5493
|
+
case HoverActionTypes.SET:
|
|
5494
|
+
newItem = item;
|
|
5495
|
+
break;
|
|
5496
|
+
case HoverActionTypes.UNSET:
|
|
5497
|
+
newItem = prevItem => prevItem === item ? undefined : prevItem;
|
|
5498
|
+
break;
|
|
5499
|
+
case HoverActionTypes.FIRST:
|
|
5500
|
+
sortItems();
|
|
5501
|
+
index = 0;
|
|
5502
|
+
newItem = items[index];
|
|
5503
|
+
break;
|
|
5504
|
+
case HoverActionTypes.LAST:
|
|
5505
|
+
sortItems();
|
|
5506
|
+
index = items.length - 1;
|
|
5507
|
+
newItem = items[index];
|
|
5508
|
+
break;
|
|
5509
|
+
case HoverActionTypes.SET_INDEX:
|
|
5510
|
+
sortItems();
|
|
5511
|
+
index = nextIndex;
|
|
5512
|
+
newItem = items[index];
|
|
5513
|
+
break;
|
|
5514
|
+
case HoverActionTypes.INCREASE:
|
|
5515
|
+
sortItems();
|
|
5516
|
+
index = hoverIndex;
|
|
5517
|
+
if (index < 0) index = items.indexOf(item);
|
|
5518
|
+
index++;
|
|
5519
|
+
if (index >= items.length) index = 0;
|
|
5520
|
+
newItem = items[index];
|
|
5521
|
+
break;
|
|
5522
|
+
case HoverActionTypes.DECREASE:
|
|
5523
|
+
sortItems();
|
|
5524
|
+
index = hoverIndex;
|
|
5525
|
+
if (index < 0) index = items.indexOf(item);
|
|
5526
|
+
index--;
|
|
5527
|
+
if (index < 0) index = items.length - 1;
|
|
5528
|
+
newItem = items[index];
|
|
5529
|
+
break;
|
|
5530
|
+
default:
|
|
5531
|
+
if (process.env.NODE_ENV !== 'production') throw new Error(`[React-Menu] Unknown hover action type: ${actionType}`);
|
|
5532
|
+
}
|
|
5533
|
+
if (!newItem) index = -1;
|
|
5534
|
+
setHoverItem(newItem);
|
|
5535
|
+
mutableState.hoverIndex = index;
|
|
5536
|
+
}, [menuRef, mutableState]);
|
|
5537
|
+
return {
|
|
5538
|
+
hoverItem,
|
|
5539
|
+
dispatch,
|
|
5540
|
+
updateItems
|
|
5541
|
+
};
|
|
5542
|
+
};
|
|
5543
|
+
|
|
5544
|
+
const getNativeDimension = (transformed, untransformed) => Math.round(transformed) === untransformed ? transformed : untransformed;
|
|
5545
|
+
const getNormalizedClientRect = element => {
|
|
5546
|
+
const rect = element.getBoundingClientRect();
|
|
5547
|
+
rect.width = getNativeDimension(rect.width, element.offsetWidth);
|
|
5548
|
+
rect.height = getNativeDimension(rect.height, element.offsetHeight);
|
|
5549
|
+
return rect;
|
|
5550
|
+
};
|
|
5551
|
+
|
|
5552
|
+
const getPositionHelpers = (containerRef, menuRef, menuScroll, boundingBoxPadding) => {
|
|
5553
|
+
const menuRect = getNormalizedClientRect(menuRef.current);
|
|
5554
|
+
const containerRect = containerRef.current.getBoundingClientRect();
|
|
5555
|
+
const boundingRect = menuScroll === window ? {
|
|
5556
|
+
left: 0,
|
|
5557
|
+
top: 0,
|
|
5558
|
+
right: document.documentElement.clientWidth,
|
|
5559
|
+
bottom: window.innerHeight
|
|
5560
|
+
} : menuScroll.getBoundingClientRect();
|
|
5561
|
+
const padding = parsePadding(boundingBoxPadding);
|
|
5562
|
+
const getLeftOverflow = x => x + containerRect.left - boundingRect.left - padding.left;
|
|
5563
|
+
const getRightOverflow = x => x + containerRect.left + menuRect.width - boundingRect.right + padding.right;
|
|
5564
|
+
const getTopOverflow = y => y + containerRect.top - boundingRect.top - padding.top;
|
|
5565
|
+
const getBottomOverflow = y => y + containerRect.top + menuRect.height - boundingRect.bottom + padding.bottom;
|
|
5566
|
+
const confineHorizontally = x => {
|
|
5567
|
+
let leftOverflow = getLeftOverflow(x);
|
|
5568
|
+
if (leftOverflow < 0) {
|
|
5569
|
+
x -= leftOverflow;
|
|
5570
|
+
} else {
|
|
5571
|
+
const rightOverflow = getRightOverflow(x);
|
|
5572
|
+
if (rightOverflow > 0) {
|
|
5573
|
+
x -= rightOverflow;
|
|
5574
|
+
leftOverflow = getLeftOverflow(x);
|
|
5575
|
+
if (leftOverflow < 0) x -= leftOverflow;
|
|
5576
|
+
}
|
|
5577
|
+
}
|
|
5578
|
+
return x;
|
|
5579
|
+
};
|
|
5580
|
+
const confineVertically = y => {
|
|
5581
|
+
let topOverflow = getTopOverflow(y);
|
|
5582
|
+
if (topOverflow < 0) {
|
|
5583
|
+
y -= topOverflow;
|
|
5584
|
+
} else {
|
|
5585
|
+
const bottomOverflow = getBottomOverflow(y);
|
|
5586
|
+
if (bottomOverflow > 0) {
|
|
5587
|
+
y -= bottomOverflow;
|
|
5588
|
+
topOverflow = getTopOverflow(y);
|
|
5589
|
+
if (topOverflow < 0) y -= topOverflow;
|
|
5590
|
+
}
|
|
5591
|
+
}
|
|
5592
|
+
return y;
|
|
5593
|
+
};
|
|
5594
|
+
return {
|
|
5595
|
+
menuRect,
|
|
5596
|
+
containerRect,
|
|
5597
|
+
getLeftOverflow,
|
|
5598
|
+
getRightOverflow,
|
|
5599
|
+
getTopOverflow,
|
|
5600
|
+
getBottomOverflow,
|
|
5601
|
+
confineHorizontally,
|
|
5602
|
+
confineVertically
|
|
5603
|
+
};
|
|
5604
|
+
};
|
|
5605
|
+
|
|
5606
|
+
const placeArrowVertical = ({
|
|
5607
|
+
arrowRef,
|
|
5608
|
+
menuY,
|
|
5609
|
+
anchorRect,
|
|
5610
|
+
containerRect,
|
|
5611
|
+
menuRect
|
|
5612
|
+
}) => {
|
|
5613
|
+
let y = anchorRect.top - containerRect.top - menuY + anchorRect.height / 2;
|
|
5614
|
+
const offset = arrowRef.current.offsetHeight * 1.25;
|
|
5615
|
+
y = Math.max(offset, y);
|
|
5616
|
+
y = Math.min(y, menuRect.height - offset);
|
|
5617
|
+
return y;
|
|
5618
|
+
};
|
|
5619
|
+
|
|
5620
|
+
const placeLeftorRight = ({
|
|
5621
|
+
anchorRect,
|
|
5622
|
+
containerRect,
|
|
5623
|
+
menuRect,
|
|
5624
|
+
placeLeftorRightY,
|
|
5625
|
+
placeLeftX,
|
|
5626
|
+
placeRightX,
|
|
5627
|
+
getLeftOverflow,
|
|
5628
|
+
getRightOverflow,
|
|
5629
|
+
confineHorizontally,
|
|
5630
|
+
confineVertically,
|
|
5631
|
+
arrowRef,
|
|
5632
|
+
arrow,
|
|
5633
|
+
direction,
|
|
5634
|
+
position
|
|
5635
|
+
}) => {
|
|
5636
|
+
let computedDirection = direction;
|
|
5637
|
+
let y = placeLeftorRightY;
|
|
5638
|
+
if (position !== 'initial') {
|
|
5639
|
+
y = confineVertically(y);
|
|
5640
|
+
if (position === 'anchor') {
|
|
5641
|
+
y = Math.min(y, anchorRect.bottom - containerRect.top);
|
|
5642
|
+
y = Math.max(y, anchorRect.top - containerRect.top - menuRect.height);
|
|
5643
|
+
}
|
|
5644
|
+
}
|
|
5645
|
+
let x, leftOverflow, rightOverflow;
|
|
5646
|
+
if (computedDirection === 'left') {
|
|
5647
|
+
x = placeLeftX;
|
|
5648
|
+
if (position !== 'initial') {
|
|
5649
|
+
leftOverflow = getLeftOverflow(x);
|
|
5650
|
+
if (leftOverflow < 0) {
|
|
5651
|
+
rightOverflow = getRightOverflow(placeRightX);
|
|
5652
|
+
if (rightOverflow <= 0 || -leftOverflow > rightOverflow) {
|
|
5653
|
+
x = placeRightX;
|
|
5654
|
+
computedDirection = 'right';
|
|
5655
|
+
}
|
|
5656
|
+
}
|
|
5657
|
+
}
|
|
5658
|
+
} else {
|
|
5659
|
+
x = placeRightX;
|
|
5660
|
+
if (position !== 'initial') {
|
|
5661
|
+
rightOverflow = getRightOverflow(x);
|
|
5662
|
+
if (rightOverflow > 0) {
|
|
5663
|
+
leftOverflow = getLeftOverflow(placeLeftX);
|
|
5664
|
+
if (leftOverflow >= 0 || -leftOverflow < rightOverflow) {
|
|
5665
|
+
x = placeLeftX;
|
|
5666
|
+
computedDirection = 'left';
|
|
5667
|
+
}
|
|
5668
|
+
}
|
|
5669
|
+
}
|
|
5670
|
+
}
|
|
5671
|
+
if (position === 'auto') x = confineHorizontally(x);
|
|
5672
|
+
const arrowY = arrow ? placeArrowVertical({
|
|
5673
|
+
menuY: y,
|
|
5674
|
+
arrowRef,
|
|
5675
|
+
anchorRect,
|
|
5676
|
+
containerRect,
|
|
5677
|
+
menuRect
|
|
5678
|
+
}) : undefined;
|
|
5679
|
+
return {
|
|
5680
|
+
arrowY,
|
|
5681
|
+
x,
|
|
5682
|
+
y,
|
|
5683
|
+
computedDirection
|
|
5684
|
+
};
|
|
5685
|
+
};
|
|
5686
|
+
|
|
5687
|
+
const placeArrowHorizontal = ({
|
|
5688
|
+
arrowRef,
|
|
5689
|
+
menuX,
|
|
5690
|
+
anchorRect,
|
|
5691
|
+
containerRect,
|
|
5692
|
+
menuRect
|
|
5693
|
+
}) => {
|
|
5694
|
+
let x = anchorRect.left - containerRect.left - menuX + anchorRect.width / 2;
|
|
5695
|
+
const offset = arrowRef.current.offsetWidth * 1.25;
|
|
5696
|
+
x = Math.max(offset, x);
|
|
5697
|
+
x = Math.min(x, menuRect.width - offset);
|
|
5698
|
+
return x;
|
|
5699
|
+
};
|
|
5700
|
+
|
|
5701
|
+
const placeToporBottom = ({
|
|
5702
|
+
anchorRect,
|
|
5703
|
+
containerRect,
|
|
5704
|
+
menuRect,
|
|
5705
|
+
placeToporBottomX,
|
|
5706
|
+
placeTopY,
|
|
5707
|
+
placeBottomY,
|
|
5708
|
+
getTopOverflow,
|
|
5709
|
+
getBottomOverflow,
|
|
5710
|
+
confineHorizontally,
|
|
5711
|
+
confineVertically,
|
|
5712
|
+
arrowRef,
|
|
5713
|
+
arrow,
|
|
5714
|
+
direction,
|
|
5715
|
+
position
|
|
5716
|
+
}) => {
|
|
5717
|
+
let computedDirection = direction === 'top' ? 'top' : 'bottom';
|
|
5718
|
+
let x = placeToporBottomX;
|
|
5719
|
+
if (position !== 'initial') {
|
|
5720
|
+
x = confineHorizontally(x);
|
|
5721
|
+
if (position === 'anchor') {
|
|
5722
|
+
x = Math.min(x, anchorRect.right - containerRect.left);
|
|
5723
|
+
x = Math.max(x, anchorRect.left - containerRect.left - menuRect.width);
|
|
5724
|
+
}
|
|
5725
|
+
}
|
|
5726
|
+
let y, topOverflow, bottomOverflow;
|
|
5727
|
+
if (computedDirection === 'top') {
|
|
5728
|
+
y = placeTopY;
|
|
5729
|
+
if (position !== 'initial') {
|
|
5730
|
+
topOverflow = getTopOverflow(y);
|
|
5731
|
+
if (topOverflow < 0) {
|
|
5732
|
+
bottomOverflow = getBottomOverflow(placeBottomY);
|
|
5733
|
+
if (bottomOverflow <= 0 || -topOverflow > bottomOverflow) {
|
|
5734
|
+
y = placeBottomY;
|
|
5735
|
+
computedDirection = 'bottom';
|
|
5736
|
+
}
|
|
5737
|
+
}
|
|
5738
|
+
}
|
|
5739
|
+
} else {
|
|
5740
|
+
y = placeBottomY;
|
|
5741
|
+
if (position !== 'initial') {
|
|
5742
|
+
bottomOverflow = getBottomOverflow(y);
|
|
5743
|
+
if (bottomOverflow > 0) {
|
|
5744
|
+
topOverflow = getTopOverflow(placeTopY);
|
|
5745
|
+
if (topOverflow >= 0 || -topOverflow < bottomOverflow) {
|
|
5746
|
+
y = placeTopY;
|
|
5747
|
+
computedDirection = 'top';
|
|
5748
|
+
}
|
|
5749
|
+
}
|
|
5750
|
+
}
|
|
5751
|
+
}
|
|
5752
|
+
if (position === 'auto') y = confineVertically(y);
|
|
5753
|
+
const arrowX = arrow ? placeArrowHorizontal({
|
|
5754
|
+
menuX: x,
|
|
5755
|
+
arrowRef,
|
|
5756
|
+
anchorRect,
|
|
5757
|
+
containerRect,
|
|
5758
|
+
menuRect
|
|
5759
|
+
}) : undefined;
|
|
5760
|
+
return {
|
|
5761
|
+
arrowX,
|
|
5762
|
+
x,
|
|
5763
|
+
y,
|
|
5764
|
+
computedDirection
|
|
5765
|
+
};
|
|
5766
|
+
};
|
|
5767
|
+
|
|
5768
|
+
const positionMenu = ({
|
|
5769
|
+
arrow,
|
|
5770
|
+
align,
|
|
5771
|
+
direction,
|
|
5772
|
+
gap,
|
|
5773
|
+
shift,
|
|
5774
|
+
position,
|
|
5775
|
+
anchorRect,
|
|
5776
|
+
arrowRef,
|
|
5777
|
+
positionHelpers
|
|
5778
|
+
}) => {
|
|
5779
|
+
const {
|
|
5780
|
+
menuRect,
|
|
5781
|
+
containerRect
|
|
5782
|
+
} = positionHelpers;
|
|
5783
|
+
const isHorizontal = direction === 'left' || direction === 'right';
|
|
5784
|
+
let horizontalOffset = isHorizontal ? gap : shift;
|
|
5785
|
+
let verticalOffset = isHorizontal ? shift : gap;
|
|
5786
|
+
if (arrow) {
|
|
5787
|
+
const arrowElt = arrowRef.current;
|
|
5788
|
+
if (isHorizontal) {
|
|
5789
|
+
horizontalOffset += arrowElt.offsetWidth;
|
|
5790
|
+
} else {
|
|
5791
|
+
verticalOffset += arrowElt.offsetHeight;
|
|
5792
|
+
}
|
|
5793
|
+
}
|
|
5794
|
+
const placeLeftX = anchorRect.left - containerRect.left - menuRect.width - horizontalOffset;
|
|
5795
|
+
const placeRightX = anchorRect.right - containerRect.left + horizontalOffset;
|
|
5796
|
+
const placeTopY = anchorRect.top - containerRect.top - menuRect.height - verticalOffset;
|
|
5797
|
+
const placeBottomY = anchorRect.bottom - containerRect.top + verticalOffset;
|
|
5798
|
+
let placeToporBottomX, placeLeftorRightY;
|
|
5799
|
+
if (align === 'end') {
|
|
5800
|
+
placeToporBottomX = anchorRect.right - containerRect.left - menuRect.width;
|
|
5801
|
+
placeLeftorRightY = anchorRect.bottom - containerRect.top - menuRect.height;
|
|
5802
|
+
} else if (align === 'center') {
|
|
5803
|
+
placeToporBottomX = anchorRect.left - containerRect.left - (menuRect.width - anchorRect.width) / 2;
|
|
5804
|
+
placeLeftorRightY = anchorRect.top - containerRect.top - (menuRect.height - anchorRect.height) / 2;
|
|
5805
|
+
} else {
|
|
5806
|
+
placeToporBottomX = anchorRect.left - containerRect.left;
|
|
5807
|
+
placeLeftorRightY = anchorRect.top - containerRect.top;
|
|
5808
|
+
}
|
|
5809
|
+
placeToporBottomX += horizontalOffset;
|
|
5810
|
+
placeLeftorRightY += verticalOffset;
|
|
5811
|
+
const options = {
|
|
5812
|
+
...positionHelpers,
|
|
5813
|
+
anchorRect,
|
|
5814
|
+
placeLeftX,
|
|
5815
|
+
placeRightX,
|
|
5816
|
+
placeLeftorRightY,
|
|
5817
|
+
placeTopY,
|
|
5818
|
+
placeBottomY,
|
|
5819
|
+
placeToporBottomX,
|
|
5820
|
+
arrowRef,
|
|
5821
|
+
arrow,
|
|
5822
|
+
direction,
|
|
5823
|
+
position
|
|
5824
|
+
};
|
|
5825
|
+
switch (direction) {
|
|
5826
|
+
case 'left':
|
|
5827
|
+
case 'right':
|
|
5828
|
+
return placeLeftorRight(options);
|
|
5829
|
+
case 'top':
|
|
5830
|
+
case 'bottom':
|
|
5831
|
+
default:
|
|
5832
|
+
return placeToporBottom(options);
|
|
5833
|
+
}
|
|
5834
|
+
};
|
|
5835
|
+
|
|
5836
|
+
const useIsomorphicLayoutEffect$2 = typeof window !== 'undefined' && typeof window.document !== 'undefined' && typeof window.document.createElement !== 'undefined' ? useLayoutEffect : useEffect;
|
|
5837
|
+
|
|
5838
|
+
function setRef$1(ref, instance) {
|
|
5839
|
+
typeof ref === 'function' ? ref(instance) : ref.current = instance;
|
|
5840
|
+
}
|
|
5841
|
+
const useCombinedRef = (refA, refB) => useMemo(() => {
|
|
5842
|
+
if (!refA) return refB;
|
|
5843
|
+
if (!refB) return refA;
|
|
5844
|
+
return instance => {
|
|
5845
|
+
setRef$1(refA, instance);
|
|
5846
|
+
setRef$1(refB, instance);
|
|
5847
|
+
};
|
|
5848
|
+
}, [refA, refB]);
|
|
5849
|
+
|
|
5850
|
+
const offScreen = -9999;
|
|
5851
|
+
const MenuList = ({
|
|
5852
|
+
ariaLabel,
|
|
5853
|
+
menuClassName,
|
|
5854
|
+
menuStyle,
|
|
5855
|
+
arrow,
|
|
5856
|
+
arrowProps = {},
|
|
5857
|
+
anchorPoint,
|
|
5858
|
+
anchorRef,
|
|
5859
|
+
containerRef,
|
|
5860
|
+
containerProps,
|
|
5861
|
+
focusProps,
|
|
5862
|
+
externalRef,
|
|
5863
|
+
parentScrollingRef,
|
|
5864
|
+
align = 'start',
|
|
5865
|
+
direction = 'bottom',
|
|
5866
|
+
position = 'auto',
|
|
5867
|
+
overflow = 'visible',
|
|
5868
|
+
setDownOverflow,
|
|
5869
|
+
repositionFlag,
|
|
5870
|
+
captureFocus = true,
|
|
5871
|
+
state,
|
|
5872
|
+
endTransition,
|
|
5873
|
+
isDisabled,
|
|
5874
|
+
menuItemFocus,
|
|
5875
|
+
gap = 0,
|
|
5876
|
+
shift = 0,
|
|
5877
|
+
children,
|
|
5878
|
+
onClose,
|
|
5879
|
+
...restProps
|
|
5880
|
+
}) => {
|
|
5881
|
+
const [menuPosition, setMenuPosition] = useState({
|
|
5882
|
+
x: offScreen,
|
|
5883
|
+
y: offScreen
|
|
5884
|
+
});
|
|
5885
|
+
const [arrowPosition, setArrowPosition] = useState({});
|
|
5886
|
+
const [overflowData, setOverflowData] = useState();
|
|
5887
|
+
const [expandedDirection, setExpandedDirection] = useState(direction);
|
|
5888
|
+
const [submenuCtx] = useState(createSubmenuCtx);
|
|
5889
|
+
const [reposSubmenu, forceReposSubmenu] = useReducer(c => c + 1, 1);
|
|
5890
|
+
const {
|
|
5891
|
+
transition,
|
|
5892
|
+
boundingBoxRef,
|
|
5893
|
+
boundingBoxPadding,
|
|
5894
|
+
rootMenuRef,
|
|
5895
|
+
rootAnchorRef,
|
|
5896
|
+
scrollNodesRef,
|
|
5897
|
+
reposition,
|
|
5898
|
+
viewScroll,
|
|
5899
|
+
submenuCloseDelay
|
|
5900
|
+
} = useContext(SettingsContext);
|
|
5901
|
+
const {
|
|
5902
|
+
submenuCtx: parentSubmenuCtx,
|
|
5903
|
+
reposSubmenu: reposFlag = repositionFlag
|
|
5904
|
+
} = useContext(MenuListContext);
|
|
5905
|
+
const menuRef = useRef(null);
|
|
5906
|
+
const focusRef = useRef();
|
|
5907
|
+
const arrowRef = useRef();
|
|
5908
|
+
const prevOpen = useRef(false);
|
|
5909
|
+
const latestMenuSize = useRef({
|
|
5910
|
+
width: 0,
|
|
5911
|
+
height: 0
|
|
5912
|
+
});
|
|
5913
|
+
const latestHandlePosition = useRef(() => {});
|
|
5914
|
+
const {
|
|
5915
|
+
hoverItem,
|
|
5916
|
+
dispatch,
|
|
5917
|
+
updateItems
|
|
5918
|
+
} = useItems(menuRef, focusRef);
|
|
5919
|
+
const isOpen = isMenuOpen(state);
|
|
5920
|
+
const openTransition = getTransition(transition, 'open');
|
|
5921
|
+
const closeTransition = getTransition(transition, 'close');
|
|
5922
|
+
const scrollNodes = scrollNodesRef.current;
|
|
5923
|
+
const onKeyDown = e => {
|
|
5924
|
+
switch (e.key) {
|
|
5925
|
+
case Keys.HOME:
|
|
5926
|
+
dispatch(HoverActionTypes.FIRST);
|
|
5927
|
+
break;
|
|
5928
|
+
case Keys.END:
|
|
5929
|
+
dispatch(HoverActionTypes.LAST);
|
|
5930
|
+
break;
|
|
5931
|
+
case Keys.UP:
|
|
5932
|
+
dispatch(HoverActionTypes.DECREASE, hoverItem);
|
|
5933
|
+
break;
|
|
5934
|
+
case Keys.DOWN:
|
|
5935
|
+
dispatch(HoverActionTypes.INCREASE, hoverItem);
|
|
5936
|
+
break;
|
|
5937
|
+
case Keys.SPACE:
|
|
5938
|
+
if (e.target && e.target.className.indexOf(menuClass) !== -1) {
|
|
5939
|
+
e.preventDefault();
|
|
5940
|
+
}
|
|
5941
|
+
return;
|
|
5942
|
+
default:
|
|
5943
|
+
return;
|
|
5944
|
+
}
|
|
5945
|
+
e.preventDefault();
|
|
5946
|
+
e.stopPropagation();
|
|
5947
|
+
};
|
|
5948
|
+
const onAnimationEnd = () => {
|
|
5949
|
+
if (state === 'closing') {
|
|
5950
|
+
setOverflowData();
|
|
5951
|
+
}
|
|
5952
|
+
safeCall(endTransition);
|
|
5953
|
+
};
|
|
5954
|
+
const onPointerMove = e => {
|
|
5955
|
+
e.stopPropagation();
|
|
5956
|
+
submenuCtx.on(submenuCloseDelay, () => {
|
|
5957
|
+
dispatch(HoverActionTypes.RESET);
|
|
5958
|
+
focusRef.current.focus();
|
|
5959
|
+
});
|
|
5960
|
+
};
|
|
5961
|
+
const onPointerLeave = e => {
|
|
5962
|
+
if (e.target === e.currentTarget) submenuCtx.off();
|
|
5963
|
+
};
|
|
5964
|
+
const handlePosition = useCallback(noOverflowCheck => {
|
|
5965
|
+
var _anchorRef$current;
|
|
5966
|
+
const anchorRect = anchorRef ? (_anchorRef$current = anchorRef.current) == null ? void 0 : _anchorRef$current.getBoundingClientRect() : anchorPoint ? {
|
|
5967
|
+
left: anchorPoint.x,
|
|
5968
|
+
right: anchorPoint.x,
|
|
5969
|
+
top: anchorPoint.y,
|
|
5970
|
+
bottom: anchorPoint.y,
|
|
5971
|
+
width: 0,
|
|
5972
|
+
height: 0
|
|
5973
|
+
} : null;
|
|
5974
|
+
if (!anchorRect) {
|
|
5975
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
5976
|
+
console.warn('[React-Menu] Menu might not be positioned properly as one of the anchorRef or anchorPoint prop should be provided. If `anchorRef` is provided, the anchor must be mounted before menu is open.');
|
|
5977
|
+
}
|
|
5978
|
+
return;
|
|
5979
|
+
}
|
|
5980
|
+
if (!scrollNodes.menu) {
|
|
5981
|
+
scrollNodes.menu = (boundingBoxRef ? boundingBoxRef.current : getScrollAncestor(rootMenuRef.current)) || window;
|
|
5982
|
+
}
|
|
5983
|
+
const positionHelpers = getPositionHelpers(containerRef, menuRef, scrollNodes.menu, boundingBoxPadding);
|
|
5984
|
+
let {
|
|
5985
|
+
arrowX,
|
|
5986
|
+
arrowY,
|
|
5987
|
+
x,
|
|
5988
|
+
y,
|
|
5989
|
+
computedDirection
|
|
5990
|
+
} = positionMenu({
|
|
5991
|
+
arrow,
|
|
5992
|
+
align,
|
|
5993
|
+
direction,
|
|
5994
|
+
gap,
|
|
5995
|
+
shift,
|
|
5996
|
+
position,
|
|
5997
|
+
anchorRect,
|
|
5998
|
+
arrowRef,
|
|
5999
|
+
positionHelpers
|
|
6000
|
+
});
|
|
6001
|
+
const {
|
|
6002
|
+
menuRect
|
|
6003
|
+
} = positionHelpers;
|
|
6004
|
+
let menuHeight = menuRect.height;
|
|
6005
|
+
if (!noOverflowCheck && overflow !== 'visible') {
|
|
6006
|
+
const {
|
|
6007
|
+
getTopOverflow,
|
|
6008
|
+
getBottomOverflow
|
|
6009
|
+
} = positionHelpers;
|
|
6010
|
+
let height, overflowAmt;
|
|
6011
|
+
const prevHeight = latestMenuSize.current.height;
|
|
6012
|
+
const bottomOverflow = getBottomOverflow(y);
|
|
6013
|
+
if (bottomOverflow > 0 || floatEqual(bottomOverflow, 0) && floatEqual(menuHeight, prevHeight)) {
|
|
6014
|
+
height = menuHeight - bottomOverflow;
|
|
6015
|
+
overflowAmt = bottomOverflow;
|
|
6016
|
+
} else {
|
|
6017
|
+
const topOverflow = getTopOverflow(y);
|
|
6018
|
+
if (topOverflow < 0 || floatEqual(topOverflow, 0) && floatEqual(menuHeight, prevHeight)) {
|
|
6019
|
+
height = menuHeight + topOverflow;
|
|
6020
|
+
overflowAmt = 0 - topOverflow;
|
|
6021
|
+
if (height >= 0) y -= topOverflow;
|
|
6022
|
+
}
|
|
6023
|
+
}
|
|
6024
|
+
if (height >= 0) {
|
|
6025
|
+
menuHeight = height;
|
|
6026
|
+
setOverflowData({
|
|
6027
|
+
height,
|
|
6028
|
+
overflowAmt
|
|
6029
|
+
});
|
|
6030
|
+
} else {
|
|
6031
|
+
setOverflowData();
|
|
6032
|
+
}
|
|
6033
|
+
}
|
|
6034
|
+
if (arrow) setArrowPosition({
|
|
6035
|
+
x: arrowX,
|
|
6036
|
+
y: arrowY
|
|
6037
|
+
});
|
|
6038
|
+
setMenuPosition({
|
|
6039
|
+
x,
|
|
6040
|
+
y
|
|
6041
|
+
});
|
|
6042
|
+
setExpandedDirection(computedDirection);
|
|
6043
|
+
latestMenuSize.current = {
|
|
6044
|
+
width: menuRect.width,
|
|
6045
|
+
height: menuHeight
|
|
6046
|
+
};
|
|
6047
|
+
}, [arrow, align, boundingBoxPadding, direction, gap, shift, position, overflow, anchorPoint, anchorRef, containerRef, boundingBoxRef, rootMenuRef, scrollNodes]);
|
|
6048
|
+
useIsomorphicLayoutEffect$2(() => {
|
|
6049
|
+
if (isOpen) {
|
|
6050
|
+
handlePosition();
|
|
6051
|
+
if (prevOpen.current) forceReposSubmenu();
|
|
6052
|
+
}
|
|
6053
|
+
prevOpen.current = isOpen;
|
|
6054
|
+
latestHandlePosition.current = handlePosition;
|
|
6055
|
+
}, [isOpen, handlePosition, reposFlag]);
|
|
6056
|
+
useIsomorphicLayoutEffect$2(() => {
|
|
6057
|
+
if (overflowData && !setDownOverflow) menuRef.current.scrollTop = 0;
|
|
6058
|
+
}, [overflowData, setDownOverflow]);
|
|
6059
|
+
useIsomorphicLayoutEffect$2(() => updateItems, [updateItems]);
|
|
6060
|
+
useEffect(() => {
|
|
6061
|
+
let {
|
|
6062
|
+
menu: menuScroll
|
|
6063
|
+
} = scrollNodes;
|
|
6064
|
+
if (!isOpen || !menuScroll) return;
|
|
6065
|
+
menuScroll = menuScroll.addEventListener ? menuScroll : window;
|
|
6066
|
+
if (!scrollNodes.anchors) {
|
|
6067
|
+
scrollNodes.anchors = [];
|
|
6068
|
+
let anchorScroll = getScrollAncestor(rootAnchorRef && rootAnchorRef.current);
|
|
6069
|
+
while (anchorScroll && anchorScroll !== menuScroll) {
|
|
6070
|
+
scrollNodes.anchors.push(anchorScroll);
|
|
6071
|
+
anchorScroll = getScrollAncestor(anchorScroll);
|
|
6072
|
+
}
|
|
6073
|
+
}
|
|
6074
|
+
let scroll = viewScroll;
|
|
6075
|
+
if (scrollNodes.anchors.length && scroll === 'initial') scroll = 'auto';
|
|
6076
|
+
if (scroll === 'initial') return;
|
|
6077
|
+
const handleScroll = () => {
|
|
6078
|
+
if (scroll === 'auto') {
|
|
6079
|
+
batchedUpdates(() => handlePosition(true));
|
|
6080
|
+
} else {
|
|
6081
|
+
safeCall(onClose, {
|
|
6082
|
+
reason: CloseReason.SCROLL
|
|
6083
|
+
});
|
|
6084
|
+
}
|
|
6085
|
+
};
|
|
6086
|
+
const scrollObservers = scrollNodes.anchors.concat(viewScroll !== 'initial' ? menuScroll : []);
|
|
6087
|
+
scrollObservers.forEach(o => o.addEventListener('scroll', handleScroll));
|
|
6088
|
+
return () => scrollObservers.forEach(o => o.removeEventListener('scroll', handleScroll));
|
|
6089
|
+
}, [rootAnchorRef, scrollNodes, isOpen, onClose, viewScroll, handlePosition]);
|
|
6090
|
+
const hasOverflow = !!overflowData && overflowData.overflowAmt > 0;
|
|
6091
|
+
useEffect(() => {
|
|
6092
|
+
if (hasOverflow || !isOpen || !parentScrollingRef) return;
|
|
6093
|
+
const handleScroll = () => batchedUpdates(handlePosition);
|
|
6094
|
+
const parentScroll = parentScrollingRef.current;
|
|
6095
|
+
parentScroll.addEventListener('scroll', handleScroll);
|
|
6096
|
+
return () => parentScroll.removeEventListener('scroll', handleScroll);
|
|
6097
|
+
}, [isOpen, hasOverflow, parentScrollingRef, handlePosition]);
|
|
6098
|
+
useEffect(() => {
|
|
6099
|
+
if (typeof ResizeObserver !== 'function' || reposition === 'initial') return;
|
|
6100
|
+
const resizeObserver = new ResizeObserver(([entry]) => {
|
|
6101
|
+
const {
|
|
6102
|
+
borderBoxSize,
|
|
6103
|
+
target
|
|
6104
|
+
} = entry;
|
|
6105
|
+
let width, height;
|
|
6106
|
+
if (borderBoxSize) {
|
|
6107
|
+
const {
|
|
6108
|
+
inlineSize,
|
|
6109
|
+
blockSize
|
|
6110
|
+
} = borderBoxSize[0] || borderBoxSize;
|
|
6111
|
+
width = inlineSize;
|
|
6112
|
+
height = blockSize;
|
|
6113
|
+
} else {
|
|
6114
|
+
const borderRect = getNormalizedClientRect(target);
|
|
6115
|
+
width = borderRect.width;
|
|
6116
|
+
height = borderRect.height;
|
|
6117
|
+
}
|
|
6118
|
+
if (width === 0 || height === 0) return;
|
|
6119
|
+
if (floatEqual(width, latestMenuSize.current.width, 1) && floatEqual(height, latestMenuSize.current.height, 1)) return;
|
|
6120
|
+
flushSync$1(() => {
|
|
6121
|
+
latestHandlePosition.current();
|
|
6122
|
+
forceReposSubmenu();
|
|
6123
|
+
});
|
|
6124
|
+
});
|
|
6125
|
+
const observeTarget = menuRef.current;
|
|
6126
|
+
resizeObserver.observe(observeTarget, {
|
|
6127
|
+
box: 'border-box'
|
|
6128
|
+
});
|
|
6129
|
+
return () => resizeObserver.unobserve(observeTarget);
|
|
6130
|
+
}, [reposition]);
|
|
6131
|
+
useEffect(() => {
|
|
6132
|
+
if (!isOpen) {
|
|
6133
|
+
dispatch(HoverActionTypes.RESET);
|
|
6134
|
+
if (!closeTransition) setOverflowData();
|
|
6135
|
+
return;
|
|
6136
|
+
}
|
|
6137
|
+
const {
|
|
6138
|
+
position,
|
|
6139
|
+
alwaysUpdate
|
|
6140
|
+
} = menuItemFocus || {};
|
|
6141
|
+
const setItemFocus = () => {
|
|
6142
|
+
if (position === FocusPositions.FIRST) {
|
|
6143
|
+
dispatch(HoverActionTypes.FIRST);
|
|
6144
|
+
} else if (position === FocusPositions.LAST) {
|
|
6145
|
+
dispatch(HoverActionTypes.LAST);
|
|
6146
|
+
} else if (position >= -1) {
|
|
6147
|
+
dispatch(HoverActionTypes.SET_INDEX, undefined, position);
|
|
6148
|
+
}
|
|
6149
|
+
};
|
|
6150
|
+
if (alwaysUpdate) {
|
|
6151
|
+
setItemFocus();
|
|
6152
|
+
} else if (captureFocus) {
|
|
6153
|
+
const id = setTimeout(() => {
|
|
6154
|
+
const menuElt = menuRef.current;
|
|
6155
|
+
if (menuElt && !menuElt.contains(document.activeElement)) {
|
|
6156
|
+
focusRef.current.focus();
|
|
6157
|
+
setItemFocus();
|
|
6158
|
+
}
|
|
6159
|
+
}, openTransition ? 170 : 100);
|
|
6160
|
+
return () => clearTimeout(id);
|
|
6161
|
+
}
|
|
6162
|
+
}, [isOpen, openTransition, closeTransition, captureFocus, menuItemFocus, dispatch]);
|
|
6163
|
+
const itemContext = useMemo(() => ({
|
|
6164
|
+
isParentOpen: isOpen,
|
|
6165
|
+
submenuCtx,
|
|
6166
|
+
dispatch,
|
|
6167
|
+
updateItems
|
|
6168
|
+
}), [isOpen, submenuCtx, dispatch, updateItems]);
|
|
6169
|
+
let maxHeight, overflowAmt;
|
|
6170
|
+
if (overflowData) {
|
|
6171
|
+
setDownOverflow ? overflowAmt = overflowData.overflowAmt : maxHeight = overflowData.height;
|
|
6172
|
+
}
|
|
6173
|
+
const listContext = useMemo(() => ({
|
|
6174
|
+
reposSubmenu,
|
|
6175
|
+
submenuCtx,
|
|
6176
|
+
overflow,
|
|
6177
|
+
overflowAmt,
|
|
6178
|
+
parentMenuRef: menuRef,
|
|
6179
|
+
parentDir: expandedDirection
|
|
6180
|
+
}), [reposSubmenu, submenuCtx, overflow, overflowAmt, expandedDirection]);
|
|
6181
|
+
const overflowStyle = maxHeight >= 0 ? {
|
|
6182
|
+
maxHeight,
|
|
6183
|
+
overflow
|
|
6184
|
+
} : undefined;
|
|
6185
|
+
const modifiers = useMemo(() => ({
|
|
6186
|
+
state,
|
|
6187
|
+
align,
|
|
6188
|
+
dir: expandedDirection
|
|
6189
|
+
}), [state, align, expandedDirection]);
|
|
6190
|
+
const arrowModifiers = useMemo(() => ({
|
|
6191
|
+
dir: expandedDirection
|
|
6192
|
+
}), [expandedDirection]);
|
|
6193
|
+
const _arrowClassName = useBEM({
|
|
6194
|
+
block: menuClass,
|
|
6195
|
+
element: menuArrowClass,
|
|
6196
|
+
modifiers: arrowModifiers,
|
|
6197
|
+
className: arrowProps.className
|
|
6198
|
+
});
|
|
6199
|
+
const menu = /*#__PURE__*/jsxs("ul", {
|
|
6200
|
+
role: "menu",
|
|
6201
|
+
"aria-label": ariaLabel,
|
|
6202
|
+
...commonProps(isDisabled),
|
|
6203
|
+
...mergeProps({
|
|
6204
|
+
onPointerEnter: parentSubmenuCtx == null ? void 0 : parentSubmenuCtx.off,
|
|
6205
|
+
onPointerMove,
|
|
6206
|
+
onPointerLeave,
|
|
6207
|
+
onKeyDown,
|
|
6208
|
+
onAnimationEnd
|
|
6209
|
+
}, restProps),
|
|
6210
|
+
ref: useCombinedRef(externalRef, menuRef),
|
|
6211
|
+
className: useBEM({
|
|
6212
|
+
block: menuClass,
|
|
6213
|
+
modifiers,
|
|
6214
|
+
className: menuClassName
|
|
6215
|
+
}),
|
|
6216
|
+
style: {
|
|
6217
|
+
...menuStyle,
|
|
6218
|
+
...overflowStyle,
|
|
6219
|
+
margin: 0,
|
|
6220
|
+
display: state === 'closed' ? 'none' : undefined,
|
|
6221
|
+
position: positionAbsolute,
|
|
6222
|
+
left: menuPosition.x,
|
|
6223
|
+
top: menuPosition.y
|
|
6224
|
+
},
|
|
6225
|
+
children: [/*#__PURE__*/jsx("li", {
|
|
6226
|
+
tabIndex: -1,
|
|
6227
|
+
style: {
|
|
6228
|
+
position: positionAbsolute,
|
|
6229
|
+
left: 0,
|
|
6230
|
+
top: 0,
|
|
6231
|
+
display: 'block',
|
|
6232
|
+
outline: 'none'
|
|
6233
|
+
},
|
|
6234
|
+
ref: focusRef,
|
|
6235
|
+
...dummyItemProps,
|
|
6236
|
+
...focusProps
|
|
6237
|
+
}), arrow && /*#__PURE__*/jsx("li", {
|
|
6238
|
+
...dummyItemProps,
|
|
6239
|
+
...arrowProps,
|
|
6240
|
+
className: _arrowClassName,
|
|
6241
|
+
style: {
|
|
6242
|
+
display: 'block',
|
|
6243
|
+
position: positionAbsolute,
|
|
6244
|
+
left: arrowPosition.x,
|
|
6245
|
+
top: arrowPosition.y,
|
|
6246
|
+
...arrowProps.style
|
|
6247
|
+
},
|
|
6248
|
+
ref: arrowRef
|
|
6249
|
+
}), /*#__PURE__*/jsx(MenuListContext.Provider, {
|
|
6250
|
+
value: listContext,
|
|
6251
|
+
children: /*#__PURE__*/jsx(MenuListItemContext.Provider, {
|
|
6252
|
+
value: itemContext,
|
|
6253
|
+
children: /*#__PURE__*/jsx(HoverItemContext.Provider, {
|
|
6254
|
+
value: hoverItem,
|
|
6255
|
+
children: safeCall(children, modifiers)
|
|
6256
|
+
})
|
|
6257
|
+
})
|
|
6258
|
+
})]
|
|
6259
|
+
});
|
|
6260
|
+
return containerProps ? /*#__PURE__*/jsx(MenuContainer, {
|
|
6261
|
+
...containerProps,
|
|
6262
|
+
isOpen: isOpen,
|
|
6263
|
+
children: menu
|
|
6264
|
+
}) : menu;
|
|
6265
|
+
};
|
|
6266
|
+
|
|
6267
|
+
const ControlledMenu = /*#__PURE__*/forwardRef(function ControlledMenu({
|
|
6268
|
+
'aria-label': ariaLabel,
|
|
6269
|
+
className,
|
|
6270
|
+
containerProps,
|
|
6271
|
+
initialMounted,
|
|
6272
|
+
unmountOnClose,
|
|
6273
|
+
transition,
|
|
6274
|
+
transitionTimeout,
|
|
6275
|
+
boundingBoxRef,
|
|
6276
|
+
boundingBoxPadding,
|
|
6277
|
+
reposition = 'auto',
|
|
6278
|
+
submenuOpenDelay = 300,
|
|
6279
|
+
submenuCloseDelay = 150,
|
|
6280
|
+
viewScroll = 'initial',
|
|
6281
|
+
portal,
|
|
6282
|
+
theming,
|
|
6283
|
+
onItemClick,
|
|
6284
|
+
...restProps
|
|
6285
|
+
}, externalRef) {
|
|
6286
|
+
const containerRef = useRef(null);
|
|
6287
|
+
const scrollNodesRef = useRef({});
|
|
6288
|
+
const {
|
|
6289
|
+
anchorRef,
|
|
6290
|
+
state,
|
|
6291
|
+
onClose
|
|
6292
|
+
} = restProps;
|
|
6293
|
+
const settings = useMemo(() => ({
|
|
6294
|
+
initialMounted,
|
|
6295
|
+
unmountOnClose,
|
|
6296
|
+
transition,
|
|
6297
|
+
transitionTimeout,
|
|
6298
|
+
boundingBoxRef,
|
|
6299
|
+
boundingBoxPadding,
|
|
6300
|
+
rootMenuRef: containerRef,
|
|
6301
|
+
rootAnchorRef: anchorRef,
|
|
6302
|
+
scrollNodesRef,
|
|
6303
|
+
reposition,
|
|
6304
|
+
viewScroll,
|
|
6305
|
+
submenuOpenDelay,
|
|
6306
|
+
submenuCloseDelay
|
|
6307
|
+
}), [initialMounted, unmountOnClose, transition, transitionTimeout, anchorRef, boundingBoxRef, boundingBoxPadding, reposition, viewScroll, submenuOpenDelay, submenuCloseDelay]);
|
|
6308
|
+
const eventHandlers = useMemo(() => ({
|
|
6309
|
+
handleClick(event, isCheckorRadio) {
|
|
6310
|
+
if (!event.stopPropagation) safeCall(onItemClick, event);
|
|
6311
|
+
let keepOpen = event.keepOpen;
|
|
6312
|
+
if (keepOpen === undefined) {
|
|
6313
|
+
keepOpen = isCheckorRadio && event.key === Keys.SPACE;
|
|
6314
|
+
}
|
|
6315
|
+
if (!keepOpen) {
|
|
6316
|
+
safeCall(onClose, {
|
|
6317
|
+
value: event.value,
|
|
6318
|
+
key: event.key,
|
|
6319
|
+
reason: CloseReason.CLICK
|
|
6320
|
+
});
|
|
6321
|
+
}
|
|
6322
|
+
},
|
|
6323
|
+
handleClose(key) {
|
|
6324
|
+
safeCall(onClose, {
|
|
6325
|
+
key,
|
|
6326
|
+
reason: CloseReason.CLICK
|
|
6327
|
+
});
|
|
6328
|
+
}
|
|
6329
|
+
}), [onItemClick, onClose]);
|
|
6330
|
+
if (!state) return null;
|
|
6331
|
+
const menuList = /*#__PURE__*/jsx(SettingsContext.Provider, {
|
|
6332
|
+
value: settings,
|
|
6333
|
+
children: /*#__PURE__*/jsx(EventHandlersContext.Provider, {
|
|
6334
|
+
value: eventHandlers,
|
|
6335
|
+
children: /*#__PURE__*/jsx(MenuList, {
|
|
6336
|
+
...restProps,
|
|
6337
|
+
ariaLabel: ariaLabel || 'Menu',
|
|
6338
|
+
externalRef: externalRef,
|
|
6339
|
+
containerRef: containerRef,
|
|
6340
|
+
containerProps: {
|
|
6341
|
+
className,
|
|
6342
|
+
containerRef,
|
|
6343
|
+
containerProps,
|
|
6344
|
+
theming,
|
|
6345
|
+
transition,
|
|
6346
|
+
onClose
|
|
6347
|
+
}
|
|
6348
|
+
})
|
|
6349
|
+
})
|
|
6350
|
+
});
|
|
6351
|
+
if (portal === true && typeof document !== 'undefined') {
|
|
6352
|
+
return /*#__PURE__*/createPortal(menuList, document.body);
|
|
6353
|
+
} else if (portal) {
|
|
6354
|
+
return portal.target ? /*#__PURE__*/createPortal(menuList, portal.target) : portal.stablePosition ? null : menuList;
|
|
6355
|
+
}
|
|
6356
|
+
return menuList;
|
|
6357
|
+
});
|
|
6358
|
+
process.env.NODE_ENV !== "production" ? ControlledMenu.propTypes = {
|
|
6359
|
+
...rootMenuPropTypes,
|
|
6360
|
+
state: /*#__PURE__*/propTypes.exports.oneOf( /*#__PURE__*/values(MenuStateMap)),
|
|
6361
|
+
anchorPoint: /*#__PURE__*/propTypes.exports.exact({
|
|
6362
|
+
x: propTypes.exports.number,
|
|
6363
|
+
y: propTypes.exports.number
|
|
6364
|
+
}),
|
|
6365
|
+
anchorRef: propTypes.exports.object,
|
|
6366
|
+
captureFocus: propTypes.exports.bool,
|
|
6367
|
+
menuItemFocus: /*#__PURE__*/propTypes.exports.exact({
|
|
6368
|
+
position: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.string, propTypes.exports.number]),
|
|
6369
|
+
alwaysUpdate: propTypes.exports.bool
|
|
6370
|
+
}),
|
|
6371
|
+
onClose: propTypes.exports.func
|
|
6372
|
+
} : void 0;
|
|
6373
|
+
|
|
6374
|
+
const PRE_ENTER = 0;
|
|
6375
|
+
const ENTERING = 1;
|
|
6376
|
+
const ENTERED = 2;
|
|
6377
|
+
const PRE_EXIT = 3;
|
|
6378
|
+
const EXITING = 4;
|
|
6379
|
+
const EXITED = 5;
|
|
6380
|
+
const UNMOUNTED = 6;
|
|
6381
|
+
const STATUS = ['preEnter', 'entering', 'entered', 'preExit', 'exiting', 'exited', 'unmounted'];
|
|
6382
|
+
const getState = status => ({
|
|
6383
|
+
_s: status,
|
|
6384
|
+
status: STATUS[status],
|
|
6385
|
+
isEnter: status < PRE_EXIT,
|
|
6386
|
+
isMounted: status !== UNMOUNTED,
|
|
6387
|
+
isResolved: status === ENTERED || status > EXITING
|
|
6388
|
+
});
|
|
6389
|
+
const startOrEnd = unmounted => unmounted ? UNMOUNTED : EXITED;
|
|
6390
|
+
const getEndStatus = (status, unmountOnExit) => {
|
|
6391
|
+
switch (status) {
|
|
6392
|
+
case ENTERING:
|
|
6393
|
+
case PRE_ENTER:
|
|
6394
|
+
return ENTERED;
|
|
6395
|
+
case EXITING:
|
|
6396
|
+
case PRE_EXIT:
|
|
6397
|
+
return startOrEnd(unmountOnExit);
|
|
6398
|
+
}
|
|
6399
|
+
};
|
|
6400
|
+
const getTimeout = timeout => typeof timeout === 'object' ? [timeout.enter, timeout.exit] : [timeout, timeout];
|
|
6401
|
+
const nextTick = (transitState, status) => setTimeout(() => {
|
|
6402
|
+
// Reading document.body.offsetTop can force browser to repaint before transition to the next state
|
|
6403
|
+
isNaN(document.body.offsetTop) || transitState(status + 1);
|
|
6404
|
+
}, 0);
|
|
6405
|
+
|
|
6406
|
+
const updateState = (status, setState, latestState, timeoutId, onChange) => {
|
|
6407
|
+
clearTimeout(timeoutId.current);
|
|
6408
|
+
const state = getState(status);
|
|
6409
|
+
setState(state);
|
|
6410
|
+
latestState.current = state;
|
|
6411
|
+
onChange && onChange({
|
|
6412
|
+
current: state
|
|
6413
|
+
});
|
|
6414
|
+
};
|
|
6415
|
+
const useTransition = ({
|
|
6416
|
+
enter = true,
|
|
6417
|
+
exit = true,
|
|
6418
|
+
preEnter,
|
|
6419
|
+
preExit,
|
|
6420
|
+
timeout,
|
|
6421
|
+
initialEntered,
|
|
6422
|
+
mountOnEnter,
|
|
6423
|
+
unmountOnExit,
|
|
6424
|
+
onStateChange: onChange
|
|
6425
|
+
} = {}) => {
|
|
6426
|
+
const [state, setState] = useState(() => getState(initialEntered ? ENTERED : startOrEnd(mountOnEnter)));
|
|
6427
|
+
const latestState = useRef(state);
|
|
6428
|
+
const timeoutId = useRef();
|
|
6429
|
+
const [enterTimeout, exitTimeout] = getTimeout(timeout);
|
|
6430
|
+
const endTransition = useCallback(() => {
|
|
6431
|
+
const status = getEndStatus(latestState.current._s, unmountOnExit);
|
|
6432
|
+
status && updateState(status, setState, latestState, timeoutId, onChange);
|
|
6433
|
+
}, [onChange, unmountOnExit]);
|
|
6434
|
+
const toggle = useCallback(toEnter => {
|
|
6435
|
+
const transitState = status => {
|
|
6436
|
+
updateState(status, setState, latestState, timeoutId, onChange);
|
|
6437
|
+
switch (status) {
|
|
6438
|
+
case ENTERING:
|
|
6439
|
+
if (enterTimeout >= 0) timeoutId.current = setTimeout(endTransition, enterTimeout);
|
|
6440
|
+
break;
|
|
6441
|
+
case EXITING:
|
|
6442
|
+
if (exitTimeout >= 0) timeoutId.current = setTimeout(endTransition, exitTimeout);
|
|
6443
|
+
break;
|
|
6444
|
+
case PRE_ENTER:
|
|
6445
|
+
case PRE_EXIT:
|
|
6446
|
+
timeoutId.current = nextTick(transitState, status);
|
|
6447
|
+
break;
|
|
6448
|
+
}
|
|
6449
|
+
};
|
|
6450
|
+
const enterStage = latestState.current.isEnter;
|
|
6451
|
+
if (typeof toEnter !== 'boolean') toEnter = !enterStage;
|
|
6452
|
+
if (toEnter) {
|
|
6453
|
+
!enterStage && transitState(enter ? preEnter ? PRE_ENTER : ENTERING : ENTERED);
|
|
6454
|
+
} else {
|
|
6455
|
+
enterStage && transitState(exit ? preExit ? PRE_EXIT : EXITING : startOrEnd(unmountOnExit));
|
|
6456
|
+
}
|
|
6457
|
+
}, [endTransition, onChange, enter, exit, preEnter, preExit, enterTimeout, exitTimeout, unmountOnExit]);
|
|
6458
|
+
useEffect(() => () => clearTimeout(timeoutId.current), []);
|
|
6459
|
+
return [state, toggle, endTransition];
|
|
6460
|
+
};
|
|
6461
|
+
|
|
6462
|
+
const useMenuState = ({
|
|
6463
|
+
initialOpen,
|
|
6464
|
+
initialMounted,
|
|
6465
|
+
unmountOnClose,
|
|
6466
|
+
transition,
|
|
6467
|
+
transitionTimeout = 500
|
|
6468
|
+
} = {}) => {
|
|
6469
|
+
const [{
|
|
6470
|
+
status
|
|
6471
|
+
}, toggleMenu, endTransition] = useTransition({
|
|
6472
|
+
initialEntered: initialOpen,
|
|
6473
|
+
mountOnEnter: !initialMounted,
|
|
6474
|
+
unmountOnExit: unmountOnClose,
|
|
6475
|
+
timeout: transitionTimeout,
|
|
6476
|
+
enter: getTransition(transition, 'open'),
|
|
6477
|
+
exit: getTransition(transition, 'close')
|
|
6478
|
+
});
|
|
6479
|
+
return [{
|
|
6480
|
+
state: MenuStateMap[status],
|
|
6481
|
+
endTransition
|
|
6482
|
+
}, toggleMenu];
|
|
6483
|
+
};
|
|
6484
|
+
|
|
6485
|
+
const useMenuStateAndFocus = options => {
|
|
6486
|
+
const [menuProps, toggleMenu] = useMenuState(options);
|
|
6487
|
+
const [menuItemFocus, setMenuItemFocus] = useState();
|
|
6488
|
+
const openMenu = (position, alwaysUpdate) => {
|
|
6489
|
+
setMenuItemFocus({
|
|
6490
|
+
position,
|
|
6491
|
+
alwaysUpdate
|
|
6492
|
+
});
|
|
6493
|
+
toggleMenu(true);
|
|
6494
|
+
};
|
|
6495
|
+
return [{
|
|
6496
|
+
menuItemFocus,
|
|
6497
|
+
...menuProps
|
|
6498
|
+
}, toggleMenu, openMenu];
|
|
6499
|
+
};
|
|
6500
|
+
|
|
6501
|
+
const useClick = (state, onToggle) => {
|
|
6502
|
+
if (process.env.NODE_ENV !== 'production' && typeof onToggle !== 'function') {
|
|
6503
|
+
throw new Error('[React-Menu] useClick/useHover requires a function in the second parameter.');
|
|
6504
|
+
}
|
|
6505
|
+
const [skipOpen] = useState({});
|
|
6506
|
+
return {
|
|
6507
|
+
onMouseDown: () => {
|
|
6508
|
+
skipOpen.v = state && state !== 'closed';
|
|
6509
|
+
},
|
|
6510
|
+
onClick: e => skipOpen.v ? skipOpen.v = false : onToggle(true, e)
|
|
6511
|
+
};
|
|
6512
|
+
};
|
|
6513
|
+
|
|
6514
|
+
const useMenuChange = (onMenuChange, isOpen) => {
|
|
6515
|
+
const prevOpen = useRef(isOpen);
|
|
6516
|
+
useEffect(() => {
|
|
6517
|
+
if (prevOpen.current !== isOpen) safeCall(onMenuChange, {
|
|
6518
|
+
open: isOpen
|
|
6519
|
+
});
|
|
6520
|
+
prevOpen.current = isOpen;
|
|
6521
|
+
}, [onMenuChange, isOpen]);
|
|
6522
|
+
};
|
|
6523
|
+
|
|
6524
|
+
const Menu = /*#__PURE__*/forwardRef(function Menu({
|
|
6525
|
+
'aria-label': ariaLabel,
|
|
6526
|
+
captureFocus: _,
|
|
6527
|
+
initialOpen: _1,
|
|
6528
|
+
menuButton,
|
|
6529
|
+
instanceRef,
|
|
6530
|
+
onMenuChange,
|
|
6531
|
+
...restProps
|
|
6532
|
+
}, externalRef) {
|
|
6533
|
+
const [stateProps, toggleMenu, openMenu] = useMenuStateAndFocus(restProps);
|
|
6534
|
+
const {
|
|
6535
|
+
state
|
|
6536
|
+
} = stateProps;
|
|
6537
|
+
const isOpen = isMenuOpen(state);
|
|
6538
|
+
const buttonRef = useRef(null);
|
|
6539
|
+
const anchorProps = useClick(state, (_, e) => openMenu(!e.detail ? FocusPositions.FIRST : undefined));
|
|
6540
|
+
const handleClose = useCallback(e => {
|
|
6541
|
+
toggleMenu(false);
|
|
6542
|
+
if (e.key) buttonRef.current.focus();
|
|
6543
|
+
}, [toggleMenu]);
|
|
6544
|
+
const onKeyDown = e => {
|
|
6545
|
+
switch (e.key) {
|
|
6546
|
+
case Keys.UP:
|
|
6547
|
+
openMenu(FocusPositions.LAST);
|
|
6548
|
+
break;
|
|
6549
|
+
case Keys.DOWN:
|
|
6550
|
+
openMenu(FocusPositions.FIRST);
|
|
6551
|
+
break;
|
|
6552
|
+
default:
|
|
6553
|
+
return;
|
|
6554
|
+
}
|
|
6555
|
+
e.preventDefault();
|
|
6556
|
+
};
|
|
6557
|
+
const button = safeCall(menuButton, {
|
|
6558
|
+
open: isOpen
|
|
6559
|
+
});
|
|
6560
|
+
if (!button || !button.type) throw new Error('Menu requires a menuButton prop.');
|
|
6561
|
+
const buttonProps = {
|
|
6562
|
+
ref: useCombinedRef(button.ref, buttonRef),
|
|
6563
|
+
...mergeProps({
|
|
6564
|
+
onKeyDown,
|
|
6565
|
+
...anchorProps
|
|
6566
|
+
}, button.props)
|
|
6567
|
+
};
|
|
6568
|
+
if (getName(button.type) === 'MenuButton') {
|
|
6569
|
+
buttonProps.isOpen = isOpen;
|
|
6570
|
+
}
|
|
6571
|
+
const renderButton = /*#__PURE__*/cloneElement(button, buttonProps);
|
|
6572
|
+
useMenuChange(onMenuChange, isOpen);
|
|
6573
|
+
useImperativeHandle(instanceRef, () => ({
|
|
6574
|
+
openMenu,
|
|
6575
|
+
closeMenu: () => toggleMenu(false)
|
|
6576
|
+
}));
|
|
6577
|
+
return /*#__PURE__*/jsxs(Fragment$1, {
|
|
6578
|
+
children: [renderButton, /*#__PURE__*/jsx(ControlledMenu, {
|
|
6579
|
+
...restProps,
|
|
6580
|
+
...stateProps,
|
|
6581
|
+
"aria-label": ariaLabel || (typeof button.props.children === 'string' ? button.props.children : 'Menu'),
|
|
6582
|
+
anchorRef: buttonRef,
|
|
6583
|
+
ref: externalRef,
|
|
6584
|
+
onClose: handleClose
|
|
6585
|
+
})]
|
|
6586
|
+
});
|
|
6587
|
+
});
|
|
6588
|
+
process.env.NODE_ENV !== "production" ? Menu.propTypes = {
|
|
6589
|
+
...rootMenuPropTypes,
|
|
6590
|
+
...uncontrolledMenuPropTypes,
|
|
6591
|
+
menuButton: propTypes.exports.oneOfType([propTypes.exports.element, propTypes.exports.func]).isRequired
|
|
6592
|
+
} : void 0;
|
|
6593
|
+
|
|
6594
|
+
const withHovering = (name, WrappedComponent) => {
|
|
6595
|
+
const Component = /*#__PURE__*/memo(WrappedComponent);
|
|
6596
|
+
const WithHovering = /*#__PURE__*/forwardRef((props, ref) => {
|
|
6597
|
+
const itemRef = useRef(null);
|
|
6598
|
+
return /*#__PURE__*/jsx(Component, {
|
|
6599
|
+
...props,
|
|
6600
|
+
itemRef: itemRef,
|
|
6601
|
+
externalRef: ref,
|
|
6602
|
+
isHovering: useContext(HoverItemContext) === itemRef.current
|
|
6603
|
+
});
|
|
6604
|
+
});
|
|
6605
|
+
WithHovering.displayName = `WithHovering(${name})`;
|
|
6606
|
+
return WithHovering;
|
|
6607
|
+
};
|
|
6608
|
+
|
|
6609
|
+
const useItemEffect = (isDisabled, itemRef, updateItems) => {
|
|
6610
|
+
useIsomorphicLayoutEffect$2(() => {
|
|
6611
|
+
if (process.env.NODE_ENV !== 'production' && !updateItems) {
|
|
6612
|
+
throw new Error(`[React-Menu] This menu item or submenu should be rendered under a menu: ${itemRef.current.outerHTML}`);
|
|
6613
|
+
}
|
|
6614
|
+
if (isDisabled) return;
|
|
6615
|
+
const item = itemRef.current;
|
|
6616
|
+
updateItems(item, true);
|
|
6617
|
+
return () => {
|
|
6618
|
+
updateItems(item);
|
|
6619
|
+
};
|
|
6620
|
+
}, [isDisabled, itemRef, updateItems]);
|
|
6621
|
+
};
|
|
6622
|
+
|
|
6623
|
+
const useItemState = (itemRef, focusRef, isHovering, isDisabled) => {
|
|
6624
|
+
const {
|
|
6625
|
+
submenuCloseDelay
|
|
6626
|
+
} = useContext(SettingsContext);
|
|
6627
|
+
const {
|
|
6628
|
+
isParentOpen,
|
|
6629
|
+
submenuCtx,
|
|
6630
|
+
dispatch,
|
|
6631
|
+
updateItems
|
|
6632
|
+
} = useContext(MenuListItemContext);
|
|
6633
|
+
const setHover = () => {
|
|
6634
|
+
!isHovering && !isDisabled && dispatch(HoverActionTypes.SET, itemRef.current);
|
|
6635
|
+
};
|
|
6636
|
+
const unsetHover = () => {
|
|
6637
|
+
!isDisabled && dispatch(HoverActionTypes.UNSET, itemRef.current);
|
|
6638
|
+
};
|
|
6639
|
+
const onBlur = e => {
|
|
6640
|
+
if (isHovering && !e.currentTarget.contains(e.relatedTarget)) unsetHover();
|
|
6641
|
+
};
|
|
6642
|
+
const onPointerMove = e => {
|
|
6643
|
+
if (!isDisabled) {
|
|
6644
|
+
e.stopPropagation();
|
|
6645
|
+
submenuCtx.on(submenuCloseDelay, setHover, setHover);
|
|
6646
|
+
}
|
|
6647
|
+
};
|
|
6648
|
+
const onPointerLeave = (_, keepHover) => {
|
|
6649
|
+
submenuCtx.off();
|
|
6650
|
+
!keepHover && unsetHover();
|
|
6651
|
+
};
|
|
6652
|
+
useItemEffect(isDisabled, itemRef, updateItems);
|
|
6653
|
+
useEffect(() => {
|
|
6654
|
+
if (isHovering && isParentOpen) {
|
|
6655
|
+
focusRef.current && focusRef.current.focus();
|
|
6656
|
+
}
|
|
6657
|
+
}, [focusRef, isHovering, isParentOpen]);
|
|
6658
|
+
return {
|
|
6659
|
+
setHover,
|
|
6660
|
+
onBlur,
|
|
6661
|
+
onPointerMove,
|
|
6662
|
+
onPointerLeave
|
|
6663
|
+
};
|
|
6664
|
+
};
|
|
6665
|
+
|
|
6666
|
+
const MenuItem = /*#__PURE__*/withHovering('MenuItem', function MenuItem({
|
|
6667
|
+
className,
|
|
6668
|
+
value,
|
|
6669
|
+
href,
|
|
6670
|
+
type,
|
|
6671
|
+
checked,
|
|
6672
|
+
disabled,
|
|
6673
|
+
children,
|
|
6674
|
+
onClick,
|
|
6675
|
+
isHovering,
|
|
6676
|
+
itemRef,
|
|
6677
|
+
externalRef,
|
|
6678
|
+
...restProps
|
|
6679
|
+
}) {
|
|
6680
|
+
const isDisabled = !!disabled;
|
|
6681
|
+
const {
|
|
6682
|
+
setHover,
|
|
6683
|
+
...restStateProps
|
|
6684
|
+
} = useItemState(itemRef, itemRef, isHovering, isDisabled);
|
|
6685
|
+
const eventHandlers = useContext(EventHandlersContext);
|
|
6686
|
+
const radioGroup = useContext(RadioGroupContext);
|
|
6687
|
+
const isRadio = type === 'radio';
|
|
6688
|
+
const isCheckBox = type === 'checkbox';
|
|
6689
|
+
const isAnchor = !!href && !isDisabled && !isRadio && !isCheckBox;
|
|
6690
|
+
const isChecked = isRadio ? radioGroup.value === value : isCheckBox ? !!checked : false;
|
|
6691
|
+
const handleClick = e => {
|
|
6692
|
+
if (isDisabled) {
|
|
6693
|
+
e.stopPropagation();
|
|
6694
|
+
e.preventDefault();
|
|
6695
|
+
return;
|
|
6696
|
+
}
|
|
6697
|
+
const event = {
|
|
6698
|
+
value,
|
|
6699
|
+
syntheticEvent: e
|
|
6700
|
+
};
|
|
6701
|
+
if (e.key !== undefined) event.key = e.key;
|
|
6702
|
+
if (isCheckBox) event.checked = !isChecked;
|
|
6703
|
+
if (isRadio) event.name = radioGroup.name;
|
|
6704
|
+
safeCall(onClick, event);
|
|
6705
|
+
if (isRadio) safeCall(radioGroup.onRadioChange, event);
|
|
6706
|
+
eventHandlers.handleClick(event, isCheckBox || isRadio);
|
|
6707
|
+
};
|
|
6708
|
+
const handleKeyDown = e => {
|
|
6709
|
+
if (!isHovering) return;
|
|
6710
|
+
switch (e.key) {
|
|
6711
|
+
case Keys.ENTER:
|
|
6712
|
+
e.preventDefault();
|
|
6713
|
+
case Keys.SPACE:
|
|
6714
|
+
isAnchor ? itemRef.current.click() : handleClick(e);
|
|
6715
|
+
}
|
|
6716
|
+
};
|
|
6717
|
+
const modifiers = useMemo(() => ({
|
|
6718
|
+
type,
|
|
6719
|
+
disabled: isDisabled,
|
|
6720
|
+
hover: isHovering,
|
|
6721
|
+
checked: isChecked,
|
|
6722
|
+
anchor: isAnchor
|
|
6723
|
+
}), [type, isDisabled, isHovering, isChecked, isAnchor]);
|
|
6724
|
+
const mergedProps = mergeProps({
|
|
6725
|
+
...restStateProps,
|
|
6726
|
+
onPointerDown: setHover,
|
|
6727
|
+
onKeyDown: handleKeyDown,
|
|
6728
|
+
onClick: handleClick
|
|
6729
|
+
}, restProps);
|
|
6730
|
+
const menuItemProps = {
|
|
6731
|
+
role: isRadio ? 'menuitemradio' : isCheckBox ? 'menuitemcheckbox' : roleMenuitem,
|
|
6732
|
+
'aria-checked': isRadio || isCheckBox ? isChecked : undefined,
|
|
6733
|
+
...commonProps(isDisabled, isHovering),
|
|
6734
|
+
...mergedProps,
|
|
6735
|
+
ref: useCombinedRef(externalRef, itemRef),
|
|
6736
|
+
className: useBEM({
|
|
6737
|
+
block: menuClass,
|
|
6738
|
+
element: menuItemClass,
|
|
6739
|
+
modifiers,
|
|
6740
|
+
className
|
|
6741
|
+
}),
|
|
6742
|
+
children: useMemo(() => safeCall(children, modifiers), [children, modifiers])
|
|
6743
|
+
};
|
|
6744
|
+
return isAnchor ? /*#__PURE__*/jsx("li", {
|
|
6745
|
+
role: roleNone,
|
|
6746
|
+
children: /*#__PURE__*/jsx("a", {
|
|
6747
|
+
href: href,
|
|
6748
|
+
...menuItemProps
|
|
6749
|
+
})
|
|
6750
|
+
}) : /*#__PURE__*/jsx("li", {
|
|
6751
|
+
...menuItemProps
|
|
6752
|
+
});
|
|
6753
|
+
});
|
|
6754
|
+
process.env.NODE_ENV !== "production" ? MenuItem.propTypes = {
|
|
6755
|
+
...stylePropTypes(),
|
|
6756
|
+
value: propTypes.exports.any,
|
|
6757
|
+
href: propTypes.exports.string,
|
|
6758
|
+
type: /*#__PURE__*/propTypes.exports.oneOf(['checkbox', 'radio']),
|
|
6759
|
+
checked: propTypes.exports.bool,
|
|
6760
|
+
disabled: propTypes.exports.bool,
|
|
6761
|
+
children: /*#__PURE__*/propTypes.exports.oneOfType([propTypes.exports.node, propTypes.exports.func]),
|
|
6762
|
+
onClick: propTypes.exports.func
|
|
6763
|
+
} : void 0;
|
|
6764
|
+
|
|
6765
|
+
function Navbar(props) {
|
|
6766
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
5178
6767
|
const {
|
|
5179
6768
|
navbarOpened,
|
|
5180
6769
|
appMenu
|
|
@@ -5185,26 +6774,112 @@ function Navbar() {
|
|
|
5185
6774
|
return !a.hasPermissions || FluxoClientSys.Instance.security.currentUser.hasPermissions((_a = a.permissions) !== null && _a !== void 0 ? _a : []);
|
|
5186
6775
|
});
|
|
5187
6776
|
};
|
|
5188
|
-
return
|
|
5189
|
-
children: jsx(AppShell.
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5194
|
-
|
|
6777
|
+
return jsxs(Fragment, {
|
|
6778
|
+
children: [props.shellUi.navigation === ShellUINavigation.Sidebar && jsx(AppShell.Navbar, {
|
|
6779
|
+
children: jsx(AppShell.Section, {
|
|
6780
|
+
grow: true,
|
|
6781
|
+
my: "md",
|
|
6782
|
+
component: ScrollArea,
|
|
6783
|
+
children: jsx(Stack, {
|
|
6784
|
+
justify: "center",
|
|
6785
|
+
align: 'center',
|
|
6786
|
+
gap: 8,
|
|
6787
|
+
children: getPermittedNavBarItems().map((e, i) => {
|
|
6788
|
+
const IconComponent = e.icon ? IconFactory.getIcon(e.icon) : IconFactory.getIcon('Dashboard');
|
|
6789
|
+
return jsx(NavBarItem, {
|
|
6790
|
+
level: 0,
|
|
6791
|
+
routerLink: e.routerLink,
|
|
6792
|
+
icon: IconComponent,
|
|
6793
|
+
label: e.label,
|
|
6794
|
+
links: e.children && e.children.length > 0 ? e.children : undefined
|
|
6795
|
+
}, i);
|
|
6796
|
+
})
|
|
6797
|
+
})
|
|
6798
|
+
})
|
|
6799
|
+
}), props.shellUi.navigation === ShellUINavigation.Topbar && jsx(AppShell.Header, {
|
|
6800
|
+
style: {
|
|
6801
|
+
top: 48,
|
|
6802
|
+
height: 40,
|
|
6803
|
+
background: '#fff',
|
|
6804
|
+
boxShadow: 'rgba(33, 33, 33, 0.1) 2px 1px 1px'
|
|
6805
|
+
},
|
|
6806
|
+
children: jsx(Group, {
|
|
5195
6807
|
align: 'center',
|
|
5196
|
-
gap:
|
|
6808
|
+
gap: 0,
|
|
5197
6809
|
children: getPermittedNavBarItems().map((e, i) => {
|
|
5198
|
-
|
|
5199
|
-
|
|
5200
|
-
level: 0,
|
|
5201
|
-
routerLink: e.routerLink,
|
|
5202
|
-
icon: IconComponent,
|
|
5203
|
-
label: e.label,
|
|
5204
|
-
links: e.children && e.children.length > 0 ? e.children : undefined
|
|
6810
|
+
return jsx(HorizontalRecursiveMenuItem, {
|
|
6811
|
+
item: e
|
|
5205
6812
|
}, i);
|
|
5206
6813
|
})
|
|
5207
6814
|
})
|
|
6815
|
+
})]
|
|
6816
|
+
});
|
|
6817
|
+
}
|
|
6818
|
+
function HorizontalRecursiveMenuItem(props) {
|
|
6819
|
+
var _a;
|
|
6820
|
+
const theme = useMantineTheme();
|
|
6821
|
+
const colorScheme = useMantineColorScheme();
|
|
6822
|
+
const IconComponent = props.item.icon ? IconFactory.getIcon(props.item.icon) : IconFactory.getIcon('Dashboard');
|
|
6823
|
+
const InnerMenuItemComponent = props => {
|
|
6824
|
+
const InnerIconComponent = props.item.icon ? IconFactory.getIcon(props.item.icon) : IconFactory.getIcon('Dashboard');
|
|
6825
|
+
if (props.item.children && props.item.children.length > 0) {
|
|
6826
|
+
return jsxs(Group, {
|
|
6827
|
+
pl: props.withPaddingLR ? 12 : 'inherit',
|
|
6828
|
+
pr: props.withPaddingLR ? 12 : 'inherit',
|
|
6829
|
+
children: [InnerIconComponent, jsx(Text, {
|
|
6830
|
+
size: 'sm',
|
|
6831
|
+
children: props.item.label
|
|
6832
|
+
})]
|
|
6833
|
+
});
|
|
6834
|
+
} else {
|
|
6835
|
+
return jsx(Link, {
|
|
6836
|
+
style: {
|
|
6837
|
+
color: colorScheme.colorScheme === 'dark' ? theme.colors.dark[0] : theme.colors.gray[7],
|
|
6838
|
+
textDecoration: 'none'
|
|
6839
|
+
},
|
|
6840
|
+
state: {
|
|
6841
|
+
title: props.item.label
|
|
6842
|
+
},
|
|
6843
|
+
to: '/' + props.item.routerLink,
|
|
6844
|
+
children: jsxs(Group, {
|
|
6845
|
+
children: [InnerIconComponent, jsx(Text, {
|
|
6846
|
+
size: 'sm',
|
|
6847
|
+
children: props.item.label
|
|
6848
|
+
})]
|
|
6849
|
+
})
|
|
6850
|
+
}, props.item.label + '_' + props.item);
|
|
6851
|
+
}
|
|
6852
|
+
};
|
|
6853
|
+
if (props.item.children && props.item.children.length === 0) {
|
|
6854
|
+
return jsx(InnerMenuItemComponent, {
|
|
6855
|
+
withPaddingLR: true,
|
|
6856
|
+
item: props.item
|
|
6857
|
+
});
|
|
6858
|
+
}
|
|
6859
|
+
return jsx(Menu, {
|
|
6860
|
+
align: 'start',
|
|
6861
|
+
arrow: true,
|
|
6862
|
+
gap: -12,
|
|
6863
|
+
menuButton: jsxs(Group, {
|
|
6864
|
+
h: 40,
|
|
6865
|
+
style: {
|
|
6866
|
+
paddingLeft: 12,
|
|
6867
|
+
cursor: 'pointer'
|
|
6868
|
+
},
|
|
6869
|
+
children: [IconComponent, jsx(Text, {
|
|
6870
|
+
size: 'sm',
|
|
6871
|
+
children: props.item.label
|
|
6872
|
+
}), jsx(Divider, {
|
|
6873
|
+
orientation: 'vertical'
|
|
6874
|
+
})]
|
|
6875
|
+
}),
|
|
6876
|
+
children: (_a = props.item.children) === null || _a === void 0 ? void 0 : _a.map((e, i) => {
|
|
6877
|
+
return jsx(MenuItem, {
|
|
6878
|
+
children: jsx(InnerMenuItemComponent, {
|
|
6879
|
+
withPaddingLR: false,
|
|
6880
|
+
item: e
|
|
6881
|
+
})
|
|
6882
|
+
}, i);
|
|
5208
6883
|
})
|
|
5209
6884
|
});
|
|
5210
6885
|
}
|
|
@@ -5314,11 +6989,18 @@ function AppLayout(props) {
|
|
|
5314
6989
|
transitionDuration: 0,
|
|
5315
6990
|
layout: 'default',
|
|
5316
6991
|
children: [jsx(AppBar, {
|
|
6992
|
+
shellUi: props.ui,
|
|
5317
6993
|
brandName: props.brandName
|
|
5318
|
-
}), jsx(Navbar, {
|
|
6994
|
+
}), jsx(Navbar, {
|
|
6995
|
+
shellUi: props.ui
|
|
6996
|
+
}), jsx(AppShell.Main, {
|
|
6997
|
+
style: {
|
|
6998
|
+
paddingTop: props.ui.navigation === ShellUINavigation.Topbar ? 88 : 'inherit'
|
|
6999
|
+
},
|
|
5319
7000
|
children: jsx(Suspense, {
|
|
5320
7001
|
fallback: jsx(Loader, {}),
|
|
5321
7002
|
children: jsx(AppContent, {
|
|
7003
|
+
shellUi: props.ui,
|
|
5322
7004
|
withMultipleSessions: props.withMultipleSessions
|
|
5323
7005
|
})
|
|
5324
7006
|
})
|
|
@@ -5738,6 +7420,9 @@ function Ui() {
|
|
|
5738
7420
|
},
|
|
5739
7421
|
p: 0,
|
|
5740
7422
|
children: jsx(AppBar, {
|
|
7423
|
+
shellUi: {
|
|
7424
|
+
navigation: ShellUINavigation.Sidebar
|
|
7425
|
+
},
|
|
5741
7426
|
previewMode: {
|
|
5742
7427
|
logo: newLogoBase64,
|
|
5743
7428
|
logoHeight: newLogoHeight,
|
|
@@ -7340,7 +9025,7 @@ var ResizeObserverController = (function () {
|
|
|
7340
9025
|
return ResizeObserverController;
|
|
7341
9026
|
}());
|
|
7342
9027
|
|
|
7343
|
-
var ResizeObserver = (function () {
|
|
9028
|
+
var ResizeObserver$1 = (function () {
|
|
7344
9029
|
function ResizeObserver(callback) {
|
|
7345
9030
|
if (arguments.length === 0) {
|
|
7346
9031
|
throw new TypeError("Failed to construct 'ResizeObserver': 1 argument required, but only 0 present.");
|
|
@@ -19540,7 +21225,7 @@ function AnimateHeight(props) {
|
|
|
19540
21225
|
open: { opacity: 1, height: "auto" },
|
|
19541
21226
|
close: { opacity: 0, height: 0 },
|
|
19542
21227
|
} : _b, children = props.children;
|
|
19543
|
-
var _c = useMeasure({ polyfill: ResizeObserver }), ref = _c[0], height = _c[1].height;
|
|
21228
|
+
var _c = useMeasure({ polyfill: ResizeObserver$1 }), ref = _c[0], height = _c[1].height;
|
|
19544
21229
|
var _d = useState(isVisible), isVisibleChildren = _d[0], setIsVisibleChildren = _d[1];
|
|
19545
21230
|
var _e = useState(isVisible), isVisibleContainer = _e[0], setIsVisibleContainer = _e[1];
|
|
19546
21231
|
var _f = useState(false), transition = _f[0], setTransition = _f[1];
|
|
@@ -27793,30 +29478,30 @@ function AppItem(props) {
|
|
|
27793
29478
|
}), jsx(Badge, {
|
|
27794
29479
|
color: 'gray',
|
|
27795
29480
|
children: moment(props.app.installationDate).format("DD/MM/yyyy")
|
|
27796
|
-
}), jsxs(Menu, {
|
|
29481
|
+
}), jsxs(Menu$1, {
|
|
27797
29482
|
shadow: "md",
|
|
27798
29483
|
width: 200,
|
|
27799
|
-
children: [jsx(Menu.Target, {
|
|
29484
|
+
children: [jsx(Menu$1.Target, {
|
|
27800
29485
|
children: jsx(ActionIcon, {
|
|
27801
29486
|
children: jsx(IconDotsVertical, {
|
|
27802
29487
|
size: 18
|
|
27803
29488
|
})
|
|
27804
29489
|
})
|
|
27805
|
-
}), jsxs(Menu.Dropdown, {
|
|
27806
|
-
children: [jsx(Menu.Item, {
|
|
29490
|
+
}), jsxs(Menu$1.Dropdown, {
|
|
29491
|
+
children: [jsx(Menu$1.Item, {
|
|
27807
29492
|
leftSection: jsx(IconCircleOff, {
|
|
27808
29493
|
size: 14
|
|
27809
29494
|
}),
|
|
27810
29495
|
onClick: props.app.state == AppState.Active ? disable : enable,
|
|
27811
29496
|
children: props.app.state == AppState.Active ? 'Disattiva' : 'Attiva'
|
|
27812
|
-
}), jsx(Menu.Item, {
|
|
29497
|
+
}), jsx(Menu$1.Item, {
|
|
27813
29498
|
onClick: () => setShowUpgradeAppModal(true),
|
|
27814
29499
|
leftSection: jsx(IconArrowUp, {
|
|
27815
29500
|
color: 'green',
|
|
27816
29501
|
size: 14
|
|
27817
29502
|
}),
|
|
27818
29503
|
children: "Aggiorna"
|
|
27819
|
-
}), jsx(Menu.Divider, {}), jsx(Menu.Item, {
|
|
29504
|
+
}), jsx(Menu$1.Divider, {}), jsx(Menu$1.Item, {
|
|
27820
29505
|
color: 'red',
|
|
27821
29506
|
onClick: () => setShowDeleteModal(true),
|
|
27822
29507
|
leftSection: jsx(IconTrash, {
|
|
@@ -28004,23 +29689,23 @@ function AppJitItem(props) {
|
|
|
28004
29689
|
}), jsx(Badge, {
|
|
28005
29690
|
color: 'gray',
|
|
28006
29691
|
children: moment(props.app.installationDate).format("DD/MM/yyyy")
|
|
28007
|
-
}), jsxs(Menu, {
|
|
29692
|
+
}), jsxs(Menu$1, {
|
|
28008
29693
|
shadow: "md",
|
|
28009
29694
|
width: 200,
|
|
28010
|
-
children: [jsx(Menu.Target, {
|
|
29695
|
+
children: [jsx(Menu$1.Target, {
|
|
28011
29696
|
children: jsx(ActionIcon, {
|
|
28012
29697
|
children: jsx(IconDotsVertical, {
|
|
28013
29698
|
size: 18
|
|
28014
29699
|
})
|
|
28015
29700
|
})
|
|
28016
|
-
}), jsxs(Menu.Dropdown, {
|
|
28017
|
-
children: [jsx(Menu.Item, {
|
|
29701
|
+
}), jsxs(Menu$1.Dropdown, {
|
|
29702
|
+
children: [jsx(Menu$1.Item, {
|
|
28018
29703
|
leftSection: jsx(IconCircleOff, {
|
|
28019
29704
|
size: 14
|
|
28020
29705
|
}),
|
|
28021
29706
|
onClick: props.app.state == AppState.Active ? disable : enable,
|
|
28022
29707
|
children: props.app.state == AppState.Active ? 'Disattiva' : 'Attiva'
|
|
28023
|
-
}), jsx(Menu.Divider, {}), jsx(Menu.Item, {
|
|
29708
|
+
}), jsx(Menu$1.Divider, {}), jsx(Menu$1.Item, {
|
|
28024
29709
|
color: 'red',
|
|
28025
29710
|
onClick: () => setShowDeleteModal(true),
|
|
28026
29711
|
leftSection: jsx(IconTrash, {
|
|
@@ -29063,17 +30748,17 @@ function DomainRoleGrid() {
|
|
|
29063
30748
|
}), jsx(Table.Td, {
|
|
29064
30749
|
w: 100,
|
|
29065
30750
|
align: "right",
|
|
29066
|
-
children: jsxs(Menu, {
|
|
30751
|
+
children: jsxs(Menu$1, {
|
|
29067
30752
|
shadow: "md",
|
|
29068
30753
|
width: 200,
|
|
29069
|
-
children: [jsx(Menu.Target, {
|
|
30754
|
+
children: [jsx(Menu$1.Target, {
|
|
29070
30755
|
children: jsx(ActionIcon, {
|
|
29071
30756
|
children: jsx(IconDotsVertical, {
|
|
29072
30757
|
size: 18
|
|
29073
30758
|
})
|
|
29074
30759
|
})
|
|
29075
|
-
}), jsxs(Menu.Dropdown, {
|
|
29076
|
-
children: [jsx(Menu.Item, {
|
|
30760
|
+
}), jsxs(Menu$1.Dropdown, {
|
|
30761
|
+
children: [jsx(Menu$1.Item, {
|
|
29077
30762
|
leftSection: jsx(IconGridDots, {
|
|
29078
30763
|
size: 14
|
|
29079
30764
|
}),
|
|
@@ -29082,7 +30767,7 @@ function DomainRoleGrid() {
|
|
|
29082
30767
|
setUpdateDomainFrontendsModal(true);
|
|
29083
30768
|
},
|
|
29084
30769
|
children: "Aree funzionali"
|
|
29085
|
-
}), jsx(Menu.Item, {
|
|
30770
|
+
}), jsx(Menu$1.Item, {
|
|
29086
30771
|
leftSection: jsx(IconLock, {
|
|
29087
30772
|
size: 14
|
|
29088
30773
|
}),
|
|
@@ -29091,7 +30776,7 @@ function DomainRoleGrid() {
|
|
|
29091
30776
|
setUpdateDomainRolePermissionsModal(true);
|
|
29092
30777
|
},
|
|
29093
30778
|
children: "Permessi"
|
|
29094
|
-
}), jsx(Menu.Item, {
|
|
30779
|
+
}), jsx(Menu$1.Item, {
|
|
29095
30780
|
onClick: () => {
|
|
29096
30781
|
setCurrentDomainRole(element);
|
|
29097
30782
|
setDomainRoleModalOpen(true);
|
|
@@ -29100,7 +30785,7 @@ function DomainRoleGrid() {
|
|
|
29100
30785
|
size: 14
|
|
29101
30786
|
}),
|
|
29102
30787
|
children: "Modifica"
|
|
29103
|
-
}), jsx(Menu.Divider, {}), jsx(Menu.Item, {
|
|
30788
|
+
}), jsx(Menu$1.Divider, {}), jsx(Menu$1.Item, {
|
|
29104
30789
|
color: 'red',
|
|
29105
30790
|
onClick: () => deleteDomainRole(element.id),
|
|
29106
30791
|
leftSection: jsx(IconTrash, {
|
|
@@ -29424,17 +31109,17 @@ function UsersGrid() {
|
|
|
29424
31109
|
})
|
|
29425
31110
|
}), jsx(Table.Td, {
|
|
29426
31111
|
align: "right",
|
|
29427
|
-
children: jsxs(Menu, {
|
|
31112
|
+
children: jsxs(Menu$1, {
|
|
29428
31113
|
shadow: "md",
|
|
29429
31114
|
width: 200,
|
|
29430
|
-
children: [jsx(Menu.Target, {
|
|
31115
|
+
children: [jsx(Menu$1.Target, {
|
|
29431
31116
|
children: jsx(ActionIcon, {
|
|
29432
31117
|
children: jsx(IconDotsVertical, {
|
|
29433
31118
|
size: 18
|
|
29434
31119
|
})
|
|
29435
31120
|
})
|
|
29436
|
-
}), jsxs(Menu.Dropdown, {
|
|
29437
|
-
children: [jsx(Menu.Item, {
|
|
31121
|
+
}), jsxs(Menu$1.Dropdown, {
|
|
31122
|
+
children: [jsx(Menu$1.Item, {
|
|
29438
31123
|
onClick: () => {
|
|
29439
31124
|
setCurrentUser(element);
|
|
29440
31125
|
setNewUserModalOpen(true);
|
|
@@ -29443,7 +31128,7 @@ function UsersGrid() {
|
|
|
29443
31128
|
size: 14
|
|
29444
31129
|
}),
|
|
29445
31130
|
children: "Modifica"
|
|
29446
|
-
}), jsx(Menu.Item, {
|
|
31131
|
+
}), jsx(Menu$1.Item, {
|
|
29447
31132
|
color: 'red',
|
|
29448
31133
|
onClick: () => deletion(element.id),
|
|
29449
31134
|
leftSection: jsx(IconTrash, {
|
|
@@ -30480,6 +32165,11 @@ function FrontendSwitcher(props) {
|
|
|
30480
32165
|
});
|
|
30481
32166
|
}
|
|
30482
32167
|
|
|
32168
|
+
var ShellUINavigation;
|
|
32169
|
+
(function (ShellUINavigation) {
|
|
32170
|
+
ShellUINavigation[ShellUINavigation["Sidebar"] = 1] = "Sidebar";
|
|
32171
|
+
ShellUINavigation[ShellUINavigation["Topbar"] = 2] = "Topbar";
|
|
32172
|
+
})(ShellUINavigation || (ShellUINavigation = {}));
|
|
30483
32173
|
function FluxoShell(props) {
|
|
30484
32174
|
const [initialOperationsFinished, setInitialOperationsFinished] = useState(false);
|
|
30485
32175
|
const [router, setRouter] = useState();
|
|
@@ -30658,6 +32348,7 @@ function FluxoShell(props) {
|
|
|
30658
32348
|
const FrontendLayout = () => {
|
|
30659
32349
|
var _a, _b;
|
|
30660
32350
|
return (_a = frontendByRender === null || frontendByRender === void 0 ? void 0 : frontendByRender.layout) !== null && _a !== void 0 ? _a : jsx(AppLayout, {
|
|
32351
|
+
ui: props.ui,
|
|
30661
32352
|
withMultipleSessions: props.withMultipleSessions,
|
|
30662
32353
|
brandName: (_b = props.brandName) !== null && _b !== void 0 ? _b : 'Fluxo',
|
|
30663
32354
|
appVersion: props.appVersion
|
|
@@ -30880,4 +32571,4 @@ function AppInner(props) {
|
|
|
30880
32571
|
});
|
|
30881
32572
|
}
|
|
30882
32573
|
|
|
30883
|
-
export { FluxoShell, FrontendSwitch };
|
|
32574
|
+
export { FluxoShell, FrontendSwitch, ShellUINavigation };
|