@apia/dashboard-controller 4.0.43 → 4.0.45

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/index.js CHANGED
@@ -767,7 +767,8 @@ function importContainer(path) {
767
767
  `/containers/${path}`
768
768
  ).then((result) => {
769
769
  resolve(result.default);
770
- }).catch(() => {
770
+ }).catch((e) => {
771
+ console.error(e);
771
772
  resolve({
772
773
  default: ContainerNotFound
773
774
  });
@@ -789,7 +790,8 @@ function importPanel(path) {
789
790
  (result) => {
790
791
  resolve(result.default);
791
792
  }
792
- ).catch(() => {
793
+ ).catch((e) => {
794
+ console.error(e);
793
795
  resolve({
794
796
  default: PanelNotFound
795
797
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/splash/panels/PanelIdentifier.tsx","../src/common/usePanelIdentity.ts","../src/position/usePanelPosition.ts","../src/dashboard/DashboardPanelContext.tsx","../src/actions/usePanelActions.ts","../src/actions/usePanelNetworkState.ts","../src/eventsController/eventsController.ts","../src/eventsController/usePanelFireEvent.ts","../src/eventsController/usePanelOnEvent.ts","../src/panelsUtil/usePanelChangeTitle.ts","../src/splash/panels/PanelContext/usePanelFooter.tsx","../src/config/parametersStore.ts","../src/config/saveParameters.ts","../src/dashboard/DashboardContext.tsx","../src/splash/panels/DefaultPanelWrapper/RefreshButton.tsx","../src/config/usePanelConfig.ts","../src/splash/panels/DefaultPanelWrapper/SettingsButton.tsx","../src/splash/panels/DefaultPanelWrapper/PanelButtons.tsx","../src/splash/panels/PanelContext/usePanelContextLayout.ts","../src/splash/panels/PanelContext/useYieldPanelIsReady.ts","../src/splash/panels/PanelContext/index.tsx","../src/splash/panels/PanelContext/PanelFooter.tsx","../src/splash/panels/DefaultPanelWrapper/index.tsx","../src/dashboard/DashboardPanelsBootstraper.tsx","../src/dashboard/PanelNotFound.tsx","../src/dashboard/ContainerNotFound.tsx","../src/util.ts","../src/splash/panels/PanelErrorBoundary.tsx","../src/dashboard/DashboardPanel.tsx","../src/splash/events/Dragleave.ts","../src/splash/util/isCursorInArea.ts","../src/splash/util/getColumnAreas.ts","../src/splash/events/Dragover.ts","../src/splash/events/Dragstart.ts","../src/splash/events/Drop.ts","../src/splash/util/DragAndDrop.ts","../src/dashboard/DashboardRouter.tsx","../src/dashboard/dashboard.tsx","../src/config/usePanelParametersSelector.ts","../src/panelsUtil/usePanelTitleAction.ts","../src/actions/firePanelAction.ts","../src/actions/basicAction.ts","../src/actions/externalFirePanelAction.ts","../src/actions/usePanelIsLoading.ts","../src/actions/useActionEventHandlers.ts","../src/splash/panels/DefaultPanelWrapper/NetworkState.tsx","../src/splash/panels/LandingPagePanelWrapper.tsx","../src/splash/panels/EmptyPanelWrapper/index.tsx","../src/panelsStore/panelsStore.ts","../src/panelsStore/usePanelSelector.ts","../src/panelsStore/createPanelStore.ts"],"sourcesContent":["import { ReactNode, createContext, useMemo } from 'react';\r\nimport { TPanelIdentifier } from '../../eventsController/types';\r\n\r\nexport const PanelIdentifierContext = createContext<\r\n TPanelIdentifier | undefined\r\n>(undefined);\r\n\r\nexport interface TPanelIdentifierProps {\r\n children: ReactNode;\r\n id: string;\r\n name: string;\r\n title: string;\r\n type: string;\r\n}\r\n\r\nexport const PanelIdentifier = ({\r\n children,\r\n name,\r\n id,\r\n title,\r\n type,\r\n}: TPanelIdentifierProps) => {\r\n const contextValue: TPanelIdentifier = useMemo(() => {\r\n return { panelName: name, panelId: id, panelTitle: title, panelType: type };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <PanelIdentifierContext.Provider value={contextValue}>\r\n {children}\r\n </PanelIdentifierContext.Provider>\r\n );\r\n};\r\n","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","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { EventEmitter, TId } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useEffect, useState } from 'react';\r\n\r\nclass PanelPositionEmitter extends EventEmitter<{\r\n panelUpdate: {\r\n panelId: TId;\r\n containerId: TId;\r\n newPosition: number;\r\n };\r\n}> {}\r\n\r\nexport const panelPositionEmitter = new PanelPositionEmitter();\r\n\r\n/**\r\n * Permite conocer la posición del panel, se actualiza automáticamente cuando\r\n * ésta cambia provocando un renderizado en el padre\r\n */\r\nexport function usePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n\r\n const [position, setPosition] = useState<{\r\n containerId: TId;\r\n position: number;\r\n }>();\r\n\r\n useEffect(() => {\r\n return panelPositionEmitter.on('panelUpdate', (ev) => {\r\n if (ev.panelId === panelId)\r\n setPosition({ containerId: ev.containerId, position: ev.newPosition });\r\n });\r\n }, [panelId]);\r\n\r\n return position;\r\n}\r\n\r\nexport async function updatePanelPosition(\r\n panelId: TId,\r\n containerId: TId,\r\n newPosition: number,\r\n) {\r\n const result = await ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelMove',\r\n pnlId: panelId,\r\n containerId,\r\n newPosition,\r\n }),\r\n );\r\n\r\n const hasUpdated = result?.data && !result.hasError && !result.hasMessages;\r\n\r\n if (hasUpdated)\r\n panelPositionEmitter.emit('panelUpdate', {\r\n panelId,\r\n containerId,\r\n newPosition,\r\n });\r\n\r\n return hasUpdated;\r\n}\r\n\r\nexport function useUpdatePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n return async function updatePosition(containerId: TId, newPosition: number) {\r\n return updatePanelPosition(panelId, containerId, newPosition);\r\n };\r\n}\r\n","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","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 & { force?: boolean };\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","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","/* 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","/* 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","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","import { useCallback } from 'react';\r\nimport {\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelFireEvent,\r\n} from '../eventsController';\r\n\r\nexport function changePanelTitle(\r\n identifier: TPanelIdentifier,\r\n newTitle: string,\r\n) {\r\n eventsController.fireEvent(identifier, '__changePanelTitle__', newTitle);\r\n}\r\n\r\nexport function usePanelChangeTitle() {\r\n const fireEvent = usePanelFireEvent();\r\n\r\n return useCallback(\r\n (newTitle: string) => {\r\n fireEvent('__changePanelTitle__', newTitle);\r\n },\r\n [fireEvent],\r\n );\r\n}\r\n","import {\r\n KeyboardEvent,\r\n MouseEvent,\r\n ReactNode,\r\n useCallback,\r\n useState,\r\n} from 'react';\r\nimport {\r\n TPanelEvent,\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelOnEvent,\r\n} from '../../../eventsController';\r\nimport { TFooter } from '../../../actions/usePanelActions';\r\nimport { handleAction } from '../../../actions/basicAction';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport function changePanelFooter(panelId: string, footer: TFooter | null) {\r\n eventsController.fireEvent(\r\n { panelId } as TPanelIdentifier,\r\n 'changeFooter',\r\n footer,\r\n );\r\n}\r\n\r\nexport type TUsePanelFooter = {\r\n footerContent?: ReactNode;\r\n footer: TFooter | null;\r\n handleFooterClick: (ev: MouseEvent | KeyboardEvent) => void;\r\n};\r\n\r\nexport function usePanelFooter({\r\n initialData,\r\n}: {\r\n initialData: unknown;\r\n}): TUsePanelFooter {\r\n const identifier = usePanelIdentity();\r\n\r\n const [footer, setFooter] = useState<TFooter | null>(\r\n (initialData as { footer: { footer: TFooter } })?.footer?.footer?.text ||\r\n (initialData as { footer: { footer: TFooter } })?.footer?.footer?.force\r\n ? (initialData as { footer: { footer: TFooter } })?.footer?.footer\r\n : null,\r\n );\r\n\r\n const handleFooterClick = useCallback(\r\n (ev: MouseEvent | KeyboardEvent) => {\r\n if (footer) handleAction(identifier, ev, footer);\r\n },\r\n [footer, identifier],\r\n );\r\n\r\n usePanelOnEvent(\r\n { eventType: 'changeFooter', panelId: identifier.panelId },\r\n (ev: TPanelEvent<TFooter>) => {\r\n if (!ev.payload.text && !ev.payload.force) setFooter(null);\r\n else setFooter(ev.payload);\r\n },\r\n );\r\n\r\n return { footer, handleFooterClick };\r\n}\r\n","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","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","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","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelActions, usePanelIsLoading } from '../../../actions';\r\n\r\nexport const RefreshButton = (props: {\r\n refreshOnStart: boolean;\r\n refreshOnHome: boolean;\r\n title: string;\r\n}) => {\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n\r\n const isLoading = usePanelIsLoading();\r\n const dispatch = usePanelActions();\r\n\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n return (\r\n <IconButton\r\n icon=\"Refresh\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n size=\"Md\"\r\n onClick={useCallback(() => {\r\n void dispatch({ action: 'refresh' });\r\n }, [dispatch])}\r\n title={getLabel('lblRefreshPnl', { text: { TOK1: props.title } }).text}\r\n isLoading={isLoading}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","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","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelConfig } from '../../../config/usePanelConfig';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { panelButtonsActions } from './PanelButtons';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport const SettingsButton = (props: { title: string }) => {\r\n const { panelId } = usePanelIdentity();\r\n const configure = usePanelConfig();\r\n\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n usePanelActions({\r\n refresh() {\r\n panelButtonsActions(panelId, 'disable', false);\r\n },\r\n });\r\n\r\n const openSettings = useCallback(() => {\r\n try {\r\n configure();\r\n } catch (e) {}\r\n }, [configure]);\r\n\r\n return (\r\n <IconButton\r\n icon=\"Settings\"\r\n size=\"Md\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n onClick={openSettings}\r\n title={getLabel('lblOpenPnlConf', { text: { TOK1: props.title } }).text}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","import { makeImperativeComponent } from '@apia/util';\r\nimport { RefreshButton } from './RefreshButton';\r\nimport { SettingsButton } from './SettingsButton';\r\nimport { TPanelProps } from '../../../types';\r\n\r\nexport const [, panelButtonsActions, PanelButtons] = makeImperativeComponent<\r\n Omit<TPanelProps, 'initialData' | 'children'>,\r\n {\r\n disable: boolean;\r\n }\r\n>()({\r\n Component: (props) => {\r\n return (\r\n <>\r\n {props.isRefreshable && (\r\n <>\r\n <RefreshButton {...props} />\r\n </>\r\n )}\r\n {props.isConfigurable && <SettingsButton title={props.title} />}\r\n </>\r\n );\r\n },\r\n});\r\n","import { spacingLayouts, TSpacingLayout } from '@apia/theme';\r\nimport { useCallback, useRef } from 'react';\r\n\r\nexport type TPanelLayout = TSpacingLayout;\r\n\r\nexport function usePanelContextLayout() {\r\n const elRef = useRef<HTMLDivElement | null>(null);\r\n const layoutRef = useRef<TPanelLayout>('clever');\r\n\r\n const clearClassNames = useCallback(() => {\r\n spacingLayouts.forEach((current) =>\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.remove(current),\r\n );\r\n }, []);\r\n\r\n const setRef = useCallback(\r\n (el: HTMLDivElement) => {\r\n if (el instanceof HTMLDivElement) {\r\n elRef.current = el;\r\n clearClassNames();\r\n (el?.querySelector('.panel__content') as HTMLElement).classList.add(\r\n layoutRef.current,\r\n );\r\n }\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n const setLayout = useCallback(\r\n (layout: TPanelLayout) => {\r\n if (layoutRef.current === layout) return;\r\n\r\n layoutRef.current = layout;\r\n clearClassNames();\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.add(layoutRef.current);\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n return { ref: setRef, setLayout };\r\n}\r\n","import { useMount } from '@apia/util';\r\nimport { usePanelContext } from '.';\r\n\r\n/**\r\n * **Favor de leer con cuidado el siguiente contenido, es muy importante para\r\n * la performance**\r\n *\r\n * El hook useYieldPanelIsReady es una parte muy importante del flujo de\r\n * trabajo de los dashboards. **El no reportar la carga de un panel tiene\r\n * penalizaciones graves en el tiempo de renderizado inicial**, esto es porque\r\n * el dashboard espera que todos los paneles hayan terminado la carga\r\n * estructural básica antes de empezar con los refresh iniciales, y esto termina\r\n * impactando en el tiempo que demora en bajar la cortina.\r\n *\r\n * **Aclaración:** Actualmente se espera las cargas estructurales para lanzar\r\n * los refresh iniciales por motivos de arquitectura. Esa restricción será\r\n * eliminada probablemente en el corto plazo, pero eso no cambia la necesidad de\r\n * reportar las estructuras ya que esta información es igualmente utilizada para\r\n * el bajado de la cortina de Skeletons.\r\n *\r\n * Por ejemplo, si todos los paneles están optimizados para lograr cargas\r\n * iniciales rápidas pero el logo de la aplicación no reporta que su estructura\r\n * está pronta, el dashboard va a bajar su cortina solamente luego de que expire\r\n * el timeout **DASH_COURTAIN_TRESHOLD**, que por defecto viene establecido en 5\r\n * segundos.\r\n *\r\n * Esto significa que aún cuando la cortina se hubiera podido bajar quizás a\r\n * los pocos ms de cargado el html inicial, no lo hará porque supone que el\r\n * panel Logo aún no terminó su carga estructural.\r\n *\r\n * Siempre que un panel esté presente en un dashboard, deberá reportar cuando\r\n * la carga estructural esté pronta. Esto puede ser hecho de dos formas:\r\n *\r\n * - Usando { setRef } = usePanelContext(): En el elemento crucial de HTML del\r\n * elemento hacer ref={setRef}. Esta es la forma más óptima ya que nos garantiza\r\n * que el panel se reporte cuando su estructura HTML ya esté disponible,\r\n * evitando ninguna demora.\r\n *\r\n * - Usando useYieldPanelIsReady(): Este hook es una alternativa disponible\r\n * para las situaciones en las que no tenemos ningún elemento HTML de\r\n * importancia o cuando ese elemento no está disponible hasta después de la\r\n * carga inicial. Al usar este hook el panel se reportará automáticamente una\r\n * vez que haya hecho el renderizado inicial.\r\n */\r\nexport function useYieldPanelIsReady() {\r\n const { setRef } = usePanelContext();\r\n\r\n useMount(() => {\r\n setRef({} as HTMLElement);\r\n });\r\n}\r\n","import {\r\n ReactNode,\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { changePanelTitle } from '../../../panelsUtil';\r\nimport { TPanelEvent, usePanelOnEvent } from '../../../eventsController';\r\nimport { TPanelLayout, usePanelContextLayout } from './usePanelContextLayout';\r\nimport { usePanelFooter } from './usePanelFooter';\r\nimport { TPanelProps } from '../../../types';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { useYieldPanelIsReady } from './useYieldPanelIsReady';\r\nimport { useDashboardContext } from '../../../dashboard/DashboardContext';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport const PanelContext = createContext<TPanelContext | null>(null);\r\nexport { useYieldPanelIsReady };\r\n\r\nexport type TPanelContext = {\r\n /**\r\n * Permite establecer contenido arbitrario en el footer del panel.\r\n */\r\n setFooterContent(content: ReactNode): void;\r\n /**\r\n * setLayout es una función que permite decidir en qué formato se muestran\r\n * los contenidos del panel.\r\n *\r\n * dense: No hay paddings\r\n * clever: Hay paddings grandes\r\n */\r\n setLayout: (newLayout: TPanelLayout) => void;\r\n setTitle: (newTitle: string) => void;\r\n panelProps: Omit<TPanelProps, 'children'>;\r\n /**\r\n * Cuando un panel renderiza sus hijos en pantalla, debe setear el ref de\r\n * modo que se pueda continuar con el flujo normal del panel. Este ref puede\r\n * estar en cualquier nivel, cuando sea instanciado, se llamará al refresh\r\n * inicial.\r\n */\r\n setRef: (el: HTMLElement | null) => void;\r\n};\r\n\r\nexport function usePanelContext() {\r\n const context = useContext(PanelContext);\r\n if (!context) throw new Error('No panel wrapper context defined');\r\n return context;\r\n}\r\nexport const PanelContextProvider = ({\r\n children,\r\n value,\r\n}: {\r\n children: ReactNode;\r\n value: TPanelContext;\r\n}) => {\r\n return (\r\n <PanelContext.Provider value={value}>{children}</PanelContext.Provider>\r\n );\r\n};\r\n\r\nexport function useMakePanelContext(panelProps: Omit<TPanelProps, 'children'>) {\r\n const identifier = usePanelIdentity();\r\n\r\n const setTitle = useCallback(\r\n (newTitle: string) => {\r\n changePanelTitle(identifier, newTitle);\r\n },\r\n [identifier],\r\n );\r\n\r\n const { ref, setLayout } = usePanelContextLayout();\r\n\r\n const [title, setTitleState] = useState(panelProps.title);\r\n usePanelOnEvent(\r\n { eventType: 'changeTitle', panelId: identifier.panelId },\r\n (ev: TPanelEvent<string>) => {\r\n setTitleState(ev.payload);\r\n },\r\n );\r\n const { footer, handleFooterClick } = usePanelFooter(panelProps);\r\n\r\n const [footerContent, setFooterContent] = useState<ReactNode>(null);\r\n\r\n const dispatch = usePanelActions();\r\n const hasRefreshedOnStartup = useRef(false);\r\n const dashboard = useDashboardContext();\r\n\r\n const setRef = useCallback(\r\n (el: HTMLElement | null) => {\r\n if (el && !hasRefreshedOnStartup.current) {\r\n hasRefreshedOnStartup.current = true;\r\n if (panelProps.refreshOnStart) {\r\n void dispatch({ action: 'refresh' }).then(() => {\r\n dashboard.bootstrapper.setPanelHasLoaded(identifier.panelId);\r\n });\r\n } else {\r\n dashboard.bootstrapper.setPanelHasLoaded(identifier.panelId);\r\n }\r\n }\r\n },\r\n [\r\n dashboard.bootstrapper,\r\n dispatch,\r\n identifier.panelId,\r\n panelProps.refreshOnStart,\r\n ],\r\n );\r\n\r\n const contextValue = useMemo<TPanelContext>(\r\n () => ({ setFooterContent, setTitle, setLayout, panelProps, setRef }),\r\n [setTitle, setLayout, panelProps, setRef],\r\n );\r\n\r\n return { footerContent, title, footer, handleFooterClick, contextValue, ref };\r\n}\r\n","import { useState } from 'react';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { TUsePanelFooter } from './usePanelFooter';\r\nimport { AutoEllipsis, SimpleButton } from '@apia/components';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const PanelFooter = ({\r\n footerContent,\r\n isRefreshable,\r\n footer,\r\n handleFooterClick,\r\n force,\r\n}: TUsePanelFooter & { isRefreshable: boolean; force?: boolean }) => {\r\n const [lastUpdate, setLastUpdate] = useState<number>(0);\r\n\r\n usePanelActions({\r\n refresh() {\r\n setLastUpdate(Date.now());\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n {(isRefreshable || footer || force) && (\r\n <div className=\"panel__footer\">\r\n {footerContent ??\r\n (footer &&\r\n (!footer.action || footer.actionBehavior === 'DO_NOTHING') && (\r\n <div className=\"panel__footer__text\">\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </div>\r\n ))}\r\n {footer?.action && footer.actionBehavior !== 'DO_NOTHING' && (\r\n <SimpleButton\r\n onClick={handleFooterClick}\r\n onDoubleClick={handleFooterClick}\r\n variant=\"link\"\r\n className=\"panel__footer__text\"\r\n >\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </SimpleButton>\r\n )}\r\n {!footer && <div></div>}\r\n {lastUpdate > 0 && (\r\n <Box className=\"lastUpdate__wrapper\">\r\n {new Date(lastUpdate).toLocaleDateString()}{' '}\r\n {new Date(lastUpdate).toLocaleTimeString()}\r\n </Box>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n","import { Box, getVariant } from '@apia/theme';\r\nimport { PanelContainer } from '../../../types';\r\nimport { usePanelIdentity } from '../../../common';\r\nimport { NetworkState } from './NetworkState';\r\nimport { PanelButtons } from './PanelButtons';\r\nimport { usePanelIsLoading } from '../../../actions';\r\nimport { PanelContextProvider, useMakePanelContext } from '../PanelContext';\r\nimport { PanelFooter } from '../PanelContext/PanelFooter';\r\nimport {\r\n usePanelImage,\r\n usePanelTitleDescription,\r\n} from '../../../panelsUtil/usePanelTitleAction';\r\nimport { AutoEllipsis } from '@apia/components';\r\n\r\nexport const DefaultPanelWrapper: PanelContainer = ({ children, ...props }) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } =\r\n useMakePanelContext(props);\r\n\r\n const panelTitleDescription = usePanelTitleDescription();\r\n const panelImage = usePanelImage() ?? props.image;\r\n\r\n const showHeader =\r\n props.showTitle ||\r\n props.isConfigurable ||\r\n props.isRefreshable ||\r\n panelImage;\r\n\r\n const isLoading = usePanelIsLoading();\r\n return (\r\n <Box {...getVariant('layout.common.dashboards.panel')}>\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n ref={ref}\r\n className={`panel__container ${isLoading ? 'isLoading' : ''}`}\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n >\r\n {showHeader && (\r\n <div\r\n draggable={props.canMove}\r\n className={`panel__header ${props.canMove ? 'drag_panel_container' : ''}`}\r\n >\r\n <div\r\n className=\"panel__header__left\"\r\n sx={{\r\n maxWidth: '80%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {panelImage && !panelImage.match('(^.+null$)') && (\r\n <img src={panelImage} className=\"panel__icon\" />\r\n )}\r\n <AutoEllipsis>\r\n {props.showTitle && (\r\n <span\r\n className=\"panel__title\"\r\n title={panelTitleDescription ?? title}\r\n >\r\n {title}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </AutoEllipsis>\r\n </div>\r\n\r\n <div className={`panel__header__buttons`}>\r\n <PanelButtons {...props} id={panelId} />\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={props.isRefreshable} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n </Box>\r\n );\r\n};\r\n","/* 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","import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useYieldPanelIsReady } from '../splash/panels/PanelContext';\r\n\r\nexport const PanelNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n useYieldPanelIsReady();\r\n\r\n return (\r\n <>\r\n <Heading>Panel not found: {props.panelType}</Heading>\r\n </>\r\n );\r\n};\r\n","import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const ContainerNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n return <Heading>Container not found for panel: {props.panelName}</Heading>;\r\n};\r\n","import { ComponentType, lazy } from 'react';\r\nimport { PanelNotFound } from './dashboard/PanelNotFound';\r\nimport { PanelContainer } from './types';\r\nimport { ContainerNotFound } from './dashboard/ContainerNotFound';\r\n\r\nconst importedContainers: Record<string, PanelContainer> = {};\r\nconst importedPanels: Record<\r\n string,\r\n ComponentType<{ initialData: unknown }>\r\n> = {};\r\n\r\nexport function importContainer(path: string): PanelContainer {\r\n if (!importedContainers[path])\r\n importedContainers[path] = lazy<PanelContainer>(() => {\r\n return new Promise<{\r\n default: PanelContainer;\r\n }>((resolve) => {\r\n import(\r\n /* webpackChunkName: \"[request]\" */\r\n /* webpackInclude: /\\.tsx?$/ */\r\n /* webpackPreload: true */\r\n `/containers/${path}`\r\n )\r\n .then((result: { default: { default: PanelContainer } }) => {\r\n resolve(result.default);\r\n })\r\n .catch(() => {\r\n resolve({\r\n default: ContainerNotFound,\r\n });\r\n });\r\n });\r\n });\r\n\r\n return importedContainers[path];\r\n}\r\n\r\nexport function importPanel(path: string) {\r\n if (!importedPanels[path])\r\n importedPanels[path] = lazy<ComponentType<{ initialData: unknown }>>(() => {\r\n return new Promise<{\r\n default: ComponentType<{ initialData: unknown }>;\r\n }>((resolve) => {\r\n import(\r\n /* webpackChunkName: \"[request]\" */\r\n /* webpackInclude: /\\.tsx?$/ */\r\n /* webpackPreload: true */\r\n `/panels/${path}`\r\n )\r\n .then(\r\n (result: {\r\n default: { default: ComponentType<{ initialData: unknown }> };\r\n }) => {\r\n resolve(result.default);\r\n },\r\n )\r\n .catch(() => {\r\n resolve({\r\n default: PanelNotFound,\r\n });\r\n });\r\n });\r\n });\r\n\r\n return importedPanels[path];\r\n}\r\n","import { makeStyledComponent } from '@apia/theme';\r\nimport { Component, ReactNode } from 'react';\r\nimport { Box, Heading, Paragraph } from '@apia/theme';\r\n\r\nconst Error = makeStyledComponent(\r\n 'Error',\r\n 'layout.panels.error',\r\n {\r\n '.panelError__wrapper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 3,\r\n\r\n h3: {\r\n color: 'palette.error.main',\r\n },\r\n },\r\n },\r\n ({ error }: { error: string }) => {\r\n return (\r\n <Box className=\"panelError__wrapper\">\r\n <Heading as=\"h3\">Oops! Something went wrong</Heading>\r\n <Heading as=\"h4\">Error:</Heading>\r\n <Paragraph>{error}</Paragraph>\r\n </Box>\r\n );\r\n },\r\n);\r\n\r\nexport class PanelErrorBoundary extends Component<\r\n { children: ReactNode },\r\n { hasError: boolean; errorMessage: string }\r\n> {\r\n state: Readonly<{ hasError: boolean; errorMessage: string }> = {\r\n hasError: false,\r\n errorMessage: '',\r\n };\r\n\r\n static getDerivedStateFromError(error: unknown) {\r\n if (!(error instanceof Promise))\r\n return { hasError: true, errorMessage: String(error) };\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return <Error error={this.state.errorMessage} />;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","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() 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 panelContent = this.getContainer();\r\n const xml = panelContent.innerHTML\r\n .replaceAll('&lt;', '<')\r\n .replaceAll('&gt;', '>')\r\n .replaceAll('&amp;', '&');\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 canMove: toBoolean(panelData.getAttribute('canMove')),\r\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\r\n image: panelData.getAttribute('imagePath') as string,\r\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\r\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\r\n name: panelData.getAttribute('name') as string,\r\n refreshOnHome: toBoolean(panelData.getAttribute('refreshOnHome')),\r\n refreshOnStart: toBoolean(panelData.getAttribute('refreshOnStart')),\r\n showTitle: toBoolean(panelData.getAttribute('showTitle')),\r\n title: panelData.getAttribute('title') as string,\r\n type: panel.dataset.panel as string,\r\n };\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} />\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","import { isChild } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragleave(_ev: Event, DragAndDrop: DragAndDrop) {\r\n const ev = _ev as DragEvent;\r\n\r\n if (\r\n ev.relatedTarget === null ||\r\n isChild(ev.relatedTarget as HTMLElement, (current) => {\r\n return (\r\n current.parentElement === null &&\r\n current === document.getRootNode() &&\r\n current.dataset.splash === undefined\r\n );\r\n })\r\n ) {\r\n const shadows = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n shadows.forEach((el) => el.remove());\r\n DragAndDrop.draggingPanel?.setAttribute('style', '');\r\n }\r\n}\r\n","import { TPanelZoneCoordinates } from '../types';\r\n\r\nexport const isCursorInArea = ({\r\n top,\r\n bottom,\r\n left,\r\n right,\r\n cursorX,\r\n cursorY,\r\n}: TPanelZoneCoordinates) => {\r\n return (\r\n top <= cursorY && cursorY <= bottom && left <= cursorX && cursorX <= right\r\n );\r\n};\r\n","import { TPanelData } from '../types';\r\n\r\nexport const getColumnAreas = (specificPanel: TPanelData) => {\r\n return {\r\n top: {\r\n top: specificPanel.panelTop,\r\n bottom: specificPanel.panelTop + specificPanel.panelHeight / 2,\r\n left: specificPanel.panelLeft,\r\n right: specificPanel.panelRight,\r\n },\r\n bottom: {\r\n top: specificPanel.panelBottom - specificPanel.panelHeight / 2,\r\n bottom: specificPanel.panelBottom,\r\n right: specificPanel.panelRight,\r\n left: specificPanel.panelLeft,\r\n },\r\n };\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { isCursorInArea } from '../util/isCursorInArea';\r\nimport { getColumnAreas } from '../util/getColumnAreas';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragover(event: Event, DragAndDrop: DragAndDrop) {\r\n const ev = event as DragEvent;\r\n ev.preventDefault();\r\n\r\n DragAndDrop.timeout = -1;\r\n if (\r\n (ev.clientX !== DragAndDrop.dragoverPosition.x ||\r\n ev.clientY !== DragAndDrop.dragoverPosition.y) &&\r\n DragAndDrop.draggingPanelId !== '' &&\r\n DragAndDrop.shadowDiv\r\n ) {\r\n DragAndDrop.clearTimeout();\r\n DragAndDrop.currentBottomPanel = DragAndDrop.findBottomPanel(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n DragAndDrop.dragoverPosition.x = ev.clientX;\r\n DragAndDrop.dragoverPosition.y = ev.clientY;\r\n\r\n const snapshotSection = DragAndDrop.findBottomSection(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n if (\r\n DragAndDrop.shadowDivData &&\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n bottom: DragAndDrop.shadowDivData?.panelBottom,\r\n top: DragAndDrop.shadowDivData?.panelTop,\r\n left: DragAndDrop.shadowDivData?.panelLeft,\r\n right: DragAndDrop.shadowDivData?.panelRight,\r\n })\r\n ) {\r\n return;\r\n }\r\n\r\n if (DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n\r\n if (bottomSection) {\r\n if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).top,\r\n })\r\n ) {\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none; height: 0;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceBefore(\r\n bottomPanel,\r\n DragAndDrop.shadowDiv,\r\n bottomSection as HTMLElement,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n } else if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).bottom,\r\n })\r\n ) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAfter(DragAndDrop.shadowDiv, bottomPanel);\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n }\r\n } else if (!DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAppend(\r\n bottomSection as HTMLElement,\r\n DragAndDrop.shadowDiv,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragstart(\r\n ev: DragEvent,\r\n el: Element,\r\n DragAndDrop: DragAndDrop,\r\n) {\r\n if (!(el instanceof HTMLElement)) return;\r\n DragAndDrop.drawMinimap();\r\n DragAndDrop.sectionData = [];\r\n\r\n const targetPanel = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.id && !!current.dataset?.panel,\r\n );\r\n\r\n ev?.dataTransfer?.setData('text', targetPanel?.dataset.id as string);\r\n if (targetPanel) {\r\n DragAndDrop.placeholderImage = targetPanel.cloneNode(true) as HTMLElement;\r\n DragAndDrop.placeholderImage.style.position = 'fixed';\r\n DragAndDrop.placeholderImage.style.top = '-10000000.45px';\r\n\r\n const children =\r\n DragAndDrop.placeholderImage.querySelectorAll<HTMLElement>('*');\r\n children.forEach((current) => (current.style.overflow = 'hidden'));\r\n document.body.append(DragAndDrop.placeholderImage);\r\n ev?.dataTransfer?.setDragImage(DragAndDrop.placeholderImage, 0, 0);\r\n }\r\n if (ev.dataTransfer) {\r\n // eslint-disable-next-line no-param-reassign\r\n ev.dataTransfer.effectAllowed = 'move';\r\n }\r\n\r\n setTimeout(() => {\r\n const targetSection = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.locationid,\r\n );\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n const emptySectionsId: string[] = [];\r\n\r\n sections?.forEach((sec) => {\r\n if (sec.children.length === 0) {\r\n emptySectionsId.push((sec as HTMLElement).dataset.locationid ?? '');\r\n }\r\n });\r\n\r\n emptySectionsId.forEach((emptySecId) => {\r\n const section = DragAndDrop.body?.querySelector(\r\n `[data-locationid=\"${emptySecId}\"]`,\r\n );\r\n if (section) {\r\n section.setAttribute('style', 'padding: 10px; border:2px dashed #ccc');\r\n }\r\n });\r\n\r\n DragAndDrop.snapshot();\r\n\r\n if (targetPanel) {\r\n DragAndDrop.draggingPanelSectionId =\r\n targetSection?.dataset.locationid ?? '';\r\n DragAndDrop.draggingPanelId = targetPanel.dataset.id as string;\r\n DragAndDrop.draggingPanel = targetPanel;\r\n }\r\n if (DragAndDrop.draggingPanelId === '') {\r\n return;\r\n }\r\n const falseDiv = targetPanel?.cloneNode(true) as HTMLDivElement;\r\n falseDiv.style.opacity = `50%`;\r\n falseDiv.style.width = `100%`;\r\n falseDiv.style.height = `auto`;\r\n falseDiv.style.backgroundColor = `rgba(0,0,0,0.1)`;\r\n falseDiv.className = 'apia_panel_falseDiv';\r\n DragAndDrop.shadowDiv = falseDiv;\r\n }, 0);\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { updatePanelPosition } from '../../position/usePanelPosition';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function Drop(event: Event, DragAndDrop: DragAndDrop) {\r\n if (DragAndDrop.body) {\r\n const ev = event as DragEvent;\r\n const data = ev?.dataTransfer?.getData('text');\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections.forEach((sec) => {\r\n sec.setAttribute('style', '');\r\n });\r\n\r\n const draggingPanel = DragAndDrop.body.querySelector(\r\n `[data-panel][data-id=\"${DragAndDrop.draggingPanelId}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', '');\r\n }\r\n const falseDiv = document.querySelector('.apia_panel_falseDiv');\r\n\r\n if (data) {\r\n const child = document.querySelector(\r\n `[data-panel][data-id=\"${data}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n sections.forEach((sec) => {\r\n if (sec.children.length === 1) {\r\n sec.setAttribute('style', '');\r\n }\r\n });\r\n if (falseDiv) {\r\n const newSection = getSpecificParent(\r\n falseDiv as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n );\r\n\r\n if (newSection) {\r\n const panelsArray = Array.from(newSection.children);\r\n const childId = (child as HTMLElement).dataset.id;\r\n\r\n if (childId) {\r\n const index = panelsArray\r\n .filter(\r\n (panel) =>\r\n !(\r\n (panel as HTMLElement).dataset.id === childId &&\r\n !(panel as HTMLElement).classList.contains(\r\n 'apia_panel_falseDiv',\r\n )\r\n ),\r\n )\r\n .findIndex(\r\n (panel) =>\r\n (panel as HTMLElement).dataset.id === childId &&\r\n (panel as HTMLElement).classList.contains(\r\n 'apia_panel_falseDiv',\r\n ),\r\n );\r\n\r\n if (typeof index === 'number' && newSection.dataset.locationid) {\r\n void updatePanelPosition(\r\n childId,\r\n newSection.dataset.locationid,\r\n index + 1,\r\n );\r\n }\r\n }\r\n }\r\n falseDiv.replaceWith(child as Node);\r\n }\r\n }\r\n\r\n DragAndDrop.draggingPanelId = '';\r\n DragAndDrop.panelData = [];\r\n DragAndDrop.drawMinimap();\r\n\r\n DragAndDrop.removePlaceholder();\r\n }\r\n}\r\n","import { getSpecificParent } from '@apia/util';\r\nimport { dragleave } from '../events/Dragleave';\r\nimport { dragover } from '../events/Dragover';\r\nimport { dragstart } from '../events/Dragstart';\r\nimport { Drop } from '../events/Drop';\r\nimport { TPanelData, TSectionData } from '../types';\r\n\r\nexport class DragAndDrop {\r\n #unsuscribers: (() => void)[] = [];\r\n\r\n bootstrap = () => {\r\n this.#unsuscribers.forEach((unsuscribe) => unsuscribe());\r\n this.#unsuscribers = [];\r\n\r\n this.body.addEventListener('dragover', this.dragOver);\r\n this.body.addEventListener('drop', this.drop);\r\n this.#unsuscribers.push(() => {\r\n this.body.removeEventListener('dragover', this.dragOver);\r\n this.body.removeEventListener('drop', this.drop);\r\n });\r\n if (this.splash) {\r\n this.splash.addEventListener('dragleave', this.dragLeave);\r\n this.splash.addEventListener('dragenter', this.dragEnter);\r\n this.body.addEventListener('dragenter', this.dragEnter);\r\n this.#unsuscribers.push(() => {\r\n this.splash.removeEventListener('dragleave', this.dragLeave);\r\n this.splash.removeEventListener('dragenter', this.dragEnter);\r\n this.body.removeEventListener('dragenter', this.dragEnter);\r\n });\r\n }\r\n this.panels.map((el) => {\r\n const dragHandler = (ev: DragEvent) => {\r\n if ((ev.target as HTMLElement).closest('.drag_panel_container')) {\r\n this.dragStart(ev, el);\r\n }\r\n };\r\n (el as HTMLElement).addEventListener('dragstart', dragHandler);\r\n this.#unsuscribers.push(() => {\r\n (el as HTMLElement).removeEventListener('dragstart', dragHandler);\r\n });\r\n return el;\r\n });\r\n };\r\n panelData: TPanelData[] = [];\r\n minimap: HTMLElement | null = null;\r\n drawMinimap() {\r\n return;\r\n }\r\n timeout = -1;\r\n sectionData: TSectionData[] = [];\r\n body = document.querySelector('[data-layout]') as HTMLElement;\r\n splash = document.querySelector('[data-splash]') as HTMLElement;\r\n dragoverPosition: {\r\n x: string | number;\r\n y: string | number;\r\n } = { x: 0, y: 0 };\r\n shadowDivData: TPanelData | null = null;\r\n shadowDiv: HTMLDivElement | null = null;\r\n placeholderImage: HTMLElement | null = null;\r\n panels = [\r\n ...document.querySelectorAll('[data-panel][data-id]'),\r\n ] as HTMLElement[];\r\n currentScroll = document.scrollingElement?.scrollTop ?? 0;\r\n draggingPanel: HTMLElement | null = null;\r\n draggingPanelId = '';\r\n draggingPanelSectionId = '';\r\n currentBottomPanel: TPanelData | undefined = undefined;\r\n\r\n updateMinimap = () => {\r\n const frameElement = document.querySelector<HTMLElement>('.windowFrame');\r\n if (frameElement) {\r\n frameElement.style.top = `${\r\n (document.scrollingElement?.scrollTop ?? 0) *\r\n Number(frameElement.dataset.aspect)\r\n }px`;\r\n }\r\n };\r\n removePlaceholder = () => {\r\n this.clearTimeout();\r\n const falseDivs = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n falseDivs.forEach((el) => {\r\n el.remove();\r\n });\r\n\r\n this.placeholderImage?.remove();\r\n this.placeholderImage = null;\r\n };\r\n clearTimeout = () => {\r\n clearTimeout(this.timeout);\r\n };\r\n debounceAppend = (target: HTMLElement, child: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) {\r\n target.appendChild(child);\r\n }\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n target.appendChild(child);\r\n }, 500) as unknown as number;\r\n };\r\n debounceBefore = (reference: Node, child: Node, container: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) container.insertBefore(child, reference);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n container.insertBefore(child, reference);\r\n }, 500) as unknown as number;\r\n };\r\n debounceAfter = (child: Node, reference: Node) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) (reference as HTMLElement).after(child);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n (reference as HTMLElement).after(child);\r\n }, 500) as unknown as number;\r\n };\r\n dragOver = (event: Event) => {\r\n dragover(event, this);\r\n this.updateMinimap();\r\n };\r\n dragStart = (ev: DragEvent, el: Element) => {\r\n dragstart(ev, el, this);\r\n };\r\n dragLeave = (_ev: Event) => {\r\n dragleave(_ev, this);\r\n };\r\n dragEnter = (_ev: Event) => {\r\n _ev.preventDefault();\r\n };\r\n drop = (event: Event) => {\r\n Drop(event, this);\r\n };\r\n snapshot = () => {\r\n this.panelData = [];\r\n const innerPanels = (this.body as HTMLElement).querySelectorAll(\r\n '[data-panel][data-id]',\r\n );\r\n innerPanels.forEach((panel) => {\r\n if (panel.classList.contains('apia_panel_falseDiv')) {\r\n this.shadowDivData = {\r\n id: panel.getAttribute('data-id') ?? '',\r\n isShadow: true,\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n };\r\n }\r\n if (\r\n this.panelData.every((innerPanel) => {\r\n return (\r\n innerPanel.id !== panel.getAttribute('data-id') &&\r\n !panel.classList.contains('apia_panel_falseDiv')\r\n );\r\n })\r\n ) {\r\n this.panelData.push({\r\n isShadow: panel.classList.contains('apia_panel_falseDiv'),\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n id:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.id,\r\n )?.dataset.id ?? 0,\r\n });\r\n }\r\n });\r\n this.sectionData = [];\r\n const sections = this.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections?.forEach((sec) => {\r\n if (\r\n this.sectionData.every(\r\n (innerSection) =>\r\n innerSection.sectionId !== sec.getAttribute('data-locationid'),\r\n )\r\n ) {\r\n this.sectionData.push({\r\n sectionBottom:\r\n sec.getBoundingClientRect().bottom + this.currentScroll,\r\n sectionLeft: sec.getBoundingClientRect().left,\r\n sectionTop: sec.getBoundingClientRect().top + this.currentScroll,\r\n sectionRight: sec.getBoundingClientRect().right,\r\n sectionWidth: sec.getBoundingClientRect().width,\r\n sectionHeight: sec.getBoundingClientRect().height,\r\n sectionId:\r\n getSpecificParent(\r\n sec as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n });\r\n }\r\n });\r\n\r\n this.drawMinimap();\r\n };\r\n findBottomPanel = (x: number, y: number) => {\r\n const bottomPanel = this.panelData.find((panel) => {\r\n return (\r\n panel.panelBottom >= y &&\r\n panel.panelTop <= y &&\r\n panel.panelLeft <= x &&\r\n panel.panelRight >= x\r\n );\r\n });\r\n return bottomPanel;\r\n };\r\n findBottomSection = (x: number, y: number) => {\r\n const bottomSection = this.sectionData.find((sec) => {\r\n return (\r\n sec.sectionBottom >= y &&\r\n sec.sectionTop <= y &&\r\n sec.sectionLeft <= x &&\r\n sec.sectionRight >= x\r\n );\r\n });\r\n return bottomSection;\r\n };\r\n}\r\n","/* 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","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\nimport { importContainer } from '../util';\r\n\r\nexport class Dashboard extends EventEmitter<{\r\n changeScene: string;\r\n}> {\r\n bootstrapper = new DashboardPanelsBootstraper(this);\r\n panels: Record<string, DashboardPanel> | null = null;\r\n 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 let container = this.#PanelContainer;\r\n\r\n const customContainer = current.dataset.panelContainer;\r\n if (customContainer) {\r\n container = importContainer(current.dataset.panelContainer!);\r\n }\r\n\r\n const panel = new DashboardPanel({\r\n dashboard: this,\r\n PanelContainer: container,\r\n id: current.dataset.id as string,\r\n });\r\n\r\n let panelPath = (panel.getParameters().PAR_SPA_PATH as string) || '*';\r\n if (panelPath === '/') panelPath = `/${this.urlContext}`;\r\n if (panelPath !== '*') panel.hide();\r\n else panel.show();\r\n\r\n const paths = panelPath.split(',');\r\n paths.forEach((currentPath) => {\r\n if (!this.scenes[currentPath]) this.scenes[currentPath] = [];\r\n this.scenes[currentPath].push(panel.props.id);\r\n });\r\n\r\n (this.panels as Record<string, DashboardPanel>)[panel.props.id] = panel;\r\n\r\n this.#panelsRenderedPortals.push(panel.portal);\r\n });\r\n\r\n this.#dragAndDrop.bootstrap();\r\n };\r\n\r\n #Context = ({ children }: { children: ReactNode }) => {\r\n return (\r\n <DashboardContext.Provider value={this}>\r\n {children}\r\n </DashboardContext.Provider>\r\n );\r\n };\r\n\r\n #suscribeToEvents = () => {\r\n eventsController.onEvent({ eventType: 'dashboard__focus' }, () => {\r\n Object.values(this.panels ?? {}).forEach((current) => {\r\n if (current.props.refreshOnHome) {\r\n void current.refresh();\r\n }\r\n });\r\n });\r\n };\r\n #usePanelsList = () => {\r\n const [panels, setPanels] = useState<ReactNode>(null);\r\n const deferredPanels = useDeferredValue(panels);\r\n\r\n useMount(() => {\r\n this.loadScene();\r\n setPanels(this.#panelsRenderedPortals);\r\n });\r\n\r\n this.router.useSwitch([\r\n {\r\n route: new RegExp(`(?:/spa)?/(\\\\w+)`),\r\n callback: (result) => {\r\n this.loadScene(result[1]);\r\n },\r\n },\r\n {\r\n route: new RegExp(`/`),\r\n callback: () => {\r\n this.loadScene('/');\r\n },\r\n },\r\n ]);\r\n\r\n return deferredPanels;\r\n };\r\n\r\n constructor(\r\n panelsContainer: PanelContainer = DefaultPanelWrapper,\r\n public urlContext: string,\r\n ) {\r\n super();\r\n\r\n this.#currentScene = `/`;\r\n this.#PanelContainer = panelsContainer ?? this.#PanelContainer;\r\n this.#suscribeToEvents();\r\n }\r\n\r\n #SceneRenderer = () => {\r\n const Context = this.#Context;\r\n const panels = this.#usePanelsList();\r\n\r\n return <Context>{panels}</Context>;\r\n };\r\n\r\n loadScene = (scene: string = this.#currentScene): ReactPortal[] => {\r\n let actualScene = scene;\r\n if (!actualScene.startsWith('/')) actualScene = `/${actualScene}`;\r\n\r\n if (!this.panels) this.#loadPanels();\r\n if (!this.scenes[actualScene]) this.scenes[actualScene] = [];\r\n\r\n this.scenes[this.#currentScene].forEach((scenePanelId) => {\r\n if (!this.scenes[actualScene].includes(scenePanelId))\r\n this.panels?.[scenePanelId]?.hide();\r\n });\r\n this.scenes[actualScene].forEach((scenePanelIds) => {\r\n const panel = this.panels?.[scenePanelIds];\r\n if (panel) {\r\n panel.show();\r\n if (panel.hasInited && panel.props.refreshOnStart) void panel.refresh();\r\n }\r\n });\r\n\r\n this.#currentScene = actualScene;\r\n\r\n return this.#panelsRenderedPortals;\r\n };\r\n\r\n Component = () => {\r\n const R = this.#SceneRenderer;\r\n return <R />;\r\n };\r\n}\r\n","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","import { parametersStore, usePanelParametersSelector } from '../config';\r\nimport { parametersActions } from '../config/parametersStore';\r\n\r\nconst panelActionParameterName = '__panelTitleAction';\r\nconst panelImageParameterName = '__panelImageAction';\r\nconst panelDescriptionParameterName = '__panelTitleDescription';\r\n\r\nexport function setPanelTitleAction(panelId: string, newAction: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelActionParameterName]: newAction },\r\n }),\r\n );\r\n}\r\nexport function setPanelTitleDescritpion(\r\n panelId: string,\r\n newDescription: string,\r\n) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelDescriptionParameterName]: newDescription },\r\n }),\r\n );\r\n}\r\nexport function setPanelImageAction(panelId: string, newImage: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelImageParameterName]: newImage },\r\n }),\r\n );\r\n}\r\n\r\nexport function usePanelTitleAction() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelActionParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelImage() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelImageParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelTitleDescription() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelDescriptionParameterName] as string,\r\n );\r\n}\r\n","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 setPanelImageAction,\r\n setPanelTitleAction,\r\n setPanelTitleDescritpion,\r\n} from '../panelsUtil/usePanelTitleAction';\r\nimport { startTransition } from 'react';\r\nimport { TPanelIdentifier } from '../eventsController';\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 } as TPanelIdentifier,\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\r\n setPanelImageAction(panelId, (result?.data?.image as string) ?? '');\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","import { ApiaApi } from '@apia/api';\r\nimport { KeyboardEvent, MouseEvent } from 'react';\r\nimport { firePanelAction } from './firePanelAction';\r\nimport { eventsController, TPanelIdentifier } from '../eventsController';\r\nimport { downloadUrl } from '@apia/util';\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 | 'FIRE_EVENT'\r\n | 'DOWNLOAD';\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 additionalData: 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 panelIdentifier: TPanelIdentifier,\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.additionalData || action.text,\r\n action.action,\r\n );\r\n break;\r\n case 'RUN_ACTION':\r\n firePanelAction(\r\n panelIdentifier.panelId,\r\n action.action,\r\n {},\r\n { requestConfig: { handleLoad: true } },\r\n );\r\n break;\r\n case 'FIRE_EVENT':\r\n eventsController.fireEvent(\r\n panelIdentifier,\r\n action.action,\r\n JSON.parse(action.additionalData),\r\n );\r\n break;\r\n case 'DOWNLOAD':\r\n downloadUrl(action.action);\r\n break;\r\n default:\r\n console.error('Unknown action behavior: ', action);\r\n }\r\n }\r\n }\r\n}\r\n","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","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","import { useCallback } from 'react';\r\nimport { usePanelIdentity } from '../common';\r\nimport { handleAction, TBasicAction } from './basicAction';\r\n\r\nexport const useActionEventHandlers = () => {\r\n const identifier = usePanelIdentity();\r\n\r\n const onClick = useCallback(\r\n (ev: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n return (action: TBasicAction) => {\r\n if (action.actionSource !== 'CLICK') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n const onDoubleClick = useCallback(\r\n (ev: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n return (action: TBasicAction) => {\r\n if (action.actionSource !== 'DOUBLE_CLICK') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n const onKeyDown = useCallback(\r\n (ev: React.KeyboardEvent<HTMLElement>) => {\r\n return (action: TBasicAction) => {\r\n if (ev.code !== 'Enter') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n return { onClick, onDoubleClick, onKeyDown };\r\n};\r\n","import { Icon } from '@apia/icons';\r\nimport { getLabel } from '@apia/util';\r\nimport { usePanelNetworkState } from '../../../actions';\r\n\r\nexport const NetworkState = ({ title }: { title: string }) => {\r\n const isConnected = usePanelNetworkState();\r\n return (\r\n <>\r\n {!isConnected && (\r\n <Icon\r\n tabIndex={0}\r\n title={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n aria-label={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n name=\"Alert\"\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n","import { PanelContainer } from '../../types';\r\nimport { NetworkState } from './DefaultPanelWrapper/NetworkState';\r\nimport { usePanelIdentity } from '../../common';\r\nimport { PanelContextProvider, useMakePanelContext } from './PanelContext';\r\nimport { PanelFooter } from './PanelContext/PanelFooter';\r\nimport {\r\n usePanelTitleAction,\r\n usePanelTitleDescription,\r\n} from '../../panelsUtil/usePanelTitleAction';\r\nimport { useDashboardContext } from '../../dashboard/DashboardContext';\r\n\r\nexport const LandingPagePanelWrapper: PanelContainer = ({\r\n children,\r\n ...props\r\n}) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } =\r\n useMakePanelContext(props);\r\n\r\n const panelTitleAction = usePanelTitleAction();\r\n const panelTitleDescription = usePanelTitleDescription();\r\n\r\n const dashboard = useDashboardContext();\r\n\r\n if (dashboard.getPanel(panelId).props.hasRss)\r\n console.log(dashboard.getPanel(panelId).props);\r\n\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n className=\"panel__container\"\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n ref={ref}\r\n >\r\n <div className=\"panel__header\">\r\n <div className=\"panel__header__left\">\r\n {props.showTitle && (\r\n <span className=\"panel__title\">\r\n {panelTitleAction ? (\r\n <a\r\n title={panelTitleDescription}\r\n className=\"panel__title__link\"\r\n href={panelTitleAction}\r\n >\r\n {title}\r\n </a>\r\n ) : (\r\n title\r\n )}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </div>\r\n </div>\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={false} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n );\r\n};\r\n","import { PanelContainer } from '../../../types';\r\nimport { PanelContextProvider, useMakePanelContext } from '../PanelContext';\r\n\r\nexport const EmptyPanelWrapper: PanelContainer = (props) => {\r\n const { contextValue } = useMakePanelContext(props);\r\n\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n {props.children}\r\n </PanelContextProvider>\r\n );\r\n};\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\n/* eslint-disable no-restricted-imports */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\nimport {\r\n createSlice,\r\n injectReducers,\r\n PayloadAction,\r\n Draft,\r\n SliceCaseReducers,\r\n CaseReducer,\r\n} from '@apia/store';\r\nimport { TPanelId, TPanelType } from '../types';\r\n\r\ntype ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any;\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit<A, 'type'>;\r\n }\r\n : {};\r\n};\r\n\r\nexport type TPanelsSliceState = Record<string, Record<string, unknown>>;\r\n\r\nexport type TReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = ValidateSliceCaseReducers<State, CR>;\r\n\r\ntype TPanelsReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = Record<string, TReducers<State, CR>>;\r\n\r\n/**\r\n * Los updaters son funciones que permiten modificar la forma en la que un\r\n * panel modifica su estado, se puede pensar como un análogo del reducer\r\n *\r\n * {\r\n * panelTypeA: {\r\n * updaterA: (state, data) => { ...update panel store },\r\n * updaterB: (state, data) => { ...update panel store },\r\n * }\r\n * }\r\n */\r\nexport const reducers: TPanelsReducers<Record<string, unknown>> = {};\r\n\r\nexport function initPanelTypeUpdater(panelType: TPanelType) {\r\n if (!reducers[panelType]) {\r\n reducers[panelType] = {\r\n defaultReducer: (\r\n panelsState,\r\n payload: PayloadAction<{ name: string }>,\r\n ) => {\r\n Object.assign(panelsState, payload);\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Permite registrar nuevas formas de actualizar el estado de un tipo de panel\r\n */\r\nexport function registerReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n>(panelType: TPanelType, newReducers: TReducers<State, CR>) {\r\n initPanelTypeUpdater(panelType);\r\n Object.assign(reducers[panelType], newReducers);\r\n}\r\n\r\nexport function initPanelState(\r\n state: Draft<TPanelsSliceState>,\r\n panelType: TPanelType,\r\n panelId: TPanelId,\r\n initialState: any,\r\n) {\r\n if (!state[panelType]) {\r\n state[panelType] = {};\r\n }\r\n if (!state[panelType][panelId]) state[panelType][panelId] = {};\r\n state[panelType][panelId] = initialState;\r\n}\r\n\r\nexport const panelsSlice = createSlice({\r\n name: 'panelsSlice',\r\n initialState: {} as TPanelsSliceState,\r\n reducers: {\r\n initState(\r\n state,\r\n {\r\n payload: { panelId, panelType, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // reducer will be used to customize the way the slice is updated\r\n initialState: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState);\r\n state[panelType][panelId] = initialState;\r\n }\r\n },\r\n updatePanelStore(\r\n state,\r\n {\r\n payload: { data, panelId, panelType, reducer, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // Updater will be used to customize the way the slice is updated\r\n data: any;\r\n initialState?: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState ?? {});\r\n }\r\n const panelsStore = state[panelType][panelId];\r\n initPanelTypeUpdater(panelType);\r\n\r\n if (!reducers[panelType][reducer ?? 'default']) {\r\n return;\r\n }\r\n\r\n const currentReducer = reducers[panelType][\r\n reducer ?? 'default'\r\n ] as CaseReducer;\r\n currentReducer(panelsStore, data);\r\n },\r\n },\r\n});\r\n\r\nexport const { useSelector: usePanelStoreSelector, store: panelsStore } =\r\n injectReducers({\r\n panelsSlice: panelsSlice.reducer,\r\n });\r\n\r\nexport const panelsActions = panelsSlice.actions;\r\n","import { shallowEqual } from '@apia/store';\r\nimport { useRef, useState } from 'react';\r\nimport { TPanelName, TPanelType } from '../types';\r\nimport { panelsStore, usePanelStoreSelector } from './panelsStore';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const undefinedObject = {};\r\n\r\n/**\r\n * Permite escuchar el store de un panel al igual que se haría con un\r\n * useSelector de redux.\r\n *\r\n * @param selector Una función selectora que recibe el estado del panel y devuelve la selección deseada\r\n * @param comparator Opcionalmente se puede pasar un comparador para determinar si el estado debe actualizarse o no, dependiendo de la selección actual y la selección previa. Por defecto se usa shallowEqual de redux.\r\n * @returns La selección determinada en el selector, siempre que haya cambiado de acuerdo al comparador.\r\n *\r\n * @example\r\n *\r\n import { TRecordsPanelStore } from '..../recordsPanel';\r\n\r\n // Assume TRecordsPanelStore = { peopleNames: string[] }\r\n\r\n const firstName = usePanelSelector<TRecordsPanelStore>(\r\n 'RecordsPanel',\r\n 'RecordThisYear',\r\n (state) => { return state.peopleNames[0] }\r\n );\r\n */\r\nexport function usePanelSelector<StoreType, Selected>(\r\n panelType: TPanelType,\r\n panelName: TPanelName,\r\n initialState: StoreType,\r\n selector: (state: StoreType) => Selected,\r\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\r\n): Selected {\r\n const { panelId } = usePanelIdentity();\r\n if (!panelId) throw new Error(`Cannot find panel with name ${panelName}`);\r\n\r\n const storeState = panelsStore.getState().panelsSlice[panelType];\r\n const [selection, setSelection] = useState<Selected>(\r\n initialState\r\n ? selector((storeState?.[panelId] as StoreType) ?? initialState)\r\n : ({} as Selected),\r\n );\r\n\r\n const previousSelected = useRef<Selected>(\r\n selection ?? (undefinedObject as Selected),\r\n );\r\n\r\n usePanelStoreSelector((global) => {\r\n const newState = global.panelsSlice[panelType]?.[panelId] as\r\n | StoreType\r\n | undefined;\r\n if (newState !== undefined) {\r\n const newSelected = selector(newState);\r\n if (\r\n previousSelected.current === undefinedObject ||\r\n !comparator(previousSelected.current as Selected, newSelected)\r\n ) {\r\n previousSelected.current = newSelected;\r\n setSelection(newSelected);\r\n }\r\n }\r\n });\r\n\r\n return selection;\r\n}\r\n","/* 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":["__publicField","parametersStore","__privateAdd","__privateGet","__privateSet","Error","PanelContainer","DragAndDrop","bottomPanel","draggingPanel","bottomSection","result","useParametersSelector","panelsStore","shallowEqual"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/splash/panels/PanelIdentifier.tsx","../src/common/usePanelIdentity.ts","../src/position/usePanelPosition.ts","../src/dashboard/DashboardPanelContext.tsx","../src/actions/usePanelActions.ts","../src/actions/usePanelNetworkState.ts","../src/eventsController/eventsController.ts","../src/eventsController/usePanelFireEvent.ts","../src/eventsController/usePanelOnEvent.ts","../src/panelsUtil/usePanelChangeTitle.ts","../src/splash/panels/PanelContext/usePanelFooter.tsx","../src/config/parametersStore.ts","../src/config/saveParameters.ts","../src/dashboard/DashboardContext.tsx","../src/splash/panels/DefaultPanelWrapper/RefreshButton.tsx","../src/config/usePanelConfig.ts","../src/splash/panels/DefaultPanelWrapper/SettingsButton.tsx","../src/splash/panels/DefaultPanelWrapper/PanelButtons.tsx","../src/splash/panels/PanelContext/usePanelContextLayout.ts","../src/splash/panels/PanelContext/useYieldPanelIsReady.ts","../src/splash/panels/PanelContext/index.tsx","../src/splash/panels/PanelContext/PanelFooter.tsx","../src/splash/panels/DefaultPanelWrapper/index.tsx","../src/dashboard/DashboardPanelsBootstraper.tsx","../src/dashboard/PanelNotFound.tsx","../src/dashboard/ContainerNotFound.tsx","../src/util.ts","../src/splash/panels/PanelErrorBoundary.tsx","../src/dashboard/DashboardPanel.tsx","../src/splash/events/Dragleave.ts","../src/splash/util/isCursorInArea.ts","../src/splash/util/getColumnAreas.ts","../src/splash/events/Dragover.ts","../src/splash/events/Dragstart.ts","../src/splash/events/Drop.ts","../src/splash/util/DragAndDrop.ts","../src/dashboard/DashboardRouter.tsx","../src/dashboard/dashboard.tsx","../src/config/usePanelParametersSelector.ts","../src/panelsUtil/usePanelTitleAction.ts","../src/actions/firePanelAction.ts","../src/actions/basicAction.ts","../src/actions/externalFirePanelAction.ts","../src/actions/usePanelIsLoading.ts","../src/actions/useActionEventHandlers.ts","../src/splash/panels/DefaultPanelWrapper/NetworkState.tsx","../src/splash/panels/LandingPagePanelWrapper.tsx","../src/splash/panels/EmptyPanelWrapper/index.tsx","../src/panelsStore/panelsStore.ts","../src/panelsStore/usePanelSelector.ts","../src/panelsStore/createPanelStore.ts"],"sourcesContent":["import { ReactNode, createContext, useMemo } from 'react';\r\nimport { TPanelIdentifier } from '../../eventsController/types';\r\n\r\nexport const PanelIdentifierContext = createContext<\r\n TPanelIdentifier | undefined\r\n>(undefined);\r\n\r\nexport interface TPanelIdentifierProps {\r\n children: ReactNode;\r\n id: string;\r\n name: string;\r\n title: string;\r\n type: string;\r\n}\r\n\r\nexport const PanelIdentifier = ({\r\n children,\r\n name,\r\n id,\r\n title,\r\n type,\r\n}: TPanelIdentifierProps) => {\r\n const contextValue: TPanelIdentifier = useMemo(() => {\r\n return { panelName: name, panelId: id, panelTitle: title, panelType: type };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n return (\r\n <PanelIdentifierContext.Provider value={contextValue}>\r\n {children}\r\n </PanelIdentifierContext.Provider>\r\n );\r\n};\r\n","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","import { ApiaApi, makeApiaUrl } from '@apia/api';\r\nimport { EventEmitter, TId } from '@apia/util';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useEffect, useState } from 'react';\r\n\r\nclass PanelPositionEmitter extends EventEmitter<{\r\n panelUpdate: {\r\n panelId: TId;\r\n containerId: TId;\r\n newPosition: number;\r\n };\r\n}> {}\r\n\r\nexport const panelPositionEmitter = new PanelPositionEmitter();\r\n\r\n/**\r\n * Permite conocer la posición del panel, se actualiza automáticamente cuando\r\n * ésta cambia provocando un renderizado en el padre\r\n */\r\nexport function usePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n\r\n const [position, setPosition] = useState<{\r\n containerId: TId;\r\n position: number;\r\n }>();\r\n\r\n useEffect(() => {\r\n return panelPositionEmitter.on('panelUpdate', (ev) => {\r\n if (ev.panelId === panelId)\r\n setPosition({ containerId: ev.containerId, position: ev.newPosition });\r\n });\r\n }, [panelId]);\r\n\r\n return position;\r\n}\r\n\r\nexport async function updatePanelPosition(\r\n panelId: TId,\r\n containerId: TId,\r\n newPosition: number,\r\n) {\r\n const result = await ApiaApi.post(\r\n makeApiaUrl({\r\n action: 'panelMove',\r\n pnlId: panelId,\r\n containerId,\r\n newPosition,\r\n }),\r\n );\r\n\r\n const hasUpdated = result?.data && !result.hasError && !result.hasMessages;\r\n\r\n if (hasUpdated)\r\n panelPositionEmitter.emit('panelUpdate', {\r\n panelId,\r\n containerId,\r\n newPosition,\r\n });\r\n\r\n return hasUpdated;\r\n}\r\n\r\nexport function useUpdatePanelPosition() {\r\n const { panelId } = usePanelIdentity();\r\n return async function updatePosition(containerId: TId, newPosition: number) {\r\n return updatePanelPosition(panelId, containerId, newPosition);\r\n };\r\n}\r\n","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","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 & { force?: boolean };\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","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","/* 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","/* 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","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","import { useCallback } from 'react';\r\nimport {\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelFireEvent,\r\n} from '../eventsController';\r\n\r\nexport function changePanelTitle(\r\n identifier: TPanelIdentifier,\r\n newTitle: string,\r\n) {\r\n eventsController.fireEvent(identifier, '__changePanelTitle__', newTitle);\r\n}\r\n\r\nexport function usePanelChangeTitle() {\r\n const fireEvent = usePanelFireEvent();\r\n\r\n return useCallback(\r\n (newTitle: string) => {\r\n fireEvent('__changePanelTitle__', newTitle);\r\n },\r\n [fireEvent],\r\n );\r\n}\r\n","import {\r\n KeyboardEvent,\r\n MouseEvent,\r\n ReactNode,\r\n useCallback,\r\n useState,\r\n} from 'react';\r\nimport {\r\n TPanelEvent,\r\n TPanelIdentifier,\r\n eventsController,\r\n usePanelOnEvent,\r\n} from '../../../eventsController';\r\nimport { TFooter } from '../../../actions/usePanelActions';\r\nimport { handleAction } from '../../../actions/basicAction';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport function changePanelFooter(panelId: string, footer: TFooter | null) {\r\n eventsController.fireEvent(\r\n { panelId } as TPanelIdentifier,\r\n 'changeFooter',\r\n footer,\r\n );\r\n}\r\n\r\nexport type TUsePanelFooter = {\r\n footerContent?: ReactNode;\r\n footer: TFooter | null;\r\n handleFooterClick: (ev: MouseEvent | KeyboardEvent) => void;\r\n};\r\n\r\nexport function usePanelFooter({\r\n initialData,\r\n}: {\r\n initialData: unknown;\r\n}): TUsePanelFooter {\r\n const identifier = usePanelIdentity();\r\n\r\n const [footer, setFooter] = useState<TFooter | null>(\r\n (initialData as { footer: { footer: TFooter } })?.footer?.footer?.text ||\r\n (initialData as { footer: { footer: TFooter } })?.footer?.footer?.force\r\n ? (initialData as { footer: { footer: TFooter } })?.footer?.footer\r\n : null,\r\n );\r\n\r\n const handleFooterClick = useCallback(\r\n (ev: MouseEvent | KeyboardEvent) => {\r\n if (footer) handleAction(identifier, ev, footer);\r\n },\r\n [footer, identifier],\r\n );\r\n\r\n usePanelOnEvent(\r\n { eventType: 'changeFooter', panelId: identifier.panelId },\r\n (ev: TPanelEvent<TFooter>) => {\r\n if (!ev.payload.text && !ev.payload.force) setFooter(null);\r\n else setFooter(ev.payload);\r\n },\r\n );\r\n\r\n return { footer, handleFooterClick };\r\n}\r\n","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","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","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","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelActions, usePanelIsLoading } from '../../../actions';\r\n\r\nexport const RefreshButton = (props: {\r\n refreshOnStart: boolean;\r\n refreshOnHome: boolean;\r\n title: string;\r\n}) => {\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n\r\n const isLoading = usePanelIsLoading();\r\n const dispatch = usePanelActions();\r\n\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n return (\r\n <IconButton\r\n icon=\"Refresh\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n size=\"Md\"\r\n onClick={useCallback(() => {\r\n void dispatch({ action: 'refresh' });\r\n }, [dispatch])}\r\n title={getLabel('lblRefreshPnl', { text: { TOK1: props.title } }).text}\r\n isLoading={isLoading}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","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","import { IconButton } from '@apia/components';\r\nimport { getLabel, useImperativeComponentEvents } from '@apia/util';\r\nimport { useCallback, useState } from 'react';\r\nimport { usePanelConfig } from '../../../config/usePanelConfig';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { panelButtonsActions } from './PanelButtons';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport const SettingsButton = (props: { title: string }) => {\r\n const { panelId } = usePanelIdentity();\r\n const configure = usePanelConfig();\r\n\r\n const [isDisabled, setIsDisabled] = useState(false);\r\n useImperativeComponentEvents({\r\n disable(newDisabledValue: boolean) {\r\n setIsDisabled(newDisabledValue);\r\n },\r\n });\r\n\r\n usePanelActions({\r\n refresh() {\r\n panelButtonsActions(panelId, 'disable', false);\r\n },\r\n });\r\n\r\n const openSettings = useCallback(() => {\r\n try {\r\n configure();\r\n } catch (e) {}\r\n }, [configure]);\r\n\r\n return (\r\n <IconButton\r\n icon=\"Settings\"\r\n size=\"Md\"\r\n variant=\"buttons.icon-outline\"\r\n className=\"panel__iconButton\"\r\n onClick={openSettings}\r\n title={getLabel('lblOpenPnlConf', { text: { TOK1: props.title } }).text}\r\n disabled={isDisabled}\r\n />\r\n );\r\n};\r\n","import { makeImperativeComponent } from '@apia/util';\r\nimport { RefreshButton } from './RefreshButton';\r\nimport { SettingsButton } from './SettingsButton';\r\nimport { TPanelProps } from '../../../types';\r\n\r\nexport const [, panelButtonsActions, PanelButtons] = makeImperativeComponent<\r\n Omit<TPanelProps, 'initialData' | 'children'>,\r\n {\r\n disable: boolean;\r\n }\r\n>()({\r\n Component: (props) => {\r\n return (\r\n <>\r\n {props.isRefreshable && (\r\n <>\r\n <RefreshButton {...props} />\r\n </>\r\n )}\r\n {props.isConfigurable && <SettingsButton title={props.title} />}\r\n </>\r\n );\r\n },\r\n});\r\n","import { spacingLayouts, TSpacingLayout } from '@apia/theme';\r\nimport { useCallback, useRef } from 'react';\r\n\r\nexport type TPanelLayout = TSpacingLayout;\r\n\r\nexport function usePanelContextLayout() {\r\n const elRef = useRef<HTMLDivElement | null>(null);\r\n const layoutRef = useRef<TPanelLayout>('clever');\r\n\r\n const clearClassNames = useCallback(() => {\r\n spacingLayouts.forEach((current) =>\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.remove(current),\r\n );\r\n }, []);\r\n\r\n const setRef = useCallback(\r\n (el: HTMLDivElement) => {\r\n if (el instanceof HTMLDivElement) {\r\n elRef.current = el;\r\n clearClassNames();\r\n (el?.querySelector('.panel__content') as HTMLElement).classList.add(\r\n layoutRef.current,\r\n );\r\n }\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n const setLayout = useCallback(\r\n (layout: TPanelLayout) => {\r\n if (layoutRef.current === layout) return;\r\n\r\n layoutRef.current = layout;\r\n clearClassNames();\r\n (\r\n elRef.current?.querySelector('.panel__content') as HTMLElement\r\n )?.classList.add(layoutRef.current);\r\n },\r\n [clearClassNames],\r\n );\r\n\r\n return { ref: setRef, setLayout };\r\n}\r\n","import { useMount } from '@apia/util';\r\nimport { usePanelContext } from '.';\r\n\r\n/**\r\n * **Favor de leer con cuidado el siguiente contenido, es muy importante para\r\n * la performance**\r\n *\r\n * El hook useYieldPanelIsReady es una parte muy importante del flujo de\r\n * trabajo de los dashboards. **El no reportar la carga de un panel tiene\r\n * penalizaciones graves en el tiempo de renderizado inicial**, esto es porque\r\n * el dashboard espera que todos los paneles hayan terminado la carga\r\n * estructural básica antes de empezar con los refresh iniciales, y esto termina\r\n * impactando en el tiempo que demora en bajar la cortina.\r\n *\r\n * **Aclaración:** Actualmente se espera las cargas estructurales para lanzar\r\n * los refresh iniciales por motivos de arquitectura. Esa restricción será\r\n * eliminada probablemente en el corto plazo, pero eso no cambia la necesidad de\r\n * reportar las estructuras ya que esta información es igualmente utilizada para\r\n * el bajado de la cortina de Skeletons.\r\n *\r\n * Por ejemplo, si todos los paneles están optimizados para lograr cargas\r\n * iniciales rápidas pero el logo de la aplicación no reporta que su estructura\r\n * está pronta, el dashboard va a bajar su cortina solamente luego de que expire\r\n * el timeout **DASH_COURTAIN_TRESHOLD**, que por defecto viene establecido en 5\r\n * segundos.\r\n *\r\n * Esto significa que aún cuando la cortina se hubiera podido bajar quizás a\r\n * los pocos ms de cargado el html inicial, no lo hará porque supone que el\r\n * panel Logo aún no terminó su carga estructural.\r\n *\r\n * Siempre que un panel esté presente en un dashboard, deberá reportar cuando\r\n * la carga estructural esté pronta. Esto puede ser hecho de dos formas:\r\n *\r\n * - Usando { setRef } = usePanelContext(): En el elemento crucial de HTML del\r\n * elemento hacer ref={setRef}. Esta es la forma más óptima ya que nos garantiza\r\n * que el panel se reporte cuando su estructura HTML ya esté disponible,\r\n * evitando ninguna demora.\r\n *\r\n * - Usando useYieldPanelIsReady(): Este hook es una alternativa disponible\r\n * para las situaciones en las que no tenemos ningún elemento HTML de\r\n * importancia o cuando ese elemento no está disponible hasta después de la\r\n * carga inicial. Al usar este hook el panel se reportará automáticamente una\r\n * vez que haya hecho el renderizado inicial.\r\n */\r\nexport function useYieldPanelIsReady() {\r\n const { setRef } = usePanelContext();\r\n\r\n useMount(() => {\r\n setRef({} as HTMLElement);\r\n });\r\n}\r\n","import {\r\n ReactNode,\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from 'react';\r\nimport { changePanelTitle } from '../../../panelsUtil';\r\nimport { TPanelEvent, usePanelOnEvent } from '../../../eventsController';\r\nimport { TPanelLayout, usePanelContextLayout } from './usePanelContextLayout';\r\nimport { usePanelFooter } from './usePanelFooter';\r\nimport { TPanelProps } from '../../../types';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { useYieldPanelIsReady } from './useYieldPanelIsReady';\r\nimport { useDashboardContext } from '../../../dashboard/DashboardContext';\r\nimport { usePanelIdentity } from '../../../common';\r\n\r\nexport const PanelContext = createContext<TPanelContext | null>(null);\r\nexport { useYieldPanelIsReady };\r\n\r\nexport type TPanelContext = {\r\n /**\r\n * Permite establecer contenido arbitrario en el footer del panel.\r\n */\r\n setFooterContent(content: ReactNode): void;\r\n /**\r\n * setLayout es una función que permite decidir en qué formato se muestran\r\n * los contenidos del panel.\r\n *\r\n * dense: No hay paddings\r\n * clever: Hay paddings grandes\r\n */\r\n setLayout: (newLayout: TPanelLayout) => void;\r\n setTitle: (newTitle: string) => void;\r\n panelProps: Omit<TPanelProps, 'children'>;\r\n /**\r\n * Cuando un panel renderiza sus hijos en pantalla, debe setear el ref de\r\n * modo que se pueda continuar con el flujo normal del panel. Este ref puede\r\n * estar en cualquier nivel, cuando sea instanciado, se llamará al refresh\r\n * inicial.\r\n */\r\n setRef: (el: HTMLElement | null) => void;\r\n};\r\n\r\nexport function usePanelContext() {\r\n const context = useContext(PanelContext);\r\n if (!context) throw new Error('No panel wrapper context defined');\r\n return context;\r\n}\r\nexport const PanelContextProvider = ({\r\n children,\r\n value,\r\n}: {\r\n children: ReactNode;\r\n value: TPanelContext;\r\n}) => {\r\n return (\r\n <PanelContext.Provider value={value}>{children}</PanelContext.Provider>\r\n );\r\n};\r\n\r\nexport function useMakePanelContext(panelProps: Omit<TPanelProps, 'children'>) {\r\n const identifier = usePanelIdentity();\r\n\r\n const setTitle = useCallback(\r\n (newTitle: string) => {\r\n changePanelTitle(identifier, newTitle);\r\n },\r\n [identifier],\r\n );\r\n\r\n const { ref, setLayout } = usePanelContextLayout();\r\n\r\n const [title, setTitleState] = useState(panelProps.title);\r\n usePanelOnEvent(\r\n { eventType: 'changeTitle', panelId: identifier.panelId },\r\n (ev: TPanelEvent<string>) => {\r\n setTitleState(ev.payload);\r\n },\r\n );\r\n const { footer, handleFooterClick } = usePanelFooter(panelProps);\r\n\r\n const [footerContent, setFooterContent] = useState<ReactNode>(null);\r\n\r\n const dispatch = usePanelActions();\r\n const hasRefreshedOnStartup = useRef(false);\r\n const dashboard = useDashboardContext();\r\n\r\n const setRef = useCallback(\r\n (el: HTMLElement | null) => {\r\n if (el && !hasRefreshedOnStartup.current) {\r\n hasRefreshedOnStartup.current = true;\r\n if (panelProps.refreshOnStart) {\r\n void dispatch({ action: 'refresh' }).then(() => {\r\n dashboard.bootstrapper.setPanelHasLoaded(identifier.panelId);\r\n });\r\n } else {\r\n dashboard.bootstrapper.setPanelHasLoaded(identifier.panelId);\r\n }\r\n }\r\n },\r\n [\r\n dashboard.bootstrapper,\r\n dispatch,\r\n identifier.panelId,\r\n panelProps.refreshOnStart,\r\n ],\r\n );\r\n\r\n const contextValue = useMemo<TPanelContext>(\r\n () => ({ setFooterContent, setTitle, setLayout, panelProps, setRef }),\r\n [setTitle, setLayout, panelProps, setRef],\r\n );\r\n\r\n return { footerContent, title, footer, handleFooterClick, contextValue, ref };\r\n}\r\n","import { useState } from 'react';\r\nimport { usePanelActions } from '../../../actions';\r\nimport { TUsePanelFooter } from './usePanelFooter';\r\nimport { AutoEllipsis, SimpleButton } from '@apia/components';\r\nimport { Box } from '@apia/theme';\r\n\r\nexport const PanelFooter = ({\r\n footerContent,\r\n isRefreshable,\r\n footer,\r\n handleFooterClick,\r\n force,\r\n}: TUsePanelFooter & { isRefreshable: boolean; force?: boolean }) => {\r\n const [lastUpdate, setLastUpdate] = useState<number>(0);\r\n\r\n usePanelActions({\r\n refresh() {\r\n setLastUpdate(Date.now());\r\n },\r\n });\r\n\r\n return (\r\n <>\r\n {(isRefreshable || footer || force) && (\r\n <div className=\"panel__footer\">\r\n {footerContent ??\r\n (footer &&\r\n (!footer.action || footer.actionBehavior === 'DO_NOTHING') && (\r\n <div className=\"panel__footer__text\">\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </div>\r\n ))}\r\n {footer?.action && footer.actionBehavior !== 'DO_NOTHING' && (\r\n <SimpleButton\r\n onClick={handleFooterClick}\r\n onDoubleClick={handleFooterClick}\r\n variant=\"link\"\r\n className=\"panel__footer__text\"\r\n >\r\n <AutoEllipsis\r\n overrideStyles={(el) => {\r\n const styles = window.getComputedStyle(\r\n el.closest('.panel__footer') as HTMLElement,\r\n );\r\n const width = Number.parseInt(styles.width, 10);\r\n const padding =\r\n Number.parseInt(styles.paddingLeft, 10) +\r\n Number.parseInt(styles.paddingRight, 10);\r\n return {\r\n width: `${width - padding}px`,\r\n };\r\n }}\r\n >\r\n {footer.text}\r\n </AutoEllipsis>\r\n </SimpleButton>\r\n )}\r\n {!footer && <div></div>}\r\n {lastUpdate > 0 && (\r\n <Box className=\"lastUpdate__wrapper\">\r\n {new Date(lastUpdate).toLocaleDateString()}{' '}\r\n {new Date(lastUpdate).toLocaleTimeString()}\r\n </Box>\r\n )}\r\n </div>\r\n )}\r\n </>\r\n );\r\n};\r\n","import { Box, getVariant } from '@apia/theme';\r\nimport { PanelContainer } from '../../../types';\r\nimport { usePanelIdentity } from '../../../common';\r\nimport { NetworkState } from './NetworkState';\r\nimport { PanelButtons } from './PanelButtons';\r\nimport { usePanelIsLoading } from '../../../actions';\r\nimport { PanelContextProvider, useMakePanelContext } from '../PanelContext';\r\nimport { PanelFooter } from '../PanelContext/PanelFooter';\r\nimport {\r\n usePanelImage,\r\n usePanelTitleDescription,\r\n} from '../../../panelsUtil/usePanelTitleAction';\r\nimport { AutoEllipsis } from '@apia/components';\r\n\r\nexport const DefaultPanelWrapper: PanelContainer = ({ children, ...props }) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } =\r\n useMakePanelContext(props);\r\n\r\n const panelTitleDescription = usePanelTitleDescription();\r\n const panelImage = usePanelImage() ?? props.image;\r\n\r\n const showHeader =\r\n props.showTitle ||\r\n props.isConfigurable ||\r\n props.isRefreshable ||\r\n panelImage;\r\n\r\n const isLoading = usePanelIsLoading();\r\n return (\r\n <Box {...getVariant('layout.common.dashboards.panel')}>\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n ref={ref}\r\n className={`panel__container ${isLoading ? 'isLoading' : ''}`}\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n >\r\n {showHeader && (\r\n <div\r\n draggable={props.canMove}\r\n className={`panel__header ${props.canMove ? 'drag_panel_container' : ''}`}\r\n >\r\n <div\r\n className=\"panel__header__left\"\r\n sx={{\r\n maxWidth: '80%',\r\n overflow: 'hidden',\r\n whiteSpace: 'nowrap',\r\n }}\r\n >\r\n {panelImage && !panelImage.match('(^.+null$)') && (\r\n <img src={panelImage} className=\"panel__icon\" />\r\n )}\r\n <AutoEllipsis>\r\n {props.showTitle && (\r\n <span\r\n className=\"panel__title\"\r\n title={panelTitleDescription ?? title}\r\n >\r\n {title}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </AutoEllipsis>\r\n </div>\r\n\r\n <div className={`panel__header__buttons`}>\r\n <PanelButtons {...props} id={panelId} />\r\n </div>\r\n </div>\r\n )}\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={props.isRefreshable} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n </Box>\r\n );\r\n};\r\n","/* 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","import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\nimport { useYieldPanelIsReady } from '../splash/panels/PanelContext';\r\n\r\nexport const PanelNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n useYieldPanelIsReady();\r\n\r\n return (\r\n <>\r\n <Heading>Panel not found: {props.panelType}</Heading>\r\n </>\r\n );\r\n};\r\n","import { Heading } from '@apia/theme';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const ContainerNotFound = () => {\r\n const props = usePanelIdentity();\r\n\r\n return <Heading>Container not found for panel: {props.panelName}</Heading>;\r\n};\r\n","import { ComponentType, lazy } from 'react';\r\nimport { PanelNotFound } from './dashboard/PanelNotFound';\r\nimport { PanelContainer } from './types';\r\nimport { ContainerNotFound } from './dashboard/ContainerNotFound';\r\n\r\nconst importedContainers: Record<string, PanelContainer> = {};\r\nconst importedPanels: Record<\r\n string,\r\n ComponentType<{ initialData: unknown }>\r\n> = {};\r\n\r\nexport function importContainer(path: string): PanelContainer {\r\n if (!importedContainers[path])\r\n importedContainers[path] = lazy<PanelContainer>(() => {\r\n return new Promise<{\r\n default: PanelContainer;\r\n }>((resolve) => {\r\n import(\r\n /* webpackChunkName: \"[request]\" */\r\n /* webpackInclude: /\\.tsx?$/ */\r\n /* webpackPreload: true */\r\n `/containers/${path}`\r\n )\r\n .then((result: { default: { default: PanelContainer } }) => {\r\n resolve(result.default);\r\n })\r\n .catch((e) => {\r\n console.error(e);\r\n resolve({\r\n default: ContainerNotFound,\r\n });\r\n });\r\n });\r\n });\r\n\r\n return importedContainers[path];\r\n}\r\n\r\nexport function importPanel(path: string) {\r\n if (!importedPanels[path])\r\n importedPanels[path] = lazy<ComponentType<{ initialData: unknown }>>(() => {\r\n return new Promise<{\r\n default: ComponentType<{ initialData: unknown }>;\r\n }>((resolve) => {\r\n import(\r\n /* webpackChunkName: \"[request]\" */\r\n /* webpackInclude: /\\.tsx?$/ */\r\n /* webpackPreload: true */\r\n `/panels/${path}`\r\n )\r\n .then(\r\n (result: {\r\n default: { default: ComponentType<{ initialData: unknown }> };\r\n }) => {\r\n resolve(result.default);\r\n },\r\n )\r\n .catch((e) => {\r\n console.error(e);\r\n resolve({\r\n default: PanelNotFound,\r\n });\r\n });\r\n });\r\n });\r\n\r\n return importedPanels[path];\r\n}\r\n","import { makeStyledComponent } from '@apia/theme';\r\nimport { Component, ReactNode } from 'react';\r\nimport { Box, Heading, Paragraph } from '@apia/theme';\r\n\r\nconst Error = makeStyledComponent(\r\n 'Error',\r\n 'layout.panels.error',\r\n {\r\n '.panelError__wrapper': {\r\n display: 'flex',\r\n flexDirection: 'column',\r\n gap: 3,\r\n\r\n h3: {\r\n color: 'palette.error.main',\r\n },\r\n },\r\n },\r\n ({ error }: { error: string }) => {\r\n return (\r\n <Box className=\"panelError__wrapper\">\r\n <Heading as=\"h3\">Oops! Something went wrong</Heading>\r\n <Heading as=\"h4\">Error:</Heading>\r\n <Paragraph>{error}</Paragraph>\r\n </Box>\r\n );\r\n },\r\n);\r\n\r\nexport class PanelErrorBoundary extends Component<\r\n { children: ReactNode },\r\n { hasError: boolean; errorMessage: string }\r\n> {\r\n state: Readonly<{ hasError: boolean; errorMessage: string }> = {\r\n hasError: false,\r\n errorMessage: '',\r\n };\r\n\r\n static getDerivedStateFromError(error: unknown) {\r\n if (!(error instanceof Promise))\r\n return { hasError: true, errorMessage: String(error) };\r\n }\r\n\r\n render() {\r\n if (this.state.hasError) {\r\n return <Error error={this.state.errorMessage} />;\r\n }\r\n\r\n return this.props.children;\r\n }\r\n}\r\n","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() 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 panelContent = this.getContainer();\r\n const xml = panelContent.innerHTML\r\n .replaceAll('&lt;', '<')\r\n .replaceAll('&gt;', '>')\r\n .replaceAll('&amp;', '&');\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 canMove: toBoolean(panelData.getAttribute('canMove')),\r\n hasRss: toBoolean(panelData.getAttribute('hasRss')),\r\n image: panelData.getAttribute('imagePath') as string,\r\n isConfigurable: toBoolean(panelData.getAttribute('isConfigurable')),\r\n isRefreshable: toBoolean(panelData.getAttribute('isRefreshable')),\r\n name: panelData.getAttribute('name') as string,\r\n refreshOnHome: toBoolean(panelData.getAttribute('refreshOnHome')),\r\n refreshOnStart: toBoolean(panelData.getAttribute('refreshOnStart')),\r\n showTitle: toBoolean(panelData.getAttribute('showTitle')),\r\n title: panelData.getAttribute('title') as string,\r\n type: panel.dataset.panel as string,\r\n };\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} />\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","import { isChild } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragleave(_ev: Event, DragAndDrop: DragAndDrop) {\r\n const ev = _ev as DragEvent;\r\n\r\n if (\r\n ev.relatedTarget === null ||\r\n isChild(ev.relatedTarget as HTMLElement, (current) => {\r\n return (\r\n current.parentElement === null &&\r\n current === document.getRootNode() &&\r\n current.dataset.splash === undefined\r\n );\r\n })\r\n ) {\r\n const shadows = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n shadows.forEach((el) => el.remove());\r\n DragAndDrop.draggingPanel?.setAttribute('style', '');\r\n }\r\n}\r\n","import { TPanelZoneCoordinates } from '../types';\r\n\r\nexport const isCursorInArea = ({\r\n top,\r\n bottom,\r\n left,\r\n right,\r\n cursorX,\r\n cursorY,\r\n}: TPanelZoneCoordinates) => {\r\n return (\r\n top <= cursorY && cursorY <= bottom && left <= cursorX && cursorX <= right\r\n );\r\n};\r\n","import { TPanelData } from '../types';\r\n\r\nexport const getColumnAreas = (specificPanel: TPanelData) => {\r\n return {\r\n top: {\r\n top: specificPanel.panelTop,\r\n bottom: specificPanel.panelTop + specificPanel.panelHeight / 2,\r\n left: specificPanel.panelLeft,\r\n right: specificPanel.panelRight,\r\n },\r\n bottom: {\r\n top: specificPanel.panelBottom - specificPanel.panelHeight / 2,\r\n bottom: specificPanel.panelBottom,\r\n right: specificPanel.panelRight,\r\n left: specificPanel.panelLeft,\r\n },\r\n };\r\n};\r\n","/* eslint-disable no-param-reassign */\r\nimport { isCursorInArea } from '../util/isCursorInArea';\r\nimport { getColumnAreas } from '../util/getColumnAreas';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragover(event: Event, DragAndDrop: DragAndDrop) {\r\n const ev = event as DragEvent;\r\n ev.preventDefault();\r\n\r\n DragAndDrop.timeout = -1;\r\n if (\r\n (ev.clientX !== DragAndDrop.dragoverPosition.x ||\r\n ev.clientY !== DragAndDrop.dragoverPosition.y) &&\r\n DragAndDrop.draggingPanelId !== '' &&\r\n DragAndDrop.shadowDiv\r\n ) {\r\n DragAndDrop.clearTimeout();\r\n DragAndDrop.currentBottomPanel = DragAndDrop.findBottomPanel(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n DragAndDrop.dragoverPosition.x = ev.clientX;\r\n DragAndDrop.dragoverPosition.y = ev.clientY;\r\n\r\n const snapshotSection = DragAndDrop.findBottomSection(\r\n ev.clientX,\r\n ev.clientY + DragAndDrop.currentScroll,\r\n );\r\n\r\n if (\r\n DragAndDrop.shadowDivData &&\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n bottom: DragAndDrop.shadowDivData?.panelBottom,\r\n top: DragAndDrop.shadowDivData?.panelTop,\r\n left: DragAndDrop.shadowDivData?.panelLeft,\r\n right: DragAndDrop.shadowDivData?.panelRight,\r\n })\r\n ) {\r\n return;\r\n }\r\n\r\n if (DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n\r\n if (bottomSection) {\r\n if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).top,\r\n })\r\n ) {\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none; height: 0;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceBefore(\r\n bottomPanel,\r\n DragAndDrop.shadowDiv,\r\n bottomSection as HTMLElement,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n } else if (\r\n isCursorInArea({\r\n cursorX: ev.clientX,\r\n cursorY: ev.clientY + DragAndDrop.currentScroll,\r\n ...getColumnAreas({\r\n ...DragAndDrop.currentBottomPanel,\r\n panelLeft: bottomSection?.getBoundingClientRect().left ?? 0,\r\n panelRight: bottomSection?.getBoundingClientRect().right ?? 0,\r\n }).bottom,\r\n })\r\n ) {\r\n const bottomPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.currentBottomPanel.id}']`,\r\n );\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n if (bottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAfter(DragAndDrop.shadowDiv, bottomPanel);\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n }\r\n } else if (!DragAndDrop.currentBottomPanel && snapshotSection) {\r\n const bottomSection = DragAndDrop.splash.querySelector(\r\n `[data-locationid='${snapshotSection.sectionId}']`,\r\n );\r\n if (bottomSection) {\r\n const draggingPanel = DragAndDrop.splash.querySelector(\r\n `[data-panel][data-id='${DragAndDrop.draggingPanelId}']`,\r\n );\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', 'display: none;');\r\n }\r\n DragAndDrop.shadowDiv.setAttribute('style', 'opacity: 50%;');\r\n DragAndDrop.debounceAppend(\r\n bottomSection as HTMLElement,\r\n DragAndDrop.shadowDiv,\r\n );\r\n DragAndDrop.snapshot();\r\n DragAndDrop.clearTimeout();\r\n }\r\n }\r\n }\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function dragstart(\r\n ev: DragEvent,\r\n el: Element,\r\n DragAndDrop: DragAndDrop,\r\n) {\r\n if (!(el instanceof HTMLElement)) return;\r\n DragAndDrop.drawMinimap();\r\n DragAndDrop.sectionData = [];\r\n\r\n const targetPanel = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.id && !!current.dataset?.panel,\r\n );\r\n\r\n ev?.dataTransfer?.setData('text', targetPanel?.dataset.id as string);\r\n if (targetPanel) {\r\n DragAndDrop.placeholderImage = targetPanel.cloneNode(true) as HTMLElement;\r\n DragAndDrop.placeholderImage.style.position = 'fixed';\r\n DragAndDrop.placeholderImage.style.top = '-10000000.45px';\r\n\r\n const children =\r\n DragAndDrop.placeholderImage.querySelectorAll<HTMLElement>('*');\r\n children.forEach((current) => (current.style.overflow = 'hidden'));\r\n document.body.append(DragAndDrop.placeholderImage);\r\n ev?.dataTransfer?.setDragImage(DragAndDrop.placeholderImage, 0, 0);\r\n }\r\n if (ev.dataTransfer) {\r\n // eslint-disable-next-line no-param-reassign\r\n ev.dataTransfer.effectAllowed = 'move';\r\n }\r\n\r\n setTimeout(() => {\r\n const targetSection = getSpecificParent(\r\n ev.target as HTMLElement,\r\n (current) => !!current.dataset?.locationid,\r\n );\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n const emptySectionsId: string[] = [];\r\n\r\n sections?.forEach((sec) => {\r\n if (sec.children.length === 0) {\r\n emptySectionsId.push((sec as HTMLElement).dataset.locationid ?? '');\r\n }\r\n });\r\n\r\n emptySectionsId.forEach((emptySecId) => {\r\n const section = DragAndDrop.body?.querySelector(\r\n `[data-locationid=\"${emptySecId}\"]`,\r\n );\r\n if (section) {\r\n section.setAttribute('style', 'padding: 10px; border:2px dashed #ccc');\r\n }\r\n });\r\n\r\n DragAndDrop.snapshot();\r\n\r\n if (targetPanel) {\r\n DragAndDrop.draggingPanelSectionId =\r\n targetSection?.dataset.locationid ?? '';\r\n DragAndDrop.draggingPanelId = targetPanel.dataset.id as string;\r\n DragAndDrop.draggingPanel = targetPanel;\r\n }\r\n if (DragAndDrop.draggingPanelId === '') {\r\n return;\r\n }\r\n const falseDiv = targetPanel?.cloneNode(true) as HTMLDivElement;\r\n falseDiv.style.opacity = `50%`;\r\n falseDiv.style.width = `100%`;\r\n falseDiv.style.height = `auto`;\r\n falseDiv.style.backgroundColor = `rgba(0,0,0,0.1)`;\r\n falseDiv.className = 'apia_panel_falseDiv';\r\n DragAndDrop.shadowDiv = falseDiv;\r\n }, 0);\r\n}\r\n","/* eslint-disable no-param-reassign */\r\nimport { getSpecificParent } from '@apia/util';\r\nimport { updatePanelPosition } from '../../position/usePanelPosition';\r\nimport { DragAndDrop } from '../util/DragAndDrop';\r\n\r\nexport function Drop(event: Event, DragAndDrop: DragAndDrop) {\r\n if (DragAndDrop.body) {\r\n const ev = event as DragEvent;\r\n const data = ev?.dataTransfer?.getData('text');\r\n\r\n const sections = DragAndDrop.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections.forEach((sec) => {\r\n sec.setAttribute('style', '');\r\n });\r\n\r\n const draggingPanel = DragAndDrop.body.querySelector(\r\n `[data-panel][data-id=\"${DragAndDrop.draggingPanelId}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n\r\n if (draggingPanel) {\r\n draggingPanel.setAttribute('style', '');\r\n }\r\n const falseDiv = document.querySelector('.apia_panel_falseDiv');\r\n\r\n if (data) {\r\n const child = document.querySelector(\r\n `[data-panel][data-id=\"${data}\"]:not(.apia_panel_falseDiv)`,\r\n );\r\n sections.forEach((sec) => {\r\n if (sec.children.length === 1) {\r\n sec.setAttribute('style', '');\r\n }\r\n });\r\n if (falseDiv) {\r\n const newSection = getSpecificParent(\r\n falseDiv as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n );\r\n\r\n if (newSection) {\r\n const panelsArray = Array.from(newSection.children);\r\n const childId = (child as HTMLElement).dataset.id;\r\n\r\n if (childId) {\r\n const index = panelsArray\r\n .filter(\r\n (panel) =>\r\n !(\r\n (panel as HTMLElement).dataset.id === childId &&\r\n !(panel as HTMLElement).classList.contains(\r\n 'apia_panel_falseDiv',\r\n )\r\n ),\r\n )\r\n .findIndex(\r\n (panel) =>\r\n (panel as HTMLElement).dataset.id === childId &&\r\n (panel as HTMLElement).classList.contains(\r\n 'apia_panel_falseDiv',\r\n ),\r\n );\r\n\r\n if (typeof index === 'number' && newSection.dataset.locationid) {\r\n void updatePanelPosition(\r\n childId,\r\n newSection.dataset.locationid,\r\n index + 1,\r\n );\r\n }\r\n }\r\n }\r\n falseDiv.replaceWith(child as Node);\r\n }\r\n }\r\n\r\n DragAndDrop.draggingPanelId = '';\r\n DragAndDrop.panelData = [];\r\n DragAndDrop.drawMinimap();\r\n\r\n DragAndDrop.removePlaceholder();\r\n }\r\n}\r\n","import { getSpecificParent } from '@apia/util';\r\nimport { dragleave } from '../events/Dragleave';\r\nimport { dragover } from '../events/Dragover';\r\nimport { dragstart } from '../events/Dragstart';\r\nimport { Drop } from '../events/Drop';\r\nimport { TPanelData, TSectionData } from '../types';\r\n\r\nexport class DragAndDrop {\r\n #unsuscribers: (() => void)[] = [];\r\n\r\n bootstrap = () => {\r\n this.#unsuscribers.forEach((unsuscribe) => unsuscribe());\r\n this.#unsuscribers = [];\r\n\r\n this.body.addEventListener('dragover', this.dragOver);\r\n this.body.addEventListener('drop', this.drop);\r\n this.#unsuscribers.push(() => {\r\n this.body.removeEventListener('dragover', this.dragOver);\r\n this.body.removeEventListener('drop', this.drop);\r\n });\r\n if (this.splash) {\r\n this.splash.addEventListener('dragleave', this.dragLeave);\r\n this.splash.addEventListener('dragenter', this.dragEnter);\r\n this.body.addEventListener('dragenter', this.dragEnter);\r\n this.#unsuscribers.push(() => {\r\n this.splash.removeEventListener('dragleave', this.dragLeave);\r\n this.splash.removeEventListener('dragenter', this.dragEnter);\r\n this.body.removeEventListener('dragenter', this.dragEnter);\r\n });\r\n }\r\n this.panels.map((el) => {\r\n const dragHandler = (ev: DragEvent) => {\r\n if ((ev.target as HTMLElement).closest('.drag_panel_container')) {\r\n this.dragStart(ev, el);\r\n }\r\n };\r\n (el as HTMLElement).addEventListener('dragstart', dragHandler);\r\n this.#unsuscribers.push(() => {\r\n (el as HTMLElement).removeEventListener('dragstart', dragHandler);\r\n });\r\n return el;\r\n });\r\n };\r\n panelData: TPanelData[] = [];\r\n minimap: HTMLElement | null = null;\r\n drawMinimap() {\r\n return;\r\n }\r\n timeout = -1;\r\n sectionData: TSectionData[] = [];\r\n body = document.querySelector('[data-layout]') as HTMLElement;\r\n splash = document.querySelector('[data-splash]') as HTMLElement;\r\n dragoverPosition: {\r\n x: string | number;\r\n y: string | number;\r\n } = { x: 0, y: 0 };\r\n shadowDivData: TPanelData | null = null;\r\n shadowDiv: HTMLDivElement | null = null;\r\n placeholderImage: HTMLElement | null = null;\r\n panels = [\r\n ...document.querySelectorAll('[data-panel][data-id]'),\r\n ] as HTMLElement[];\r\n currentScroll = document.scrollingElement?.scrollTop ?? 0;\r\n draggingPanel: HTMLElement | null = null;\r\n draggingPanelId = '';\r\n draggingPanelSectionId = '';\r\n currentBottomPanel: TPanelData | undefined = undefined;\r\n\r\n updateMinimap = () => {\r\n const frameElement = document.querySelector<HTMLElement>('.windowFrame');\r\n if (frameElement) {\r\n frameElement.style.top = `${\r\n (document.scrollingElement?.scrollTop ?? 0) *\r\n Number(frameElement.dataset.aspect)\r\n }px`;\r\n }\r\n };\r\n removePlaceholder = () => {\r\n this.clearTimeout();\r\n const falseDivs = document.querySelectorAll('.apia_panel_falseDiv');\r\n\r\n falseDivs.forEach((el) => {\r\n el.remove();\r\n });\r\n\r\n this.placeholderImage?.remove();\r\n this.placeholderImage = null;\r\n };\r\n clearTimeout = () => {\r\n clearTimeout(this.timeout);\r\n };\r\n debounceAppend = (target: HTMLElement, child: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) {\r\n target.appendChild(child);\r\n }\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n target.appendChild(child);\r\n }, 500) as unknown as number;\r\n };\r\n debounceBefore = (reference: Node, child: Node, container: HTMLElement) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) container.insertBefore(child, reference);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n container.insertBefore(child, reference);\r\n }, 500) as unknown as number;\r\n };\r\n debounceAfter = (child: Node, reference: Node) => {\r\n if (!this.draggingPanelId) return;\r\n if (this.timeout === -1) (reference as HTMLElement).after(child);\r\n clearTimeout(this.timeout);\r\n this.timeout = setTimeout(() => {\r\n (reference as HTMLElement).after(child);\r\n }, 500) as unknown as number;\r\n };\r\n dragOver = (event: Event) => {\r\n dragover(event, this);\r\n this.updateMinimap();\r\n };\r\n dragStart = (ev: DragEvent, el: Element) => {\r\n dragstart(ev, el, this);\r\n };\r\n dragLeave = (_ev: Event) => {\r\n dragleave(_ev, this);\r\n };\r\n dragEnter = (_ev: Event) => {\r\n _ev.preventDefault();\r\n };\r\n drop = (event: Event) => {\r\n Drop(event, this);\r\n };\r\n snapshot = () => {\r\n this.panelData = [];\r\n const innerPanels = (this.body as HTMLElement).querySelectorAll(\r\n '[data-panel][data-id]',\r\n );\r\n innerPanels.forEach((panel) => {\r\n if (panel.classList.contains('apia_panel_falseDiv')) {\r\n this.shadowDivData = {\r\n id: panel.getAttribute('data-id') ?? '',\r\n isShadow: true,\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n };\r\n }\r\n if (\r\n this.panelData.every((innerPanel) => {\r\n return (\r\n innerPanel.id !== panel.getAttribute('data-id') &&\r\n !panel.classList.contains('apia_panel_falseDiv')\r\n );\r\n })\r\n ) {\r\n this.panelData.push({\r\n isShadow: panel.classList.contains('apia_panel_falseDiv'),\r\n panelBottom:\r\n panel.getBoundingClientRect().bottom + this.currentScroll,\r\n panelTop: panel.getBoundingClientRect().top + this.currentScroll,\r\n panelRight: panel.getBoundingClientRect().right,\r\n panelLeft: panel.getBoundingClientRect().left,\r\n panelWidth: panel.getBoundingClientRect().width,\r\n panelHeight: panel.getBoundingClientRect().height,\r\n row:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.classList.contains('apia_section_row') ?? false,\r\n sectionId:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n id:\r\n getSpecificParent(\r\n panel as HTMLElement,\r\n (current) => !!current.dataset.id,\r\n )?.dataset.id ?? 0,\r\n });\r\n }\r\n });\r\n this.sectionData = [];\r\n const sections = this.body?.querySelectorAll('[data-locationid]');\r\n\r\n sections?.forEach((sec) => {\r\n if (\r\n this.sectionData.every(\r\n (innerSection) =>\r\n innerSection.sectionId !== sec.getAttribute('data-locationid'),\r\n )\r\n ) {\r\n this.sectionData.push({\r\n sectionBottom:\r\n sec.getBoundingClientRect().bottom + this.currentScroll,\r\n sectionLeft: sec.getBoundingClientRect().left,\r\n sectionTop: sec.getBoundingClientRect().top + this.currentScroll,\r\n sectionRight: sec.getBoundingClientRect().right,\r\n sectionWidth: sec.getBoundingClientRect().width,\r\n sectionHeight: sec.getBoundingClientRect().height,\r\n sectionId:\r\n getSpecificParent(\r\n sec as HTMLElement,\r\n (current) => !!current.dataset.locationid,\r\n )?.dataset.locationid ?? 0,\r\n });\r\n }\r\n });\r\n\r\n this.drawMinimap();\r\n };\r\n findBottomPanel = (x: number, y: number) => {\r\n const bottomPanel = this.panelData.find((panel) => {\r\n return (\r\n panel.panelBottom >= y &&\r\n panel.panelTop <= y &&\r\n panel.panelLeft <= x &&\r\n panel.panelRight >= x\r\n );\r\n });\r\n return bottomPanel;\r\n };\r\n findBottomSection = (x: number, y: number) => {\r\n const bottomSection = this.sectionData.find((sec) => {\r\n return (\r\n sec.sectionBottom >= y &&\r\n sec.sectionTop <= y &&\r\n sec.sectionLeft <= x &&\r\n sec.sectionRight >= x\r\n );\r\n });\r\n return bottomSection;\r\n };\r\n}\r\n","/* 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","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\nimport { importContainer } from '../util';\r\n\r\nexport class Dashboard extends EventEmitter<{\r\n changeScene: string;\r\n}> {\r\n bootstrapper = new DashboardPanelsBootstraper(this);\r\n panels: Record<string, DashboardPanel> | null = null;\r\n 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 let container = this.#PanelContainer;\r\n\r\n const customContainer = current.dataset.panelContainer;\r\n if (customContainer) {\r\n container = importContainer(current.dataset.panelContainer!);\r\n }\r\n\r\n const panel = new DashboardPanel({\r\n dashboard: this,\r\n PanelContainer: container,\r\n id: current.dataset.id as string,\r\n });\r\n\r\n let panelPath = (panel.getParameters().PAR_SPA_PATH as string) || '*';\r\n if (panelPath === '/') panelPath = `/${this.urlContext}`;\r\n if (panelPath !== '*') panel.hide();\r\n else panel.show();\r\n\r\n const paths = panelPath.split(',');\r\n paths.forEach((currentPath) => {\r\n if (!this.scenes[currentPath]) this.scenes[currentPath] = [];\r\n this.scenes[currentPath].push(panel.props.id);\r\n });\r\n\r\n (this.panels as Record<string, DashboardPanel>)[panel.props.id] = panel;\r\n\r\n this.#panelsRenderedPortals.push(panel.portal);\r\n });\r\n\r\n this.#dragAndDrop.bootstrap();\r\n };\r\n\r\n #Context = ({ children }: { children: ReactNode }) => {\r\n return (\r\n <DashboardContext.Provider value={this}>\r\n {children}\r\n </DashboardContext.Provider>\r\n );\r\n };\r\n\r\n #suscribeToEvents = () => {\r\n eventsController.onEvent({ eventType: 'dashboard__focus' }, () => {\r\n Object.values(this.panels ?? {}).forEach((current) => {\r\n if (current.props.refreshOnHome) {\r\n void current.refresh();\r\n }\r\n });\r\n });\r\n };\r\n #usePanelsList = () => {\r\n const [panels, setPanels] = useState<ReactNode>(null);\r\n const deferredPanels = useDeferredValue(panels);\r\n\r\n useMount(() => {\r\n this.loadScene();\r\n setPanels(this.#panelsRenderedPortals);\r\n });\r\n\r\n this.router.useSwitch([\r\n {\r\n route: new RegExp(`(?:/spa)?/(\\\\w+)`),\r\n callback: (result) => {\r\n this.loadScene(result[1]);\r\n },\r\n },\r\n {\r\n route: new RegExp(`/`),\r\n callback: () => {\r\n this.loadScene('/');\r\n },\r\n },\r\n ]);\r\n\r\n return deferredPanels;\r\n };\r\n\r\n constructor(\r\n panelsContainer: PanelContainer = DefaultPanelWrapper,\r\n public urlContext: string,\r\n ) {\r\n super();\r\n\r\n this.#currentScene = `/`;\r\n this.#PanelContainer = panelsContainer ?? this.#PanelContainer;\r\n this.#suscribeToEvents();\r\n }\r\n\r\n #SceneRenderer = () => {\r\n const Context = this.#Context;\r\n const panels = this.#usePanelsList();\r\n\r\n return <Context>{panels}</Context>;\r\n };\r\n\r\n loadScene = (scene: string = this.#currentScene): ReactPortal[] => {\r\n let actualScene = scene;\r\n if (!actualScene.startsWith('/')) actualScene = `/${actualScene}`;\r\n\r\n if (!this.panels) this.#loadPanels();\r\n if (!this.scenes[actualScene]) this.scenes[actualScene] = [];\r\n\r\n this.scenes[this.#currentScene].forEach((scenePanelId) => {\r\n if (!this.scenes[actualScene].includes(scenePanelId))\r\n this.panels?.[scenePanelId]?.hide();\r\n });\r\n this.scenes[actualScene].forEach((scenePanelIds) => {\r\n const panel = this.panels?.[scenePanelIds];\r\n if (panel) {\r\n panel.show();\r\n if (panel.hasInited && panel.props.refreshOnStart) void panel.refresh();\r\n }\r\n });\r\n\r\n this.#currentScene = actualScene;\r\n\r\n return this.#panelsRenderedPortals;\r\n };\r\n\r\n Component = () => {\r\n const R = this.#SceneRenderer;\r\n return <R />;\r\n };\r\n}\r\n","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","import { parametersStore, usePanelParametersSelector } from '../config';\r\nimport { parametersActions } from '../config/parametersStore';\r\n\r\nconst panelActionParameterName = '__panelTitleAction';\r\nconst panelImageParameterName = '__panelImageAction';\r\nconst panelDescriptionParameterName = '__panelTitleDescription';\r\n\r\nexport function setPanelTitleAction(panelId: string, newAction: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelActionParameterName]: newAction },\r\n }),\r\n );\r\n}\r\nexport function setPanelTitleDescritpion(\r\n panelId: string,\r\n newDescription: string,\r\n) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelDescriptionParameterName]: newDescription },\r\n }),\r\n );\r\n}\r\nexport function setPanelImageAction(panelId: string, newImage: string) {\r\n parametersStore.dispatch(\r\n parametersActions.udpate({\r\n panelId,\r\n parameters: { [panelImageParameterName]: newImage },\r\n }),\r\n );\r\n}\r\n\r\nexport function usePanelTitleAction() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelActionParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelImage() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelImageParameterName] as string,\r\n );\r\n}\r\n\r\nexport function usePanelTitleDescription() {\r\n return usePanelParametersSelector(\r\n (current) => current[panelDescriptionParameterName] as string,\r\n );\r\n}\r\n","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 setPanelImageAction,\r\n setPanelTitleAction,\r\n setPanelTitleDescritpion,\r\n} from '../panelsUtil/usePanelTitleAction';\r\nimport { startTransition } from 'react';\r\nimport { TPanelIdentifier } from '../eventsController';\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 } as TPanelIdentifier,\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\r\n setPanelImageAction(panelId, (result?.data?.image as string) ?? '');\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","import { ApiaApi } from '@apia/api';\r\nimport { KeyboardEvent, MouseEvent } from 'react';\r\nimport { firePanelAction } from './firePanelAction';\r\nimport { eventsController, TPanelIdentifier } from '../eventsController';\r\nimport { downloadUrl } from '@apia/util';\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 | 'FIRE_EVENT'\r\n | 'DOWNLOAD';\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 additionalData: 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 panelIdentifier: TPanelIdentifier,\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.additionalData || action.text,\r\n action.action,\r\n );\r\n break;\r\n case 'RUN_ACTION':\r\n firePanelAction(\r\n panelIdentifier.panelId,\r\n action.action,\r\n {},\r\n { requestConfig: { handleLoad: true } },\r\n );\r\n break;\r\n case 'FIRE_EVENT':\r\n eventsController.fireEvent(\r\n panelIdentifier,\r\n action.action,\r\n JSON.parse(action.additionalData),\r\n );\r\n break;\r\n case 'DOWNLOAD':\r\n downloadUrl(action.action);\r\n break;\r\n default:\r\n console.error('Unknown action behavior: ', action);\r\n }\r\n }\r\n }\r\n}\r\n","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","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","import { useCallback } from 'react';\r\nimport { usePanelIdentity } from '../common';\r\nimport { handleAction, TBasicAction } from './basicAction';\r\n\r\nexport const useActionEventHandlers = () => {\r\n const identifier = usePanelIdentity();\r\n\r\n const onClick = useCallback(\r\n (ev: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n return (action: TBasicAction) => {\r\n if (action.actionSource !== 'CLICK') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n const onDoubleClick = useCallback(\r\n (ev: React.MouseEvent<HTMLElement, MouseEvent>) => {\r\n return (action: TBasicAction) => {\r\n if (action.actionSource !== 'DOUBLE_CLICK') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n const onKeyDown = useCallback(\r\n (ev: React.KeyboardEvent<HTMLElement>) => {\r\n return (action: TBasicAction) => {\r\n if (ev.code !== 'Enter') return;\r\n handleAction(identifier, ev, action);\r\n };\r\n },\r\n [identifier],\r\n );\r\n\r\n return { onClick, onDoubleClick, onKeyDown };\r\n};\r\n","import { Icon } from '@apia/icons';\r\nimport { getLabel } from '@apia/util';\r\nimport { usePanelNetworkState } from '../../../actions';\r\n\r\nexport const NetworkState = ({ title }: { title: string }) => {\r\n const isConnected = usePanelNetworkState();\r\n return (\r\n <>\r\n {!isConnected && (\r\n <Icon\r\n tabIndex={0}\r\n title={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n aria-label={\r\n getLabel('lblTestDBNoOk', {\r\n text: {\r\n TOK1: title,\r\n },\r\n }).text\r\n }\r\n name=\"Alert\"\r\n />\r\n )}\r\n </>\r\n );\r\n};\r\n","import { PanelContainer } from '../../types';\r\nimport { NetworkState } from './DefaultPanelWrapper/NetworkState';\r\nimport { usePanelIdentity } from '../../common';\r\nimport { PanelContextProvider, useMakePanelContext } from './PanelContext';\r\nimport { PanelFooter } from './PanelContext/PanelFooter';\r\nimport {\r\n usePanelTitleAction,\r\n usePanelTitleDescription,\r\n} from '../../panelsUtil/usePanelTitleAction';\r\nimport { useDashboardContext } from '../../dashboard/DashboardContext';\r\n\r\nexport const LandingPagePanelWrapper: PanelContainer = ({\r\n children,\r\n ...props\r\n}) => {\r\n const { panelId, panelName, panelType } = usePanelIdentity();\r\n\r\n const { contextValue, title, ref, ...footerProps } =\r\n useMakePanelContext(props);\r\n\r\n const panelTitleAction = usePanelTitleAction();\r\n const panelTitleDescription = usePanelTitleDescription();\r\n\r\n const dashboard = useDashboardContext();\r\n\r\n if (dashboard.getPanel(panelId).props.hasRss)\r\n console.log(dashboard.getPanel(panelId).props);\r\n\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n <div\r\n className=\"panel__container\"\r\n data-panelname={panelName}\r\n data-paneltype={panelType}\r\n data-panelid={panelId}\r\n ref={ref}\r\n >\r\n <div className=\"panel__header\">\r\n <div className=\"panel__header__left\">\r\n {props.showTitle && (\r\n <span className=\"panel__title\">\r\n {panelTitleAction ? (\r\n <a\r\n title={panelTitleDescription}\r\n className=\"panel__title__link\"\r\n href={panelTitleAction}\r\n >\r\n {title}\r\n </a>\r\n ) : (\r\n title\r\n )}\r\n </span>\r\n )}\r\n <NetworkState title={title} />\r\n </div>\r\n </div>\r\n <div className=\"panel__content\">{children}</div>\r\n <PanelFooter isRefreshable={false} {...footerProps} />\r\n </div>\r\n </PanelContextProvider>\r\n );\r\n};\r\n","import { PanelContainer } from '../../../types';\r\nimport { PanelContextProvider, useMakePanelContext } from '../PanelContext';\r\n\r\nexport const EmptyPanelWrapper: PanelContainer = (props) => {\r\n const { contextValue } = useMakePanelContext(props);\r\n\r\n return (\r\n <PanelContextProvider value={contextValue}>\r\n {props.children}\r\n </PanelContextProvider>\r\n );\r\n};\r\n","/* eslint-disable @typescript-eslint/ban-types */\r\n/* eslint-disable @typescript-eslint/no-unsafe-argument */\r\n/* eslint-disable no-restricted-imports */\r\n/* eslint-disable @typescript-eslint/no-explicit-any */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\nimport {\r\n createSlice,\r\n injectReducers,\r\n PayloadAction,\r\n Draft,\r\n SliceCaseReducers,\r\n CaseReducer,\r\n} from '@apia/store';\r\nimport { TPanelId, TPanelType } from '../types';\r\n\r\ntype ValidateSliceCaseReducers<S, ACR extends SliceCaseReducers<S>> = ACR & {\r\n [T in keyof ACR]: ACR[T] extends {\r\n reducer(s: S, action?: infer A): any;\r\n }\r\n ? {\r\n prepare(...a: never[]): Omit<A, 'type'>;\r\n }\r\n : {};\r\n};\r\n\r\nexport type TPanelsSliceState = Record<string, Record<string, unknown>>;\r\n\r\nexport type TReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = ValidateSliceCaseReducers<State, CR>;\r\n\r\ntype TPanelsReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n> = Record<string, TReducers<State, CR>>;\r\n\r\n/**\r\n * Los updaters son funciones que permiten modificar la forma en la que un\r\n * panel modifica su estado, se puede pensar como un análogo del reducer\r\n *\r\n * {\r\n * panelTypeA: {\r\n * updaterA: (state, data) => { ...update panel store },\r\n * updaterB: (state, data) => { ...update panel store },\r\n * }\r\n * }\r\n */\r\nexport const reducers: TPanelsReducers<Record<string, unknown>> = {};\r\n\r\nexport function initPanelTypeUpdater(panelType: TPanelType) {\r\n if (!reducers[panelType]) {\r\n reducers[panelType] = {\r\n defaultReducer: (\r\n panelsState,\r\n payload: PayloadAction<{ name: string }>,\r\n ) => {\r\n Object.assign(panelsState, payload);\r\n },\r\n };\r\n }\r\n}\r\n\r\n/**\r\n * Permite registrar nuevas formas de actualizar el estado de un tipo de panel\r\n */\r\nexport function registerReducers<\r\n State = any,\r\n CR extends SliceCaseReducers<State> = SliceCaseReducers<State>,\r\n>(panelType: TPanelType, newReducers: TReducers<State, CR>) {\r\n initPanelTypeUpdater(panelType);\r\n Object.assign(reducers[panelType], newReducers);\r\n}\r\n\r\nexport function initPanelState(\r\n state: Draft<TPanelsSliceState>,\r\n panelType: TPanelType,\r\n panelId: TPanelId,\r\n initialState: any,\r\n) {\r\n if (!state[panelType]) {\r\n state[panelType] = {};\r\n }\r\n if (!state[panelType][panelId]) state[panelType][panelId] = {};\r\n state[panelType][panelId] = initialState;\r\n}\r\n\r\nexport const panelsSlice = createSlice({\r\n name: 'panelsSlice',\r\n initialState: {} as TPanelsSliceState,\r\n reducers: {\r\n initState(\r\n state,\r\n {\r\n payload: { panelId, panelType, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // reducer will be used to customize the way the slice is updated\r\n initialState: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState);\r\n state[panelType][panelId] = initialState;\r\n }\r\n },\r\n updatePanelStore(\r\n state,\r\n {\r\n payload: { data, panelId, panelType, reducer, initialState },\r\n }: PayloadAction<{\r\n panelType: TPanelType;\r\n panelId: TPanelId;\r\n reducer?: string; // Updater will be used to customize the way the slice is updated\r\n data: any;\r\n initialState?: any;\r\n }>,\r\n ) {\r\n if (!state[panelType]?.[panelId]) {\r\n initPanelState(state, panelType, panelId, initialState ?? {});\r\n }\r\n const panelsStore = state[panelType][panelId];\r\n initPanelTypeUpdater(panelType);\r\n\r\n if (!reducers[panelType][reducer ?? 'default']) {\r\n return;\r\n }\r\n\r\n const currentReducer = reducers[panelType][\r\n reducer ?? 'default'\r\n ] as CaseReducer;\r\n currentReducer(panelsStore, data);\r\n },\r\n },\r\n});\r\n\r\nexport const { useSelector: usePanelStoreSelector, store: panelsStore } =\r\n injectReducers({\r\n panelsSlice: panelsSlice.reducer,\r\n });\r\n\r\nexport const panelsActions = panelsSlice.actions;\r\n","import { shallowEqual } from '@apia/store';\r\nimport { useRef, useState } from 'react';\r\nimport { TPanelName, TPanelType } from '../types';\r\nimport { panelsStore, usePanelStoreSelector } from './panelsStore';\r\nimport { usePanelIdentity } from '../common';\r\n\r\nexport const undefinedObject = {};\r\n\r\n/**\r\n * Permite escuchar el store de un panel al igual que se haría con un\r\n * useSelector de redux.\r\n *\r\n * @param selector Una función selectora que recibe el estado del panel y devuelve la selección deseada\r\n * @param comparator Opcionalmente se puede pasar un comparador para determinar si el estado debe actualizarse o no, dependiendo de la selección actual y la selección previa. Por defecto se usa shallowEqual de redux.\r\n * @returns La selección determinada en el selector, siempre que haya cambiado de acuerdo al comparador.\r\n *\r\n * @example\r\n *\r\n import { TRecordsPanelStore } from '..../recordsPanel';\r\n\r\n // Assume TRecordsPanelStore = { peopleNames: string[] }\r\n\r\n const firstName = usePanelSelector<TRecordsPanelStore>(\r\n 'RecordsPanel',\r\n 'RecordThisYear',\r\n (state) => { return state.peopleNames[0] }\r\n );\r\n */\r\nexport function usePanelSelector<StoreType, Selected>(\r\n panelType: TPanelType,\r\n panelName: TPanelName,\r\n initialState: StoreType,\r\n selector: (state: StoreType) => Selected,\r\n comparator: (a: Selected, b: Selected) => boolean = shallowEqual,\r\n): Selected {\r\n const { panelId } = usePanelIdentity();\r\n if (!panelId) throw new Error(`Cannot find panel with name ${panelName}`);\r\n\r\n const storeState = panelsStore.getState().panelsSlice[panelType];\r\n const [selection, setSelection] = useState<Selected>(\r\n initialState\r\n ? selector((storeState?.[panelId] as StoreType) ?? initialState)\r\n : ({} as Selected),\r\n );\r\n\r\n const previousSelected = useRef<Selected>(\r\n selection ?? (undefinedObject as Selected),\r\n );\r\n\r\n usePanelStoreSelector((global) => {\r\n const newState = global.panelsSlice[panelType]?.[panelId] as\r\n | StoreType\r\n | undefined;\r\n if (newState !== undefined) {\r\n const newSelected = selector(newState);\r\n if (\r\n previousSelected.current === undefinedObject ||\r\n !comparator(previousSelected.current as Selected, newSelected)\r\n ) {\r\n previousSelected.current = newSelected;\r\n setSelection(newSelected);\r\n }\r\n }\r\n });\r\n\r\n return selection;\r\n}\r\n","/* 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":["__publicField","parametersStore","__privateAdd","__privateGet","__privateSet","Error","PanelContainer","DragAndDrop","bottomPanel","draggingPanel","bottomSection","result","useParametersSelector","panelsStore","shallowEqual"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@apia/dashboard-controller",
3
- "version": "4.0.43",
3
+ "version": "4.0.45",
4
4
  "sideEffects": false,
5
5
  "author": "Alexis Leite <alexisleite@live.com>",
6
6
  "main": "dist/index.js",
@@ -15,12 +15,12 @@
15
15
  "libWatchForDashboards": "rollup --watch --config ../../config/rollup.common.mjs --environment MODE:development,ENTRY:index.ts,WATCH:true,DEV_SERVER_MODULE:dashboards"
16
16
  },
17
17
  "dependencies": {
18
- "@apia/api": "^4.0.43",
19
- "@apia/components": "^4.0.43",
20
- "@apia/icons": "^4.0.43",
21
- "@apia/store": "^4.0.43",
22
- "@apia/theme": "^4.0.43",
23
- "@apia/util": "^4.0.43",
18
+ "@apia/api": "^4.0.45",
19
+ "@apia/components": "^4.0.45",
20
+ "@apia/icons": "^4.0.45",
21
+ "@apia/store": "^4.0.45",
22
+ "@apia/theme": "^4.0.45",
23
+ "@apia/util": "^4.0.45",
24
24
  "@reduxjs/toolkit": "^1.9.3",
25
25
  "react-redux": "^8.0.5"
26
26
  },
@@ -39,5 +39,5 @@
39
39
  "access": "public",
40
40
  "registry": "https://registry.npmjs.org/"
41
41
  },
42
- "gitHead": "f4c40b69ba514626379ac45021c254ad661826f1"
42
+ "gitHead": "1b035d1b515ceb49207373a4fafcf0ff465bc439"
43
43
  }