@deephaven/dashboard 1.22.1 → 1.22.2-alpha-pivot-builder.0730ba6.0
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/BasePanel.js +48 -75
- package/dist/BasePanel.js.map +1 -1
- package/dist/Dashboard.js +32 -16
- package/dist/Dashboard.js.map +1 -1
- package/dist/DashboardEvents.js +10 -10
- package/dist/DashboardEvents.js.map +1 -1
- package/dist/DashboardLayout.js +42 -25
- package/dist/DashboardLayout.js.map +1 -1
- package/dist/DashboardPanelWrapper.js +19 -14
- package/dist/DashboardPanelWrapper.js.map +1 -1
- package/dist/DashboardUtils.js +6 -13
- package/dist/DashboardUtils.js.map +1 -1
- package/dist/LazyDashboard.js +13 -6
- package/dist/LazyDashboard.js.map +1 -1
- package/dist/NavigationEvent.js +20 -20
- package/dist/NavigationEvent.js.map +1 -1
- package/dist/PanelContextMenu.js +13 -24
- package/dist/PanelContextMenu.js.map +1 -1
- package/dist/PanelErrorBoundary.js +5 -10
- package/dist/PanelErrorBoundary.js.map +1 -1
- package/dist/PanelEvent.js +10 -11
- package/dist/PanelEvent.js.map +1 -1
- package/dist/PanelManager.js +10 -28
- package/dist/PanelManager.js.map +1 -1
- package/dist/PersistentStateContext.js +22 -19
- package/dist/PersistentStateContext.js.map +1 -1
- package/dist/RenameDialog.js +17 -34
- package/dist/RenameDialog.js.map +1 -1
- package/dist/layout/LayoutUtils.js +28 -37
- package/dist/layout/LayoutUtils.js.map +1 -1
- package/dist/layout/useDashboardPanel.js +16 -25
- package/dist/layout/useDashboardPanel.js.map +1 -1
- package/dist/redux/index.js +9 -1
- package/dist/redux/index.js.map +1 -1
- package/dist/useFiber.js +10 -4
- package/dist/useFiber.js.map +1 -1
- package/dist/usePersistentState.js +25 -16
- package/dist/usePersistentState.js.map +1 -1
- package/package.json +10 -10
package/dist/PanelEvent.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelEvent.js","names":["makeEventFunctions","PanelEvent","Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","REOPEN_LAST","DELETE","CLONED","CLOSED","OPEN","CLOSE","DRAGGING","DROPPED","
|
|
1
|
+
{"version":3,"file":"PanelEvent.js","names":["makeEventFunctions","PanelEvent","Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","REOPEN_LAST","DELETE","CLONED","CLOSED","OPEN","CLOSE","DRAGGING","DROPPED","_makeEventFunctions","listenForPanelOpen","listen","emitPanelOpen","emit","usePanelOpenListener","useListener","_makeEventFunctions2","listenForPanelClose","emitPanelClose","usePanelCloseListener"],"sources":["../src/PanelEvent.ts"],"sourcesContent":["import { makeEventFunctions } from '@deephaven/golden-layout';\n\nexport type WidgetDescriptor = {\n type: string;\n name?: string | null;\n id?: string | null;\n};\n\nexport type PanelOpenEventDetail<T = unknown> = {\n /**\n * Opening the widget was triggered by dragging from a list, such as the Panels dropdown.\n * The coordinates are used as the starting location for the drag, where we will show the panel until the user drops it in the dashboard.\n */\n dragEvent?: MouseEvent;\n\n /** ID of the panel to re-use. Will replace any existing panel with this ID. Otherwise a new panel is opened with a randomly generated ID. */\n panelId?: string;\n\n /** Descriptor of the widget. */\n widget: WidgetDescriptor;\n\n /**\n * Function to fetch the instance of the widget\n * @deprecated Use `useWidget` hook with the `widget` descriptor instead\n */\n fetch?: () => Promise<T>;\n};\n\n/**\n * Events emitted by panels and to control panels\n */\nexport const PanelEvent = Object.freeze({\n // Panel has received focus\n FOCUS: 'PanelEvent.FOCUS',\n\n // Panel has been mounted\n MOUNT: 'PanelEvent.MOUNT',\n\n // Panel has been unmounted\n UNMOUNT: 'PanelEvent.UNMOUNT',\n\n // The title of the panel has changed\n TITLE_CHANGED: 'PanelEvent.TITLE_CHANGED',\n\n // Panel was re-opened from a dehydrated state\n REOPEN: 'PanelEvent.REOPEN',\n\n // Reopen last closed panel\n REOPEN_LAST: 'PanelEvent.REOPEN_LAST',\n\n // Panel was deleted\n DELETE: 'PanelEvent.DELETE',\n\n // Panel was cloned/copied\n CLONED: 'PanelEvent.CLONED',\n\n // Panel was closed\n CLOSED: 'PanelEvent.CLOSED',\n\n // Event to open a new panel\n // Plugins will need to register to open based on this event.\n // Multiple plugins could open panels for the same event if desired.\n OPEN: 'PanelEvent.OPEN',\n\n // Event to close a panel that's currently open\n CLOSE: 'PanelEvent.CLOSE',\n\n // Panel is being dragged\n DRAGGING: 'PanelEvent.DRAGGING',\n\n // Panel is dropped\n DROPPED: 'PanelEvent.DROPPED',\n});\n\nexport const {\n listen: listenForPanelOpen,\n emit: emitPanelOpen,\n useListener: usePanelOpenListener,\n} = makeEventFunctions<[detail: PanelOpenEventDetail]>(PanelEvent.OPEN);\n\nexport const {\n listen: listenForPanelClose,\n emit: emitPanelClose,\n useListener: usePanelCloseListener,\n} = makeEventFunctions<[panelId: string]>(PanelEvent.CLOSE);\n\n// TODO (#2147): Add the rest of the event functions here. Need to create the correct types for all of them.\n\nexport default PanelEvent;\n"],"mappings":"AAAA,SAASA,kBAAkB,QAAQ,0BAA0B;AA4B7D;AACA;AACA;AACA,OAAO,IAAMC,UAAU,GAAGC,MAAM,CAACC,MAAM,CAAC;EACtC;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,OAAO,EAAE,oBAAoB;EAE7B;EACAC,aAAa,EAAE,0BAA0B;EAEzC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,WAAW,EAAE,wBAAwB;EAErC;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACA;EACA;EACAC,IAAI,EAAE,iBAAiB;EAEvB;EACAC,KAAK,EAAE,kBAAkB;EAEzB;EACAC,QAAQ,EAAE,qBAAqB;EAE/B;EACAC,OAAO,EAAE;AACX,CAAC,CAAC;AAEK,IAAAC,mBAAA,GAIHjB,kBAAkB,CAAiCC,UAAU,CAACY,IAAI,CAAC;EAH7DK,kBAAkB,GAAAD,mBAAA,CAA1BE,MAAM;EACAC,aAAa,GAAAH,mBAAA,CAAnBI,IAAI;EACSC,oBAAoB,GAAAL,mBAAA,CAAjCM,WAAW;AAC2D,SAAAL,kBAAA,EAAAE,aAAA,EAAAE,oBAAA;AAEjE,IAAAE,oBAAA,GAIHxB,kBAAkB,CAAoBC,UAAU,CAACa,KAAK,CAAC;EAHjDW,mBAAmB,GAAAD,oBAAA,CAA3BL,MAAM;EACAO,cAAc,GAAAF,oBAAA,CAApBH,IAAI;EACSM,qBAAqB,GAAAH,oBAAA,CAAlCD,WAAW;;AAGb;AAAA,SAAAE,mBAAA,EAAAC,cAAA,EAAAC,qBAAA;AAEA,eAAe1B,UAAU","ignoreList":[]}
|
package/dist/PanelManager.js
CHANGED
|
@@ -70,9 +70,7 @@ class PanelManager {
|
|
|
70
70
|
this.startListening();
|
|
71
71
|
}
|
|
72
72
|
startListening() {
|
|
73
|
-
var
|
|
74
|
-
eventHub
|
|
75
|
-
} = this.layout;
|
|
73
|
+
var eventHub = this.layout.eventHub;
|
|
76
74
|
eventHub.on(PanelEvent.FOCUS, this.handleFocus);
|
|
77
75
|
eventHub.on(PanelEvent.MOUNT, this.handleMount);
|
|
78
76
|
eventHub.on(PanelEvent.UNMOUNT, this.handleUnmount);
|
|
@@ -89,9 +87,7 @@ class PanelManager {
|
|
|
89
87
|
this.navigationEventListenerRemovers.push(listenForCycleToPreviousTab(eventHub, this.handleCycleToPreviousTab));
|
|
90
88
|
}
|
|
91
89
|
stopListening() {
|
|
92
|
-
var
|
|
93
|
-
eventHub
|
|
94
|
-
} = this.layout;
|
|
90
|
+
var eventHub = this.layout.eventHub;
|
|
95
91
|
eventHub.off(PanelEvent.FOCUS, this.handleFocus);
|
|
96
92
|
eventHub.off(PanelEvent.MOUNT, this.handleMount);
|
|
97
93
|
eventHub.off(PanelEvent.UNMOUNT, this.handleUnmount);
|
|
@@ -111,9 +107,7 @@ class PanelManager {
|
|
|
111
107
|
}
|
|
112
108
|
getOpenedPanelConfigs() {
|
|
113
109
|
return this.getOpenedPanels().map(panel => {
|
|
114
|
-
var
|
|
115
|
-
glContainer
|
|
116
|
-
} = panel.props;
|
|
110
|
+
var glContainer = panel.props.glContainer;
|
|
117
111
|
return LayoutUtils.getComponentConfigFromContainer(glContainer);
|
|
118
112
|
});
|
|
119
113
|
}
|
|
@@ -234,9 +228,7 @@ class PanelManager {
|
|
|
234
228
|
if (focusedStack === undefined) {
|
|
235
229
|
return;
|
|
236
230
|
}
|
|
237
|
-
var
|
|
238
|
-
contentItems
|
|
239
|
-
} = focusedStack;
|
|
231
|
+
var contentItems = focusedStack.contentItems;
|
|
240
232
|
if (contentItems.length <= 1) {
|
|
241
233
|
return;
|
|
242
234
|
}
|
|
@@ -263,19 +255,13 @@ class PanelManager {
|
|
|
263
255
|
// Don't need to send an update yet, it will get sent when component is mounted
|
|
264
256
|
|
|
265
257
|
// Rehydrate the panel before adding it back
|
|
266
|
-
var
|
|
267
|
-
|
|
268
|
-
} = panelConfig;
|
|
269
|
-
var {
|
|
270
|
-
props
|
|
271
|
-
} = panelConfig;
|
|
258
|
+
var component = panelConfig.component;
|
|
259
|
+
var props = panelConfig.props;
|
|
272
260
|
props = this.hydrateComponent(component, props);
|
|
273
261
|
var config = _objectSpread(_objectSpread({}, panelConfig), {}, {
|
|
274
262
|
props
|
|
275
263
|
});
|
|
276
|
-
var
|
|
277
|
-
root
|
|
278
|
-
} = this.layout;
|
|
264
|
+
var root = this.layout.root;
|
|
279
265
|
var stack = panelConfig.parentStackId === undefined ? undefined : LayoutUtils.getStackById(root, panelConfig.parentStackId);
|
|
280
266
|
LayoutUtils.openComponent({
|
|
281
267
|
root,
|
|
@@ -321,9 +307,7 @@ class PanelManager {
|
|
|
321
307
|
var config = {
|
|
322
308
|
id
|
|
323
309
|
};
|
|
324
|
-
var
|
|
325
|
-
root
|
|
326
|
-
} = this.layout;
|
|
310
|
+
var root = this.layout.root;
|
|
327
311
|
LayoutUtils.closeComponent(root, config);
|
|
328
312
|
}
|
|
329
313
|
addClosedPanel(glContainer) {
|
|
@@ -340,10 +324,8 @@ class PanelManager {
|
|
|
340
324
|
}
|
|
341
325
|
}
|
|
342
326
|
sendUpdate() {
|
|
343
|
-
var
|
|
344
|
-
|
|
345
|
-
openedMap
|
|
346
|
-
} = this;
|
|
327
|
+
var closed = this.closed,
|
|
328
|
+
openedMap = this.openedMap;
|
|
347
329
|
this.onPanelsUpdated({
|
|
348
330
|
closed: [...closed],
|
|
349
331
|
openedMap: new Map(openedMap)
|
package/dist/PanelManager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelManager.js","names":["Log","PanelEvent","listenForCycleToNextStack","listenForCycleToPreviousStack","listenForCycleToNextTab","listenForCycleToPreviousTab","LayoutUtils","isReactComponentConfig","isWrappedComponent","log","module","CycleDirection","PanelManager","constructor","layout","hydrateComponent","arguments","length","undefined","name","props","dehydrateComponent","config","openedMap","Map","closed","onPanelsUpdated","_defineProperty","handleFocus","bind","handleMount","handleUnmount","handleReopen","handleReopenLast","handleCycleToNextStack","handleCycleToPreviousStack","handleCycleToNextTab","handleCycleToPreviousTab","handleDeleted","handleClosed","handleControlClose","navigationEventListenerRemovers","startListening","eventHub","on","FOCUS","MOUNT","UNMOUNT","REOPEN","REOPEN_LAST","DELETE","CLOSED","CLOSE","push","stopListening","off","forEach","remover","getClosedPanelConfigsOfType","typeString","filter","panel","component","getOpenedPanels","Array","from","values","getOpenedPanelConfigs","map","glContainer","getComponentConfigFromContainer","getOpenedPanelConfigsOfType","getOpenedPanelById","panelId","get","getContainerByPanelId","_ref","stack","getStackForConfig","root","id","getContentItemInStack","getLastUsedPanel","matcher","opened","i","getLastUsedPanelOfType","type","getLastUsedPanelOfTypes","types","some","WrappedComponent","updatePanel","getIdFromPanel","error","debug2","concat","delete","set","removePanel","has","debug","removeClosedPanelConfig","panelConfig","index","findIndex","closedConfig","splice","sendUpdate","cycleStack","direction","allStacks","getAllStackContainers","focusedIndex","getFocusedStackIndex","targetStack","activeContentIndex","activeItemIndex","activeContentItem","contentItems","setActiveContentItem","targetIndex","Next","Previous","cycleTab","_focusedStack$config$","focusedStack","getFocusedStack","targetContentItem","replaceConfig","_objectSpread","parentStackId","getStackById","openComponent","_LayoutUtils$getStack","stackId","getConfig","addClosedPanel","closeComponent","dehydratedConfig","_glContainer$tab","tab","header","parent"],"sources":["../src/PanelManager.ts"],"sourcesContent":["import { type ComponentType } from 'react';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ContentItem,\n ItemConfig,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport {\n listenForCycleToNextStack,\n listenForCycleToPreviousStack,\n listenForCycleToNextTab,\n listenForCycleToPreviousTab,\n} from './NavigationEvent';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n type DehydratedDashboardPanelProps,\n type DehydratedPanelConfig,\n type DehydratedPanelProps,\n isWrappedComponent,\n type PanelComponent,\n type PanelComponentType,\n type PanelProps,\n} from './DashboardPlugin';\n\nconst log = Log.module('PanelManager');\n\nenum CycleDirection {\n Next,\n Previous,\n}\n\nexport type PanelHydraterFunction = (\n name: string,\n props: DehydratedPanelProps\n) => DehydratedDashboardPanelProps;\n\nexport type PanelDehydraterFunction = (\n name: string,\n config: ReactComponentConfig\n) => DehydratedPanelConfig;\n\nexport type ClosedPanel = ReactComponentConfig & {\n /**\n * The stack the component is in.\n */\n parentStackId?: string | string[];\n};\n\nexport type ClosedPanels = ClosedPanel[];\n\nexport type OpenedPanelMap = Map<string | string[], PanelComponent>;\n\nexport type PanelsUpdateData = {\n closed: ClosedPanels;\n openedMap: OpenedPanelMap;\n};\n\nexport type PanelsUpdateCallback = (panelUpdateData: PanelsUpdateData) => void;\n\n/**\n * Class to keep track of which panels are open, have been closed, and also events to close panels.\n */\nclass PanelManager {\n static MAX_CLOSED_PANEL_COUNT = 100;\n\n layout: GoldenLayout;\n\n hydrateComponent: PanelHydraterFunction;\n\n dehydrateComponent: PanelDehydraterFunction;\n\n onPanelsUpdated: PanelsUpdateCallback;\n\n closed: ClosedPanels;\n\n openedMap: OpenedPanelMap;\n\n navigationEventListenerRemovers: (() => void)[];\n\n /**\n * @param layout The GoldenLayout object to attach to\n * @param hydrateComponent Function to hydrate a panel from a dehydrated state\n * @param dehydrateComponent Function to dehydrate a panel\n * @param openedMap Map of opened panels\n * @param closed Array of closed panels in a dehydrated state\n * @param onPanelsUpdated Triggered when the panels are updated\n */\n constructor(\n layout: GoldenLayout,\n hydrateComponent: PanelHydraterFunction = (name, props) =>\n props as DehydratedDashboardPanelProps,\n dehydrateComponent: PanelDehydraterFunction = (name, config) =>\n config as DehydratedPanelConfig,\n openedMap: OpenedPanelMap = new Map(),\n closed: ClosedPanel[] = [],\n onPanelsUpdated: PanelsUpdateCallback = () => undefined\n ) {\n this.handleFocus = this.handleFocus.bind(this);\n this.handleMount = this.handleMount.bind(this);\n // Panel can be unmounted on error but still keep the tab until it's closed\n // Use PanelEvent.MOUNT/UNMOUNT to track open (active) panels\n // and PanelEvent.CLOSED for cleanup (delete links, add panel to closed panels list, etc)\n this.handleUnmount = this.handleUnmount.bind(this);\n this.handleReopen = this.handleReopen.bind(this);\n this.handleReopenLast = this.handleReopenLast.bind(this);\n this.handleCycleToNextStack = this.handleCycleToNextStack.bind(this);\n this.handleCycleToPreviousStack =\n this.handleCycleToPreviousStack.bind(this);\n this.handleCycleToNextTab = this.handleCycleToNextTab.bind(this);\n this.handleCycleToPreviousTab = this.handleCycleToPreviousTab.bind(this);\n this.handleDeleted = this.handleDeleted.bind(this);\n this.handleClosed = this.handleClosed.bind(this);\n this.handleControlClose = this.handleControlClose.bind(this);\n\n this.layout = layout;\n this.hydrateComponent = hydrateComponent;\n this.dehydrateComponent = dehydrateComponent;\n this.onPanelsUpdated = onPanelsUpdated;\n\n // Store the opened and closed panels\n this.openedMap = new Map(openedMap);\n\n // Closed panels are stored in their dehydrated state\n this.closed = [...closed];\n\n // Store the navigation event listener removers\n this.navigationEventListenerRemovers = [];\n\n this.startListening();\n }\n\n startListening(): void {\n const { eventHub } = this.layout;\n eventHub.on(PanelEvent.FOCUS, this.handleFocus);\n eventHub.on(PanelEvent.MOUNT, this.handleMount);\n eventHub.on(PanelEvent.UNMOUNT, this.handleUnmount);\n eventHub.on(PanelEvent.REOPEN, this.handleReopen);\n eventHub.on(PanelEvent.REOPEN_LAST, this.handleReopenLast);\n eventHub.on(PanelEvent.DELETE, this.handleDeleted);\n eventHub.on(PanelEvent.CLOSED, this.handleClosed);\n eventHub.on(PanelEvent.CLOSE, this.handleControlClose);\n // PanelEvent.OPEN should be listened to by plugins to open a panel\n\n this.navigationEventListenerRemovers.push(\n listenForCycleToNextStack(eventHub, this.handleCycleToNextStack)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToPreviousStack(eventHub, this.handleCycleToPreviousStack)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToNextTab(eventHub, this.handleCycleToNextTab)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToPreviousTab(eventHub, this.handleCycleToPreviousTab)\n );\n }\n\n stopListening(): void {\n const { eventHub } = this.layout;\n eventHub.off(PanelEvent.FOCUS, this.handleFocus);\n eventHub.off(PanelEvent.MOUNT, this.handleMount);\n eventHub.off(PanelEvent.UNMOUNT, this.handleUnmount);\n eventHub.off(PanelEvent.REOPEN, this.handleReopen);\n eventHub.off(PanelEvent.REOPEN_LAST, this.handleReopenLast);\n eventHub.off(PanelEvent.DELETE, this.handleDeleted);\n eventHub.off(PanelEvent.CLOSED, this.handleClosed);\n eventHub.off(PanelEvent.CLOSE, this.handleControlClose);\n\n this.navigationEventListenerRemovers.forEach(remover => remover());\n this.navigationEventListenerRemovers = [];\n }\n\n getClosedPanelConfigsOfType(typeString: string): ClosedPanels {\n return this.closed.filter(panel => panel.component === typeString);\n }\n\n getOpenedPanels(): PanelComponent[] {\n return Array.from(this.openedMap.values());\n }\n\n getOpenedPanelConfigs(): (ItemConfig | null)[] {\n return this.getOpenedPanels().map(panel => {\n const { glContainer } = panel.props;\n return LayoutUtils.getComponentConfigFromContainer(glContainer);\n });\n }\n\n getOpenedPanelConfigsOfType(typeString: string): ReactComponentConfig[] {\n return this.getOpenedPanelConfigs().filter(\n config =>\n config != null &&\n isReactComponentConfig(config) &&\n config.component === typeString\n ) as ReactComponentConfig[];\n }\n\n getOpenedPanelById(panelId: string | string[]): PanelComponent | undefined {\n return this.openedMap.get(panelId);\n }\n\n getContainerByPanelId(panelId: string | string[]): ContentItem | null {\n const stack = LayoutUtils.getStackForConfig(this.layout.root, {\n id: panelId,\n });\n return (\n (stack && LayoutUtils.getContentItemInStack(stack, { id: panelId })) ??\n null\n );\n }\n\n getLastUsedPanel<T extends PanelComponent = PanelComponent>(\n matcher: (panel: PanelComponent) => boolean\n ): T | undefined {\n const opened = this.getOpenedPanels();\n for (let i = opened.length - 1; i >= 0; i -= 1) {\n const panel = opened[i];\n if (matcher == null || matcher(panel)) {\n return panel as T;\n }\n }\n\n return undefined;\n }\n\n getLastUsedPanelOfType<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n >(type: PanelComponentType<P, C>): PanelComponent<P> | undefined {\n return this.getLastUsedPanelOfTypes([type]);\n }\n\n getLastUsedPanelOfTypes<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n >(types: PanelComponentType<P, C>[]): PanelComponent<P> | undefined {\n return this.getLastUsedPanel(panel =>\n types.some(\n type =>\n (isWrappedComponent(type) &&\n panel instanceof type.WrappedComponent) ||\n (!isWrappedComponent(type) && panel instanceof type)\n )\n );\n }\n\n updatePanel(panel: PanelComponent): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('updatePanel Panel did not have an ID', panel);\n return;\n }\n log.debug2(`Updating panel ID ${panelId} in open panels map`);\n // Delete the entry before it's set to maintain correct ordering in the open panels map.\n // The last updated (focused) panel should be the last inserted.\n // Deleting the entry from the map directly instead of calling this.removePanel to skip the checks.\n this.openedMap.delete(panelId);\n this.openedMap.set(panelId, panel);\n }\n\n removePanel(panel: PanelComponent): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('removePanel Panel did not have an ID', panel);\n return;\n }\n if (!this.openedMap.has(panelId)) {\n log.error(`Missing panel ID ${panelId} in open panels map`);\n return;\n }\n if (this.openedMap.get(panelId) !== panel) {\n // We mount a new panel before un-mounting the existing one\n // when replacing existing panels in openComponent/openComponentInStack.\n // Skip map delete if the panelId entry already refers to the new panel.\n log.debug(\n `Panel argument doesn't match the open panels map entry for ${panelId}, removePanel ignored`\n );\n return;\n }\n log.debug2(`Removing panel ID ${panelId} from open panels map`);\n this.openedMap.delete(panelId);\n }\n\n removeClosedPanelConfig(panelConfig: ClosedPanel): void {\n const index = this.closed.findIndex(\n closedConfig =>\n closedConfig === panelConfig ||\n (closedConfig.id != null &&\n panelConfig.id != null &&\n closedConfig.id === panelConfig.id)\n );\n if (index >= 0) {\n this.closed.splice(index, 1);\n }\n }\n\n handleFocus(panel: PanelComponent): void {\n log.debug2('Focus: ', panel);\n this.updatePanel(panel);\n }\n\n handleMount(panel: PanelComponent): void {\n log.debug2('Mount: ', panel);\n this.updatePanel(panel);\n this.sendUpdate();\n }\n\n handleUnmount(panel: PanelComponent): void {\n log.debug2('Unmount: ', panel);\n this.removePanel(panel);\n this.sendUpdate();\n }\n\n cycleStack(direction: CycleDirection): void {\n const allStacks = LayoutUtils.getAllStackContainers(this.layout);\n if (allStacks.length <= 1) {\n return;\n }\n\n const focusedIndex = LayoutUtils.getFocusedStackIndex(allStacks);\n\n // If no stack is focused, activate the first stack's content item\n if (focusedIndex === -1) {\n const targetStack = allStacks[0];\n const activeContentIndex = targetStack.config.activeItemIndex;\n const activeContentItem =\n activeContentIndex != null\n ? targetStack.contentItems[activeContentIndex]\n : targetStack.contentItems[0];\n\n targetStack.setActiveContentItem(activeContentItem, true);\n return;\n }\n\n const targetIndex =\n direction === CycleDirection.Next\n ? (focusedIndex + 1) % allStacks.length\n : (focusedIndex - 1 + allStacks.length) % allStacks.length;\n const targetStack = allStacks[targetIndex];\n\n const activeContentIndex = targetStack.config.activeItemIndex;\n const activeContentItem =\n activeContentIndex != null\n ? targetStack.contentItems[activeContentIndex]\n : targetStack.contentItems[0];\n\n targetStack.setActiveContentItem(activeContentItem, true);\n }\n\n handleCycleToNextStack(): void {\n this.cycleStack(CycleDirection.Next);\n }\n\n handleCycleToPreviousStack(): void {\n this.cycleStack(CycleDirection.Previous);\n }\n\n cycleTab(direction: CycleDirection): void {\n const focusedStack = LayoutUtils.getFocusedStack(this.layout);\n if (focusedStack === undefined) {\n return;\n }\n const { contentItems } = focusedStack;\n\n if (contentItems.length <= 1) {\n return;\n }\n\n const activeItemIndex = focusedStack.config.activeItemIndex ?? 0;\n const targetIndex =\n direction === CycleDirection.Next\n ? (activeItemIndex + 1) % contentItems.length\n : (activeItemIndex - 1 + contentItems.length) % contentItems.length;\n\n const targetContentItem = contentItems[targetIndex];\n focusedStack.setActiveContentItem(targetContentItem, true);\n }\n\n handleCycleToNextTab(): void {\n this.cycleTab(CycleDirection.Next);\n }\n\n handleCycleToPreviousTab(): void {\n this.cycleTab(CycleDirection.Previous);\n }\n\n /**\n *\n * @param panelConfig The config to hydrate and load\n * @param replaceConfig The config to place\n */\n handleReopen(\n panelConfig: ClosedPanel,\n replaceConfig?: Partial<ItemConfig>\n ): void {\n log.debug2('Reopen:', panelConfig, replaceConfig);\n\n this.removeClosedPanelConfig(panelConfig);\n // Don't need to send an update yet, it will get sent when component is mounted\n\n // Rehydrate the panel before adding it back\n const { component } = panelConfig;\n let { props } = panelConfig;\n props = this.hydrateComponent(component, props);\n\n const config = {\n ...panelConfig,\n props,\n };\n\n const { root } = this.layout;\n const stack =\n panelConfig.parentStackId === undefined\n ? undefined\n : LayoutUtils.getStackById(root, panelConfig.parentStackId);\n LayoutUtils.openComponent({\n root,\n config,\n replaceConfig,\n stack: stack ?? undefined,\n });\n }\n\n /**\n *\n * @param glContainer Only reopen panels that were closed from the stack of this container, if defined\n */\n handleReopenLast(glContainer?: Container): void {\n if (this.closed.length === 0) return;\n if (glContainer === undefined) {\n this.handleReopen(this.closed[this.closed.length - 1]);\n return;\n }\n\n const stackId = LayoutUtils.getStackForConfig(\n this.layout.root,\n glContainer.getConfig()\n )?.config.id;\n for (let i = this.closed.length - 1; i >= 0; i -= 1) {\n const panelConfig = this.closed[i];\n if (panelConfig.parentStackId === stackId) {\n this.handleReopen(panelConfig);\n return;\n }\n }\n }\n\n handleDeleted(panelConfig: ClosedPanel): void {\n log.debug2('Deleted:', panelConfig);\n\n this.removeClosedPanelConfig(panelConfig);\n\n this.sendUpdate();\n }\n\n handleClosed(panelId: string, glContainer: Container): void {\n // Panel component should be already unmounted at this point\n // so the emitted event sends the container object instead of the panel.\n log.debug2('Closed: ', panelId);\n this.addClosedPanel(glContainer);\n this.sendUpdate();\n }\n\n handleControlClose(id: string): void {\n const config = { id };\n const { root } = this.layout;\n LayoutUtils.closeComponent(root, config);\n }\n\n addClosedPanel(glContainer: Container): void {\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config && isReactComponentConfig(config)) {\n const dehydratedConfig = this.dehydrateComponent(\n config.component,\n config\n );\n if (dehydratedConfig != null) {\n // Not using LayoutUtils.getStackForConfig here because the panel may be removed from the root config already.\n // The container config should be the same as it was when it was unmounted, so this avoids the issue of the config not existing on root.\n (dehydratedConfig as ClosedPanel).parentStackId =\n glContainer.tab?.header.parent.config.id;\n this.closed.push(dehydratedConfig);\n }\n }\n }\n\n sendUpdate(): void {\n const { closed, openedMap } = this;\n this.onPanelsUpdated({\n closed: [...closed],\n openedMap: new Map(openedMap),\n });\n }\n}\n\nexport default PanelManager;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PanelManager.js","names":["Log","PanelEvent","listenForCycleToNextStack","listenForCycleToPreviousStack","listenForCycleToNextTab","listenForCycleToPreviousTab","LayoutUtils","isReactComponentConfig","isWrappedComponent","log","module","CycleDirection","PanelManager","constructor","layout","hydrateComponent","arguments","length","undefined","name","props","dehydrateComponent","config","openedMap","Map","closed","onPanelsUpdated","_defineProperty","handleFocus","bind","handleMount","handleUnmount","handleReopen","handleReopenLast","handleCycleToNextStack","handleCycleToPreviousStack","handleCycleToNextTab","handleCycleToPreviousTab","handleDeleted","handleClosed","handleControlClose","navigationEventListenerRemovers","startListening","eventHub","on","FOCUS","MOUNT","UNMOUNT","REOPEN","REOPEN_LAST","DELETE","CLOSED","CLOSE","push","stopListening","off","forEach","remover","getClosedPanelConfigsOfType","typeString","filter","panel","component","getOpenedPanels","Array","from","values","getOpenedPanelConfigs","map","glContainer","getComponentConfigFromContainer","getOpenedPanelConfigsOfType","getOpenedPanelById","panelId","get","getContainerByPanelId","_ref","stack","getStackForConfig","root","id","getContentItemInStack","getLastUsedPanel","matcher","opened","i","getLastUsedPanelOfType","type","getLastUsedPanelOfTypes","types","some","WrappedComponent","updatePanel","getIdFromPanel","error","debug2","concat","delete","set","removePanel","has","debug","removeClosedPanelConfig","panelConfig","index","findIndex","closedConfig","splice","sendUpdate","cycleStack","direction","allStacks","getAllStackContainers","focusedIndex","getFocusedStackIndex","targetStack","activeContentIndex","activeItemIndex","activeContentItem","contentItems","setActiveContentItem","targetIndex","Next","Previous","cycleTab","_focusedStack$config$","focusedStack","getFocusedStack","targetContentItem","replaceConfig","_objectSpread","parentStackId","getStackById","openComponent","_LayoutUtils$getStack","stackId","getConfig","addClosedPanel","closeComponent","dehydratedConfig","_glContainer$tab","tab","header","parent"],"sources":["../src/PanelManager.ts"],"sourcesContent":["import { type ComponentType } from 'react';\nimport type GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ContentItem,\n ItemConfig,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport {\n listenForCycleToNextStack,\n listenForCycleToPreviousStack,\n listenForCycleToNextTab,\n listenForCycleToPreviousTab,\n} from './NavigationEvent';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n type DehydratedDashboardPanelProps,\n type DehydratedPanelConfig,\n type DehydratedPanelProps,\n isWrappedComponent,\n type PanelComponent,\n type PanelComponentType,\n type PanelProps,\n} from './DashboardPlugin';\n\nconst log = Log.module('PanelManager');\n\nenum CycleDirection {\n Next,\n Previous,\n}\n\nexport type PanelHydraterFunction = (\n name: string,\n props: DehydratedPanelProps\n) => DehydratedDashboardPanelProps;\n\nexport type PanelDehydraterFunction = (\n name: string,\n config: ReactComponentConfig\n) => DehydratedPanelConfig;\n\nexport type ClosedPanel = ReactComponentConfig & {\n /**\n * The stack the component is in.\n */\n parentStackId?: string | string[];\n};\n\nexport type ClosedPanels = ClosedPanel[];\n\nexport type OpenedPanelMap = Map<string | string[], PanelComponent>;\n\nexport type PanelsUpdateData = {\n closed: ClosedPanels;\n openedMap: OpenedPanelMap;\n};\n\nexport type PanelsUpdateCallback = (panelUpdateData: PanelsUpdateData) => void;\n\n/**\n * Class to keep track of which panels are open, have been closed, and also events to close panels.\n */\nclass PanelManager {\n static MAX_CLOSED_PANEL_COUNT = 100;\n\n layout: GoldenLayout;\n\n hydrateComponent: PanelHydraterFunction;\n\n dehydrateComponent: PanelDehydraterFunction;\n\n onPanelsUpdated: PanelsUpdateCallback;\n\n closed: ClosedPanels;\n\n openedMap: OpenedPanelMap;\n\n navigationEventListenerRemovers: (() => void)[];\n\n /**\n * @param layout The GoldenLayout object to attach to\n * @param hydrateComponent Function to hydrate a panel from a dehydrated state\n * @param dehydrateComponent Function to dehydrate a panel\n * @param openedMap Map of opened panels\n * @param closed Array of closed panels in a dehydrated state\n * @param onPanelsUpdated Triggered when the panels are updated\n */\n constructor(\n layout: GoldenLayout,\n hydrateComponent: PanelHydraterFunction = (name, props) =>\n props as DehydratedDashboardPanelProps,\n dehydrateComponent: PanelDehydraterFunction = (name, config) =>\n config as DehydratedPanelConfig,\n openedMap: OpenedPanelMap = new Map(),\n closed: ClosedPanel[] = [],\n onPanelsUpdated: PanelsUpdateCallback = () => undefined\n ) {\n this.handleFocus = this.handleFocus.bind(this);\n this.handleMount = this.handleMount.bind(this);\n // Panel can be unmounted on error but still keep the tab until it's closed\n // Use PanelEvent.MOUNT/UNMOUNT to track open (active) panels\n // and PanelEvent.CLOSED for cleanup (delete links, add panel to closed panels list, etc)\n this.handleUnmount = this.handleUnmount.bind(this);\n this.handleReopen = this.handleReopen.bind(this);\n this.handleReopenLast = this.handleReopenLast.bind(this);\n this.handleCycleToNextStack = this.handleCycleToNextStack.bind(this);\n this.handleCycleToPreviousStack =\n this.handleCycleToPreviousStack.bind(this);\n this.handleCycleToNextTab = this.handleCycleToNextTab.bind(this);\n this.handleCycleToPreviousTab = this.handleCycleToPreviousTab.bind(this);\n this.handleDeleted = this.handleDeleted.bind(this);\n this.handleClosed = this.handleClosed.bind(this);\n this.handleControlClose = this.handleControlClose.bind(this);\n\n this.layout = layout;\n this.hydrateComponent = hydrateComponent;\n this.dehydrateComponent = dehydrateComponent;\n this.onPanelsUpdated = onPanelsUpdated;\n\n // Store the opened and closed panels\n this.openedMap = new Map(openedMap);\n\n // Closed panels are stored in their dehydrated state\n this.closed = [...closed];\n\n // Store the navigation event listener removers\n this.navigationEventListenerRemovers = [];\n\n this.startListening();\n }\n\n startListening(): void {\n const { eventHub } = this.layout;\n eventHub.on(PanelEvent.FOCUS, this.handleFocus);\n eventHub.on(PanelEvent.MOUNT, this.handleMount);\n eventHub.on(PanelEvent.UNMOUNT, this.handleUnmount);\n eventHub.on(PanelEvent.REOPEN, this.handleReopen);\n eventHub.on(PanelEvent.REOPEN_LAST, this.handleReopenLast);\n eventHub.on(PanelEvent.DELETE, this.handleDeleted);\n eventHub.on(PanelEvent.CLOSED, this.handleClosed);\n eventHub.on(PanelEvent.CLOSE, this.handleControlClose);\n // PanelEvent.OPEN should be listened to by plugins to open a panel\n\n this.navigationEventListenerRemovers.push(\n listenForCycleToNextStack(eventHub, this.handleCycleToNextStack)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToPreviousStack(eventHub, this.handleCycleToPreviousStack)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToNextTab(eventHub, this.handleCycleToNextTab)\n );\n this.navigationEventListenerRemovers.push(\n listenForCycleToPreviousTab(eventHub, this.handleCycleToPreviousTab)\n );\n }\n\n stopListening(): void {\n const { eventHub } = this.layout;\n eventHub.off(PanelEvent.FOCUS, this.handleFocus);\n eventHub.off(PanelEvent.MOUNT, this.handleMount);\n eventHub.off(PanelEvent.UNMOUNT, this.handleUnmount);\n eventHub.off(PanelEvent.REOPEN, this.handleReopen);\n eventHub.off(PanelEvent.REOPEN_LAST, this.handleReopenLast);\n eventHub.off(PanelEvent.DELETE, this.handleDeleted);\n eventHub.off(PanelEvent.CLOSED, this.handleClosed);\n eventHub.off(PanelEvent.CLOSE, this.handleControlClose);\n\n this.navigationEventListenerRemovers.forEach(remover => remover());\n this.navigationEventListenerRemovers = [];\n }\n\n getClosedPanelConfigsOfType(typeString: string): ClosedPanels {\n return this.closed.filter(panel => panel.component === typeString);\n }\n\n getOpenedPanels(): PanelComponent[] {\n return Array.from(this.openedMap.values());\n }\n\n getOpenedPanelConfigs(): (ItemConfig | null)[] {\n return this.getOpenedPanels().map(panel => {\n const { glContainer } = panel.props;\n return LayoutUtils.getComponentConfigFromContainer(glContainer);\n });\n }\n\n getOpenedPanelConfigsOfType(typeString: string): ReactComponentConfig[] {\n return this.getOpenedPanelConfigs().filter(\n config =>\n config != null &&\n isReactComponentConfig(config) &&\n config.component === typeString\n ) as ReactComponentConfig[];\n }\n\n getOpenedPanelById(panelId: string | string[]): PanelComponent | undefined {\n return this.openedMap.get(panelId);\n }\n\n getContainerByPanelId(panelId: string | string[]): ContentItem | null {\n const stack = LayoutUtils.getStackForConfig(this.layout.root, {\n id: panelId,\n });\n return (\n (stack && LayoutUtils.getContentItemInStack(stack, { id: panelId })) ??\n null\n );\n }\n\n getLastUsedPanel<T extends PanelComponent = PanelComponent>(\n matcher: (panel: PanelComponent) => boolean\n ): T | undefined {\n const opened = this.getOpenedPanels();\n for (let i = opened.length - 1; i >= 0; i -= 1) {\n const panel = opened[i];\n if (matcher == null || matcher(panel)) {\n return panel as T;\n }\n }\n\n return undefined;\n }\n\n getLastUsedPanelOfType<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n >(type: PanelComponentType<P, C>): PanelComponent<P> | undefined {\n return this.getLastUsedPanelOfTypes([type]);\n }\n\n getLastUsedPanelOfTypes<\n P extends PanelProps = PanelProps,\n C extends ComponentType<P> = ComponentType<P>,\n >(types: PanelComponentType<P, C>[]): PanelComponent<P> | undefined {\n return this.getLastUsedPanel(panel =>\n types.some(\n type =>\n (isWrappedComponent(type) &&\n panel instanceof type.WrappedComponent) ||\n (!isWrappedComponent(type) && panel instanceof type)\n )\n );\n }\n\n updatePanel(panel: PanelComponent): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('updatePanel Panel did not have an ID', panel);\n return;\n }\n log.debug2(`Updating panel ID ${panelId} in open panels map`);\n // Delete the entry before it's set to maintain correct ordering in the open panels map.\n // The last updated (focused) panel should be the last inserted.\n // Deleting the entry from the map directly instead of calling this.removePanel to skip the checks.\n this.openedMap.delete(panelId);\n this.openedMap.set(panelId, panel);\n }\n\n removePanel(panel: PanelComponent): void {\n const panelId = LayoutUtils.getIdFromPanel(panel);\n if (panelId == null) {\n log.error('removePanel Panel did not have an ID', panel);\n return;\n }\n if (!this.openedMap.has(panelId)) {\n log.error(`Missing panel ID ${panelId} in open panels map`);\n return;\n }\n if (this.openedMap.get(panelId) !== panel) {\n // We mount a new panel before un-mounting the existing one\n // when replacing existing panels in openComponent/openComponentInStack.\n // Skip map delete if the panelId entry already refers to the new panel.\n log.debug(\n `Panel argument doesn't match the open panels map entry for ${panelId}, removePanel ignored`\n );\n return;\n }\n log.debug2(`Removing panel ID ${panelId} from open panels map`);\n this.openedMap.delete(panelId);\n }\n\n removeClosedPanelConfig(panelConfig: ClosedPanel): void {\n const index = this.closed.findIndex(\n closedConfig =>\n closedConfig === panelConfig ||\n (closedConfig.id != null &&\n panelConfig.id != null &&\n closedConfig.id === panelConfig.id)\n );\n if (index >= 0) {\n this.closed.splice(index, 1);\n }\n }\n\n handleFocus(panel: PanelComponent): void {\n log.debug2('Focus: ', panel);\n this.updatePanel(panel);\n }\n\n handleMount(panel: PanelComponent): void {\n log.debug2('Mount: ', panel);\n this.updatePanel(panel);\n this.sendUpdate();\n }\n\n handleUnmount(panel: PanelComponent): void {\n log.debug2('Unmount: ', panel);\n this.removePanel(panel);\n this.sendUpdate();\n }\n\n cycleStack(direction: CycleDirection): void {\n const allStacks = LayoutUtils.getAllStackContainers(this.layout);\n if (allStacks.length <= 1) {\n return;\n }\n\n const focusedIndex = LayoutUtils.getFocusedStackIndex(allStacks);\n\n // If no stack is focused, activate the first stack's content item\n if (focusedIndex === -1) {\n const targetStack = allStacks[0];\n const activeContentIndex = targetStack.config.activeItemIndex;\n const activeContentItem =\n activeContentIndex != null\n ? targetStack.contentItems[activeContentIndex]\n : targetStack.contentItems[0];\n\n targetStack.setActiveContentItem(activeContentItem, true);\n return;\n }\n\n const targetIndex =\n direction === CycleDirection.Next\n ? (focusedIndex + 1) % allStacks.length\n : (focusedIndex - 1 + allStacks.length) % allStacks.length;\n const targetStack = allStacks[targetIndex];\n\n const activeContentIndex = targetStack.config.activeItemIndex;\n const activeContentItem =\n activeContentIndex != null\n ? targetStack.contentItems[activeContentIndex]\n : targetStack.contentItems[0];\n\n targetStack.setActiveContentItem(activeContentItem, true);\n }\n\n handleCycleToNextStack(): void {\n this.cycleStack(CycleDirection.Next);\n }\n\n handleCycleToPreviousStack(): void {\n this.cycleStack(CycleDirection.Previous);\n }\n\n cycleTab(direction: CycleDirection): void {\n const focusedStack = LayoutUtils.getFocusedStack(this.layout);\n if (focusedStack === undefined) {\n return;\n }\n const { contentItems } = focusedStack;\n\n if (contentItems.length <= 1) {\n return;\n }\n\n const activeItemIndex = focusedStack.config.activeItemIndex ?? 0;\n const targetIndex =\n direction === CycleDirection.Next\n ? (activeItemIndex + 1) % contentItems.length\n : (activeItemIndex - 1 + contentItems.length) % contentItems.length;\n\n const targetContentItem = contentItems[targetIndex];\n focusedStack.setActiveContentItem(targetContentItem, true);\n }\n\n handleCycleToNextTab(): void {\n this.cycleTab(CycleDirection.Next);\n }\n\n handleCycleToPreviousTab(): void {\n this.cycleTab(CycleDirection.Previous);\n }\n\n /**\n *\n * @param panelConfig The config to hydrate and load\n * @param replaceConfig The config to place\n */\n handleReopen(\n panelConfig: ClosedPanel,\n replaceConfig?: Partial<ItemConfig>\n ): void {\n log.debug2('Reopen:', panelConfig, replaceConfig);\n\n this.removeClosedPanelConfig(panelConfig);\n // Don't need to send an update yet, it will get sent when component is mounted\n\n // Rehydrate the panel before adding it back\n const { component } = panelConfig;\n let { props } = panelConfig;\n props = this.hydrateComponent(component, props);\n\n const config = {\n ...panelConfig,\n props,\n };\n\n const { root } = this.layout;\n const stack =\n panelConfig.parentStackId === undefined\n ? undefined\n : LayoutUtils.getStackById(root, panelConfig.parentStackId);\n LayoutUtils.openComponent({\n root,\n config,\n replaceConfig,\n stack: stack ?? undefined,\n });\n }\n\n /**\n *\n * @param glContainer Only reopen panels that were closed from the stack of this container, if defined\n */\n handleReopenLast(glContainer?: Container): void {\n if (this.closed.length === 0) return;\n if (glContainer === undefined) {\n this.handleReopen(this.closed[this.closed.length - 1]);\n return;\n }\n\n const stackId = LayoutUtils.getStackForConfig(\n this.layout.root,\n glContainer.getConfig()\n )?.config.id;\n for (let i = this.closed.length - 1; i >= 0; i -= 1) {\n const panelConfig = this.closed[i];\n if (panelConfig.parentStackId === stackId) {\n this.handleReopen(panelConfig);\n return;\n }\n }\n }\n\n handleDeleted(panelConfig: ClosedPanel): void {\n log.debug2('Deleted:', panelConfig);\n\n this.removeClosedPanelConfig(panelConfig);\n\n this.sendUpdate();\n }\n\n handleClosed(panelId: string, glContainer: Container): void {\n // Panel component should be already unmounted at this point\n // so the emitted event sends the container object instead of the panel.\n log.debug2('Closed: ', panelId);\n this.addClosedPanel(glContainer);\n this.sendUpdate();\n }\n\n handleControlClose(id: string): void {\n const config = { id };\n const { root } = this.layout;\n LayoutUtils.closeComponent(root, config);\n }\n\n addClosedPanel(glContainer: Container): void {\n const config = LayoutUtils.getComponentConfigFromContainer(glContainer);\n if (config && isReactComponentConfig(config)) {\n const dehydratedConfig = this.dehydrateComponent(\n config.component,\n config\n );\n if (dehydratedConfig != null) {\n // Not using LayoutUtils.getStackForConfig here because the panel may be removed from the root config already.\n // The container config should be the same as it was when it was unmounted, so this avoids the issue of the config not existing on root.\n (dehydratedConfig as ClosedPanel).parentStackId =\n glContainer.tab?.header.parent.config.id;\n this.closed.push(dehydratedConfig);\n }\n }\n }\n\n sendUpdate(): void {\n const { closed, openedMap } = this;\n this.onPanelsUpdated({\n closed: [...closed],\n openedMap: new Map(openedMap),\n });\n }\n}\n\nexport default PanelManager;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
function _slicedToArray(r, e) { return _arrayWithHoles(r) || _iterableToArrayLimit(r, e) || _unsupportedIterableToArray(r, e) || _nonIterableRest(); }
|
|
2
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
3
|
+
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
4
|
+
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
5
|
+
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
|
|
6
|
+
function _arrayWithHoles(r) { if (Array.isArray(r)) return r; }
|
|
1
7
|
import React, { createContext, useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
2
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
9
|
/**
|
|
@@ -14,31 +20,29 @@ function makeKey(dhId, type) {
|
|
|
14
20
|
* Limit to one state per (dhId, type) pair.
|
|
15
21
|
*/
|
|
16
22
|
export function PersistentStateProvider(props) {
|
|
17
|
-
var
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
children
|
|
21
|
-
} = props;
|
|
23
|
+
var initialState = props.initialState,
|
|
24
|
+
onChange = props.onChange,
|
|
25
|
+
children = props.children;
|
|
22
26
|
var isMounted = useRef(true);
|
|
23
27
|
useEffect(() => () => {
|
|
24
28
|
isMounted.current = false;
|
|
25
29
|
}, []);
|
|
26
30
|
var needsMigrationToMap = useRef(false);
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
var _useState = useState(() => {
|
|
32
|
+
if (Array.isArray(initialState) && initialState.flat().length === 2 * initialState.length) {
|
|
33
|
+
return new Map(initialState);
|
|
34
|
+
}
|
|
35
|
+
needsMigrationToMap.current = true;
|
|
36
|
+
// Used to migrate from array to map
|
|
37
|
+
return new Map();
|
|
38
|
+
}),
|
|
39
|
+
_useState2 = _slicedToArray(_useState, 1),
|
|
40
|
+
stateMap = _useState2[0];
|
|
35
41
|
|
|
36
42
|
// Track which hookId currently owns each (dhId, type) pair
|
|
37
43
|
var hookOwnership = useRef(new Map());
|
|
38
44
|
var addState = useCallback((hookId, dhId, state) => {
|
|
39
|
-
var
|
|
40
|
-
type
|
|
41
|
-
} = state;
|
|
45
|
+
var type = state.type;
|
|
42
46
|
var key = makeKey(dhId, type);
|
|
43
47
|
var currentOwner = hookOwnership.current.get(key);
|
|
44
48
|
if (currentOwner != null && currentOwner !== hookId) {
|
|
@@ -55,9 +59,8 @@ export function PersistentStateProvider(props) {
|
|
|
55
59
|
var key = makeKey(id, type);
|
|
56
60
|
var state = stateMap.get(key);
|
|
57
61
|
if (state == null && needsMigrationToMap.current) {
|
|
58
|
-
var
|
|
59
|
-
value
|
|
60
|
-
} = initialStateIterator.current.next();
|
|
62
|
+
var _initialStateIterator = initialStateIterator.current.next(),
|
|
63
|
+
value = _initialStateIterator.value;
|
|
61
64
|
var stateVal = value;
|
|
62
65
|
stateMap.set(key, stateVal);
|
|
63
66
|
return stateVal;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PersistentStateContext.js","names":["React","createContext","useCallback","useEffect","useMemo","useRef","useState","jsx","_jsx","PersistentStateContext","displayName","makeKey","dhId","type","concat","PersistentStateProvider","props","initialState","onChange","children","isMounted","current","needsMigrationToMap","stateMap","Array","isArray","flat","length","Map","hookOwnership","addState","hookId","state","key","currentOwner","get","Error","set","entries","initialStateIterator","Symbol","iterator","getState","id","value","next","stateVal","removeState","delete","deregisterHook","contextValue","Provider"],"sources":["../src/PersistentStateContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nexport type PersistentStateContextType = {\n /**\n * Adds state to be persisted.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel.\n * @param state The state to persist. Needs to be JSON serializable.\n */\n addState: (hookId: string, dhId: string, state: PersistentState) => void;\n\n /**\n * Removes persisted state.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel\n * @param type The state type to remove\n */\n removeState: (hookId: string, dhId: string, type: string) => void;\n\n /**\n * Deregisters a hook instance so it no longer owns any state.\n * This way we can accurately warn about multiple hooks trying to use the same (dhId, type) pair.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel to deregister for\n * @param type The state type to deregister for\n */\n deregisterHook: (hookId: string, dhId: string, type: string) => void;\n\n /**\n * Gets the state for the given dhId and type.\n * Prepopulated with the initial state passed to the PersistentStateProvider.\n * @param dhId The dhId of the component/panel\n * @returns The iterator result containing the initial state value (state, version, type) if it exists.\n */\n getState: <S>(dhId: string, type: string) => PersistentState<S> | undefined;\n};\n\n/**\n * Context that holds methods to track the state of all calls to usePersistentState below this provider.\n */\nexport const PersistentStateContext =\n createContext<PersistentStateContextType | null>(null);\nPersistentStateContext.displayName = 'PersistentStateContext';\n\nexport type PersistentState<S = unknown> = {\n state: S;\n version: number;\n type: string;\n};\n\nexport type PersistentStateProviderProps = React.PropsWithChildren<{\n /**\n * The initial state of all calls to usePersistentState.\n * If there are more calls to usePersistentState than there are elements in this array,\n * the state initializer of the usePersistentState call will be used for the rest.\n */\n initialState: [PersistentStateKey, PersistentState][] | PersistentState[];\n\n /**\n * Called when the state changes.\n * The state is passed as an array of the values of all calls to usePersistentState.\n * The order of the values is the same as the order of the calls to usePersistentState.\n * @param state The state of all calls to usePersistentState.\n */\n onChange: (state: [PersistentStateKey, PersistentState][]) => void;\n}>;\n\nfunction makeKey(dhId: string, type: string): PersistentStateKey {\n return `${dhId}::${type}`;\n}\n\ntype PersistentStateKey = string;\n\n/**\n * Tracks all calls to the usePersistentState hook below this provider.\n * Keeps track of the state based on dhId and state type, and calls onChange when the state changes.\n * Limit to one state per (dhId, type) pair.\n */\nexport function PersistentStateProvider(\n props: PersistentStateProviderProps\n): JSX.Element {\n const { initialState, onChange, children } = props;\n\n const isMounted = useRef(true);\n useEffect(\n () => () => {\n isMounted.current = false;\n },\n []\n );\n\n const needsMigrationToMap = useRef(false);\n\n const [stateMap] = useState(() => {\n if (\n Array.isArray(initialState) &&\n initialState.flat().length === 2 * initialState.length\n ) {\n return new Map<string, PersistentState>(\n initialState as [string, PersistentState][]\n );\n }\n needsMigrationToMap.current = true;\n // Used to migrate from array to map\n return new Map<string, PersistentState>();\n });\n\n // Track which hookId currently owns each (dhId, type) pair\n const hookOwnership = useRef(new Map<PersistentStateKey, string>());\n\n const addState = useCallback(\n (hookId: string, dhId: string, state: PersistentState) => {\n const { type } = state;\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n if (currentOwner != null && currentOwner !== hookId) {\n throw new Error(\n `Detected multiple persistent states of type ${type} for dhId ${dhId}. Only one state per (dhId, type) pair is allowed.`\n );\n }\n\n hookOwnership.current.set(key, hookId);\n\n if (isMounted.current && stateMap.get(key) !== state) {\n stateMap.set(key, state);\n onChange([...stateMap.entries()]);\n }\n },\n [isMounted, onChange, stateMap]\n );\n\n const initialStateIterator = useRef(initialState[Symbol.iterator]());\n\n const getState = useCallback(\n <S,>(id: string, type: string): PersistentState<S> | undefined => {\n const key = makeKey(id, type);\n const state = stateMap.get(key);\n if (state == null && needsMigrationToMap.current) {\n const { value } = initialStateIterator.current.next();\n const stateVal = value as PersistentState<S> | undefined;\n stateMap.set(key, stateVal as PersistentState);\n return stateVal;\n }\n\n return state as PersistentState<S> | undefined;\n },\n [stateMap]\n );\n\n const removeState = useCallback(\n (hookId: string, dhId: string, type: string) => {\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n // Only remove if this hookId is the current owner\n if (currentOwner === hookId) {\n stateMap.delete(key);\n hookOwnership.current.delete(key);\n if (isMounted.current) {\n onChange([...stateMap.entries()]);\n }\n }\n },\n [isMounted, onChange, stateMap]\n );\n\n const deregisterHook = useCallback(\n (hookId: string, dhId: string, type: string) => {\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n // Only remove if this hookId is the current owner\n if (currentOwner === hookId) {\n hookOwnership.current.delete(key);\n }\n },\n []\n );\n\n const contextValue = useMemo(\n () => ({\n addState,\n removeState,\n deregisterHook,\n getState,\n }),\n [addState, getState, removeState, deregisterHook]\n );\n\n return (\n <PersistentStateContext.Provider value={contextValue}>\n {children}\n </PersistentStateContext.Provider>\n );\n}\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"PersistentStateContext.js","names":["React","createContext","useCallback","useEffect","useMemo","useRef","useState","jsx","_jsx","PersistentStateContext","displayName","makeKey","dhId","type","concat","PersistentStateProvider","props","initialState","onChange","children","isMounted","current","needsMigrationToMap","_useState","Array","isArray","flat","length","Map","_useState2","_slicedToArray","stateMap","hookOwnership","addState","hookId","state","key","currentOwner","get","Error","set","entries","initialStateIterator","Symbol","iterator","getState","id","_initialStateIterator","next","value","stateVal","removeState","delete","deregisterHook","contextValue","Provider"],"sources":["../src/PersistentStateContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nexport type PersistentStateContextType = {\n /**\n * Adds state to be persisted.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel.\n * @param state The state to persist. Needs to be JSON serializable.\n */\n addState: (hookId: string, dhId: string, state: PersistentState) => void;\n\n /**\n * Removes persisted state.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel\n * @param type The state type to remove\n */\n removeState: (hookId: string, dhId: string, type: string) => void;\n\n /**\n * Deregisters a hook instance so it no longer owns any state.\n * This way we can accurately warn about multiple hooks trying to use the same (dhId, type) pair.\n * @param hookId Unique ID for this hook instance\n * @param dhId The dhId of the component/panel to deregister for\n * @param type The state type to deregister for\n */\n deregisterHook: (hookId: string, dhId: string, type: string) => void;\n\n /**\n * Gets the state for the given dhId and type.\n * Prepopulated with the initial state passed to the PersistentStateProvider.\n * @param dhId The dhId of the component/panel\n * @returns The iterator result containing the initial state value (state, version, type) if it exists.\n */\n getState: <S>(dhId: string, type: string) => PersistentState<S> | undefined;\n};\n\n/**\n * Context that holds methods to track the state of all calls to usePersistentState below this provider.\n */\nexport const PersistentStateContext =\n createContext<PersistentStateContextType | null>(null);\nPersistentStateContext.displayName = 'PersistentStateContext';\n\nexport type PersistentState<S = unknown> = {\n state: S;\n version: number;\n type: string;\n};\n\nexport type PersistentStateProviderProps = React.PropsWithChildren<{\n /**\n * The initial state of all calls to usePersistentState.\n * If there are more calls to usePersistentState than there are elements in this array,\n * the state initializer of the usePersistentState call will be used for the rest.\n */\n initialState: [PersistentStateKey, PersistentState][] | PersistentState[];\n\n /**\n * Called when the state changes.\n * The state is passed as an array of the values of all calls to usePersistentState.\n * The order of the values is the same as the order of the calls to usePersistentState.\n * @param state The state of all calls to usePersistentState.\n */\n onChange: (state: [PersistentStateKey, PersistentState][]) => void;\n}>;\n\nfunction makeKey(dhId: string, type: string): PersistentStateKey {\n return `${dhId}::${type}`;\n}\n\ntype PersistentStateKey = string;\n\n/**\n * Tracks all calls to the usePersistentState hook below this provider.\n * Keeps track of the state based on dhId and state type, and calls onChange when the state changes.\n * Limit to one state per (dhId, type) pair.\n */\nexport function PersistentStateProvider(\n props: PersistentStateProviderProps\n): JSX.Element {\n const { initialState, onChange, children } = props;\n\n const isMounted = useRef(true);\n useEffect(\n () => () => {\n isMounted.current = false;\n },\n []\n );\n\n const needsMigrationToMap = useRef(false);\n\n const [stateMap] = useState(() => {\n if (\n Array.isArray(initialState) &&\n initialState.flat().length === 2 * initialState.length\n ) {\n return new Map<string, PersistentState>(\n initialState as [string, PersistentState][]\n );\n }\n needsMigrationToMap.current = true;\n // Used to migrate from array to map\n return new Map<string, PersistentState>();\n });\n\n // Track which hookId currently owns each (dhId, type) pair\n const hookOwnership = useRef(new Map<PersistentStateKey, string>());\n\n const addState = useCallback(\n (hookId: string, dhId: string, state: PersistentState) => {\n const { type } = state;\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n if (currentOwner != null && currentOwner !== hookId) {\n throw new Error(\n `Detected multiple persistent states of type ${type} for dhId ${dhId}. Only one state per (dhId, type) pair is allowed.`\n );\n }\n\n hookOwnership.current.set(key, hookId);\n\n if (isMounted.current && stateMap.get(key) !== state) {\n stateMap.set(key, state);\n onChange([...stateMap.entries()]);\n }\n },\n [isMounted, onChange, stateMap]\n );\n\n const initialStateIterator = useRef(initialState[Symbol.iterator]());\n\n const getState = useCallback(\n <S,>(id: string, type: string): PersistentState<S> | undefined => {\n const key = makeKey(id, type);\n const state = stateMap.get(key);\n if (state == null && needsMigrationToMap.current) {\n const { value } = initialStateIterator.current.next();\n const stateVal = value as PersistentState<S> | undefined;\n stateMap.set(key, stateVal as PersistentState);\n return stateVal;\n }\n\n return state as PersistentState<S> | undefined;\n },\n [stateMap]\n );\n\n const removeState = useCallback(\n (hookId: string, dhId: string, type: string) => {\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n // Only remove if this hookId is the current owner\n if (currentOwner === hookId) {\n stateMap.delete(key);\n hookOwnership.current.delete(key);\n if (isMounted.current) {\n onChange([...stateMap.entries()]);\n }\n }\n },\n [isMounted, onChange, stateMap]\n );\n\n const deregisterHook = useCallback(\n (hookId: string, dhId: string, type: string) => {\n const key = makeKey(dhId, type);\n const currentOwner = hookOwnership.current.get(key);\n\n // Only remove if this hookId is the current owner\n if (currentOwner === hookId) {\n hookOwnership.current.delete(key);\n }\n },\n []\n );\n\n const contextValue = useMemo(\n () => ({\n addState,\n removeState,\n deregisterHook,\n getState,\n }),\n [addState, getState, removeState, deregisterHook]\n );\n\n return (\n <PersistentStateContext.Provider value={contextValue}>\n {children}\n </PersistentStateContext.Provider>\n );\n}\n"],"mappings":";;;;;;AAAA,OAAOA,KAAK,IACVC,aAAa,EACbC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACH,OAAO;AAAC,SAAAC,GAAA,IAAAC,IAAA;AAqCf;AACA;AACA;AACA,OAAO,IAAMC,sBAAsB,gBACjCR,aAAa,CAAoC,IAAI,CAAC;AACxDQ,sBAAsB,CAACC,WAAW,GAAG,wBAAwB;AAyB7D,SAASC,OAAOA,CAACC,IAAY,EAAEC,IAAY,EAAsB;EAC/D,UAAAC,MAAA,CAAUF,IAAI,QAAAE,MAAA,CAAKD,IAAI;AACzB;AAIA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,uBAAuBA,CACrCC,KAAmC,EACtB;EACb,IAAQC,YAAY,GAAyBD,KAAK,CAA1CC,YAAY;IAAEC,QAAQ,GAAeF,KAAK,CAA5BE,QAAQ;IAAEC,QAAQ,GAAKH,KAAK,CAAlBG,QAAQ;EAExC,IAAMC,SAAS,GAAGf,MAAM,CAAC,IAAI,CAAC;EAC9BF,SAAS,CACP,MAAM,MAAM;IACViB,SAAS,CAACC,OAAO,GAAG,KAAK;EAC3B,CAAC,EACD,EACF,CAAC;EAED,IAAMC,mBAAmB,GAAGjB,MAAM,CAAC,KAAK,CAAC;EAEzC,IAAAkB,SAAA,GAAmBjB,QAAQ,CAAC,MAAM;MAChC,IACEkB,KAAK,CAACC,OAAO,CAACR,YAAY,CAAC,IAC3BA,YAAY,CAACS,IAAI,CAAC,CAAC,CAACC,MAAM,KAAK,CAAC,GAAGV,YAAY,CAACU,MAAM,EACtD;QACA,OAAO,IAAIC,GAAG,CACZX,YACF,CAAC;MACH;MACAK,mBAAmB,CAACD,OAAO,GAAG,IAAI;MAClC;MACA,OAAO,IAAIO,GAAG,CAA0B,CAAC;IAC3C,CAAC,CAAC;IAAAC,UAAA,GAAAC,cAAA,CAAAP,SAAA;IAZKQ,QAAQ,GAAAF,UAAA;;EAcf;EACA,IAAMG,aAAa,GAAG3B,MAAM,CAAC,IAAIuB,GAAG,CAA6B,CAAC,CAAC;EAEnE,IAAMK,QAAQ,GAAG/B,WAAW,CAC1B,CAACgC,MAAc,EAAEtB,IAAY,EAAEuB,KAAsB,KAAK;IACxD,IAAQtB,IAAI,GAAKsB,KAAK,CAAdtB,IAAI;IACZ,IAAMuB,GAAG,GAAGzB,OAAO,CAACC,IAAI,EAAEC,IAAI,CAAC;IAC/B,IAAMwB,YAAY,GAAGL,aAAa,CAACX,OAAO,CAACiB,GAAG,CAACF,GAAG,CAAC;IAEnD,IAAIC,YAAY,IAAI,IAAI,IAAIA,YAAY,KAAKH,MAAM,EAAE;MACnD,MAAM,IAAIK,KAAK,gDAAAzB,MAAA,CACkCD,IAAI,gBAAAC,MAAA,CAAaF,IAAI,uDACtE,CAAC;IACH;IAEAoB,aAAa,CAACX,OAAO,CAACmB,GAAG,CAACJ,GAAG,EAAEF,MAAM,CAAC;IAEtC,IAAId,SAAS,CAACC,OAAO,IAAIU,QAAQ,CAACO,GAAG,CAACF,GAAG,CAAC,KAAKD,KAAK,EAAE;MACpDJ,QAAQ,CAACS,GAAG,CAACJ,GAAG,EAAED,KAAK,CAAC;MACxBjB,QAAQ,CAAC,CAAC,GAAGa,QAAQ,CAACU,OAAO,CAAC,CAAC,CAAC,CAAC;IACnC;EACF,CAAC,EACD,CAACrB,SAAS,EAAEF,QAAQ,EAAEa,QAAQ,CAChC,CAAC;EAED,IAAMW,oBAAoB,GAAGrC,MAAM,CAACY,YAAY,CAAC0B,MAAM,CAACC,QAAQ,CAAC,CAAC,CAAC,CAAC;EAEpE,IAAMC,QAAQ,GAAG3C,WAAW,CAC1B,CAAK4C,EAAU,EAAEjC,IAAY,KAAqC;IAChE,IAAMuB,GAAG,GAAGzB,OAAO,CAACmC,EAAE,EAAEjC,IAAI,CAAC;IAC7B,IAAMsB,KAAK,GAAGJ,QAAQ,CAACO,GAAG,CAACF,GAAG,CAAC;IAC/B,IAAID,KAAK,IAAI,IAAI,IAAIb,mBAAmB,CAACD,OAAO,EAAE;MAChD,IAAA0B,qBAAA,GAAkBL,oBAAoB,CAACrB,OAAO,CAAC2B,IAAI,CAAC,CAAC;QAA7CC,KAAK,GAAAF,qBAAA,CAALE,KAAK;MACb,IAAMC,QAAQ,GAAGD,KAAuC;MACxDlB,QAAQ,CAACS,GAAG,CAACJ,GAAG,EAAEc,QAA2B,CAAC;MAC9C,OAAOA,QAAQ;IACjB;IAEA,OAAOf,KAAK;EACd,CAAC,EACD,CAACJ,QAAQ,CACX,CAAC;EAED,IAAMoB,WAAW,GAAGjD,WAAW,CAC7B,CAACgC,MAAc,EAAEtB,IAAY,EAAEC,IAAY,KAAK;IAC9C,IAAMuB,GAAG,GAAGzB,OAAO,CAACC,IAAI,EAAEC,IAAI,CAAC;IAC/B,IAAMwB,YAAY,GAAGL,aAAa,CAACX,OAAO,CAACiB,GAAG,CAACF,GAAG,CAAC;;IAEnD;IACA,IAAIC,YAAY,KAAKH,MAAM,EAAE;MAC3BH,QAAQ,CAACqB,MAAM,CAAChB,GAAG,CAAC;MACpBJ,aAAa,CAACX,OAAO,CAAC+B,MAAM,CAAChB,GAAG,CAAC;MACjC,IAAIhB,SAAS,CAACC,OAAO,EAAE;QACrBH,QAAQ,CAAC,CAAC,GAAGa,QAAQ,CAACU,OAAO,CAAC,CAAC,CAAC,CAAC;MACnC;IACF;EACF,CAAC,EACD,CAACrB,SAAS,EAAEF,QAAQ,EAAEa,QAAQ,CAChC,CAAC;EAED,IAAMsB,cAAc,GAAGnD,WAAW,CAChC,CAACgC,MAAc,EAAEtB,IAAY,EAAEC,IAAY,KAAK;IAC9C,IAAMuB,GAAG,GAAGzB,OAAO,CAACC,IAAI,EAAEC,IAAI,CAAC;IAC/B,IAAMwB,YAAY,GAAGL,aAAa,CAACX,OAAO,CAACiB,GAAG,CAACF,GAAG,CAAC;;IAEnD;IACA,IAAIC,YAAY,KAAKH,MAAM,EAAE;MAC3BF,aAAa,CAACX,OAAO,CAAC+B,MAAM,CAAChB,GAAG,CAAC;IACnC;EACF,CAAC,EACD,EACF,CAAC;EAED,IAAMkB,YAAY,GAAGlD,OAAO,CAC1B,OAAO;IACL6B,QAAQ;IACRkB,WAAW;IACXE,cAAc;IACdR;EACF,CAAC,CAAC,EACF,CAACZ,QAAQ,EAAEY,QAAQ,EAAEM,WAAW,EAAEE,cAAc,CAClD,CAAC;EAED,oBACE7C,IAAA,CAACC,sBAAsB,CAAC8C,QAAQ;IAACN,KAAK,EAAEK,YAAa;IAAAnC,QAAA,EAClDA;EAAQ,CACsB,CAAC;AAEtC","ignoreList":[]}
|
package/dist/RenameDialog.js
CHANGED
|
@@ -14,21 +14,15 @@ export default class RenameDialog extends PureComponent {
|
|
|
14
14
|
this.handleRenameCancel = this.handleRenameCancel.bind(this);
|
|
15
15
|
this.handleRenameSubmit = this.handleRenameSubmit.bind(this);
|
|
16
16
|
this.renameInputRef = /*#__PURE__*/React.createRef();
|
|
17
|
-
var
|
|
18
|
-
value
|
|
19
|
-
} = props;
|
|
17
|
+
var value = props.value;
|
|
20
18
|
this.state = {
|
|
21
19
|
value,
|
|
22
20
|
valueWasValidated: false
|
|
23
21
|
};
|
|
24
22
|
}
|
|
25
23
|
componentDidUpdate(prevProps) {
|
|
26
|
-
var
|
|
27
|
-
|
|
28
|
-
} = prevProps;
|
|
29
|
-
var {
|
|
30
|
-
isShown
|
|
31
|
-
} = this.props;
|
|
24
|
+
var prevIsShown = prevProps.isShown;
|
|
25
|
+
var isShown = this.props.isShown;
|
|
32
26
|
// Reset the state on dialog shown and not on the `value` prop change
|
|
33
27
|
// so the input keeps the internal value while the dialog is open.
|
|
34
28
|
// Useful in case the `value` prop update is triggered externally
|
|
@@ -38,9 +32,7 @@ export default class RenameDialog extends PureComponent {
|
|
|
38
32
|
}
|
|
39
33
|
}
|
|
40
34
|
resetState() {
|
|
41
|
-
var
|
|
42
|
-
value
|
|
43
|
-
} = this.props;
|
|
35
|
+
var value = this.props.value;
|
|
44
36
|
this.setState({
|
|
45
37
|
value,
|
|
46
38
|
valueWasValidated: false
|
|
@@ -56,22 +48,16 @@ export default class RenameDialog extends PureComponent {
|
|
|
56
48
|
});
|
|
57
49
|
}
|
|
58
50
|
handleRenameCancel() {
|
|
59
|
-
var
|
|
60
|
-
onCancel
|
|
61
|
-
} = this.props;
|
|
51
|
+
var onCancel = this.props.onCancel;
|
|
62
52
|
onCancel();
|
|
63
53
|
}
|
|
64
54
|
handleRenameSubmit(event) {
|
|
65
55
|
event.stopPropagation();
|
|
66
56
|
event.preventDefault();
|
|
67
|
-
var
|
|
68
|
-
value
|
|
69
|
-
} = this.state;
|
|
57
|
+
var value = this.state.value;
|
|
70
58
|
var newTitle = value === null || value === void 0 ? void 0 : value.trim();
|
|
71
59
|
if (newTitle !== undefined && newTitle !== '') {
|
|
72
|
-
var
|
|
73
|
-
onSubmit
|
|
74
|
-
} = this.props;
|
|
60
|
+
var onSubmit = this.props.onSubmit;
|
|
75
61
|
onSubmit(newTitle);
|
|
76
62
|
} else {
|
|
77
63
|
this.setState({
|
|
@@ -81,15 +67,13 @@ export default class RenameDialog extends PureComponent {
|
|
|
81
67
|
}
|
|
82
68
|
}
|
|
83
69
|
renderRenameDialog() {
|
|
84
|
-
var
|
|
85
|
-
isShared,
|
|
86
|
-
isOwner,
|
|
87
|
-
itemType
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
valueWasValidated
|
|
92
|
-
} = this.state;
|
|
70
|
+
var _this$props = this.props,
|
|
71
|
+
isShared = _this$props.isShared,
|
|
72
|
+
isOwner = _this$props.isOwner,
|
|
73
|
+
itemType = _this$props.itemType;
|
|
74
|
+
var _this$state = this.state,
|
|
75
|
+
value = _this$state.value,
|
|
76
|
+
valueWasValidated = _this$state.valueWasValidated;
|
|
93
77
|
return /*#__PURE__*/_jsxs("form", {
|
|
94
78
|
className: classNames('p-3', {
|
|
95
79
|
'was-validated': valueWasValidated
|
|
@@ -140,10 +124,9 @@ export default class RenameDialog extends PureComponent {
|
|
|
140
124
|
});
|
|
141
125
|
}
|
|
142
126
|
render() {
|
|
143
|
-
var
|
|
144
|
-
isShown,
|
|
145
|
-
onCancel
|
|
146
|
-
} = this.props;
|
|
127
|
+
var _this$props2 = this.props,
|
|
128
|
+
isShown = _this$props2.isShown,
|
|
129
|
+
onCancel = _this$props2.onCancel;
|
|
147
130
|
return /*#__PURE__*/_jsx(Popper, {
|
|
148
131
|
isShown: isShown,
|
|
149
132
|
onEntered: this.handleRenameDialogOpened,
|
package/dist/RenameDialog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenameDialog.js","names":["React","PureComponent","classNames","Button","Popper","jsxs","_jsxs","jsx","_jsx","RenameDialog","constructor","props","_defineProperty","handleRenameDialogOpened","bind","handleRenameInputChange","handleRenameCancel","handleRenameSubmit","renameInputRef","createRef","value","state","valueWasValidated","componentDidUpdate","prevProps","
|
|
1
|
+
{"version":3,"file":"RenameDialog.js","names":["React","PureComponent","classNames","Button","Popper","jsxs","_jsxs","jsx","_jsx","RenameDialog","constructor","props","_defineProperty","handleRenameDialogOpened","bind","handleRenameInputChange","handleRenameCancel","handleRenameSubmit","renameInputRef","createRef","value","state","valueWasValidated","componentDidUpdate","prevProps","prevIsShown","isShown","resetState","setState","_this$renameInputRef","current","focus","event","target","onCancel","stopPropagation","preventDefault","newTitle","trim","undefined","onSubmit","renderRenameDialog","_this$props","isShared","isOwner","itemType","_this$state","className","noValidate","role","onMouseDown","onMouseUp","children","htmlFor","concat","type","id","ref","onChange","required","kind","onClick","render","_this$props2","onEntered","onExited","options","placement","interactive","closeOnBlur"],"sources":["../src/RenameDialog.tsx"],"sourcesContent":["import React, {\n type ChangeEvent,\n type FormEvent,\n PureComponent,\n type ReactElement,\n type RefObject,\n} from 'react';\nimport classNames from 'classnames';\nimport { Button, Popper } from '@deephaven/components';\n\ninterface RenameDialogProps {\n isShared: boolean;\n isOwner: boolean;\n isShown: boolean;\n itemType: string;\n onSubmit: (title: string) => void;\n onCancel: () => void;\n value?: string | null;\n}\n\ninterface RenameDialogState {\n value?: string | null;\n valueWasValidated: boolean;\n}\n\nexport default class RenameDialog extends PureComponent<\n RenameDialogProps,\n RenameDialogState\n> {\n static defaultProps = {\n isShared: false,\n isOwner: true,\n itemType: 'Item',\n value: '',\n };\n\n constructor(props: RenameDialogProps) {\n super(props);\n\n this.handleRenameDialogOpened = this.handleRenameDialogOpened.bind(this);\n this.handleRenameInputChange = this.handleRenameInputChange.bind(this);\n this.handleRenameCancel = this.handleRenameCancel.bind(this);\n this.handleRenameSubmit = this.handleRenameSubmit.bind(this);\n\n this.renameInputRef = React.createRef();\n\n const { value } = props;\n\n this.state = {\n value,\n valueWasValidated: false,\n };\n }\n\n componentDidUpdate(prevProps: RenameDialogProps): void {\n const { isShown: prevIsShown } = prevProps;\n const { isShown } = this.props;\n // Reset the state on dialog shown and not on the `value` prop change\n // so the input keeps the internal value while the dialog is open.\n // Useful in case the `value` prop update is triggered externally\n // i.e. by someone else renaming the same shared dashboard\n if (isShown && !prevIsShown) {\n this.resetState();\n }\n }\n\n renameInputRef: RefObject<HTMLInputElement>;\n\n resetState(): void {\n const { value } = this.props;\n this.setState({ value, valueWasValidated: false });\n }\n\n handleRenameDialogOpened(): void {\n this.renameInputRef?.current?.focus();\n }\n\n handleRenameInputChange(event: ChangeEvent<HTMLInputElement>): void {\n this.setState({ value: event.target.value });\n }\n\n handleRenameCancel(): void {\n const { onCancel } = this.props;\n onCancel();\n }\n\n handleRenameSubmit(event: FormEvent<HTMLFormElement>): void {\n event.stopPropagation();\n event.preventDefault();\n const { value } = this.state;\n const newTitle = value?.trim();\n if (newTitle !== undefined && newTitle !== '') {\n const { onSubmit } = this.props;\n onSubmit(newTitle);\n } else {\n this.setState({ value: newTitle, valueWasValidated: true });\n }\n }\n\n renderRenameDialog(): ReactElement {\n const { isShared, isOwner, itemType } = this.props;\n const { value, valueWasValidated } = this.state;\n\n return (\n <form\n className={classNames('p-3', { 'was-validated': valueWasValidated })}\n onSubmit={this.handleRenameSubmit}\n noValidate\n role=\"presentation\"\n onMouseDown={event => {\n // block events in the NewTabScreen ItemList\n event.stopPropagation();\n }}\n onMouseUp={event => {\n event.stopPropagation();\n }}\n >\n <div className=\"form-group\">\n <label htmlFor={`rename-dialog-${itemType}-input`}>\n Rename {itemType}\n </label>\n <input\n type=\"text\"\n className=\"form-control\"\n id={`rename-dialog-${itemType}-input`}\n value={value ?? undefined}\n ref={this.renameInputRef}\n onChange={this.handleRenameInputChange}\n required\n />\n <div className=\"invalid-feedback\">\n {itemType} name cannot be empty\n </div>\n {(isShared || !isOwner) && (\n <div className=\"pt-2\">\n Renaming this {itemType} will rename for all users.\n </div>\n )}\n </div>\n\n <div className=\"text-right\">\n <Button\n kind=\"secondary\"\n className=\"mr-2\"\n onClick={this.handleRenameCancel}\n >\n Cancel\n </Button>\n <Button kind=\"primary\" type=\"submit\">\n Rename\n </Button>\n </div>\n </form>\n );\n }\n\n render(): ReactElement {\n const { isShown, onCancel } = this.props;\n return (\n <Popper\n isShown={isShown}\n onEntered={this.handleRenameDialogOpened}\n onExited={onCancel}\n options={{\n placement: 'bottom',\n }}\n interactive\n closeOnBlur\n >\n {this.renderRenameDialog()}\n </Popper>\n );\n }\n}\n"],"mappings":"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","ignoreList":[]}
|