@deephaven/dashboard 1.22.1 → 1.22.2-alpha-pivot-builder.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.
Files changed (39) hide show
  1. package/dist/BasePanel.js +48 -75
  2. package/dist/BasePanel.js.map +1 -1
  3. package/dist/Dashboard.js +32 -16
  4. package/dist/Dashboard.js.map +1 -1
  5. package/dist/DashboardEvents.js +10 -10
  6. package/dist/DashboardEvents.js.map +1 -1
  7. package/dist/DashboardLayout.js +42 -25
  8. package/dist/DashboardLayout.js.map +1 -1
  9. package/dist/DashboardPanelWrapper.js +19 -14
  10. package/dist/DashboardPanelWrapper.js.map +1 -1
  11. package/dist/DashboardUtils.js +6 -13
  12. package/dist/DashboardUtils.js.map +1 -1
  13. package/dist/LazyDashboard.js +13 -6
  14. package/dist/LazyDashboard.js.map +1 -1
  15. package/dist/NavigationEvent.js +20 -20
  16. package/dist/NavigationEvent.js.map +1 -1
  17. package/dist/PanelContextMenu.js +13 -24
  18. package/dist/PanelContextMenu.js.map +1 -1
  19. package/dist/PanelErrorBoundary.js +5 -10
  20. package/dist/PanelErrorBoundary.js.map +1 -1
  21. package/dist/PanelEvent.js +10 -11
  22. package/dist/PanelEvent.js.map +1 -1
  23. package/dist/PanelManager.js +10 -28
  24. package/dist/PanelManager.js.map +1 -1
  25. package/dist/PersistentStateContext.js +22 -19
  26. package/dist/PersistentStateContext.js.map +1 -1
  27. package/dist/RenameDialog.js +17 -34
  28. package/dist/RenameDialog.js.map +1 -1
  29. package/dist/layout/LayoutUtils.js +28 -37
  30. package/dist/layout/LayoutUtils.js.map +1 -1
  31. package/dist/layout/useDashboardPanel.js +16 -25
  32. package/dist/layout/useDashboardPanel.js.map +1 -1
  33. package/dist/redux/index.js +9 -1
  34. package/dist/redux/index.js.map +1 -1
  35. package/dist/useFiber.js +10 -4
  36. package/dist/useFiber.js.map +1 -1
  37. package/dist/usePersistentState.js +25 -16
  38. package/dist/usePersistentState.js.map +1 -1
  39. package/package.json +10 -10
@@ -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","listen","listenForPanelOpen","emit","emitPanelOpen","useListener","usePanelOpenListener","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;AAEF,OAAO,IAAM;EACXC,MAAM,EAAEC,kBAAkB;EAC1BC,IAAI,EAAEC,aAAa;EACnBC,WAAW,EAAEC;AACf,CAAC,GAAGtB,kBAAkB,CAAiCC,UAAU,CAACY,IAAI,CAAC;AAEvE,OAAO,IAAM;EACXI,MAAM,EAAEM,mBAAmB;EAC3BJ,IAAI,EAAEK,cAAc;EACpBH,WAAW,EAAEI;AACf,CAAC,GAAGzB,kBAAkB,CAAoBC,UAAU,CAACa,KAAK,CAAC;;AAE3D;;AAEA,eAAeb,UAAU","ignoreList":[]}
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":[]}
@@ -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
- component
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
- closed,
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)
@@ -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
- initialState,
19
- onChange,
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 [stateMap] = useState(() => {
28
- if (Array.isArray(initialState) && initialState.flat().length === 2 * initialState.length) {
29
- return new Map(initialState);
30
- }
31
- needsMigrationToMap.current = true;
32
- // Used to migrate from array to map
33
- return new Map();
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":"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","ignoreList":[]}
@@ -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
- isShown: prevIsShown
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
- } = this.props;
89
- var {
90
- value,
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,
@@ -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","isShown","prevIsShown","resetState","setState","_this$renameInputRef","current","focus","event","target","onCancel","stopPropagation","preventDefault","newTitle","trim","undefined","onSubmit","renderRenameDialog","isShared","isOwner","itemType","className","noValidate","role","onMouseDown","onMouseUp","children","htmlFor","concat","type","id","ref","onChange","required","kind","onClick","render","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":[]}
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":";;;AAAA,OAAOA,KAAK,IAGVC,aAAa,QAGR,OAAO;AACd,OAAOC,UAAU,MAAM,YAAY;AACnC,SAASC,MAAM,EAAEC,MAAM,QAAQ,uBAAuB;AAAC,SAAAC,IAAA,IAAAC,KAAA,EAAAC,GAAA,IAAAC,IAAA;AAiBvD,eAAe,MAAMC,YAAY,SAASR,aAAa,CAGrD;EAQAS,WAAWA,CAACC,KAAwB,EAAE;IACpC,KAAK,CAACA,KAAK,CAAC;IAACC,eAAA;IAEb,IAAI,CAACC,wBAAwB,GAAG,IAAI,CAACA,wBAAwB,CAACC,IAAI,CAAC,IAAI,CAAC;IACxE,IAAI,CAACC,uBAAuB,GAAG,IAAI,CAACA,uBAAuB,CAACD,IAAI,CAAC,IAAI,CAAC;IACtE,IAAI,CAACE,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACF,IAAI,CAAC,IAAI,CAAC;IAC5D,IAAI,CAACG,kBAAkB,GAAG,IAAI,CAACA,kBAAkB,CAACH,IAAI,CAAC,IAAI,CAAC;IAE5D,IAAI,CAACI,cAAc,gBAAGlB,KAAK,CAACmB,SAAS,CAAC,CAAC;IAEvC,IAAQC,KAAK,GAAKT,KAAK,CAAfS,KAAK;IAEb,IAAI,CAACC,KAAK,GAAG;MACXD,KAAK;MACLE,iBAAiB,EAAE;IACrB,CAAC;EACH;EAEAC,kBAAkBA,CAACC,SAA4B,EAAQ;IACrD,IAAiBC,WAAW,GAAKD,SAAS,CAAlCE,OAAO;IACf,IAAQA,OAAO,GAAK,IAAI,CAACf,KAAK,CAAtBe,OAAO;IACf;IACA;IACA;IACA;IACA,IAAIA,OAAO,IAAI,CAACD,WAAW,EAAE;MAC3B,IAAI,CAACE,UAAU,CAAC,CAAC;IACnB;EACF;EAIAA,UAAUA,CAAA,EAAS;IACjB,IAAQP,KAAK,GAAK,IAAI,CAACT,KAAK,CAApBS,KAAK;IACb,IAAI,CAACQ,QAAQ,CAAC;MAAER,KAAK;MAAEE,iBAAiB,EAAE;IAAM,CAAC,CAAC;EACpD;EAEAT,wBAAwBA,CAAA,EAAS;IAAA,IAAAgB,oBAAA;IAC/B,CAAAA,oBAAA,OAAI,CAACX,cAAc,cAAAW,oBAAA,gBAAAA,oBAAA,GAAnBA,oBAAA,CAAqBC,OAAO,cAAAD,oBAAA,eAA5BA,oBAAA,CAA8BE,KAAK,CAAC,CAAC;EACvC;EAEAhB,uBAAuBA,CAACiB,KAAoC,EAAQ;IAClE,IAAI,CAACJ,QAAQ,CAAC;MAAER,KAAK,EAAEY,KAAK,CAACC,MAAM,CAACb;IAAM,CAAC,CAAC;EAC9C;EAEAJ,kBAAkBA,CAAA,EAAS;IACzB,IAAQkB,QAAQ,GAAK,IAAI,CAACvB,KAAK,CAAvBuB,QAAQ;IAChBA,QAAQ,CAAC,CAAC;EACZ;EAEAjB,kBAAkBA,CAACe,KAAiC,EAAQ;IAC1DA,KAAK,CAACG,eAAe,CAAC,CAAC;IACvBH,KAAK,CAACI,cAAc,CAAC,CAAC;IACtB,IAAQhB,KAAK,GAAK,IAAI,CAACC,KAAK,CAApBD,KAAK;IACb,IAAMiB,QAAQ,GAAGjB,KAAK,aAALA,KAAK,uBAALA,KAAK,CAAEkB,IAAI,CAAC,CAAC;IAC9B,IAAID,QAAQ,KAAKE,SAAS,IAAIF,QAAQ,KAAK,EAAE,EAAE;MAC7C,IAAQG,QAAQ,GAAK,IAAI,CAAC7B,KAAK,CAAvB6B,QAAQ;MAChBA,QAAQ,CAACH,QAAQ,CAAC;IACpB,CAAC,MAAM;MACL,IAAI,CAACT,QAAQ,CAAC;QAAER,KAAK,EAAEiB,QAAQ;QAAEf,iBAAiB,EAAE;MAAK,CAAC,CAAC;IAC7D;EACF;EAEAmB,kBAAkBA,CAAA,EAAiB;IACjC,IAAAC,WAAA,GAAwC,IAAI,CAAC/B,KAAK;MAA1CgC,QAAQ,GAAAD,WAAA,CAARC,QAAQ;MAAEC,OAAO,GAAAF,WAAA,CAAPE,OAAO;MAAEC,QAAQ,GAAAH,WAAA,CAARG,QAAQ;IACnC,IAAAC,WAAA,GAAqC,IAAI,CAACzB,KAAK;MAAvCD,KAAK,GAAA0B,WAAA,CAAL1B,KAAK;MAAEE,iBAAiB,GAAAwB,WAAA,CAAjBxB,iBAAiB;IAEhC,oBACEhB,KAAA;MACEyC,SAAS,EAAE7C,UAAU,CAAC,KAAK,EAAE;QAAE,eAAe,EAAEoB;MAAkB,CAAC,CAAE;MACrEkB,QAAQ,EAAE,IAAI,CAACvB,kBAAmB;MAClC+B,UAAU;MACVC,IAAI,EAAC,cAAc;MACnBC,WAAW,EAAElB,KAAK,IAAI;QACpB;QACAA,KAAK,CAACG,eAAe,CAAC,CAAC;MACzB,CAAE;MACFgB,SAAS,EAAEnB,KAAK,IAAI;QAClBA,KAAK,CAACG,eAAe,CAAC,CAAC;MACzB,CAAE;MAAAiB,QAAA,gBAEF9C,KAAA;QAAKyC,SAAS,EAAC,YAAY;QAAAK,QAAA,gBACzB9C,KAAA;UAAO+C,OAAO,mBAAAC,MAAA,CAAmBT,QAAQ,WAAS;UAAAO,QAAA,GAAC,SAC1C,EAACP,QAAQ;QAAA,CACX,CAAC,eACRrC,IAAA;UACE+C,IAAI,EAAC,MAAM;UACXR,SAAS,EAAC,cAAc;UACxBS,EAAE,mBAAAF,MAAA,CAAmBT,QAAQ,WAAS;UACtCzB,KAAK,EAAEA,KAAK,aAALA,KAAK,cAALA,KAAK,GAAImB,SAAU;UAC1BkB,GAAG,EAAE,IAAI,CAACvC,cAAe;UACzBwC,QAAQ,EAAE,IAAI,CAAC3C,uBAAwB;UACvC4C,QAAQ;QAAA,CACT,CAAC,eACFrD,KAAA;UAAKyC,SAAS,EAAC,kBAAkB;UAAAK,QAAA,GAC9BP,QAAQ,EAAC,uBACZ;QAAA,CAAK,CAAC,EACL,CAACF,QAAQ,IAAI,CAACC,OAAO,kBACpBtC,KAAA;UAAKyC,SAAS,EAAC,MAAM;UAAAK,QAAA,GAAC,gBACN,EAACP,QAAQ,EAAC,6BAC1B;QAAA,CAAK,CACN;MAAA,CACE,CAAC,eAENvC,KAAA;QAAKyC,SAAS,EAAC,YAAY;QAAAK,QAAA,gBACzB5C,IAAA,CAACL,MAAM;UACLyD,IAAI,EAAC,WAAW;UAChBb,SAAS,EAAC,MAAM;UAChBc,OAAO,EAAE,IAAI,CAAC7C,kBAAmB;UAAAoC,QAAA,EAClC;QAED,CAAQ,CAAC,eACT5C,IAAA,CAACL,MAAM;UAACyD,IAAI,EAAC,SAAS;UAACL,IAAI,EAAC,QAAQ;UAAAH,QAAA,EAAC;QAErC,CAAQ,CAAC;MAAA,CACN,CAAC;IAAA,CACF,CAAC;EAEX;EAEAU,MAAMA,CAAA,EAAiB;IACrB,IAAAC,YAAA,GAA8B,IAAI,CAACpD,KAAK;MAAhCe,OAAO,GAAAqC,YAAA,CAAPrC,OAAO;MAAEQ,QAAQ,GAAA6B,YAAA,CAAR7B,QAAQ;IACzB,oBACE1B,IAAA,CAACJ,MAAM;MACLsB,OAAO,EAAEA,OAAQ;MACjBsC,SAAS,EAAE,IAAI,CAACnD,wBAAyB;MACzCoD,QAAQ,EAAE/B,QAAS;MACnBgC,OAAO,EAAE;QACPC,SAAS,EAAE;MACb,CAAE;MACFC,WAAW;MACXC,WAAW;MAAAjB,QAAA,EAEV,IAAI,CAACX,kBAAkB,CAAC;IAAC,CACpB,CAAC;EAEb;AACF;AAAC7B,eAAA,CApJoBH,YAAY,kBAIT;EACpBkC,QAAQ,EAAE,KAAK;EACfC,OAAO,EAAE,IAAI;EACbC,QAAQ,EAAE,MAAM;EAChBzB,KAAK,EAAE;AACT,CAAC","ignoreList":[]}