@apia/dashboard-controller 5.0.0 → 5.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/actions/externalFirePanelAction.d.ts +6 -0
- package/dist/actions/externalFirePanelAction.d.ts.map +1 -0
- package/dist/actions/externalFirePanelAction.js +12 -0
- package/dist/actions/externalFirePanelAction.js.map +1 -0
- package/dist/actions/firePanelAction.d.ts +6 -0
- package/dist/actions/firePanelAction.d.ts.map +1 -0
- package/dist/actions/firePanelAction.js +76 -0
- package/dist/actions/firePanelAction.js.map +1 -0
- package/dist/actions/useActionEventHandlers.d.ts +10 -0
- package/dist/actions/useActionEventHandlers.d.ts.map +1 -0
- package/dist/actions/useActionEventHandlers.js +67 -0
- package/dist/actions/useActionEventHandlers.js.map +1 -0
- package/dist/actions/usePanelActions.d.ts +65 -0
- package/dist/actions/usePanelActions.d.ts.map +1 -0
- package/dist/actions/usePanelActions.js +55 -0
- package/dist/actions/usePanelActions.js.map +1 -0
- package/dist/actions/usePanelIsLoading.d.ts +4 -0
- package/dist/actions/usePanelIsLoading.d.ts.map +1 -0
- package/dist/actions/usePanelIsLoading.js +14 -0
- package/dist/actions/usePanelIsLoading.js.map +1 -0
- package/dist/actions/usePanelNetworkState.d.ts +8 -0
- package/dist/actions/usePanelNetworkState.d.ts.map +1 -0
- package/dist/actions/usePanelNetworkState.js +21 -0
- package/dist/actions/usePanelNetworkState.js.map +1 -0
- package/dist/common/usePanelIdentity.d.ts +10 -0
- package/dist/common/usePanelIdentity.d.ts.map +1 -0
- package/dist/common/usePanelIdentity.js +12 -0
- package/dist/common/usePanelIdentity.js.map +1 -0
- package/dist/config/parametersStore.d.ts +15 -0
- package/dist/config/parametersStore.d.ts.map +1 -0
- package/dist/config/parametersStore.js +27 -0
- package/dist/config/parametersStore.js.map +1 -0
- package/dist/config/saveParameters.d.ts +11 -0
- package/dist/config/saveParameters.d.ts.map +1 -0
- package/dist/config/saveParameters.js +16 -0
- package/dist/config/saveParameters.js.map +1 -0
- package/dist/config/usePanelConfig.js +49 -0
- package/dist/config/usePanelConfig.js.map +1 -0
- package/dist/config/usePanelParametersSelector.d.ts +25 -0
- package/dist/config/usePanelParametersSelector.d.ts.map +1 -0
- package/dist/config/usePanelParametersSelector.js +17 -0
- package/dist/config/usePanelParametersSelector.js.map +1 -0
- package/dist/dashboard/ContainerNotFound.js +14 -0
- package/dist/dashboard/ContainerNotFound.js.map +1 -0
- package/dist/dashboard/DashboardContext.d.ts +6 -0
- package/dist/dashboard/DashboardContext.d.ts.map +1 -0
- package/dist/dashboard/DashboardContext.js +12 -0
- package/dist/dashboard/DashboardContext.js.map +1 -0
- package/dist/dashboard/DashboardPanel.d.ts +48 -0
- package/dist/dashboard/DashboardPanel.d.ts.map +1 -0
- package/dist/dashboard/DashboardPanel.js +264 -0
- package/dist/dashboard/DashboardPanel.js.map +1 -0
- package/dist/dashboard/DashboardPanelContext.d.ts +6 -0
- package/dist/dashboard/DashboardPanelContext.d.ts.map +1 -0
- package/dist/dashboard/DashboardPanelContext.js +12 -0
- package/dist/dashboard/DashboardPanelContext.js.map +1 -0
- package/dist/dashboard/DashboardPanelsBootstraper.d.ts +33 -0
- package/dist/dashboard/DashboardPanelsBootstraper.d.ts.map +1 -0
- package/dist/dashboard/DashboardPanelsBootstraper.js +135 -0
- package/dist/dashboard/DashboardPanelsBootstraper.js.map +1 -0
- package/dist/dashboard/DashboardRouter.d.ts +30 -0
- package/dist/dashboard/DashboardRouter.d.ts.map +1 -0
- package/dist/dashboard/DashboardRouter.js +74 -0
- package/dist/dashboard/DashboardRouter.js.map +1 -0
- package/dist/dashboard/PanelNotFound.js +17 -0
- package/dist/dashboard/PanelNotFound.js.map +1 -0
- package/dist/dashboard/dashboard.d.ts +28 -0
- package/dist/dashboard/dashboard.d.ts.map +1 -0
- package/dist/dashboard/dashboard.js +174 -0
- package/dist/dashboard/dashboard.js.map +1 -0
- package/dist/eventsController/eventsController.d.ts +11 -0
- package/dist/eventsController/eventsController.d.ts.map +1 -0
- package/dist/eventsController/eventsController.js +57 -0
- package/dist/eventsController/eventsController.js.map +1 -0
- package/dist/eventsController/types.d.ts +21 -0
- package/dist/eventsController/types.d.ts.map +1 -0
- package/dist/eventsController/usePanelFireEvent.d.ts +13 -0
- package/dist/eventsController/usePanelFireEvent.d.ts.map +1 -0
- package/dist/eventsController/usePanelFireEvent.js +21 -0
- package/dist/eventsController/usePanelFireEvent.js.map +1 -0
- package/dist/eventsController/usePanelOnEvent.d.ts +12 -0
- package/dist/eventsController/usePanelOnEvent.d.ts.map +1 -0
- package/dist/eventsController/usePanelOnEvent.js +14 -0
- package/dist/eventsController/usePanelOnEvent.js.map +1 -0
- package/dist/index.d.ts +31 -459
- package/dist/index.js +28 -2241
- package/dist/index.js.map +1 -1
- package/dist/panelsStore/createPanelStore.d.ts +16 -0
- package/dist/panelsStore/createPanelStore.d.ts.map +1 -0
- package/dist/panelsStore/createPanelStore.js +58 -0
- package/dist/panelsStore/createPanelStore.js.map +1 -0
- package/dist/panelsStore/panelsStore.js +59 -0
- package/dist/panelsStore/panelsStore.js.map +1 -0
- package/dist/panelsStore/usePanelSelector.js +32 -0
- package/dist/panelsStore/usePanelSelector.js.map +1 -0
- package/dist/panelsUtil/usePanelChangeTitle.d.ts +7 -0
- package/dist/panelsUtil/usePanelChangeTitle.d.ts.map +1 -0
- package/dist/panelsUtil/usePanelChangeTitle.js +19 -0
- package/dist/panelsUtil/usePanelChangeTitle.js.map +1 -0
- package/dist/panelsUtil/usePanelTitleAction.d.ts +5 -0
- package/dist/panelsUtil/usePanelTitleAction.d.ts.map +1 -0
- package/dist/panelsUtil/usePanelTitleAction.js +48 -0
- package/dist/panelsUtil/usePanelTitleAction.js.map +1 -0
- package/dist/position/usePanelPosition.d.ts +13 -0
- package/dist/position/usePanelPosition.d.ts.map +1 -0
- package/dist/position/usePanelPosition.js +40 -0
- package/dist/position/usePanelPosition.js.map +1 -0
- package/dist/splash/events/Dragleave.js +15 -0
- package/dist/splash/events/Dragleave.js.map +1 -0
- package/dist/splash/events/Dragover.js +120 -0
- package/dist/splash/events/Dragover.js.map +1 -0
- package/dist/splash/events/Dragstart.js +65 -0
- package/dist/splash/events/Dragstart.js.map +1 -0
- package/dist/splash/events/Drop.js +66 -0
- package/dist/splash/events/Drop.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/CollapseButton.js +31 -0
- package/dist/splash/panels/DefaultPanelWrapper/CollapseButton.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.d.ts +8 -0
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.d.ts.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.js +28 -0
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.d.ts +10 -0
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.d.ts.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.js +32 -0
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/RefreshButton.js +35 -0
- package/dist/splash/panels/DefaultPanelWrapper/RefreshButton.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/SettingsButton.js +45 -0
- package/dist/splash/panels/DefaultPanelWrapper/SettingsButton.js.map +1 -0
- package/dist/splash/panels/DefaultPanelWrapper/index.js +82 -0
- package/dist/splash/panels/DefaultPanelWrapper/index.js.map +1 -0
- package/dist/splash/panels/EmptyPanelWrapper/index.d.ts +6 -0
- package/dist/splash/panels/EmptyPanelWrapper/index.d.ts.map +1 -0
- package/dist/splash/panels/EmptyPanelWrapper/index.js +10 -0
- package/dist/splash/panels/EmptyPanelWrapper/index.js.map +1 -0
- package/dist/splash/panels/LandingPagePanelWrapper.d.ts +6 -0
- package/dist/splash/panels/LandingPagePanelWrapper.d.ts.map +1 -0
- package/dist/splash/panels/LandingPagePanelWrapper.js +49 -0
- package/dist/splash/panels/LandingPagePanelWrapper.js.map +1 -0
- package/dist/splash/panels/PanelContext/PanelFooter.d.ts +9 -0
- package/dist/splash/panels/PanelContext/PanelFooter.d.ts.map +1 -0
- package/dist/splash/panels/PanelContext/PanelFooter.js +72 -0
- package/dist/splash/panels/PanelContext/PanelFooter.js.map +1 -0
- package/dist/splash/panels/PanelContext/index.d.ts +46 -0
- package/dist/splash/panels/PanelContext/index.d.ts.map +1 -0
- package/dist/splash/panels/PanelContext/index.js +66 -0
- package/dist/splash/panels/PanelContext/index.js.map +1 -0
- package/dist/splash/panels/PanelContext/usePanelContextLayout.d.ts +6 -0
- package/dist/splash/panels/PanelContext/usePanelContextLayout.d.ts.map +1 -0
- package/dist/splash/panels/PanelContext/usePanelContextLayout.js +38 -0
- package/dist/splash/panels/PanelContext/usePanelContextLayout.js.map +1 -0
- package/dist/splash/panels/PanelContext/usePanelFooter.d.ts +11 -0
- package/dist/splash/panels/PanelContext/usePanelFooter.d.ts.map +1 -0
- package/dist/splash/panels/PanelContext/usePanelFooter.js +35 -0
- package/dist/splash/panels/PanelContext/usePanelFooter.js.map +1 -0
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.d.ts +45 -0
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.d.ts.map +1 -0
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.js +12 -0
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.js.map +1 -0
- package/dist/splash/panels/PanelErrorBoundary.js +53 -0
- package/dist/splash/panels/PanelErrorBoundary.js.map +1 -0
- package/dist/splash/panels/PanelIdentifier.d.ts +16 -0
- package/dist/splash/panels/PanelIdentifier.d.ts.map +1 -0
- package/dist/splash/panels/PanelIdentifier.js +19 -0
- package/dist/splash/panels/PanelIdentifier.js.map +1 -0
- package/dist/splash/util/DragAndDrop.js +244 -0
- package/dist/splash/util/DragAndDrop.js.map +1 -0
- package/dist/splash/util/getColumnAreas.js +19 -0
- package/dist/splash/util/getColumnAreas.js.map +1 -0
- package/dist/splash/util/isCursorInArea.js +13 -0
- package/dist/splash/util/isCursorInArea.js.map +1 -0
- package/dist/types.d.ts +30 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/util.d.ts +8 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +55 -0
- package/dist/util.js.map +1 -0
- package/package.json +9 -8
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { TPanelName } from '../types.js';
|
|
2
|
+
import { TPanelParameter } from './parametersStore.js';
|
|
3
|
+
|
|
4
|
+
type TParametersSelector<Selected> = (parameters: Record<string, TPanelParameter>) => Selected;
|
|
5
|
+
/**
|
|
6
|
+
// eslint-disable-next-line comment-length/limit-multi-line-comments
|
|
7
|
+
* Este hook permite seleccionar parámetros de un panel. Cada vez que los
|
|
8
|
+
* parámetros del panel sean actualizados, se llamará a la función selector y en
|
|
9
|
+
* caso de que la selección actual de parámetros difiera de la anterior, se
|
|
10
|
+
* provocará un renderizado en el componente que lo utiliza.
|
|
11
|
+
*
|
|
12
|
+
* Si se quiere obtener los parámetros del panel en el que se está trabajando,
|
|
13
|
+
* el segundo parámetro es innecesario. En caso de querer obtener los
|
|
14
|
+
* parámetros de otro panel, se puede pasar su nombre como segundo parámetro y
|
|
15
|
+
* la selección se hará de acuerdo a los parámetros de éste.
|
|
16
|
+
*
|
|
17
|
+
* Es importante ver que es imposible prever qué parámetros tendrá cada panel,
|
|
18
|
+
* por ello el tipo entregado al selector es Record, que puede entenderse como
|
|
19
|
+
* un mapa de entradas con clave string y valor TPanelParameter = string |
|
|
20
|
+
* boolean | number.
|
|
21
|
+
*/
|
|
22
|
+
declare function usePanelParametersSelector<Selected>(selector: TParametersSelector<Selected>, panelName?: TPanelName): Selected;
|
|
23
|
+
|
|
24
|
+
export { type TParametersSelector, usePanelParametersSelector };
|
|
25
|
+
//# sourceMappingURL=usePanelParametersSelector.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePanelParametersSelector.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { shallowEqual } from 'react-redux';
|
|
2
|
+
import { usePanelIdentity } from '../common/usePanelIdentity.js';
|
|
3
|
+
import { useParametersSelector } from './parametersStore.js';
|
|
4
|
+
import { useDashboardContext } from '../dashboard/DashboardContext.js';
|
|
5
|
+
|
|
6
|
+
function usePanelParametersSelector(selector, panelName) {
|
|
7
|
+
const { panelId } = usePanelIdentity();
|
|
8
|
+
const dashboard = useDashboardContext();
|
|
9
|
+
const id = panelName !== void 0 ? dashboard.getPanelByName(panelName)?.id ?? "" : panelId;
|
|
10
|
+
return useParametersSelector((global) => {
|
|
11
|
+
const currentParams = global.panelParameters[id];
|
|
12
|
+
return selector(currentParams ?? {});
|
|
13
|
+
}, shallowEqual);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { usePanelParametersSelector };
|
|
17
|
+
//# sourceMappingURL=usePanelParametersSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usePanelParametersSelector.js","sources":["../../src/config/usePanelParametersSelector.ts"],"sourcesContent":["import { shallowEqual } from 'react-redux';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelName } from '../types';\r\nimport { TPanelParameter, useParametersSelector } from './parametersStore';\r\nimport { useDashboardContext } from '../dashboard';\r\n\r\nexport type TParametersSelector<Selected> = (\r\n parameters: Record<string, TPanelParameter>,\r\n) => Selected;\r\n\r\n/**\r\n // eslint-disable-next-line comment-length/limit-multi-line-comments\r\n * Este hook permite seleccionar parámetros de un panel. Cada vez que los\r\n * parámetros del panel sean actualizados, se llamará a la función selector y en\r\n * caso de que la selección actual de parámetros difiera de la anterior, se\r\n * provocará un renderizado en el componente que lo utiliza.\r\n *\r\n * Si se quiere obtener los parámetros del panel en el que se está trabajando,\r\n * el segundo parámetro es innecesario. En caso de querer obtener los\r\n * parámetros de otro panel, se puede pasar su nombre como segundo parámetro y\r\n * la selección se hará de acuerdo a los parámetros de éste.\r\n *\r\n * Es importante ver que es imposible prever qué parámetros tendrá cada panel,\r\n * por ello el tipo entregado al selector es Record, que puede entenderse como\r\n * un mapa de entradas con clave string y valor TPanelParameter = string |\r\n * boolean | number.\r\n */\r\nexport function usePanelParametersSelector<Selected>(\r\n selector: TParametersSelector<Selected>,\r\n panelName?: TPanelName,\r\n) {\r\n const { panelId } = usePanelIdentity();\r\n const dashboard = useDashboardContext();\r\n const id =\r\n panelName !== undefined\r\n ? dashboard.getPanelByName(panelName)?.id ?? ''\r\n : panelId;\r\n\r\n return useParametersSelector((global) => {\r\n const currentParams = global.panelParameters[id];\r\n return selector(currentParams ?? {});\r\n }, shallowEqual);\r\n}\r\n"],"names":[],"mappings":";;;;;AA2BO,SAAS,0BAAA,CACd,UACA,SAAA,EACA;AACA,EAAA,MAAM,EAAE,OAAA,EAAQ,GAAI,gBAAA,EAAiB;AACrC,EAAA,MAAM,YAAY,mBAAA,EAAoB;AACtC,EAAA,MAAM,EAAA,GACJ,cAAc,MAAA,GACV,SAAA,CAAU,eAAe,SAAS,CAAA,EAAG,MAAM,EAAA,GAC3C,OAAA;AAEN,EAAA,OAAO,qBAAA,CAAsB,CAAC,MAAA,KAAW;AACvC,IAAA,MAAM,aAAA,GAAgB,MAAA,CAAO,eAAA,CAAgB,EAAE,CAAA;AAC/C,IAAA,OAAO,QAAA,CAAS,aAAA,IAAiB,EAAE,CAAA;AAAA,KAClC,YAAY,CAAA;AACjB;;;;"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsxs } from '@apia/theme/jsx-runtime';
|
|
2
|
+
import { Heading } from '@apia/theme';
|
|
3
|
+
import { usePanelIdentity } from '../common/usePanelIdentity.js';
|
|
4
|
+
|
|
5
|
+
const ContainerNotFound = () => {
|
|
6
|
+
const props = usePanelIdentity();
|
|
7
|
+
return /* @__PURE__ */ jsxs(Heading, { children: [
|
|
8
|
+
"Container not found for panel: ",
|
|
9
|
+
props.panelName
|
|
10
|
+
] });
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export { ContainerNotFound };
|
|
14
|
+
//# sourceMappingURL=ContainerNotFound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ContainerNotFound.js","sources":["../../src/dashboard/ContainerNotFound.tsx"],"sourcesContent":["import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const ContainerNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n return <Heading>Container not found for panel: {props.panelName}</Heading>;\r\n};\r\n"],"names":[],"mappings":";;;;AAGO,MAAM,oBAAoB,MAAM;AACrC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,4BAAQ,OAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,IAAA,iCAAA;AAAA,IAAgC,KAAA,CAAM;AAAA,GAAA,EAAU,CAAA;AAClE;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardContext.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useContext, createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
const DashboardContext = createContext(null);
|
|
4
|
+
function useDashboardContext() {
|
|
5
|
+
const context = useContext(DashboardContext);
|
|
6
|
+
if (!context)
|
|
7
|
+
throw new Error("There is no Dashboard context");
|
|
8
|
+
return context;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { DashboardContext, useDashboardContext };
|
|
12
|
+
//# sourceMappingURL=DashboardContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardContext.js","sources":["../../src/dashboard/DashboardContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\r\nimport { Dashboard } from './dashboard';\r\n\r\nexport const DashboardContext = createContext<Dashboard | null>(null);\r\n\r\nexport function useDashboardContext() {\r\n const context = useContext(DashboardContext);\r\n\r\n if (!context) throw new Error('There is no Dashboard context');\r\n\r\n return context;\r\n}\r\n"],"names":[],"mappings":";;AAGO,MAAM,gBAAA,GAAmB,cAAgC,IAAI;AAE7D,SAAS,mBAAA,GAAsB;AACpC,EAAA,MAAM,OAAA,GAAU,WAAW,gBAAgB,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA;AAAS,IAAA,MAAM,IAAI,MAAM,+BAA+B,CAAA;AAE7D,EAAA,OAAO,OAAA;AACT;;;;"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactPortal } from 'react';
|
|
3
|
+
import { Dashboard } from './dashboard.js';
|
|
4
|
+
import { TLoadedPanelProps, PanelContainer } from '../types.js';
|
|
5
|
+
import { importPanel } from '../util.js';
|
|
6
|
+
import { EventEmitter } from '@apia/util';
|
|
7
|
+
import { TActionDispatcherOptions, TActionResult } from '../actions/usePanelActions.js';
|
|
8
|
+
|
|
9
|
+
type TPanelProps = Omit<TLoadedPanelProps, 'initialData'>;
|
|
10
|
+
declare class DashboardPanel extends EventEmitter<{
|
|
11
|
+
hasLoaded: boolean;
|
|
12
|
+
isVisible: boolean;
|
|
13
|
+
isCollapsed: boolean;
|
|
14
|
+
}> {
|
|
15
|
+
#private;
|
|
16
|
+
dashboard: Dashboard;
|
|
17
|
+
hasInited: boolean;
|
|
18
|
+
hasLoaded: boolean;
|
|
19
|
+
id: string;
|
|
20
|
+
initialData: Promise<unknown> | null;
|
|
21
|
+
isVisible: boolean;
|
|
22
|
+
isCollapsed: boolean;
|
|
23
|
+
portal: ReactPortal;
|
|
24
|
+
props: TPanelProps;
|
|
25
|
+
constructor({ id, dashboard, PanelContainer, }: {
|
|
26
|
+
id: string;
|
|
27
|
+
dashboard: Dashboard;
|
|
28
|
+
PanelContainer: PanelContainer;
|
|
29
|
+
});
|
|
30
|
+
collapse(): void;
|
|
31
|
+
fireAction: ({ action, ...parameters }: {
|
|
32
|
+
action: string;
|
|
33
|
+
} & Record<string, unknown>, options?: TActionDispatcherOptions) => Promise<TActionResult>;
|
|
34
|
+
getContainer(): HTMLElement;
|
|
35
|
+
getParameters(): any;
|
|
36
|
+
hide(): void;
|
|
37
|
+
refresh(): Promise<TActionResult | undefined>;
|
|
38
|
+
queuedRefresh(): Promise<TActionResult | undefined>;
|
|
39
|
+
setHasLoaded(): void;
|
|
40
|
+
show(): void;
|
|
41
|
+
PanelElement: ({ ActualPanelContainer, Element, }: {
|
|
42
|
+
ActualPanelContainer: PanelContainer;
|
|
43
|
+
Element: ReturnType<typeof importPanel>;
|
|
44
|
+
}) => react.JSX.Element | null;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export { DashboardPanel };
|
|
48
|
+
//# sourceMappingURL=DashboardPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanel.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import { jsx } from '@apia/theme/jsx-runtime';
|
|
2
|
+
import { createPortal } from 'react-dom';
|
|
3
|
+
import { importPanel } from '../util.js';
|
|
4
|
+
import { EventEmitter, toBoolean, parseXmlAsync, useMount } from '@apia/util';
|
|
5
|
+
import { useState, useEffect } from 'react';
|
|
6
|
+
import { PanelErrorBoundary } from '../splash/panels/PanelErrorBoundary.js';
|
|
7
|
+
import { PanelIdentifier } from '../splash/panels/PanelIdentifier.js';
|
|
8
|
+
import { firePanelAction } from '../actions/firePanelAction.js';
|
|
9
|
+
import { saveParameters } from '../config/saveParameters.js';
|
|
10
|
+
import { parametersStore } from '../config/parametersStore.js';
|
|
11
|
+
import { DashboardPanelContext } from './DashboardPanelContext.js';
|
|
12
|
+
|
|
13
|
+
var __defProp = Object.defineProperty;
|
|
14
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
15
|
+
var __publicField = (obj, key, value) => {
|
|
16
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
17
|
+
return value;
|
|
18
|
+
};
|
|
19
|
+
var __accessCheck = (obj, member, msg) => {
|
|
20
|
+
if (!member.has(obj))
|
|
21
|
+
throw TypeError("Cannot " + msg);
|
|
22
|
+
};
|
|
23
|
+
var __privateGet = (obj, member, getter) => {
|
|
24
|
+
__accessCheck(obj, member, "read from private field");
|
|
25
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
26
|
+
};
|
|
27
|
+
var __privateAdd = (obj, member, value) => {
|
|
28
|
+
if (member.has(obj))
|
|
29
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
30
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
31
|
+
};
|
|
32
|
+
var _elements, _loaders;
|
|
33
|
+
const noData = { initialData: {} };
|
|
34
|
+
function parameterValue(value) {
|
|
35
|
+
if (value === "true")
|
|
36
|
+
return true;
|
|
37
|
+
if (value === "false")
|
|
38
|
+
return false;
|
|
39
|
+
return value;
|
|
40
|
+
}
|
|
41
|
+
class DashboardPanel extends EventEmitter {
|
|
42
|
+
constructor({
|
|
43
|
+
id,
|
|
44
|
+
dashboard,
|
|
45
|
+
PanelContainer: PanelContainer2
|
|
46
|
+
}) {
|
|
47
|
+
super();
|
|
48
|
+
__publicField(this, "dashboard");
|
|
49
|
+
__publicField(this, "hasInited", false);
|
|
50
|
+
__publicField(this, "hasLoaded", false);
|
|
51
|
+
__publicField(this, "id");
|
|
52
|
+
__publicField(this, "initialData", null);
|
|
53
|
+
__publicField(this, "isVisible", false);
|
|
54
|
+
__publicField(this, "isCollapsed", false);
|
|
55
|
+
__publicField(this, "portal");
|
|
56
|
+
__publicField(this, "props", {});
|
|
57
|
+
__privateAdd(this, _elements, {
|
|
58
|
+
props: () => {
|
|
59
|
+
const panelData = document.querySelector(
|
|
60
|
+
`panel-props[id="${this.id}"]`
|
|
61
|
+
);
|
|
62
|
+
if (!panelData) {
|
|
63
|
+
console.error("Panel with no id:", this.id);
|
|
64
|
+
throw new Error("A panel has no data element in the DOM.");
|
|
65
|
+
}
|
|
66
|
+
return panelData;
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
__privateAdd(this, _loaders, {
|
|
70
|
+
loadAll: () => {
|
|
71
|
+
void __privateGet(this, _loaders).initialData();
|
|
72
|
+
__privateGet(this, _loaders).parameters();
|
|
73
|
+
__privateGet(this, _loaders).props();
|
|
74
|
+
},
|
|
75
|
+
initialData: () => {
|
|
76
|
+
const panelContent = this.getContainer();
|
|
77
|
+
const xml = panelContent.innerHTML.replaceAll("<", "<").replaceAll(">", ">").replaceAll("&", "&");
|
|
78
|
+
panelContent.innerHTML = "";
|
|
79
|
+
this.initialData = parseXmlAsync(xml.replace(/<!--?[^>]+>/, ""));
|
|
80
|
+
return this.initialData;
|
|
81
|
+
},
|
|
82
|
+
parameters: () => {
|
|
83
|
+
if (parametersStore.getState().panelParameters[this.id])
|
|
84
|
+
return;
|
|
85
|
+
const panelData = __privateGet(this, _elements).props();
|
|
86
|
+
const options = Object.fromEntries(
|
|
87
|
+
[...panelData.querySelectorAll("panel-option")].map(
|
|
88
|
+
(current) => {
|
|
89
|
+
return [
|
|
90
|
+
current.getAttribute("name"),
|
|
91
|
+
parameterValue(current.getAttribute("value"))
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
)
|
|
95
|
+
);
|
|
96
|
+
const parameters = Object.fromEntries(
|
|
97
|
+
[...panelData.querySelectorAll("panel-parameter")].map(
|
|
98
|
+
(current) => {
|
|
99
|
+
return [
|
|
100
|
+
current.getAttribute("name"),
|
|
101
|
+
parameterValue(current.getAttribute("value"))
|
|
102
|
+
];
|
|
103
|
+
}
|
|
104
|
+
)
|
|
105
|
+
);
|
|
106
|
+
saveParameters(this.id, Object.assign(options, parameters), false);
|
|
107
|
+
},
|
|
108
|
+
props: () => {
|
|
109
|
+
const panelData = __privateGet(this, _elements).props();
|
|
110
|
+
const panel = this.getContainer();
|
|
111
|
+
const props = {
|
|
112
|
+
id: this.id,
|
|
113
|
+
canMove: toBoolean(panelData.getAttribute("canMove")),
|
|
114
|
+
hasRss: toBoolean(panelData.getAttribute("hasRss")),
|
|
115
|
+
image: panelData.getAttribute("imagePath"),
|
|
116
|
+
isConfigurable: toBoolean(panelData.getAttribute("isConfigurable")),
|
|
117
|
+
isRefreshable: toBoolean(panelData.getAttribute("isRefreshable")),
|
|
118
|
+
name: panelData.getAttribute("name"),
|
|
119
|
+
refreshOnHome: toBoolean(panelData.getAttribute("refreshOnHome")),
|
|
120
|
+
refreshOnStart: toBoolean(panelData.getAttribute("refreshOnStart")),
|
|
121
|
+
showTitle: toBoolean(panelData.getAttribute("showTitle")),
|
|
122
|
+
title: panelData.getAttribute("title"),
|
|
123
|
+
type: panel.dataset.panel,
|
|
124
|
+
hideCollapse: toBoolean(panelData.getAttribute("hideCollapse"))
|
|
125
|
+
};
|
|
126
|
+
this.props = props;
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
__publicField(this, "fireAction", ({ action, ...parameters }, options) => {
|
|
130
|
+
if (!this.isVisible)
|
|
131
|
+
return new Promise((resolve) => resolve(null));
|
|
132
|
+
const postData = {};
|
|
133
|
+
Object.entries(parameters).forEach(([name, value]) => {
|
|
134
|
+
postData[`p_${name}`] = value;
|
|
135
|
+
});
|
|
136
|
+
return new Promise((resolve, reject) => {
|
|
137
|
+
firePanelAction(this.id, action, postData, {
|
|
138
|
+
...options,
|
|
139
|
+
onComplete(hasSucceed, data) {
|
|
140
|
+
options?.onComplete?.(hasSucceed, data);
|
|
141
|
+
if (hasSucceed) {
|
|
142
|
+
resolve(data);
|
|
143
|
+
} else
|
|
144
|
+
reject();
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
});
|
|
148
|
+
});
|
|
149
|
+
__publicField(this, "PanelElement", ({
|
|
150
|
+
ActualPanelContainer,
|
|
151
|
+
Element
|
|
152
|
+
}) => {
|
|
153
|
+
const [resolvedInitialData, setResolvedInitialData] = useState(null);
|
|
154
|
+
const [isVisible, setIsVisible] = useState(this.isVisible);
|
|
155
|
+
const [isCollapsed, setIsCollapsed] = useState(this.isCollapsed);
|
|
156
|
+
useEffect(() => {
|
|
157
|
+
return this.on("isCollapsed", (ev) => setIsCollapsed(ev));
|
|
158
|
+
}, []);
|
|
159
|
+
useMount(() => {
|
|
160
|
+
void this.initialData?.then((data) => {
|
|
161
|
+
setResolvedInitialData(data ?? noData);
|
|
162
|
+
});
|
|
163
|
+
return this.on(
|
|
164
|
+
"isVisible",
|
|
165
|
+
(ev) => setIsVisible((current) => ev || current)
|
|
166
|
+
);
|
|
167
|
+
});
|
|
168
|
+
if (resolvedInitialData === null || resolvedInitialData === noData)
|
|
169
|
+
return null;
|
|
170
|
+
return /* @__PURE__ */ jsx(DashboardPanelContext.Provider, { value: this, children: /* @__PURE__ */ jsx(PanelIdentifier, { ...this.props, children: /* @__PURE__ */ jsx(
|
|
171
|
+
ActualPanelContainer,
|
|
172
|
+
{
|
|
173
|
+
...this.props,
|
|
174
|
+
isCollapsed,
|
|
175
|
+
initialData: resolvedInitialData,
|
|
176
|
+
children: /* @__PURE__ */ jsx(
|
|
177
|
+
this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady,
|
|
178
|
+
{
|
|
179
|
+
panelId: this.id,
|
|
180
|
+
children: /* @__PURE__ */ jsx(PanelErrorBoundary, { children: isVisible ? /* @__PURE__ */ jsx(Element, { initialData: resolvedInitialData }) : null })
|
|
181
|
+
}
|
|
182
|
+
)
|
|
183
|
+
}
|
|
184
|
+
) }) });
|
|
185
|
+
});
|
|
186
|
+
this.dashboard = dashboard;
|
|
187
|
+
this.id = id;
|
|
188
|
+
__privateGet(this, _loaders).loadAll();
|
|
189
|
+
this.isCollapsed = toBoolean(
|
|
190
|
+
localStorage.getItem(
|
|
191
|
+
`${window.CURRENT_USER_LOGIN}_${window.CURRENT_DASH_ID}_${this.props.name}__isCollapsed`
|
|
192
|
+
)
|
|
193
|
+
);
|
|
194
|
+
this.portal = createPortal(
|
|
195
|
+
/* @__PURE__ */ jsx(
|
|
196
|
+
this.PanelElement,
|
|
197
|
+
{
|
|
198
|
+
ActualPanelContainer: PanelContainer2,
|
|
199
|
+
Element: importPanel(this.props.type)
|
|
200
|
+
}
|
|
201
|
+
),
|
|
202
|
+
this.getContainer(),
|
|
203
|
+
this.id
|
|
204
|
+
);
|
|
205
|
+
}
|
|
206
|
+
collapse() {
|
|
207
|
+
this.isCollapsed = !this.isCollapsed;
|
|
208
|
+
localStorage.setItem(
|
|
209
|
+
`${window.CURRENT_USER_LOGIN}_${window.CURRENT_DASH_ID}_${this.props.name}__isCollapsed`,
|
|
210
|
+
String(this.isCollapsed)
|
|
211
|
+
);
|
|
212
|
+
this.emit("isCollapsed", this.isCollapsed);
|
|
213
|
+
}
|
|
214
|
+
getContainer() {
|
|
215
|
+
const panel = document.querySelector(
|
|
216
|
+
`[data-id="${this.id}"][data-panel]`
|
|
217
|
+
);
|
|
218
|
+
if (!panel) {
|
|
219
|
+
console.error("Panel not found in dom:", this.id);
|
|
220
|
+
throw new Error("Panel not found in DOM.");
|
|
221
|
+
}
|
|
222
|
+
return panel;
|
|
223
|
+
}
|
|
224
|
+
getParameters() {
|
|
225
|
+
return parametersStore.getState().panelParameters[this.id];
|
|
226
|
+
}
|
|
227
|
+
hide() {
|
|
228
|
+
const container = this.getContainer();
|
|
229
|
+
container.style.display = "none";
|
|
230
|
+
container.ariaHidden = "true";
|
|
231
|
+
this.isVisible = false;
|
|
232
|
+
this.emit("isVisible", this.isVisible);
|
|
233
|
+
}
|
|
234
|
+
refresh() {
|
|
235
|
+
if (this.dashboard.queueRefresh) {
|
|
236
|
+
return this.queuedRefresh();
|
|
237
|
+
} else {
|
|
238
|
+
return this.fireAction({ action: "refresh" });
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
queuedRefresh() {
|
|
242
|
+
return this.dashboard.tasksQueue.run(async () => {
|
|
243
|
+
const result = await this.fireAction({ action: "refresh" });
|
|
244
|
+
return result;
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
setHasLoaded() {
|
|
248
|
+
this.hasLoaded = true;
|
|
249
|
+
this.emit("hasLoaded", true);
|
|
250
|
+
}
|
|
251
|
+
show() {
|
|
252
|
+
const container = this.getContainer();
|
|
253
|
+
container.style.display = "block";
|
|
254
|
+
container.ariaHidden = "false";
|
|
255
|
+
this.hasInited = true;
|
|
256
|
+
this.isVisible = true;
|
|
257
|
+
this.emit("isVisible", this.isVisible);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
_elements = new WeakMap();
|
|
261
|
+
_loaders = new WeakMap();
|
|
262
|
+
|
|
263
|
+
export { DashboardPanel };
|
|
264
|
+
//# sourceMappingURL=DashboardPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanel.js","sources":["../../src/dashboard/DashboardPanel.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\r\nimport { Dashboard } from '.';\r\nimport { PanelContainer, TLoadedPanelProps } from '../types';\r\nimport { importPanel } from '../util';\r\nimport { EventEmitter, parseXmlAsync, toBoolean, useMount } from '@apia/util';\r\nimport { ReactPortal, useState, useEffect } from 'react';\r\nimport { PanelErrorBoundary } from '../splash/panels/PanelErrorBoundary';\r\nimport { PanelIdentifier } from '../splash/panels/PanelIdentifier';\r\nimport { firePanelAction } from '../actions/firePanelAction';\r\nimport { parametersStore, saveParameters } from '../config';\r\nimport { DashboardPanelContext } from './DashboardPanelContext';\r\nimport {\r\n TActionDispatcherOptions,\r\n TActionResult,\r\n} from '../actions/usePanelActions';\r\n\r\nconst noData = { initialData: {} };\r\n\r\ntype TPanelProps = Omit<TLoadedPanelProps, 'initialData'>;\r\nfunction parameterValue(value: string | boolean | number) {\r\n if (value === 'true') return true;\r\n if (value === 'false') return false;\r\n\r\n return value;\r\n}\r\n\r\nexport class DashboardPanel extends EventEmitter<{\r\n hasLoaded: boolean;\r\n isVisible: boolean;\r\n isCollapsed: boolean;\r\n}> {\r\n dashboard: Dashboard;\r\n hasInited = false;\r\n hasLoaded = false;\r\n id: string;\r\n initialData: Promise<unknown> | null = null;\r\n isVisible = false;\r\n isCollapsed = false;\r\n portal: ReactPortal;\r\n props: TPanelProps = {} as TPanelProps;\r\n\r\n constructor({\r\n id,\r\n dashboard,\r\n PanelContainer,\r\n }: {\r\n id: string;\r\n dashboard: Dashboard;\r\n PanelContainer: PanelContainer;\r\n }) {\r\n super();\r\n\r\n this.dashboard = dashboard;\r\n this.id = id;\r\n this.#loaders.loadAll();\r\n this.isCollapsed = toBoolean(\r\n localStorage.getItem(\r\n `${window.CURRENT_USER_LOGIN}_${window.CURRENT_DASH_ID}_${this.props.name}__isCollapsed`,\r\n ),\r\n );\r\n\r\n this.portal = createPortal(\r\n <this.PanelElement\r\n ActualPanelContainer={PanelContainer}\r\n Element={importPanel(this.props.type)}\r\n />,\r\n this.getContainer() as HTMLElement,\r\n this.id,\r\n );\r\n }\r\n\r\n #elements = {\r\n props: () => {\r\n const panelData = document.querySelector(\r\n `panel-props[id=\"${this.id as string}\"]`,\r\n ) as HTMLElement | null;\r\n\r\n if (!panelData) {\r\n console.error('Panel with no id:', this.id);\r\n throw new Error('A panel has no data element in the DOM.');\r\n }\r\n\r\n return panelData;\r\n },\r\n };\r\n\r\n collapse() {\r\n this.isCollapsed = !this.isCollapsed;\r\n localStorage.setItem(\r\n `${window.CURRENT_USER_LOGIN}_${window.CURRENT_DASH_ID}_${this.props.name}__isCollapsed`,\r\n String(this.isCollapsed),\r\n );\r\n this.emit('isCollapsed', this.isCollapsed);\r\n }\r\n\r\n #loaders = {\r\n loadAll: () => {\r\n void this.#loaders.initialData();\r\n this.#loaders.parameters();\r\n this.#loaders.props();\r\n },\r\n initialData: () => {\r\n const panelContent = this.getContainer();\r\n const xml = panelContent.innerHTML\r\n .replaceAll('<', '<')\r\n .replaceAll('>', '>')\r\n .replaceAll('&', '&');\r\n panelContent.innerHTML = '';\r\n\r\n this.initialData = parseXmlAsync(xml.replace(/<!--?[^>]+>/, ''));\r\n\r\n return this.initialData;\r\n },\r\n parameters: () => {\r\n if ((parametersStore.getState() as any).panelParameters[this.id]) return;\r\n\r\n const panelData = this.#elements.props();\r\n\r\n const options = Object.fromEntries(\r\n [...panelData.querySelectorAll<HTMLElement>('panel-option')].map(\r\n (current) => {\r\n return [\r\n current.getAttribute('name') as string,\r\n parameterValue(current.getAttribute('value') as string),\r\n ];\r\n },\r\n ),\r\n );\r\n\r\n const parameters = Object.fromEntries(\r\n [...panelData.querySelectorAll<HTMLElement>('panel-parameter')].map(\r\n (current) => {\r\n return [\r\n current.getAttribute('name') as string,\r\n parameterValue(current.getAttribute('value') as string),\r\n ];\r\n },\r\n ),\r\n );\r\n\r\n saveParameters(this.id, Object.assign(options, parameters), false);\r\n },\r\n props: () => {\r\n const panelData = this.#elements.props();\r\n const panel = this.getContainer();\r\n\r\n const props: Omit<TLoadedPanelProps, 'initialData'> = {\r\n id: this.id,\r\n canMove: toBoolean(panelData.getAttribute('canMove')),\r\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\r\n image: panelData.getAttribute('imagePath') as string,\r\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\r\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\r\n name: panelData.getAttribute('name') as string,\r\n refreshOnHome: toBoolean(panelData.getAttribute('refreshOnHome')),\r\n refreshOnStart: toBoolean(panelData.getAttribute('refreshOnStart')),\r\n showTitle: toBoolean(panelData.getAttribute('showTitle')),\r\n title: panelData.getAttribute('title') as string,\r\n type: panel.dataset.panel as string,\r\n hideCollapse: toBoolean(panelData.getAttribute('hideCollapse')),\r\n };\r\n\r\n this.props = props;\r\n },\r\n };\r\n\r\n fireAction: (\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n ) => Promise<TActionResult> = ({ action, ...parameters }, options) => {\r\n if (!this.isVisible) return new Promise((resolve) => resolve(null));\r\n\r\n const postData: Record<string, unknown> = {};\r\n\r\n Object.entries(parameters).forEach(([name, value]) => {\r\n postData[`p_${name}`] = value;\r\n });\r\n\r\n return new Promise<TActionResult>((resolve, reject) => {\r\n firePanelAction(this.id, action, postData, {\r\n ...options,\r\n onComplete(hasSucceed, data) {\r\n options?.onComplete?.(hasSucceed, data);\r\n if (hasSucceed) {\r\n resolve(data);\r\n } else reject();\r\n },\r\n });\r\n });\r\n };\r\n\r\n getContainer() {\r\n const panel = document.querySelector(\r\n `[data-id=\"${this.id}\"][data-panel]`,\r\n ) as HTMLElement;\r\n\r\n if (!panel) {\r\n console.error('Panel not found in dom:', this.id);\r\n throw new Error('Panel not found in DOM.');\r\n }\r\n\r\n return panel;\r\n }\r\n\r\n getParameters() {\r\n return (parametersStore.getState() as any).panelParameters[this.id];\r\n }\r\n\r\n hide() {\r\n const container = this.getContainer();\r\n container.style.display = 'none';\r\n container.ariaHidden = 'true';\r\n\r\n this.isVisible = false;\r\n this.emit('isVisible', this.isVisible);\r\n }\r\n\r\n refresh() {\r\n if (this.dashboard.queueRefresh) {\r\n return this.queuedRefresh();\r\n } else {\r\n return this.fireAction({ action: 'refresh' });\r\n }\r\n }\r\n\r\n queuedRefresh() {\r\n return this.dashboard.tasksQueue.run(async () => {\r\n const result = await this.fireAction({ action: 'refresh' });\r\n return result;\r\n });\r\n }\r\n\r\n setHasLoaded() {\r\n this.hasLoaded = true;\r\n this.emit('hasLoaded', true);\r\n }\r\n\r\n show() {\r\n const container = this.getContainer();\r\n container.style.display = 'block';\r\n container.ariaHidden = 'false';\r\n\r\n this.hasInited = true;\r\n this.isVisible = true;\r\n this.emit('isVisible', this.isVisible);\r\n }\r\n\r\n PanelElement = ({\r\n ActualPanelContainer,\r\n Element,\r\n }: {\r\n ActualPanelContainer: PanelContainer;\r\n Element: ReturnType<typeof importPanel>;\r\n }) => {\r\n const [resolvedInitialData, setResolvedInitialData] = useState<{\r\n initialData: unknown;\r\n } | null>(null);\r\n const [isVisible, setIsVisible] = useState(this.isVisible);\r\n const [isCollapsed, setIsCollapsed] = useState(this.isCollapsed);\r\n\r\n useEffect(() => {\r\n return this.on('isCollapsed', (ev) => setIsCollapsed(ev));\r\n }, []);\r\n\r\n useMount(() => {\r\n void this.initialData?.then((data) => {\r\n setResolvedInitialData((data ?? noData) as { initialData: unknown });\r\n });\r\n\r\n return this.on('isVisible', (ev) =>\r\n setIsVisible((current) => ev || current),\r\n );\r\n });\r\n\r\n if (resolvedInitialData === null || resolvedInitialData === noData)\r\n return null;\r\n\r\n return (\r\n <DashboardPanelContext.Provider value={this}>\r\n <PanelIdentifier {...this.props}>\r\n <ActualPanelContainer\r\n {...this.props}\r\n isCollapsed={isCollapsed}\r\n initialData={resolvedInitialData}\r\n >\r\n <this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady\r\n panelId={this.id}\r\n >\r\n <PanelErrorBoundary>\r\n {isVisible ? (\r\n <Element initialData={resolvedInitialData} />\r\n ) : null}\r\n </PanelErrorBoundary>\r\n </this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady>\r\n </ActualPanelContainer>\r\n </PanelIdentifier>\r\n </DashboardPanelContext.Provider>\r\n );\r\n };\r\n}\r\n"],"names":["PanelContainer"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanelContext.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { useContext, createContext } from 'react';
|
|
2
|
+
|
|
3
|
+
const DashboardPanelContext = createContext(null);
|
|
4
|
+
function useDashboardPanel() {
|
|
5
|
+
const context = useContext(DashboardPanelContext);
|
|
6
|
+
if (!context)
|
|
7
|
+
throw new Error("There is no DashboardPanelContext");
|
|
8
|
+
return context;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export { DashboardPanelContext, useDashboardPanel };
|
|
12
|
+
//# sourceMappingURL=DashboardPanelContext.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanelContext.js","sources":["../../src/dashboard/DashboardPanelContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\r\nimport { DashboardPanel } from './DashboardPanel';\r\n\r\nexport const DashboardPanelContext = createContext<DashboardPanel | null>(null);\r\n\r\nexport function useDashboardPanel() {\r\n const context = useContext(DashboardPanelContext);\r\n\r\n if (!context) throw new Error('There is no DashboardPanelContext');\r\n\r\n return context;\r\n}\r\n"],"names":[],"mappings":";;AAGO,MAAM,qBAAA,GAAwB,cAAqC,IAAI;AAEvE,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM,OAAA,GAAU,WAAW,qBAAqB,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA;AAAS,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAEjE,EAAA,OAAO,OAAA;AACT;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { Dashboard } from './dashboard.js';
|
|
4
|
+
|
|
5
|
+
declare global {
|
|
6
|
+
interface Window {
|
|
7
|
+
DASH_COURTAIN_TRESHOLD?: number;
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
declare class DashboardPanelsBootstraper {
|
|
11
|
+
#private;
|
|
12
|
+
dashboard: Dashboard;
|
|
13
|
+
constructor(dashboard: Dashboard);
|
|
14
|
+
/**
|
|
15
|
+
* El bootstraper se basa en dos elementos: setHasLoadedInitialData y
|
|
16
|
+
* SuspendPanelUntilDashboardReady.
|
|
17
|
+
*
|
|
18
|
+
* El funcionamiento es muy elemental: Cada panel utiliza el Suspend como
|
|
19
|
+
* wrapper y éste registra el id del panel en un array de paneles pendientes
|
|
20
|
+
* por cargar.
|
|
21
|
+
*
|
|
22
|
+
* Una vez que todos los paneles cargaron, el suspense retoma su tarea y
|
|
23
|
+
* renderiza el panel normalmente.
|
|
24
|
+
*/
|
|
25
|
+
setPanelHasLoaded: (panelId: string) => void;
|
|
26
|
+
SuspendPanelUntilDashbordReady: ({ children, panelId, }: {
|
|
27
|
+
children: ReactNode;
|
|
28
|
+
panelId: string;
|
|
29
|
+
}) => react.JSX.Element;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export { DashboardPanelsBootstraper };
|
|
33
|
+
//# sourceMappingURL=DashboardPanelsBootstraper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanelsBootstraper.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|