@hitachivantara/uikit-react-core 5.36.2 → 5.36.4
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/dist/cjs/components/Card/Header/Header.cjs +1 -0
- package/dist/cjs/components/Card/Header/Header.cjs.map +1 -1
- package/dist/cjs/components/Card/Header/Header.styles.cjs +6 -10
- package/dist/cjs/components/Card/Header/Header.styles.cjs.map +1 -1
- package/dist/cjs/components/Section/Section.cjs +4 -3
- package/dist/cjs/components/Section/Section.cjs.map +1 -1
- package/dist/cjs/components/Table/hooks/usePagination.cjs +1 -1
- package/dist/cjs/components/Table/hooks/usePagination.cjs.map +1 -1
- package/dist/cjs/components/TreeView/TreeItem/DefaultContent.cjs +24 -8
- package/dist/cjs/components/TreeView/TreeItem/DefaultContent.cjs.map +1 -1
- package/dist/cjs/components/TreeView/TreeItem/TreeItem.cjs +7 -6
- package/dist/cjs/components/TreeView/TreeItem/TreeItem.cjs.map +1 -1
- package/dist/cjs/components/TreeView/TreeItem/useHvTreeItem.cjs +2 -3
- package/dist/cjs/components/TreeView/TreeItem/useHvTreeItem.cjs.map +1 -1
- package/dist/cjs/components/TreeView/TreeView.cjs +4 -4
- package/dist/cjs/components/TreeView/TreeView.cjs.map +1 -1
- package/dist/cjs/components/TreeView/internals/DescendantProvider.cjs +146 -0
- package/dist/cjs/components/TreeView/internals/DescendantProvider.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/TreeViewProvider.cjs +34 -0
- package/dist/cjs/components/TreeView/internals/TreeViewProvider.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/corePlugins.cjs +6 -0
- package/dist/cjs/components/TreeView/internals/corePlugins.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/defaultPlugins.cjs +11 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/defaultPlugins.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.cjs +28 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewExpansion.cjs +80 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewExpansion.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewFocus.cjs +105 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewFocus.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.cjs +237 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewNodes.cjs +82 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewNodes.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewSelection.cjs +232 -0
- package/dist/cjs/components/TreeView/internals/hooks/plugins/useTreeViewSelection.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/useInstanceEventHandler.cjs +93 -0
- package/dist/cjs/components/TreeView/internals/hooks/useInstanceEventHandler.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeView.cjs +87 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeView.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeViewInstanceEvents.cjs +52 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeViewInstanceEvents.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeViewModels.cjs +58 -0
- package/dist/cjs/components/TreeView/internals/hooks/useTreeViewModels.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/hooks/utils.cjs +47 -0
- package/dist/cjs/components/TreeView/internals/hooks/utils.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/utils/EventManager.cjs +62 -0
- package/dist/cjs/components/TreeView/internals/utils/EventManager.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.cjs +22 -0
- package/dist/cjs/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/utils/TimerBasedCleanupTracking.cjs +41 -0
- package/dist/cjs/components/TreeView/internals/utils/TimerBasedCleanupTracking.cjs.map +1 -0
- package/dist/cjs/components/TreeView/internals/utils/publishTreeViewEvent.cjs +7 -0
- package/dist/cjs/components/TreeView/internals/utils/publishTreeViewEvent.cjs.map +1 -0
- package/dist/esm/components/Card/Header/Header.js +1 -0
- package/dist/esm/components/Card/Header/Header.js.map +1 -1
- package/dist/esm/components/Card/Header/Header.styles.js +6 -10
- package/dist/esm/components/Card/Header/Header.styles.js.map +1 -1
- package/dist/esm/components/Section/Section.js +4 -3
- package/dist/esm/components/Section/Section.js.map +1 -1
- package/dist/esm/components/Table/hooks/usePagination.js +1 -1
- package/dist/esm/components/Table/hooks/usePagination.js.map +1 -1
- package/dist/esm/components/TreeView/TreeItem/DefaultContent.js +18 -2
- package/dist/esm/components/TreeView/TreeItem/DefaultContent.js.map +1 -1
- package/dist/esm/components/TreeView/TreeItem/TreeItem.js +3 -4
- package/dist/esm/components/TreeView/TreeItem/TreeItem.js.map +1 -1
- package/dist/esm/components/TreeView/TreeItem/useHvTreeItem.js +1 -2
- package/dist/esm/components/TreeView/TreeItem/useHvTreeItem.js.map +1 -1
- package/dist/esm/components/TreeView/TreeView.js +4 -4
- package/dist/esm/components/TreeView/TreeView.js.map +1 -1
- package/dist/esm/components/TreeView/internals/DescendantProvider.js +127 -0
- package/dist/esm/components/TreeView/internals/DescendantProvider.js.map +1 -0
- package/dist/esm/components/TreeView/internals/TreeViewProvider.js +34 -0
- package/dist/esm/components/TreeView/internals/TreeViewProvider.js.map +1 -0
- package/dist/esm/components/TreeView/internals/corePlugins.js +6 -0
- package/dist/esm/components/TreeView/internals/corePlugins.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/defaultPlugins.js +11 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/defaultPlugins.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.js +28 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewContextValueBuilder.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewExpansion.js +61 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewExpansion.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewFocus.js +86 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewFocus.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.js +218 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewKeyboardNavigation.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewNodes.js +63 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewNodes.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewSelection.js +213 -0
- package/dist/esm/components/TreeView/internals/hooks/plugins/useTreeViewSelection.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/useInstanceEventHandler.js +74 -0
- package/dist/esm/components/TreeView/internals/hooks/useInstanceEventHandler.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeView.js +68 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeView.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeViewInstanceEvents.js +33 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeViewInstanceEvents.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeViewModels.js +39 -0
- package/dist/esm/components/TreeView/internals/hooks/useTreeViewModels.js.map +1 -0
- package/dist/esm/components/TreeView/internals/hooks/utils.js +47 -0
- package/dist/esm/components/TreeView/internals/hooks/utils.js.map +1 -0
- package/dist/esm/components/TreeView/internals/utils/EventManager.js +62 -0
- package/dist/esm/components/TreeView/internals/utils/EventManager.js.map +1 -0
- package/dist/esm/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js +22 -0
- package/dist/esm/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js.map +1 -0
- package/dist/esm/components/TreeView/internals/utils/TimerBasedCleanupTracking.js +41 -0
- package/dist/esm/components/TreeView/internals/utils/TimerBasedCleanupTracking.js.map +1 -0
- package/dist/esm/components/TreeView/internals/utils/publishTreeViewEvent.js +7 -0
- package/dist/esm/components/TreeView/internals/utils/publishTreeViewEvent.js.map +1 -0
- package/dist/types/index.d.ts +791 -589
- package/package.json +5 -6
- package/dist/cjs/components/TreeView/internals.cjs +0 -30
- package/dist/cjs/components/TreeView/internals.cjs.map +0 -1
- package/dist/esm/components/TreeView/internals.js +0 -15
- package/dist/esm/components/TreeView/internals.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInstanceEventHandler.js","sources":["../../../../../../src/components/TreeView/internals/hooks/useInstanceEventHandler.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { UnregisterToken, CleanupTracking } from \"../utils/CleanupTracking\";\nimport { TimerBasedCleanupTracking } from \"../utils/TimerBasedCleanupTracking\";\nimport { FinalizationRegistryBasedCleanupTracking } from \"../utils/FinalizationRegistryBasedCleanupTracking\";\nimport { TreeViewAnyPluginSignature, TreeViewUsedEvents } from \"../types\";\nimport { TreeViewEventListener } from \"../types/events\";\nimport { UseTreeViewInstanceEventsInstance } from \"./useTreeViewInstanceEvents.types\";\n\ninterface RegistryContainer {\n registry: CleanupTracking | null;\n}\n\n// We use class to make it easier to detect in heap snapshots by name\nclass ObjectToBeRetainedByReact {}\n\n// Based on https://github.com/Bnaya/use-dispose-uncommitted/blob/main/src/finalization-registry-based-impl.ts\n// Check https://github.com/facebook/react/issues/15317 to get more information\nexport function createUseInstanceEventHandler(\n registryContainer: RegistryContainer\n) {\n let cleanupTokensCounter = 0;\n\n return function useInstanceEventHandler<\n Instance extends UseTreeViewInstanceEventsInstance & {\n $$signature: TreeViewAnyPluginSignature;\n },\n E extends keyof TreeViewUsedEvents<Instance[\"$$signature\"]>\n >(\n instance: Instance,\n eventName: E,\n handler: TreeViewEventListener<\n TreeViewUsedEvents<Instance[\"$$signature\"]>[E]\n >\n ) {\n type Signature = Instance[\"$$signature\"];\n\n if (registryContainer.registry === null) {\n registryContainer.registry =\n typeof FinalizationRegistry !== \"undefined\"\n ? new FinalizationRegistryBasedCleanupTracking()\n : new TimerBasedCleanupTracking();\n }\n\n const [objectRetainedByReact] = React.useState(\n new ObjectToBeRetainedByReact()\n );\n const subscription = React.useRef<(() => void) | null>(null);\n const handlerRef = React.useRef<\n TreeViewEventListener<TreeViewUsedEvents<Signature>[E]> | undefined\n >();\n handlerRef.current = handler;\n const cleanupTokenRef = React.useRef<UnregisterToken | null>(null);\n\n if (!subscription.current && handlerRef.current) {\n const enhancedHandler: TreeViewEventListener<\n TreeViewUsedEvents<Signature>[E]\n > = (params, event) => {\n if (!event.defaultMuiPrevented) {\n handlerRef.current?.(params, event);\n }\n };\n\n subscription.current = instance.$$subscribeEvent(\n eventName as string,\n enhancedHandler\n );\n\n cleanupTokensCounter += 1;\n cleanupTokenRef.current = { cleanupToken: cleanupTokensCounter };\n\n registryContainer.registry.register(\n objectRetainedByReact, // The callback below will be called once this reference stops being retained\n () => {\n subscription.current?.();\n subscription.current = null;\n cleanupTokenRef.current = null;\n },\n cleanupTokenRef.current\n );\n } else if (!handlerRef.current && subscription.current) {\n subscription.current();\n subscription.current = null;\n\n if (cleanupTokenRef.current) {\n registryContainer.registry.unregister(cleanupTokenRef.current);\n cleanupTokenRef.current = null;\n }\n }\n\n React.useEffect(() => {\n if (!subscription.current && handlerRef.current) {\n const enhancedHandler: TreeViewEventListener<\n TreeViewUsedEvents<Signature>[E]\n > = (params, event) => {\n if (!event.defaultMuiPrevented) {\n handlerRef.current?.(params, event);\n }\n };\n\n subscription.current = instance.$$subscribeEvent(\n eventName as string,\n enhancedHandler\n );\n }\n\n if (cleanupTokenRef.current && registryContainer.registry) {\n // If the effect was called, it means that this render was committed\n // so we can trust the cleanup function to remove the listener.\n registryContainer.registry.unregister(cleanupTokenRef.current);\n cleanupTokenRef.current = null;\n }\n\n return () => {\n subscription.current?.();\n subscription.current = null;\n };\n }, [instance, eventName]);\n };\n}\n\nconst registryContainer: RegistryContainer = { registry: null };\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const unstable_resetCleanupTracking = () => {\n registryContainer.registry?.reset();\n registryContainer.registry = null;\n};\n\nexport const useInstanceEventHandler =\n createUseInstanceEventHandler(registryContainer);\n"],"names":["ObjectToBeRetainedByReact","createUseInstanceEventHandler","registryContainer","cleanupTokensCounter","useInstanceEventHandler","instance","eventName","handler","registry","FinalizationRegistry","FinalizationRegistryBasedCleanupTracking","TimerBasedCleanupTracking","objectRetainedByReact","React","useState","subscription","useRef","handlerRef","current","cleanupTokenRef","enhancedHandler","params","event","defaultMuiPrevented","$$subscribeEvent","cleanupToken","register","unregister","useEffect"],"mappings":";;;AAcA,MAAMA,0BAA0B;AAAA;AAIzB,SAASC,8BACdC,oBACA;AACA,MAAIC,uBAAuB;AAE3B,SAAO,SAASC,yBAMdC,UACAC,WACAC,SAGA;AAGIL,QAAAA,mBAAkBM,aAAa,MAAM;AACvCN,yBAAkBM,WAChB,OAAOC,yBAAyB,cAC5B,IAAIC,yCACJ,IAAA,IAAIC;IACZ;AAEA,UAAM,CAACC,qBAAqB,IAAIC,MAAMC,SACpC,IAAId,2BACN;AACMe,UAAAA,eAAeF,MAAMG,OAA4B,IAAI;AACrDC,UAAAA,aAAaJ,MAAMG;AAGzBC,eAAWC,UAAUX;AACfY,UAAAA,kBAAkBN,MAAMG,OAA+B,IAAI;AAEjE,QAAI,CAACD,aAAaG,WAAWD,WAAWC,SAAS;AACzCE,YAAAA,kBAEFA,CAACC,QAAQC,UAAU;AACjB,YAAA,CAACA,MAAMC,qBAAqB;AACnBL,qBAAAA,UAAUG,QAAQC,KAAK;AAAA,QACpC;AAAA,MAAA;AAGFP,mBAAaG,UAAUb,SAASmB,iBAC9BlB,WACAc,eACF;AAEwB,8BAAA;AACxBD,sBAAgBD,UAAU;AAAA,QAAEO,cAActB;AAAAA,MAAAA;AAE1CD,yBAAkBM,SAASkB;AAAAA,QACzBd;AAAAA;AAAAA,QACA,MAAM;AACJG,uBAAaG,UAAU;AACvBH,uBAAaG,UAAU;AACvBC,0BAAgBD,UAAU;AAAA,QAC5B;AAAA,QACAC,gBAAgBD;AAAAA,MAAAA;AAAAA,IAET,WAAA,CAACD,WAAWC,WAAWH,aAAaG,SAAS;AACtDH,mBAAaG,QAAQ;AACrBH,mBAAaG,UAAU;AAEvB,UAAIC,gBAAgBD,SAAS;AAC3BhB,2BAAkBM,SAASmB,WAAWR,gBAAgBD,OAAO;AAC7DC,wBAAgBD,UAAU;AAAA,MAC5B;AAAA,IACF;AAEAL,UAAMe,UAAU,MAAM;AACpB,UAAI,CAACb,aAAaG,WAAWD,WAAWC,SAAS;AACzCE,cAAAA,kBAEFA,CAACC,QAAQC,UAAU;AACjB,cAAA,CAACA,MAAMC,qBAAqB;AACnBL,uBAAAA,UAAUG,QAAQC,KAAK;AAAA,UACpC;AAAA,QAAA;AAGFP,qBAAaG,UAAUb,SAASmB,iBAC9BlB,WACAc,eACF;AAAA,MACF;AAEID,UAAAA,gBAAgBD,WAAWhB,mBAAkBM,UAAU;AAGzDN,2BAAkBM,SAASmB,WAAWR,gBAAgBD,OAAO;AAC7DC,wBAAgBD,UAAU;AAAA,MAC5B;AAEA,aAAO,MAAM;AACXH,qBAAaG,UAAU;AACvBH,qBAAaG,UAAU;AAAA,MAAA;AAAA,IACzB,GACC,CAACb,UAAUC,SAAS,CAAC;AAAA,EAAA;AAE5B;AAEA,MAAMJ,oBAAuC;AAAA,EAAEM,UAAU;AAAK;AAQjDJ,MAAAA,0BACXH,8BAA8BC,iBAAiB;"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useForkRef } from "@mui/material/utils";
|
|
3
|
+
import { DEFAULT_TREE_VIEW_CONTEXT_VALUE } from "../TreeViewProvider.js";
|
|
4
|
+
import { TREE_VIEW_CORE_PLUGINS } from "../corePlugins.js";
|
|
5
|
+
import { useTreeViewModels } from "./useTreeViewModels.js";
|
|
6
|
+
const useTreeView = (inParams) => {
|
|
7
|
+
const plugins = [...TREE_VIEW_CORE_PLUGINS, ...inParams.plugins];
|
|
8
|
+
const params = plugins.reduce((acc, plugin) => {
|
|
9
|
+
if (plugin.getDefaultizedParams) {
|
|
10
|
+
return plugin.getDefaultizedParams(acc);
|
|
11
|
+
}
|
|
12
|
+
return acc;
|
|
13
|
+
}, inParams);
|
|
14
|
+
const models = useTreeViewModels(plugins, params);
|
|
15
|
+
const instanceRef = React.useRef({});
|
|
16
|
+
const instance = instanceRef.current;
|
|
17
|
+
const innerRootRef = React.useRef(null);
|
|
18
|
+
const handleRootRef = useForkRef(innerRootRef, inParams.rootRef);
|
|
19
|
+
const [state, setState] = React.useState(() => {
|
|
20
|
+
const temp = {};
|
|
21
|
+
plugins.forEach((plugin) => {
|
|
22
|
+
if (plugin.getInitialState) {
|
|
23
|
+
Object.assign(temp, plugin.getInitialState(params));
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
return temp;
|
|
27
|
+
});
|
|
28
|
+
const rootPropsGetters = [];
|
|
29
|
+
let contextValue = DEFAULT_TREE_VIEW_CONTEXT_VALUE;
|
|
30
|
+
const runPlugin = (plugin) => {
|
|
31
|
+
const pluginResponse = plugin({
|
|
32
|
+
instance,
|
|
33
|
+
params,
|
|
34
|
+
state,
|
|
35
|
+
setState,
|
|
36
|
+
rootRef: innerRootRef,
|
|
37
|
+
models
|
|
38
|
+
}) || {};
|
|
39
|
+
if (pluginResponse.getRootProps) {
|
|
40
|
+
rootPropsGetters.push(pluginResponse.getRootProps);
|
|
41
|
+
}
|
|
42
|
+
if (pluginResponse.contextValue) {
|
|
43
|
+
contextValue = pluginResponse.contextValue;
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
plugins.forEach(runPlugin);
|
|
47
|
+
const getRootProps = (otherHandlers = {}) => {
|
|
48
|
+
const rootProps = {
|
|
49
|
+
role: "tree",
|
|
50
|
+
tabIndex: 0,
|
|
51
|
+
...otherHandlers,
|
|
52
|
+
ref: handleRootRef
|
|
53
|
+
};
|
|
54
|
+
rootPropsGetters.forEach((rootPropsGetter) => {
|
|
55
|
+
Object.assign(rootProps, rootPropsGetter(otherHandlers));
|
|
56
|
+
});
|
|
57
|
+
return rootProps;
|
|
58
|
+
};
|
|
59
|
+
return {
|
|
60
|
+
getRootProps,
|
|
61
|
+
rootRef: handleRootRef,
|
|
62
|
+
contextValue
|
|
63
|
+
};
|
|
64
|
+
};
|
|
65
|
+
export {
|
|
66
|
+
useTreeView
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=useTreeView.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeView.js","sources":["../../../../../../src/components/TreeView/internals/hooks/useTreeView.ts"],"sourcesContent":["import * as React from \"react\";\nimport { useForkRef } from \"@mui/material/utils\";\nimport { EventHandlers } from \"@mui/base/utils\";\n\nimport {\n TreeViewAnyPluginSignature,\n TreeViewInstance,\n TreeViewPlugin,\n ConvertPluginsIntoSignatures,\n MergePluginsProperty,\n} from \"../types\";\nimport {\n TreeViewContextValue,\n DEFAULT_TREE_VIEW_CONTEXT_VALUE,\n} from \"../TreeViewProvider\";\nimport { TREE_VIEW_CORE_PLUGINS } from \"../corePlugins\";\nimport { useTreeViewModels } from \"./useTreeViewModels\";\n\nexport type UseTreeViewParameters<\n TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]\n> = {\n rootRef?: React.Ref<HTMLUListElement> | undefined;\n plugins: TPlugins;\n} & MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, \"params\">;\n\nexport type UseTreeViewDefaultizedParameters<\n TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]\n> = {\n rootRef?: React.Ref<HTMLUListElement> | undefined;\n plugins: TPlugins;\n} & MergePluginsProperty<\n ConvertPluginsIntoSignatures<TPlugins>,\n \"defaultizedParams\"\n>;\n\nexport interface UseTreeViewRootSlotProps\n extends Pick<\n React.HTMLAttributes<HTMLUListElement>,\n | \"onFocus\"\n | \"onBlur\"\n | \"onKeyDown\"\n | \"id\"\n | \"aria-activedescendant\"\n | \"aria-multiselectable\"\n | \"role\"\n | \"tabIndex\"\n > {\n ref: React.Ref<HTMLUListElement>;\n}\n\nexport interface UseTreeViewReturnValue<\n TPlugins extends readonly TreeViewAnyPluginSignature[]\n> {\n getRootProps: <TOther extends EventHandlers = {}>(\n otherHandlers?: TOther\n ) => UseTreeViewRootSlotProps;\n rootRef: React.RefCallback<HTMLUListElement> | null;\n contextValue: TreeViewContextValue<TPlugins>;\n}\n\nexport const useTreeView = <\n Plugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]\n>(\n inParams: UseTreeViewParameters<Plugins>\n): UseTreeViewReturnValue<ConvertPluginsIntoSignatures<Plugins>> => {\n const plugins = [...TREE_VIEW_CORE_PLUGINS, ...inParams.plugins];\n type Signatures = ConvertPluginsIntoSignatures<typeof plugins>;\n\n const params = plugins.reduce((acc, plugin) => {\n if (plugin.getDefaultizedParams) {\n return plugin.getDefaultizedParams(acc);\n }\n\n return acc;\n }, inParams) as unknown as UseTreeViewDefaultizedParameters<Plugins>;\n\n const models = useTreeViewModels(\n plugins,\n params as MergePluginsProperty<Signatures, \"defaultizedParams\">\n );\n const instanceRef = React.useRef<TreeViewInstance<Signatures>>(\n {} as TreeViewInstance<Signatures>\n );\n const instance = instanceRef.current;\n const innerRootRef = React.useRef(null);\n const handleRootRef = useForkRef(innerRootRef, inParams.rootRef);\n\n const [state, setState] = React.useState(() => {\n const temp = {} as MergePluginsProperty<Signatures, \"state\">;\n plugins.forEach((plugin) => {\n if (plugin.getInitialState) {\n Object.assign(\n temp,\n plugin.getInitialState(\n params as UseTreeViewDefaultizedParameters<any>\n )\n );\n }\n });\n\n return temp;\n });\n\n const rootPropsGetters: (<TOther extends EventHandlers = {}>(\n otherHandlers: TOther\n ) => React.HTMLAttributes<HTMLUListElement>)[] = [];\n let contextValue: TreeViewContextValue<Signatures> =\n DEFAULT_TREE_VIEW_CONTEXT_VALUE;\n\n const runPlugin = (plugin: TreeViewPlugin<any>) => {\n const pluginResponse =\n plugin({\n instance,\n params,\n state,\n setState,\n rootRef: innerRootRef,\n models,\n }) || {};\n\n if (pluginResponse.getRootProps) {\n rootPropsGetters.push(pluginResponse.getRootProps);\n }\n\n if (pluginResponse.contextValue) {\n contextValue = pluginResponse.contextValue;\n }\n };\n\n plugins.forEach(runPlugin);\n\n const getRootProps = <TOther extends EventHandlers = {}>(\n otherHandlers: TOther = {} as TOther\n ) => {\n const rootProps: UseTreeViewRootSlotProps = {\n role: \"tree\",\n tabIndex: 0,\n ...otherHandlers,\n ref: handleRootRef,\n };\n\n rootPropsGetters.forEach((rootPropsGetter) => {\n Object.assign(rootProps, rootPropsGetter(otherHandlers));\n });\n\n return rootProps;\n };\n\n return { getRootProps, rootRef: handleRootRef, contextValue };\n};\n"],"names":["useTreeView","inParams","plugins","TREE_VIEW_CORE_PLUGINS","params","reduce","acc","plugin","getDefaultizedParams","models","useTreeViewModels","instanceRef","React","useRef","instance","current","innerRootRef","handleRootRef","useForkRef","rootRef","state","setState","useState","temp","forEach","getInitialState","Object","assign","rootPropsGetters","contextValue","DEFAULT_TREE_VIEW_CONTEXT_VALUE","runPlugin","pluginResponse","getRootProps","push","otherHandlers","rootProps","role","tabIndex","ref","rootPropsGetter"],"mappings":";;;;;AA4DaA,MAAAA,cAAc,CAGzBC,aACkE;AAClE,QAAMC,UAAU,CAAC,GAAGC,wBAAwB,GAAGF,SAASC,OAAO;AAG/D,QAAME,SAASF,QAAQG,OAAO,CAACC,KAAKC,WAAW;AAC7C,QAAIA,OAAOC,sBAAsB;AACxBD,aAAAA,OAAOC,qBAAqBF,GAAG;AAAA,IACxC;AAEOA,WAAAA;AAAAA,KACNL,QAAQ;AAELQ,QAAAA,SAASC,kBACbR,SACAE,MACF;AACA,QAAMO,cAAcC,MAAMC,OACxB,CACF,CAAA;AACA,QAAMC,WAAWH,YAAYI;AACvBC,QAAAA,eAAeJ,MAAMC,OAAO,IAAI;AACtC,QAAMI,gBAAgBC,WAAWF,cAAcf,SAASkB,OAAO;AAE/D,QAAM,CAACC,OAAOC,QAAQ,IAAIT,MAAMU,SAAS,MAAM;AAC7C,UAAMC,OAAO,CAAA;AACbrB,YAAQsB,QAASjB,CAAW,WAAA;AAC1B,UAAIA,OAAOkB,iBAAiB;AAC1BC,eAAOC,OACLJ,MACAhB,OAAOkB,gBACLrB,MACF,CACF;AAAA,MACF;AAAA,IAAA,CACD;AAEMmB,WAAAA;AAAAA,EAAAA,CACR;AAED,QAAMK,mBAE2C,CAAA;AACjD,MAAIC,eACFC;AAEIC,QAAAA,YAAYA,CAACxB,WAAgC;AACjD,UAAMyB,iBACJzB,OAAO;AAAA,MACLO;AAAAA,MACAV;AAAAA,MACAgB;AAAAA,MACAC;AAAAA,MACAF,SAASH;AAAAA,MACTP;AAAAA,IACD,CAAA,KAAK,CAAA;AAER,QAAIuB,eAAeC,cAAc;AACdC,uBAAAA,KAAKF,eAAeC,YAAY;AAAA,IACnD;AAEA,QAAID,eAAeH,cAAc;AAC/BA,qBAAeG,eAAeH;AAAAA,IAChC;AAAA,EAAA;AAGF3B,UAAQsB,QAAQO,SAAS;AAEzB,QAAME,eAAe,CACnBE,gBAAwB,OACrB;AACH,UAAMC,YAAsC;AAAA,MAC1CC,MAAM;AAAA,MACNC,UAAU;AAAA,MACV,GAAGH;AAAAA,MACHI,KAAKtB;AAAAA,IAAAA;AAGPW,qBAAiBJ,QAASgB,CAAoB,oBAAA;AAC5Cd,aAAOC,OAAOS,WAAWI,gBAAgBL,aAAa,CAAC;AAAA,IAAA,CACxD;AAEMC,WAAAA;AAAAA,EAAAA;AAGF,SAAA;AAAA,IAAEH;AAAAA,IAAcd,SAASF;AAAAA,IAAeY;AAAAA,EAAAA;AACjD;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { EventManager } from "../utils/EventManager.js";
|
|
3
|
+
import { populateInstance } from "./utils.js";
|
|
4
|
+
const isSyntheticEvent = (event) => {
|
|
5
|
+
return event.isPropagationStopped !== void 0;
|
|
6
|
+
};
|
|
7
|
+
const useTreeViewInstanceEvents = ({
|
|
8
|
+
instance
|
|
9
|
+
}) => {
|
|
10
|
+
const [eventManager] = React.useState(() => new EventManager());
|
|
11
|
+
const publishEvent = React.useCallback((...args) => {
|
|
12
|
+
const [name, params, event = {}] = args;
|
|
13
|
+
event.defaultMuiPrevented = false;
|
|
14
|
+
if (isSyntheticEvent(event) && event.isPropagationStopped()) {
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
eventManager.emit(name, params, event);
|
|
18
|
+
}, [eventManager]);
|
|
19
|
+
const subscribeEvent = React.useCallback((event, handler) => {
|
|
20
|
+
eventManager.on(event, handler);
|
|
21
|
+
return () => {
|
|
22
|
+
eventManager.removeListener(event, handler);
|
|
23
|
+
};
|
|
24
|
+
}, [eventManager]);
|
|
25
|
+
populateInstance(instance, {
|
|
26
|
+
$$publishEvent: publishEvent,
|
|
27
|
+
$$subscribeEvent: subscribeEvent
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
export {
|
|
31
|
+
useTreeViewInstanceEvents
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=useTreeViewInstanceEvents.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeViewInstanceEvents.js","sources":["../../../../../../src/components/TreeView/internals/hooks/useTreeViewInstanceEvents.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport { EventManager } from \"../utils/EventManager\";\nimport type { TreeViewPlugin } from \"../types\";\nimport type { TreeViewEventListener } from \"../types/events\";\nimport { UseTreeViewInstanceEventsSignature } from \"./useTreeViewInstanceEvents.types\";\nimport { populateInstance } from \"./utils\";\n\nconst isSyntheticEvent = (event: any): event is React.SyntheticEvent => {\n return event.isPropagationStopped !== undefined;\n};\n\n/**\n * Plugin responsible for the registration of the nodes defined as JSX children of the TreeView.\n * When we will have both a SimpleTreeView using JSX children and a TreeView using a data prop,\n * this plugin will only be used by SimpleTreeView.\n */\nexport const useTreeViewInstanceEvents: TreeViewPlugin<\n UseTreeViewInstanceEventsSignature\n> = ({ instance }) => {\n const [eventManager] = React.useState(() => new EventManager());\n\n const publishEvent = React.useCallback(\n (...args: any[]) => {\n const [name, params, event = {}] = args;\n event.defaultMuiPrevented = false;\n\n if (isSyntheticEvent(event) && event.isPropagationStopped()) {\n return;\n }\n\n eventManager.emit(name, params, event);\n },\n [eventManager]\n );\n\n const subscribeEvent = React.useCallback(\n (event: string, handler: TreeViewEventListener<any>) => {\n eventManager.on(event, handler);\n return () => {\n eventManager.removeListener(event, handler);\n };\n },\n [eventManager]\n );\n\n populateInstance<UseTreeViewInstanceEventsSignature>(instance, {\n $$publishEvent: publishEvent,\n $$subscribeEvent: subscribeEvent,\n });\n};\n"],"names":["isSyntheticEvent","event","isPropagationStopped","undefined","useTreeViewInstanceEvents","instance","eventManager","React","useState","EventManager","publishEvent","useCallback","args","name","params","defaultMuiPrevented","emit","subscribeEvent","handler","on","removeListener","populateInstance","$$publishEvent","$$subscribeEvent"],"mappings":";;;AAQA,MAAMA,mBAAmBA,CAACC,UAA8C;AACtE,SAAOA,MAAMC,yBAAyBC;AACxC;AAOO,MAAMC,4BAETA,CAAC;AAAA,EAAEC;AAAS,MAAM;AACd,QAAA,CAACC,YAAY,IAAIC,MAAMC,SAAS,MAAM,IAAIC,cAAc;AAE9D,QAAMC,eAAeH,MAAMI,YACzB,IAAIC,SAAgB;AAClB,UAAM,CAACC,MAAMC,QAAQb,QAAQ,CAAE,CAAA,IAAIW;AACnCX,UAAMc,sBAAsB;AAE5B,QAAIf,iBAAiBC,KAAK,KAAKA,MAAMC,wBAAwB;AAC3D;AAAA,IACF;AAEac,iBAAAA,KAAKH,MAAMC,QAAQb,KAAK;AAAA,EAAA,GAEvC,CAACK,YAAY,CACf;AAEA,QAAMW,iBAAiBV,MAAMI,YAC3B,CAACV,OAAeiB,YAAwC;AACzCC,iBAAAA,GAAGlB,OAAOiB,OAAO;AAC9B,WAAO,MAAM;AACEE,mBAAAA,eAAenB,OAAOiB,OAAO;AAAA,IAAA;AAAA,EAC5C,GAEF,CAACZ,YAAY,CACf;AAEAe,mBAAqDhB,UAAU;AAAA,IAC7DiB,gBAAgBZ;AAAAA,IAChBa,kBAAkBN;AAAAA,EAAAA,CACnB;AACH;"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
const useTreeViewModels = (plugins, props) => {
|
|
3
|
+
const modelsRef = React.useRef({});
|
|
4
|
+
const [modelsState, setModelsState] = React.useState(() => {
|
|
5
|
+
const initialState = {};
|
|
6
|
+
plugins.forEach((plugin) => {
|
|
7
|
+
if (plugin.models) {
|
|
8
|
+
Object.entries(plugin.models).forEach(([modelName, model]) => {
|
|
9
|
+
modelsRef.current[modelName] = {
|
|
10
|
+
controlledProp: model.controlledProp,
|
|
11
|
+
defaultProp: model.defaultProp,
|
|
12
|
+
isControlled: props[model.controlledProp] !== void 0
|
|
13
|
+
};
|
|
14
|
+
initialState[modelName] = props[model.defaultProp];
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return initialState;
|
|
19
|
+
});
|
|
20
|
+
const models = Object.fromEntries(Object.entries(modelsRef.current).map(([modelName, model]) => {
|
|
21
|
+
const value = model.isControlled ? props[model.controlledProp] : modelsState[modelName];
|
|
22
|
+
return [modelName, {
|
|
23
|
+
value,
|
|
24
|
+
setValue: (newValue) => {
|
|
25
|
+
if (!model.isControlled) {
|
|
26
|
+
setModelsState((prevState) => ({
|
|
27
|
+
...prevState,
|
|
28
|
+
[modelName]: newValue
|
|
29
|
+
}));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}];
|
|
33
|
+
}));
|
|
34
|
+
return models;
|
|
35
|
+
};
|
|
36
|
+
export {
|
|
37
|
+
useTreeViewModels
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=useTreeViewModels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useTreeViewModels.js","sources":["../../../../../../src/components/TreeView/internals/hooks/useTreeViewModels.ts"],"sourcesContent":["import * as React from \"react\";\n\nimport {\n TreeViewAnyPluginSignature,\n TreeViewPlugin,\n ConvertPluginsIntoSignatures,\n MergePluginsProperty,\n} from \"../types\";\n\n/**\n * Implements the same behavior as `useControlled` but for several models.\n * The controlled models are never stored in the state and the state is only updated if the model is not controlled.\n */\nexport const useTreeViewModels = <\n TPlugins extends readonly TreeViewPlugin<TreeViewAnyPluginSignature>[]\n>(\n plugins: TPlugins,\n props: MergePluginsProperty<\n ConvertPluginsIntoSignatures<TPlugins>,\n \"defaultizedParams\"\n >\n) => {\n const modelsRef = React.useRef<{\n [modelName: string]: {\n controlledProp: keyof typeof props;\n defaultProp: keyof typeof props;\n isControlled: boolean;\n };\n }>({});\n\n const [modelsState, setModelsState] = React.useState<{\n [modelName: string]: any;\n }>(() => {\n const initialState: { [modelName: string]: any } = {};\n\n plugins.forEach((plugin) => {\n if (plugin.models) {\n Object.entries(plugin.models).forEach(([modelName, model]) => {\n modelsRef.current[modelName] = {\n controlledProp: model.controlledProp as keyof typeof props,\n defaultProp: model.defaultProp as keyof typeof props,\n isControlled:\n props[model.controlledProp as keyof typeof props] !== undefined,\n };\n initialState[modelName] =\n props[model.defaultProp as keyof typeof props];\n });\n }\n });\n\n return initialState;\n });\n\n const models = Object.fromEntries(\n Object.entries(modelsRef.current).map(([modelName, model]) => {\n const value = model.isControlled\n ? props[model.controlledProp]\n : modelsState[modelName];\n\n return [\n modelName,\n {\n value,\n setValue: (newValue: any) => {\n if (!model.isControlled) {\n setModelsState((prevState) => ({\n ...prevState,\n [modelName]: newValue,\n }));\n }\n },\n },\n ];\n })\n ) as MergePluginsProperty<ConvertPluginsIntoSignatures<TPlugins>, \"models\">;\n\n return models;\n};\n"],"names":["useTreeViewModels","plugins","props","modelsRef","React","useRef","modelsState","setModelsState","useState","initialState","forEach","plugin","models","entries","modelName","model","current","controlledProp","defaultProp","isControlled","undefined","Object","fromEntries","map","value","setValue","newValue","prevState"],"mappings":";AAaaA,MAAAA,oBAAoB,CAG/BC,SACAC,UAIG;AACH,QAAMC,YAAYC,MAAMC,OAMrB,CAAE,CAAA;AAEL,QAAM,CAACC,aAAaC,cAAc,IAAIH,MAAMI,SAEzC,MAAM;AACP,UAAMC,eAA6C,CAAA;AAEnDR,YAAQS,QAASC,CAAW,WAAA;AAC1B,UAAIA,OAAOC,QAAQ;AACVC,eAAAA,QAAQF,OAAOC,MAAM,EAAEF,QAAQ,CAAC,CAACI,WAAWC,KAAK,MAAM;AAClDC,oBAAAA,QAAQF,SAAS,IAAI;AAAA,YAC7BG,gBAAgBF,MAAME;AAAAA,YACtBC,aAAaH,MAAMG;AAAAA,YACnBC,cACEjB,MAAMa,MAAME,cAAoC,MAAMG;AAAAA,UAAAA;AAE1DX,uBAAaK,SAAS,IACpBZ,MAAMa,MAAMG,WAAkC;AAAA,QAAA,CACjD;AAAA,MACH;AAAA,IAAA,CACD;AAEMT,WAAAA;AAAAA,EAAAA,CACR;AAED,QAAMG,SAASS,OAAOC,YACpBD,OAAOR,QAAQV,UAAUa,OAAO,EAAEO,IAAI,CAAC,CAACT,WAAWC,KAAK,MAAM;AACtDS,UAAAA,QAAQT,MAAMI,eAChBjB,MAAMa,MAAME,cAAc,IAC1BX,YAAYQ,SAAS;AAEzB,WAAO,CACLA,WACA;AAAA,MACEU;AAAAA,MACAC,UAAUA,CAACC,aAAkB;AACvB,YAAA,CAACX,MAAMI,cAAc;AACvBZ,yBAAgBoB,CAAe,eAAA;AAAA,YAC7B,GAAGA;AAAAA,YACH,CAACb,SAAS,GAAGY;AAAAA,UACb,EAAA;AAAA,QACJ;AAAA,MACF;AAAA,IAAA,CACD;AAAA,EAEJ,CAAA,CACH;AAEOd,SAAAA;AACT;"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
const getPreviousNode = (instance, nodeId) => {
|
|
2
|
+
const node = instance.getNode(nodeId);
|
|
3
|
+
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
4
|
+
const nodeIndex = siblings.indexOf(nodeId);
|
|
5
|
+
if (nodeIndex === 0) {
|
|
6
|
+
return node.parentId;
|
|
7
|
+
}
|
|
8
|
+
let currentNode = siblings[nodeIndex - 1];
|
|
9
|
+
while (instance.isNodeExpanded(currentNode) && instance.getNavigableChildrenIds(currentNode).length > 0) {
|
|
10
|
+
currentNode = instance.getNavigableChildrenIds(currentNode).pop();
|
|
11
|
+
}
|
|
12
|
+
return currentNode;
|
|
13
|
+
};
|
|
14
|
+
const getNextNode = (instance, nodeId) => {
|
|
15
|
+
if (instance.isNodeExpanded(nodeId) && instance.getNavigableChildrenIds(nodeId).length > 0) {
|
|
16
|
+
return instance.getNavigableChildrenIds(nodeId)[0];
|
|
17
|
+
}
|
|
18
|
+
let node = instance.getNode(nodeId);
|
|
19
|
+
while (node != null) {
|
|
20
|
+
const siblings = instance.getNavigableChildrenIds(node.parentId);
|
|
21
|
+
const nextSibling = siblings[siblings.indexOf(node.id) + 1];
|
|
22
|
+
if (nextSibling) {
|
|
23
|
+
return nextSibling;
|
|
24
|
+
}
|
|
25
|
+
node = instance.getNode(node.parentId);
|
|
26
|
+
}
|
|
27
|
+
return null;
|
|
28
|
+
};
|
|
29
|
+
const getLastNode = (instance) => {
|
|
30
|
+
let lastNode = instance.getNavigableChildrenIds(null).pop();
|
|
31
|
+
while (instance.isNodeExpanded(lastNode)) {
|
|
32
|
+
lastNode = instance.getNavigableChildrenIds(lastNode).pop();
|
|
33
|
+
}
|
|
34
|
+
return lastNode;
|
|
35
|
+
};
|
|
36
|
+
const getFirstNode = (instance) => instance.getNavigableChildrenIds(null)[0];
|
|
37
|
+
const populateInstance = (instance, methods) => {
|
|
38
|
+
Object.assign(instance, methods);
|
|
39
|
+
};
|
|
40
|
+
export {
|
|
41
|
+
getFirstNode,
|
|
42
|
+
getLastNode,
|
|
43
|
+
getNextNode,
|
|
44
|
+
getPreviousNode,
|
|
45
|
+
populateInstance
|
|
46
|
+
};
|
|
47
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../../../../src/components/TreeView/internals/hooks/utils.ts"],"sourcesContent":["import {\n TreeViewAnyPluginSignature,\n TreeViewInstance,\n TreeViewUsedInstance,\n} from \"../types\";\nimport type { UseTreeViewExpansionSignature } from \"./plugins/useTreeViewExpansion\";\nimport type { UseTreeViewNodesSignature } from \"./plugins/useTreeViewNodes\";\n\nexport const getPreviousNode = (\n instance: TreeViewInstance<\n [UseTreeViewNodesSignature, UseTreeViewExpansionSignature]\n >,\n nodeId: string\n) => {\n const node = instance.getNode(nodeId);\n const siblings = instance.getNavigableChildrenIds(node.parentId);\n const nodeIndex = siblings.indexOf(nodeId);\n\n if (nodeIndex === 0) {\n return node.parentId;\n }\n\n let currentNode: string = siblings[nodeIndex - 1];\n while (\n instance.isNodeExpanded(currentNode) &&\n instance.getNavigableChildrenIds(currentNode).length > 0\n ) {\n currentNode = instance.getNavigableChildrenIds(currentNode).pop()!;\n }\n\n return currentNode;\n};\n\nexport const getNextNode = (\n instance: TreeViewInstance<\n [UseTreeViewExpansionSignature, UseTreeViewNodesSignature]\n >,\n nodeId: string\n) => {\n // If expanded get first child\n if (\n instance.isNodeExpanded(nodeId) &&\n instance.getNavigableChildrenIds(nodeId).length > 0\n ) {\n return instance.getNavigableChildrenIds(nodeId)[0];\n }\n\n let node = instance.getNode(nodeId);\n while (node != null) {\n // Try to get next sibling\n const siblings = instance.getNavigableChildrenIds(node.parentId);\n const nextSibling = siblings[siblings.indexOf(node.id) + 1];\n\n if (nextSibling) {\n return nextSibling;\n }\n\n // If the sibling does not exist, go up a level to the parent and try again.\n node = instance.getNode(node.parentId!);\n }\n\n return null;\n};\n\nexport const getLastNode = (\n instance: TreeViewInstance<\n [UseTreeViewExpansionSignature, UseTreeViewNodesSignature]\n >\n) => {\n let lastNode = instance.getNavigableChildrenIds(null).pop()!;\n\n while (instance.isNodeExpanded(lastNode)) {\n lastNode = instance.getNavigableChildrenIds(lastNode).pop()!;\n }\n return lastNode;\n};\n\nexport const getFirstNode = (\n instance: TreeViewInstance<[UseTreeViewNodesSignature]>\n) => instance.getNavigableChildrenIds(null)[0];\n\nexport const populateInstance = <T extends TreeViewAnyPluginSignature>(\n instance: TreeViewUsedInstance<T>,\n methods: T[\"instance\"]\n) => {\n Object.assign(instance, methods);\n};\n"],"names":["getPreviousNode","instance","nodeId","node","getNode","siblings","getNavigableChildrenIds","parentId","nodeIndex","indexOf","currentNode","isNodeExpanded","length","pop","getNextNode","nextSibling","id","getLastNode","lastNode","getFirstNode","populateInstance","methods","assign"],"mappings":"AAQaA,MAAAA,kBAAkBA,CAC7BC,UAGAC,WACG;AACGC,QAAAA,OAAOF,SAASG,QAAQF,MAAM;AACpC,QAAMG,WAAWJ,SAASK,wBAAwBH,KAAKI,QAAQ;AACzDC,QAAAA,YAAYH,SAASI,QAAQP,MAAM;AAEzC,MAAIM,cAAc,GAAG;AACnB,WAAOL,KAAKI;AAAAA,EACd;AAEIG,MAAAA,cAAsBL,SAASG,YAAY,CAAC;AAE9CP,SAAAA,SAASU,eAAeD,WAAW,KACnCT,SAASK,wBAAwBI,WAAW,EAAEE,SAAS,GACvD;AACAF,kBAAcT,SAASK,wBAAwBI,WAAW,EAAEG,IAAI;AAAA,EAClE;AAEOH,SAAAA;AACT;AAEaI,MAAAA,cAAcA,CACzBb,UAGAC,WACG;AAGDD,MAAAA,SAASU,eAAeT,MAAM,KAC9BD,SAASK,wBAAwBJ,MAAM,EAAEU,SAAS,GAClD;AACA,WAAOX,SAASK,wBAAwBJ,MAAM,EAAE,CAAC;AAAA,EACnD;AAEIC,MAAAA,OAAOF,SAASG,QAAQF,MAAM;AAClC,SAAOC,QAAQ,MAAM;AAEnB,UAAME,WAAWJ,SAASK,wBAAwBH,KAAKI,QAAQ;AAC/D,UAAMQ,cAAcV,SAASA,SAASI,QAAQN,KAAKa,EAAE,IAAI,CAAC;AAE1D,QAAID,aAAa;AACRA,aAAAA;AAAAA,IACT;AAGOd,WAAAA,SAASG,QAAQD,KAAKI,QAAS;AAAA,EACxC;AAEO,SAAA;AACT;AAEaU,MAAAA,cAAcA,CACzBhB,aAGG;AACH,MAAIiB,WAAWjB,SAASK,wBAAwB,IAAI,EAAEO,IAAI;AAEnDZ,SAAAA,SAASU,eAAeO,QAAQ,GAAG;AACxCA,eAAWjB,SAASK,wBAAwBY,QAAQ,EAAEL,IAAI;AAAA,EAC5D;AACOK,SAAAA;AACT;AAEO,MAAMC,eAAeA,CAC1BlB,aACGA,SAASK,wBAAwB,IAAI,EAAE,CAAC;AAEhCc,MAAAA,mBAAmB,CAC9BnB,UACAoB,YACG;AACIC,SAAAA,OAAOrB,UAAUoB,OAAO;AACjC;"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
class EventManager {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.maxListeners = 20;
|
|
4
|
+
this.warnOnce = false;
|
|
5
|
+
this.events = {};
|
|
6
|
+
}
|
|
7
|
+
on(eventName, listener, options = {}) {
|
|
8
|
+
let collection = this.events[eventName];
|
|
9
|
+
if (!collection) {
|
|
10
|
+
collection = {
|
|
11
|
+
highPriority: /* @__PURE__ */ new Map(),
|
|
12
|
+
regular: /* @__PURE__ */ new Map()
|
|
13
|
+
};
|
|
14
|
+
this.events[eventName] = collection;
|
|
15
|
+
}
|
|
16
|
+
if (options.isFirst) {
|
|
17
|
+
collection.highPriority.set(listener, true);
|
|
18
|
+
} else {
|
|
19
|
+
collection.regular.set(listener, true);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
removeListener(eventName, listener) {
|
|
23
|
+
if (this.events[eventName]) {
|
|
24
|
+
this.events[eventName].regular.delete(listener);
|
|
25
|
+
this.events[eventName].highPriority.delete(listener);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
removeAllListeners() {
|
|
29
|
+
this.events = {};
|
|
30
|
+
}
|
|
31
|
+
emit(eventName, ...args) {
|
|
32
|
+
const collection = this.events[eventName];
|
|
33
|
+
if (!collection) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
const highPriorityListeners = Array.from(collection.highPriority.keys());
|
|
37
|
+
const regularListeners = Array.from(collection.regular.keys());
|
|
38
|
+
for (let i = highPriorityListeners.length - 1; i >= 0; i -= 1) {
|
|
39
|
+
const listener = highPriorityListeners[i];
|
|
40
|
+
if (collection.highPriority.has(listener)) {
|
|
41
|
+
listener.apply(this, args);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
for (let i = 0; i < regularListeners.length; i += 1) {
|
|
45
|
+
const listener = regularListeners[i];
|
|
46
|
+
if (collection.regular.has(listener)) {
|
|
47
|
+
listener.apply(this, args);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
once(eventName, listener) {
|
|
52
|
+
const that = this;
|
|
53
|
+
this.on(eventName, function oneTimeListener(...args) {
|
|
54
|
+
that.removeListener(eventName, oneTimeListener);
|
|
55
|
+
listener.apply(that, args);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
export {
|
|
60
|
+
EventManager
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=EventManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EventManager.js","sources":["../../../../../../src/components/TreeView/internals/utils/EventManager.ts"],"sourcesContent":["export type EventListener = (...args: any[]) => void;\n\nexport interface EventListenerOptions {\n isFirst?: boolean;\n}\n\ninterface EventListenerCollection {\n /**\n * List of listeners to run before the others\n * They are run in the opposite order of the registration order\n */\n highPriority: Map<EventListener, true>;\n /**\n * List of events to run after the high priority listeners\n * They are run in the registration order\n */\n regular: Map<EventListener, true>;\n}\n\n// Used https://gist.github.com/mudge/5830382 as a starting point.\n// See https://github.com/browserify/events/blob/master/events.js for\n// the Node.js (https://nodejs.org/api/events.html) polyfill used by webpack.\nexport class EventManager {\n maxListeners = 20;\n\n warnOnce = false;\n\n events: { [eventName: string]: EventListenerCollection } = {};\n\n on(\n eventName: string,\n listener: EventListener,\n options: EventListenerOptions = {}\n ): void {\n let collection = this.events[eventName];\n\n if (!collection) {\n collection = {\n highPriority: new Map(),\n regular: new Map(),\n };\n this.events[eventName] = collection;\n }\n\n if (options.isFirst) {\n collection.highPriority.set(listener, true);\n } else {\n collection.regular.set(listener, true);\n }\n }\n\n removeListener(eventName: string, listener: EventListener): void {\n if (this.events[eventName]) {\n this.events[eventName].regular.delete(listener);\n this.events[eventName].highPriority.delete(listener);\n }\n }\n\n removeAllListeners(): void {\n this.events = {};\n }\n\n emit(eventName: string, ...args: any[]): void {\n const collection = this.events[eventName];\n if (!collection) {\n return;\n }\n\n const highPriorityListeners = Array.from(collection.highPriority.keys());\n const regularListeners = Array.from(collection.regular.keys());\n\n for (let i = highPriorityListeners.length - 1; i >= 0; i -= 1) {\n const listener = highPriorityListeners[i];\n if (collection.highPriority.has(listener)) {\n listener.apply(this, args);\n }\n }\n\n for (let i = 0; i < regularListeners.length; i += 1) {\n const listener = regularListeners[i];\n if (collection.regular.has(listener)) {\n listener.apply(this, args);\n }\n }\n }\n\n once(eventName: string, listener: EventListener): void {\n // eslint-disable-next-line consistent-this\n const that = this;\n this.on(eventName, function oneTimeListener(...args) {\n that.removeListener(eventName, oneTimeListener);\n listener.apply(that, args);\n });\n }\n}\n"],"names":["EventManager","events","on","eventName","listener","options","collection","highPriority","Map","regular","isFirst","set","removeListener","delete","removeAllListeners","emit","args","highPriorityListeners","Array","from","keys","regularListeners","i","length","has","apply","once","that","oneTimeListener"],"mappings":"AAsBO,MAAMA,aAAa;AAAA,EAAnB,cAAA;AACU,SAAA,eAAA;AAEJ,SAAA,WAAA;AAEXC,SAAAA,SAA2D;EAAC;AAAA,EAE5DC,GACEC,WACAC,UACAC,UAAgC,CAAA,GAC1B;AACFC,QAAAA,aAAa,KAAKL,OAAOE,SAAS;AAEtC,QAAI,CAACG,YAAY;AACF,mBAAA;AAAA,QACXC,kCAAkBC,IAAI;AAAA,QACtBC,6BAAaD,IAAI;AAAA,MAAA;AAEdP,WAAAA,OAAOE,SAAS,IAAIG;AAAAA,IAC3B;AAEA,QAAID,QAAQK,SAAS;AACRH,iBAAAA,aAAaI,IAAIP,UAAU,IAAI;AAAA,IAAA,OACrC;AACMK,iBAAAA,QAAQE,IAAIP,UAAU,IAAI;AAAA,IACvC;AAAA,EACF;AAAA,EAEAQ,eAAeT,WAAmBC,UAA+B;AAC3D,QAAA,KAAKH,OAAOE,SAAS,GAAG;AAC1B,WAAKF,OAAOE,SAAS,EAAEM,QAAQI,OAAOT,QAAQ;AAC9C,WAAKH,OAAOE,SAAS,EAAEI,aAAaM,OAAOT,QAAQ;AAAA,IACrD;AAAA,EACF;AAAA,EAEAU,qBAA2B;AACzB,SAAKb,SAAS;EAChB;AAAA,EAEAc,KAAKZ,cAAsBa,MAAmB;AACtCV,UAAAA,aAAa,KAAKL,OAAOE,SAAS;AACxC,QAAI,CAACG,YAAY;AACf;AAAA,IACF;AAEA,UAAMW,wBAAwBC,MAAMC,KAAKb,WAAWC,aAAaa,MAAM;AACvE,UAAMC,mBAAmBH,MAAMC,KAAKb,WAAWG,QAAQW,MAAM;AAE7D,aAASE,IAAIL,sBAAsBM,SAAS,GAAGD,KAAK,GAAGA,KAAK,GAAG;AACvDlB,YAAAA,WAAWa,sBAAsBK,CAAC;AACxC,UAAIhB,WAAWC,aAAaiB,IAAIpB,QAAQ,GAAG;AAChCqB,iBAAAA,MAAM,MAAMT,IAAI;AAAA,MAC3B;AAAA,IACF;AAEA,aAASM,IAAI,GAAGA,IAAID,iBAAiBE,QAAQD,KAAK,GAAG;AAC7ClB,YAAAA,WAAWiB,iBAAiBC,CAAC;AACnC,UAAIhB,WAAWG,QAAQe,IAAIpB,QAAQ,GAAG;AAC3BqB,iBAAAA,MAAM,MAAMT,IAAI;AAAA,MAC3B;AAAA,IACF;AAAA,EACF;AAAA,EAEAU,KAAKvB,WAAmBC,UAA+B;AAErD,UAAMuB,OAAO;AACb,SAAKzB,GAAGC,WAAW,SAASyB,mBAAmBZ,MAAM;AAC9CJ,WAAAA,eAAeT,WAAWyB,eAAe;AACrCH,eAAAA,MAAME,MAAMX,IAAI;AAAA,IAAA,CAC1B;AAAA,EACH;AACF;"}
|
package/dist/esm/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
class FinalizationRegistryBasedCleanupTracking {
|
|
2
|
+
constructor() {
|
|
3
|
+
this.registry = new FinalizationRegistry((unsubscribe) => {
|
|
4
|
+
if (typeof unsubscribe === "function") {
|
|
5
|
+
unsubscribe();
|
|
6
|
+
}
|
|
7
|
+
});
|
|
8
|
+
}
|
|
9
|
+
register(object, unsubscribe, unregisterToken) {
|
|
10
|
+
this.registry.register(object, unsubscribe, unregisterToken);
|
|
11
|
+
}
|
|
12
|
+
unregister(unregisterToken) {
|
|
13
|
+
this.registry.unregister(unregisterToken);
|
|
14
|
+
}
|
|
15
|
+
// eslint-disable-next-line class-methods-use-this
|
|
16
|
+
reset() {
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export {
|
|
20
|
+
FinalizationRegistryBasedCleanupTracking
|
|
21
|
+
};
|
|
22
|
+
//# sourceMappingURL=FinalizationRegistryBasedCleanupTracking.js.map
|
package/dist/esm/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FinalizationRegistryBasedCleanupTracking.js","sources":["../../../../../../src/components/TreeView/internals/utils/FinalizationRegistryBasedCleanupTracking.ts"],"sourcesContent":["import {\n CleanupTracking,\n UnsubscribeFn,\n UnregisterToken,\n} from \"./CleanupTracking\";\n\nexport class FinalizationRegistryBasedCleanupTracking\n implements CleanupTracking\n{\n registry = new FinalizationRegistry<UnsubscribeFn>((unsubscribe) => {\n if (typeof unsubscribe === \"function\") {\n unsubscribe();\n }\n });\n\n register(\n object: any,\n unsubscribe: UnsubscribeFn,\n unregisterToken: UnregisterToken\n ): void {\n this.registry.register(object, unsubscribe, unregisterToken);\n }\n\n unregister(unregisterToken: UnregisterToken): void {\n this.registry.unregister(unregisterToken);\n }\n\n // eslint-disable-next-line class-methods-use-this\n reset() {}\n}\n"],"names":["FinalizationRegistryBasedCleanupTracking","FinalizationRegistry","unsubscribe","register","object","unregisterToken","registry","unregister","reset"],"mappings":"AAMO,MAAMA,yCAEb;AAAA,EAFO,cAAA;AAGM,SAAA,WAAA,IAAIC,qBAAqCC,CAAgB,gBAAA;AAC9D,UAAA,OAAOA,gBAAgB,YAAY;AACzB;MACd;AAAA,IAAA,CACD;AAAA,EAAA;AAAA,EAEDC,SACEC,QACAF,aACAG,iBACM;AACN,SAAKC,SAASH,SAASC,QAAQF,aAAaG,eAAe;AAAA,EAC7D;AAAA,EAEAE,WAAWF,iBAAwC;AAC5CC,SAAAA,SAASC,WAAWF,eAAe;AAAA,EAC1C;AAAA;AAAA,EAGAG,QAAQ;AAAA,EAAC;AACX;"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
const CLEANUP_TIMER_LOOP_MILLIS = 1e3;
|
|
2
|
+
class TimerBasedCleanupTracking {
|
|
3
|
+
constructor(timeout = CLEANUP_TIMER_LOOP_MILLIS) {
|
|
4
|
+
this.timeouts = /* @__PURE__ */ new Map();
|
|
5
|
+
this.cleanupTimeout = CLEANUP_TIMER_LOOP_MILLIS;
|
|
6
|
+
this.cleanupTimeout = timeout;
|
|
7
|
+
}
|
|
8
|
+
register(object, unsubscribe, unregisterToken) {
|
|
9
|
+
if (!this.timeouts) {
|
|
10
|
+
this.timeouts = /* @__PURE__ */ new Map();
|
|
11
|
+
}
|
|
12
|
+
const timeout = setTimeout(() => {
|
|
13
|
+
if (typeof unsubscribe === "function") {
|
|
14
|
+
unsubscribe();
|
|
15
|
+
}
|
|
16
|
+
this.timeouts.delete(unregisterToken.cleanupToken);
|
|
17
|
+
}, this.cleanupTimeout);
|
|
18
|
+
this.timeouts.set(unregisterToken.cleanupToken, timeout);
|
|
19
|
+
}
|
|
20
|
+
unregister(unregisterToken) {
|
|
21
|
+
const timeout = this.timeouts.get(unregisterToken.cleanupToken);
|
|
22
|
+
if (timeout) {
|
|
23
|
+
this.timeouts.delete(unregisterToken.cleanupToken);
|
|
24
|
+
clearTimeout(timeout);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
reset() {
|
|
28
|
+
if (this.timeouts) {
|
|
29
|
+
this.timeouts.forEach((value, key) => {
|
|
30
|
+
this.unregister({
|
|
31
|
+
cleanupToken: key
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
this.timeouts = void 0;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export {
|
|
39
|
+
TimerBasedCleanupTracking
|
|
40
|
+
};
|
|
41
|
+
//# sourceMappingURL=TimerBasedCleanupTracking.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TimerBasedCleanupTracking.js","sources":["../../../../../../src/components/TreeView/internals/utils/TimerBasedCleanupTracking.ts"],"sourcesContent":["import {\n CleanupTracking,\n UnregisterToken,\n UnsubscribeFn,\n} from \"./CleanupTracking\";\n\n// If no effect ran after this amount of time, we assume that the render was not committed by React\nconst CLEANUP_TIMER_LOOP_MILLIS = 1000;\n\nexport class TimerBasedCleanupTracking implements CleanupTracking {\n timeouts? = new Map<number, NodeJS.Timeout>();\n\n cleanupTimeout = CLEANUP_TIMER_LOOP_MILLIS;\n\n constructor(timeout = CLEANUP_TIMER_LOOP_MILLIS) {\n this.cleanupTimeout = timeout;\n }\n\n register(\n object: any,\n unsubscribe: UnsubscribeFn,\n unregisterToken: UnregisterToken\n ): void {\n if (!this.timeouts) {\n this.timeouts = new Map<number, NodeJS.Timeout>();\n }\n\n const timeout = setTimeout(() => {\n if (typeof unsubscribe === \"function\") {\n unsubscribe();\n }\n this.timeouts!.delete(unregisterToken.cleanupToken);\n }, this.cleanupTimeout);\n\n this.timeouts!.set(unregisterToken!.cleanupToken, timeout);\n }\n\n unregister(unregisterToken: UnregisterToken): void {\n const timeout = this.timeouts!.get(unregisterToken.cleanupToken);\n if (timeout) {\n this.timeouts!.delete(unregisterToken.cleanupToken);\n clearTimeout(timeout);\n }\n }\n\n reset() {\n if (this.timeouts) {\n this.timeouts.forEach((value, key) => {\n this.unregister({ cleanupToken: key });\n });\n this.timeouts = undefined;\n }\n }\n}\n"],"names":["CLEANUP_TIMER_LOOP_MILLIS","TimerBasedCleanupTracking","constructor","timeout","timeouts","Map","cleanupTimeout","register","object","unsubscribe","unregisterToken","setTimeout","delete","cleanupToken","set","unregister","get","clearTimeout","reset","forEach","value","key","undefined"],"mappings":"AAOA,MAAMA,4BAA4B;AAE3B,MAAMC,0BAAqD;AAAA,EAKhEC,YAAYC,UAAUH,2BAA2B;AAJjDI,SAAAA,+BAAgBC;AAECL,SAAAA,iBAAAA;AAGf,SAAKM,iBAAiBH;AAAAA,EACxB;AAAA,EAEAI,SACEC,QACAC,aACAC,iBACM;AACF,QAAA,CAAC,KAAKN,UAAU;AACbA,WAAAA,+BAAeC;IACtB;AAEMF,UAAAA,UAAUQ,WAAW,MAAM;AAC3B,UAAA,OAAOF,gBAAgB,YAAY;AACzB;MACd;AACKL,WAAAA,SAAUQ,OAAOF,gBAAgBG,YAAY;AAAA,IAAA,GACjD,KAAKP,cAAc;AAEtB,SAAKF,SAAUU,IAAIJ,gBAAiBG,cAAcV,OAAO;AAAA,EAC3D;AAAA,EAEAY,WAAWL,iBAAwC;AACjD,UAAMP,UAAU,KAAKC,SAAUY,IAAIN,gBAAgBG,YAAY;AAC/D,QAAIV,SAAS;AACNC,WAAAA,SAAUQ,OAAOF,gBAAgBG,YAAY;AAClDI,mBAAad,OAAO;AAAA,IACtB;AAAA,EACF;AAAA,EAEAe,QAAQ;AACN,QAAI,KAAKd,UAAU;AACjB,WAAKA,SAASe,QAAQ,CAACC,OAAOC,QAAQ;AACpC,aAAKN,WAAW;AAAA,UAAEF,cAAcQ;AAAAA,QAAAA,CAAK;AAAA,MAAA,CACtC;AACD,WAAKjB,WAAWkB;AAAAA,IAClB;AAAA,EACF;AACF;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"publishTreeViewEvent.js","sources":["../../../../../../src/components/TreeView/internals/utils/publishTreeViewEvent.ts"],"sourcesContent":["import type { UseTreeViewInstanceEventsInstance } from \"../hooks/useTreeViewInstanceEvents.types\";\nimport type { TreeViewAnyPluginSignature, TreeViewUsedEvents } from \"../types\";\n\nexport const publishTreeViewEvent = <\n Instance extends UseTreeViewInstanceEventsInstance & {\n $$signature: TreeViewAnyPluginSignature;\n },\n E extends keyof TreeViewUsedEvents<Instance[\"$$signature\"]>\n>(\n instance: Instance,\n eventName: E,\n params: TreeViewUsedEvents<Instance[\"$$signature\"]>[E][\"params\"]\n) => {\n instance.$$publishEvent(eventName as string, params);\n};\n"],"names":["publishTreeViewEvent","instance","eventName","params","$$publishEvent"],"mappings":"AAGO,MAAMA,uBAAuB,CAMlCC,UACAC,WACAC,WACG;AACMC,WAAAA,eAAeF,WAAqBC,MAAM;AACrD;"}
|