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.
Files changed (81) hide show
  1. package/README.md +1 -1
  2. package/dist/desktop/index.d.ts +13 -12
  3. package/dist/desktop/index.js +1228 -1967
  4. package/dist/desktop/index.js.map +1 -1
  5. package/dist/index-3POan8Vl.d.ts +94 -0
  6. package/dist/index-B4158M0u.d.ts +21 -0
  7. package/dist/index-BAQxKstM.d.ts +8 -0
  8. package/dist/index-BMqjxP9I.d.ts +11 -0
  9. package/dist/index-CD53Vh6h.d.ts +31 -0
  10. package/dist/index-CoYHkkyT.d.ts +14 -0
  11. package/dist/index-D5CUpF9v.d.ts +10 -0
  12. package/dist/index-DBhzpIiB.d.ts +32 -0
  13. package/dist/index-DCw_tM-R.d.ts +28 -0
  14. package/dist/{index-kr8P3eEW.d.ts → index-DWqF-tKY.d.ts} +7 -9
  15. package/dist/index-DzKPF0ja.d.ts +14 -0
  16. package/dist/index-jVam7Sxi.d.ts +15 -0
  17. package/dist/index-uQOR5bdy.d.ts +20 -0
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.js +2 -2
  20. package/dist/index.js.map +1 -1
  21. package/dist/lib/index.d.ts +1 -1
  22. package/dist/lib/index.js +1 -1
  23. package/dist/lib/index.js.map +1 -1
  24. package/dist/mobile/index.d.ts +13 -12
  25. package/dist/mobile/index.js +299 -808
  26. package/dist/mobile/index.js.map +1 -1
  27. package/dist/mod/button/index.d.ts +1 -1
  28. package/dist/mod/button/index.js +2 -2
  29. package/dist/mod/button/index.js.map +1 -1
  30. package/dist/mod/config/index.d.ts +52 -0
  31. package/dist/mod/{global → config}/index.js +45 -41
  32. package/dist/mod/config/index.js.map +1 -0
  33. package/dist/mod/cover/index.d.ts +1 -1
  34. package/dist/mod/cover/index.js +3 -3
  35. package/dist/mod/cover/index.js.map +1 -1
  36. package/dist/mod/dialog/index.d.ts +1 -1
  37. package/dist/mod/dialog/index.js +13 -13
  38. package/dist/mod/dialog/index.js.map +1 -1
  39. package/dist/mod/drawer/index.d.ts +1 -1
  40. package/dist/mod/drawer/index.js +8 -8
  41. package/dist/mod/drawer/index.js.map +1 -1
  42. package/dist/mod/drop/index.d.ts +1 -1
  43. package/dist/mod/drop/index.js +15 -15
  44. package/dist/mod/drop/index.js.map +1 -1
  45. package/dist/mod/hwlink/index.d.ts +2 -2
  46. package/dist/mod/hwlink/index.js +44 -656
  47. package/dist/mod/hwlink/index.js.map +1 -1
  48. package/dist/mod/index.d.ts +7 -7
  49. package/dist/mod/index.js +61 -59
  50. package/dist/mod/index.js.map +1 -1
  51. package/dist/mod/modal/index.d.ts +1 -1
  52. package/dist/mod/modal/index.js +12 -12
  53. package/dist/mod/modal/index.js.map +1 -1
  54. package/dist/mod/tabs/index.d.ts +1 -1
  55. package/dist/mod/tabs/index.js +8 -6
  56. package/dist/mod/tabs/index.js.map +1 -1
  57. package/dist/page/desktop/index.d.ts +3 -3
  58. package/dist/page/desktop/index.js +228 -801
  59. package/dist/page/desktop/index.js.map +1 -1
  60. package/dist/page/index.d.ts +7 -7
  61. package/dist/page/index.js +12 -12
  62. package/dist/page/index.js.map +1 -1
  63. package/dist/page/mobile/index.d.ts +2 -2
  64. package/dist/page/mobile/index.js +14 -14
  65. package/dist/page/mobile/index.js.map +1 -1
  66. package/dist/worker/hubworker.js +1 -1
  67. package/dist/worker/hubworker.js.map +1 -1
  68. package/package.json +6 -6
  69. package/dist/index-B2HHS23A.d.ts +0 -20
  70. package/dist/index-BQcJsVJ-.d.ts +0 -10
  71. package/dist/index-Bf_lg-oZ.d.ts +0 -339
  72. package/dist/index-ChdqOPJq.d.ts +0 -15
  73. package/dist/index-CzsSwSvp.d.ts +0 -21
  74. package/dist/index-D3tu8t6p.d.ts +0 -28
  75. package/dist/index-DQt71MNx.d.ts +0 -31
  76. package/dist/index-DZdXvqxA.d.ts +0 -10
  77. package/dist/index-DcvauYN8.d.ts +0 -14
  78. package/dist/index-Pd7FTiEW.d.ts +0 -32
  79. package/dist/index-QRbamarh.d.ts +0 -8
  80. package/dist/mod/global/index.d.ts +0 -57
  81. package/dist/mod/global/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/page/mobile/index.ts","../../src/page/index.ts","../../src/page/docs.ts","../../package.json","../../src/mod/global.ts","../../src/lib/index.ts","../../src/lib/dateTime.ts","../../src/lib/utility.ts","../../src/lib/geoLocate.ts","../../src/lib/cookie.ts","../../src/lib/thbText.ts","../../src/mod/index.ts","../../src/mod/built-in/button/index.ts","../../src/mod/built-in/input/index.ts","../../src/mod/built-in/cover/index.ts","../../src/mod/camera/index.ts","../../src/mod/dialog/index.ts","../../src/mod/drawer/index.ts","../../src/mod/drop/index.ts","../../src/mod/modal/index.ts","../../src/mod/tabs/index.ts","../../src/svchub/oauth/index.ts","../../src/svchub/oauth/template.ts","../../src/svchub/api/account/access.ts","../../src/svchub/oauth/midware.ts","../../src/svchub/api/index.ts","../../src/svchub/api/static/index.ts","../../src/svchub/api/static/acrole.ts","../../src/svchub/api/static/actype.ts","../../src/svchub/api/static/dvtype.ts","../../src/svchub/api/static/hmtype.ts","../../src/svchub/api/static/hmposn.ts","../../src/svchub/api/static/hmrank.ts","../../src/svchub/api/static/sctype.ts","../../src/svchub/api/static/vdtype.ts","../../src/svchub/api/oauth/index.ts","../../src/svchub/api/agency/agcy.ts","../../src/svchub/api/agency/dvsn.ts","../../src/svchub/api/agency/sect.ts","../../src/svchub/api/agency/dept.ts","../../src/svchub/api/account/index.ts","../../src/svchub/wss/index.ts"],"sourcesContent":["/* page */\n/*--------------------------------------------------------------------------------*/\nexport * from '../index';\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport type PageParams = {\n auth?: boolean;\n size?: string;\n icon?: string;\n title?: string;\n template?: string;\n button?: {\n side?: boolean;\n tab?: boolean;\n };\n sidebar?: string;\n tabbar?: string;\n actbar?: string;\n uri?: string;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Create = (params: PageParams) => {\n if (!app) return;\n const size = params.size ? params.size : '';\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 if (size == 'full') {\n navRemove();\n app.classList.add('full-page');\n } else {\n app.classList.remove('full-page');\n if (document.querySelector('#topbar')) {\n setTopbar(params);\n } else {\n navCreate(params);\n setTopbar(params);\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\n// ### navbar ###\n/*--------------------------------------------------------------------------------*/\nconst navCreate = (params: PageParams) => {\n // topbar\n const topbar = document.createElement('nav');\n const tabbar = document.createElement('nav');\n const sidebar = document.createElement('nav');\n topbar.id = 'topbar';\n tabbar.id = 'tabbar';\n sidebar.id = 'sidebar';\n topbar.innerHTML = /*html*/ `\n <div class=\"container\">\n <div class=\"box left\">\n <button id=\"nav-back\" class=\"topbar-btn icon\"\n onclick=\"history.back()\">&#xf053;</button>\n <button id=\"nav-side\" class=\"topbar-btn icon\">&#xf0c9;</button>\n <div class=\"title\"></div>\n </div>\n <div id=\"actbar\" class=\"box right\"></div>\n </div>\n `;\n tabbar.innerHTML = params.tabbar ? params.tabbar : '';\n sidebar.innerHTML = params.sidebar ? params.sidebar : '';\n document.body.prepend(topbar, tabbar, sidebar);\n // nav-side\n sideBtnEvent(sidebar);\n const navSide = topbar.querySelector<HTMLButtonElement>('#nav-side');\n if (navSide) navSide.onclick = () => {\n const posLeft = sidebar.getBoundingClientRect().left;\n if (posLeft == 0) sideClose(sidebar);\n else sideOpen(sidebar);\n };\n const btnSideClose = sidebar.querySelector<HTMLButtonElement>('#btn-close');\n if (btnSideClose) btnSideClose.onclick = () => sideClose(sidebar);\n};\n/*--------------------------------------------------------------------------------*/\nconst navRemove = () => {\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};\n/*--------------------------------------------------------------------------------*/\nconst setTopbar = (params: PageParams) => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n if (!topbar) return;\n // title\n const title = params.title ? params.title : 'Page Title';\n topbar.querySelector<HTMLElement>('.title')!.innerText = title;\n // icon\n const navBack = document.querySelector<HTMLElement>('#topbar #nav-back')!;\n navBack.innerHTML = params.icon ? params.icon : '&#xf053;';\n // navside\n const navSide = document.querySelector<HTMLElement>('#topbar #nav-side')!;\n if (params.button?.side) {\n navSide.style.display = 'block';\n navBack.style.display = 'none';\n } else {\n navSide.style.display = 'none';\n navBack.style.display = 'block';\n }\n // actbar\n const actbar = topbar.querySelector<HTMLElement>('#actbar');\n if (actbar) actbar.innerHTML = params.actbar ? params.actbar : '';\n // tabbar\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n if (!tabbar) return;\n if (params.button?.tab) {\n tabbar.style.display = 'block';\n if (app) app.classList.add('tabbar');\n } else {\n tabbar.style.display = 'none';\n if (app) app.classList.remove('tabbar');\n }\n // tabbar active\n tabActive(params.uri);\n};\n/*--------------------------------------------------------------------------------*/\nconst tabActive = (uri: string | undefined) => {\n if (!uri) return;\n if (uri.indexOf('#') > 0) {\n uri = uri.substring(0, uri.indexOf('#'));\n }\n const btn = document.querySelectorAll<HTMLButtonElement>('#tabbar button');\n btn.forEach(el => {\n if (!el.disabled) {\n const path = el.getAttribute('href');\n if (uri == path) {\n el.classList.add('active');\n } else {\n el.classList.remove('active');\n }\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nconst sideBtnEvent = (sidebar: HTMLElement) => {\n const btn = sidebar.querySelectorAll('a');\n btn.forEach(el => {\n el.addEventListener('click', () => {\n sideClose(sidebar);\n });\n });\n};\nconst sideOpen = (sidebar: HTMLElement) => {\n sidebar.classList.remove('close');\n sidebar.classList.add('open');\n // overlay\n const overlay = document.createElement('div');\n overlay.id = 'side-overlay';\n overlay.className = 'overlay';\n overlay.style.animation = 'fade-in 0.4s forwards';\n document.body.appendChild(overlay);\n overlay.onclick = () => sideClose(sidebar);\n};\nconst sideClose = (sidebar: HTMLElement) => {\n sidebar.classList.remove('open');\n sidebar.classList.add('close');\n // overlay\n const overlay = document.querySelector<HTMLElement>('#side-overlay');\n if (overlay) {\n overlay.style.animation = 'fade-out 0.4s forwards';\n overlay.onanimationend = () => overlay.remove();\n }\n};\n/*--------------------------------------------------------------------------------*/\n","/* page */\n/*--------------------------------------------------------------------------------*/\nconst app = document.querySelector<HTMLElement>('#app');\nconst pageSpin: string = /*html*/ `\n<div class=\"lds-spinner\">\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n</div>\n`;\nconst smallSpin: string = `<div class=\"spinner s32\"></div>`;\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (size = 'default') => {\n if (!app) return;\n // page-loader\n if (!app.querySelector('#page-loader')) {\n const loader = document.createElement('div');\n loader.id = 'page-loader';\n loader.className = 'overlay center';\n loader.innerHTML = size == 'default' ? pageSpin : smallSpin;\n app.appendChild(loader);\n }\n // app-content\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Ready = (delay = 400) => {\n new Promise(r => setTimeout(r, delay)).then(() => {\n clearLoader(true);\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const Error = (err: Error) => {\n clearLoader(false);\n if (!app) return;\n // create\n const box = document.createElement('div');\n box.className = 'page-error';\n box.innerHTML = /*html*/ `\n <i class=\"icon red\">&#xf188;</i>\n <div class=\"topic\">&#x2726; เกิดข้อผิดพลาด &#x2726;</div>\n <div class=\"text\">${err}</div>\n `;\n app.prepend(box);\n throw err;\n};\n/*--------------------------------------------------------------------------------*/\nexport const NotFound = () => {\n if (!app) return;\n app.innerHTML = /*html*/ `\n <div class=\"page-not-found\">\n <h1>4<i class=\"fas fa-ghost\"></i>4</h1>\n <h2>Error 404 Page Not Found</h2>\n <p>Sorry, the page cannot be accessed</p>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const FullLoad = () => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-full-load\">\n <div class=\"spinner\"></div>\n <div class=\"text\">Slim<br>Loading</div>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Inform = (params: {\n icon: string;\n msg: string;\n btnTxt: string;\n btnUrl: string;\n color?: string;\n}) => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-inform ${params.color}\">\n <div class=\"icon solid\">${params.icon}</div>\n <div class=\"msg\">${params.msg}</div>\n <button class=\"lg ${params.color}\" shadow=\"true\">\n ${params.btnTxt}\n </button>\n </div>\n `;\n const btn = app.querySelector<HTMLButtonElement>('button')!;\n btn.onclick = () => window.location.replace(params.btnUrl);\n};\n/*--------------------------------------------------------------------------------*/\n//export const Maintain = () => { };\n//export const Construct = () => { };\n/*--------------------------------------------------------------------------------*/\nconst clearNavbar = () => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (topbar) topbar.remove();\n if (tabbar) tabbar.remove();\n if (sidebar) sidebar.remove();\n if (app) app.className = '';\n};\nconst clearLoader = (showContent: boolean) => {\n if (!app) return;\n const loader = app.querySelector<HTMLElement>('#page-loader');\n if (loader) {\n loader.style.animation = 'fade-out 0.4s forwards';\n loader.onanimationend = () => loader.remove();\n }\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = showContent ? 'block' : 'none';\n};\n/*--------------------------------------------------------------------------------*/\n","/* docs */\nimport { gbvar } from '../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const privacy = async () => {\n const url = 'https://cdn.jsdelivr.net/gh/wkrdev/.github/docs/privacy.md';\n const resp = await fetch(url);\n if (resp.ok) {\n return await resp.text();\n }\n return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const changelog = async (clnt = 1) => {\n const url = `/clnt/${clnt}/log`;\n const resp = await fetch(gbvar.hub.API + url);\n if (resp.ok) {\n const json = await resp.json();\n return json.data as string;\n }\n return '';\n};\n/*--------------------------------------------------------------------------------*/\n","{\n \"name\": \"slimsdk\",\n \"version\": \"0.1.55\",\n \"description\": \"Web App SDK\",\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./desktop\": \"./dist/desktop/index.js\",\n \"./desktop/\": \"./dist/desktop/\",\n \"./mobile\": \"./dist/mobile/index.js\",\n \"./mobile/\": \"./dist/mobile/\",\n \"./lib\": \"./dist/lib/index.js\",\n \"./worker/\": \"./dist/worker/*.js\",\n \"./page\": \"./dist/page/index.js\",\n \"./page/*\": \"./dist/page/*/index.js\",\n \"./page/*.css\": \"./dist/page/*.css\",\n \"./mod\": \"./dist/mod/index.js\",\n \"./mod/*\": \"./dist/mod/*/index.js\",\n \"./mod/*.css\": \"./dist/mod/*.css\",\n \"./css/\": \"./dist/css/\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && sh ./clean.sh\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"@types/node\": \"^24.10.1\",\n \"eslint\": \"^9.39.1\",\n \"globals\": \"^16.5.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.47.0\"\n },\n \"license\": \"MIT\",\n \"author\": \"hs3lcs@gmail.com\"\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=\"กลับด้านบน\">&#xf341;</button>\n `;\n document.body.appendChild(totop);\n // add event\n totop.querySelector<HTMLButtonElement>('#btn-totop')!.onclick = () => {\n app.scrollTo({ top: 0, behavior: 'smooth' });\n };\n app.addEventListener('scroll', () => {\n if (app.scrollTop > 1000) {\n totop.style.display = 'block';\n if (app.classList.contains('tabbar')) {\n app.style.paddingBottom = '116px';\n } else {\n app.style.paddingBottom = '60px';\n }\n } else {\n totop.style.display = '';\n app.style.paddingBottom = '';\n }\n // tabs mobile shadow\n const tabsMobile = app.querySelector<HTMLElement>('.slim-tabs.mobile .tabs-header');\n if (!tabsMobile) return;\n if (app.scrollTop > 10) {\n tabsMobile.style.boxShadow = `rgba(0, 0, 0, 0.16) 0px 1px 4px`;\n } else {\n tabsMobile.style.boxShadow = '';\n }\n });\n};\n/*------------------------------------------------------------*/","/* sdklib */\n/*--------------------------------------------------*/\nexport * from './dateTime';\nexport * from './utility';\nexport * as geo from './geoLocate';\nexport * as cookie from './cookie';\nexport { thbText } from './thbText';\n/*--------------------------------------------------*/","/* dateTime */\n/*--------------------------------------------------------------------------------*/\nexport const TH_MONTH: string[] = [\n 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน',\n 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม',\n];\nexport const TH_MONTH_SHORT: string[] = [\n 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.',\n 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.',\n];\nexport const FY_MONTH: string[] = [\n 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม', 'มกราคม', 'กุมภาพันธ์', 'มีนาคม',\n 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน',\n];\nexport const FY_MONTH_SHORT: string[] = [\n 'ต.ค.', 'พ.ย.', 'ธ.ค.', 'ม.ค.', 'ก.พ.', 'มี.ค.',\n 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.',\n];\nexport const PERIOD_TEXT: string[] = ['', 'เวรดึก', 'เวรเช้า', 'เวรบ่าย'];\n// time unix now\nexport const curTime = (): number => new Date().getTime();\n/*--------------------------------------------------------------------------------*/\nexport const curDate = (): string => {\n const dt = new Date();\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const curMonth = (): string => {\n const dt = new Date();\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n return `${yy}-${mm}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const curYear = (yearType = ''): number => {\n const dt = new Date();\n const mm = dt.getMonth() + 1;\n if ((yearType == 'fyear' || yearType == 'fy') && mm > 9) {\n return dt.getFullYear() + 1; // ปีงบประมาณ\n }\n return dt.getFullYear(); // ปีปฏิทิน\n};\n/*--------------------------------------------------------------------------------*/\nexport const timeToStr = (unixtime: number, format = ''): string => {\n if (typeof unixtime != 'number') {\n return '';\n }\n const unix = new Date(Number(unixtime));\n const yy = unix.getFullYear();\n const mm = String(unix.getMonth() + 1).padStart(2, '0');\n const dd = String(unix.getDate()).padStart(2, '0');\n const H = String(unix.getHours()).padStart(2, '0');\n const M = String(unix.getMinutes()).padStart(2, '0');\n const S = String(unix.getSeconds()).padStart(2, '0');\n if (format == 'date') {\n return `${yy}-${mm}-${dd}`;\n }\n if (format == 'time') {\n return `${H}:${M}:${S}`;\n }\n return `${yy}-${mm}-${dd} ${H}:${M}:${S}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const shiftIndex = (unixtime = 0) => {\n if (typeof unixtime != 'number') {\n return { num: 0, text: '' };\n }\n const unix = unixtime ? new Date(unixtime) : new Date();\n const H = unix.getHours();\n if (H >= 0 && H < 8) return { num: 1, text: PERIOD_TEXT[1] };\n if (H >= 8 && H < 16) return { num: 2, text: PERIOD_TEXT[2] };\n if (H >= 16) return { num: 3, text: PERIOD_TEXT[3] };\n return { num: 0, text: '' };\n};\n/*--------------------------------------------------------------------------------*/\nexport const setYear = (el: HTMLSelectElement, min = 2020, txt = '') => {\n const dt = new Date();\n let year = dt.getFullYear();\n const month = dt.getMonth() + 1;\n if (month > 6 && month <= 12) {\n year++;\n }\n el.innerHTML = '<option value=\"\">- เลือก -</option>';\n for (let y = min; y <= year; y++) {\n const option = document.createElement('option');\n option.value = `${y}`;\n option.text = `${txt} ${y + 543}`;\n el.appendChild(option);\n }\n};\n/*--------------------------------------------------------------------------------*/\nexport const thaiDate = (date: number | string, format = 0): string => {\n if (typeof date == 'string' && date.indexOf('0000-00-00') >= 0) {\n return '';\n }\n if (typeof date == 'string') {\n date = date.trim();\n date = date.replace(' ', 'T');\n }\n\n const dt = new Date(date);\n if (isNaN(dt.getTime())) return '';\n\n const yy = dt.getFullYear() + 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n const H = String(dt.getHours()).padStart(2, '0');\n const M = String(dt.getMinutes()).padStart(2, '0');\n const S = String(dt.getSeconds()).padStart(2, '0');\n\n // 01/01/2500\n if (format == 0) return `${dd}/${mm}/${yy}`;\n // 01/01/2500 00:00\n if (format == 1) return `${dd}/${mm}/${yy} ${H}:${M}`;\n // 01/01/2500 00:00:00\n if (format == 2) return `${dd}/${mm}/${yy} ${H}:${M}:${S}`;\n\n // 01 มกราคม 2500\n if (format == 10) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy}`;\n // 01 ม.ค. 65\n if (format == 11) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;\n // 01 มกราคม 2500 เวลา 00:00 น.\n if (format == 12) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy} เวลา ${H}:${M} น.`;\n // 01 ม.ค. 65 00:00\n if (format == 13) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)} ${H}:${M}`;\n\n // มกราคม 2500\n if (format == 20) return `${TH_MONTH[Number(mm) - 1]} ${yy}`;\n // ม.ค. 2500\n if (format == 21) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${yy}`;\n // ม.ค. 65\n if (format == 22) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;\n\n return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const dateDiff = (start: string, stop: string): number => {\n if (!start || start.indexOf('0000-00-00') >= 0) {\n return 0;\n }\n if (!stop || stop.indexOf('0000-00-00') >= 0) {\n return 0;\n }\n const [y1, m1, d1] = start.split('-');\n const [y2, m2, d2] = stop.split('-');\n const date1 = new Date(Number(y1), Number(m1) - 1, Number(d1)).getTime();\n const date2 = new Date(Number(y2), Number(m2) - 1, Number(d2)).getTime();\n return Math.round((date2 - date1) / (1000 * 60 * 60 * 24));\n};\n/*--------------------------------------------------------------------------------*/\nexport const timeDiff = (start: string, stop: string) => {\n if (!start || start.indexOf('0000-00-00') >= 0) {\n return { h: 0, m: 0, s: 0 };\n }\n if (!stop || stop.indexOf('0000-00-00') >= 0) {\n return { h: 0, m: 0, s: 0 };\n }\n start = start.replace(' ', 'T');\n stop = stop.replace(' ', 'T');\n const date1 = new Date(start);\n const date2 = new Date(stop);\n let msec = date2.getTime() - date1.getTime();\n\n const hh = Math.floor(msec / 1000 / 60 / 60);\n msec -= hh * 1000 * 60 * 60;\n const mm = Math.floor(msec / 1000 / 60);\n msec -= mm * 1000 * 60;\n const ss = Math.floor(msec / 1000);\n msec -= ss * 1000;\n return { h: hh, m: mm, s: ss };\n};\n/*--------------------------------------------------------------------------------*/\nexport const getAge = (date: string) => {\n if (!date || date.indexOf('0000-00-00') >= 0) {\n return { years: 0, months: 0, days: 0 };\n }\n const now = new Date();\n const nowYear = now.getFullYear();\n const nowMonth = now.getMonth();\n const nowDate = now.getDate();\n\n const [yy, mm, dd] = date.split('-');\n const birth = new Date(Number(yy), Number(mm) - 1, Number(dd));\n const birthYear = birth.getFullYear();\n const birthMonth = birth.getMonth();\n const birthDate = birth.getDate();\n\n let yearAge = nowYear - birthYear;\n let monthAge = 0;\n let dateAge = 0;\n\n if (nowMonth >= birthMonth) {\n monthAge = nowMonth - birthMonth;\n } else {\n yearAge--;\n monthAge = 12 + nowMonth - birthMonth;\n }\n\n if (nowDate >= birthDate) {\n dateAge = nowDate - birthDate;\n } else {\n monthAge--;\n dateAge = 31 + nowDate - birthDate;\n if (monthAge < 0) {\n monthAge = 11;\n yearAge--;\n }\n }\n\n return {\n years: yearAge,\n months: monthAge,\n days: dateAge,\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const ageToBirth = (year: number, month: number, day: number): string => {\n const y = Number(year);\n const m = Number(month);\n const d = Number(day);\n const dt = new Date(\n new Date().getFullYear() - y,\n new Date().getMonth() - m,\n new Date().getDate() - d,\n );\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`; // 1957-10-10\n};\n/*--------------------------------------------------------------------------------*/\nexport const toDbDate = (date: string): string => {\n if ((!date) || (date.indexOf('0000-00-00') >= 0)) {\n return '';\n }\n const dt = new Date(date);\n const yy = dt.getFullYear() - 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const toThaiDate = (date: string): string => {\n if ((!date) || (date.indexOf('0000-00-00') >= 0)) {\n return '';\n }\n const dt = new Date(date);\n const yy = dt.getFullYear() + 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const isToday = (date: string): boolean => {\n const input = new Date(date);\n const today = new Date();\n if (input.setHours(0, 0, 0, 0) == today.setHours(0, 0, 0, 0)) {\n return true;\n }\n return false;\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","/* geoLocate */\n/*--------------------------------------------------------------------------------*/\ntype GeoCoords = {\n position: {\n lat: number;\n lng: number;\n };\n accuracy: number;\n heading: number;\n speed: number;\n timestamp: number;\n};\n/*--------------------------------------------------------------------------------*/\nexport const getPosition = (params: {\n accuracy: number;\n timeout: number;\n}) => new Promise<GeoCoords>((resolve, reject) => {\n const timeout = params.timeout ? params.timeout : 10000; // 10 sec\n const acrLimit = params.accuracy ? params.accuracy : 10; // 10 meter\n const buff: GeoCoords[] = [];\n if (navigator.geolocation) {\n // set timeout\n const Tcount = setTimeout(() => {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n // return best accuracy\n if (buff.length) {\n buff.sort((a, b) => a.accuracy - b.accuracy);\n resolve(buff[0]);\n }\n else {\n reject('position not found');\n }\n }, timeout);\n // get position\n const watchId = watchPosition((pos) => {\n const lat = pos.coords.latitude;\n const lng = pos.coords.longitude;\n const acr = pos.coords.accuracy;\n const head = pos.coords.heading ? pos.coords.heading : 0;\n const speed = pos.coords.speed ? pos.coords.speed : 0;\n const time = pos.timestamp;\n buff.push({\n position: { lat: lat, lng: lng },\n accuracy: acr,\n heading: head,\n speed: speed,\n timestamp: time,\n });\n // accuracy check\n if (acr <= acrLimit) {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n resolve({\n position: { lat: lat, lng: lng },\n accuracy: acr,\n heading: head,\n speed: speed,\n timestamp: time,\n });\n }\n }, (err) => {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n reject(err);\n });\n }\n else reject('not support geolocation');\n});\n/*--------------------------------------------------------------------------------*/\nexport const watchPosition = (\n success: PositionCallback,\n error: PositionErrorCallback\n) => {\n if (navigator.geolocation) {\n return navigator.geolocation.watchPosition(success, error, {\n enableHighAccuracy: true,\n timeout: 5000,\n maximumAge: 0,\n });\n }\n return 0;\n};\n/*--------------------------------------------------------------------------------*/\nexport const toAddress = async (position: { lat: number; lng: number; }) => {\n const key = 'AIzaSyDsKimgLKSw9DAz_j8Z0HDkLTmyGhxmNiU';\n const latlng = `${position.lat},${position.lng}`;\n let url = `https://maps.googleapis.com/maps/api/geocode/json`;\n url += `?latlng=${latlng}&key=${key}`;\n // fetch\n let address = '';\n await fetch(url).then(response => response.json()).then(resp => {\n const data = resp.results;\n if (data.length) address = data[0].formatted_address;\n });\n return address;\n};\n/*--------------------------------------------------------------------------------*/\n","/* cookie */\n/*--------------------------------------------------------------------------------*/\nexport const setItem = (key: string, val: string, exp: number) => {\n const d = new Date();\n d.setTime(d.getTime() + (exp * 24 * 60 * 60 * 1000));\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = `${key}=${val};${expires};path=/`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const getItem = (key: string): string => {\n const pair = document.cookie.split('; ').find(x => x.startsWith(key + '='));\n if (pair) return pair.split('=')[1];\n else return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const removeItem = (key: string) => {\n document.cookie = `${key}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const clear = () => {\n document.cookie.split(';').forEach(cookie => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substring(0, eqPos) : cookie;\n removeItem(name);\n });\n};\n/*--------------------------------------------------------------------------------*/\n","/* thbText */\nconst MAX_POSITION = 6;\nconst UNIT_POSITION = 0;\nconst TEN_POSITION = 1;\n\nconst PRIMARY_UNIT = 'บาท';\nconst SECONDARY_UNIT = 'สตางค์';\nconst WHOLE_NUMBER_TEXT = 'ถ้วน';\nconst NUMBER_TEXTS = ['ศูนย์', 'หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า', 'สิบ'];\nconst UNIT_TEXTS = ['สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน'];\n\nconst getIntegerDigits = (numberStringInput: string): number => parseInt(numberStringInput.split('.')[0], 10);\nconst getFractionalDigits = (numberStringInput: string): number => parseInt(numberStringInput.split('.')[1], 10);\nconst hasFractionalDigits = (numberInput: number | undefined) => numberInput !== undefined && numberInput !== 0;\n\nfunction isZeroValue(numberStringInput: string): boolean;\nfunction isZeroValue(numberInput: number): boolean;\nfunction isZeroValue(input: string | number): boolean {\n return parseInt(`${input}`, 10) === 0;\n}\n\nconst isUnitPosition = (position: number) => position == UNIT_POSITION;\nconst isTenPosition = (position: number) => position % MAX_POSITION == TEN_POSITION;\nconst isMillionsPosition = (position: number) => (position >= MAX_POSITION && position % MAX_POSITION == 0);\nconst isLastPosition = (position: number, lengthOfDigits: number) => position + 1 < lengthOfDigits;\n\nconst reverseNumber = (number: number): string => {\n const numberStr = number.toString();\n return numberStr.split('').reverse().join('');\n};\n\nconst getBathUnit = (position: number, number: string) => {\n let unitText = '';\n if (!isUnitPosition(position)) {\n unitText = UNIT_TEXTS[Math.abs(position - 1) % MAX_POSITION];\n }\n if (isZeroValue(number) && !isMillionsPosition(position)) {\n unitText = '';\n }\n return unitText;\n};\n\nconst getBathText = (position: number, number: string, lengthOfDigits: number) => {\n const _number: number = parseInt(number, 10);\n let numberText = NUMBER_TEXTS[_number];\n if (isZeroValue(_number)) {\n return '';\n }\n if (isTenPosition(position) && _number == 1) {\n numberText = '';\n }\n if (isTenPosition(position) && _number == 2) {\n numberText = 'ยี่';\n }\n if (isMillionsPosition(position) && isLastPosition(position, lengthOfDigits) && _number == 1) {\n numberText = 'เอ็ด';\n }\n if (lengthOfDigits > 1 && isUnitPosition(position) && _number == 1) {\n numberText = 'เอ็ด';\n }\n return numberText;\n};\n\nconst convert = (numberInput: number): string => {\n const numberReverse: string = reverseNumber(numberInput);\n let textOutput = '';\n numberReverse.split('').forEach((number: string, i) => {\n textOutput = `${getBathText(i, number, numberReverse.length)}${getBathUnit(i, number)}${textOutput}`;\n });\n return textOutput;\n};\n\nconst parseFloatWithPrecision = (number: string, precision = 2): string => {\n const numberFloatStr = parseFloat(number).toString().split('.');\n const integerUnitStr = numberFloatStr[0];\n const fractionalUnitStr = (numberFloatStr.length == 2) ? numberFloatStr[1].substring(0, precision) : '00';\n return parseFloat(`${integerUnitStr}.${fractionalUnitStr}`).toFixed(precision);\n};\n\nconst convertFullMoney = (numberInput: string) => {\n const numberStr: string = parseFloatWithPrecision(numberInput);\n const integerDigits: number = getIntegerDigits(numberStr);\n const fractionalDigits: number = getFractionalDigits(numberStr);\n const intTextOutput = convert(integerDigits);\n const textOutput = [];\n if (intTextOutput) {\n textOutput.push(`${[intTextOutput, PRIMARY_UNIT].join('')}`);\n }\n if (intTextOutput && !hasFractionalDigits(fractionalDigits)) {\n textOutput.push(WHOLE_NUMBER_TEXT);\n }\n if (hasFractionalDigits(fractionalDigits) && convert(fractionalDigits)) {\n textOutput.push(`${[convert(fractionalDigits), SECONDARY_UNIT].join('')}`);\n }\n return textOutput.join('');\n};\n\nfunction ThaiBahtText(stringNumberInput: string): string;\nfunction ThaiBahtText(numberInput: number): string;\nfunction ThaiBahtText(input: string | number): string {\n if (isNaN(Number(`${input}`))) {\n throw new TypeError('Invalid input. Expected a number or a string representing a number.');\n }\n return convertFullMoney(`${input}`);\n}\n\nexport const thbText = ThaiBahtText;\n","/* module */\n/*--------------------------------------------------*/\nexport * from './built-in';\nexport * as camera from './camera';\nexport * as dialog from './dialog';\nexport * as drawer from './drawer';\nexport * as drop from './drop';\nexport * as modal from './modal';\nexport * as tabs from './tabs';\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","/* input */\n/*--------------------------------------------------------------------------------*/\nexport const setAutoSize = (elm: HTMLTextAreaElement) => {\n elm.onkeyup = () => fitSize(elm);\n};\nexport const fitSize = (elm: HTMLTextAreaElement, delay = 0) => {\n setTimeout(() => {\n elm.style.height = 'auto';\n elm.style.height = `${elm.scrollHeight + 2}px`;\n }, delay);\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","/* camera */\n/*--------------------------------------------------------------------------------*/\nexport const takePhoto = () => new Promise<{ image: string; }>((resolve) => {\n // set hash\n window.onhashchange = () => {\n if (window.location.hash != '#camera') closeCam();\n };\n window.location.hash = 'camera';\n // create\n const cam = camCreate();\n const video = cam.querySelector<HTMLVideoElement>('#video');\n let imgData: string;\n let stream: void | MediaStream;\n let front = false;\n const options = {\n video: {\n facingMode: 'environment',\n width: { ideal: 1024 },\n height: { ideal: 768 },\n }\n };\n const closeCam = () => {\n stopMedia();\n camClose(cam);\n resolve({ image: imgData });\n };\n const stopMedia = () => {\n if (stream) {\n const track = stream.getTracks()[0];\n track.stop();\n }\n };\n const startMedia = async () => {\n const title = cam.querySelector<HTMLElement>('.header .title');\n const detail = cam.querySelector<HTMLElement>('.header .detail');\n const footer = cam.querySelector<HTMLElement>('.footer');\n const body = cam.querySelector<HTMLElement>('.body');\n stream = await navigator.mediaDevices.getUserMedia(options).catch(() => {\n title!.innerText = 'ไม่พบกล้องถ่ายภาพ';\n footer!.style.display = 'none';\n body!.innerHTML = /*html*/ `\n <i class=\"icon thin\" style=\"font-size: 80px;\">&#xf8c4;</i>\n `;\n });\n if (stream) {\n video!.srcObject = stream;\n video!.play();\n const media = stream.getTracks()[0].getSettings();\n detail!.innerText = `${media.width}x${media.height} ${media.frameRate}fps`;\n }\n };\n // start media\n (async () => {\n await startMedia();\n camReady(cam);\n })();\n // button\n const btn_take = cam.querySelector<HTMLButtonElement>('#btn-take');\n const btn_flip = cam.querySelector<HTMLElement>('#btn-flip');\n const btn_close = cam.querySelector<HTMLElement>('#btn-close');\n const btn_cancel = cam.querySelector<HTMLElement>('#btn-cancel');\n // btn-take\n btn_take!.onclick = () => {\n const media = stream!.getTracks()[0].getSettings();\n const image = cam.querySelector<HTMLCanvasElement>('#image');\n // init image\n const ctx = image!.getContext('2d');\n ctx!.clearRect(0, 0, image!.width, image!.height);\n image!.width = Number(media.width);\n image!.height = Number(media.height);\n // image data\n const image_ctx = image!.getContext('2d');\n image_ctx!.drawImage(\n video!, 0, 0,\n Number(media.width), Number(media.height), 0, 0,\n image!.width, image!.height,\n );\n imgData = image!.toDataURL('image/jpeg');\n history.back();\n };\n // btn-flip\n btn_flip!.onclick = async () => {\n front = !front;\n options.video.facingMode = front ? 'user' : 'environment';\n stopMedia();\n camLoading(cam);\n await startMedia();\n camReady(cam);\n };\n // btn-close, btn-cancel\n btn_close!.onclick = () => history.back();\n btn_cancel!.onclick = () => history.back();\n});\n/*--------------------------------------------------------------------------------*/\nconst camCreate = (): HTMLElement => {\n const cam = document.createElement('div');\n cam.className = 'slim-camera';\n cam.innerHTML = /*html*/ `\n <div class=\"body\">\n <video id=\"video\" muted playsinline></video>\n <canvas id=\"image\"></canvas>\n </div>\n <div class=\"header\">\n <div style=\"text-align: center;\">\n <div class=\"title\">กล้องถ่ายภาพ</div>\n <div class=\"detail\"></div>\n </div>\n <i id=\"btn-close\" class=\"icon\">&#xf00d;</i>\n </div>\n <div class=\"footer\">\n <i id=\"btn-cancel\" class=\"icon\">&#xf057;</i>\n <button id=\"btn-take\"></button>\n <i id=\"btn-flip\" class=\"icon\">&#xf021;</i>\n </div>\n <div class=\"loader\">\n <div class=\"spinner s32\"></div>\n </div>\n `;\n document.body.appendChild(cam);\n // open camera\n cam.style.left = `-100%`;\n cam.classList.add('cam-in');\n return cam;\n};\n/*--------------------------------------------------------------------------------*/\nconst camClose = (cam: HTMLElement) => {\n window.onhashchange = null;\n cam.classList.remove('cam-in');\n cam.classList.add('cam-out');\n cam.onanimationend = () => {\n cam.remove();\n };\n};\n/*--------------------------------------------------------------------------------*/\nconst camLoading = (cam: HTMLElement) => {\n const body = cam.querySelector<HTMLElement>('.body');\n const loader = cam.querySelector<HTMLElement>('.loader');\n body!.style.visibility = 'hidden';\n loader!.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nconst camReady = (cam: HTMLElement) => {\n const header = cam.querySelector<HTMLElement>('.header');\n const footer = cam.querySelector<HTMLElement>('.footer');\n const body = cam.querySelector<HTMLElement>('.body');\n const loader = cam.querySelector<HTMLElement>('.loader');\n header!.style.visibility = 'visible';\n footer!.style.visibility = 'visible';\n body!.style.visibility = 'visible';\n loader!.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\n","/* dialog */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport const Confirm = (\n message: string,\n params?: {\n color?: string;\n target?: HTMLElement;\n }\n) => new Promise<boolean>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const color = params && params?.color ? params.color : 'green';\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"confirm ${color}\">\n <div class=\"header\">\n <i class=\"icon solid\">&#xf058;</i> Slim Confirm\n </div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg gray left\" id=\"btn-no\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n <button class=\"lg ${color} right\" id=\"btn-yes\">\n <i>&#xf058;</i>ตกลง\n </button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve(true);\n };\n dialog.querySelector<HTMLButtonElement>('#btn-no')!.onclick = () => {\n dialog.remove();\n resolve(false);\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const Alert = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"alert ${color}\">\n <div class=\"icon solid\">${icon}</div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg ${color}\" id=\"btn-yes\">ตกลง</button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve();\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const Toast = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const toast = document.createElement('div');\n toast.className = `slim-toast ${color}`;\n toast.innerHTML = /*html*/ `\n <i class=\"icon\">${icon}</i>\n <span class=\"text\">${message}</span>\n `;\n doc.appendChild(toast);\n // animation\n toast.classList.add('show');\n let count = 0;\n toast.onanimationend = () => {\n count++;\n if (count == 2) {\n toast.remove();\n resolve();\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\n","/* drawer */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\ntype reqParams = {\n title: string;\n body: string;\n name?: string;\n size?: string; // mobile, full\n};\nexport const Create = (params: reqParams): HTMLElement => {\n const name = params.name ? params.name : 'drawer';\n const size = params.size ? params.size : 'mobile';\n // create\n const drawer = document.createElement('div');\n drawer.className = `slim-drawer ${size}`;\n drawer.innerHTML = /*html*/ `\n <div class=\"drawer-header\">\n <button id=\"btn-exit\" type=\"button\"\n class=\"circle sm light\"></button>\n <div class=\"title\">${params.title}</div>\n </div>\n <div class=\"drawer-body\">${params.body}</div>\n <div class=\"loader\">\n <div class=\"spinner s32\"></div>\n </div>\n `;\n document.body.appendChild(drawer);\n // set size\n switch (size) {\n case 'mobile': openMobile(drawer); break;\n case 'full':\n drawer.style.animation = 'slide-in-left 0.4s forwards';\n break;\n default: return drawer;\n }\n // hash change\n window.location.hash = name;\n const hashChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hash != name && hash != 'modal') done();\n };\n const done = () => {\n destroy(drawer);\n if (window.location.hash == `#${name}`) history.back();\n window.removeEventListener('hashchange', hashChange);\n };\n window.addEventListener('hashchange', hashChange);\n // button\n const btnExit = drawer.querySelector<HTMLButtonElement>('#btn-exit');\n const btnCancel = drawer.querySelector<HTMLButtonElement>('#btn-cancel');\n if (btnExit) {\n btnExit.focus();\n btnExit.onclick = done;\n }\n if (btnCancel) btnCancel.onclick = done;\n return drawer;\n};\n/*--------------------------------------------------------------------------------*/\nconst openMobile = (drawer: HTMLElement) => {\n if (!app) return;\n const offset = app.getBoundingClientRect();\n const appRight = offset.right;\n const appWidth = app.offsetWidth;\n // default position\n drawer.style.left = `${appRight}px`;\n // animation\n const css = document.createElement('style');\n drawer.appendChild(css);\n css.sheet?.insertRule(`\n @keyframes drawer-in {\n from {transform: translateX(0);}\n to {transform: translateX(-${appWidth}px);}\n }\n `);\n css.sheet?.insertRule(`\n @keyframes drawer-out {\n from {transform: translateX(-${appWidth}px);}\n to {transform: translateX(0);}\n }\n `);\n // open drawer\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.animation = 'drawer-push-app 0.4s forwards';\n drawer.style.animation = 'drawer-in 0.4s forwards';\n // scroll shadow\n const header = drawer.querySelector<HTMLElement>('.drawer-header');\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n if (header && body) body.onscroll = () => {\n if (body.scrollTop > 10) {\n header.style.boxShadow = `\n rgba(60, 64, 67, 0.3) 0px 1px 2px 0px,\n rgba(60, 64, 67, 0.15) 0px 1px 3px 1px\n `;\n } else {\n header.style.boxShadow = '';\n }\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const Close = (drawer: HTMLElement) => new Promise<void>((resolve) => {\n drawer.querySelector<HTMLButtonElement>('#btn-exit')!.click();\n drawer.addEventListener('animationend', () => resolve());\n});\nconst destroy = (drawer: HTMLElement) => {\n if (!app) return;\n if (drawer.classList.contains('mobile')) {\n // mobile\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.animation = 'drawer-pull-app 0.4s forwards';\n drawer.style.animation = 'drawer-out 0.4s forwards';\n drawer.addEventListener('animationend', () => {\n if (content) content.style.animation = 'unset';\n drawer.remove();\n });\n } else {\n // full-page\n drawer.style.animation = 'slide-out-left 0.4s forwards';\n drawer.addEventListener('animationend', () => {\n drawer.remove();\n });\n }\n // remove modal\n const modal = document.querySelectorAll<HTMLElement>('.slim-modal');\n modal.forEach(el => el.remove());\n // remove dialog\n const dialog = document.querySelectorAll<HTMLElement>('.slim-dialog');\n dialog.forEach(el => el.remove());\n};\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (drawer: HTMLElement) => {\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n const loader = drawer.querySelector<HTMLElement>('.loader');\n if (body) body.style.display = 'none';\n if (loader) loader.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Ready = (drawer: HTMLElement) => {\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n const loader = drawer.querySelector<HTMLElement>('.loader');\n if (body) body.style.display = 'block';\n if (loader) loader.style.display = 'none';\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","/* modal */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nconst tmpBtnSave: string = /* html */ `\n <button class=\"solid green\" type=\"submit\">\n <i>&#xf0c7;</i>บันทึก\n </button>\n`;\nconst tmpBtnCancel: string = /* html */ `\n <button class=\"solid gray\" type=\"button\" id=\"btn-cancel\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n`;\nconst tmpBtnClose: string = /* html */ `\n <button class=\"solid blue\" type=\"button\" id=\"btn-close\">\n <i>&#xf057;</i>ปิดหน้า\n </button>\n`;\ntype ModalParams = {\n icon: string;\n title: string;\n body: string;\n width?: string;\n button?: {\n save?: boolean;\n cancel?: boolean;\n close?: boolean;\n align?: string;\n };\n target?: HTMLElement;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Create = (params: ModalParams): HTMLElement => {\n const icon = params.icon ? params.icon : '&#xf40e;';\n const title = params.title ? params.title : 'Modal Title';\n const body = params.body ? params.body : 'Modal Body';\n const width = params.width ? params.width : '100%';\n const align = params.button?.align ? params.button?.align : '';\n const doc = params.target ? params.target : app;\n // button\n let button = '';\n if (params.button?.cancel) button += tmpBtnCancel;\n if (params.button?.close) button += tmpBtnClose;\n if (params.button?.save) button += tmpBtnSave;\n // create\n const modal = document.createElement('div');\n modal.className = 'overlay slim-modal';\n modal.innerHTML = /*html*/ `\n <form>\n <div class=\"content\" style=\"width: ${width};\">\n <div class=\"header\">\n <i class=\"icon pad\">${icon}</i>${title}\n <button id=\"btn-exit\" type=\"button\"\n class=\"icon\">&#xf00d;</button>\n </div>\n <div class=\"body\">${body}</div>\n <div class=\"footer ${align}\">${button}</div>\n <div class=\"loader\">\n <div class=\"spinner s28\"></div>\n </div>\n </div>\n </form>\n `;\n if (!doc) return modal;\n doc.appendChild(modal);\n if (width == 'auto') {\n const content = modal.querySelector<HTMLElement>('.content');\n if (content) content.style.maxWidth = `450px`;\n }\n // open modal\n window.location.hash = 'modal';\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-in');\n modal.classList.add('overlay-in');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-in')) {\n content.classList.remove('modal-in');\n modal.classList.remove('overlay-in');\n }\n });\n // hash change\n const hashChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hash != 'modal') done();\n };\n const done = () => {\n destroy(modal);\n if (window.location.hash == '#modal') history.back();\n window.removeEventListener('hashchange', hashChange);\n };\n window.addEventListener('hashchange', hashChange);\n // button\n const btnExit = modal.querySelector<HTMLButtonElement>('#btn-exit');\n const btnCancel = modal.querySelector<HTMLButtonElement>('#btn-cancel');\n const btnClose = modal.querySelector<HTMLButtonElement>('#btn-close');\n if (btnExit) {\n btnExit.focus();\n btnExit.onclick = done;\n }\n if (btnCancel) btnCancel.onclick = done;\n if (btnClose) btnClose.onclick = done;\n return modal;\n};\n/*--------------------------------------------------------------------------------*/\nexport const Close = (modal: HTMLElement) => new Promise<void>((resolve) => {\n modal.querySelector<HTMLButtonElement>('#btn-exit')!.click();\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.addEventListener('animationend', () => resolve());\n});\nconst destroy = (modal: HTMLElement) => {\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-out');\n modal.classList.add('overlay-out');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-out')) {\n modal.style.display = 'none';\n modal.remove();\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const Loading = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'hidden';\n if (loader) loader.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Ready = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'visible';\n if (loader) loader.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const Hidden = (modal: HTMLElement) => {\n modal.style.display = 'none';\n};\nexport const Visible = (modal: HTMLElement) => {\n modal.style.display = 'block';\n};\n/*--------------------------------------------------------------------------------*/\n","/* tabs */\n/*--------------------------------------------------------------------------------*/\nconst ignore: string[] = ['camera', 'drawer', 'modal'];\nconst hashIgnore = (hash: string) => ignore.includes(hash);\n/*--------------------------------------------------------------------------------*/\nexport const Init = (\n tabs: HTMLElement,\n onChange: (index: number, done: () => void) => void,\n) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn');\n tbtn.forEach(elm => {\n const dataHash = elm.getAttribute('data-hash');\n elm.onclick = () => window.location.replace('#' + dataHash);\n });\n // tabs change\n const tabsChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hashIgnore(hash)) return;\n if (hash == '') {\n const mainTabs = tbtn[0].getAttribute('data-hash');\n window.location.replace('#' + mainTabs);\n return;\n }\n const curTabs = tabs.querySelector<HTMLButtonElement>('.tabs-btn.active');\n if (hash == curTabs?.getAttribute('data-hash')) return;\n // set active\n let index = 0;\n tbtn.forEach((elm, i) => {\n const dataHash = elm.getAttribute('data-hash');\n if (hash == dataHash) {\n elm.classList.add('active');\n index = i;\n } else {\n elm.classList.remove('active');\n }\n });\n tabsLoading(tabs, index);\n onChange(index, () => tabsReady(tabs, index));\n };\n tabsChange();\n window.onhashchange = tabsChange;\n};\n/*--------------------------------------------------------------------------------*/\nconst tabsLoading = (tabs: HTMLElement, index: number) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn')[index];\n const body = tabs.querySelector<HTMLElement>('.tabs-body');\n const inner = tbtn.querySelectorAll<HTMLElement>('*');\n const tabsBar = tabs.querySelector<HTMLElement>('.tabs-bar');\n if (tbtn && body) {\n // clear loader\n tabs.querySelector<HTMLElement>('.tabs-overlay')?.remove();\n tbtn.querySelector<HTMLElement>('.btn-loader')?.remove();\n // hide inner\n body.style.display = 'none';\n inner.forEach(el => el.style.display = 'none');\n // create overlay\n const overlay = document.createElement('div');\n overlay.className = 'tabs-overlay';\n tabs.appendChild(overlay);\n // create loader\n const loader = document.createElement('div');\n loader.className = 'btn-loader';\n loader.innerHTML = `<div class=\"spinner s24\"></div>`;\n tbtn.appendChild(loader);\n // tabs-bar\n if (tabsBar) {\n const barCont = tabsBar.querySelectorAll<HTMLElement>('*');\n barCont.forEach(el => el.style.visibility = 'hidden');\n tabsBar.querySelector<HTMLElement>('.lds-ellipsis')?.remove();\n // create loader\n const loader = document.createElement('div');\n loader.className = 'lds-ellipsis';\n loader.innerHTML = `<div></div><div></div><div></div><div></div>`;\n tabsBar.prepend(loader);\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\nconst tabsReady = (tabs: HTMLElement, index: number) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn')[index];\n const body = tabs.querySelector<HTMLElement>('.tabs-body');\n const inner = tbtn.querySelectorAll<HTMLElement>('*');\n const tabsBar = tabs.querySelector<HTMLElement>('.tabs-bar');\n if (tbtn && body) new Promise(r => setTimeout(r, 400)).then(() => {\n // clear loader\n tabs.querySelector<HTMLElement>('.tabs-overlay')?.remove();\n tbtn.querySelector<HTMLElement>('.btn-loader')?.remove();\n // show inner\n body.style.display = 'block';\n inner.forEach(el => el.style.display = '');\n // tabs-bar\n if (tabsBar) {\n const barCont = tabsBar.querySelectorAll<HTMLElement>('*');\n barCont.forEach(el => el.style.visibility = '');\n tabsBar.querySelector<HTMLElement>('.lds-ellipsis')?.remove();\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const setActive = (tbtn: NodeListOf<HTMLButtonElement>, index: number) => {\n tbtn.forEach((elm, i) => {\n if (i == index) {\n elm.classList.add('active');\n } else {\n elm.classList.remove('active');\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\n","/* oauth */\n/*--------------------------------------------------------------------------------*/\nimport { gbvar } from '../../mod/global';\nimport * as cookie from '../../lib/cookie';\nimport { tempLogout } from './template';\nconst app = document.querySelector<HTMLElement>('#app');\nexport { Midware } from './midware';\n/*--------------------------------------------------------------------------------*/\nexport const Login = () => {\n clearCache();\n // set params\n const state = Math.random().toString(36).slice(-8);\n sessionStorage.setItem('OAUTH_STATE', state);\n const query = new URLSearchParams({\n response_type: 'token',\n client_id: gbvar.app.UUID,\n state: state,\n }).toString();\n const url = `${gbvar.hub.LOGIN}?${query}`;\n window.location.replace(url);\n};\n/*--------------------------------------------------------------------------------*/\nexport const Logout = () => {\n clearCache();\n // template\n if (!app) return;\n app.innerHTML = tempLogout;\n app.classList.add('full-page');\n const content = app.querySelector<HTMLElement>('#content')!;\n const loader = app.querySelector<HTMLElement>('#loader')!;\n new Promise(r => setTimeout(r, 800)).then(() => {\n content.style.display = 'block';\n loader.style.display = 'none';\n });\n app.querySelector<HTMLButtonElement>('#btn-login')!.onclick = () => {\n window.location.replace('/login');\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const Callback = () => {\n const search = window.location.search;\n const query = new URLSearchParams(search);\n const state = query.get('state');\n const session = sessionStorage.getItem('OAUTH_STATE');\n if (state !== session) {\n window.location.replace('/login');\n }\n clearCache();\n // response_type\n const code = query.get('code');\n const token = query.get('token');\n if (code) { /*code*/ }\n if (token) {\n localStorage.setItem('ACCESS_TOKEN', token);\n }\n window.location.replace('/');\n};\n/*--------------------------------------------------------------------------------*/\nconst clearCache = () => {\n cookie.clear();\n localStorage.clear();\n sessionStorage.clear();\n};\n/*--------------------------------------------------------------------------------*/\n","/* template */\nexport const tempLogout = /*html*/ `\n<div id=\"page-logout\">\n <div id=\"content\">\n <div class=\"logo\">\n <img src=\"https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-02.png\">\n </div>\n <button id=\"btn-login\" class=\"lg\">เข้าระบบอีกครั้ง</button>\n </div>\n <!-- loader -->\n <div id=\"loader\"></div>\n</div>\n`;","/* access */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\nimport { curDate } from '../../../lib/dateTime';\nimport { jwtParse } from '../../../lib/utility';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (\n agcy: number,\n acct: number,\n params?: {\n date?: string;\n client?: string;\n search?: string;\n }\n) => new Promise<ApiRsp>((resolve, reject) => {\n const date = params && params.date ? params.date : curDate();\n let query = `?date=${date}`;\n if (params) {\n const client = params.client ? params.client : '';\n const search = params.search ? params.search : '';\n if (client) query += `&client=${client}`;\n if (search) query += `&search=${search}`;\n }\n // fetch\n const url = `/agcy/${agcy}/acct/${acct}/access${query}`;\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 = () => new Promise<ApiRsp>((resolve, reject) => {\n const jwt = jwtParse(gbvar.api.TOKEN);\n if (!jwt) reject('err: jwt token');\n const screenSize = `${screen.width}x${screen.height}`;\n const url = `/agcy/${jwt?.agcy}/acct/${jwt?.acct}/access`;\n fetch(gbvar.hub.API + url, {\n method: 'POST',\n headers: gbvar.api.HEADERS,\n body: JSON.stringify({\n device: 0,\n client: Number(gbvar.app.UUID),\n screen: screenSize,\n }),\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 type AccsPack = {\n accid: number;\n accon: number;\n device: number;\n client: number;\n clname: string;\n screen: string;\n rmtip: string;\n agent: string;\n profile: AccsProfile;\n};\nexport type AccsProfile = {\n agcy: number;\n dvsn: number;\n sect: number;\n acct: number;\n\n actype: number;\n acrole: number;\n acname: string;\n picture: string;\n\n agcy_name: string;\n dvsn_name: string;\n sect_name: string;\n};","/* middleware */\n/*--------------------------------------------------------------------------------*/\nimport { gbvar } from '../../mod/global';\nimport { jwtParse } from '../../lib/utility';\nimport * as cookie from '../../lib/cookie';\nimport { Create as hubAccess } from '../api/account/access';\nimport type { AccsPack, AccsProfile } from '../api/account/access';\nconst IGNORE: string[] = ['__NOT_FOUND__', 'login', 'logout', 'callback'];\n/*--------------------------------------------------------------------------------*/\nexport const Midware = async (route: string, ignore?: string[]) => {\n // ignore\n ignore?.forEach(val => IGNORE.push(val));\n if (IGNORE.includes(route)) {\n console.log('ignore :', route);\n return;\n }\n // token exist\n const token = localStorage.getItem('ACCESS_TOKEN');\n if (!token) {\n gotoLogin();\n throw 'token not exist';\n }\n // token expire\n try {\n const jwt = jwtParse(token);\n const exp = Number(jwt?.exp) * 1000;\n if (isNaN(exp)) throw 'err';\n const now = Date.now();\n if (now >= exp) throw 'err';\n } catch { gotoLogin(); }\n // set api header\n gbvar.api.TOKEN = token;\n gbvar.api.HEADERS = new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n 'Authorization': `Bearer ${gbvar.api.TOKEN}`,\n });\n // session exist\n const session = sessionStorage.getItem('ACCESS_SESSION');\n if (!session) {\n await hubAccess().then(resp => {\n const data = resp.data as AccsPack;\n setProfile(data.profile);\n sessionStorage.setItem('ACCESS_SESSION', JSON.stringify(data));\n }).catch(() => gotoLogin());\n } else {\n const data = JSON.parse(session) as AccsPack;\n setProfile(data.profile);\n }\n};\n/*--------------------------------------------------------------------------------*/\nconst setProfile = (profile: AccsProfile) => {\n gbvar.user.AGCY = profile.agcy;\n gbvar.user.DVSN = profile.dvsn;\n gbvar.user.SECT = profile.sect;\n gbvar.user.DEPT = `${profile.dvsn},${profile.sect}`;\n gbvar.user.ACCT = profile.acct;\n gbvar.user.ACTYPE = profile.actype;\n gbvar.user.ACROLE = profile.acrole;\n gbvar.user.ACNAME = profile.acname;\n gbvar.user.PICTURE = profile.picture;\n gbvar.user.AGCY_NAME = profile.agcy_name;\n gbvar.user.DVSN_NAME = profile.dvsn_name;\n gbvar.user.SECT_NAME = profile.sect_name;\n};\n/*--------------------------------------------------------------------------------*/\nconst gotoLogin = () => {\n cookie.clear();\n localStorage.clear();\n sessionStorage.clear();\n window.location.replace('/login');\n throw 'not logged in';\n};\n/*--------------------------------------------------------------------------------*/\n","/* api */\n/*--------------------------------------------------*/\nexport * as stat from './static';\nexport * as oauth from './oauth';\n// agency\nexport * as agcy from './agency/agcy';\nexport * as dvsn from './agency/dvsn';\nexport * as sect from './agency/sect';\nexport * as dept from './agency/dept';\n// account\nexport * as acct from './account';\n/*--------------------------------------------------*/\n// api response\nexport interface ApiRsp {\n status: {\n code: number;\n message: string;\n };\n rows: {\n total: number;\n limit: number;\n offset: number;\n };\n data: unknown;\n}","/* static */\nexport * as acrole from './acrole';\nexport * as actype from './actype';\nexport * as dvtype from './dvtype';\nexport * as hmtype from './hmtype';\nexport * as hmposn from './hmposn';\nexport * as hmrank from './hmrank';\nexport * as sctype from './sctype';\nexport * as vdtype from './vdtype';\n// type\nexport type StatPack = {\n id: number;\n name: string;\n status: number;\n hmtype: number; // for hmrank\n};","/* acrole */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/acrole`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* actype */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/actype`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* dvtype */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/dvtype`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* hmtype */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/hmtype`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* hmposn */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/hmposn`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* hmrank */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/hmrank`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* sctype */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/sctype`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* vdtype */\nimport type { ApiRsp } from '..';\nimport type { StatPack } from '.';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = () => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/stat/vdtype`;\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 StatPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.id}`;\n opt.text = `${val.name}`;\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n","/* oauth */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Token = (params: ReqToken) => new Promise<ApiRsp>((resolve, reject) => {\n fetch(gbvar.hub.OAUTH + '/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\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 UserInfo = (token?: string) => new Promise<ApiRsp>((resolve, reject) => {\n let headers = gbvar.api.HEADERS;\n if (token) headers = new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n 'Authorization': `Bearer ${token}`,\n });\n fetch(gbvar.hub.OAUTH + '/userinfo', {\n method: 'GET',\n headers: 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 type ReqToken = {\n grant_type: string;\n client_id: string;\n username?: string;\n password?: string;\n device_code?: string;\n client_secret?: string;\n refresh_token?: string;\n refresh_id?: number;\n device?: number;\n};\nexport type RspToken = {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token: string;\n refresh_id: number;\n redirect_uri: string;\n};\nexport type UserInfoPack = {\n agcy: number;\n dvsn: number;\n sect: number;\n acct: number;\n\n actype: number;\n acrole: number;\n acname: string;\n picture: string;\n subid: number;\n\n agcy_name: string;\n dvsn_name: string;\n sect_name: string;\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};","/* dvsn */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (\n agcy: number,\n dvsn?: number,\n) => new Promise<ApiRsp>((resolve, reject) => {\n let url = `/agcy/${agcy}/dvsn`;\n if (dvsn) url = `/agcy/${agcy}/dvsn/${dvsn}`;\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 DvsnPack[];\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 DvsnPack = {\n id: number;\n code: string;\n init: string;\n name: string;\n short: string;\n status: number;\n};","/* sect */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (\n agcy: number,\n dvsn: number,\n sect?: number,\n) => new Promise<ApiRsp>((resolve, reject) => {\n let url = `/agcy/${agcy}/dvsn/${dvsn}/sect`;\n if (sect) url = `/agcy/${agcy}/dvsn/${dvsn}/sect/${sect}`;\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, dvsn: number, elm: HTMLSelectElement) => {\n elm.innerHTML = '<option value=\"\">- เลือก -</option>';\n await Read(agcy, dvsn).then(resp => {\n const data = resp.data as SectPack[];\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 SectPack = {\n id: number;\n sctype: number;\n name: string;\n short: string;\n numbed: number;\n status: number;\n};","/* dept */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (agcy: number) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/dept`;\n // fetch\n fetch(gbvar.hub.API + url, {\n method: 'GET',\n headers: gbvar.api.HEADERS,\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Set = async (agcy: number, elm: HTMLSelectElement) => {\n elm.innerHTML = '<option value=\"\">- เลือก -</option>';\n await Read(agcy).then(resp => {\n const data = resp.data as DeptPack[];\n for (const val of data) {\n const opt = document.createElement('option');\n opt.value = `${val.dvsn},${val.sect}`;\n if (val.sect == 0) {\n opt.text = `${val.name}`;\n opt.style.fontWeight = '600';\n } else {\n opt.text = `- ${val.name}`;\n opt.style.fontStyle = 'italic';\n }\n elm.appendChild(opt);\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\nexport type DeptPack = {\n dvsn: number;\n sect: number;\n name: string;\n status: number;\n};","/* account */\nimport type { ApiRsp } from '..';\nimport { gbvar } from '../../../mod/global';\n/*--------------------------------------------------------------------------------*/\n// access\nexport * as access from './access';\nexport type { AccsPack, AccsProfile } from './access';\n/*--------------------------------------------------------------------------------*/\nexport const Read = (\n agcy: number,\n acct?: number,\n params?: {\n dvsn?: number;\n sect?: number;\n actype?: number;\n acrole?: number;\n status?: number;\n }\n) => new Promise<ApiRsp>((resolve, reject) => {\n const status = params && params.status ? params.status : 1;\n let query = `?status=${status}`;\n if (params) {\n const dvsn = params.dvsn ? params.dvsn : 0;\n const sect = params.sect ? params.sect : 0;\n const actype = params.actype ? params.actype : 0;\n const acrole = params.acrole ? params.acrole : 0;\n if (dvsn) query += `&dvsn=${dvsn}`;\n if (sect) query += `&sect=${sect}`;\n if (actype) query += `&actype=${actype}`;\n if (acrole) query += `&acrole=${acrole}`;\n }\n let url = `/agcy/${agcy}/acct${query}`;\n if (acct) url = `/agcy/${agcy}/acct/${acct}`;\n // fetch\n fetch(gbvar.hub.API + url, {\n method: 'GET',\n headers: gbvar.api.HEADERS,\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Create = (\n agcy: number,\n params: unknown,\n) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/acct`;\n fetch(gbvar.hub.API + url, {\n method: 'POST',\n headers: gbvar.api.HEADERS,\n body: JSON.stringify(params),\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\nexport const Update = (\n agcy: number,\n acct: number,\n params: unknown,\n) => new Promise<ApiRsp>((resolve, reject) => {\n const url = `/agcy/${agcy}/acct/${acct}`;\n fetch(gbvar.hub.API + url, {\n method: 'PUT',\n headers: gbvar.api.HEADERS,\n body: JSON.stringify(params),\n }).then(resp => {\n if (!resp.ok) throw resp;\n return resp.json();\n }).then(json => {\n resolve(json);\n }).catch(err => reject(err));\n});\n/*--------------------------------------------------------------------------------*/\n/*\nexport const Delete = (\n agcy: number,\n acct: number,\n) => new Promise<ApiRsp>((resolve, reject) => { });\n/*--------------------------------------------------------------------------------*/\nexport type AcctPack = {\n agcy: number;\n dvsn: number;\n sect: number;\n acct: number;\n actype: number;\n acrole: number;\n status: number;\n picture: string;\n profile: unknown;\n\n agcy_name: string;\n dvsn_name: string;\n sect_name: string;\n};\nexport type TypeHuman = {\n id: number;\n hmtype: number;\n hmposn: number;\n hmrank: number;\n tname: string;\n fname: string;\n lname: string;\n};\nexport type TypeDevice = {\n id: number;\n dvtype: number;\n assets: number;\n name: string;\n};\nexport type TypeVendor = {\n id: number;\n vdtype: number;\n vdno: string;\n name: string;\n bankno: string;\n bkacct: string;\n bkname: string;\n};","/* wsshub */\n/*--------------------------------------------------------------------------------*/\nimport { gbvar } from '../../mod/global';\nimport { Toast } from '../../mod/dialog';\nimport { timeToStr, thaiDate } from '../../lib/dateTime';\n/*--------------------------------------------------------------------------------*/\nexport const newTask = (worker: new () => Worker) => {\n if (!window.Worker) return;\n gbvar.hub.TASK = new worker();\n gbvar.hub.TASK.postMessage({\n head: 'INIT',\n data: {\n url: gbvar.hub.WSS,\n app: gbvar.app.NAME,\n uid: gbvar.app.UUID,\n ver: gbvar.app.VERSION,\n }\n });\n gbvar.hub.TASK.addEventListener('message', (e) => {\n const json = e.data;\n const head = json.head ? json.head : '';\n const data = json.data ? json.data : '';\n if (head == 'ACCEPT') {\n rspAccept(data);\n gbvar.hub.TASK?.postMessage({\n head: 'VERIFY',\n data: gbvar.api.TOKEN,\n });\n }\n if (head == 'DISCON') rspDiscon();\n if (head == 'LATEST') rspLatest(data);\n if (head == 'BRDMSG') rspBrdMsg(data);\n if (head == 'VERIFY' && data != '200 OK') {\n console.log(head, data);\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const checkUpdate = (min = 10) => {\n return setInterval(() => {\n gbvar.hub.TASK?.postMessage({\n head: 'LATEST',\n data: {\n app: gbvar.app.NAME,\n uid: gbvar.app.UUID,\n }\n });\n }, 1000 * 60 * min); // defult 10 min\n};\n/*--------------------------------------------------------------------------------*/\ntype brdPack = {\n from: string;\n to: string;\n cmd: string;\n msg: unknown;\n};\nconst rspBrdMsg = (brd: brdPack) => {\n if (brd.cmd == \"LOGS\") console.log(brd.msg);\n if (brd.cmd == \"TIME\") setTime(brd.msg as { unix: number; });\n if (brd.cmd == 'RESULT' && brd.to == gbvar.hub.UUID) {\n console.log(brd.cmd, 'From:', brd.from);\n console.log(brd.msg);\n }\n if (brd.cmd == 'CONRST' && (brd.to == gbvar.hub.UUID || brd.to == '@all')) {\n sessionStorage.clear();\n window.location.reload();\n }\n if (brd.cmd == 'LOGOUT' && (brd.to == gbvar.hub.UUID || brd.to == '@all')) {\n localStorage.clear();\n sessionStorage.clear();\n window.location.reload();\n }\n if (brd.cmd == 'NOTIFY' && (brd.to == gbvar.hub.UUID || brd.to == '@all')) {\n brdNotify(brd.msg as notifyPack);\n }\n if (brd.cmd == '') console.log(brd.msg);\n};\n/*--------------------------------------------------------------------------------*/\nconst rspAccept = (data: { uuid: string; }) => {\n gbvar.hub.UUID = data.uuid ? data.uuid : '';\n console.log('hub-uuid:', gbvar.hub.UUID);\n const boxTime = document.querySelector<HTMLElement>('#topbar #box-time');\n if (boxTime) boxTime.classList.remove('offline');\n Toast('เชื่อมต่อ Server สำเร็จ.!', { type: 'success' });\n};\n/*--------------------------------------------------------------------------------*/\nconst rspDiscon = () => {\n const boxTime = document.querySelector<HTMLElement>('#topbar #box-time');\n if (boxTime) {\n boxTime.classList.add('offline');\n const svTime = boxTime.querySelector<HTMLElement>('#sv-time');\n const svDate = boxTime.querySelector<HTMLElement>('#sv-date');\n if (svTime) svTime.innerText = 'server';\n if (svDate) svDate.innerText = 'OFFLINE';\n }\n Toast('ขาดการเชื่อมต่อ Server.!', { type: 'failure' });\n};\n/*--------------------------------------------------------------------------------*/\nconst rspLatest = (data: {\n appname: string;\n appuuid: string;\n version: string;\n release: string;\n}) => {\n if (gbvar.app.UUID == data.appuuid && gbvar.app.NAME == data.appname) {\n const path = window.location.pathname;\n if (path != '/changelog' && gbvar.app.RELEASE != data.release) {\n window.location.replace('/changelog');\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\nconst setTime = (data: { unix: number; }) => {\n if (typeof data.unix != 'number') return;\n gbvar.UNIX_TIME = Number(data.unix);\n const svTime = document.querySelector<HTMLElement>('#topbar #box-time #sv-time');\n const svDate = document.querySelector<HTMLElement>('#topbar #box-time #sv-date');\n if (svTime && svDate) {\n const [date, time] = timeToStr(gbvar.UNIX_TIME).split(' ');\n svTime.innerText = time;\n svDate.innerText = thaiDate(date, 11);\n }\n};\n/*--------------------------------------------------------------------------------*/\ntype notifyPack = {\n title?: string;\n icon?: string;\n body: string;\n};\nconst brdNotify = (data: notifyPack) => {\n const title = data.title ? data.title : 'Hub Notify';\n const icon = data.icon ? data.icon : 'https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-06.png';\n const body = data.body ? data.body : '';\n if (!body) return;\n Notification.requestPermission().then(res => {\n if (res == 'granted') {\n new Notification(title, { body: body, icon: icon });\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n"],"mappings":"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","names":["Error","Error","app","app","Loading","Loading","app","Create","Loading","Ready","app","Close","Create","Loading","Ready","app","content","destroy","loader","Create","Create","ignore","Create","app","oauth_exports","Read","Read","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","oauth_exports","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Read","Set","Create","Read","Update","Read","Create","Update"]}
1
+ {"version":3,"sources":["../../package.json","../../src/config/global.ts","../../src/config/index.ts","../../src/page/mobile/index.ts","../../src/page/index.ts","../../src/page/docs.ts","../../src/lib/index.ts","../../src/lib/dateTime.ts","../../src/lib/utility.ts","../../src/lib/geoLocate.ts","../../src/lib/cookie.ts","../../src/lib/thbText.ts","../../src/mod/index.ts","../../src/mod/built-in/button/index.ts","../../src/mod/built-in/input/index.ts","../../src/mod/built-in/cover/index.ts","../../src/mod/camera/index.ts","../../src/mod/dialog/index.ts","../../src/mod/drawer/index.ts","../../src/mod/drop/index.ts","../../src/mod/modal/index.ts","../../src/mod/tabs/index.ts","../../src/svchub/oauth/index.ts","../../src/svchub/oauth/template.ts","../../src/svchub/api/auth/index.ts","../../src/svchub/oauth/midware.ts","../../src/svchub/api/index.ts","../../src/svchub/wss/index.ts"],"sourcesContent":["{\n \"name\": \"slimsdk\",\n \"version\": \"0.2.0\",\n \"description\": \"WebApp SDK\",\n \"type\": \"module\",\n \"exports\": {\n \".\": \"./dist/index.js\",\n \"./desktop\": \"./dist/desktop/index.js\",\n \"./desktop/\": \"./dist/desktop/\",\n \"./mobile\": \"./dist/mobile/index.js\",\n \"./mobile/\": \"./dist/mobile/\",\n \"./lib\": \"./dist/lib/index.js\",\n \"./worker/\": \"./dist/worker/*.js\",\n \"./page\": \"./dist/page/index.js\",\n \"./page/*\": \"./dist/page/*/index.js\",\n \"./page/*.css\": \"./dist/page/*.css\",\n \"./mod\": \"./dist/mod/index.js\",\n \"./mod/*\": \"./dist/mod/*/index.js\",\n \"./mod/*.css\": \"./dist/mod/*.css\",\n \"./css/\": \"./dist/css/\"\n },\n \"files\": [\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup && sh ./clean.sh\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.39.1\",\n \"@types/node\": \"^25.2.0\",\n \"eslint\": \"^9.39.2\",\n \"globals\": \"^17.3.0\",\n \"tsup\": \"^8.5.1\",\n \"typescript\": \"^5.9.3\",\n \"typescript-eslint\": \"^8.54.0\"\n },\n \"license\": \"MIT\",\n \"author\": \"hs3lcs@gmail.com\"\n}","/* 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=\"กลับด้านบน\">&#xf341;</button>\n `;\n document.body.appendChild(totop);\n // add event\n totop.querySelector<HTMLButtonElement>('#btn-totop')!.onclick = () => {\n app.scrollTo({ top: 0, behavior: 'smooth' });\n };\n app.addEventListener('scroll', () => {\n if (app.scrollTop > 1000) {\n totop.style.display = 'block';\n if (app.classList.contains('tabbar')) {\n app.style.paddingBottom = '116px';\n } else {\n app.style.paddingBottom = '60px';\n }\n } else {\n totop.style.display = '';\n app.style.paddingBottom = '';\n }\n // tabs mobile shadow\n const tabsMobile = app.querySelector<HTMLElement>('.slim-tabs.mobile .tabs-header');\n if (!tabsMobile) return;\n if (app.scrollTop > 10) {\n tabsMobile.style.boxShadow = `rgba(0, 0, 0, 0.16) 0px 1px 4px`;\n } else {\n tabsMobile.style.boxShadow = '';\n }\n });\n};\n/*------------------------------------------------------------*/","/* 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};","/* page */\n/*--------------------------------------------------------------------------------*/\nexport * from '../index';\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport type PageParams = {\n auth?: boolean;\n size?: string;\n icon?: string;\n title?: string;\n template?: string;\n button?: {\n side?: boolean;\n tab?: boolean;\n };\n sidebar?: string;\n tabbar?: string;\n actbar?: string;\n uri?: string;\n};\n/*--------------------------------------------------------------------------------*/\nexport const create = (params: PageParams) => {\n if (!app) return;\n const size = params.size ? params.size : '';\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 if (size == 'full') {\n navRemove();\n app.classList.add('full-page');\n } else {\n app.classList.remove('full-page');\n if (document.querySelector('#topbar')) {\n setTopbar(params);\n } else {\n navCreate(params);\n setTopbar(params);\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\n// ### navbar ###\n/*--------------------------------------------------------------------------------*/\nconst navCreate = (params: PageParams) => {\n // topbar\n const topbar = document.createElement('nav');\n const tabbar = document.createElement('nav');\n const sidebar = document.createElement('nav');\n topbar.id = 'topbar';\n tabbar.id = 'tabbar';\n sidebar.id = 'sidebar';\n topbar.innerHTML = /*html*/ `\n <div class=\"container\">\n <div class=\"box left\">\n <button id=\"nav-back\" class=\"topbar-btn icon\"\n onclick=\"history.back()\">&#xf053;</button>\n <button id=\"nav-side\" class=\"topbar-btn icon\">&#xf0c9;</button>\n <div class=\"title\"></div>\n </div>\n <div id=\"actbar\" class=\"box right\"></div>\n </div>\n `;\n tabbar.innerHTML = params.tabbar ? params.tabbar : '';\n sidebar.innerHTML = params.sidebar ? params.sidebar : '';\n document.body.prepend(topbar, tabbar, sidebar);\n // nav-side\n sideBtnEvent(sidebar);\n const navSide = topbar.querySelector<HTMLButtonElement>('#nav-side');\n if (navSide) navSide.onclick = () => {\n const posLeft = sidebar.getBoundingClientRect().left;\n if (posLeft == 0) sideClose(sidebar);\n else sideOpen(sidebar);\n };\n const btnSideClose = sidebar.querySelector<HTMLButtonElement>('#btn-close');\n if (btnSideClose) btnSideClose.onclick = () => sideClose(sidebar);\n};\n/*--------------------------------------------------------------------------------*/\nconst navRemove = () => {\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};\n/*--------------------------------------------------------------------------------*/\nconst setTopbar = (params: PageParams) => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n if (!topbar) return;\n // title\n const title = params.title ? params.title : 'Page Title';\n topbar.querySelector<HTMLElement>('.title')!.innerText = title;\n // icon\n const navBack = document.querySelector<HTMLElement>('#topbar #nav-back')!;\n navBack.innerHTML = params.icon ? params.icon : '&#xf053;';\n // navside\n const navSide = document.querySelector<HTMLElement>('#topbar #nav-side')!;\n if (params.button?.side) {\n navSide.style.display = 'block';\n navBack.style.display = 'none';\n } else {\n navSide.style.display = 'none';\n navBack.style.display = 'block';\n }\n // actbar\n const actbar = topbar.querySelector<HTMLElement>('#actbar');\n if (actbar) actbar.innerHTML = params.actbar ? params.actbar : '';\n // tabbar\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n if (!tabbar) return;\n if (params.button?.tab) {\n tabbar.style.display = 'block';\n if (app) app.classList.add('tabbar');\n } else {\n tabbar.style.display = 'none';\n if (app) app.classList.remove('tabbar');\n }\n // tabbar active\n tabActive(params.uri);\n};\n/*--------------------------------------------------------------------------------*/\nconst tabActive = (uri: string | undefined) => {\n if (!uri) return;\n if (uri.indexOf('#') > 0) {\n uri = uri.substring(0, uri.indexOf('#'));\n }\n const btn = document.querySelectorAll<HTMLButtonElement>('#tabbar button');\n btn.forEach(el => {\n if (!el.disabled) {\n const path = el.getAttribute('href');\n if (uri == path) {\n el.classList.add('active');\n } else {\n el.classList.remove('active');\n }\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nconst sideBtnEvent = (sidebar: HTMLElement) => {\n const btn = sidebar.querySelectorAll('a');\n btn.forEach(el => {\n el.addEventListener('click', () => {\n sideClose(sidebar);\n });\n });\n};\nconst sideOpen = (sidebar: HTMLElement) => {\n sidebar.classList.remove('close');\n sidebar.classList.add('open');\n // overlay\n const overlay = document.createElement('div');\n overlay.id = 'side-overlay';\n overlay.className = 'overlay';\n overlay.style.animation = 'fade-in 0.4s forwards';\n document.body.appendChild(overlay);\n overlay.onclick = () => sideClose(sidebar);\n};\nconst sideClose = (sidebar: HTMLElement) => {\n sidebar.classList.remove('open');\n sidebar.classList.add('close');\n // overlay\n const overlay = document.querySelector<HTMLElement>('#side-overlay');\n if (overlay) {\n overlay.style.animation = 'fade-out 0.4s forwards';\n overlay.onanimationend = () => overlay.remove();\n }\n};\n/*--------------------------------------------------------------------------------*/\n","/* page */\n/*--------------------------------------------------------------------------------*/\nconst app = document.querySelector<HTMLElement>('#app');\nconst pageSpin: string = /*html*/ `\n<div class=\"lds-spinner\">\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n <div></div><div></div><div></div><div></div>\n</div>\n`;\nconst smallSpin: string = `<div class=\"spinner s32\"></div>`;\n/*--------------------------------------------------------------------------------*/\nexport const loading = (size = 'default') => {\n if (!app) return;\n // page-loader\n if (!app.querySelector('#page-loader')) {\n const loader = document.createElement('div');\n loader.id = 'page-loader';\n loader.className = 'overlay center';\n loader.innerHTML = size == 'default' ? pageSpin : smallSpin;\n app.appendChild(loader);\n }\n // app-content\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const ready = (delay = 400) => {\n new Promise(r => setTimeout(r, delay)).then(() => {\n clearLoader(true);\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const error = (err: Error) => {\n clearLoader(false);\n if (!app) return;\n // create\n const box = document.createElement('div');\n box.className = 'page-error';\n box.innerHTML = /*html*/ `\n <i class=\"icon red\">&#xf188;</i>\n <div class=\"topic\">&#x2726; เกิดข้อผิดพลาด &#x2726;</div>\n <div class=\"text\">${err}</div>\n `;\n app.prepend(box);\n throw err;\n};\n/*--------------------------------------------------------------------------------*/\nexport const notFound = () => {\n if (!app) return;\n app.innerHTML = /*html*/ `\n <div class=\"page-not-found\">\n <h1>4<i class=\"fas fa-ghost\"></i>4</h1>\n <h2>Error 404 Page Not Found</h2>\n <p>Sorry, the page cannot be accessed</p>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const fullLoad = () => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-full-load\">\n <div class=\"spinner\"></div>\n <div class=\"text\">Slim<br>Loading</div>\n </div>\n `;\n};\n/*--------------------------------------------------------------------------------*/\nexport const inform = (params: {\n icon: string;\n msg: string;\n btnTxt: string;\n btnUrl: string;\n color?: string;\n}) => {\n clearNavbar();\n if (!app) return;\n app.classList.add('full-page');\n app.innerHTML = /*html*/ `\n <div class=\"page-inform ${params.color}\">\n <div class=\"icon solid\">${params.icon}</div>\n <div class=\"msg\">${params.msg}</div>\n <button class=\"lg ${params.color}\" shadow=\"true\">\n ${params.btnTxt}\n </button>\n </div>\n `;\n const btn = app.querySelector<HTMLButtonElement>('button')!;\n btn.onclick = () => window.location.replace(params.btnUrl);\n};\n/*--------------------------------------------------------------------------------*/\n//export const Maintain = () => { };\n//export const Construct = () => { };\n/*--------------------------------------------------------------------------------*/\nconst clearNavbar = () => {\n const topbar = document.querySelector<HTMLElement>('#topbar');\n const tabbar = document.querySelector<HTMLElement>('#tabbar');\n const sidebar = document.querySelector<HTMLElement>('#sidebar');\n if (topbar) topbar.remove();\n if (tabbar) tabbar.remove();\n if (sidebar) sidebar.remove();\n if (app) app.className = '';\n};\nconst clearLoader = (showContent: boolean) => {\n if (!app) return;\n const loader = app.querySelector<HTMLElement>('#page-loader');\n if (loader) {\n loader.style.animation = 'fade-out 0.4s forwards';\n loader.onanimationend = () => loader.remove();\n }\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.display = showContent ? 'block' : 'none';\n};\n/*--------------------------------------------------------------------------------*/\n","/* docs */\nimport { cfg } from '../config';\n/*--------------------------------------------------------------------------------*/\nexport const privacy = async () => {\n const url = 'https://cdn.jsdelivr.net/gh/wkrdev/.github/docs/privacy.md';\n const resp = await fetch(url);\n if (resp.ok) {\n return await resp.text();\n }\n return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const changelog = async (app = 1) => {\n const url = `/apps/${app}/logs`;\n const resp = await fetch(cfg.hub.API + url);\n if (resp.ok) {\n const json = await resp.json();\n return json.data as string;\n }\n return '';\n};\n/*--------------------------------------------------------------------------------*/\n","/* sdklib */\n/*--------------------------------------------------*/\nexport * from './dateTime';\nexport * from './utility';\nexport * as geo from './geoLocate';\nexport * as cookie from './cookie';\nexport { thbText } from './thbText';\n/*--------------------------------------------------*/","/* dateTime */\n/*--------------------------------------------------------------------------------*/\nexport const TH_MONTH: string[] = [\n 'มกราคม', 'กุมภาพันธ์', 'มีนาคม', 'เมษายน', 'พฤษภาคม', 'มิถุนายน',\n 'กรกฎาคม', 'สิงหาคม', 'กันยายน', 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม',\n];\nexport const TH_MONTH_SHORT: string[] = [\n 'ม.ค.', 'ก.พ.', 'มี.ค.', 'เม.ย.', 'พ.ค.', 'มิ.ย.',\n 'ก.ค.', 'ส.ค.', 'ก.ย.', 'ต.ค.', 'พ.ย.', 'ธ.ค.',\n];\nexport const FY_MONTH: string[] = [\n 'ตุลาคม', 'พฤศจิกายน', 'ธันวาคม', 'มกราคม', 'กุมภาพันธ์', 'มีนาคม',\n 'เมษายน', 'พฤษภาคม', 'มิถุนายน', 'กรกฎาคม', 'สิงหาคม', 'กันยายน',\n];\nexport const FY_MONTH_SHORT: string[] = [\n 'ต.ค.', 'พ.ย.', 'ธ.ค.', 'ม.ค.', 'ก.พ.', 'มี.ค.',\n 'เม.ย.', 'พ.ค.', 'มิ.ย.', 'ก.ค.', 'ส.ค.', 'ก.ย.',\n];\nexport const PERIOD_TEXT: string[] = ['', 'เวรดึก', 'เวรเช้า', 'เวรบ่าย'];\n// time unix now\nexport const curTime = (): number => new Date().getTime();\n/*--------------------------------------------------------------------------------*/\nexport const curDate = (): string => {\n const dt = new Date();\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const curMonth = (): string => {\n const dt = new Date();\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n return `${yy}-${mm}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const curYear = (yearType = ''): number => {\n const dt = new Date();\n const mm = dt.getMonth() + 1;\n if ((yearType == 'fyear' || yearType == 'fy') && mm > 9) {\n return dt.getFullYear() + 1; // ปีงบประมาณ\n }\n return dt.getFullYear(); // ปีปฏิทิน\n};\n/*--------------------------------------------------------------------------------*/\nexport const timeToStr = (unixtime: number, format = ''): string => {\n if (typeof unixtime != 'number') {\n return '';\n }\n const unix = new Date(Number(unixtime));\n const yy = unix.getFullYear();\n const mm = String(unix.getMonth() + 1).padStart(2, '0');\n const dd = String(unix.getDate()).padStart(2, '0');\n const H = String(unix.getHours()).padStart(2, '0');\n const M = String(unix.getMinutes()).padStart(2, '0');\n const S = String(unix.getSeconds()).padStart(2, '0');\n if (format == 'date') {\n return `${yy}-${mm}-${dd}`;\n }\n if (format == 'time') {\n return `${H}:${M}:${S}`;\n }\n return `${yy}-${mm}-${dd} ${H}:${M}:${S}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const shiftIndex = (unixtime = 0) => {\n if (typeof unixtime != 'number') {\n return { num: 0, text: '' };\n }\n const unix = unixtime ? new Date(unixtime) : new Date();\n const H = unix.getHours();\n if (H >= 0 && H < 8) return { num: 1, text: PERIOD_TEXT[1] };\n if (H >= 8 && H < 16) return { num: 2, text: PERIOD_TEXT[2] };\n if (H >= 16) return { num: 3, text: PERIOD_TEXT[3] };\n return { num: 0, text: '' };\n};\n/*--------------------------------------------------------------------------------*/\nexport const setYear = (el: HTMLSelectElement, min = 2020, txt = '') => {\n const dt = new Date();\n let year = dt.getFullYear();\n const month = dt.getMonth() + 1;\n if (month > 6 && month <= 12) {\n year++;\n }\n el.innerHTML = '<option value=\"\">- เลือก -</option>';\n for (let y = min; y <= year; y++) {\n const option = document.createElement('option');\n option.value = `${y}`;\n option.text = `${txt} ${y + 543}`;\n el.appendChild(option);\n }\n};\n/*--------------------------------------------------------------------------------*/\nexport const thaiDate = (date: number | string, format = 0): string => {\n if (typeof date == 'string' && date.indexOf('0000-00-00') >= 0) {\n return '';\n }\n if (typeof date == 'string') {\n date = date.trim();\n date = date.replace(' ', 'T');\n }\n\n const dt = new Date(date);\n if (isNaN(dt.getTime())) return '';\n\n const yy = dt.getFullYear() + 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n const H = String(dt.getHours()).padStart(2, '0');\n const M = String(dt.getMinutes()).padStart(2, '0');\n const S = String(dt.getSeconds()).padStart(2, '0');\n\n // 01/01/2500\n if (format == 0) return `${dd}/${mm}/${yy}`;\n // 01/01/2500 00:00\n if (format == 1) return `${dd}/${mm}/${yy} ${H}:${M}`;\n // 01/01/2500 00:00:00\n if (format == 2) return `${dd}/${mm}/${yy} ${H}:${M}:${S}`;\n\n // 01 มกราคม 2500\n if (format == 10) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy}`;\n // 01 ม.ค. 65\n if (format == 11) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;\n // 01 มกราคม 2500 เวลา 00:00 น.\n if (format == 12) return `${dd} ${TH_MONTH[Number(mm) - 1]} ${yy} เวลา ${H}:${M} น.`;\n // 01 ม.ค. 65 00:00\n if (format == 13) return `${dd} ${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)} ${H}:${M}`;\n\n // มกราคม 2500\n if (format == 20) return `${TH_MONTH[Number(mm) - 1]} ${yy}`;\n // ม.ค. 2500\n if (format == 21) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${yy}`;\n // ม.ค. 65\n if (format == 22) return `${TH_MONTH_SHORT[Number(mm) - 1]} ${String(yy).slice(-2)}`;\n\n return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const dateDiff = (start: string, stop: string): number => {\n if (!start || start.indexOf('0000-00-00') >= 0) {\n return 0;\n }\n if (!stop || stop.indexOf('0000-00-00') >= 0) {\n return 0;\n }\n const [y1, m1, d1] = start.split('-');\n const [y2, m2, d2] = stop.split('-');\n const date1 = new Date(Number(y1), Number(m1) - 1, Number(d1)).getTime();\n const date2 = new Date(Number(y2), Number(m2) - 1, Number(d2)).getTime();\n return Math.round((date2 - date1) / (1000 * 60 * 60 * 24));\n};\n/*--------------------------------------------------------------------------------*/\nexport const timeDiff = (start: string, stop: string) => {\n if (!start || start.indexOf('0000-00-00') >= 0) {\n return { h: 0, m: 0, s: 0 };\n }\n if (!stop || stop.indexOf('0000-00-00') >= 0) {\n return { h: 0, m: 0, s: 0 };\n }\n start = start.replace(' ', 'T');\n stop = stop.replace(' ', 'T');\n const date1 = new Date(start);\n const date2 = new Date(stop);\n let msec = date2.getTime() - date1.getTime();\n\n const hh = Math.floor(msec / 1000 / 60 / 60);\n msec -= hh * 1000 * 60 * 60;\n const mm = Math.floor(msec / 1000 / 60);\n msec -= mm * 1000 * 60;\n const ss = Math.floor(msec / 1000);\n msec -= ss * 1000;\n return { h: hh, m: mm, s: ss };\n};\n/*--------------------------------------------------------------------------------*/\nexport const getAge = (date: string) => {\n if (!date || date.indexOf('0000-00-00') >= 0) {\n return { years: 0, months: 0, days: 0 };\n }\n const now = new Date();\n const nowYear = now.getFullYear();\n const nowMonth = now.getMonth();\n const nowDate = now.getDate();\n\n const [yy, mm, dd] = date.split('-');\n const birth = new Date(Number(yy), Number(mm) - 1, Number(dd));\n const birthYear = birth.getFullYear();\n const birthMonth = birth.getMonth();\n const birthDate = birth.getDate();\n\n let yearAge = nowYear - birthYear;\n let monthAge = 0;\n let dateAge = 0;\n\n if (nowMonth >= birthMonth) {\n monthAge = nowMonth - birthMonth;\n } else {\n yearAge--;\n monthAge = 12 + nowMonth - birthMonth;\n }\n\n if (nowDate >= birthDate) {\n dateAge = nowDate - birthDate;\n } else {\n monthAge--;\n dateAge = 31 + nowDate - birthDate;\n if (monthAge < 0) {\n monthAge = 11;\n yearAge--;\n }\n }\n\n return {\n years: yearAge,\n months: monthAge,\n days: dateAge,\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const ageToBirth = (year: number, month: number, day: number): string => {\n const y = Number(year);\n const m = Number(month);\n const d = Number(day);\n const dt = new Date(\n new Date().getFullYear() - y,\n new Date().getMonth() - m,\n new Date().getDate() - d,\n );\n const yy = dt.getFullYear();\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`; // 1957-10-10\n};\n/*--------------------------------------------------------------------------------*/\nexport const toDbDate = (date: string): string => {\n if ((!date) || (date.indexOf('0000-00-00') >= 0)) {\n return '';\n }\n const dt = new Date(date);\n const yy = dt.getFullYear() - 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const toThaiDate = (date: string): string => {\n if ((!date) || (date.indexOf('0000-00-00') >= 0)) {\n return '';\n }\n const dt = new Date(date);\n const yy = dt.getFullYear() + 543;\n const mm = String(dt.getMonth() + 1).padStart(2, '0');\n const dd = String(dt.getDate()).padStart(2, '0');\n return `${yy}-${mm}-${dd}`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const isToday = (date: string): boolean => {\n const input = new Date(date);\n const today = new Date();\n if (input.setHours(0, 0, 0, 0) == today.setHours(0, 0, 0, 0)) {\n return true;\n }\n return false;\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","/* geoLocate */\n/*--------------------------------------------------------------------------------*/\ntype GeoCoords = {\n position: {\n lat: number;\n lng: number;\n };\n accuracy: number;\n heading: number;\n speed: number;\n timestamp: number;\n};\n/*--------------------------------------------------------------------------------*/\nexport const getPosition = (params: {\n accuracy: number;\n timeout: number;\n}) => new Promise<GeoCoords>((resolve, reject) => {\n const timeout = params.timeout ? params.timeout : 10000; // 10 sec\n const acrLimit = params.accuracy ? params.accuracy : 10; // 10 meter\n const buff: GeoCoords[] = [];\n if (navigator.geolocation) {\n // set timeout\n const Tcount = setTimeout(() => {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n // return best accuracy\n if (buff.length) {\n buff.sort((a, b) => a.accuracy - b.accuracy);\n resolve(buff[0]);\n }\n else {\n reject('position not found');\n }\n }, timeout);\n // get position\n const watchId = watchPosition((pos) => {\n const lat = pos.coords.latitude;\n const lng = pos.coords.longitude;\n const acr = pos.coords.accuracy;\n const head = pos.coords.heading ? pos.coords.heading : 0;\n const speed = pos.coords.speed ? pos.coords.speed : 0;\n const time = pos.timestamp;\n buff.push({\n position: { lat: lat, lng: lng },\n accuracy: acr,\n heading: head,\n speed: speed,\n timestamp: time,\n });\n // accuracy check\n if (acr <= acrLimit) {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n resolve({\n position: { lat: lat, lng: lng },\n accuracy: acr,\n heading: head,\n speed: speed,\n timestamp: time,\n });\n }\n }, (err) => {\n navigator.geolocation.clearWatch(watchId);\n clearTimeout(Tcount);\n reject(err);\n });\n }\n else reject('not support geolocation');\n});\n/*--------------------------------------------------------------------------------*/\nexport const watchPosition = (\n success: PositionCallback,\n error: PositionErrorCallback\n) => {\n if (navigator.geolocation) {\n return navigator.geolocation.watchPosition(success, error, {\n enableHighAccuracy: true,\n timeout: 5000,\n maximumAge: 0,\n });\n }\n return 0;\n};\n/*--------------------------------------------------------------------------------*/\nexport const toAddress = async (position: { lat: number; lng: number; }) => {\n const key = 'AIzaSyDsKimgLKSw9DAz_j8Z0HDkLTmyGhxmNiU';\n const latlng = `${position.lat},${position.lng}`;\n let url = `https://maps.googleapis.com/maps/api/geocode/json`;\n url += `?latlng=${latlng}&key=${key}`;\n // fetch\n let address = '';\n await fetch(url).then(response => response.json()).then(resp => {\n const data = resp.results;\n if (data.length) address = data[0].formatted_address;\n });\n return address;\n};\n/*--------------------------------------------------------------------------------*/\n","/* cookie */\n/*--------------------------------------------------------------------------------*/\nexport const setItem = (key: string, val: string, exp: number) => {\n const d = new Date();\n d.setTime(d.getTime() + (1000 * exp)); // seconds\n const expires = \"expires=\" + d.toUTCString();\n document.cookie = `${key}=${val};${expires};path=/`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const getItem = (key: string): string => {\n const pair = document.cookie.split('; ').find(x => x.startsWith(key + '='));\n if (pair) return pair.split('=')[1];\n else return '';\n};\n/*--------------------------------------------------------------------------------*/\nexport const removeItem = (key: string) => {\n document.cookie = `${key}=;expires=Thu, 01 Jan 1970 00:00:00 UTC;path=/;`;\n};\n/*--------------------------------------------------------------------------------*/\nexport const clear = () => {\n document.cookie.split(';').forEach(cookie => {\n const eqPos = cookie.indexOf('=');\n const name = eqPos > -1 ? cookie.substring(0, eqPos) : cookie;\n removeItem(name);\n });\n};\n/*--------------------------------------------------------------------------------*/\n","/* thbText */\nconst MAX_POSITION = 6;\nconst UNIT_POSITION = 0;\nconst TEN_POSITION = 1;\n\nconst PRIMARY_UNIT = 'บาท';\nconst SECONDARY_UNIT = 'สตางค์';\nconst WHOLE_NUMBER_TEXT = 'ถ้วน';\nconst NUMBER_TEXTS = ['ศูนย์', 'หนึ่ง', 'สอง', 'สาม', 'สี่', 'ห้า', 'หก', 'เจ็ด', 'แปด', 'เก้า', 'สิบ'];\nconst UNIT_TEXTS = ['สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน'];\n\nconst getIntegerDigits = (numberStringInput: string): number => parseInt(numberStringInput.split('.')[0], 10);\nconst getFractionalDigits = (numberStringInput: string): number => parseInt(numberStringInput.split('.')[1], 10);\nconst hasFractionalDigits = (numberInput: number | undefined) => numberInput !== undefined && numberInput !== 0;\n\nfunction isZeroValue(numberStringInput: string): boolean;\nfunction isZeroValue(numberInput: number): boolean;\nfunction isZeroValue(input: string | number): boolean {\n return parseInt(`${input}`, 10) === 0;\n}\n\nconst isUnitPosition = (position: number) => position == UNIT_POSITION;\nconst isTenPosition = (position: number) => position % MAX_POSITION == TEN_POSITION;\nconst isMillionsPosition = (position: number) => (position >= MAX_POSITION && position % MAX_POSITION == 0);\nconst isLastPosition = (position: number, lengthOfDigits: number) => position + 1 < lengthOfDigits;\n\nconst reverseNumber = (number: number): string => {\n const numberStr = number.toString();\n return numberStr.split('').reverse().join('');\n};\n\nconst getBathUnit = (position: number, number: string) => {\n let unitText = '';\n if (!isUnitPosition(position)) {\n unitText = UNIT_TEXTS[Math.abs(position - 1) % MAX_POSITION];\n }\n if (isZeroValue(number) && !isMillionsPosition(position)) {\n unitText = '';\n }\n return unitText;\n};\n\nconst getBathText = (position: number, number: string, lengthOfDigits: number) => {\n const _number: number = parseInt(number, 10);\n let numberText = NUMBER_TEXTS[_number];\n if (isZeroValue(_number)) {\n return '';\n }\n if (isTenPosition(position) && _number == 1) {\n numberText = '';\n }\n if (isTenPosition(position) && _number == 2) {\n numberText = 'ยี่';\n }\n if (isMillionsPosition(position) && isLastPosition(position, lengthOfDigits) && _number == 1) {\n numberText = 'เอ็ด';\n }\n if (lengthOfDigits > 1 && isUnitPosition(position) && _number == 1) {\n numberText = 'เอ็ด';\n }\n return numberText;\n};\n\nconst convert = (numberInput: number): string => {\n const numberReverse: string = reverseNumber(numberInput);\n let textOutput = '';\n numberReverse.split('').forEach((number: string, i) => {\n textOutput = `${getBathText(i, number, numberReverse.length)}${getBathUnit(i, number)}${textOutput}`;\n });\n return textOutput;\n};\n\nconst parseFloatWithPrecision = (number: string, precision = 2): string => {\n const numberFloatStr = parseFloat(number).toString().split('.');\n const integerUnitStr = numberFloatStr[0];\n const fractionalUnitStr = (numberFloatStr.length == 2) ? numberFloatStr[1].substring(0, precision) : '00';\n return parseFloat(`${integerUnitStr}.${fractionalUnitStr}`).toFixed(precision);\n};\n\nconst convertFullMoney = (numberInput: string) => {\n const numberStr: string = parseFloatWithPrecision(numberInput);\n const integerDigits: number = getIntegerDigits(numberStr);\n const fractionalDigits: number = getFractionalDigits(numberStr);\n const intTextOutput = convert(integerDigits);\n const textOutput = [];\n if (intTextOutput) {\n textOutput.push(`${[intTextOutput, PRIMARY_UNIT].join('')}`);\n }\n if (intTextOutput && !hasFractionalDigits(fractionalDigits)) {\n textOutput.push(WHOLE_NUMBER_TEXT);\n }\n if (hasFractionalDigits(fractionalDigits) && convert(fractionalDigits)) {\n textOutput.push(`${[convert(fractionalDigits), SECONDARY_UNIT].join('')}`);\n }\n return textOutput.join('');\n};\n\nfunction ThaiBahtText(stringNumberInput: string): string;\nfunction ThaiBahtText(numberInput: number): string;\nfunction ThaiBahtText(input: string | number): string {\n if (isNaN(Number(`${input}`))) {\n throw new TypeError('Invalid input. Expected a number or a string representing a number.');\n }\n return convertFullMoney(`${input}`);\n}\n\nexport const thbText = ThaiBahtText;\n","/* module */\n/*--------------------------------------------------*/\nexport * from './built-in';\nexport * as camera from './camera';\nexport * as dialog from './dialog';\nexport * as drawer from './drawer';\nexport * as drop from './drop';\nexport * as modal from './modal';\nexport * as tabs from './tabs';\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","/* input */\n/*--------------------------------------------------------------------------------*/\nexport const setAutoSize = (elm: HTMLTextAreaElement) => {\n elm.onkeyup = () => fitSize(elm);\n};\nexport const fitSize = (elm: HTMLTextAreaElement, delay = 0) => {\n setTimeout(() => {\n elm.style.height = 'auto';\n elm.style.height = `${elm.scrollHeight + 2}px`;\n }, delay);\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","/* camera */\n/*--------------------------------------------------------------------------------*/\nexport const takePhoto = () => new Promise<{ image: string; }>((resolve) => {\n // set hash\n window.onhashchange = () => {\n if (window.location.hash != '#camera') closeCam();\n };\n window.location.hash = 'camera';\n // create\n const cam = camCreate();\n const video = cam.querySelector<HTMLVideoElement>('#video');\n let imgData: string;\n let stream: void | MediaStream;\n let front = false;\n const options = {\n video: {\n facingMode: 'environment',\n width: { ideal: 1024 },\n height: { ideal: 768 },\n }\n };\n const closeCam = () => {\n stopMedia();\n camClose(cam);\n resolve({ image: imgData });\n };\n const stopMedia = () => {\n if (stream) {\n const track = stream.getTracks()[0];\n track.stop();\n }\n };\n const startMedia = async () => {\n const title = cam.querySelector<HTMLElement>('.header .title');\n const detail = cam.querySelector<HTMLElement>('.header .detail');\n const footer = cam.querySelector<HTMLElement>('.footer');\n const body = cam.querySelector<HTMLElement>('.body');\n stream = await navigator.mediaDevices.getUserMedia(options).catch(() => {\n title!.innerText = 'ไม่พบกล้องถ่ายภาพ';\n footer!.style.display = 'none';\n body!.innerHTML = /*html*/ `\n <i class=\"icon thin\" style=\"font-size: 80px;\">&#xf8c4;</i>\n `;\n });\n if (stream) {\n video!.srcObject = stream;\n video!.play();\n const media = stream.getTracks()[0].getSettings();\n detail!.innerText = `${media.width}x${media.height} ${media.frameRate}fps`;\n }\n };\n // start media\n (async () => {\n await startMedia();\n camReady(cam);\n })();\n // button\n const btn_take = cam.querySelector<HTMLButtonElement>('#btn-take');\n const btn_flip = cam.querySelector<HTMLElement>('#btn-flip');\n const btn_close = cam.querySelector<HTMLElement>('#btn-close');\n const btn_cancel = cam.querySelector<HTMLElement>('#btn-cancel');\n // btn-take\n btn_take!.onclick = () => {\n const media = stream!.getTracks()[0].getSettings();\n const image = cam.querySelector<HTMLCanvasElement>('#image');\n // init image\n const ctx = image!.getContext('2d');\n ctx!.clearRect(0, 0, image!.width, image!.height);\n image!.width = Number(media.width);\n image!.height = Number(media.height);\n // image data\n const image_ctx = image!.getContext('2d');\n image_ctx!.drawImage(\n video!, 0, 0,\n Number(media.width), Number(media.height), 0, 0,\n image!.width, image!.height,\n );\n imgData = image!.toDataURL('image/jpeg');\n history.back();\n };\n // btn-flip\n btn_flip!.onclick = async () => {\n front = !front;\n options.video.facingMode = front ? 'user' : 'environment';\n stopMedia();\n camLoading(cam);\n await startMedia();\n camReady(cam);\n };\n // btn-close, btn-cancel\n btn_close!.onclick = () => history.back();\n btn_cancel!.onclick = () => history.back();\n});\n/*--------------------------------------------------------------------------------*/\nconst camCreate = (): HTMLElement => {\n const cam = document.createElement('div');\n cam.className = 'slim-camera';\n cam.innerHTML = /*html*/ `\n <div class=\"body\">\n <video id=\"video\" muted playsinline></video>\n <canvas id=\"image\"></canvas>\n </div>\n <div class=\"header\">\n <div style=\"text-align: center;\">\n <div class=\"title\">กล้องถ่ายภาพ</div>\n <div class=\"detail\"></div>\n </div>\n <i id=\"btn-close\" class=\"icon\">&#xf00d;</i>\n </div>\n <div class=\"footer\">\n <i id=\"btn-cancel\" class=\"icon\">&#xf057;</i>\n <button id=\"btn-take\"></button>\n <i id=\"btn-flip\" class=\"icon\">&#xf021;</i>\n </div>\n <div class=\"loader\">\n <div class=\"spinner s32\"></div>\n </div>\n `;\n document.body.appendChild(cam);\n // open camera\n cam.style.left = `-100%`;\n cam.classList.add('cam-in');\n return cam;\n};\n/*--------------------------------------------------------------------------------*/\nconst camClose = (cam: HTMLElement) => {\n window.onhashchange = null;\n cam.classList.remove('cam-in');\n cam.classList.add('cam-out');\n cam.onanimationend = () => {\n cam.remove();\n };\n};\n/*--------------------------------------------------------------------------------*/\nconst camLoading = (cam: HTMLElement) => {\n const body = cam.querySelector<HTMLElement>('.body');\n const loader = cam.querySelector<HTMLElement>('.loader');\n body!.style.visibility = 'hidden';\n loader!.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nconst camReady = (cam: HTMLElement) => {\n const header = cam.querySelector<HTMLElement>('.header');\n const footer = cam.querySelector<HTMLElement>('.footer');\n const body = cam.querySelector<HTMLElement>('.body');\n const loader = cam.querySelector<HTMLElement>('.loader');\n header!.style.visibility = 'visible';\n footer!.style.visibility = 'visible';\n body!.style.visibility = 'visible';\n loader!.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\n","/* dialog */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nexport const confirm = (\n message: string,\n params?: {\n color?: string;\n target?: HTMLElement;\n }\n) => new Promise<boolean>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const color = params && params?.color ? params.color : 'green';\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"confirm ${color}\">\n <div class=\"header\">\n <i class=\"icon solid\">&#xf058;</i> Slim Confirm\n </div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg gray left\" id=\"btn-no\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n <button class=\"lg ${color} right\" id=\"btn-yes\">\n <i>&#xf058;</i>ตกลง\n </button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve(true);\n };\n dialog.querySelector<HTMLButtonElement>('#btn-no')!.onclick = () => {\n dialog.remove();\n resolve(false);\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const alert = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const dialog = document.createElement('div');\n dialog.className = 'overlay slim-dialog';\n dialog.innerHTML = /*html*/ `\n <div class=\"alert ${color}\">\n <div class=\"icon solid\">${icon}</div>\n <div class=\"message\">${message}</div>\n <div class=\"footer\">\n <button class=\"lg ${color}\" id=\"btn-yes\">ตกลง</button>\n </div>\n </div>\n `;\n doc.appendChild(dialog);\n // button\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.focus();\n dialog.querySelector<HTMLButtonElement>('#btn-yes')!.onclick = () => {\n dialog.remove();\n resolve();\n };\n});\n/*--------------------------------------------------------------------------------*/\nexport const toast = (\n message: string,\n params?: {\n type?: string;\n target?: HTMLElement;\n }\n) => new Promise<void>((resolve) => {\n if (!app) return;\n const doc = params && params?.target ? params.target : app;\n const type = params && params?.type ? params.type : 'success';\n // type\n let color = '';\n let icon = '';\n if (type == 'success') { color = 'green'; icon = '&#xf058;'; }\n if (type == 'failure') { color = 'red'; icon = '&#xf057;'; }\n if (type == 'warning') { color = 'orange'; icon = '&#xf06a;'; }\n if (type == 'info') { color = 'blue'; icon = '&#xf05a;'; }\n // create\n const toast = document.createElement('div');\n toast.className = `slim-toast ${color}`;\n toast.innerHTML = /*html*/ `\n <i class=\"icon\">${icon}</i>\n <span class=\"text\">${message}</span>\n `;\n doc.appendChild(toast);\n // animation\n toast.classList.add('show');\n let count = 0;\n toast.onanimationend = () => {\n count++;\n if (count == 2) {\n toast.remove();\n resolve();\n }\n };\n});\n/*--------------------------------------------------------------------------------*/\n","/* drawer */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\ntype reqParams = {\n title: string;\n body: string;\n name?: string;\n size?: string; // mobile, full\n};\nexport const create = (params: reqParams): HTMLElement => {\n const name = params.name ? params.name : 'drawer';\n const size = params.size ? params.size : 'mobile';\n // create\n const drawer = document.createElement('div');\n drawer.className = `slim-drawer ${size}`;\n drawer.innerHTML = /*html*/ `\n <div class=\"drawer-header\">\n <button id=\"btn-exit\" type=\"button\"\n class=\"circle sm light\"></button>\n <div class=\"title\">${params.title}</div>\n </div>\n <div class=\"drawer-body\">${params.body}</div>\n <div class=\"loader\">\n <div class=\"spinner s32\"></div>\n </div>\n `;\n document.body.appendChild(drawer);\n // set size\n switch (size) {\n case 'mobile': openMobile(drawer); break;\n case 'full':\n drawer.style.animation = 'slide-in-left 0.4s forwards';\n break;\n default: return drawer;\n }\n // hash change\n window.location.hash = name;\n const hashChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hash != name && hash != 'modal') done();\n };\n const done = () => {\n destroy(drawer);\n if (window.location.hash == `#${name}`) history.back();\n window.removeEventListener('hashchange', hashChange);\n };\n window.addEventListener('hashchange', hashChange);\n // button\n const btnExit = drawer.querySelector<HTMLButtonElement>('#btn-exit');\n const btnCancel = drawer.querySelector<HTMLButtonElement>('#btn-cancel');\n if (btnExit) {\n btnExit.focus();\n btnExit.onclick = done;\n }\n if (btnCancel) btnCancel.onclick = done;\n return drawer;\n};\n/*--------------------------------------------------------------------------------*/\nconst openMobile = (drawer: HTMLElement) => {\n if (!app) return;\n const offset = app.getBoundingClientRect();\n const appRight = offset.right;\n const appWidth = app.offsetWidth;\n // default position\n drawer.style.left = `${appRight}px`;\n // animation\n const css = document.createElement('style');\n drawer.appendChild(css);\n css.sheet?.insertRule(`\n @keyframes drawer-in {\n from {transform: translateX(0);}\n to {transform: translateX(-${appWidth}px);}\n }\n `);\n css.sheet?.insertRule(`\n @keyframes drawer-out {\n from {transform: translateX(-${appWidth}px);}\n to {transform: translateX(0);}\n }\n `);\n // open drawer\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.animation = 'drawer-push-app 0.4s forwards';\n drawer.style.animation = 'drawer-in 0.4s forwards';\n // scroll shadow\n const header = drawer.querySelector<HTMLElement>('.drawer-header');\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n if (header && body) body.onscroll = () => {\n if (body.scrollTop > 10) {\n header.style.boxShadow = `\n rgba(60, 64, 67, 0.3) 0px 1px 2px 0px,\n rgba(60, 64, 67, 0.15) 0px 1px 3px 1px\n `;\n } else {\n header.style.boxShadow = '';\n }\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const close = (drawer: HTMLElement) => new Promise<void>((resolve) => {\n drawer.querySelector<HTMLButtonElement>('#btn-exit')!.click();\n drawer.addEventListener('animationend', () => resolve());\n});\nconst destroy = (drawer: HTMLElement) => {\n if (!app) return;\n if (drawer.classList.contains('mobile')) {\n // mobile\n const content = app.querySelector<HTMLElement>('#app-content');\n if (content) content.style.animation = 'drawer-pull-app 0.4s forwards';\n drawer.style.animation = 'drawer-out 0.4s forwards';\n drawer.addEventListener('animationend', () => {\n if (content) content.style.animation = 'unset';\n drawer.remove();\n });\n } else {\n // full-page\n drawer.style.animation = 'slide-out-left 0.4s forwards';\n drawer.addEventListener('animationend', () => {\n drawer.remove();\n });\n }\n // remove modal\n const modal = document.querySelectorAll<HTMLElement>('.slim-modal');\n modal.forEach(el => el.remove());\n // remove dialog\n const dialog = document.querySelectorAll<HTMLElement>('.slim-dialog');\n dialog.forEach(el => el.remove());\n};\n/*--------------------------------------------------------------------------------*/\nexport const loading = (drawer: HTMLElement) => {\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n const loader = drawer.querySelector<HTMLElement>('.loader');\n if (body) body.style.display = 'none';\n if (loader) loader.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nexport const ready = (drawer: HTMLElement) => {\n const body = drawer.querySelector<HTMLElement>('.drawer-body');\n const loader = drawer.querySelector<HTMLElement>('.loader');\n if (body) body.style.display = 'block';\n if (loader) loader.style.display = 'none';\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","/* modal */\nconst app = document.querySelector<HTMLElement>('#app');\n/*--------------------------------------------------------------------------------*/\nconst tmpBtnSave: string = /* html */ `\n <button class=\"solid green\" type=\"submit\">\n <i>&#xf0c7;</i>บันทึก\n </button>\n`;\nconst tmpBtnCancel: string = /* html */ `\n <button class=\"solid gray\" type=\"button\" id=\"btn-cancel\">\n <i>&#xf057;</i>ยกเลิก\n </button>\n`;\nconst tmpBtnClose: string = /* html */ `\n <button class=\"solid blue\" type=\"button\" id=\"btn-close\">\n <i>&#xf057;</i>ปิดหน้า\n </button>\n`;\ntype ModalParams = {\n icon: string;\n title: string;\n body: string;\n width?: string;\n button?: {\n save?: boolean;\n cancel?: boolean;\n close?: boolean;\n align?: string;\n };\n target?: HTMLElement;\n};\n/*--------------------------------------------------------------------------------*/\nexport const create = (params: ModalParams): HTMLElement => {\n const icon = params.icon ? params.icon : '&#xf40e;';\n const title = params.title ? params.title : 'Modal Title';\n const body = params.body ? params.body : 'Modal Body';\n const width = params.width ? params.width : '100%';\n const align = params.button?.align ? params.button?.align : '';\n const doc = params.target ? params.target : app;\n // button\n let button = '';\n if (params.button?.cancel) button += tmpBtnCancel;\n if (params.button?.close) button += tmpBtnClose;\n if (params.button?.save) button += tmpBtnSave;\n // create\n const modal = document.createElement('div');\n modal.className = 'overlay slim-modal';\n modal.innerHTML = /*html*/ `\n <form>\n <div class=\"content\" style=\"width: ${width};\">\n <div class=\"header\">\n <i class=\"icon pad\">${icon}</i>${title}\n <button id=\"btn-exit\" type=\"button\"\n class=\"icon\">&#xf00d;</button>\n </div>\n <div class=\"body\">${body}</div>\n <div class=\"footer ${align}\">${button}</div>\n <div class=\"loader\">\n <div class=\"spinner s28\"></div>\n </div>\n </div>\n </form>\n `;\n if (!doc) return modal;\n doc.appendChild(modal);\n if (width == 'auto') {\n const content = modal.querySelector<HTMLElement>('.content');\n if (content) content.style.maxWidth = `450px`;\n }\n // open modal\n window.location.hash = 'modal';\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-in');\n modal.classList.add('overlay-in');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-in')) {\n content.classList.remove('modal-in');\n modal.classList.remove('overlay-in');\n }\n });\n // hash change\n const hashChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hash != 'modal') done();\n };\n const done = () => {\n destroy(modal);\n if (window.location.hash == '#modal') history.back();\n window.removeEventListener('hashchange', hashChange);\n };\n window.addEventListener('hashchange', hashChange);\n // button\n const btnExit = modal.querySelector<HTMLButtonElement>('#btn-exit');\n const btnCancel = modal.querySelector<HTMLButtonElement>('#btn-cancel');\n const btnClose = modal.querySelector<HTMLButtonElement>('#btn-close');\n if (btnExit) {\n btnExit.focus();\n btnExit.onclick = done;\n }\n if (btnCancel) btnCancel.onclick = done;\n if (btnClose) btnClose.onclick = done;\n return modal;\n};\n/*--------------------------------------------------------------------------------*/\nexport const close = (modal: HTMLElement) => new Promise<void>((resolve) => {\n modal.querySelector<HTMLButtonElement>('#btn-exit')!.click();\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.addEventListener('animationend', () => resolve());\n});\nconst destroy = (modal: HTMLElement) => {\n const content = modal.querySelector<HTMLElement>('.content')!;\n content.classList.add('modal-out');\n modal.classList.add('overlay-out');\n content.addEventListener('animationend', () => {\n if (content.classList.contains('modal-out')) {\n modal.style.display = 'none';\n modal.remove();\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const loading = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'hidden';\n if (loader) loader.style.display = 'flex';\n};\n/*--------------------------------------------------------------------------------*/\nexport const ready = (modal: HTMLElement) => {\n const body = modal.querySelector<HTMLElement>('.body');\n const loader = modal.querySelector<HTMLElement>('.loader');\n if (body) body.style.visibility = 'visible';\n if (loader) loader.style.display = 'none';\n};\n/*--------------------------------------------------------------------------------*/\nexport const hidden = (modal: HTMLElement) => {\n modal.style.display = 'none';\n};\nexport const visible = (modal: HTMLElement) => {\n modal.style.display = 'block';\n};\n/*--------------------------------------------------------------------------------*/\n","/* tabs */\n/*--------------------------------------------------------------------------------*/\nconst ignore: string[] = ['camera', 'drawer', 'modal'];\nconst hashIgnore = (hash: string) => ignore.includes(hash);\n/*--------------------------------------------------------------------------------*/\nexport const init = (\n tabs: HTMLElement,\n onChange: (index: number, done: () => void) => void,\n) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn');\n tbtn.forEach(elm => {\n const dataHash = elm.getAttribute('data-hash');\n elm.onclick = () => window.location.replace('#' + dataHash);\n });\n // tabs change\n const tabsChange = () => {\n const hash = (window.location.hash).replaceAll('#', '');\n if (hashIgnore(hash)) return;\n if (hash == '') {\n const mainTabs = tbtn[0].getAttribute('data-hash');\n window.location.replace('#' + mainTabs);\n return;\n }\n const curTabs = tabs.querySelector<HTMLButtonElement>('.tabs-btn.active');\n if (hash == curTabs?.getAttribute('data-hash')) return;\n // set active\n let index = 0;\n tbtn.forEach((elm, i) => {\n const dataHash = elm.getAttribute('data-hash');\n if (hash == dataHash) {\n elm.classList.add('active');\n index = i;\n } else {\n elm.classList.remove('active');\n }\n });\n loading(tabs, index);\n onChange(index, () => ready(tabs, index));\n };\n tabsChange();\n window.onhashchange = tabsChange;\n};\n/*--------------------------------------------------------------------------------*/\nexport const loading = (tabs: HTMLElement, index: number) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn')[index];\n const body = tabs.querySelector<HTMLElement>('.tabs-body');\n const inner = tbtn.querySelectorAll<HTMLElement>('*');\n const tabsBar = tabs.querySelector<HTMLElement>('.tabs-bar');\n if (tbtn && body) {\n // clear loader\n tabs.querySelector<HTMLElement>('.tabs-overlay')?.remove();\n tbtn.querySelector<HTMLElement>('.btn-loader')?.remove();\n // hide inner\n body.style.display = 'none';\n inner.forEach(el => el.style.display = 'none');\n // create overlay\n const overlay = document.createElement('div');\n overlay.className = 'tabs-overlay';\n tabs.appendChild(overlay);\n // create loader\n const loader = document.createElement('div');\n loader.className = 'btn-loader';\n loader.innerHTML = `<div class=\"spinner s24\"></div>`;\n tbtn.appendChild(loader);\n // tabs-bar\n if (tabsBar) {\n const barCont = tabsBar.querySelectorAll<HTMLElement>('*');\n barCont.forEach(el => el.style.visibility = 'hidden');\n tabsBar.querySelector<HTMLElement>('.lds-ellipsis')?.remove();\n // create loader\n const loader = document.createElement('div');\n loader.className = 'lds-ellipsis';\n loader.innerHTML = `<div></div><div></div><div></div><div></div>`;\n tabsBar.prepend(loader);\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\nexport const ready = (tabs: HTMLElement, index: number) => {\n const tbtn = tabs.querySelectorAll<HTMLButtonElement>('.tabs-btn')[index];\n const body = tabs.querySelector<HTMLElement>('.tabs-body');\n const inner = tbtn.querySelectorAll<HTMLElement>('*');\n const tabsBar = tabs.querySelector<HTMLElement>('.tabs-bar');\n if (tbtn && body) new Promise(r => setTimeout(r, 400)).then(() => {\n // clear loader\n tabs.querySelector<HTMLElement>('.tabs-overlay')?.remove();\n tbtn.querySelector<HTMLElement>('.btn-loader')?.remove();\n // show inner\n body.style.display = 'block';\n inner.forEach(el => el.style.display = '');\n // tabs-bar\n if (tabsBar) {\n const barCont = tabsBar.querySelectorAll<HTMLElement>('*');\n barCont.forEach(el => el.style.visibility = '');\n tabsBar.querySelector<HTMLElement>('.lds-ellipsis')?.remove();\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const setActive = (tbtn: NodeListOf<HTMLButtonElement>, index: number) => {\n tbtn.forEach((elm, i) => {\n if (i == index) {\n elm.classList.add('active');\n } else {\n elm.classList.remove('active');\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\n","/* oauth */\n/*--------------------------------------------------------------------------------*/\nimport { cfg } from '../../config';\nimport * as cookie from '../../lib/cookie';\nimport { tempLogout } from './template';\nconst app = document.querySelector<HTMLElement>('#app');\nexport { authMW } from './midware';\n/*--------------------------------------------------------------------------------*/\nexport const login = () => {\n clearCache();\n // set params\n const state = Math.random().toString(36).slice(-8);\n sessionStorage.setItem('OAUTH_STATE', state);\n const query = new URLSearchParams({\n response_type: 'token',\n client_id: cfg.app.UUID,\n redirect_uri: cfg.app.CALLBACK,\n state: state,\n }).toString();\n const url = `${cfg.hub.LOGIN}?${query}`;\n window.location.replace(url);\n};\n/*--------------------------------------------------------------------------------*/\nexport const logout = () => {\n clearCache();\n // template\n if (!app) return;\n app.innerHTML = tempLogout;\n app.classList.add('full-page');\n const content = app.querySelector<HTMLElement>('#content')!;\n const loader = app.querySelector<HTMLElement>('#loader')!;\n new Promise(r => setTimeout(r, 400)).then(() => {\n content.style.display = 'block';\n loader.style.display = 'none';\n });\n app.querySelector<HTMLButtonElement>('#btn-login')!.onclick = () => {\n window.location.replace('/login');\n };\n};\n/*--------------------------------------------------------------------------------*/\nexport const callback = () => {\n const search = window.location.search;\n const query = new URLSearchParams(search);\n const state = query.get('state');\n const session = sessionStorage.getItem('OAUTH_STATE');\n if (state !== session) {\n window.location.replace('/login');\n }\n clearCache();\n // response_type\n const code = query.get('code');\n const token = query.get('token');\n if (code) { /*code*/ }\n if (token) {\n localStorage.setItem('ACCESS_TOKEN', token);\n }\n window.location.replace('/');\n};\n/*--------------------------------------------------------------------------------*/\nconst clearCache = () => {\n cookie.clear();\n localStorage.clear();\n sessionStorage.clear();\n};\n/*--------------------------------------------------------------------------------*/\n","/* template */\nexport const tempLogout = /*html*/ `\n<div id=\"page-logout\">\n <div id=\"content\">\n <div class=\"logo\">\n <img src=\"https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-02.png\">\n </div>\n <button id=\"btn-login\" class=\"lg\">เข้าระบบอีกครั้ง</button>\n </div>\n <!-- loader -->\n <div id=\"loader\"></div>\n</div>\n`;","/* auth */\nimport type { ApiRsp } from '..';\nimport { cfg } from '../../../config';\n/*--------------------------------------------------------------------------------*/\nexport const getToken = (params: ReqToken) => new Promise<ApiRsp>((resolve, reject) => {\n fetch(cfg.hub.OAUTH + '/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json; charset=utf-8' },\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 getUserInfo = (token?: string) => new Promise<ApiRsp>((resolve, reject) => {\n let headers = cfg.api.HEADERS;\n if (token) headers = new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n 'Authorization': `Bearer ${token}`,\n });\n fetch(cfg.hub.OAUTH + '/userinfo', {\n method: 'GET',\n headers: 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 type ReqToken = {\n grant_type: string;\n client_id: string;\n client_secret?: string;\n username?: string;\n password?: string;\n refresh_token?: string;\n uuid?: string;\n};\nexport type RspToken = {\n access_token: string;\n token_type: string;\n expires_in: number;\n refresh_token?: string;\n redirect_uri?: string;\n};\nexport type UserInfo = {\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 updated_at: number;\n};","/* middleware */\n/*--------------------------------------------------------------------------------*/\nimport { cfg } from '../../config';\nimport { jwtParse } from '../../lib/utility';\nimport * as cookie from '../../lib/cookie';\nimport { getUserInfo, type UserInfo } from '../api/auth';\nconst IGNORE: string[] = ['__NOT_FOUND__', 'login', 'logout', 'callback'];\n/*--------------------------------------------------------------------------------*/\nexport const authMW = async (route: string, ignore?: string[]) => {\n // ignore\n ignore?.forEach(val => IGNORE.push(val));\n if (IGNORE.includes(route)) {\n console.log('ignore :', route);\n return;\n }\n // token exist\n const token = localStorage.getItem('ACCESS_TOKEN');\n if (!token) {\n gotoLogin();\n throw 'token not exist';\n }\n // token expire\n try {\n const jwt = jwtParse(token);\n const exp = Number(jwt?.exp) * 1000;\n if (isNaN(exp)) throw 'err';\n const now = Date.now();\n if (now >= exp) throw 'err';\n } catch { gotoLogin(); }\n // set api header\n cfg.api.TOKEN = token;\n cfg.api.HEADERS = new Headers({\n 'Content-Type': 'application/json; charset=utf-8',\n 'Authorization': `Bearer ${cfg.api.TOKEN}`,\n });\n // session exist\n const session = sessionStorage.getItem('ACCESS_SESSION');\n if (!session) {\n await getUserInfo().then(resp => {\n const data = resp.data as UserInfo;\n setProfile(data);\n sessionStorage.setItem('ACCESS_SESSION', JSON.stringify(data));\n }).catch(() => gotoLogin());\n } else {\n const data = JSON.parse(session) as UserInfo;\n setProfile(data);\n }\n};\n/*--------------------------------------------------------------------------------*/\nconst setProfile = (user: UserInfo) => {\n cfg.user.sub = user.sub;\n cfg.user.name = user.name;\n cfg.user.utyp = user.utyp;\n cfg.user.unit = user.unit;\n cfg.user.unit_id = user.unit_id;\n cfg.user.role_id = user.role_id;\n cfg.user.picture = user.picture ? user.picture : '';\n if (user.metadata) cfg.user.metadata = user.metadata;\n};\n/*--------------------------------------------------------------------------------*/\nconst gotoLogin = () => {\n cookie.clear();\n localStorage.clear();\n sessionStorage.clear();\n window.location.replace('/login');\n throw 'not logged in';\n};\n/*--------------------------------------------------------------------------------*/\n","/* api */\nexport * as auth from './auth';\n// api response\nexport interface ApiRsp {\n status: {\n code: number;\n message: string;\n };\n rows: {\n total: number;\n limit: number;\n offset: number;\n };\n data: unknown;\n}","/* wsshub */\n/*--------------------------------------------------------------------------------*/\nimport { cfg } from '../../config';\nimport { toast } from '../../mod/dialog';\nimport { timeToStr, thaiDate } from '../../lib/dateTime';\n/*--------------------------------------------------------------------------------*/\nexport const newTask = (worker: new () => Worker) => {\n if (!window.Worker) return;\n cfg.hub.TASK = new worker();\n cfg.hub.TASK.postMessage({\n head: 'INIT',\n data: {\n url: cfg.hub.WSS,\n app: cfg.app.NAME,\n uid: cfg.app.UUID,\n ver: cfg.app.VERSION,\n }\n });\n cfg.hub.TASK.addEventListener('message', (e) => {\n const json = e.data;\n const head = json.head ? json.head : '';\n const data = json.data ? json.data : '';\n if (head == 'ACCEPT') {\n rspAccept(data);\n cfg.hub.TASK?.postMessage({\n head: 'VERIFY',\n data: cfg.api.TOKEN,\n });\n }\n if (head == 'DISCON') rspDiscon();\n if (head == 'LATEST') rspLatest(data);\n if (head == 'BRDMSG') rspBrdMsg(data);\n if (head == 'VERIFY' && data != '200 OK') {\n console.log(head, data);\n }\n });\n};\n/*--------------------------------------------------------------------------------*/\nexport const checkUpdate = (min = 10) => {\n return setInterval(() => {\n cfg.hub.TASK?.postMessage({\n head: 'LATEST',\n data: {\n app: cfg.app.NAME,\n uid: cfg.app.UUID,\n }\n });\n }, 1000 * 60 * min); // defult 10 min\n};\n/*--------------------------------------------------------------------------------*/\ntype BrdPack = {\n from: string;\n to: string;\n cmd: string;\n msg: unknown;\n};\nconst rspBrdMsg = (brd: BrdPack) => {\n if (brd.cmd == \"LOGS\") console.log(brd.msg);\n if (brd.cmd == \"TIME\") setTime(brd.msg as { unix: number; });\n if (brd.cmd == 'RESULT' && brd.to == cfg.hub.UUID) {\n console.log(brd.cmd, 'From:', brd.from);\n console.log(brd.msg);\n }\n if (brd.cmd == 'CONRST' && (brd.to == cfg.hub.UUID || brd.to == '@all')) {\n sessionStorage.clear();\n window.location.reload();\n }\n if (brd.cmd == 'LOGOUT' && (brd.to == cfg.hub.UUID || brd.to == '@all')) {\n localStorage.clear();\n sessionStorage.clear();\n window.location.reload();\n }\n if (brd.cmd == 'NOTIFY' && (brd.to == cfg.hub.UUID || brd.to == '@all')) {\n brdNotify(brd.msg as NotifyPack);\n }\n if (brd.cmd == '') console.log(brd.msg);\n};\n/*--------------------------------------------------------------------------------*/\nconst rspAccept = (data: { uuid: string; }) => {\n cfg.hub.UUID = data.uuid ? data.uuid : '';\n console.log('hub-uuid:', cfg.hub.UUID);\n const boxTime = document.querySelector<HTMLElement>('#topbar #box-time');\n if (boxTime) boxTime.classList.remove('offline');\n toast('เชื่อมต่อ Server สำเร็จ.!', { type: 'success' });\n};\n/*--------------------------------------------------------------------------------*/\nconst rspDiscon = () => {\n const boxTime = document.querySelector<HTMLElement>('#topbar #box-time');\n if (boxTime) {\n boxTime.classList.add('offline');\n const svTime = boxTime.querySelector<HTMLElement>('#sv-time');\n const svDate = boxTime.querySelector<HTMLElement>('#sv-date');\n if (svTime) svTime.innerText = 'server';\n if (svDate) svDate.innerText = 'OFFLINE';\n }\n toast('ขาดการเชื่อมต่อ Server.!', { type: 'failure' });\n};\n/*--------------------------------------------------------------------------------*/\nconst rspLatest = (data: {\n appname: string;\n appuuid: string;\n version: string;\n release: string;\n}) => {\n if (cfg.app.UUID == data.appuuid && cfg.app.NAME == data.appname) {\n const path = window.location.pathname;\n if (path != '/changelog' && cfg.app.RELEASE != data.release) {\n window.location.replace('/changelog');\n }\n }\n};\n/*--------------------------------------------------------------------------------*/\nconst setTime = (data: { unix: number; }) => {\n if (typeof data.unix != 'number') return;\n cfg.UNIX_TIME = Number(data.unix);\n const svTime = document.querySelector<HTMLElement>('#topbar #box-time #sv-time');\n const svDate = document.querySelector<HTMLElement>('#topbar #box-time #sv-date');\n if (svTime && svDate) {\n const [date, time] = timeToStr(cfg.UNIX_TIME).split(' ');\n svTime.innerText = time;\n svDate.innerText = thaiDate(date, 11);\n }\n};\n/*--------------------------------------------------------------------------------*/\ntype NotifyPack = {\n title?: string;\n icon?: string;\n body: string;\n};\nconst brdNotify = (data: NotifyPack) => {\n const title = data.title ? data.title : 'Hub Notify';\n const icon = data.icon ? data.icon : 'https://cdn.jsdelivr.net/npm/slimsdk/dist/assets/icon/icon-06.png';\n const body = data.body ? data.body : '';\n if (!body) return;\n Notification.requestPermission().then(res => {\n if (res == 'granted') {\n new Notification(title, { body: body, icon: icon });\n }\n }).catch(err => console.error(err));\n};\n/*--------------------------------------------------------------------------------*/\n"],"mappings":"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","names":["app","app","app","error","loading","loading","app","toast","create","loading","ready","app","clear","select","close","create","loading","ready","app","content","destroy","init","loading","ready","loader","ignore","app"]}