([
+ {
+ id: 1,
+ sender: 'ท',
+ body: 'ขอแก้ไขข้อมูลทะเบียนประวัติ',
+ timereceive: '13/12/2565'
+ }
+])
+
+export { menuList, options, notiList }
+export type { menuType, notiType, optionType }
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..eec266f
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,37 @@
+import { createApp } from 'vue'
+import { createPinia } from 'pinia'
+import { Dialog, Notify, Quasar } from 'quasar'
+
+import App from './App.vue'
+import router from './router'
+import quasarUserOptions from './quasar-user-options'
+
+import 'quasar/src/css/index.sass'
+import th from 'quasar/lang/th'
+
+// import './assets/main.css'
+
+const app = createApp(App)
+const pinia = createPinia()
+
+app.use(pinia)
+app.use(router)
+
+app.use(
+ Quasar,
+ {
+ plugins: {
+ Notify,
+ Dialog
+ }, // import Quasar plugins and add here
+ config: {
+ notify: {
+ /* look at QuasarConfOptions from the API card */
+ }
+ },
+ lang: th
+ },
+ quasarUserOptions
+)
+
+app.mount('#app')
diff --git a/src/modules/01_meta/interface/index/main.ts b/src/modules/01_meta/interface/index/main.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/01_meta/interface/request/index.ts b/src/modules/01_meta/interface/request/index.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/01_meta/interface/response/index.ts b/src/modules/01_meta/interface/response/index.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/01_meta/router.ts b/src/modules/01_meta/router.ts
new file mode 100644
index 0000000..b9982e7
--- /dev/null
+++ b/src/modules/01_meta/router.ts
@@ -0,0 +1,13 @@
+const Meta = () => import('@/modules/01_meta/views/Meta01View.vue')
+
+export default [
+ {
+ path: '/meta01',
+ name: 'meta01',
+ component: Meta,
+ meta: {
+ Auth: true
+ // Key: [7]
+ }
+ }
+]
diff --git a/src/modules/01_meta/store.ts b/src/modules/01_meta/store.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/01_meta/views/Meta01View.vue b/src/modules/01_meta/views/Meta01View.vue
new file mode 100644
index 0000000..17ad0af
--- /dev/null
+++ b/src/modules/01_meta/views/Meta01View.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about META01
+
+
+
+
diff --git a/src/modules/02_meta/interface/index/main.ts b/src/modules/02_meta/interface/index/main.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/02_meta/interface/request/index.ts b/src/modules/02_meta/interface/request/index.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/02_meta/interface/response/index.ts b/src/modules/02_meta/interface/response/index.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/02_meta/router.ts b/src/modules/02_meta/router.ts
new file mode 100644
index 0000000..4b1724a
--- /dev/null
+++ b/src/modules/02_meta/router.ts
@@ -0,0 +1,13 @@
+const Meta = () => import('@/modules/02_meta/views/Meta02View.vue')
+
+export default [
+ {
+ path: '/meta02',
+ name: 'meta02',
+ component: Meta,
+ meta: {
+ Auth: true
+ // Key: [7]
+ }
+ }
+]
diff --git a/src/modules/02_meta/store.ts b/src/modules/02_meta/store.ts
new file mode 100644
index 0000000..e69de29
diff --git a/src/modules/02_meta/views/Meta02View.vue b/src/modules/02_meta/views/Meta02View.vue
new file mode 100644
index 0000000..7f8e8e8
--- /dev/null
+++ b/src/modules/02_meta/views/Meta02View.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about META02
+
+
+
+
diff --git a/src/quasar-user-options.ts b/src/quasar-user-options.ts
new file mode 100644
index 0000000..a7aaf49
--- /dev/null
+++ b/src/quasar-user-options.ts
@@ -0,0 +1,11 @@
+// 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: {}
+}
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..c9a28d6
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,60 @@
+import { createRouter, createWebHistory } from 'vue-router'
+import HomeView from '../views/HomeView.vue'
+import Meta01 from '@/modules/01_meta/router'
+import Meta02 from '@/modules/02_meta/router'
+
+const MainLayout = () => import('@/views/MainLayout.vue')
+
+const router = createRouter({
+ history: createWebHistory(import.meta.env.BASE_URL),
+ routes: [
+ {
+ path: '/',
+ name: 'home',
+ component: MainLayout,
+ children: [
+ {
+ path: '/',
+ name: 'dashboard',
+ component: HomeView,
+ meta: {
+ Auth: true,
+ Key: [7]
+ }
+ },
+ ...Meta01,
+ ...Meta02
+ ]
+ }
+ /**
+ * 404 Not Found
+ * ref: https://router.vuejs.org/guide/essentials/dynamic-matching.html#catch-all-404-not-found-route
+ */
+ // {
+ // // path: "/:catchAll(.*)*", // TODO: ใช้ pathMatch แทนตามในเอกสารแนะนำ คงไว้เผื่อจำเป็น
+ // path: "/:pathMatch(.*)*",
+ // component: Error404NotFound,
+ // },
+ ]
+})
+
+// const router = createRouter({
+// 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')
+// }
+// ]
+// })
+
+export default router
diff --git a/src/stores/counter.ts b/src/stores/counter.ts
new file mode 100644
index 0000000..b6757ba
--- /dev/null
+++ b/src/stores/counter.ts
@@ -0,0 +1,12 @@
+import { ref, computed } from 'vue'
+import { defineStore } from 'pinia'
+
+export const useCounterStore = defineStore('counter', () => {
+ const count = ref(0)
+ const doubleCount = computed(() => count.value * 2)
+ function increment() {
+ count.value++
+ }
+
+ return { count, doubleCount, increment }
+})
diff --git a/src/style/quasar-variables.sass b/src/style/quasar-variables.sass
new file mode 100644
index 0000000..70c79c4
--- /dev/null
+++ b/src/style/quasar-variables.sass
@@ -0,0 +1,87 @@
+// FILE (create it): src/quasar-variables.sass
+
+$primary: #02A998
+$secondary: #016987
+$accent: #9C27B0
+
+// $dark: #1D1D1D
+$dark: #35473C
+
+$positive: #21BA45
+$negative: #C10015
+$info: #31CCEC
+$warning: #F2C037
+
+$add: #00aa86
+.text-add
+ color: $add !important
+.bg-add
+ background: $add !important
+
+$edit: #019fc4
+.text-edit
+ color: $edit !important
+.bg-edit
+ background: $edit !important
+
+$public: #016987
+.text-public
+ color: $public !important
+.bg-public
+ background: $public !important
+
+$save: #4154b3
+.text-save
+ color: $save !important
+.bg-save
+ background: $save !important
+
+$nativetab: #c8d3db
+.text-nativetab
+ color: $nativetab !important
+.bg-nativetab
+ background: $nativetab !important
+
+$activetab: #4a5568
+.text-activetab
+ color: $activetab !important
+.bg-activetab
+ background: $activetab !important
+
+.inputgreen .q-field__prefix,
+.inputgreen .q-field__suffix,
+.inputgreen .q-field__input,
+.inputgreen .q-field__native
+
+ color: rgb(6, 136, 77)
+
+@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+Thai:wght@100;200;300;400;500;600;700;800;900&display=swap')
+
+$noto-thai: 'Noto Sans Thai', sans-serif
+
+#azay-app,
+div
+ font-family: $noto-thai !important
+ text-rendering: optimizeLegibility
+ -webkit-font-smoothing: antialiased
+ -moz-osx-font-smoothing: grayscale
+
+$separator-color: #EDEDED !default
+
+.table_ellipsis
+ max-width: 200px
+ white-space: nowrap
+ overflow: hidden
+ text-overflow: ellipsis
+
+.table_ellipsis:hover
+ word-wrap: break-word
+ overflow: visible
+ white-space: normal
+
+$muti-tab: #87d4cc
+.text-muti-tab
+ color: $muti-tab !important
+.bg-muti-tab
+ background: $muti-tab !important
+
\ No newline at end of file
diff --git a/src/views/AboutView.vue b/src/views/AboutView.vue
new file mode 100644
index 0000000..756ad2a
--- /dev/null
+++ b/src/views/AboutView.vue
@@ -0,0 +1,15 @@
+
+
+
This is an about page
+
+
+
+
diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue
new file mode 100644
index 0000000..d5c0217
--- /dev/null
+++ b/src/views/HomeView.vue
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/src/views/MainLayout.vue b/src/views/MainLayout.vue
new file mode 100644
index 0000000..91d182b
--- /dev/null
+++ b/src/views/MainLayout.vue
@@ -0,0 +1,402 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ notiList.length }}
+
+
+
+
+
+
+
+ {{ n.sender }}
+
+
+
+ {{ n.body }}
+ {{
+ n.timereceive
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{
+ fullname
+ }}
+ เจ้าหน้าที่ ก.ก.
+
+
+
+
+
+
+
+
+
+
+ {{ fullname }}
+
+
+
+
+
+
+
+
เลือกโหมด
+
+
+
+
+
+
+ {{ op.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ระบบทรัพยากรบุคคล
+
+
กรุงเทพมหานคร
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tsconfig.app.json b/tsconfig.app.json
new file mode 100644
index 0000000..cdbea1d
--- /dev/null
+++ b/tsconfig.app.json
@@ -0,0 +1,12 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.web.json",
+ "include": ["env.d.ts", "src/**/*", "src/**/*.vue"],
+ "exclude": ["src/**/__tests__/*"],
+ "compilerOptions": {
+ "composite": true,
+ "baseUrl": ".",
+ "paths": {
+ "@/*": ["./src/*"]
+ }
+ }
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..100cf6a
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,14 @@
+{
+ "files": [],
+ "references": [
+ {
+ "path": "./tsconfig.node.json"
+ },
+ {
+ "path": "./tsconfig.app.json"
+ },
+ {
+ "path": "./tsconfig.vitest.json"
+ }
+ ]
+}
diff --git a/tsconfig.node.json b/tsconfig.node.json
new file mode 100644
index 0000000..424084a
--- /dev/null
+++ b/tsconfig.node.json
@@ -0,0 +1,8 @@
+{
+ "extends": "@vue/tsconfig/tsconfig.node.json",
+ "include": ["vite.config.*", "vitest.config.*", "cypress.config.*", "playwright.config.*"],
+ "compilerOptions": {
+ "composite": true,
+ "types": ["node"]
+ }
+}
diff --git a/tsconfig.vitest.json b/tsconfig.vitest.json
new file mode 100644
index 0000000..d080d61
--- /dev/null
+++ b/tsconfig.vitest.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.app.json",
+ "exclude": [],
+ "compilerOptions": {
+ "composite": true,
+ "lib": [],
+ "types": ["node", "jsdom"]
+ }
+}
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 0000000..503d8e0
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,22 @@
+import { fileURLToPath, URL } from 'node:url'
+
+import { defineConfig } from 'vite'
+import vue from '@vitejs/plugin-vue'
+import vueJsx from '@vitejs/plugin-vue-jsx'
+import { quasar, transformAssetUrls } from '@quasar/vite-plugin'
+
+// https://vitejs.dev/config/
+export default defineConfig({
+ plugins: [
+ vue(),
+ quasar({
+ sassVariables: 'src/style/quasar-variables.sass'
+ }),
+ vueJsx()
+ ],
+ resolve: {
+ alias: {
+ '@': fileURLToPath(new URL('./src', import.meta.url))
+ }
+ }
+})
diff --git a/vitest.config.ts b/vitest.config.ts
new file mode 100644
index 0000000..a2f57a5
--- /dev/null
+++ b/vitest.config.ts
@@ -0,0 +1,15 @@
+import { fileURLToPath } from 'node:url'
+import { mergeConfig } from 'vite'
+import { configDefaults, defineConfig } from 'vitest/config'
+import viteConfig from './vite.config'
+
+export default mergeConfig(
+ viteConfig,
+ defineConfig({
+ test: {
+ environment: 'jsdom',
+ exclude: [...configDefaults.exclude, 'e2e/*'],
+ root: fileURLToPath(new URL('./', import.meta.url))
+ }
+ })
+)