@deephaven/dashboard 0.22.3-embed-pandas.11 → 0.23.1-beta.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 (53) hide show
  1. package/dist/Dashboard.d.ts +2 -2
  2. package/dist/Dashboard.d.ts.map +1 -1
  3. package/dist/Dashboard.js +4 -15
  4. package/dist/Dashboard.js.map +1 -1
  5. package/dist/DashboardConstants.js.map +1 -1
  6. package/dist/DashboardLayout.d.ts +8 -8
  7. package/dist/DashboardLayout.d.ts.map +1 -1
  8. package/dist/DashboardLayout.js +11 -24
  9. package/dist/DashboardLayout.js.map +1 -1
  10. package/dist/DashboardPlugin.d.ts +10 -10
  11. package/dist/DashboardPlugin.d.ts.map +1 -1
  12. package/dist/DashboardPlugin.js +0 -1
  13. package/dist/DashboardPlugin.js.map +1 -1
  14. package/dist/DashboardUtils.d.ts +1 -1
  15. package/dist/DashboardUtils.d.ts.map +1 -1
  16. package/dist/DashboardUtils.js +1 -9
  17. package/dist/DashboardUtils.js.map +1 -1
  18. package/dist/PanelErrorBoundary.js +0 -8
  19. package/dist/PanelErrorBoundary.js.map +1 -1
  20. package/dist/PanelEvent.d.ts +12 -12
  21. package/dist/PanelEvent.d.ts.map +1 -1
  22. package/dist/PanelEvent.js.map +1 -1
  23. package/dist/PanelManager.d.ts +7 -7
  24. package/dist/PanelManager.d.ts.map +1 -1
  25. package/dist/PanelManager.js +15 -62
  26. package/dist/PanelManager.js.map +1 -1
  27. package/dist/PanelPlaceholder.d.ts.map +1 -1
  28. package/dist/PanelPlaceholder.js +1 -1
  29. package/dist/PanelPlaceholder.js.map +1 -1
  30. package/dist/index.d.ts +2 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +2 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/layout/GLPropTypes.js.map +1 -1
  35. package/dist/layout/GoldenLayoutThemeExport.js +0 -1
  36. package/dist/layout/GoldenLayoutThemeExport.js.map +1 -1
  37. package/dist/layout/LayoutUtils.d.ts +2 -2
  38. package/dist/layout/LayoutUtils.d.ts.map +1 -1
  39. package/dist/layout/LayoutUtils.js +50 -176
  40. package/dist/layout/LayoutUtils.js.map +1 -1
  41. package/dist/layout/hooks.js.map +1 -1
  42. package/dist/layout/index.js.map +1 -1
  43. package/dist/redux/actionTypes.js.map +1 -1
  44. package/dist/redux/actions.js +1 -5
  45. package/dist/redux/actions.js.map +1 -1
  46. package/dist/redux/index.js.map +1 -1
  47. package/dist/redux/reducers/dashboardData.js.map +1 -1
  48. package/dist/redux/reducers/index.js.map +1 -1
  49. package/dist/redux/selectors.d.ts +1 -1
  50. package/dist/redux/selectors.d.ts.map +1 -1
  51. package/dist/redux/selectors.js +3 -7
  52. package/dist/redux/selectors.js.map +1 -1
  53. package/package.json +10 -10
@@ -5,7 +5,6 @@ import PanelEvent from "./PanelEvent.js";
5
5
  import LayoutUtils from "./layout/LayoutUtils.js";
6
6
  import "./PanelErrorBoundary.css";
7
7
  var log = Log.module('PanelErrorBoundary');
8
-
9
8
  /**
10
9
  * Panel wrapper implementing Error Boundary and emitting Closed event.
11
10
  * Closed event has to be emitted from the wrapper instead of the panel itself
@@ -19,13 +18,11 @@ class PanelErrorBoundary extends Component {
19
18
  error: null
20
19
  };
21
20
  }
22
-
23
21
  componentDidCatch(error) {
24
22
  this.setState({
25
23
  error
26
24
  });
27
25
  }
28
-
29
26
  componentWillUnmount() {
30
27
  var {
31
28
  glContainer,
@@ -35,7 +32,6 @@ class PanelErrorBoundary extends Component {
35
32
  log.debug('componentWillUnmount', panelId);
36
33
  glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);
37
34
  }
38
-
39
35
  render() {
40
36
  var {
41
37
  children
@@ -43,7 +39,6 @@ class PanelErrorBoundary extends Component {
43
39
  var {
44
40
  error
45
41
  } = this.state;
46
-
47
42
  if (error != null) {
48
43
  return /*#__PURE__*/React.createElement("div", {
49
44
  className: "panel-error-boundary"
@@ -53,11 +48,8 @@ class PanelErrorBoundary extends Component {
53
48
  isLoaded: false
54
49
  }));
55
50
  }
56
-
57
51
  return children;
58
52
  }
59
-
60
53
  }
61
-
62
54
  export default PanelErrorBoundary;
63
55
  //# sourceMappingURL=PanelErrorBoundary.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelErrorBoundary.js","names":["React","Component","LoadingOverlay","Log","PanelEvent","LayoutUtils","log","module","PanelErrorBoundary","constructor","props","state","error","componentDidCatch","setState","componentWillUnmount","glContainer","glEventHub","panelId","getIdFromContainer","debug","emit","CLOSED","render","children"],"sources":["../src/PanelErrorBoundary.tsx"],"sourcesContent":["import React, { Component, ReactNode } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils from './layout/LayoutUtils';\nimport './PanelErrorBoundary.scss';\n\nconst log = Log.module('PanelErrorBoundary');\n\ninterface PanelErrorBoundaryProps {\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n}\n\ninterface PanelErrorBoundaryState {\n error: Error | null;\n}\n/**\n * Panel wrapper implementing Error Boundary and emitting Closed event.\n * Closed event has to be emitted from the wrapper instead of the panel itself\n * because the panel can get unmounted on errors\n * and we want to differentiate between unmount on error vs panel being intentionally closed.\n */\nclass PanelErrorBoundary extends Component<\n PanelErrorBoundaryProps,\n PanelErrorBoundaryState\n> {\n constructor(props: PanelErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ error });\n }\n\n componentWillUnmount(): void {\n const { glContainer, glEventHub } = this.props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n log.debug('componentWillUnmount', panelId);\n glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);\n }\n\n render(): ReactNode {\n const { children } = this.props;\n const { error } = this.state;\n if (error != null) {\n return (\n <div className=\"panel-error-boundary\">\n <LoadingOverlay\n errorMessage={`${error}`}\n isLoading={false}\n isLoaded={false}\n />\n </div>\n );\n }\n return children;\n }\n}\n\nexport default PanelErrorBoundary;\n"],"mappings":"AAAA,OAAOA,KAAP,IAAgBC,SAAhB,QAA4C,OAA5C;AACA,SAASC,cAAT,QAA+B,uBAA/B;AAEA,OAAOC,GAAP,MAAgB,gBAAhB;OACOC,U;OACAC,W;;AAGP,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAJ,CAAW,oBAAX,CAAZ;;AAWA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,kBAAN,SAAiCP,SAAjC,CAGE;EACAQ,WAAW,CAACC,KAAD,EAAiC;IAC1C,MAAMA,KAAN;IACA,KAAKC,KAAL,GAAa;MAAEC,KAAK,EAAE;IAAT,CAAb;EACD;;EAEDC,iBAAiB,CAACD,KAAD,EAAqB;IACpC,KAAKE,QAAL,CAAc;MAAEF;IAAF,CAAd;EACD;;EAEDG,oBAAoB,GAAS;IAC3B,IAAM;MAAEC,WAAF;MAAeC;IAAf,IAA8B,KAAKP,KAAzC;IACA,IAAMQ,OAAO,GAAGb,WAAW,CAACc,kBAAZ,CAA+BH,WAA/B,CAAhB;IACAV,GAAG,CAACc,KAAJ,CAAU,sBAAV,EAAkCF,OAAlC;IACAD,UAAU,CAACI,IAAX,CAAgBjB,UAAU,CAACkB,MAA3B,EAAmCJ,OAAnC,EAA4CF,WAA5C;EACD;;EAEDO,MAAM,GAAc;IAClB,IAAM;MAAEC;IAAF,IAAe,KAAKd,KAA1B;IACA,IAAM;MAAEE;IAAF,IAAY,KAAKD,KAAvB;;IACA,IAAIC,KAAK,IAAI,IAAb,EAAmB;MACjB,oBACE;QAAK,SAAS,EAAC;MAAf,gBACE,oBAAC,cAAD;QACE,YAAY,YAAKA,KAAL,CADd;QAEE,SAAS,EAAE,KAFb;QAGE,QAAQ,EAAE;MAHZ,EADF,CADF;IASD;;IACD,OAAOY,QAAP;EACD;;AAhCD;;AAmCF,eAAehB,kBAAf"}
1
+ {"version":3,"file":"PanelErrorBoundary.js","names":["React","Component","LoadingOverlay","Log","PanelEvent","LayoutUtils","log","module","PanelErrorBoundary","constructor","props","state","error","componentDidCatch","setState","componentWillUnmount","glContainer","glEventHub","panelId","getIdFromContainer","debug","emit","CLOSED","render","children"],"sources":["../src/PanelErrorBoundary.tsx"],"sourcesContent":["import React, { Component, ReactNode } from 'react';\nimport { LoadingOverlay } from '@deephaven/components';\nimport type { Container, EventEmitter } from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils from './layout/LayoutUtils';\nimport './PanelErrorBoundary.scss';\n\nconst log = Log.module('PanelErrorBoundary');\n\ninterface PanelErrorBoundaryProps {\n children: ReactNode;\n glContainer: Container;\n glEventHub: EventEmitter;\n}\n\ninterface PanelErrorBoundaryState {\n error: Error | null;\n}\n/**\n * Panel wrapper implementing Error Boundary and emitting Closed event.\n * Closed event has to be emitted from the wrapper instead of the panel itself\n * because the panel can get unmounted on errors\n * and we want to differentiate between unmount on error vs panel being intentionally closed.\n */\nclass PanelErrorBoundary extends Component<\n PanelErrorBoundaryProps,\n PanelErrorBoundaryState\n> {\n constructor(props: PanelErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n componentDidCatch(error: Error): void {\n this.setState({ error });\n }\n\n componentWillUnmount(): void {\n const { glContainer, glEventHub } = this.props;\n const panelId = LayoutUtils.getIdFromContainer(glContainer);\n log.debug('componentWillUnmount', panelId);\n glEventHub.emit(PanelEvent.CLOSED, panelId, glContainer);\n }\n\n render(): ReactNode {\n const { children } = this.props;\n const { error } = this.state;\n if (error != null) {\n return (\n <div className=\"panel-error-boundary\">\n <LoadingOverlay\n errorMessage={`${error}`}\n isLoading={false}\n isLoaded={false}\n />\n </div>\n );\n }\n return children;\n }\n}\n\nexport default PanelErrorBoundary;\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAmB,OAAO;AACnD,SAASC,cAAc,QAAQ,uBAAuB;AAEtD,OAAOC,GAAG,MAAM,gBAAgB;AAAC,OAC1BC,UAAU;AAAA,OACVC,WAAW;AAAA;AAGlB,IAAMC,GAAG,GAAGH,GAAG,CAACI,MAAM,CAAC,oBAAoB,CAAC;AAW5C;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,kBAAkB,SAASP,SAAS,CAGxC;EACAQ,WAAW,CAACC,KAA8B,EAAE;IAC1C,KAAK,CAACA,KAAK,CAAC;IACZ,IAAI,CAACC,KAAK,GAAG;MAAEC,KAAK,EAAE;IAAK,CAAC;EAC9B;EAEAC,iBAAiB,CAACD,KAAY,EAAQ;IACpC,IAAI,CAACE,QAAQ,CAAC;MAAEF;IAAM,CAAC,CAAC;EAC1B;EAEAG,oBAAoB,GAAS;IAC3B,IAAM;MAAEC,WAAW;MAAEC;IAAW,CAAC,GAAG,IAAI,CAACP,KAAK;IAC9C,IAAMQ,OAAO,GAAGb,WAAW,CAACc,kBAAkB,CAACH,WAAW,CAAC;IAC3DV,GAAG,CAACc,KAAK,CAAC,sBAAsB,EAAEF,OAAO,CAAC;IAC1CD,UAAU,CAACI,IAAI,CAACjB,UAAU,CAACkB,MAAM,EAAEJ,OAAO,EAAEF,WAAW,CAAC;EAC1D;EAEAO,MAAM,GAAc;IAClB,IAAM;MAAEC;IAAS,CAAC,GAAG,IAAI,CAACd,KAAK;IAC/B,IAAM;MAAEE;IAAM,CAAC,GAAG,IAAI,CAACD,KAAK;IAC5B,IAAIC,KAAK,IAAI,IAAI,EAAE;MACjB,oBACE;QAAK,SAAS,EAAC;MAAsB,gBACnC,oBAAC,cAAc;QACb,YAAY,YAAKA,KAAK,CAAG;QACzB,SAAS,EAAE,KAAM;QACjB,QAAQ,EAAE;MAAM,EAChB,CACE;IAEV;IACA,OAAOY,QAAQ;EACjB;AACF;AAEA,eAAehB,kBAAkB"}
@@ -1,17 +1,17 @@
1
- declare const _default: Readonly<{
2
- FOCUS: string;
3
- MOUNT: string;
4
- UNMOUNT: string;
5
- TITLE_CHANGED: string;
6
- REOPEN: string;
7
- DELETE: string;
8
- CLONED: string;
9
- CLOSED: string;
10
- OPEN: string;
11
- CLOSE: string;
12
- }>;
13
1
  /**
14
2
  * Events emitted by panels and to control panels
15
3
  */
4
+ declare const _default: Readonly<{
5
+ FOCUS: "PanelEvent.FOCUS";
6
+ MOUNT: "PanelEvent.MOUNT";
7
+ UNMOUNT: "PanelEvent.UNMOUNT";
8
+ TITLE_CHANGED: "PanelEvent.TITLE_CHANGED";
9
+ REOPEN: "PanelEvent.REOPEN";
10
+ DELETE: "PanelEvent.DELETE";
11
+ CLONED: "PanelEvent.CLONED";
12
+ CLOSED: "PanelEvent.CLOSED";
13
+ OPEN: "PanelEvent.OPEN";
14
+ CLOSE: "PanelEvent.CLOSE";
15
+ }>;
16
16
  export default _default;
17
17
  //# sourceMappingURL=PanelEvent.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelEvent.d.ts","sourceRoot":"","sources":["../src/PanelEvent.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA;;GAEG;AACH,wBAgCG"}
1
+ {"version":3,"file":"PanelEvent.d.ts","sourceRoot":"","sources":["../src/PanelEvent.ts"],"names":[],"mappings":"AAAA;;GAEG;;;;;;;;;;;;;AACH,wBAgCG"}
@@ -1 +1 @@
1
- {"version":3,"file":"PanelEvent.js","names":["Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","DELETE","CLONED","CLOSED","OPEN","CLOSE"],"sources":["../src/PanelEvent.ts"],"sourcesContent":["/**\n * Events emitted by panels and to control panels\n */\nexport default 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 // 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"],"mappings":"AAAA;AACA;AACA;AACA,eAAeA,MAAM,CAACC,MAAP,CAAc;EAC3B;EACAC,KAAK,EAAE,kBAFoB;EAI3B;EACAC,KAAK,EAAE,kBALoB;EAO3B;EACAC,OAAO,EAAE,oBARkB;EAU3B;EACAC,aAAa,EAAE,0BAXY;EAa3B;EACAC,MAAM,EAAE,mBAdmB;EAgB3B;EACAC,MAAM,EAAE,mBAjBmB;EAmB3B;EACAC,MAAM,EAAE,mBApBmB;EAsB3B;EACAC,MAAM,EAAE,mBAvBmB;EAyB3B;EACA;EACA;EACAC,IAAI,EAAE,iBA5BqB;EA8B3B;EACAC,KAAK,EAAE;AA/BoB,CAAd,CAAf"}
1
+ {"version":3,"file":"PanelEvent.js","names":["Object","freeze","FOCUS","MOUNT","UNMOUNT","TITLE_CHANGED","REOPEN","DELETE","CLONED","CLOSED","OPEN","CLOSE"],"sources":["../src/PanelEvent.ts"],"sourcesContent":["/**\n * Events emitted by panels and to control panels\n */\nexport default 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 // 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"],"mappings":"AAAA;AACA;AACA;AACA,eAAeA,MAAM,CAACC,MAAM,CAAC;EAC3B;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,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACAC,MAAM,EAAE,mBAAmB;EAE3B;EACA;EACA;EACAC,IAAI,EAAE,iBAAiB;EAEvB;EACAC,KAAK,EAAE;AACT,CAAC,CAAC"}
@@ -2,16 +2,16 @@ import { ComponentType } from 'react';
2
2
  import GoldenLayout from '@deephaven/golden-layout';
3
3
  import type { Container, ContentItem, ItemConfigType, ReactComponentConfig } from '@deephaven/golden-layout';
4
4
  import { PanelComponent, PanelComponentType, PanelProps } from './DashboardPlugin';
5
- export declare type PanelHydraterFunction = (name: string, props: PanelProps) => PanelProps;
6
- export declare type PanelDehydraterFunction = (name: string, config: ReactComponentConfig) => ReactComponentConfig;
7
- export declare type ClosedPanel = ReactComponentConfig;
8
- export declare type ClosedPanels = ClosedPanel[];
9
- export declare type OpenedPanelMap = Map<string | string[], PanelComponent>;
10
- export declare type PanelsUpdateData = {
5
+ export type PanelHydraterFunction = (name: string, props: PanelProps) => PanelProps;
6
+ export type PanelDehydraterFunction = (name: string, config: ReactComponentConfig) => ReactComponentConfig;
7
+ export type ClosedPanel = ReactComponentConfig;
8
+ export type ClosedPanels = ClosedPanel[];
9
+ export type OpenedPanelMap = Map<string | string[], PanelComponent>;
10
+ export type PanelsUpdateData = {
11
11
  closed: ClosedPanels;
12
12
  openedMap: OpenedPanelMap;
13
13
  };
14
- export declare type PanelsUpdateCallback = (panelUpdateData: PanelsUpdateData) => void;
14
+ export type PanelsUpdateCallback = (panelUpdateData: PanelsUpdateData) => void;
15
15
  /**
16
16
  * Class to keep track of which panels are open, have been closed, and also events to close panels.
17
17
  */
@@ -1 +1 @@
1
- {"version":3,"file":"PanelManager.d.ts","sourceRoot":"","sources":["../src/PanelManager.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PanelManager.d.ts","sourceRoot":"","sources":["../src/PanelManager.ts"],"names":[],"mappings":"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"}
@@ -1,15 +1,11 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import Log from '@deephaven/log';
8
5
  import PanelEvent from "./PanelEvent.js";
9
6
  import LayoutUtils, { isReactComponentConfig } from "./layout/LayoutUtils.js";
10
7
  import { isWrappedComponent } from "./DashboardPlugin.js";
11
8
  var log = Log.module('PanelManager');
12
-
13
9
  /**
14
10
  * Class to keep track of which panels are open, have been closed, and also events to close panels.
15
11
  */
@@ -28,24 +24,17 @@ class PanelManager {
28
24
  var openedMap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : new Map();
29
25
  var closed = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : [];
30
26
  var onPanelsUpdated = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : () => undefined;
31
-
32
27
  _defineProperty(this, "layout", void 0);
33
-
34
28
  _defineProperty(this, "hydrateComponent", void 0);
35
-
36
29
  _defineProperty(this, "dehydrateComponent", void 0);
37
-
38
30
  _defineProperty(this, "onPanelsUpdated", void 0);
39
-
40
31
  _defineProperty(this, "closed", void 0);
41
-
42
32
  _defineProperty(this, "openedMap", void 0);
43
-
44
33
  this.handleFocus = this.handleFocus.bind(this);
45
- this.handleMount = this.handleMount.bind(this); // Panel can be unmounted on error but still keep the tab until it's closed
34
+ this.handleMount = this.handleMount.bind(this);
35
+ // Panel can be unmounted on error but still keep the tab until it's closed
46
36
  // Use PanelEvent.MOUNT/UNMOUNT to track open (active) panels
47
37
  // and PanelEvent.CLOSED for cleanup (delete links, add panel to closed panels list, etc)
48
-
49
38
  this.handleUnmount = this.handleUnmount.bind(this);
50
39
  this.handleReopen = this.handleReopen.bind(this);
51
40
  this.handleDeleted = this.handleDeleted.bind(this);
@@ -54,14 +43,15 @@ class PanelManager {
54
43
  this.layout = layout;
55
44
  this.hydrateComponent = hydrateComponent;
56
45
  this.dehydrateComponent = dehydrateComponent;
57
- this.onPanelsUpdated = onPanelsUpdated; // Store the opened and closed panels
46
+ this.onPanelsUpdated = onPanelsUpdated;
58
47
 
59
- this.openedMap = new Map(openedMap); // Closed panels are stored in their dehydrated state
48
+ // Store the opened and closed panels
49
+ this.openedMap = new Map(openedMap);
60
50
 
51
+ // Closed panels are stored in their dehydrated state
61
52
  this.closed = [...closed];
62
53
  this.startListening();
63
54
  }
64
-
65
55
  startListening() {
66
56
  var {
67
57
  eventHub
@@ -72,7 +62,8 @@ class PanelManager {
72
62
  eventHub.on(PanelEvent.REOPEN, this.handleReopen);
73
63
  eventHub.on(PanelEvent.DELETE, this.handleDeleted);
74
64
  eventHub.on(PanelEvent.CLOSED, this.handleClosed);
75
- eventHub.on(PanelEvent.CLOSE, this.handleControlClose); // PanelEvent.OPEN should be listened to by plugins to open a panel
65
+ eventHub.on(PanelEvent.CLOSE, this.handleControlClose);
66
+ // PanelEvent.OPEN should be listened to by plugins to open a panel
76
67
  }
77
68
 
78
69
  stopListening() {
@@ -87,15 +78,12 @@ class PanelManager {
87
78
  eventHub.off(PanelEvent.CLOSED, this.handleClosed);
88
79
  eventHub.off(PanelEvent.CLOSE, this.handleControlClose);
89
80
  }
90
-
91
81
  getClosedPanelConfigsOfType(typeString) {
92
82
  return this.closed.filter(panel => panel.component === typeString);
93
83
  }
94
-
95
84
  getOpenedPanels() {
96
85
  return Array.from(this.openedMap.values());
97
86
  }
98
-
99
87
  getOpenedPanelConfigs() {
100
88
  return this.getOpenedPanels().map(panel => {
101
89
  var {
@@ -104,18 +92,14 @@ class PanelManager {
104
92
  return LayoutUtils.getComponentConfigFromContainer(glContainer);
105
93
  });
106
94
  }
107
-
108
95
  getOpenedPanelConfigsOfType(typeString) {
109
96
  return this.getOpenedPanelConfigs().filter(config => config != null && isReactComponentConfig(config) && config.component === typeString);
110
97
  }
111
-
112
98
  getOpenedPanelById(panelId) {
113
99
  return this.openedMap.get(panelId);
114
100
  }
115
-
116
101
  getContainerByPanelId(panelId) {
117
102
  var _ref;
118
-
119
103
  var stack = LayoutUtils.getStackForConfig(this.layout.root, {
120
104
  id: panelId
121
105
  });
@@ -123,58 +107,45 @@ class PanelManager {
123
107
  id: panelId
124
108
  })) !== null && _ref !== void 0 ? _ref : null;
125
109
  }
126
-
127
110
  getLastUsedPanel(matcher) {
128
111
  var opened = this.getOpenedPanels();
129
-
130
112
  for (var i = opened.length - 1; i >= 0; i -= 1) {
131
113
  var _panel = opened[i];
132
-
133
114
  if (matcher == null || matcher(_panel)) {
134
115
  return _panel;
135
116
  }
136
117
  }
137
-
138
118
  return undefined;
139
119
  }
140
-
141
120
  getLastUsedPanelOfType(type) {
142
121
  return this.getLastUsedPanelOfTypes([type]);
143
122
  }
144
-
145
123
  getLastUsedPanelOfTypes(types) {
146
124
  return this.getLastUsedPanel(panel => types.some(type => isWrappedComponent(type) && panel instanceof type.WrappedComponent || !isWrappedComponent(type) && panel instanceof type));
147
125
  }
148
-
149
126
  updatePanel(panel) {
150
127
  var panelId = LayoutUtils.getIdFromPanel(panel);
151
-
152
128
  if (panelId == null) {
153
129
  log.error('updatePanel Panel did not have an ID', panel);
154
130
  return;
155
131
  }
156
-
157
- log.debug2("Updating panel ID ".concat(panelId, " in open panels map")); // Delete the entry before it's set to maintain correct ordering in the open panels map.
132
+ log.debug2("Updating panel ID ".concat(panelId, " in open panels map"));
133
+ // Delete the entry before it's set to maintain correct ordering in the open panels map.
158
134
  // The last updated (focused) panel should be the last inserted.
159
135
  // Deleting the entry from the map directly instead of calling this.removePanel to skip the checks.
160
-
161
136
  this.openedMap.delete(panelId);
162
137
  this.openedMap.set(panelId, panel);
163
138
  }
164
-
165
139
  removePanel(panel) {
166
140
  var panelId = LayoutUtils.getIdFromPanel(panel);
167
-
168
141
  if (panelId == null) {
169
142
  log.error('removePanel Panel did not have an ID', panel);
170
143
  return;
171
144
  }
172
-
173
145
  if (!this.openedMap.has(panelId)) {
174
146
  log.error("Missing panel ID ".concat(panelId, " in open panels map"));
175
147
  return;
176
148
  }
177
-
178
149
  if (this.openedMap.get(panelId) !== panel) {
179
150
  // We mount a new panel before un-mounting the existing one
180
151
  // when replacing existing panels in openComponent/openComponentInStack.
@@ -182,47 +153,41 @@ class PanelManager {
182
153
  log.debug("Panel argument doesn't match the open panels map entry for ".concat(panelId, ", removePanel ignored"));
183
154
  return;
184
155
  }
185
-
186
156
  log.debug2("Removing panel ID ".concat(panelId, " from open panels map"));
187
157
  this.openedMap.delete(panelId);
188
158
  }
189
-
190
159
  removeClosedPanelConfig(panelConfig) {
191
- var index = this.closed.findIndex(closedConfig => closedConfig === panelConfig || closedConfig.id != null && panelConfig.id && closedConfig.id === panelConfig.id);
192
-
160
+ var index = this.closed.findIndex(closedConfig => closedConfig === panelConfig || closedConfig.id != null && panelConfig.id != null && closedConfig.id === panelConfig.id);
193
161
  if (index >= 0) {
194
162
  this.closed.splice(index, 1);
195
163
  }
196
164
  }
197
-
198
165
  handleFocus(panel) {
199
166
  log.debug2('Focus: ', panel);
200
167
  this.updatePanel(panel);
201
168
  }
202
-
203
169
  handleMount(panel) {
204
170
  log.debug2('Mount: ', panel);
205
171
  this.updatePanel(panel);
206
172
  this.sendUpdate();
207
173
  }
208
-
209
174
  handleUnmount(panel) {
210
175
  log.debug2('Unmount: ', panel);
211
176
  this.removePanel(panel);
212
177
  this.sendUpdate();
213
178
  }
179
+
214
180
  /**
215
181
  *
216
182
  * @param panelConfig The config to hydrate and load
217
183
  * @param replaceConfig The config to place
218
184
  */
219
-
220
-
221
185
  handleReopen(panelConfig, replaceConfig) {
222
186
  log.debug2('Reopen:', panelConfig, replaceConfig);
223
- this.removeClosedPanelConfig(panelConfig); // Don't need to send an update yet, it will get sent when component is mounted
224
- // Rehydrate the panel before adding it back
187
+ this.removeClosedPanelConfig(panelConfig);
188
+ // Don't need to send an update yet, it will get sent when component is mounted
225
189
 
190
+ // Rehydrate the panel before adding it back
226
191
  var {
227
192
  component
228
193
  } = panelConfig;
@@ -230,11 +195,9 @@ class PanelManager {
230
195
  props
231
196
  } = panelConfig;
232
197
  props = this.hydrateComponent(component, props);
233
-
234
198
  var config = _objectSpread(_objectSpread({}, panelConfig), {}, {
235
199
  props
236
200
  });
237
-
238
201
  var {
239
202
  root
240
203
  } = this.layout;
@@ -244,13 +207,11 @@ class PanelManager {
244
207
  replaceConfig
245
208
  });
246
209
  }
247
-
248
210
  handleDeleted(panelConfig) {
249
211
  log.debug2('Deleted:', panelConfig);
250
212
  this.removeClosedPanelConfig(panelConfig);
251
213
  this.sendUpdate();
252
214
  }
253
-
254
215
  handleClosed(panelId, glContainer) {
255
216
  // Panel component should be already unmounted at this point
256
217
  // so the emitted event sends the container object instead of the panel.
@@ -258,7 +219,6 @@ class PanelManager {
258
219
  this.addClosedPanel(glContainer);
259
220
  this.sendUpdate();
260
221
  }
261
-
262
222
  handleControlClose(id) {
263
223
  var config = {
264
224
  id
@@ -268,19 +228,15 @@ class PanelManager {
268
228
  } = this.layout;
269
229
  LayoutUtils.closeComponent(root, config);
270
230
  }
271
-
272
231
  addClosedPanel(glContainer) {
273
232
  var config = LayoutUtils.getComponentConfigFromContainer(glContainer);
274
-
275
233
  if (config && isReactComponentConfig(config)) {
276
234
  var dehydratedConfig = this.dehydrateComponent(config.component, config);
277
-
278
235
  if (dehydratedConfig != null) {
279
236
  this.closed.push(dehydratedConfig);
280
237
  }
281
238
  }
282
239
  }
283
-
284
240
  sendUpdate() {
285
241
  var {
286
242
  closed,
@@ -291,10 +247,7 @@ class PanelManager {
291
247
  openedMap: new Map(openedMap)
292
248
  });
293
249
  }
294
-
295
250
  }
296
-
297
251
  _defineProperty(PanelManager, "MAX_CLOSED_PANEL_COUNT", 100);
298
-
299
252
  export default PanelManager;
300
253
  //# sourceMappingURL=PanelManager.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelManager.js","names":["Log","PanelEvent","LayoutUtils","isReactComponentConfig","isWrappedComponent","log","module","PanelManager","constructor","layout","hydrateComponent","name","props","dehydrateComponent","config","openedMap","Map","closed","onPanelsUpdated","undefined","handleFocus","bind","handleMount","handleUnmount","handleReopen","handleDeleted","handleClosed","handleControlClose","startListening","eventHub","on","FOCUS","MOUNT","UNMOUNT","REOPEN","DELETE","CLOSED","CLOSE","stopListening","off","getClosedPanelConfigsOfType","typeString","filter","panel","component","getOpenedPanels","Array","from","values","getOpenedPanelConfigs","map","glContainer","getComponentConfigFromContainer","getOpenedPanelConfigsOfType","getOpenedPanelById","panelId","get","getContainerByPanelId","stack","getStackForConfig","root","id","getContentItemInStack","getLastUsedPanel","matcher","opened","i","length","getLastUsedPanelOfType","type","getLastUsedPanelOfTypes","types","some","WrappedComponent","updatePanel","getIdFromPanel","error","debug2","delete","set","removePanel","has","debug","removeClosedPanelConfig","panelConfig","index","findIndex","closedConfig","splice","sendUpdate","replaceConfig","openComponent","addClosedPanel","closeComponent","dehydratedConfig","push"],"sources":["../src/PanelManager.ts"],"sourcesContent":["import { ComponentType } from 'react';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ContentItem,\n ItemConfigType,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n isWrappedComponent,\n PanelComponent,\n PanelComponentType,\n PanelProps,\n} from './DashboardPlugin';\n\nconst log = Log.module('PanelManager');\n\nexport type PanelHydraterFunction = (\n name: string,\n props: PanelProps\n) => PanelProps;\n\nexport type PanelDehydraterFunction = (\n name: string,\n config: ReactComponentConfig\n) => ReactComponentConfig;\n\nexport type ClosedPanel = ReactComponentConfig;\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 /**\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) => props,\n dehydrateComponent: PanelDehydraterFunction = (name, config) => config,\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.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 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.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\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.DELETE, this.handleDeleted);\n eventHub.off(PanelEvent.CLOSED, this.handleClosed);\n eventHub.off(PanelEvent.CLOSE, this.handleControlClose);\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(): (ItemConfigType | 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 &&\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 /**\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<ItemConfigType>\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 LayoutUtils.openComponent({ root, config, replaceConfig });\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 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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"}
1
+ {"version":3,"file":"PanelManager.js","names":["Log","PanelEvent","LayoutUtils","isReactComponentConfig","isWrappedComponent","log","module","PanelManager","constructor","layout","hydrateComponent","name","props","dehydrateComponent","config","openedMap","Map","closed","onPanelsUpdated","undefined","handleFocus","bind","handleMount","handleUnmount","handleReopen","handleDeleted","handleClosed","handleControlClose","startListening","eventHub","on","FOCUS","MOUNT","UNMOUNT","REOPEN","DELETE","CLOSED","CLOSE","stopListening","off","getClosedPanelConfigsOfType","typeString","filter","panel","component","getOpenedPanels","Array","from","values","getOpenedPanelConfigs","map","glContainer","getComponentConfigFromContainer","getOpenedPanelConfigsOfType","getOpenedPanelById","panelId","get","getContainerByPanelId","stack","getStackForConfig","root","id","getContentItemInStack","getLastUsedPanel","matcher","opened","i","length","getLastUsedPanelOfType","type","getLastUsedPanelOfTypes","types","some","WrappedComponent","updatePanel","getIdFromPanel","error","debug2","delete","set","removePanel","has","debug","removeClosedPanelConfig","panelConfig","index","findIndex","closedConfig","splice","sendUpdate","replaceConfig","openComponent","addClosedPanel","closeComponent","dehydratedConfig","push"],"sources":["../src/PanelManager.ts"],"sourcesContent":["import { ComponentType } from 'react';\nimport GoldenLayout from '@deephaven/golden-layout';\nimport type {\n Container,\n ContentItem,\n ItemConfigType,\n ReactComponentConfig,\n} from '@deephaven/golden-layout';\nimport Log from '@deephaven/log';\nimport PanelEvent from './PanelEvent';\nimport LayoutUtils, { isReactComponentConfig } from './layout/LayoutUtils';\nimport {\n isWrappedComponent,\n PanelComponent,\n PanelComponentType,\n PanelProps,\n} from './DashboardPlugin';\n\nconst log = Log.module('PanelManager');\n\nexport type PanelHydraterFunction = (\n name: string,\n props: PanelProps\n) => PanelProps;\n\nexport type PanelDehydraterFunction = (\n name: string,\n config: ReactComponentConfig\n) => ReactComponentConfig;\n\nexport type ClosedPanel = ReactComponentConfig;\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 /**\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) => props,\n dehydrateComponent: PanelDehydraterFunction = (name, config) => config,\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.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 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.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\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.DELETE, this.handleDeleted);\n eventHub.off(PanelEvent.CLOSED, this.handleClosed);\n eventHub.off(PanelEvent.CLOSE, this.handleControlClose);\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(): (ItemConfigType | 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 /**\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<ItemConfigType>\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 LayoutUtils.openComponent({ root, config, replaceConfig });\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 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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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PanelPlaceholder.d.ts","sourceRoot":"","sources":["../src/PanelPlaceholder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,mFASrB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"PanelPlaceholder.d.ts","sourceRoot":"","sources":["../src/PanelPlaceholder.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuB,MAAM,OAAO,CAAC;AAC5C,OAAO,yBAAyB,CAAC;AAEjC,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C;;GAEG;AACH,QAAA,MAAM,gBAAgB,mFASrB,CAAC;AAIF,eAAe,gBAAgB,CAAC"}
@@ -1,7 +1,6 @@
1
1
  import React from 'react';
2
2
  import "./PanelPlaceholder.css";
3
3
  import LayoutUtils from "./layout/LayoutUtils.js";
4
-
5
4
  /**
6
5
  * Displays a placeholder for unregistered panel types.
7
6
  */
@@ -14,5 +13,6 @@ var PanelPlaceholder = /*#__PURE__*/React.forwardRef((props, ref) => {
14
13
  className: "panel-placeholder"
15
14
  }, "Component \"", component, "\" is not registered.");
16
15
  });
16
+ PanelPlaceholder.displayName = 'PanelPlaceholder';
17
17
  export default PanelPlaceholder;
18
18
  //# sourceMappingURL=PanelPlaceholder.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"PanelPlaceholder.js","names":["React","LayoutUtils","PanelPlaceholder","forwardRef","props","ref","component","getComponentNameFromPanel"],"sources":["../src/PanelPlaceholder.tsx"],"sourcesContent":["import React, { ForwardedRef } from 'react';\nimport './PanelPlaceholder.scss';\nimport LayoutUtils from './layout/LayoutUtils';\nimport { PanelProps } from './DashboardPlugin';\n\n/**\n * Displays a placeholder for unregistered panel types.\n */\nconst PanelPlaceholder = React.forwardRef(\n (props: PanelProps, ref: ForwardedRef<HTMLDivElement>) => {\n const component = LayoutUtils.getComponentNameFromPanel({ props });\n return (\n <div ref={ref} className=\"panel-placeholder\">\n Component &quot;{component}&quot; is not registered.\n </div>\n );\n }\n);\n\nexport default PanelPlaceholder;\n"],"mappings":"AAAA,OAAOA,KAAP,MAAoC,OAApC;;OAEOC,W;;AAGP;AACA;AACA;AACA,IAAMC,gBAAgB,gBAAGF,KAAK,CAACG,UAAN,CACvB,CAACC,KAAD,EAAoBC,GAApB,KAA0D;EACxD,IAAMC,SAAS,GAAGL,WAAW,CAACM,yBAAZ,CAAsC;IAAEH;EAAF,CAAtC,CAAlB;EACA,oBACE;IAAK,GAAG,EAAEC,GAAV;IAAe,SAAS,EAAC;EAAzB,mBACmBC,SADnB,0BADF;AAKD,CARsB,CAAzB;AAWA,eAAeJ,gBAAf"}
1
+ {"version":3,"file":"PanelPlaceholder.js","names":["React","LayoutUtils","PanelPlaceholder","forwardRef","props","ref","component","getComponentNameFromPanel","displayName"],"sources":["../src/PanelPlaceholder.tsx"],"sourcesContent":["import React, { ForwardedRef } from 'react';\nimport './PanelPlaceholder.scss';\nimport LayoutUtils from './layout/LayoutUtils';\nimport { PanelProps } from './DashboardPlugin';\n\n/**\n * Displays a placeholder for unregistered panel types.\n */\nconst PanelPlaceholder = React.forwardRef(\n (props: PanelProps, ref: ForwardedRef<HTMLDivElement>) => {\n const component = LayoutUtils.getComponentNameFromPanel({ props });\n return (\n <div ref={ref} className=\"panel-placeholder\">\n Component &quot;{component}&quot; is not registered.\n </div>\n );\n }\n);\n\nPanelPlaceholder.displayName = 'PanelPlaceholder';\n\nexport default PanelPlaceholder;\n"],"mappings":"AAAA,OAAOA,KAAK,MAAwB,OAAO;AAAC;AAAA,OAErCC,WAAW;AAGlB;AACA;AACA;AACA,IAAMC,gBAAgB,gBAAGF,KAAK,CAACG,UAAU,CACvC,CAACC,KAAiB,EAAEC,GAAiC,KAAK;EACxD,IAAMC,SAAS,GAAGL,WAAW,CAACM,yBAAyB,CAAC;IAAEH;EAAM,CAAC,CAAC;EAClE,oBACE;IAAK,GAAG,EAAEC,GAAI;IAAC,SAAS,EAAC;EAAmB,mBACzBC,SAAS,0BACtB;AAEV,CAAC,CACF;AAEDJ,gBAAgB,CAACM,WAAW,GAAG,kBAAkB;AAEjD,eAAeN,gBAAgB"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,5 @@
1
+ import Dashboard from './Dashboard';
2
+ export default Dashboard;
1
3
  export * from './Dashboard';
2
4
  export * from './DashboardConstants';
3
5
  export * from './DashboardPlugin';
@@ -10,5 +12,4 @@ export * from './PanelManager';
10
12
  export { default as PanelEvent } from './PanelEvent';
11
13
  export { default as PanelErrorBoundary } from './PanelErrorBoundary';
12
14
  export { default as PanelManager } from './PanelManager';
13
- export { default } from './Dashboard';
14
15
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEzD,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,aAAa,CAAC;AAEpC,eAAe,SAAS,CAAC;AAEzB,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC7D,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,5 @@
1
+ import Dashboard from "./Dashboard.js";
2
+ export default Dashboard;
1
3
  export * from "./Dashboard.js";
2
4
  export * from "./DashboardConstants.js";
3
5
  export * from "./DashboardPlugin.js";
@@ -10,5 +12,4 @@ export * from "./PanelManager.js";
10
12
  export { default as PanelEvent } from "./PanelEvent.js";
11
13
  export { default as PanelErrorBoundary } from "./PanelErrorBoundary.js";
12
14
  export { default as PanelManager } from "./PanelManager.js";
13
- export { default } from "./Dashboard.js";
14
15
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["default","DashboardUtils","PanelEvent","PanelErrorBoundary","PanelManager"],"sources":["../src/index.ts"],"sourcesContent":["export * from './Dashboard';\nexport * from './DashboardConstants';\nexport * from './DashboardPlugin';\nexport * from './DashboardLayout';\nexport * from './DashboardUtils';\nexport { default as DashboardUtils } from './DashboardUtils';\nexport * from './layout';\nexport * from './redux';\nexport * from './PanelManager';\nexport { default as PanelEvent } from './PanelEvent';\nexport { default as PanelErrorBoundary } from './PanelErrorBoundary';\nexport { default as PanelManager } from './PanelManager';\n\nexport { default } from './Dashboard';\n"],"mappings":";;;;;SAKSA,OAAO,IAAIC,c;;;;SAIXD,OAAO,IAAIE,U;SACXF,OAAO,IAAIG,kB;SACXH,OAAO,IAAII,Y;SAEXJ,O"}
1
+ {"version":3,"file":"index.js","names":["Dashboard","default","DashboardUtils","PanelEvent","PanelErrorBoundary","PanelManager"],"sources":["../src/index.ts"],"sourcesContent":["import Dashboard from './Dashboard';\n\nexport default Dashboard;\n\nexport * from './Dashboard';\nexport * from './DashboardConstants';\nexport * from './DashboardPlugin';\nexport * from './DashboardLayout';\nexport * from './DashboardUtils';\nexport { default as DashboardUtils } from './DashboardUtils';\nexport * from './layout';\nexport * from './redux';\nexport * from './PanelManager';\nexport { default as PanelEvent } from './PanelEvent';\nexport { default as PanelErrorBoundary } from './PanelErrorBoundary';\nexport { default as PanelManager } from './PanelManager';\n"],"mappings":"OAAOA,SAAS;AAEhB,eAAeA,SAAS;AAAC;AAAA;AAAA;AAAA;AAAA;AAAA,SAOhBC,OAAO,IAAIC,cAAc;AAAA;AAAA;AAAA;AAAA,SAIzBD,OAAO,IAAIE,UAAU;AAAA,SACrBF,OAAO,IAAIG,kBAAkB;AAAA,SAC7BH,OAAO,IAAII,YAAY"}
@@ -1 +1 @@
1
- {"version":3,"file":"GLPropTypes.js","names":["PropTypes","Container","shape","on","func","off","isHidden","bool","tab","header","tabs","arrayOf","contentItem","title","string","setTitle","close","EventHub","emit","Layout","registerComponent","root","addChild","eventHub","GLPropTypes","Object","freeze"],"sources":["../../src/layout/GLPropTypes.ts"],"sourcesContent":["import PropTypes from 'prop-types';\n\nconst Container = PropTypes.shape({\n on: PropTypes.func,\n off: PropTypes.func,\n isHidden: PropTypes.bool,\n tab: PropTypes.shape({\n header: PropTypes.shape({\n tabs: PropTypes.arrayOf(\n PropTypes.shape({\n contentItem: PropTypes.shape({}),\n })\n ),\n }),\n }),\n title: PropTypes.string,\n setTitle: PropTypes.func,\n close: PropTypes.func,\n});\n\nconst EventHub = PropTypes.shape({\n on: PropTypes.func,\n off: PropTypes.func,\n emit: PropTypes.func,\n});\n\nconst Layout = PropTypes.shape({\n registerComponent: PropTypes.func,\n root: PropTypes.shape({ addChild: PropTypes.func }),\n on: PropTypes.func,\n off: PropTypes.func,\n eventHub: EventHub,\n});\n\nconst GLPropTypes = Object.freeze({ Container, EventHub, Layout });\n\nexport default GLPropTypes;\n"],"mappings":"AAAA,OAAOA,SAAP,MAAsB,YAAtB;AAEA,IAAMC,SAAS,GAAGD,SAAS,CAACE,KAAV,CAAgB;EAChCC,EAAE,EAAEH,SAAS,CAACI,IADkB;EAEhCC,GAAG,EAAEL,SAAS,CAACI,IAFiB;EAGhCE,QAAQ,EAAEN,SAAS,CAACO,IAHY;EAIhCC,GAAG,EAAER,SAAS,CAACE,KAAV,CAAgB;IACnBO,MAAM,EAAET,SAAS,CAACE,KAAV,CAAgB;MACtBQ,IAAI,EAAEV,SAAS,CAACW,OAAV,CACJX,SAAS,CAACE,KAAV,CAAgB;QACdU,WAAW,EAAEZ,SAAS,CAACE,KAAV,CAAgB,EAAhB;MADC,CAAhB,CADI;IADgB,CAAhB;EADW,CAAhB,CAJ2B;EAahCW,KAAK,EAAEb,SAAS,CAACc,MAbe;EAchCC,QAAQ,EAAEf,SAAS,CAACI,IAdY;EAehCY,KAAK,EAAEhB,SAAS,CAACI;AAfe,CAAhB,CAAlB;AAkBA,IAAMa,QAAQ,GAAGjB,SAAS,CAACE,KAAV,CAAgB;EAC/BC,EAAE,EAAEH,SAAS,CAACI,IADiB;EAE/BC,GAAG,EAAEL,SAAS,CAACI,IAFgB;EAG/Bc,IAAI,EAAElB,SAAS,CAACI;AAHe,CAAhB,CAAjB;AAMA,IAAMe,MAAM,GAAGnB,SAAS,CAACE,KAAV,CAAgB;EAC7BkB,iBAAiB,EAAEpB,SAAS,CAACI,IADA;EAE7BiB,IAAI,EAAErB,SAAS,CAACE,KAAV,CAAgB;IAAEoB,QAAQ,EAAEtB,SAAS,CAACI;EAAtB,CAAhB,CAFuB;EAG7BD,EAAE,EAAEH,SAAS,CAACI,IAHe;EAI7BC,GAAG,EAAEL,SAAS,CAACI,IAJc;EAK7BmB,QAAQ,EAAEN;AALmB,CAAhB,CAAf;AAQA,IAAMO,WAAW,GAAGC,MAAM,CAACC,MAAP,CAAc;EAAEzB,SAAF;EAAagB,QAAb;EAAuBE;AAAvB,CAAd,CAApB;AAEA,eAAeK,WAAf"}
1
+ {"version":3,"file":"GLPropTypes.js","names":["PropTypes","Container","shape","on","func","off","isHidden","bool","tab","header","tabs","arrayOf","contentItem","title","string","setTitle","close","EventHub","emit","Layout","registerComponent","root","addChild","eventHub","GLPropTypes","Object","freeze"],"sources":["../../src/layout/GLPropTypes.ts"],"sourcesContent":["import PropTypes from 'prop-types';\n\nconst Container = PropTypes.shape({\n on: PropTypes.func,\n off: PropTypes.func,\n isHidden: PropTypes.bool,\n tab: PropTypes.shape({\n header: PropTypes.shape({\n tabs: PropTypes.arrayOf(\n PropTypes.shape({\n contentItem: PropTypes.shape({}),\n })\n ),\n }),\n }),\n title: PropTypes.string,\n setTitle: PropTypes.func,\n close: PropTypes.func,\n});\n\nconst EventHub = PropTypes.shape({\n on: PropTypes.func,\n off: PropTypes.func,\n emit: PropTypes.func,\n});\n\nconst Layout = PropTypes.shape({\n registerComponent: PropTypes.func,\n root: PropTypes.shape({ addChild: PropTypes.func }),\n on: PropTypes.func,\n off: PropTypes.func,\n eventHub: EventHub,\n});\n\nconst GLPropTypes = Object.freeze({ Container, EventHub, Layout });\n\nexport default GLPropTypes;\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,YAAY;AAElC,IAAMC,SAAS,GAAGD,SAAS,CAACE,KAAK,CAAC;EAChCC,EAAE,EAAEH,SAAS,CAACI,IAAI;EAClBC,GAAG,EAAEL,SAAS,CAACI,IAAI;EACnBE,QAAQ,EAAEN,SAAS,CAACO,IAAI;EACxBC,GAAG,EAAER,SAAS,CAACE,KAAK,CAAC;IACnBO,MAAM,EAAET,SAAS,CAACE,KAAK,CAAC;MACtBQ,IAAI,EAAEV,SAAS,CAACW,OAAO,CACrBX,SAAS,CAACE,KAAK,CAAC;QACdU,WAAW,EAAEZ,SAAS,CAACE,KAAK,CAAC,CAAC,CAAC;MACjC,CAAC,CAAC;IAEN,CAAC;EACH,CAAC,CAAC;EACFW,KAAK,EAAEb,SAAS,CAACc,MAAM;EACvBC,QAAQ,EAAEf,SAAS,CAACI,IAAI;EACxBY,KAAK,EAAEhB,SAAS,CAACI;AACnB,CAAC,CAAC;AAEF,IAAMa,QAAQ,GAAGjB,SAAS,CAACE,KAAK,CAAC;EAC/BC,EAAE,EAAEH,SAAS,CAACI,IAAI;EAClBC,GAAG,EAAEL,SAAS,CAACI,IAAI;EACnBc,IAAI,EAAElB,SAAS,CAACI;AAClB,CAAC,CAAC;AAEF,IAAMe,MAAM,GAAGnB,SAAS,CAACE,KAAK,CAAC;EAC7BkB,iBAAiB,EAAEpB,SAAS,CAACI,IAAI;EACjCiB,IAAI,EAAErB,SAAS,CAACE,KAAK,CAAC;IAAEoB,QAAQ,EAAEtB,SAAS,CAACI;EAAK,CAAC,CAAC;EACnDD,EAAE,EAAEH,SAAS,CAACI,IAAI;EAClBC,GAAG,EAAEL,SAAS,CAACI,IAAI;EACnBmB,QAAQ,EAAEN;AACZ,CAAC,CAAC;AAEF,IAAMO,WAAW,GAAGC,MAAM,CAACC,MAAM,CAAC;EAAEzB,SAAS;EAAEgB,QAAQ;EAAEE;AAAO,CAAC,CAAC;AAElE,eAAeK,WAAW"}