From 85d163fb641e43ecb82b1b80174c48a1d5f4d7bf Mon Sep 17 00:00:00 2001 From: waruneeta Date: Tue, 14 Nov 2023 17:47:43 +0700 Subject: [PATCH] - run by vite - change camera --- .eslintrc.js | 17 +- .prettierrc.json | 5 + README.md | 12 +- babel.config.js | 5 - cypress.config.ts | 8 + env.d.ts | 1 + index.html | 13 + package.json | 73 +- .../icons/android-chrome-192x192.png | Bin .../icons/android-chrome-512x512.png | Bin .../icons/android-chrome-maskable-192x192.png | Bin .../icons/android-chrome-maskable-512x512.png | Bin .../icons/android-launchericon-144-144.png | Bin .../icons/android-launchericon-48-48.png | Bin .../icons/android-launchericon-72-72.png | Bin .../icons/android-launchericon-96-96.png | Bin .../icons/apple-touch-icon-120x120.png | Bin .../icons/apple-touch-icon-152x152.png | Bin public/icons/apple-touch-icon-180x180.png | Bin 0 -> 22876 bytes .../icons/apple-touch-icon-60x60.png | Bin .../icons/apple-touch-icon-76x76.png | Bin public/{img => }/icons/apple-touch-icon.png | Bin public/{img => }/icons/favicon-16x16.png | Bin public/{img => }/icons/favicon-32x32.png | Bin .../icons/msapplication-icon-144x144.png | Bin public/{img => }/icons/mstile-150x150.png | Bin public/{img => }/icons/safari-pinned-tab.svg | 0 public/img/icons/apple-touch-icon-180x180.png | Bin 4678 -> 0 bytes public/index.html | 23 - src/components/CustomDialog.vue | 21 +- src/components/FormTime.vue | 450 ++++++------- src/components/HeaderPopup.vue | 69 +- src/components/MapCheckin.vue | 202 +++--- src/components/PopUp.vue | 90 +-- src/components/TableHistory.vue | 622 +++++++++--------- src/components/ToolBar.vue | 98 +-- src/interface/index/Main.ts | 20 +- src/interface/response/checkin.ts | 14 +- src/main.ts | 45 +- src/quasar-user-options.ts | 13 +- src/registerServiceWorker.ts | 24 +- src/router/index.ts | 68 +- src/shims-vue.d.ts | 2 +- src/stores/chekin.ts | 122 ++-- src/stores/mixin.ts | 146 ++-- .../quasar-variables.sass} | 0 src/styles/quasar.sass | 3 - src/views/ErrorNotFoundPage.vue | 27 + src/views/HistoryView.vue | 206 +++--- src/views/HomeView.vue | 279 +++----- src/views/SampleCamera.vue | 42 ++ tsconfig.app.json | 16 + tsconfig.config.json | 14 + tsconfig.json | 37 +- tsconfig.vitest.json | 9 + vite.config.js | 60 ++ vue.config.js | 13 - 57 files changed, 1494 insertions(+), 1375 deletions(-) create mode 100644 .prettierrc.json delete mode 100644 babel.config.js create mode 100644 cypress.config.ts create mode 100644 env.d.ts create mode 100644 index.html rename public/{img => }/icons/android-chrome-192x192.png (100%) rename public/{img => }/icons/android-chrome-512x512.png (100%) rename public/{img => }/icons/android-chrome-maskable-192x192.png (100%) rename public/{img => }/icons/android-chrome-maskable-512x512.png (100%) rename public/{img => }/icons/android-launchericon-144-144.png (100%) rename public/{img => }/icons/android-launchericon-48-48.png (100%) rename public/{img => }/icons/android-launchericon-72-72.png (100%) rename public/{img => }/icons/android-launchericon-96-96.png (100%) rename public/{img => }/icons/apple-touch-icon-120x120.png (100%) rename public/{img => }/icons/apple-touch-icon-152x152.png (100%) create mode 100644 public/icons/apple-touch-icon-180x180.png rename public/{img => }/icons/apple-touch-icon-60x60.png (100%) rename public/{img => }/icons/apple-touch-icon-76x76.png (100%) rename public/{img => }/icons/apple-touch-icon.png (100%) rename public/{img => }/icons/favicon-16x16.png (100%) rename public/{img => }/icons/favicon-32x32.png (100%) rename public/{img => }/icons/msapplication-icon-144x144.png (100%) rename public/{img => }/icons/mstile-150x150.png (100%) rename public/{img => }/icons/safari-pinned-tab.svg (100%) delete mode 100644 public/img/icons/apple-touch-icon-180x180.png delete mode 100644 public/index.html rename src/{styles/quasar.variables.sass => style/quasar-variables.sass} (100%) delete mode 100644 src/styles/quasar.sass create mode 100644 src/views/ErrorNotFoundPage.vue create mode 100644 src/views/SampleCamera.vue create mode 100644 tsconfig.app.json create mode 100644 tsconfig.config.json create mode 100644 tsconfig.vitest.json create mode 100644 vite.config.js delete mode 100644 vue.config.js diff --git a/.eslintrc.js b/.eslintrc.js index e9a84a0..a0b479f 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -1,20 +1,19 @@ module.exports = { root: true, env: { - node: true + node: true, + es2022: true, }, - 'extends': [ + extends: [ 'plugin:vue/vue3-essential', 'eslint:recommended', - '@vue/typescript/recommended' - + '@vue/typescript/recommended', ], - parserOptions: { - ecmaVersion: 2020 - }, rules: { // 'no-console': process.env.NODE_ENV === 'production' ? 'warn' : 'off', // 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off' - 'vue/no-mutating-props': 'off' - } + 'vue/no-mutating-props': 'off', + // '@typescript-eslint/no-explicit-any': 'off', + 'vue/multi-word-component-names': 'off' + }, } diff --git a/.prettierrc.json b/.prettierrc.json new file mode 100644 index 0000000..f8dec5b --- /dev/null +++ b/.prettierrc.json @@ -0,0 +1,5 @@ +{ + "tabWidth": 2, + "semi": false, + "singleQuote": true +} diff --git a/README.md b/README.md index 9ff1f52..579ee97 100644 --- a/README.md +++ b/README.md @@ -1,24 +1,30 @@ -# maptest +# BMA ระบบลงเวลาเข้า-ออกงาน ## Project setup + ``` npm install ``` ### Compiles and hot-reloads for development + ``` npm run dev ``` ### Compiles and minifies for production + ``` npm run build +npm run preview ``` -### Lints and fixes files +### Format and fixes files + ``` -npm run lint +npm run format ``` ### Customize configuration + See [Configuration Reference](https://cli.vuejs.org/config/). diff --git a/babel.config.js b/babel.config.js deleted file mode 100644 index e955840..0000000 --- a/babel.config.js +++ /dev/null @@ -1,5 +0,0 @@ -module.exports = { - presets: [ - '@vue/cli-plugin-babel/preset' - ] -} diff --git a/cypress.config.ts b/cypress.config.ts new file mode 100644 index 0000000..4a22885 --- /dev/null +++ b/cypress.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from 'cypress' + +export default defineConfig({ + e2e: { + specPattern: 'cypress/e2e/**/*.{cy,spec}.{js,jsx,ts,tsx}', + baseUrl: 'http://localhost:4173', + }, +}) diff --git a/env.d.ts b/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/index.html b/index.html new file mode 100644 index 0000000..b9d284d --- /dev/null +++ b/index.html @@ -0,0 +1,13 @@ + + + + + + + BMA ระบบลงเวลาเข้า-ออกงาน + + +
+ + + diff --git a/package.json b/package.json index c7b8b27..b872917 100644 --- a/package.json +++ b/package.json @@ -3,39 +3,60 @@ "version": "0.1.0", "private": true, "scripts": { - "dev": "vue-cli-service serve", - "build": "vue-cli-service build", - "lint": "vue-cli-service lint" + "dev": "vite", + "build": "run-p type-check build-only", + "preview": "vite preview --port 3008", + "test:unit": "vitest --environment jsdom --root src/", + "test:e2e": "start-server-and-test preview :4173 'cypress run --e2e'", + "test:e2e:dev": "start-server-and-test 'vite dev --port 4173' :4173 'cypress open --e2e'", + "build-only": "vite build", + "type-check": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore", + "format": "prettier . --write" }, "dependencies": { + "@fullcalendar/core": "^6.1.8", + "@fullcalendar/daygrid": "^6.1.8", + "@fullcalendar/interaction": "^6.1.8", + "@fullcalendar/list": "^6.1.8", + "@fullcalendar/timegrid": "^6.1.8", + "@fullcalendar/vue3": "^6.1.8", "@googlemaps/js-api-loader": "^1.16.2", - "@quasar/cli": "^2.3.0", - "@quasar/extras": "^1.0.0", - "@vuepic/vue-datepicker": "^7.2.1", - "core-js": "^3.8.3", + "@quasar/extras": "^1.15.8", + "@vuepic/vue-datepicker": "^5.2.1", "moment": "^2.29.4", - "pinia": "^2.1.7", - "quasar": "^2.0.0", + "pinia": "^2.1.4", + "quasar": "^2.11.1", "register-service-worker": "^1.7.2", - "vue": "^3.2.13", - "vue-router": "^4.0.3", + "simple-vue-camera": "^1.1.3", + "vite-plugin-pwa": "^0.16.7", + "vue": "^3.2.45", + "vue-router": "^4.1.6", "vue3-google-map": "^0.18.0" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "^5.4.0", - "@typescript-eslint/parser": "^5.4.0", - "@vue/cli-plugin-babel": "~5.0.0", - "@vue/cli-plugin-eslint": "~5.0.0", - "@vue/cli-plugin-pwa": "~5.0.0", - "@vue/cli-plugin-router": "~5.0.0", - "@vue/cli-plugin-typescript": "~5.0.0", - "@vue/cli-service": "~5.0.0", - "@vue/eslint-config-typescript": "^9.1.0", - "eslint": "^8.53.0", - "eslint-plugin-prettier": "^5.0.1", - "sass": "1.32.12", - "sass-loader": "^12.0.0", - "typescript": "~4.5.5", - "vue-cli-plugin-quasar": "~5.0.2" + "@quasar/vite-plugin": "^1.3.0", + "@rushstack/eslint-patch": "^1.1.4", + "@types/jsdom": "^20.0.1", + "@types/node": "^18.11.12", + "@vitejs/plugin-vue": "^4.0.0", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "@vue/eslint-config-prettier": "^7.0.0", + "@vue/eslint-config-typescript": "^11.0.0", + "@vue/test-utils": "^2.2.6", + "@vue/tsconfig": "^0.1.3", + "cypress": "^12.0.2", + "eslint": "^8.22.0", + "eslint-plugin-cypress": "^2.12.1", + "eslint-plugin-vue": "^9.3.0", + "jsdom": "^20.0.3", + "npm-run-all": "^4.1.5", + "prettier": "^2.7.1", + "sass": "^1.32.12", + "start-server-and-test": "^1.15.2", + "typescript": "~4.7.4", + "vite": "^4.0.0", + "vitest": "^0.25.6", + "vue-tsc": "^1.0.12" } } diff --git a/public/img/icons/android-chrome-192x192.png b/public/icons/android-chrome-192x192.png similarity index 100% rename from public/img/icons/android-chrome-192x192.png rename to public/icons/android-chrome-192x192.png diff --git a/public/img/icons/android-chrome-512x512.png b/public/icons/android-chrome-512x512.png similarity index 100% rename from public/img/icons/android-chrome-512x512.png rename to public/icons/android-chrome-512x512.png diff --git a/public/img/icons/android-chrome-maskable-192x192.png b/public/icons/android-chrome-maskable-192x192.png similarity index 100% rename from public/img/icons/android-chrome-maskable-192x192.png rename to public/icons/android-chrome-maskable-192x192.png diff --git a/public/img/icons/android-chrome-maskable-512x512.png b/public/icons/android-chrome-maskable-512x512.png similarity index 100% rename from public/img/icons/android-chrome-maskable-512x512.png rename to public/icons/android-chrome-maskable-512x512.png diff --git a/public/img/icons/android-launchericon-144-144.png b/public/icons/android-launchericon-144-144.png similarity index 100% rename from public/img/icons/android-launchericon-144-144.png rename to public/icons/android-launchericon-144-144.png diff --git a/public/img/icons/android-launchericon-48-48.png b/public/icons/android-launchericon-48-48.png similarity index 100% rename from public/img/icons/android-launchericon-48-48.png rename to public/icons/android-launchericon-48-48.png diff --git a/public/img/icons/android-launchericon-72-72.png b/public/icons/android-launchericon-72-72.png similarity index 100% rename from public/img/icons/android-launchericon-72-72.png rename to public/icons/android-launchericon-72-72.png diff --git a/public/img/icons/android-launchericon-96-96.png b/public/icons/android-launchericon-96-96.png similarity index 100% rename from public/img/icons/android-launchericon-96-96.png rename to public/icons/android-launchericon-96-96.png diff --git a/public/img/icons/apple-touch-icon-120x120.png b/public/icons/apple-touch-icon-120x120.png similarity index 100% rename from public/img/icons/apple-touch-icon-120x120.png rename to public/icons/apple-touch-icon-120x120.png diff --git a/public/img/icons/apple-touch-icon-152x152.png b/public/icons/apple-touch-icon-152x152.png similarity index 100% rename from public/img/icons/apple-touch-icon-152x152.png rename to public/icons/apple-touch-icon-152x152.png diff --git a/public/icons/apple-touch-icon-180x180.png b/public/icons/apple-touch-icon-180x180.png new file mode 100644 index 0000000000000000000000000000000000000000..407a6e009245bfa478b35518eef5e2ad4aa60488 GIT binary patch literal 22876 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 literal 0 HcmV?d00001 diff --git a/public/img/icons/apple-touch-icon-60x60.png b/public/icons/apple-touch-icon-60x60.png similarity index 100% rename from public/img/icons/apple-touch-icon-60x60.png rename to public/icons/apple-touch-icon-60x60.png diff --git a/public/img/icons/apple-touch-icon-76x76.png b/public/icons/apple-touch-icon-76x76.png similarity index 100% rename from public/img/icons/apple-touch-icon-76x76.png rename to public/icons/apple-touch-icon-76x76.png diff --git a/public/img/icons/apple-touch-icon.png b/public/icons/apple-touch-icon.png similarity index 100% rename from public/img/icons/apple-touch-icon.png rename to public/icons/apple-touch-icon.png diff --git a/public/img/icons/favicon-16x16.png b/public/icons/favicon-16x16.png similarity index 100% rename from public/img/icons/favicon-16x16.png rename to public/icons/favicon-16x16.png diff --git a/public/img/icons/favicon-32x32.png b/public/icons/favicon-32x32.png similarity index 100% rename from public/img/icons/favicon-32x32.png rename to public/icons/favicon-32x32.png diff --git a/public/img/icons/msapplication-icon-144x144.png b/public/icons/msapplication-icon-144x144.png similarity index 100% rename from public/img/icons/msapplication-icon-144x144.png rename to public/icons/msapplication-icon-144x144.png diff --git a/public/img/icons/mstile-150x150.png b/public/icons/mstile-150x150.png similarity index 100% rename from public/img/icons/mstile-150x150.png rename to public/icons/mstile-150x150.png diff --git a/public/img/icons/safari-pinned-tab.svg b/public/icons/safari-pinned-tab.svg similarity index 100% rename from public/img/icons/safari-pinned-tab.svg rename to public/icons/safari-pinned-tab.svg diff --git a/public/img/icons/apple-touch-icon-180x180.png b/public/img/icons/apple-touch-icon-180x180.png deleted file mode 100644 index 404e192a95ccccbede087203c42b1f25f6bc6e67..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4678 zcmb_gcQ{;6xIXF%qOB6F7J}$CHcIr~StZd4LexccR!1;003@kYpI!lw*K!+ zMhKRlYSNuSL+q-ouM7aSXo?F560pwcq-CNH03o~pfQkixGY~?p13-Wn0BqO;fNVAZ zF!|)S7|Vk{NF8-G)qv~2Pf`233=o0%YwN2+eiA?-6k^qmdZhqBv!<=4j0pO+T`(63 zoo?u#em%?m-0Mw>^S_yuw5QQE2PFT#_0?4&G>AGq_;Xmb8?HdT=6%0r?J_^XX*`T2 z!(G zlc3{fa#U@Ti%?||!xO+_IsQy`#8YOJQBY9uWJl5Zp)E=LG&8|S8=ZZigj3oLoTrUr z>+aQV3I&HkQ`|IzORvNB{=oQQVBZC~xoD{TK;*^hbWhxa@3|egGQ+DYyX#9uUEM)= zFLRg5cRwDkxck*`N|Z|5iejjSr;W1}tUs5udSpI$@8X8bJV6&^(5>-e%oKN<@7>$b zZ&nRPKywAFe2!gqes0IL4^^#R8F$OF6{%2zCyhmelRnY2nokO=>xreBChbjT5Wv1m zPQ~PVOi;gd`_&g}SJ9sq0WqMlX}>b8$5W=^*%xS4!c;vaUT$nBmTudc4Wayb=I3BK zw=EU{#N-6&HLCN9`AghGB@GTwsf3r@ zzZ`eg9C5T34P$z*btRD8ls`g=kbMa=a)F&4Cs)7x)^ms{dxEYHn_KM`RXtks_xIZg z{GENY*@u^xD$H>W>ITjU8QbBtLP$A4$w8jUMPSwP^01j=+WUK7)#?!|*08V@Wu8x< zhY1p)B)?)U6U}5ZXk-fXOvmr}?Z!T!{~>@hrA%WrYnD#5Tz=F4JHvD$B}LbgL_|bH z-#}k6L>_Ia-7L*7Q?ZVI4p{IVaw(oL1_tk^*f(cKd@LqvmIgQpcBgJ_SnuFhJ}^DF zqW@4&!4VmE(0-L9 z%+5$Bg!X*1F3+wgmCm5Bb#Hc9bhN@5_3H2-JiEpiO6nsuUwCsW%S7w_mrp(Kt*x49 zo1IC;3M-epyT)Q&Z}sh7`Rsg%3^&!`vb)^OTf8I)*y+i6Ng>H`b=V;MJqV5wtW7iN zr9C3;KU7A?w#PZ3@{a}|DmvDL|K5%{F(|OH5k@*Y1_W$_>)QF}Sosci49C4M9xk>a zd=wQcMlNf#n2DC*#!_qTR7loEULMx5_S&5Pa+Mhwx?-pjAU5pRKiFR-I`S;bis7U( zGw(Z6*5BunN&gWpf9>ypbYGpN{<3X*x|Oh&VJi9Ckcmbx=0UZ@82w_?gYp5LU+O=H z3T3(Vy``RUW9hUs4zg;juYZ>rZrL8K=@wddAla(uh$TPiFFe`WNtG(5kK?9Fs$I&t zbc>{HE+&2o3=RtN8H~uEUXAUD2JcrA=d`)u z2^kZ0*p9Z=Jnx0GgPnifSarTJM_+PhjA%_1_p##$#e0kIcKEiVB5X)traE!E{ zf6l>R*cRwP&e)CcA(hNeuwR>1!(c!!IbkK+(J%d0@nXEjqN+5Td;Oi(SEn0mbCGLH z9}2JcMYF~tkP0s9s;LiWAD4Fsb9jFihCYO`C!sgv${}(R-jX`xXjet~!u;Hbmc5}3 z3PYyX;O=G;-<>C2pnZuyotQ4?6RTz#&APphC7kPiKhETZ?MmgY>`CQrLvHuY{^odi zxeJyy&F0I=vy8VmCymt!*bP>`b>BU7-0%GiM9hAzfo!XP-c2PC!Ua>WN(MUz9AP^Z z{dTWjT=+)Oo(peZ9hF=~UKM1)P89z8k%8*?AqR?0A=ci<_WN3H!T`rxCQeftD zE-Oul^SM)KJXAft(aX;HFze)xu7$|ucJ7})%+x#%7)Z@-$1{;!FiMs z%=)F~(d`&Kwg+|`=ty;5C@S(gJ2zOObMJA)Pu$m`-@WSfCCqyU%i5XR){`0mgfah6 zjJ9m0G)`=hc~fg2WmAw&Kj@T}4E1$6#y5QNE@p5?A$C``vj-*f(kurf$g6I!0U9RZ zOr5R4p;uNzDl(ZYStAN4GguVJ!>n zp zU^J({4P_nPz-PYFhDl^-9EA~`3Dgh>mGIB=v_91sW!ZnR_=jvlJqoTx=)KulH+` zU(e&b`#qN5k*o6V2l(yRUGQ`T1HRf945k^Cc2nAV9!qET#0tsoRs#hI{^cDFD7InJ zj}GYHON%x4#87|U>v_Zl4H|_%&0$4&`35;V%gfz5K20B#R?7c~PZli**_JQM zA!?Ll1A5EWAcx}>$xX2UEc6{_;#Q~wP zWA-QlWCnUyc&UC0=$ICjG0vWmUkc%heLd$m4G%8uy9)aKh3@fjll{ZD4Wu7Ak@yw; zh|DK*hUpBh)9|}gXk7oH$}ccl;>RBxN)Ve1W|YgoHS8Vh;(8MH>)oGgT05fW2z40P zwO1aEVOc!zAK`kT)=A8?*e-x^xh-MY?V4L+Nx^{;SJ>eabEL+5&k7!yYN2v7!$Xy| zEAJAS>w%pD?pGbST%^}9FQggO)?I(=5B3GRL|?MC)4Ltt*z(QG=DnAE-_KjLabsP$TFl*jZ%Nq48HrN2I}lA6l~0CDNQs$*eJ|jAma;q+!}w(&Rpx0=lq( zh0$zVBXEI{Q)qj%q|(SKKc1FBn|*>Jz!nM369!#?y+@9VN^GCwqq|=%i2cTZZm2&z zWm!1fJtOQ%1Mb0vd6q_Rk}5_48p5UKfEJt;S6YrDySowlAhA=~MuLHl3Rr)!Q6ob` zEUs1L@1`E|T<-+Iq@6vxdDCWoMWS}Lgs#`&?JQqiKf@8^UU-%iZ{t#qy!y!L_9 zK#A8VP)L;yei!>KQaZbaCmL~_TI-Y(rB_7N{+M0>0glhyshUk;-`zK6U>s7%Sf60( zEp0w^c%&|10dqh{s_=_pG5U&9_7_B2+V$H#l|cyv4_PDCkQb^>THQ-~rS$YfDRs+Hq6W z?@80gKV*s@UEk?q!xw!E7gI9$U{yM6XXuRXd|oo}`bIcSBM&*E#OF5i~xQYeH`FsmnLuBL^I_UhyuH#I?0pJ$NHx#@Y( z`+B`<(uN_7GhK4SC)lxGjy-6?(v-Ba9(_E}a_S-ZT;&mFLO}hDv|=X2(VCa4$nRMY z&m9i417mV1D@HKk)=5�MrHbYR_buu=L>f*wO=Er8~{qfkYT+HoHag8)VqJoC-#@ zNT})4xRE%sP-B9?xmL5!2Y8VLa?yj@Y@r1C)6o~9GF9nWG!SI2VJ$>ejtUE%Qv&r_ zYLgZ0h3iIrw7{TyurC(g^$XT%PP5`FB3aFpP&fM-8!J#3I_ujG?;7(Xv5ni%BjYP4 z^+oydy=)_&bdxYJx`X%G5PFkUB%3h6RiOs^F?#ojsB%DbfhqzGhuv4)S1%vw@PDyE z3xWF{Y^0>+=Wg! z{>z@$rD6ej*V- z^$zKIOWOfdN4~7@ndhru01+3cxwD&_Muyja({*O;-5VnF(e$WDALNStE{1{F#ts+VR{o zSlQ*@U=Du8fgKW$lU~)O)b6FS?H1SSnKVIC=DOvbo8IUvM zVf+U4YxG%qLGd%ew7Jp8>@U`ew+A#Q=2oJHNH@_f!WadS20$KZEZ+BHAvU@FB zzRCYN5r+Z#g`C^hrH$yW7ABstwjvMM*CHGzY41bbo2zy$6E8DAOPn zUnHG?e7?u7pQ}Kqbu1jEd+=mcGea4aL6V4g(m*b7x}z|ijsjb3e|tf-3&^JK{=sWz z8sqIu9jy)#J}n}cXqtXmkb-NDVPcAKn=G9uX42zYvufu_OCr>xJ=oTNp8WA5wEqvM z{r~m8;7_C>U68iRr@|rd7UYhON#(-S_+Uf>s)hhPU{{exlxc&eD diff --git a/public/index.html b/public/index.html deleted file mode 100644 index c570a09..0000000 --- a/public/index.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - <%= htmlWebpackPlugin.options.title %> - - - -
- -
- - - diff --git a/src/components/CustomDialog.vue b/src/components/CustomDialog.vue index fcedbed..4c5c29b 100644 --- a/src/components/CustomDialog.vue +++ b/src/components/CustomDialog.vue @@ -35,44 +35,43 @@ - - - + + + + diff --git a/src/components/HeaderPopup.vue b/src/components/HeaderPopup.vue index 0db45d4..98df5c6 100644 --- a/src/components/HeaderPopup.vue +++ b/src/components/HeaderPopup.vue @@ -1,35 +1,34 @@ - - - - + + + + diff --git a/src/components/MapCheckin.vue b/src/components/MapCheckin.vue index bff12c8..c505458 100644 --- a/src/components/MapCheckin.vue +++ b/src/components/MapCheckin.vue @@ -1,101 +1,101 @@ - - - - - + + + + + diff --git a/src/components/PopUp.vue b/src/components/PopUp.vue index b3c8a3e..d5bdc63 100644 --- a/src/components/PopUp.vue +++ b/src/components/PopUp.vue @@ -1,45 +1,45 @@ - - - - + + + + diff --git a/src/components/TableHistory.vue b/src/components/TableHistory.vue index 69733c1..a2e36d1 100644 --- a/src/components/TableHistory.vue +++ b/src/components/TableHistory.vue @@ -1,311 +1,311 @@ - - - - + + + + diff --git a/src/components/ToolBar.vue b/src/components/ToolBar.vue index 6c713ed..30d38c9 100644 --- a/src/components/ToolBar.vue +++ b/src/components/ToolBar.vue @@ -1,49 +1,49 @@ - - - - + + + + diff --git a/src/interface/index/Main.ts b/src/interface/index/Main.ts index 401821a..7fa0d3d 100644 --- a/src/interface/index/Main.ts +++ b/src/interface/index/Main.ts @@ -1,10 +1,10 @@ -interface DataOption { - id: string; - name: string; -} -interface FormRef { - date: object | null; - reason: object | null; - [key: string]: any; -} -export type { DataOption, FormRef }; +interface DataOption { + id: string + name: string +} +interface FormRef { + date: object | null + reason: object | null + [key: string]: any +} +export type { DataOption, FormRef } diff --git a/src/interface/response/checkin.ts b/src/interface/response/checkin.ts index 5745b88..edfebdb 100644 --- a/src/interface/response/checkin.ts +++ b/src/interface/response/checkin.ts @@ -1,7 +1,7 @@ -interface FormRef { - model: object | null; - useLocation: object | null; - [key: string]: any; -} - -export type { FormRef }; +interface FormRef { + model: object | null + useLocation: object | null + [key: string]: any +} + +export type { FormRef } diff --git a/src/main.ts b/src/main.ts index 6c599a5..16db08d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,29 +1,36 @@ -import { createApp } from "vue"; -import App from "./App.vue"; -import "./registerServiceWorker"; -import router from "./router"; -import { createPinia } from "pinia"; +import { createApp, defineAsyncComponent } from 'vue' +import App from './App.vue' +import './registerServiceWorker' +import router from './router' +import { createPinia } from 'pinia' -import { Quasar, Dialog, Notify, Loading } from "quasar"; -import '@quasar/extras/material-icons/material-icons.css'; -import './styles/quasar.sass'; -import quasarUserOptions from "./quasar-user-options"; -import VueDatePicker from "@vuepic/vue-datepicker"; -import "@vuepic/vue-datepicker/dist/main.css"; +import { Quasar, Dialog, Notify, Loading } from 'quasar' +import '@vuepic/vue-datepicker/dist/main.css' +import quasarUserOptions from './quasar-user-options' -const app = createApp(App); -const pinia = createPinia(); +import 'quasar/src/css/index.sass' +import th from "quasar/lang/th"; + + +const app = createApp(App) +const pinia = createPinia() + +app.use(router) +app.use(pinia) -app.use(router); -app.use(Quasar, quasarUserOptions); app.use(Quasar, { + ...quasarUserOptions, plugins: { Notify, Dialog, Loading, }, -}); -app.use(pinia); -app.component("VueDatePicker", VueDatePicker); + lang: th, +}) -app.mount("#app"); +app.component( + 'datepicker', + defineAsyncComponent(() => import('@vuepic/vue-datepicker')) +) + +app.mount('#app') diff --git a/src/quasar-user-options.ts b/src/quasar-user-options.ts index 5cc6de3..56dff8b 100644 --- a/src/quasar-user-options.ts +++ b/src/quasar-user-options.ts @@ -1,10 +1,11 @@ -import "./styles/quasar.sass"; -// import "quasar/dist/quasar.css"; -import "@quasar/extras/material-icons/material-icons.css"; -import { Dialog, Notify } from "quasar"; +// import "./styles/quasar.scss" +import '@quasar/extras/material-icons/material-icons.css' +import '@quasar/extras/material-icons-outlined/material-icons-outlined.css' +import '@quasar/extras/fontawesome-v5/fontawesome-v5.css' +import '@quasar/extras/mdi-v4/mdi-v4.css' // To be used on app.use(Quasar, { ... }) export default { config: {}, - plugins: { Dialog, Notify }, -}; + plugins: {}, +} diff --git a/src/registerServiceWorker.ts b/src/registerServiceWorker.ts index 76cede0..adbd55d 100644 --- a/src/registerServiceWorker.ts +++ b/src/registerServiceWorker.ts @@ -3,30 +3,32 @@ import { register } from 'register-service-worker' if (process.env.NODE_ENV === 'production') { - register(`${process.env.BASE_URL}service-worker.js`, { - ready () { + register('registerSW.js', { + ready() { console.log( 'App is being served from cache by a service worker.\n' + - 'For more details, visit https://goo.gl/AFskqB' + 'For more details, visit https://goo.gl/AFskqB' ) }, - registered () { + registered() { console.log('Service worker has been registered.') }, - cached () { + cached() { console.log('Content has been cached for offline use.') }, - updatefound () { + updatefound() { console.log('New content is downloading.') }, - updated () { + updated() { console.log('New content is available; please refresh.') }, - offline () { - console.log('No internet connection found. App is running in offline mode.') + offline() { + console.log( + 'No internet connection found. App is running in offline mode.' + ) }, - error (error) { + error(error) { console.error('Error during service worker registration:', error) - } + }, }) } diff --git a/src/router/index.ts b/src/router/index.ts index 8a59ac2..9a565ec 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,32 +1,42 @@ -import { createRouter, createWebHistory, RouteRecordRaw } from "vue-router"; -import HomeView from "../views/HomeView.vue"; -import HistoryView from "@/views/HistoryView.vue"; - -const routes: Array = [ - { - path: "/", - name: "home", - component: HomeView, - }, - { - path: "/about", - name: "about", - // route level code-splitting - // this generates a separate chunk (about.[hash].js) for this route - // which is lazy-loaded when the route is visited. - component: () => - import(/* webpackChunkName: "about" */ "../views/AboutView.vue"), - }, - { - path: "/history", - name: "history", - component: HistoryView, - }, -]; +import { createRouter, createWebHistory } from 'vue-router' +import HomeView from '@/views/HomeView.vue' const router = createRouter({ - history: createWebHistory(process.env.BASE_URL), - routes, -}); + history: createWebHistory(import.meta.env.BASE_URL), + routes: [ + { + path: '/', + name: 'home', + component: HomeView, + }, + { + path: '/about', + name: 'about', + // route level code-splitting + // this generates a separate chunk (about.[hash].js) for this route + // which is lazy-loaded when the route is visited. + component: () => import('@/views/AboutView.vue'), + }, + { + path: '/history', + name: 'history', + component: () => import('@/views/HistoryView.vue'), + }, + // { + // path: '/camera', + // name: 'camera', + // component: () => import('@/views/SampleCamera.vue'), + // }, + /** + * 404 Not Found + * ref: https://router.vuejs.org/guide/essentials/dynamic-matching.html#catch-all-404-not-found-route + */ + { + path: '/:pathMatch(.*)*', + name: 'NotFound', + component: () => import('@/views/ErrorNotFoundPage.vue'), + }, + ], +}) -export default router; +export default router diff --git a/src/shims-vue.d.ts b/src/shims-vue.d.ts index df9f4ba..01b57df 100644 --- a/src/shims-vue.d.ts +++ b/src/shims-vue.d.ts @@ -1 +1 @@ -declare module '*.vue'; +declare module '*.vue' diff --git a/src/stores/chekin.ts b/src/stores/chekin.ts index 10a083e..8506ab1 100644 --- a/src/stores/chekin.ts +++ b/src/stores/chekin.ts @@ -1,61 +1,61 @@ -import { defineStore } from "pinia"; -import { ref } from "vue"; - -export const useChekIn = defineStore("checkin", () => { - const rows = ref(); - - function fetchHistoryList(data: any) { - console.log(data); - const datalist = data.map((e: any) => ({ - no: e.no, - date: e.date, - in: e.in, - loIn: e.loIn, - out: e.out, - loOut: e.loOut, - status: e.status, - Morningstatus: convertStatus(e.Morningstatus), - AfternoonStatus: convertStatus(e.AfternoonStatus), - statusEdit: e.statusEdit, - statusEditName: convertStatusEdit(e.statusEdit), - })); - rows.value = datalist; - } - - function convertStatus(status: string) { - switch (status) { - case "1": - return "ขาดราชการ"; - case "2": - return "ปกติ"; - case "3": - return "สาย"; - default: - return ""; - } - } - function convertStatusEdit(val: string) { - switch (val) { - case "edit": - return "ขอแก้ไข"; - case "wait": - return "รออนุมัติ"; - case "approve": - return "อนุมัติ"; - } - } - function classColorStatus(val: string) { - switch (val) { - case "wait": - return "orange"; - case "approve": - return "green"; - } - } - - return { - rows, - fetchHistoryList, - classColorStatus, - }; -}); +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export const useChekIn = defineStore('checkin', () => { + const rows = ref() + + function fetchHistoryList(data: any) { + console.log(data) + const datalist = data.map((e: any) => ({ + no: e.no, + date: e.date, + in: e.in, + loIn: e.loIn, + out: e.out, + loOut: e.loOut, + status: e.status, + Morningstatus: convertStatus(e.Morningstatus), + AfternoonStatus: convertStatus(e.AfternoonStatus), + statusEdit: e.statusEdit, + statusEditName: convertStatusEdit(e.statusEdit), + })) + rows.value = datalist + } + + function convertStatus(status: string) { + switch (status) { + case '1': + return 'ขาดราชการ' + case '2': + return 'ปกติ' + case '3': + return 'สาย' + default: + return '' + } + } + function convertStatusEdit(val: string) { + switch (val) { + case 'edit': + return 'ขอแก้ไข' + case 'wait': + return 'รออนุมัติ' + case 'approve': + return 'อนุมัติ' + } + } + function classColorStatus(val: string) { + switch (val) { + case 'wait': + return 'orange' + case 'approve': + return 'green' + } + } + + return { + rows, + fetchHistoryList, + classColorStatus, + } +}) diff --git a/src/stores/mixin.ts b/src/stores/mixin.ts index 2e8096d..dda6fbd 100644 --- a/src/stores/mixin.ts +++ b/src/stores/mixin.ts @@ -1,122 +1,122 @@ -import { defineStore } from "pinia"; -import CustomComponent from "@/components/CustomDialog.vue"; -import { useQuasar } from "quasar"; -const $q = useQuasar(); +import { defineStore } from 'pinia' +import CustomComponent from '@/components/CustomDialog.vue' -export const useCounterMixin = defineStore("mixin", () => { +export const useCounterMixin = defineStore('mixin', () => { function date2Thai(srcDate: Date, isFullMonth = false, isTime = false) { if (srcDate == null) { - return null; - ` - `; + return null + ;` + ` } - const date = new Date(srcDate); - const isValidDate = Boolean(+date); - if (!isValidDate) return srcDate.toString(); - if (isValidDate && date.getFullYear() < 1000) return srcDate.toString(); + const date = new Date(srcDate) + const isValidDate = Boolean(+date) + if (!isValidDate) return srcDate.toString() + if (isValidDate && date.getFullYear() < 1000) return srcDate.toString() const fullMonthThai = [ - "มกราคม", - "กุมภาพันธ์", - "มีนาคม", - "เมษายน", - "พฤษภาคม", - "มิถุนายน", - "กรกฎาคม", - "สิงหาคม", - "กันยายน", - "ตุลาคม", - "พฤศจิกายน", - "ธันวาคม", - ]; + 'มกราคม', + 'กุมภาพันธ์', + 'มีนาคม', + 'เมษายน', + 'พฤษภาคม', + 'มิถุนายน', + 'กรกฎาคม', + 'สิงหาคม', + 'กันยายน', + 'ตุลาคม', + 'พฤศจิกายน', + 'ธันวาคม', + ] const abbrMonthThai = [ - "ม.ค.", - "ก.พ.", - "มี.ค.", - "เม.ย.", - "พ.ค.", - "มิ.ย.", - "ก.ค.", - "ส.ค.", - "ก.ย.", - "ต.ค.", - "พ.ย.", - "ธ.ค.", - ]; - let dstYear = 0; + 'ม.ค.', + 'ก.พ.', + 'มี.ค.', + 'เม.ย.', + 'พ.ค.', + 'มิ.ย.', + 'ก.ค.', + 'ส.ค.', + 'ก.ย.', + 'ต.ค.', + 'พ.ย.', + 'ธ.ค.', + ] + let dstYear = 0 if (date.getFullYear() > 2500) { - dstYear = date.getFullYear(); + dstYear = date.getFullYear() } else { - dstYear = date.getFullYear() + 543; + dstYear = date.getFullYear() + 543 } - let dstMonth = ""; + let dstMonth = '' if (isFullMonth) { - dstMonth = fullMonthThai[date.getMonth()]; + dstMonth = fullMonthThai[date.getMonth()] } else { - dstMonth = abbrMonthThai[date.getMonth()]; + dstMonth = abbrMonthThai[date.getMonth()] } - let dstTime = ""; + let dstTime = '' if (isTime) { - const H = date.getHours().toString().padStart(2, "0"); - const M = date.getMinutes().toString().padStart(2, "0"); + const H = date.getHours().toString().padStart(2, '0') + const M = date.getMinutes().toString().padStart(2, '0') // const S = date.getSeconds().toString().padStart(2, "0") // dstTime = " " + H + ":" + M + ":" + S + " น." - dstTime = " " + H + ":" + M + " น."; + dstTime = ' ' + H + ':' + M + ' น.' } return ( - date.getDate().toString().padStart(2, "0") + - " " + + date.getDate().toString().padStart(2, '0') + + ' ' + dstMonth + - " " + + ' ' + dstYear + dstTime - ); + ) } + function covertDateObject(date: string) { if (date) { - const dateParts = date.split("/"); + const dateParts = date.split('/') // ประกาศตัวแปรเพื่อเก็บค่าวันที่, เดือน, และ ปี - const day = parseInt(dateParts[0], 10); - const month = parseInt(dateParts[1], 10) - 1; - const year = parseInt(dateParts[2], 10) + 2500; + const day = parseInt(dateParts[0], 10) + const month = parseInt(dateParts[1], 10) - 1 + const year = parseInt(dateParts[2], 10) + 2500 // สร้างอ็อบเจ็กต์ Date ด้วยค่าที่ได้ - const dateObject = new Date(year, month, day); - return date2Thai(dateObject); + const dateObject = new Date(year, month, day) + return date2Thai(dateObject) } } - type OkCallback = () => void; - type CancelCallback = () => void; - const dialogConfirm = ( + + type OkCallback = () => void + type CancelCallback = () => void + function dialogConfirm( q: any, ok?: OkCallback, title?: string, // ถ้ามี cancel action ใส่เป็น null desc?: string, // ถ้ามี cancel action ใส่เป็น null cancel?: CancelCallback - ) => { + ) { q.dialog({ component: CustomComponent, componentProps: { - title: title && title != null ? title : "ยืนยันการบันทึก", + title: title && title != null ? title : 'ยืนยันการบันทึก', message: desc && desc != null ? desc - : "ต้องการยืนยันการบันทึกข้อมูลนี้ใช่หรือไม่?", - icon: "info", - color: "public", - textOk: "ตกลง", + : 'ต้องการยืนยันการบันทึกข้อมูลนี้ใช่หรือไม่?', + icon: 'info', + color: 'public', + textOk: 'ตกลง', onlycancel: false, }, }) .onOk(() => { - if (ok) ok(); + if (ok) ok() }) .onCancel(() => { - if (cancel) cancel(); - }); - }; + if (cancel) cancel() + }) + } return { date2Thai, covertDateObject, dialogConfirm, - }; -}); + } +}) diff --git a/src/styles/quasar.variables.sass b/src/style/quasar-variables.sass similarity index 100% rename from src/styles/quasar.variables.sass rename to src/style/quasar-variables.sass diff --git a/src/styles/quasar.sass b/src/styles/quasar.sass deleted file mode 100644 index 1ba19fe..0000000 --- a/src/styles/quasar.sass +++ /dev/null @@ -1,3 +0,0 @@ -@import './quasar.variables.sass' -@import '~quasar-styl' -// @import '~quasar-addon-styl' diff --git a/src/views/ErrorNotFoundPage.vue b/src/views/ErrorNotFoundPage.vue new file mode 100644 index 0000000..1be87ac --- /dev/null +++ b/src/views/ErrorNotFoundPage.vue @@ -0,0 +1,27 @@ + + + diff --git a/src/views/HistoryView.vue b/src/views/HistoryView.vue index cb68efe..1e0a737 100644 --- a/src/views/HistoryView.vue +++ b/src/views/HistoryView.vue @@ -1,103 +1,103 @@ - - + + diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index e2fcea4..b47b55b 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,202 +1,134 @@