@apia/dashboard-controller 2.0.6 → 2.0.8
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/basicAction.js.map +1 -1
- package/dist/actions/externalFirePanelAction.js.map +1 -1
- package/dist/actions/firePanelAction.js.map +1 -1
- package/dist/actions/usePanelActions.js.map +1 -1
- package/dist/actions/usePanelIsLoading.js.map +1 -1
- package/dist/actions/usePanelNetworkState.js.map +1 -1
- package/dist/common/usePanelIdentity.js.map +1 -1
- package/dist/config/parametersStore.js.map +1 -1
- package/dist/config/saveParameters.js.map +1 -1
- package/dist/config/usePanelConfig.js.map +1 -1
- package/dist/config/usePanelParametersSelector.js.map +1 -1
- package/dist/dashboard/DashboardContext.js.map +1 -1
- package/dist/dashboard/DashboardPanel.js.map +1 -1
- package/dist/dashboard/DashboardPanelContext.js.map +1 -1
- package/dist/dashboard/DashboardPanelsBootstraper.js +2 -2
- package/dist/dashboard/DashboardPanelsBootstraper.js.map +1 -1
- package/dist/dashboard/DashboardRouter.js +1 -1
- package/dist/dashboard/DashboardRouter.js.map +1 -1
- package/dist/dashboard/PanelNotFound.js.map +1 -1
- package/dist/dashboard/dashboard.js +2 -2
- package/dist/dashboard/dashboard.js.map +1 -1
- package/dist/eventsController/eventsController.js +1 -1
- package/dist/eventsController/eventsController.js.map +1 -1
- package/dist/eventsController/usePanelFireEvent.js.map +1 -1
- package/dist/eventsController/usePanelOnEvent.js.map +1 -1
- package/dist/panelsStore/createPanelStore.js.map +1 -1
- package/dist/panelsStore/panelsStore.js.map +1 -1
- package/dist/panelsStore/usePanelSelector.js.map +1 -1
- package/dist/panelsUtil/usePanelChangeTitle.js.map +1 -1
- package/dist/panelsUtil/usePanelTitleAction.js.map +1 -1
- package/dist/position/usePanelPosition.js.map +1 -1
- package/dist/splash/events/Dragleave.js.map +1 -1
- package/dist/splash/events/Dragover.js.map +1 -1
- package/dist/splash/events/Dragstart.js.map +1 -1
- package/dist/splash/events/Drop.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/NetworkState.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/PanelButtons.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/RefreshButton.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/SettingsButton.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/defaultPanelWrapperStyles.js.map +1 -1
- package/dist/splash/panels/DefaultPanelWrapper/index.js.map +1 -1
- package/dist/splash/panels/LandingPagePanelWrapper.js.map +1 -1
- package/dist/splash/panels/PanelContext/PanelFooter.js.map +1 -1
- package/dist/splash/panels/PanelContext/index.js.map +1 -1
- package/dist/splash/panels/PanelContext/usePanelContextLayout.js.map +1 -1
- package/dist/splash/panels/PanelContext/usePanelFooter.js.map +1 -1
- package/dist/splash/panels/PanelContext/useYieldPanelIsReady.js.map +1 -1
- package/dist/splash/panels/PanelErrorBoundary.js +1 -1
- package/dist/splash/panels/PanelErrorBoundary.js.map +1 -1
- package/dist/splash/panels/PanelIdentifier.js.map +1 -1
- package/dist/splash/util/DragAndDrop.js +1 -1
- package/dist/splash/util/DragAndDrop.js.map +1 -1
- package/dist/splash/util/getColumnAreas.js.map +1 -1
- package/dist/splash/util/isCursorInArea.js.map +1 -1
- package/dist/util.js.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"basicAction.js","sources":["../../src/actions/basicAction.ts"],"sourcesContent":["import { ApiaApi } from '@apia/api';\nimport { KeyboardEvent, MouseEvent } from 'react';\nimport { firePanelAction } from './firePanelAction';\n\nexport type TActionBehavior =\n | 'DO_NOTHING'\n | 'NAVIGATE_URL'\n | 'CALL_AJAX_URL'\n | 'RUN_ACTION'\n | 'OPEN_TAB';\n\nexport type TActionSource = 'CLICK' | 'DOUBLE_CLICK';\n\nexport type TBasicAction = {\n action: string;\n actionBehavior: TActionBehavior;\n actionSource: TActionSource;\n actionNewTabTitle: string;\n text: string;\n};\n\ninterface ITabsController {\n openTabByUrl(title: string, url: string): void;\n}\n\nexport function handleAction(\n panelId: string,\n event: KeyboardEvent | MouseEvent,\n action: TBasicAction,\n) {\n if (\n (event.type === 'dblclick' && action.actionSource === 'DOUBLE_CLICK') ||\n ((event.type === 'click' || event.type === 'mousedown') &&\n action.actionSource === 'CLICK') ||\n (event.type === 'keydown' && (event as KeyboardEvent).code === 'Enter')\n ) {\n if (action?.action) {\n switch (action.actionBehavior) {\n case 'CALL_AJAX_URL':\n void ApiaApi.post(action.action, { handleLoad: true });\n break;\n case 'DO_NOTHING':\n break;\n case 'NAVIGATE_URL':\n window.location.assign(action.action);\n break;\n case 'OPEN_TAB':\n (\n window.top as unknown as { tabsController: ITabsController }\n )?.tabsController.openTabByUrl(\n action.actionNewTabTitle || action.text,\n action.action,\n );\n break;\n case 'RUN_ACTION':\n firePanelAction(\n panelId,\n action.action,\n {},\n { requestConfig: { handleLoad: true\n \n } },\n );\n break;\n default:\n console.error('Unknown action behavior: ', action);\n }\n }\n }\n}\n"],"names":[],"mappings":";;;AAyBgB,SAAA,YAAA,CACd,OACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EACG,IAAA,KAAA,CAAM,SAAS,UAAc,IAAA,MAAA,CAAO,iBAAiB,cACpD,IAAA,CAAA,KAAA,CAAM,SAAS,OAAW,IAAA,KAAA,CAAM,SAAS,WACzC,KAAA,MAAA,CAAO,iBAAiB,OACzB,IAAA,KAAA,CAAM,SAAS,SAAc,IAAA,KAAA,CAAwB,SAAS,OAC/D,EAAA;AACA,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,QAAQ,OAAO,cAAgB;AAAA,QAC7B,KAAK,eAAA;AACH,UAAA,KAAK,QAAQ,IAAK,CAAA,MAAA,CAAO,QAAQ,EAAE,UAAA,EAAY,MAAM,CAAA,CAAA;AACrD,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,MAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAO,MAAA,CAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UACE,MAAA,CAAO,KACN,cAAe,CAAA,YAAA;AAAA,YAChB,MAAA,CAAO,qBAAqB,MAAO,CAAA,IAAA;AAAA,YACnC,MAAO,CAAA,MAAA;AAAA,WACT,CAAA;AACA,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,eAAA;AAAA,YACE,OAAA;AAAA,YACA,MAAO,CAAA,MAAA;AAAA,YACP,EAAC;AAAA,YACD,EAAE,aAAe,EAAA;AAAA,cAAE,UAAY,EAAA,IAAA;AAAA,aAE7B,EAAA;AAAA,WACJ,CAAA;AACA,UAAA,MAAA;AAAA,QACF;AACE,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,MAAM,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,GACF;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"basicAction.js","sources":["../../src/actions/basicAction.ts"],"sourcesContent":["import { ApiaApi } from '@apia/api';\r\nimport { KeyboardEvent, MouseEvent } from 'react';\r\nimport { firePanelAction } from './firePanelAction';\r\n\r\nexport type TActionBehavior =\r\n | 'DO_NOTHING'\r\n | 'NAVIGATE_URL'\r\n | 'CALL_AJAX_URL'\r\n | 'RUN_ACTION'\r\n | 'OPEN_TAB';\r\n\r\nexport type TActionSource = 'CLICK' | 'DOUBLE_CLICK';\r\n\r\nexport type TBasicAction = {\r\n action: string;\r\n actionBehavior: TActionBehavior;\r\n actionSource: TActionSource;\r\n actionNewTabTitle: string;\r\n text: string;\r\n};\r\n\r\ninterface ITabsController {\r\n openTabByUrl(title: string, url: string): void;\r\n}\r\n\r\nexport function handleAction(\r\n panelId: string,\r\n event: KeyboardEvent | MouseEvent,\r\n action: TBasicAction,\r\n) {\r\n if (\r\n (event.type === 'dblclick' && action.actionSource === 'DOUBLE_CLICK') ||\r\n ((event.type === 'click' || event.type === 'mousedown') &&\r\n action.actionSource === 'CLICK') ||\r\n (event.type === 'keydown' && (event as KeyboardEvent).code === 'Enter')\r\n ) {\r\n if (action?.action) {\r\n switch (action.actionBehavior) {\r\n case 'CALL_AJAX_URL':\r\n void ApiaApi.post(action.action, { handleLoad: true });\r\n break;\r\n case 'DO_NOTHING':\r\n break;\r\n case 'NAVIGATE_URL':\r\n window.location.assign(action.action);\r\n break;\r\n case 'OPEN_TAB':\r\n (\r\n window.top as unknown as { tabsController: ITabsController }\r\n )?.tabsController.openTabByUrl(\r\n action.actionNewTabTitle || action.text,\r\n action.action,\r\n );\r\n break;\r\n case 'RUN_ACTION':\r\n firePanelAction(\r\n panelId,\r\n action.action,\r\n {},\r\n { requestConfig: { handleLoad: true\r\n \r\n } },\r\n );\r\n break;\r\n default:\r\n console.error('Unknown action behavior: ', action);\r\n }\r\n }\r\n }\r\n}\r\n"],"names":[],"mappings":";;;AAyBgB,SAAA,YAAA,CACd,OACA,EAAA,KAAA,EACA,MACA,EAAA;AACA,EACG,IAAA,KAAA,CAAM,SAAS,UAAc,IAAA,MAAA,CAAO,iBAAiB,cACpD,IAAA,CAAA,KAAA,CAAM,SAAS,OAAW,IAAA,KAAA,CAAM,SAAS,WACzC,KAAA,MAAA,CAAO,iBAAiB,OACzB,IAAA,KAAA,CAAM,SAAS,SAAc,IAAA,KAAA,CAAwB,SAAS,OAC/D,EAAA;AACA,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAA,QAAQ,OAAO,cAAgB;AAAA,QAC7B,KAAK,eAAA;AACH,UAAA,KAAK,QAAQ,IAAK,CAAA,MAAA,CAAO,QAAQ,EAAE,UAAA,EAAY,MAAM,CAAA,CAAA;AACrD,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,MAAA;AAAA,QACF,KAAK,cAAA;AACH,UAAO,MAAA,CAAA,QAAA,CAAS,MAAO,CAAA,MAAA,CAAO,MAAM,CAAA,CAAA;AACpC,UAAA,MAAA;AAAA,QACF,KAAK,UAAA;AACH,UACE,MAAA,CAAO,KACN,cAAe,CAAA,YAAA;AAAA,YAChB,MAAA,CAAO,qBAAqB,MAAO,CAAA,IAAA;AAAA,YACnC,MAAO,CAAA,MAAA;AAAA,WACT,CAAA;AACA,UAAA,MAAA;AAAA,QACF,KAAK,YAAA;AACH,UAAA,eAAA;AAAA,YACE,OAAA;AAAA,YACA,MAAO,CAAA,MAAA;AAAA,YACP,EAAC;AAAA,YACD,EAAE,aAAe,EAAA;AAAA,cAAE,UAAY,EAAA,IAAA;AAAA,aAE7B,EAAA;AAAA,WACJ,CAAA;AACA,UAAA,MAAA;AAAA,QACF;AACE,UAAQ,OAAA,CAAA,KAAA,CAAM,6BAA6B,MAAM,CAAA,CAAA;AAAA,OACrD;AAAA,KACF;AAAA,GACF;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"externalFirePanelAction.js","sources":["../../src/actions/externalFirePanelAction.ts"],"sourcesContent":["import { firePanelAction } from './firePanelAction';\nimport { TExternalActionDispatcher } from './usePanelActions';\n\nexport const externalFirePanelAction: TExternalActionDispatcher = (\n panelId,\n { action, ...parameters },\n options,\n) => {\n const postData: Record<string, unknown> = {};\n\n Object.entries(parameters).forEach(([name, value]) => {\n postData[`p_${name}`] = value;\n });\n\n firePanelAction(panelId, action, postData, options);\n};\n"],"names":[],"mappings":";;AAGa,MAAA,uBAAA,GAAqD,CAChE,OACA,EAAA,EAAE,QAAQ,GAAG,UAAA,IACb,OACG,KAAA;AACH,EAAA,MAAM,WAAoC,EAAC,CAAA;AAE3C,EAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AACpD,IAAS,QAAA,CAAA,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAI,GAAA,KAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAED,EAAgB,eAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACpD;;;;"}
|
|
1
|
+
{"version":3,"file":"externalFirePanelAction.js","sources":["../../src/actions/externalFirePanelAction.ts"],"sourcesContent":["import { firePanelAction } from './firePanelAction';\r\nimport { TExternalActionDispatcher } from './usePanelActions';\r\n\r\nexport const externalFirePanelAction: TExternalActionDispatcher = (\r\n panelId,\r\n { action, ...parameters },\r\n options,\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 firePanelAction(panelId, action, postData, options);\r\n};\r\n"],"names":[],"mappings":";;AAGa,MAAA,uBAAA,GAAqD,CAChE,OACA,EAAA,EAAE,QAAQ,GAAG,UAAA,IACb,OACG,KAAA;AACH,EAAA,MAAM,WAAoC,EAAC,CAAA;AAE3C,EAAO,MAAA,CAAA,OAAA,CAAQ,UAAU,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAC,IAAA,EAAM,KAAK,CAAM,KAAA;AACpD,IAAS,QAAA,CAAA,CAAA,EAAA,EAAK,IAAI,CAAA,CAAE,CAAI,GAAA,KAAA,CAAA;AAAA,GACzB,CAAA,CAAA;AAED,EAAgB,eAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAA,CAAA;AACpD;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firePanelAction.js","sources":["../../src/actions/firePanelAction.ts"],"sourcesContent":["import { ApiaApi, makeApiaUrl } from '@apia/api';\nimport {\n TActionDispatcherOptions,\n TActionResult,\n TFooter,\n panelActionsEmitter,\n} from './usePanelActions';\nimport { panelNetworkStateEmitter } from './usePanelNetworkState';\nimport { changePanelTitle } from '../panelsUtil';\nimport { ucfirst } from '@apia/util';\nimport { changePanelFooter } from '../splash/panels/PanelContext/usePanelFooter';\nimport {\n setPanelTitleAction,\n setPanelTitleDescritpion,\n} from '../panelsUtil/usePanelTitleAction';\nimport { startTransition } from 'react';\n\nexport type TOnSucceed = (hasSucceed: boolean, data: TActionResult) => unknown;\n\n/**\n * **MÉTODO DE USO INTERNO**\n *\n * LLama al server para ejecutar una acción iniciada en el cliente.\n *\n * La forma de llamar acciones desde un panel es con el hook usePanelActions.\n */\nexport function firePanelAction(\n panelId: string,\n action: string,\n parameters?: Record<string, unknown>,\n options?: TActionDispatcherOptions,\n) {\n const postData = { p_action: action, ...parameters };\n panelActionsEmitter.emit(panelId, `pre${ucfirst(action)}`, null);\n void ApiaApi.post(\n makeApiaUrl({\n action: 'panelAction',\n pnlId: panelId,\n }),\n { postData, postDataTreatement: 'stringify', ...options?.requestConfig },\n )\n .then((result) => {\n if (result?.status !== 200) {\n console.log('ERROR', panelId);\n panelNetworkStateEmitter.emit('stateChange', {\n panelId,\n isConnected: false,\n });\n } else {\n panelNetworkStateEmitter.emit('stateChange', {\n panelId,\n isConnected: true,\n });\n }\n try {\n if (result) {\n startTransition(() => {\n if (result?.data?.title) {\n changePanelTitle(\n panelId,\n (result as TActionResult<{ title: string }>)?.data\n ?.title as string,\n );\n }\n if (result?.data?.footer) {\n changePanelFooter(\n panelId,\n (result as TActionResult<{ footer: TFooter }>)?.data\n ?.footer as TFooter,\n );\n }\n if (result?.data?.titleAction) {\n setPanelTitleAction(panelId, result?.data?.titleAction as string);\n }\n if (result?.data?.titleDescription) {\n setPanelTitleDescritpion(\n panelId,\n result?.data?.titleDescription as string,\n );\n }\n options?.onComplete?.(true, result);\n panelActionsEmitter.emit(panelId, action, result);\n });\n } else options?.onComplete?.(false, null);\n } catch (e) {\n console.error(e);\n }\n })\n .catch((e) => {\n console.error(e);\n panelNetworkStateEmitter.emit('stateChange', {\n panelId,\n isConnected: false,\n });\n options?.onComplete?.(false, null);\n });\n}\n"],"names":[],"mappings":";;;;;;;;;AA0BO,SAAS,eACd,CAAA,OAAA,EACA,MACA,EAAA,UAAA,EACA,OACA,EAAA;AACA,EAAA,MAAM,QAAW,GAAA,EAAE,QAAU,EAAA,MAAA,EAAQ,GAAG,UAAW,EAAA,CAAA;AACnD,EAAA,mBAAA,CAAoB,KAAK,OAAS,EAAA,CAAA,GAAA,EAAM,QAAQ,MAAM,CAAC,IAAI,IAAI,CAAA,CAAA;AAC/D,EAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,IACX,WAAY,CAAA;AAAA,MACV,MAAQ,EAAA,aAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,KACR,CAAA;AAAA,IACD,EAAE,QAAU,EAAA,kBAAA,EAAoB,WAAa,EAAA,GAAG,SAAS,aAAc,EAAA;AAAA,GACzE,CACG,IAAK,CAAA,CAAC,MAAW,KAAA;AAChB,IAAI,IAAA,MAAA,EAAQ,WAAW,GAAK,EAAA;AAC1B,MAAQ,OAAA,CAAA,GAAA,CAAI,SAAS,OAAO,CAAA,CAAA;AAC5B,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,KAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,IAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACH;AACA,IAAI,IAAA;AACF,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,eAAA,CAAgB,MAAM;AACpB,UAAI,IAAA,MAAA,EAAQ,MAAM,KAAO,EAAA;AACvB,YAAA,gBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA6C,IAC1C,EAAA,KAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,MAAQ,EAAA;AACxB,YAAA,iBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA+C,IAC5C,EAAA,MAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,WAAa,EAAA;AAC7B,YAAoB,mBAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,WAAqB,CAAA,CAAA;AAAA,WAClE;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,gBAAkB,EAAA;AAClC,YAAA,wBAAA;AAAA,cACE,OAAA;AAAA,cACA,QAAQ,IAAM,EAAA,gBAAA;AAAA,aAChB,CAAA;AAAA,WACF;AACA,UAAS,OAAA,EAAA,UAAA,GAAa,MAAM,MAAM,CAAA,CAAA;AAClC,UAAoB,mBAAA,CAAA,IAAA,CAAK,OAAS,EAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,SACjD,CAAA,CAAA;AAAA,OACH;AAAO,QAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,aACjC,CAAG,EAAA;AACV,MAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,KACjB;AAAA,GACD,CAAA,CACA,KAAM,CAAA,CAAC,CAAM,KAAA;AACZ,IAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AACf,IAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,MAC3C,OAAA;AAAA,MACA,WAAa,EAAA,KAAA;AAAA,KACd,CAAA,CAAA;AACD,IAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AACL;;;;"}
|
|
1
|
+
{"version":3,"file":"firePanelAction.js","sources":["../../src/actions/firePanelAction.ts"],"sourcesContent":["import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport {\r\n TActionDispatcherOptions,\r\n TActionResult,\r\n TFooter,\r\n panelActionsEmitter,\r\n} from './usePanelActions';\r\nimport { panelNetworkStateEmitter } from './usePanelNetworkState';\r\nimport { changePanelTitle } from '../panelsUtil';\r\nimport { ucfirst } from '@apia/util';\r\nimport { changePanelFooter } from '../splash/panels/PanelContext/usePanelFooter';\r\nimport {\r\n setPanelTitleAction,\r\n setPanelTitleDescritpion,\r\n} from '../panelsUtil/usePanelTitleAction';\r\nimport { startTransition } from 'react';\r\n\r\nexport type TOnSucceed = (hasSucceed: boolean, data: TActionResult) => unknown;\r\n\r\n/**\r\n * **MÉTODO DE USO INTERNO**\r\n *\r\n * LLama al server para ejecutar una acción iniciada en el cliente.\r\n *\r\n * La forma de llamar acciones desde un panel es con el hook usePanelActions.\r\n */\r\nexport function firePanelAction(\r\n panelId: string,\r\n action: string,\r\n parameters?: Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) {\r\n const postData = { p_action: action, ...parameters };\r\n panelActionsEmitter.emit(panelId, `pre${ucfirst(action)}`, null);\r\n void ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelAction',\r\n pnlId: panelId,\r\n }),\r\n { postData, postDataTreatement: 'stringify', ...options?.requestConfig },\r\n )\r\n .then((result) => {\r\n if (result?.status !== 200) {\r\n console.log('ERROR', panelId);\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: false,\r\n });\r\n } else {\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: true,\r\n });\r\n }\r\n try {\r\n if (result) {\r\n startTransition(() => {\r\n if (result?.data?.title) {\r\n changePanelTitle(\r\n panelId,\r\n (result as TActionResult<{ title: string }>)?.data\r\n ?.title as string,\r\n );\r\n }\r\n if (result?.data?.footer) {\r\n changePanelFooter(\r\n panelId,\r\n (result as TActionResult<{ footer: TFooter }>)?.data\r\n ?.footer as TFooter,\r\n );\r\n }\r\n if (result?.data?.titleAction) {\r\n setPanelTitleAction(panelId, result?.data?.titleAction as string);\r\n }\r\n if (result?.data?.titleDescription) {\r\n setPanelTitleDescritpion(\r\n panelId,\r\n result?.data?.titleDescription as string,\r\n );\r\n }\r\n options?.onComplete?.(true, result);\r\n panelActionsEmitter.emit(panelId, action, result);\r\n });\r\n } else options?.onComplete?.(false, null);\r\n } catch (e) {\r\n console.error(e);\r\n }\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n panelNetworkStateEmitter.emit('stateChange', {\r\n panelId,\r\n isConnected: false,\r\n });\r\n options?.onComplete?.(false, null);\r\n });\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;AA0BO,SAAS,eACd,CAAA,OAAA,EACA,MACA,EAAA,UAAA,EACA,OACA,EAAA;AACA,EAAA,MAAM,QAAW,GAAA,EAAE,QAAU,EAAA,MAAA,EAAQ,GAAG,UAAW,EAAA,CAAA;AACnD,EAAA,mBAAA,CAAoB,KAAK,OAAS,EAAA,CAAA,GAAA,EAAM,QAAQ,MAAM,CAAC,IAAI,IAAI,CAAA,CAAA;AAC/D,EAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,IACX,WAAY,CAAA;AAAA,MACV,MAAQ,EAAA,aAAA;AAAA,MACR,KAAO,EAAA,OAAA;AAAA,KACR,CAAA;AAAA,IACD,EAAE,QAAU,EAAA,kBAAA,EAAoB,WAAa,EAAA,GAAG,SAAS,aAAc,EAAA;AAAA,GACzE,CACG,IAAK,CAAA,CAAC,MAAW,KAAA;AAChB,IAAI,IAAA,MAAA,EAAQ,WAAW,GAAK,EAAA;AAC1B,MAAQ,OAAA,CAAA,GAAA,CAAI,SAAS,OAAO,CAAA,CAAA;AAC5B,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,KAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACI,MAAA;AACL,MAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,QAC3C,OAAA;AAAA,QACA,WAAa,EAAA,IAAA;AAAA,OACd,CAAA,CAAA;AAAA,KACH;AACA,IAAI,IAAA;AACF,MAAA,IAAI,MAAQ,EAAA;AACV,QAAA,eAAA,CAAgB,MAAM;AACpB,UAAI,IAAA,MAAA,EAAQ,MAAM,KAAO,EAAA;AACvB,YAAA,gBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA6C,IAC1C,EAAA,KAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,MAAQ,EAAA;AACxB,YAAA,iBAAA;AAAA,cACE,OAAA;AAAA,cACC,QAA+C,IAC5C,EAAA,MAAA;AAAA,aACN,CAAA;AAAA,WACF;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,WAAa,EAAA;AAC7B,YAAoB,mBAAA,CAAA,OAAA,EAAS,MAAQ,EAAA,IAAA,EAAM,WAAqB,CAAA,CAAA;AAAA,WAClE;AACA,UAAI,IAAA,MAAA,EAAQ,MAAM,gBAAkB,EAAA;AAClC,YAAA,wBAAA;AAAA,cACE,OAAA;AAAA,cACA,QAAQ,IAAM,EAAA,gBAAA;AAAA,aAChB,CAAA;AAAA,WACF;AACA,UAAS,OAAA,EAAA,UAAA,GAAa,MAAM,MAAM,CAAA,CAAA;AAClC,UAAoB,mBAAA,CAAA,IAAA,CAAK,OAAS,EAAA,MAAA,EAAQ,MAAM,CAAA,CAAA;AAAA,SACjD,CAAA,CAAA;AAAA,OACH;AAAO,QAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,aACjC,CAAG,EAAA;AACV,MAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AAAA,KACjB;AAAA,GACD,CAAA,CACA,KAAM,CAAA,CAAC,CAAM,KAAA;AACZ,IAAA,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAA;AACf,IAAA,wBAAA,CAAyB,KAAK,aAAe,EAAA;AAAA,MAC3C,OAAA;AAAA,MACA,WAAa,EAAA,KAAA;AAAA,KACd,CAAA,CAAA;AACD,IAAS,OAAA,EAAA,UAAA,GAAa,OAAO,IAAI,CAAA,CAAA;AAAA,GAClC,CAAA,CAAA;AACL;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelActions.js","sources":["../../src/actions/usePanelActions.ts"],"sourcesContent":["import { TApiaApiResult, IApiaApiRequestConfig } from '@apia/api';\nimport { useMount } from '@apia/util';\nimport { usePanelIdentity } from '../common';\nimport { TPanelId } from '../types';\nimport { TOnSucceed } from './firePanelAction';\nimport { TBasicAction } from './basicAction';\nimport { useDashboardPanel } from '../dashboard/DashboardPanelContext';\n\ntype TActionListener = (result: {\n action: string;\n data: TActionResult;\n panelId: TPanelId;\n}) => unknown;\n\nexport const panelActionsEmitter = new (class PanelActionsEmitter {\n listeners: Record<TPanelId, Record<string, TActionListener[]>> = {};\n\n on = (panelId: TPanelId, action: string, cb: TActionListener) => {\n if (!this.listeners[panelId]) this.listeners[panelId] = {};\n if (!this.listeners[panelId][action]) this.listeners[panelId][action] = [];\n\n this.listeners[panelId][action].push(cb);\n\n return () => {\n this.listeners[panelId][action] = this.listeners[panelId][action].filter(\n (current) => current !== cb,\n );\n };\n };\n\n emit = (panelId: TPanelId, action: string, data: TActionResult) => {\n this.listeners[panelId]?.[action]?.forEach((current) => {\n window.requestAnimationFrame(() => {\n current({ action, panelId, data });\n });\n });\n };\n})();\n\nexport type TFooter = TBasicAction;\n\nexport type TCommonActionResult = { title: string; footer: TFooter };\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type TActionResult<T = any> = null | NonNullable<\n Awaited<\n TApiaApiResult<\n T extends Record<string, unknown> ? T & TCommonActionResult : T\n >\n >\n>;\n\nexport type TActionDispatcherOptions = {\n onComplete?: TOnSucceed;\n requestConfig?: IApiaApiRequestConfig<object>;\n};\n\nexport type TExternalActionDispatcher = (\n panelId: string,\n { action, ...parameters }: { action: string } & Record<string, unknown>,\n options?: TActionDispatcherOptions,\n) => void;\n\nexport type TActionDispatcher = (\n { action, ...parameters }: { action: string } & Record<string, unknown>,\n options?: TActionDispatcherOptions,\n) => Promise<TActionResult>;\n\nexport type TActionHandler = (result: TActionResult) => unknown;\n\n/**\n * El hook usePanelActions es el método principal de comunicación entre el\n * módulo cliente y el módulo server de un panel.\n *\n * Acepta un actionsHandler y devuelve un actionDispatcher.\n *\n * **Existe la acción refresh** que será llamada automáticamente cada vez que\n * se guarde la configuración del panel o se haga click en el botón refrescar\n * del mismo.\n *\n * @param actionsHandler Es un objeto de tipo clave-valor en donde cada clave debe corresponderse con una acción que puede ser ejecutada en el panel. El valor debe ser una función que recibe la respuesta del servidor a la ejecución de la acción.\n *\n * @returns Un método actionDispatcher que permite ejecutar acciones para ser procesadas por la contraparte del panel en el servidor. Al ser llamado acepta un objeto que debe tener como mínimo la propiedad action: string, que indica qué acción será ejecutada. Acepta opcionalmente cualquier cantidad adicional de propiedades en el objeto.\n *\n * @example\n *\n const dispatch = usePanelActions({\n refresh() {\n console.log('Refresh');\n },\n revert(response: TActionResult<TApiaLoadText>) {\n if (response?.data?.text.label !== undefined)\n setLabel(response?.data?.text.label);\n },\n });\n\n return <Button\n onClick={() => {\n dispatch({\n action: 'revert',\n text: (document.getElementById('Text') as\n HTMLInputElement).value,\n });\n }}\n >\n Revert\n </Button>\n */\nexport function usePanelActions(\n actionsHandler?: Record<string, TActionHandler>,\n) {\n const { panelId } = usePanelIdentity();\n\n useMount(() => {\n const subscriptions: (() => unknown)[] = [];\n\n Object.entries(actionsHandler ?? {}).forEach(([action, handler]) => {\n subscriptions.push(\n panelActionsEmitter.on(panelId, action, (res) => {\n handler(res.data);\n }),\n );\n });\n\n return () => {\n subscriptions.forEach((unsubscribe) => unsubscribe());\n };\n });\n\n const panel = useDashboardPanel();\n\n return panel.fireAction as TActionDispatcher;\n}\n"],"names":[],"mappings":";;;;;;;;;;AAca,MAAA,mBAAA,GAAsB,IAAK,MAAM,mBAAoB,CAAA;AAAA,EAA1B,WAAA,GAAA;AACtC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAiE,EAAC,CAAA,CAAA;AAElE,IAAK,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,EAAwB,KAAA;AAC/D,MAAI,IAAA,CAAC,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAG,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,EAAC,CAAA;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,SAAU,CAAA,OAAO,EAAE,MAAM,CAAA;AAAG,QAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,IAAI,EAAC,CAAA;AAEzE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAEvC,MAAA,OAAO,MAAM;AACX,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,CAAE,MAAM,CAAA,GAAI,KAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,CAAE,CAAA,MAAA;AAAA,UAChE,CAAC,YAAY,OAAY,KAAA,EAAA;AAAA,SAC3B,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAEA,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,IAAwB,KAAA;AACjE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,GAAI,MAAM,CAAG,EAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACtD,QAAA,MAAA,CAAO,sBAAsB,MAAM;AACjC,UAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAAA;AACF,CAAG,GAAA;AAuEI,SAAS,gBACd,cACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,MAAM,gBAAmC,EAAC,CAAA;AAE1C,IAAO,MAAA,CAAA,OAAA,CAAQ,cAAkB,IAAA,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAC,MAAQ,EAAA,OAAO,CAAM,KAAA;AAClE,MAAc,aAAA,CAAA,IAAA;AAAA,QACZ,mBAAoB,CAAA,EAAA,CAAG,OAAS,EAAA,MAAA,EAAQ,CAAC,GAAQ,KAAA;AAC/C,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,SACjB,CAAA;AAAA,OACH,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,WAAgB,KAAA,WAAA,EAAa,CAAA,CAAA;AAAA,KACtD,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,QAAQ,iBAAkB,EAAA,CAAA;AAEhC,EAAA,OAAO,KAAM,CAAA,UAAA,CAAA;AACf;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelActions.js","sources":["../../src/actions/usePanelActions.ts"],"sourcesContent":["import { TApiaApiResult, IApiaApiRequestConfig } from '@apia/api';\r\nimport { useMount } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelId } from '../types';\r\nimport { TOnSucceed } from './firePanelAction';\r\nimport { TBasicAction } from './basicAction';\r\nimport { useDashboardPanel } from '../dashboard/DashboardPanelContext';\r\n\r\ntype TActionListener = (result: {\r\n action: string;\r\n data: TActionResult;\r\n panelId: TPanelId;\r\n}) => unknown;\r\n\r\nexport const panelActionsEmitter = new (class PanelActionsEmitter {\r\n listeners: Record<TPanelId, Record<string, TActionListener[]>> = {};\r\n\r\n on = (panelId: TPanelId, action: string, cb: TActionListener) => {\r\n if (!this.listeners[panelId]) this.listeners[panelId] = {};\r\n if (!this.listeners[panelId][action]) this.listeners[panelId][action] = [];\r\n\r\n this.listeners[panelId][action].push(cb);\r\n\r\n return () => {\r\n this.listeners[panelId][action] = this.listeners[panelId][action].filter(\r\n (current) => current !== cb,\r\n );\r\n };\r\n };\r\n\r\n emit = (panelId: TPanelId, action: string, data: TActionResult) => {\r\n this.listeners[panelId]?.[action]?.forEach((current) => {\r\n window.requestAnimationFrame(() => {\r\n current({ action, panelId, data });\r\n });\r\n });\r\n };\r\n})();\r\n\r\nexport type TFooter = TBasicAction;\r\n\r\nexport type TCommonActionResult = { title: string; footer: TFooter };\r\n\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nexport type TActionResult<T = any> = null | NonNullable<\r\n Awaited<\r\n TApiaApiResult<\r\n T extends Record<string, unknown> ? T & TCommonActionResult : T\r\n >\r\n >\r\n>;\r\n\r\nexport type TActionDispatcherOptions = {\r\n onComplete?: TOnSucceed;\r\n requestConfig?: IApiaApiRequestConfig<object>;\r\n};\r\n\r\nexport type TExternalActionDispatcher = (\r\n panelId: string,\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) => void;\r\n\r\nexport type TActionDispatcher = (\r\n { action, ...parameters }: { action: string } & Record<string, unknown>,\r\n options?: TActionDispatcherOptions,\r\n) => Promise<TActionResult>;\r\n\r\nexport type TActionHandler = (result: TActionResult) => unknown;\r\n\r\n/**\r\n * El hook usePanelActions es el método principal de comunicación entre el\r\n * módulo cliente y el módulo server de un panel.\r\n *\r\n * Acepta un actionsHandler y devuelve un actionDispatcher.\r\n *\r\n * **Existe la acción refresh** que será llamada automáticamente cada vez que\r\n * se guarde la configuración del panel o se haga click en el botón refrescar\r\n * del mismo.\r\n *\r\n * @param actionsHandler Es un objeto de tipo clave-valor en donde cada clave debe corresponderse con una acción que puede ser ejecutada en el panel. El valor debe ser una función que recibe la respuesta del servidor a la ejecución de la acción.\r\n *\r\n * @returns Un método actionDispatcher que permite ejecutar acciones para ser procesadas por la contraparte del panel en el servidor. Al ser llamado acepta un objeto que debe tener como mínimo la propiedad action: string, que indica qué acción será ejecutada. Acepta opcionalmente cualquier cantidad adicional de propiedades en el objeto.\r\n *\r\n * @example\r\n *\r\n const dispatch = usePanelActions({\r\n refresh() {\r\n console.log('Refresh');\r\n },\r\n revert(response: TActionResult<TApiaLoadText>) {\r\n if (response?.data?.text.label !== undefined)\r\n setLabel(response?.data?.text.label);\r\n },\r\n });\r\n\r\n return <Button\r\n onClick={() => {\r\n dispatch({\r\n action: 'revert',\r\n text: (document.getElementById('Text') as\r\n HTMLInputElement).value,\r\n });\r\n }}\r\n >\r\n Revert\r\n </Button>\r\n */\r\nexport function usePanelActions(\r\n actionsHandler?: Record<string, TActionHandler>,\r\n) {\r\n const { panelId } = usePanelIdentity();\r\n\r\n useMount(() => {\r\n const subscriptions: (() => unknown)[] = [];\r\n\r\n Object.entries(actionsHandler ?? {}).forEach(([action, handler]) => {\r\n subscriptions.push(\r\n panelActionsEmitter.on(panelId, action, (res) => {\r\n handler(res.data);\r\n }),\r\n );\r\n });\r\n\r\n return () => {\r\n subscriptions.forEach((unsubscribe) => unsubscribe());\r\n };\r\n });\r\n\r\n const panel = useDashboardPanel();\r\n\r\n return panel.fireAction as TActionDispatcher;\r\n}\r\n"],"names":[],"mappings":";;;;;;;;;;AAca,MAAA,mBAAA,GAAsB,IAAK,MAAM,mBAAoB,CAAA;AAAA,EAA1B,WAAA,GAAA;AACtC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAiE,EAAC,CAAA,CAAA;AAElE,IAAK,aAAA,CAAA,IAAA,EAAA,IAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,EAAwB,KAAA;AAC/D,MAAI,IAAA,CAAC,IAAK,CAAA,SAAA,CAAU,OAAO,CAAA;AAAG,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,GAAI,EAAC,CAAA;AACzD,MAAA,IAAI,CAAC,IAAA,CAAK,SAAU,CAAA,OAAO,EAAE,MAAM,CAAA;AAAG,QAAA,IAAA,CAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,IAAI,EAAC,CAAA;AAEzE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,CAAE,MAAM,CAAA,CAAE,KAAK,EAAE,CAAA,CAAA;AAEvC,MAAA,OAAO,MAAM;AACX,QAAK,IAAA,CAAA,SAAA,CAAU,OAAO,CAAA,CAAE,MAAM,CAAA,GAAI,KAAK,SAAU,CAAA,OAAO,CAAE,CAAA,MAAM,CAAE,CAAA,MAAA;AAAA,UAChE,CAAC,YAAY,OAAY,KAAA,EAAA;AAAA,SAC3B,CAAA;AAAA,OACF,CAAA;AAAA,KACF,CAAA,CAAA;AAEA,IAAO,aAAA,CAAA,IAAA,EAAA,MAAA,EAAA,CAAC,OAAmB,EAAA,MAAA,EAAgB,IAAwB,KAAA;AACjE,MAAA,IAAA,CAAK,UAAU,OAAO,CAAA,GAAI,MAAM,CAAG,EAAA,OAAA,CAAQ,CAAC,OAAY,KAAA;AACtD,QAAA,MAAA,CAAO,sBAAsB,MAAM;AACjC,UAAA,OAAA,CAAQ,EAAE,MAAA,EAAQ,OAAS,EAAA,IAAA,EAAM,CAAA,CAAA;AAAA,SAClC,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAAA,GAAA;AACF,CAAG,GAAA;AAuEI,SAAS,gBACd,cACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,QAAA,CAAS,MAAM;AACb,IAAA,MAAM,gBAAmC,EAAC,CAAA;AAE1C,IAAO,MAAA,CAAA,OAAA,CAAQ,cAAkB,IAAA,EAAE,CAAA,CAAE,QAAQ,CAAC,CAAC,MAAQ,EAAA,OAAO,CAAM,KAAA;AAClE,MAAc,aAAA,CAAA,IAAA;AAAA,QACZ,mBAAoB,CAAA,EAAA,CAAG,OAAS,EAAA,MAAA,EAAQ,CAAC,GAAQ,KAAA;AAC/C,UAAA,OAAA,CAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,SACjB,CAAA;AAAA,OACH,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAA,OAAO,MAAM;AACX,MAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,WAAgB,KAAA,WAAA,EAAa,CAAA,CAAA;AAAA,KACtD,CAAA;AAAA,GACD,CAAA,CAAA;AAED,EAAA,MAAM,QAAQ,iBAAkB,EAAA,CAAA;AAEhC,EAAA,OAAO,KAAM,CAAA,UAAA,CAAA;AACf;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelIsLoading.js","sources":["../../src/actions/usePanelIsLoading.ts"],"sourcesContent":["import { useState } from 'react';\nimport { usePanelActions } from './usePanelActions';\n\nexport function usePanelIsLoading() {\n const [isLoading, setIsLoading] = useState(false);\n\n usePanelActions({\n preRefresh: () => setIsLoading(true),\n refresh: () => setIsLoading(false),\n });\n\n return isLoading;\n}\n"],"names":[],"mappings":";;;AAGO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAEhD,EAAgB,eAAA,CAAA;AAAA,IACd,UAAA,EAAY,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,IACnC,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelIsLoading.js","sources":["../../src/actions/usePanelIsLoading.ts"],"sourcesContent":["import { useState } from 'react';\r\nimport { usePanelActions } from './usePanelActions';\r\n\r\nexport function usePanelIsLoading() {\r\n const [isLoading, setIsLoading] = useState(false);\r\n\r\n usePanelActions({\r\n preRefresh: () => setIsLoading(true),\r\n refresh: () => setIsLoading(false),\r\n });\r\n\r\n return isLoading;\r\n}\r\n"],"names":[],"mappings":";;;AAGO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA,CAAA;AAEhD,EAAgB,eAAA,CAAA;AAAA,IACd,UAAA,EAAY,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,IACnC,OAAA,EAAS,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,GAClC,CAAA,CAAA;AAED,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelNetworkState.js","sources":["../../src/actions/usePanelNetworkState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { EventEmitter, TId } from '@apia/util';\nimport { usePanelIdentity } from '../common';\n\nclass PanelNetworkStateEmitter extends EventEmitter<{\n stateChange: {\n panelId: TId;\n isConnected: boolean;\n };\n}> {}\n\nexport const panelNetworkStateEmitter = new PanelNetworkStateEmitter();\n\n/**\n * Permite saber en todo momento si el panel actual tuvo un error en su\n * conexión de red\n */\nexport const usePanelNetworkState = () => {\n const [isConnected, setIsConnected] = useState(true);\n\n const { panelId } = usePanelIdentity();\n\n useEffect(() => {\n return panelNetworkStateEmitter.on('stateChange', (ev) => {\n if (ev.panelId === panelId && ev.isConnected !== isConnected)\n setIsConnected(ev.isConnected);\n });\n }, [isConnected, panelId]);\n\n return isConnected;\n};\n"],"names":[],"mappings":";;;;AAIA,MAAM,iCAAiC,YAKpC,CAAA;AAAC,CAAA;AAES,MAAA,wBAAA,GAA2B,IAAI,wBAAyB,GAAA;AAM9D,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AAEnD,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,wBAAyB,CAAA,EAAA,CAAG,aAAe,EAAA,CAAC,EAAO,KAAA;AACxD,MAAA,IAAI,EAAG,CAAA,OAAA,KAAY,OAAW,IAAA,EAAA,CAAG,WAAgB,KAAA,WAAA;AAC/C,QAAA,cAAA,CAAe,GAAG,WAAW,CAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,WAAa,EAAA,OAAO,CAAC,CAAA,CAAA;AAEzB,EAAO,OAAA,WAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelNetworkState.js","sources":["../../src/actions/usePanelNetworkState.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\r\nimport { EventEmitter, TId } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nclass PanelNetworkStateEmitter extends EventEmitter<{\r\n stateChange: {\r\n panelId: TId;\r\n isConnected: boolean;\r\n };\r\n}> {}\r\n\r\nexport const panelNetworkStateEmitter = new PanelNetworkStateEmitter();\r\n\r\n/**\r\n * Permite saber en todo momento si el panel actual tuvo un error en su\r\n * conexión de red\r\n */\r\nexport const usePanelNetworkState = () => {\r\n const [isConnected, setIsConnected] = useState(true);\r\n\r\n const { panelId } = usePanelIdentity();\r\n\r\n useEffect(() => {\r\n return panelNetworkStateEmitter.on('stateChange', (ev) => {\r\n if (ev.panelId === panelId && ev.isConnected !== isConnected)\r\n setIsConnected(ev.isConnected);\r\n });\r\n }, [isConnected, panelId]);\r\n\r\n return isConnected;\r\n};\r\n"],"names":[],"mappings":";;;;AAIA,MAAM,iCAAiC,YAKpC,CAAA;AAAC,CAAA;AAES,MAAA,wBAAA,GAA2B,IAAI,wBAAyB,GAAA;AAM9D,MAAM,uBAAuB,MAAM;AACxC,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,SAAS,IAAI,CAAA,CAAA;AAEnD,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,wBAAyB,CAAA,EAAA,CAAG,aAAe,EAAA,CAAC,EAAO,KAAA;AACxD,MAAA,IAAI,EAAG,CAAA,OAAA,KAAY,OAAW,IAAA,EAAA,CAAG,WAAgB,KAAA,WAAA;AAC/C,QAAA,cAAA,CAAe,GAAG,WAAW,CAAA,CAAA;AAAA,KAChC,CAAA,CAAA;AAAA,GACA,EAAA,CAAC,WAAa,EAAA,OAAO,CAAC,CAAA,CAAA;AAEzB,EAAO,OAAA,WAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelIdentity.js","sources":["../../src/common/usePanelIdentity.ts"],"sourcesContent":["import { useContext } from 'react';\nimport { PanelIdentifierContext } from '../splash/panels/PanelIdentifier';\n\n/**\n * Permite acceder a la identidad del panel actual.\n */\nexport function usePanelIdentity() {\n const context = useContext(PanelIdentifierContext);\n\n if (!context)\n throw new Error('Trying to access an unexistent PanelIdentifierContext');\n\n return context;\n}\n"],"names":[],"mappings":";;;AAMO,SAAS,gBAAmB,GAAA;AACjC,EAAM,MAAA,OAAA,GAAU,WAAW,sBAAsB,CAAA,CAAA;AAEjD,EAAA,IAAI,CAAC,OAAA;AACH,IAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAAA;AAEzE,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelIdentity.js","sources":["../../src/common/usePanelIdentity.ts"],"sourcesContent":["import { useContext } from 'react';\r\nimport { PanelIdentifierContext } from '../splash/panels/PanelIdentifier';\r\n\r\n/**\r\n * Permite acceder a la identidad del panel actual.\r\n */\r\nexport function usePanelIdentity() {\r\n const context = useContext(PanelIdentifierContext);\r\n\r\n if (!context)\r\n throw new Error('Trying to access an unexistent PanelIdentifierContext');\r\n\r\n return context;\r\n}\r\n"],"names":[],"mappings":";;;AAMO,SAAS,gBAAmB,GAAA;AACjC,EAAM,MAAA,OAAA,GAAU,WAAW,sBAAsB,CAAA,CAAA;AAEjD,EAAA,IAAI,CAAC,OAAA;AACH,IAAM,MAAA,IAAI,MAAM,uDAAuD,CAAA,CAAA;AAEzE,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parametersStore.js","sources":["../../src/config/parametersStore.ts"],"sourcesContent":["import { createSlice, injectReducers, PayloadAction } from '@apia/store';\nimport { TPanelId } from '../types';\n\nexport type TPanelParameter = string | number | boolean;\nexport type TParamsStore = Record<string, TPanelParameter>;\nexport type TParamsSlice = Record<string, TParamsStore>;\n\nconst paramsSlice = createSlice({\n initialState: {} as TParamsSlice,\n name: 'panelParameters',\n reducers: {\n udpate(\n state,\n {\n payload,\n }: PayloadAction<{\n panelId: TPanelId;\n parameters: TParamsStore;\n }>,\n ) {\n if (!state[payload.panelId]) state[payload.panelId] = {};\n\n state[payload.panelId] = {\n ...state[payload.panelId],\n ...payload.parameters,\n };\n },\n },\n});\n\nconst { store, useSelector } = injectReducers({\n panelParameters: paramsSlice.reducer,\n});\n\nexport { store as parametersStore, useSelector as useParametersSelector };\nexport const parametersActions = paramsSlice.actions;\n"],"names":[],"mappings":";;AAOA,MAAM,cAAc,WAAY,CAAA;AAAA,EAC9B,cAAc,EAAC;AAAA,EACf,IAAM,EAAA,iBAAA;AAAA,EACN,QAAU,EAAA;AAAA,IACR,OACE,KACA,EAAA;AAAA,MACE,OAAA;AAAA,KAKF,EAAA;AACA,MAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,EAAC,CAAA;AAEvD,MAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAI,GAAA;AAAA,QACvB,GAAG,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACxB,GAAG,OAAQ,CAAA,UAAA;AAAA,OACb,CAAA;AAAA,KACF;AAAA,GACF;AACF,CAAC,CAAA,CAAA;AAED,MAAM,EAAE,KAAA,EAAO,WAAY,EAAA,GAAI,cAAe,CAAA;AAAA,EAC5C,iBAAiB,WAAY,CAAA,OAAA;AAC/B,CAAC,EAAA;AAGM,MAAM,oBAAoB,WAAY,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"parametersStore.js","sources":["../../src/config/parametersStore.ts"],"sourcesContent":["import { createSlice, injectReducers, PayloadAction } from '@apia/store';\r\nimport { TPanelId } from '../types';\r\n\r\nexport type TPanelParameter = string | number | boolean;\r\nexport type TParamsStore = Record<string, TPanelParameter>;\r\nexport type TParamsSlice = Record<string, TParamsStore>;\r\n\r\nconst paramsSlice = createSlice({\r\n initialState: {} as TParamsSlice,\r\n name: 'panelParameters',\r\n reducers: {\r\n udpate(\r\n state,\r\n {\r\n payload,\r\n }: PayloadAction<{\r\n panelId: TPanelId;\r\n parameters: TParamsStore;\r\n }>,\r\n ) {\r\n if (!state[payload.panelId]) state[payload.panelId] = {};\r\n\r\n state[payload.panelId] = {\r\n ...state[payload.panelId],\r\n ...payload.parameters,\r\n };\r\n },\r\n },\r\n});\r\n\r\nconst { store, useSelector } = injectReducers({\r\n panelParameters: paramsSlice.reducer,\r\n});\r\n\r\nexport { store as parametersStore, useSelector as useParametersSelector };\r\nexport const parametersActions = paramsSlice.actions;\r\n"],"names":[],"mappings":";;AAOA,MAAM,cAAc,WAAY,CAAA;AAAA,EAC9B,cAAc,EAAC;AAAA,EACf,IAAM,EAAA,iBAAA;AAAA,EACN,QAAU,EAAA;AAAA,IACR,OACE,KACA,EAAA;AAAA,MACE,OAAA;AAAA,KAKF,EAAA;AACA,MAAI,IAAA,CAAC,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAG,QAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,EAAC,CAAA;AAEvD,MAAM,KAAA,CAAA,OAAA,CAAQ,OAAO,CAAI,GAAA;AAAA,QACvB,GAAG,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA;AAAA,QACxB,GAAG,OAAQ,CAAA,UAAA;AAAA,OACb,CAAA;AAAA,KACF;AAAA,GACF;AACF,CAAC,CAAA,CAAA;AAED,MAAM,EAAE,KAAA,EAAO,WAAY,EAAA,GAAI,cAAe,CAAA;AAAA,EAC5C,iBAAiB,WAAY,CAAA,OAAA;AAC/B,CAAC,EAAA;AAGM,MAAM,oBAAoB,WAAY,CAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveParameters.js","sources":["../../src/config/saveParameters.ts"],"sourcesContent":["import { firePanelAction } from '../actions/firePanelAction';\nimport { TActionResult, panelActionsEmitter } from '../actions/usePanelActions';\nimport { TPanelId } from '../types';\nimport {\n TParamsStore,\n parametersActions,\n parametersStore,\n} from './parametersStore';\n\n/**\n * Actualiza los parámetros de un panel a nivel de cliente. Este método se\n * expone con el único fin de ser llamado por la acción saveParams del api.\n */\nexport function saveParameters(\n panelId: TPanelId,\n parameters: TParamsStore,\n refresh = true,\n) {\n parametersStore.dispatch(parametersActions.udpate({ panelId, parameters }));\n if (refresh) {\n panelActionsEmitter.emit(panelId, 'configurationApply', {\n data: parameters,\n } as TActionResult);\n firePanelAction(panelId, 'refresh');\n }\n}\n"],"names":["parametersStore"],"mappings":";;;;AAaO,SAAS,cACd,CAAA,OAAA,EACA,UACA,EAAA,OAAA,GAAU,IACV,EAAA;AACA,EAAAA,KAAA,CAAgB,SAAS,iBAAkB,CAAA,MAAA,CAAO,EAAE,OAAS,EAAA,UAAA,EAAY,CAAC,CAAA,CAAA;AAC1E,EAAA,IAAI,OAAS,EAAA;AACX,IAAoB,mBAAA,CAAA,IAAA,CAAK,SAAS,oBAAsB,EAAA;AAAA,MACtD,IAAM,EAAA,UAAA;AAAA,KACU,CAAA,CAAA;AAClB,IAAA,eAAA,CAAgB,SAAS,SAAS,CAAA,CAAA;AAAA,GACpC;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"saveParameters.js","sources":["../../src/config/saveParameters.ts"],"sourcesContent":["import { firePanelAction } from '../actions/firePanelAction';\r\nimport { TActionResult, panelActionsEmitter } from '../actions/usePanelActions';\r\nimport { TPanelId } from '../types';\r\nimport {\r\n TParamsStore,\r\n parametersActions,\r\n parametersStore,\r\n} from './parametersStore';\r\n\r\n/**\r\n * Actualiza los parámetros de un panel a nivel de cliente. Este método se\r\n * expone con el único fin de ser llamado por la acción saveParams del api.\r\n */\r\nexport function saveParameters(\r\n panelId: TPanelId,\r\n parameters: TParamsStore,\r\n refresh = true,\r\n) {\r\n parametersStore.dispatch(parametersActions.udpate({ panelId, parameters }));\r\n if (refresh) {\r\n panelActionsEmitter.emit(panelId, 'configurationApply', {\r\n data: parameters,\r\n } as TActionResult);\r\n firePanelAction(panelId, 'refresh');\r\n }\r\n}\r\n"],"names":["parametersStore"],"mappings":";;;;AAaO,SAAS,cACd,CAAA,OAAA,EACA,UACA,EAAA,OAAA,GAAU,IACV,EAAA;AACA,EAAAA,KAAA,CAAgB,SAAS,iBAAkB,CAAA,MAAA,CAAO,EAAE,OAAS,EAAA,UAAA,EAAY,CAAC,CAAA,CAAA;AAC1E,EAAA,IAAI,OAAS,EAAA;AACX,IAAoB,mBAAA,CAAA,IAAA,CAAK,SAAS,oBAAsB,EAAA;AAAA,MACtD,IAAM,EAAA,UAAA;AAAA,KACU,CAAA,CAAA;AAClB,IAAA,eAAA,CAAgB,SAAS,SAAS,CAAA,CAAA;AAAA,GACpC;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelConfig.js","sources":["../../src/config/usePanelConfig.ts"],"sourcesContent":["import { ApiaApi, makeApiaUrl } from '@apia/api';\nimport { EventEmitter } from '@apia/util';\nimport { usePanelIdentity } from '../common';\nimport { TPanelId } from '../types';\n\nclass ConfigEmitter extends EventEmitter<{\n refresh: { panelId: TPanelId };\n}> {}\n\nexport const configEmitter = new ConfigEmitter();\n\n/**\n * Esta función devuelve una función que al ser llamada abre el modal de\n * configuración del panel actual. Este modal permite al usuario modificar\n * parámetros y una vez confirmado, el resultado de la operación deberá ser\n * tomado por una función aún inexistente.\n *\n * Esta función se deberá encargar de almacenar los parámetros recibidos desde\n * el server para el panel actual, así como hacerle llegar al panel\n * correspondiente los datos emitidos por su contraparte en el servidor, a fin\n * de que actualice su vista.\n *\n * Admite un callback que será llamado cada vez que se confirme el modal de\n * configuración. Este callback se expone a fin de permitir la ejecución de\n * acciones previas al refresh que es lanzado en forma automática cuando\n */\nexport function usePanelConfig() {\n const { panelId } = usePanelIdentity();\n\n return function config() {\n void ApiaApi.post(\n makeApiaUrl({\n action: 'panelEdit',\n pnlId: panelId,\n }),\n { handleLoad: true },\n );\n };\n}\n"],"names":[],"mappings":";;;;AAKA,MAAM,sBAAsB,YAEzB,CAAA;AAAC,CAAA;AAEyB,IAAI,aAAc,GAAA;AAiBxC,SAAS,cAAiB,GAAA;AAC/B,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,OAAO,SAAS,MAAS,GAAA;AACvB,IAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,MACX,WAAY,CAAA;AAAA,QACV,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,OACR,CAAA;AAAA,MACD,EAAE,YAAY,IAAK,EAAA;AAAA,KACrB,CAAA;AAAA,GACF,CAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelConfig.js","sources":["../../src/config/usePanelConfig.ts"],"sourcesContent":["import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { EventEmitter } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { TPanelId } from '../types';\r\n\r\nclass ConfigEmitter extends EventEmitter<{\r\n refresh: { panelId: TPanelId };\r\n}> {}\r\n\r\nexport const configEmitter = new ConfigEmitter();\r\n\r\n/**\r\n * Esta función devuelve una función que al ser llamada abre el modal de\r\n * configuración del panel actual. Este modal permite al usuario modificar\r\n * parámetros y una vez confirmado, el resultado de la operación deberá ser\r\n * tomado por una función aún inexistente.\r\n *\r\n * Esta función se deberá encargar de almacenar los parámetros recibidos desde\r\n * el server para el panel actual, así como hacerle llegar al panel\r\n * correspondiente los datos emitidos por su contraparte en el servidor, a fin\r\n * de que actualice su vista.\r\n *\r\n * Admite un callback que será llamado cada vez que se confirme el modal de\r\n * configuración. Este callback se expone a fin de permitir la ejecución de\r\n * acciones previas al refresh que es lanzado en forma automática cuando\r\n */\r\nexport function usePanelConfig() {\r\n const { panelId } = usePanelIdentity();\r\n\r\n return function config() {\r\n void ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelEdit',\r\n pnlId: panelId,\r\n }),\r\n { handleLoad: true },\r\n );\r\n };\r\n}\r\n"],"names":[],"mappings":";;;;AAKA,MAAM,sBAAsB,YAEzB,CAAA;AAAC,CAAA;AAEyB,IAAI,aAAc,GAAA;AAiBxC,SAAS,cAAiB,GAAA;AAC/B,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AAErC,EAAA,OAAO,SAAS,MAAS,GAAA;AACvB,IAAA,KAAK,OAAQ,CAAA,IAAA;AAAA,MACX,WAAY,CAAA;AAAA,QACV,MAAQ,EAAA,WAAA;AAAA,QACR,KAAO,EAAA,OAAA;AAAA,OACR,CAAA;AAAA,MACD,EAAE,YAAY,IAAK,EAAA;AAAA,KACrB,CAAA;AAAA,GACF,CAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelParametersSelector.js","sources":["../../src/config/usePanelParametersSelector.ts"],"sourcesContent":["import { shallowEqual } from 'react-redux';\nimport { usePanelIdentity } from '../common';\nimport { TPanelName } from '../types';\nimport { TPanelParameter, useParametersSelector } from './parametersStore';\nimport { useDashboardContext } from '../dashboard';\n\nexport type TParametersSelector<Selected> = (\n parameters: Record<string, TPanelParameter>,\n) => Selected;\n\n/**\n // eslint-disable-next-line comment-length/limit-multi-line-comments\n * Este hook permite seleccionar parámetros de un panel. Cada vez que los\n * parámetros del panel sean actualizados, se llamará a la función selector y en\n * caso de que la selección actual de parámetros difiera de la anterior, se\n * provocará un renderizado en el componente que lo utiliza.\n *\n * Si se quiere obtener los parámetros del panel en el que se está trabajando,\n * el segundo parámetro es innecesario. En caso de querer obtener los\n * parámetros de otro panel, se puede pasar su nombre como segundo parámetro y\n * la selección se hará de acuerdo a los parámetros de éste.\n *\n * Es importante ver que es imposible prever qué parámetros tendrá cada panel,\n * por ello el tipo entregado al selector es Record, que puede entenderse como\n * un mapa de entradas con clave string y valor TPanelParameter = string |\n * boolean | number.\n */\nexport function usePanelParametersSelector<Selected>(\n selector: TParametersSelector<Selected>,\n panelName?: TPanelName,\n) {\n const { panelId } = usePanelIdentity();\n const dashboard = useDashboardContext();\n const id =\n panelName !== undefined\n ? dashboard.getPanelByName(panelName)?.id ?? ''\n : panelId;\n\n return useParametersSelector((global) => {\n const currentParams = global.panelParameters[id];\n return selector(currentParams ?? {});\n }, shallowEqual);\n}\n"],"names":["useParametersSelector"],"mappings":";;;;;AA2BgB,SAAA,0BAAA,CACd,UACA,SACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACrC,EAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,EAAM,MAAA,EAAA,GACJ,cAAc,KACV,CAAA,GAAA,SAAA,CAAU,eAAe,SAAS,CAAA,EAAG,MAAM,EAC3C,GAAA,OAAA,CAAA;AAEN,EAAO,OAAAA,WAAA,CAAsB,CAAC,MAAW,KAAA;AACvC,IAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,QAAA,CAAS,aAAiB,IAAA,EAAE,CAAA,CAAA;AAAA,KAClC,YAAY,CAAA,CAAA;AACjB;;;;"}
|
|
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":["useParametersSelector"],"mappings":";;;;;AA2BgB,SAAA,0BAAA,CACd,UACA,SACA,EAAA;AACA,EAAM,MAAA,EAAE,OAAQ,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACrC,EAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,EAAM,MAAA,EAAA,GACJ,cAAc,KACV,CAAA,GAAA,SAAA,CAAU,eAAe,SAAS,CAAA,EAAG,MAAM,EAC3C,GAAA,OAAA,CAAA;AAEN,EAAO,OAAAA,WAAA,CAAsB,CAAC,MAAW,KAAA;AACvC,IAAM,MAAA,aAAA,GAAgB,MAAO,CAAA,eAAA,CAAgB,EAAE,CAAA,CAAA;AAC/C,IAAO,OAAA,QAAA,CAAS,aAAiB,IAAA,EAAE,CAAA,CAAA;AAAA,KAClC,YAAY,CAAA,CAAA;AACjB;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardContext.js","sources":["../../src/dashboard/DashboardContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport { Dashboard } from './dashboard';\n\nexport const DashboardContext = createContext<Dashboard | null>(null);\n\nexport function useDashboardContext() {\n const context = useContext(DashboardContext);\n\n if (!context) throw new Error('There is no Dashboard context');\n\n return context;\n}\n"],"names":[],"mappings":";;AAGa,MAAA,gBAAA,GAAmB,cAAgC,IAAI,EAAA;AAE7D,SAAS,mBAAsB,GAAA;AACpC,EAAM,MAAA,OAAA,GAAU,WAAW,gBAAgB,CAAA,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAE7D,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
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":";;AAGa,MAAA,gBAAA,GAAmB,cAAgC,IAAI,EAAA;AAE7D,SAAS,mBAAsB,GAAA;AACpC,EAAM,MAAA,OAAA,GAAU,WAAW,gBAAgB,CAAA,CAAA;AAE3C,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,+BAA+B,CAAA,CAAA;AAE7D,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPanel.js","sources":["../../src/dashboard/DashboardPanel.tsx"],"sourcesContent":["import { createPortal } from 'react-dom';\nimport { Dashboard } from '.';\nimport { PanelContainer, TLoadedPanelProps } from '../types';\nimport { importPanel } from '../util';\nimport { EventEmitter, parseXmlAsync, toBoolean, useMount } from '@apia/util';\nimport { ReactPortal, useState } from 'react';\nimport { PanelErrorBoundary } from '../splash/panels/PanelErrorBoundary';\nimport { PanelIdentifier } from '../splash/panels/PanelIdentifier';\nimport { firePanelAction } from '../actions/firePanelAction';\nimport { parametersStore, saveParameters } from '../config';\nimport { DashboardPanelContext } from './DashboardPanelContext';\nimport {\n TActionDispatcherOptions,\n TActionResult,\n} from '../actions/usePanelActions';\n\nconst noData = { initialData: {} };\n\ntype TPanelProps = Omit<TLoadedPanelProps, 'initialData'>;\nfunction parameterValue(value: string | boolean | number) {\n if (value === 'true') return true;\n if (value === 'false') return false;\n\n return value;\n}\n\nexport class DashboardPanel extends EventEmitter<{\n hasLoaded: boolean;\n isVisible: boolean;\n}> {\n dashboard: Dashboard;\n hasInited = false;\n hasLoaded = false;\n id: string;\n initialData: Promise<unknown> | null = null;\n isVisible = false;\n portal: ReactPortal;\n props: TPanelProps = {} as TPanelProps;\n\n constructor({\n id,\n dashboard,\n PanelContainer,\n }: {\n id: string;\n dashboard: Dashboard;\n PanelContainer: PanelContainer;\n }) {\n super();\n\n this.dashboard = dashboard;\n this.id = id;\n this.#loaders.loadAll();\n\n this.portal = createPortal(\n <this.PanelElement\n ActualPanelContainer={PanelContainer}\n Element={importPanel(this.props.type)}\n />,\n this.getContainer().querySelector('.panel__content') as HTMLElement,\n this.id,\n );\n }\n\n #elements = {\n props: () => {\n const panelData = document.querySelector(\n `panel-props[id=\"${this.id as string}\"]`,\n ) as HTMLElement | null;\n\n if (!panelData) {\n console.error('Panel with no id:', this.id);\n throw new Error('A panel has no data element in the DOM.');\n }\n\n return panelData;\n },\n };\n\n #loaders = {\n loadAll: () => {\n void this.#loaders.initialData();\n this.#loaders.parameters();\n this.#loaders.props();\n },\n initialData: () => {\n const panel = this.getContainer();\n const panelContent = panel.querySelector(\n '.panel__content',\n ) as HTMLElement;\n const xml = panelContent.innerHTML\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('&', '&');\n panelContent.innerHTML = '';\n\n this.initialData = parseXmlAsync(xml.replace(/<!--?[^>]+>/, ''));\n\n return this.initialData;\n },\n parameters: () => {\n if (parametersStore.getState().panelParameters[this.id]) return;\n\n const panelData = this.#elements.props();\n\n const options = Object.fromEntries(\n [...panelData.querySelectorAll<HTMLElement>('panel-option')].map(\n (current) => {\n return [\n current.getAttribute('name') as string,\n parameterValue(current.getAttribute('value') as string),\n ];\n },\n ),\n );\n\n const parameters = Object.fromEntries(\n [...panelData.querySelectorAll<HTMLElement>('panel-parameter')].map(\n (current) => {\n return [\n current.getAttribute('name') as string,\n parameterValue(current.getAttribute('value') as string),\n ];\n },\n ),\n );\n\n saveParameters(this.id, Object.assign(options, parameters), false);\n },\n props: () => {\n const panelData = this.#elements.props();\n const panel = this.getContainer();\n\n const props: Omit<TLoadedPanelProps, 'initialData'> = {\n id: this.id,\n name: panelData.getAttribute('name') as string,\n canMove: toBoolean(panelData.getAttribute('canMove')),\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\n refreshOnHome: toBoolean(panelData.getAttribute('refreshOnHome')),\n refreshOnStart: toBoolean(panelData.getAttribute('refreshOnStart')),\n showTitle: toBoolean(panelData.getAttribute('showTitle')),\n title: panelData.getAttribute('title') as string,\n type: panel.dataset.panel as string,\n };\n\n this.props = props;\n },\n };\n\n fireAction: (\n { action, ...parameters }: { action: string } & Record<string, unknown>,\n options?: TActionDispatcherOptions,\n ) => Promise<TActionResult> = ({ action, ...parameters }, options) => {\n if (!this.isVisible) return new Promise((resolve) => resolve(null));\n\n const postData: Record<string, unknown> = {};\n\n Object.entries(parameters).forEach(([name, value]) => {\n postData[`p_${name}`] = value;\n });\n\n return new Promise<TActionResult>((resolve, reject) => {\n firePanelAction(this.id, action, postData, {\n ...options,\n onComplete(hasSucceed, data) {\n options?.onComplete?.(hasSucceed, data);\n if (hasSucceed) {\n resolve(data);\n } else reject();\n },\n });\n });\n };\n\n getContainer() {\n const panel = document.querySelector(\n `[data-id=\"${this.id}\"][data-panel]`,\n ) as HTMLElement;\n\n if (!panel) {\n console.error('Panel not found in dom:', this.id);\n throw new Error('Panel not found in DOM.');\n }\n\n return panel;\n }\n\n getParameters() {\n return parametersStore.getState().panelParameters[this.id];\n }\n\n hide() {\n const container = this.getContainer();\n container.style.display = 'none';\n container.ariaHidden = 'true';\n\n this.isVisible = false;\n this.emit('isVisible', this.isVisible);\n }\n\n refresh() {\n return this.fireAction({ action: 'refresh' });\n }\n\n setHasLoaded() {\n this.hasLoaded = true;\n this.emit('hasLoaded', true);\n }\n\n show() {\n const container = this.getContainer();\n container.style.display = 'block';\n container.ariaHidden = 'false';\n\n this.hasInited = true;\n this.isVisible = true;\n this.emit('isVisible', this.isVisible);\n }\n\n PanelElement = ({\n ActualPanelContainer,\n Element,\n }: {\n ActualPanelContainer: PanelContainer;\n Element: ReturnType<typeof importPanel>;\n }) => {\n const [resolvedInitialData, setResolvedInitialData] = useState<{\n initialData: unknown;\n } | null>(null);\n const [isVisible, setIsVisible] = useState(this.isVisible);\n\n useMount(() => {\n void this.initialData?.then((data) => {\n setResolvedInitialData((data ?? noData) as { initialData: unknown });\n });\n\n return this.on('isVisible', (ev) =>\n setIsVisible((current) => ev || current),\n );\n });\n\n if (resolvedInitialData === null || resolvedInitialData === noData)\n return null;\n\n return (\n <DashboardPanelContext.Provider value={this}>\n <PanelIdentifier {...this.props}>\n <ActualPanelContainer\n {...this.props}\n initialData={resolvedInitialData}\n >\n <this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady\n panelId={this.id}\n >\n <PanelErrorBoundary>\n {isVisible ? (\n <Element initialData={resolvedInitialData.initialData} />\n ) : null}\n </PanelErrorBoundary>\n </this.dashboard.bootstrapper.SuspendPanelUntilDashbordReady>\n </ActualPanelContainer>\n </PanelIdentifier>\n </DashboardPanelContext.Provider>\n );\n };\n}\n"],"names":["PanelContainer","parametersStore"],"mappings":"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"}
|
|
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 } 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}> {\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 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\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().querySelector('.panel__content') 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 #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 panel = this.getContainer();\r\n const panelContent = panel.querySelector(\r\n '.panel__content',\r\n ) as HTMLElement;\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().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 name: panelData.getAttribute('name') as string,\r\n canMove: toBoolean(panelData.getAttribute('canMove')),\r\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\r\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\r\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\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 };\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().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 return this.fireAction({ action: 'refresh' });\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\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 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.initialData} />\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","parametersStore"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPanelContext.js","sources":["../../src/dashboard/DashboardPanelContext.tsx"],"sourcesContent":["import { createContext, useContext } from 'react';\nimport { DashboardPanel } from './DashboardPanel';\n\nexport const DashboardPanelContext = createContext<DashboardPanel | null>(null);\n\nexport function useDashboardPanel() {\n const context = useContext(DashboardPanelContext);\n\n if (!context) throw new Error('There is no DashboardPanelContext');\n\n return context;\n}\n"],"names":[],"mappings":";;AAGa,MAAA,qBAAA,GAAwB,cAAqC,IAAI,EAAA;AAEvE,SAAS,iBAAoB,GAAA;AAClC,EAAM,MAAA,OAAA,GAAU,WAAW,qBAAqB,CAAA,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA,CAAA;AAEjE,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
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":";;AAGa,MAAA,qBAAA,GAAwB,cAAqC,IAAI,EAAA;AAEvE,SAAS,iBAAoB,GAAA;AAClC,EAAM,MAAA,OAAA,GAAU,WAAW,qBAAqB,CAAA,CAAA;AAEhD,EAAA,IAAI,CAAC,OAAA;AAAS,IAAM,MAAA,IAAI,MAAM,mCAAmC,CAAA,CAAA;AAEjE,EAAO,OAAA,OAAA,CAAA;AACT;;;;"}
|
|
@@ -13,7 +13,7 @@ var __accessCheck = (obj, member, msg) => {
|
|
|
13
13
|
};
|
|
14
14
|
var __privateGet = (obj, member, getter) => {
|
|
15
15
|
__accessCheck(obj, member, "read from private field");
|
|
16
|
-
return
|
|
16
|
+
return member.get(obj);
|
|
17
17
|
};
|
|
18
18
|
var __privateAdd = (obj, member, value) => {
|
|
19
19
|
if (member.has(obj))
|
|
@@ -22,7 +22,7 @@ var __privateAdd = (obj, member, value) => {
|
|
|
22
22
|
};
|
|
23
23
|
var __privateSet = (obj, member, value, setter) => {
|
|
24
24
|
__accessCheck(obj, member, "write to private field");
|
|
25
|
-
|
|
25
|
+
member.set(obj, value);
|
|
26
26
|
return value;
|
|
27
27
|
};
|
|
28
28
|
var _hasLoadedAll, _bootstrappedPanels, _hasLoaded, _initTimestamp, _timeoutTreshold, _checkAllHasLoaded, _removeSkeletons;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPanelsBootstraper.js","sources":["../../src/dashboard/DashboardPanelsBootstraper.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-throw-literal */\nimport {\n ReactNode,\n Suspense,\n useCallback,\n useDeferredValue,\n useState,\n} from 'react';\nimport { Dashboard } from './dashboard';\n\ndeclare global {\n interface Window {\n DASH_COURTAIN_TRESHOLD?: number;\n }\n}\n\nexport class DashboardPanelsBootstraper {\n #hasLoadedAll = false;\n #bootstrappedPanels: Record<string, boolean> = {};\n #hasLoaded: Record<string, boolean> = {};\n\n #initTimestamp = Date.now();\n #timeoutTreshold = (window.DASH_COURTAIN_TRESHOLD ?? 5) * 1000;\n\n constructor(public dashboard: Dashboard) {}\n\n #checkAllHasLoaded = () => {\n if (this.#hasLoadedAll) return true;\n\n const keys = Object.keys(this.#bootstrappedPanels);\n const hasLoadedAllPanels = !keys.find(\n (current) =>\n !this.#hasLoaded[current] && this.dashboard.getPanel(current).isVisible,\n );\n const hasTimedOutLoading =\n Date.now() - this.#initTimestamp > this.#timeoutTreshold;\n\n if (hasLoadedAllPanels || hasTimedOutLoading) {\n if (hasTimedOutLoading) {\n const nonBootstrappedPanels = Object.keys(this.#bootstrappedPanels)\n .filter((current) => !this.#hasLoaded[current])\n .map((panelId) => {\n const panelProps = this.dashboard.getPanel(panelId).props;\n return panelProps;\n });\n\n console.warn(\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.`,\n { nonBootstrappedPanels },\n );\n }\n\n this.#hasLoadedAll = true;\n this.#removeSkeletons();\n return true;\n }\n\n return false;\n };\n\n #removeSkeletons = () => {\n const skeleton = document.querySelector(\n '#DashLayoutCourtain',\n ) as HTMLElement;\n const dashContent = document.querySelector(\n '#DashLayoutContent',\n ) as HTMLElement;\n\n skeleton.style.display = 'none';\n dashContent.style.visibility = 'initial';\n skeleton.remove();\n };\n\n /**\n * El bootstraper se basa en dos elementos: setHasLoadedInitialData y\n * SuspendPanelUntilDashboardReady.\n *\n * El funcionamiento es muy elemental: Cada panel utiliza el Suspend como\n * wrapper y éste registra el id del panel en un array de paneles pendientes\n * por cargar.\n *\n * Una vez que todos los paneles cargaron, el suspense retoma su tarea y\n * renderiza el panel normalmente.\n */\n setPanelHasLoaded = (panelId: string) => {\n this.#hasLoaded[panelId] = true;\n this.dashboard.getPanel(panelId).setHasLoaded();\n };\n\n SuspendPanelUntilDashbordReady = ({\n children,\n panelId,\n }: {\n children: ReactNode;\n panelId: string;\n }) => {\n const [hasBootstraped, setHasBootstraped] = useState(false);\n const deferredHasBootstraped = useDeferredValue(hasBootstraped);\n this.#bootstrappedPanels[panelId] = true;\n\n const LoadWaiter = useCallback(() => {\n if (!this.#checkAllHasLoaded())\n void new Promise<void>((resolve) => {\n const interval = setInterval(() => {\n if (this.#checkAllHasLoaded()) {\n resolve();\n clearInterval(interval);\n }\n }, 300);\n });\n return null;\n }, []);\n\n if (!deferredHasBootstraped)\n return (\n <div\n ref={(el) => {\n if (el) setHasBootstraped(true);\n }}\n />\n );\n\n return (\n <Suspense fallback={null}>\n {children}\n <LoadWaiter />\n </Suspense>\n );\n };\n}\n"],"names":[],"mappings":"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"}
|
|
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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"}
|
|
@@ -5,7 +5,7 @@ import { shallowEqual } from 'react-redux';
|
|
|
5
5
|
var __defProp = Object.defineProperty;
|
|
6
6
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
7
7
|
var __publicField = (obj, key, value) => {
|
|
8
|
-
__defNormalProp(obj,
|
|
8
|
+
__defNormalProp(obj, key + "" , value);
|
|
9
9
|
return value;
|
|
10
10
|
};
|
|
11
11
|
var __accessCheck = (obj, member, msg) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardRouter.js","sources":["../../src/dashboard/DashboardRouter.tsx"],"sourcesContent":["/* eslint-disable @typescript-eslint/prefer-for-of */\nimport { EventEmitter, useMount } from '@apia/util';\nimport { useRef } from 'react';\nimport { shallowEqual } from 'react-redux';\n\nexport type TSwitchRoute = {\n /**\n * El callback será llamado si la ruta coincide.\n */\n callback: (result: RegExpMatchArray) => unknown;\n route: RegExp;\n};\n\nexport type TUseSwitch = TSwitchRoute[];\n\nexport class Router extends EventEmitter<{ newRoute: string }> {\n #matchLocation = (regexp: RegExp) => {\n const path =\n '/' +\n (window.location.href\n .replaceAll('%20', ' ')\n .match(new RegExp(`${window.CONTEXT}/?([^?]+)?(?:\\\\?.*)?`))?.[1] ?? '');\n\n return path.match(regexp);\n };\n\n constructor() {\n super();\n\n window.addEventListener('popstate', () => {\n this.emit('newRoute', window.location.href);\n });\n }\n\n #evalRoutes = (routes: TUseSwitch) => {\n for (let i = 0; i < routes.length; i++) {\n const match = this.#matchLocation(routes[i].route);\n if (match) {\n return { route: routes[i], match };\n }\n }\n };\n\n /**\n * Se evaluarán las rutas en orden y la primera en coincidir será tomada como\n * resultado del cambio de ruta.\n *\n * Las rutas provistas deberán matchear contra el path actual. El path actual\n * es la porción de la ruta luego del dominio y el contexto. Ejemplo:\n *\n * http://localhost/apia => path='/'\n * http://localhost/apia/spa/categories/comidas/1 => path='/spa/categories/comidas/1'\n */\n useSwitch = (routes: TUseSwitch) => {\n const lastMatch = useRef<TSwitchRoute | null>(null);\n\n useMount(() => {\n const result = this.#evalRoutes(routes);\n if (result) {\n result.route.callback(result.match);\n }\n\n return this.on('newRoute', () => {\n const result = this.#evalRoutes(routes);\n if (result && !shallowEqual(result.match, lastMatch.current)) {\n result.route.callback(result.match);\n }\n });\n });\n };\n}\n"],"names":["result"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAA,cAAA,EAAA,WAAA,CAAA;AAeO,MAAM,eAAe,YAAmC,CAAA;AAAA,EAW7D,WAAc,GAAA;AACZ,IAAM,KAAA,EAAA,CAAA;AAXR,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,CAAC,MAAmB,KAAA;AACnC,MAAA,MAAM,OACJ,GACC,IAAA,MAAA,CAAO,SAAS,IACd,CAAA,UAAA,CAAW,OAAO,GAAG,CAAA,CACrB,MAAM,IAAI,MAAA,CAAO,GAAG,MAAO,CAAA,OAAO,sBAAsB,CAAC,CAAA,GAAI,CAAC,CAAK,IAAA,EAAA,CAAA,CAAA;AAExE,MAAO,OAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAUA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,CAAC,MAAuB,KAAA;AACpC,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,QAAA,MAAM,QAAQ,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA,CAAL,IAAoB,CAAA,IAAA,EAAA,MAAA,CAAO,CAAC,CAAE,CAAA,KAAA,CAAA,CAAA;AAC5C,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAO,EAAE,KAAA,EAAO,MAAO,CAAA,CAAC,GAAG,KAAM,EAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF,CAAA,CAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,MAAuB,KAAA;AAClC,MAAM,MAAA,SAAA,GAAY,OAA4B,IAAI,CAAA,CAAA;AAElD,MAAA,QAAA,CAAS,MAAM;AACb,QAAM,MAAA,MAAA,GAAS,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,QAAA,IAAI,MAAQ,EAAA;AACV,UAAO,MAAA,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,SACpC;AAEA,QAAO,OAAA,IAAA,CAAK,EAAG,CAAA,UAAA,EAAY,MAAM;AAC/B,UAAMA,MAAAA,OAAAA,GAAS,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,UAAA,IAAIA,WAAU,CAAC,YAAA,CAAaA,QAAO,KAAO,EAAA,SAAA,CAAU,OAAO,CAAG,EAAA;AAC5D,YAAAA,OAAO,CAAA,KAAA,CAAM,QAASA,CAAAA,OAAAA,CAAO,KAAK,CAAA,CAAA;AAAA,WACpC;AAAA,SACD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAxCE,IAAO,MAAA,CAAA,gBAAA,CAAiB,YAAY,MAAM;AACxC,MAAA,IAAA,CAAK,IAAK,CAAA,UAAA,EAAY,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,KAC3C,CAAA,CAAA;AAAA,GACH;AAsCF,CAAA;AAtDE,cAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAkBA,WAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
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,CAAA;AAeO,MAAM,eAAe,YAAmC,CAAA;AAAA,EAW7D,WAAc,GAAA;AACZ,IAAM,KAAA,EAAA,CAAA;AAXR,IAAA,YAAA,CAAA,IAAA,EAAA,cAAA,EAAiB,CAAC,MAAmB,KAAA;AACnC,MAAA,MAAM,OACJ,GACC,IAAA,MAAA,CAAO,SAAS,IACd,CAAA,UAAA,CAAW,OAAO,GAAG,CAAA,CACrB,MAAM,IAAI,MAAA,CAAO,GAAG,MAAO,CAAA,OAAO,sBAAsB,CAAC,CAAA,GAAI,CAAC,CAAK,IAAA,EAAA,CAAA,CAAA;AAExE,MAAO,OAAA,IAAA,CAAK,MAAM,MAAM,CAAA,CAAA;AAAA,KAC1B,CAAA,CAAA;AAUA,IAAA,YAAA,CAAA,IAAA,EAAA,WAAA,EAAc,CAAC,MAAuB,KAAA;AACpC,MAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,MAAA,CAAO,QAAQ,CAAK,EAAA,EAAA;AACtC,QAAA,MAAM,QAAQ,YAAK,CAAA,IAAA,EAAA,cAAA,CAAA,CAAL,IAAoB,CAAA,IAAA,EAAA,MAAA,CAAO,CAAC,CAAE,CAAA,KAAA,CAAA,CAAA;AAC5C,QAAA,IAAI,KAAO,EAAA;AACT,UAAA,OAAO,EAAE,KAAA,EAAO,MAAO,CAAA,CAAC,GAAG,KAAM,EAAA,CAAA;AAAA,SACnC;AAAA,OACF;AAAA,KACF,CAAA,CAAA;AAYA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAY,CAAC,MAAuB,KAAA;AAClC,MAAM,MAAA,SAAA,GAAY,OAA4B,IAAI,CAAA,CAAA;AAElD,MAAA,QAAA,CAAS,MAAM;AACb,QAAM,MAAA,MAAA,GAAS,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,QAAA,IAAI,MAAQ,EAAA;AACV,UAAO,MAAA,CAAA,KAAA,CAAM,QAAS,CAAA,MAAA,CAAO,KAAK,CAAA,CAAA;AAAA,SACpC;AAEA,QAAO,OAAA,IAAA,CAAK,EAAG,CAAA,UAAA,EAAY,MAAM;AAC/B,UAAMA,MAAAA,OAAAA,GAAS,YAAK,CAAA,IAAA,EAAA,WAAA,CAAA,CAAL,IAAiB,CAAA,IAAA,EAAA,MAAA,CAAA,CAAA;AAChC,UAAA,IAAIA,WAAU,CAAC,YAAA,CAAaA,QAAO,KAAO,EAAA,SAAA,CAAU,OAAO,CAAG,EAAA;AAC5D,YAAAA,OAAO,CAAA,KAAA,CAAM,QAASA,CAAAA,OAAAA,CAAO,KAAK,CAAA,CAAA;AAAA,WACpC;AAAA,SACD,CAAA,CAAA;AAAA,OACF,CAAA,CAAA;AAAA,KACH,CAAA,CAAA;AAxCE,IAAO,MAAA,CAAA,gBAAA,CAAiB,YAAY,MAAM;AACxC,MAAA,IAAA,CAAK,IAAK,CAAA,UAAA,EAAY,MAAO,CAAA,QAAA,CAAS,IAAI,CAAA,CAAA;AAAA,KAC3C,CAAA,CAAA;AAAA,GACH;AAsCF,CAAA;AAtDE,cAAA,GAAA,IAAA,OAAA,EAAA,CAAA;AAkBA,WAAA,GAAA,IAAA,OAAA,EAAA;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PanelNotFound.js","sources":["../../src/dashboard/PanelNotFound.tsx"],"sourcesContent":["import { Heading } from '@apia/theme';\nimport { usePanelIdentity } from '../common';\n\nexport const PanelNotFound = () => {\n const props = usePanelIdentity();\n\n return (\n <>\n <Heading>Panel not found: {props.panelType}</Heading>\n </>\n );\n};\n"],"names":[],"mappings":";;;;AAGO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,QAAQ,gBAAiB,EAAA,CAAA;AAE/B,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACE,+BAAC,OAAQ,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,mBAAA;AAAA,IAAkB,KAAM,CAAA,SAAA;AAAA,GAAA,EAAU,CAC7C,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"PanelNotFound.js","sources":["../../src/dashboard/PanelNotFound.tsx"],"sourcesContent":["import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const PanelNotFound = () => {\r\n const props = usePanelIdentity();\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":";;;;AAGO,MAAM,gBAAgB,MAAM;AACjC,EAAA,MAAM,QAAQ,gBAAiB,EAAA,CAAA;AAE/B,EACE,uBAAA,GAAA,CAAA,QAAA,EAAA,EACE,+BAAC,OAAQ,EAAA,EAAA,QAAA,EAAA;AAAA,IAAA,mBAAA;AAAA,IAAkB,KAAM,CAAA,SAAA;AAAA,GAAA,EAAU,CAC7C,EAAA,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -21,7 +21,7 @@ var __accessCheck = (obj, member, msg) => {
|
|
|
21
21
|
};
|
|
22
22
|
var __privateGet = (obj, member, getter) => {
|
|
23
23
|
__accessCheck(obj, member, "read from private field");
|
|
24
|
-
return
|
|
24
|
+
return member.get(obj);
|
|
25
25
|
};
|
|
26
26
|
var __privateAdd = (obj, member, value) => {
|
|
27
27
|
if (member.has(obj))
|
|
@@ -30,7 +30,7 @@ var __privateAdd = (obj, member, value) => {
|
|
|
30
30
|
};
|
|
31
31
|
var __privateSet = (obj, member, value, setter) => {
|
|
32
32
|
__accessCheck(obj, member, "write to private field");
|
|
33
|
-
|
|
33
|
+
member.set(obj, value);
|
|
34
34
|
return value;
|
|
35
35
|
};
|
|
36
36
|
var _currentScene, _dragAndDrop, _PanelContainer, _panelsRenderedPortals, _loadPanels, _Context, _suscribeToEvents, _usePanelsList, _SceneRenderer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dashboard.js","sources":["../../src/dashboard/dashboard.tsx"],"sourcesContent":["import { EventEmitter, useMount } from '@apia/util';\nimport { ReactNode, ReactPortal, useDeferredValue, useState } from 'react';\nimport { PanelContainer } from '../types';\nimport { DefaultPanelWrapper } from '../splash/panels/DefaultPanelWrapper';\nimport { DashboardPanelsBootstraper } from './DashboardPanelsBootstraper';\nimport { DashboardContext } from './DashboardContext';\nimport { DashboardPanel } from './DashboardPanel';\nimport { DragAndDrop } from '../splash/util/DragAndDrop';\nimport { eventsController } from '../eventsController';\nimport { Router } from './DashboardRouter';\n\nexport class Dashboard extends EventEmitter<{\n changeScene: string;\n}> {\n bootstrapper = new DashboardPanelsBootstraper(this);\n panels: Record<string, DashboardPanel> | null = null;\n router = new Router();\n scenes: Record<string, string[]> = {};\n\n #currentScene = '/';\n #dragAndDrop = new DragAndDrop();\n #PanelContainer: PanelContainer = DefaultPanelWrapper;\n #panelsRenderedPortals: ReactPortal[] = [];\n\n getPanel = (id: string) => this.panels?.[id] as DashboardPanel;\n getPanelByName = (name: string) =>\n Object.values(this.panels ?? {}).find(\n (current) => current.props.name === name,\n );\n\n #loadPanels = () => {\n this.panels = {};\n\n const panelsElements = document.querySelectorAll(\n '[data-panel]',\n ) as NodeListOf<HTMLElement>;\n\n Array.from(panelsElements).forEach((current) => {\n const panel = new DashboardPanel({\n dashboard: this,\n PanelContainer: this.#PanelContainer,\n id: current.dataset.id as string,\n });\n\n let panelPath = (panel.getParameters().PAR_SPA_PATH as string) || '*';\n if (panelPath === '/') panelPath = `/${this.urlContext}`;\n if (panelPath !== '*') panel.hide();\n else panel.show();\n\n const paths = panelPath.split(',');\n paths.forEach((currentPath) => {\n if (!this.scenes[currentPath]) this.scenes[currentPath] = [];\n this.scenes[currentPath].push(panel.props.id);\n });\n\n (this.panels as Record<string, DashboardPanel>)[panel.props.id] = panel;\n\n this.#panelsRenderedPortals.push(panel.portal);\n });\n\n this.#dragAndDrop.bootstrap();\n };\n\n #Context = ({ children }: { children: ReactNode }) => {\n return (\n <DashboardContext.Provider value={this}>\n {children}\n </DashboardContext.Provider>\n );\n };\n\n #suscribeToEvents = () => {\n eventsController.onEvent({ eventType: 'dashboard__focus' }, () => {\n Object.values(this.panels ?? {}).forEach((current) => {\n if (current.props.refreshOnHome) {\n void current.refresh();\n }\n });\n });\n };\n #usePanelsList = () => {\n const [panels, setPanels] = useState<ReactNode>(null);\n const deferredPanels = useDeferredValue(panels);\n\n useMount(() => {\n this.loadScene();\n setPanels(this.#panelsRenderedPortals);\n });\n\n this.router.useSwitch([\n {\n route: new RegExp(`(?:/spa)?/(\\\\w+)`),\n callback: (result) => {\n console.log('Dashboard', { scene: result[1] });\n this.loadScene(result[1]);\n },\n },\n {\n route: new RegExp(`/`),\n callback: () => {\n console.log('Dashboard', { noScene: '/' });\n this.loadScene('/');\n },\n },\n ]);\n\n return deferredPanels;\n };\n\n constructor(\n panelsContainer: PanelContainer = DefaultPanelWrapper,\n public urlContext: string,\n ) {\n super();\n\n this.#currentScene = `/`;\n this.#PanelContainer = panelsContainer ?? this.#PanelContainer;\n this.#suscribeToEvents();\n }\n\n #SceneRenderer = () => {\n const Context = this.#Context;\n const panels = this.#usePanelsList();\n\n return <Context>{panels}</Context>;\n };\n\n loadScene = (scene: string = this.#currentScene): ReactPortal[] => {\n let actualScene = scene;\n if (!actualScene.startsWith('/')) actualScene = `/${actualScene}`;\n\n if (!this.panels) this.#loadPanels();\n if (!this.scenes[actualScene]) this.scenes[actualScene] = [];\n\n this.scenes[this.#currentScene].forEach((scenePanelId) => {\n if (!this.scenes[actualScene].includes(scenePanelId))\n this.panels?.[scenePanelId]?.hide();\n });\n this.scenes[actualScene].forEach((scenePanelIds) => {\n const panel = this.panels?.[scenePanelIds];\n if (panel) {\n panel.show();\n if (panel.hasInited && panel.props.refreshOnStart) void panel.refresh();\n }\n });\n\n this.#currentScene = actualScene;\n\n return this.#panelsRenderedPortals;\n };\n\n Component = () => {\n const R = this.#SceneRenderer;\n return <R />;\n };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dashboard.js","sources":["../../src/dashboard/dashboard.tsx"],"sourcesContent":["import { EventEmitter, 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\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 router = new Router();\r\n scenes: Record<string, string[]> = {};\r\n\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 const panel = new DashboardPanel({\r\n dashboard: this,\r\n PanelContainer: this.#PanelContainer,\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 console.log('Dashboard', { scene: result[1] });\r\n this.loadScene(result[1]);\r\n },\r\n },\r\n {\r\n route: new RegExp(`/`),\r\n callback: () => {\r\n console.log('Dashboard', { noScene: '/' });\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":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
3
|
var __publicField = (obj, key, value) => {
|
|
4
|
-
__defNormalProp(obj,
|
|
4
|
+
__defNormalProp(obj, key + "" , value);
|
|
5
5
|
return value;
|
|
6
6
|
};
|
|
7
7
|
function identifierAfitsOnB(a, b) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventsController.js","sources":["../../src/eventsController/eventsController.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n TPanelEventCallback,\n TPanelEventIdentifier,\n TPanelEventRegister,\n TPanelIdentifier,\n} from './types';\n\nfunction identifierAfitsOnB(\n a: Partial<TPanelEventIdentifier>,\n b: TPanelEventIdentifier,\n) {\n // eslint-disable-next-line no-restricted-syntax, @typescript-eslint/no-for-in-array\n for (const key of Object.keys(a)) {\n if (\n a[key as keyof Partial<TPanelIdentifier>] !==\n b[key as keyof TPanelIdentifier]\n )\n return false;\n }\n\n return true;\n}\n\nexport const eventsController = new (class EventsController {\n callbacks: TPanelEventRegister<any>[] = [];\n\n broadcast(eventType: string, payload: any) {\n const origin: TPanelIdentifier = {\n panelId: 'broadcast',\n panelName: 'broadcast',\n panelType: 'broadcast',\n panelTitle: 'broadcast',\n };\n\n this.callbacks.forEach(({ callback, ...current }) => {\n if (eventType === current.eventType) {\n callback({ ...origin, eventType, payload });\n }\n });\n }\n\n fireEvent(origin: TPanelIdentifier, eventType: string, payload: any) {\n if ([origin.panelId, origin.panelName, origin.panelType].includes('*'))\n throw new Error(\n 'Broadcast is not allowed through fireEvent, use broadcast instead',\n );\n\n this.callbacks.forEach(({ callback, ...current }) => {\n if (identifierAfitsOnB(current, { ...origin, eventType })) {\n callback({ ...origin, eventType, payload });\n }\n });\n }\n\n onEvent<PayloadEvent>(\n distinction: Partial<TPanelEventIdentifier>,\n callback: TPanelEventCallback<PayloadEvent>,\n ) {\n const register: TPanelEventRegister<PayloadEvent> = {\n ...distinction,\n callback,\n };\n\n this.callbacks.push(register);\n\n return () => {\n this.callbacks = this.callbacks.filter((current) => {\n return current !== register;\n });\n };\n }\n})();\n"],"names":[],"mappings":";;;;;;AASA,SAAS,kBAAA,CACP,GACA,CACA,EAAA;AAEA,EAAA,KAAA,MAAW,GAAO,IAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAG,EAAA;AAChC,IAAA,IACE,CAAE,CAAA,GAAsC,CACxC,KAAA,CAAA,CAAE,GAA6B,CAAA;AAE/B,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEa,MAAA,gBAAA,GAAmB,IAAK,MAAM,gBAAiB,CAAA;AAAA,EAAvB,WAAA,GAAA;AACnC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAwC,EAAC,CAAA,CAAA;AAAA,GAAA;AAAA,EAEzC,SAAA,CAAU,WAAmB,OAAc,EAAA;AACzC,IAAA,MAAM,MAA2B,GAAA;AAAA,MAC/B,OAAS,EAAA,WAAA;AAAA,MACT,SAAW,EAAA,WAAA;AAAA,MACX,SAAW,EAAA,WAAA;AAAA,MACX,UAAY,EAAA,WAAA;AAAA,KACd,CAAA;AAEA,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAI,IAAA,SAAA,KAAc,QAAQ,SAAW,EAAA;AACnC,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,SAAA,CAAU,MAA0B,EAAA,SAAA,EAAmB,OAAc,EAAA;AACnE,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA,MAAA,CAAO,WAAW,MAAO,CAAA,SAAS,CAAE,CAAA,QAAA,CAAS,GAAG,CAAA;AACnE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mEAAA;AAAA,OACF,CAAA;AAEF,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAA,IAAI,mBAAmB,OAAS,EAAA,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,CAAG,EAAA;AACzD,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,OAAA,CACE,aACA,QACA,EAAA;AACA,IAAA,MAAM,QAA8C,GAAA;AAAA,MAClD,GAAG,WAAA;AAAA,MACH,QAAA;AAAA,KACF,CAAA;AAEA,IAAK,IAAA,CAAA,SAAA,CAAU,KAAK,QAAQ,CAAA,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA;AAClD,QAAA,OAAO,OAAY,KAAA,QAAA,CAAA;AAAA,OACpB,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AACF,CAAG;;;;"}
|
|
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,CACA,EAAA;AAEA,EAAA,KAAA,MAAW,GAAO,IAAA,MAAA,CAAO,IAAK,CAAA,CAAC,CAAG,EAAA;AAChC,IAAA,IACE,CAAE,CAAA,GAAsC,CACxC,KAAA,CAAA,CAAE,GAA6B,CAAA;AAE/B,MAAO,OAAA,KAAA,CAAA;AAAA,GACX;AAEA,EAAO,OAAA,IAAA,CAAA;AACT,CAAA;AAEa,MAAA,gBAAA,GAAmB,IAAK,MAAM,gBAAiB,CAAA;AAAA,EAAvB,WAAA,GAAA;AACnC,IAAA,aAAA,CAAA,IAAA,EAAA,WAAA,EAAwC,EAAC,CAAA,CAAA;AAAA,GAAA;AAAA,EAEzC,SAAA,CAAU,WAAmB,OAAc,EAAA;AACzC,IAAA,MAAM,MAA2B,GAAA;AAAA,MAC/B,OAAS,EAAA,WAAA;AAAA,MACT,SAAW,EAAA,WAAA;AAAA,MACX,SAAW,EAAA,WAAA;AAAA,MACX,UAAY,EAAA,WAAA;AAAA,KACd,CAAA;AAEA,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAI,IAAA,SAAA,KAAc,QAAQ,SAAW,EAAA;AACnC,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,SAAA,CAAU,MAA0B,EAAA,SAAA,EAAmB,OAAc,EAAA;AACnE,IAAI,IAAA,CAAC,OAAO,OAAS,EAAA,MAAA,CAAO,WAAW,MAAO,CAAA,SAAS,CAAE,CAAA,QAAA,CAAS,GAAG,CAAA;AACnE,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,mEAAA;AAAA,OACF,CAAA;AAEF,IAAA,IAAA,CAAK,UAAU,OAAQ,CAAA,CAAC,EAAE,QAAU,EAAA,GAAG,SAAc,KAAA;AACnD,MAAA,IAAI,mBAAmB,OAAS,EAAA,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,CAAG,EAAA;AACzD,QAAA,QAAA,CAAS,EAAE,GAAG,MAAQ,EAAA,SAAA,EAAW,SAAS,CAAA,CAAA;AAAA,OAC5C;AAAA,KACD,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,OAAA,CACE,aACA,QACA,EAAA;AACA,IAAA,MAAM,QAA8C,GAAA;AAAA,MAClD,GAAG,WAAA;AAAA,MACH,QAAA;AAAA,KACF,CAAA;AAEA,IAAK,IAAA,CAAA,SAAA,CAAU,KAAK,QAAQ,CAAA,CAAA;AAE5B,IAAA,OAAO,MAAM;AACX,MAAA,IAAA,CAAK,SAAY,GAAA,IAAA,CAAK,SAAU,CAAA,MAAA,CAAO,CAAC,OAAY,KAAA;AAClD,QAAA,OAAO,OAAY,KAAA,QAAA,CAAA;AAAA,OACpB,CAAA,CAAA;AAAA,KACH,CAAA;AAAA,GACF;AACF,CAAG;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelFireEvent.js","sources":["../../src/eventsController/usePanelFireEvent.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { useCallback } from 'react';\nimport { eventsController } from './eventsController';\nimport { usePanelIdentity } from '../common/usePanelIdentity';\n\n/**\n * Este hook devuelve un método que puede ser llamado para emitir un evento en\n * el panel desde el cual es llamado. Los eventos de panel son emitidos con id\n * de panel, tipo de panel, nombre de panel y tipo de evento y las suscripciones\n * pueden ser realizadas a un conjunto arbitrario de estos identificadores.\n *\n * El segundo parámetro del método fireEvent devuelto es el payload, que puede\n * ser de cualquier tipo.\n */\nexport function usePanelFireEvent() {\n const { panelId, panelName, panelType, panelTitle } = usePanelIdentity();\n\n const fireEvent = useCallback(\n (eventType: string, payload: any) => {\n eventsController.fireEvent(\n { panelId, panelName, panelType, panelTitle },\n eventType,\n payload,\n );\n },\n [panelId, panelName, panelType, panelTitle],\n );\n\n return fireEvent;\n}\n"],"names":[],"mappings":";;;;AAeO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,EAAE,OAAS,EAAA,SAAA,EAAW,SAAW,EAAA,UAAA,KAAe,gBAAiB,EAAA,CAAA;AAEvE,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,WAAmB,OAAiB,KAAA;AACnC,MAAiB,gBAAA,CAAA,SAAA;AAAA,QACf,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAW,EAAA;AAAA,QAC5C,SAAA;AAAA,QACA,OAAA;AAAA,OACF,CAAA;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAU,CAAA;AAAA,GAC5C,CAAA;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelFireEvent.js","sources":["../../src/eventsController/usePanelFireEvent.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n\r\nimport { useCallback } from 'react';\r\nimport { eventsController } from './eventsController';\r\nimport { usePanelIdentity } from '../common/usePanelIdentity';\r\n\r\n/**\r\n * Este hook devuelve un método que puede ser llamado para emitir un evento en\r\n * el panel desde el cual es llamado. Los eventos de panel son emitidos con id\r\n * de panel, tipo de panel, nombre de panel y tipo de evento y las suscripciones\r\n * pueden ser realizadas a un conjunto arbitrario de estos identificadores.\r\n *\r\n * El segundo parámetro del método fireEvent devuelto es el payload, que puede\r\n * ser de cualquier tipo.\r\n */\r\nexport function usePanelFireEvent() {\r\n const { panelId, panelName, panelType, panelTitle } = usePanelIdentity();\r\n\r\n const fireEvent = useCallback(\r\n (eventType: string, payload: any) => {\r\n eventsController.fireEvent(\r\n { panelId, panelName, panelType, panelTitle },\r\n eventType,\r\n payload,\r\n );\r\n },\r\n [panelId, panelName, panelType, panelTitle],\r\n );\r\n\r\n return fireEvent;\r\n}\r\n"],"names":[],"mappings":";;;;AAeO,SAAS,iBAAoB,GAAA;AAClC,EAAA,MAAM,EAAE,OAAS,EAAA,SAAA,EAAW,SAAW,EAAA,UAAA,KAAe,gBAAiB,EAAA,CAAA;AAEvE,EAAA,MAAM,SAAY,GAAA,WAAA;AAAA,IAChB,CAAC,WAAmB,OAAiB,KAAA;AACnC,MAAiB,gBAAA,CAAA,SAAA;AAAA,QACf,EAAE,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAW,EAAA;AAAA,QAC5C,SAAA;AAAA,QACA,OAAA;AAAA,OACF,CAAA;AAAA,KACF;AAAA,IACA,CAAC,OAAA,EAAS,SAAW,EAAA,SAAA,EAAW,UAAU,CAAA;AAAA,GAC5C,CAAA;AAEA,EAAO,OAAA,SAAA,CAAA;AACT;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"usePanelOnEvent.js","sources":["../../src/eventsController/usePanelOnEvent.ts"],"sourcesContent":["import { useEffect } from 'react';\nimport { eventsController } from './eventsController';\nimport { TPanelEventIdentifier, TPanelEventCallback } from './types';\n\n/**\n * Este hook permite realizar suscripciones a eventos de paneles. Deberá ser\n * llamado una vez por cada suscripción que desee hacerse dentro de un panel y\n * no se deberán ejecutar acciones para romper las suscripciones hechas, ya que\n * este hook maneja esa lógica de forma automática.\n */\nexport function usePanelOnEvent<PayloadEvent>(\n distinction: Partial<TPanelEventIdentifier>,\n callback: TPanelEventCallback<PayloadEvent>,\n) {\n useEffect(() => {\n const unsuscriber = eventsController.onEvent(distinction, callback);\n\n return () => {\n unsuscriber();\n };\n });\n}\n"],"names":[],"mappings":";;;AAUgB,SAAA,eAAA,CACd,aACA,QACA,EAAA;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAc,GAAA,gBAAA,CAAiB,OAAQ,CAAA,WAAA,EAAa,QAAQ,CAAA,CAAA;AAElE,IAAA,OAAO,MAAM;AACX,MAAY,WAAA,EAAA,CAAA;AAAA,KACd,CAAA;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
|
1
|
+
{"version":3,"file":"usePanelOnEvent.js","sources":["../../src/eventsController/usePanelOnEvent.ts"],"sourcesContent":["import { useEffect } from 'react';\r\nimport { eventsController } from './eventsController';\r\nimport { TPanelEventIdentifier, TPanelEventCallback } from './types';\r\n\r\n/**\r\n * Este hook permite realizar suscripciones a eventos de paneles. Deberá ser\r\n * llamado una vez por cada suscripción que desee hacerse dentro de un panel y\r\n * no se deberán ejecutar acciones para romper las suscripciones hechas, ya que\r\n * este hook maneja esa lógica de forma automática.\r\n */\r\nexport function usePanelOnEvent<PayloadEvent>(\r\n distinction: Partial<TPanelEventIdentifier>,\r\n callback: TPanelEventCallback<PayloadEvent>,\r\n) {\r\n useEffect(() => {\r\n const unsuscriber = eventsController.onEvent(distinction, callback);\r\n\r\n return () => {\r\n unsuscriber();\r\n };\r\n });\r\n}\r\n"],"names":[],"mappings":";;;AAUgB,SAAA,eAAA,CACd,aACA,QACA,EAAA;AACA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,WAAc,GAAA,gBAAA,CAAiB,OAAQ,CAAA,WAAA,EAAa,QAAQ,CAAA,CAAA;AAElE,IAAA,OAAO,MAAM;AACX,MAAY,WAAA,EAAA,CAAA;AAAA,KACd,CAAA;AAAA,GACD,CAAA,CAAA;AACH;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createPanelStore.js","sources":["../../src/panelsStore/createPanelStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { SliceCaseReducers, shallowEqual } from '@apia/store';\nimport { useLatest } from '@apia/util';\nimport { useEffect, useMemo } from 'react';\nimport { TLoadedPanelProps, TPanelName, TPanelType } from '../types';\nimport { panelsActions, panelsStore, registerReducers } from './panelsStore';\nimport { usePanelSelector } from './usePanelSelector';\nimport { usePanelIdentity } from '../common';\nimport { useDashboardContext } from '../dashboard';\n\ndeclare type ActionCreatorForCaseReducer<CR> = CR extends (\n state: any,\n action: infer Action,\n) => any\n ? Action extends {\n payload: infer P;\n }\n ? (payload: P, panelName?: string) => unknown\n : () => unknown\n : () => unknown;\n\ntype CaseReducerActions<CaseReducers extends SliceCaseReducers<any>> = {\n [Type in keyof CaseReducers]: ActionCreatorForCaseReducer<CaseReducers[Type]>;\n};\n\nexport function createPanelStore<\n PanelState = any,\n Reducers extends SliceCaseReducers<PanelState> = SliceCaseReducers<PanelState>,\n>(\n panelType: TPanelType,\n initialState: PanelState,\n reducers: Reducers,\n): [\n () => CaseReducerActions<Reducers>,\n <Selected>(\n panelName: TPanelName,\n selector: (state: PanelState) => Selected,\n comparator?: (a: Selected, b: Selected) => boolean,\n ) => Selected,\n] {\n const useSelector = <Selected>(\n panelName: TPanelName,\n selector: (state: PanelState) => Selected,\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\n ): Selected => {\n const dashboard = useDashboardContext();\n const props = useMemo(\n () => dashboard.getPanelByName(panelName)?.props as TLoadedPanelProps,\n [dashboard, panelName],\n );\n\n const propsRef = useLatest(props);\n\n useEffect(() => {\n panelsStore.dispatch(\n panelsActions.initState({\n panelType,\n panelId: propsRef.current.id,\n initialState,\n }),\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return usePanelSelector<PanelState, Selected>(\n panelType,\n panelName,\n initialState,\n selector,\n comparator,\n );\n };\n\n registerReducers<PanelState>(panelType, reducers);\n\n /**\n * Devuelve un objeto de dispatchers asociados al panel. Este hook puede ser\n * exportado pero es importante comprender su funcionamiento: cuando es usado\n * acepta un segundo parámetro opcional panelName que en caso de no ser\n * pasado, utilizará el del contexto del panel desde el que se ejecuta.\n */\n const usePanelDispatcher = () => {\n const { panelName: contextPanelName } = usePanelIdentity();\n const dispatchers: CaseReducerActions<Reducers> =\n {} as CaseReducerActions<Reducers>;\n const dashboard = useDashboardContext();\n\n Object.entries(reducers).forEach(([name]) => {\n dispatchers[name as keyof typeof dispatchers] = ((\n payload: any,\n panelName?: TPanelName,\n ) => {\n const props = dashboard.getPanelByName(panelName ?? contextPanelName)\n ?.props as TLoadedPanelProps;\n\n panelsStore.dispatch(\n panelsActions.updatePanelStore({\n panelId: props.id,\n panelType,\n data: { payload },\n reducer: name,\n }),\n );\n }) as any;\n });\n\n return dispatchers;\n };\n\n return [usePanelDispatcher, useSelector];\n}\n"],"names":[],"mappings":";;;;;;;;AA0BgB,SAAA,gBAAA,CAId,SACA,EAAA,YAAA,EACA,QAQA,EAAA;AACA,EAAA,MAAM,WAAc,GAAA,CAClB,SACA,EAAA,QAAA,EACA,aAAoD,YACvC,KAAA;AACb,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,IAAA,MAAM,KAAQ,GAAA,OAAA;AAAA,MACZ,MAAM,SAAA,CAAU,cAAe,CAAA,SAAS,CAAG,EAAA,KAAA;AAAA,MAC3C,CAAC,WAAW,SAAS,CAAA;AAAA,KACvB,CAAA;AAEA,IAAM,MAAA,QAAA,GAAW,UAAU,KAAK,CAAA,CAAA;AAEhC,IAAA,SAAA,CAAU,MAAM;AACd,MAAY,WAAA,CAAA,QAAA;AAAA,QACV,cAAc,SAAU,CAAA;AAAA,UACtB,SAAA;AAAA,UACA,OAAA,EAAS,SAAS,OAAQ,CAAA,EAAA;AAAA,UAC1B,YAAA;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KAEF,EAAG,EAAE,CAAA,CAAA;AAEL,IAAO,OAAA,gBAAA;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,gBAAA,CAA6B,WAAW,QAAQ,CAAA,CAAA;AAQhD,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,gBAAiB,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACzD,IAAA,MAAM,cACJ,EAAC,CAAA;AACH,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AAEtC,IAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,CAAM,KAAA;AAC3C,MAAA,WAAA,CAAY,IAAgC,CAAA,GAAK,CAC/C,OAAA,EACA,SACG,KAAA;AACH,QAAA,MAAM,KAAQ,GAAA,SAAA,CAAU,cAAe,CAAA,SAAA,IAAa,gBAAgB,CAChE,EAAA,KAAA,CAAA;AAEJ,QAAY,WAAA,CAAA,QAAA;AAAA,UACV,cAAc,gBAAiB,CAAA;AAAA,YAC7B,SAAS,KAAM,CAAA,EAAA;AAAA,YACf,SAAA;AAAA,YACA,IAAA,EAAM,EAAE,OAAQ,EAAA;AAAA,YAChB,OAAS,EAAA,IAAA;AAAA,WACV,CAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,WAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAO,OAAA,CAAC,oBAAoB,WAAW,CAAA,CAAA;AACzC;;;;"}
|
|
1
|
+
{"version":3,"file":"createPanelStore.js","sources":["../../src/panelsStore/createPanelStore.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { SliceCaseReducers, shallowEqual } from '@apia/store';\r\nimport { useLatest } from '@apia/util';\r\nimport { useEffect, useMemo } from 'react';\r\nimport { TLoadedPanelProps, TPanelName, TPanelType } from '../types';\r\nimport { panelsActions, panelsStore, registerReducers } from './panelsStore';\r\nimport { usePanelSelector } from './usePanelSelector';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useDashboardContext } from '../dashboard';\r\n\r\ndeclare type ActionCreatorForCaseReducer<CR> = CR extends (\r\n state: any,\r\n action: infer Action,\r\n) => any\r\n ? Action extends {\r\n payload: infer P;\r\n }\r\n ? (payload: P, panelName?: string) => unknown\r\n : () => unknown\r\n : () => unknown;\r\n\r\ntype CaseReducerActions<CaseReducers extends SliceCaseReducers<any>> = {\r\n [Type in keyof CaseReducers]: ActionCreatorForCaseReducer<CaseReducers[Type]>;\r\n};\r\n\r\nexport function createPanelStore<\r\n PanelState = any,\r\n Reducers extends SliceCaseReducers<PanelState> = SliceCaseReducers<PanelState>,\r\n>(\r\n panelType: TPanelType,\r\n initialState: PanelState,\r\n reducers: Reducers,\r\n): [\r\n () => CaseReducerActions<Reducers>,\r\n <Selected>(\r\n panelName: TPanelName,\r\n selector: (state: PanelState) => Selected,\r\n comparator?: (a: Selected, b: Selected) => boolean,\r\n ) => Selected,\r\n] {\r\n const useSelector = <Selected>(\r\n panelName: TPanelName,\r\n selector: (state: PanelState) => Selected,\r\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\r\n ): Selected => {\r\n const dashboard = useDashboardContext();\r\n const props = useMemo(\r\n () => dashboard.getPanelByName(panelName)?.props as TLoadedPanelProps,\r\n [dashboard, panelName],\r\n );\r\n\r\n const propsRef = useLatest(props);\r\n\r\n useEffect(() => {\r\n panelsStore.dispatch(\r\n panelsActions.initState({\r\n panelType,\r\n panelId: propsRef.current.id,\r\n initialState,\r\n }),\r\n );\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return usePanelSelector<PanelState, Selected>(\r\n panelType,\r\n panelName,\r\n initialState,\r\n selector,\r\n comparator,\r\n );\r\n };\r\n\r\n registerReducers<PanelState>(panelType, reducers);\r\n\r\n /**\r\n * Devuelve un objeto de dispatchers asociados al panel. Este hook puede ser\r\n * exportado pero es importante comprender su funcionamiento: cuando es usado\r\n * acepta un segundo parámetro opcional panelName que en caso de no ser\r\n * pasado, utilizará el del contexto del panel desde el que se ejecuta.\r\n */\r\n const usePanelDispatcher = () => {\r\n const { panelName: contextPanelName } = usePanelIdentity();\r\n const dispatchers: CaseReducerActions<Reducers> =\r\n {} as CaseReducerActions<Reducers>;\r\n const dashboard = useDashboardContext();\r\n\r\n Object.entries(reducers).forEach(([name]) => {\r\n dispatchers[name as keyof typeof dispatchers] = ((\r\n payload: any,\r\n panelName?: TPanelName,\r\n ) => {\r\n const props = dashboard.getPanelByName(panelName ?? contextPanelName)\r\n ?.props as TLoadedPanelProps;\r\n\r\n panelsStore.dispatch(\r\n panelsActions.updatePanelStore({\r\n panelId: props.id,\r\n panelType,\r\n data: { payload },\r\n reducer: name,\r\n }),\r\n );\r\n }) as any;\r\n });\r\n\r\n return dispatchers;\r\n };\r\n\r\n return [usePanelDispatcher, useSelector];\r\n}\r\n"],"names":[],"mappings":";;;;;;;;AA0BgB,SAAA,gBAAA,CAId,SACA,EAAA,YAAA,EACA,QAQA,EAAA;AACA,EAAA,MAAM,WAAc,GAAA,CAClB,SACA,EAAA,QAAA,EACA,aAAoD,YACvC,KAAA;AACb,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AACtC,IAAA,MAAM,KAAQ,GAAA,OAAA;AAAA,MACZ,MAAM,SAAA,CAAU,cAAe,CAAA,SAAS,CAAG,EAAA,KAAA;AAAA,MAC3C,CAAC,WAAW,SAAS,CAAA;AAAA,KACvB,CAAA;AAEA,IAAM,MAAA,QAAA,GAAW,UAAU,KAAK,CAAA,CAAA;AAEhC,IAAA,SAAA,CAAU,MAAM;AACd,MAAY,WAAA,CAAA,QAAA;AAAA,QACV,cAAc,SAAU,CAAA;AAAA,UACtB,SAAA;AAAA,UACA,OAAA,EAAS,SAAS,OAAQ,CAAA,EAAA;AAAA,UAC1B,YAAA;AAAA,SACD,CAAA;AAAA,OACH,CAAA;AAAA,KAEF,EAAG,EAAE,CAAA,CAAA;AAEL,IAAO,OAAA,gBAAA;AAAA,MACL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA;AAEA,EAAA,gBAAA,CAA6B,WAAW,QAAQ,CAAA,CAAA;AAQhD,EAAA,MAAM,qBAAqB,MAAM;AAC/B,IAAA,MAAM,EAAE,SAAA,EAAW,gBAAiB,EAAA,GAAI,gBAAiB,EAAA,CAAA;AACzD,IAAA,MAAM,cACJ,EAAC,CAAA;AACH,IAAA,MAAM,YAAY,mBAAoB,EAAA,CAAA;AAEtC,IAAA,MAAA,CAAO,QAAQ,QAAQ,CAAA,CAAE,QAAQ,CAAC,CAAC,IAAI,CAAM,KAAA;AAC3C,MAAA,WAAA,CAAY,IAAgC,CAAA,GAAK,CAC/C,OAAA,EACA,SACG,KAAA;AACH,QAAA,MAAM,KAAQ,GAAA,SAAA,CAAU,cAAe,CAAA,SAAA,IAAa,gBAAgB,CAChE,EAAA,KAAA,CAAA;AAEJ,QAAY,WAAA,CAAA,QAAA;AAAA,UACV,cAAc,gBAAiB,CAAA;AAAA,YAC7B,SAAS,KAAM,CAAA,EAAA;AAAA,YACf,SAAA;AAAA,YACA,IAAA,EAAM,EAAE,OAAQ,EAAA;AAAA,YAChB,OAAS,EAAA,IAAA;AAAA,WACV,CAAA;AAAA,SACH,CAAA;AAAA,OACF,CAAA;AAAA,KACD,CAAA,CAAA;AAED,IAAO,OAAA,WAAA,CAAA;AAAA,GACT,CAAA;AAEA,EAAO,OAAA,CAAC,oBAAoB,WAAW,CAAA,CAAA;AACzC;;;;"}
|