slimsdk 0.1.55 → 0.2.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.
Files changed (90) hide show
  1. package/README.md +3 -5
  2. package/dist/desktop/index.css +0 -48
  3. package/dist/desktop/index.css.map +1 -1
  4. package/dist/desktop/index.d.ts +14 -13
  5. package/dist/desktop/index.js +1476 -1972
  6. package/dist/desktop/index.js.map +1 -1
  7. package/dist/docs-BHtSyl34.d.ts +10 -0
  8. package/dist/index-B4158M0u.d.ts +21 -0
  9. package/dist/index-BAQxKstM.d.ts +8 -0
  10. package/dist/index-BMqjxP9I.d.ts +11 -0
  11. package/dist/index-CD53Vh6h.d.ts +31 -0
  12. package/dist/index-COGi5mfY.d.ts +28 -0
  13. package/dist/index-COUeXLOQ.d.ts +3 -0
  14. package/dist/index-CoYHkkyT.d.ts +14 -0
  15. package/dist/{index-kr8P3eEW.d.ts → index-Cvng8f_u.d.ts} +10 -9
  16. package/dist/index-D5CUpF9v.d.ts +10 -0
  17. package/dist/index-DBhzpIiB.d.ts +32 -0
  18. package/dist/index-D_o5c-YA.d.ts +134 -0
  19. package/dist/index-DzKPF0ja.d.ts +14 -0
  20. package/dist/index-jVam7Sxi.d.ts +15 -0
  21. package/dist/index-uQOR5bdy.d.ts +20 -0
  22. package/dist/index.d.ts +1 -1
  23. package/dist/index.js +2 -2
  24. package/dist/index.js.map +1 -1
  25. package/dist/lib/index.d.ts +1 -1
  26. package/dist/lib/index.js +194 -1
  27. package/dist/lib/index.js.map +1 -1
  28. package/dist/mobile/index.css +0 -48
  29. package/dist/mobile/index.css.map +1 -1
  30. package/dist/mobile/index.d.ts +13 -12
  31. package/dist/mobile/index.js +542 -808
  32. package/dist/mobile/index.js.map +1 -1
  33. package/dist/mod/button/index.d.ts +1 -1
  34. package/dist/mod/button/index.js +2 -2
  35. package/dist/mod/button/index.js.map +1 -1
  36. package/dist/mod/cover/index.d.ts +1 -1
  37. package/dist/mod/cover/index.js +3 -3
  38. package/dist/mod/cover/index.js.map +1 -1
  39. package/dist/mod/dialog/index.d.ts +1 -1
  40. package/dist/mod/dialog/index.js +13 -13
  41. package/dist/mod/dialog/index.js.map +1 -1
  42. package/dist/mod/drawer/index.d.ts +1 -1
  43. package/dist/mod/drawer/index.js +8 -8
  44. package/dist/mod/drawer/index.js.map +1 -1
  45. package/dist/mod/drop/index.d.ts +1 -1
  46. package/dist/mod/drop/index.js +15 -15
  47. package/dist/mod/drop/index.js.map +1 -1
  48. package/dist/mod/index.d.ts +7 -7
  49. package/dist/mod/index.js +61 -59
  50. package/dist/mod/index.js.map +1 -1
  51. package/dist/mod/modal/index.d.ts +1 -1
  52. package/dist/mod/modal/index.js +12 -12
  53. package/dist/mod/modal/index.js.map +1 -1
  54. package/dist/mod/tabs/index.d.ts +1 -1
  55. package/dist/mod/tabs/index.js +8 -6
  56. package/dist/mod/tabs/index.js.map +1 -1
  57. package/dist/page/desktop/index.d.ts +3 -3
  58. package/dist/page/desktop/index.js +228 -801
  59. package/dist/page/desktop/index.js.map +1 -1
  60. package/dist/page/index.d.ts +7 -7
  61. package/dist/page/index.js +12 -12
  62. package/dist/page/index.js.map +1 -1
  63. package/dist/page/mobile/index.d.ts +2 -2
  64. package/dist/page/mobile/index.js +14 -14
  65. package/dist/page/mobile/index.js.map +1 -1
  66. package/dist/svchub/index.d.ts +2 -0
  67. package/dist/svchub/index.js +760 -0
  68. package/dist/svchub/index.js.map +1 -0
  69. package/dist/worker/hubworker.js +1 -1
  70. package/dist/worker/hubworker.js.map +1 -1
  71. package/package.json +7 -6
  72. package/dist/index-B2HHS23A.d.ts +0 -20
  73. package/dist/index-BQcJsVJ-.d.ts +0 -10
  74. package/dist/index-Bf_lg-oZ.d.ts +0 -339
  75. package/dist/index-ChdqOPJq.d.ts +0 -15
  76. package/dist/index-CzsSwSvp.d.ts +0 -21
  77. package/dist/index-D3tu8t6p.d.ts +0 -28
  78. package/dist/index-DQt71MNx.d.ts +0 -31
  79. package/dist/index-DZdXvqxA.d.ts +0 -10
  80. package/dist/index-DcvauYN8.d.ts +0 -14
  81. package/dist/index-Pd7FTiEW.d.ts +0 -32
  82. package/dist/index-QRbamarh.d.ts +0 -8
  83. package/dist/mod/global/index.d.ts +0 -57
  84. package/dist/mod/global/index.js +0 -117
  85. package/dist/mod/global/index.js.map +0 -1
  86. package/dist/mod/hwlink/index.d.ts +0 -3
  87. package/dist/mod/hwlink/index.js +0 -873
  88. package/dist/mod/hwlink/index.js.map +0 -1
  89. package/dist/mod/hwlink/style.css +0 -1134
  90. package/dist/mod/hwlink/style.css.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/mod/global.ts","../../../src/page/index.ts","../../../src/mod/built-in/cover/index.ts","../../../src/mod/modal/index.ts","../../../src/mod/dialog/index.ts","../../../src/lib/utility.ts","../../../src/svchub/hwlink/template.ts","../../../src/svchub/api/agency/agcy.ts","../../../src/svchub/api/agency/dept.ts","../../../src/svchub/api/account/index.ts","../../../src/svchub/hwlink/device.ts","../../../src/svchub/hwlink/index.ts"],"sourcesContent":["/* global */\n/*------------------------------------------------------------*/\nexport type GbVar = {\n UNIX_TIME: number;\n app: appType;\n api: apiType;\n hub: hubType;\n hwl: hwlType;\n user: userType;\n};\ntype appType = {\n UUID: string;\n NAME: string;\n VERSION: string;\n RELEASE: string;\n};\ntype apiType = {\n URL: string;\n TOKEN: string;\n HEADERS?: Headers;\n};\ntype hubType = {\n LOGIN: string;\n OAUTH: string;\n API: string;\n WSS: string;\n UUID: string;\n TASK?: Worker;\n};\ntype hwlType = {\n HOST: string;\n FILE: string;\n};\ntype userType = {\n ACCT: number;\n ACTYPE: number;\n ACROLE: number;\n ACNAME: string;\n PICTURE: string;\n AGCY: number;\n DVSN: number;\n SECT: number;\n DEPT: string;\n AGCY_NAME: string;\n DVSN_NAME: string;\n SECT_NAME: string;\n};\n/*------------------------------------------------------------*/\nexport const gbvar: GbVar = {\n UNIX_TIME: 0,\n app: {\n UUID: '',\n NAME: '',\n VERSION: '',\n RELEASE: '',\n },\n api: {\n URL: '',\n TOKEN: '',\n },\n hub: {\n LOGIN: 'https://wkrh.info/oauth/v1/authorize',\n OAUTH: 'https://wkrh.info:8850/oauth/v1',\n API: 'https://wkrh.info:8850/api/v1',\n WSS: 'wss://wkrh.info:8855/ws',\n UUID: '',\n },\n hwl: {\n HOST: 'ws://localhost:8844/ws',\n FILE: 'https://wkrh.info/app/hwlink/hwlink_setup.exe',\n },\n user: {\n ACCT: 0,\n ACTYPE: 0,\n ACROLE: 0,\n ACNAME: '',\n PICTURE: '',\n AGCY: 0,\n DVSN: 0,\n SECT: 0,\n DEPT: '0,0',\n AGCY_NAME: '',\n DVSN_NAME: '',\n SECT_NAME: '',\n }\n};\n/*------------------------------------------------------------*/\nimport { version } from '../../package.json';\nexport const info = () => `sdk ${version}`;\n/*------------------------------------------------------------*/\ntype InitParams = {\n svcWorker?: string,\n webNotify?: boolean,\n wakeLock?: boolean,\n btnToTop?: boolean,\n hideTabbar?: boolean,\n};\nexport const init = (params?: InitParams) => {\n if (params?.svcWorker) svcWorker(params.svcWorker);\n if (params?.webNotify) webNotify();\n if (params?.wakeLock) wakeLock();\n if (params?.btnToTop) btnToTop();\n if (params?.hideTabbar) hideTabbar();\n};\n/*------------------------------------------------------------*/\nconst svcWorker = (worker: string) => {\n if (!('serviceWorker' in navigator)) return;\n navigator.serviceWorker.register(worker, {\n type: 'module'\n }).catch(err => console.warn(err));\n};\n/*------------------------------------------------------------*/\nconst webNotify = () => {\n if (!('Notification' in window)) return;\n Notification.requestPermission()\n .catch(err => console.warn(err));\n};\n/*------------------------------------------------------------*/\nconst wakeLock = () => {\n if (document.hidden) return;\n navigator.wakeLock.request('screen')\n .catch(err => console.warn(err));\n};\n/*------------------------------------------------------------*/\nconst hideTabbar = () => {\n const winHeight = window.innerHeight;\n window.visualViewport?.addEventListener('resize', () => {\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n if (!tabbar) return;\n if (winHeight != window.innerHeight) {\n tabbar.classList.add('hide');\n } else {\n tabbar.classList.remove('hide');\n }\n });\n};\n/*------------------------------------------------------------*/\nconst app = document.querySelector<HTMLElement>('#app');\nconst btnToTop = () => {\n if (!app) return;\n // create item\n const totop = document.createElement('div');\n totop.id = 'totop';\n totop.innerHTML = /* html */ `\n <button id=\"btn-totop\" class=\"circle purple\" shadow=\"true\"\n title=\"กลับด้านบน\">&#xf341;</button>\n `;\n document.body.appendChild(totop);\n // add event\n totop.querySelector<HTMLButtonElement>('#btn-totop')!.onclick = () => {\n app.scrollTo({ top: 0, behavior: 'smooth' });\n };\n app.addEventListener('scroll', () => {\n if (app.scrollTop > 1000) {\n totop.style.display = 'block';\n if (app.classList.contains('tabbar')) {\n app.style.paddingBottom = '116px';\n } else {\n app.style.paddingBottom = '60px';\n }\n } else {\n totop.style.display = '';\n app.style.paddingBottom = '';\n }\n // tabs mobile shadow\n const tabsMobile = app.querySelector<HTMLElement>('.slim-tabs.mobile .tabs-header');\n if (!tabsMobile) return;\n if (app.scrollTop > 10) {\n tabsMobile.style.boxShadow = `rgba(0, 0, 0, 0.16) 0px 1px 4px`;\n } else {\n tabsMobile.style.boxShadow = '';\n }\n });\n};\n/*------------------------------------------------------------*/","/* page */\n/*--------------------------------------------------------------------------------*/\nconst app = document.querySelector<HTMLElement>('#app');\nconst pageSpin: string = /*html*/ `\n<div class=\"lds-spinner\">\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n</div>\n`;\nconst smallSpin: string = `<div class=\"spinner s32\"></div>`;\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (size = 'default') => {\n if (!app) return;\n // page-loader\n if (!app.querySelector('#page-loader')) {\n const loader = document.createElement('div');\n loader.id = 'page-loader';\n loader.className = 'overlay center';\n loader.innerHTML = size == 'default' ? pageSpin : smallSpin;\n app.appendChild(loader);\n }\n // app-content\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Ready = (delay = 400) => {\n new Promise(r => setTimeout(r, delay)).then(() => {\n clearLoader(true);\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const Error = (err: Error) => {\n clearLoader(false);\n if (!app) return;\n // create\n const box = document.createElement('div');\n box.className = 'page-error';\n box.innerHTML = /*html*/ `\n <i class=\"icon red\">&#xf188;</i>\n <div class=\"topic\">&#x2726; เกิดข้อผิดพลาด &#x2726;</div>\n <div class=\"text\">${err}</div>\n `;\n app.prepend(box);\n throw err;\n};\n/*--------------------------------------------------------------------------------*/\nexport const NotFound = () => {\n if (!app) return;\n app.innerHTML = /*html*/ `\n <div class=\"page-not-found\">\n <h1>4<i class=\"fas fa-ghost\"></i>4</h1>\n <h2>Error 404 Page Not Found</h2>\n <p>Sorry, the page cannot be accessed</p>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const FullLoad = () => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-full-load\">\n <div class=\"spinner\"></div>\n <div class=\"text\">Slim<br>Loading</div>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Inform = (params: {\n icon: string;\n msg: string;\n btnTxt: string;\n btnUrl: string;\n color?: string;\n}) => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-inform ${params.color}\">\n <div class=\"icon solid\">${params.icon}</div>\n <div class=\"msg\">${params.msg}</div>\n <button class=\"lg ${params.color}\" shadow=\"true\">\n ${params.btnTxt}\n </button>\n </div>\n `;\n const btn = app.querySelector<HTMLButtonElement>('button')!;\n btn.onclick = () => window.location.replace(params.btnUrl);\n};\n/*--------------------------------------------------------------------------------*/\n//export const Maintain = () => { };\n//export const Construct = () => { };\n/*--------------------------------------------------------------------------------*/\nconst clearNavbar = () => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (topbar) topbar.remove();\n if (tabbar) tabbar.remove();\n if (sidebar) sidebar.remove();\n if (app) app.className = '';\n};\nconst clearLoader = (showContent: boolean) => {\n if (!app) return;\n const loader = app.querySelector<HTMLElement>('#page-loader');\n if (loader) {\n loader.style.animation = 'fade-out 0.4s forwards';\n loader.onanimationend = () => loader.remove();\n }\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = showContent ? 'block' : 'none';\n};\n/*--------------------------------------------------------------------------------*/\n","/* cover */\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (\n cover: HTMLElement,\n state = false,\n align = 'top',\n hide = true,\n) => {\n const inner = cover.querySelectorAll<HTMLElement>('*');\n if (state) {\n cover.querySelector<HTMLElement>('.cover-loader')?.remove();\n cover.style.position = 'relative';\n if (hide) inner.forEach(el => el.style.visibility = 'hidden');\n // create loader\n const loader = document.createElement('div');\n loader.className = `cover-loader ${align}`;\n loader.innerHTML = `<div class=\"spinner s28\"></div>`;\n cover.appendChild(loader);\n } else {\n new Promise(r => setTimeout(r, 400)).then(() => {\n cover.querySelector<HTMLElement>('.cover-loader')?.remove();\n cover.style.position = '';\n inner.forEach(el => el.style.visibility = '');\n });\n }\n};\n/*--------------------------------------------------------------------------------*/\n// accordion\nexport const acdInit = () => {\n const acdItem = document.querySelectorAll<HTMLElement>('.acd-item');\n acdItem.forEach(elm => {\n const topic = elm.querySelector<HTMLElement>('.topic');\n const panel = elm.querySelector<HTMLElement>('.panel');\n if (topic) topic.onclick = () => {\n elm.classList.toggle('active');\n if (!panel) return;\n if (elm.classList.contains('active')) {\n panel.style.maxHeight = `${panel.scrollHeight}px`;\n } else {\n panel.style.maxHeight = '';\n }\n };\n });\n};\n/*--------------------------------------------------------------------------------*/\n","/* modal */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nconst tmpBtnSave: string = /* html */ `\n <button class=\"solid green\" type=\"submit\">\n <i>&#xf0c7;</i>บันทึก\n </button>\n`;\nconst tmpBtnCancel: string = /* html */ `\n <button class=\"solid gray\" type=\"button\" id=\"btn-cancel\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n`;\nconst tmpBtnClose: string = /* html */ `\n <button class=\"solid blue\" type=\"button\" id=\"btn-close\">\n <i>&#xf057;</i>ปิดหน้า\n </button>\n`;\ntype ModalParams = {\n icon: string;\n title: string;\n body: string;\n width?: string;\n button?: {\n save?: boolean;\n cancel?: boolean;\n close?: boolean;\n align?: string;\n };\n target?: HTMLElement;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Create = (params: ModalParams): HTMLElement => {\n const icon = params.icon ? params.icon : '&#xf40e;';\n const title = params.title ? params.title : 'Modal Title';\n const body = params.body ? params.body : 'Modal Body';\n const width = params.width ? params.width : '100%';\n const align = params.button?.align ? params.button?.align : '';\n const doc = params.target ? params.target : app;\n // button\n let button = '';\n if (params.button?.cancel) button += tmpBtnCancel;\n if (params.button?.close) button += tmpBtnClose;\n if (params.button?.save) button += tmpBtnSave;\n // create\n const modal = document.createElement('div');\n modal.className = 'overlay slim-modal';\n modal.innerHTML = /*html*/ `\n <form>\n <div class=\"content\" style=\"width: ${width};\">\n <div class=\"header\">\n <i class=\"icon pad\">${icon}</i>${title}\n <button id=\"btn-exit\" type=\"button\"\n class=\"icon\">&#xf00d;</button>\n </div>\n <div class=\"body\">${body}</div>\n <div class=\"footer ${align}\">${button}</div>\n <div class=\"loader\">\n <div class=\"spinner s28\"></div>\n </div>\n </div>\n </form>\n `;\n if (!doc) return modal;\n doc.appendChild(modal);\n if (width == 'auto') {\n const content = modal.querySelector<HTMLElement>('.content');\n if (content) content.style.maxWidth = `450px`;\n }\n // open modal\n window.location.hash = 'modal';\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-in');\n modal.classList.add('overlay-in');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-in')) {\n content.classList.remove('modal-in');\n modal.classList.remove('overlay-in');\n }\n });\n // hash change\n const hashChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hash != 'modal') done();\n };\n const done = () => {\n destroy(modal);\n if (window.location.hash == '#modal') history.back();\n window.removeEventListener('hashchange', hashChange);\n };\n window.addEventListener('hashchange', hashChange);\n // button\n const btnExit = modal.querySelector<HTMLButtonElement>('#btn-exit');\n const btnCancel = modal.querySelector<HTMLButtonElement>('#btn-cancel');\n const btnClose = modal.querySelector<HTMLButtonElement>('#btn-close');\n if (btnExit) {\n btnExit.focus();\n btnExit.onclick = done;\n }\n if (btnCancel) btnCancel.onclick = done;\n if (btnClose) btnClose.onclick = done;\n return modal;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Close = (modal: HTMLElement) => new Promise<void>((resolve) => {\n modal.querySelector<HTMLButtonElement>('#btn-exit')!.click();\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.addEventListener('animationend', () => resolve());\n});\nconst destroy = (modal: HTMLElement) => {\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-out');\n modal.classList.add('overlay-out');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-out')) {\n modal.style.display = 'none';\n modal.remove();\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'hidden';\n if (loader) loader.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Ready = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'visible';\n if (loader) loader.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Hidden = (modal: HTMLElement) => {\n modal.style.display = 'none';\n};\nexport const Visible = (modal: HTMLElement) => {\n modal.style.display = 'block';\n};\n/*--------------------------------------------------------------------------------*/\n","/* dialog */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport const Confirm = (\n message: string,\n params?: {\n color?: string;\n target?: HTMLElement;\n }\n) => new Promise<boolean>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const color = params && params?.color ? params.color : 'green';\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"confirm ${color}\">\n <div class=\"header\">\n <i class=\"icon solid\">&#xf058;</i> Slim Confirm\n </div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg gray left\" id=\"btn-no\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n <button class=\"lg ${color} right\" id=\"btn-yes\">\n <i>&#xf058;</i>ตกลง\n </button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve(true);\n };\n dialog.querySelector<HTMLButtonElement>('#btn-no')!.onclick = () => {\n dialog.remove();\n resolve(false);\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const Alert = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"alert ${color}\">\n <div class=\"icon solid\">${icon}</div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg ${color}\" id=\"btn-yes\">ตกลง</button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve();\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const Toast = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const toast = document.createElement('div');\n toast.className = `slim-toast ${color}`;\n toast.innerHTML = /*html*/ `\n <i class=\"icon\">${icon}</i>\n <span class=\"text\">${message}</span>\n `;\n doc.appendChild(toast);\n // animation\n toast.classList.add('show');\n let count = 0;\n toast.onanimationend = () => {\n count++;\n if (count == 2) {\n toast.remove();\n resolve();\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\n","/* utility */\nexport const THAI_DIGIT = ['๐', '๑', '๒', '๓', '๔', '๕', '๖', '๗', '๘', '๙'];\n/*--------------------------------------------------------------------------------*/\nexport const thaiDigit = (input: number | string): string => {\n return input.toString()\n .replace(/\\d/g, (digit: string) => THAI_DIGIT[parseInt(digit)]);\n};\n/*--------------------------------------------------------------------------------*/\nexport const cidCheck = (cid: string): boolean => {\n if (!Number(cid)) return false;\n if (cid.substring(0, 1) == '0') return false;\n if (cid.length !== 13) return false;\n let sum = 0;\n for (let i = 0; i < 12; i++) {\n sum += parseFloat(cid.charAt(i)) * (13 - i);\n }\n return (11 - sum % 11) % 10 === parseFloat(cid.charAt(12));\n};\n/*--------------------------------------------------------------------------------*/\nexport const winPopup = (\n width: number,\n height: number,\n name: string,\n url: string,\n) => {\n const left = (screen.width - width) / 2;\n const top = (screen.height - height) / 2;\n let opt = `width=${width}, height=${height},`;\n opt += `left=${left}, top=${top}`;\n return window.open(url, name, opt);\n};\n/*--------------------------------------------------------------------------------*/\nexport const strCheck = (str: string): string => {\n let out = String(str);\n out = out.replaceAll(\"'\", \"\\\\'\");\n out = out.replaceAll('\"', '\\\\\"');\n out = out.trim();\n return out;\n};\n/*--------------------------------------------------------------------------------*/\nexport const zeroFill = (\n num: number,\n opts?: {\n min?: number;\n max?: number;\n char?: string;\n }\n): string => {\n const n = Number(num);\n const min = opts?.min ? Number(opts.min) : 0;\n const max = opts?.max ? Number(opts.max) : 0;\n const char = opts?.char || opts?.char == '' ? opts.char : '-';\n if (n > 0) {\n return n.toLocaleString(undefined, {\n minimumFractionDigits: min,\n maximumFractionDigits: max,\n });\n } else return char;\n};\n/*--------------------------------------------------------------------------------*/\nexport const numFormat = (num: number, fixed = 0): string => {\n const n = Number(num);\n const f = Number(fixed);\n let out: string = '';\n if (n >= 10 ** 3 && n < 10 ** 6) {\n out = (n / 1000).toFixed(f) + ' K';\n } else if (n >= 10 ** 6) {\n out = (n / 1000000).toFixed(f) + ' M';\n }\n return out;\n};\n/*--------------------------------------------------------------------------------*/\nexport const strFormat = (value: string, pattern: string): string => {\n let i = 0;\n const v = value.toString();\n return pattern.replace(/#/g, () => {\n const out = v[i] ? v[i] : '#';\n i++;\n return out;\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const toBase64 = (file: File) => new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.readAsDataURL(file);\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = err => reject(err);\n});\n/*--------------------------------------------------------------------------------*/\nexport type JwtPack = {\n iss: string;\n iat: number;\n exp: number;\n agcy: number;\n acct: number;\n type: number;\n role: number;\n};\nexport const jwtParse = (token: string): JwtPack | null => {\n try { return JSON.parse(atob(token.split('.')[1])); }\n catch { return null; }\n};\n/*--------------------------------------------------------------------------------*/\n","/* template */\nexport const template: string = /*html*/ `\n<div id=\"page-svchub\" class=\"cover\">\n <div class=\"cover-bar\">Hardware Link</div>\n <div class=\"cover-body border\">\n <!-- svcinfo -->\n <div id=\"svcinfo\">\n <div class=\"box-tb\">\n <div class=\"topic\">HwLink</div>\n <div class=\"text\" id=\"hwlink\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">AutoUp</div>\n <div class=\"text\" id=\"autoup\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">CSUUID</div>\n <div class=\"text\" id=\"csuuid\">:</div>\n </div>\n </div>\n <hr>\n <!-- device -->\n <div id=\"device\">\n <div class=\"box-tb\">\n <div class=\"topic\">หน่วยงาน</div>\n <div class=\"text\" id=\"agcy\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">กลุ่มงาน</div>\n <div class=\"text\" id=\"dept\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">ชื่ออุปกรณ์</div>\n <div class=\"text\" id=\"dname\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">เลขทรัพย์สิน</div>\n <div class=\"text\" id=\"assno\">:</div>\n </div>\n <button id=\"btn-edit\" class=\"circle sm blue\"\n shadow=\"true\">&#xf5ae;</button>\n </div>\n <hr>\n <!-- hwinfo -->\n <div id=\"hwinfo\">\n <div class=\"box-tb\">\n <div class=\"topic\">Hostname</div>\n <div class=\"text\" id=\"host\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">Platform</div>\n <div class=\"text\" id=\"os\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">CpuModel</div>\n <div class=\"text\" id=\"cpu\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">Memory</div>\n <div class=\"text\" id=\"mem\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">Uptime</div>\n <div class=\"text\" id=\"uptime\">:</div>\n </div>\n </div>\n <hr>\n <!-- x -->\n <div id=\"\">\n <div class=\"box-tb\">\n <div class=\"topic\">SmartCard</div>\n <div class=\"text\" id=\"\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">Biometric</div>\n <div class=\"text\" id=\"\">:</div>\n </div>\n </div>\n </div>\n</div>\n<style>\n #page-svchub {\n margin: auto;\n max-width: 600px;\n min-width: 480px;\n line-height: 1.5;\n }\n #page-svchub .topic {\n float: left;\n width: 100px;\n font-weight: 600;\n }\n #page-svchub .text {\n float: left;\n width: calc(100% - 100px);\n }\n #page-svchub #device {\n position: relative;\n }\n #page-svchub #btn-edit {\n position: absolute;\n top: 0;\n right: 0;\n }\n</style>\n`;\n\nexport const frmDevice: string = /*html*/ `\n<div id=\"frm-device\" class=\"cover grid\">\n <div class=\"input-box span\">\n <select id=\"inp-agcy\" required></select>\n <div class=\"label\">หน่วยงาน *</div>\n </div>\n <div class=\"input-box span\">\n <select id=\"inp-dept\"></select>\n <div class=\"label\">กลุ่มงาน/ส่วนงาน</div>\n </div>\n <div class=\"input-box span\">\n <input type=\"text\" id=\"inp-name\" maxlength=\"100\" required>\n <div class=\"label\">ชื่ออุปกรณ์ *</div>\n </div>\n</div>\n<style>\n #frm-device {\n gap: 5px;\n }\n #frm-device .dvsn {\n font-weight: 600;\n }\n #frm-device .sect {\n font-style: italic;\n }\n</style>\n`;","/* agcy */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (agcy?: number) => new Promise<ApiRsp>((resolve, reject) => {\n let url = `/agcy`;\n if (agcy) url = `/agcy/${agcy}`;\n // fetch\n fetch(gbvar.hub.API + url, {\n method: 'GET',\n headers: gbvar.api.HEADERS,\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Set = async (elm: HTMLSelectElement) => {\n elm.innerHTML = '<option value=\"\">- เลือก -</option>';\n await Read().then(resp => {\n const data = resp.data as AgcyPack[];\n for (const val of data) {\n const name = val.short ? val.short : val.name;\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = name;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\nexport type AgcyPack = {\n id: number;\n code: string;\n init_en: string;\n init_th: string;\n name: string;\n short: string;\n status: number;\n};","/* dept */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (agcy: number) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/dept`;\n // fetch\n fetch(gbvar.hub.API + url, {\n method: 'GET',\n headers: gbvar.api.HEADERS,\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Set = async (agcy: number, elm: HTMLSelectElement) => {\n elm.innerHTML = '<option value=\"\">- เลือก -</option>';\n await Read(agcy).then(resp => {\n const data = resp.data as DeptPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.dvsn},${val.sect}`;\n if (val.sect == 0) {\n opt.text = `${val.name}`;\n opt.style.fontWeight = '600';\n } else {\n opt.text = `- ${val.name}`;\n opt.style.fontStyle = 'italic';\n }\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\nexport type DeptPack = {\n dvsn: number;\n sect: number;\n name: string;\n status: number;\n};","/* account */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\n// access\nexport * as access from './access';\nexport type { AccsPack, AccsProfile } from './access';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (\n agcy: number,\n acct?: number,\n params?: {\n dvsn?: number;\n sect?: number;\n actype?: number;\n acrole?: number;\n status?: number;\n }\n) => new Promise<ApiRsp>((resolve, reject) => {\n const status = params && params.status ? params.status : 1;\n let query = `?status=${status}`;\n if (params) {\n const dvsn = params.dvsn ? params.dvsn : 0;\n const sect = params.sect ? params.sect : 0;\n const actype = params.actype ? params.actype : 0;\n const acrole = params.acrole ? params.acrole : 0;\n if (dvsn) query += `&dvsn=${dvsn}`;\n if (sect) query += `&sect=${sect}`;\n if (actype) query += `&actype=${actype}`;\n if (acrole) query += `&acrole=${acrole}`;\n }\n let url = `/agcy/${agcy}/acct${query}`;\n if (acct) url = `/agcy/${agcy}/acct/${acct}`;\n // fetch\n fetch(gbvar.hub.API + url, {\n method: 'GET',\n headers: gbvar.api.HEADERS,\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Create = (\n agcy: number,\n params: unknown,\n) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/acct`;\n fetch(gbvar.hub.API + url, {\n method: 'POST',\n headers: gbvar.api.HEADERS,\n body: JSON.stringify(params),\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Update = (\n agcy: number,\n acct: number,\n params: unknown,\n) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/acct/${acct}`;\n fetch(gbvar.hub.API + url, {\n method: 'PUT',\n headers: gbvar.api.HEADERS,\n body: JSON.stringify(params),\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\n/*\nexport const Delete = (\n agcy: number,\n acct: number,\n) => new Promise<ApiRsp>((resolve, reject) => { });\n/*--------------------------------------------------------------------------------*/\nexport type AcctPack = {\n agcy: number;\n dvsn: number;\n sect: number;\n acct: number;\n actype: number;\n acrole: number;\n status: number;\n picture: string;\n profile: unknown;\n\n agcy_name: string;\n dvsn_name: string;\n sect_name: string;\n};\nexport type TypeHuman = {\n id: number;\n hmtype: number;\n hmposn: number;\n hmrank: number;\n tname: string;\n fname: string;\n lname: string;\n};\nexport type TypeDevice = {\n id: number;\n dvtype: number;\n assets: number;\n name: string;\n};\nexport type TypeVendor = {\n id: number;\n vdtype: number;\n vdno: string;\n name: string;\n bankno: string;\n bkacct: string;\n bkname: string;\n};","/* device */\n/*--------------------------------------------------------------------------------*/\nimport * as modModal from '../../mod/modal';\nimport * as modDialog from '../../mod/dialog';\nimport { strCheck } from '../../lib/utility';\nimport { frmDevice } from './template';\n// apihub\nimport { Set as setAgcy } from '../api/agency/agcy';\nimport { Set as setDept } from '../api/agency/dept';\nimport * as apiAcct from '../api/account';\nimport type { AcctPack, TypeDevice } from '../api/account';\n/*--------------------------------------------------------------------------------*/\nexport const Create = (csid: string) => new Promise<void>((resolve, reject) => {\n // create modal\n const modal = modModal.Create({\n title: 'เพิ่มคอมพิวเตอร์',\n icon: '&#xf390;',\n width: '400px',\n body: frmDevice,\n button: { save: true, cancel: true },\n });\n // input\n const inpAgcy = modal.querySelector<HTMLSelectElement>('#inp-agcy')!;\n const inpDept = modal.querySelector<HTMLSelectElement>('#inp-dept')!;\n const inpName = modal.querySelector<HTMLInputElement>('#inp-name')!;\n inpAgcy.onchange = () => {\n setDept(Number(inpAgcy.value), inpDept);\n };\n (async () => {\n await setAgcy(inpAgcy);\n await setDept(Number(inpAgcy.value), inpDept);\n // modal ready\n modModal.Ready(modal);\n })();\n // submit\n const form = modal.querySelector<HTMLFormElement>('form');\n if (form) form.onsubmit = async (e) => {\n e.preventDefault();\n modModal.Hidden(modal);\n const res = await modDialog.Confirm('ยืนยัน.! การบันทึกข้อมูล');\n modModal.Visible(modal);\n if (res) {\n modModal.Loading(modal);\n const newAgcy = Number(inpAgcy.value);\n const [dvsn, sect] = (inpDept.value).split(',');\n const params = {\n agcy: newAgcy,\n dvsn: dvsn ? Number(dvsn) : 0,\n sect: sect ? Number(sect) : 0,\n actype: 2, // อุปกรณ์\n acrole: 8, // คอมพิวเตอร์\n acuuid: strCheck(csid),\n profile: {\n dvtype: 1, // คอมพิวเตอร์\n name: strCheck(inpName.value),\n }\n };\n await apiAcct.Create(newAgcy, params).then(() => {\n modModal.Close(modal);\n modDialog.Toast('บันทึกข้อมูล สำเร็จ.!', { type: 'success' });\n resolve();\n }).catch((err) => {\n modModal.Close(modal);\n modDialog.Alert('เกิดข้อผิดพลาด...!', { type: 'failure' });\n reject(err);\n });\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const Update = (\n agcy: number,\n acct: number,\n csid: string,\n) => new Promise<void>((resolve, reject) => {\n // create modal\n const modal = modModal.Create({\n title: 'แก้ไขรายละเอียด',\n icon: '&#xf390;',\n width: '400px',\n body: frmDevice,\n button: { save: true, cancel: true },\n });\n // input\n const inpAgcy = modal.querySelector<HTMLSelectElement>('#inp-agcy')!;\n const inpDept = modal.querySelector<HTMLSelectElement>('#inp-dept')!;\n const inpName = modal.querySelector<HTMLInputElement>('#inp-name')!;\n inpAgcy.onchange = () => {\n setDept(Number(inpAgcy.value), inpDept);\n };\n // read\n (async () => {\n await apiAcct.Read(agcy, acct).then(async (resp) => {\n const data = resp.data as AcctPack;\n const profile = data.profile as TypeDevice;\n await setAgcy(inpAgcy);\n await setDept(data.agcy, inpDept);\n inpAgcy.value = String(data.agcy);\n inpDept.value = data.dvsn ? `${data.dvsn},${data.sect}` : '';\n inpName.value = profile.name;\n }).catch(err => console.error(err));\n // modal ready\n modModal.Ready(modal);\n })();\n // submit\n const form = modal.querySelector<HTMLFormElement>('form');\n if (form) form.onsubmit = async (e) => {\n e.preventDefault();\n modModal.Hidden(modal);\n const res = await modDialog.Confirm('ยืนยัน.! การบันทึกข้อมูล');\n modModal.Visible(modal);\n if (res) {\n modModal.Loading(modal);\n const newAgcy = Number(inpAgcy.value);\n const [dvsn, sect] = (inpDept.value).split(',');\n const params = {\n agcy: newAgcy,\n dvsn: dvsn ? Number(dvsn) : 0,\n sect: sect ? Number(sect) : 0,\n actype: 2, // อุปกรณ์\n acrole: 8, // คอมพิวเตอร์\n acuuid: strCheck(csid),\n profile: {\n dvtype: 1, // คอมพิวเตอร์\n name: strCheck(inpName.value),\n }\n };\n await apiAcct.Update(agcy, acct, params).then(() => {\n modModal.Close(modal);\n modDialog.Toast('บันทึกข้อมูล สำเร็จ.!', { type: 'success' });\n resolve();\n }).catch((err) => {\n modModal.Close(modal);\n modDialog.Alert('เกิดข้อผิดพลาด...!', { type: 'failure' });\n reject(err);\n });\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const PwdChk = () => new Promise<boolean>((resolve) => {\n // create modal\n const modal = modModal.Create({\n title: 'กรอกรหัสผ่าน',\n icon: '&#xf084;',\n width: '230px',\n body: /*html*/ `\n <div class=\"cover\">\n <input type=\"password\" id=\"inp-pass\"\n value=\"admin@wkr\" style=\"width: 100%;\">\n </div>\n `,\n button: { save: true, cancel: true, align: 'center' },\n });\n // modal ready\n modModal.Ready(modal);\n // input\n const inpPass = modal.querySelector<HTMLInputElement>('#inp-pass');\n inpPass?.focus();\n // submit\n const form = modal.querySelector<HTMLFormElement>('form');\n if (form) form.onsubmit = async (e) => {\n e.preventDefault();\n const pass = (inpPass?.value)?.trim();\n if (pass === 'admin@wkr') {\n await modModal.Close(modal);\n resolve(true);\n } else {\n await modDialog.Alert('รหัสผ่าน.! ไม่ถูกต้อง', { type: 'failure' });\n inpPass?.focus();\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\n","/* hwlink */\n/*--------------------------------------------------------------------------------*/\nimport { gbvar } from '../../mod/global';\nimport { Loading, Ready } from '../../page';\nimport * as cover from '../../mod/built-in/cover';\nimport * as device from './device';\nimport { template } from './template';\nconst app = document.querySelector<HTMLElement>('#app');\nlet AGCY: number;\nlet ACCT: number;\nlet CSID: string;\nlet isREADY: boolean;\nlet WSSVC: WebSocket;\nlet boxDv: HTMLElement;\n/*--------------------------------------------------------------------------------*/\nexport const HwLink = () => {\n if (!app) return;\n // template\n const content = document.createElement('div');\n content.id = 'app-content';\n content.innerHTML = template;\n app.classList.add('full-page');\n app.appendChild(content);\n boxDv = app.querySelector<HTMLElement>('#device')!;\n // btn-edit\n const btnEdit = app.querySelector<HTMLButtonElement>('#btn-edit');\n if (btnEdit) btnEdit.onclick = async () => {\n if (await device.PwdChk()) {\n if (AGCY > 0 && ACCT > 0 && CSID != '') {\n device.Update(AGCY, ACCT, CSID).then(() => {\n cover.Loading(boxDv, true);\n WSSVC.send('{\"head\": \"KEYRST\"}');\n }).catch(err => console.error(err));\n } else {\n device.Create(CSID).then(() => {\n cover.Loading(boxDv, true);\n WSSVC.send('{\"head\": \"KEYRST\"}');\n }).catch(err => console.error(err));\n }\n }\n };\n // wait socket\n Loading();\n AGCY = 0;\n ACCT = 0;\n CSID = '';\n isREADY = false;\n // hide btn if empty token\n if (!gbvar.api.TOKEN) {\n const btn = app.querySelectorAll<HTMLButtonElement>('button');\n btn.forEach(elm => elm.style.display = 'none');\n }\n wsSvc();\n};\n/*--------------------------------------------------------------------------------*/\nconst wsSvc = () => {\n WSSVC = new WebSocket(gbvar.hwl.HOST);\n WSSVC.onopen = () => {\n hwinfo();\n dvinfo();\n T_hwinfo = setInterval(hwinfo, 1000 * 10);\n };\n WSSVC.onclose = () => {\n clearInterval(T_hwinfo);\n setTimeout(wsSvc, 1000 * 10);\n };\n WSSVC.onmessage = (e) => {\n const resp = JSON.parse(e.data);\n const head = resp.head ? resp.head : '';\n const data = resp.data ? resp.data : '';\n if (head == 'CSUUID') CSID = data;\n if (head == 'HWINFO') setHwInfo(data);\n if (head == 'DVINFO') {\n if (!isREADY) {\n isREADY = true;\n Ready();\n }\n setDvInfo(data);\n cover.Loading(boxDv, false);\n }\n };\n let T_hwinfo: NodeJS.Timeout;\n const hwinfo = () => WSSVC.send('{\"head\": \"HWINFO\"}');\n const dvinfo = () => WSSVC.send('{\"head\": \"DVINFO\"}');\n};\n/*--------------------------------------------------------------------------------*/\nconst setHwInfo = (data: {\n csuuid: string;\n hostname: string;\n platform: string;\n uptime: number;\n svc: {\n hwlink: string;\n autoup: string;\n };\n cpu: {\n model: string;\n percent: number;\n };\n mem: {\n total: number;\n used: number;\n percent: number;\n };\n}) => {\n if (!app) return;\n // svcinfo\n const svc = data.svc;\n app.querySelector<HTMLElement>('#hwlink')!.innerText = `: ${svc.hwlink}`;\n app.querySelector<HTMLElement>('#autoup')!.innerText = `: ${svc.autoup}`;\n app.querySelector<HTMLElement>('#csuuid')!.innerText = `: ${data.csuuid}`;\n // hwinfo\n const cpu = data.cpu;\n const mem = data.mem;\n const hwinfo = app.querySelector<HTMLElement>('#hwinfo')!;\n const uptime = Number(data.uptime);\n const hh = Math.floor(uptime / 3600);\n const mm = Math.floor((uptime % 3600) / 60);\n const memUsed = (Number(mem.used) / 1024 / 1024 / 1024).toFixed(1);\n const memTotal = (Number(mem.total) / 1024 / 1024 / 1024).toFixed(1);\n const mem_text = `${memUsed}/${memTotal} GB (${mem.percent}%)`;\n hwinfo.querySelector<HTMLElement>('#host')!.innerText = `: ${data.hostname}`;\n hwinfo.querySelector<HTMLElement>('#os')!.innerText = `: ${data.platform}`;\n hwinfo.querySelector<HTMLElement>('#cpu')!.innerText = `: ${cpu.model}`;\n app.querySelector<HTMLElement>('#mem')!.innerText = `: ${mem_text}`;\n app.querySelector<HTMLElement>('#uptime')!.innerText = `: ${hh} h ${mm} m`;\n};\n/*--------------------------------------------------------------------------------*/\nconst setDvInfo = (data: {\n agcy: number;\n dvsn: number;\n sect: number;\n acct: number;\n acname: string;\n agcy_name: string;\n dvsn_name: string;\n sect_name: string;\n}) => {\n if (!app || !data.acct || Number(data.acct) == 0) return;\n AGCY = Number(data.agcy);\n ACCT = Number(data.acct);\n let dept = data.dvsn_name;\n if (Number(data.sect) > 0) {\n dept += ` - ${data.sect_name}`;\n }\n app.querySelector<HTMLElement>('#agcy')!.innerText = `: ${data.agcy_name}`;\n app.querySelector<HTMLElement>('#dept')!.innerText = `: ${dept}`;\n app.querySelector<HTMLElement>('#dname')!.innerText = `: ${data.acname}`;\n};\n/*--------------------------------------------------------------------------------*/\n"],"mappings":"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","names":["app","app","Loading","app","content","Loading","Ready","app","Read","Set","Read","Create","Create","Set","Ready","Loading","Update","Read","app","Update","Loading","Create"]}