@apia/dashboard-controller 4.0.102 → 5.0.1
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 +75 -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 -467
- package/dist/index.js +28 -2290
- 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 +27 -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 +8 -9
- package/LICENSE.md +0 -6
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { jsx, jsxs } from '@apia/theme/jsx-runtime';
|
|
2
|
+
import { useState, useDeferredValue, useCallback, Suspense } from 'react';
|
|
3
|
+
|
|
4
|
+
var __defProp = Object.defineProperty;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __publicField = (obj, key, value) => {
|
|
7
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
8
|
+
return value;
|
|
9
|
+
};
|
|
10
|
+
var __accessCheck = (obj, member, msg) => {
|
|
11
|
+
if (!member.has(obj))
|
|
12
|
+
throw TypeError("Cannot " + msg);
|
|
13
|
+
};
|
|
14
|
+
var __privateGet = (obj, member, getter) => {
|
|
15
|
+
__accessCheck(obj, member, "read from private field");
|
|
16
|
+
return member.get(obj);
|
|
17
|
+
};
|
|
18
|
+
var __privateAdd = (obj, member, value) => {
|
|
19
|
+
if (member.has(obj))
|
|
20
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
21
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
22
|
+
};
|
|
23
|
+
var __privateSet = (obj, member, value, setter) => {
|
|
24
|
+
__accessCheck(obj, member, "write to private field");
|
|
25
|
+
member.set(obj, value);
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
var _hasLoadedAll, _bootstrappedPanels, _hasLoaded, _initTimestamp, _timeoutTreshold, _checkAllHasLoaded, _removeSkeletons;
|
|
29
|
+
class DashboardPanelsBootstraper {
|
|
30
|
+
constructor(dashboard) {
|
|
31
|
+
this.dashboard = dashboard;
|
|
32
|
+
__privateAdd(this, _hasLoadedAll, false);
|
|
33
|
+
__privateAdd(this, _bootstrappedPanels, {});
|
|
34
|
+
__privateAdd(this, _hasLoaded, {});
|
|
35
|
+
__privateAdd(this, _initTimestamp, Date.now());
|
|
36
|
+
__privateAdd(this, _timeoutTreshold, (window.DASH_COURTAIN_TRESHOLD ?? 5) * 1e3);
|
|
37
|
+
__privateAdd(this, _checkAllHasLoaded, () => {
|
|
38
|
+
if (__privateGet(this, _hasLoadedAll))
|
|
39
|
+
return true;
|
|
40
|
+
const keys = Object.keys(__privateGet(this, _bootstrappedPanels));
|
|
41
|
+
const hasLoadedAllPanels = !keys.find(
|
|
42
|
+
(current) => !__privateGet(this, _hasLoaded)[current] && this.dashboard.getPanel(current).isVisible
|
|
43
|
+
);
|
|
44
|
+
const hasTimedOutLoading = Date.now() - __privateGet(this, _initTimestamp) > __privateGet(this, _timeoutTreshold);
|
|
45
|
+
if (hasLoadedAllPanels || hasTimedOutLoading) {
|
|
46
|
+
if (hasTimedOutLoading) {
|
|
47
|
+
const nonBootstrappedPanels = Object.keys(__privateGet(this, _bootstrappedPanels)).filter((current) => !__privateGet(this, _hasLoaded)[current]).map((panelId) => {
|
|
48
|
+
const panelProps = this.dashboard.getPanel(panelId).props;
|
|
49
|
+
return panelProps;
|
|
50
|
+
});
|
|
51
|
+
console.warn(
|
|
52
|
+
`The courtain was removed because of timeout, check that all panels are reporting according to useYieldPanelIsReady's documentation.
|
|
53
|
+
|
|
54
|
+
It might have happened that all panels are reporting but the browser was too busy to handle all of them in time, in order to determine what is actually happen you can raise the DASH_COURTAIN_TRESHOLD to a very large number, like 20 for example.`,
|
|
55
|
+
{ nonBootstrappedPanels }
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
__privateSet(this, _hasLoadedAll, true);
|
|
59
|
+
__privateGet(this, _removeSkeletons).call(this);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
return false;
|
|
63
|
+
});
|
|
64
|
+
__privateAdd(this, _removeSkeletons, () => {
|
|
65
|
+
const skeleton = document.querySelector(
|
|
66
|
+
"#DashLayoutCourtain"
|
|
67
|
+
);
|
|
68
|
+
const dashContent = document.querySelector(
|
|
69
|
+
"#DashLayoutContent"
|
|
70
|
+
);
|
|
71
|
+
skeleton.style.display = "none";
|
|
72
|
+
dashContent.style.visibility = "initial";
|
|
73
|
+
skeleton.remove();
|
|
74
|
+
});
|
|
75
|
+
/**
|
|
76
|
+
* El bootstraper se basa en dos elementos: setHasLoadedInitialData y
|
|
77
|
+
* SuspendPanelUntilDashboardReady.
|
|
78
|
+
*
|
|
79
|
+
* El funcionamiento es muy elemental: Cada panel utiliza el Suspend como
|
|
80
|
+
* wrapper y éste registra el id del panel en un array de paneles pendientes
|
|
81
|
+
* por cargar.
|
|
82
|
+
*
|
|
83
|
+
* Una vez que todos los paneles cargaron, el suspense retoma su tarea y
|
|
84
|
+
* renderiza el panel normalmente.
|
|
85
|
+
*/
|
|
86
|
+
__publicField(this, "setPanelHasLoaded", (panelId) => {
|
|
87
|
+
__privateGet(this, _hasLoaded)[panelId] = true;
|
|
88
|
+
this.dashboard.getPanel(panelId).setHasLoaded();
|
|
89
|
+
});
|
|
90
|
+
__publicField(this, "SuspendPanelUntilDashbordReady", ({
|
|
91
|
+
children,
|
|
92
|
+
panelId
|
|
93
|
+
}) => {
|
|
94
|
+
const [hasBootstraped, setHasBootstraped] = useState(false);
|
|
95
|
+
const deferredHasBootstraped = useDeferredValue(hasBootstraped);
|
|
96
|
+
__privateGet(this, _bootstrappedPanels)[panelId] = true;
|
|
97
|
+
const LoadWaiter = useCallback(() => {
|
|
98
|
+
if (!__privateGet(this, _checkAllHasLoaded).call(this))
|
|
99
|
+
void new Promise((resolve) => {
|
|
100
|
+
const interval = setInterval(() => {
|
|
101
|
+
if (__privateGet(this, _checkAllHasLoaded).call(this)) {
|
|
102
|
+
resolve();
|
|
103
|
+
clearInterval(interval);
|
|
104
|
+
}
|
|
105
|
+
}, 300);
|
|
106
|
+
});
|
|
107
|
+
return null;
|
|
108
|
+
}, []);
|
|
109
|
+
if (!deferredHasBootstraped)
|
|
110
|
+
return /* @__PURE__ */ jsx(
|
|
111
|
+
"div",
|
|
112
|
+
{
|
|
113
|
+
ref: (el) => {
|
|
114
|
+
if (el)
|
|
115
|
+
setHasBootstraped(true);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
);
|
|
119
|
+
return /* @__PURE__ */ jsxs(Suspense, { fallback: null, children: [
|
|
120
|
+
children,
|
|
121
|
+
/* @__PURE__ */ jsx(LoadWaiter, {})
|
|
122
|
+
] });
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
_hasLoadedAll = new WeakMap();
|
|
127
|
+
_bootstrappedPanels = new WeakMap();
|
|
128
|
+
_hasLoaded = new WeakMap();
|
|
129
|
+
_initTimestamp = new WeakMap();
|
|
130
|
+
_timeoutTreshold = new WeakMap();
|
|
131
|
+
_checkAllHasLoaded = new WeakMap();
|
|
132
|
+
_removeSkeletons = new WeakMap();
|
|
133
|
+
|
|
134
|
+
export { DashboardPanelsBootstraper };
|
|
135
|
+
//# sourceMappingURL=DashboardPanelsBootstraper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardPanelsBootstraper.js","sources":["../../src/dashboard/DashboardPanelsBootstraper.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-throw-literal */\r\nimport {\r\n ReactNode,\r\n Suspense,\r\n useCallback,\r\n useDeferredValue,\r\n useState,\r\n} from 'react';\r\nimport { Dashboard } from './dashboard';\r\n\r\ndeclare global {\r\n interface Window {\r\n DASH_COURTAIN_TRESHOLD?: number;\r\n }\r\n}\r\n\r\nexport class DashboardPanelsBootstraper {\r\n #hasLoadedAll = false;\r\n #bootstrappedPanels: Record<string, boolean> = {};\r\n #hasLoaded: Record<string, boolean> = {};\r\n\r\n #initTimestamp = Date.now();\r\n #timeoutTreshold = (window.DASH_COURTAIN_TRESHOLD ?? 5) * 1000;\r\n\r\n constructor(public dashboard: Dashboard) {}\r\n\r\n #checkAllHasLoaded = () => {\r\n if (this.#hasLoadedAll) return true;\r\n\r\n const keys = Object.keys(this.#bootstrappedPanels);\r\n const hasLoadedAllPanels = !keys.find(\r\n (current) =>\r\n !this.#hasLoaded[current] && this.dashboard.getPanel(current).isVisible,\r\n );\r\n const hasTimedOutLoading =\r\n Date.now() - this.#initTimestamp > this.#timeoutTreshold;\r\n\r\n if (hasLoadedAllPanels || hasTimedOutLoading) {\r\n if (hasTimedOutLoading) {\r\n const nonBootstrappedPanels = Object.keys(this.#bootstrappedPanels)\r\n .filter((current) => !this.#hasLoaded[current])\r\n .map((panelId) => {\r\n const panelProps = this.dashboard.getPanel(panelId).props;\r\n return panelProps;\r\n });\r\n\r\n console.warn(\r\n `The courtain was removed because of timeout, check that all panels are reporting according to useYieldPanelIsReady's documentation. \\n\\nIt might have happened that all panels are reporting but the browser was too busy to handle all of them in time, in order to determine what is actually happen you can raise the DASH_COURTAIN_TRESHOLD to a very large number, like 20 for example.`,\r\n { nonBootstrappedPanels },\r\n );\r\n }\r\n\r\n this.#hasLoadedAll = true;\r\n this.#removeSkeletons();\r\n return true;\r\n }\r\n\r\n return false;\r\n };\r\n\r\n #removeSkeletons = () => {\r\n const skeleton = document.querySelector(\r\n '#DashLayoutCourtain',\r\n ) as HTMLElement;\r\n const dashContent = document.querySelector(\r\n '#DashLayoutContent',\r\n ) as HTMLElement;\r\n\r\n skeleton.style.display = 'none';\r\n dashContent.style.visibility = 'initial';\r\n skeleton.remove();\r\n };\r\n\r\n /**\r\n * El bootstraper se basa en dos elementos: setHasLoadedInitialData y\r\n * SuspendPanelUntilDashboardReady.\r\n *\r\n * El funcionamiento es muy elemental: Cada panel utiliza el Suspend como\r\n * wrapper y éste registra el id del panel en un array de paneles pendientes\r\n * por cargar.\r\n *\r\n * Una vez que todos los paneles cargaron, el suspense retoma su tarea y\r\n * renderiza el panel normalmente.\r\n */\r\n setPanelHasLoaded = (panelId: string) => {\r\n this.#hasLoaded[panelId] = true;\r\n this.dashboard.getPanel(panelId).setHasLoaded();\r\n };\r\n\r\n SuspendPanelUntilDashbordReady = ({\r\n children,\r\n panelId,\r\n }: {\r\n children: ReactNode;\r\n panelId: string;\r\n }) => {\r\n const [hasBootstraped, setHasBootstraped] = useState(false);\r\n const deferredHasBootstraped = useDeferredValue(hasBootstraped);\r\n this.#bootstrappedPanels[panelId] = true;\r\n\r\n const LoadWaiter = useCallback(() => {\r\n if (!this.#checkAllHasLoaded())\r\n void new Promise<void>((resolve) => {\r\n const interval = setInterval(() => {\r\n if (this.#checkAllHasLoaded()) {\r\n resolve();\r\n clearInterval(interval);\r\n }\r\n }, 300);\r\n });\r\n return null;\r\n }, []);\r\n\r\n if (!deferredHasBootstraped)\r\n return (\r\n <div\r\n ref={(el) => {\r\n if (el) setHasBootstraped(true);\r\n }}\r\n />\r\n );\r\n\r\n return (\r\n <Suspense fallback={null}>\r\n {children}\r\n <LoadWaiter />\r\n </Suspense>\r\n );\r\n };\r\n}\r\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { EventEmitter } from '@apia/util';
|
|
2
|
+
|
|
3
|
+
type TSwitchRoute = {
|
|
4
|
+
/**
|
|
5
|
+
* El callback será llamado si la ruta coincide.
|
|
6
|
+
*/
|
|
7
|
+
callback: (result: RegExpMatchArray) => unknown;
|
|
8
|
+
route: RegExp;
|
|
9
|
+
};
|
|
10
|
+
type TUseSwitch = TSwitchRoute[];
|
|
11
|
+
declare class Router extends EventEmitter<{
|
|
12
|
+
newRoute: string;
|
|
13
|
+
}> {
|
|
14
|
+
#private;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Se evaluarán las rutas en orden y la primera en coincidir será tomada como
|
|
18
|
+
* resultado del cambio de ruta.
|
|
19
|
+
*
|
|
20
|
+
* Las rutas provistas deberán matchear contra el path actual. El path actual
|
|
21
|
+
* es la porción de la ruta luego del dominio y el contexto. Ejemplo:
|
|
22
|
+
*
|
|
23
|
+
* http://localhost/apia => path='/'
|
|
24
|
+
* http://localhost/apia/spa/categories/comidas/1 => path='/spa/categories/comidas/1'
|
|
25
|
+
*/
|
|
26
|
+
useSwitch: (routes: TUseSwitch) => void;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export { Router, type TSwitchRoute, type TUseSwitch };
|
|
30
|
+
//# sourceMappingURL=DashboardRouter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardRouter.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { EventEmitter, useMount } from '@apia/util';
|
|
2
|
+
import { useRef } from 'react';
|
|
3
|
+
import { shallowEqual } from 'react-redux';
|
|
4
|
+
|
|
5
|
+
var __defProp = Object.defineProperty;
|
|
6
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
|
+
var __publicField = (obj, key, value) => {
|
|
8
|
+
__defNormalProp(obj, key + "" , value);
|
|
9
|
+
return value;
|
|
10
|
+
};
|
|
11
|
+
var __accessCheck = (obj, member, msg) => {
|
|
12
|
+
if (!member.has(obj))
|
|
13
|
+
throw TypeError("Cannot " + msg);
|
|
14
|
+
};
|
|
15
|
+
var __privateGet = (obj, member, getter) => {
|
|
16
|
+
__accessCheck(obj, member, "read from private field");
|
|
17
|
+
return getter ? getter.call(obj) : member.get(obj);
|
|
18
|
+
};
|
|
19
|
+
var __privateAdd = (obj, member, value) => {
|
|
20
|
+
if (member.has(obj))
|
|
21
|
+
throw TypeError("Cannot add the same private member more than once");
|
|
22
|
+
member instanceof WeakSet ? member.add(obj) : member.set(obj, value);
|
|
23
|
+
};
|
|
24
|
+
var _matchLocation, _evalRoutes;
|
|
25
|
+
class Router extends EventEmitter {
|
|
26
|
+
constructor() {
|
|
27
|
+
super();
|
|
28
|
+
__privateAdd(this, _matchLocation, (regexp) => {
|
|
29
|
+
const path = "/" + (window.location.href.replaceAll("%20", " ").match(new RegExp(`${window.CONTEXT}/?([^?]+)?(?:\\?.*)?`))?.[1] ?? "");
|
|
30
|
+
return path.match(regexp);
|
|
31
|
+
});
|
|
32
|
+
__privateAdd(this, _evalRoutes, (routes) => {
|
|
33
|
+
for (let i = 0; i < routes.length; i++) {
|
|
34
|
+
const match = __privateGet(this, _matchLocation).call(this, routes[i].route);
|
|
35
|
+
if (match) {
|
|
36
|
+
return { route: routes[i], match };
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
/**
|
|
41
|
+
* Se evaluarán las rutas en orden y la primera en coincidir será tomada como
|
|
42
|
+
* resultado del cambio de ruta.
|
|
43
|
+
*
|
|
44
|
+
* Las rutas provistas deberán matchear contra el path actual. El path actual
|
|
45
|
+
* es la porción de la ruta luego del dominio y el contexto. Ejemplo:
|
|
46
|
+
*
|
|
47
|
+
* http://localhost/apia => path='/'
|
|
48
|
+
* http://localhost/apia/spa/categories/comidas/1 => path='/spa/categories/comidas/1'
|
|
49
|
+
*/
|
|
50
|
+
__publicField(this, "useSwitch", (routes) => {
|
|
51
|
+
const lastMatch = useRef(null);
|
|
52
|
+
useMount(() => {
|
|
53
|
+
const result = __privateGet(this, _evalRoutes).call(this, routes);
|
|
54
|
+
if (result) {
|
|
55
|
+
result.route.callback(result.match);
|
|
56
|
+
}
|
|
57
|
+
return this.on("newRoute", () => {
|
|
58
|
+
const result2 = __privateGet(this, _evalRoutes).call(this, routes);
|
|
59
|
+
if (result2 && !shallowEqual(result2.match, lastMatch.current)) {
|
|
60
|
+
result2.route.callback(result2.match);
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
});
|
|
65
|
+
window.addEventListener("popstate", () => {
|
|
66
|
+
this.emit("newRoute", window.location.href);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
_matchLocation = new WeakMap();
|
|
71
|
+
_evalRoutes = new WeakMap();
|
|
72
|
+
|
|
73
|
+
export { Router };
|
|
74
|
+
//# sourceMappingURL=DashboardRouter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DashboardRouter.js","sources":["../../src/dashboard/DashboardRouter.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\r\nimport { EventEmitter, useMount } from '@apia/util';\r\nimport { useRef } from 'react';\r\nimport { shallowEqual } from 'react-redux';\r\n\r\nexport type TSwitchRoute = {\r\n /**\r\n * El callback será llamado si la ruta coincide.\r\n */\r\n callback: (result: RegExpMatchArray) => unknown;\r\n route: RegExp;\r\n};\r\n\r\nexport type TUseSwitch = TSwitchRoute[];\r\n\r\nexport class Router extends EventEmitter<{ newRoute: string }> {\r\n #matchLocation = (regexp: RegExp) => {\r\n const path =\r\n '/' +\r\n (window.location.href\r\n .replaceAll('%20', ' ')\r\n .match(new RegExp(`${window.CONTEXT}/?([^?]+)?(?:\\\\?.*)?`))?.[1] ?? '');\r\n\r\n return path.match(regexp);\r\n };\r\n\r\n constructor() {\r\n super();\r\n\r\n window.addEventListener('popstate', () => {\r\n this.emit('newRoute', window.location.href);\r\n });\r\n }\r\n\r\n #evalRoutes = (routes: TUseSwitch) => {\r\n for (let i = 0; i < routes.length; i++) {\r\n const match = this.#matchLocation(routes[i].route);\r\n if (match) {\r\n return { route: routes[i], match };\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Se evaluarán las rutas en orden y la primera en coincidir será tomada como\r\n * resultado del cambio de ruta.\r\n *\r\n * Las rutas provistas deberán matchear contra el path actual. El path actual\r\n * es la porción de la ruta luego del dominio y el contexto. Ejemplo:\r\n *\r\n * http://localhost/apia => path='/'\r\n * http://localhost/apia/spa/categories/comidas/1 => path='/spa/categories/comidas/1'\r\n */\r\n useSwitch = (routes: TUseSwitch) => {\r\n const lastMatch = useRef<TSwitchRoute | null>(null);\r\n\r\n useMount(() => {\r\n const result = this.#evalRoutes(routes);\r\n if (result) {\r\n result.route.callback(result.match);\r\n }\r\n\r\n return this.on('newRoute', () => {\r\n const result = this.#evalRoutes(routes);\r\n if (result && !shallowEqual(result.match, lastMatch.current)) {\r\n result.route.callback(result.match);\r\n }\r\n });\r\n });\r\n };\r\n}\r\n"],"names":["result"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,EAAA,WAAA;AAeO,MAAM,eAAe,YAAA,CAAmC;AAAA,EAW7D,WAAA,GAAc;AACZ,IAAA,KAAA,EAAM;AAXR,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,CAAC,MAAA,KAAmB;AACnC,MAAA,MAAM,OACJ,GAAA,IACC,MAAA,CAAO,SAAS,IAAA,CACd,UAAA,CAAW,OAAO,GAAG,CAAA,CACrB,MAAM,IAAI,MAAA,CAAO,GAAG,MAAA,CAAO,OAAO,sBAAsB,CAAC,CAAA,GAAI,CAAC,CAAA,IAAK,EAAA,CAAA;AAExE,MAAA,OAAO,IAAA,CAAK,MAAM,MAAM,CAAA;AAAA,KAC1B,CAAA;AAUA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,CAAC,MAAA,KAAuB;AACpC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,MAAM,QAAQ,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAoB,MAAA,CAAO,CAAC,CAAA,CAAE,KAAA,CAAA;AAC5C,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,OAAO,EAAE,KAAA,EAAO,MAAA,CAAO,CAAC,GAAG,KAAA,EAAM;AAAA;AACnC;AACF,KACF,CAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,MAAA,KAAuB;AAClC,MAAA,MAAM,SAAA,GAAY,OAA4B,IAAI,CAAA;AAElD,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,MAAM,MAAA,GAAS,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,MAAA,CAAA;AAChC,QAAA,IAAI,MAAA,EAAQ;AACV,UAAA,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,MAAA,CAAO,KAAK,CAAA;AAAA;AAGpC,QAAA,OAAO,IAAA,CAAK,EAAA,CAAG,UAAA,EAAY,MAAM;AAC/B,UAAA,MAAMA,OAAAA,GAAS,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,EAAiB,MAAA,CAAA;AAChC,UAAA,IAAIA,WAAU,CAAC,YAAA,CAAaA,QAAO,KAAA,EAAO,SAAA,CAAU,OAAO,CAAA,EAAG;AAC5D,YAAAA,OAAAA,CAAO,KAAA,CAAM,QAAA,CAASA,OAAAA,CAAO,KAAK,CAAA;AAAA;AACpC,SACD,CAAA;AAAA,OACF,CAAA;AAAA,KACH,CAAA;AAxCE,IAAA,MAAA,CAAO,gBAAA,CAAiB,YAAY,MAAM;AACxC,MAAA,IAAA,CAAK,IAAA,CAAK,UAAA,EAAY,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AAAA,KAC3C,CAAA;AAAA;AAuCL;AAtDE,cAAA,GAAA,IAAA,OAAA,EAAA;AAkBA,WAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from '@apia/theme/jsx-runtime';
|
|
2
|
+
import { Heading } from '@apia/theme';
|
|
3
|
+
import { usePanelIdentity } from '../common/usePanelIdentity.js';
|
|
4
|
+
import '../splash/panels/PanelContext/index.js';
|
|
5
|
+
import { useYieldPanelIsReady } from '../splash/panels/PanelContext/useYieldPanelIsReady.js';
|
|
6
|
+
|
|
7
|
+
const PanelNotFound = () => {
|
|
8
|
+
const props = usePanelIdentity();
|
|
9
|
+
useYieldPanelIsReady();
|
|
10
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Heading, { children: [
|
|
11
|
+
"Panel not found: ",
|
|
12
|
+
props.panelType
|
|
13
|
+
] }) });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { PanelNotFound };
|
|
17
|
+
//# sourceMappingURL=PanelNotFound.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PanelNotFound.js","sources":["../../src/dashboard/PanelNotFound.tsx"],"sourcesContent":["import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useYieldPanelIsReady } from '../splash/panels/PanelContext';\r\n\r\nexport const PanelNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n useYieldPanelIsReady();\r\n\r\n return (\r\n <>\r\n <Heading>Panel not found: {props.panelType}</Heading>\r\n </>\r\n );\r\n};\r\n"],"names":[],"mappings":";;;;;;AAIO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,QAAQ,gBAAA,EAAiB;AAE/B,EAAA,oBAAA,EAAqB;AAErB,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACE,+BAAC,OAAA,EAAA,EAAQ,QAAA,EAAA;AAAA,IAAA,mBAAA;AAAA,IAAkB,KAAA,CAAM;AAAA,GAAA,EAAU,CAAA,EAC7C,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import * as react from 'react';
|
|
2
|
+
import { ReactPortal } from 'react';
|
|
3
|
+
import { EventEmitter, TasksQueue } from '@apia/util';
|
|
4
|
+
import { PanelContainer } from '../types.js';
|
|
5
|
+
import { DashboardPanelsBootstraper } from './DashboardPanelsBootstraper.js';
|
|
6
|
+
import { DashboardPanel } from './DashboardPanel.js';
|
|
7
|
+
import { Router } from './DashboardRouter.js';
|
|
8
|
+
|
|
9
|
+
declare class Dashboard extends EventEmitter<{
|
|
10
|
+
changeScene: string;
|
|
11
|
+
}> {
|
|
12
|
+
#private;
|
|
13
|
+
urlContext: string;
|
|
14
|
+
bootstrapper: DashboardPanelsBootstraper;
|
|
15
|
+
panels: Record<string, DashboardPanel> | null;
|
|
16
|
+
queueRefresh: boolean;
|
|
17
|
+
router: Router;
|
|
18
|
+
scenes: Record<string, string[]>;
|
|
19
|
+
tasksQueue: TasksQueue;
|
|
20
|
+
getPanel: (id: string) => DashboardPanel;
|
|
21
|
+
getPanelByName: (name: string) => DashboardPanel | undefined;
|
|
22
|
+
constructor(panelsContainer: PanelContainer | undefined, urlContext: string);
|
|
23
|
+
loadScene: (scene?: string) => ReactPortal[];
|
|
24
|
+
Component: () => react.JSX.Element;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export { Dashboard };
|
|
28
|
+
//# sourceMappingURL=dashboard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { jsx } from '@apia/theme/jsx-runtime';
|
|
2
|
+
import { EventEmitter, TasksQueue, useMount } from '@apia/util';
|
|
3
|
+
import { useState, useDeferredValue } from 'react';
|
|
4
|
+
import { DefaultPanelWrapper } from '../splash/panels/DefaultPanelWrapper/index.js';
|
|
5
|
+
import { DashboardPanelsBootstraper } from './DashboardPanelsBootstraper.js';
|
|
6
|
+
import { DashboardContext } from './DashboardContext.js';
|
|
7
|
+
import { DashboardPanel } from './DashboardPanel.js';
|
|
8
|
+
import { DragAndDrop } from '../splash/util/DragAndDrop.js';
|
|
9
|
+
import { eventsController } from '../eventsController/eventsController.js';
|
|
10
|
+
import { Router } from './DashboardRouter.js';
|
|
11
|
+
import { importContainer } from '../util.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 __privateSet = (obj, member, value, setter) => {
|
|
33
|
+
__accessCheck(obj, member, "write to private field");
|
|
34
|
+
member.set(obj, value);
|
|
35
|
+
return value;
|
|
36
|
+
};
|
|
37
|
+
var _currentScene, _dragAndDrop, _PanelContainer, _panelsRenderedPortals, _loadPanels, _Context, _suscribeToEvents, _usePanelsList, _SceneRenderer;
|
|
38
|
+
class Dashboard extends EventEmitter {
|
|
39
|
+
constructor(panelsContainer = DefaultPanelWrapper, urlContext) {
|
|
40
|
+
super();
|
|
41
|
+
this.urlContext = urlContext;
|
|
42
|
+
__publicField(this, "bootstrapper", new DashboardPanelsBootstraper(this));
|
|
43
|
+
__publicField(this, "panels", null);
|
|
44
|
+
__publicField(this, "queueRefresh", true);
|
|
45
|
+
//TODO: Crear parametro del dashboard
|
|
46
|
+
__publicField(this, "router", new Router());
|
|
47
|
+
__publicField(this, "scenes", {});
|
|
48
|
+
__publicField(this, "tasksQueue", new TasksQueue());
|
|
49
|
+
__privateAdd(this, _currentScene, "/");
|
|
50
|
+
__privateAdd(this, _dragAndDrop, new DragAndDrop());
|
|
51
|
+
__privateAdd(this, _PanelContainer, DefaultPanelWrapper);
|
|
52
|
+
__privateAdd(this, _panelsRenderedPortals, []);
|
|
53
|
+
__publicField(this, "getPanel", (id) => this.panels?.[id]);
|
|
54
|
+
__publicField(this, "getPanelByName", (name) => Object.values(this.panels ?? {}).find(
|
|
55
|
+
(current) => current.props.name === name
|
|
56
|
+
));
|
|
57
|
+
__privateAdd(this, _loadPanels, () => {
|
|
58
|
+
this.panels = {};
|
|
59
|
+
const panelsElements = document.querySelectorAll(
|
|
60
|
+
"[data-panel]"
|
|
61
|
+
);
|
|
62
|
+
Array.from(panelsElements).forEach((current) => {
|
|
63
|
+
let container = __privateGet(this, _PanelContainer);
|
|
64
|
+
const customContainer = current.dataset.panelContainer;
|
|
65
|
+
if (customContainer) {
|
|
66
|
+
container = importContainer(current.dataset.panelContainer);
|
|
67
|
+
}
|
|
68
|
+
const panel = new DashboardPanel({
|
|
69
|
+
dashboard: this,
|
|
70
|
+
PanelContainer: container,
|
|
71
|
+
id: current.dataset.id
|
|
72
|
+
});
|
|
73
|
+
let panelPath = panel.getParameters().PAR_SPA_PATH || "*";
|
|
74
|
+
if (panelPath === "/")
|
|
75
|
+
panelPath = `/${this.urlContext}`;
|
|
76
|
+
if (panelPath !== "*")
|
|
77
|
+
panel.hide();
|
|
78
|
+
else
|
|
79
|
+
panel.show();
|
|
80
|
+
const paths = panelPath.split(",");
|
|
81
|
+
paths.forEach((currentPath) => {
|
|
82
|
+
if (!this.scenes[currentPath])
|
|
83
|
+
this.scenes[currentPath] = [];
|
|
84
|
+
this.scenes[currentPath].push(panel.props.id);
|
|
85
|
+
});
|
|
86
|
+
this.panels[panel.props.id] = panel;
|
|
87
|
+
__privateGet(this, _panelsRenderedPortals).push(panel.portal);
|
|
88
|
+
});
|
|
89
|
+
__privateGet(this, _dragAndDrop).bootstrap();
|
|
90
|
+
});
|
|
91
|
+
__privateAdd(this, _Context, ({ children }) => {
|
|
92
|
+
return /* @__PURE__ */ jsx(DashboardContext.Provider, { value: this, children });
|
|
93
|
+
});
|
|
94
|
+
__privateAdd(this, _suscribeToEvents, () => {
|
|
95
|
+
eventsController.onEvent({ eventType: "dashboard__focus" }, () => {
|
|
96
|
+
Object.values(this.panels ?? {}).forEach((current) => {
|
|
97
|
+
if (current.props.refreshOnHome) {
|
|
98
|
+
void current.refresh();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
__privateAdd(this, _usePanelsList, () => {
|
|
104
|
+
const [panels, setPanels] = useState(null);
|
|
105
|
+
const deferredPanels = useDeferredValue(panels);
|
|
106
|
+
useMount(() => {
|
|
107
|
+
this.loadScene();
|
|
108
|
+
setPanels(__privateGet(this, _panelsRenderedPortals));
|
|
109
|
+
});
|
|
110
|
+
this.router.useSwitch([
|
|
111
|
+
{
|
|
112
|
+
route: new RegExp(`(?:/spa)?/(\\w+)`),
|
|
113
|
+
callback: (result) => {
|
|
114
|
+
this.loadScene(result[1]);
|
|
115
|
+
}
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
route: new RegExp(`/`),
|
|
119
|
+
callback: () => {
|
|
120
|
+
this.loadScene("/");
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
]);
|
|
124
|
+
return deferredPanels;
|
|
125
|
+
});
|
|
126
|
+
__privateAdd(this, _SceneRenderer, () => {
|
|
127
|
+
const Context = __privateGet(this, _Context);
|
|
128
|
+
const panels = __privateGet(this, _usePanelsList).call(this);
|
|
129
|
+
return /* @__PURE__ */ jsx(Context, { children: panels });
|
|
130
|
+
});
|
|
131
|
+
__publicField(this, "loadScene", (scene = __privateGet(this, _currentScene)) => {
|
|
132
|
+
let actualScene = scene;
|
|
133
|
+
if (!actualScene.startsWith("/"))
|
|
134
|
+
actualScene = `/${actualScene}`;
|
|
135
|
+
if (!this.panels)
|
|
136
|
+
__privateGet(this, _loadPanels).call(this);
|
|
137
|
+
if (!this.scenes[actualScene])
|
|
138
|
+
this.scenes[actualScene] = [];
|
|
139
|
+
this.scenes[__privateGet(this, _currentScene)].forEach((scenePanelId) => {
|
|
140
|
+
if (!this.scenes[actualScene].includes(scenePanelId))
|
|
141
|
+
this.panels?.[scenePanelId]?.hide();
|
|
142
|
+
});
|
|
143
|
+
this.scenes[actualScene].forEach((scenePanelIds) => {
|
|
144
|
+
const panel = this.panels?.[scenePanelIds];
|
|
145
|
+
if (panel) {
|
|
146
|
+
panel.show();
|
|
147
|
+
if (panel.hasInited && panel.props.refreshOnStart)
|
|
148
|
+
void panel.refresh();
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
__privateSet(this, _currentScene, actualScene);
|
|
152
|
+
return __privateGet(this, _panelsRenderedPortals);
|
|
153
|
+
});
|
|
154
|
+
__publicField(this, "Component", () => {
|
|
155
|
+
const R = __privateGet(this, _SceneRenderer);
|
|
156
|
+
return /* @__PURE__ */ jsx(R, {});
|
|
157
|
+
});
|
|
158
|
+
__privateSet(this, _currentScene, `/`);
|
|
159
|
+
__privateSet(this, _PanelContainer, panelsContainer ?? __privateGet(this, _PanelContainer));
|
|
160
|
+
__privateGet(this, _suscribeToEvents).call(this);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
_currentScene = new WeakMap();
|
|
164
|
+
_dragAndDrop = new WeakMap();
|
|
165
|
+
_PanelContainer = new WeakMap();
|
|
166
|
+
_panelsRenderedPortals = new WeakMap();
|
|
167
|
+
_loadPanels = new WeakMap();
|
|
168
|
+
_Context = new WeakMap();
|
|
169
|
+
_suscribeToEvents = new WeakMap();
|
|
170
|
+
_usePanelsList = new WeakMap();
|
|
171
|
+
_SceneRenderer = new WeakMap();
|
|
172
|
+
|
|
173
|
+
export { Dashboard };
|
|
174
|
+
//# sourceMappingURL=dashboard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dashboard.js","sources":["../../src/dashboard/dashboard.tsx"],"sourcesContent":["import { EventEmitter, TasksQueue, useMount } from '@apia/util';\r\nimport { ReactNode, ReactPortal, useDeferredValue, useState } from 'react';\r\nimport { PanelContainer } from '../types';\r\nimport { DefaultPanelWrapper } from '../splash/panels/DefaultPanelWrapper';\r\nimport { DashboardPanelsBootstraper } from './DashboardPanelsBootstraper';\r\nimport { DashboardContext } from './DashboardContext';\r\nimport { DashboardPanel } from './DashboardPanel';\r\nimport { DragAndDrop } from '../splash/util/DragAndDrop';\r\nimport { eventsController } from '../eventsController';\r\nimport { Router } from './DashboardRouter';\r\nimport { importContainer } from '../util';\r\n\r\nexport class Dashboard extends EventEmitter<{\r\n changeScene: string;\r\n}> {\r\n bootstrapper = new DashboardPanelsBootstraper(this);\r\n panels: Record<string, DashboardPanel> | null = null;\r\n queueRefresh: boolean = true; //TODO: Crear parametro del dashboard\r\n router = new Router();\r\n scenes: Record<string, string[]> = {};\r\n\r\n tasksQueue = new TasksQueue();\r\n #currentScene = '/';\r\n #dragAndDrop = new DragAndDrop();\r\n #PanelContainer: PanelContainer = DefaultPanelWrapper;\r\n #panelsRenderedPortals: ReactPortal[] = [];\r\n\r\n getPanel = (id: string) => this.panels?.[id] as DashboardPanel;\r\n getPanelByName = (name: string) =>\r\n Object.values(this.panels ?? {}).find(\r\n (current) => current.props.name === name,\r\n );\r\n\r\n #loadPanels = () => {\r\n this.panels = {};\r\n\r\n const panelsElements = document.querySelectorAll(\r\n '[data-panel]',\r\n ) as NodeListOf<HTMLElement>;\r\n\r\n Array.from(panelsElements).forEach((current) => {\r\n let container = this.#PanelContainer;\r\n\r\n const customContainer = current.dataset.panelContainer;\r\n if (customContainer) {\r\n container = importContainer(current.dataset.panelContainer!);\r\n }\r\n\r\n const panel = new DashboardPanel({\r\n dashboard: this,\r\n PanelContainer: container,\r\n id: current.dataset.id as string,\r\n });\r\n\r\n let panelPath = (panel.getParameters().PAR_SPA_PATH as string) || '*';\r\n if (panelPath === '/') panelPath = `/${this.urlContext}`;\r\n if (panelPath !== '*') panel.hide();\r\n else panel.show();\r\n\r\n const paths = panelPath.split(',');\r\n paths.forEach((currentPath) => {\r\n if (!this.scenes[currentPath]) this.scenes[currentPath] = [];\r\n this.scenes[currentPath].push(panel.props.id);\r\n });\r\n\r\n (this.panels as Record<string, DashboardPanel>)[panel.props.id] = panel;\r\n\r\n this.#panelsRenderedPortals.push(panel.portal);\r\n });\r\n\r\n this.#dragAndDrop.bootstrap();\r\n };\r\n\r\n #Context = ({ children }: { children: ReactNode }) => {\r\n return (\r\n <DashboardContext.Provider value={this}>\r\n {children}\r\n </DashboardContext.Provider>\r\n );\r\n };\r\n\r\n #suscribeToEvents = () => {\r\n eventsController.onEvent({ eventType: 'dashboard__focus' }, () => {\r\n Object.values(this.panels ?? {}).forEach((current) => {\r\n if (current.props.refreshOnHome) {\r\n void current.refresh();\r\n }\r\n });\r\n });\r\n };\r\n #usePanelsList = () => {\r\n const [panels, setPanels] = useState<ReactNode>(null);\r\n const deferredPanels = useDeferredValue(panels);\r\n\r\n useMount(() => {\r\n this.loadScene();\r\n setPanels(this.#panelsRenderedPortals);\r\n });\r\n\r\n this.router.useSwitch([\r\n {\r\n route: new RegExp(`(?:/spa)?/(\\\\w+)`),\r\n callback: (result) => {\r\n this.loadScene(result[1]);\r\n },\r\n },\r\n {\r\n route: new RegExp(`/`),\r\n callback: () => {\r\n this.loadScene('/');\r\n },\r\n },\r\n ]);\r\n\r\n return deferredPanels;\r\n };\r\n\r\n constructor(\r\n panelsContainer: PanelContainer = DefaultPanelWrapper,\r\n public urlContext: string,\r\n ) {\r\n super();\r\n\r\n this.#currentScene = `/`;\r\n this.#PanelContainer = panelsContainer ?? this.#PanelContainer;\r\n this.#suscribeToEvents();\r\n }\r\n\r\n #SceneRenderer = () => {\r\n const Context = this.#Context;\r\n const panels = this.#usePanelsList();\r\n\r\n return <Context>{panels}</Context>;\r\n };\r\n\r\n loadScene = (scene: string = this.#currentScene): ReactPortal[] => {\r\n let actualScene = scene;\r\n if (!actualScene.startsWith('/')) actualScene = `/${actualScene}`;\r\n\r\n if (!this.panels) this.#loadPanels();\r\n if (!this.scenes[actualScene]) this.scenes[actualScene] = [];\r\n\r\n this.scenes[this.#currentScene].forEach((scenePanelId) => {\r\n if (!this.scenes[actualScene].includes(scenePanelId))\r\n this.panels?.[scenePanelId]?.hide();\r\n });\r\n this.scenes[actualScene].forEach((scenePanelIds) => {\r\n const panel = this.panels?.[scenePanelIds];\r\n if (panel) {\r\n panel.show();\r\n if (panel.hasInited && panel.props.refreshOnStart) void panel.refresh();\r\n }\r\n });\r\n\r\n this.#currentScene = actualScene;\r\n\r\n return this.#panelsRenderedPortals;\r\n };\r\n\r\n Component = () => {\r\n const R = this.#SceneRenderer;\r\n return <R />;\r\n };\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,aAAA,EAAA,YAAA,EAAA,eAAA,EAAA,sBAAA,EAAA,WAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,cAAA;AAYO,MAAM,kBAAkB,YAAA,CAE5B;AAAA,EAuGD,WAAA,CACE,eAAA,GAAkC,mBAAA,EAC3B,UAAA,EACP;AACA,IAAA,KAAA,EAAM;AAFC,IAAA,IAAA,CAAA,UAAA,GAAA,UAAA;AAxGT,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAAe,IAAI,2BAA2B,IAAI,CAAA,CAAA;AAClD,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAgD,IAAA,CAAA;AAChD,IAAA,aAAA,CAAA,IAAA,EAAA,cAAA,EAAwB,IAAA,CAAA;AACxB;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAS,IAAI,MAAA,EAAO,CAAA;AACpB,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,EAAmC,EAAC,CAAA;AAEpC,IAAA,aAAA,CAAA,IAAA,EAAA,YAAA,EAAa,IAAI,UAAA,EAAW,CAAA;AAC5B,IAAA,YAAA,CAAA,IAAA,EAAA,aAAA,EAAgB,GAAA,CAAA;AAChB,IAAA,YAAA,CAAA,IAAA,EAAA,YAAA,EAAe,IAAI,WAAA,EAAY,CAAA;AAC/B,IAAA,YAAA,CAAA,IAAA,EAAA,eAAA,EAAkC,mBAAA,CAAA;AAClC,IAAA,YAAA,CAAA,IAAA,EAAA,sBAAA,EAAwC,EAAC,CAAA;AAEzC,IAAA,aAAA,CAAA,IAAA,EAAA,UAAA,EAAW,CAAC,EAAA,KAAe,IAAA,CAAK,MAAA,GAAS,EAAE,CAAA,CAAA;AAC3C,IAAA,aAAA,CAAA,IAAA,EAAA,gBAAA,EAAiB,CAAC,SAChB,MAAA,CAAO,MAAA,CAAO,KAAK,MAAA,IAAU,EAAE,CAAA,CAAE,IAAA;AAAA,MAC/B,CAAC,OAAA,KAAY,OAAA,CAAQ,KAAA,CAAM,IAAA,KAAS;AAAA,KACtC,CAAA;AAEF,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,MAAM;AAClB,MAAA,IAAA,CAAK,SAAS,EAAC;AAEf,MAAA,MAAM,iBAAiB,QAAA,CAAS,gBAAA;AAAA,QAC9B;AAAA,OACF;AAEA,MAAA,KAAA,CAAM,IAAA,CAAK,cAAc,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY;AAC9C,QAAA,IAAI,YAAY,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA;AAErB,QAAA,MAAM,eAAA,GAAkB,QAAQ,OAAA,CAAQ,cAAA;AACxC,QAAA,IAAI,eAAA,EAAiB;AACnB,UAAA,SAAA,GAAY,eAAA,CAAgB,OAAA,CAAQ,OAAA,CAAQ,cAAe,CAAA;AAAA;AAG7D,QAAA,MAAM,KAAA,GAAQ,IAAI,cAAA,CAAe;AAAA,UAC/B,SAAA,EAAW,IAAA;AAAA,UACX,cAAA,EAAgB,SAAA;AAAA,UAChB,EAAA,EAAI,QAAQ,OAAA,CAAQ;AAAA,SACrB,CAAA;AAED,QAAA,IAAI,SAAA,GAAa,KAAA,CAAM,aAAA,EAAc,CAAE,YAAA,IAA2B,GAAA;AAClE,QAAA,IAAI,SAAA,KAAc,GAAA;AAAK,UAAA,SAAA,GAAY,CAAA,CAAA,EAAI,KAAK,UAAU,CAAA,CAAA;AACtD,QAAA,IAAI,SAAA,KAAc,GAAA;AAAK,UAAA,KAAA,CAAM,IAAA,EAAK;AAAA;AAC7B,UAAA,KAAA,CAAM,IAAA,EAAK;AAEhB,QAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA;AACjC,QAAA,KAAA,CAAM,OAAA,CAAQ,CAAC,WAAA,KAAgB;AAC7B,UAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAG,YAAA,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,GAAI,EAAC;AAC3D,UAAA,IAAA,CAAK,OAAO,WAAW,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,MAAM,EAAE,CAAA;AAAA,SAC7C,CAAA;AAED,QAAC,IAAA,CAAK,MAAA,CAA0C,KAAA,CAAM,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA;AAElE,QAAA,YAAA,CAAA,IAAA,EAAK,sBAAA,CAAA,CAAuB,IAAA,CAAK,KAAA,CAAM,MAAM,CAAA;AAAA,OAC9C,CAAA;AAED,MAAA,YAAA,CAAA,IAAA,EAAK,cAAa,SAAA,EAAU;AAAA,KAC9B,CAAA;AAEA,IAAA,YAAA,CAAA,IAAA,EAAA,QAAA,EAAW,CAAC,EAAE,QAAA,EAAS,KAA+B;AACpD,MAAA,2BACG,gBAAA,CAAiB,QAAA,EAAjB,EAA0B,KAAA,EAAO,MAC/B,QAAA,EACH,CAAA;AAAA,KAEJ,CAAA;AAEA,IAAA,YAAA,CAAA,IAAA,EAAA,iBAAA,EAAoB,MAAM;AACxB,MAAA,gBAAA,CAAiB,OAAA,CAAQ,EAAE,SAAA,EAAW,kBAAA,IAAsB,MAAM;AAChE,QAAA,MAAA,CAAO,MAAA,CAAO,KAAK,MAAA,IAAU,EAAE,CAAA,CAAE,OAAA,CAAQ,CAAC,OAAA,KAAY;AACpD,UAAA,IAAI,OAAA,CAAQ,MAAM,aAAA,EAAe;AAC/B,YAAA,KAAK,QAAQ,OAAA,EAAQ;AAAA;AACvB,SACD,CAAA;AAAA,OACF,CAAA;AAAA,KACH,CAAA;AACA,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,MAAM;AACrB,MAAA,MAAM,CAAC,MAAA,EAAQ,SAAS,CAAA,GAAI,SAAoB,IAAI,CAAA;AACpD,MAAA,MAAM,cAAA,GAAiB,iBAAiB,MAAM,CAAA;AAE9C,MAAA,QAAA,CAAS,MAAM;AACb,QAAA,IAAA,CAAK,SAAA,EAAU;AACf,QAAA,SAAA,CAAU,mBAAK,sBAAA,CAAsB,CAAA;AAAA,OACtC,CAAA;AAED,MAAA,IAAA,CAAK,OAAO,SAAA,CAAU;AAAA,QACpB;AAAA,UACE,KAAA,EAAO,IAAI,MAAA,CAAO,CAAA,gBAAA,CAAkB,CAAA;AAAA,UACpC,QAAA,EAAU,CAAC,MAAA,KAAW;AACpB,YAAA,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,CAAC,CAAA;AAAA;AAC1B,SACF;AAAA,QACA;AAAA,UACE,KAAA,EAAO,IAAI,MAAA,CAAO,CAAA,CAAA,CAAG,CAAA;AAAA,UACrB,UAAU,MAAM;AACd,YAAA,IAAA,CAAK,UAAU,GAAG,CAAA;AAAA;AACpB;AACF,OACD,CAAA;AAED,MAAA,OAAO,cAAA;AAAA,KACT,CAAA;AAaA,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,MAAM;AACrB,MAAA,MAAM,UAAU,YAAA,CAAA,IAAA,EAAK,QAAA,CAAA;AACrB,MAAA,MAAM,MAAA,GAAS,mBAAK,cAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAEf,MAAA,uBAAO,GAAA,CAAC,WAAS,QAAA,EAAA,MAAA,EAAO,CAAA;AAAA,KAC1B,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,KAAA,GAAgB,YAAA,CAAA,IAAA,EAAK,aAAA,CAAA,KAAiC;AACjE,MAAA,IAAI,WAAA,GAAc,KAAA;AAClB,MAAA,IAAI,CAAC,WAAA,CAAY,UAAA,CAAW,GAAG,CAAA;AAAG,QAAA,WAAA,GAAc,IAAI,WAAW,CAAA,CAAA;AAE/D,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA;AAAQ,QAAA,YAAA,CAAA,IAAA,EAAK,WAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAClB,MAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA;AAAG,QAAA,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,GAAI,EAAC;AAE3D,MAAA,IAAA,CAAK,OAAO,YAAA,CAAA,IAAA,EAAK,aAAA,CAAa,CAAA,CAAE,OAAA,CAAQ,CAAC,YAAA,KAAiB;AACxD,QAAA,IAAI,CAAC,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,CAAE,SAAS,YAAY,CAAA;AACjD,UAAA,IAAA,CAAK,MAAA,GAAS,YAAY,CAAA,EAAG,IAAA,EAAK;AAAA,OACrC,CAAA;AACD,MAAA,IAAA,CAAK,MAAA,CAAO,WAAW,CAAA,CAAE,OAAA,CAAQ,CAAC,aAAA,KAAkB;AAClD,QAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,MAAA,GAAS,aAAa,CAAA;AACzC,QAAA,IAAI,KAAA,EAAO;AACT,UAAA,KAAA,CAAM,IAAA,EAAK;AACX,UAAA,IAAI,KAAA,CAAM,SAAA,IAAa,KAAA,CAAM,KAAA,CAAM,cAAA;AAAgB,YAAA,KAAK,MAAM,OAAA,EAAQ;AAAA;AACxE,OACD,CAAA;AAED,MAAA,YAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,WAAA,CAAA;AAErB,MAAA,OAAO,YAAA,CAAA,IAAA,EAAK,sBAAA,CAAA;AAAA,KACd,CAAA;AAEA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,MAAM;AAChB,MAAA,MAAM,IAAI,YAAA,CAAA,IAAA,EAAK,cAAA,CAAA;AACf,MAAA,2BAAQ,CAAA,EAAA,EAAE,CAAA;AAAA,KACZ,CAAA;AAvCE,IAAA,YAAA,CAAA,IAAA,EAAK,aAAA,EAAgB,CAAA,CAAA,CAAA,CAAA;AACrB,IAAA,YAAA,CAAA,IAAA,EAAK,eAAA,EAAkB,mBAAmB,YAAA,CAAA,IAAA,EAAK,eAAA,CAAA,CAAA;AAC/C,IAAA,YAAA,CAAA,IAAA,EAAK,iBAAA,CAAA,CAAL,IAAA,CAAA,IAAA,CAAA;AAAA;AAsCJ;AA7IE,aAAA,GAAA,IAAA,OAAA,EAAA;AACA,YAAA,GAAA,IAAA,OAAA,EAAA;AACA,eAAA,GAAA,IAAA,OAAA,EAAA;AACA,sBAAA,GAAA,IAAA,OAAA,EAAA;AAQA,WAAA,GAAA,IAAA,OAAA,EAAA;AAwCA,QAAA,GAAA,IAAA,OAAA,EAAA;AAQA,iBAAA,GAAA,IAAA,OAAA,EAAA;AASA,cAAA,GAAA,IAAA,OAAA,EAAA;AAsCA,cAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TPanelEventRegister, TPanelIdentifier, TPanelEventIdentifier, TPanelEventCallback } from './types.js';
|
|
2
|
+
|
|
3
|
+
declare const eventsController: {
|
|
4
|
+
callbacks: TPanelEventRegister<any>[];
|
|
5
|
+
broadcast(eventType: string, payload: any): void;
|
|
6
|
+
fireEvent(origin: TPanelIdentifier, eventType: string, payload: any): void;
|
|
7
|
+
onEvent<PayloadEvent>(distinction: Partial<TPanelEventIdentifier>, callback: TPanelEventCallback<PayloadEvent>): () => void;
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export { eventsController };
|
|
11
|
+
//# sourceMappingURL=eventsController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventsController.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __publicField = (obj, key, value) => {
|
|
4
|
+
__defNormalProp(obj, key + "" , value);
|
|
5
|
+
return value;
|
|
6
|
+
};
|
|
7
|
+
function identifierAfitsOnB(a, b) {
|
|
8
|
+
for (const key of Object.keys(a)) {
|
|
9
|
+
if (a[key] !== b[key])
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
return true;
|
|
13
|
+
}
|
|
14
|
+
const eventsController = new class EventsController {
|
|
15
|
+
constructor() {
|
|
16
|
+
__publicField(this, "callbacks", []);
|
|
17
|
+
}
|
|
18
|
+
broadcast(eventType, payload) {
|
|
19
|
+
const origin = {
|
|
20
|
+
panelId: "broadcast",
|
|
21
|
+
panelName: "broadcast",
|
|
22
|
+
panelType: "broadcast",
|
|
23
|
+
panelTitle: "broadcast"
|
|
24
|
+
};
|
|
25
|
+
this.callbacks.forEach(({ callback, ...current }) => {
|
|
26
|
+
if (eventType === current.eventType) {
|
|
27
|
+
callback({ ...origin, eventType, payload });
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
fireEvent(origin, eventType, payload) {
|
|
32
|
+
if ([origin.panelId, origin.panelName, origin.panelType].includes("*"))
|
|
33
|
+
throw new Error(
|
|
34
|
+
"Broadcast is not allowed through fireEvent, use broadcast instead"
|
|
35
|
+
);
|
|
36
|
+
this.callbacks.forEach(({ callback, ...current }) => {
|
|
37
|
+
if (identifierAfitsOnB(current, { ...origin, eventType })) {
|
|
38
|
+
callback({ ...origin, eventType, payload });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
onEvent(distinction, callback) {
|
|
43
|
+
const register = {
|
|
44
|
+
...distinction,
|
|
45
|
+
callback
|
|
46
|
+
};
|
|
47
|
+
this.callbacks.push(register);
|
|
48
|
+
return () => {
|
|
49
|
+
this.callbacks = this.callbacks.filter((current) => {
|
|
50
|
+
return current !== register;
|
|
51
|
+
});
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}();
|
|
55
|
+
|
|
56
|
+
export { eventsController };
|
|
57
|
+
//# sourceMappingURL=eventsController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventsController.js","sources":["../../src/eventsController/eventsController.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n TPanelEventCallback,\r\n TPanelEventIdentifier,\r\n TPanelEventRegister,\r\n TPanelIdentifier,\r\n} from './types';\r\n\r\nfunction identifierAfitsOnB(\r\n a: Partial<TPanelEventIdentifier>,\r\n b: TPanelEventIdentifier,\r\n) {\r\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-for-in-array\r\n for (const key of Object.keys(a)) {\r\n if (\r\n a[key as keyof Partial<TPanelIdentifier>] !==\r\n b[key as keyof TPanelIdentifier]\r\n )\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport const eventsController = new (class EventsController {\r\n callbacks: TPanelEventRegister<any>[] = [];\r\n\r\n broadcast(eventType: string, payload: any) {\r\n const origin: TPanelIdentifier = {\r\n panelId: 'broadcast',\r\n panelName: 'broadcast',\r\n panelType: 'broadcast',\r\n panelTitle: 'broadcast',\r\n };\r\n\r\n this.callbacks.forEach(({ callback, ...current }) => {\r\n if (eventType === current.eventType) {\r\n callback({ ...origin, eventType, payload });\r\n }\r\n });\r\n }\r\n\r\n fireEvent(origin: TPanelIdentifier, eventType: string, payload: any) {\r\n if ([origin.panelId, origin.panelName, origin.panelType].includes('*'))\r\n throw new Error(\r\n 'Broadcast is not allowed through fireEvent, use broadcast instead',\r\n );\r\n\r\n this.callbacks.forEach(({ callback, ...current }) => {\r\n if (identifierAfitsOnB(current, { ...origin, eventType })) {\r\n callback({ ...origin, eventType, payload });\r\n }\r\n });\r\n }\r\n\r\n onEvent<PayloadEvent>(\r\n distinction: Partial<TPanelEventIdentifier>,\r\n callback: TPanelEventCallback<PayloadEvent>,\r\n ) {\r\n const register: TPanelEventRegister<PayloadEvent> = {\r\n ...distinction,\r\n callback,\r\n };\r\n\r\n this.callbacks.push(register);\r\n\r\n return () => {\r\n this.callbacks = this.callbacks.filter((current) => {\r\n return current !== register;\r\n });\r\n };\r\n }\r\n})();\r\n"],"names":[],"mappings":";;;;;;AASA,SAAS,kBAAA,CACP,GACA,CAAA,EACA;AAEA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,EAAG;AAChC,IAAA,IACE,CAAA,CAAE,GAAsC,CAAA,KACxC,CAAA,CAAE,GAA6B,CAAA;AAE/B,MAAA,OAAO,KAAA;AAAA;AAGX,EAAA,OAAO,IAAA;AACT;AAEO,MAAM,gBAAA,GAAmB,IAAK,MAAM,gBAAA,CAAiB;AAAA,EAAvB,WAAA,GAAA;AACnC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAwC,EAAC,CAAA;AAAA;AAAA,EAEzC,SAAA,CAAU,WAAmB,OAAA,EAAc;AACzC,IAAA,MAAM,MAAA,GAA2B;AAAA,MAC/B,OAAA,EAAS,WAAA;AAAA,MACT,SAAA,EAAW,WAAA;AAAA,MACX,SAAA,EAAW,WAAA;AAAA,MACX,UAAA,EAAY;AAAA,KACd;AAEA,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,EAAE,QAAA,EAAU,GAAG,SAAQ,KAAM;AACnD,MAAA,IAAI,SAAA,KAAc,QAAQ,SAAA,EAAW;AACnC,QAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAAA;AAC5C,KACD,CAAA;AAAA;AACH,EAEA,SAAA,CAAU,MAAA,EAA0B,SAAA,EAAmB,OAAA,EAAc;AACnE,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS,MAAA,CAAO,WAAW,MAAA,CAAO,SAAS,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AACnE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAEF,IAAA,IAAA,CAAK,UAAU,OAAA,CAAQ,CAAC,EAAE,QAAA,EAAU,GAAG,SAAQ,KAAM;AACnD,MAAA,IAAI,mBAAmB,OAAA,EAAS,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,CAAA,EAAG;AACzD,QAAA,QAAA,CAAS,EAAE,GAAG,MAAA,EAAQ,SAAA,EAAW,SAAS,CAAA;AAAA;AAC5C,KACD,CAAA;AAAA;AACH,EAEA,OAAA,CACE,aACA,QAAA,EACA;AACA,IAAA,MAAM,QAAA,GAA8C;AAAA,MAClD,GAAG,WAAA;AAAA,MACH;AAAA,KACF;AAEA,IAAA,IAAA,CAAK,SAAA,CAAU,KAAK,QAAQ,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAA,GAAY,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,CAAC,OAAA,KAAY;AAClD,QAAA,OAAO,OAAA,KAAY,QAAA;AAAA,OACpB,CAAA;AAAA,KACH;AAAA;AAEJ,CAAA;;;;"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { TPanelId, TPanelName, TPanelType } from '../types.js';
|
|
2
|
+
|
|
3
|
+
interface TPanelIdentifier {
|
|
4
|
+
panelId: TPanelId;
|
|
5
|
+
panelName: TPanelName;
|
|
6
|
+
panelTitle: string;
|
|
7
|
+
panelType: TPanelType;
|
|
8
|
+
}
|
|
9
|
+
type TPanelEventIdentifier = TPanelIdentifier & {
|
|
10
|
+
eventType: string;
|
|
11
|
+
};
|
|
12
|
+
type TPanelEvent<PayloadEvent = unknown> = TPanelEventIdentifier & {
|
|
13
|
+
payload: PayloadEvent;
|
|
14
|
+
};
|
|
15
|
+
type TPanelEventCallback<PayloadEvent> = (event: TPanelEvent<PayloadEvent>) => unknown;
|
|
16
|
+
type TPanelEventRegister<PayloadEvent> = {
|
|
17
|
+
callback: TPanelEventCallback<PayloadEvent>;
|
|
18
|
+
} & Partial<TPanelEventIdentifier>;
|
|
19
|
+
|
|
20
|
+
export type { TPanelEvent, TPanelEventCallback, TPanelEventIdentifier, TPanelEventRegister, TPanelIdentifier };
|
|
21
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Este hook devuelve un método que puede ser llamado para emitir un evento en
|
|
3
|
+
* el panel desde el cual es llamado. Los eventos de panel son emitidos con id
|
|
4
|
+
* de panel, tipo de panel, nombre de panel y tipo de evento y las suscripciones
|
|
5
|
+
* pueden ser realizadas a un conjunto arbitrario de estos identificadores.
|
|
6
|
+
*
|
|
7
|
+
* El segundo parámetro del método fireEvent devuelto es el payload, que puede
|
|
8
|
+
* ser de cualquier tipo.
|
|
9
|
+
*/
|
|
10
|
+
declare function usePanelFireEvent(): (eventType: string, payload: any) => void;
|
|
11
|
+
|
|
12
|
+
export { usePanelFireEvent };
|
|
13
|
+
//# sourceMappingURL=usePanelFireEvent.d.ts.map
|