diff --git a/Document/DFD.drawio b/Document/DFD.drawio new file mode 100644 index 0000000..36b6e2a --- /dev/null +++ b/Document/DFD.drawio @@ -0,0 +1,160 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Services/client/package.json b/Services/client/package.json index 1b2b1ab..86cf8ca 100644 --- a/Services/client/package.json +++ b/Services/client/package.json @@ -20,9 +20,11 @@ "@tsconfig/node18": "^18.2.2", "axios": "^1.6.2", "keycloak-js": "^23.0.0", + "mime": "^4.0.0", "nanoid": "^5.0.4", "pinia": "^2.1.7", "quasar": "^2.14.0", + "socket.io-client": "^4.7.2", "vite-plugin-pwa": "^0.17.2", "vue": "^3.3.9", "vue-router": "^4.2.5" @@ -32,6 +34,7 @@ "@quasar/vite-plugin": "^1.6.0", "@rushstack/eslint-patch": "^1.6.0", "@types/jsdom": "^21.1.6", + "@types/mime-types": "^2.1.4", "@types/node": "^20.10.0", "@vitejs/plugin-vue": "^4.5.0", "@vitejs/plugin-vue-jsx": "^3.1.0", diff --git a/Services/client/pnpm-lock.yaml b/Services/client/pnpm-lock.yaml index 9a7f93b..6ee3805 100644 --- a/Services/client/pnpm-lock.yaml +++ b/Services/client/pnpm-lock.yaml @@ -17,6 +17,9 @@ dependencies: keycloak-js: specifier: ^23.0.0 version: 23.0.0 + mime: + specifier: ^4.0.0 + version: 4.0.0 nanoid: specifier: ^5.0.4 version: 5.0.4 @@ -26,6 +29,9 @@ dependencies: quasar: specifier: ^2.14.0 version: 2.14.0 + socket.io-client: + specifier: ^4.7.2 + version: 4.7.2 vite-plugin-pwa: specifier: ^0.17.2 version: 0.17.2(vite@5.0.2)(workbox-build@7.0.0)(workbox-window@7.0.0) @@ -49,6 +55,9 @@ devDependencies: '@types/jsdom': specifier: ^21.1.6 version: 21.1.6 + '@types/mime-types': + specifier: ^2.1.4 + version: 2.1.4 '@types/node': specifier: ^20.10.0 version: 20.10.0 @@ -1801,6 +1810,10 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true + /@socket.io/component-emitter@3.1.0: + resolution: {integrity: sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==} + dev: false + /@surma/rollup-plugin-off-main-thread@2.2.3: resolution: {integrity: sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==} dependencies: @@ -1840,6 +1853,10 @@ packages: resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} dev: true + /@types/mime-types@2.1.4: + resolution: {integrity: sha512-lfU4b34HOri+kAY5UheuFMWPDOI+OPceBSHZKp69gEyTL/mmJ4cnU6Y/rlme3UL3GyOn6Y42hyIEw0/q8sWx5w==} + dev: true + /@types/node@20.10.0: resolution: {integrity: sha512-D0WfRmU9TQ8I9PFx9Yc+EBHw+vSpIub4IDvQivcp26PtPrdMGAq5SDcpXEo/epqa/DXotVpekHiLNTg3iaKXBQ==} dependencies: @@ -2823,6 +2840,25 @@ packages: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} dev: true + /engine.io-client@6.5.3: + resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-parser: 5.2.1 + ws: 8.11.0 + xmlhttprequest-ssl: 2.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /engine.io-parser@5.2.1: + resolution: {integrity: sha512-9JktcM3u18nU9N2Lz3bWeBgxVgOKpw7yhRaoxQA3FUDZzzw+9WlA6p4G4u0RixNkg14fH7EfEc/RhpurtiROTQ==} + engines: {node: '>=10.0.0'} + dev: false + /entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -3967,6 +4003,12 @@ packages: dependencies: mime-db: 1.52.0 + /mime@4.0.0: + resolution: {integrity: sha512-pzhgdeqU5pJ9t5WK9m4RT4GgGWqYJylxUf62Yb9datXRwdcw5MjiD1BYI5evF8AgTXN9gtKX3CFLvCUL5fAhEA==} + engines: {node: '>=16'} + hasBin: true + dev: false + /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} @@ -4709,6 +4751,30 @@ packages: engines: {node: '>=8'} dev: true + /socket.io-client@4.7.2: + resolution: {integrity: sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + engine.io-client: 6.5.3 + socket.io-parser: 4.2.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /socket.io-parser@4.2.4: + resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==} + engines: {node: '>=10.0.0'} + dependencies: + '@socket.io/component-emitter': 3.1.0 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + dev: false + /source-map-js@1.0.2: resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} engines: {node: '>=0.10.0'} @@ -5676,6 +5742,19 @@ packages: /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + /ws@8.11.0: + resolution: {integrity: sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + /ws@8.14.2: resolution: {integrity: sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==} engines: {node: '>=10.0.0'} @@ -5703,6 +5782,11 @@ packages: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} dev: true + /xmlhttprequest-ssl@2.0.0: + resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==} + engines: {node: '>=0.4.0'} + dev: false + /yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} diff --git a/Services/client/src/assets/logo-edm.png b/Services/client/src/assets/logo-edm.png new file mode 100644 index 0000000..9f0aa04 Binary files /dev/null and b/Services/client/src/assets/logo-edm.png differ diff --git a/Services/client/src/components/DialogDelete.vue b/Services/client/src/components/DialogDelete.vue index c6bf7e5..9779b9c 100644 --- a/Services/client/src/components/DialogDelete.vue +++ b/Services/client/src/components/DialogDelete.vue @@ -21,15 +21,22 @@ const props = withDefaults( > - - แจ้งเตือนการลบ - +
+
+
+ +
+
+
+
ยืนยันการลบข้อมูล
+

ต้องการยืนยันการลบข้อมูลนี้หรือไม่

+
+
- - - ถ้าดำเนินการต่อจะทำการลบ - - diff --git a/Services/client/src/components/FileForm.vue b/Services/client/src/components/FileForm.vue index 8fa6a98..5289238 100644 --- a/Services/client/src/components/FileForm.vue +++ b/Services/client/src/components/FileForm.vue @@ -34,9 +34,14 @@ const emit = defineEmits([ 'update:keyword', 'update:category', 'filechange', + 'reset', 'submit', ]) +defineExpose({ + reset, +}) + function keydown(e: KeyboardEvent) { if (e.key === 'Escape' && props.open === true) { emit('update:open', false) @@ -50,6 +55,7 @@ function reset() { emit('update:description', '') emit('update:keyword', '') emit('update:category', '') + emit('reset') } function submit() { @@ -61,7 +67,6 @@ function submit() { keyword: props.keyword, category: props.category, }) - emit('update:open', !open), reset() } const createKeyword = ((val, done) => { @@ -106,12 +111,13 @@ const file = ref() class="q-pa-md" side="right" tabindex="0" + v-click-outside="() => $emit('update:open', false)" :width="300" :breakpoint="500" :model-value="open" @update:model-value="(v) => $emit('update:open', v)" > - + diff --git a/Services/client/src/components/FileIcon.vue b/Services/client/src/components/FileIcon.vue index 0de7cd0..c8c6957 100644 --- a/Services/client/src/components/FileIcon.vue +++ b/Services/client/src/components/FileIcon.vue @@ -1,20 +1,45 @@