@elementspanel/panel 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/app.js +3940 -180
- package/app.js.map +1 -1
- package/package.json +18 -18
- package/public/assets/{AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js → AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js} +2 -2
- package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-e6e38e8b.js.map +1 -0
- package/public/assets/CardPanel-59b7da2e.js +2 -0
- package/public/assets/CardPanel-59b7da2e.js.map +1 -0
- package/public/assets/{DesktopDialog-081410ca.js → DesktopDialog-e4041e4e.js} +2 -2
- package/public/assets/DesktopDialog-e4041e4e.js.map +1 -0
- package/public/assets/{Loading.vue_vue_type_script_setup_true_lang-9e79de95.js → Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js} +2 -2
- package/public/assets/Loading.vue_vue_type_script_setup_true_lang-1b74dd54.js.map +1 -0
- package/public/assets/{PageToolbar-5ca1a069.js → PageToolbar-7130e13d.js} +2 -2
- package/public/assets/PageToolbar-7130e13d.js.map +1 -0
- package/public/assets/{_elements-sdk_pinia-fc8ba898.js → _elements-sdk_pinia-2c56d2c1.js} +3 -3
- package/public/assets/{_elements-sdk_pinia-fc8ba898.js.map → _elements-sdk_pinia-2c56d2c1.js.map} +1 -1
- package/public/assets/{_elements-sdk_vue-b86b0db6.js → _elements-sdk_vue-80f42d87.js} +2 -2
- package/public/assets/_elements-sdk_vue-80f42d87.js.map +1 -0
- package/public/assets/{_elements-sdk_vue-i18n-64f8e172.js → _elements-sdk_vue-i18n-4b8a106a.js} +2 -2
- package/public/assets/_elements-sdk_vue-i18n-4b8a106a.js.map +1 -0
- package/public/assets/{_elements-sdk_vue-router-a62f518d.js → _elements-sdk_vue-router-a171591a.js} +2 -2
- package/public/assets/_elements-sdk_vue-router-a171591a.js.map +1 -0
- package/public/assets/{const-cfe7ddfe.js → const-93b324c0.js} +2 -2
- package/public/assets/const-93b324c0.js.map +1 -0
- package/public/assets/{const-01673e6b.js → const-ea30795c.js} +2 -2
- package/public/assets/const-ea30795c.js.map +1 -0
- package/public/assets/{context-b16af9cc.js → context-cc90576e.js} +2 -2
- package/public/assets/{context-b16af9cc.js.map → context-cc90576e.js.map} +1 -1
- package/public/assets/{copy-4d64fc1f.js → copy-b106bb10.js} +2 -2
- package/public/assets/copy-b106bb10.js.map +1 -0
- package/public/assets/{core-b6992169.js → core-d3bfdede.js} +2 -2
- package/public/assets/core-d3bfdede.js.map +1 -0
- package/public/assets/{desktopNotice-2c886f6b.js → desktopNotice-5ca3448c.js} +2 -2
- package/public/assets/desktopNotice-5ca3448c.js.map +1 -0
- package/public/assets/dom-ff483262.js.map +1 -1
- package/public/assets/{i18n-fe0f1ee7.js → i18n-e810b9fa.js} +2 -2
- package/public/assets/i18n-e810b9fa.js.map +1 -0
- package/public/assets/{index-76b0df52.js → index-6e8d74f8.js} +2 -2
- package/public/assets/{index-76b0df52.js.map → index-6e8d74f8.js.map} +1 -1
- package/public/assets/index-e3f35709.js.map +1 -1
- package/public/assets/{instance-26cca4c8.js → instance-cc59e210.js} +2 -2
- package/public/assets/instance-cc59e210.js.map +1 -0
- package/public/assets/lodash-001e4f93.js.map +1 -1
- package/public/assets/{nodes-402cdcbd.js → nodes-a56b1b35.js} +2 -2
- package/public/assets/nodes-a56b1b35.js.map +1 -0
- package/public/assets/protocol-97f7bab7.js.map +1 -1
- package/public/assets/randId-56f93901.js +2 -0
- package/public/assets/randId-56f93901.js.map +1 -0
- package/public/assets/{router-0f7d4714.js → router-eff205cc.js} +2 -2
- package/public/assets/router-eff205cc.js.map +1 -0
- package/public/assets/safe-87846d89.js.map +1 -1
- package/public/assets/{sdk-01dda668.js → sdk-3f2277ab.js} +2 -2
- package/public/assets/sdk-3f2277ab.js.map +1 -0
- package/public/assets/{shared-f2e37690.js → shared-597ef52b.js} +2 -2
- package/public/assets/shared-597ef52b.js.map +1 -0
- package/public/assets/{useAppConfigStore-289073ec.js → useAppConfigStore-352fe033.js} +2 -2
- package/public/assets/useAppConfigStore-352fe033.js.map +1 -0
- package/public/assets/useAppRouters-747b627a.js +2 -0
- package/public/assets/useAppRouters-747b627a.js.map +1 -0
- package/public/assets/{useAppStateStore-a644582a.js → useAppStateStore-a438b9a6.js} +2 -2
- package/public/assets/useAppStateStore-a438b9a6.js.map +1 -0
- package/public/assets/{useAppToolsStore-3a911226.js → useAppToolsStore-288c4fe8.js} +2 -2
- package/public/assets/useAppToolsStore-288c4fe8.js.map +1 -0
- package/public/assets/{useDefineApi-ead2616e.js → useDefineApi-b726db1e.js} +2 -2
- package/public/assets/useDefineApi-b726db1e.js.map +1 -0
- package/public/assets/{useInstanceActionAvailability-dec16c10.js → useInstanceActionAvailability-16de3001.js} +2 -2
- package/public/assets/useInstanceActionAvailability-16de3001.js.map +1 -0
- package/public/assets/{useKeyboardEvents-dba9d5ca.js → useKeyboardEvents-6f7f845c.js} +2 -2
- package/public/assets/useKeyboardEvents-6f7f845c.js.map +1 -0
- package/public/assets/{useMountComponent-dd1fcfea.js → useMountComponent-4043cb4c.js} +2 -2
- package/public/assets/useMountComponent-4043cb4c.js.map +1 -0
- package/public/assets/{useOverviewChart-119bda3b.js → useOverviewChart-7d758bc4.js} +2 -2
- package/public/assets/useOverviewChart-7d758bc4.js.map +1 -0
- package/public/assets/{useOverviewInfo-a149d634.js → useOverviewInfo-9ca25ab9.js} +2 -2
- package/public/assets/useOverviewInfo-9ca25ab9.js.map +1 -0
- package/public/assets/{usePolling-f2f09d27.js → usePolling-1bc2009b.js} +2 -2
- package/public/assets/usePolling-1bc2009b.js.map +1 -0
- package/public/assets/{useScreen-e3715e1f.js → useScreen-fad29b7c.js} +2 -2
- package/public/assets/useScreen-fad29b7c.js.map +1 -0
- package/public/assets/{useSocketIo-bc0a62c2.js → useSocketIo-ea3c9a61.js} +2 -2
- package/public/assets/useSocketIo-ea3c9a61.js.map +1 -0
- package/public/assets/{useThemeSwitch-6ff90248.js → useThemeSwitch-dc70883c.js} +2 -2
- package/public/assets/useThemeSwitch-dc70883c.js.map +1 -0
- package/public/assets/{vue-2433bd89.js → vue-6b52a630.js} +2 -2
- package/public/assets/{vue-2433bd89.js.map → vue-6b52a630.js.map} +1 -1
- package/public/assets/{vuetifyModal-49cb95ba.js → vuetifyModal-8382b175.js} +2 -2
- package/public/assets/vuetifyModal-8382b175.js.map +1 -0
- package/public/index.html +4 -4
- package/public/stats.html +2 -2
- package/runtime/npm-plugins.cjs +42 -11
- package/runtime/plugin-resolution.cjs +27 -9
- package/public/assets/AppDialog.vue_vue_type_style_index_0_lang-8b56f871.js.map +0 -1
- package/public/assets/CardPanel-a704f146.js +0 -2
- package/public/assets/CardPanel-a704f146.js.map +0 -1
- package/public/assets/DesktopDialog-081410ca.js.map +0 -1
- package/public/assets/Loading.vue_vue_type_script_setup_true_lang-9e79de95.js.map +0 -1
- package/public/assets/PageToolbar-5ca1a069.js.map +0 -1
- package/public/assets/_elements-sdk_vue-b86b0db6.js.map +0 -1
- package/public/assets/_elements-sdk_vue-i18n-64f8e172.js.map +0 -1
- package/public/assets/_elements-sdk_vue-router-a62f518d.js.map +0 -1
- package/public/assets/const-01673e6b.js.map +0 -1
- package/public/assets/const-cfe7ddfe.js.map +0 -1
- package/public/assets/copy-4d64fc1f.js.map +0 -1
- package/public/assets/core-b6992169.js.map +0 -1
- package/public/assets/desktopNotice-2c886f6b.js.map +0 -1
- package/public/assets/i18n-fe0f1ee7.js.map +0 -1
- package/public/assets/instance-26cca4c8.js.map +0 -1
- package/public/assets/nodes-402cdcbd.js.map +0 -1
- package/public/assets/randId-ed0b95b7.js +0 -2
- package/public/assets/randId-ed0b95b7.js.map +0 -1
- package/public/assets/router-0f7d4714.js.map +0 -1
- package/public/assets/sdk-01dda668.js.map +0 -1
- package/public/assets/shared-f2e37690.js.map +0 -1
- package/public/assets/useAppConfigStore-289073ec.js.map +0 -1
- package/public/assets/useAppRouters-5f58db32.js +0 -2
- package/public/assets/useAppRouters-5f58db32.js.map +0 -1
- package/public/assets/useAppStateStore-a644582a.js.map +0 -1
- package/public/assets/useAppToolsStore-3a911226.js.map +0 -1
- package/public/assets/useDefineApi-ead2616e.js.map +0 -1
- package/public/assets/useInstanceActionAvailability-dec16c10.js.map +0 -1
- package/public/assets/useKeyboardEvents-dba9d5ca.js.map +0 -1
- package/public/assets/useMountComponent-dd1fcfea.js.map +0 -1
- package/public/assets/useOverviewChart-119bda3b.js.map +0 -1
- package/public/assets/useOverviewInfo-a149d634.js.map +0 -1
- package/public/assets/usePolling-f2f09d27.js.map +0 -1
- package/public/assets/useScreen-e3715e1f.js.map +0 -1
- package/public/assets/useSocketIo-bc0a62c2.js.map +0 -1
- package/public/assets/useThemeSwitch-6ff90248.js.map +0 -1
- package/public/assets/vuetifyModal-49cb95ba.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useOverviewInfo-a149d634.js","sources":["../../../panel/plugins/console/src/hooks/useOverviewInfo.ts"],"sourcesContent":["import { overviewInfo } from \"@/services/apis\";\nimport { computed, type Ref } from \"vue\";\nimport { usePolling } from \"./usePolling\";\n\nexport interface ComputedOverviewResponse extends IPanelOverviewResponse {\n totalInstance: number;\n runningInstance: number;\n cpu: number;\n mem: number;\n remote: ComputedNodeInfo[];\n}\n\nexport interface ComputedNodeInfo extends IPanelOverviewRemoteResponse {\n platformText?: string;\n cpuInfo?: string;\n instanceStatus?: string;\n memText?: string;\n cpuChartData?: number[];\n memChartData?: number[];\n brand?: string;\n}\n\nfunction computeResponseData(v: Ref<IPanelOverviewResponse | undefined>) {\n if (!v.value) return undefined;\n const currentState = { ...v.value } as ComputedOverviewResponse;\n\n let totalInstance = 0;\n let runningInstance = 0;\n for (const iterator of currentState.remote || []) {\n if (iterator.instance) {\n totalInstance += iterator.instance.total;\n runningInstance += iterator.instance.running;\n }\n }\n\n currentState.totalInstance = totalInstance;\n currentState.runningInstance = runningInstance;\n\n let cpu = Number(currentState.system.cpu * 100).toFixed(0);\n const totalMemory = currentState.system.totalmem;\n const usedMemory = totalMemory ? (1 - currentState.system.freemem / totalMemory) * 100 : 0;\n const mem = Math.min(100, Math.max(0, usedMemory)).toFixed(0);\n\n currentState.cpu = Number(cpu);\n currentState.mem = Number(mem);\n\n const newNodes = v.value.remote?.map((node) => ({ ...node })) as ComputedNodeInfo[] | undefined;\n currentState.remote = newNodes ?? [];\n if (newNodes) {\n for (let node of newNodes) {\n if (!node.system) continue;\n const free = Number(node.system.freemem / 1024 / 1024 / 1024).toFixed(1);\n const total = Number(node.system.totalmem / 1024 / 1024 / 1024).toFixed(1);\n const used = Number(Number(total) - Number(free)).toFixed(1);\n node.platformText =\n node?.system?.platform == \"win32\" ? \"windows\" : node?.system?.platform || \"--\";\n node.instanceStatus = node.instance ? `${node.instance.running} / ${node.instance.total}` : \"--\";\n node.cpuInfo = `${Number(node.system.cpuUsage * 100).toFixed(1)}%`;\n node.memText = `${used}G / ${total}G`;\n node.cpuChartData = node.cpuMemChart?.map((v) => v.cpu) ?? [];\n node.memChartData = node.cpuMemChart?.map((v) => v.mem) ?? [];\n }\n }\n return currentState;\n}\n\nexport function useOverviewInfo({ poll = true }: { poll?: boolean } = {}) {\n const result = overviewInfo();\n const newState = computed(() => computeResponseData(result.state));\n\n const refresh = async (forceRequest = false) => {\n await result.execute({ forceRequest });\n return newState.value;\n };\n\n if (poll) usePolling(refresh, 3000);\n\n return {\n ...result,\n state: newState,\n refresh,\n execute: null\n };\n}\n"],"names":["computeResponseData","v","currentState","totalInstance","runningInstance","iterator","cpu","totalMemory","usedMemory","mem","newNodes","_a","node","free","total","used","_b","_c","_d","_e","useOverviewInfo","poll","result","overviewInfo","newState","computed","refresh","forceRequest","usePolling"],"mappings":"sIAsBA,SAASA,EAAoBC,EAA4C,eACvE,GAAI,CAACA,EAAE,MAAc,OACrB,MAAMC,EAAe,CAAE,GAAGD,EAAE,KAAM,EAElC,IAAIE,EAAgB,EAChBC,EAAkB,EACtB,UAAWC,KAAYH,EAAa,QAAU,CAAA,EACxCG,EAAS,WACXF,GAAiBE,EAAS,SAAS,MACnCD,GAAmBC,EAAS,SAAS,SAIzCH,EAAa,cAAgBC,EAC7BD,EAAa,gBAAkBE,EAE3B,IAAAE,EAAM,OAAOJ,EAAa,OAAO,IAAM,GAAG,EAAE,QAAQ,CAAC,EACnD,MAAAK,EAAcL,EAAa,OAAO,SAClCM,EAAaD,GAAe,EAAIL,EAAa,OAAO,QAAUK,GAAe,IAAM,EACnFE,EAAM,KAAK,IAAI,IAAK,KAAK,IAAI,EAAGD,CAAU,CAAC,EAAE,QAAQ,CAAC,EAE/CN,EAAA,IAAM,OAAOI,CAAG,EAChBJ,EAAA,IAAM,OAAOO,CAAG,EAEvB,MAAAC,GAAWC,EAAAV,EAAE,MAAM,SAAR,YAAAU,EAAgB,IAAKC,IAAU,CAAE,GAAGA,CAAO,IAE5D,GADaV,EAAA,OAASQ,GAAY,GAC9BA,EACF,QAASE,KAAQF,EAAU,CACzB,GAAI,CAACE,EAAK,OAAQ,SACZ,MAAAC,EAAO,OAAOD,EAAK,OAAO,QAAU,KAAO,KAAO,IAAI,EAAE,QAAQ,CAAC,EACjEE,EAAQ,OAAOF,EAAK,OAAO,SAAW,KAAO,KAAO,IAAI,EAAE,QAAQ,CAAC,EACnEG,EAAO,OAAO,OAAOD,CAAK,EAAI,OAAOD,CAAI,CAAC,EAAE,QAAQ,CAAC,EACtDD,EAAA,eACHI,EAAAJ,GAAA,YAAAA,EAAM,SAAN,YAAAI,EAAc,WAAY,QAAU,YAAYC,EAAAL,GAAA,YAAAA,EAAM,SAAN,YAAAK,EAAc,WAAY,KACvEL,EAAA,eAAiBA,EAAK,SAAW,GAAGA,EAAK,SAAS,OAAO,MAAMA,EAAK,SAAS,KAAK,GAAK,KACvFA,EAAA,QAAU,GAAG,OAAOA,EAAK,OAAO,SAAW,GAAG,EAAE,QAAQ,CAAC,CAAC,IAC/DA,EAAK,QAAU,GAAGG,CAAI,OAAOD,CAAK,IAC7BF,EAAA,eAAeM,EAAAN,EAAK,cAAL,YAAAM,EAAkB,IAAKjB,GAAMA,EAAE,OAAQ,GACtDW,EAAA,eAAeO,EAAAP,EAAK,cAAL,YAAAO,EAAkB,IAAKlB,GAAMA,EAAE,OAAQ,EAC7D,CAEK,OAAAC,CACT,CAEO,SAASkB,EAAgB,CAAE,KAAAC,EAAO,EAAK,EAAwB,CAAA,EAAI,CACxE,MAAMC,EAASC,IACTC,EAAWC,EAAS,IAAMzB,EAAoBsB,EAAO,KAAK,CAAC,EAE3DI,EAAU,MAAOC,EAAe,MACpC,MAAML,EAAO,QAAQ,CAAE,aAAAK,CAAc,CAAA,EAC9BH,EAAS,OAGd,OAAAH,GAAMO,EAAWF,EAAS,GAAI,EAE3B,CACL,GAAGJ,EACH,MAAOE,EACP,QAAAE,EACA,QAAS,IAAA,CAEb"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"usePolling-f2f09d27.js","sources":["../../../panel/plugins/console/src/hooks/usePolling.ts"],"sourcesContent":["import { onMounted, onUnmounted } from \"vue\";\n\n/** Run once on mount, then wait between completed requests when an interval is supplied. */\nexport function usePolling(refresh: () => Promise<unknown>, interval?: number) {\n let disposed = false;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const poll = async () => {\n try {\n await refresh();\n } catch (error) {\n console.error(\"Polling request failed:\", error);\n } finally {\n if (!disposed && interval !== undefined) timer = setTimeout(poll, interval);\n }\n };\n\n onMounted(poll);\n onUnmounted(() => {\n disposed = true;\n clearTimeout(timer);\n });\n}\n"],"names":["usePolling","refresh","interval","disposed","timer","poll","error","onMounted","onUnmounted"],"mappings":"+CAGgB,SAAAA,EAAWC,EAAiCC,EAAmB,CAC7E,IAAIC,EAAW,GACXC,EAEJ,MAAMC,EAAO,SAAY,CACnB,GAAA,CACF,MAAMJ,EAAQ,QACPK,EAAO,CACN,QAAA,MAAM,0BAA2BA,CAAK,CAAA,QAC9C,CACI,CAACH,GAAYD,IAAa,SAAmBE,EAAA,WAAWC,EAAMH,CAAQ,EAC5E,CAAA,EAGFK,EAAUF,CAAI,EACdG,EAAY,IAAM,CACLL,EAAA,GACX,aAAaC,CAAK,CAAA,CACnB,CACH"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useScreen-e3715e1f.js","sources":["../../../panel/plugins/console/src/hooks/useScreen.ts"],"sourcesContent":["import { onMounted, onUnmounted, ref } from \"vue\";\n\nexport function useScreen() {\n const isPhone = ref(false);\n\n const mediaQuery = window.matchMedia(\"(max-width: 992px)\");\n\n const fn = (e: MediaQueryListEvent) => (isPhone.value = e.matches);\n\n onMounted(() => {\n isPhone.value = mediaQuery.matches;\n mediaQuery.addEventListener(\"change\", fn);\n });\n\n onUnmounted(() => {\n mediaQuery.removeEventListener(\"change\", fn);\n });\n\n return { isPhone };\n}\n"],"names":["useScreen","isPhone","ref","mediaQuery","fn","e","onMounted","onUnmounted"],"mappings":"uDAEO,SAASA,GAAY,CACpB,MAAAC,EAAUC,EAAI,EAAK,EAEnBC,EAAa,OAAO,WAAW,oBAAoB,EAEnDC,EAAMC,GAA4BJ,EAAQ,MAAQI,EAAE,QAE1D,OAAAC,EAAU,IAAM,CACdL,EAAQ,MAAQE,EAAW,QAChBA,EAAA,iBAAiB,SAAUC,CAAE,CAAA,CACzC,EAEDG,EAAY,IAAM,CACLJ,EAAA,oBAAoB,SAAUC,CAAE,CAAA,CAC5C,EAEM,CAAE,QAAAH,CAAQ,CACnB"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useSocketIo-bc0a62c2.js","sources":["../../../panel/plugins/console/src/hooks/useSocketIo.ts"],"sourcesContent":["import { mapDaemonAddress, parseForwardAddress } from \"@/tools/protocol\";\nimport { removeTrail } from \"@/tools/string\";\nimport type { DefaultEventsMap } from \"@socket.io/component-emitter\";\nimport type { Socket } from \"socket.io-client\";\nimport { io } from \"socket.io-client\";\nimport { onScopeDispose, ref } from \"vue\";\nimport type { ComputedNodeInfo } from \"./useOverviewInfo\";\n\n// eslint-disable-next-line no-unused-vars\nexport enum SocketStatus {\n // eslint-disable-next-line no-unused-vars\n Connected = 1,\n // eslint-disable-next-line no-unused-vars\n Connecting = 2,\n // eslint-disable-next-line no-unused-vars\n Error = 0\n}\n\nexport function makeSocketIo(addr: string, prefix?: string) {\n prefix = removeTrail((prefix ?? \"\").trim(), \"/\");\n return io(parseForwardAddress(addr, \"ws\"), {\n path: prefix + \"/socket.io\",\n multiplex: false,\n reconnectionDelayMax: 1000 * 10,\n timeout: 1000 * 30,\n reconnection: true,\n reconnectionAttempts: 3,\n rejectUnauthorized: false\n });\n}\n\nexport function testSocketConnection(addr: string, prefix?: string, signal?: AbortSignal) {\n return new Promise<Socket<DefaultEventsMap, DefaultEventsMap>>((resolve, reject) => {\n if (signal?.aborted) return reject(new Error(\"Socket connection test cancelled\"));\n const socket = makeSocketIo(addr, prefix);\n const cleanup = () => {\n socket.off(\"connect\", connected);\n socket.off(\"connect_error\", failed);\n signal?.removeEventListener(\"abort\", cancelled);\n socket.disconnect();\n };\n const connected = () => {\n cleanup();\n resolve(socket);\n };\n const failed = (error: Error) => {\n cleanup();\n reject(error);\n };\n const cancelled = () => failed(new Error(\"Socket connection test cancelled\"));\n socket.once(\"connect\", connected);\n socket.once(\"connect_error\", failed);\n signal?.addEventListener(\"abort\", cancelled, { once: true });\n });\n}\n\nexport function useSocketIoClient() {\n let controller: AbortController | undefined;\n const socketStatus = ref<SocketStatus>(SocketStatus.Connecting);\n\n onScopeDispose(() => controller?.abort());\n\n const testFrontendSocket = async (remoteNode?: Partial<ComputedNodeInfo>) => {\n controller?.abort();\n const current = (controller = new AbortController());\n const nodeCfg = remoteNode;\n\n if (!nodeCfg?.available || !nodeCfg.ip) {\n socketStatus.value = SocketStatus.Error;\n } else {\n try {\n socketStatus.value = SocketStatus.Connecting;\n let addr = `${nodeCfg.ip}:${nodeCfg.port}`,\n prefix = nodeCfg.prefix;\n if (nodeCfg.remoteMappings) {\n const mapped = mapDaemonAddress(\n nodeCfg.remoteMappings.map((entry) => ({\n from: {\n addr: `${entry.from.ip}:${entry.from.port}`,\n prefix: entry.from.prefix\n },\n to: {\n addr: `${entry.to.ip}:${entry.to.port}`,\n prefix: entry.to.prefix\n }\n }))\n );\n if (mapped) {\n addr = mapped.addr;\n prefix = mapped.prefix;\n }\n }\n await testSocketConnection(addr, prefix, current.signal);\n if (!current.signal.aborted) socketStatus.value = SocketStatus.Connected;\n } catch (error) {\n if (current.signal.aborted) return;\n console.error(\"Socket error: \", error);\n socketStatus.value = SocketStatus.Error;\n }\n }\n };\n\n const testConnect = (addr: string, prefix?: string) => {\n controller?.abort();\n controller = new AbortController();\n return testSocketConnection(addr, prefix, controller.signal);\n };\n\n return { testConnect, testFrontendSocket, socketStatus };\n}\n"],"names":["SocketStatus","makeSocketIo","addr","prefix","removeTrail","io","parseForwardAddress","testSocketConnection","signal","resolve","reject","socket","cleanup","connected","failed","cancelled","error","useSocketIoClient","controller","socketStatus","ref","onScopeDispose","remoteNode","current","nodeCfg","mapped","mapDaemonAddress","entry"],"mappings":"sIASY,IAAAA,GAAAA,IAEVA,EAAAA,EAAA,UAAY,CAAZ,EAAA,YAEAA,EAAAA,EAAA,WAAa,CAAb,EAAA,aAEAA,EAAAA,EAAA,MAAQ,CAAR,EAAA,QANUA,IAAAA,GAAA,CAAA,CAAA,EASI,SAAAC,EAAaC,EAAcC,EAAiB,CAC1D,OAAAA,EAASC,GAAaD,GAAU,IAAI,KAAA,EAAQ,GAAG,EACxCE,EAAGC,EAAoBJ,EAAM,IAAI,EAAG,CACzC,KAAMC,EAAS,aACf,UAAW,GACX,qBAAsB,IAAO,GAC7B,QAAS,IAAO,GAChB,aAAc,GACd,qBAAsB,EACtB,mBAAoB,EAAA,CACrB,CACH,CAEgB,SAAAI,EAAqBL,EAAcC,EAAiBK,EAAsB,CACxF,OAAO,IAAI,QAAoD,CAACC,EAASC,IAAW,CAClF,GAAIF,GAAA,MAAAA,EAAQ,QAAS,OAAOE,EAAO,IAAI,MAAM,kCAAkC,CAAC,EAC1E,MAAAC,EAASV,EAAaC,EAAMC,CAAM,EAClCS,EAAU,IAAM,CACbD,EAAA,IAAI,UAAWE,CAAS,EACxBF,EAAA,IAAI,gBAAiBG,CAAM,EAC1BN,GAAA,MAAAA,EAAA,oBAAoB,QAASO,GACrCJ,EAAO,WAAW,CAAA,EAEdE,EAAY,IAAM,CACdD,IACRH,EAAQE,CAAM,CAAA,EAEVG,EAAUE,GAAiB,CACvBJ,IACRF,EAAOM,CAAK,CAAA,EAERD,EAAY,IAAMD,EAAO,IAAI,MAAM,kCAAkC,CAAC,EACrEH,EAAA,KAAK,UAAWE,CAAS,EACzBF,EAAA,KAAK,gBAAiBG,CAAM,EACnCN,GAAA,MAAAA,EAAQ,iBAAiB,QAASO,EAAW,CAAE,KAAM,IAAM,CAC5D,CACH,CAEO,SAASE,GAAoB,CAC9B,IAAAC,EACE,MAAAC,EAAeC,EAAkB,GAExB,OAAAC,EAAA,IAAMH,GAAA,YAAAA,EAAY,OAAO,EAgDjC,CAAE,YANW,CAAChB,EAAcC,KACjCe,GAAA,MAAAA,EAAY,QACZA,EAAa,IAAI,gBACVX,EAAqBL,EAAMC,EAAQe,EAAW,MAAM,GAGvC,mBA9CK,MAAOI,GAA2C,CAC3EJ,GAAA,MAAAA,EAAY,QACN,MAAAK,EAAWL,EAAa,IAAI,gBAC5BM,EAAUF,EAEhB,GAAI,EAACE,GAAA,MAAAA,EAAS,YAAa,CAACA,EAAQ,GAClCL,EAAa,MAAQ,MAEjB,IAAA,CACFA,EAAa,MAAQ,EACjB,IAAAjB,EAAO,GAAGsB,EAAQ,EAAE,IAAIA,EAAQ,IAAI,GACtCrB,EAASqB,EAAQ,OACnB,GAAIA,EAAQ,eAAgB,CAC1B,MAAMC,EAASC,EACbF,EAAQ,eAAe,IAAKG,IAAW,CACrC,KAAM,CACJ,KAAM,GAAGA,EAAM,KAAK,EAAE,IAAIA,EAAM,KAAK,IAAI,GACzC,OAAQA,EAAM,KAAK,MACrB,EACA,GAAI,CACF,KAAM,GAAGA,EAAM,GAAG,EAAE,IAAIA,EAAM,GAAG,IAAI,GACrC,OAAQA,EAAM,GAAG,MACnB,CAAA,EACA,CAAA,EAEAF,IACFvB,EAAOuB,EAAO,KACdtB,EAASsB,EAAO,OAEpB,CACA,MAAMlB,EAAqBL,EAAMC,EAAQoB,EAAQ,MAAM,EAClDA,EAAQ,OAAO,UAASJ,EAAa,MAAQ,SAC3CH,EAAO,CACd,GAAIO,EAAQ,OAAO,QAAS,OACpB,QAAA,MAAM,iBAAkBP,CAAK,EACrCG,EAAa,MAAQ,CACvB,CACF,EASwC,aAAAA,EAC5C"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useThemeSwitch-6ff90248.js","sources":["../../../panel/plugins/console/src/components/ActionRipple.vue","../../../panel/plugins/console/src/hooks/useThemeSwitch.ts"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, watch } from \"vue\";\n\n/**\n * Draws the shell's one-shot ripple in the page layer, not inside the toolbar.\n *\n * The anchor is an absolutely positioned child of the button wrapper, so its\n * rect is the button's rect. The circles themselves are teleported to `body`;\n * a fixed position there is never clipped by the header, drawer or taskbar.\n *\n * `inline` renders the circles inside the button wrapper instead: the desktop\n * taskbar lives in a stacking context (`.desktop-container`, z-index 100) that\n * paints over any body-level ripple, while nothing in the taskbar chain clips\n * overflow. Staying local keeps the ripple above the taskbar and windows, yet\n * still under the start menu, context menu and dialogs.\n */\nconst props = defineProps<{\n /** A changing value starts a new ripple; `0`/`undefined` render nothing. */\n trigger?: number;\n /** Render the ripple inside the button wrapper instead of the page layer. */\n inline?: boolean;\n}>();\n\ninterface ActiveRipple {\n key: number;\n x: number;\n y: number;\n color: string;\n}\n\nconst anchor = ref<HTMLElement>();\nconst ripples = ref<ActiveRipple[]>([]);\n\nwatch(\n () => props.trigger,\n (value, previous) => {\n if (!value || value === previous || !anchor.value) return;\n const rect = anchor.value.getBoundingClientRect();\n const primary = getComputedStyle(anchor.value).getPropertyValue(\"--v-theme-primary\").trim();\n ripples.value.push({\n key: value,\n x: rect.left + rect.width / 2,\n y: rect.top + rect.height / 2,\n color: primary ? `rgb(${primary})` : \"currentColor\"\n });\n }\n);\n\nconst remove = (key: number) => {\n ripples.value = ripples.value.filter((ripple) => ripple.key !== key);\n};\n</script>\n\n<template>\n <span ref=\"anchor\" class=\"action-ripple-anchor\" aria-hidden=\"true\" />\n <Teleport v-if=\"!inline\" to=\"body\">\n <span\n v-for=\"ripple in ripples\"\n :key=\"ripple.key\"\n class=\"action-ripple-circle\"\n :style=\"{ left: `${ripple.x}px`, top: `${ripple.y}px`, background: ripple.color }\"\n aria-hidden=\"true\"\n @animationend=\"remove(ripple.key)\"\n />\n </Teleport>\n <template v-else>\n <span\n v-for=\"ripple in ripples\"\n :key=\"ripple.key\"\n class=\"action-ripple-circle action-ripple-circle--inline\"\n :style=\"{ background: ripple.color }\"\n aria-hidden=\"true\"\n @animationend=\"remove(ripple.key)\"\n />\n </template>\n</template>\n\n<style lang=\"scss\" scoped>\n.action-ripple-anchor {\n position: absolute;\n inset: 0;\n pointer-events: none;\n}\n\n/* Fixed to the page so the growth is never clipped by the header, and just\n above the shell chrome (header uses 20) while dialogs stay on top. */\n.action-ripple-circle {\n position: fixed;\n width: 40px;\n height: 40px;\n margin: -20px 0 0 -20px;\n border-radius: 50%;\n pointer-events: none;\n z-index: 30;\n animation: action-ripple 600ms cubic-bezier(0, -0.04, 0, 0.99) forwards;\n}\n\n/* Anchored to the button wrapper, so the ripple grows from the button itself\n and is painted inside the taskbar's own stacking context. */\n.action-ripple-circle--inline {\n position: absolute;\n left: 50%;\n top: 50%;\n}\n\n@keyframes action-ripple {\n from {\n transform: scale(0.35);\n opacity: 0.4;\n }\n to {\n transform: scale(20);\n opacity: 0;\n }\n}\n</style>\n","import { t } from \"@/lang/i18n\";\nimport { useAppConfigStore } from \"@/stores/useAppConfigStore\";\nimport { AppTheme } from \"@/types/const\";\nimport { computed } from \"vue\";\n\nconst themeModes = [\n { value: AppTheme.AUTO, label: \"TXT_CODE_dc8de4ff\", icon: \"mdi-theme-light-dark\" },\n { value: AppTheme.LIGHT, label: \"TXT_CODE_673eac8e\", icon: \"mdi-weather-sunny\" },\n { value: AppTheme.DARK, label: \"TXT_CODE_5e4a370d\", icon: \"mdi-weather-night\" }\n];\n\nexport function useThemeSwitch() {\n const { currentTheme, setTheme } = useAppConfigStore();\n const modeIndex = computed(() => themeModes.findIndex((mode) => mode.value === currentTheme.value));\n const themeIcon = computed(() => (themeModes[modeIndex.value] ?? themeModes[0]).icon);\n const themeTitle = computed(() => t((themeModes[modeIndex.value] ?? themeModes[0]).label));\n\n const cycleTheme = () => {\n setTheme(themeModes[(modeIndex.value + 1) % themeModes.length].value);\n };\n\n return { themeIcon, themeTitle, cycleTheme };\n}\n"],"names":["props","__props","anchor","ref","ripples","watch","value","previous","rect","primary","remove","key","ripple","_normalizeStyle","$event","_hoisted_2","_hoisted_1","themeModes","AppTheme","useThemeSwitch","currentTheme","setTheme","useAppConfigStore","modeIndex","computed","mode","themeIcon","themeTitle","t"],"mappings":"gbAgBA,MAAAA,EAAAC,EAcAC,EAAAC,IACAC,EAAAD,EAAA,CAAA,CAAA,EAEAE,EAAA,IAAAL,EAAA,QACc,CAAAM,EAAAC,IAAA,CAEV,GAAA,CAAAD,GAAAA,IAAAC,GAAA,CAAAL,EAAA,MAAmD,OACnD,MAAAM,EAAAN,EAAA,MAAA,sBAAA,EACAO,EAAA,iBAAAP,EAAA,KAAA,EAAA,iBAAA,mBAAA,EAAA,OACAE,EAAA,MAAA,KAAA,CAAmB,IAAAE,EACZ,EAAAE,EAAA,KAAAA,EAAA,MAAA,EACuB,EAAAA,EAAA,IAAAA,EAAA,OAAA,EACA,MAAAC,EAAA,OAAAA,CAAA,IAAA,cACS,CAAA,CACtC,CACH,EAGF,MAAAC,EAAAC,GAAA,CACEP,EAAA,MAAAA,EAAA,MAAA,OAAAQ,GAAAA,EAAA,MAAAD,CAAA,CAAmE,wCAKE,QAAA,SAA3D,IAAAT,EAAA,MAAA,uBAAe,cAAA,MAAmC,EAAA,KAAA,GAAA,0DAmBxD,IAAAU,EAAA,IALa,MAAA,oDACP,MAAAC,EAAA,CAAA,WAAAD,EAAA,KAAA,CAAA,EAC4B,cAAA,OACtB,eAAAE,GAAAJ,EAAAE,EAAA,GAAA,CACoB,EAAA,KAAA,GAAAG,CAAA,oBARzB,IAAA,WATiB,EAAA,6CAQxB,IAAAH,EAAA,IALa,MAAA,uBACP,MAAAC,EAAA,CAAA,KAAA,GAAAD,EAAA,CAAA,KAAA,IAAA,GAAAA,EAAA,CAAA,KAAA,WAAAA,EAAA,MAAA,EACyE,cAAA,OACnE,eAAAE,GAAAJ,EAAAE,EAAA,GAAA,CACoB,EAAA,KAAA,GAAAI,CAAA,qECzDhCC,EAAa,CACjB,CAAE,MAAOC,EAAS,KAAM,MAAO,oBAAqB,KAAM,sBAAuB,EACjF,CAAE,MAAOA,EAAS,MAAO,MAAO,oBAAqB,KAAM,mBAAoB,EAC/E,CAAE,MAAOA,EAAS,KAAM,MAAO,oBAAqB,KAAM,mBAAoB,CAChF,EAEO,SAASC,GAAiB,CAC/B,KAAM,CAAE,aAAAC,EAAc,SAAAC,CAAS,EAAIC,EAAkB,EAC/CC,EAAYC,EAAS,IAAMP,EAAW,UAAWQ,GAASA,EAAK,QAAUL,EAAa,KAAK,CAAC,EAC5FM,EAAYF,EAAS,KAAOP,EAAWM,EAAU,KAAK,GAAKN,EAAW,CAAC,GAAG,IAAI,EAC9EU,EAAaH,EAAS,IAAMI,GAAGX,EAAWM,EAAU,KAAK,GAAKN,EAAW,CAAC,GAAG,KAAK,CAAC,EAMlF,MAAA,CAAE,UAAAS,EAAW,WAAAC,EAAY,WAJb,IAAM,CACvBN,EAASJ,GAAYM,EAAU,MAAQ,GAAKN,EAAW,MAAM,EAAE,KAAK,CAAA,EAIxE"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vuetifyModal-49cb95ba.js","sources":["../../../panel/plugins/console/src/tools/vuetifyModal.ts"],"sourcesContent":["import { createApp, defineComponent, h, shallowReactive, type VNode } from \"vue\";\nimport AppDialog from \"../components/AppDialog.vue\";\nimport { installVuetify } from \"../vuetify\";\n\ntype Renderable = string | VNode | Renderable[] | (() => Renderable) | undefined;\n\nexport interface ModalOptions {\n title?: Renderable;\n content?: Renderable;\n onOk?: () => unknown;\n onCancel?: () => unknown;\n okText?: string;\n cancelText?: string;\n okType?: string;\n okButtonProps?: Record<string, unknown>;\n footer?: Renderable;\n maskClosable?: boolean;\n closable?: boolean;\n centered?: boolean;\n width?: string | number;\n maxWidth?: string | number;\n}\n\nexport interface ModalHandle {\n destroy: () => void;\n update: (next: Partial<ModalOptions>) => void;\n}\n\nconst activeDialogs = new Set<ModalHandle>();\n\nconst resolveRenderable = (value: Renderable): Renderable => {\n return typeof value === \"function\" ? resolveRenderable(value()) : value;\n};\n\nconst asChildren = (value: Renderable) => {\n const resolved = resolveRenderable(value);\n return resolved == null ? [] : Array.isArray(resolved) ? resolved : [resolved];\n};\n\nfunction openDialog(options: ModalOptions, variant: \"confirm\" | \"alert\"): ModalHandle {\n const state = shallowReactive({\n ...options,\n open: true,\n loading: false,\n variant\n });\n const host = document.createElement(\"div\");\n document.body.appendChild(host);\n\n let app: ReturnType<typeof createApp>;\n let handle: ModalHandle;\n let cleanupTimer: ReturnType<typeof setTimeout> | undefined;\n\n const destroy = () => {\n if (!state.open && cleanupTimer) return;\n state.open = false;\n cleanupTimer = setTimeout(() => {\n app?.unmount();\n host.remove();\n activeDialogs.delete(handle);\n }, 300);\n };\n\n const update = (next: Partial<ModalOptions>) => {\n Object.assign(state, next);\n };\n\n handle = { destroy, update };\n activeDialogs.add(handle);\n\n const submit = async () => {\n if (state.loading) return;\n try {\n const result = state.onOk?.();\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n state.loading = true;\n const resolved = await result;\n if (resolved !== false) destroy();\n } else if (result !== false) {\n destroy();\n }\n } catch {\n // Keep the dialog open when an async confirmation rejects.\n } finally {\n state.loading = false;\n }\n };\n\n const cancel = () => {\n state.onCancel?.();\n destroy();\n };\n\n const DialogHost = defineComponent({\n setup() {\n return () => {\n const title = resolveRenderable(state.title);\n const hasTitleSlot = title != null && typeof title !== \"string\";\n const dialogSlots: Record<string, any> = {\n default: () => asChildren(state.content)\n };\n if (state.footer != null) {\n dialogSlots.footer = () => asChildren(state.footer);\n }\n if (hasTitleSlot) {\n dialogSlots.title = () => asChildren(title);\n }\n return h(\n AppDialog,\n {\n open: state.open,\n title: hasTitleSlot ? undefined : title,\n closable: state.closable !== false,\n maskClosable: state.maskClosable !== false,\n confirmLoading: state.loading,\n okText: state.okText,\n cancelText: state.cancelText,\n okType: state.okType,\n okButtonProps: state.okButtonProps,\n compact: variant === \"confirm\",\n width: state.width,\n maxWidth: state.maxWidth,\n showCancel: variant === \"confirm\",\n onOk: submit,\n onCancel: cancel\n },\n dialogSlots\n );\n };\n }\n });\n\n app = createApp(DialogHost);\n installVuetify(app);\n app.mount(host);\n return handle;\n}\n\nexport const Modal = {\n confirm: (options: ModalOptions) => openDialog(options, \"confirm\"),\n info: (options: ModalOptions) => openDialog(options, \"alert\"),\n success: (options: ModalOptions) => openDialog(options, \"alert\"),\n error: (options: ModalOptions) => openDialog(options, \"alert\"),\n warning: (options: ModalOptions) => openDialog(options, \"alert\"),\n warn: (options: ModalOptions) => openDialog(options, \"alert\"),\n destroyAll: () => {\n activeDialogs.forEach((dialog) => dialog.destroy());\n }\n};\n"],"names":["activeDialogs","resolveRenderable","value","asChildren","resolved","openDialog","options","variant","state","shallowReactive","host","app","handle","cleanupTimer","destroy","next","submit","result","_a","cancel","DialogHost","defineComponent","title","hasTitleSlot","dialogSlots","h","AppDialog","createApp","installVuetify","Modal","dialog"],"mappings":"yLA4BA,MAAMA,MAAoB,IAEpBC,EAAqBC,GAClB,OAAOA,GAAU,WAAaD,EAAkBC,EAAA,CAAO,EAAIA,EAG9DC,EAAcD,GAAsB,CAClC,MAAAE,EAAWH,EAAkBC,CAAK,EACjC,OAAAE,GAAY,KAAO,CAAA,EAAK,MAAM,QAAQA,CAAQ,EAAIA,EAAW,CAACA,CAAQ,CAC/E,EAEA,SAASC,EAAWC,EAAuBC,EAA2C,CACpF,MAAMC,EAAQC,EAAgB,CAC5B,GAAGH,EACH,KAAM,GACN,QAAS,GACT,QAAAC,CAAA,CACD,EACKG,EAAO,SAAS,cAAc,KAAK,EAChC,SAAA,KAAK,YAAYA,CAAI,EAE1B,IAAAC,EACAC,EACAC,EAEJ,MAAMC,EAAU,IAAM,CAChB,CAACN,EAAM,MAAQK,IACnBL,EAAM,KAAO,GACbK,EAAe,WAAW,IAAM,CAC9BF,GAAA,MAAAA,EAAK,UACLD,EAAK,OAAO,EACZV,EAAc,OAAOY,CAAM,GAC1B,GAAG,EAAA,EAOCA,EAAA,CAAE,QAAAE,EAAS,OAJJC,GAAgC,CACvC,OAAA,OAAOP,EAAOO,CAAI,CAAA,GAI3Bf,EAAc,IAAIY,CAAM,EAExB,MAAMI,EAAS,SAAY,OACzB,GAAI,CAAAR,EAAM,QACN,GAAA,CACI,MAAAS,GAASC,EAAAV,EAAM,OAAN,YAAAU,EAAA,KAAAV,GACXS,GAAU,OAAQA,EAA4B,MAAS,YACzDT,EAAM,QAAU,GACC,MAAMS,IACN,IAAeH,KACvBG,IAAW,IACZH,GACV,MACM,CAAA,QAEN,CACAN,EAAM,QAAU,EAClB,CAAA,EAGIW,EAAS,IAAM,QACnBD,EAAAV,EAAM,WAAN,MAAAU,EAAA,KAAAV,GACQM,GAAA,EAGJM,EAAaC,EAAgB,CACjC,OAAQ,CACN,MAAO,IAAM,CACL,MAAAC,EAAQrB,EAAkBO,EAAM,KAAK,EACrCe,EAAeD,GAAS,MAAQ,OAAOA,GAAU,SACjDE,EAAmC,CACvC,QAAS,IAAMrB,EAAWK,EAAM,OAAO,CAAA,EAErC,OAAAA,EAAM,QAAU,OAClBgB,EAAY,OAAS,IAAMrB,EAAWK,EAAM,MAAM,GAEhDe,IACUC,EAAA,MAAQ,IAAMrB,EAAWmB,CAAK,GAErCG,EACLC,EACA,CACE,KAAMlB,EAAM,KACZ,MAAOe,EAAe,OAAYD,EAClC,SAAUd,EAAM,WAAa,GAC7B,aAAcA,EAAM,eAAiB,GACrC,eAAgBA,EAAM,QACtB,OAAQA,EAAM,OACd,WAAYA,EAAM,WAClB,OAAQA,EAAM,OACd,cAAeA,EAAM,cACrB,QAASD,IAAY,UACrB,MAAOC,EAAM,MACb,SAAUA,EAAM,SAChB,WAAYD,IAAY,UACxB,KAAMS,EACN,SAAUG,CACZ,EACAK,CAAA,CACF,CAEJ,CAAA,CACD,EAED,OAAAb,EAAMgB,EAAUP,CAAU,EAC1BQ,EAAejB,CAAG,EAClBA,EAAI,MAAMD,CAAI,EACPE,CACT,CAEO,MAAMiB,EAAQ,CACnB,QAAUvB,GAA0BD,EAAWC,EAAS,SAAS,EACjE,KAAOA,GAA0BD,EAAWC,EAAS,OAAO,EAC5D,QAAUA,GAA0BD,EAAWC,EAAS,OAAO,EAC/D,MAAQA,GAA0BD,EAAWC,EAAS,OAAO,EAC7D,QAAUA,GAA0BD,EAAWC,EAAS,OAAO,EAC/D,KAAOA,GAA0BD,EAAWC,EAAS,OAAO,EAC5D,WAAY,IAAM,CAChBN,EAAc,QAAS8B,GAAWA,EAAO,QAAS,CAAA,CACpD,CACF"}
|