diff --git a/package.json b/package.json
index a90fe591..9638bb29 100644
--- a/package.json
+++ b/package.json
@@ -17,13 +17,14 @@
"dependencies": {
"@peaceroad/markdown-it-figure-with-p-caption": "^0.11.0",
"@quasar/extras": "^1.16.17",
- "@tato30/vue-pdf": "^1.11.0",
+ "@tato30/vue-pdf": "^1.11.3",
"@vuepic/vue-datepicker": "^8.8.1",
"apexcharts": "^4.5.0",
- "axios": "^1.7.4",
+ "axios": "^1.8.4",
"cropperjs": "^1.6.2",
+ "dayjs": "^1.11.13",
"highlight.js": "^11.11.1",
- "keycloak-js": "^25.0.4",
+ "keycloak-js": "^25.0.6",
"markdown-it": "^14.1.0",
"markdown-it-anchor": "^9.2.0",
"markdown-it-highlightjs": "^4.2.0",
@@ -31,42 +32,41 @@
"markdown-it-html5-media": "^0.7.1",
"markdown-it-image-figures": "^2.1.1",
"markdown-it-video": "^0.6.3",
- "mime": "^4.0.4",
+ "mime": "^4.0.6",
"moment": "^2.30.1",
"number-to-words": "^1.2.4",
- "open-props": "^1.7.5",
- "pinia": "^2.2.2",
+ "open-props": "^1.7.14",
+ "pinia": "^2.3.1",
"quasar": "^2.18.1",
- "signature_pad": "^5.0.2",
- "socket.io-client": "^4.7.5",
+ "signature_pad": "^5.0.7",
"tesseract.js": "^5.1.1",
"thai-baht-text": "^2.0.5",
"udsv": "^0.6.0",
"uuid": "^10.0.0",
- "vue": "^3.4.38",
+ "vue": "^3.5.13",
"vue-dragscroll": "^4.0.6",
"vue-i18n": "^11.1.2",
"vue-pdf": "^4.3.0",
- "vue-router": "^4.4.3",
+ "vue-router": "^4.5.0",
"vue-tsc": "^2.2.8",
"vue3-apexcharts": "^1.8.0"
},
"devDependencies": {
- "@faker-js/faker": "^9.3.0",
- "@iconify/vue": "^4.1.2",
+ "@faker-js/faker": "^9.6.0",
+ "@iconify/vue": "^4.3.0",
"@intlify/unplugin-vue-i18n": "^6.0.5",
- "@playwright/test": "^1.46.1",
+ "@playwright/test": "^1.51.1",
"@quasar/app-vite": "^2.2.0",
"@types/markdown-it": "^14.1.2",
"@types/markdown-it-highlightjs": "^3.3.4",
- "@types/node": "^20.16.1",
+ "@types/node": "^20.17.28",
"@types/number-to-words": "^1.2.3",
"@types/uuid": "^10.0.0",
- "autoprefixer": "^10.4.20",
+ "autoprefixer": "^10.4.21",
"dotenv": "^16.4.7",
- "prettier": "^3.3.3",
+ "prettier": "^3.5.3",
"typescript": "^5.5.4",
- "vue-component-type-helpers": "^2.1.10"
+ "vue-component-type-helpers": "^2.2.8"
},
"engines": {
"node": "^28 || ^26 || ^24 || ^22 || ^20 || ^18",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 2e6b8909..7cb78cc6 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -15,26 +15,29 @@ importers:
specifier: ^1.16.17
version: 1.16.17
'@tato30/vue-pdf':
- specifier: ^1.11.0
- version: 1.11.0(vue@3.4.38(typescript@5.5.4))
+ specifier: ^1.11.3
+ version: 1.11.3(vue@3.5.13(typescript@5.5.4))
'@vuepic/vue-datepicker':
specifier: ^8.8.1
- version: 8.8.1(vue@3.4.38(typescript@5.5.4))
+ version: 8.8.1(vue@3.5.13(typescript@5.5.4))
apexcharts:
specifier: ^4.5.0
version: 4.5.0
axios:
- specifier: ^1.7.4
- version: 1.7.4
+ specifier: ^1.8.4
+ version: 1.8.4
cropperjs:
specifier: ^1.6.2
version: 1.6.2
+ dayjs:
+ specifier: ^1.11.13
+ version: 1.11.13
highlight.js:
specifier: ^11.11.1
version: 11.11.1
keycloak-js:
- specifier: ^25.0.4
- version: 25.0.4
+ specifier: ^25.0.6
+ version: 25.0.6
markdown-it:
specifier: ^14.1.0
version: 14.1.0
@@ -57,8 +60,8 @@ importers:
specifier: ^0.6.3
version: 0.6.3
mime:
- specifier: ^4.0.4
- version: 4.0.4
+ specifier: ^4.0.6
+ version: 4.0.6
moment:
specifier: ^2.30.1
version: 2.30.1
@@ -66,20 +69,17 @@ importers:
specifier: ^1.2.4
version: 1.2.4
open-props:
- specifier: ^1.7.5
- version: 1.7.5
+ specifier: ^1.7.14
+ version: 1.7.14
pinia:
- specifier: ^2.2.2
- version: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4))
+ specifier: ^2.3.1
+ version: 2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4))
quasar:
specifier: ^2.18.1
version: 2.18.1
signature_pad:
- specifier: ^5.0.2
- version: 5.0.2
- socket.io-client:
- specifier: ^4.7.5
- version: 4.7.5
+ specifier: ^5.0.7
+ version: 5.0.7
tesseract.js:
specifier: ^5.1.1
version: 5.1.1
@@ -93,42 +93,42 @@ importers:
specifier: ^10.0.0
version: 10.0.0
vue:
- specifier: ^3.4.38
- version: 3.4.38(typescript@5.5.4)
+ specifier: ^3.5.13
+ version: 3.5.13(typescript@5.5.4)
vue-dragscroll:
specifier: ^4.0.6
version: 4.0.6(typescript@5.5.4)
vue-i18n:
specifier: ^11.1.2
- version: 11.1.2(vue@3.4.38(typescript@5.5.4))
+ version: 11.1.2(vue@3.5.13(typescript@5.5.4))
vue-pdf:
specifier: ^4.3.0
version: 4.3.0(webpack@4.47.0)
vue-router:
- specifier: ^4.4.3
- version: 4.4.3(vue@3.4.38(typescript@5.5.4))
+ specifier: ^4.5.0
+ version: 4.5.0(vue@3.5.13(typescript@5.5.4))
vue-tsc:
specifier: ^2.2.8
version: 2.2.8(typescript@5.5.4)
vue3-apexcharts:
specifier: ^1.8.0
- version: 1.8.0(apexcharts@4.5.0)(vue@3.4.38(typescript@5.5.4))
+ version: 1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.5.4))
devDependencies:
'@faker-js/faker':
- specifier: ^9.3.0
- version: 9.3.0
+ specifier: ^9.6.0
+ version: 9.6.0
'@iconify/vue':
- specifier: ^4.1.2
- version: 4.1.2(vue@3.4.38(typescript@5.5.4))
+ specifier: ^4.3.0
+ version: 4.3.0(vue@3.5.13(typescript@5.5.4))
'@intlify/unplugin-vue-i18n':
specifier: ^6.0.5
- version: 6.0.5(@vue/compiler-dom@3.5.13)(eslint@9.23.0)(rollup@4.37.0)(typescript@5.5.4)(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))
+ version: 6.0.5(@vue/compiler-dom@3.5.13)(eslint@9.23.0)(rollup@4.37.0)(typescript@5.5.4)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))
'@playwright/test':
- specifier: ^1.46.1
- version: 1.46.1
+ specifier: ^1.51.1
+ version: 1.51.1
'@quasar/app-vite':
specifier: ^2.2.0
- version: 2.2.0(@types/node@20.16.1)(eslint@9.23.0)(pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(quasar@2.18.1)(rollup@4.37.0)(sass@1.77.8)(terser@5.31.0)(typescript@5.5.4)(vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))
+ version: 2.2.0(@types/node@20.17.28)(eslint@9.23.0)(pinia@2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)))(quasar@2.18.1)(rollup@4.37.0)(sass@1.77.8)(terser@5.31.0)(typescript@5.5.4)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))
'@types/markdown-it':
specifier: ^14.1.2
version: 14.1.2
@@ -136,8 +136,8 @@ importers:
specifier: ^3.3.4
version: 3.3.4
'@types/node':
- specifier: ^20.16.1
- version: 20.16.1
+ specifier: ^20.17.28
+ version: 20.17.28
'@types/number-to-words':
specifier: ^1.2.3
version: 1.2.3
@@ -145,53 +145,36 @@ importers:
specifier: ^10.0.0
version: 10.0.0
autoprefixer:
- specifier: ^10.4.20
- version: 10.4.20(postcss@8.5.3)
+ specifier: ^10.4.21
+ version: 10.4.21(postcss@8.5.3)
dotenv:
specifier: ^16.4.7
version: 16.4.7
prettier:
- specifier: ^3.3.3
- version: 3.3.3
+ specifier: ^3.5.3
+ version: 3.5.3
typescript:
specifier: ^5.5.4
version: 5.5.4
vue-component-type-helpers:
- specifier: ^2.1.10
- version: 2.1.10
+ specifier: ^2.2.8
+ version: 2.2.8
packages:
- '@babel/helper-string-parser@7.24.1':
- resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-identifier@7.22.20':
- resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-validator-identifier@7.25.9':
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
- '@babel/parser@7.24.7':
- resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==}
- engines: {node: '>=6.0.0'}
- hasBin: true
-
'@babel/parser@7.27.0':
resolution: {integrity: sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg==}
engines: {node: '>=6.0.0'}
hasBin: true
- '@babel/types@7.24.0':
- resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
- engines: {node: '>=6.9.0'}
-
'@babel/types@7.27.0':
resolution: {integrity: sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg==}
engines: {node: '>=6.9.0'}
@@ -387,8 +370,8 @@ packages:
resolution: {integrity: sha512-JubJ5B2pJ4k4yGxaNLdbjrnk9d/iDz6/q8wOilpIowd6PJPgaxCuHBnBszq7Ce2TyMrywm5r4PnKm6V3iiZF+g==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@faker-js/faker@9.3.0':
- resolution: {integrity: sha512-r0tJ3ZOkMd9xsu3VRfqlFR6cz0V/jFYRswAIpC+m/DIfAUXq7g8N7wTAlhSANySXYGKzGryfDXwtwsY8TxEIDw==}
+ '@faker-js/faker@9.6.0':
+ resolution: {integrity: sha512-3vm4by+B5lvsFPSyep3ELWmZfE3kicDtmemVpuwl1yH7tqtnHdsA6hG8fbXedMVdkzgtvzWoRgjSB4Q+FHnZiw==}
engines: {node: '>=18.0.0', npm: '>=9.0.0'}
'@humanfs/core@0.19.1':
@@ -414,8 +397,8 @@ packages:
'@iconify/types@2.0.0':
resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==}
- '@iconify/vue@4.1.2':
- resolution: {integrity: sha512-CQnYqLiQD5LOAaXhBrmj1mdL2/NCJvwcC4jtW2Z8ukhThiFkLDkutarTOV2trfc9EXqUqRs0KqXOL9pZ/IyysA==}
+ '@iconify/vue@4.3.0':
+ resolution: {integrity: sha512-Xq0h6zMrHBbrW8jXJ9fISi+x8oDQllg5hTDkDuxnWiskJ63rpJu9CvJshj8VniHVTbsxCg9fVoPAaNp3RQI5OQ==}
peerDependencies:
vue: '>=3'
@@ -500,12 +483,75 @@ packages:
'@jridgewell/sourcemap-codec@1.4.15':
resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ '@jridgewell/sourcemap-codec@1.5.0':
+ resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- '@mapbox/node-pre-gyp@1.0.11':
- resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==}
- hasBin: true
+ '@napi-rs/canvas-android-arm64@0.1.68':
+ resolution: {integrity: sha512-h1KcSR4LKLfRfzeBH65xMxbWOGa1OtMFQbCMVlxPCkN1Zr+2gK+70pXO5ktojIYcUrP6KDcOwoc8clho5ccM/w==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [android]
+
+ '@napi-rs/canvas-darwin-arm64@0.1.68':
+ resolution: {integrity: sha512-/VURlrAD4gDoxW1GT/b0nP3fRz/fhxmHI/xznTq2FTwkQLPOlLkDLCvTmQ7v6LtGKdc2Ed6rvYpRan+JXThInQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@napi-rs/canvas-darwin-x64@0.1.68':
+ resolution: {integrity: sha512-tEpvGR6vCLTo1Tx9wmDnoOKROpw57wiCWwCpDOuVlj/7rqEJOUYr9ixW4aRJgmeGBrZHgevI0EURys2ER6whmg==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [darwin]
+
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.68':
+ resolution: {integrity: sha512-U9xbJsumPOiAYeAFZMlHf62b9dGs2HJ6Q5xt7xTB0uEyPeurwhgYBWGgabdsEidyj38YuzI/c3LGBbSQB3vagw==}
+ engines: {node: '>= 10'}
+ cpu: [arm]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.68':
+ resolution: {integrity: sha512-KFkn8wEm3mPnWD4l8+OUUkxylSJuN5q9PnJRZJgv15RtCA1bgxIwTkBhI/+xuyVMcHqON9sXq7cDkEJtHm35dg==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-arm64-musl@0.1.68':
+ resolution: {integrity: sha512-IQzts91rCdOALXBWQxLZRCEDrfFTGDtNRJMNu+2SKZ1uT8cmPQkPwVk5rycvFpvgAcmiFiOSCp1aRrlfU8KPpQ==}
+ engines: {node: '>= 10'}
+ cpu: [arm64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.68':
+ resolution: {integrity: sha512-e9AS5UttoIKqXSmBzKZdd3NErSVyOEYzJfNOCGtafGk1//gibTwQXGlSXmAKuErqMp09pyk9aqQRSYzm1AQfBw==}
+ engines: {node: '>= 10'}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-x64-gnu@0.1.68':
+ resolution: {integrity: sha512-Pa/I36VE3j57I3Obhrr+J48KGFfkZk2cJN/2NmW/vCgmoF7kCP6aTVq5n+cGdGWLd/cN9CJ9JvNwEoMRDghu0g==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/canvas-linux-x64-musl@0.1.68':
+ resolution: {integrity: sha512-9c6rkc5195wNxuUHJdf4/mmnq433OQey9TNvQ9LspJazvHbfSkTij8wtKjASVQsJyPDva4fkWOeV/OQ7cLw0GQ==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [linux]
+
+ '@napi-rs/canvas-win32-x64-msvc@0.1.68':
+ resolution: {integrity: sha512-Fc5Dez23u0FoSATurT6/w1oMytiRnKWEinHivdMvXpge6nG4YvhrASrtqMk8dGJMVQpHr8QJYF45rOrx2YU2Aw==}
+ engines: {node: '>= 10'}
+ cpu: [x64]
+ os: [win32]
+
+ '@napi-rs/canvas@0.1.68':
+ resolution: {integrity: sha512-LQESrePLEBLvhuFkXx9jjBXRC2ClYsO5mqQ1m/puth5z9SOuM3N/B3vDuqnC3RJFktDktyK9khGvo7dTkqO9uQ==}
+ engines: {node: '>= 10'}
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
@@ -526,8 +572,8 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
- '@playwright/test@1.46.1':
- resolution: {integrity: sha512-Fq6SwLujA/DOIvNC2EL/SojJnkKf/rAwJ//APpJJHRyMi1PdKrY3Az+4XNQ51N4RTbItbIByQ0jgd1tayq1aeA==}
+ '@playwright/test@1.51.1':
+ resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==}
engines: {node: '>=18'}
hasBin: true
@@ -688,9 +734,6 @@ packages:
cpu: [x64]
os: [win32]
- '@socket.io/component-emitter@3.1.1':
- resolution: {integrity: sha512-dzJtaDAAoXx4GCOJpbB2eG/Qj8VDpdwkLsWGzGm+0L7E8/434RyMbAHmk9ubXWVAb9nXmc44jUf8GKqVDiKezg==}
-
'@svgdotjs/svg.draggable.js@3.0.6':
resolution: {integrity: sha512-7iJFm9lL3C40HQcqzEfezK2l+dW2CpoVY3b77KQGqc8GXWa6LhhmX5Ckv7alQfUXBuZbjpICZ+Dvq1czlGx7gA==}
peerDependencies:
@@ -716,8 +759,8 @@ packages:
peerDependencies:
'@svgdotjs/svg.js': ^3.2.4
- '@tato30/vue-pdf@1.11.0':
- resolution: {integrity: sha512-GQNfVqq8if6/tezgcW1E0iU7kO5VfzMihdU6sfRnw0ewDYcP43JFt3r2fmDggyAY5lu7ArEwCFvlWi7WbvleCw==}
+ '@tato30/vue-pdf@1.11.3':
+ resolution: {integrity: sha512-YKEmy3NKAy+UsgYCu+GkKQ1VaIovjP/5lO5NmiKRjv9Jbl1LqJYGafZUt3QXp5Ijg0DN2gYDf8Jl949Lr9E7mA==}
peerDependencies:
vue: ^3.2.33
@@ -781,8 +824,8 @@ packages:
'@types/node-forge@1.3.11':
resolution: {integrity: sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==}
- '@types/node@20.16.1':
- resolution: {integrity: sha512-zJDo7wEadFtSyNz5QITDfRcrhqDvQI1xQNQ0VoizPjM/dVAODqqIUWbJPkvsxmTI0MYRGRikcdjMPhOssnPejQ==}
+ '@types/node@20.17.28':
+ resolution: {integrity: sha512-DHlH/fNL6Mho38jTy7/JT7sn2wnXI+wULR6PV4gy4VHLVvnrV/d3pHAMQHhc4gjdLmK2ZiPoMxzp6B3yRajLSQ==}
'@types/number-to-words@1.2.3':
resolution: {integrity: sha512-ruSA/QZ6JQofoEEN2zKmN9oihZmrCBgcw0zEzN0UA9Mw0pU5remTddZmrbHjsa99qz12Uxl82x+XkVpHu87oXw==}
@@ -836,23 +879,17 @@ packages:
'@volar/typescript@2.4.12':
resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==}
- '@vue/compiler-core@3.4.38':
- resolution: {integrity: sha512-8IQOTCWnLFqfHzOGm9+P8OPSEDukgg3Huc92qSG49if/xI2SAwLHQO2qaPQbjCWPBcQoO1WYfXfTACUrWV3c5A==}
-
'@vue/compiler-core@3.5.13':
resolution: {integrity: sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==}
- '@vue/compiler-dom@3.4.38':
- resolution: {integrity: sha512-Osc/c7ABsHXTsETLgykcOwIxFktHfGSUDkb05V61rocEfsFDcjDLH/IHJSNJP+/Sv9KeN2Lx1V6McZzlSb9EhQ==}
-
'@vue/compiler-dom@3.5.13':
resolution: {integrity: sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==}
- '@vue/compiler-sfc@3.4.38':
- resolution: {integrity: sha512-s5QfZ+9PzPh3T5H4hsQDJtI8x7zdJaew/dCGgqZ2630XdzaZ3AD8xGZfBqpT8oaD/p2eedd+pL8tD5vvt5ZYJQ==}
+ '@vue/compiler-sfc@3.5.13':
+ resolution: {integrity: sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==}
- '@vue/compiler-ssr@3.4.38':
- resolution: {integrity: sha512-YXznKFQ8dxYpAz9zLuVvfcXhc31FSPFDcqr0kyujbOwNhlmaNvL2QfIy+RZeJgSn5Fk54CWoEUeW+NVBAogGaw==}
+ '@vue/compiler-ssr@3.5.13':
+ resolution: {integrity: sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==}
'@vue/compiler-vue2@2.7.16':
resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==}
@@ -860,6 +897,9 @@ packages:
'@vue/devtools-api@6.6.3':
resolution: {integrity: sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==}
+ '@vue/devtools-api@6.6.4':
+ resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==}
+
'@vue/language-core@2.2.8':
resolution: {integrity: sha512-rrzB0wPGBvcwaSNRriVWdNAbHQWSf0NlGqgKHK5mEkXpefjUlVRP62u03KvwZpvKVjRnBIQ/Lwre+Mx9N6juUQ==}
peerDependencies:
@@ -868,22 +908,19 @@ packages:
typescript:
optional: true
- '@vue/reactivity@3.4.38':
- resolution: {integrity: sha512-4vl4wMMVniLsSYYeldAKzbk72+D3hUnkw9z8lDeJacTxAkXeDAP1uE9xr2+aKIN0ipOL8EG2GPouVTH6yF7Gnw==}
+ '@vue/reactivity@3.5.13':
+ resolution: {integrity: sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==}
- '@vue/runtime-core@3.4.38':
- resolution: {integrity: sha512-21z3wA99EABtuf+O3IhdxP0iHgkBs1vuoCAsCKLVJPEjpVqvblwBnTj42vzHRlWDCyxu9ptDm7sI2ZMcWrQqlA==}
+ '@vue/runtime-core@3.5.13':
+ resolution: {integrity: sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==}
- '@vue/runtime-dom@3.4.38':
- resolution: {integrity: sha512-afZzmUreU7vKwKsV17H1NDThEEmdYI+GCAK/KY1U957Ig2NATPVjCROv61R19fjZNzMmiU03n79OMnXyJVN0UA==}
+ '@vue/runtime-dom@3.5.13':
+ resolution: {integrity: sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==}
- '@vue/server-renderer@3.4.38':
- resolution: {integrity: sha512-NggOTr82FbPEkkUvBm4fTGcwUY8UuTsnWC/L2YZBmvaQ4C4Jl/Ao4HHTB+l7WnFCt5M/dN3l0XLuyjzswGYVCA==}
+ '@vue/server-renderer@3.5.13':
+ resolution: {integrity: sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==}
peerDependencies:
- vue: 3.4.38
-
- '@vue/shared@3.4.38':
- resolution: {integrity: sha512-q0xCiLkuWWQLzVrecPb0RMsNWyxICOjPrcrwxTUEHb1fsnvni4dcuyG7RT/Ie7VPTvnjzIaWzRMUBsrqNj/hhw==}
+ vue: 3.5.13
'@vue/shared@3.5.13':
resolution: {integrity: sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==}
@@ -956,9 +993,6 @@ packages:
'@yr/monotone-cubic-spline@1.0.3':
resolution: {integrity: sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA==}
- abbrev@1.1.1:
- resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==}
-
abort-controller@3.0.0:
resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==}
engines: {node: '>=6.5'}
@@ -982,10 +1016,6 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
- agent-base@6.0.2:
- resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==}
- engines: {node: '>= 6.0.0'}
-
ajv-errors@1.0.1:
resolution: {integrity: sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==}
peerDependencies:
@@ -1035,9 +1065,6 @@ packages:
aproba@1.2.0:
resolution: {integrity: sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==}
- aproba@2.0.0:
- resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==}
-
archiver-utils@5.0.2:
resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==}
engines: {node: '>= 14'}
@@ -1046,11 +1073,6 @@ packages:
resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==}
engines: {node: '>= 14'}
- are-we-there-yet@2.0.0:
- resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==}
- engines: {node: '>=10'}
- deprecated: This package is no longer supported.
-
argparse@1.0.10:
resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
@@ -1100,15 +1122,15 @@ packages:
engines: {node: '>= 4.5.0'}
hasBin: true
- autoprefixer@10.4.20:
- resolution: {integrity: sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==}
+ autoprefixer@10.4.21:
+ resolution: {integrity: sha512-O+A6LWV5LDHSJD3LjHYoNi4VLsj/Whi7k6zG12xTYaU4cQ8oxQGckXNX8cRHK5yOZ/ppVHe0ZBXGzSV9jXdVbQ==}
engines: {node: ^10 || ^12 || >=14}
hasBin: true
peerDependencies:
postcss: ^8.1.0
- axios@1.7.4:
- resolution: {integrity: sha512-DukmaFRnY6AzAALSH4J2M3k6PkaC+MfaAGdEERRWcC9q3/TWQwLpHR8ZRLKTdQ3aBDL64EdluRDjJqKw+BPZEw==}
+ axios@1.8.4:
+ resolution: {integrity: sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==}
b4a@1.6.6:
resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==}
@@ -1199,8 +1221,8 @@ packages:
browserify-zlib@0.2.0:
resolution: {integrity: sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==}
- browserslist@4.23.3:
- resolution: {integrity: sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==}
+ browserslist@4.24.4:
+ resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
@@ -1270,10 +1292,6 @@ packages:
caniuse-lite@1.0.30001707:
resolution: {integrity: sha512-3qtRjw/HQSMlDWf+X79N206fepf4SOOU6SQLMaq/0KkZLmSjPxAkBOQQ+FxbHKfHmYLZFfdWsO3KA90ceHPSnw==}
- canvas@2.11.2:
- resolution: {integrity: sha512-ItanGBMrmRV7Py2Z+Xhs7cT+FNt5K0vPL4p9EZ/UX/Mu7hFbkxSjKF2KVtPwX7UYWp7dRKnrTvReflgrItJbdw==}
- engines: {node: '>=6'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -1291,10 +1309,6 @@ packages:
chownr@1.1.4:
resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==}
- chownr@2.0.0:
- resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==}
- engines: {node: '>=10'}
-
chrome-trace-event@1.0.4:
resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==}
engines: {node: '>=6.0'}
@@ -1350,10 +1364,6 @@ packages:
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
- color-support@1.1.3:
- resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==}
- hasBin: true
-
colorjs.io@0.5.2:
resolution: {integrity: sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==}
@@ -1399,9 +1409,6 @@ packages:
console-browserify@1.2.0:
resolution: {integrity: sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==}
- console-control-strings@1.1.0:
- resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==}
-
constants-browserify@1.0.0:
resolution: {integrity: sha512-xFxOwqIzR/e1k1gLiWEophSCMqXcwVHIH7akf7b/vxcUeGunlj3hvZaaqxwHsTgn+IndtkQJgSztIDWeumWJDQ==}
@@ -1469,6 +1476,9 @@ packages:
date-fns@3.6.0:
resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==}
+ dayjs@1.11.13:
+ resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+
de-indent@1.0.2:
resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
@@ -1502,10 +1512,6 @@ packages:
resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==}
engines: {node: '>=0.10'}
- decompress-response@4.2.1:
- resolution: {integrity: sha512-jOSne2qbyE+/r8G1VU+G/82LBs2Fs4LAsTiLSHOCOMZQl2OKZ6i8i4IyHemTe+/yIXOtTcRQMzPcgyhoFlqPkw==}
- engines: {node: '>=8'}
-
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
@@ -1552,9 +1558,6 @@ packages:
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
engines: {node: '>=0.4.0'}
- delegates@1.0.0:
- resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==}
-
depd@2.0.0:
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
engines: {node: '>= 0.8'}
@@ -1566,10 +1569,6 @@ packages:
resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==}
engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16}
- detect-libc@2.0.3:
- resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==}
- engines: {node: '>=8'}
-
diffie-hellman@5.0.3:
resolution: {integrity: sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==}
@@ -1605,8 +1604,8 @@ packages:
ee-first@1.1.1:
resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==}
- electron-to-chromium@1.5.13:
- resolution: {integrity: sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==}
+ electron-to-chromium@1.5.126:
+ resolution: {integrity: sha512-AtH1uLcTC72LA4vfYcEJJkrMk/MY/X0ub8Hv7QGAePW2JkeUFHEL/QfS4J77R6M87Sss8O0OcqReSaN1bpyA+Q==}
elementtree@0.1.7:
resolution: {integrity: sha512-wkgGT6kugeQk/P6VZ/f4T+4HB41BVgNBq5CDIZVbQ02nvTVqAiVTbskxxu3eA/X96lMlfYOwnLQpN2v5E1zDEg==}
@@ -1636,13 +1635,6 @@ packages:
end-of-stream@1.4.4:
resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==}
- engine.io-client@6.5.3:
- resolution: {integrity: sha512-9Z0qLB0NIisTRt1DZ/8U2k12RJn8yls/nXMZLn+/N8hANT3TcYjKFKcwbw5zFQiN4NTde3TSY9zb79e1ij6j9Q==}
-
- engine.io-parser@5.2.2:
- resolution: {integrity: sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==}
- engines: {node: '>=10.0.0'}
-
enhanced-resolve@4.5.0:
resolution: {integrity: sha512-Nv9m36S/vxpsI+Hc4/ZGRs0n9mXqSWGGq49zxb/cJfPAQMbUtttJAlNPS4AQzaBdw/pKskw5bMbekT/Y7W/Wlg==}
engines: {node: '>=6.9.0'}
@@ -1686,6 +1678,10 @@ packages:
resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
engines: {node: '>=6'}
+ escalade@3.2.0:
+ resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
+ engines: {node: '>=6'}
+
escape-html@1.0.3:
resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
@@ -1918,10 +1914,6 @@ packages:
resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==}
engines: {node: '>=14.14'}
- fs-minipass@2.1.0:
- resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==}
- engines: {node: '>= 8'}
-
fs-write-stream-atomic@1.0.10:
resolution: {integrity: sha512-gehEzmPn2nAwr39eay+x3X34Ra+M2QlVUTLhkXPjWdeO8RF9kszk116avgBJM3ZyNHgHXBNx+VmPaFC36k0PzA==}
deprecated: This package is no longer supported.
@@ -1948,11 +1940,6 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- gauge@3.0.2:
- resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==}
- engines: {node: '>=10'}
- deprecated: This package is no longer supported.
-
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -1990,6 +1977,7 @@ packages:
glob@7.2.3:
resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ deprecated: Glob versions prior to v9 are no longer supported
globals@14.0.0:
resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==}
@@ -2024,9 +2012,6 @@ packages:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
- has-unicode@2.0.1:
- resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==}
-
has-value@0.3.1:
resolution: {integrity: sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==}
engines: {node: '>=0.10.0'}
@@ -2080,10 +2065,6 @@ packages:
https-browserify@1.0.0:
resolution: {integrity: sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg==}
- https-proxy-agent@5.0.1:
- resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==}
- engines: {node: '>= 6'}
-
iconv-lite@0.4.24:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
@@ -2120,6 +2101,7 @@ packages:
inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
inherits@2.0.3:
resolution: {integrity: sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==}
@@ -2307,8 +2289,8 @@ packages:
resolution: {integrity: sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==}
engines: {node: '>=18'}
- keycloak-js@25.0.4:
- resolution: {integrity: sha512-LW7dVgqcBxMnnJTdmh7Zgd0NpStJnX2sCMrJGqcGtm4zmk4Rwlqk2o2uOvY7PaRHHYePXfbIwrqVhlN3GAnRCg==}
+ keycloak-js@25.0.6:
+ resolution: {integrity: sha512-Km+dc+XfNvY6a4az5jcxTK0zPk52ns9mAxLrHj7lF3V+riVYvQujfHmhayltJDjEpSOJ4C8a57LFNNKnNnRP2g==}
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@@ -2384,21 +2366,13 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- lru-cache@6.0.0:
- resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
- engines: {node: '>=10'}
-
- magic-string@0.30.10:
- resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==}
+ magic-string@0.30.17:
+ resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
make-dir@2.1.0:
resolution: {integrity: sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==}
engines: {node: '>=6'}
- make-dir@3.1.0:
- resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
- engines: {node: '>=8'}
-
map-cache@0.2.2:
resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==}
engines: {node: '>=0.10.0'}
@@ -2504,8 +2478,8 @@ packages:
engines: {node: '>=4'}
hasBin: true
- mime@4.0.4:
- resolution: {integrity: sha512-v8yqInVjhXyqP6+Kw4fV3ZzeMRqEW6FotRsKXjRS5VMTNIuXsdRoAvklpoRgSqXm6o9VNH4/C0mgedko9DdLsQ==}
+ mime@4.0.6:
+ resolution: {integrity: sha512-4rGt7rvQHBbaSOF9POGkk1ocRP16Md1x36Xma8sz8h8/vfCUI2OtEIeCqe4Ofes853x4xDoPiFLIT47J5fI/7A==}
engines: {node: '>=16'}
hasBin: true
@@ -2513,10 +2487,6 @@ packages:
resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==}
engines: {node: '>=6'}
- mimic-response@2.1.0:
- resolution: {integrity: sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==}
- engines: {node: '>=8'}
-
mimoza@1.0.0:
resolution: {integrity: sha512-+j7SSye/hablu66K/jjeyPmk6WL8RoXfeZ+MMn37vSNDGuaWY/5wm10LpSpxAHX4kNoEwkTWYHba8ePVip+Hqg==}
@@ -2540,22 +2510,10 @@ packages:
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
- minipass@3.3.6:
- resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==}
- engines: {node: '>=8'}
-
- minipass@5.0.0:
- resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==}
- engines: {node: '>=8'}
-
minipass@7.1.2:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- minizlib@2.1.2:
- resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==}
- engines: {node: '>= 8'}
-
mississippi@3.0.0:
resolution: {integrity: sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==}
engines: {node: '>=4.0.0'}
@@ -2568,11 +2526,6 @@ packages:
resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==}
hasBin: true
- mkdirp@1.0.4:
- resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==}
- engines: {node: '>=10'}
- hasBin: true
-
mlly@1.7.4:
resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==}
@@ -2599,9 +2552,6 @@ packages:
resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==}
engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
- nan@2.19.0:
- resolution: {integrity: sha512-nO1xXxfh/RWNxfd/XPfbIfFk5vgLsAxUR9y5O0cHMJu/AW9U95JLXqthYHjEp+8gQ5p96K9jUp8nbVOxCdRbtw==}
-
nan@2.22.2:
resolution: {integrity: sha512-DANghxFkS1plDdRsX0X9pm0Z6SJNN6gBdtXfanwoZ8hooC5gosGFSBGRYHUVPz1asKA/kMRqDRdHrluZ61SpBQ==}
@@ -2610,11 +2560,6 @@ packages:
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@3.3.7:
- resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
- engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
- hasBin: true
-
nanomatch@1.2.13:
resolution: {integrity: sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==}
engines: {node: '>=0.10.0'}
@@ -2652,13 +2597,8 @@ packages:
node-libs-browser@2.2.1:
resolution: {integrity: sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==}
- node-releases@2.0.18:
- resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
-
- nopt@5.0.0:
- resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==}
- engines: {node: '>=6'}
- hasBin: true
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
normalize-path@2.1.1:
resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==}
@@ -2672,17 +2612,9 @@ packages:
resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==}
engines: {node: '>=0.10.0'}
- npmlog@5.0.1:
- resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==}
- deprecated: This package is no longer supported.
-
number-to-words@1.2.4:
resolution: {integrity: sha512-/fYevVkXRcyBiZDg6yzZbm0RuaD6i0qRfn8yr+6D0KgBMOndFPxuW10qCHpzs50nN8qKuv78k8MuotZhcVX6Pw==}
- object-assign@4.1.1:
- resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
- engines: {node: '>=0.10.0'}
-
object-copy@0.1.0:
resolution: {integrity: sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==}
engines: {node: '>=0.10.0'}
@@ -2725,8 +2657,8 @@ packages:
resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
engines: {node: '>=6'}
- open-props@1.7.5:
- resolution: {integrity: sha512-DajjLQDJgIa0i+QdB2q5M8lNLo2ICk+DbDh4TsqNsT1tAO8Zm8F7dndSkLMQkobT98lbvDMMpJWO8NT0ibjrjA==}
+ open-props@1.7.14:
+ resolution: {integrity: sha512-rTsf6dGrNhlyyN5+ZAdht50s5A7vzHC/gaA56sQnSfwQU53YzWCMjdzX2hhlK+aK+3ojEwTxsvRSlk3FP8TTHA==}
open@10.1.0:
resolution: {integrity: sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==}
@@ -2841,10 +2773,6 @@ packages:
path-to-regexp@0.1.12:
resolution: {integrity: sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==}
- path2d@0.2.1:
- resolution: {integrity: sha512-Fl2z/BHvkTNvkuBzYTpTuirHZg6wW9z8+4SND/3mDTEcYbbNKWAy21dz9D3ePNNwrrK8pqZO5vLPZ1hLF6T7XA==}
- engines: {node: '>=6'}
-
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
@@ -2858,12 +2786,9 @@ packages:
pdfjs-dist@2.6.347:
resolution: {integrity: sha512-QC+h7hG2su9v/nU1wEI3SnpPIrqJODL7GTDFvR74ANKGq1AFJW16PH8VWnhpiTi9YcLSFV9xLeWSgq+ckHLdVQ==}
- pdfjs-dist@4.5.136:
- resolution: {integrity: sha512-V1BALcAN/FmxBEShLxoP73PlQZAZtzlaNfRbRhJrKvXzjLC5VaIlBAQUJuWP8iaYUmIdmdLHmt3E2TBglxOm3w==}
- engines: {node: '>=18'}
-
- picocolors@1.0.1:
- resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==}
+ pdfjs-dist@4.9.124:
+ resolution: {integrity: sha512-yAoM7C+IYIG23dAZHE2KqtE5exEj067Ef6oblb+AHiqLwTJSQOMB+e8ftBA3pp1+6TyE4xeofoHcu9t7XaOE0g==}
+ engines: {node: '>=20'}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
@@ -2880,15 +2805,12 @@ packages:
resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
engines: {node: '>=6'}
- pinia@2.2.2:
- resolution: {integrity: sha512-ja2XqFWZC36mupU4z1ZzxeTApV7DOw44cV4dhQ9sGwun+N89v/XP7+j7q6TanS1u1tdbK4r+1BUx7heMaIdagA==}
+ pinia@2.3.1:
+ resolution: {integrity: sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==}
peerDependencies:
- '@vue/composition-api': ^1.4.0
typescript: '>=4.4.4'
- vue: ^2.6.14 || ^3.3.0
+ vue: ^2.7.0 || ^3.5.11
peerDependenciesMeta:
- '@vue/composition-api':
- optional: true
typescript:
optional: true
@@ -2899,13 +2821,13 @@ packages:
pkg-types@1.3.1:
resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
- playwright-core@1.46.1:
- resolution: {integrity: sha512-h9LqIQaAv+CYvWzsZ+h3RsrqCStkBHlgo6/TJlFst3cOTlLghBQlJwPOZKQJTKNaD3QIB7aAVQ+gfWbN3NXB7A==}
+ playwright-core@1.51.1:
+ resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==}
engines: {node: '>=18'}
hasBin: true
- playwright@1.46.1:
- resolution: {integrity: sha512-oPcr1yqoXLCkgKtD5eNUPLiN40rYEM39odNpIb6VE6S7/15gJmA1NzVv6zJYusV0e7tzvkU/utBFNa/Kpxmwng==}
+ playwright@1.51.1:
+ resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==}
engines: {node: '>=18'}
hasBin: true
@@ -2916,10 +2838,6 @@ packages:
postcss-value-parser@4.2.0:
resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==}
- postcss@8.4.41:
- resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==}
- engines: {node: ^10 || ^12 || >=14}
-
postcss@8.5.3:
resolution: {integrity: sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==}
engines: {node: ^10 || ^12 || >=14}
@@ -2928,8 +2846,8 @@ packages:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
- prettier@3.3.3:
- resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==}
+ prettier@3.5.3:
+ resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==}
engines: {node: '>=14'}
hasBin: true
@@ -3096,10 +3014,6 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
- rimraf@3.0.2:
- resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
- hasBin: true
-
ripemd160@2.0.2:
resolution: {integrity: sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==}
@@ -3303,15 +3217,6 @@ packages:
resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
hasBin: true
- semver@6.3.1:
- resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
- hasBin: true
-
- semver@7.6.0:
- resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
- engines: {node: '>=10'}
- hasBin: true
-
semver@7.6.3:
resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==}
engines: {node: '>=10'}
@@ -3331,9 +3236,6 @@ packages:
resolution: {integrity: sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==}
engines: {node: '>= 0.8.0'}
- set-blocking@2.0.0:
- resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
-
set-function-length@1.2.2:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
@@ -3391,14 +3293,8 @@ packages:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
- signature_pad@5.0.2:
- resolution: {integrity: sha512-FSseAwRWznAQg90CnrTbC570u1QYi8gijZiyboc18SK2IUx7sYVZhNPLnJRCnwhpyOpgdqXf91XAHL4Yg41yCg==}
-
- simple-concat@1.0.1:
- resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==}
-
- simple-get@3.1.1:
- resolution: {integrity: sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==}
+ signature_pad@5.0.7:
+ resolution: {integrity: sha512-j2C6NTZ3c99G3hvFTsg6oOWy/tmftgwIXrvsr3+99+5SuPW6OdSpo++ZUzLVNfNHYmp2Z2Al76YV/3RhS/nDJg==}
snapdragon-node@2.1.1:
resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==}
@@ -3412,21 +3308,9 @@ packages:
resolution: {integrity: sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==}
engines: {node: '>=0.10.0'}
- socket.io-client@4.7.5:
- resolution: {integrity: sha512-sJ/tqHOCe7Z50JCBCXrsY3I2k03iOiUe+tj1OmKeD2lXPiGH/RUCdTZFoqVyN7l1MnpIzPrGtLcijffmeouNlQ==}
- engines: {node: '>=10.0.0'}
-
- socket.io-parser@4.2.4:
- resolution: {integrity: sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==}
- engines: {node: '>=10.0.0'}
-
source-list-map@2.0.1:
resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==}
- source-map-js@1.2.0:
- resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
- engines: {node: '>=0.10.0'}
-
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
@@ -3540,10 +3424,6 @@ packages:
tar-stream@3.1.7:
resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==}
- tar@6.2.1:
- resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==}
- engines: {node: '>=10'}
-
terser-webpack-plugin@1.4.6:
resolution: {integrity: sha512-2lBVf/VMVIddjSn3GqbT90GvIJ/eYXJkt8cTzU7NbjKqK8fwv18Ftr4PlbF46b/e88743iZFL5Dtr/rC4hjIeA==}
engines: {node: '>= 6.9.0'}
@@ -3590,10 +3470,6 @@ packages:
to-arraybuffer@1.0.1:
resolution: {integrity: sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==}
- to-fast-properties@2.0.0:
- resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
- engines: {node: '>=4'}
-
to-object-path@0.3.0:
resolution: {integrity: sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==}
engines: {node: '>=0.10.0'}
@@ -3706,8 +3582,8 @@ packages:
resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==}
engines: {node: '>=4'}
- update-browserslist-db@1.1.0:
- resolution: {integrity: sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==}
+ update-browserslist-db@1.1.3:
+ resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==}
hasBin: true
peerDependencies:
browserslist: '>= 4.21.0'
@@ -3797,8 +3673,8 @@ packages:
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
- vue-component-type-helpers@2.1.10:
- resolution: {integrity: sha512-lfgdSLQKrUmADiSV6PbBvYgQ33KF3Ztv6gP85MfGaGaSGMTXORVaHT1EHfsqCgzRNBstPKYDmvAV9Do5CmJ07A==}
+ vue-component-type-helpers@2.2.8:
+ resolution: {integrity: sha512-4bjIsC284coDO9om4HPA62M7wfsTvcmZyzdfR0aUlFXqq4tXxM1APyXpNVxPC8QazKw9OhmZNHBVDA6ODaZsrA==}
vue-demi@0.14.10:
resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==}
@@ -3826,8 +3702,8 @@ packages:
vue-resize-sensor@2.0.0:
resolution: {integrity: sha512-W+y2EAI/BxS4Vlcca9scQv8ifeBFck56DRtSwWJ2H4Cw1GLNUYxiZxUHHkuzuI5JPW/cYtL1bPO5xPyEXx4LmQ==}
- vue-router@4.4.3:
- resolution: {integrity: sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==}
+ vue-router@4.5.0:
+ resolution: {integrity: sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==}
peerDependencies:
vue: ^3.2.0
@@ -3843,8 +3719,8 @@ packages:
apexcharts: '>=4.0.0'
vue: '>=3.0.0'
- vue@3.4.38:
- resolution: {integrity: sha512-f0ZgN+mZ5KFgVv9wz0f4OgVKukoXtS3nwET4c2vLBGQR50aI8G0cqbFtLlX9Yiyg3LFGBitruPHt2PxwTduJEw==}
+ vue@3.5.13:
+ resolution: {integrity: sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
@@ -3901,9 +3777,6 @@ packages:
engines: {node: '>= 8'}
hasBin: true
- wide-align@1.1.5:
- resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==}
-
wildcard@2.0.1:
resolution: {integrity: sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==}
@@ -3935,22 +3808,6 @@ 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
-
- xmlhttprequest-ssl@2.0.0:
- resolution: {integrity: sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A==}
- engines: {node: '>=0.4.0'}
-
xtend@4.0.2:
resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==}
engines: {node: '>=0.4'}
@@ -3965,9 +3822,6 @@ packages:
yallist@3.1.1:
resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
- yallist@4.0.0:
- resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
-
yaml-eslint-parser@1.2.2:
resolution: {integrity: sha512-pEwzfsKbTrB8G3xc/sN7aw1v6A6c/pKxLAkjclnAyo5g5qOh6eL9WGu0o3cSDQZKrTNk4KL4lQSwZW+nBkANEg==}
engines: {node: ^14.17.0 || >=16.0.0}
@@ -4002,28 +3856,14 @@ packages:
snapshots:
- '@babel/helper-string-parser@7.24.1': {}
-
'@babel/helper-string-parser@7.25.9': {}
- '@babel/helper-validator-identifier@7.22.20': {}
-
'@babel/helper-validator-identifier@7.25.9': {}
- '@babel/parser@7.24.7':
- dependencies:
- '@babel/types': 7.24.0
-
'@babel/parser@7.27.0':
dependencies:
'@babel/types': 7.27.0
- '@babel/types@7.24.0':
- dependencies:
- '@babel/helper-string-parser': 7.24.1
- '@babel/helper-validator-identifier': 7.22.20
- to-fast-properties: 2.0.0
-
'@babel/types@7.27.0':
dependencies:
'@babel/helper-string-parser': 7.25.9
@@ -4150,7 +3990,7 @@ snapshots:
'@eslint/core': 0.12.0
levn: 0.4.1
- '@faker-js/faker@9.3.0': {}
+ '@faker-js/faker@9.6.0': {}
'@humanfs/core@0.19.1': {}
@@ -4167,14 +4007,14 @@ snapshots:
'@iconify/types@2.0.0': {}
- '@iconify/vue@4.1.2(vue@3.4.38(typescript@5.5.4))':
+ '@iconify/vue@4.3.0(vue@3.5.13(typescript@5.5.4))':
dependencies:
'@iconify/types': 2.0.0
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
'@inquirer/figures@1.0.5': {}
- '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))':
+ '@intlify/bundle-utils@10.0.1(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))':
dependencies:
'@intlify/message-compiler': 11.1.2
'@intlify/shared': 11.1.2
@@ -4186,7 +4026,7 @@ snapshots:
source-map-js: 1.2.1
yaml-eslint-parser: 1.2.2
optionalDependencies:
- vue-i18n: 11.1.2(vue@3.4.38(typescript@5.5.4))
+ vue-i18n: 11.1.2(vue@3.5.13(typescript@5.5.4))
'@intlify/core-base@11.1.2':
dependencies:
@@ -4200,12 +4040,12 @@ snapshots:
'@intlify/shared@11.1.2': {}
- '@intlify/unplugin-vue-i18n@6.0.5(@vue/compiler-dom@3.5.13)(eslint@9.23.0)(rollup@4.37.0)(typescript@5.5.4)(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))':
+ '@intlify/unplugin-vue-i18n@6.0.5(@vue/compiler-dom@3.5.13)(eslint@9.23.0)(rollup@4.37.0)(typescript@5.5.4)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))':
dependencies:
'@eslint-community/eslint-utils': 4.5.1(eslint@9.23.0)
- '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))
+ '@intlify/bundle-utils': 10.0.1(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))
'@intlify/shared': 11.1.2
- '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))
+ '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))
'@rollup/pluginutils': 5.1.0(rollup@4.37.0)
'@typescript-eslint/scope-manager': 8.28.0
'@typescript-eslint/typescript-estree': 8.28.0(typescript@5.5.4)
@@ -4217,9 +4057,9 @@ snapshots:
picocolors: 1.1.1
source-map-js: 1.2.1
unplugin: 1.10.1
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
optionalDependencies:
- vue-i18n: 11.1.2(vue@3.4.38(typescript@5.5.4))
+ vue-i18n: 11.1.2(vue@3.5.13(typescript@5.5.4))
transitivePeerDependencies:
- '@vue/compiler-dom'
- eslint
@@ -4227,14 +4067,14 @@ snapshots:
- supports-color
- typescript
- '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))':
+ '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.1.2)(@vue/compiler-dom@3.5.13)(vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))':
dependencies:
'@babel/parser': 7.27.0
optionalDependencies:
'@intlify/shared': 11.1.2
'@vue/compiler-dom': 3.5.13
- vue: 3.4.38(typescript@5.5.4)
- vue-i18n: 11.1.2(vue@3.4.38(typescript@5.5.4))
+ vue: 3.5.13(typescript@5.5.4)
+ vue-i18n: 11.1.2(vue@3.5.13(typescript@5.5.4))
'@isaacs/cliui@8.0.2':
dependencies:
@@ -4262,25 +4102,55 @@ snapshots:
'@jridgewell/sourcemap-codec@1.4.15': {}
+ '@jridgewell/sourcemap-codec@1.5.0': {}
+
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.15
- '@mapbox/node-pre-gyp@1.0.11':
- dependencies:
- detect-libc: 2.0.3
- https-proxy-agent: 5.0.1
- make-dir: 3.1.0
- node-fetch: 2.7.0
- nopt: 5.0.0
- npmlog: 5.0.1
- rimraf: 3.0.2
- semver: 7.6.0
- tar: 6.2.1
- transitivePeerDependencies:
- - encoding
- - supports-color
+ '@napi-rs/canvas-android-arm64@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-darwin-arm64@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-darwin-x64@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-arm-gnueabihf@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-arm64-gnu@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-arm64-musl@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-riscv64-gnu@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-x64-gnu@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-linux-x64-musl@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas-win32-x64-msvc@0.1.68':
+ optional: true
+
+ '@napi-rs/canvas@0.1.68':
+ optionalDependencies:
+ '@napi-rs/canvas-android-arm64': 0.1.68
+ '@napi-rs/canvas-darwin-arm64': 0.1.68
+ '@napi-rs/canvas-darwin-x64': 0.1.68
+ '@napi-rs/canvas-linux-arm-gnueabihf': 0.1.68
+ '@napi-rs/canvas-linux-arm64-gnu': 0.1.68
+ '@napi-rs/canvas-linux-arm64-musl': 0.1.68
+ '@napi-rs/canvas-linux-riscv64-gnu': 0.1.68
+ '@napi-rs/canvas-linux-x64-gnu': 0.1.68
+ '@napi-rs/canvas-linux-x64-musl': 0.1.68
+ '@napi-rs/canvas-win32-x64-msvc': 0.1.68
optional: true
'@nodelib/fs.scandir@2.1.5':
@@ -4302,20 +4172,20 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
- '@playwright/test@1.46.1':
+ '@playwright/test@1.51.1':
dependencies:
- playwright: 1.46.1
+ playwright: 1.51.1
- '@quasar/app-vite@2.2.0(@types/node@20.16.1)(eslint@9.23.0)(pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)))(quasar@2.18.1)(rollup@4.37.0)(sass@1.77.8)(terser@5.31.0)(typescript@5.5.4)(vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)))(vue@3.4.38(typescript@5.5.4))':
+ '@quasar/app-vite@2.2.0(@types/node@20.17.28)(eslint@9.23.0)(pinia@2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)))(quasar@2.18.1)(rollup@4.37.0)(sass@1.77.8)(terser@5.31.0)(typescript@5.5.4)(vue-router@4.5.0(vue@3.5.13(typescript@5.5.4)))(vue@3.5.13(typescript@5.5.4))':
dependencies:
'@quasar/render-ssr-error': 1.0.3
'@quasar/ssl-certificate': 1.0.0
- '@quasar/vite-plugin': 1.9.0(@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4)))(quasar@2.18.1)(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4))
+ '@quasar/vite-plugin': 1.9.0(@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4)))(quasar@2.18.1)(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4))
'@types/chrome': 0.0.262
'@types/compression': 1.7.5
'@types/cordova': 11.0.3
'@types/express': 4.17.21
- '@vitejs/plugin-vue': 5.2.3(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4))
+ '@vitejs/plugin-vue': 5.2.3(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4))
archiver: 7.0.1
chokidar: 3.6.0
ci-info: 4.0.0
@@ -4344,13 +4214,13 @@ snapshots:
serialize-javascript: 6.0.2
tinyglobby: 0.2.12
ts-essentials: 9.4.2(typescript@5.5.4)
- vite: 6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
- vue: 3.4.38(typescript@5.5.4)
- vue-router: 4.4.3(vue@3.4.38(typescript@5.5.4))
+ vite: 6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
+ vue: 3.5.13(typescript@5.5.4)
+ vue-router: 4.5.0(vue@3.5.13(typescript@5.5.4))
webpack-merge: 6.0.1
optionalDependencies:
eslint: 9.23.0
- pinia: 2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4))
+ pinia: 2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4))
typescript: 5.5.4
transitivePeerDependencies:
- '@types/node'
@@ -4378,12 +4248,12 @@ snapshots:
fs-extra: 11.2.0
selfsigned: 2.4.1
- '@quasar/vite-plugin@1.9.0(@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4)))(quasar@2.18.1)(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4))':
+ '@quasar/vite-plugin@1.9.0(@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4)))(quasar@2.18.1)(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4))':
dependencies:
- '@vitejs/plugin-vue': 5.2.3(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4))
+ '@vitejs/plugin-vue': 5.2.3(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4))
quasar: 2.18.1
- vite: 6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
- vue: 3.4.38(typescript@5.5.4)
+ vite: 6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
+ vue: 3.5.13(typescript@5.5.4)
'@rollup/pluginutils@5.1.0(rollup@4.37.0)':
dependencies:
@@ -4453,8 +4323,6 @@ snapshots:
'@rollup/rollup-win32-x64-msvc@4.37.0':
optional: true
- '@socket.io/component-emitter@3.1.1': {}
-
'@svgdotjs/svg.draggable.js@3.0.6(@svgdotjs/svg.js@3.2.4)':
dependencies:
'@svgdotjs/svg.js': 3.2.4
@@ -4474,18 +4342,15 @@ snapshots:
dependencies:
'@svgdotjs/svg.js': 3.2.4
- '@tato30/vue-pdf@1.11.0(vue@3.4.38(typescript@5.5.4))':
+ '@tato30/vue-pdf@1.11.3(vue@3.5.13(typescript@5.5.4))':
dependencies:
- pdfjs-dist: 4.5.136
- vue: 3.4.38(typescript@5.5.4)
- transitivePeerDependencies:
- - encoding
- - supports-color
+ pdfjs-dist: 4.9.124
+ vue: 3.5.13(typescript@5.5.4)
'@types/body-parser@1.19.5':
dependencies:
'@types/connect': 3.4.38
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
'@types/chrome@0.0.262':
dependencies:
@@ -4498,7 +4363,7 @@ snapshots:
'@types/connect@3.4.38':
dependencies:
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
'@types/cordova@11.0.3': {}
@@ -4508,7 +4373,7 @@ snapshots:
'@types/express-serve-static-core@4.19.0':
dependencies:
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
'@types/qs': 6.9.14
'@types/range-parser': 1.2.7
'@types/send': 0.17.4
@@ -4550,9 +4415,9 @@ snapshots:
'@types/node-forge@1.3.11':
dependencies:
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
- '@types/node@20.16.1':
+ '@types/node@20.17.28':
dependencies:
undici-types: 6.19.8
@@ -4565,12 +4430,12 @@ snapshots:
'@types/send@0.17.4':
dependencies:
'@types/mime': 1.3.5
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
'@types/serve-static@1.15.7':
dependencies:
'@types/http-errors': 2.0.4
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
'@types/send': 0.17.4
'@types/uuid@10.0.0': {}
@@ -4601,10 +4466,10 @@ snapshots:
'@typescript-eslint/types': 8.28.0
eslint-visitor-keys: 4.2.0
- '@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.4.38(typescript@5.5.4))':
+ '@vitejs/plugin-vue@5.2.3(vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0))(vue@3.5.13(typescript@5.5.4))':
dependencies:
- vite: 6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
- vue: 3.4.38(typescript@5.5.4)
+ vite: 6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0)
+ vue: 3.5.13(typescript@5.5.4)
'@volar/language-core@2.4.12':
dependencies:
@@ -4618,14 +4483,6 @@ snapshots:
path-browserify: 1.0.1
vscode-uri: 3.1.0
- '@vue/compiler-core@3.4.38':
- dependencies:
- '@babel/parser': 7.24.7
- '@vue/shared': 3.4.38
- entities: 4.5.0
- estree-walker: 2.0.2
- source-map-js: 1.2.0
-
'@vue/compiler-core@3.5.13':
dependencies:
'@babel/parser': 7.27.0
@@ -4634,32 +4491,27 @@ snapshots:
estree-walker: 2.0.2
source-map-js: 1.2.1
- '@vue/compiler-dom@3.4.38':
- dependencies:
- '@vue/compiler-core': 3.4.38
- '@vue/shared': 3.4.38
-
'@vue/compiler-dom@3.5.13':
dependencies:
'@vue/compiler-core': 3.5.13
'@vue/shared': 3.5.13
- '@vue/compiler-sfc@3.4.38':
+ '@vue/compiler-sfc@3.5.13':
dependencies:
- '@babel/parser': 7.24.7
- '@vue/compiler-core': 3.4.38
- '@vue/compiler-dom': 3.4.38
- '@vue/compiler-ssr': 3.4.38
- '@vue/shared': 3.4.38
+ '@babel/parser': 7.27.0
+ '@vue/compiler-core': 3.5.13
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
estree-walker: 2.0.2
- magic-string: 0.30.10
- postcss: 8.4.41
- source-map-js: 1.2.0
+ magic-string: 0.30.17
+ postcss: 8.5.3
+ source-map-js: 1.2.1
- '@vue/compiler-ssr@3.4.38':
+ '@vue/compiler-ssr@3.5.13':
dependencies:
- '@vue/compiler-dom': 3.4.38
- '@vue/shared': 3.4.38
+ '@vue/compiler-dom': 3.5.13
+ '@vue/shared': 3.5.13
'@vue/compiler-vue2@2.7.16':
dependencies:
@@ -4668,6 +4520,8 @@ snapshots:
'@vue/devtools-api@6.6.3': {}
+ '@vue/devtools-api@6.6.4': {}
+
'@vue/language-core@2.2.8(typescript@5.5.4)':
dependencies:
'@volar/language-core': 2.4.12
@@ -4681,36 +4535,34 @@ snapshots:
optionalDependencies:
typescript: 5.5.4
- '@vue/reactivity@3.4.38':
+ '@vue/reactivity@3.5.13':
dependencies:
- '@vue/shared': 3.4.38
+ '@vue/shared': 3.5.13
- '@vue/runtime-core@3.4.38':
+ '@vue/runtime-core@3.5.13':
dependencies:
- '@vue/reactivity': 3.4.38
- '@vue/shared': 3.4.38
+ '@vue/reactivity': 3.5.13
+ '@vue/shared': 3.5.13
- '@vue/runtime-dom@3.4.38':
+ '@vue/runtime-dom@3.5.13':
dependencies:
- '@vue/reactivity': 3.4.38
- '@vue/runtime-core': 3.4.38
- '@vue/shared': 3.4.38
+ '@vue/reactivity': 3.5.13
+ '@vue/runtime-core': 3.5.13
+ '@vue/shared': 3.5.13
csstype: 3.1.3
- '@vue/server-renderer@3.4.38(vue@3.4.38(typescript@5.5.4))':
+ '@vue/server-renderer@3.5.13(vue@3.5.13(typescript@5.5.4))':
dependencies:
- '@vue/compiler-ssr': 3.4.38
- '@vue/shared': 3.4.38
- vue: 3.4.38(typescript@5.5.4)
-
- '@vue/shared@3.4.38': {}
+ '@vue/compiler-ssr': 3.5.13
+ '@vue/shared': 3.5.13
+ vue: 3.5.13(typescript@5.5.4)
'@vue/shared@3.5.13': {}
- '@vuepic/vue-datepicker@8.8.1(vue@3.4.38(typescript@5.5.4))':
+ '@vuepic/vue-datepicker@8.8.1(vue@3.5.13(typescript@5.5.4))':
dependencies:
date-fns: 3.6.0
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
'@webassemblyjs/ast@1.9.0':
dependencies:
@@ -4809,9 +4661,6 @@ snapshots:
'@yr/monotone-cubic-spline@1.0.3': {}
- abbrev@1.1.1:
- optional: true
-
abort-controller@3.0.0:
dependencies:
event-target-shim: 5.0.1
@@ -4829,13 +4678,6 @@ snapshots:
acorn@8.14.1: {}
- agent-base@6.0.2:
- dependencies:
- debug: 4.3.4
- transitivePeerDependencies:
- - supports-color
- optional: true
-
ajv-errors@1.0.1(ajv@6.12.6):
dependencies:
ajv: 6.12.6
@@ -4891,9 +4733,6 @@ snapshots:
aproba@1.2.0: {}
- aproba@2.0.0:
- optional: true
-
archiver-utils@5.0.2:
dependencies:
glob: 10.4.5
@@ -4914,12 +4753,6 @@ snapshots:
tar-stream: 3.1.7
zip-stream: 6.0.1
- are-we-there-yet@2.0.0:
- dependencies:
- delegates: 1.0.0
- readable-stream: 3.6.2
- optional: true
-
argparse@1.0.10:
dependencies:
sprintf-js: 1.0.3
@@ -4958,17 +4791,17 @@ snapshots:
atob@2.1.2: {}
- autoprefixer@10.4.20(postcss@8.5.3):
+ autoprefixer@10.4.21(postcss@8.5.3):
dependencies:
- browserslist: 4.23.3
+ browserslist: 4.24.4
caniuse-lite: 1.0.30001707
fraction.js: 4.3.7
normalize-range: 0.1.2
- picocolors: 1.0.1
+ picocolors: 1.1.1
postcss: 8.5.3
postcss-value-parser: 4.2.0
- axios@1.7.4:
+ axios@1.8.4:
dependencies:
follow-redirects: 1.15.6
form-data: 4.0.0
@@ -5115,12 +4948,12 @@ snapshots:
dependencies:
pako: 1.0.11
- browserslist@4.23.3:
+ browserslist@4.24.4:
dependencies:
caniuse-lite: 1.0.30001707
- electron-to-chromium: 1.5.13
- node-releases: 2.0.18
- update-browserslist-db: 1.1.0(browserslist@4.23.3)
+ electron-to-chromium: 1.5.126
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.3(browserslist@4.24.4)
buffer-builder@0.2.0: {}
@@ -5218,16 +5051,6 @@ snapshots:
caniuse-lite@1.0.30001707: {}
- canvas@2.11.2:
- dependencies:
- '@mapbox/node-pre-gyp': 1.0.11
- nan: 2.19.0
- simple-get: 3.1.1
- transitivePeerDependencies:
- - encoding
- - supports-color
- optional: true
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -5268,9 +5091,6 @@ snapshots:
chownr@1.1.4: {}
- chownr@2.0.0:
- optional: true
-
chrome-trace-event@1.0.4: {}
ci-info@4.0.0: {}
@@ -5324,9 +5144,6 @@ snapshots:
color-name@1.1.4: {}
- color-support@1.1.3:
- optional: true
-
colorjs.io@0.5.2: {}
combined-stream@1.0.8:
@@ -5378,9 +5195,6 @@ snapshots:
console-browserify@1.2.0: {}
- console-control-strings@1.1.0:
- optional: true
-
constants-browserify@1.0.0: {}
content-disposition@0.5.4:
@@ -5464,6 +5278,8 @@ snapshots:
date-fns@3.6.0: {}
+ dayjs@1.11.13: {}
+
de-indent@1.0.2: {}
debug@2.6.9:
@@ -5480,11 +5296,6 @@ snapshots:
decode-uri-component@0.2.2: {}
- decompress-response@4.2.1:
- dependencies:
- mimic-response: 2.1.0
- optional: true
-
deep-is@0.1.4: {}
default-browser-id@5.0.0: {}
@@ -5529,9 +5340,6 @@ snapshots:
delayed-stream@1.0.0: {}
- delegates@1.0.0:
- optional: true
-
depd@2.0.0: {}
des.js@1.1.0:
@@ -5541,9 +5349,6 @@ snapshots:
destroy@1.2.0: {}
- detect-libc@2.0.3:
- optional: true
-
diffie-hellman@5.0.3:
dependencies:
bn.js: 4.12.1
@@ -5584,7 +5389,7 @@ snapshots:
ee-first@1.1.1: {}
- electron-to-chromium@1.5.13: {}
+ electron-to-chromium@1.5.126: {}
elementtree@0.1.7:
dependencies:
@@ -5614,20 +5419,6 @@ snapshots:
dependencies:
once: 1.4.0
- engine.io-client@6.5.3:
- dependencies:
- '@socket.io/component-emitter': 3.1.1
- debug: 4.3.4
- engine.io-parser: 5.2.2
- ws: 8.11.0
- xmlhttprequest-ssl: 2.0.0
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
- engine.io-parser@5.2.2: {}
-
enhanced-resolve@4.5.0:
dependencies:
graceful-fs: 4.2.11
@@ -5686,6 +5477,8 @@ snapshots:
escalade@3.1.2: {}
+ escalade@3.2.0: {}
+
escape-html@1.0.3: {}
escape-string-regexp@4.0.0: {}
@@ -5990,11 +5783,6 @@ snapshots:
jsonfile: 6.1.0
universalify: 2.0.1
- fs-minipass@2.1.0:
- dependencies:
- minipass: 3.3.6
- optional: true
-
fs-write-stream-atomic@1.0.10:
dependencies:
graceful-fs: 4.2.11
@@ -6018,19 +5806,6 @@ snapshots:
function-bind@1.1.2: {}
- gauge@3.0.2:
- dependencies:
- aproba: 2.0.0
- color-support: 1.1.3
- console-control-strings: 1.1.0
- has-unicode: 2.0.1
- object-assign: 4.1.1
- signal-exit: 3.0.7
- string-width: 4.2.3
- strip-ansi: 6.0.1
- wide-align: 1.1.5
- optional: true
-
get-caller-file@2.0.5: {}
get-intrinsic@1.2.4:
@@ -6115,9 +5890,6 @@ snapshots:
has-symbols@1.1.0: {}
- has-unicode@2.0.1:
- optional: true
-
has-value@0.3.1:
dependencies:
get-value: 2.0.6
@@ -6183,14 +5955,6 @@ snapshots:
https-browserify@1.0.0: {}
- https-proxy-agent@5.0.1:
- dependencies:
- agent-base: 6.0.2
- debug: 4.3.4
- transitivePeerDependencies:
- - supports-color
- optional: true
-
iconv-lite@0.4.24:
dependencies:
safer-buffer: 2.1.2
@@ -6384,7 +6148,7 @@ snapshots:
jwt-decode@4.0.0: {}
- keycloak-js@25.0.4:
+ keycloak-js@25.0.6:
dependencies:
js-sha256: 0.11.0
jwt-decode: 4.0.0
@@ -6468,25 +6232,15 @@ snapshots:
dependencies:
yallist: 3.1.1
- lru-cache@6.0.0:
+ magic-string@0.30.17:
dependencies:
- yallist: 4.0.0
- optional: true
-
- magic-string@0.30.10:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/sourcemap-codec': 1.5.0
make-dir@2.1.0:
dependencies:
pify: 4.0.1
semver: 5.7.2
- make-dir@3.1.0:
- dependencies:
- semver: 6.3.1
- optional: true
-
map-cache@0.2.2: {}
map-visit@1.0.0:
@@ -6608,13 +6362,10 @@ snapshots:
mime@1.6.0: {}
- mime@4.0.4: {}
+ mime@4.0.6: {}
mimic-fn@2.1.0: {}
- mimic-response@2.1.0:
- optional: true
-
mimoza@1.0.0:
dependencies:
mime-db: 1.52.0
@@ -6637,22 +6388,8 @@ snapshots:
minimist@1.2.8: {}
- minipass@3.3.6:
- dependencies:
- yallist: 4.0.0
- optional: true
-
- minipass@5.0.0:
- optional: true
-
minipass@7.1.2: {}
- minizlib@2.1.2:
- dependencies:
- minipass: 3.3.6
- yallist: 4.0.0
- optional: true
-
mississippi@3.0.0:
dependencies:
concat-stream: 1.6.2
@@ -6675,9 +6412,6 @@ snapshots:
dependencies:
minimist: 1.2.8
- mkdirp@1.0.4:
- optional: true
-
mlly@1.7.4:
dependencies:
acorn: 8.14.1
@@ -6706,16 +6440,11 @@ snapshots:
mute-stream@1.0.0: {}
- nan@2.19.0:
- optional: true
-
nan@2.22.2:
optional: true
nanoid@3.3.11: {}
- nanoid@3.3.7: {}
-
nanomatch@1.2.13:
dependencies:
arr-diff: 4.0.0
@@ -6777,12 +6506,7 @@ snapshots:
util: 0.11.1
vm-browserify: 1.1.2
- node-releases@2.0.18: {}
-
- nopt@5.0.0:
- dependencies:
- abbrev: 1.1.1
- optional: true
+ node-releases@2.0.19: {}
normalize-path@2.1.1:
dependencies:
@@ -6793,19 +6517,8 @@ snapshots:
normalize-range@0.1.2: {}
- npmlog@5.0.1:
- dependencies:
- are-we-there-yet: 2.0.0
- console-control-strings: 1.1.0
- gauge: 3.0.2
- set-blocking: 2.0.0
- optional: true
-
number-to-words@1.2.4: {}
- object-assign@4.1.1:
- optional: true
-
object-copy@0.1.0:
dependencies:
copy-descriptor: 0.1.1
@@ -6849,7 +6562,7 @@ snapshots:
dependencies:
mimic-fn: 2.1.0
- open-props@1.7.5: {}
+ open-props@1.7.14: {}
open@10.1.0:
dependencies:
@@ -6970,9 +6683,6 @@ snapshots:
path-to-regexp@0.1.12: {}
- path2d@0.2.1:
- optional: true
-
pathe@1.1.2: {}
pathe@2.0.3: {}
@@ -6987,15 +6697,9 @@ snapshots:
pdfjs-dist@2.6.347: {}
- pdfjs-dist@4.5.136:
+ pdfjs-dist@4.9.124:
optionalDependencies:
- canvas: 2.11.2
- path2d: 0.2.1
- transitivePeerDependencies:
- - encoding
- - supports-color
-
- picocolors@1.0.1: {}
+ '@napi-rs/canvas': 0.1.68
picocolors@1.1.1: {}
@@ -7005,13 +6709,15 @@ snapshots:
pify@4.0.1: {}
- pinia@2.2.2(typescript@5.5.4)(vue@3.4.38(typescript@5.5.4)):
+ pinia@2.3.1(typescript@5.5.4)(vue@3.5.13(typescript@5.5.4)):
dependencies:
- '@vue/devtools-api': 6.6.3
- vue: 3.4.38(typescript@5.5.4)
- vue-demi: 0.14.10(vue@3.4.38(typescript@5.5.4))
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.5.4)
+ vue-demi: 0.14.10(vue@3.5.13(typescript@5.5.4))
optionalDependencies:
typescript: 5.5.4
+ transitivePeerDependencies:
+ - '@vue/composition-api'
pkg-dir@3.0.0:
dependencies:
@@ -7023,11 +6729,11 @@ snapshots:
mlly: 1.7.4
pathe: 2.0.3
- playwright-core@1.46.1: {}
+ playwright-core@1.51.1: {}
- playwright@1.46.1:
+ playwright@1.51.1:
dependencies:
- playwright-core: 1.46.1
+ playwright-core: 1.51.1
optionalDependencies:
fsevents: 2.3.2
@@ -7035,12 +6741,6 @@ snapshots:
postcss-value-parser@4.2.0: {}
- postcss@8.4.41:
- dependencies:
- nanoid: 3.3.7
- picocolors: 1.0.1
- source-map-js: 1.2.0
-
postcss@8.5.3:
dependencies:
nanoid: 3.3.11
@@ -7049,7 +6749,7 @@ snapshots:
prelude-ls@1.2.1: {}
- prettier@3.3.3: {}
+ prettier@3.5.3: {}
process-nextick-args@2.0.1: {}
@@ -7215,11 +6915,6 @@ snapshots:
dependencies:
glob: 7.2.3
- rimraf@3.0.2:
- dependencies:
- glob: 7.2.3
- optional: true
-
ripemd160@2.0.2:
dependencies:
hash-base: 3.0.5
@@ -7411,14 +7106,6 @@ snapshots:
semver@5.7.2: {}
- semver@6.3.1:
- optional: true
-
- semver@7.6.0:
- dependencies:
- lru-cache: 6.0.0
- optional: true
-
semver@7.6.3: {}
send@0.19.0:
@@ -7456,9 +7143,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- set-blocking@2.0.0:
- optional: true
-
set-function-length@1.2.2:
dependencies:
define-data-property: 1.1.4
@@ -7533,17 +7217,7 @@ snapshots:
signal-exit@4.1.0: {}
- signature_pad@5.0.2: {}
-
- simple-concat@1.0.1:
- optional: true
-
- simple-get@3.1.1:
- dependencies:
- decompress-response: 4.2.1
- once: 1.4.0
- simple-concat: 1.0.1
- optional: true
+ signature_pad@5.0.7: {}
snapdragon-node@2.1.1:
dependencies:
@@ -7568,28 +7242,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
- socket.io-client@4.7.5:
- dependencies:
- '@socket.io/component-emitter': 3.1.1
- debug: 4.3.4
- engine.io-client: 6.5.3
- socket.io-parser: 4.2.4
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
- socket.io-parser@4.2.4:
- dependencies:
- '@socket.io/component-emitter': 3.1.1
- debug: 4.3.4
- transitivePeerDependencies:
- - supports-color
-
source-list-map@2.0.1: {}
- source-map-js@1.2.0: {}
-
source-map-js@1.2.1: {}
source-map-resolve@0.5.3:
@@ -7712,16 +7366,6 @@ snapshots:
fast-fifo: 1.3.2
streamx: 2.18.0
- tar@6.2.1:
- dependencies:
- chownr: 2.0.0
- fs-minipass: 2.1.0
- minipass: 5.0.0
- minizlib: 2.1.2
- mkdirp: 1.0.4
- yallist: 4.0.0
- optional: true
-
terser-webpack-plugin@1.4.6(webpack@4.47.0):
dependencies:
cacache: 12.0.4
@@ -7792,8 +7436,6 @@ snapshots:
to-arraybuffer@1.0.1: {}
- to-fast-properties@2.0.0: {}
-
to-object-path@0.3.0:
dependencies:
kind-of: 3.2.2
@@ -7891,11 +7533,11 @@ snapshots:
upath@1.2.0:
optional: true
- update-browserslist-db@1.1.0(browserslist@4.23.3):
+ update-browserslist-db@1.1.3(browserslist@4.24.4):
dependencies:
- browserslist: 4.23.3
- escalade: 3.1.2
- picocolors: 1.0.1
+ browserslist: 4.24.4
+ escalade: 3.2.0
+ picocolors: 1.1.1
uri-js@4.4.1:
dependencies:
@@ -7928,13 +7570,13 @@ snapshots:
vary@1.1.2: {}
- vite@6.2.3(@types/node@20.16.1)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0):
+ vite@6.2.3(@types/node@20.17.28)(sass-embedded@1.86.0)(sass@1.77.8)(terser@5.31.0):
dependencies:
esbuild: 0.25.1
postcss: 8.5.3
rollup: 4.37.0
optionalDependencies:
- '@types/node': 20.16.1
+ '@types/node': 20.17.28
fsevents: 2.3.3
sass: 1.77.8
sass-embedded: 1.86.0
@@ -7944,24 +7586,24 @@ snapshots:
vscode-uri@3.1.0: {}
- vue-component-type-helpers@2.1.10: {}
+ vue-component-type-helpers@2.2.8: {}
- vue-demi@0.14.10(vue@3.4.38(typescript@5.5.4)):
+ vue-demi@0.14.10(vue@3.5.13(typescript@5.5.4)):
dependencies:
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
vue-dragscroll@4.0.6(typescript@5.5.4):
dependencies:
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
transitivePeerDependencies:
- typescript
- vue-i18n@11.1.2(vue@3.4.38(typescript@5.5.4)):
+ vue-i18n@11.1.2(vue@3.5.13(typescript@5.5.4)):
dependencies:
'@intlify/core-base': 11.1.2
'@intlify/shared': 11.1.2
'@vue/devtools-api': 6.6.3
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
vue-pdf@4.3.0(webpack@4.47.0):
dependencies:
@@ -7976,10 +7618,10 @@ snapshots:
vue-resize-sensor@2.0.0: {}
- vue-router@4.4.3(vue@3.4.38(typescript@5.5.4)):
+ vue-router@4.5.0(vue@3.5.13(typescript@5.5.4)):
dependencies:
- '@vue/devtools-api': 6.6.3
- vue: 3.4.38(typescript@5.5.4)
+ '@vue/devtools-api': 6.6.4
+ vue: 3.5.13(typescript@5.5.4)
vue-tsc@2.2.8(typescript@5.5.4):
dependencies:
@@ -7987,18 +7629,18 @@ snapshots:
'@vue/language-core': 2.2.8(typescript@5.5.4)
typescript: 5.5.4
- vue3-apexcharts@1.8.0(apexcharts@4.5.0)(vue@3.4.38(typescript@5.5.4)):
+ vue3-apexcharts@1.8.0(apexcharts@4.5.0)(vue@3.5.13(typescript@5.5.4)):
dependencies:
apexcharts: 4.5.0
- vue: 3.4.38(typescript@5.5.4)
+ vue: 3.5.13(typescript@5.5.4)
- vue@3.4.38(typescript@5.5.4):
+ vue@3.5.13(typescript@5.5.4):
dependencies:
- '@vue/compiler-dom': 3.4.38
- '@vue/compiler-sfc': 3.4.38
- '@vue/runtime-dom': 3.4.38
- '@vue/server-renderer': 3.4.38(vue@3.4.38(typescript@5.5.4))
- '@vue/shared': 3.4.38
+ '@vue/compiler-dom': 3.5.13
+ '@vue/compiler-sfc': 3.5.13
+ '@vue/runtime-dom': 3.5.13
+ '@vue/server-renderer': 3.5.13(vue@3.5.13(typescript@5.5.4))
+ '@vue/shared': 3.5.13
optionalDependencies:
typescript: 5.5.4
@@ -8079,11 +7721,6 @@ snapshots:
dependencies:
isexe: 2.0.0
- wide-align@1.1.5:
- dependencies:
- string-width: 4.2.3
- optional: true
-
wildcard@2.0.1: {}
word-wrap@1.2.5: {}
@@ -8118,10 +7755,6 @@ snapshots:
wrappy@1.0.2: {}
- ws@8.11.0: {}
-
- xmlhttprequest-ssl@2.0.0: {}
-
xtend@4.0.2: {}
y18n@4.0.3: {}
@@ -8130,9 +7763,6 @@ snapshots:
yallist@3.1.1: {}
- yallist@4.0.0:
- optional: true
-
yaml-eslint-parser@1.2.2:
dependencies:
eslint-visitor-keys: 3.4.3
diff --git a/public/images/customer-CORP-avartar-female.png b/public/images/customer-CORP-avartar-female.png
index 446ef866..4cbb894f 100644
Binary files a/public/images/customer-CORP-avartar-female.png and b/public/images/customer-CORP-avartar-female.png differ
diff --git a/public/images/customer-CORP-avartar-male.png b/public/images/customer-CORP-avartar-male.png
index 6ad95d7d..ae177f60 100644
Binary files a/public/images/customer-CORP-avartar-male.png and b/public/images/customer-CORP-avartar-male.png differ
diff --git a/public/images/customer-PERS-avartar-female.png b/public/images/customer-PERS-avartar-female.png
index ca0a2bf1..c3ba574e 100644
Binary files a/public/images/customer-PERS-avartar-female.png and b/public/images/customer-PERS-avartar-female.png differ
diff --git a/public/images/customer-PERS-avartar-male.png b/public/images/customer-PERS-avartar-male.png
index e9fd15fe..ce0ab20c 100644
Binary files a/public/images/customer-PERS-avartar-male.png and b/public/images/customer-PERS-avartar-male.png differ
diff --git a/public/images/employee-avatar-female.png b/public/images/employee-avatar-female.png
index 66ace3a0..ce9370f1 100644
Binary files a/public/images/employee-avatar-female.png and b/public/images/employee-avatar-female.png differ
diff --git a/public/images/employee-avatar-male.png b/public/images/employee-avatar-male.png
index a8daa8ff..aaf5fb1f 100644
Binary files a/public/images/employee-avatar-male.png and b/public/images/employee-avatar-male.png differ
diff --git a/public/img-group.png b/public/img-group.png
new file mode 100644
index 00000000..0493168b
Binary files /dev/null and b/public/img-group.png differ
diff --git a/public/no-img-female.png b/public/no-img-female.png
index 4e177dca..95f959ff 100644
Binary files a/public/no-img-female.png and b/public/no-img-female.png differ
diff --git a/public/no-img-man.png b/public/no-img-man.png
index 861f356a..f0ccba15 100644
Binary files a/public/no-img-man.png and b/public/no-img-man.png differ
diff --git a/public/option/option.json b/public/option/option.json
index bce4fc0a..963c4ad2 100644
--- a/public/option/option.json
+++ b/public/option/option.json
@@ -1,5 +1,28 @@
{
"eng": {
+ "visaType": [
+ {
+ "label": "Non-LA",
+ "value": "nla"
+ },
+ {
+ "label": "Non-B",
+ "value": "nb"
+ },
+ {
+ "label": "TV.60",
+ "value": "tv60"
+ },
+ {
+ "label": "Non-TR",
+ "value": "ntr"
+ },
+ {
+ "label": "TV.30",
+ "value": "tv30"
+ }
+ ],
+
"workerStatus": [
{
"label": "Normal",
@@ -154,20 +177,21 @@
{ "label": "VS2", "value": "VS2" },
{ "label": "WO", "value": "WO" },
{ "label": "WP390", "value": "WP390" },
- { "label": "WP44", "value": "WP44" }
+ { "label": "WP44", "value": "WP44" },
+ { "label": "CUST", "value": "CUST" }
],
"prefix": [
{
- "label": "Mr",
+ "label": "MR",
"value": "mr"
},
{
- "label": "Mrs",
+ "label": "MRS",
"value": "mrs"
},
{
- "label": "Miss",
+ "label": "MISS",
"value": "miss"
}
],
@@ -183,29 +207,44 @@
}
],
- "training": [
+ "border": [
{
- "label": "Myanmar Labor Training Center - Mae Sot, Tak Province",
+ "label": "Mae Sot, Tak Province",
"value": "trainingTak"
},
{
- "label": "Myanmar Labor Training Center - Kawthoung, Ranong Province",
+ "label": "Koh Song, Ranong province",
"value": "trainingRanong"
},
{
- "label": "Laos Labor Training Center - Nong Khai, Nong Khai Province",
+ "label": "Nong Khai, Nong Khai Province",
"value": "trainingNongKhai"
},
{
- "label": "Cambodian Labor Training Center - Aranyaprathet, Sa Kaeo Province",
+ "label": "Aranyaprathet, Sa Kaeo Province",
"value": "trainingSaKaeo"
},
{
- "label": "Cambodian Labor Training Center - Ban Laem, Chanthaburi Province",
+ "label": "Ban Laem, Chanthaburi Province",
"value": "trainingChanthaburi"
}
],
+ "training": [
+ {
+ "label": "The first center accepts work. and end of employment Tak Province",
+ "value": "trainingTak"
+ },
+ {
+ "label": "The first center accepts work. and end of employment Nong Khai Province",
+ "value": "trainingNongKhai"
+ },
+ {
+ "label": "The first center accepts work. and end of employment Sa Kaeo Province",
+ "value": "trainingSaKaeo"
+ }
+ ],
+
"nationality": [
{
"label": "Thai",
@@ -1050,6 +1089,29 @@
},
"tha": {
+ "visaType": [
+ {
+ "label": "Non-LA",
+ "value": "nla"
+ },
+ {
+ "label": "Non-B",
+ "value": "nb"
+ },
+ {
+ "label": "ผผ.60",
+ "value": "tv60"
+ },
+ {
+ "label": "Non-TR",
+ "value": "ntr"
+ },
+ {
+ "label": "ผผ.30",
+ "value": "tv30"
+ }
+ ],
+
"workerStatus": [
{
"label": "ปกติ",
@@ -1204,7 +1266,8 @@
{ "label": "VS2", "value": "VS2" },
{ "label": "WO", "value": "WO" },
{ "label": "WP390", "value": "WP390" },
- { "label": "WP44", "value": "WP44" }
+ { "label": "WP44", "value": "WP44" },
+ { "label": "CUST", "value": "CUST" }
],
"prefix": [
@@ -1233,29 +1296,44 @@
}
],
- "training": [
+ "border": [
{
- "label": "สถานที่อบรมแรงงานเมียนมา-แม่สอด จ.ตาก",
+ "label": "แม่สอด จ.ตาก",
"value": "trainingTak"
},
{
- "label": "สถานที่อบรมแรงงานเมียนมา-เกาะสอง จ.ระนอง",
+ "label": "เกาะสอง จ.ระนอง",
"value": "trainingRanong"
},
{
- "label": "สถานที่อบรมแรงงานลาว-หนองคาย จ.หนองคาย",
+ "label": "หนองคาย จ.หนองคาย",
"value": "trainingNongKhai"
},
{
- "label": "สถานที่อบรมแรงงานกัมพูชา-อรัญประเทศ จ.สระแก้ว",
+ "label": "อรัญประเทศ จ.สระแก้ว",
"value": "trainingSaKaeo"
},
{
- "label": "สถานที่อบรมแรงงานกัมพูชา-บ้านแหลม จ.จันทบุรี",
+ "label": "บ้านแหลม จ.จันทบุรี",
"value": "trainingChanthaburi"
}
],
+ "training": [
+ {
+ "label": "ศูนย์แรกรับเข้าทำงาน และสิ้นสุดการจ้าง จังหวัดตาก",
+ "value": "trainingTak"
+ },
+ {
+ "label": "ศูนย์แรกรับเข้าทำงาน และสิ้นสุดการจ้าง จังหวัดหนองคาย",
+ "value": "trainingNongKhai"
+ },
+ {
+ "label": "ศูนย์แรกรับเข้าทำงาน และสิ้นสุดการจ้าง จังหวัดสระแก้ว",
+ "value": "trainingSaKaeo"
+ }
+ ],
+
"nationality": [
{
"label": "ไทย",
diff --git a/quasar.config.ts b/quasar.config.ts
index cc0715ad..38bb94c1 100644
--- a/quasar.config.ts
+++ b/quasar.config.ts
@@ -31,7 +31,7 @@ export default defineConfig((ctx) => {
devServer: {
host: '0.0.0.0',
open: false,
- port: 5173,
+ port: 5174,
},
framework: {
config: {},
diff --git a/src/boot/i18n.ts b/src/boot/i18n.ts
index 647f3d10..9430c38a 100644
--- a/src/boot/i18n.ts
+++ b/src/boot/i18n.ts
@@ -2,6 +2,7 @@ import { defineBoot } from '#q-app/wrappers';
import { createI18n } from 'vue-i18n';
import messages from 'src/i18n';
+import { Lang } from 'src/utils/ui';
export type MessageLanguages = keyof typeof messages;
// Type-define 'eng' as the master schema for the resource
@@ -26,7 +27,7 @@ export const i18n = createI18n<
MessageLanguages,
false
>({
- locale: 'en-US',
+ locale: 'tha',
legacy: false,
messages,
});
diff --git a/src/components/01_branch-management/BranchCard.vue b/src/components/01_branch-management/BranchCard.vue
index 83c268ba..c10d63fc 100644
--- a/src/components/01_branch-management/BranchCard.vue
+++ b/src/components/01_branch-management/BranchCard.vue
@@ -89,15 +89,7 @@ defineProps<{
-
+
();
defineEmits<{
@@ -121,7 +122,7 @@ watch(
/>
{{ $t(`${title}`) }}
-
+
{{ `${$t('branch.form.bankAccountNo')} ${i + 1}` }}
@@ -172,7 +176,8 @@ watch(
-
- (virtual = v === 'Virtual')"
- :rules="[(val) => val && val.length > 0]"
- :error-message="$t('form.error.required')"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
diff --git a/src/components/02_personnel-management/FormByType.vue b/src/components/02_personnel-management/FormByType.vue
index 526afa95..d1709858 100644
--- a/src/components/02_personnel-management/FormByType.vue
+++ b/src/components/02_personnel-management/FormByType.vue
@@ -1,13 +1,13 @@
@@ -186,11 +133,12 @@ watch(
/>
-
(typeof v === 'string' ? (sourceNationality = v) : '')
"
- @clear="sourceNationality = ''"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
-
+
+
(typeof v === 'string' ? (importNationality = v) : '')
- "
- @clear="importNationality = ''"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
- (typeof v === 'string' ? (trainingPlace = v) : '')
- "
- @clear="trainingPlace = ''"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
-
+
+ (typeof v === 'string' ? (checkpoint = v) : '')
"
- @clear="checkpoint = ''"
+ />
+
+ (typeof v === 'string' ? (trainingPlace = v) : '')
+ "
+ />
+
+ (typeof v === 'string' ? (agencyStatus = v) : '')
+ "
/>
(typeof v === 'string' ? (checkpointEN = v) : '')
- "
- @clear="checkpointEN = ''"
- />
-
-
-
-
-
-
-
- {{ file.file.name }}
-
-
-
-
-
+ type="textarea"
+ :model-value="readonly ? remark || '-' : remark"
+ @update:model-value="
+ (v) => (typeof v === 'string' ? (remark = v) : '')
+ "
+ @clear="remark = ''"
+ />
+
-
-
- openNewTab(item.url)"
- >
-
-
-
- {{ item.name }}
-
-
+
+
+
+
+
+
+
+ {{ file.file.name }}
+
+
+
+
+
+
+
+
+ openNewTab(item.url)"
+ >
+
+
+
+ {{ item.name }}
-
-
-
-
+
+
+
+
+
diff --git a/src/components/02_personnel-management/FormPerson.vue b/src/components/02_personnel-management/FormPerson.vue
index 5fa321b6..cb0463af 100644
--- a/src/components/02_personnel-management/FormPerson.vue
+++ b/src/components/02_personnel-management/FormPerson.vue
@@ -1,10 +1,8 @@
@@ -152,40 +96,19 @@ watch(
for="input-citizen-id"
/>
- (typeof v === 'string' ? (prefixName = v) : '')
+ :rules="
+ agency ? [] : [(val: string) => !!val || $t('form.error.required')]
"
- @clear="prefixName = ''"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
+ :label="$t('personnel.form.prefixName')"
+ class="col-md-1 col-6"
+ v-model="prefixName"
+ />
- (typeof v === 'string' ? (prefixName = v) : '')
- "
- @clear="prefixName = ''"
+ v-model="prefixName"
/>
@@ -328,16 +253,13 @@ watch(
hide-bottom-space
:readonly="readonly"
:label="$t('form.email')"
- :rules="
- readonly
- ? undefined
- : [
- (v: string) =>
- !v ||
- /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g.test(v) ||
- $t('form.error.invalid'),
- ]
- "
+ :rules="[
+ (val) => (val && val.length > 0) || $t('form.error.required'),
+ (v: string) =>
+ !v ||
+ /^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$/g.test(v) ||
+ $t('form.error.invalid'),
+ ]"
class="col-md-3 col-6"
:model-value="readonly ? email || '-' : email"
@update:model-value="(v) => (typeof v === 'string' ? (email = v) : '')"
@@ -353,39 +275,16 @@ watch(
-
(typeof v === 'string' ? (gender = v) : '')"
- @clear="gender = ''"
- >
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
+ class="col-md-2 col-6"
+ v-model="gender"
+ />
-
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
-
+
+
+
(typeof v === 'string' ? (contactName = v) : '')
+ "
+ />
+
+ (typeof v === 'string' ? (contactTel = v) : '')
+ "
>
-
-
-
- {{ $t('general.noData') }}
-
-
+
+
-
+
diff --git a/src/components/03_customer-management/DialogEmployee.vue b/src/components/03_customer-management/DialogEmployee.vue
new file mode 100644
index 00000000..db428f83
--- /dev/null
+++ b/src/components/03_customer-management/DialogEmployee.vue
@@ -0,0 +1,1656 @@
+
+
+
+
+
{
+ employeeFormState.imageDialog = true;
+ employeeFormState.isImageEdit = false;
+ }
+ "
+ @edit="
+ () => {
+ if (currentFromDataEmployee.id) {
+ fetchImageList(
+ currentFromDataEmployee.id,
+ currentFromDataEmployee.selectedImage || '',
+ 'employee',
+ );
+ }
+ employeeFormState.imageDialog =
+ employeeFormState.isImageEdit = true;
+ }
+ "
+ @update:toggle-status="
+ () => {
+ currentFromDataEmployee.status =
+ currentFromDataEmployee.status === 'CREATED'
+ ? 'INACTIVE'
+ : 'CREATED';
+ }
+ "
+ />
+
+
+
+
+
+ {
+ if (!v) return;
+ if (!currentFromDataEmployee.id) return;
+ await employeeStore.addImageList(
+ v,
+ currentFromDataEmployee.id,
+ Date.now().toString(),
+ );
+ await fetchImageList(
+ currentFromDataEmployee.id,
+ currentFromDataEmployee.selectedImage || '',
+ 'employee',
+ );
+ }
+ "
+ @remove-image="
+ async (v) => {
+ if (!v) return;
+ if (!currentFromDataEmployee.id) return;
+ const name = v.split('/').pop() || '';
+ await employeeStore.deleteImageByName(currentFromDataEmployee.id, name);
+ await fetchImageList(
+ currentFromDataEmployee.id,
+ currentFromDataEmployee.selectedImage || '',
+ 'employee',
+ );
+ }
+ "
+ @submit="
+ async (v) => {
+ if (employeeFormState.dialogModal && !currentFromDataEmployee.id) {
+ employeeFormState.profileUrl = v;
+ employeeFormState.imageDialog = false;
+ } else {
+ refreshImageState = true;
+ employeeFormState.dialogType = 'edit';
+ currentFromDataEmployee.selectedImage = v;
+ employeeFormState.imageList
+ ? (employeeFormState.imageList.selectedImage = v)
+ : '';
+ employeeFormState.profileUrl = `${baseUrl}/employee/${currentFromDataEmployee.id && currentFromDataEmployee.id}/image/${v}`;
+ employeeFormStore.resetFormDataEmployee();
+ await employeeFormStore.submitPersonal(onCreateImageList);
+ employeeFormState.imageDialog = false;
+ refreshImageState = false;
+ employeeFormState.isEmployeeEdit = false;
+ employeeFormState.dialogType = 'info';
+ await fetchListEmployee();
+ }
+ }
+ "
+ >
+
+
+ {{ $t('general.image') }}
+ {{
+ $i18n.locale === 'eng'
+ ? `${currentFromDataEmployee.firstNameEN || currentFromDataEmployee.firstName} ${currentFromDataEmployee.lastNameEN || currentFromDataEmployee.lastName}`
+ : `${currentFromDataEmployee.firstName} ${currentFromDataEmployee.lastName}`
+ }}
+
+
+
+
+
+
+
diff --git a/src/components/03_customer-management/DrawerEmployee.vue b/src/components/03_customer-management/DrawerEmployee.vue
new file mode 100644
index 00000000..1c1d39bf
--- /dev/null
+++ b/src/components/03_customer-management/DrawerEmployee.vue
@@ -0,0 +1,1772 @@
+
+
+
+
+
+
+
{
+ employeeFormState.isImageEdit = false;
+ employeeFormStore.resetFormDataEmployee();
+ employeeFormState.isEmployeeEdit = false;
+ employeeFormState.dialogType = 'info';
+ employeeFormState.currentIndexPassport = -1;
+ }
+ "
+ @view="
+ () => {
+ employeeFormState.imageDialog = true;
+ employeeFormState.isImageEdit = false;
+ }
+ "
+ @edit="
+ employeeFormState.imageDialog = employeeFormState.isImageEdit = true
+ "
+ @update:toggle-status="
+ (v) => {
+ if (currentFromDataEmployee.id !== undefined)
+ $emit('changeStatus', v);
+ }
+ "
+ :active="currentFromDataEmployee.status !== 'INACTIVE'"
+ use-toggle
+ color="white"
+ icon="mdi-account-outline"
+ :bg-color="
+ employeeFormState.profileUrl
+ ? 'white'
+ : 'linear-gradient(135deg, rgba(43,137,223,1) 0%, rgba(230,51,81,1) 100%)'
+ "
+ v-model:current-tab="employeeFormState.currentTab"
+ v-model:toggle-status="currentFromDataEmployee.status"
+ fallback-cover="/images/employee-banner.png"
+ :title="
+ employeeFormState.currentEmployee
+ ? setPrefixName(
+ {
+ namePrefix: employeeFormState.currentEmployee.namePrefix,
+ firstName:
+ employeeFormState.currentEmployee.firstName ||
+ employeeFormState.currentEmployee.firstNameEN,
+ lastName:
+ employeeFormState.currentEmployee.lastName ||
+ employeeFormState.currentEmployee.lastNameEN,
+ firstNameEN: employeeFormState.currentEmployee.firstNameEN,
+ lastNameEN: employeeFormState.currentEmployee.lastNameEN,
+ },
+ { locale },
+ )
+ : '-'
+ "
+ :caption="currentFromDataEmployee.code"
+ :img="
+ `${baseUrl}/employee/${currentFromDataEmployee.id}/image/${currentFromDataEmployee.selectedImage}`.concat(
+ refreshImageState ? `?ts=${Date.now()}` : '',
+ ) || null
+ "
+ :fallbackImg="`/images/employee-avatar-${currentFromDataEmployee.gender === 'male' ? 'male' : 'female'}.png`"
+ :tabs-list="[
+ {
+ name: 'personalInfo',
+ label: $t('customerEmployee.form.group.personalInfo'),
+ },
+ {
+ name: 'passport',
+ label: $t('customerEmployee.fileType.passport'),
+ },
+ {
+ name: 'visa',
+ label: $t('customerEmployee.form.group.visa'),
+ },
+ {
+ name: 'healthCheck',
+ label: $t('customerEmployee.form.group.healthCheck'),
+ },
+ {
+ name: 'workHistory',
+ label: $t('customerEmployee.form.group.workHistory'),
+ },
+ { name: 'other', label: $t('customerEmployee.form.group.other') },
+ ]"
+ :toggle-title="$t('status.title')"
+ />
+
+
+
+
+
+ {
+ if (!v) return;
+ if (!currentFromDataEmployee.id) return;
+ await employeeStore.addImageList(
+ v,
+ currentFromDataEmployee.id,
+ Date.now().toString(),
+ );
+ await fetchImageList(
+ currentFromDataEmployee.id,
+ currentFromDataEmployee.selectedImage || '',
+ 'employee',
+ );
+ }
+ "
+ @remove-image="
+ async (v) => {
+ if (!v) return;
+ if (!currentFromDataEmployee.id) return;
+ const name = v.split('/').pop() || '';
+ await employeeStore.deleteImageByName(currentFromDataEmployee.id, name);
+ await fetchImageList(
+ currentFromDataEmployee.id,
+ currentFromDataEmployee.selectedImage || '',
+ 'employee',
+ );
+ }
+ "
+ @submit="
+ async (v) => {
+ if (employeeFormState.dialogModal && !currentFromDataEmployee.id) {
+ employeeFormState.profileUrl = v;
+ employeeFormState.imageDialog = false;
+ } else {
+ refreshImageState = true;
+ employeeFormState.dialogType = 'edit';
+ currentFromDataEmployee.selectedImage = v;
+ employeeFormState.imageList
+ ? (employeeFormState.imageList.selectedImage = v)
+ : '';
+ employeeFormState.profileUrl = `${baseUrl}/employee/${currentFromDataEmployee.id && currentFromDataEmployee.id}/image/${v}`;
+ employeeFormStore.resetFormDataEmployee();
+ await employeeFormStore.submitPersonal(onCreateImageList);
+ employeeFormState.imageDialog = false;
+ refreshImageState = false;
+ employeeFormState.isEmployeeEdit = false;
+ employeeFormState.dialogType = 'info';
+ await fetchListEmployee();
+ }
+ }
+ "
+ >
+
+
+ {{ $t('general.image') }}
+ {{
+ $i18n.locale === 'eng'
+ ? `${currentFromDataEmployee.firstNameEN || currentFromDataEmployee.firstName} ${currentFromDataEmployee.lastNameEN || currentFromDataEmployee.lastName}`
+ : `${currentFromDataEmployee.firstName} ${currentFromDataEmployee.lastName}`
+ }}
+
+
+
+
+
+
+
diff --git a/src/components/03_customer-management/FormEmployeeHealthCheck.vue b/src/components/03_customer-management/FormEmployeeHealthCheck.vue
index b08e7a70..f8690dbe 100644
--- a/src/components/03_customer-management/FormEmployeeHealthCheck.vue
+++ b/src/components/03_customer-management/FormEmployeeHealthCheck.vue
@@ -268,6 +268,7 @@ const insuranceCompanyFilter = selectFilterOptionRefMod(
('employeeOther');
:readonly="readonly || employeeOther.statusSave"
hide-bottom-space
class="col-md-3 col-6"
- :label="$t('form.firstName')"
+ :label="$t('general.nativeLanguage', { msg: $t('form.firstName') })"
:model-value="employeeOther.fatherFirstName"
@update:model-value="
(v) =>
@@ -122,7 +122,7 @@ const employeeOther = defineModel('employeeOther');
:readonly="readonly || employeeOther.statusSave"
hide-bottom-space
class="col-md-3 col-6"
- :label="$t('form.lastName')"
+ :label="$t('general.nativeLanguage', { msg: $t('form.lastName') })"
:model-value="employeeOther.fatherLastName"
@update:model-value="
(v) =>
@@ -177,7 +177,7 @@ const employeeOther = defineModel('employeeOther');
:readonly="readonly || employeeOther.statusSave"
hide-bottom-space
class="col-md-3 col-6"
- :label="$t('form.firstName')"
+ :label="$t('general.nativeLanguage', { msg: $t('form.firstName') })"
:model-value="employeeOther.motherFirstName"
@update:model-value="
(v) =>
@@ -193,7 +193,7 @@ const employeeOther = defineModel('employeeOther');
:readonly="readonly || employeeOther.statusSave"
hide-bottom-space
class="col-md-3 col-6"
- :label="$t('form.lastName')"
+ :label="$t('general.nativeLanguage', { msg: $t('form.lastName') })"
:model-value="employeeOther.motherLastName"
@update:model-value="
(v) =>
diff --git a/src/components/03_customer-management/FormEmployeePassport.vue b/src/components/03_customer-management/FormEmployeePassport.vue
index 1eb9096d..06373538 100644
--- a/src/components/03_customer-management/FormEmployeePassport.vue
+++ b/src/components/03_customer-management/FormEmployeePassport.vue
@@ -9,6 +9,8 @@ import useOptionStore from 'stores/options';
import DatePicker from '../shared/DatePicker.vue';
+import { dateFormat } from 'src/utils/datetime';
+
const optionStore = useOptionStore();
const { locale } = useI18n();
@@ -18,8 +20,8 @@ const issuePlace = defineModel('issuePlace');
const issueCountry = defineModel('issueCountry');
const issueDate = defineModel('issueDate');
const type = defineModel('type');
-const expireDate = defineModel('expireDate');
-const birthDate = defineModel('birthDate');
+const expireDate = defineModel('expireDate');
+const birthDate = defineModel('birthDate');
const workerStatus = defineModel('workerStatus');
const nationality = defineModel('nationality');
const gender = defineModel('gender');
@@ -32,6 +34,8 @@ const firstName = defineModel('firstName');
const namePrefix = defineModel('namePrefix');
const passportNumber = defineModel('passportNumber');
+const file = defineModel('file');
+
const passportValidator = /[a-zA-Z]{1}[a-zA-Z0-9]{1}[0-9]{5,7}$/;
const genderOptions = ref[]>([]);
@@ -103,7 +107,7 @@ onMounted(() => {
'label',
);
passportIssuingCountryFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption.nationality),
+ ref(optionStore.rawOption?.eng.nationality),
passportIssuingCountryOptions,
'label',
);
@@ -121,13 +125,13 @@ onMounted(() => {
);
genderFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption?.gender),
+ ref(optionStore.rawOption?.eng.gender),
genderOptions,
'label',
);
nationalityFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption?.nationality),
+ ref(optionStore.rawOption?.eng.nationality),
nationalityOptions,
'label',
);
@@ -152,7 +156,7 @@ watch(
);
passportIssuingCountryFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption.nationality),
+ ref(optionStore.rawOption?.eng.nationality),
passportIssuingCountryOptions,
'label',
);
@@ -164,19 +168,43 @@ watch(
);
genderFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption?.gender),
+ ref(optionStore.rawOption?.eng.gender),
genderOptions,
'label',
);
nationalityFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption?.nationality),
+ ref(optionStore.rawOption?.eng.nationality),
nationalityOptions,
'label',
);
},
);
+function browse() {
+ inputFile?.click();
+}
+
+const inputFile = (() => {
+ const _element = document.createElement('input');
+ _element.type = 'file';
+ _element.accept = 'image/jpeg,image/png';
+ _element.addEventListener('change', change);
+ return _element;
+})();
+
+async function change(e: Event) {
+ const _element = e.target as HTMLInputElement | null;
+ const _file = _element?.files?.[0];
+
+ if (_file) {
+ const newFileName = `passport-${dateFormat(new Date().toISOString())}-${_file.name}`;
+ const renamedFile = new File([_file], newFileName, { type: _file.type });
+
+ file.value = renamedFile;
+ }
+}
+
watch(
() => namePrefix.value,
(v) => {
@@ -221,20 +249,14 @@ watch(
-
-
+
+ browse()"
+ :disable="readonly"
+ >
('arrivalAt');
const arrivalTMNo = defineModel('arrivalTmNo');
const arrivalTM = defineModel('arrivalTm');
const mrz = defineModel('mrz');
-const entryCount = defineModel('entryCount');
+const entryCount = defineModel('entryCount');
const issuePlace = defineModel('issuePlace');
const issueCountry = defineModel('issueCountry');
const issueDate = defineModel('visaIssueDate');
-const type = defineModel('visaType');
-const expireDate = defineModel('expireDate');
+const type = defineModel('type');
+const expireDate = defineModel('expireDate');
const remark = defineModel('remark');
const workerType = defineModel('workerType');
-const number = defineModel('visaNumber');
+const number = defineModel('number');
+const reportDate = defineModel('reportDate');
-const calculatedVisaDate = computed(() => {
- if (!issueDate.value) return undefined;
- return calculate90DayNext(issueDate.value);
-});
+//
+// const calculatedVisaDate = computed(() => {
+// if (!issueDate.value) return undefined;
+// return calculate90DayNext(issueDate.value);
+// });
defineProps<{
title?: string;
@@ -78,6 +80,12 @@ onMounted(async () => {
await fetchProvince();
});
+const visaIssueCountryOptions = ref[]>([]);
+let visaIssueCountryFilter: (
+ value: string,
+ update: (callbackFn: () => void, afterFn?: (ref: QSelect) => void) => void,
+) => void;
+
const visaTypeOptions = ref[]>([]);
let visaTypeFilter: (
value: string,
@@ -92,11 +100,17 @@ let workerTypeFilter: (
onMounted(() => {
visaTypeFilter = selectFilterOptionRefMod(
- ref(optionStore.globalOption?.nationality),
+ ref(optionStore.globalOption?.visaType),
visaTypeOptions,
'label',
);
+ visaIssueCountryFilter = selectFilterOptionRefMod(
+ ref(optionStore.globalOption?.nationality),
+ visaIssueCountryOptions,
+ 'label',
+ );
+
workerTypeFilter = selectFilterOptionRefMod(
ref(optionStore.globalOption?.workerType),
workerTypeOptions,
@@ -107,8 +121,14 @@ onMounted(() => {
watch(
() => optionStore.globalOption,
() => {
+ visaIssueCountryFilter = selectFilterOptionRefMod(
+ ref(optionStore.globalOption?.nationality),
+ visaIssueCountryOptions,
+ 'label',
+ );
+
visaTypeFilter = selectFilterOptionRefMod(
- optionStore.globalOption.nationality,
+ optionStore.globalOption.visaType,
visaTypeOptions,
'label',
);
@@ -120,6 +140,10 @@ watch(
);
},
);
+//
+// watch([() => issueDate.value], () => {
+// reportDate.value = calculate90DayNext(issueDate.value);
+// });
@@ -133,7 +157,7 @@ watch(
name="mdi-passport"
style="background-color: var(--surface-3)"
/>
- {{ title }}
+ {{ $t(title) }}
@@ -422,11 +448,11 @@ watch(
class="col-md-4 col-6"
:dense="dense"
:readonly="readonly"
- :options="visaTypeOptions"
+ :options="visaIssueCountryOptions"
:hide-dropdown-icon="readonly"
:for="`${prefixId}-select-issue-country`"
:label="$t('customerEmployee.form.issueCountry')"
- @filter="visaTypeFilter"
+ @filter="visaIssueCountryFilter"
:model-value="readonly ? issueCountry || '-' : issueCountry"
@update:model-value="
(v) => (typeof v === 'string' ? (issueCountry = v) : '')
diff --git a/src/components/03_customer-management/TableEmpoloyee.vue b/src/components/03_customer-management/TableEmpoloyee.vue
index e5e49b51..000c701a 100644
--- a/src/components/03_customer-management/TableEmpoloyee.vue
+++ b/src/components/03_customer-management/TableEmpoloyee.vue
@@ -22,6 +22,8 @@ const prop = withDefaults(
inTable?: boolean;
addButton?: boolean;
prefixId?: string;
+ hideAction?: boolean;
+ hideDelete?: boolean;
}>(),
{
gridView: false,
@@ -139,8 +141,9 @@ defineEmits<{
- $emit('filterOwnerBranch', val, update)"
- :rules="[
- (val: string) =>
- !!val ||
- $t('form.error.selectField', {
- field: $t('customerEmployee.branch'),
- }),
- ]"
- >
-
-
-
-
-
-
-
-
-
- {{
- scope.opt.customer.customerType === 'CORP'
- ? $t('customer.form.registerName')
- : $t('customer.form.ownerName')
- }}:
-
- {{
- scope.opt.customer.customerType === 'CORP'
- ? $i18n.locale === 'eng'
- ? scope.opt.registerNameEN
- : scope.opt.registerName
- : $i18n.locale === 'eng'
- ? `${optionStore.mapOption(scope.opt.namePrefix)} ${scope.opt.firstNameEN} ${scope.opt.lastNameEN}` ||
- '-'
- : `${optionStore.mapOption(scope.opt.namePrefix)} ${scope.opt.firstName} ${scope.opt.lastName}` ||
- '-'
- }}
- ({{ scope.opt.code }})
-
-
-
-
-
- {{
- $t(
- `branch.form.title.${scope.opt.code.endsWith('-00') ? 'branchHQLabel' : 'branchLabel'}`,
- )
- }}
-
- {{
- !scope.opt.code.endsWith('-00')
- ? +scope.opt.code.split('-')[1]
- : ''
- }}
-
-
- {{ $t('general.address') }}
- {{
- $i18n.locale === 'eng'
- ? `${scope.opt.addressEN || ''}, ${scope.opt.mooEN && `${$t('form.moo')} ${scope.opt.mooEN},`} ${scope.opt.soiEN && `${$t('form.soi')} ${scope.opt.soiEN},`} ${scope.opt.streetEN && `${scope.opt.streetEN} Rd,`} ${scope.opt.subDistrict.nameEN || ''}, ${scope.opt.district.nameEN || ''}, ${scope.opt.province.nameEN || ''}`
- : `${scope.opt.address || ''}, ${scope.opt.moo && `${$t('form.moo')} ${scope.opt.moo},`} ${scope.opt.soi && `${$t('form.soi')} ${scope.opt.soi},`} ${scope.opt.street && `${$t('form.road')} ${scope.opt.street},`} ${scope.opt.subDistrict.name || ''}, ${scope.opt.district.name || ''}, ${scope.opt.province.name || ''}`
- }}
- {{ scope.opt.subDistrict?.zipCode || '' }}
-
-
-
-
-
-
-
-
-
-
-
- {{
- scope.opt.customer.customerType === 'CORP'
- ? $t('customer.form.registerName')
- : $t('customer.form.ownerName')
- }}:
-
- {{
- scope.opt.customer.customerType === 'CORP'
- ? $i18n.locale === 'eng'
- ? scope.opt.registerNameEN
- : scope.opt.registerName
- : $i18n.locale === 'eng'
- ? `${optionStore.mapOption(scope.opt.namePrefix)} ${scope.opt.firstNameEN} ${scope.opt.lastNameEN}` ||
- '-'
- : `${optionStore.mapOption(scope.opt.namePrefix)} ${scope.opt.firstName} ${scope.opt.lastName}` ||
- '-'
- }}
- ({{ scope.opt.code }})
-
-
- {{
- $t(
- `branch.form.title.${scope.opt.code.endsWith('-00') ? 'branchHQLabel' : 'branchLabel'}`,
- )
- }}
-
- {{
- !scope.opt.code.endsWith('-00')
- ? +scope.opt.code.split('-')[1]
- : ''
- }}
-
- {{ $t('general.address') }}
- {{
- $i18n.locale === 'eng'
- ? `${scope.opt.addressEN || ''}, ${scope.opt.mooEN && `${$t('form.moo')} ${scope.opt.mooEN},`} ${scope.opt.soiEN && `${$t('form.soi')} ${scope.opt.soiEN},`} ${scope.opt.streetEN && `${scope.opt.streetEN} Rd,`} ${scope.opt.subDistrict.nameEN || ''}, ${scope.opt.district.nameEN || ''}, ${scope.opt.province.nameEN || ''}`
- : `${scope.opt.address || ''}, ${scope.opt.moo && `${$t('form.moo')} ${scope.opt.moo},`} ${scope.opt.soi && `${$t('form.soi')} ${scope.opt.soi},`} ${scope.opt.street && `${$t('form.road')} ${scope.opt.street},`} ${scope.opt.subDistrict.name || ''}, ${scope.opt.district.name || ''}, ${scope.opt.province.name || ''}`
- }}
- {{ scope.opt.subDistrict?.zipCode || '' }}
-
- {{ $t('customerBranch.form.title') }}:
-
- {{ $t('general.address') }}
- {{
- $i18n.locale === 'eng'
- ? `${scope.opt.addressEN || ''}, ${scope.opt.mooEN && `${$t('form.moo')} ${scope.opt.mooEN},`} ${scope.opt.soiEN && `${$t('form.soi')} ${scope.opt.soiEN},`} ${scope.opt.streetEN && `${scope.opt.streetEN} Rd,`} ${scope.opt.subDistrict.nameEN || ''}, ${scope.opt.district.nameEN || ''}, ${scope.opt.province.nameEN || ''}`
- : `${scope.opt.address || ''}, ${scope.opt.moo && `${$t('form.moo')} ${scope.opt.moo},`} ${scope.opt.soi && `${$t('form.soi')} ${scope.opt.soi},`} ${scope.opt.street && `${$t('form.road')} ${scope.opt.street},`} ${scope.opt.subDistrict.name || ''}, ${scope.opt.district.name || ''}, ${scope.opt.province.name || ''}`
- }}
- {{ scope.opt.subDistrict?.zipCode || '' }}
-
-
-
-
-
-
-
-
-
+ class="col-12 field-two"
+ simple
+ required
+ :readonly
+ :disabled="disableCustomerSelect && !readonly"
+ />
();
const { t } = useI18n();
const userStore = useUserStore();
const optionStore = useOptionStore();
+const workflowStore = useWorkflowTemplate();
const userInTable = defineModel('userInTable', {
default: [],
@@ -43,7 +48,7 @@ const flowData = defineModel('flowData', {
},
});
-const objectOptions = [
+let objectOptions = [
...(optionStore.globalOption?.agenciesType || []),
{ label: t('flow.customer'), value: 'customer' },
{ label: t('flow.officer'), value: 'officer' },
@@ -51,7 +56,9 @@ const objectOptions = [
const options = ref(objectOptions);
const role = ref([]);
const userList = ref([]);
+const groupList = ref([]);
const responsiblePersonSearch = ref('');
+const responsibleMenu = ref(false);
async function getUserList(opts?: { query: string }) {
const resUser = await userStore.fetchList({
@@ -60,10 +67,10 @@ async function getUserList(opts?: { query: string }) {
if (resUser) userList.value = resUser.result;
}
-// async function getUserById(responsiblePersonId: string) {
-// const resUser = await userStore.fetchById(responsiblePersonId);
-// if (resUser) userInTable.value.push(resUser);
-// }
+async function getGroupList() {
+ const resGroup = await workflowStore.getGroupList();
+ if (resGroup) groupList.value = resGroup;
+}
function selectResponsiblePerson(stepIndex: number, responsiblePerson: User) {
const currStep = flowData.value.step[stepIndex];
@@ -78,6 +85,7 @@ function selectResponsiblePerson(stepIndex: number, responsiblePerson: User) {
userInTable.value[stepIndex] = {
name: flowData.value.step[stepIndex].name,
responsiblePerson: [],
+ responsibleGroup: [],
};
}
@@ -101,6 +109,33 @@ function selectResponsiblePerson(stepIndex: number, responsiblePerson: User) {
}
}
+function selectResponsibleGroup(stepIndex: number, responsibleGroup: string) {
+ const currStep = flowData.value.step[stepIndex];
+ const existGroupIndex = currStep.responsibleGroup?.findIndex(
+ (p) => p === responsibleGroup,
+ );
+
+ if (existGroupIndex === -1) {
+ currStep.responsibleGroup?.push(responsibleGroup);
+
+ if (!userInTable.value[stepIndex]) {
+ userInTable.value[stepIndex] = {
+ name: flowData.value.step[stepIndex].name,
+ responsiblePerson: [],
+ responsibleGroup: [],
+ };
+ }
+
+ userInTable.value[stepIndex]?.responsibleGroup.push(responsibleGroup);
+ } else {
+ currStep.responsibleGroup?.splice(Number(existGroupIndex), 1);
+ userInTable.value[stepIndex]?.responsibleGroup.splice(
+ Number(existGroupIndex),
+ 1,
+ );
+ }
+}
+
function selectItem(
val: Record,
responsibleInstitution?: string[],
@@ -142,6 +177,7 @@ watch(
onMounted(async () => {
role.value = getRole() || [];
await getUserList();
+ await getGroupList();
await userStore.fetchHqOption();
});
@@ -166,6 +202,7 @@ onMounted(async () => {
:class="{ 'q-ml-lg': $q.screen.gt.xs, 'q-mt-sm': $q.screen.lt.sm }"
>
{
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
-
- {{
- `${optionStore.mapOption(person.namePrefix || '')} ${
- $i18n.locale === 'eng'
- ? person.firstNameEN
- : person.firstName
- } ${
- $i18n.locale === 'eng'
- ? person.lastNameEN
- : person.lastName
- }`
- }}
-
-
- {{ person.code }}
-
-
+
+
+
+
+
+
+
+
+
+
+ {{
+ `${optionStore.mapOption(person.namePrefix || '')} ${
+ $i18n.locale === 'eng'
+ ? person.firstNameEN
+ : person.firstName
+ } ${
+ $i18n.locale === 'eng'
+ ? person.lastNameEN
+ : person.lastName
+ }`
+ }}
+
+
+ {{ person.code }}
+
-
-
+
-
-
+
+ {{ $t('general.group') }}
+
+
+
+
+
+
+ {{ group }}
+
+
+
+
+
+
+ (responsibleMenu = true)"
+ @before-hide="() => (responsibleMenu = false)"
+ >
{
{{ $t('general.noData') }}
{
{{ $t('personnel.MESSENGER') }}
{
+
+
+ {{ $t('general.group') }}
+
+
+ {{ $t('general.noData') }}
+
+
+
+
+
+
+
+
+ {{ group.name }}
+
+
+
-
+
{
}
:deep(
- .q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer
- ) {
+ .q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer
+) {
justify-content: start !important;
padding-right: 8px !important;
padding-top: 16px;
@@ -800,19 +915,26 @@ onMounted(async () => {
}
:deep(
- i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
- ) {
+ i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
+) {
color: var(--brand-1);
}
:deep(
- .q-item.q-item-type.row.no-wrap.q-item--dense.q-item--clickable.q-link.cursor-pointer.q-focusable.q-hoverable.expansion-rounded.surface-2
- .q-focus-helper
- ) {
+ .q-item.q-item-type.row.no-wrap.q-item--dense.q-item--clickable.q-link.cursor-pointer.q-focusable.q-hoverable.expansion-rounded.surface-2
+ .q-focus-helper
+) {
visibility: hidden;
}
:deep(.q-dialog.fullscreen.no-pointer-events.q-dialog--modal) {
visibility: hidden;
}
+
+.transition-rotate {
+ transition: transform 0.3s ease;
+}
+.rotated {
+ transform: rotate(180deg);
+}
diff --git a/src/components/04_product-service/PriceDataComponent.vue b/src/components/04_product-service/PriceDataComponent.vue
index 59043144..d005c043 100644
--- a/src/components/04_product-service/PriceDataComponent.vue
+++ b/src/components/04_product-service/PriceDataComponent.vue
@@ -167,26 +167,28 @@ withDefaults(
@@ -271,6 +276,8 @@ withDefaults(
flat
outlined
dense
+ :readonly
+ :hide-dropdown-icon="readonly"
v-model="vatIncluded"
>
diff --git a/src/components/04_product-service/WorkManagementComponent.vue b/src/components/04_product-service/WorkManagementComponent.vue
index e79872d9..86e79951 100644
--- a/src/components/04_product-service/WorkManagementComponent.vue
+++ b/src/components/04_product-service/WorkManagementComponent.vue
@@ -98,7 +98,8 @@ watch(
(c, o) => {
const list = c.map((v: { name: string }) => v.name);
const oldList = o.map((v: { name: string }) => v.name);
- const index = oldList.indexOf(workName.value || '');
+ const index = workName.value ? oldList.indexOf(workName.value) : -1;
+ if (index === -1) return;
if (
list[index] !== oldList[index] &&
@@ -704,8 +705,8 @@ watch(
}
:deep(
- .q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer
- ) {
+ .q-item__section.column.q-item__section--side.justify-center.q-item__section--avatar.q-focusable.relative-position.cursor-pointer
+) {
justify-content: start !important;
padding-right: 8px !important;
padding-top: 16px;
@@ -735,8 +736,8 @@ watch(
}
:deep(
- i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
- ) {
+ i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
+) {
color: var(--brand-1);
}
diff --git a/src/components/04_product-service/WorkNameManagement.vue b/src/components/04_product-service/WorkNameManagement.vue
index 2bde41ce..81854b9e 100644
--- a/src/components/04_product-service/WorkNameManagement.vue
+++ b/src/components/04_product-service/WorkNameManagement.vue
@@ -1,7 +1,6 @@
@@ -35,7 +58,7 @@ type Options = { label: string; value: string };
+
+
(typeof v === 'string' ? (contactName = v) : '')
+ "
+ />
+ (typeof v === 'string' ? (email = v) : '')"
+ @clear="email = ''"
+ >
+
+
+
+
+ (typeof v === 'string' ? (contactTel = v) : '')
+ "
+ >
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ file.file.name }}
+
+
+
+
+
+
+
+
+ openNewTab(item.url)"
+ >
+
+
+
+ {{ item.name }}
+
+
+
+
+
+
+
diff --git a/src/components/08_request-list/DataDisplay.vue b/src/components/08_request-list/DataDisplay.vue
index 30a8e52b..f36acb4f 100644
--- a/src/components/08_request-list/DataDisplay.vue
+++ b/src/components/08_request-list/DataDisplay.vue
@@ -27,26 +27,38 @@ withDefaults(
class="app-text-muted q-pr-sm"
:width="iconSize || '2rem'"
/>
-
-
+
+
{{ label }}
-
+
{{ value }}
{{ value }}
-
+
{{ item }}
,
diff --git a/src/components/11_credit-note/FormCredit.vue b/src/components/11_credit-note/FormCredit.vue
index b6e2bf1f..5e4ee55b 100644
--- a/src/components/11_credit-note/FormCredit.vue
+++ b/src/components/11_credit-note/FormCredit.vue
@@ -8,6 +8,10 @@ defineProps<{
const quotationId = defineModel('quotationId', {
required: true,
});
+const isDebitNote = defineModel('isDebitNote', {
+ required: false,
+ default: false,
+});
@@ -37,6 +41,7 @@ const quotationId = defineModel('quotationId', {
cancelIncludeDebitNote: true,
hasCancel: true,
}"
+ @selected="(v) => (isDebitNote = v.isDebitNote)"
/>
diff --git a/src/components/DialogForm.vue b/src/components/DialogForm.vue
index 84319bcf..fb29a4ca 100644
--- a/src/components/DialogForm.vue
+++ b/src/components/DialogForm.vue
@@ -42,6 +42,15 @@ defineProps<{
const modal = defineModel('modal', { default: false });
const currentTab = defineModel('currentTab');
+
+async function onValidationError(ref: any) {
+ const el = ref.$el as Element;
+ el.scrollIntoView({
+ behavior: 'smooth',
+ block: 'center',
+ inline: 'nearest',
+ });
+}
('currentTab');
@submit.prevent
@validation-success="submit"
class="column full-height"
+ @validation-error="onValidationError"
>
('drawerOpen', {
const myForm = ref();
function reset() {
+ if (props.beforeClose) {
+ drawerOpen.value = props.beforeClose
+ ? props.beforeClose()
+ : !drawerOpen.value;
+ }
if (myForm.value) {
myForm.value.resetValidation();
}
}
+
+async function onValidationError(ref: any) {
+ const el = ref.$el as Element;
+ el.scrollIntoView({
+ behavior: 'smooth',
+ block: 'center',
+ inline: 'nearest',
+ });
+}
(drawerOpen = beforeClose ? beforeClose() : v)"
:width="$q.screen.gt.xs ? windowSize * 0.85 : windowSize"
v-model="drawerOpen"
behavior="mobile"
@@ -66,6 +79,7 @@ function reset() {
greedy
@submit.prevent
@validation-success="submit"
+ @validation-error="onValidationError"
>
+import { Icon } from '@iconify/vue/dist/iconify.js';
+
defineProps<{
hideIcon?: boolean;
+ icon?: string;
}>();
@@ -10,10 +13,13 @@ defineProps<{
v-if="!hideIcon"
id="btn-add"
padding="sm"
- icon="mdi-plus"
+ :icon="icon ? undefined : 'mdi-plus'"
direction="up"
class="color-btn"
>
+
+
+
+ >
+
+
diff --git a/src/components/GlobalDialog.vue b/src/components/GlobalDialog.vue
index 059f7755..f9df77d4 100644
--- a/src/components/GlobalDialog.vue
+++ b/src/components/GlobalDialog.vue
@@ -46,6 +46,7 @@ defineProps<{
color="grey"
icon="mdi-close"
v-close-popup
+ @click="cancel"
/>
diff --git a/src/components/PaginationPageSize.vue b/src/components/PaginationPageSize.vue
index 4eb86e0c..e8ece111 100644
--- a/src/components/PaginationPageSize.vue
+++ b/src/components/PaginationPageSize.vue
@@ -1,5 +1,12 @@
@@ -10,7 +17,12 @@ const pageSize = defineModel({ required: true });
:key="v"
clickable
v-close-popup
- @click="pageSize = v"
+ @click="
+ () => {
+ pageSize = v;
+ fetchData();
+ }
+ "
>
{{ v }}
diff --git a/src/components/ProfileBanner.vue b/src/components/ProfileBanner.vue
index 9c72041c..2d4b3975 100644
--- a/src/components/ProfileBanner.vue
+++ b/src/components/ProfileBanner.vue
@@ -229,6 +229,7 @@ const smallBanner = ref(false);
$emit('update:currentTab', v)"
>
import { BranchWithChildren } from 'stores/branch/types';
import KebabAction from './shared/KebabAction.vue';
-import { isRoleInclude } from 'stores/utils';
const nodes = defineModel<(any | BranchWithChildren)[]>('nodes', {
default: [],
@@ -17,6 +16,7 @@ withDefaults(
labelKey?: string;
childrenKey: string;
action?: boolean;
+ hideCreate?: boolean;
}>(),
{
color: 'transparent',
@@ -96,7 +96,9 @@ defineEmits<{
expandedTree[expandedTree.length - 1] === node.id,
}"
>
- {{ node.name }}
+ {{
+ $i18n.locale === 'eng' ? node.nameEN || node.name : node.name
+ }}
{{ node.code }}
@@ -120,11 +122,7 @@ defineEmits<{
/>
+import { ref } from 'vue';
import MainButton from './MainButton.vue';
-defineEmits<{
+const emit = defineEmits<{
(e: 'click', v: MouseEvent): void;
+ (e: 'fileSelected', v: File[]): void;
}>();
defineProps<{
iconOnly?: boolean;
@@ -10,15 +12,29 @@ defineProps<{
outlined?: boolean;
disabled?: boolean;
dark?: boolean;
+ importFile?: boolean;
label?: string;
icon?: string;
}>();
+
+const inputRef = ref(null);
+
+function triggerFileInput() {
+ inputRef.value?.click();
+}
+
+function handleFileChange(event: Event) {
+ const files = (event.target as HTMLInputElement).files;
+ if (files && files.length > 0) {
+ emit('fileSelected', Array.from(files));
+ }
+}
$emit('click', e)"
+ @click="(e) => (importFile ? triggerFileInput() : $emit('click', e))"
v-bind="{ ...$props, ...$attrs }"
:icon="icon || 'mdi-import'"
color="var(--info-bg)"
@@ -26,4 +42,13 @@ defineProps<{
>
{{ label || $t('general.import') }}
+
+ handleFileChange(e)"
+ hidden
+ accept=".xls, .xlsx , .csv"
+ multiple
+ />
diff --git a/src/components/button/MainButton.vue b/src/components/button/MainButton.vue
index 836abe32..08233063 100644
--- a/src/components/button/MainButton.vue
+++ b/src/components/button/MainButton.vue
@@ -5,6 +5,7 @@ defineEmits<{
(e: 'click', v: MouseEvent): void;
}>();
defineProps<{
+ id?: string;
icon?: string;
color: string;
iconOnly?: boolean;
@@ -18,6 +19,7 @@ defineProps<{
+
+
+
+ {{ $t('personnel.form.addressForeign') }}
+
@@ -449,7 +499,24 @@ watchEffect(async () => {
(v) => (typeof v === 'string' ? (street = v) : '')
"
/>
+
{
+
{
+
+
{
(zipCode = v.toString())"
+ :rules="
+ !addressForeign
+ ? []
+ : [(val) => (val && val.length > 0) || $t('form.error.required')]
"
/>
{
(v) => (typeof v === 'string' ? (streetEN = v) : '')
"
/>
+
{
+
+
{
+
+
{
(zipCode = v.toString())"
+ :rules="
+ !addressForeign
+ ? []
+ : [(val) => (val && val.length > 0) || $t('form.error.required')]
"
/>
+import { ref, watch } from 'vue';
+import { dateFormatJS } from 'src/utils/datetime';
+import SelectInput from './SelectInput.vue';
+import VueDatePicker from '@vuepic/vue-datepicker';
+import dayjs from 'dayjs';
+
+defineProps<{
+ active?: boolean;
+}>();
+
+const date = defineModel();
+
+const dateRange = ref('');
+const isDateSelect = ref(false);
+
+function mapDateRange(val: string) {
+ const today = dayjs();
+ let start: dayjs.Dayjs, end: dayjs.Dayjs;
+
+ switch (val) {
+ case 'toDay':
+ start = today.startOf('day');
+ end = today.endOf('day');
+ break;
+ case 'yesterday':
+ start = today.subtract(1, 'day').startOf('day');
+ end = today.subtract(1, 'day').endOf('day');
+ break;
+ case 'thisWeek':
+ start = today.startOf('week');
+ end = today.endOf('week');
+ break;
+ case 'lastWeek':
+ start = today.subtract(1, 'week').startOf('week');
+ end = today.subtract(1, 'week').endOf('week');
+ break;
+ case 'thisMonth':
+ start = today.startOf('month');
+ end = today.endOf('month');
+ break;
+ case 'lastMonth':
+ start = today.subtract(1, 'month').startOf('month');
+ end = today.subtract(1, 'month').endOf('month');
+ break;
+ case 'thisYear':
+ start = today.startOf('year');
+ end = today.endOf('year');
+ break;
+ case 'lastYear':
+ start = today.subtract(1, 'year').startOf('year');
+ end = today.subtract(1, 'year').endOf('year');
+ break;
+ case 'last7Days':
+ start = today.subtract(6, 'day').startOf('day');
+ end = today.endOf('day');
+ break;
+ case 'last30Days':
+ start = today.subtract(29, 'day').startOf('day');
+ end = today.endOf('day');
+ break;
+ case 'last90Days':
+ start = today.subtract(89, 'day').startOf('day');
+ end = today.endOf('day');
+ break;
+ case 'customDateRange':
+ start = today.startOf('day');
+ end = today.endOf('day');
+ break;
+ default:
+ return;
+ }
+
+ return [start.toDate().toISOString(), end.toDate().toISOString()];
+}
+
+watch(
+ () => dateRange.value,
+ () => {
+ if (!dateRange.value) return;
+ date.value = mapDateRange(dateRange.value);
+ },
+);
+
+watch(
+ () => date.value,
+ () => {
+ if (date.value && date.value.length === 0) dateRange.value = '';
+ },
+);
+
+
+
+
+
+
+
+ {{ $t('general.advanceSearch') }}
+
+
(date = [])"
+ />
+
+ (isDateSelect = true)"
+ @closed="() => (isDateSelect = false)"
+ >
+
+
+
+
+
+
+ {{
+ date
+ ? dateFormatJS({ date: date[0] }) +
+ ' - ' +
+ dateFormatJS({ date: date[1] })
+ : ''
+ }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t('general.advanceSearch') }}
+
+
+
diff --git a/src/components/shared/AvatarGroup.vue b/src/components/shared/AvatarGroup.vue
index a3f3d85e..ed8f63ef 100644
--- a/src/components/shared/AvatarGroup.vue
+++ b/src/components/shared/AvatarGroup.vue
@@ -25,7 +25,11 @@ withDefaults(
alt="Image"
/>
-
+
{{ person.name }}
diff --git a/src/components/shared/KebabAction.vue b/src/components/shared/KebabAction.vue
index 4dd095db..7bea6b36 100644
--- a/src/components/shared/KebabAction.vue
+++ b/src/components/shared/KebabAction.vue
@@ -16,6 +16,7 @@ const props = withDefaults(
useUpload?: boolean;
useCancel?: boolean;
useRejectCancel?: boolean;
+ useCopy?: boolean;
disableCancel?: boolean;
disableDelete?: boolean;
}>(),
@@ -31,6 +32,7 @@ defineEmits<{
(e: 'link'): void;
(e: 'upload'): void;
(e: 'delete'): void;
+ (e: 'copy'): void;
(e: 'cancel'): void;
(e: 'rejectCancel'): void;
(e: 'changeStatus'): void;
@@ -172,6 +174,27 @@ watch(
+
$emit('copy')"
+ >
+
+
+ {{ $t('general.copy') }}
+
+
+
();
defineEmits<{
@@ -76,8 +78,10 @@ defineEmits<{
/>
string | true)[];
}>(),
@@ -70,6 +72,7 @@ watch(
{
+ multiple ? (model = []) : (model = '');
+ }
+ "
>
diff --git a/src/components/shared/select-muliple/SelectOffice.vue b/src/components/shared/select-muliple/SelectOffice.vue
index 24437cd1..22a0a327 100644
--- a/src/components/shared/select-muliple/SelectOffice.vue
+++ b/src/components/shared/select-muliple/SelectOffice.vue
@@ -72,7 +72,11 @@ onMounted(async () => {
:option="selectOptions"
:hide-selected="false"
:fill-input="false"
- :rules="[(v: string) => !!v || $t('form.error.required')]"
+ :rules="[
+ (v: string) => {
+ return !!v?.length || $t('form.error.required');
+ },
+ ]"
@filter="filter"
>
diff --git a/src/components/shared/select/SelectBranch.vue b/src/components/shared/select/SelectBranch.vue
index b18a1e51..6fa6aa8c 100644
--- a/src/components/shared/select/SelectBranch.vue
+++ b/src/components/shared/select/SelectBranch.vue
@@ -75,9 +75,9 @@ function setDefaultValue() {
+import { ref, onMounted } from 'vue';
+
+import { createSelect, SelectProps } from './select';
+import SelectInput from '../SelectInput.vue';
+
+import { BusinessType } from 'src/stores/business-type/types';
+
+import useStore from 'src/stores/business-type';
+
+type SelectOption = BusinessType;
+
+const value = defineModel('value', {
+ required: true,
+});
+const valueOption = defineModel('valueOption', {
+ required: false,
+});
+
+const selectOptions = ref([]);
+
+const { fetchList: getList, fetchById: getById } = useStore();
+
+defineEmits<{
+ (e: 'create'): void;
+}>();
+
+type ExclusiveProps = {
+ lang?: string;
+ codeOnly?: boolean;
+ selectFirstValue?: boolean;
+ branchVirtual?: boolean;
+ checkRole?: string[];
+};
+
+const props = defineProps & ExclusiveProps>();
+
+const { getOptions, setFirstValue, getSelectedOption, filter } =
+ createSelect(
+ {
+ value,
+ valueOption,
+ selectOptions,
+ getList: async (query) => {
+ const ret = await getList({
+ query,
+ ...props.params,
+ pageSize: 99999,
+ });
+ if (ret) return ret.result;
+ },
+ getByValue: async (id) => {
+ const ret = await getById(id);
+ if (ret) return ret;
+ },
+ },
+ { valueField: 'id' },
+ );
+
+onMounted(async () => {
+ await getOptions();
+
+ if (props.autoSelectOnSingle && selectOptions.value.length === 1) {
+ setFirstValue();
+ }
+
+ if (props.selectFirstValue) {
+ setDefaultValue();
+ } else await getSelectedOption();
+});
+
+function setDefaultValue() {
+ setFirstValue();
+}
+
+
+
+
+ {{ (lang ?? $i18n.locale) !== 'eng' ? opt.name : opt.nameEN }}
+
+
+
+
+
+
+
+
+ {{ $t('general.add', { text: $t('businessType.title') }) }}
+
+
+ {{ creatableDisabledText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('general.add', { text: $t('businessType.title') }) }}
+
+
+ {{ creatableDisabledText }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('general.add', { text: $t('menu.manage.businessType') }) }}
+
+
+ {{ creatableDisabledText }}
+
+
+
+
+
+
+
+
+
+
+
+ {{ (lang ?? $i18n.locale) !== 'eng' ? opt.name : opt.nameEN }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/shared/select/SelectCustomer.vue b/src/components/shared/select/SelectCustomer.vue
index 8adecb3c..2e62eba8 100644
--- a/src/components/shared/select/SelectCustomer.vue
+++ b/src/components/shared/select/SelectCustomer.vue
@@ -30,6 +30,7 @@ defineEmits<{
type ExclusiveProps = {
simple?: boolean;
simpleBranchNo?: boolean;
+ selectFirstValue?: boolean;
};
const props = defineProps & ExclusiveProps>();
@@ -64,8 +65,14 @@ onMounted(async () => {
setFirstValue();
}
- await getSelectedOption();
+ if (props.selectFirstValue) {
+ setDefaultValue();
+ } else await getSelectedOption();
});
+
+function setDefaultValue() {
+ setFirstValue();
+}
{
-
+
-
-
@@ -175,3 +180,11 @@ onMounted(async () => {
+
+
diff --git a/src/components/shared/select/SelectInstitution.vue b/src/components/shared/select/SelectInstitution.vue
index bf5877c0..4b4ea912 100644
--- a/src/components/shared/select/SelectInstitution.vue
+++ b/src/components/shared/select/SelectInstitution.vue
@@ -43,6 +43,7 @@ const { getOptions, setFirstValue, getSelectedOption, filter } =
const ret = await getList({
query: query === '' ? undefined : query,
...props.params,
+ activeOnly: true,
});
if (ret) return ret.result;
},
diff --git a/src/components/shared/select/SelectQuotation.vue b/src/components/shared/select/SelectQuotation.vue
index ae9f7863..344e500b 100644
--- a/src/components/shared/select/SelectQuotation.vue
+++ b/src/components/shared/select/SelectQuotation.vue
@@ -25,6 +25,7 @@ const { getQuotationList: getList, getQuotation: getById } = useStore();
defineEmits<{
(e: 'create'): void;
+ (e: 'selected', value: SelectOption): void;
}>();
type ExclusiveProps = {
@@ -117,6 +118,14 @@ function setDefaultValue() {
(v: string) => !props.required || !!v || $t('form.error.required'),
]"
@filter="filter"
+ @update:model-value="
+ (v) => {
+ $emit(
+ 'selected',
+ selectOptions.find((opt) => opt.id === v),
+ );
+ }
+ "
>
& ExclusiveProps>();
@@ -71,6 +72,7 @@ function setDefaultValue() {
diff --git a/src/components/shared/select/select.ts b/src/components/shared/select/select.ts
index 08fd88b2..11ec46d4 100644
--- a/src/components/shared/select/select.ts
+++ b/src/components/shared/select/select.ts
@@ -35,7 +35,13 @@ export const createSelect = >(
let previousSearch = '';
watch(value, (v) => {
- if (!v || (cache && cache.find((opt) => opt[valueField] === v))) return;
+ if (!v) return;
+
+ if (cache && cache.find((opt) => opt[valueField] === v)) {
+ valueOption.value = cache.find((opt) => opt[valueField] === v);
+ return;
+ }
+
getSelectedOption();
});
@@ -63,15 +69,26 @@ export const createSelect = >(
const currentValue = value.value;
if (!currentValue) return;
- if (selectOptions.value.find((v) => v[valueField] === currentValue)) return;
+
if (valueOption.value && valueOption.value[valueField] === currentValue) {
- return selectOptions.value.unshift(valueOption.value);
+ selectOptions.value.unshift(valueOption.value);
+ selectOptions.value = selectOptions.value.filter((curr, idx, arr) => {
+ return (
+ arr.findIndex((item) => item[valueField] === curr[valueField]) === idx
+ );
+ });
+ return;
}
const ret = await getByValue(currentValue);
if (ret) {
selectOptions.value.unshift(ret);
+ selectOptions.value = selectOptions.value.filter((curr, idx, arr) => {
+ return (
+ arr.findIndex((item) => item[valueField] === curr[valueField]) === idx
+ );
+ });
valueOption.value = ret;
}
}
diff --git a/src/components/shared/table/TableProductAndService.vue b/src/components/shared/table/TableProductAndService.vue
index e1801167..d8e0c683 100644
--- a/src/components/shared/table/TableProductAndService.vue
+++ b/src/components/shared/table/TableProductAndService.vue
@@ -251,7 +251,10 @@ function selectedIndex(item: any) {
>
-
+
+ {{ props.row.detail.replace(/<\/?[^>]+(>|$)/g, '') || '-' }}
+
+
{{
typeof col.field === 'string'
? props.row[col.field as keyof (Product | Service)]
diff --git a/src/components/shared/table/TableWorker.vue b/src/components/shared/table/TableWorker.vue
index 4ec870bc..e8cfa214 100644
--- a/src/components/shared/table/TableWorker.vue
+++ b/src/components/shared/table/TableWorker.vue
@@ -54,7 +54,9 @@ const columns = [
field: (v: Employee) =>
locale.value === Lang.English
? `${v.firstNameEN} ${v.lastNameEN}`
- : `${v.firstName} ${v.lastName}`,
+ : v.firstName
+ ? `${v.firstName} ${v.lastName}`
+ : `${v.firstNameEN} ${v.lastNameEN}`,
},
{
name: 'birthDate',
@@ -143,6 +145,7 @@ function selectedIndex(item: Employee) {
handleUpdate()"
size="sm"
@@ -198,6 +201,7 @@ function selectedIndex(item: Employee) {
v-model="props.selected"
size="sm"
:id="`select-worker-${props.row.firstName}`"
+ :for="`select-worker-${props.row.firstName}`"
/>
diff --git a/src/components/upload-file/FormCitizen.vue b/src/components/upload-file/FormCitizen.vue
index 5d35209e..06c97e6d 100644
--- a/src/components/upload-file/FormCitizen.vue
+++ b/src/components/upload-file/FormCitizen.vue
@@ -188,6 +188,7 @@ function formatCode(input: string | undefined, type: 'code' | 'number') {
:label="$t('customer.form.citizenId')"
for="input-citizen-id"
v-model="citizenId"
+ :rules="[(val: string) => !!val || $t('form.error.required')]"
/>
{
@click="$emit('click')"
>
-
-
+
+
{{ name }}
-
+
+
{{
uploading.loaded
@@ -79,7 +80,7 @@ onMounted(() => {
/>
{{ idle ? `Pending` : progress !== 1 ? `Uploading...` : 'Completed' }}
-
+
void | Promise<{
+ ) => Promise<{
status: boolean;
group: string;
meta: { name: string; value: string }[];
@@ -123,7 +123,7 @@ async function change(e: Event) {
...obj.value,
{
_meta: structuredClone(toRaw(selectedMenu.value)._meta || {}),
- group: selectedMenu.value?.value,
+ group: selectedMenu.value?.group,
file: renamedFile,
},
];
@@ -168,8 +168,8 @@ async function change(e: Event) {
type: map['doc_type'],
number: map['doc_number'],
gender: map['sex'],
- firstName: map['first_name'],
- lastName: map['last_name'],
+ firstName: map['last_name'],
+ lastName: map['first_name'],
issueDate: map['issue_date'],
expireDate: map['expire_date'],
issuePlace: map['nationality'],
@@ -327,7 +327,7 @@ defineEmits<{
:rows="
obj
.filter((v) => {
- if (!autoSave && v.group !== selectedMenu?.value) {
+ if (!autoSave && v.group !== selectedMenu?.group) {
return false;
}
return true;
diff --git a/src/css/quasar.variables.scss b/src/css/quasar.variables.scss
index 7bd226ac..eb2b877b 100644
--- a/src/css/quasar.variables.scss
+++ b/src/css/quasar.variables.scss
@@ -198,3 +198,10 @@ i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-i
.q-focus-helper {
visibility: hidden;
}
+
+.clear-btn {
+ opacity: 0.6;
+ &:hover {
+ opacity: 1;
+ }
+}
diff --git a/src/i18n/eng.ts b/src/i18n/eng.ts
index 858e9489..3379ba60 100644
--- a/src/i18n/eng.ts
+++ b/src/i18n/eng.ts
@@ -4,7 +4,7 @@ export default {
save: 'Save',
open: 'Open',
close: 'Close',
- edit: 'Edit',
+ edit: 'Edit{text}',
cancel: 'Cancel',
back: 'Back',
undo: 'Undo',
@@ -31,6 +31,7 @@ export default {
displayField: 'Display Fields',
order: 'Order',
name: '{msg} Name',
+ nameEN: 'Name (English)',
fullName: 'Full Name',
detail: '{msg} Detail',
remark: '{msg} Remark',
@@ -60,7 +61,7 @@ export default {
branchStatus: 'Branch Status',
success: 'Success',
taxNo: 'Legal Person',
- contactName: 'Contact Name',
+ contactName: 'Contact Person',
image: 'Image of ',
apply: 'Apply',
licenseNumber: 'License number',
@@ -153,6 +154,14 @@ export default {
tableOfContent: 'Table of Contents',
draw: 'Draw',
newUpload: 'New Upload',
+ nativeLanguage: '{msg} Native Language',
+ copy: 'Copy',
+ paste: 'Paste',
+ period: 'Period',
+ documentStatus: 'Document Status',
+ advanceSearch: 'Advance Search',
+ totalPeople: '{meg} people',
+ price: 'Price {price} Baht',
},
menu: {
@@ -195,12 +204,14 @@ export default {
title: 'Manage',
branch: 'Branch',
personnel: 'Personnel',
+ group: 'Group',
productService: 'Product and Service',
workflow: 'Workflow',
property: 'Property',
customer: 'Customer',
mainData: 'Main Data',
agencies: 'Agencies',
+ businessType: 'Business Type',
},
sales: {
@@ -247,7 +258,8 @@ export default {
manual: {
title: 'Manual',
- usage: 'การใช้งาน',
+ usage: 'Usage',
+ troubleshooting: 'Troubleshooting',
},
},
@@ -329,7 +341,7 @@ export default {
requireLength: 'Please enter {msg} character',
branchNameField: "Only letters, numbers, or the characters . , - ' &.",
branchNameENField:
- "Only English letters, numbers, or the characters . , - ' &.",
+ "Only English letters, numbers, or the characters . , - ' &. ( )",
passportFormat: 'Please enter the passport number in the correct format.',
},
warning: {
@@ -376,7 +388,7 @@ export default {
branchLabel: 'Branch',
branchHQLabel: 'Headoffice',
taxNo: 'Legal Person',
- contactName: 'Contact Name',
+ contactName: 'Contact Person',
},
page: {
captionManage: 'Manage',
@@ -397,8 +409,8 @@ export default {
code: 'Headoffice Code',
codeBranch: 'Branch Code',
taxNo: 'Tax Identification Number',
- contactName: 'Contact Name',
- contactTelephone: 'Contact Telephone',
+ contactName: 'Contact Person',
+ contactTelephone: 'Contact Number',
branchName: 'Branch Name',
branchNameEN: 'Branch Name (EN)',
servicePointName: 'Service Point Name',
@@ -448,10 +460,10 @@ export default {
regisNo: 'Registration Number',
startDate: 'Start Date',
retireDate: 'Retire Date',
- responsibleArea: 'Responsibel Area',
+ responsibleArea: 'Responsible Area',
discount: 'Discount Condition',
sourceNationality: 'Source Nationality',
- importNationality: 'import Nationality',
+ importNationality: 'Import Nationality',
trainingPlace: 'Training Place',
checkpoint: 'Checkpoint',
checkpointEN: 'Checkpoint (EN)',
@@ -459,6 +471,13 @@ export default {
citizenId: 'Citizen ID',
citizenIssue: 'Citizen Issue',
citizenExpire: 'Citizen Expire',
+ agencyStatus: 'Agency Status',
+ normal: 'Normal',
+ canceled: 'Canceled',
+ blacklist: 'Black list',
+ contactName: 'Contact Person',
+ contactTel: 'Contact Number',
+ addressForeign: 'Use foreign address',
},
},
customer: {
@@ -472,10 +491,9 @@ export default {
powerOfAttorney: 'Power of Attorney',
others: 'Others',
},
-
employer: 'Employer',
employerLegalEntity: 'Legal Entity',
- employerNaturalPerson: 'Natrual Person',
+ employerNaturalPerson: 'Natural Person',
employerType: 'Employer Type',
employee: 'Employee',
form: {
@@ -485,24 +503,22 @@ export default {
},
prefix: {
- mr: 'Mr.',
- mrs: 'Mrs.',
- miss: 'Miss.',
+ mr: 'MR.',
+ mrs: 'MRS.',
+ miss: 'MISS.',
},
+ taxpayyerNo: 'Taxpayer Identification Number',
citizenId: 'Citizen ID',
religion: 'Religion',
issueDate: 'Issue Date',
passportExpiryDate: 'Passport Expiry Date',
-
ownerName: 'Customer Name',
firstName: 'First Name ',
lastName: 'Last Name ',
firstNameEN: 'First Name in English',
lastNameEN: 'Last Name in English',
-
cardNumber: 'ID Card Number',
-
prefixName: 'Prefix',
legalPersonNo: 'Legal Entity Registration Number',
registerName: 'Company Name',
@@ -510,7 +526,6 @@ export default {
registerDate: 'Registered On',
registerCompanyName: 'Registered Name',
authorizedCapital: 'Authorized Capital',
-
workplace: 'Workplace',
workplaceEN: 'Workplace (EN)',
address: 'Address',
@@ -518,7 +533,6 @@ export default {
branchCode: 'Branch Code',
customerCode: 'Employer Code',
legalPersonCode: 'Legal Entity Code',
-
codeAbbrev: 'Company Abbreviation',
codeNumber: 'Company Number',
registeredBranch: 'Registered Branch',
@@ -556,7 +570,7 @@ export default {
jobPosition: 'Job Position',
address: 'Address',
workPlace: 'Workplace',
- contactName: 'Contact Name',
+ contactName: 'Contact Person',
contactPhone: 'Contact Phone',
totalEmployee: 'Total Employee',
officeTel: 'Headoffice Telephone',
@@ -610,7 +624,7 @@ export default {
placeOfBirth: 'Place of Birth',
countryOfbirth: 'Country of Birth',
issueCountry: 'Issue Country',
- entryCount: 'Entry Count',
+ entryCount: 'Number of Days in the Country',
employerSelect: {
branchName: 'Branch Name',
customerName: 'Employer Name',
@@ -760,10 +774,13 @@ export default {
},
quotation: {
+ ownOnly: 'View Own Quotation Only',
quotationDate: 'Quotation Date',
seller: 'Seller',
paymentChannels: 'Payment Channels',
channelsThat: 'Channels That',
+ refNo: 'Reference Number',
+ bankAccount: 'Bank Account',
bankAccountNumber: 'Bank Account Number',
bankAccountName: 'Bank Account Name',
inTheNameOf: 'In The Name Of',
@@ -794,7 +811,7 @@ export default {
employee: 'Employee',
employeeName: 'Full Name',
workName: 'Work Name',
- contactName: 'Contact Name',
+ contactName: 'Contact Person',
documentReceivePoint: 'Document Drop-Off Point"',
dueDate: 'Quotation Due Date',
specialCondition: 'Special Conditions',
@@ -912,6 +929,10 @@ export default {
code: 'Agencies Code',
group: 'Agencies Group',
name: 'Agencies Name',
+ contactName: 'Contact Person',
+ contactTel: 'Contact Number',
+ bankInfo: 'Bank Information',
+ attachment: 'Attachment',
},
requestList: {
@@ -933,8 +954,9 @@ export default {
localEmployee: 'Local Employee',
nonLocalEmployee: 'Non Local Employee',
noWorkflowTemplate: 'A workflow template has not been selected.',
-
salesRepresentative: 'Sales Representative',
+
+ dataOffice: 'Employment Office District',
ref: 'Reference',
action: {
title: 'Action',
@@ -998,7 +1020,7 @@ export default {
issueBranch: 'Issue Branch',
issueDate: 'Issue Date',
madeBy: 'Made By',
- contactName: 'Contact Name',
+ contactName: 'Contact Person',
workOrderCode: 'Work Order Code',
workOrderName: 'Work Order Name',
telephone: 'Telephone',
@@ -1057,6 +1079,10 @@ export default {
confirmDebitNoteAccept: 'Confirm acceptance of the debit note.',
},
message: {
+ copy: 'Copy',
+ warningPaste:
+ 'Do you want to replace the data with the newly copied information?',
+ warningCopyEmpty: 'You have not copied any data yet',
quotationAccept: 'Once accepted, no further modifications can be made',
beingUse: '"{msg}" is being used.',
incompleteDataEntry: 'Incomplete data entry on {tap} page',
@@ -1101,7 +1127,7 @@ export default {
oneOrMoreBranchMissing:
'One or more branch cannot be delete and is missing.',
cantMakeHQAndBranchSameTime:
- 'Cannot make this as headquaters and branch at the same time.',
+ 'Cannot make this as headquarters and branch at the same time.',
unknowHowToVerify: 'Unknown how to verify identity.',
noPermission:
'You do not have permission to access or perform with this resource.',
@@ -1183,6 +1209,7 @@ export default {
'Product with the same name already exists. If you want to create with this name please select another code.',
userExists: 'User already exits.',
sameNameExists: 'Same name exists.',
+ samePropertyNameExists: 'Same property name exists.',
validateError: 'Validate Error',
codeMisMatch: 'Code Mismatch',
@@ -1207,6 +1234,9 @@ export default {
taskListNotPending: 'One or more task is not pending.',
reqNotMet: 'Not Match',
systemError: 'A system error occurred.',
+ taskOrderInvalid: 'Please select the product and the organization.',
+
+ flowAccountProductIdNotFound: 'Product not found in flow account',
},
},
@@ -1476,4 +1506,26 @@ export default {
type: 'Type',
},
},
+
+ dateRange: {
+ today: 'Today',
+ yesterday: 'Yesterday',
+ thisWeek: 'This Week',
+ lastWeek: 'Last Week',
+ thisMonth: 'This Month',
+ lastMonth: 'Last Month',
+ thisYear: 'This Year',
+ lastYear: 'Last Year',
+ last7Days: 'Last 7 Days',
+ last30Days: 'Last 30 Days',
+ last90Days: 'Last 90 Days',
+ customDateRange: 'Custom Date Range',
+ },
+
+ businessType: {
+ title: 'Business Type',
+ caption: 'Manage Business Type',
+ name: 'Business Type Name',
+ nameEn: 'Business Type Name (English)',
+ },
};
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
index bba1bb34..2801ec03 100644
--- a/src/i18n/index.ts
+++ b/src/i18n/index.ts
@@ -1,7 +1,7 @@
import eng from './eng';
-import tha from './tha';
+import tha from './tha'; // spellchecker:disable-line
export default {
eng,
- tha,
+ tha, // spellchecker:disable-line
};
diff --git a/src/i18n/tha.ts b/src/i18n/tha.ts
index 5ce04f74..921e25fd 100644
--- a/src/i18n/tha.ts
+++ b/src/i18n/tha.ts
@@ -4,7 +4,7 @@ export default {
save: 'บันทึก',
open: 'เปิด',
close: 'ปิด',
- edit: 'แก้ไข',
+ edit: 'แก้ไข{text}',
cancel: 'ยกเลิก',
back: 'ย้อนกลับ',
undo: 'ย้อนกลับ',
@@ -31,6 +31,7 @@ export default {
displayField: 'ฟิลด์แสดงผล',
order: 'ลำดับ',
name: 'ชื่อ{msg}',
+ nameEN: 'ชื่อ (ภาษาอังกฤษ)',
fullName: 'ชื่อ-สกุล',
detail: 'รายละเอียด{msg}',
remark: 'หมายเหตุ{msg}',
@@ -153,6 +154,14 @@ export default {
tableOfContent: 'สารบัญ',
draw: 'วาด',
newUpload: 'อัปโหลดใหม่',
+ nativeLanguage: '{msg} ภาษาต้นทาง',
+ copy: 'คัดลอก',
+ paste: 'วาง',
+ period: 'ช่วงเวลา',
+ documentStatus: 'สถานะเอกสาร',
+ advanceSearch: 'ค้นหาขั้นสูง',
+ totalPeople: '{meg} คน',
+ price: 'ราคา {price} บาท',
},
menu: {
@@ -195,12 +204,14 @@ export default {
title: 'จัดการ',
branch: 'สาขา',
personnel: 'บุคลากร',
+ group: 'กลุ่ม',
productService: 'สินค้าและบริการ',
workflow: 'ขั้นตอนการทำงาน',
property: 'คุณสมบัติ',
customer: 'ลูกค้า',
mainData: 'ข้อมูลหลัก',
agencies: 'หน่วยงาน',
+ businessType: 'ประเภทกิจการ',
},
sales: {
@@ -248,6 +259,7 @@ export default {
manual: {
title: 'คู่มือ',
usage: 'การใช้งาน',
+ troubleshooting: 'การแก้ปัญหา',
},
},
@@ -326,7 +338,7 @@ export default {
letterAndNumOnly: 'โปรดใช้เฉพาะ _ ตัวอักษรภาษาอังกฤษและตัวเลขเท่านั้น',
numOnly: 'โปรดใช้เฉพาะตัวเลขเท่านั้น',
requireLength: 'กรุณากรอกให้ครบ {msg} หลัก',
- branchNameField: "โปรดใช้ตัวอักษร ตัวเลข หรือ . , - ' & เท่านั้น",
+ branchNameField: "โปรดใช้ตัวอักษร ตัวเลข หรือ . , - ' ( ) & เท่านั้น",
branchNameENField:
"โปรดใช้ตัวอักษรภาษาอังกฤษ ตัวเลข หรือ . , - ' & เท่านั้น",
passportFormat: 'กรุณากรอกหมายเลขพาสปอร์ตให้ถูกต้องตามรูปแบบ',
@@ -455,6 +467,13 @@ export default {
citizenId: 'เลขที่บัตรประชาชน',
citizenIssue: 'วันที่ออกบัตร',
citizenExpire: 'วันที่หมดอายุ',
+ agencyStatus: 'สถานะเอเจนซี่',
+ normal: 'ปกติ',
+ canceled: 'ยกเลิก',
+ blacklist: 'แบล็คลิสต์',
+ contactName: 'ชื่อผู้ติดต่อ',
+ contactTel: 'เบอร์โทรศัพท์ผู้ติดต่อ',
+ addressForeign: 'ใช้ที่อยู่ต่างประเทศ',
},
},
customer: {
@@ -481,15 +500,16 @@ export default {
},
prefix: {
- mr: 'Mr.',
- mrs: 'Mrs.',
- miss: 'Miss.',
+ mr: 'นาย',
+ mrs: 'นาง',
+ miss: 'นางสาว',
},
citizenId: 'บัตรประจำตัวประชาชน',
religion: 'ศาสนา',
issueDate: 'วันที่ออกหนังสือ',
passportExpiryDate: 'วันหiมดอายุหนังสือเดินทาง',
+ taxpayyerNo: 'เลขที่ประจำตัวผู้เสียภาษี',
ownerName: 'ชื่อนายจ้าง',
firstName: 'ชื่อ ',
@@ -573,7 +593,7 @@ export default {
family: 'ข้อมูลครอบครัว',
},
workerStatus: 'สถานะคนงาน',
- previousPassportNumber: 'หมายเลขอันเก่าหนังสือเดินทาง',
+ previousPassportNumber: 'หมายเลขหนังสือเดินทางเล่มเก่า',
employerBranch: 'สาขานายจ้าง',
employeeCode: 'รหัสลูกจ้าง',
nrcNo: 'เลขบัตรประจำตัวคนซึ่งไม่มีสัญชาติไทย (N.R.C No.)',
@@ -606,7 +626,7 @@ export default {
placeOfBirth: 'สถานที่เกิด',
countryOfbirth: 'ประเทศที่เกิด',
issueCountry: 'ประเทศที่ออก',
- entryCount: 'จำนวนที่เข้าประเทศ',
+ entryCount: 'จำนวนวันที่เข้าประเทศ',
employerSelect: {
branchName: 'ชื่อสาขา',
customerName: 'ชื่อนายจ้าง',
@@ -634,7 +654,7 @@ export default {
permitIssuedAt: 'สถานที่ออกใบอนุญาต',
permitIssueDate: 'วันที่ออกใบอนุญาตทำงาน',
permitExpireDate: 'วันที่หมดอายุใบอนุญาตทำงาน',
- identityNo: 'เลขประจำตัวคนต่างด้าว (13หลัก)',
+ identityNo: 'เลขประจำตัวคนต่างด้าว (13 หลัก)',
},
formFamily: {
citizenId:
@@ -752,10 +772,13 @@ export default {
},
quotation: {
+ ownOnly: 'เห็นเฉพาะใบเสนอราคาของตัวเอง',
quotationDate: 'วันที่ใบเสนอราคา',
seller: 'ผู้ขาย',
paymentChannels: 'ช่องทางชำระเงิน',
channelsThat: 'ช่องทางที่',
+ refNo: 'เลขที่อ้างอิง',
+ bankAccount: 'บัญชีธนาคาร',
bankAccountNumber: 'เลขบัญชีธนาคาร',
bankAccountName: 'ชื่อบัญชี',
inTheNameOf: 'ในนาม',
@@ -903,6 +926,10 @@ export default {
code: 'รหัสหน่วยงาน',
group: 'กลุ่มหน่วยงาน',
name: 'ชื่อหน่วยงาน',
+ contactName: 'ชื่อผู้ติดต่อ',
+ contactTel: 'เบอร์โทรผู้ติดต่อ',
+ bankInfo: 'ข้อมูลธนาคาร',
+ attachment: 'เอกสารเพิ่มเติม',
},
requestList: {
@@ -924,6 +951,7 @@ export default {
nonLocalEmployee: 'พนักงานนอกพื้นที่',
noWorkflowTemplate: 'คุณไม่ได้เลือกแม่แบบขั้นตอนการทำงาน',
salesRepresentative: 'พนักงานขาย',
+ dataOffice: 'สำนักงานเขตจัดหางาน',
ref: 'อ้างอิง',
action: {
title: 'จัดการ',
@@ -1042,6 +1070,9 @@ export default {
confirmDebitNoteAccept: 'ยืนยันการตอบรับใบเพิ่มหนี้',
},
message: {
+ copy: 'คัดลอก',
+ warningPaste: 'คุณต้องการที่จะเเทนที่ข้อมูลที่คัดลอกมาใหม่ใช่หรือไม่',
+ warningCopyEmpty: 'คุณยังไม่ได้คัดลอกข้อมูล',
quotationAccept: 'เมื่อตอบรับเเล้วจะไม่สามารถแก้ไขได้อีก',
beingUse: '"{msg}" มีการใช้งานอยู่',
incompleteDataEntry: 'กรอกข้อมูลไม่ครบในหน้า {tap}',
@@ -1163,6 +1194,7 @@ export default {
'สินค้าที่มีชื่อเดียวกันมีในระบบแล้ว หากคุณต้องการสร้างด้วยชื่อนี้โปรดเลือกรหัสอื่น',
userExists: 'ชื่อผู้ใช้นี้มีอยู่ในระบบอยู่แล้ว',
sameNameExists: 'ชื่อนี้ถูกใช้ไปแล้ว',
+ samePropertyNameExists: 'คุณสมบัตินี้มีอยู่ในระบบอยู่แล้ว',
validateError: 'เกิดข้อผิดพลาดจากการตรวจสอบ',
codeMisMatch: 'รหัสไม่ตรงกัน',
@@ -1188,6 +1220,8 @@ export default {
'มีงานหนึ่งงานหรือมากกว่าที่ไม่อยู่ในสถานะรอดำเนินการ',
reqNotMet: 'ไม่ตรงกัน',
systemError: 'ระบบเกิดข้อผิดพลาด',
+ taskOrderInvalid: 'โปรดเลือก สินค้าเเละสาขา',
+ flowAccountProductIdNotFound: 'ไม่พบสินค้าใน flow account',
},
},
@@ -1459,4 +1493,26 @@ export default {
type: 'ประเภท',
},
},
+
+ dateRange: {
+ today: 'วันนี้',
+ yesterday: 'เมื่อวานนี้',
+ thisWeek: 'สัปดาห์นี้',
+ lastWeek: 'สัปดาห์ที่แล้ว',
+ thisMonth: 'เดือนนี้',
+ lastMonth: 'เดือนที่แล้ว',
+ thisYear: 'ปีนี้',
+ lastYear: 'ปีที่แล้ว',
+ last7Days: '7 วันที่ผ่านมา',
+ last30Days: '30 วันที่ผ่านมา',
+ last90Days: '90 วันที่ผ่านมา',
+ customDateRange: 'กำหนดช่วงวันที่เอง',
+ },
+
+ businessType: {
+ title: 'ประเภทกิจการ',
+ caption: 'จัดการประเภทกิจการ',
+ name: 'ชื่อประเภทกิจการ',
+ nameEn: 'ชื่อประเภทกิจการ (ภาษาอังกฤษ)',
+ },
};
diff --git a/src/layouts/DrawerComponent.vue b/src/layouts/DrawerComponent.vue
index c1b01436..d7a70d33 100644
--- a/src/layouts/DrawerComponent.vue
+++ b/src/layouts/DrawerComponent.vue
@@ -7,7 +7,7 @@ import useMyBranch from 'stores/my-branch';
import { getUserId, getRole } from 'src/services/keycloak';
import { useQuasar } from 'quasar';
import { useI18n } from 'vue-i18n';
-import { isRoleInclude } from 'src/stores/utils';
+import { canAccess } from 'src/stores/utils';
type Menu = {
label: string;
@@ -71,82 +71,50 @@ function initMenu() {
{
label: 'branch',
route: '/branch-management',
- hidden: !isRoleInclude([
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- 'head_of_accountant',
- ]),
+ hidden: !canAccess('branch'),
},
{
label: 'personnel',
route: '/personnel-management',
- hidden: !isRoleInclude([
- 'owner',
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- ]),
+ hidden: !canAccess('personnel'),
+ },
+ {
+ label: 'group',
+ route: '/group-management',
+ hidden: !canAccess('personnel'),
},
{
label: 'workflow',
route: '/workflow',
- hidden: !isRoleInclude(['system', 'head_of_admin', 'admin']),
+ hidden: !canAccess('workflow'),
},
{
label: 'property',
route: '/property',
- hidden: !isRoleInclude(['system', 'head_of_admin', 'admin']),
+ hidden: !canAccess('workflow'),
+ },
+ {
+ label: 'businessType',
+ route: '/business-type',
},
{
label: 'productService',
route: '/product-service',
- hidden: !isRoleInclude([
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- 'head_of_accountant',
- 'head_of_sale',
- 'sale',
- ]),
},
{
label: 'customer',
route: '/customer-management',
- hidden: !isRoleInclude([
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- 'head_of_accountant',
- 'accountant',
- 'head_of_sale',
- 'sale',
- ]),
+ hidden: !canAccess('customer'),
},
{
label: 'agencies',
route: '/agencies-management',
- hidden: !isRoleInclude(['system', 'head_of_admin', 'admin']),
},
],
},
{
label: 'menu.sales',
icon: 'mdi-store-settings-outline',
- hidden: !isRoleInclude([
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- 'head_of_accountant',
- 'accountant',
- 'head_of_sale',
- 'sale',
- ]),
children: [
{ label: 'quotation', route: '/quotation' },
{ label: 'invoice', route: '/invoice' },
@@ -169,16 +137,6 @@ function initMenu() {
label: 'menu.account',
icon: 'mdi-bank-outline',
disabled: false,
- hidden: !isRoleInclude([
- 'system',
- 'head_of_admin',
- 'admin',
- 'branch_manager',
- 'head_of_accountant',
- 'accountant',
- 'head_of_sale',
- 'sale',
- ]),
children: [
{ label: 'receipt', route: '/receipt' },
{ label: 'creditNote', route: '/credit-note' },
@@ -200,10 +158,13 @@ function initMenu() {
{
label: 'menu.overall',
icon: 'mdi-monitor-dashboard',
- hidden: !isRoleInclude(['system', 'head_of_admin', 'admin', 'executive']),
children: [
{ label: 'report', route: '/report' },
- { label: 'dashboard', route: '/dash-board' },
+ {
+ label: 'dashboard',
+ route: '/dash-board',
+ hidden: !canAccess('dashBoard'),
+ },
],
},
@@ -215,6 +176,10 @@ function initMenu() {
label: 'usage',
route: '/manual',
},
+ {
+ label: 'troubleshooting',
+ route: '/troubleshooting',
+ },
],
},
];
diff --git a/src/layouts/MainLayout.vue b/src/layouts/MainLayout.vue
index c09effed..29e106bc 100644
--- a/src/layouts/MainLayout.vue
+++ b/src/layouts/MainLayout.vue
@@ -2,7 +2,7 @@
import { ref, onMounted, computed, reactive } from 'vue';
import { storeToRefs } from 'pinia';
import { useQuasar } from 'quasar';
-import { getUserId, getUsername, logout, getRole } from 'src/services/keycloak';
+import { getUserId, getUsername, getName, logout, getRole } from 'src/services/keycloak';
import { Icon } from '@iconify/vue';
import { useI18n } from 'vue-i18n';
import moment from 'moment';
@@ -39,7 +39,7 @@ const configStore = useConfigStore();
const { data: notificationData } = storeToRefs(notificationStore);
const { visible } = storeToRefs(loaderStore);
-const { t } = useI18n({ useScope: 'global' });
+const { t, locale } = useI18n({ useScope: 'global' });
const userStore = useUserStore();
const canvasModal = ref(false);
@@ -52,8 +52,14 @@ const unread = computed(
);
const userImage = ref();
const userGender = ref('');
+const userName = ref({ th: '', en: '' });
const canvasRef = ref();
+const displayName = computed(() => {
+ if (!userName.value.th && !userName.value.en) return getName() || 'Guest';
+ return locale.value === 'eng' ? userName.value.en : userName.value.th;
+});
+
const language: {
value: Lang;
label: string;
@@ -161,9 +167,14 @@ onMounted(async () => {
if (user === 'admin') return;
if (uid) {
const res = await userStore.fetchById(uid);
- if (res && res.gender) {
- userGender.value = res.gender;
- userImage.value = `${baseUrl}/user/${uid}/profile-image/${res.selectedImage}`;
+ if (res) {
+ if (res.gender) {
+ userGender.value = res.gender;
+ userImage.value = `${baseUrl}/user/${uid}/profile-image/${res.selectedImage}`;
+ }
+ // เก็บชื่อทั้งสองภาษา
+ userName.value.th = `${res.firstName || ''} ${res.lastName || ''}`.trim();
+ userName.value.en = `${res.firstNameEN || ''} ${res.lastNameEN || ''}`.trim();
}
}
});
@@ -484,6 +495,7 @@ onMounted(async () => {
{
style="margin-top: 58px"
>
- {{ getName() }}
+ {{ userName || getName() }}
{{ 'Guest' }}
- {{ getName() }}
+ {{ userName || getName() }}
{{ 'Guest' }}
diff --git a/src/pages/00_manual/MainPage.vue b/src/pages/00_manual/MainPage.vue
index adcb668f..33a19ebe 100644
--- a/src/pages/00_manual/MainPage.vue
+++ b/src/pages/00_manual/MainPage.vue
@@ -1,7 +1,7 @@
@@ -34,7 +56,7 @@ onMounted(async () => {
>
@@ -998,6 +1011,18 @@ watch(
/>
+
+
+
+
diff --git a/src/pages/03_customer-management/TabEmployee.vue b/src/pages/03_customer-management/TabEmployee.vue
new file mode 100644
index 00000000..81348622
--- /dev/null
+++ b/src/pages/03_customer-management/TabEmployee.vue
@@ -0,0 +1,514 @@
+
+
+
+
+
+
+
+ {{ $t('general.all') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {
+ if (
+ $q.screen.gt.xs ||
+ currentPageEmployee === maxPageEmployee
+ )
+ return;
+ currentPageEmployee = currentPageEmployee + 1;
+ fetchListEmployee().then(() =>
+ done(currentPageEmployee >= maxPageEmployee),
+ );
+ }
+ "
+ >
+ {
+ openHistory(item.id);
+ }
+ "
+ @view="
+ async (item: any) => {
+ employeeFormState.drawerModal = true;
+ employeeFormState.isEmployeeEdit = false;
+ employeeFormStore.assignFormDataEmployee(item.id);
+ await fetchImageList(
+ item.id,
+ item.selectedImage || '',
+ 'employee',
+ );
+ }
+ "
+ @edit="(item: any) => editEmployeeFormPersonal(item.id)"
+ @delete="
+ (item: any) => {
+ deleteEmployeeById({
+ id: item.id,
+ fetch: async () =>
+ await fetchListEmployee(
+ currentTab === 'employer'
+ ? {
+ page: 1,
+ pageSize: 999,
+ customerId: customerFormState.currentCustomerId,
+ }
+ : {
+ fetchStats: true,
+ mobileFetch: $q.screen.xs,
+ },
+ ),
+ });
+ }
+ "
+ @toggle-status="
+ async (item: any) => {
+ triggerChangeStatus(item.id, item.status, item.firstNameEN);
+ }
+ "
+ />
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ triggerChangeStatus(
+ currentFromDataEmployee.id,
+ s,
+ currentFromDataEmployee.firstNameEN,
+ )
+ "
+ />
+
+
+
+
+
+
+
+
+
diff --git a/src/pages/03_customer-management/components/employer/EmployerFormAbout.vue b/src/pages/03_customer-management/components/employer/EmployerFormAbout.vue
index eb131ea9..7353db3c 100644
--- a/src/pages/03_customer-management/components/employer/EmployerFormAbout.vue
+++ b/src/pages/03_customer-management/components/employer/EmployerFormAbout.vue
@@ -137,7 +137,12 @@ watch(
@update:model-value="
(v) => (typeof v === 'string' ? (registerName = v.trim()) : '')
"
- :rules="[(val: string) => !!val || $t('form.error.required')]"
+ :rules="[
+ (val) => !!val || $t('form.error.required'),
+ (val) =>
+ /^[A-Za-z0-9ก-๙\s&.,'()-]+$/.test(val) ||
+ $t('form.error.branchNameField'),
+ ]"
/>
(typeof v === 'string' ? (registerNameEN = v.trim()) : '')
"
:rules="[
- (val: string) =>
- val === '' ||
- /^[0-9A-Za-z\s.,]+$/.test(val) ||
- $t('form.error.letterOnly'),
+ (val) => !!val || $t('form.error.required'),
+ (val) =>
+ /^[A-Za-z0-9\s&.,'-]+$/.test(val) ||
+ $t('form.error.branchNameENField'),
]"
/>
- (typeof v === 'string' ? (customerName = v.trim()) : '')
- "
- />
-
(typeof v === 'string' ? (prefixName = v) : '')
"
@clear="prefixName = ''"
+ :rules="[(val: string) => !!val || $t('form.error.required')]"
>
@@ -393,11 +385,11 @@ watch(
:readonly="readonly"
:disable="!readonly"
class="col-md-2 col-6"
- label="Title"
+ label="Prefix"
:model-value="
readonly
- ? capitalize(prefixName || '') || '-'
- : capitalize(prefixName || '')
+ ? prefixName.toUpperCase() || '-'
+ : prefixName.toUpperCase() || ''
"
@update:model-value="
(v) => (typeof v === 'string' ? (prefixName = v) : '')
diff --git a/src/pages/03_customer-management/components/employer/EmployerFormBasicInfo.vue b/src/pages/03_customer-management/components/employer/EmployerFormBasicInfo.vue
index d31d3889..dbb57c80 100644
--- a/src/pages/03_customer-management/components/employer/EmployerFormBasicInfo.vue
+++ b/src/pages/03_customer-management/components/employer/EmployerFormBasicInfo.vue
@@ -2,6 +2,7 @@
import useOptionStore from 'stores/options';
import SelectBranch from 'src/components/shared/select/SelectBranch.vue';
import { isRoleInclude } from 'src/stores/utils';
+import SelectBusinessType from 'src/components/shared/select/SelectBusinessType.vue';
withDefaults(
defineProps<{
@@ -102,7 +103,13 @@ const telephoneNo = defineModel('telephoneNo', { default: '' });
class="col-md-6"
:readonly
:disabled="
- !isRoleInclude(['admin', 'system', 'head_of_admin']) && !readonly
+ !isRoleInclude([
+ 'admin',
+ 'system',
+ 'head_of_admin',
+ 'executive',
+ 'accountant',
+ ]) && !readonly
"
:label="$t('customer.form.registeredBranch')"
select-first-value
@@ -136,15 +143,10 @@ const telephoneNo = defineModel('telephoneNo', { default: '' });
for="input-tax"
v-model="legalPersonNo"
/>
-
@@ -173,15 +175,10 @@ const telephoneNo = defineModel
('telephoneNo', { default: '' });
:label="$t('personnel.form.citizenId')"
for="input-citizen-id"
/>
-
diff --git a/src/pages/03_customer-management/components/employer/EmployerFormBranch.vue b/src/pages/03_customer-management/components/employer/EmployerFormBranch.vue
index 1b70b651..14f7aa98 100644
--- a/src/pages/03_customer-management/components/employer/EmployerFormBranch.vue
+++ b/src/pages/03_customer-management/components/employer/EmployerFormBranch.vue
@@ -7,6 +7,8 @@ import { CustomerCreate } from 'stores/customer/types';
import EmployerFormAbout from './EmployerFormAbout.vue';
import EmployerFormAuthorized from './EmployerFormAuthorized.vue';
import { waitAll } from 'src/stores/utils';
+import FormEmployeePassport from 'src/components/03_customer-management/FormEmployeePassport.vue';
+import FormEmployeeVisa from 'src/components/03_customer-management/FormEmployeeVisa.vue';
import {
FormCitizen,
CorpFormBusinessRegistration,
@@ -51,6 +53,7 @@ withDefaults(
actionDisabled?: boolean;
customerType?: 'CORP' | 'PERS';
hideAction?: boolean;
+ hideDelete?: boolean;
}>(),
{
hideAction: false,
@@ -81,7 +84,7 @@ withDefaults(
/>
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
- (businessTypeDialog = true)"
+ />
+
-
-
-
- {{ $t('general.noData') }}
-
-
-
-
+ @create="() => (businessTypeDialog = true)"
+ />
+
+
diff --git a/src/pages/03_customer-management/components/employer/EmployerFormContact.vue b/src/pages/03_customer-management/components/employer/EmployerFormContact.vue
index 4a58439c..7f56742c 100644
--- a/src/pages/03_customer-management/components/employer/EmployerFormContact.vue
+++ b/src/pages/03_customer-management/components/employer/EmployerFormContact.vue
@@ -9,8 +9,6 @@ const contactName = defineModel('contactName');
const email = defineModel('email');
const contactTel = defineModel('contactTel');
const officeTel = defineModel('officeTel');
-const agent = defineModel('agent');
-
const agentUserId = defineModel('agentUserId');
@@ -109,7 +107,6 @@ const agentUserId = defineModel('agentUserId');
/>
-
{
const customerStore = useCustomerStore();
+ const onCreateImageList = ref<{
+ selectedImage: string;
+ list: { url: string; imgFile: File | null; name: string }[];
+ }>({ selectedImage: '', list: [] });
+
+ const { t } = useI18n();
+ const flowStore = useFlowStore();
+
+ const userBranchStore = useMyBranchStore();
+
+ const registerAbleBranchOption = ref<{ id: string; name: string }[]>();
+
+ const currentBranchRootId = ref('');
+
+ const tabFieldRequired = ref<{
+ [key: string]: (keyof CustomerBranchCreate)[];
+ }>({
+ main: [],
+ business: ['businessTypeId', 'jobPosition'],
+ address: [
+ 'address',
+ 'addressEN',
+ 'provinceId',
+ 'districtId',
+ 'subDistrictId',
+ ],
+ contact: [],
+ });
const defaultFormData: CustomerCreate = {
// code: '',
@@ -54,6 +88,7 @@ export const useCustomerForm = defineStore('form-customer', () => {
formDataOcr: Record;
isImageEdit: boolean;
currentCustomerId?: string;
+ imageList: { list: string[]; selectedImage: string };
}>({
dialogType: 'info',
dialogOpen: false,
@@ -70,6 +105,7 @@ export const useCustomerForm = defineStore('form-customer', () => {
treeFile: [],
formDataOcr: {},
isImageEdit: false,
+ imageList: { list: [], selectedImage: '' },
});
watch(
@@ -132,6 +168,7 @@ export const useCustomerForm = defineStore('form-customer', () => {
state.value.editCustomerCode = data.code;
state.value.customerImageUrl = `${baseUrl}/customer/${id}/image/${data.selectedImage}`;
state.value.defaultCustomerImageUrl = `${baseUrl}/customer/${id}/image/${data.selectedImage}`;
+ currentBranchRootId.value = data.branch[0].id || '';
resetFormData.registeredBranchId = data.registeredBranchId;
resetFormData.status = data.status;
@@ -153,7 +190,7 @@ export const useCustomerForm = defineStore('form-customer', () => {
payDate: v.payDate,
jobDescription: v.jobDescription,
jobPosition: v.jobPosition,
- businessType: v.businessType,
+ businessTypeId: v.businessTypeId,
employmentOffice: v.employmentOffice,
employmentOfficeEN: v.employmentOfficeEN,
telephoneNo: v.telephoneNo,
@@ -190,7 +227,6 @@ export const useCustomerForm = defineStore('form-customer', () => {
contactTel: v.contactTel,
officeTel: v.officeTel,
agentUserId: v.agentUserId || undefined,
- customerName: v.customerName,
authorizedName: v.authorizedName,
authorizedNameEN: v.authorizedNameEN,
@@ -228,7 +264,6 @@ export const useCustomerForm = defineStore('form-customer', () => {
async function addCurrentCustomerBranch() {
if (currentFormData.value.customerBranch?.some((v) => !v.id)) return;
currentFormData.value.customerBranch?.push({
- id: '',
customerId: '',
branchCode:
currentFormData.value.customerBranch.length !== 0
@@ -262,8 +297,8 @@ export const useCustomerForm = defineStore('form-customer', () => {
birthDate:
currentFormData.value.customerBranch?.at(0)?.birthDate || undefined,
- businessType:
- currentFormData.value.customerBranch?.at(0)?.businessType || '',
+ businessTypeId:
+ currentFormData.value.customerBranch?.at(0)?.businessTypeId || '',
jobPosition:
currentFormData.value.customerBranch?.at(0)?.jobPosition || '',
jobDescription:
@@ -300,8 +335,6 @@ export const useCustomerForm = defineStore('form-customer', () => {
currentFormData.value.customerBranch?.at(0)?.agentUserId || undefined,
status: 'CREATED',
- customerName:
- currentFormData.value.customerBranch?.at(0)?.customerName || '',
registerName:
currentFormData.value.customerBranch?.at(0)?.registerName || '',
registerNameEN:
@@ -360,23 +393,142 @@ export const useCustomerForm = defineStore('form-customer', () => {
}
}
+ async function fetchListOfOptionBranch() {
+ if (registerAbleBranchOption.value) return;
+
+ const uid = getUserId();
+ const role = getRole();
+
+ if (!uid) return; // should not possible as the system require login to be able to access resource.
+
+ if (role?.includes('system')) {
+ const result = await userBranchStore.fetchListOptionBranch();
+ if (result && result.total > 0)
+ registerAbleBranchOption.value = result.result;
+ } else {
+ const result = await userBranchStore.fetchListMyBranch(uid);
+ if (result && result.total > 0)
+ registerAbleBranchOption.value = result.result;
+ }
+
+ // TODO: Assign (first) branch of the user as register branch of the data
+ }
+
+ function customerFormUndo(close = true) {
+ if (isFormDataDifferent()) {
+ return customerConfirmUnsave(close);
+ }
+ resetForm();
+ state.value.readonly = true;
+ }
+
+ function customerConfirmUnsave(close = true) {
+ dialog({
+ color: 'warning',
+ icon: 'mdi-alert',
+ title: t('form.warning.title'),
+ actionText: t('general.ok'),
+ persistent: true,
+ message: t('form.warning.unsave'),
+
+ action: () => {
+ resetForm();
+ state.value.readonly = true;
+
+ if (!state.value.drawerModal) {
+ state.value.dialogModal = !close;
+ } else {
+ state.value.drawerModal = !close;
+ }
+ },
+ cancel: () => {},
+ });
+ }
+
+ function deleteCustomerById(
+ id: string,
+ fetch?: (...args: unknown[]) => unknown,
+ ) {
+ dialog({
+ color: 'negative',
+ icon: 'mdi-alert',
+ title: t('dialog.title.confirmDelete'),
+ actionText: t('general.delete'),
+ persistent: true,
+ message: t('dialog.message.confirmDelete'),
+ action: async () => {
+ await customerStore.deleteById(id);
+ await fetch();
+ state.value.dialogModal = false;
+ flowStore.rotate();
+ },
+ cancel: () => {},
+ });
+ }
+
+ function validateTabField(
+ value: T,
+ fieldRequired: { [key: string]: (keyof T)[] },
+ ) {
+ const list: string[] = [];
+
+ for (const tab in fieldRequired) {
+ for (const field of fieldRequired[tab]) {
+ if (!value[field] && !list.includes(tab)) list.push(tab);
+ }
+ }
+
+ return list;
+ }
+
+ async function deleteCustomerBranchById(id: string) {
+ return await new Promise((resolve) => {
+ dialog({
+ color: 'negative',
+ icon: 'mdi-alert',
+ title: t('dialog.title.confirmDelete'),
+ actionText: t('general.delete'),
+ persistent: true,
+ message: t('dialog.message.confirmDelete'),
+ action: async () => {
+ await customerStore.deleteBranchById(id);
+ flowStore.rotate();
+ resolve(true);
+ },
+ cancel: () => {
+ resolve(false);
+ },
+ });
+ });
+ }
+
return {
+ onCreateImageList,
+ tabFieldRequired,
+ registerAbleBranchOption,
state,
resetFormData,
currentFormData,
+ currentBranchRootId,
+
isFormDataDifferent,
resetForm,
assignFormData,
submitFormCustomer,
addCurrentCustomerBranch,
deleteAttachment,
+ fetchListOfOptionBranch,
+ customerFormUndo,
+ customerConfirmUnsave,
+ deleteCustomerById,
+ validateTabField,
+ deleteCustomerBranchById,
};
});
export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
const customerStore = useCustomerStore();
const customerFormStore = useCustomerForm();
-
const defaultFormData: CustomerBranchCreate & {
id?: string;
codeCustomer?: string;
@@ -397,7 +549,7 @@ export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
gender: '',
birthDate: undefined,
- businessType: '',
+ businessTypeId: '',
jobPosition: '',
jobDescription: '',
payDate: '',
@@ -427,7 +579,6 @@ export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
agentUserId: undefined,
status: 'CREATED',
- customerName: '',
registerName: '',
registerNameEN: '',
registerDate: undefined,
@@ -479,7 +630,7 @@ export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
payDateEN: _data.payDateEN,
jobDescription: _data.jobDescription,
jobPosition: _data.jobPosition,
- businessType: _data.businessType,
+ businessTypeId: _data.businessTypeId,
employmentOffice: _data.employmentOffice,
employmentOfficeEN: _data.employmentOfficeEN,
telephoneNo: _data.telephoneNo,
@@ -513,7 +664,6 @@ export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
officeTel: _data.officeTel,
agentUserId: _data.agentUserId || undefined,
codeCustomer: _data.codeCustomer,
- customerName: _data.customerName,
homeCode: _data.homeCode,
authorizedName: _data.authorizedName,
authorizedNameEN: _data.authorizedNameEN,
@@ -581,11 +731,23 @@ export const useCustomerBranchForm = defineStore('form-customer-branch', () => {
});
export const useEmployeeForm = defineStore('form-employee', () => {
+ const { t } = useI18n();
const customerStore = useCustomerStore();
const employeeStore = useEmployeeStore();
const flowStore = useFlowStore();
const branchStore = useMyBranch();
+ const route = useRoute();
+
+ const refreshImageState = ref(false);
+
+ const onCreateImageList = ref<{
+ selectedImage: string;
+ list: { url: string; imgFile: File | null; name: string }[];
+ }>({ selectedImage: '', list: [] });
+
+ const statusEmployeeCreate = ref(false);
+
const state = ref<{
dialogType: 'info' | 'create' | 'edit';
imageDialog: boolean;
@@ -594,6 +756,8 @@ export const useEmployeeForm = defineStore('form-employee', () => {
drawerModal: boolean;
isImageEdit: boolean;
+ currentBranchId: string;
+ currentCustomerBranch?: CustomerBranch;
currentEmployeeCode: string;
currentEmployee: Employee | null;
currentIndexPassport: number;
@@ -626,7 +790,9 @@ export const useEmployeeForm = defineStore('form-employee', () => {
}
| undefined;
ocr: boolean;
+ imageList: { list: string[]; selectedImage: string };
}>({
+ currentBranchId: '',
isImageEdit: false,
currentIndexPassport: -1,
currentIndexVisa: -1,
@@ -649,9 +815,10 @@ export const useEmployeeForm = defineStore('form-employee', () => {
infoEmployeePersonCard: [],
formDataEmployeeOwner: undefined,
ocr: false,
+ imageList: { list: [], selectedImage: '' },
});
- const defaultFormData: EmployeeCreate = {
+ const defaultFormData: EmployeeCreate & { image?: File } = {
id: '',
code: '',
customerBranchId: '',
@@ -733,6 +900,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
expireDate: new Date(),
remark: undefined,
workerType: '',
+ reportDate: null,
number: '',
},
],
@@ -778,7 +946,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
};
let resetEmployeeData = structuredClone(defaultFormData);
- const currentFromDataEmployee = ref(
+ const currentFromDataEmployee = ref(
structuredClone(defaultFormData),
);
@@ -800,12 +968,14 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentIndexVisa = -1;
state.value.currentIndexCheckup = -1;
state.value.currentIndexWorkHistory = -1;
- state.value.currentTab = 'personalInfo';
+ state.value.imageList = { list: [], selectedImage: '' };
+ // state.value.currentTab = 'personalInfo';
if (clean) {
state.value.formDataEmployeeOwner = undefined;
resetEmployeeData = structuredClone(defaultFormData);
state.value.statusSavePersonal = false;
state.value.profileUrl = '';
+ state.value.currentBranchId = '';
} else {
resetEmployeeData.selectedImage =
currentFromDataEmployee.value.selectedImage;
@@ -826,12 +996,16 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentIndexPassport
].id === undefined
) {
+ const { id, employeeId, updatedAt, createdAt, file, ...payload } =
+ currentFromDataEmployee.value.employeePassport?.[
+ state.value.currentIndexPassport
+ ];
+
const res = await employeeStore.postMeta({
parentId: currentFromDataEmployee.value.id || '',
group: 'passport',
- meta: currentFromDataEmployee.value.employeePassport?.[
- state.value.currentIndexPassport
- ],
+ meta: payload,
+ file: file,
});
if (res) {
@@ -845,7 +1019,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentIndexPassport
].id !== undefined
) {
- const { id, employeeId, updatedAt, createdAt, ...payload } =
+ const { id, employeeId, updatedAt, createdAt, file, ...payload } =
currentFromDataEmployee.value.employeePassport?.[
state.value.currentIndexPassport
];
@@ -858,6 +1032,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentIndexPassport
].id || '',
meta: payload,
+ file: file || undefined,
});
}
@@ -1085,10 +1260,12 @@ export const useEmployeeForm = defineStore('form-employee', () => {
await assignFormDataEmployee(currentFromDataEmployee.value.id);
}
- async function submitPersonal(imgList: {
+ async function submitPersonal(imgList?: {
selectedImage: string;
list: { url: string; imgFile: File | null; name: string }[];
}) {
+ let employeeId: string | undefined = undefined;
+
currentFromDataEmployee.value.firstName =
currentFromDataEmployee.value.firstName.trim();
currentFromDataEmployee.value.middleName =
@@ -1104,10 +1281,11 @@ export const useEmployeeForm = defineStore('form-employee', () => {
currentFromDataEmployee.value.lastNameEN.trim();
if (state.value.dialogType === 'create') {
+ delete currentFromDataEmployee.value.image;
const res = await employeeStore.create(
{
...currentFromDataEmployee.value,
- customerBranchId: state.value.formDataEmployeeOwner?.id || '',
+ customerBranchId: state.value.currentBranchId || '',
employeeWork: [],
employeeCheckup: [],
@@ -1117,6 +1295,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
);
if (res) {
+ employeeId = res.id;
await assignFormDataEmployee(res.id);
currentFromDataEmployee.value.id = res.id;
state.value.statusSavePersonal = true;
@@ -1131,17 +1310,19 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentEmployee?.status === 'CREATED'
? 'ACTIVE'
: state.value.currentEmployee?.status,
- customerBranchId: state.value.formDataEmployeeOwner?.id || '',
+ customerBranchId: state.value.currentBranchId || '',
employeeWork: [],
employeeCheckup: [],
employeeOtherInfo: undefined,
},
);
if (res) {
+ employeeId = res.id;
await assignFormDataEmployee(res.id);
state.value.statusSavePersonal = true;
}
}
+ return employeeId;
}
async function assignFormDataEmployee(id?: string) {
@@ -1183,7 +1364,19 @@ export const useEmployeeForm = defineStore('form-employee', () => {
employeePassport: structuredClone(
payload.employeePassport?.length === 0
? state.value.dialogModal
- ? defaultFormData.employeePassport
+ ? defaultFormData.employeePassport.map((v) => ({
+ ...v,
+ namePrefix: payload.namePrefix,
+ firstName: payload.firstName,
+ firstNameEN: payload.firstNameEN,
+ middleName: payload.middleName,
+ middleNameEN: payload.middleNameEN,
+ lastName: payload.lastName,
+ lastNameEN: payload.lastNameEN,
+ gender: payload.gender,
+ nationality: payload.nationality,
+ birthDate: payload.dateOfBirth,
+ }))
: []
: payload.employeePassport,
),
@@ -1205,12 +1398,10 @@ export const useEmployeeForm = defineStore('form-employee', () => {
statusSave: true,
})),
),
- employeeOtherInfo: structuredClone(
- {
- ...payload.employeeOtherInfo,
- statusSave: !!payload.employeeOtherInfo?.id ? true : false,
- } || {},
- ),
+ employeeOtherInfo: structuredClone({
+ ...(payload.employeeOtherInfo ?? {}),
+ statusSave: true,
+ }),
employeeWork: structuredClone(
payload.employeeWork?.length === 0
? state.value.dialogModal
@@ -1270,6 +1461,8 @@ export const useEmployeeForm = defineStore('form-employee', () => {
state.value.currentIndexVisa = -1;
}
+ state.value.currentBranchId = payload.customerBranchId;
+
const foundBranch = await customerStore.fetchListCustomerBranchById(
payload.customerBranchId,
);
@@ -1325,17 +1518,17 @@ export const useEmployeeForm = defineStore('form-employee', () => {
issueDate: new Date(),
type: '',
expireDate: new Date(),
- birthDate: new Date(),
+ birthDate: currentFromDataEmployee.value.dateOfBirth,
workerStatus: '',
- nationality: '',
- gender: '',
- lastNameEN: '',
- lastName: '',
- middleNameEN: '',
- middleName: '',
- firstNameEN: '',
- firstName: '',
- namePrefix: '',
+ nationality: currentFromDataEmployee.value.nationality,
+ gender: currentFromDataEmployee.value.gender,
+ lastNameEN: currentFromDataEmployee.value.lastNameEN,
+ lastName: currentFromDataEmployee.value.lastName,
+ middleNameEN: currentFromDataEmployee.value.middleNameEN,
+ middleName: currentFromDataEmployee.value.middleName,
+ firstNameEN: currentFromDataEmployee.value.firstNameEN,
+ firstName: currentFromDataEmployee.value.firstName,
+ namePrefix: currentFromDataEmployee.value.namePrefix,
number: '',
});
@@ -1357,6 +1550,7 @@ export const useEmployeeForm = defineStore('form-employee', () => {
expireDate: new Date(),
remark: undefined,
workerType: '',
+ reportDate: null,
number: '',
});
@@ -1396,10 +1590,92 @@ export const useEmployeeForm = defineStore('form-employee', () => {
(currentFromDataEmployee.value.employeeWork?.length || 0) - 1;
}
+ function employeeFormUndo(close = true) {
+ if (isFormDataDifferent()) {
+ return employeeConfirmUnsave(close);
+ }
+ resetFormDataEmployee();
+ state.value.editReadonly = true;
+ }
+
+ function employeeConfirmUnsave(close = true) {
+ dialog({
+ color: 'warning',
+ icon: 'mdi-alert',
+ title: t('form.warning.title'),
+ actionText: t('general.ok'),
+ persistent: true,
+ message: t('form.warning.unsave'),
+ action: () => {
+ resetFormDataEmployee();
+ onCreateImageList.value = { selectedImage: '', list: [] };
+ state.value.editReadonly = true;
+ state.value.dialogModal = !close;
+ state.value.drawerModal = !close;
+ },
+ cancel: () => {},
+ });
+ }
+
+ async function deleteEmployeeById(opts: {
+ id?: string;
+ type?: 'passport' | 'visa' | 'healthCheck' | 'work';
+ index?: number;
+ fetch?: (...args: unknown[]) => unknown;
+ removeArray?: (...args: unknown[]) => unknown;
+ }) {
+ dialog({
+ color: 'negative',
+ icon: 'mdi-alert',
+ title: t('dialog.title.confirmDelete'),
+ actionText: t('general.delete'),
+ persistent: true,
+ message: t('dialog.message.confirmDelete'),
+ action: async () => {
+ if (opts.type === 'passport' && opts.index !== undefined) {
+ await deletePassport(opts.index);
+ }
+
+ if (opts.type === 'visa' && opts.index !== undefined) {
+ await deleteVisa(opts.index);
+ }
+
+ if (opts.type === 'healthCheck' && opts.index !== undefined) {
+ await deleteHealthCheck(opts.index);
+ }
+
+ if (opts.type === 'work' && opts.index !== undefined) {
+ await deleteWorkHistory(opts.index);
+ } else {
+ if (!!opts.id) {
+ const result = await employeeStore.deleteById(opts.id);
+
+ if (result) {
+ state.value.drawerModal = false;
+ state.value.dialogModal = false;
+ }
+ }
+ }
+
+ if (route.name !== 'CustomerBranchManagement') {
+ await opts.fetch?.();
+ flowStore.rotate();
+ }
+ opts.removeArray?.();
+ },
+
+ cancel: () => {},
+ });
+ }
+
return {
+ refreshImageState,
+ statusEmployeeCreate,
+ onCreateImageList,
state,
currentFromDataEmployee,
resetEmployeeData,
+
addPassport,
addVisa,
addCheckup,
@@ -1423,5 +1699,9 @@ export const useEmployeeForm = defineStore('form-employee', () => {
employeeFilterOwnerBranch,
isFormDataDifferent,
+
+ employeeFormUndo,
+ employeeConfirmUnsave,
+ deleteEmployeeById,
};
});
diff --git a/src/pages/04_flow-managment/FlowDialog.vue b/src/pages/04_flow-managment/FlowDialog.vue
index 77d8bd12..42c429ba 100644
--- a/src/pages/04_flow-managment/FlowDialog.vue
+++ b/src/pages/04_flow-managment/FlowDialog.vue
@@ -43,6 +43,7 @@ withDefaults(
defineProps<{
readonly?: boolean;
isEdit?: boolean;
+ hideAction?: boolean;
}>(),
{ readonly: false, isEdit: false },
);
@@ -60,6 +61,7 @@ async function addStep() {
flowData.value.step.push({
responsibleInstitution: [],
responsiblePersonId: [],
+ responsibleGroup: [],
value: [],
detail: '',
name: '',
@@ -166,6 +168,7 @@ function triggerPropertiesDialog(step: WorkFlowPayloadStep) {
id="flow-form-dialog"
>
import { onMounted, reactive, ref, watch } from 'vue';
-import { QSelect, QTableProps } from 'quasar';
+import { QTableProps } from 'quasar';
import { storeToRefs } from 'pinia';
import { useI18n } from 'vue-i18n';
@@ -11,7 +11,7 @@ import {
} from 'src/stores/workflow-template/types';
import { useWorkflowTemplate } from 'src/stores/workflow-template';
import { useNavigator } from 'src/stores/navigator';
-import { dialog } from 'src/stores/utils';
+import { dialog, canAccess } from 'src/stores/utils';
import FloatingActionButton from 'components/FloatingActionButton.vue';
import StatCardComponent from 'src/components/StatCardComponent.vue';
@@ -22,6 +22,7 @@ import NoData from 'src/components/NoData.vue';
import KebabAction from 'src/components/shared/KebabAction.vue';
import PaginationPageSize from 'src/components/PaginationPageSize.vue';
import { useQuasar } from 'quasar';
+import AdvanceSearch from 'src/components/shared/AdvanceSearch.vue';
const { t } = useI18n();
const workflowStore = useWorkflowTemplate();
@@ -45,6 +46,7 @@ const pageState = reactive({
addModal: false,
viewDrawer: false,
isDrawerEdit: true,
+ searchDate: [],
});
const fieldSelected = ref<('order' | 'name' | 'step')[]>([
@@ -68,7 +70,6 @@ const fieldSelectedOption = ref<{ label: string; value: string }[]>([
},
]);
-const refFilter = ref>();
const currWorkflowData = ref();
const formDataWorkflow = ref({
status: 'CREATED',
@@ -102,6 +103,7 @@ const columns = [
function triggerDialog(type: 'add' | 'edit' | 'view') {
if (type === 'add') {
registeredBranchId.value = '';
+ userInTable.value = [];
formDataWorkflow.value = {
status: 'CREATED',
name: '',
@@ -206,7 +208,7 @@ async function submit() {
...formDataWorkflow.value,
});
} else {
- await workflowStore.creatWorkflowTemplate({
+ await workflowStore.createWorkflowTemplate({
registeredBranchId: registeredBranchId.value,
...formDataWorkflow.value,
});
@@ -222,7 +224,11 @@ function assignFormData(workflowData: WorkflowTemplate) {
status: workflowData.status,
name: workflowData.name,
step: workflowData.step.map((s, i) => {
- userInTable.value[i] = { name: s.name, responsiblePerson: [] };
+ userInTable.value[i] = {
+ name: s.name,
+ responsiblePerson: [],
+ responsibleGroup: [],
+ };
s.responsiblePerson.forEach((p) => {
userInTable.value[i].responsiblePerson.push({
id: p.user.id,
@@ -236,12 +242,16 @@ function assignFormData(workflowData: WorkflowTemplate) {
code: p.user.code,
});
});
+ s.responsibleGroup.forEach((g) => {
+ userInTable.value[i].responsibleGroup.push(g);
+ });
return {
id: s.id,
name: s.name,
detail: s.detail,
messengerByArea: s.messengerByArea || false,
value: s.value.length > 0 ? JSON.parse(JSON.stringify(s.value)) : [],
+ responsibleGroup: s.responsibleGroup.map((g) => g),
responsiblePersonId: s.responsiblePerson.map((p) => p.userId),
responsibleInstitution: JSON.parse(
JSON.stringify(s.responsibleInstitution),
@@ -282,6 +292,8 @@ async function fetchWorkflowList(mobileFetch?: boolean) {
: statusFilter.value === 'statusACTIVE'
? 'ACTIVE'
: 'INACTIVE',
+ startDate: pageState.searchDate[0],
+ endDate: pageState.searchDate[1],
});
if (res) {
workflowData.value =
@@ -311,14 +323,18 @@ watch(
fetchWorkflowList();
},
);
-watch([() => pageState.inputSearch, workflowPageSize], () => {
- workflowData.value = [];
- workflowPage.value = 1;
- fetchWorkflowList();
-});
+watch(
+ [() => pageState.inputSearch, workflowPageSize, () => pageState.searchDate],
+ () => {
+ workflowData.value = [];
+ workflowPage.value = 1;
+ fetchWorkflowList();
+ },
+);
pageState.inputSearch, workflowPageSize], () => {
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
pageState.inputSearch, workflowPageSize], () => {
class="col surface-2 flex items-center justify-center"
>
pageState.inputSearch, workflowPageSize], () => {
"
/>
pageState.inputSearch, workflowPageSize], () => {
"
/>
{
@@ -813,6 +849,7 @@ watch([() => pageState.inputSearch, workflowPageSize], () => {
@drawer-undo="undo"
@close="resetForm"
@submit="submit"
+ :hide-action="!canAccess('workflow', 'edit')"
:readonly="!pageState.isDrawerEdit"
:isEdit="pageState.isDrawerEdit"
v-model="pageState.addModal"
diff --git a/src/pages/04_product-service/MainPage.vue b/src/pages/04_product-service/MainPage.vue
index 462e7476..17cd4040 100644
--- a/src/pages/04_product-service/MainPage.vue
+++ b/src/pages/04_product-service/MainPage.vue
@@ -3,7 +3,7 @@ import { nextTick, ref, watch, reactive } from 'vue';
import { useI18n } from 'vue-i18n';
import { onMounted } from 'vue';
import { storeToRefs } from 'pinia';
-import { QSelect, useQuasar, type QTableProps } from 'quasar';
+import { useQuasar, type QTableProps } from 'quasar';
import DialogProperties from 'src/components/dialog/DialogProperties.vue';
import ProductCardComponent from 'components/04_product-service/ProductCardComponent.vue';
@@ -33,6 +33,7 @@ import {
SaveButton,
UndoButton,
ToggleButton,
+ ImportButton,
} from 'components/button';
import TableProduct from 'src/components/04_product-service/TableProduct.vue';
import PaginationPageSize from 'src/components/PaginationPageSize.vue';
@@ -40,7 +41,7 @@ import PaginationPageSize from 'src/components/PaginationPageSize.vue';
import useFlowStore from 'stores/flow';
import { dateFormat } from 'src/utils/datetime';
-import { formatNumberDecimal, isRoleInclude } from 'stores/utils';
+import { formatNumberDecimal, isRoleInclude, canAccess } from 'stores/utils';
const { getWorkflowTemplate } = useWorkflowTemplate();
import { Status } from 'stores/types';
@@ -59,6 +60,7 @@ import {
ServiceById,
WorkItems,
Attributes,
+ WorkCreate,
} from 'stores/product-service/types';
import { computed } from 'vue';
import {
@@ -67,6 +69,8 @@ import {
} from 'src/stores/workflow-template/types';
import { useWorkflowTemplate } from 'src/stores/workflow-template';
import { deepEquals } from 'src/utils/arr';
+import { toRaw } from 'vue';
+import AdvanceSearch from 'src/components/shared/AdvanceSearch.vue';
const flowStore = useFlowStore();
const navigatorStore = useNavigator();
@@ -96,10 +100,15 @@ const {
createWork,
editWork,
deleteWork,
+
+ importProduct,
+
+ productExport,
} = productServiceStore;
const { workNameItems } = storeToRefs(productServiceStore);
const allStat = ref<{ mode: string; count: number }[]>([]);
+
const stat = ref<
{
icon: string;
@@ -136,33 +145,29 @@ const { t } = useI18n();
const baseUrl = ref(import.meta.env.VITE_API_BASE_URL);
const priceDisplay = computed(() => ({
- price: !isRoleInclude(['sale_agent']),
+ // price: !isRoleInclude(['sale_agent']),
+ price: true,
agentPrice: isRoleInclude([
- 'admin',
- 'head_of_admin',
- 'head_of_sale',
'system',
- 'owner',
+ 'head_of_admin',
+ 'admin',
+ 'executive',
'accountant',
- 'sale_agent',
+ 'head_of_sale',
]),
serviceCharge: isRoleInclude([
- 'admin',
- 'head_of_admin',
'system',
- 'owner',
+ 'head_of_admin',
+ 'admin',
+ 'executive',
'accountant',
]),
}));
-const actionDisplay = computed(() =>
- isRoleInclude(['admin', 'head_of_admin', 'system', 'owner', 'accountant']),
-);
+const actionDisplay = computed(() => canAccess('product', 'edit'));
const splitterModel = computed(() =>
$q.screen.lt.md ? (productMode.value !== 'group' ? 0 : 100) : 25,
);
-const refFilterGroup = ref>();
-const refFilterProductService = ref>();
const holdDialog = ref(false);
const imageDialog = ref(false);
const currentNode = ref();
@@ -520,6 +525,7 @@ const currentStatusGroupType = ref('CREATED');
const currentIdGroupType = ref('');
const currentStatus = ref('All');
+const searchDate = ref([]);
// img
const isImageEdit = ref(false);
@@ -615,6 +621,8 @@ async function fetchListGroups(mobileFetch?: boolean) {
: currentStatus.value === 'ACTIVE'
? 'ACTIVE'
: 'INACTIVE',
+ startDate: searchDate.value[0],
+ endDate: searchDate.value[1],
});
if (res) {
@@ -675,6 +683,8 @@ async function fetchListOfProduct(mobileFetch?: boolean) {
? 'ACTIVE'
: undefined,
productGroupId: currentIdGroup.value,
+ startDate: searchDate.value[0],
+ endDate: searchDate.value[1],
});
if (res) {
@@ -720,6 +730,8 @@ async function fetchListOfService(mobileFetch?: boolean) {
? 'ACTIVE'
: undefined,
productGroupId: currentIdGroup.value,
+ startDate: searchDate.value[0],
+ endDate: searchDate.value[1],
});
if (res) {
@@ -1159,6 +1171,7 @@ function clearFormService() {
profileSubmit.value = false;
imageProduct.value = undefined;
profileFileImg.value = null;
+ serviceTab.value = 1;
}
function sameFormService() {
@@ -1385,6 +1398,7 @@ function submitAddWorkProduct() {
if (!s.hasOwnProperty('productsId')) {
s.productsId = [];
}
+ if (s.productsId.length === 0) return;
s.productsId.push(i.id);
},
);
@@ -1437,17 +1451,11 @@ function confirmDeleteWork(id: string, noDialog?: boolean) {
}
}
-function triggerConfirmCloseWork() {
+function triggerConfirmCloseWorkName() {
dialogWarningClose(t, {
message: t('dialog.message.warningClose'),
action: () => {
manageWorkNameDialog.value = false;
- if (workNameItems.value[workNameItems.value.length - 1].name === '') {
- confirmDeleteWork(
- workNameItems.value[workNameItems.value.length - 1].id,
- true,
- );
- }
},
cancel: () => {},
});
@@ -1590,6 +1598,7 @@ async function enterNext(type: 'service' | 'product') {
inputSearchProductAndService.value = '';
currentStatus.value = 'All';
filterStat.value = [];
+ searchDate.value = [];
if (
expandedTree.value.length > 1 &&
@@ -1745,7 +1754,7 @@ watch(currentStatus, async () => {
flowStore.rotate();
});
-watch(inputSearch, async () => {
+watch([inputSearch, () => searchDate.value], async () => {
if (productMode.value === 'group') {
productGroup.value = [];
currentPageGroup.value = 1;
@@ -1754,7 +1763,7 @@ watch(inputSearch, async () => {
}
});
-watch(inputSearchProductAndService, async () => {
+watch([inputSearchProductAndService, () => searchDate.value], async () => {
product.value = [];
service.value = [];
currentPageServiceAndProduct.value = 1;
@@ -1831,6 +1840,84 @@ function handleSubmitSameWorkflow() {
);
}
+async function copy(id: string) {
+ {
+ const res = await fetchListServiceById(id);
+ if (res) {
+ formService.value = {
+ code: res.code.slice(0, -3),
+ name: res.name,
+ detail: res.detail,
+ attributes: res.attributes,
+ work: res.work.map((v) => ({
+ id: v.id,
+ name: v.name,
+ attributes: v.attributes,
+ product: v.productOnWork.map((productOnWorkItem) => ({
+ id: productOnWorkItem.product.id,
+ installmentNo: productOnWorkItem.installmentNo,
+ stepCount: productOnWorkItem.stepCount,
+ })),
+ })),
+ status: res.status,
+ productGroupId: res.productGroupId,
+ selectedImage: res.selectedImage,
+ installments: res.installments,
+ };
+
+ workItems.value = res.work.map((item) => {
+ return {
+ id: item.id,
+ name: item.name,
+ attributes: item.attributes,
+ product: item.productOnWork.map((productOnWorkItem) => {
+ return {
+ ...productOnWorkItem.product,
+ nameEn: productOnWorkItem.product.name,
+ installmentNo: productOnWorkItem.installmentNo,
+ };
+ }),
+ };
+ });
+ }
+ }
+
+ dialogService.value = true;
+}
+
+function addWorkName(data: { name: string; order: number }) {
+ workNameItems.value.push({ id: '', name: data.name, isEdit: true });
+}
+
+async function submitWorkName(
+ workId: string,
+ data: Partial,
+) {
+ if (workNameItems.value.length === 0) return;
+
+ if (!workId) await createWork({ ...data, order: 1 });
+ else await editWork(workId, data);
+}
+
+async function triggerExport() {
+ productExport({
+ pageSize: 100_000,
+ productGroupId: currentIdGroup.value,
+ query: !!inputSearchProductAndService.value
+ ? inputSearchProductAndService.value
+ : undefined,
+ status:
+ currentStatus.value === 'INACTIVE'
+ ? 'INACTIVE'
+ : currentStatus.value === 'ACTIVE'
+ ? 'ACTIVE'
+ : undefined,
+
+ startDate: searchDate.value[0] ? new Date(searchDate.value[0]) : undefined,
+ endDate: searchDate.value[1] ? new Date(searchDate.value[1]) : undefined,
+ });
+}
+
watch(
() => formService.value.attributes.workflowId,
async (a, b) => {
@@ -1948,19 +2035,34 @@ watch(
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
@@ -2115,26 +2217,43 @@ watch(
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
-
-
-
- {{ props.row.detail || '-' }}
+ {{
+ props.row.detail.replace(/<\/?[^>]+(>|$)/g, '') ||
+ '-'
+ }}
@@ -2618,26 +2747,72 @@ watch(
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
+
+
+ {
+ importProduct(
+ currentIdGroup,
+ file,
+ async () => await fetchListOfProduct(),
+ );
+ }
+ "
+ />
+
+
+
-
-
{
+ copy(props.row.id);
+ }
+ "
@view="
async () => {
if (props.row.type === 'product') {
@@ -3275,7 +3455,15 @@ watch(
{{ $t('general.recordPerPage') }}
@@ -3407,7 +3595,7 @@ watch(
+
@@ -4535,7 +4730,7 @@ watch(
? workNameRef.isWorkNameEdit()
: false;
if (isWorkNameEdit) {
- triggerConfirmCloseWork();
+ triggerConfirmCloseWorkName();
return true;
}
return false;
@@ -4547,15 +4742,16 @@ watch(
ref="workNameRef"
v-model:name-list="workNameItems"
@delete="confirmDeleteWork"
- @edit="editWork"
- @add="createWork"
+ @edit="submitWorkName"
+ @add="addWorkName"
/>
-
+
pageState.inputSearch, propertyPageSize], () => {
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
pageState.inputSearch, propertyPageSize], () => {
class="col surface-2 flex items-center justify-center"
>
pageState.inputSearch, propertyPageSize], () => {
"
/>
pageState.inputSearch, propertyPageSize], () => {
"
/>
pageState.inputSearch, propertyPageSize], () => {
@drawer-undo="() => undo()"
@close="() => resetForm()"
@submit="() => submit()"
+ :hide-action="!canAccess('workflow', 'edit')"
:readonly="!pageState.isDrawerEdit"
:isEdit="pageState.isDrawerEdit"
v-model="pageState.addModal"
diff --git a/src/pages/04_property-managment/PropertyDialog.vue b/src/pages/04_property-managment/PropertyDialog.vue
index 333f0ec7..66161d57 100644
--- a/src/pages/04_property-managment/PropertyDialog.vue
+++ b/src/pages/04_property-managment/PropertyDialog.vue
@@ -30,6 +30,7 @@ withDefaults(
defineProps<{
readonly?: boolean;
isEdit?: boolean;
+ hideAction?: boolean;
}>(),
{ readonly: false, isEdit: false },
);
@@ -151,7 +152,7 @@ defineEmits<{
style="position: absolute; z-index: 999; top: 0; right: 0"
>
-import { onMounted, reactive, ref, watch, computed } from 'vue';
+import { onMounted, onUnmounted, reactive, ref, watch, computed } from 'vue';
import { storeToRefs } from 'pinia';
import { useQuasar } from 'quasar';
+import { useI18n } from 'vue-i18n';
// NOTE: Import stores
+import useCustomerStore from 'stores/customer';
import { useQuotationStore } from 'src/stores/quotations';
-import { isRoleInclude } from 'stores/utils';
+import { dialog, isRoleInclude, notify, setPrefixName } from 'stores/utils';
import { useNavigator } from 'src/stores/navigator';
import useFlowStore from 'src/stores/flow';
import useMyBranch from 'stores/my-branch';
import { useQuotationForm } from './form';
import { hslaColors } from './constants';
import { pageTabs, columnQuotation } from './constants';
-import { toCamelCase } from 'stores/utils';
+import { toCamelCase, canAccess } from 'stores/utils';
+import { getUserId } from 'src/services/keycloak';
// NOTE Import Types
import { CustomerBranchCreate, CustomerType } from 'stores/customer/types';
@@ -38,26 +41,44 @@ import { AddressForm } from 'components/form';
import {
EmployerFormBusiness,
EmployerFormAbout,
+ EmployerFormBasicInfo,
+ EmployerFormBranch,
} from 'src/pages/03_customer-management/components';
import { useCustomerForm } from 'src/pages/03_customer-management/form';
import { Quotation } from 'src/stores/quotations/types';
import TableQuotation from 'src/components/05_quotation/TableQuotation.vue';
import PaginationPageSize from 'src/components/PaginationPageSize.vue';
+import { DialogContainer, DialogHeader } from 'src/components/dialog';
+import AdvanceSearch from 'src/components/shared/AdvanceSearch.vue';
+const { t, locale } = useI18n();
const $q = useQuasar();
const quotationFormStore = useQuotationForm();
const customerFormStore = useCustomerForm();
const flowStore = useFlowStore();
const userBranch = useMyBranch();
const navigatorStore = useNavigator();
+const customerStore = useCustomerStore();
+const {
+ fetchListOfOptionBranch,
+ customerFormUndo,
+ deleteCustomerById,
+ validateTabField,
+ deleteCustomerBranchById,
+} = customerFormStore;
const {
currentFormData: quotationFormData,
currentFormState: quotationFormState,
} = storeToRefs(quotationFormStore);
-const { state: customerFormState, currentFormData: customerFormData } =
- storeToRefs(customerFormStore);
+const {
+ state: customerFormState,
+ currentFormData: customerFormData,
+ currentBranchRootId,
+ registerAbleBranchOption,
+ tabFieldRequired,
+} = storeToRefs(customerFormStore);
const { currentMyBranch } = storeToRefs(userBranch);
const fieldSelectedOption = computed(() => {
@@ -68,6 +89,8 @@ const fieldSelectedOption = computed(() => {
value: v.name,
}));
});
+
+const keyAddDialog = ref(0);
const special = ref(false);
const branchId = ref('');
const agentPrice = ref(false);
@@ -84,12 +107,14 @@ const pageState = reactive({
fieldSelected: [''],
gridView: false,
total: 0,
+ sellerId: '',
currentTab: 'Issued',
addModal: false,
quotationModal: false,
employeeModal: false,
receiptModal: false,
+ searchDate: [],
});
pageState.fieldSelected = [...columnQuotation.map((v) => v.name)];
@@ -170,8 +195,7 @@ async function submitCustomer() {
customerFormData.value.registeredBranchId = isRoleInclude(['system'])
? branchId.value
: currentMyBranch.value.id;
- await customerFormStore.submitFormCustomer();
-
+ await customerFormStore.addCurrentCustomerBranch();
customerFormState.value.dialogModal = false;
// customerFormState.value.dialogType = 'info';
}
@@ -241,6 +265,20 @@ const {
stats: quotationStats,
} = storeToRefs(quotationStore);
+const customerNameInfo = computed(() => {
+ if (customerFormData.value.customerBranch === undefined) return;
+
+ const name =
+ locale.value === 'eng'
+ ? `${customerFormData.value.customerBranch[0]?.firstNameEN} ${customerFormData.value.customerBranch[0]?.lastNameEN}`
+ : `${customerFormData.value.customerBranch[0]?.firstName} ${customerFormData.value.customerBranch[0]?.lastName}`;
+ return name || '-';
+});
+
+function handleWindowFocus() {
+ fetchQuotationList();
+}
+
onMounted(async () => {
pageState.gridView = $q.screen.lt.md ? true : false;
navigatorStore.current.title = 'quotation.title';
@@ -267,6 +305,7 @@ onMounted(async () => {
pageSize: quotationPageSize.value,
status: 'Issued',
urgentFirst: true,
+ sellerId: pageState.sellerId || undefined,
});
if (ret) {
@@ -277,6 +316,12 @@ onMounted(async () => {
}
flowStore.rotate();
+
+ window.addEventListener('focus', handleWindowFocus);
+});
+
+onUnmounted(() => {
+ window.removeEventListener('focus', handleWindowFocus);
});
async function fetchQuotationList(mobileFetch?: boolean) {
@@ -299,6 +344,9 @@ async function fetchQuotationList(mobileFetch?: boolean) {
: 'Issued',
query: pageState.inputSearch,
urgentFirst: true,
+ startDate: pageState.searchDate[0],
+ endDate: pageState.searchDate[1],
+ sellerId: pageState.sellerId || undefined,
});
if (ret) {
@@ -322,7 +370,12 @@ async function fetchQuotationList(mobileFetch?: boolean) {
}
watch(
- [() => pageState.currentTab, () => pageState.inputSearch, quotationPageSize],
+ [
+ () => pageState.currentTab,
+ () => pageState.inputSearch,
+ () => pageState.searchDate,
+ quotationPageSize,
+ ],
() => {
quotationPage.value = 1;
quotationData.value = [];
@@ -369,6 +422,11 @@ async function storeDataLocal(id: string) {
window.open(url, '_blank');
}
+
+async function filterBySellerId() {
+ pageState.sellerId = pageState.sellerId ? '' : getUserId();
+ await fetchQuotationList();
+}
@@ -376,6 +434,7 @@ async function storeDataLocal(id: string) {
hide-icon
style="z-index: 999"
@click.stop="triggerAddQuotationDialog"
+ v-if="canAccess('quotation', 'create')"
/>
@@ -489,6 +548,21 @@ async function storeDataLocal(id: string) {
+
+
+
+
+
+
+ {{ $t('quotation.ownOnly') }}
+
+
+
+
@@ -606,12 +680,20 @@ async function storeDataLocal(id: string) {
class="col surface-2 flex items-center justify-center"
>
storeDataLocal(id)"
@view="
@@ -666,7 +750,8 @@ async function storeDataLocal(id: string) {
@@ -911,30 +1003,50 @@ async function storeDataLocal(id: string) {
- {
customerFormState.dialogModal = false;
- customerFormStore.resetForm(true);
- setDefaultCustomer();
+ onCreateImageList = { selectedImage: '', list: [] };
+ keyAddDialog++;
}
"
>
+
+
+
+
+ :
+ {{
+ customerFormData.customerType === 'CORP'
+ ? $t('customer.employerLegalEntity')
+ : $t('customer.employerNaturalPerson')
+ }}
+
+
+
+
+
{
@@ -981,143 +1102,294 @@ async function storeDataLocal(id: string) {
/>
-
+
{
- selectedWorker = v.worker;
+ combineWorker(v.newWorker, v.worker);
}
"
/>
@@ -2434,7 +2517,7 @@ function covertToNode() {
{
@@ -275,6 +275,7 @@ watch(
{{
formatNumberDecimal(
- summaryPrice.totalPrice - summaryPrice.totalDiscount,
+ summaryPrice.totalPrice -
+ summaryPrice.totalDiscount -
+ summaryPrice.vatExcluded,
2,
)
}}
@@ -482,7 +488,11 @@ watch(
{{ $t('quotation.totalPriceBaht') }}
-
+
{{
payType === 'SplitCustom' && view === View.Invoice
? formatNumberDecimal(Math.max(installmentAmount || 0, 0), 2) || 0
diff --git a/src/pages/05_quotation/QuotationFormMetadata.vue b/src/pages/05_quotation/QuotationFormMetadata.vue
index 071bc84b..161b0420 100644
--- a/src/pages/05_quotation/QuotationFormMetadata.vue
+++ b/src/pages/05_quotation/QuotationFormMetadata.vue
@@ -1,5 +1,6 @@
@@ -95,5 +97,11 @@ const createdAt = defineModel('createdAt');
dense
outlined
/>
+
diff --git a/src/pages/05_quotation/QuotationFormProductSelect.vue b/src/pages/05_quotation/QuotationFormProductSelect.vue
index eb6ffef8..b2e92761 100644
--- a/src/pages/05_quotation/QuotationFormProductSelect.vue
+++ b/src/pages/05_quotation/QuotationFormProductSelect.vue
@@ -51,6 +51,8 @@ const emit = defineEmits<{
const selectedProductGroup = defineModel('selectedProductGroup', {
default: '',
});
+
+const selectedProductGroupOption = ref();
const model = defineModel();
const inputSearch = defineModel('inputSearch');
const productGroup = defineModel('productGroup', {
@@ -66,21 +68,21 @@ const serviceList = defineModel>>(
);
const priceDisplay = computed(() => ({
- price: !isRoleInclude(['sale_agent']),
+ // price: !isRoleInclude(['sale_agent']),
+ price: true,
agentPrice: isRoleInclude([
- 'admin',
- 'head_of_admin',
- 'head_of_sale',
'system',
- 'owner',
+ 'head_of_admin',
+ 'admin',
+ 'executive',
'accountant',
- 'sale_agent',
+ 'head_of_sale',
]),
serviceCharge: isRoleInclude([
- 'admin',
- 'head_of_admin',
'system',
- 'owner',
+ 'head_of_admin',
+ 'admin',
+ 'executive',
'accountant',
]),
}));
@@ -569,14 +571,18 @@ watch(
{{
productGroup.find(
(g) => g.id === selectedProductGroup,
- )?.name || '-'
+ )?.name ||
+ selectedProductGroupOption?.name ||
+ '-'
}}
{{
productGroup.find(
(g) => g.id === selectedProductGroup,
- )?.code || '-'
+ )?.code ||
+ selectedProductGroupOption?.code ||
+ '-'
}}
@@ -862,13 +868,13 @@ watch(
{{ $t('productService.group.title') }}
-
import { useI18n } from 'vue-i18n';
-import { reactive, ref, watch } from 'vue';
+import { reactive, ref, watch, onMounted } from 'vue';
+import { baseUrl, notify, setPrefixName } from 'src/stores/utils';
// NOTE: Import stores
import { dialog } from 'stores/utils';
@@ -8,7 +9,7 @@ import useOptionStore from 'src/stores/options';
import useEmployeeStore from 'src/stores/employee';
import { useEmployeeForm } from 'src/pages/03_customer-management/form';
import { waitAll } from 'src/stores/utils';
-import { calculateAge, dateFormatJS } from 'src/utils/datetime';
+import { calculateAge, dateFormat, dateFormatJS } from 'src/utils/datetime';
import { dialogCheckData } from 'stores/utils';
import { useQuotationForm } from 'pages/05_quotation/form';
@@ -20,6 +21,7 @@ import useOcrStore from 'stores/ocr';
// NOTE: Import Components
import {
+ AddButton,
SaveButton,
EditButton,
UndoButton,
@@ -48,6 +50,13 @@ import {
import { storeToRefs } from 'pinia';
import ToggleView from 'src/components/shared/ToggleView.vue';
import TableWorker from 'src/components/shared/table/TableWorker.vue';
+import { SideMenu } from 'src/components';
+import BasicInformation from 'components/03_customer-management/employee/BasicInformation.vue';
+import { AddressForm } from 'src/components/form';
+import ExpirationDate from 'src/components/03_customer-management/ExpirationDate.vue';
+import FormEmployeeHealthCheck from 'src/components/03_customer-management/FormEmployeeHealthCheck.vue';
+import FormEmployeeWorkHistory from 'src/components/03_customer-management/FormEmployeeWorkHistory.vue';
+import FormEmployeeOther from 'src/components/03_customer-management/FormEmployeeOther.vue';
const API_BASE_URL = import.meta.env.VITE_API_BASE_URL;
@@ -57,10 +66,20 @@ const quotationForm = useQuotationForm();
const { locale } = useI18n();
const ocrStore = useOcrStore();
+const test = false;
+
const viewMode = ref(false);
-const { state: employeeFormState, currentFromDataEmployee } =
- storeToRefs(employeeFormStore);
+const { employeeFormUndo, employeeConfirmUnsave, deleteEmployeeById } =
+ employeeFormStore;
+
+const {
+ state: employeeFormState,
+ currentFromDataEmployee,
+ onCreateImageList,
+ statusEmployeeCreate,
+ refreshImageState,
+} = storeToRefs(employeeFormStore);
const mrz = ref>>();
@@ -94,7 +113,7 @@ const props = withDefaults(
defineProps<{
customerBranchId?: string;
disabledWorkerId?: string[];
- preselectWorker?: Employee[];
+ preselectWorker?: (Employee & { workerNew: boolean })[];
}>(),
{},
);
@@ -114,7 +133,7 @@ const optionStore = useOptionStore();
const employeeStore = useEmployeeStore();
const open = defineModel('open', { default: false });
-const newWorkerList = defineModel<
+const newWorkerList = ref<
(EmployeeWorker & {
attachment?: {
name?: string;
@@ -124,7 +143,7 @@ const newWorkerList = defineModel<
_meta?: Record;
}[];
})[]
->('newWorkerList', { default: [] });
+>([]);
const workerSelected = ref([]);
const workerList = ref([]);
const importWorkerCriteria = ref<{
@@ -141,49 +160,22 @@ const state = reactive({
search: '',
});
-function removeNewWorker(index: number) {
- dialog({
- color: 'negative',
- icon: 'mdi-trash-can-outline',
- title: t('dialog.title.confirmDelete'),
- actionText: t('general.delete'),
- persistent: true,
- message: t('dialog.message.confirmDelete'),
- action: async () => {
- newWorkerList.value.splice(index, 1);
- },
- cancel: () => {},
+async function removeNewWorker(index: number) {
+ deleteEmployeeById({
+ id: newWorkerList.value[index].id,
+ removeArray: () => newWorkerList.value.splice(index, 1),
});
}
function triggerCreateEmployee() {
employeeFormStore.resetFormDataEmployee(true);
- setDefaultFormEmployee();
+ setCurrentBranchId();
+ //setDefaultFormEmployee();
employeeFormState.value.dialogType = 'create';
employeeFormState.value.dialogModal = true;
employeeFormState.value.isEmployeeEdit = true;
}
-function setDefaultFormEmployee() {
- formDataEmployee.value = {
- passportNo: '',
- documentExpireDate: new Date(),
- lastNameEN: '',
- lastName: '',
- middleNameEN: '',
- middleName: '',
- firstNameEN: '',
- firstName: '',
- namePrefix: '',
- nationality: '',
- gender: '',
- dateOfBirth: null,
- attachment: [],
- };
-
- employeeFormState.value.dialogModal = false;
-}
-
function clean() {
workerList.value = [];
workerSelected.value = [];
@@ -216,7 +208,13 @@ function getEmployeeImageUrl(item: Employee) {
function init() {
if (props.preselectWorker) {
- workerSelected.value = JSON.parse(JSON.stringify(props.preselectWorker));
+ workerSelected.value = JSON.parse(
+ JSON.stringify(props.preselectWorker.filter((v) => !v.workerNew)),
+ );
+
+ newWorkerList.value = JSON.parse(
+ JSON.stringify(props.preselectWorker.filter((v) => v.workerNew)),
+ );
}
getWorkerList();
}
@@ -304,6 +302,46 @@ watch(
}
},
);
+
+function setCurrentBranchId() {
+ employeeFormState.value.currentBranchId = props.customerBranchId;
+}
+
+watch(
+ () => employeeFormState.value.currentCustomerBranch,
+ (e) => {
+ if (!e) return;
+ if (employeeFormState.value.formDataEmployeeSameAddr) {
+ currentFromDataEmployee.value.address = e.address;
+ currentFromDataEmployee.value.addressEN = e.addressEN;
+ currentFromDataEmployee.value.provinceId = e.provinceId;
+ currentFromDataEmployee.value.districtId = e.districtId;
+ currentFromDataEmployee.value.subDistrictId = e.subDistrictId;
+ }
+ currentFromDataEmployee.value.customerBranchId = e.id;
+ },
+);
+
+watch(
+ () => employeeFormState.value.formDataEmployeeSameAddr,
+ (isSame) => {
+ if (!employeeFormState.value.currentCustomerBranch) return;
+ if (isSame) {
+ currentFromDataEmployee.value.address =
+ employeeFormState.value.currentCustomerBranch.address;
+ currentFromDataEmployee.value.addressEN =
+ employeeFormState.value.currentCustomerBranch.addressEN;
+ currentFromDataEmployee.value.provinceId =
+ employeeFormState.value.currentCustomerBranch.provinceId;
+ currentFromDataEmployee.value.districtId =
+ employeeFormState.value.currentCustomerBranch.districtId;
+ currentFromDataEmployee.value.subDistrictId =
+ employeeFormState.value.currentCustomerBranch.subDistrictId;
+ }
+ currentFromDataEmployee.value.customerBranchId =
+ employeeFormState.value.currentCustomerBranch.id;
+ },
+);
@@ -444,10 +482,7 @@ watch(
class="full-width"
:prefix-id="'employee-' + index"
:data="{
- name:
- locale === Lang.English
- ? `${emp.firstNameEN} ${emp.lastNameEN}`
- : `${emp.firstName} ${emp.lastName}`,
+ name: ` ${emp.firstName ? `${emp.firstName} ${emp.lastName}` : `${emp.firstNameEN} ${emp.lastNameEN}`}`,
female: emp.gender === 'female',
male: emp.gender === 'male',
img: `/images/employee-avatar-${emp.gender}.png`,
@@ -508,7 +543,13 @@ watch(
@@ -573,11 +614,14 @@ watch(
solid
id="btn-success"
@click="
- emits('success', {
- worker: workerSelected,
- newWorker: newWorkerList,
- }),
- (open = false)
+ () => {
+ $emit('success', {
+ worker: workerSelected,
+ newWorker: newWorkerList,
+ });
+
+ open = false;
+ }
"
>
{{ $t('general.select', { msg: $t('quotation.employeeList') }) }}
@@ -589,20 +633,62 @@ watch(
{
- employeeFormState.dialogModal = false;
+ employeeFormStore.resetFormDataEmployee(true);
+ setCurrentBranchId();
+ }
+ "
+ :before-close="
+ () => {
+ if (employeeFormStore.isFormDataDifferent()) {
+ employeeConfirmUnsave();
+ return true;
+ }
+ employeeFormState.currentTab = 'personalInfo';
+ return false;
}
"
>
@@ -613,9 +699,9 @@ watch(
}"
>
{
employeeFormState.imageDialog = true;
@@ -651,369 +785,1217 @@ watch(
"
/>
+
@@ -1028,8 +2010,8 @@ watch(
}
:deep(
- i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
- ) {
+ i.q-icon.mdi.mdi-chevron-down-circle.q-expansion-item__toggle-icon.q-expansion-item__toggle-icon--rotated
+) {
color: var(--brand-1);
}
@@ -1046,9 +2028,9 @@ watch(
}
:deep(
- .q-item.q-item-type.row.no-wrap.q-item--dense.q-item--clickable.q-link.cursor-pointer.q-focusable.q-hoverable.surface-1
- .q-focus-helper
- ) {
+ .q-item.q-item-type.row.no-wrap.q-item--dense.q-item--clickable.q-link.cursor-pointer.q-focusable.q-hoverable.surface-1
+ .q-focus-helper
+) {
visibility: hidden;
}
diff --git a/src/pages/05_quotation/form.ts b/src/pages/05_quotation/form.ts
index 969144ad..5b16785a 100644
--- a/src/pages/05_quotation/form.ts
+++ b/src/pages/05_quotation/form.ts
@@ -8,6 +8,7 @@ import {
QuotationPayload,
QuotationFull,
EmployeeWorker,
+ PayCondition,
} from 'src/stores/quotations/types';
import { Employee } from 'src/stores/employee/types';
@@ -29,7 +30,7 @@ export const DEFAULT_DATA: QuotationPayload = {
payBillDate: new Date(),
paySplit: [],
paySplitCount: 0,
- payCondition: 'Full',
+ payCondition: PayCondition.Full,
dueDate: new Date(Date.now() + 86400000),
discount: 0,
contactTel: '',
@@ -40,6 +41,7 @@ export const DEFAULT_DATA: QuotationPayload = {
status: 'CREATED',
remark: '#[quotation-labor]
#[quotation-payment]',
agentPrice: false,
+ sellerId: '',
};
const DEFAULT_DATA_INVOICE: InvoicePayload = {
@@ -67,6 +69,7 @@ export const useQuotationForm = defineStore('form-quotation', () => {
file?: File;
_meta?: Record
;
}[];
+ workerNew: boolean;
})[]
>([]);
@@ -218,9 +221,10 @@ export const useQuotationForm = defineStore('form-quotation', () => {
},
callback?: () => void,
) {
- newWorkerList.value.push({
+ const temp = {
//passportNo: obj.data.passportNo,
//documentExpireDate: obj.data.documentExpireDate,
+ id: obj.data.id,
lastNameEN: obj.data.lastNameEN,
lastName: obj.data.lastName,
middleNameEN: obj.data.middleNameEN,
@@ -232,9 +236,12 @@ export const useQuotationForm = defineStore('form-quotation', () => {
gender: obj.data.gender,
dateOfBirth: obj.data.dateOfBirth,
attachment: obj.data.attachment,
- });
+ workerNew: true,
+ };
callback?.();
+
+ return temp;
}
function dialogDelete(callback: () => void) {
diff --git a/src/pages/05_quotation/preview/ViewForm.vue b/src/pages/05_quotation/preview/ViewForm.vue
index 0a12408f..3a7fd081 100644
--- a/src/pages/05_quotation/preview/ViewForm.vue
+++ b/src/pages/05_quotation/preview/ViewForm.vue
@@ -1,6 +1,6 @@
-
-
-
-
+
+
+
+ {{ $t('general.status') }}
+
+
-
+
@@ -917,12 +1046,18 @@ watch(
}
"
@change-status="triggerChangeStatus"
+ @delete-attachment="deleteAttachment"
:readonly="!pageState.isDrawerEdit"
:isEdit="pageState.isDrawerEdit"
+ :hide-action="!canAccess('agencies', 'edit')"
v-model="pageState.addModal"
v-model:drawer-model="pageState.viewDrawer"
v-model:data="formData"
- v-model:on-create-image-list="onCreateImageList"
+ v-model:form-bank-book="formData.bank"
+ v-model:image-list-on-create="imageListOnCreate"
+ v-model:deletes-status-qr-code-bank-imag="deletesStatusQrCodeBankImag"
+ v-model:attachment="attachment"
+ :attachment-list="attachmentList"
/>
diff --git a/src/pages/08_request-list/MessengerExpansion.vue b/src/pages/08_request-list/MessengerExpansion.vue
index 24434d89..456aefe4 100644
--- a/src/pages/08_request-list/MessengerExpansion.vue
+++ b/src/pages/08_request-list/MessengerExpansion.vue
@@ -13,6 +13,8 @@ const props = defineProps<{
readonly?: boolean;
step: Step;
responsibleAreaDistrictId?: string;
+ defaultMessenger?: string;
+ prefix?: string;
}>();
const emit = defineEmits<{
@@ -56,6 +58,7 @@ const formData = ref(defaultForm);
function triggerUndo() {
assignToForm();
state.isEdit = false;
+ refForm.value?.resetValidation();
}
async function triggerSubmit() {
@@ -84,8 +87,13 @@ function assignToForm() {
customerDutyCost: attributesForm.value.customerDutyCost ?? 30,
companyDuty: attributesForm.value.companyDuty ?? false,
companyDutyCost: attributesForm.value.companyDutyCost ?? 30,
- responsibleUserLocal: attributesForm.value.responsibleUserLocal ?? true,
- responsibleUserId: attributesForm.value.responsibleUserId ?? '',
+ responsibleUserLocal: attributesForm.value.responsibleUserLocal
+ ? attributesForm.value.responsibleUserLocal
+ : props.responsibleAreaDistrictId
+ ? false
+ : true,
+ responsibleUserId:
+ attributesForm.value.responsibleUserId || props.defaultMessenger,
individualDuty: attributesForm.value.individualDuty ?? false,
individualDutyCost: attributesForm.value.individualDutyCost ?? 10,
}),
@@ -109,21 +117,21 @@ function assignToForm() {