slimsdk 0.1.55 → 0.2.0
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/README.md +1 -1
- package/dist/desktop/index.d.ts +13 -12
- package/dist/desktop/index.js +1228 -1967
- package/dist/desktop/index.js.map +1 -1
- package/dist/index-3POan8Vl.d.ts +94 -0
- package/dist/index-B4158M0u.d.ts +21 -0
- package/dist/index-BAQxKstM.d.ts +8 -0
- package/dist/index-BMqjxP9I.d.ts +11 -0
- package/dist/index-CD53Vh6h.d.ts +31 -0
- package/dist/index-CoYHkkyT.d.ts +14 -0
- package/dist/index-D5CUpF9v.d.ts +10 -0
- package/dist/index-DBhzpIiB.d.ts +32 -0
- package/dist/index-DCw_tM-R.d.ts +28 -0
- package/dist/{index-kr8P3eEW.d.ts → index-DWqF-tKY.d.ts} +7 -9
- package/dist/index-DzKPF0ja.d.ts +14 -0
- package/dist/index-jVam7Sxi.d.ts +15 -0
- package/dist/index-uQOR5bdy.d.ts +20 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/lib/index.d.ts +1 -1
- package/dist/lib/index.js +1 -1
- package/dist/lib/index.js.map +1 -1
- package/dist/mobile/index.d.ts +13 -12
- package/dist/mobile/index.js +299 -808
- package/dist/mobile/index.js.map +1 -1
- package/dist/mod/button/index.d.ts +1 -1
- package/dist/mod/button/index.js +2 -2
- package/dist/mod/button/index.js.map +1 -1
- package/dist/mod/config/index.d.ts +52 -0
- package/dist/mod/{global → config}/index.js +45 -41
- package/dist/mod/config/index.js.map +1 -0
- package/dist/mod/cover/index.d.ts +1 -1
- package/dist/mod/cover/index.js +3 -3
- package/dist/mod/cover/index.js.map +1 -1
- package/dist/mod/dialog/index.d.ts +1 -1
- package/dist/mod/dialog/index.js +13 -13
- package/dist/mod/dialog/index.js.map +1 -1
- package/dist/mod/drawer/index.d.ts +1 -1
- package/dist/mod/drawer/index.js +8 -8
- package/dist/mod/drawer/index.js.map +1 -1
- package/dist/mod/drop/index.d.ts +1 -1
- package/dist/mod/drop/index.js +15 -15
- package/dist/mod/drop/index.js.map +1 -1
- package/dist/mod/hwlink/index.d.ts +2 -2
- package/dist/mod/hwlink/index.js +44 -656
- package/dist/mod/hwlink/index.js.map +1 -1
- package/dist/mod/index.d.ts +7 -7
- package/dist/mod/index.js +61 -59
- package/dist/mod/index.js.map +1 -1
- package/dist/mod/modal/index.d.ts +1 -1
- package/dist/mod/modal/index.js +12 -12
- package/dist/mod/modal/index.js.map +1 -1
- package/dist/mod/tabs/index.d.ts +1 -1
- package/dist/mod/tabs/index.js +8 -6
- package/dist/mod/tabs/index.js.map +1 -1
- package/dist/page/desktop/index.d.ts +3 -3
- package/dist/page/desktop/index.js +228 -801
- package/dist/page/desktop/index.js.map +1 -1
- package/dist/page/index.d.ts +7 -7
- package/dist/page/index.js +12 -12
- package/dist/page/index.js.map +1 -1
- package/dist/page/mobile/index.d.ts +2 -2
- package/dist/page/mobile/index.js +14 -14
- package/dist/page/mobile/index.js.map +1 -1
- package/dist/worker/hubworker.js +1 -1
- package/dist/worker/hubworker.js.map +1 -1
- package/package.json +6 -6
- package/dist/index-B2HHS23A.d.ts +0 -20
- package/dist/index-BQcJsVJ-.d.ts +0 -10
- package/dist/index-Bf_lg-oZ.d.ts +0 -339
- package/dist/index-ChdqOPJq.d.ts +0 -15
- package/dist/index-CzsSwSvp.d.ts +0 -21
- package/dist/index-D3tu8t6p.d.ts +0 -28
- package/dist/index-DQt71MNx.d.ts +0 -31
- package/dist/index-DZdXvqxA.d.ts +0 -10
- package/dist/index-DcvauYN8.d.ts +0 -14
- package/dist/index-Pd7FTiEW.d.ts +0 -32
- package/dist/index-QRbamarh.d.ts +0 -8
- package/dist/mod/global/index.d.ts +0 -57
- package/dist/mod/global/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/page/index.ts","../../../src/mod/global.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","../../../src/mod/built-in/button/index.ts","../../../src/mod/drop/index.ts","../../../src/page/desktop/index.ts"],"sourcesContent":["/* 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\"></i>\n <div class=\"topic\">✦ เกิดข้อผิดพลาด ✦</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","/* 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=\"กลับด้านบน\"></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/*------------------------------------------------------------*/","/* 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></i>บันทึก\n </button>\n`;\nconst tmpBtnCancel: string = /* html */ `\n <button class=\"solid gray\" type=\"button\" id=\"btn-cancel\">\n <i></i>ยกเลิก\n </button>\n`;\nconst tmpBtnClose: string = /* html */ `\n <button class=\"solid blue\" type=\"button\" id=\"btn-close\">\n <i></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 : '';\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\"></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\"></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></i>ยกเลิก\n </button>\n <button class=\"lg ${color} right\" id=\"btn-yes\">\n <i></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 = ''; }\n if (type == 'failure') { color = 'red'; icon = ''; }\n if (type == 'warning') { color = 'orange'; icon = ''; }\n if (type == 'info') { color = 'blue'; icon = ''; }\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 = ''; }\n if (type == 'failure') { color = 'red'; icon = ''; }\n if (type == 'warning') { color = 'orange'; icon = ''; }\n if (type == 'info') { color = 'blue'; icon = ''; }\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\"></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}`;\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: '',\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: '',\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: '',\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","/* button */\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (\n btn: HTMLButtonElement,\n state = false,\n) => {\n if (state) {\n btn.querySelector<HTMLElement>('.btn-loader')?.remove();\n btn.style.color = 'transparent';\n btn.style.position = 'relative';\n btn.style.pointerEvents = 'none';\n const loader = document.createElement('div');\n loader.className = 'btn-loader';\n loader.innerHTML = `<div class=\"spinner s22\"></div>`;\n btn.appendChild(loader);\n } else {\n btn.querySelector<HTMLElement>('.btn-loader')?.remove();\n btn.style.color = '';\n btn.style.position = '';\n btn.style.pointerEvents = '';\n }\n};\n/*--------------------------------------------------------------------------------*/\n","/* drop */\n/*--------------------------------------------------------------------------------*/\nexport const Menu = (drop: HTMLElement) => {\n const dropBtn = drop.querySelector<HTMLButtonElement>('.drop-btn');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!dropBtn || !content) return;\n setBtnEvent(dropBtn, content);\n};\n/*--------------------------------------------------------------------------------*/\nexport const Select = (\n drop: HTMLElement,\n icon: string,\n callBack: (value: string, text: string) => void,\n) => {\n const dropBtn = drop.querySelector<HTMLButtonElement>('.drop-btn');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!dropBtn || !content) return;\n setBtnEvent(dropBtn, content);\n Update(drop, icon, callBack);\n};\n/*--------------------------------------------------------------------------------*/\nexport const Update = (\n drop: HTMLElement,\n icon: string,\n callBack: (value: string, text: string) => void,\n) => {\n const select = drop.querySelector<HTMLSelectElement>('select');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!select || !content) return;\n let elmIcon = '';\n if (icon) elmIcon = `<span style=\"margin-right: 6px;\">${icon}</span>`;\n // select to menu\n content.innerHTML = '';\n const option = select.querySelectorAll<HTMLOptionElement>('option');\n option.forEach(opt => {\n const item = document.createElement('a');\n item.innerHTML = `${elmIcon}${opt.text}`;\n content.appendChild(item);\n // drop click\n item.onclick = () => {\n opt.selected = true;\n clearSelected();\n if (callBack) {\n callBack(opt.value, opt.text);\n }\n };\n });\n // clear selected\n const clearSelected = () => {\n const index = select.selectedIndex;\n const list = content.querySelectorAll<HTMLAnchorElement>('a');\n list.forEach((el, i) => {\n if (i == index) {\n el.classList.add('selected');\n } else {\n el.classList.remove('selected');\n }\n });\n };\n clearSelected();\n};\n/*--------------------------------------------------------------------------------*/\nconst setBtnEvent = (btn: HTMLButtonElement, content: HTMLElement) => {\n btn.onclick = () => {\n if (content.style.display == 'block') {\n content.style.animation = 'fade-out 0.4s forwards';\n content.onanimationend = () => {\n content.style.animation = '';\n content.style.display = '';\n };\n } else {\n Clear();\n content.style.animation = 'fade-in 0.4s forwards';\n content.style.display = 'block';\n content.onanimationend = () => {\n content.style.animation = '';\n };\n }\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const Clear = () => {\n const drop = document.querySelectorAll<HTMLElement>('.drop-content');\n drop.forEach(el => {\n if (el.style.display == 'block') {\n el.style.animation = 'fade-out 0.4s forwards';\n el.onanimationend = () => {\n el.style.animation = '';\n el.style.display = '';\n };\n }\n });\n};\nwindow.addEventListener('click', (e) => {\n if (!(<HTMLElement>e.target).matches('.drop-btn')) Clear();\n});\n/*--------------------------------------------------------------------------------*/\n","/* page */\n/*--------------------------------------------------------------------------------*/\nexport * from '../index';\nexport { HwLink } from '../../svchub/hwlink';\nimport { gbvar } from '../../mod/global';\nimport { Confirm } from '../../mod/dialog';\nimport { winPopup } from '../../lib/utility';\nimport * as modBtn from '../../mod/built-in/button';\nimport { Menu as setDropMenu } from '../../mod/drop';\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport type PageParams = {\n uri?: string;\n size?: string;\n topbar?: string;\n sidebar?: string;\n template?: string;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Create = (params: PageParams): boolean => {\n if (!app) return false;\n const uri = params.uri ? params.uri : '';\n const size = params.size ? params.size : '';\n const topbar = params.topbar ? params.topbar : '';\n const sidebar = params.sidebar ? params.sidebar : '';\n const template = params.template ? params.template : '';\n // content\n const content = document.createElement('div');\n content.id = 'app-content';\n content.innerHTML = template;\n app.appendChild(content);\n // page init\n let newNav = false;\n if (size == 'full') {\n app.classList.add('full-page');\n navRemove();\n } else {\n app.classList.remove('full-page');\n if (!document.querySelector('#topbar')) {\n navCreate({ topbar: topbar, sidebar: sidebar });\n newNav = true;\n }\n navActive(uri);\n }\n return newNav;\n};\n/*--------------------------------------------------------------------------------*/\n// ### navbar ###\n/*--------------------------------------------------------------------------------*/\nconst navCreate = (params: { topbar: string; sidebar: string; }) => {\n // create topbar, sidebar\n const topbar = document.createElement('nav');\n const sidebar = document.createElement('nav');\n topbar.id = 'topbar';\n sidebar.id = 'sidebar';\n topbar.innerHTML = params.topbar;\n sidebar.innerHTML = params.sidebar;\n document.body.prepend(topbar, sidebar);\n // screen resize\n const setScreen = () => {\n const scWidth = window.innerWidth ? window.innerWidth : screen.width;\n const scHeight = window.innerHeight ? window.innerHeight : screen.height;\n const boxScreen = topbar.querySelector<HTMLElement>('#screen');\n if (boxScreen) boxScreen.innerHTML = `${scWidth}x${scHeight}`;\n // nav-menu action\n if (scWidth < 600) navMenu(true);\n else navMenu(false);\n };\n setScreen();\n window.addEventListener('resize', setScreen);\n // dropdown\n const dropUser = topbar.querySelector<HTMLElement>('#drop-user');\n if (dropUser) setDropMenu(dropUser);\n // logout\n const logout = () => {\n Confirm('ยืนยัน..! การออกจากระบบ').then(res => {\n if (res) window.location.replace('/logout');\n });\n };\n const navLogout = document.querySelectorAll<HTMLElement>('#nav-logout');\n navLogout.forEach(el => el.onclick = logout);\n // hwlink\n navHwLink();\n};\n/*--------------------------------------------------------------------------------*/\nconst navRemove = () => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (topbar) topbar.remove();\n if (sidebar) sidebar.remove();\n};\n/*--------------------------------------------------------------------------------*/\nconst navActive = (uri: string) => {\n if (uri.indexOf('#') > 0) {\n uri = uri.substring(0, uri.indexOf('#'));\n }\n clearNavActive();\n if (!uri) return;\n const sideBtn = document.querySelectorAll<HTMLButtonElement>('#sidebar button');\n sideBtn.forEach(btn => {\n const path = btn.getAttribute('href');\n if (!btn.disabled && uri == path) {\n btn.classList.add('active');\n // grp-btn\n if (btn.classList.contains('grp-btn')) {\n const menu = btn.parentNode?.querySelector<HTMLElement>('.submenu');\n const grpBtn = btn.parentNode?.querySelector<HTMLElement>('.grp-btn');\n if (menu && grpBtn) {\n menu.style.maxHeight = '400px';\n grpBtn.classList.add('bar');\n }\n }\n // sub-btn\n if (btn.classList.contains('sub-btn')) {\n const menu = btn.parentNode as HTMLElement;\n const grpBtn = menu.parentNode?.querySelector<HTMLElement>('.grp-btn');\n if (menu && grpBtn && menu.classList.contains('submenu')) {\n menu.style.maxHeight = '400px';\n grpBtn.classList.add('active');\n grpBtn.classList.remove('bar');\n }\n }\n }\n });\n};\nconst clearNavActive = () => {\n // sidebtn\n const sideBtn = document.querySelectorAll<HTMLButtonElement>('#sidebar button');\n sideBtn.forEach(btn => btn.classList.remove('active'));\n // submenu\n const subMenu = document.querySelectorAll<HTMLElement>('#sidebar .submenu');\n subMenu.forEach(elm => elm.style.maxHeight = '0');\n};\n/*--------------------------------------------------------------------------------*/\nconst navMenu = (state: boolean) => {\n const navMenu = document.querySelector<HTMLElement>('#topbar #nav-menu');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (!navMenu || !sidebar) return;\n if (state) {\n navMenu.onclick = () => {\n const posLeft = sidebar.getBoundingClientRect().left;\n if (posLeft == 0) {\n sidebar.classList.remove('menu-in');\n sidebar.classList.add('menu-out');\n } else {\n sidebar.classList.remove('menu-out');\n sidebar.classList.add('menu-in');\n }\n };\n } else {\n navMenu.onclick = null;\n sidebar.classList.remove('menu-in');\n sidebar.classList.remove('menu-out');\n }\n};\n/*--------------------------------------------------------------------------------*/\nexport const Clear = () => {\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (!sidebar) return;\n const scWidth = window.innerWidth ? window.innerWidth : screen.width;\n const posLeft = sidebar.getBoundingClientRect().left;\n if (scWidth < 600 && posLeft == 0) {\n sidebar.classList.remove('menu-in');\n sidebar.classList.add('menu-out');\n }\n};\nwindow.addEventListener('click', (e) => {\n if (!(<HTMLElement>e.target).matches('#nav-menu')) Clear();\n});\n/*--------------------------------------------------------------------------------*/\nconst navHwLink = () => {\n const btnHwl = document.querySelector<HTMLButtonElement>('#nav-hwlink');\n if (!btnHwl) return;\n const agent = navigator.userAgent.toLowerCase();\n if (agent.indexOf('win') != -1) {\n btnHwl.style.display = 'block';\n btnHwl.onclick = () => {\n modBtn.Loading(btnHwl, true);\n const ws = new WebSocket(gbvar.hwl.HOST);\n ws.onerror = () => {\n download();\n done();\n };\n ws.onopen = () => {\n ws.close();\n winPopup(500, 485, 'hwlink', '/hwlink');\n done();\n };\n const done = () => {\n modBtn.Loading(btnHwl, false);\n };\n };\n } else {\n btnHwl.style.display = 'none';\n }\n const download = () => {\n const url = gbvar.hwl.FILE;\n const link = document.createElement('a');\n link.href = url;\n link.download = String(url.split('/').pop());\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n};\n/*--------------------------------------------------------------------------------*/\nconst onlineStatus = () => {\n const boxTime = document.querySelector<HTMLElement>('#box-time');\n const svTime = document.querySelector<HTMLElement>('#box-time #sv-time');\n const svDate = document.querySelector<HTMLElement>('#box-time #sv-date');\n if (!boxTime || !svTime || !svDate) return;\n if (window.navigator.onLine) {\n boxTime.classList.remove('offline');\n svTime.innerHTML = ' ';\n svDate.innerHTML = ' ';\n } else {\n boxTime.classList.add('offline');\n svTime.innerHTML = 'network';\n svDate.innerHTML = 'OFFLINE';\n }\n};\nwindow.addEventListener('online', onlineStatus);\nwindow.addEventListener('offline', onlineStatus);\n/*--------------------------------------------------------------------------------*/\n"],"mappings":"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","names":["app","Loading","app","content","Loading","Ready","app","Read","Set","Read","Create","Create","Set","Ready","Loading","Update","Read","app","Update","Loading","Create","Loading","app","Create","template","navMenu","Clear","Loading"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/config/global.ts","../../../src/config/index.ts","../../../src/mod/dialog/index.ts","../../../src/lib/utility.ts","../../../src/mod/built-in/button/index.ts","../../../src/mod/drop/index.ts","../../../src/page/index.ts","../../../src/svchub/hwlink/template.ts","../../../src/svchub/hwlink/index.ts","../../../src/page/desktop/index.ts"],"sourcesContent":["/* global */\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=\"กลับด้านบน\"></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/*------------------------------------------------------------*/","/* config */\nexport { init, info } from './global';\n/*------------------------------------------------------------*/\nexport const cfg: Config = {\n UNIX_TIME: 0,\n app: {\n UUID: '',\n NAME: '',\n SECRET: '',\n VERSION: '',\n RELEASE: '',\n CALLBACK: '',\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 sub: 0,\n name: '',\n utyp: '',\n unit: '',\n unit_id: 0,\n role_id: 0,\n metadata: {\n emp_type: '',\n emp_level: '',\n position: '',\n },\n picture: '',\n }\n};\n/*------------------------------------------------------------*/\ntype Config = {\n UNIX_TIME: number;\n app: AppCfg;\n api: ApiCfg;\n hub: HubCfg;\n hwl: HwlCfg;\n user: UserCfg;\n};\ntype AppCfg = {\n UUID: string;\n NAME: string;\n SECRET: string;\n VERSION: string;\n RELEASE: string;\n CALLBACK: string;\n};\ntype ApiCfg = {\n URL: string;\n TOKEN: string;\n HEADERS?: Headers;\n};\ntype HubCfg = {\n LOGIN: string;\n OAUTH: string;\n API: string;\n WSS: string;\n UUID: string;\n TASK?: Worker;\n};\ntype HwlCfg = {\n HOST: string;\n FILE: string;\n};\ntype UserCfg = {\n sub: number;\n name: string;\n utyp: string;\n unit: string;\n unit_id: number;\n role_id: number;\n metadata: {\n emp_type: string;\n emp_level: string;\n position: string;\n };\n picture: string;\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\"></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></i>ยกเลิก\n </button>\n <button class=\"lg ${color} right\" id=\"btn-yes\">\n <i></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 = ''; }\n if (type == 'failure') { color = 'red'; icon = ''; }\n if (type == 'warning') { color = 'orange'; icon = ''; }\n if (type == 'info') { color = 'blue'; icon = ''; }\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 = ''; }\n if (type == 'failure') { color = 'red'; icon = ''; }\n if (type == 'warning') { color = 'orange'; icon = ''; }\n if (type == 'info') { color = 'blue'; icon = ''; }\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 JwtClaims = {\n iss: string;\n aud: string;\n iat: number;\n exp: number;\n sub: number;\n};\nexport const jwtParse = (token: string): JwtClaims | null => {\n try { return JSON.parse(atob(token.split('.')[1])); }\n catch { return null; }\n};\n/*--------------------------------------------------------------------------------*/\n","/* button */\n/*--------------------------------------------------------------------------------*/\nexport const loading = (\n btn: HTMLButtonElement,\n state = false,\n) => {\n if (state) {\n btn.querySelector<HTMLElement>('.btn-loader')?.remove();\n btn.style.color = 'transparent';\n btn.style.position = 'relative';\n btn.style.pointerEvents = 'none';\n const loader = document.createElement('div');\n loader.className = 'btn-loader';\n loader.innerHTML = `<div class=\"spinner s22\"></div>`;\n btn.appendChild(loader);\n } else {\n btn.querySelector<HTMLElement>('.btn-loader')?.remove();\n btn.style.color = '';\n btn.style.position = '';\n btn.style.pointerEvents = '';\n }\n};\n/*--------------------------------------------------------------------------------*/\n","/* drop */\n/*--------------------------------------------------------------------------------*/\nexport const menu = (drop: HTMLElement) => {\n const dropBtn = drop.querySelector<HTMLButtonElement>('.drop-btn');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!dropBtn || !content) return;\n setBtnEvent(dropBtn, content);\n};\n/*--------------------------------------------------------------------------------*/\nexport const select = (\n drop: HTMLElement,\n icon: string,\n callBack: (value: string, text: string) => void,\n) => {\n const dropBtn = drop.querySelector<HTMLButtonElement>('.drop-btn');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!dropBtn || !content) return;\n setBtnEvent(dropBtn, content);\n update(drop, icon, callBack);\n};\n/*--------------------------------------------------------------------------------*/\nexport const update = (\n drop: HTMLElement,\n icon: string,\n callBack: (value: string, text: string) => void,\n) => {\n const select = drop.querySelector<HTMLSelectElement>('select');\n const content = drop.querySelector<HTMLElement>('.drop-content');\n if (!select || !content) return;\n let elmIcon = '';\n if (icon) elmIcon = `<span style=\"margin-right: 6px;\">${icon}</span>`;\n // select to menu\n content.innerHTML = '';\n const option = select.querySelectorAll<HTMLOptionElement>('option');\n option.forEach(opt => {\n const item = document.createElement('a');\n item.innerHTML = `${elmIcon}${opt.text}`;\n content.appendChild(item);\n // drop click\n item.onclick = () => {\n opt.selected = true;\n clearSelected();\n if (callBack) {\n callBack(opt.value, opt.text);\n }\n };\n });\n // clear selected\n const clearSelected = () => {\n const index = select.selectedIndex;\n const list = content.querySelectorAll<HTMLAnchorElement>('a');\n list.forEach((el, i) => {\n if (i == index) {\n el.classList.add('selected');\n } else {\n el.classList.remove('selected');\n }\n });\n };\n clearSelected();\n};\n/*--------------------------------------------------------------------------------*/\nconst setBtnEvent = (btn: HTMLButtonElement, content: HTMLElement) => {\n btn.onclick = () => {\n if (content.style.display == 'block') {\n content.style.animation = 'fade-out 0.4s forwards';\n content.onanimationend = () => {\n content.style.animation = '';\n content.style.display = '';\n };\n } else {\n clear();\n content.style.animation = 'fade-in 0.4s forwards';\n content.style.display = 'block';\n content.onanimationend = () => {\n content.style.animation = '';\n };\n }\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const clear = () => {\n const drop = document.querySelectorAll<HTMLElement>('.drop-content');\n drop.forEach(el => {\n if (el.style.display == 'block') {\n el.style.animation = 'fade-out 0.4s forwards';\n el.onanimationend = () => {\n el.style.animation = '';\n el.style.display = '';\n };\n }\n });\n};\nwindow.addEventListener('click', (e) => {\n if (!(<HTMLElement>e.target).matches('.drop-btn')) clear();\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\"></i>\n <div class=\"topic\">✦ เกิดข้อผิดพลาด ✦</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","/* 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=\"\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">กลุ่มงาน</div>\n <div class=\"text\" id=\"\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">ชื่ออุปกรณ์</div>\n <div class=\"text\" id=\"\">:</div>\n </div>\n <div class=\"box-tb\">\n <div class=\"topic\">เลขทรัพย์สิน</div>\n <div class=\"text\" id=\"\">:</div>\n </div>\n <button id=\"btn-edit\" class=\"circle sm blue\"\n shadow=\"true\"></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`;","/* hwlink */\n/*--------------------------------------------------------------------------------*/\nimport { cfg } from '../../config';\nimport { loading, ready } from '../../page';\nimport { template } from './template';\nconst app = document.querySelector<HTMLElement>('#app');\nlet isREADY: boolean;\nlet WSSVC: WebSocket;\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 // wait socket\n isREADY = false;\n loading();\n wsSvc();\n};\n/*--------------------------------------------------------------------------------*/\nconst wsSvc = () => {\n WSSVC = new WebSocket(cfg.hwl.HOST);\n WSSVC.onopen = () => {\n hwinfo();\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') {\n if (!isREADY) {\n isREADY = true;\n ready();\n }\n }\n if (head == 'HWINFO') setHwInfo(data);\n };\n let T_hwinfo: NodeJS.Timeout;\n const hwinfo = () => WSSVC.send('{\"head\": \"HWINFO\"}');\n};\n/*--------------------------------------------------------------------------------*/\nconst setHwInfo = (data: HwInfo) => {\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/*--------------------------------------------------------------------------------*/\ntype HwInfo = {\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};","/* page */\n/*--------------------------------------------------------------------------------*/\nimport { cfg } from '../../config';\nimport { confirm } from '../../mod/dialog';\nimport { winPopup } from '../../lib/utility';\nimport * as modBtn from '../../mod/built-in/button';\nimport { menu as setDropMenu } from '../../mod/drop';\nconst app = document.querySelector<HTMLElement>('#app');\nexport * from '../index';\nexport { hwLink } from '../../svchub/hwlink';\n/*--------------------------------------------------------------------------------*/\nexport type PageParams = {\n uri?: string;\n size?: string;\n topbar?: string;\n sidebar?: string;\n template?: string;\n};\n/*--------------------------------------------------------------------------------*/\nexport const create = (params: PageParams): boolean => {\n if (!app) return false;\n const uri = params.uri ? params.uri : '';\n const size = params.size ? params.size : '';\n const topbar = params.topbar ? params.topbar : '';\n const sidebar = params.sidebar ? params.sidebar : '';\n const template = params.template ? params.template : '';\n // content\n const content = document.createElement('div');\n content.id = 'app-content';\n content.innerHTML = template;\n app.appendChild(content);\n // page init\n let newNav = false;\n if (size == 'full') {\n app.classList.add('full-page');\n navRemove();\n } else {\n app.classList.remove('full-page');\n if (!document.querySelector('#topbar')) {\n navCreate({ topbar: topbar, sidebar: sidebar });\n newNav = true;\n }\n navActive(uri);\n }\n return newNav;\n};\n/*--------------------------------------------------------------------------------*/\n// ### navbar ###\n/*--------------------------------------------------------------------------------*/\nconst navCreate = (params: { topbar: string; sidebar: string; }) => {\n // create topbar, sidebar\n const topbar = document.createElement('nav');\n const sidebar = document.createElement('nav');\n topbar.id = 'topbar';\n sidebar.id = 'sidebar';\n topbar.innerHTML = params.topbar;\n sidebar.innerHTML = params.sidebar;\n document.body.prepend(topbar, sidebar);\n // screen resize\n const setScreen = () => {\n const scWidth = window.innerWidth ? window.innerWidth : screen.width;\n const scHeight = window.innerHeight ? window.innerHeight : screen.height;\n const boxScreen = topbar.querySelector<HTMLElement>('#screen');\n if (boxScreen) boxScreen.innerHTML = `${scWidth}x${scHeight}`;\n // nav-menu action\n if (scWidth < 600) navMenu(true);\n else navMenu(false);\n };\n setScreen();\n window.addEventListener('resize', setScreen);\n // dropdown\n const dropUser = topbar.querySelector<HTMLElement>('#drop-user');\n if (dropUser) setDropMenu(dropUser);\n // logout\n const logout = () => {\n confirm('ยืนยัน..! การออกจากระบบ').then(res => {\n if (res) window.location.replace('/logout');\n });\n };\n const navLogout = document.querySelectorAll<HTMLElement>('#nav-logout');\n navLogout.forEach(el => el.onclick = logout);\n // hwlink\n navHwLink();\n};\n/*--------------------------------------------------------------------------------*/\nconst navRemove = () => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (topbar) topbar.remove();\n if (sidebar) sidebar.remove();\n};\n/*--------------------------------------------------------------------------------*/\nconst navActive = (uri: string) => {\n if (uri.indexOf('#') > 0) {\n uri = uri.substring(0, uri.indexOf('#'));\n }\n clearNavActive();\n if (!uri) return;\n const sideBtn = document.querySelectorAll<HTMLButtonElement>('#sidebar button');\n sideBtn.forEach(btn => {\n const path = btn.getAttribute('href');\n if (!btn.disabled && uri == path) {\n btn.classList.add('active');\n // grp-btn\n if (btn.classList.contains('grp-btn')) {\n const menu = btn.parentNode?.querySelector<HTMLElement>('.submenu');\n const grpBtn = btn.parentNode?.querySelector<HTMLElement>('.grp-btn');\n if (menu && grpBtn) {\n menu.style.maxHeight = '400px';\n grpBtn.classList.add('bar');\n }\n }\n // sub-btn\n if (btn.classList.contains('sub-btn')) {\n const menu = btn.parentNode as HTMLElement;\n const grpBtn = menu.parentNode?.querySelector<HTMLElement>('.grp-btn');\n if (menu && grpBtn && menu.classList.contains('submenu')) {\n menu.style.maxHeight = '400px';\n grpBtn.classList.add('active');\n grpBtn.classList.remove('bar');\n }\n }\n }\n });\n};\nconst clearNavActive = () => {\n // sidebtn\n const sideBtn = document.querySelectorAll<HTMLButtonElement>('#sidebar button');\n sideBtn.forEach(btn => btn.classList.remove('active'));\n // submenu\n const subMenu = document.querySelectorAll<HTMLElement>('#sidebar .submenu');\n subMenu.forEach(elm => elm.style.maxHeight = '0');\n};\n/*--------------------------------------------------------------------------------*/\nconst navMenu = (state: boolean) => {\n const navMenu = document.querySelector<HTMLElement>('#topbar #nav-menu');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (!navMenu || !sidebar) return;\n if (state) {\n navMenu.onclick = () => {\n const posLeft = sidebar.getBoundingClientRect().left;\n if (posLeft == 0) {\n sidebar.classList.remove('menu-in');\n sidebar.classList.add('menu-out');\n } else {\n sidebar.classList.remove('menu-out');\n sidebar.classList.add('menu-in');\n }\n };\n } else {\n navMenu.onclick = null;\n sidebar.classList.remove('menu-in');\n sidebar.classList.remove('menu-out');\n }\n};\n/*--------------------------------------------------------------------------------*/\nexport const clear = () => {\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (!sidebar) return;\n const scWidth = window.innerWidth ? window.innerWidth : screen.width;\n const posLeft = sidebar.getBoundingClientRect().left;\n if (scWidth < 600 && posLeft == 0) {\n sidebar.classList.remove('menu-in');\n sidebar.classList.add('menu-out');\n }\n};\nwindow.addEventListener('click', (e) => {\n if (!(<HTMLElement>e.target).matches('#nav-menu')) clear();\n});\n/*--------------------------------------------------------------------------------*/\nconst navHwLink = () => {\n const btnHwl = document.querySelector<HTMLButtonElement>('#nav-hwlink');\n if (!btnHwl) return;\n const agent = navigator.userAgent.toLowerCase();\n if (agent.indexOf('win') != -1) {\n btnHwl.style.display = 'block';\n btnHwl.onclick = () => {\n modBtn.loading(btnHwl, true);\n const ws = new WebSocket(cfg.hwl.HOST);\n ws.onerror = () => {\n download();\n done();\n };\n ws.onopen = () => {\n ws.close();\n winPopup(500, 485, 'hwlink', '/hwlink');\n done();\n };\n const done = () => {\n modBtn.loading(btnHwl, false);\n };\n };\n } else {\n btnHwl.style.display = 'none';\n }\n const download = () => {\n const url = cfg.hwl.FILE;\n const link = document.createElement('a');\n link.href = url;\n link.download = String(url.split('/').pop());\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n };\n};\n/*--------------------------------------------------------------------------------*/\nconst onlineStatus = () => {\n const boxTime = document.querySelector<HTMLElement>('#box-time');\n const svTime = document.querySelector<HTMLElement>('#box-time #sv-time');\n const svDate = document.querySelector<HTMLElement>('#box-time #sv-date');\n if (!boxTime || !svTime || !svDate) return;\n if (window.navigator.onLine) {\n boxTime.classList.remove('offline');\n svTime.innerHTML = ' ';\n svDate.innerHTML = ' ';\n } else {\n boxTime.classList.add('offline');\n svTime.innerHTML = 'network';\n svDate.innerHTML = 'OFFLINE';\n }\n};\nwindow.addEventListener('online', onlineStatus);\nwindow.addEventListener('offline', onlineStatus);\n/*--------------------------------------------------------------------------------*/\n"],"mappings":"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","names":["app","app","loading","app","loading","app","template","menu","navMenu","clear"]}
|
package/dist/page/index.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
declare const
|
|
2
|
-
declare const
|
|
3
|
-
declare const
|
|
4
|
-
declare const
|
|
5
|
-
declare const
|
|
6
|
-
declare const
|
|
1
|
+
declare const loading: (size?: string) => void;
|
|
2
|
+
declare const ready: (delay?: number) => void;
|
|
3
|
+
declare const error: (err: Error) => void;
|
|
4
|
+
declare const notFound: () => void;
|
|
5
|
+
declare const fullLoad: () => void;
|
|
6
|
+
declare const inform: (params: {
|
|
7
7
|
icon: string;
|
|
8
8
|
msg: string;
|
|
9
9
|
btnTxt: string;
|
|
@@ -11,4 +11,4 @@ declare const Inform: (params: {
|
|
|
11
11
|
color?: string;
|
|
12
12
|
}) => void;
|
|
13
13
|
|
|
14
|
-
export {
|
|
14
|
+
export { error, fullLoad, inform, loading, notFound, ready };
|
package/dist/page/index.js
CHANGED
|
@@ -11,7 +11,7 @@ var pageSpin = (
|
|
|
11
11
|
`
|
|
12
12
|
);
|
|
13
13
|
var smallSpin = `<div class="spinner s32"></div>`;
|
|
14
|
-
var
|
|
14
|
+
var loading = (size = "default") => {
|
|
15
15
|
if (!app) return;
|
|
16
16
|
if (!app.querySelector("#page-loader")) {
|
|
17
17
|
const loader = document.createElement("div");
|
|
@@ -23,12 +23,12 @@ var Loading = (size = "default") => {
|
|
|
23
23
|
const content = app.querySelector("#app-content");
|
|
24
24
|
if (content) content.style.display = "none";
|
|
25
25
|
};
|
|
26
|
-
var
|
|
26
|
+
var ready = (delay = 400) => {
|
|
27
27
|
new Promise((r) => setTimeout(r, delay)).then(() => {
|
|
28
28
|
clearLoader(true);
|
|
29
29
|
});
|
|
30
30
|
};
|
|
31
|
-
var
|
|
31
|
+
var error = (err) => {
|
|
32
32
|
clearLoader(false);
|
|
33
33
|
if (!app) return;
|
|
34
34
|
const box = document.createElement("div");
|
|
@@ -42,7 +42,7 @@ var Error = (err) => {
|
|
|
42
42
|
app.prepend(box);
|
|
43
43
|
throw err;
|
|
44
44
|
};
|
|
45
|
-
var
|
|
45
|
+
var notFound = () => {
|
|
46
46
|
if (!app) return;
|
|
47
47
|
app.innerHTML = /*html*/
|
|
48
48
|
`
|
|
@@ -53,7 +53,7 @@ var NotFound = () => {
|
|
|
53
53
|
</div>
|
|
54
54
|
`;
|
|
55
55
|
};
|
|
56
|
-
var
|
|
56
|
+
var fullLoad = () => {
|
|
57
57
|
clearNavbar();
|
|
58
58
|
if (!app) return;
|
|
59
59
|
app.classList.add("full-page");
|
|
@@ -65,7 +65,7 @@ var FullLoad = () => {
|
|
|
65
65
|
</div>
|
|
66
66
|
`;
|
|
67
67
|
};
|
|
68
|
-
var
|
|
68
|
+
var inform = (params) => {
|
|
69
69
|
clearNavbar();
|
|
70
70
|
if (!app) return;
|
|
71
71
|
app.classList.add("full-page");
|
|
@@ -102,11 +102,11 @@ var clearLoader = (showContent) => {
|
|
|
102
102
|
if (content) content.style.display = showContent ? "block" : "none";
|
|
103
103
|
};
|
|
104
104
|
export {
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
105
|
+
error,
|
|
106
|
+
fullLoad,
|
|
107
|
+
inform,
|
|
108
|
+
loading,
|
|
109
|
+
notFound,
|
|
110
|
+
ready
|
|
111
111
|
};
|
|
112
112
|
//# sourceMappingURL=index.js.map
|
package/dist/page/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/page/index.ts"],"sourcesContent":["/* 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
|
|
1
|
+
{"version":3,"sources":["../../src/page/index.ts"],"sourcesContent":["/* 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\"></i>\n <div class=\"topic\">✦ เกิดข้อผิดพลาด ✦</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"],"mappings":";AAEA,IAAM,MAAM,SAAS,cAA2B,MAAM;AACtD,IAAM;AAAA;AAAA,EAA4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOlC,IAAM,YAAoB;AAEnB,IAAM,UAAU,CAAC,OAAO,cAAc;AACzC,MAAI,CAAC,IAAK;AAEV,MAAI,CAAC,IAAI,cAAc,cAAc,GAAG;AACpC,UAAM,SAAS,SAAS,cAAc,KAAK;AAC3C,WAAO,KAAK;AACZ,WAAO,YAAY;AACnB,WAAO,YAAY,QAAQ,YAAY,WAAW;AAClD,QAAI,YAAY,MAAM;AAAA,EAC1B;AAEA,QAAM,UAAU,IAAI,cAA2B,cAAc;AAC7D,MAAI,QAAS,SAAQ,MAAM,UAAU;AACzC;AAEO,IAAM,QAAQ,CAAC,QAAQ,QAAQ;AAClC,MAAI,QAAQ,OAAK,WAAW,GAAG,KAAK,CAAC,EAAE,KAAK,MAAM;AAC9C,gBAAY,IAAI;AAAA,EACpB,CAAC;AACL;AAEO,IAAM,QAAQ,CAAC,QAAe;AACjC,cAAY,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,QAAM,MAAM,SAAS,cAAc,KAAK;AACxC,MAAI,YAAY;AAChB,MAAI;AAAA,EAAqB;AAAA;AAAA;AAAA,4BAGD,GAAG;AAAA;AAE3B,MAAI,QAAQ,GAAG;AACf,QAAM;AACV;AAEO,IAAM,WAAW,MAAM;AAC1B,MAAI,CAAC,IAAK;AACV,MAAI;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAO7B;AAEO,IAAM,WAAW,MAAM;AAC1B,cAAY;AACZ,MAAI,CAAC,IAAK;AACV,MAAI,UAAU,IAAI,WAAW;AAC7B,MAAI;AAAA,EAAqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAM7B;AAEO,IAAM,SAAS,CAAC,WAMjB;AACF,cAAY;AACZ,MAAI,CAAC,IAAK;AACV,MAAI,UAAU,IAAI,WAAW;AAC7B,MAAI;AAAA,EAAqB;AAAA,kCACK,OAAO,KAAK;AAAA,sCACR,OAAO,IAAI;AAAA,+BAClB,OAAO,GAAG;AAAA,gCACT,OAAO,KAAK;AAAA,kBAC1B,OAAO,MAAM;AAAA;AAAA;AAAA;AAI3B,QAAM,MAAM,IAAI,cAAiC,QAAQ;AACzD,MAAI,UAAU,MAAM,OAAO,SAAS,QAAQ,OAAO,MAAM;AAC7D;AAKA,IAAM,cAAc,MAAM;AACtB,QAAM,SAAS,SAAS,cAA2B,SAAS;AAC5D,QAAM,SAAS,SAAS,cAA2B,SAAS;AAC5D,QAAM,UAAU,SAAS,cAA2B,UAAU;AAC9D,MAAI,OAAQ,QAAO,OAAO;AAC1B,MAAI,OAAQ,QAAO,OAAO;AAC1B,MAAI,QAAS,SAAQ,OAAO;AAC5B,MAAI,IAAK,KAAI,YAAY;AAC7B;AACA,IAAM,cAAc,CAAC,gBAAyB;AAC1C,MAAI,CAAC,IAAK;AACV,QAAM,SAAS,IAAI,cAA2B,cAAc;AAC5D,MAAI,QAAQ;AACR,WAAO,MAAM,YAAY;AACzB,WAAO,iBAAiB,MAAM,OAAO,OAAO;AAAA,EAChD;AACA,QAAM,UAAU,IAAI,cAA2B,cAAc;AAC7D,MAAI,QAAS,SAAQ,MAAM,UAAU,cAAc,UAAU;AACjE;","names":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
2
|
-
export {
|
|
1
|
+
export { error, fullLoad, inform, loading, notFound, ready } from '../index.js';
|
|
2
|
+
export { P as PageParams, c as create } from '../../index-DBhzpIiB.js';
|
|
@@ -11,7 +11,7 @@ var pageSpin = (
|
|
|
11
11
|
`
|
|
12
12
|
);
|
|
13
13
|
var smallSpin = `<div class="spinner s32"></div>`;
|
|
14
|
-
var
|
|
14
|
+
var loading = (size = "default") => {
|
|
15
15
|
if (!app) return;
|
|
16
16
|
if (!app.querySelector("#page-loader")) {
|
|
17
17
|
const loader = document.createElement("div");
|
|
@@ -23,12 +23,12 @@ var Loading = (size = "default") => {
|
|
|
23
23
|
const content = app.querySelector("#app-content");
|
|
24
24
|
if (content) content.style.display = "none";
|
|
25
25
|
};
|
|
26
|
-
var
|
|
26
|
+
var ready = (delay = 400) => {
|
|
27
27
|
new Promise((r) => setTimeout(r, delay)).then(() => {
|
|
28
28
|
clearLoader(true);
|
|
29
29
|
});
|
|
30
30
|
};
|
|
31
|
-
var
|
|
31
|
+
var error = (err) => {
|
|
32
32
|
clearLoader(false);
|
|
33
33
|
if (!app) return;
|
|
34
34
|
const box = document.createElement("div");
|
|
@@ -42,7 +42,7 @@ var Error = (err) => {
|
|
|
42
42
|
app.prepend(box);
|
|
43
43
|
throw err;
|
|
44
44
|
};
|
|
45
|
-
var
|
|
45
|
+
var notFound = () => {
|
|
46
46
|
if (!app) return;
|
|
47
47
|
app.innerHTML = /*html*/
|
|
48
48
|
`
|
|
@@ -53,7 +53,7 @@ var NotFound = () => {
|
|
|
53
53
|
</div>
|
|
54
54
|
`;
|
|
55
55
|
};
|
|
56
|
-
var
|
|
56
|
+
var fullLoad = () => {
|
|
57
57
|
clearNavbar();
|
|
58
58
|
if (!app) return;
|
|
59
59
|
app.classList.add("full-page");
|
|
@@ -65,7 +65,7 @@ var FullLoad = () => {
|
|
|
65
65
|
</div>
|
|
66
66
|
`;
|
|
67
67
|
};
|
|
68
|
-
var
|
|
68
|
+
var inform = (params) => {
|
|
69
69
|
clearNavbar();
|
|
70
70
|
if (!app) return;
|
|
71
71
|
app.classList.add("full-page");
|
|
@@ -104,7 +104,7 @@ var clearLoader = (showContent) => {
|
|
|
104
104
|
|
|
105
105
|
// src/page/mobile/index.ts
|
|
106
106
|
var app2 = document.querySelector("#app");
|
|
107
|
-
var
|
|
107
|
+
var create = (params) => {
|
|
108
108
|
if (!app2) return;
|
|
109
109
|
const size = params.size ? params.size : "";
|
|
110
110
|
const template = params.template ? params.template : "";
|
|
@@ -239,12 +239,12 @@ var sideClose = (sidebar) => {
|
|
|
239
239
|
}
|
|
240
240
|
};
|
|
241
241
|
export {
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
242
|
+
create,
|
|
243
|
+
error,
|
|
244
|
+
fullLoad,
|
|
245
|
+
inform,
|
|
246
|
+
loading,
|
|
247
|
+
notFound,
|
|
248
|
+
ready
|
|
249
249
|
};
|
|
250
250
|
//# sourceMappingURL=index.js.map
|