diff --git a/.gitignore b/.gitignore index 098f73e..5618711 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,17 @@ -# OS -.DS_Store -Thumbs.db -desktop.ini +# dependencies +web/node_modules/ +web/dist/ -# Editor / IDE +# env files - ignore local overrides +web/src/.env.local +web/src/.env.*.local + +# IDE files .idea/ -.vscode/* -!.vscode/extensions.json +.vscode/ -# Archives & temp -*.tmp -*.temp -~$* +# OS files +.DS_Store +npm-debug.log* +yarn-debug.log* +yarn-error.log* diff --git a/web/index.html b/web/index.html new file mode 100644 index 0000000..db35486 --- /dev/null +++ b/web/index.html @@ -0,0 +1,12 @@ + + + + + + XMC Assets + + +
+ + + diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000..be9bc97 --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,3500 @@ +{ + "name": "RFID-Management-System-Frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "RFID-Management-System-Frontend", + "version": "0.0.0", + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "@fortawesome/fontawesome-free": "^6.7.2", + "@primeuix/themes": "^2.0.2", + "@primevue/forms": "^4.5.3", + "@vue/compiler-sfc": "^3.5.25", + "axios": "^1.13.2", + "echarts": "^6.0.0", + "element-plus": "^2.12.0", + "nprogress": "^0.2.0", + "pinia": "^3.0.4", + "primeicons": "^7.0.0", + "primevue": "^4.5.3", + "vue": "^3.5.25", + "vue-i18n": "^9.14.1", + "vue-router": "^4.6.4", + "vuefinder": "^4.0.33", + "webdav": "^5.8.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.3", + "sass": "^1.97.0", + "vite": "^7.3.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.0.tgz", + "integrity": "sha512-IyDgFV5GeDUVX4YdF/3CPULtVGSXXMLh1xVIgdCgxApktqnQV0r7/8Nqthg+8YLGaAtdyIlo2qIdZrbCv4+7ww==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@buttercup/fetch": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@buttercup/fetch/-/fetch-0.2.1.tgz", + "integrity": "sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==", + "license": "MIT", + "optionalDependencies": { + "node-fetch": "^3.3.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-4.2.0.tgz", + "integrity": "sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@element-plus/icons-vue/-/icons-vue-2.3.2.tgz", + "integrity": "sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==", + "license": "MIT", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.4.tgz", + "integrity": "sha512-cQPwL2mp2nSmHHJlCyoXgHGhbEPMrEEU5xhkcy3Hs/O7nGZqEpZ2sUtLaL9MORLtDfRvVl2/3PAuEkYZH0Ty8Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.4.tgz", + "integrity": "sha512-X9bUgvxiC8CHAGKYufLIHGXPJWnr0OCdR0anD2e21vdvgCI8lIfqFbnoeOz7lBjdrAGUhqLZLcQo6MLhTO2DKQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.4.tgz", + "integrity": "sha512-gdLscB7v75wRfu7QSm/zg6Rx29VLdy9eTr2t44sfTW7CxwAtQghZ4ZnqHk3/ogz7xao0QAgrkradbBzcqFPasw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.4.tgz", + "integrity": "sha512-PzPFnBNVF292sfpfhiyiXCGSn9HZg5BcAz+ivBuSsl6Rk4ga1oEXAamhOXRFyMcjwr2DVtm40G65N3GLeH1Lvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.4.tgz", + "integrity": "sha512-b7xaGIwdJlht8ZFCvMkpDN6uiSmnxxK56N2GDTMYPr2/gzvfdQN8rTfBsvVKmIVY/X7EM+/hJKEIbbHs9oA4tQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.4.tgz", + "integrity": "sha512-sR+OiKLwd15nmCdqpXMnuJ9W2kpy0KigzqScqHI3Hqwr7IXxBp3Yva+yJwoqh7rE8V77tdoheRYataNKL4QrPw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.4.tgz", + "integrity": "sha512-jnfpKe+p79tCnm4GVav68A7tUFeKQwQyLgESwEAUzyxk/TJr4QdGog9sqWNcUbr/bZt/O/HXouspuQDd9JxFSw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.4.tgz", + "integrity": "sha512-2kb4ceA/CpfUrIcTUl1wrP/9ad9Atrp5J94Lq69w7UwOMolPIGrfLSvAKJp0RTvkPPyn6CIWrNy13kyLikZRZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.4.tgz", + "integrity": "sha512-aBYgcIxX/wd5n2ys0yESGeYMGF+pv6g0DhZr3G1ZG4jMfruU9Tl1i2Z+Wnj9/KjGz1lTLCcorqE2viePZqj4Eg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.4.tgz", + "integrity": "sha512-7nQOttdzVGth1iz57kxg9uCz57dxQLHWxopL6mYuYthohPKEK0vU0C3O21CcBK6KDlkYVcnDXY099HcCDXd9dA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.4.tgz", + "integrity": "sha512-oPtixtAIzgvzYcKBQM/qZ3R+9TEUd1aNJQu0HhGyqtx6oS7qTpvjheIWBbes4+qu1bNlo2V4cbkISr8q6gRBFA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.4.tgz", + "integrity": "sha512-8mL/vh8qeCoRcFH2nM8wm5uJP+ZcVYGGayMavi8GmRJjuI3g1v6Z7Ni0JJKAJW+m0EtUuARb6Lmp4hMjzCBWzA==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.4.tgz", + "integrity": "sha512-1RdrWFFiiLIW7LQq9Q2NES+HiD4NyT8Itj9AUeCl0IVCA459WnPhREKgwrpaIfTOe+/2rdntisegiPWn/r/aAw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.4.tgz", + "integrity": "sha512-tLCwNG47l3sd9lpfyx9LAGEGItCUeRCWeAx6x2Jmbav65nAwoPXfewtAdtbtit/pJFLUWOhpv0FpS6GQAmPrHA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.4.tgz", + "integrity": "sha512-BnASypppbUWyqjd1KIpU4AUBiIhVr6YlHx/cnPgqEkNoVOhHg+YiSVxM1RLfiy4t9cAulbRGTNCKOcqHrEQLIw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.4.tgz", + "integrity": "sha512-+eUqgb/Z7vxVLezG8bVB9SfBie89gMueS+I0xYh2tJdw3vqA/0ImZJ2ROeWwVJN59ihBeZ7Tu92dF/5dy5FttA==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.4.tgz", + "integrity": "sha512-S5qOXrKV8BQEzJPVxAwnryi2+Iq5pB40gTEIT69BQONqR7JH1EPIcQ/Uiv9mCnn05jff9umq/5nqzxlqTOg9NA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.4.tgz", + "integrity": "sha512-xHT8X4sb0GS8qTqiwzHqpY00C95DPAq7nAwX35Ie/s+LO9830hrMd3oX0ZMKLvy7vsonee73x0lmcdOVXFzd6Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.4.tgz", + "integrity": "sha512-RugOvOdXfdyi5Tyv40kgQnI0byv66BFgAqjdgtAKqHoZTbTF2QqfQrFwa7cHEORJf6X2ht+l9ABLMP0dnKYsgg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.4.tgz", + "integrity": "sha512-2MyL3IAaTX+1/qP0O1SwskwcwCoOI4kV2IBX1xYnDDqthmq5ArrW94qSIKCAuRraMgPOmG0RDTA74mzYNQA9ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.4.tgz", + "integrity": "sha512-u8fg/jQ5aQDfsnIV6+KwLOf1CmJnfu1ShpwqdwC0uA7ZPwFws55Ngc12vBdeUdnuWoQYx/SOQLGDcdlfXhYmXQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.4.tgz", + "integrity": "sha512-JkTZrl6VbyO8lDQO3yv26nNr2RM2yZzNrNHEsj9bm6dOwwu9OYN28CjzZkH57bh4w0I2F7IodpQvUAEd1mbWXg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.4.tgz", + "integrity": "sha512-/gOzgaewZJfeJTlsWhvUEmUG4tWEY2Spp5M20INYRg2ZKl9QPO3QEEgPeRtLjEWSW8FilRNacPOg8R1uaYkA6g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.4.tgz", + "integrity": "sha512-Z9SExBg2y32smoDQdf1HRwHRt6vAHLXcxD2uGgO/v2jK7Y718Ix4ndsbNMU/+1Qiem9OiOdaqitioZwxivhXYg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.4.tgz", + "integrity": "sha512-DAyGLS0Jz5G5iixEbMHi5KdiApqHBWMGzTtMiJ72ZOLhbu/bzxgAe8Ue8CTS3n3HbIUHQz/L51yMdGMeoxXNJw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.4.tgz", + "integrity": "sha512-+knoa0BDoeXgkNvvV1vvbZX4+hizelrkwmGJBdT17t8FNPwG2lKemmuMZlmaNQ3ws3DKKCxpb4zRZEIp3UxFCg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.7.5.tgz", + "integrity": "sha512-1Ih4WTWyw0+lKyFMcBHGbb5U5FtuHJuujoyyr5zTaWS5EYMeT6Jb2AuDeftsCsEuchO+mM2ij5+q9crhydzLhQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.7.6", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.7.6.tgz", + "integrity": "sha512-9gZSAI5XM36880PPMm//9dfiEngYoC6Am2izES1FF406YFsjvyBMmeJ2g4SAju3xWwtuynNRFL2s9hgxpLI5SQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/core": "^1.7.5", + "@floating-ui/utils": "^0.2.11" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.11.tgz", + "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==", + "license": "MIT" + }, + "node_modules/@fortawesome/fontawesome-free": { + "version": "6.7.2", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-6.7.2.tgz", + "integrity": "sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==", + "license": "(CC-BY-4.0 AND OFL-1.1 AND MIT)", + "engines": { + "node": ">=6" + } + }, + "node_modules/@intlify/core-base": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.14.5.tgz", + "integrity": "sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==", + "license": "MIT", + "dependencies": { + "@intlify/message-compiler": "9.14.5", + "@intlify/shared": "9.14.5" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/message-compiler/-/message-compiler-9.14.5.tgz", + "integrity": "sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==", + "license": "MIT", + "dependencies": { + "@intlify/shared": "9.14.5", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@intlify/shared": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/@intlify/shared/-/shared-9.14.5.tgz", + "integrity": "sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==", + "license": "MIT", + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@nanostores/i18n": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@nanostores/i18n/-/i18n-1.2.2.tgz", + "integrity": "sha512-5LLxl95+ZI46MrM/Kn7YjORKsD7+Xy2tgjZ7/oDT/BGPEiaBM9lK89/afeK+BqaQL0Xd9Xaa5MPuuVSyWAo+/w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0" + } + }, + "node_modules/@nanostores/persistent": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@nanostores/persistent/-/persistent-1.3.3.tgz", + "integrity": "sha512-+b4I8xrmjhKE3hQ9V7/b4Xa+MBMkM2P4Ulv33zFEF/+2Hucsb24vTjYiWR8R97y8YdRptmRKlL5Qwy0q1Jj5nQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "nanostores": "^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0" + } + }, + "node_modules/@nanostores/vue": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@nanostores/vue/-/vue-1.1.0.tgz", + "integrity": "sha512-14eY8/YA0AbtWkAjk8zHKxbjcuPubF+M7y9afQzg2b5VqRJcashwA0100vprau13BTBSynUmU6ZsU6x03YidjA==", + "funding": [ + { + "type": "buymeacoffee", + "url": "https://buymeacoffee.com/euaaaio" + } + ], + "license": "MIT", + "engines": { + "node": "^20.0.0 || >=22.0.0" + }, + "peerDependencies": { + "@nanostores/logger": "^0.4.0 || ^1.0.0", + "@vue/devtools-api": ">=7.6.2", + "nanostores": "^0.11.3 || ^1.0.0", + "vue": ">=3.3.1" + }, + "peerDependenciesMeta": { + "@nanostores/logger": { + "optional": true + }, + "@vue/devtools-api": { + "optional": true + } + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@popperjs/core": { + "name": "@sxzz/popperjs-es", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.8.tgz", + "integrity": "sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@primeuix/forms": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/@primeuix/forms/-/forms-0.1.0.tgz", + "integrity": "sha512-LctcQidb+B5PuvAFWH24YH/SIzmHlOabLHpaTeGY/k51iBv1WyCp+5w9JMYuMB/BplSvV0ZGySxQVkN5Azr/aQ==", + "license": "MIT", + "dependencies": { + "@primeuix/utils": "^0.6.0" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@primeuix/styled": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@primeuix/styled/-/styled-0.7.4.tgz", + "integrity": "sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==", + "license": "MIT", + "dependencies": { + "@primeuix/utils": "^0.6.1" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@primeuix/styles": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@primeuix/styles/-/styles-2.0.3.tgz", + "integrity": "sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==", + "license": "MIT", + "dependencies": { + "@primeuix/styled": "^0.7.4" + } + }, + "node_modules/@primeuix/themes": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@primeuix/themes/-/themes-2.0.3.tgz", + "integrity": "sha512-3fS1883mtCWhgUgNf/feiaaDSOND4EBIOu9tZnzJlJ8QtYyL6eFLcA6V3ymCWqLVXQ1+lTVEZv1gl47FIdXReg==", + "license": "MIT", + "dependencies": { + "@primeuix/styled": "^0.7.4" + } + }, + "node_modules/@primeuix/utils": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/@primeuix/utils/-/utils-0.6.4.tgz", + "integrity": "sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==", + "license": "MIT", + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@primevue/core": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@primevue/core/-/core-4.5.4.tgz", + "integrity": "sha512-lYJJB3wTrDJ8MkLctzHfrPZAqXVxoatjIsswSJzupatf6ZogJHVYADUKcn1JAkLLk8dtV1FA2AxDek663fHO5Q==", + "license": "MIT", + "dependencies": { + "@primeuix/styled": "^0.7.4", + "@primeuix/utils": "^0.6.2" + }, + "engines": { + "node": ">=12.11.0" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/@primevue/forms": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@primevue/forms/-/forms-4.5.4.tgz", + "integrity": "sha512-2TlD8oJEtb8vuKzY3jY0W+7NVBC/Qj0m57iWzpMUmGnEKg9sbQ2/ZiU1sTof710/liYgm4FneRTOYHIpVkiJNA==", + "license": "MIT", + "dependencies": { + "@primeuix/forms": "^0.1.0", + "@primeuix/utils": "^0.6.2", + "@primevue/core": "4.5.4" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@primevue/icons": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/@primevue/icons/-/icons-4.5.4.tgz", + "integrity": "sha512-DxgryEc7ZmUqcEhYMcxGBRyFzdtLIoy3jLtlH1zsVSRZaG+iSAcjQ88nvfkZxGUZtZBFL7sRjF6KLq3bJZJwUw==", + "license": "MIT", + "dependencies": { + "@primeuix/utils": "^0.6.2", + "@primevue/core": "4.5.4" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.2.tgz", + "integrity": "sha512-izyXV/v+cHiRfozX62W9htOAvwMo4/bXKDrQ+vom1L1qRuexPock/7VZDAhnpHCLNejd3NJ6hiab+tO0D44Rgw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", + "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", + "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", + "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", + "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", + "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", + "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", + "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", + "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", + "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", + "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", + "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", + "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", + "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", + "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", + "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", + "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", + "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", + "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", + "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", + "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", + "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", + "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", + "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", + "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", + "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@tanstack/match-sorter-utils": { + "version": "8.19.4", + "resolved": "https://registry.npmjs.org/@tanstack/match-sorter-utils/-/match-sorter-utils-8.19.4.tgz", + "integrity": "sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==", + "license": "MIT", + "dependencies": { + "remove-accents": "0.5.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/query-core": { + "version": "5.90.20", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.90.20.tgz", + "integrity": "sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/vue-query": { + "version": "5.92.9", + "resolved": "https://registry.npmjs.org/@tanstack/vue-query/-/vue-query-5.92.9.tgz", + "integrity": "sha512-jjAZcqKveyX0C4w/6zUqbnqk/XzuxNWaFsWjGTJWULVFizUNeLGME2gf9vVSDclIyiBhR13oZJPPs6fJgfpIJQ==", + "license": "MIT", + "dependencies": { + "@tanstack/match-sorter-utils": "^8.19.4", + "@tanstack/query-core": "5.90.20", + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "@vue/composition-api": "^1.1.2", + "vue": "^2.6.0 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@tanstack/vue-query/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@tanstack/vue-query/node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.3.5.tgz", + "integrity": "sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==", + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/lodash": { + "version": "4.17.24", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.24.tgz", + "integrity": "sha512-gIW7lQLZbue7lRSWEFql49QJJWThrTFFeIMJdp3eH4tKoxm1OvEPg02rm4wCCSHS0cL3/Fizimb35b7k8atwsQ==", + "license": "MIT" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.12", + "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.12.tgz", + "integrity": "sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.2", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.2.tgz", + "integrity": "sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==", + "license": "MIT" + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.20.tgz", + "integrity": "sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==", + "license": "MIT" + }, + "node_modules/@uppy/companion-client": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-5.1.1.tgz", + "integrity": "sha512-DzrOWTbIZHvtgAFXBMYHk2wD27NjpBSVhY2tEiEIUhPd2CxbFRZjHM/N3HOt3VwZEAP471QWFLlJRWPcIY3A2Q==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^7.1.1", + "namespace-emitter": "^2.0.1", + "p-retry": "^6.1.0" + }, + "peerDependencies": { + "@uppy/core": "^5.1.1" + } + }, + "node_modules/@uppy/components": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@uppy/components/-/components-1.2.0.tgz", + "integrity": "sha512-rtIr+77Rw/q5Vw++xazF1dCg2d4A4zT9CV+ZyN8Rsx8xiIr2CxCR4TaHHBy+WeC0b7Mk6yNuJ0wUa34tFJ6pKg==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1", + "dequal": "^2.0.3", + "preact": "^10.26.10", + "pretty-bytes": "^6.1.1" + }, + "peerDependencies": { + "@uppy/core": "^5.2.0", + "@uppy/image-editor": "^4.2.0", + "@uppy/screen-capture": "^5.1.0", + "@uppy/webcam": "^5.1.0" + }, + "peerDependenciesMeta": { + "@uppy/image-editor": { + "optional": true + }, + "@uppy/screen-capture": { + "optional": true + }, + "@uppy/webcam": { + "optional": true + } + } + }, + "node_modules/@uppy/core": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-5.2.0.tgz", + "integrity": "sha512-uvfNyz4cnaplt7LYJmEZHuqOuav0tKp4a9WKJIaH6iIj7XiqYvS2J5SEByexAlUFlzefOAyjzj4Ja2dd/8aMrw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@transloadit/prettier-bytes": "^0.3.4", + "@uppy/store-default": "^5.0.0", + "@uppy/utils": "^7.1.4", + "lodash": "^4.17.21", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^5.0.9", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/core/node_modules/nanoid": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz", + "integrity": "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@uppy/locales": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@uppy/locales/-/locales-5.1.1.tgz", + "integrity": "sha512-zSbDU27JzfdssRJoa5/xmGOsrEtS+2Z9j41weaoCa/NoK4wqZzkFNQ0Z44etbTg3PDVFakZVDu/Z+c+vsJCfdQ==", + "license": "MIT", + "dependencies": { + "@uppy/utils": "^7.1.5" + } + }, + "node_modules/@uppy/store-default": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-5.0.0.tgz", + "integrity": "sha512-hQtCSQ1yGiaval/wVYUWquYGDJ+bpQ7e4FhUUAsRQz1x1K+o7NBtjfp63O9I4Ks1WRoKunpkarZ+as09l02cPw==", + "license": "MIT" + }, + "node_modules/@uppy/utils": { + "version": "7.1.5", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-7.1.5.tgz", + "integrity": "sha512-Vz4WGTjef6WebECGur4clWjpkET4o3bdvPMj1m2sD5cL+dTt69m+FIE5h5JD3HBMLEPTXPVkrXGMIFcbOYC12Q==", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.21", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/vue": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@uppy/vue/-/vue-3.2.0.tgz", + "integrity": "sha512-BZiyUZxpadf3uUp8YzgwRZTIde/m9Ne4ILFygJg7ilFq/Qfb1pBVspG9FJoG23RbOiRuxd4JixwFh0gaFdfL+w==", + "license": "MIT", + "dependencies": { + "@uppy/components": "^1.2.0", + "preact": "^10.26.10", + "shallow-equal": "^3.0.0" + }, + "peerDependencies": { + "@uppy/core": "^5.2.0", + "@uppy/dashboard": "^5.1.1", + "@uppy/screen-capture": "^5.1.0", + "@uppy/status-bar": "^5.1.0", + "@uppy/webcam": "^5.1.0", + "vue": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@uppy/dashboard": { + "optional": true + }, + "@uppy/screen-capture": { + "optional": true + }, + "@uppy/status-bar": { + "optional": true + }, + "@uppy/webcam": { + "optional": true + } + } + }, + "node_modules/@uppy/xhr-upload": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-5.1.1.tgz", + "integrity": "sha512-Vp0HWVA8o+niC2uISxPt0pZ+95bHHkk9HzNaUTrff/vq+20Ln68BS2auJhc9ecJzI6SKAlGZ342dcTQ/onw0nA==", + "license": "MIT", + "dependencies": { + "@uppy/companion-client": "^5.1.1", + "@uppy/utils": "^7.1.5" + }, + "peerDependencies": { + "@uppy/core": "^5.2.0" + } + }, + "node_modules/@viselect/vanilla": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/@viselect/vanilla/-/vanilla-3.9.0.tgz", + "integrity": "sha512-E9eBgoi/crJ0SlZMAc+Yst7nU324LZ5LLvcXjzWEcrfllscdpTml2OLOKHC7O8Bbz19OybSLv6VexxnjlJrLxQ==", + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.5.tgz", + "integrity": "sha512-bL3AxKuQySfk1iGcBsQnoRVexTPJq0Z/ixFVM8OhVJAP6ZXXXLtM7NFKWhLl30Kg7uTBqIaPXbh+nuQCuBDedg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-rc.2" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.30.tgz", + "integrity": "sha512-s3DfdZkcu/qExZ+td75015ljzHc6vE+30cFMGRPROYjqkroYI5NV2X1yAMX9UeyBNWB9MxCfPcsjpLS11nzkkw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/shared": "3.5.30", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.30.tgz", + "integrity": "sha512-eCFYESUEVYHhiMuK4SQTldO3RYxyMR/UQL4KdGD1Yrkfdx4m/HYuZ9jSfPdA+nWJY34VWndiYdW/wZXyiPEB9g==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.30.tgz", + "integrity": "sha512-LqmFPDn89dtU9vI3wHJnwaV6GfTRD87AjWpTWpyrdVOObVtjIuSeZr181z5C4PmVx/V3j2p+0f7edFKGRMpQ5A==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.0", + "@vue/compiler-core": "3.5.30", + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.30.tgz", + "integrity": "sha512-NsYK6OMTnx109PSL2IAyf62JP6EUdk4Dmj6AkWcJGBvN0dQoMYtVekAmdqgTtWQgEJo+Okstbf/1p7qZr5H+bA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/devtools-api": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-7.7.9.tgz", + "integrity": "sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==", + "license": "MIT", + "dependencies": { + "@vue/devtools-kit": "^7.7.9" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.9.tgz", + "integrity": "sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==", + "license": "MIT", + "dependencies": { + "@vue/devtools-shared": "^7.7.9", + "birpc": "^2.3.0", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.2" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.9", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.9.tgz", + "integrity": "sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==", + "license": "MIT", + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.30.tgz", + "integrity": "sha512-179YNgKATuwj9gB+66snskRDOitDiuOZqkYia7mHKJaidOMo/WJxHKF8DuGc4V4XbYTJANlfEKb0yxTQotnx4Q==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.30.tgz", + "integrity": "sha512-e0Z+8PQsUTdwV8TtEsLzUM7SzC7lQwYKePydb7K2ZnmS6jjND+WJXkmmfh/swYzRyfP1EY3fpdesyYoymCzYfg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/shared": "3.5.30" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.30.tgz", + "integrity": "sha512-2UIGakjU4WSQ0T4iwDEW0W7vQj6n7AFn7taqZ9Cvm0Q/RA2FFOziLESrDL4GmtI1wV3jXg5nMoJSYO66egDUBw==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.30", + "@vue/runtime-core": "3.5.30", + "@vue/shared": "3.5.30", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.30.tgz", + "integrity": "sha512-v+R34icapydRwbZRD0sXwtHqrQJv38JuMB4JxbOxd8NEpGLny7cncMp53W9UH/zo4j8eDHjQ1dEJXwzFQknjtQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "vue": "3.5.30" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.30.tgz", + "integrity": "sha512-YXgQ7JjaO18NeK2K9VTbDHaFy62WrObMa6XERNfNOkAhD1F1oDSf3ZJ7K6GqabZ0BvSDHajp8qfS5Sa2I9n8uQ==", + "license": "MIT" + }, + "node_modules/@vueuse/core": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-12.0.0.tgz", + "integrity": "sha512-C12RukhXiJCbx4MGhjmd/gH52TjJsc3G0E0kQj/kb19H3Nt6n1CA4DRWuTdWWcaFRdlTe0npWDS942mvacvNBw==", + "license": "MIT", + "dependencies": { + "@types/web-bluetooth": "^0.0.20", + "@vueuse/metadata": "12.0.0", + "@vueuse/shared": "12.0.0", + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/metadata": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-12.0.0.tgz", + "integrity": "sha512-Yzimd1D3sjxTDOlF05HekU5aSGdKjxhuhRFHA7gDWLn57PRbBIh+SF5NmjhJ0WRgF3my7T8LBucyxdFJjIfRJQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-12.0.0.tgz", + "integrity": "sha512-3i6qtcq2PIio5i/vVYidkkcgvmTjCqrf26u+Fd4LhnbBmIT6FN8y6q/GJERp8lfcB9zVEfjdV0Br0443qZuJpw==", + "license": "MIT", + "dependencies": { + "vue": "^3.5.13" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.6.tgz", + "integrity": "sha512-ChTCHMouEe2kn713WHbQGcuYrr6fXTBiu460OTwWrWob16g1bXn4vtz07Ope7ewMozJAnEquLk5lWQWtBig9DQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "license": "MIT" + }, + "node_modules/base-64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base-64/-/base-64-1.0.0.tgz", + "integrity": "sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==", + "license": "MIT" + }, + "node_modules/birpc": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-2.9.0.tgz", + "integrity": "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/byte-length": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/byte-length/-/byte-length-1.0.2.tgz", + "integrity": "sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==", + "license": "MIT" + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/classnames": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", + "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==", + "license": "MIT" + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/copy-anything": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-4.0.5.tgz", + "integrity": "sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==", + "license": "MIT", + "dependencies": { + "is-what": "^5.2.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", + "license": "BSD-3-Clause", + "engines": { + "node": "*" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/data-uri-to-buffer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz", + "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==", + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/easy-bem": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/easy-bem/-/easy-bem-1.1.1.tgz", + "integrity": "sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==", + "license": "MIT" + }, + "node_modules/echarts": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-6.0.0.tgz", + "integrity": "sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "2.3.0", + "zrender": "6.0.0" + } + }, + "node_modules/element-plus": { + "version": "2.13.5", + "resolved": "https://registry.npmjs.org/element-plus/-/element-plus-2.13.5.tgz", + "integrity": "sha512-dmY24fhSREfZN/PuUt0YZigMso7wWzl+B5o+YKNN15kQIn/0hzamsPU+ebj9SES0IbUqsLX1wkrzYmzU8VrVOQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^4.2.0", + "@element-plus/icons-vue": "^2.3.2", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.17.20", + "@types/lodash-es": "^4.17.12", + "@vueuse/core": "12.0.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.19", + "lodash": "^4.17.23", + "lodash-es": "^4.17.23", + "lodash-unified": "^1.0.3", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.3.0" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.27.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.4.tgz", + "integrity": "sha512-Rq4vbHnYkK5fws5NF7MYTU68FPRE1ajX7heQ/8QXXWqNgqqJ/GkmmyxIzUnf2Sr/bakf8l54716CcMGHYhMrrQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.4", + "@esbuild/android-arm": "0.27.4", + "@esbuild/android-arm64": "0.27.4", + "@esbuild/android-x64": "0.27.4", + "@esbuild/darwin-arm64": "0.27.4", + "@esbuild/darwin-x64": "0.27.4", + "@esbuild/freebsd-arm64": "0.27.4", + "@esbuild/freebsd-x64": "0.27.4", + "@esbuild/linux-arm": "0.27.4", + "@esbuild/linux-arm64": "0.27.4", + "@esbuild/linux-ia32": "0.27.4", + "@esbuild/linux-loong64": "0.27.4", + "@esbuild/linux-mips64el": "0.27.4", + "@esbuild/linux-ppc64": "0.27.4", + "@esbuild/linux-riscv64": "0.27.4", + "@esbuild/linux-s390x": "0.27.4", + "@esbuild/linux-x64": "0.27.4", + "@esbuild/netbsd-arm64": "0.27.4", + "@esbuild/netbsd-x64": "0.27.4", + "@esbuild/openbsd-arm64": "0.27.4", + "@esbuild/openbsd-x64": "0.27.4", + "@esbuild/openharmony-arm64": "0.27.4", + "@esbuild/sunos-x64": "0.27.4", + "@esbuild/win32-arm64": "0.27.4", + "@esbuild/win32-ia32": "0.27.4", + "@esbuild/win32-x64": "0.27.4" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fast-xml-builder": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.2.tgz", + "integrity": "sha512-NJAmiuVaJEjVa7TjLZKlYd7RqmzOC91EtPFXHvlTcqBVo50Qh7XV5IwvXi1c7NRz2Q/majGX9YLcwJtWgHjtkA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "path-expression-matcher": "^1.1.3" + } + }, + "node_modules/fast-xml-parser": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.5.3.tgz", + "integrity": "sha512-Ymnuefk6VzAhT3SxLzVUw+nMio/wB1NGypHkgetwtXcK1JfryaHk4DWQFGVwQ9XgzyS5iRZ7C2ZGI4AMsdMZ6A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "dependencies": { + "fast-xml-builder": "^1.1.2", + "path-expression-matcher": "^1.1.3", + "strnum": "^2.1.2" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fetch-blob": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz", + "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "paypal", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "dependencies": { + "node-domexception": "^1.0.0", + "web-streams-polyfill": "^3.0.3" + }, + "engines": { + "node": "^12.20 || >= 14.13" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formdata-polyfill": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz", + "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==", + "license": "MIT", + "dependencies": { + "fetch-blob": "^3.1.2" + }, + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "license": "MIT" + }, + "node_modules/hot-patcher": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/hot-patcher/-/hot-patcher-2.0.1.tgz", + "integrity": "sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==", + "license": "MIT" + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "license": "MIT" + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-network-error": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/is-network-error/-/is-network-error-1.3.1.tgz", + "integrity": "sha512-6QCxa49rQbmUWLfk0nuGqzql9U8uaV2H6279bRErPBHe/109hCzsLUBUHfbEtvLIHBd6hyXbgedBSHevm43Edw==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-5.5.0.tgz", + "integrity": "sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/layerr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/layerr/-/layerr-3.0.0.tgz", + "integrity": "sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==", + "license": "MIT" + }, + "node_modules/lodash": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", + "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash-es": { + "version": "4.17.23", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", + "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "license": "MIT", + "peer": true + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "license": "MIT", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "license": "BSD-3-Clause", + "dependencies": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "license": "ISC", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==", + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanostores": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/nanostores/-/nanostores-1.1.1.tgz", + "integrity": "sha512-EYJqS25r2iBeTtGQCHidXl1VfZ1jXM7Q04zXJOrMlxVVmD0ptxJaNux92n1mJ7c5lN3zTq12MhH/8x59nP+qmg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "peer": true, + "engines": { + "node": "^20.0.0 || >=22.0.0" + } + }, + "node_modules/nested-property": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nested-property/-/nested-property-4.0.0.tgz", + "integrity": "sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/node-domexception": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", + "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==", + "deprecated": "Use your platform's native DOMException instead", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/jimmywarting" + }, + { + "type": "github", + "url": "https://paypal.me/jimmywarting" + } + ], + "license": "MIT", + "engines": { + "node": ">=10.5.0" + } + }, + "node_modules/node-fetch": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz", + "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==", + "license": "MIT", + "dependencies": { + "data-uri-to-buffer": "^4.0.0", + "fetch-blob": "^3.1.4", + "formdata-polyfill": "^4.0.10" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/node-fetch" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==", + "license": "BSD-3-Clause" + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==", + "license": "MIT" + }, + "node_modules/overlayscrollbars": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/overlayscrollbars/-/overlayscrollbars-2.14.0.tgz", + "integrity": "sha512-RjV0pqc79kYhQLC3vTcLRb5GLpI1n6qh0Oua3g+bGH4EgNOJHVBGP7u0zZtxoAa0dkHlAqTTSYRb9MMmxNLjig==", + "license": "MIT" + }, + "node_modules/p-retry": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-6.2.1.tgz", + "integrity": "sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.2", + "is-network-error": "^1.0.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-expression-matcher": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/path-expression-matcher/-/path-expression-matcher-1.1.3.tgz", + "integrity": "sha512-qdVgY8KXmVdJZRSS1JdEPOKPdTiEK/pi0RkcT2sw1RhXxohdujUlJFPuS1TSkevZ9vzd3ZlL7ULl1MHGTApKzQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/path-posix": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz", + "integrity": "sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==", + "license": "ISC" + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-3.0.4.tgz", + "integrity": "sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^7.7.7" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.5.0", + "vue": "^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/preact": { + "version": "10.29.0", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.29.0.tgz", + "integrity": "sha512-wSAGyk2bYR1c7t3SZ3jHcM6xy0lcBcDel6lODcs9ME6Th++Dx2KU+6D3HD8wMMKGA8Wpw7OMd3/4RGzYRpzwRg==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "license": "MIT", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/primeicons": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/primeicons/-/primeicons-7.0.0.tgz", + "integrity": "sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==", + "license": "MIT" + }, + "node_modules/primevue": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/primevue/-/primevue-4.5.4.tgz", + "integrity": "sha512-nTyEohZABFJhVIpeUxgP0EJ8vKcJAhD+Z7DYj95e7ie/MNUCjRNcGjqmE1cXtXi4z54qDfTSI9h2uJ51qz2DIw==", + "license": "MIT", + "dependencies": { + "@primeuix/styled": "^0.7.4", + "@primeuix/styles": "^2.0.2", + "@primeuix/utils": "^0.6.2", + "@primevue/core": "4.5.4", + "@primevue/icons": "4.5.4" + }, + "engines": { + "node": ">=12.11.0" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/remove-accents": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", + "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", + "license": "MIT" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", + "license": "MIT" + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "license": "MIT" + }, + "node_modules/rollup": { + "version": "4.59.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", + "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.59.0", + "@rollup/rollup-android-arm64": "4.59.0", + "@rollup/rollup-darwin-arm64": "4.59.0", + "@rollup/rollup-darwin-x64": "4.59.0", + "@rollup/rollup-freebsd-arm64": "4.59.0", + "@rollup/rollup-freebsd-x64": "4.59.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", + "@rollup/rollup-linux-arm-musleabihf": "4.59.0", + "@rollup/rollup-linux-arm64-gnu": "4.59.0", + "@rollup/rollup-linux-arm64-musl": "4.59.0", + "@rollup/rollup-linux-loong64-gnu": "4.59.0", + "@rollup/rollup-linux-loong64-musl": "4.59.0", + "@rollup/rollup-linux-ppc64-gnu": "4.59.0", + "@rollup/rollup-linux-ppc64-musl": "4.59.0", + "@rollup/rollup-linux-riscv64-gnu": "4.59.0", + "@rollup/rollup-linux-riscv64-musl": "4.59.0", + "@rollup/rollup-linux-s390x-gnu": "4.59.0", + "@rollup/rollup-linux-x64-gnu": "4.59.0", + "@rollup/rollup-linux-x64-musl": "4.59.0", + "@rollup/rollup-openbsd-x64": "4.59.0", + "@rollup/rollup-openharmony-arm64": "4.59.0", + "@rollup/rollup-win32-arm64-msvc": "4.59.0", + "@rollup/rollup-win32-ia32-msvc": "4.59.0", + "@rollup/rollup-win32-x64-gnu": "4.59.0", + "@rollup/rollup-win32-x64-msvc": "4.59.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/sass": { + "version": "1.98.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.98.0.tgz", + "integrity": "sha512-+4N/u9dZ4PrgzGgPlKnaaRQx64RO0JBKs9sDhQ2pLgN6JQZ25uPQZKQYaBJU48Kd5BxgXoJ4e09Dq7nMcOUW3A==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/shallow-equal": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-3.1.0.tgz", + "integrity": "sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strnum": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.2.0.tgz", + "integrity": "sha512-Y7Bj8XyJxnPAORMZj/xltsfo55uOiyHcU2tnAVzHUnSJR/KsEX+9RoDeXEnsXtl/CX4fAcrt64gZ13aGaWPeBg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/NaturalIntelligence" + } + ], + "license": "MIT" + }, + "node_modules/superjson": { + "version": "2.2.6", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.6.tgz", + "integrity": "sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==", + "license": "MIT", + "dependencies": { + "copy-anything": "^4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==", + "license": "0BSD" + }, + "node_modules/url-join": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/url-join/-/url-join-5.0.0.tgz", + "integrity": "sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "license": "MIT", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/vanilla-lazyload": { + "version": "19.1.3", + "resolved": "https://registry.npmjs.org/vanilla-lazyload/-/vanilla-lazyload-19.1.3.tgz", + "integrity": "sha512-bBMERPu2AFJc35krS+8BOhq++c6dRfL6q368lJPnkS5U92fRQagTR3FsNta69/GukfZzDwDEjD5M3U7VuSiCDw==", + "license": "MIT", + "funding": { + "type": "individual", + "url": "https://ko-fi.com/verlok" + } + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vue": { + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.30.tgz", + "integrity": "sha512-hTHLc6VNZyzzEH/l7PFGjpcTvUgiaPK5mdLkbjrTeWSRcEfxFrv56g/XckIYlE9ckuobsdwqd5mk2g1sBkMewg==", + "license": "MIT", + "peer": true, + "dependencies": { + "@vue/compiler-dom": "3.5.30", + "@vue/compiler-sfc": "3.5.30", + "@vue/runtime-dom": "3.5.30", + "@vue/server-renderer": "3.5.30", + "@vue/shared": "3.5.30" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-advanced-cropper": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/vue-advanced-cropper/-/vue-advanced-cropper-2.8.9.tgz", + "integrity": "sha512-1jc5gO674kVGpJKekoaol6ZlwaF5VYDLSBwBOUpViW0IOrrRsyLw6XNszjEqgbavvqinlKNS6Kqlom3B5M72Tw==", + "license": "MIT", + "dependencies": { + "classnames": "^2.2.6", + "debounce": "^1.2.0", + "easy-bem": "^1.0.2" + }, + "engines": { + "node": ">=8", + "npm": ">=5" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n": { + "version": "9.14.5", + "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.14.5.tgz", + "integrity": "sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==", + "deprecated": "v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html", + "license": "MIT", + "dependencies": { + "@intlify/core-base": "9.14.5", + "@intlify/shared": "9.14.5", + "@vue/devtools-api": "^6.5.0" + }, + "engines": { + "node": ">= 16" + }, + "funding": { + "url": "https://github.com/sponsors/kazupon" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-i18n/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-router/node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/vue-sonner": { + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/vue-sonner/-/vue-sonner-2.0.9.tgz", + "integrity": "sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==", + "license": "MIT", + "peerDependencies": { + "@nuxt/kit": "^4.0.3", + "@nuxt/schema": "^4.0.3", + "nuxt": "^4.0.3" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@nuxt/schema": { + "optional": true + }, + "nuxt": { + "optional": true + } + } + }, + "node_modules/vuefinder": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/vuefinder/-/vuefinder-4.1.1.tgz", + "integrity": "sha512-sRrDj7+jrSN4CCQCkBDhc4Z3ZEP2CHa3HibPsByy/yEj2BVH6G7Fn9fSJ3IjGEivYTdURc6DbusidU6Rg6/SqQ==", + "license": "MIT", + "dependencies": { + "@floating-ui/dom": "^1.7.4", + "@nanostores/i18n": "^1.2.2", + "@nanostores/persistent": "^1.1.0", + "@nanostores/vue": "^1.0.1", + "@tanstack/vue-query": "^5.90.2", + "@uppy/core": "^5.0.2", + "@uppy/locales": "^5.0.1", + "@uppy/vue": "^3.1.0", + "@uppy/xhr-upload": "^5.0.1", + "@viselect/vanilla": "^3.9.0", + "mitt": "^3.0.1", + "nanostores": "^1.0.1", + "overlayscrollbars": "^2.12.0", + "vanilla-lazyload": "^19.1.3", + "vue-advanced-cropper": "^2.8.9", + "vue-sonner": "^2.0.9" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/n1crack" + }, + "peerDependencies": { + "vue": "^3.5.22" + }, + "peerDependenciesMeta": { + "vue": { + "optional": false + } + } + }, + "node_modules/web-streams-polyfill": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz", + "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/webdav": { + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webdav/-/webdav-5.9.0.tgz", + "integrity": "sha512-OMJ6wtK1WvCO++aOLoQgE96S8KT4e5aaClWHmHXfFU369r4eyELN569B7EqT4OOUb99mmO58GkyuiCv/Ag6J0Q==", + "license": "MIT", + "dependencies": { + "@buttercup/fetch": "^0.2.1", + "base-64": "^1.0.0", + "byte-length": "^1.0.2", + "entities": "^6.0.1", + "fast-xml-parser": "^5.3.4", + "hot-patcher": "^2.0.1", + "layerr": "^3.0.0", + "md5": "^2.3.0", + "minimatch": "^9.0.5", + "nested-property": "^4.0.0", + "node-fetch": "^3.3.2", + "path-posix": "^1.0.0", + "url-join": "^5.0.0", + "url-parse": "^1.5.10" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/webdav/node_modules/entities": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.1.tgz", + "integrity": "sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==", + "license": "MIT" + }, + "node_modules/zrender": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-6.0.0.tgz", + "integrity": "sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==", + "license": "BSD-3-Clause", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/web/package.json b/web/package.json new file mode 100644 index 0000000..6c51c0b --- /dev/null +++ b/web/package.json @@ -0,0 +1,35 @@ +{ + "name": "RFID-Management-System-Frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@element-plus/icons-vue": "^2.3.2", + "@fortawesome/fontawesome-free": "^6.7.2", + "@primeuix/themes": "^2.0.3", + "@primevue/forms": "^4.5.3", + "@vue/compiler-sfc": "^3.5.25", + "axios": "^1.13.2", + "echarts": "^6.0.0", + "element-plus": "^2.12.0", + "nprogress": "^0.2.0", + "pinia": "^3.0.4", + "primeicons": "^7.0.0", + "primevue": "^4.5.3", + "vue": "^3.5.25", + "vue-i18n": "^9.14.1", + "vue-router": "^4.6.4", + "vuefinder": "^4.0.33", + "webdav": "^5.8.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.3", + "sass": "^1.97.0", + "vite": "^7.3.0" + } +} diff --git a/web/pnpm-lock.yaml b/web/pnpm-lock.yaml new file mode 100644 index 0000000..9bfccaa --- /dev/null +++ b/web/pnpm-lock.yaml @@ -0,0 +1,2261 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@element-plus/icons-vue': + specifier: ^2.3.2 + version: 2.3.2(vue@3.5.27) + '@fortawesome/fontawesome-free': + specifier: ^6.7.2 + version: 6.7.2 + '@primeuix/themes': + specifier: ^2.0.3 + version: 2.0.3 + '@primevue/forms': + specifier: ^4.5.3 + version: 4.5.4(vue@3.5.27) + '@vue/compiler-sfc': + specifier: ^3.5.25 + version: 3.5.27 + axios: + specifier: ^1.13.2 + version: 1.13.3 + echarts: + specifier: ^6.0.0 + version: 6.0.0 + element-plus: + specifier: ^2.12.0 + version: 2.13.1(vue@3.5.27) + nprogress: + specifier: ^0.2.0 + version: 0.2.0 + pinia: + specifier: ^3.0.4 + version: 3.0.4(vue@3.5.27) + primeicons: + specifier: ^7.0.0 + version: 7.0.0 + primevue: + specifier: ^4.5.3 + version: 4.5.4(vue@3.5.27) + vue: + specifier: ^3.5.25 + version: 3.5.27 + vue-i18n: + specifier: ^9.14.1 + version: 9.14.5(vue@3.5.27) + vue-router: + specifier: ^4.6.4 + version: 4.6.4(vue@3.5.27) + vuefinder: + specifier: ^4.0.33 + version: 4.0.33(@vue/devtools-api@7.7.9)(vue@3.5.27) + webdav: + specifier: ^5.8.0 + version: 5.8.0 + devDependencies: + '@vitejs/plugin-vue': + specifier: ^6.0.3 + version: 6.0.3(vite@7.3.1(sass@1.97.3))(vue@3.5.27) + sass: + specifier: ^1.97.0 + version: 1.97.3 + vite: + specifier: ^7.3.0 + version: 7.3.1(sass@1.97.3) + +packages: + + '@babel/helper-string-parser@7.27.1': + resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.28.5': + resolution: {integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.28.6': + resolution: {integrity: sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/types@7.28.6': + resolution: {integrity: sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==} + engines: {node: '>=6.9.0'} + + '@buttercup/fetch@0.2.1': + resolution: {integrity: sha512-sCgECOx8wiqY8NN1xN22BqqKzXYIG2AicNLlakOAI4f0WgyLVUbAigMf8CZhBtJxdudTcB1gD5lciqi44jwJvg==} + + '@ctrl/tinycolor@3.6.1': + resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} + engines: {node: '>=10'} + + '@element-plus/icons-vue@2.3.2': + resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==} + peerDependencies: + vue: ^3.2.0 + + '@esbuild/aix-ppc64@0.27.2': + resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.27.2': + resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.27.2': + resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.27.2': + resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.27.2': + resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.27.2': + resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.27.2': + resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.27.2': + resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.27.2': + resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.27.2': + resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.27.2': + resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.27.2': + resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.27.2': + resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.27.2': + resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.27.2': + resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.27.2': + resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.27.2': + resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-arm64@0.27.2': + resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.27.2': + resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-arm64@0.27.2': + resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.27.2': + resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openharmony-arm64@0.27.2': + resolution: {integrity: sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openharmony] + + '@esbuild/sunos-x64@0.27.2': + resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.27.2': + resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.27.2': + resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.27.2': + resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] + + '@floating-ui/core@1.7.3': + resolution: {integrity: sha512-sGnvb5dmrJaKEZ+LDIpguvdX3bDlEllmv4/ClQ9awcmCZrlx5jQyyMWFM5kBI+EyNOCDDiKk8il0zeuX3Zlg/w==} + + '@floating-ui/dom@1.7.4': + resolution: {integrity: sha512-OOchDgh4F2CchOX94cRVqhvy7b3AFb+/rQXyswmzmGakRfkMgoWVjfnLWkRirfLEfuD4ysVW16eXzwt3jHIzKA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@fortawesome/fontawesome-free@6.7.2': + resolution: {integrity: sha512-JUOtgFW6k9u4Y+xeIaEiLr3+cjoUPiAuLXoyKOJSia6Duzb7pq+A76P9ZdPDoAoxHdHzq6gE9/jKBGXlZT8FbA==} + engines: {node: '>=6'} + + '@intlify/core-base@9.14.5': + resolution: {integrity: sha512-5ah5FqZG4pOoHjkvs8mjtv+gPKYU0zCISaYNjBNNqYiaITxW8ZtVih3GS/oTOqN8d9/mDLyrjD46GBApNxmlsA==} + engines: {node: '>= 16'} + + '@intlify/message-compiler@9.14.5': + resolution: {integrity: sha512-IHzgEu61/YIpQV5Pc3aRWScDcnFKWvQA9kigcINcCBXN8mbW+vk9SK+lDxA6STzKQsVJxUPg9ACC52pKKo3SVQ==} + engines: {node: '>= 16'} + + '@intlify/shared@9.14.5': + resolution: {integrity: sha512-9gB+E53BYuAEMhbCAxVgG38EZrk59sxBtv3jSizNL2hEWlgjBjAw1AwpLHtNaeda12pe6W20OGEa0TwuMSRbyQ==} + engines: {node: '>= 16'} + + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + + '@nanostores/i18n@1.2.2': + resolution: {integrity: sha512-5LLxl95+ZI46MrM/Kn7YjORKsD7+Xy2tgjZ7/oDT/BGPEiaBM9lK89/afeK+BqaQL0Xd9Xaa5MPuuVSyWAo+/w==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0 + + '@nanostores/persistent@1.2.0': + resolution: {integrity: sha512-kf5WOLpVI9Pk+AwXHIax4in3pesNe8299BEGQ2H8kgI05SZw7KKWCDv7bt2FOlND8E5y7rO5PRW34q0UCAl/DA==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + nanostores: ^0.9.0 || ^0.10.0 || ^0.11.0 || ^1.0.0 + + '@nanostores/vue@1.0.1': + resolution: {integrity: sha512-0VwubMTMvEdWQhVN4BAvDZ+vHQH3O1G9BaOfgrjfF4erqBsWScoK/zyaBeRfFjptNOb25947EFPHBZwEf9JcMg==} + engines: {node: ^20.0.0 || >=22.0.0} + peerDependencies: + '@nanostores/logger': ^0.4.0 || ^1.0.0 + '@vue/devtools-api': '>=7.6.2' + nanostores: ^0.11.3 || ^1.0.0 + vue: '>=3.3.1' + peerDependenciesMeta: + '@nanostores/logger': + optional: true + '@vue/devtools-api': + optional: true + + '@parcel/watcher-android-arm64@2.5.6': + resolution: {integrity: sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [android] + + '@parcel/watcher-darwin-arm64@2.5.6': + resolution: {integrity: sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [darwin] + + '@parcel/watcher-darwin-x64@2.5.6': + resolution: {integrity: sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [darwin] + + '@parcel/watcher-freebsd-x64@2.5.6': + resolution: {integrity: sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [freebsd] + + '@parcel/watcher-linux-arm-glibc@2.5.6': + resolution: {integrity: sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm-musl@2.5.6': + resolution: {integrity: sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==} + engines: {node: '>= 10.0.0'} + cpu: [arm] + os: [linux] + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + resolution: {integrity: sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [linux] + + '@parcel/watcher-linux-x64-glibc@2.5.6': + resolution: {integrity: sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [linux] + + '@parcel/watcher-win32-arm64@2.5.6': + resolution: {integrity: sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==} + engines: {node: '>= 10.0.0'} + cpu: [arm64] + os: [win32] + + '@parcel/watcher-win32-ia32@2.5.6': + resolution: {integrity: sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==} + engines: {node: '>= 10.0.0'} + cpu: [ia32] + os: [win32] + + '@parcel/watcher-win32-x64@2.5.6': + resolution: {integrity: sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==} + engines: {node: '>= 10.0.0'} + cpu: [x64] + os: [win32] + + '@parcel/watcher@2.5.6': + resolution: {integrity: sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==} + engines: {node: '>= 10.0.0'} + + '@primeuix/forms@0.1.0': + resolution: {integrity: sha512-LctcQidb+B5PuvAFWH24YH/SIzmHlOabLHpaTeGY/k51iBv1WyCp+5w9JMYuMB/BplSvV0ZGySxQVkN5Azr/aQ==} + engines: {node: '>=12.11.0'} + + '@primeuix/styled@0.7.4': + resolution: {integrity: sha512-QSO/NpOQg8e9BONWRBx9y8VGMCMYz0J/uKfNJEya/RGEu7ARx0oYW0ugI1N3/KB1AAvyGxzKBzGImbwg0KUiOQ==} + engines: {node: '>=12.11.0'} + + '@primeuix/styles@2.0.3': + resolution: {integrity: sha512-2ykAB6BaHzR/6TwF8ShpJTsZrid6cVIEBVlookSdvOdmlWuevGu5vWOScgIwqWwlZcvkFYAGR/SUV3OHCTBMdw==} + + '@primeuix/themes@2.0.3': + resolution: {integrity: sha512-3fS1883mtCWhgUgNf/feiaaDSOND4EBIOu9tZnzJlJ8QtYyL6eFLcA6V3ymCWqLVXQ1+lTVEZv1gl47FIdXReg==} + + '@primeuix/utils@0.6.4': + resolution: {integrity: sha512-pZ5f+vj7wSzRhC7KoEQRU5fvYAe+RP9+m39CTscZ3UywCD1Y2o6Fe1rRgklMPSkzUcty2jzkA0zMYkiJBD1hgg==} + engines: {node: '>=12.11.0'} + + '@primevue/core@4.5.4': + resolution: {integrity: sha512-lYJJB3wTrDJ8MkLctzHfrPZAqXVxoatjIsswSJzupatf6ZogJHVYADUKcn1JAkLLk8dtV1FA2AxDek663fHO5Q==} + engines: {node: '>=12.11.0'} + peerDependencies: + vue: ^3.5.0 + + '@primevue/forms@4.5.4': + resolution: {integrity: sha512-2TlD8oJEtb8vuKzY3jY0W+7NVBC/Qj0m57iWzpMUmGnEKg9sbQ2/ZiU1sTof710/liYgm4FneRTOYHIpVkiJNA==} + engines: {node: '>=12.11.0'} + + '@primevue/icons@4.5.4': + resolution: {integrity: sha512-DxgryEc7ZmUqcEhYMcxGBRyFzdtLIoy3jLtlH1zsVSRZaG+iSAcjQ88nvfkZxGUZtZBFL7sRjF6KLq3bJZJwUw==} + engines: {node: '>=12.11.0'} + + '@rolldown/pluginutils@1.0.0-beta.53': + resolution: {integrity: sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==} + + '@rollup/rollup-android-arm-eabi@4.56.0': + resolution: {integrity: sha512-LNKIPA5k8PF1+jAFomGe3qN3bbIgJe/IlpDBwuVjrDKrJhVWywgnJvflMt/zkbVNLFtF1+94SljYQS6e99klnw==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.56.0': + resolution: {integrity: sha512-lfbVUbelYqXlYiU/HApNMJzT1E87UPGvzveGg2h0ktUNlOCxKlWuJ9jtfvs1sKHdwU4fzY7Pl8sAl49/XaEk6Q==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.56.0': + resolution: {integrity: sha512-EgxD1ocWfhoD6xSOeEEwyE7tDvwTgZc8Bss7wCWe+uc7wO8G34HHCUH+Q6cHqJubxIAnQzAsyUsClt0yFLu06w==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.56.0': + resolution: {integrity: sha512-1vXe1vcMOssb/hOF8iv52A7feWW2xnu+c8BV4t1F//m9QVLTfNVpEdja5ia762j/UEJe2Z1jAmEqZAK42tVW3g==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-freebsd-arm64@4.56.0': + resolution: {integrity: sha512-bof7fbIlvqsyv/DtaXSck4VYQ9lPtoWNFCB/JY4snlFuJREXfZnm+Ej6yaCHfQvofJDXLDMTVxWscVSuQvVWUQ==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.56.0': + resolution: {integrity: sha512-KNa6lYHloW+7lTEkYGa37fpvPq+NKG/EHKM8+G/g9WDU7ls4sMqbVRV78J6LdNuVaeeK5WB9/9VAFbKxcbXKYg==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.56.0': + resolution: {integrity: sha512-E8jKK87uOvLrrLN28jnAAAChNq5LeCd2mGgZF+fGF5D507WlG/Noct3lP/QzQ6MrqJ5BCKNwI9ipADB6jyiq2A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.56.0': + resolution: {integrity: sha512-jQosa5FMYF5Z6prEpTCCmzCXz6eKr/tCBssSmQGEeozA9tkRUty/5Vx06ibaOP9RCrW1Pvb8yp3gvZhHwTDsJw==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.56.0': + resolution: {integrity: sha512-uQVoKkrC1KGEV6udrdVahASIsaF8h7iLG0U0W+Xn14ucFwi6uS539PsAr24IEF9/FoDtzMeeJXJIBo5RkbNWvQ==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.56.0': + resolution: {integrity: sha512-vLZ1yJKLxhQLFKTs42RwTwa6zkGln+bnXc8ueFGMYmBTLfNu58sl5/eXyxRa2RarTkJbXl8TKPgfS6V5ijNqEA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-loong64-gnu@4.56.0': + resolution: {integrity: sha512-FWfHOCub564kSE3xJQLLIC/hbKqHSVxy8vY75/YHHzWvbJL7aYJkdgwD/xGfUlL5UV2SB7otapLrcCj2xnF1dg==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-loong64-musl@4.56.0': + resolution: {integrity: sha512-z1EkujxIh7nbrKL1lmIpqFTc/sr0u8Uk0zK/qIEFldbt6EDKWFk/pxFq3gYj4Bjn3aa9eEhYRlL3H8ZbPT1xvA==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-ppc64-gnu@4.56.0': + resolution: {integrity: sha512-iNFTluqgdoQC7AIE8Q34R3AuPrJGJirj5wMUErxj22deOcY7XwZRaqYmB6ZKFHoVGqRcRd0mqO+845jAibKCkw==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-ppc64-musl@4.56.0': + resolution: {integrity: sha512-MtMeFVlD2LIKjp2sE2xM2slq3Zxf9zwVuw0jemsxvh1QOpHSsSzfNOTH9uYW9i1MXFxUSMmLpeVeUzoNOKBaWg==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.56.0': + resolution: {integrity: sha512-in+v6wiHdzzVhYKXIk5U74dEZHdKN9KH0Q4ANHOTvyXPG41bajYRsy7a8TPKbYPl34hU7PP7hMVHRvv/5aCSew==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-riscv64-musl@4.56.0': + resolution: {integrity: sha512-yni2raKHB8m9NQpI9fPVwN754mn6dHQSbDTwxdr9SE0ks38DTjLMMBjrwvB5+mXrX+C0npX0CVeCUcvvvD8CNQ==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.56.0': + resolution: {integrity: sha512-zhLLJx9nQPu7wezbxt2ut+CI4YlXi68ndEve16tPc/iwoylWS9B3FxpLS2PkmfYgDQtosah07Mj9E0khc3Y+vQ==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.56.0': + resolution: {integrity: sha512-MVC6UDp16ZSH7x4rtuJPAEoE1RwS8N4oK9DLHy3FTEdFoUTCFVzMfJl/BVJ330C+hx8FfprA5Wqx4FhZXkj2Kw==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.56.0': + resolution: {integrity: sha512-ZhGH1eA4Qv0lxaV00azCIS1ChedK0V32952Md3FtnxSqZTBTd6tgil4nZT5cU8B+SIw3PFYkvyR4FKo2oyZIHA==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-openbsd-x64@4.56.0': + resolution: {integrity: sha512-O16XcmyDeFI9879pEcmtWvD/2nyxR9mF7Gs44lf1vGGx8Vg2DRNx11aVXBEqOQhWb92WN4z7fW/q4+2NYzCbBA==} + cpu: [x64] + os: [openbsd] + + '@rollup/rollup-openharmony-arm64@4.56.0': + resolution: {integrity: sha512-LhN/Reh+7F3RCgQIRbgw8ZMwUwyqJM+8pXNT6IIJAqm2IdKkzpCh/V9EdgOMBKuebIrzswqy4ATlrDgiOwbRcQ==} + cpu: [arm64] + os: [openharmony] + + '@rollup/rollup-win32-arm64-msvc@4.56.0': + resolution: {integrity: sha512-kbFsOObXp3LBULg1d3JIUQMa9Kv4UitDmpS+k0tinPBz3watcUiV2/LUDMMucA6pZO3WGE27P7DsfaN54l9ing==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.56.0': + resolution: {integrity: sha512-vSSgny54D6P4vf2izbtFm/TcWYedw7f8eBrOiGGecyHyQB9q4Kqentjaj8hToe+995nob/Wv48pDqL5a62EWtg==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-gnu@4.56.0': + resolution: {integrity: sha512-FeCnkPCTHQJFbiGG49KjV5YGW/8b9rrXAM2Mz2kiIoktq2qsJxRD5giEMEOD2lPdgs72upzefaUvS+nc8E3UzQ==} + cpu: [x64] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.56.0': + resolution: {integrity: sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==} + cpu: [x64] + os: [win32] + + '@sxzz/popperjs-es@2.11.7': + resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==} + + '@tanstack/match-sorter-utils@8.19.4': + resolution: {integrity: sha512-Wo1iKt2b9OT7d+YGhvEPD3DXvPv2etTusIMhMUoG7fbhmxcXCtIjJDEygy91Y2JFlwGyjqiBPRozme7UD8hoqg==} + engines: {node: '>=12'} + + '@tanstack/query-core@5.90.20': + resolution: {integrity: sha512-OMD2HLpNouXEfZJWcKeVKUgQ5n+n3A2JFmBaScpNDUqSrQSjiveC7dKMe53uJUg1nDG16ttFPz2xfilz6i2uVg==} + + '@tanstack/vue-query@5.92.9': + resolution: {integrity: sha512-jjAZcqKveyX0C4w/6zUqbnqk/XzuxNWaFsWjGTJWULVFizUNeLGME2gf9vVSDclIyiBhR13oZJPPs6fJgfpIJQ==} + peerDependencies: + '@vue/composition-api': ^1.1.2 + vue: ^2.6.0 || ^3.3.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + '@transloadit/prettier-bytes@0.3.5': + resolution: {integrity: sha512-xF4A3d/ZyX2LJWeQZREZQw+qFX4TGQ8bGVP97OLRt6sPO6T0TNHBFTuRHOJh7RNmYOBmQ9MHxpolD9bXihpuVA==} + + '@types/estree@1.0.8': + resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + + '@types/lodash-es@4.17.12': + resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==} + + '@types/lodash@4.17.23': + resolution: {integrity: sha512-RDvF6wTulMPjrNdCoYRC8gNR880JNGT8uB+REUpC2Ns4pRqQJhGz90wh7rgdXDPpCczF3VGktDuFGVnz8zP7HA==} + + '@types/retry@0.12.2': + resolution: {integrity: sha512-XISRgDJ2Tc5q4TRqvgJtzsRkFYNJzZrhTdtMoGVBttwzzQJkPnS3WWTFc7kuDRoPtPakl+T+OfdEUjYJj7Jbow==} + + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@uppy/companion-client@5.1.1': + resolution: {integrity: sha512-DzrOWTbIZHvtgAFXBMYHk2wD27NjpBSVhY2tEiEIUhPd2CxbFRZjHM/N3HOt3VwZEAP471QWFLlJRWPcIY3A2Q==} + peerDependencies: + '@uppy/core': ^5.1.1 + + '@uppy/components@1.1.0': + resolution: {integrity: sha512-omiNBzJn49FQznkSwOIGn3TKz+3r4T+y8sxWIBDMO6De2genzywRk1drAWO9GbSAF3htlVuvamNojQ2pSLeh3w==} + peerDependencies: + '@uppy/core': ^5.1.1 + '@uppy/image-editor': ^4.0.2 + '@uppy/screen-capture': ^5.0.1 + '@uppy/webcam': ^5.0.2 + peerDependenciesMeta: + '@uppy/image-editor': + optional: true + '@uppy/screen-capture': + optional: true + '@uppy/webcam': + optional: true + + '@uppy/core@5.2.0': + resolution: {integrity: sha512-uvfNyz4cnaplt7LYJmEZHuqOuav0tKp4a9WKJIaH6iIj7XiqYvS2J5SEByexAlUFlzefOAyjzj4Ja2dd/8aMrw==} + + '@uppy/locales@5.1.0': + resolution: {integrity: sha512-6ijq68eLFUp+eV/faNACp+SWOGmOGcPsQBS28WEPFQb7Jg8THWCw8jik3LHzkvLBWgdpQ4n6R65PNZ2QsPkubw==} + + '@uppy/store-default@5.0.0': + resolution: {integrity: sha512-hQtCSQ1yGiaval/wVYUWquYGDJ+bpQ7e4FhUUAsRQz1x1K+o7NBtjfp63O9I4Ks1WRoKunpkarZ+as09l02cPw==} + + '@uppy/utils@7.1.5': + resolution: {integrity: sha512-Vz4WGTjef6WebECGur4clWjpkET4o3bdvPMj1m2sD5cL+dTt69m+FIE5h5JD3HBMLEPTXPVkrXGMIFcbOYC12Q==} + + '@uppy/vue@3.1.0': + resolution: {integrity: sha512-V007Zg/GPS0OJ6F9PkhOhZAMVtSfsq6VO9cq3q1qMdfvknxgoxhcLbEz8I2zJNa2pvF7NeOn46gcGQMyrEvxTQ==} + peerDependencies: + '@uppy/core': ^5.0.2 + '@uppy/dashboard': ^5.0.2 + '@uppy/status-bar': '*' + vue: '>=3.0.0' + peerDependenciesMeta: + '@uppy/dashboard': + optional: true + '@uppy/status-bar': + optional: true + + '@uppy/xhr-upload@5.1.1': + resolution: {integrity: sha512-Vp0HWVA8o+niC2uISxPt0pZ+95bHHkk9HzNaUTrff/vq+20Ln68BS2auJhc9ecJzI6SKAlGZ342dcTQ/onw0nA==} + peerDependencies: + '@uppy/core': ^5.2.0 + + '@viselect/vanilla@3.9.0': + resolution: {integrity: sha512-E9eBgoi/crJ0SlZMAc+Yst7nU324LZ5LLvcXjzWEcrfllscdpTml2OLOKHC7O8Bbz19OybSLv6VexxnjlJrLxQ==} + + '@vitejs/plugin-vue@6.0.3': + resolution: {integrity: sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + vue: ^3.2.25 + + '@vue/compiler-core@3.5.27': + resolution: {integrity: sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==} + + '@vue/compiler-dom@3.5.27': + resolution: {integrity: sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==} + + '@vue/compiler-sfc@3.5.27': + resolution: {integrity: sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==} + + '@vue/compiler-ssr@3.5.27': + resolution: {integrity: sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==} + + '@vue/devtools-api@6.6.4': + resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} + + '@vue/devtools-api@7.7.9': + resolution: {integrity: sha512-kIE8wvwlcZ6TJTbNeU2HQNtaxLx3a84aotTITUuL/4bzfPxzajGBOoqjMhwZJ8L9qFYDU/lAYMEEm11dnZOD6g==} + + '@vue/devtools-kit@7.7.9': + resolution: {integrity: sha512-PyQ6odHSgiDVd4hnTP+aDk2X4gl2HmLDfiyEnn3/oV+ckFDuswRs4IbBT7vacMuGdwY/XemxBoh302ctbsptuA==} + + '@vue/devtools-shared@7.7.9': + resolution: {integrity: sha512-iWAb0v2WYf0QWmxCGy0seZNDPdO3Sp5+u78ORnyeonS6MT4PC7VPrryX2BpMJrwlDeaZ6BD4vP4XKjK0SZqaeA==} + + '@vue/reactivity@3.5.27': + resolution: {integrity: sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==} + + '@vue/runtime-core@3.5.27': + resolution: {integrity: sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==} + + '@vue/runtime-dom@3.5.27': + resolution: {integrity: sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==} + + '@vue/server-renderer@3.5.27': + resolution: {integrity: sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==} + peerDependencies: + vue: 3.5.27 + + '@vue/shared@3.5.27': + resolution: {integrity: sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==} + + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + async-validator@4.2.5: + resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + axios@1.13.3: + resolution: {integrity: sha512-ERT8kdX7DZjtUm7IitEyV7InTHAF42iJuMArIiDIV5YtPanJkgw4hw5Dyg9fh0mihdWNn1GKaeIWErfe56UQ1g==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + + birpc@2.9.0: + resolution: {integrity: sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw==} + + brace-expansion@2.0.2: + resolution: {integrity: sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==} + + byte-length@1.0.2: + resolution: {integrity: sha512-ovBpjmsgd/teRmgcPh23d4gJvxDoXtAzEL9xTfMU8Yc2kqCDb7L9jAG0XHl1nzuGl+h3ebCIF1i62UFyA9V/2Q==} + + call-bind-apply-helpers@1.0.2: + resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} + engines: {node: '>= 0.4'} + + charenc@0.0.2: + resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} + + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} + engines: {node: '>= 14.16.0'} + + classnames@2.5.1: + resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + copy-anything@4.0.5: + resolution: {integrity: sha512-7Vv6asjS4gMOuILabD3l739tsaxFQmC+a7pLZm02zyvs8p977bL3zEgq3yDk5rn9B0PbYgIv++jmHcuUab4RhA==} + engines: {node: '>=18'} + + crypt@0.0.2: + resolution: {integrity: sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==} + + csstype@3.2.3: + resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==} + + data-uri-to-buffer@4.0.1: + resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==} + engines: {node: '>= 12'} + + dayjs@1.11.19: + resolution: {integrity: sha512-t5EcLVS6QPBNqM2z8fakk/NKel+Xzshgt8FFKAn+qwlD1pzZWxh0nVCrvFK7ZDb6XucZeF9z8C7CBWTRIVApAw==} + + debounce@1.2.1: + resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + + dunder-proto@1.0.1: + resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} + engines: {node: '>= 0.4'} + + easy-bem@1.1.1: + resolution: {integrity: sha512-GJRqdiy2h+EXy6a8E6R+ubmqUM08BK0FWNq41k24fup6045biQ8NXxoXimiwegMQvFFV3t1emADdGNL1TlS61A==} + + echarts@6.0.0: + resolution: {integrity: sha512-Tte/grDQRiETQP4xz3iZWSvoHrkCQtwqd6hs+mifXcjrCuo2iKWbajFObuLJVBlDIJlOzgQPd1hsaKt/3+OMkQ==} + + element-plus@2.13.1: + resolution: {integrity: sha512-eG4BDBGdAsUGN6URH1PixzZb0ngdapLivIk1meghS1uEueLvQ3aljSKrCt5x6sYb6mUk8eGtzTQFgsPmLavQcA==} + peerDependencies: + vue: ^3.3.0 + + entities@6.0.1: + resolution: {integrity: sha512-aN97NXWF6AWBTahfVOIrB/NShkzi5H7F9r1s9mD3cDj4Ko5f2qhhVoYMibXF7GlLveb/D2ioWay8lxI97Ven3g==} + engines: {node: '>=0.12'} + + entities@7.0.1: + resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==} + engines: {node: '>=0.12'} + + es-define-property@1.0.1: + resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-object-atoms@1.1.1: + resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.1.0: + resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==} + engines: {node: '>= 0.4'} + + esbuild@0.27.2: + resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} + engines: {node: '>=18'} + hasBin: true + + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + + fast-xml-parser@4.5.3: + resolution: {integrity: sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==} + hasBin: true + + fdir@6.5.0: + resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==} + engines: {node: '>=12.0.0'} + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + + fetch-blob@3.2.0: + resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} + engines: {node: ^12.20 || >= 14.13} + + follow-redirects@1.15.11: + resolution: {integrity: sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + form-data@4.0.5: + resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} + engines: {node: '>= 6'} + + formdata-polyfill@4.0.10: + resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} + engines: {node: '>=12.20.0'} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + get-intrinsic@1.3.0: + resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} + engines: {node: '>= 0.4'} + + get-proto@1.0.1: + resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} + engines: {node: '>= 0.4'} + + gopd@1.2.0: + resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} + engines: {node: '>= 0.4'} + + has-symbols@1.1.0: + resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hookable@5.5.3: + resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} + + hot-patcher@2.0.1: + resolution: {integrity: sha512-ECg1JFG0YzehicQaogenlcs2qg6WsXQsxtnbr1i696u5tLUjtJdQAh0u2g0Q5YV45f263Ta1GnUJsc8WIfJf4Q==} + + immutable@5.1.4: + resolution: {integrity: sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==} + + is-buffer@1.1.6: + resolution: {integrity: sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-network-error@1.3.0: + resolution: {integrity: sha512-6oIwpsgRfnDiyEDLMay/GqCl3HoAtH5+RUKW29gYkL0QA+ipzpDLA16yQs7/RHCSu+BwgbJaOUqa4A99qNVQVw==} + engines: {node: '>=16'} + + is-what@5.5.0: + resolution: {integrity: sha512-oG7cgbmg5kLYae2N5IVd3jm2s+vldjxJzK1pcu9LfpGuQ93MQSzo0okvRna+7y5ifrD+20FE8FvjusyGaz14fw==} + engines: {node: '>=18'} + + layerr@3.0.0: + resolution: {integrity: sha512-tv754Ki2dXpPVApOrjTyRo4/QegVb9eVFq4mjqp4+NM5NaX7syQvN5BBNfV/ZpAHCEHV24XdUVrBAoka4jt3pA==} + + lodash-es@4.17.23: + resolution: {integrity: sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==} + + lodash-unified@1.0.3: + resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==} + peerDependencies: + '@types/lodash-es': '*' + lodash: '*' + lodash-es: '*' + + lodash@4.17.23: + resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} + + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + math-intrinsics@1.1.0: + resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} + engines: {node: '>= 0.4'} + + md5@2.3.0: + resolution: {integrity: sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==} + + memoize-one@6.0.0: + resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-match@1.0.2: + resolution: {integrity: sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + minimatch@9.0.5: + resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} + engines: {node: '>=16 || 14 >=14.17'} + + mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + namespace-emitter@2.0.1: + resolution: {integrity: sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==} + + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + nanoid@5.1.6: + resolution: {integrity: sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg==} + engines: {node: ^18 || >=20} + hasBin: true + + nanostores@1.1.0: + resolution: {integrity: sha512-yJBmDJr18xy47dbNVlHcgdPrulSn1nhSE6Ns9vTG+Nx9VPT6iV1MD6aQFp/t52zpf82FhLLTXAXr30NuCnxvwA==} + engines: {node: ^20.0.0 || >=22.0.0} + + nested-property@4.0.0: + resolution: {integrity: sha512-yFehXNWRs4cM0+dz7QxCd06hTbWbSkV0ISsqBfkntU6TOY4Qm3Q88fRRLOddkGh2Qq6dZvnKVAahfhjcUvLnyA==} + + node-addon-api@7.1.1: + resolution: {integrity: sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==} + + node-domexception@1.0.0: + resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} + engines: {node: '>=10.5.0'} + deprecated: Use your platform's native DOMException instead + + node-fetch@3.3.2: + resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + normalize-wheel-es@1.2.0: + resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==} + + nprogress@0.2.0: + resolution: {integrity: sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==} + + overlayscrollbars@2.13.0: + resolution: {integrity: sha512-uQGpLESrbFDLTWucWAKX9ceIANj7detMwH/2yJ315Llt72ZcWN3P6ckMotoqVv2Mk29R/pnhDtgYjy4K+kwAyQ==} + + p-retry@6.2.1: + resolution: {integrity: sha512-hEt02O4hUct5wtwg4H4KcWgDdm+l1bOaEy/hWzd8xtXB9BqxTWBBhb+2ImAtH4Cv4rPjV76xN3Zumqk3k3AhhQ==} + engines: {node: '>=16.17'} + + path-posix@1.0.0: + resolution: {integrity: sha512-1gJ0WpNIiYcQydgg3Ed8KzvIqTsDpNwq+cjBCssvBtuTWjEqY1AW+i+OepiEMqDCzyro9B2sLAe4RBPajMYFiA==} + + perfect-debounce@1.0.0: + resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==} + + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} + + picomatch@4.0.3: + resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} + engines: {node: '>=12'} + + pinia@3.0.4: + resolution: {integrity: sha512-l7pqLUFTI/+ESXn6k3nu30ZIzW5E2WZF/LaHJEpoq6ElcLD+wduZoB2kBN19du6K/4FDpPMazY2wJr+IndBtQw==} + peerDependencies: + typescript: '>=4.5.0' + vue: ^3.5.11 + peerDependenciesMeta: + typescript: + optional: true + + postcss@8.5.6: + resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} + engines: {node: ^10 || ^12 || >=14} + + preact@10.28.2: + resolution: {integrity: sha512-lbteaWGzGHdlIuiJ0l2Jq454m6kcpI1zNje6d8MlGAFlYvP2GO4ibnat7P74Esfz4sPTdM6UxtTwh/d3pwM9JA==} + + pretty-bytes@6.1.1: + resolution: {integrity: sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==} + engines: {node: ^14.13.1 || >=16.0.0} + + primeicons@7.0.0: + resolution: {integrity: sha512-jK3Et9UzwzTsd6tzl2RmwrVY/b8raJ3QZLzoDACj+oTJ0oX7L9Hy+XnVwgo4QVKlKpnP/Ur13SXV/pVh4LzaDw==} + + primevue@4.5.4: + resolution: {integrity: sha512-nTyEohZABFJhVIpeUxgP0EJ8vKcJAhD+Z7DYj95e7ie/MNUCjRNcGjqmE1cXtXi4z54qDfTSI9h2uJ51qz2DIw==} + engines: {node: '>=12.11.0'} + + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + readdirp@4.1.2: + resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} + engines: {node: '>= 14.18.0'} + + remove-accents@0.5.0: + resolution: {integrity: sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + + rfdc@1.4.1: + resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + + rollup@4.56.0: + resolution: {integrity: sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + sass@1.97.3: + resolution: {integrity: sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==} + engines: {node: '>=14.0.0'} + hasBin: true + + shallow-equal@3.1.0: + resolution: {integrity: sha512-pfVOw8QZIXpMbhBWvzBISicvToTiM5WBF1EeAUZDDSb5Dt29yl4AYbyywbJFSEsRUMr7gJaxqCdr4L3tQf9wVg==} + + source-map-js@1.2.1: + resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==} + engines: {node: '>=0.10.0'} + + speakingurl@14.0.1: + resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==} + engines: {node: '>=0.10.0'} + + strnum@1.1.2: + resolution: {integrity: sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==} + + superjson@2.2.6: + resolution: {integrity: sha512-H+ue8Zo4vJmV2nRjpx86P35lzwDT3nItnIsocgumgr0hHMQ+ZGq5vrERg9kJBo5AWGmxZDhzDo+WVIJqkB0cGA==} + engines: {node: '>=16'} + + tinyglobby@0.2.15: + resolution: {integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==} + engines: {node: '>=12.0.0'} + + tslib@2.3.0: + resolution: {integrity: sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==} + + url-join@5.0.0: + resolution: {integrity: sha512-n2huDr9h9yzd6exQVnH/jU5mr+Pfx08LRXXZhkLLetAMESRj+anQsTAh940iMrIetKAmry9coFuZQ2jY8/p3WA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + vanilla-lazyload@19.1.3: + resolution: {integrity: sha512-bBMERPu2AFJc35krS+8BOhq++c6dRfL6q368lJPnkS5U92fRQagTR3FsNta69/GukfZzDwDEjD5M3U7VuSiCDw==} + + vite@7.3.1: + resolution: {integrity: sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@types/node': ^20.19.0 || >=22.12.0 + jiti: '>=1.21.0' + less: ^4.0.0 + lightningcss: ^1.21.0 + sass: ^1.70.0 + sass-embedded: ^1.70.0 + stylus: '>=0.54.8' + sugarss: ^5.0.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + '@types/node': + optional: true + jiti: + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + tsx: + optional: true + yaml: + optional: true + + vue-advanced-cropper@2.8.9: + resolution: {integrity: sha512-1jc5gO674kVGpJKekoaol6ZlwaF5VYDLSBwBOUpViW0IOrrRsyLw6XNszjEqgbavvqinlKNS6Kqlom3B5M72Tw==} + engines: {node: '>=8', npm: '>=5'} + peerDependencies: + vue: ^3.0.0 + + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + + vue-i18n@9.14.5: + resolution: {integrity: sha512-0jQ9Em3ymWngyiIkj0+c/k7WgaPO+TNzjKSNq9BvBQaKJECqn9cd9fL4tkDhB5G1QBskGl9YxxbDAhgbFtpe2g==} + engines: {node: '>= 16'} + deprecated: v9 and v10 no longer supported. please migrate to v11. about maintenance status, see https://vue-i18n.intlify.dev/guide/maintenance.html + peerDependencies: + vue: ^3.0.0 + + vue-router@4.6.4: + resolution: {integrity: sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==} + peerDependencies: + vue: ^3.5.0 + + vue-sonner@2.0.9: + resolution: {integrity: sha512-i6BokNlNDL93fpzNxN/LZSn6D6MzlO+i3qXt6iVZne3x1k7R46d5HlFB4P8tYydhgqOrRbIZEsnRd3kG7qGXyw==} + peerDependencies: + '@nuxt/kit': ^4.0.3 + '@nuxt/schema': ^4.0.3 + nuxt: ^4.0.3 + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@nuxt/schema': + optional: true + nuxt: + optional: true + + vue@3.5.27: + resolution: {integrity: sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + vuefinder@4.0.33: + resolution: {integrity: sha512-WLrZmhIpEgraBt/+WaDfw/ODw+7Th+Oki8LAIO61QAneVho7HthUJATyaLqG0w8Y0nuvpZ/Zz1pXhuj2ercGrw==} + engines: {node: ^20.19.0 || >=22.12.0} + peerDependencies: + vue: ^3.5.22 + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webdav@5.8.0: + resolution: {integrity: sha512-iuFG7NamJ41Oshg4930iQgfIpRrUiatPWIekeznYgEf2EOraTRcDPTjy7gIOMtkdpKTaqPk1E68NO5PAGtJahA==} + engines: {node: '>=14'} + + wildcard@1.1.2: + resolution: {integrity: sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==} + + zrender@6.0.0: + resolution: {integrity: sha512-41dFXEEXuJpNecuUQq6JlbybmnHaqqpGlbH1yxnA5V9MMP4SbohSVZsJIwz+zdjQXSSlR1Vc34EgH1zxyTDvhg==} + +snapshots: + + '@babel/helper-string-parser@7.27.1': {} + + '@babel/helper-validator-identifier@7.28.5': {} + + '@babel/parser@7.28.6': + dependencies: + '@babel/types': 7.28.6 + + '@babel/types@7.28.6': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.28.5 + + '@buttercup/fetch@0.2.1': + optionalDependencies: + node-fetch: 3.3.2 + + '@ctrl/tinycolor@3.6.1': {} + + '@element-plus/icons-vue@2.3.2(vue@3.5.27)': + dependencies: + vue: 3.5.27 + + '@esbuild/aix-ppc64@0.27.2': + optional: true + + '@esbuild/android-arm64@0.27.2': + optional: true + + '@esbuild/android-arm@0.27.2': + optional: true + + '@esbuild/android-x64@0.27.2': + optional: true + + '@esbuild/darwin-arm64@0.27.2': + optional: true + + '@esbuild/darwin-x64@0.27.2': + optional: true + + '@esbuild/freebsd-arm64@0.27.2': + optional: true + + '@esbuild/freebsd-x64@0.27.2': + optional: true + + '@esbuild/linux-arm64@0.27.2': + optional: true + + '@esbuild/linux-arm@0.27.2': + optional: true + + '@esbuild/linux-ia32@0.27.2': + optional: true + + '@esbuild/linux-loong64@0.27.2': + optional: true + + '@esbuild/linux-mips64el@0.27.2': + optional: true + + '@esbuild/linux-ppc64@0.27.2': + optional: true + + '@esbuild/linux-riscv64@0.27.2': + optional: true + + '@esbuild/linux-s390x@0.27.2': + optional: true + + '@esbuild/linux-x64@0.27.2': + optional: true + + '@esbuild/netbsd-arm64@0.27.2': + optional: true + + '@esbuild/netbsd-x64@0.27.2': + optional: true + + '@esbuild/openbsd-arm64@0.27.2': + optional: true + + '@esbuild/openbsd-x64@0.27.2': + optional: true + + '@esbuild/openharmony-arm64@0.27.2': + optional: true + + '@esbuild/sunos-x64@0.27.2': + optional: true + + '@esbuild/win32-arm64@0.27.2': + optional: true + + '@esbuild/win32-ia32@0.27.2': + optional: true + + '@esbuild/win32-x64@0.27.2': + optional: true + + '@floating-ui/core@1.7.3': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.4': + dependencies: + '@floating-ui/core': 1.7.3 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@fortawesome/fontawesome-free@6.7.2': {} + + '@intlify/core-base@9.14.5': + dependencies: + '@intlify/message-compiler': 9.14.5 + '@intlify/shared': 9.14.5 + + '@intlify/message-compiler@9.14.5': + dependencies: + '@intlify/shared': 9.14.5 + source-map-js: 1.2.1 + + '@intlify/shared@9.14.5': {} + + '@jridgewell/sourcemap-codec@1.5.5': {} + + '@nanostores/i18n@1.2.2(nanostores@1.1.0)': + dependencies: + nanostores: 1.1.0 + + '@nanostores/persistent@1.2.0(nanostores@1.1.0)': + dependencies: + nanostores: 1.1.0 + + '@nanostores/vue@1.0.1(@vue/devtools-api@7.7.9)(nanostores@1.1.0)(vue@3.5.27)': + dependencies: + nanostores: 1.1.0 + vue: 3.5.27 + optionalDependencies: + '@vue/devtools-api': 7.7.9 + + '@parcel/watcher-android-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-arm64@2.5.6': + optional: true + + '@parcel/watcher-darwin-x64@2.5.6': + optional: true + + '@parcel/watcher-freebsd-x64@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-arm64-musl@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-glibc@2.5.6': + optional: true + + '@parcel/watcher-linux-x64-musl@2.5.6': + optional: true + + '@parcel/watcher-win32-arm64@2.5.6': + optional: true + + '@parcel/watcher-win32-ia32@2.5.6': + optional: true + + '@parcel/watcher-win32-x64@2.5.6': + optional: true + + '@parcel/watcher@2.5.6': + dependencies: + detect-libc: 2.1.2 + is-glob: 4.0.3 + node-addon-api: 7.1.1 + picomatch: 4.0.3 + optionalDependencies: + '@parcel/watcher-android-arm64': 2.5.6 + '@parcel/watcher-darwin-arm64': 2.5.6 + '@parcel/watcher-darwin-x64': 2.5.6 + '@parcel/watcher-freebsd-x64': 2.5.6 + '@parcel/watcher-linux-arm-glibc': 2.5.6 + '@parcel/watcher-linux-arm-musl': 2.5.6 + '@parcel/watcher-linux-arm64-glibc': 2.5.6 + '@parcel/watcher-linux-arm64-musl': 2.5.6 + '@parcel/watcher-linux-x64-glibc': 2.5.6 + '@parcel/watcher-linux-x64-musl': 2.5.6 + '@parcel/watcher-win32-arm64': 2.5.6 + '@parcel/watcher-win32-ia32': 2.5.6 + '@parcel/watcher-win32-x64': 2.5.6 + optional: true + + '@primeuix/forms@0.1.0': + dependencies: + '@primeuix/utils': 0.6.4 + + '@primeuix/styled@0.7.4': + dependencies: + '@primeuix/utils': 0.6.4 + + '@primeuix/styles@2.0.3': + dependencies: + '@primeuix/styled': 0.7.4 + + '@primeuix/themes@2.0.3': + dependencies: + '@primeuix/styled': 0.7.4 + + '@primeuix/utils@0.6.4': {} + + '@primevue/core@4.5.4(vue@3.5.27)': + dependencies: + '@primeuix/styled': 0.7.4 + '@primeuix/utils': 0.6.4 + vue: 3.5.27 + + '@primevue/forms@4.5.4(vue@3.5.27)': + dependencies: + '@primeuix/forms': 0.1.0 + '@primeuix/utils': 0.6.4 + '@primevue/core': 4.5.4(vue@3.5.27) + transitivePeerDependencies: + - vue + + '@primevue/icons@4.5.4(vue@3.5.27)': + dependencies: + '@primeuix/utils': 0.6.4 + '@primevue/core': 4.5.4(vue@3.5.27) + transitivePeerDependencies: + - vue + + '@rolldown/pluginutils@1.0.0-beta.53': {} + + '@rollup/rollup-android-arm-eabi@4.56.0': + optional: true + + '@rollup/rollup-android-arm64@4.56.0': + optional: true + + '@rollup/rollup-darwin-arm64@4.56.0': + optional: true + + '@rollup/rollup-darwin-x64@4.56.0': + optional: true + + '@rollup/rollup-freebsd-arm64@4.56.0': + optional: true + + '@rollup/rollup-freebsd-x64@4.56.0': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.56.0': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.56.0': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.56.0': + optional: true + + '@rollup/rollup-linux-loong64-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-loong64-musl@4.56.0': + optional: true + + '@rollup/rollup-linux-ppc64-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-ppc64-musl@4.56.0': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-riscv64-musl@4.56.0': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.56.0': + optional: true + + '@rollup/rollup-linux-x64-musl@4.56.0': + optional: true + + '@rollup/rollup-openbsd-x64@4.56.0': + optional: true + + '@rollup/rollup-openharmony-arm64@4.56.0': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.56.0': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.56.0': + optional: true + + '@rollup/rollup-win32-x64-gnu@4.56.0': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.56.0': + optional: true + + '@sxzz/popperjs-es@2.11.7': {} + + '@tanstack/match-sorter-utils@8.19.4': + dependencies: + remove-accents: 0.5.0 + + '@tanstack/query-core@5.90.20': {} + + '@tanstack/vue-query@5.92.9(vue@3.5.27)': + dependencies: + '@tanstack/match-sorter-utils': 8.19.4 + '@tanstack/query-core': 5.90.20 + '@vue/devtools-api': 6.6.4 + vue: 3.5.27 + vue-demi: 0.14.10(vue@3.5.27) + + '@transloadit/prettier-bytes@0.3.5': {} + + '@types/estree@1.0.8': {} + + '@types/lodash-es@4.17.12': + dependencies: + '@types/lodash': 4.17.23 + + '@types/lodash@4.17.23': {} + + '@types/retry@0.12.2': {} + + '@types/web-bluetooth@0.0.20': {} + + '@uppy/companion-client@5.1.1(@uppy/core@5.2.0)': + dependencies: + '@uppy/core': 5.2.0 + '@uppy/utils': 7.1.5 + namespace-emitter: 2.0.1 + p-retry: 6.2.1 + + '@uppy/components@1.1.0(@uppy/core@5.2.0)': + dependencies: + '@uppy/core': 5.2.0 + clsx: 2.1.1 + dequal: 2.0.3 + preact: 10.28.2 + pretty-bytes: 6.1.1 + + '@uppy/core@5.2.0': + dependencies: + '@transloadit/prettier-bytes': 0.3.5 + '@uppy/store-default': 5.0.0 + '@uppy/utils': 7.1.5 + lodash: 4.17.23 + mime-match: 1.0.2 + namespace-emitter: 2.0.1 + nanoid: 5.1.6 + preact: 10.28.2 + + '@uppy/locales@5.1.0': + dependencies: + '@uppy/utils': 7.1.5 + + '@uppy/store-default@5.0.0': {} + + '@uppy/utils@7.1.5': + dependencies: + lodash: 4.17.23 + preact: 10.28.2 + + '@uppy/vue@3.1.0(@uppy/core@5.2.0)(vue@3.5.27)': + dependencies: + '@uppy/components': 1.1.0(@uppy/core@5.2.0) + '@uppy/core': 5.2.0 + preact: 10.28.2 + shallow-equal: 3.1.0 + vue: 3.5.27 + transitivePeerDependencies: + - '@uppy/image-editor' + - '@uppy/screen-capture' + - '@uppy/webcam' + + '@uppy/xhr-upload@5.1.1(@uppy/core@5.2.0)': + dependencies: + '@uppy/companion-client': 5.1.1(@uppy/core@5.2.0) + '@uppy/core': 5.2.0 + '@uppy/utils': 7.1.5 + + '@viselect/vanilla@3.9.0': {} + + '@vitejs/plugin-vue@6.0.3(vite@7.3.1(sass@1.97.3))(vue@3.5.27)': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.53 + vite: 7.3.1(sass@1.97.3) + vue: 3.5.27 + + '@vue/compiler-core@3.5.27': + dependencies: + '@babel/parser': 7.28.6 + '@vue/shared': 3.5.27 + entities: 7.0.1 + estree-walker: 2.0.2 + source-map-js: 1.2.1 + + '@vue/compiler-dom@3.5.27': + dependencies: + '@vue/compiler-core': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/compiler-sfc@3.5.27': + dependencies: + '@babel/parser': 7.28.6 + '@vue/compiler-core': 3.5.27 + '@vue/compiler-dom': 3.5.27 + '@vue/compiler-ssr': 3.5.27 + '@vue/shared': 3.5.27 + estree-walker: 2.0.2 + magic-string: 0.30.21 + postcss: 8.5.6 + source-map-js: 1.2.1 + + '@vue/compiler-ssr@3.5.27': + dependencies: + '@vue/compiler-dom': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/devtools-api@6.6.4': {} + + '@vue/devtools-api@7.7.9': + dependencies: + '@vue/devtools-kit': 7.7.9 + + '@vue/devtools-kit@7.7.9': + dependencies: + '@vue/devtools-shared': 7.7.9 + birpc: 2.9.0 + hookable: 5.5.3 + mitt: 3.0.1 + perfect-debounce: 1.0.0 + speakingurl: 14.0.1 + superjson: 2.2.6 + + '@vue/devtools-shared@7.7.9': + dependencies: + rfdc: 1.4.1 + + '@vue/reactivity@3.5.27': + dependencies: + '@vue/shared': 3.5.27 + + '@vue/runtime-core@3.5.27': + dependencies: + '@vue/reactivity': 3.5.27 + '@vue/shared': 3.5.27 + + '@vue/runtime-dom@3.5.27': + dependencies: + '@vue/reactivity': 3.5.27 + '@vue/runtime-core': 3.5.27 + '@vue/shared': 3.5.27 + csstype: 3.2.3 + + '@vue/server-renderer@3.5.27(vue@3.5.27)': + dependencies: + '@vue/compiler-ssr': 3.5.27 + '@vue/shared': 3.5.27 + vue: 3.5.27 + + '@vue/shared@3.5.27': {} + + '@vueuse/core@10.11.1(vue@3.5.27)': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.27) + vue-demi: 0.14.10(vue@3.5.27) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/shared@10.11.1(vue@3.5.27)': + dependencies: + vue-demi: 0.14.10(vue@3.5.27) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + async-validator@4.2.5: {} + + asynckit@0.4.0: {} + + axios@1.13.3: + dependencies: + follow-redirects: 1.15.11 + form-data: 4.0.5 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + + balanced-match@1.0.2: {} + + base-64@1.0.0: {} + + birpc@2.9.0: {} + + brace-expansion@2.0.2: + dependencies: + balanced-match: 1.0.2 + + byte-length@1.0.2: {} + + call-bind-apply-helpers@1.0.2: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + + charenc@0.0.2: {} + + chokidar@4.0.3: + dependencies: + readdirp: 4.1.2 + + classnames@2.5.1: {} + + clsx@2.1.1: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + copy-anything@4.0.5: + dependencies: + is-what: 5.5.0 + + crypt@0.0.2: {} + + csstype@3.2.3: {} + + data-uri-to-buffer@4.0.1: {} + + dayjs@1.11.19: {} + + debounce@1.2.1: {} + + delayed-stream@1.0.0: {} + + dequal@2.0.3: {} + + detect-libc@2.1.2: + optional: true + + dunder-proto@1.0.1: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-errors: 1.3.0 + gopd: 1.2.0 + + easy-bem@1.1.1: {} + + echarts@6.0.0: + dependencies: + tslib: 2.3.0 + zrender: 6.0.0 + + element-plus@2.13.1(vue@3.5.27): + dependencies: + '@ctrl/tinycolor': 3.6.1 + '@element-plus/icons-vue': 2.3.2(vue@3.5.27) + '@floating-ui/dom': 1.7.4 + '@popperjs/core': '@sxzz/popperjs-es@2.11.7' + '@types/lodash': 4.17.23 + '@types/lodash-es': 4.17.12 + '@vueuse/core': 10.11.1(vue@3.5.27) + async-validator: 4.2.5 + dayjs: 1.11.19 + lodash: 4.17.23 + lodash-es: 4.17.23 + lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.23)(lodash@4.17.23) + memoize-one: 6.0.0 + normalize-wheel-es: 1.2.0 + vue: 3.5.27 + transitivePeerDependencies: + - '@vue/composition-api' + + entities@6.0.1: {} + + entities@7.0.1: {} + + es-define-property@1.0.1: {} + + es-errors@1.3.0: {} + + es-object-atoms@1.1.1: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.1.0: + dependencies: + es-errors: 1.3.0 + get-intrinsic: 1.3.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + esbuild@0.27.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.27.2 + '@esbuild/android-arm': 0.27.2 + '@esbuild/android-arm64': 0.27.2 + '@esbuild/android-x64': 0.27.2 + '@esbuild/darwin-arm64': 0.27.2 + '@esbuild/darwin-x64': 0.27.2 + '@esbuild/freebsd-arm64': 0.27.2 + '@esbuild/freebsd-x64': 0.27.2 + '@esbuild/linux-arm': 0.27.2 + '@esbuild/linux-arm64': 0.27.2 + '@esbuild/linux-ia32': 0.27.2 + '@esbuild/linux-loong64': 0.27.2 + '@esbuild/linux-mips64el': 0.27.2 + '@esbuild/linux-ppc64': 0.27.2 + '@esbuild/linux-riscv64': 0.27.2 + '@esbuild/linux-s390x': 0.27.2 + '@esbuild/linux-x64': 0.27.2 + '@esbuild/netbsd-arm64': 0.27.2 + '@esbuild/netbsd-x64': 0.27.2 + '@esbuild/openbsd-arm64': 0.27.2 + '@esbuild/openbsd-x64': 0.27.2 + '@esbuild/openharmony-arm64': 0.27.2 + '@esbuild/sunos-x64': 0.27.2 + '@esbuild/win32-arm64': 0.27.2 + '@esbuild/win32-ia32': 0.27.2 + '@esbuild/win32-x64': 0.27.2 + + estree-walker@2.0.2: {} + + fast-xml-parser@4.5.3: + dependencies: + strnum: 1.1.2 + + fdir@6.5.0(picomatch@4.0.3): + optionalDependencies: + picomatch: 4.0.3 + + fetch-blob@3.2.0: + dependencies: + node-domexception: 1.0.0 + web-streams-polyfill: 3.3.3 + + follow-redirects@1.15.11: {} + + form-data@4.0.5: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + es-set-tostringtag: 2.1.0 + hasown: 2.0.2 + mime-types: 2.1.35 + + formdata-polyfill@4.0.10: + dependencies: + fetch-blob: 3.2.0 + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + get-intrinsic@1.3.0: + dependencies: + call-bind-apply-helpers: 1.0.2 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + function-bind: 1.1.2 + get-proto: 1.0.1 + gopd: 1.2.0 + has-symbols: 1.1.0 + hasown: 2.0.2 + math-intrinsics: 1.1.0 + + get-proto@1.0.1: + dependencies: + dunder-proto: 1.0.1 + es-object-atoms: 1.1.1 + + gopd@1.2.0: {} + + has-symbols@1.1.0: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.1.0 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hookable@5.5.3: {} + + hot-patcher@2.0.1: {} + + immutable@5.1.4: {} + + is-buffer@1.1.6: {} + + is-extglob@2.1.1: + optional: true + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + optional: true + + is-network-error@1.3.0: {} + + is-what@5.5.0: {} + + layerr@3.0.0: {} + + lodash-es@4.17.23: {} + + lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.23)(lodash@4.17.23): + dependencies: + '@types/lodash-es': 4.17.12 + lodash: 4.17.23 + lodash-es: 4.17.23 + + lodash@4.17.23: {} + + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + math-intrinsics@1.1.0: {} + + md5@2.3.0: + dependencies: + charenc: 0.0.2 + crypt: 0.0.2 + is-buffer: 1.1.6 + + memoize-one@6.0.0: {} + + mime-db@1.52.0: {} + + mime-match@1.0.2: + dependencies: + wildcard: 1.1.2 + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + minimatch@9.0.5: + dependencies: + brace-expansion: 2.0.2 + + mitt@3.0.1: {} + + namespace-emitter@2.0.1: {} + + nanoid@3.3.11: {} + + nanoid@5.1.6: {} + + nanostores@1.1.0: {} + + nested-property@4.0.0: {} + + node-addon-api@7.1.1: + optional: true + + node-domexception@1.0.0: {} + + node-fetch@3.3.2: + dependencies: + data-uri-to-buffer: 4.0.1 + fetch-blob: 3.2.0 + formdata-polyfill: 4.0.10 + + normalize-wheel-es@1.2.0: {} + + nprogress@0.2.0: {} + + overlayscrollbars@2.13.0: {} + + p-retry@6.2.1: + dependencies: + '@types/retry': 0.12.2 + is-network-error: 1.3.0 + retry: 0.13.1 + + path-posix@1.0.0: {} + + perfect-debounce@1.0.0: {} + + picocolors@1.1.1: {} + + picomatch@4.0.3: {} + + pinia@3.0.4(vue@3.5.27): + dependencies: + '@vue/devtools-api': 7.7.9 + vue: 3.5.27 + + postcss@8.5.6: + dependencies: + nanoid: 3.3.11 + picocolors: 1.1.1 + source-map-js: 1.2.1 + + preact@10.28.2: {} + + pretty-bytes@6.1.1: {} + + primeicons@7.0.0: {} + + primevue@4.5.4(vue@3.5.27): + dependencies: + '@primeuix/styled': 0.7.4 + '@primeuix/styles': 2.0.3 + '@primeuix/utils': 0.6.4 + '@primevue/core': 4.5.4(vue@3.5.27) + '@primevue/icons': 4.5.4(vue@3.5.27) + transitivePeerDependencies: + - vue + + proxy-from-env@1.1.0: {} + + querystringify@2.2.0: {} + + readdirp@4.1.2: {} + + remove-accents@0.5.0: {} + + requires-port@1.0.0: {} + + retry@0.13.1: {} + + rfdc@1.4.1: {} + + rollup@4.56.0: + dependencies: + '@types/estree': 1.0.8 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.56.0 + '@rollup/rollup-android-arm64': 4.56.0 + '@rollup/rollup-darwin-arm64': 4.56.0 + '@rollup/rollup-darwin-x64': 4.56.0 + '@rollup/rollup-freebsd-arm64': 4.56.0 + '@rollup/rollup-freebsd-x64': 4.56.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.56.0 + '@rollup/rollup-linux-arm-musleabihf': 4.56.0 + '@rollup/rollup-linux-arm64-gnu': 4.56.0 + '@rollup/rollup-linux-arm64-musl': 4.56.0 + '@rollup/rollup-linux-loong64-gnu': 4.56.0 + '@rollup/rollup-linux-loong64-musl': 4.56.0 + '@rollup/rollup-linux-ppc64-gnu': 4.56.0 + '@rollup/rollup-linux-ppc64-musl': 4.56.0 + '@rollup/rollup-linux-riscv64-gnu': 4.56.0 + '@rollup/rollup-linux-riscv64-musl': 4.56.0 + '@rollup/rollup-linux-s390x-gnu': 4.56.0 + '@rollup/rollup-linux-x64-gnu': 4.56.0 + '@rollup/rollup-linux-x64-musl': 4.56.0 + '@rollup/rollup-openbsd-x64': 4.56.0 + '@rollup/rollup-openharmony-arm64': 4.56.0 + '@rollup/rollup-win32-arm64-msvc': 4.56.0 + '@rollup/rollup-win32-ia32-msvc': 4.56.0 + '@rollup/rollup-win32-x64-gnu': 4.56.0 + '@rollup/rollup-win32-x64-msvc': 4.56.0 + fsevents: 2.3.3 + + sass@1.97.3: + dependencies: + chokidar: 4.0.3 + immutable: 5.1.4 + source-map-js: 1.2.1 + optionalDependencies: + '@parcel/watcher': 2.5.6 + + shallow-equal@3.1.0: {} + + source-map-js@1.2.1: {} + + speakingurl@14.0.1: {} + + strnum@1.1.2: {} + + superjson@2.2.6: + dependencies: + copy-anything: 4.0.5 + + tinyglobby@0.2.15: + dependencies: + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + + tslib@2.3.0: {} + + url-join@5.0.0: {} + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + vanilla-lazyload@19.1.3: {} + + vite@7.3.1(sass@1.97.3): + dependencies: + esbuild: 0.27.2 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.56.0 + tinyglobby: 0.2.15 + optionalDependencies: + fsevents: 2.3.3 + sass: 1.97.3 + + vue-advanced-cropper@2.8.9(vue@3.5.27): + dependencies: + classnames: 2.5.1 + debounce: 1.2.1 + easy-bem: 1.1.1 + vue: 3.5.27 + + vue-demi@0.14.10(vue@3.5.27): + dependencies: + vue: 3.5.27 + + vue-i18n@9.14.5(vue@3.5.27): + dependencies: + '@intlify/core-base': 9.14.5 + '@intlify/shared': 9.14.5 + '@vue/devtools-api': 6.6.4 + vue: 3.5.27 + + vue-router@4.6.4(vue@3.5.27): + dependencies: + '@vue/devtools-api': 6.6.4 + vue: 3.5.27 + + vue-sonner@2.0.9: {} + + vue@3.5.27: + dependencies: + '@vue/compiler-dom': 3.5.27 + '@vue/compiler-sfc': 3.5.27 + '@vue/runtime-dom': 3.5.27 + '@vue/server-renderer': 3.5.27(vue@3.5.27) + '@vue/shared': 3.5.27 + + vuefinder@4.0.33(@vue/devtools-api@7.7.9)(vue@3.5.27): + dependencies: + '@floating-ui/dom': 1.7.4 + '@nanostores/i18n': 1.2.2(nanostores@1.1.0) + '@nanostores/persistent': 1.2.0(nanostores@1.1.0) + '@nanostores/vue': 1.0.1(@vue/devtools-api@7.7.9)(nanostores@1.1.0)(vue@3.5.27) + '@tanstack/vue-query': 5.92.9(vue@3.5.27) + '@uppy/core': 5.2.0 + '@uppy/locales': 5.1.0 + '@uppy/vue': 3.1.0(@uppy/core@5.2.0)(vue@3.5.27) + '@uppy/xhr-upload': 5.1.1(@uppy/core@5.2.0) + '@viselect/vanilla': 3.9.0 + mitt: 3.0.1 + nanostores: 1.1.0 + overlayscrollbars: 2.13.0 + vanilla-lazyload: 19.1.3 + vue: 3.5.27 + vue-advanced-cropper: 2.8.9(vue@3.5.27) + vue-sonner: 2.0.9 + transitivePeerDependencies: + - '@nanostores/logger' + - '@nuxt/kit' + - '@nuxt/schema' + - '@uppy/dashboard' + - '@uppy/image-editor' + - '@uppy/screen-capture' + - '@uppy/status-bar' + - '@uppy/webcam' + - '@vue/composition-api' + - '@vue/devtools-api' + - nuxt + + web-streams-polyfill@3.3.3: {} + + webdav@5.8.0: + dependencies: + '@buttercup/fetch': 0.2.1 + base-64: 1.0.0 + byte-length: 1.0.2 + entities: 6.0.1 + fast-xml-parser: 4.5.3 + hot-patcher: 2.0.1 + layerr: 3.0.0 + md5: 2.3.0 + minimatch: 9.0.5 + nested-property: 4.0.0 + node-fetch: 3.3.2 + path-posix: 1.0.0 + url-join: 5.0.0 + url-parse: 1.5.10 + + wildcard@1.1.2: {} + + zrender@6.0.0: + dependencies: + tslib: 2.3.0 diff --git a/web/role_export.xlsx b/web/role_export.xlsx new file mode 100644 index 0000000..5ef59a2 Binary files /dev/null and b/web/role_export.xlsx differ diff --git a/web/src/.env.development b/web/src/.env.development new file mode 100644 index 0000000..89b083c --- /dev/null +++ b/web/src/.env.development @@ -0,0 +1 @@ +VITE_RFID_API_BASE_URL="http://localhost:5176/api/" diff --git a/web/src/.env.example b/web/src/.env.example new file mode 100644 index 0000000..4b57601 --- /dev/null +++ b/web/src/.env.example @@ -0,0 +1 @@ +VITE_ALARMHUB_API_BASE_URL=http://127.0.0.1:8005/api diff --git a/web/src/.env.production b/web/src/.env.production new file mode 100644 index 0000000..bd09ccb --- /dev/null +++ b/web/src/.env.production @@ -0,0 +1 @@ +VITE_ALARMHUB_API_BASE_URL=https://crm.whblueocean.cn/api/ diff --git a/web/src/App.vue b/web/src/App.vue new file mode 100644 index 0000000..6ac6ea7 --- /dev/null +++ b/web/src/App.vue @@ -0,0 +1,128 @@ + + + + + + + \ No newline at end of file diff --git a/web/src/api/asset/accessalarm.js b/web/src/api/asset/accessalarm.js new file mode 100644 index 0000000..b2c0767 --- /dev/null +++ b/web/src/api/asset/accessalarm.js @@ -0,0 +1,54 @@ +// +import request from '../../utils/request' +// // 获取门禁报警记录 +export function getTablist(data) { + return request( + { + url: "/access_control_alarm_record/list", + method: 'post', + data + }) +} +// 删除门禁报警记录 +export function delTablist(data) { + return request({ + url: "/access_control_alarm_record/delete", + method: 'delete', + data + }); +} + +// 门禁报警记录导出数据 +export function exportAccess(data) { + return request({ + url: "/access_control_alarm_record/export", + method: 'post', + data, + responseType: 'blob' + }); +} +/** + * 流式导出资产台账数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportAssetStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/access_control_alarm_record/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} diff --git a/web/src/api/asset/assetacontrol.js b/web/src/api/asset/assetacontrol.js new file mode 100644 index 0000000..b903e35 --- /dev/null +++ b/web/src/api/asset/assetacontrol.js @@ -0,0 +1,62 @@ +// +import request from '../../utils/request' +// 获取门禁权限列表 +export function getTablist(data) { + return request( + { + url: "/access_control/list", + method: 'post', + data + }) +} +// 创建门禁权限 +export function addTablist(data) { + return request( + { + url: "/access_control/create", + method: 'post', + data + }) +} + + +// 更新门禁权限 +export function updateTablist(data) { + return request( + { + url: "/access_control/update" , + method: 'put', + data + }) +} + +// 删除门禁权限 +export function delTablist(data) { + return request({ + url: "/access_control/delete", + method: 'delete', + data + }); +} + +// 获取门禁关联的信息机列表(根据列表id) +export function getInformationTablist(data) { + return request( + { + url: "/access_control/information_machine/list", + method: 'post', + data + }) +} + +// 获取信息机对应的门禁权限 +export function getMachineControl(data) { + return request( + { + url: "/information_machine/access_control/list", + method: 'post', + data + }) +} + + diff --git a/web/src/api/asset/assetinwentory.js b/web/src/api/asset/assetinwentory.js new file mode 100644 index 0000000..231c1d4 --- /dev/null +++ b/web/src/api/asset/assetinwentory.js @@ -0,0 +1,48 @@ +// +import request from '../../utils/request' +// 获取盘点数据列表 +export function getTablist(data) { + return request( + { + url: "/asset_inventory/list", + method: 'post', + data + }) +} + +// 获取盘点历史数据列表(根据列表id) +export function getHistoryTablist(data) { + return request( + { + url: "/asset_inventory_history/list", + method: 'post', + data + }) +} +// 手动盘点(无参数) +export function manualInventory() { + return request( + { + url: "/asset_inventory/inventory", + method: 'post', + }) +} +// 主动盘点导出总表(可选传 ids 数组,不传则导出全部) +export function exportInventory(data) { + return request({ + url: "/asset_inventory/export", + method: 'post', + data, + responseType: 'blob' + }); +} + +// 点击弹框里面的导出数据(ids页面的数据[],asset_inventory_type number 1,2,3,4 ,其他的参数和初始化列表一致) +export function exportInventoryHistory(data) { + return request({ + url: "/asset_inventory_history/export", + method: 'post', + data, + responseType: 'blob' + }); +} diff --git a/web/src/api/asset/assetlist.js b/web/src/api/asset/assetlist.js new file mode 100644 index 0000000..f86e4a8 --- /dev/null +++ b/web/src/api/asset/assetlist.js @@ -0,0 +1,151 @@ +// +import request from '../../utils/request' +// // 获取台账 +export function getTablist(data) { + return request( + { + url: "/asset_ledger/list", + method: 'post', + data + }) +} + +// 创建台账 +export function addTablist(data) { + return request( + { + url: "/asset_ledger/create", + method: 'post', + data + }) +} + + +// 更新台账 +export function updateTablist(data) { + return request( + { + url: "/asset_ledger/update" , + method: 'put', + data + }) +} + +// 删除台账 +export function delTablist(data) { + return request({ + url: "/asset_ledger/delete", + method: 'delete', + data + }); +} + +// 批量更新资产台账 +export function batchUpdateAsset(data) { + return request({ + url: "/asset_ledger/batch_update", + method: 'post', + data + }); +} + +// 获取信息机对应的门禁权限 +export function getMachineControl(data) { + return request({ + url: "/information_machine/access_control/list", + method: 'post', + data, + }); +} +// 保存信息机对应的门禁权限 +export function saveMachineControl(data) { + return request({ + url: "/asset_ledger/access_control/create", + method: 'post', + data, + }); +} +// 下载资产台账导入模板(无参数,返回 blob) +export function getAssetTemplate() { + return request({ + url: "/asset_ledger/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出资产台账数据,参数:{ search, filter, ids? },返回 blob(一次性) +export function exportAsset(data) { + return request({ + url: "/asset_ledger/export", + method: 'post', + data, + responseType: 'blob' + }) +} + +/** + * 流式导出资产台账数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportAssetStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/asset_ledger/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} + + +/** + * 上传文件(解析模板):传入 FormData(包含 file 字段),成功返回 { filename, import_type } + */ +export function uploadAsset(formData) { + return request({ + url: "/asset_ledger/upload", + method: 'post', + data: formData, + }); +} + + +/** + * 导入文件 参数filename和import_type(add,update) + */ +export function importAsset(data) { + return request({ + url: "/asset_ledger/import", + method: 'post', + data + }); +} + + +/** + * 下载错误信息,参数 { filename },返回 blob 文件流 + */ +export function downloadErrorAsset(data) { + return request({ + url: "/import/error_file/download", + method: 'post', + data, + responseType: 'blob', + }); +} + + + diff --git a/web/src/api/asset/attachmentApi.js b/web/src/api/asset/attachmentApi.js new file mode 100644 index 0000000..a7af043 --- /dev/null +++ b/web/src/api/asset/attachmentApi.js @@ -0,0 +1,522 @@ +// 附件管理 API +import request from '../../utils/request' +import { parseWebDAVXML } from './webdavDriver' +import attachmentRequest from '../../utils/attachmentRequest' +import { getApiBaseUrl } from '../../utils/config' + +// 获取文件列表 +export async function getFileList(path = '') { + try { + // 构建路径,确保 URL 格式为 webdav/ 或 webdav/path/ + let normalizedPath = path || '' + if (normalizedPath.startsWith('/')) { + normalizedPath = normalizedPath.substring(1) + } + + const url = normalizedPath ? `/webdav/${normalizedPath}${normalizedPath.endsWith('/') ? '' : '/'}` : '/webdav/' + + // console.log('getFileList 请求:', { url, path, normalizedPath }) + + // 发送 PROPFIND 请求 + const response = await request({ + url: url, + method: 'PROPFIND', + headers: { + 'Depth': '1' + } + }) + + // 检查响应类型 + if (typeof response !== 'string') { + console.error('getFileList: 响应不是字符串类型', typeof response, response) + throw new Error('服务器返回的响应格式不正确,期望 XML 字符串') + } + + // 记录响应信息用于调试 + // console.log('getFileList 响应类型:', typeof response, '响应长度:', response.length) + if (response.length > 0) { + // console.log('getFileList 响应预览:', response.substring(0, Math.min(500, response.length))) + } + + // 解析 XML 响应 + const fileList = parseWebDAVXML(response) + + // console.log('getFileList 解析成功,文件数量:', fileList.length) + + // 转换为显示格式 + return fileList.map(file => ({ + name: file.name, + path: file.path, + size: file.size || 0, + isDirectory: file.isDirectory, + modified: file.lastModified + })) + } catch (error) { + console.error('获取文件列表失败:', { + error: error.message, + stack: error.stack, + path: path + }) + throw error + } +} + +// 格式化文件大小 +export function formatFileSize(bytes) { + if (!bytes || bytes === 0) return '0 B' + const k = 1024 + const sizes = ['B', 'KB', 'MB', 'GB', 'TB'] + const i = Math.floor(Math.log(bytes) / Math.log(k)) + return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i] +} + +// 格式化日期 +export function formatDate(dateString) { + if (!dateString) return '-' + try { + const date = new Date(dateString) + const year = date.getFullYear() + const month = String(date.getMonth() + 1).padStart(2, '0') + const day = String(date.getDate()).padStart(2, '0') + const hours = String(date.getHours()).padStart(2, '0') + const minutes = String(date.getMinutes()).padStart(2, '0') + return `${year}/${month}/${day} ${hours}:${minutes}` + } catch (error) { + return '-' + } +} + +// 获取文件类型 +export function getFileType(fileName, isDirectory) { + if (isDirectory) { + return '文件夹' + } + + const ext = fileName.split('.').pop()?.toLowerCase() || '' + const typeMap = { + 'pdf': 'PDF 文档', + 'doc': 'Word 文档', + 'docx': 'Word 文档', + 'xls': 'Excel 文档', + 'xlsx': 'Excel 文档', + 'ppt': 'PowerPoint 文档', + 'pptx': 'PowerPoint 文档', + 'txt': '文本文档', + 'json': 'JSON 源文件', + 'js': 'JavaScript 源文件', + 'ts': 'TypeScript 源文件', + 'vue': 'Vue 源文件', + 'html': 'HTML 文档', + 'css': 'CSS 样式表', + 'jpg': 'JPEG 图像', + 'jpeg': 'JPEG 图像', + 'png': 'PNG 图像', + 'gif': 'GIF 图像', + 'zip': 'ZIP 压缩文件', + 'rar': 'RAR 压缩文件', + '7z': '7Z 压缩文件', + 'lnk': '快捷方式', + 'exe': '可执行文件', + } + + return typeMap[ext] || '文件' +} + +// 创建文件夹 +export async function createFolder(path, folderName) { + try { + const normalizedPath = path ? `${path}/${folderName}` : folderName + const url = `/webdav/${normalizedPath}/` + return await request({ + url: url, + method: 'MKCOL' + }) + } catch (error) { + console.error('创建文件夹失败:', error) + throw error + } +} + +// 删除文件/文件夹 +export async function deleteFile(path) { + try { + const normalizedPath = path.startsWith('/') ? path.substring(1) : path + const url = `/webdav/${normalizedPath}` + return await request({ + url: url, + method: 'DELETE' + }) + } catch (error) { + console.error('删除文件失败:', error) + throw error + } +} + +// 重命名文件/文件夹 +export async function renameFile(oldPath, newName) { + try { + const oldNormalizedPath = oldPath.startsWith('/') ? oldPath.substring(1) : oldPath + const pathParts = oldNormalizedPath.split('/') + pathParts[pathParts.length - 1] = newName + const newPath = pathParts.join('/') + + // 对新路径进行 URL 编码(对每个路径段分别编码,保留斜杠) + const encodedNewPath = newPath + .split('/') + .map(segment => encodeURIComponent(segment)) + .join('/') + + return await request({ + url: `/webdav/${oldNormalizedPath}`, + method: 'MOVE', + headers: { + 'Destination': `/webdav/${encodedNewPath}` + } + }) + } catch (error) { + console.error('重命名文件失败:', error) + throw error + } +} + +// 上传文件 +export async function uploadFile(path, file, onProgress, signal = null) { + try { + const normalizedPath = path ? `${path}/${file.name}` : file.name + // 确保路径正确编码,避免特殊字符问题 + const encodedPath = normalizedPath + .split('/') + .map(segment => encodeURIComponent(segment)) + .join('/') + const url = `/webdav/${encodedPath}` + + // console.log('上传文件:', { + // fileName: file.name, + // fileSize: file.size, + // fileType: file.type, + // url: url, + // method: 'PUT' + // }) + + // 使用 attachmentRequest 发送 PUT 请求 + const response = await attachmentRequest({ + url: url, + method: 'PUT', + data: file, + headers: { + 'Content-Type': file.type || 'application/octet-stream' + }, + signal: signal, // 支持取消请求 + onUploadProgress: (progressEvent) => { + if (onProgress && progressEvent.total) { + const percentCompleted = Math.round((progressEvent.loaded * 100) / progressEvent.total) + onProgress(percentCompleted, progressEvent.loaded, progressEvent.total) + } + } + }) + + return response + } catch (error) { + console.error('上传文件失败:', error) + throw error + } +} + +// 下载文件 +export async function downloadFile(path, fileName) { + try { + const normalizedPath = path.startsWith('/') ? path.substring(1) : path + const url = `/webdav/${normalizedPath}` + let baseURL = getApiBaseUrl() || '' + if (baseURL) { + baseURL = baseURL.replace(/\/+$/, '') + } + + // 使用 attachmentRequest 下载文件 + const response = await attachmentRequest({ + url: url, + method: 'GET', + responseType: 'blob', + baseURL: baseURL + }) + + // 创建 blob URL + const blob = new Blob([response.data]) + const blobUrl = window.URL.createObjectURL(blob) + + // 创建下载链接并触发下载 + const link = document.createElement('a') + link.href = blobUrl + link.download = fileName || normalizedPath.split('/').pop() + document.body.appendChild(link) + link.click() + + // 清理 + document.body.removeChild(link) + window.URL.revokeObjectURL(blobUrl) + + return response + } catch (error) { + console.error('下载文件失败:', error) + throw error + } +} + +// 批量下载文件 +export async function batchDownloadFiles(paths) { + try { + // 获取 baseURL + let baseURL = getApiBaseUrl() || '' + if (baseURL) { + baseURL = baseURL.replace(/\/+$/, '') + } + const url = `/webdav/download/files` + // const url = "http://192.168.100.53:8007/downloads/files" + + // 规范化路径:确保路径格式正确(移除开头的 /,如果需要的话) + const normalizedPaths = paths.map(path => { + // 如果路径以 / 开头,移除它(根据 curl 示例,路径可能是 "/filea66" 或 "foldb") + return path.startsWith('/') ? path.substring(1) : path + }) + + // console.log('批量下载请求:', { url, baseURL, paths: normalizedPaths }) + + // 使用 attachmentRequest 批量下载 + // 批量下载需要完整的 baseURL,通过 config.baseURL 传递 + const response = await attachmentRequest({ + url: url, + method: 'POST', + responseType: 'blob', + baseURL: baseURL, // 显式设置 baseURL,避免拦截器设置为空 + data: { + paths: normalizedPaths // 使用 paths 而不是 files + }, + headers: { + 'Content-Type': 'application/json' + } + }) + + // 打印响应头用于调试 + // console.log('响应头:', response.headers) + const contentType = response.headers['content-type'] || response.headers['Content-Type'] || '' + // console.log('Content-Type:', contentType) + + // 检查响应是否是 JSON 错误(Content-Type 为 application/json) + if (contentType.includes('application/json')) { + // 如果是 JSON 响应,可能是错误信息,尝试解析 + const text = await new Promise((resolve, reject) => { + const reader = new FileReader() + reader.onload = () => resolve(reader.result) + reader.onerror = reject + reader.readAsText(response.data) + }) + console.error('服务器返回 JSON 响应(可能是错误):', text) + try { + const errorData = JSON.parse(text) + throw new Error(errorData.message || errorData.error || errorData.msg || '批量下载失败') + } catch (e) { + if (e instanceof SyntaxError) { + throw new Error('服务器返回了错误响应: ' + text) + } + throw e + } + } + + // 从响应头中提取文件名 + let fileName = `批量下载_${new Date().getTime()}.zip` // 默认文件名 + const contentDisposition = response.headers['content-disposition'] || response.headers['Content-Disposition'] + // console.log('Content-Disposition:', contentDisposition) + + if (contentDisposition) { + // 解析 Content-Disposition 头,提取 filename + // 格式可能是: attachment; filename="files_1767671278.zip" 或 attachment; filename=files_1767671278.zip + const filenameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/) + if (filenameMatch && filenameMatch[1]) { + // 移除引号(如果有) + fileName = filenameMatch[1].replace(/['"]/g, '') + // 处理 URL 编码的文件名(如果有) + try { + fileName = decodeURIComponent(fileName) + } catch (e) { + // 如果解码失败,使用原始值 + } + // console.log('从响应头提取的文件名:', fileName) + } + } else { + console.warn('响应头中没有 Content-Disposition,使用默认文件名') + } + + // 创建 blob + const blob = new Blob([response.data]) + const blobUrl = window.URL.createObjectURL(blob) + + // 创建下载链接并触发下载 + const link = document.createElement('a') + link.href = blobUrl + link.download = fileName + document.body.appendChild(link) + link.click() + + // 清理 + document.body.removeChild(link) + window.URL.revokeObjectURL(blobUrl) + + return response + } catch (error) { + console.error('批量下载文件失败:', error) + throw error + } +} + +// 复制文件/文件夹 +export async function copyFileOrFolder(sourcePath, targetPath) { + try { + // 规范化源路径 + const normalizedSourcePath = sourcePath.startsWith('/') ? sourcePath.substring(1) : sourcePath + // 规范化目标路径 + const normalizedTargetPath = targetPath.startsWith('/') ? targetPath.substring(1) : targetPath + + // 对目标路径进行 URL 编码(对每个路径段分别编码,保留斜杠) + const encodedTargetPath = normalizedTargetPath + .split('/') + .map(segment => encodeURIComponent(segment)) + .join('/') + + return await request({ + url: `/webdav/${normalizedSourcePath}`, + method: 'COPY', + headers: { + 'Destination': `/webdav/${encodedTargetPath}` + } + }) + } catch (error) { + console.error('复制文件/文件夹失败:', error) + throw error + } +} + +// 移动 拖拽文件/文件夹 +export async function moveFileOrFolder(sourcePath, targetPath) { + try { + // 规范化源路径 + const normalizedSourcePath = sourcePath.startsWith('/') ? sourcePath.substring(1) : sourcePath + // 规范化目标路径 + const normalizedTargetPath = targetPath.startsWith('/') ? targetPath.substring(1) : targetPath + + // 对目标路径进行 URL 编码(对每个路径段分别编码,保留斜杠) + const encodedTargetPath = normalizedTargetPath + .split('/') + .map(segment => encodeURIComponent(segment)) + .join('/') + + // 使用 MOVE 方法进行移动操作(WebDAV 标准) + return await request({ + url: `/webdav/${normalizedSourcePath}`, + method: 'MOVE', + headers: { + 'Destination': `/webdav/${encodedTargetPath}` + } + }) + } catch (error) { + console.error('移动文件/文件夹失败:', error) + throw error + } +} + +// 复制文件夹(保留向后兼容) +export async function copyFolder(path, folderName) { + try { + const normalizedPath = path ? `${path}/${folderName}` : folderName + const url = `/webdav/${normalizedPath}/` + return await request({ + url: url, + method: 'MOVE' + }) + } catch (error) { + console.error('复制文件夹失败:', error) + throw error + } +} + +// 获取回收站文件列表 +export async function getRecycleBinList(path = '') { + try { + let normalizedPath = path || '' + if (normalizedPath.startsWith('/')) { + normalizedPath = normalizedPath.substring(1) + } + + const url = normalizedPath ? `/trash/${normalizedPath}${normalizedPath.endsWith('/') ? '' : '/'}` : '/trash/' + // 发送 PROPFIND 请求 + const response = await request({ + url: url, + method: 'PROPFIND', + headers: { + 'Depth': '1' + } + }) + + // 检查响应类型 + if (typeof response !== 'string') { + console.error('getFileList: 响应不是字符串类型', typeof response, response) + throw new Error('服务器返回的响应格式不正确,期望 XML 字符串') + } + + // 记录响应信息用于调试 + if (response.length > 0) { + // console.log('getFileList 响应预览:', response.substring(0, Math.min(500, response.length))) + } + + // 解析 XML 响应 + const fileList = parseWebDAVXML(response) + + + // 转换为显示格式 + return fileList.map(file => ({ + name: file.name, + path: file.path, + size: file.size || 0, + isDirectory: file.isDirectory, + modified: file.lastModified + })) + } catch (error) { + console.error('获取回收站列表失败:', { + error: error.message, + stack: error.stack, + path: path + }) + throw error + } +} +// 还原回收站文件(支持单个路径或路径数组) +export async function restoreRecycleBinFile(paths) { + try { + // 支持单个路径字符串或路径数组 + const pathsArray = Array.isArray(paths) ? paths : [paths] + const response = await request({ + url: '/trash/', + method: 'POST', + data: { + paths: pathsArray + } + }) + return response + } catch (error) { + console.error('还原回收站文件失败:', error) + throw error + } +} +// 删除回收站文件/文件夹 +export async function deleteRecycleBinFile(path) { + try { + const normalizedPath = path.startsWith('/') ? path.substring(1) : path + const url = `/trash/${normalizedPath}` + return await request({ + url: url, + method: 'DELETE' + }) + } catch (error) { + console.error('删除回收站文件失败:', error) + throw error + } +} \ No newline at end of file diff --git a/web/src/api/asset/attachmentmanage.js b/web/src/api/asset/attachmentmanage.js new file mode 100644 index 0000000..0462753 --- /dev/null +++ b/web/src/api/asset/attachmentmanage.js @@ -0,0 +1,52 @@ +// +import request from '../../utils/request' +import { getApiBaseUrl } from '../../utils/config' + +// 获取文件列表(WebDAV PROPFIND) +export function getFileList(path = '') { + return request({ + url: `/webdav/${path}`, + method: 'PROPFIND', + headers: { + 'Depth': '1' + } + }) +} + +// 创建文件夹(WebDAV MKCOL) +export function createFolder(path, folderName) { + return request({ + url: `/webdav/${path}${folderName}/`, + method: 'MKCOL' + }) +} + +// 删除文件或文件夹(WebDAV DELETE) +export function deleteFile(path) { + return request({ + url: `/webdav/${path}`, + method: 'DELETE' + }) +} + +// 下载文件(GET) +export function downloadFile(path) { + const baseURL = getApiBaseUrl() || '' + const token = localStorage.getItem('token') + const uid = localStorage.getItem('uid') + + return `${baseURL}/webdav/${path}?token=${token}&uid=${uid}` +} + +// 上传文件(PUT) +export function uploadFile(path, file) { + return request({ + url: `/webdav/${path}${file.name}`, + method: 'PUT', + data: file, + headers: { + 'Content-Type': file.type || 'application/octet-stream' + } + }) +} + diff --git a/web/src/api/asset/devicehistory.js b/web/src/api/asset/devicehistory.js new file mode 100644 index 0000000..405c72d --- /dev/null +++ b/web/src/api/asset/devicehistory.js @@ -0,0 +1,42 @@ +// +import request from '../../utils/request' +// // 获取设备维护历史 +export function getTablist(data) { + return request( + { + url: "/equipment_maintenance_history/list", + method: 'post', + data + }) +} + +// 创建设备维护历史 +export function addTablist(data) { + return request( + { + url: "/equipment_maintenance_history/create", + method: 'post', + data + }) +} + + +// 更新设备维护历史 +export function updateTablist(data) { + return request( + { + url: "/equipment_maintenance_history/update" , + method: 'put', + data + }) +} + +// 删除设备维护历史 +export function delTablist(data) { + return request({ + url: "/equipment_maintenance_history/delete", + method: 'delete', + data + }); +} + diff --git a/web/src/api/asset/devicemaintain.js b/web/src/api/asset/devicemaintain.js new file mode 100644 index 0000000..7135286 --- /dev/null +++ b/web/src/api/asset/devicemaintain.js @@ -0,0 +1,123 @@ +// +import request from '../../utils/request' +// // 获取设备维护计划 +export function getTablist(data) { + return request( + { + url: "/equipment_maintenance_schedule/list", + method: 'post', + data + }) +} + +// 创建设备维护计划 +export function addTablist(data) { + return request( + { + url: "/equipment_maintenance_schedule/create", + method: 'post', + data + }) +} + + +// 更新设备维护计划 +export function updateTablist(data) { + return request( + { + url: "/equipment_maintenance_schedule/update" , + method: 'put', + data + }) +} + +// 删除设备维护计划 +export function delTablist(data) { + return request({ + url: "/equipment_maintenance_schedule/delete", + method: 'delete', + data + }); +} +// 获取设备维护邮件初始化状态 +export function remarkTablist(data) { + return request( + { + url: "/equipment_maintenance_schedule/email_alert/info" , + method: 'post', + data + }) +} +// 更新设备维护邮件提醒状态(true或者false) +export function emailupDate(data) { + return request( + { + url: "/equipment_maintenance_schedule/email_alert/update" , + method: 'put', + data + }) +} +// 备注更新状态 +export function remarkupDate(data) { + return request( + { + url: "/equipment_maintenance_schedule/batch/comment/update" , + method: 'post', + data + }) +} +// 批量更新(维护人员、维护内容、维护时间 + equipment_maintenance_schedule_ids) +export function batchUpdate(data) { + return request({ + url: "/equipment_maintenance_history/batch/create", + method: "post", + data + }); +} + +// 下载设备维护计划导入模板(返回 blob) +export function getEquipmentMaintainTemplate() { + return request({ + url: "/equipment_maintenance_schedule/template", + method: "post", + responseType: "blob", + }); +} + +// 导出设备维护计划:{ search, filter, ids? },返回 blob +export function exportEquipmentMaintain(data) { + return request({ + url: "/equipment_maintenance_schedule/export", + method: "post", + data, + responseType: "blob", + }); +} + +/** 上传解析模板:FormData 含 file,成功返回 { filename, import_type } */ +export function uploadEquipmentMaintain(formData) { + return request({ + url: "/equipment_maintenance_schedule/upload", + method: "post", + data: formData, + }); +} + +/** 确认导入:{ filename, import_type } */ +export function importEquipmentMaintain(data) { + return request({ + url: "/equipment_maintenance_schedule/import", + method: "post", + data, + }); +} + +/** 下载错误文件:{ filename },返回 blob */ +export function downloadErrorEquipmentMaintain(data) { + return request({ + url: "/import/error_file/download", + method: "post", + data, + responseType: "blob", + }); +} \ No newline at end of file diff --git a/web/src/api/asset/devicerepair.js b/web/src/api/asset/devicerepair.js new file mode 100644 index 0000000..8f74789 --- /dev/null +++ b/web/src/api/asset/devicerepair.js @@ -0,0 +1,134 @@ +// +import request from '../../utils/request' +// // 获取设备维修 +export function getTablist(data) { + return request( + { + url: "/equipment_repair/list", + method: 'post', + data + }) +} + +// 创建设备维修 +export function addTablist(data) { + return request( + { + url: "/equipment_repair/create", + method: 'post', + data + }) +} + + +// 更新设备维修 +export function updateTablist(data) { + return request( + { + url: "/equipment_repair/update" , + method: 'put', + data + }) +} + +// 删除设备维修 +export function delTablist(data) { + return request({ + url: "/equipment_repair/delete", + method: 'delete', + data + }); +} + + + +// 下载设备维修导入模板(无参数,返回 blob) +export function getEquipmentRepairTemplate() { + return request({ + url: "/equipment_repair/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出设备维修数据,参数:{ search, filter, ids? },返回 blob(一次性) +export function exportEquipmentRepair(data) { + return request({ + url: "/equipment_repair/export", + method: 'post', + data, + responseType: 'blob' + }) +} + +/** + * 流式导出设备维修数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportEquipmentRepairStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/equipment_repair/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} + + +/** + * 上传文件(解析模板):传入 FormData(包含 file 字段),成功返回 { filename, import_type } + */ +export function uploadEquipmentRepair(formData) { + return request({ + url: "/equipment_repair/upload", + method: 'post', + data: formData, + }); +} + + +/** + * 导入文件 参数filename和import_type(add,update) + */ +export function importEquipmentRepair(data) { + return request({ + url: "/equipment_repair/import", + method: 'post', + data + }); +} + + +/** + * 下载错误信息,参数 { filename },返回 blob 文件流 + */ +export function downloadErrorEquipmentRepair(data) { + return request({ + url: "/import/error_file/download", + method: 'post', + data, + responseType: 'blob', + }); +} + +// 设备维修批量更新 参数ids:[] 其他表单 +export function allUpdate(data) { + return request({ + url: "/equipment_repair/batch/update", + method: 'put', + data + }); +} diff --git a/web/src/api/asset/notification.js b/web/src/api/asset/notification.js new file mode 100644 index 0000000..3d687f7 --- /dev/null +++ b/web/src/api/asset/notification.js @@ -0,0 +1,54 @@ +// +import request from '../../utils/request' +// // 获取盘点报警记录 +export function getTablist(data) { + return request( + { + url: "/inventory_alarm_record/list", + method: 'post', + data + }) +} +// 删除盘点报警记录 +export function delTablist(data) { + return request({ + url: "/inventory_alarm_record/delete", + method: 'delete', + data + }); +} + +// 盘点报警记录导出数据 +export function exportInventory(data) { + return request({ + url: "/inventory_alarm_record/export", + method: 'post', + data, + responseType: 'blob' + }); +} +/** + * 流式导出资产台账数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportAssetStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/inventory_alarm_record/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} diff --git a/web/src/api/asset/webdavDriver.js b/web/src/api/asset/webdavDriver.js new file mode 100644 index 0000000..c4d7366 --- /dev/null +++ b/web/src/api/asset/webdavDriver.js @@ -0,0 +1,343 @@ +// WebDAV Driver for VueFinder +import request from '../../utils/request' +import { getApiBaseUrl } from '../../utils/config' + +// 解析 WebDAV PROPFIND XML 响应 +export function parseWebDAVXML(xmlString) { + try { + // 确保输入是字符串 + if (typeof xmlString !== 'string') { + console.error('parseWebDAVXML: 输入不是字符串类型', typeof xmlString, xmlString) + throw new Error('XML 响应必须是字符串类型') + } + + // 清理和提取有效的 XML 内容 + let cleanedXml = xmlString.trim() + + // 如果响应包含多个 XML 文档或末尾有额外内容,尝试提取第一个完整的 XML 文档 + // 查找第一个 /i + const endMatch = cleanedXml.substring(startIndex).match(endTagPattern) + + if (endMatch) { + // 提取完整的 XML 文档 + const endIndex = startIndex + endMatch.index + endMatch[0].length + cleanedXml = cleanedXml.substring(startIndex, endIndex) + // console.log('提取了有效的 XML 片段,原始长度:', xmlString.length, '清理后长度:', cleanedXml.length) + } else { + console.warn('未找到 XML 结束标签,使用原始响应') + } + } + + // 如果仍然没有找到有效的 XML,尝试查找第一个 + if (!cleanedXml.includes('multistatus') && !cleanedXml.includes(' { + if (!parent || !parent.getElementsByTagName) return null + const allElements = parent.getElementsByTagName('*') + for (let i = 0; i < allElements.length; i++) { + const elem = allElements[i] + const elemLocalName = elem.localName || elem.tagName?.split(':').pop() || elem.tagName + if (elemLocalName === localName || elem.tagName === localName || elem.tagName?.endsWith(':' + localName)) { + return elem + } + } + return null + } + + const getElementTextByLocalName = (parent, localName) => { + const element = getElementByLocalName(parent, localName) + return element?.textContent || '' + } + + // 获取所有 response 节点 + const allElements = xmlDoc.getElementsByTagName('*') + const responses = [] + for (let i = 0; i < allElements.length; i++) { + const elem = allElements[i] + const elemLocalName = elem.localName || elem.tagName?.split(':').pop() || elem.tagName + if (elemLocalName === 'response' || elem.tagName === 'response' || elem.tagName?.endsWith(':response')) { + responses.push(elem) + } + } + + const fileList = [] + + responses.forEach((response) => { + try { + const href = getElementTextByLocalName(response, 'href') + + // 跳过根路径 + if (href === '/' || !href) { + return + } + + const propstat = getElementByLocalName(response, 'propstat') + if (!propstat) return + + const prop = getElementByLocalName(propstat, 'prop') + if (!prop) return + + // 检查是否为集合(文件夹) + const resourcetype = getElementByLocalName(prop, 'resourcetype') + const collectionNode = resourcetype ? getElementByLocalName(resourcetype, 'collection') : null + const isCollection = collectionNode !== null + + // 获取文件大小 + const getcontentlengthText = getElementTextByLocalName(prop, 'getcontentlength') + const size = getcontentlengthText ? parseInt(getcontentlengthText, 10) : 0 + + // 获取修改时间 + const lastModified = getElementTextByLocalName(prop, 'getlastmodified') + + // 获取内容类型 + const getcontenttypeText = getElementTextByLocalName(prop, 'getcontenttype') + const contentType = getcontenttypeText || (isCollection ? 'directory' : 'application/octet-stream') + + // 从路径中提取文件名和相对路径 + // href 格式可能是: /folda/ 或 /filea,可能是 URL 编码的 + // 先对 href 进行 URL 解码 + let decodedHref = href + try { + decodedHref = decodeURIComponent(href) + } catch (e) { + // 如果解码失败,使用原始 href + decodedHref = href + } + + const cleanHref = decodedHref.replace(/\/$/, '') // 移除末尾斜杠 + const pathParts = cleanHref.split('/').filter(p => p) + const name = pathParts[pathParts.length - 1] || cleanHref || 'unknown' + + // 构建相对路径(相对于 webdav 根目录) + // 例如: /folda/ -> folda, /filea -> filea + // 注意:相对路径也需要解码后的值 + const relativePath = pathParts.join('/') + + fileList.push({ + href: href, + name: name, + isDirectory: isCollection, + size: size, + lastModified: lastModified, + contentType: contentType, + path: relativePath, // 相对路径,例如: "folda" 或 "filea" + }) + } catch (err) { + console.warn('解析单个 response 失败:', err) + } + }) + + return fileList + } catch (error) { + console.error('解析 WebDAV XML 失败:', error) + throw error + } +} + +// 将 WebDAV 文件列表转换为 VueFinder 格式 +function convertToVueFinderFormat(webdavFiles, basePath = '') { + const items = [] + + webdavFiles.forEach(file => { + // VueFinder 期望的格式:path应该以/开头 + let itemPath + + if (basePath && basePath !== '' && basePath !== '/') { + const normalizedBasePath = basePath.startsWith('/') ? basePath : '/' + basePath + itemPath = normalizedBasePath + '/' + file.name + } else { + // 根目录下的文件,path应该是 /folda 或 /filea + itemPath = '/' + file.name + } + + const item = { + name: file.name, + path: itemPath, // 绝对路径,例如: /folda 或 /filea + type: file.isDirectory ? 'dir' : 'file', + size: file.size || 0, + modified: file.lastModified ? new Date(file.lastModified).getTime() : Date.now(), + isDirectory: file.isDirectory, + } + + items.push(item) + }) + + // 目录排在前面 + items.sort((a, b) => { + if (a.type === 'dir' && b.type !== 'dir') return -1 + if (a.type !== 'dir' && b.type === 'dir') return 1 + return a.name.localeCompare(b.name) + }) + + // 返回的path表示当前目录路径 + // 对于根目录,path应该是空字符串;对于子目录,path应该是相对路径(不带开头的/) + let normalizedPath = basePath || '' + if (normalizedPath === '/') { + normalizedPath = '' + } + + return { + items: items, + path: normalizedPath, // 当前目录路径,根目录为空字符串 + } +} + +// 创建 WebDAV Driver +export function createWebDAVDriver() { + const baseURL = getApiBaseUrl() || '' + const basePath = `${baseURL}/webdav` + + return { + async list(params = {}) { + try { + // 构建路径,确保 URL 格式为 webdav/ 或 webdav/path/ + let path = params.path || '' + // 移除开头的 /,因为我们要构建相对路径用于API请求 + if (path.startsWith('/')) { + path = path.substring(1) + } + + // 如果 path 为空,请求 webdav/,否则请求 webdav/path/ + const url = path ? `/webdav/${path}${path.endsWith('/') ? '' : '/'}` : '/webdav/' + + // console.log('WebDAV list 请求:', { url, path, params }) + + // 发送 PROPFIND 请求,使用 Depth: 1 请求头 + const response = await request({ + url: url, + method: 'PROPFIND', + headers: { + 'Depth': '1' + } + }) + + // console.log('WebDAV 原始响应:', response) + + // 解析 XML 响应 + const fileList = parseWebDAVXML(response) + // console.log('解析后的文件列表:', fileList) + + // 转换为 VueFinder 格式 + // normalizedPath用于构建item的path,应该保持原样(不带开头的/) + const normalizedPath = path || '' + const vueFinderData = convertToVueFinderFormat(fileList, normalizedPath) + // console.log('VueFinder 格式数据:', vueFinderData) + // console.log('VueFinder items 数量:', vueFinderData.items.length) + // console.log('VueFinder items 详情:', vueFinderData.items) + + // 确保返回的数据格式正确 + if (!vueFinderData.items || !Array.isArray(vueFinderData.items)) { + console.error('VueFinder 数据格式错误:', vueFinderData) + return { items: [], path: normalizedPath } + } + + // 验证每个 item 的格式,确保所有必需字段都存在 + vueFinderData.items.forEach((item, index) => { + if (!item.name || !item.path || !item.type) { + console.warn(`Item ${index} 格式不完整:`, item) + } + // 确保path是字符串格式 + if (typeof item.path !== 'string') { + item.path = String(item.path) + } + // 确保size是数字 + if (typeof item.size !== 'number') { + item.size = Number(item.size) || 0 + } + }) + + console.log('返回给 VueFinder 的数据:', JSON.stringify(vueFinderData, null, 2)) + console.log('最终返回数据:', vueFinderData) + + return vueFinderData + } catch (error) { + console.error('WebDAV list 失败:', error) + throw error + } + }, + + async delete(params) { + return request({ + url: `/webdav/${params.path}`, + method: 'DELETE' + }) + }, + + async rename(params) { + // WebDAV MOVE 方法用于重命名 + // 对新路径进行 URL 编码(对每个路径段分别编码,保留斜杠) + const encodedNewPath = params.newPath + .split('/') + .map(segment => encodeURIComponent(segment)) + .join('/') + + return request({ + url: `/webdav/${params.path}`, + method: 'MOVE', + headers: { + 'Destination': `/webdav/${encodedNewPath}` + } + }) + }, + + getDownloadUrl(params) { + const token = localStorage.getItem('token') + const uid = localStorage.getItem('uid') + const path = params.path?.startsWith('/') ? params.path.substring(1) : params.path + return `${basePath}/${path}?token=${token}&uid=${uid}` + }, + + getPreviewUrl(params) { + return this.getDownloadUrl(params) + }, + + async search(params) { + // 搜索功能可能需要遍历所有目录 + // 这里先实现简单的列表 + const result = await this.list({ path: params.path || '' }) + return result.items.filter(item => + item.name.toLowerCase().includes(params.query.toLowerCase()) + ) + }, + + async save(params) { + // 上传文件使用 PUT 方法 + return request({ + url: `/webdav/${params.path}`, + method: 'PUT', + data: params.content, + headers: { + 'Content-Type': params.contentType || 'application/octet-stream' + } + }) + } + } +} + diff --git a/web/src/api/measurement/device.js b/web/src/api/measurement/device.js new file mode 100644 index 0000000..879ee06 --- /dev/null +++ b/web/src/api/measurement/device.js @@ -0,0 +1,171 @@ +// +import request from '../../utils/request' + +// 获取设备计量管理列表 +export function getTablist(data) { + return request( + { + url: "/equipment_metering/list", + method: 'post', + data + }) +} + +// 设备计量报表列表(按年月) +export function getMeteringReportList(data) { + return request({ + url: "/equipment_metering_report/list", + method: "post", + data, + }); +} + +// 创建设备计量管理 +export function addTablist(data) { + return request( + { + url: "/equipment_metering/create", + method: 'post', + data + }) +} + + +// 更新设备计量管理 +export function updateTablist(data) { + return request( + { + url: "/equipment_metering/update" , + method: 'put', + data + }) +} + +// 删除设备计量管理 +export function delTablist(data) { + return request({ + url: "/equipment_metering/delete", + method: 'delete', + data + }); +} + + +// 下载设备计量导入模板(无参数,返回 blob) +export function getAssetTemplate() { + return request({ + url: "/equipment_metering/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出设备计量数据,参数:{ search, filter, ids? },返回 blob(一次性) +export function exportAsset(data) { + return request({ + url: "/equipment_metering/export", + method: 'post', + data, + responseType: 'blob' + }) +} + +/** + * 流式导出设备计量数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportAssetStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/equipment_metering/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} + + +/** + * 上传文件(解析模板):传入 FormData(包含 file 字段),成功返回 { filename, import_type } + */ +export function uploadAsset(formData) { + return request({ + url: "/equipment_metering/upload", + method: 'post', + data: formData, + }); +} + + +/** + * 导入文件 参数filename和import_type(add,update) + */ +export function importAsset(data) { + return request({ + url: "/equipment_metering/import", + method: 'post', + data + }); +} + + +/** + * 下载错误信息,参数 { filename },返回 blob 文件流 + */ +export function downloadErrorAsset(data) { + return request({ + url: "/import/error_file/download", + method: 'post', + data, + responseType: 'blob', + }); +} + +// 获取设备计量邮件初始化状态 +export function remarkTablist(data) { + return request( + { + url: "/equipment_metering/email_alert/info" , + method: 'post', + data + }) +} +// 更新设备计量邮件提醒状态(true或者false) +export function emailupDate(data) { + return request( + { + url: "/equipment_metering/email_alert/update" , + method: 'put', + data + }) +} +// 设备计量当月计量:列表接口,传 filter.next_calibrate_time 或 filter.create_at 为 { start_time: "当月1号 00:00:00", end_time: "下月1号 00:00:00" } +export function monthUpDate(data) { + return request( + { + url: "/equipment_metering/list" , + method: 'post', + data + }) +} +// 设备计量批量更新 ids:[]和其他表单参数 +export function allupDate(data) { + return request( + { + url: "/equipment_metering/batch/update" , + method: 'put', + data + }) +} \ No newline at end of file diff --git a/web/src/api/measurement/materials.js b/web/src/api/measurement/materials.js new file mode 100644 index 0000000..c6fce59 --- /dev/null +++ b/web/src/api/measurement/materials.js @@ -0,0 +1,161 @@ +// +import request from '../../utils/request' + +// 获取计量管理列表 +export function getTablist(data) { + return request( + { + url: "/material_metering/list", + method: 'post', + data + }) +} + +// 创建计量管理 +export function addTablist(data) { + return request( + { + url: "/material_metering/create", + method: 'post', + data + }) +} + + +// 更新计量管理 +export function updateTablist(data) { + return request( + { + url: "/material_metering/update" , + method: 'put', + data + }) +} + +// 删除计量管理 +export function delTablist(data) { + return request({ + url: "/material_metering/delete", + method: 'delete', + data + }); +} + +// 下载物料计量导入模板(无参数,返回 blob) +export function getAssetTemplate() { + return request({ + url: "/material_metering/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出物料计量数据,参数:{ search, filter, ids? },返回 blob(一次性) +export function exportAsset(data) { + return request({ + url: "/material_metering/export", + method: 'post', + data, + responseType: 'blob' + }) +} + +/** + * 流式导出物料计量数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportAssetStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/material_metering/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} + + +/** + * 上传文件(解析模板):传入 FormData(包含 file 字段),成功返回 { filename, import_type } + */ +export function uploadAsset(formData) { + return request({ + url: "/material_metering/upload", + method: 'post', + data: formData, + }); +} + + +/** + * 导入文件 参数filename和import_type(add,update) + */ +export function importAsset(data) { + return request({ + url: "/material_metering/import", + method: 'post', + data + }); +} + + +/** + * 下载错误信息,参数 { filename },返回 blob 文件流 + */ +export function downloadErrorAsset(data) { + return request({ + url: "/import/error_file/download", + method: 'post', + data, + responseType: 'blob', + }); +} +// 获取物料计量邮件初始化状态 +export function remarkTablist(data) { + return request( + { + url: "/material_metering/email_alert/info" , + method: 'post', + data + }) +} +// 更新物料计量邮件提醒状态(true或者false) +export function emailupDate(data) { + return request( + { + url: "/material_metering/email_alert/update" , + method: 'put', + data + }) +} + +// 物料计量当月计量:列表接口,传 filter.next_calibrate_time 或 filter.create_at 为 { start_time: "当月1号 00:00:00", end_time: "下月1号 00:00:00" } +export function monthMaterialUpDate(data) { + return request( + { + url: "/material_metering/list" , + method: 'post', + data + }) +} +// 物料计量批量更新 ids:[]和其他表单参数 +export function allupMaterialDate(data) { + return request( + { + url: "/material_metering/batch/update" , + method: 'put', + data + }) +} diff --git a/web/src/api/notice/notice.js b/web/src/api/notice/notice.js new file mode 100644 index 0000000..8f3d3f6 --- /dev/null +++ b/web/src/api/notice/notice.js @@ -0,0 +1,23 @@ +// +import request from '../../utils/request' + +// 获取消息管理 +export function getNoticeList(data) { + return request( + { + url: "/notice/list", + method: 'post', + data + }) +} +//标记通知为已读 +export function getReadALl(data) { + return request( + { + url: "/notice/read", + method: 'post', + data + }) +} + + diff --git a/web/src/api/overview/device.js b/web/src/api/overview/device.js new file mode 100644 index 0000000..7bf0413 --- /dev/null +++ b/web/src/api/overview/device.js @@ -0,0 +1,210 @@ +import request from '../../utils/request' +// 设备维修报表:按部门 + 本月(年月) +export function getEquipmentRepairReportList(data) { + return request({ + url: "/equipment_repair_report/list", + method: "post", + data, + }); +} + +// 设备维修报表:按部门 + 年度,按月汇总(12 列) +export function getEquipmentRepairAnnualByDept(data) { + return request({ + url: "/equipment_repair_report/annual_by_dept", + method: "post", + data, + }); +} + +// 设备维修报表:按厂商 + 年度 +export function getEquipmentRepairByVendor(data) { + return request({ + url: "/equipment_repair_report/by_vendor", + method: "post", + data, + }); +} + +// 获取部门统计数据接口 +export function getAssetDepartments() { + return request({ + url: "/dashboard/asset_departments", + method: "post", + }); +} +// 获取厂商统计数据接口 +export function getAssetManufacturers() { + return request({ + url: "/dashboard/manufacturers", + method: "post", + }); +} +// 设备计量报表(按年月) +export function getMeteringReportList(data) { + return request({ + url: "/dashboard/equipment_metering_report", + method: "post", + data + }); +} + +// 设备验收报表(按年月) +export function getEquipmentAcceptanceReportList(data) { + return request({ + url: "/dashboard/equipment_acceptance_report", + method: "post", + data, + }); +} + +// 设备维护报表(按年月) +export function getEquipmentMaintenanceReportList(data) { + return request({ + url: "/dashboard/equipment_maintenance_report", + method: "post", + data, + }); +} + +// 概览看板:月度统计(部门为多选,asset_department 为 string[]) +export function getDashboardMonthlyStatistics(data) { + return request({ + url: "/dashboard/view/monthly_statistics", + method: "post", + data, + }); +} + +// 概览看板:年度统计(部门为多选,asset_department 为 string[]) +export function getDashboardAnnualStatistics(data) { + return request({ + url: "/dashboard/view/annual_statistics", + method: "post", + data, + }); +} + +// 概览看板下面的接口 + +// 按资产部门分类 +export function getViewAssetLedgerByAssetDepartment(data) { + return request({ + url: "/dashboard/view/asset_ledger/asset_department", + method: "post", + data, + }); +} +// 按制造厂商分类 +export function getViewAssetManufacturerByDepartment(data) { + return request({ + url: "/dashboard/view/asset_ledger/manufacturer", + method: "post", + data, + }); +} + + +// 按年份分类 +export function getViewAssetYearByDepartment(data) { + return request({ + url: "/dashboard/view/asset_ledger/year", + method: "post", + data, + }); +} + + +/** 解析各部门报表列表(兼容多种 data 结构) */ +export function parseEquipmentDeptReportList(res) { + const payload = res?.data; + if (Array.isArray(payload?.list)) return payload.list; + if (Array.isArray(payload?.rows)) return payload.rows; + if (Array.isArray(payload?.records)) return payload.records; + if (Array.isArray(payload?.items)) return payload.items; + if (Array.isArray(payload)) return payload; + return []; +} + +/** 将 asset_departments 接口返回体规范为部门名称字符串数组(兼容多种 data 结构) */ +export function normalizeAssetDepartmentsResponse(res) { + const pickLabel = (item) => { + if (typeof item === "string") return item.trim(); + if (!item || typeof item !== "object") return ""; + const s = + item.department || + item.asset_department || + item.dept_name || + item.dept || + item.name || + item.label || + (item.value != null && String(item.value)) || + ""; + return String(s).trim(); + }; + + const payload = res?.data; + const arraysToTry = [ + payload, + payload?.list, + payload?.rows, + payload?.records, + payload?.departments, + payload?.items, + payload?.data, + ]; + + let raw = []; + for (const chunk of arraysToTry) { + if (Array.isArray(chunk)) { + raw = chunk; + break; + } + } + + const labels = raw.map(pickLabel).filter(Boolean); + return [...new Set(labels)]; +} + +/** 将 manufacturers 接口返回体规范为厂商名称字符串数组(兼容多种 data 结构) */ +export function normalizeAssetManufacturersResponse(res) { + const pickLabel = (item) => { + if (typeof item === "string") return item.trim(); + if (!item || typeof item !== "object") return ""; + const s = + item.vendor || + item.manufacturer || + item.supplier_name || + item.factory_name || + item.name || + item.label || + (item.value != null && String(item.value)) || + ""; + return String(s).trim(); + }; + + const payload = res?.data; + const arraysToTry = [ + payload, + payload?.list, + payload?.rows, + payload?.records, + payload?.manufacturers, + payload?.vendors, + payload?.items, + payload?.data, + ]; + + let raw = []; + for (const chunk of arraysToTry) { + if (Array.isArray(chunk)) { + raw = chunk; + break; + } + } + + const labels = raw.map(pickLabel).filter(Boolean); + return [...new Set(labels)]; +} + + diff --git a/web/src/api/system/employmanage.js b/web/src/api/system/employmanage.js new file mode 100644 index 0000000..0bbeeac --- /dev/null +++ b/web/src/api/system/employmanage.js @@ -0,0 +1,42 @@ +// +import request from '../../utils/request' + +// 获取员工列表 +export function getTablist(data) { + return request( + { + url: "/employee/list", + method: 'post', + data + }) +} + +// 创建员工 +export function addTablist(data) { + return request( + { + url: "/employee/create", + method: 'post', + data + }) +} + + +// 更新员工 +export function updateTablist(data) { + return request( + { + url: "/employee/update" , + method: 'put', + data + }) +} + +// 删除员工 +export function delTablist(data) { + return request({ + url: "/employee/delete", + method: 'delete', + data + }); +} diff --git a/web/src/api/system/factorymanage.js b/web/src/api/system/factorymanage.js new file mode 100644 index 0000000..b6d80ae --- /dev/null +++ b/web/src/api/system/factorymanage.js @@ -0,0 +1,41 @@ +// +import request from '../../utils/request' +// 获取厂区列表 +export function getTablist(data) { + return request( + { + url: "/factory_area/list", + method: 'post', + data + }) +} + +// 创建厂区 +export function addTablist(data) { + return request( + { + url: "/factory_area/create", + method: 'post', + data + }) +} + + +// 更新厂区 +export function updateTablist(data) { + return request( + { + url: "/factory_area/update" , + method: 'put', + data + }) +} + +// 删除厂区 +export function delTablist(data) { + return request({ + url: "/factory_area/delete", + method: 'delete', + data + }); +} diff --git a/web/src/api/system/operationlog.js b/web/src/api/system/operationlog.js new file mode 100644 index 0000000..af4ddb6 --- /dev/null +++ b/web/src/api/system/operationlog.js @@ -0,0 +1,10 @@ +import request from "../../utils/request"; + +/** 操作日志列表(游标分页) POST /log/list */ +export function getLogList(data) { + return request({ + url: "/log/list", + method: "post", + data, + }); +} diff --git a/web/src/api/system/rolemanage.js b/web/src/api/system/rolemanage.js new file mode 100644 index 0000000..a681ed5 --- /dev/null +++ b/web/src/api/system/rolemanage.js @@ -0,0 +1,174 @@ +// +import request from '../../utils/request' +import { getApiBaseUrl } from '../../utils/config' + +// 获取角色列表 +export function getTablist(data) { + return request( + { + url: "/role/list", + method: 'post', + data + }) +} + +// 创建角色 +export function addTablist(data) { + return request( + { + url: "/role/create", + method: 'post', + data + }) +} + + +// 更新角色 +export function updateTablist(data) { + return request( + { + url: "/role/update" , + method: 'put', + data + }) +} + +// 删除角色 +export function delTablist(data) { + return request({ + url: "/role/delete", + method: 'delete', + data + }); +} +// 获取用户所在部门的所有角色 +export function getBuUidList(data) { + return request( + { + url: "/role/get-by-uid", + method: 'post', + data + }) +} +// 根据当前的id获取配置页面权限 +export function getPermissionPage(data) { + return request( + { + url: "/role/info", + method: 'post', + data + }) +} +// 根据当前的id获取高级表头字段权限 +export function getPermissionHigh(data) { + return request( + { + url: "/role/advanced/list", + method: 'post', + data + }) +} +// 保存高级表头字段权限 +export function savePermissionHigh(data) { + return request( + { + url: "/role/advanced/update", + method: 'post', + data + }) +} + +// 不同用户不同的页面权限 +export function getPermisssionPage(data) { + return request( + { + url: "/permission/page", + method: 'post', + data + }) +} + + +// 下载角色导入模板(无参数,返回 blob) +export function getRoleTemplate() { + return request({ + url: "/role/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出角色数据,参数:{ search, filter, ids? },返回 blob(一次性) +export function exportRole(data) { + return request({ + url: "/role/export", + method: 'post', + data, + responseType: 'blob' + }) +} + +/** + * 流式导出角色数据:返回原生 fetch Response,调用方用 response.body.getReader() 流式读取 + * 参数:{ search, filter, ids? },ids 不传或为空时按 search+filter 导出全部 + */ +export function exportRoleStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/role/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} + + +/** + * 上传文件(解析模板):传入 FormData(包含 file 字段),成功返回 { filename, import_type } + */ +export function uploadole(formData) { + return request({ + url: "/role/upload", + method: 'post', + data: formData, + }); +} + + +/** + * 导入文件 参数filename和import_type(add,update) + */ +export function importRole(data) { + return request({ + url: "/role/import", + method: 'post', + data + }); +} + + +/** + * 下载错误信息,参数 { filename },返回 blob 文件流 + */ +export function downloadErrorRole(data) { + return request({ + url: "/import/error_file/download", + method: 'post', + data, + responseType: 'blob', + }); +} + + diff --git a/web/src/api/system/sensormanage.js b/web/src/api/system/sensormanage.js new file mode 100644 index 0000000..f32e7d4 --- /dev/null +++ b/web/src/api/system/sensormanage.js @@ -0,0 +1,41 @@ +// +import request from '../../utils/request' +// 获取信息机列表 +export function getTablist(data) { + return request( + { + url: "/information_machine/list", + method: 'post', + data + }) +} + +// 创建信息机 +export function addTablist(data) { + return request( + { + url: "/information_machine/create", + method: 'post', + data + }) +} + + +// 更新信息机 +export function updateTablist(data) { + return request( + { + url: "/information_machine/update" , + method: 'put', + data + }) +} + +// 删除信息机 +export function delTablist(data) { + return request({ + url: "/information_machine/delete", + method: 'delete', + data + }); +} diff --git a/web/src/api/system/usermanage.js b/web/src/api/system/usermanage.js new file mode 100644 index 0000000..c05a76c --- /dev/null +++ b/web/src/api/system/usermanage.js @@ -0,0 +1,95 @@ +// +import request from '../../utils/request' +import { getApiBaseUrl } from '../../utils/config' + +// 获取用户列表 +export function getTablist(data) { + return request( + { + url: "/user/list", + method: 'post', + data + }) +} + +// 创建用户 +export function addTablist(data) { + return request( + { + url: "/user/create", + method: 'post', + data + }) +} + + +// 更新用户 +export function updateTablist(data) { + return request( + { + url: "/user/update" , + method: 'put', + data + }) +} + +// 删除用户 +export function delTablist(data) { + return request({ + url: "/user/delete", + method: 'delete', + data + }); +} + +// 登录接口 +export function userLogin(data) { + return request( + { + url: "/login", + method: 'post', + data + }) +} + +// 下载用户导入模板(无参数,返回 blob) +export function getUserTemplate() { + return request({ + url: "/user/template", + method: 'post', + responseType: 'blob' + }) +} + +// 导出用户数据 +export function exportUser(data) { + return request({ + url: "/user/export", + method: 'post', + data, + responseType: 'blob' + }) +} + + +export function exportRoleStream(data) { + const baseURL = (typeof getApiBaseUrl === 'function' ? getApiBaseUrl() : null) || ''; + const url = `${baseURL.replace(/\/+$/, '')}/role/export`; + const token = typeof localStorage !== 'undefined' ? localStorage.getItem('token') : ''; + const uid = typeof localStorage !== 'undefined' ? localStorage.getItem('uid') : ''; + const language = typeof localStorage !== 'undefined' ? localStorage.getItem('language') || 'zh-CN' : 'zh-CN'; + const headers = { + 'Content-Type': 'application/json', + 'Accept-Language': language + }; + if (token) { + headers.token = token; + headers.Authorization = `Bearer ${token}`; + } + if (uid) headers.uid = uid; + return fetch(url, { + method: 'post', + headers, + body: JSON.stringify(data) + }); +} \ No newline at end of file diff --git a/web/src/components/BatchImportDialog.vue b/web/src/components/BatchImportDialog.vue new file mode 100644 index 0000000..d217af4 --- /dev/null +++ b/web/src/components/BatchImportDialog.vue @@ -0,0 +1,947 @@ + + + + + + diff --git a/web/src/components/Echarts.vue b/web/src/components/Echarts.vue new file mode 100644 index 0000000..c8d83de --- /dev/null +++ b/web/src/components/Echarts.vue @@ -0,0 +1,198 @@ + + + + + + diff --git a/web/src/components/EmailReminder.vue b/web/src/components/EmailReminder.vue new file mode 100644 index 0000000..3d9c9bb --- /dev/null +++ b/web/src/components/EmailReminder.vue @@ -0,0 +1,97 @@ + + + + + + diff --git a/web/src/components/GlobalHeader.vue b/web/src/components/GlobalHeader.vue new file mode 100644 index 0000000..628c035 --- /dev/null +++ b/web/src/components/GlobalHeader.vue @@ -0,0 +1,1192 @@ + + + + + + + + + diff --git a/web/src/components/ImportExportButton.vue b/web/src/components/ImportExportButton.vue new file mode 100644 index 0000000..a24e1f3 --- /dev/null +++ b/web/src/components/ImportExportButton.vue @@ -0,0 +1,247 @@ + + + + + + diff --git a/web/src/components/MonthlyEquipmentDeptChart.vue b/web/src/components/MonthlyEquipmentDeptChart.vue new file mode 100644 index 0000000..5a597e3 --- /dev/null +++ b/web/src/components/MonthlyEquipmentDeptChart.vue @@ -0,0 +1,340 @@ + + + + + + diff --git a/web/src/components/Sidebar.vue b/web/src/components/Sidebar.vue new file mode 100644 index 0000000..22f0716 --- /dev/null +++ b/web/src/components/Sidebar.vue @@ -0,0 +1,534 @@ + + + + + \ No newline at end of file diff --git a/web/src/components/alarm/AccessAlarmRecordContent.vue b/web/src/components/alarm/AccessAlarmRecordContent.vue new file mode 100644 index 0000000..3d80f4a --- /dev/null +++ b/web/src/components/alarm/AccessAlarmRecordContent.vue @@ -0,0 +1,2026 @@ + + + + + diff --git a/web/src/components/alarm/NotificationManageContent.vue b/web/src/components/alarm/NotificationManageContent.vue new file mode 100644 index 0000000..b55217d --- /dev/null +++ b/web/src/components/alarm/NotificationManageContent.vue @@ -0,0 +1,2061 @@ + + + + + diff --git a/web/src/components/echarts/DashboardLineChart.vue b/web/src/components/echarts/DashboardLineChart.vue new file mode 100644 index 0000000..c691f34 --- /dev/null +++ b/web/src/components/echarts/DashboardLineChart.vue @@ -0,0 +1,180 @@ + + + + + diff --git a/web/src/components/echarts/DashboardPieChart.vue b/web/src/components/echarts/DashboardPieChart.vue new file mode 100644 index 0000000..91ddb84 --- /dev/null +++ b/web/src/components/echarts/DashboardPieChart.vue @@ -0,0 +1,193 @@ + + + + + diff --git a/web/src/configs/common.js b/web/src/configs/common.js new file mode 100644 index 0000000..0e52e59 --- /dev/null +++ b/web/src/configs/common.js @@ -0,0 +1,4 @@ +export const prefix = "timesheet"; +export function getTimesheetRouteName(name) { + return `${prefix}.${name}`; +} diff --git a/web/src/constants/fieldPermissionGroups.js b/web/src/constants/fieldPermissionGroups.js new file mode 100644 index 0000000..f3597d2 --- /dev/null +++ b/web/src/constants/fieldPermissionGroups.js @@ -0,0 +1,82 @@ +/** + * 数据权限分组与字段(与角色管理弹框展示一致) + * 每组内 field.key 格式为 原字段名_父组key(camelCase),全局唯一 + */ + +const RAW_FIELD_PERMISSION_GROUPS = [ + { key: "AssetAlarmRecord", label: "资产报警记录", fields: [ + { key: "alarm_time_assetAlarmRecord", label: "报警时间" }, { key: "alarm_type_assetAlarmRecord", label: "报警类型" }, { key: "asset_no_assetAlarmRecord", label: "资产编号" }, { key: "asset_name_assetAlarmRecord", label: "资产名称" }, { key: "current_factory_assetAlarmRecord", label: "当前厂区" }, { key: "epc_assetAlarmRecord", label: "EPC" }, { key: "spec_model_assetAlarmRecord", label: "规格型号" }, { key: "factory_area_assetAlarmRecord", label: "所属厂区" }, { key: "asset_dept_assetAlarmRecord", label: "资产部门" }, { key: "responsible_assetAlarmRecord", label: "责任人" }, { key: "signal_machine_assetAlarmRecord", label: "信号机" }, { key: "info_machine_name_assetAlarmRecord", label: "信息机名称" } + ]}, + { key: "AssetList", label: "资产列表", fields: [ + { key: "agent_assetList", label: "代理商" }, { key: "asset_no_assetList", label: "资产编号" }, { key: "asset_name_assetList", label: "资产名称" }, { key: "sub_asset_no_assetList", label: "附属资产编号" }, { key: "sub_asset_assetList", label: "附属资产" }, { key: "attachment_assetList", label: "附件" }, { key: "entry_time_assetList", label: "进厂时间" }, { key: "asset_class_assetList", label: "资产分类" }, { key: "depreciation_period_assetList", label: "折旧期数" }, { key: "epc_assetList", label: "EPC" }, { key: "factory_area_assetList", label: "所属厂区" }, { key: "anti_dismantle_assetList", label: "资产防拆提醒" }, { key: "measure_type_assetList", label: "计量类型" }, { key: "original_value_assetList", label: "资产原值" }, { key: "under_voltage_alarm_assetList", label: "欠压告警" }, { key: "maintain_type_assetList", label: "维护类型" }, { key: "manufacturer_assetList", label: "制造厂家" }, { key: "doc_no_assetList", label: "资料编号" }, { key: "remark_assetList", label: "备注说明" }, { key: "net_value_assetList", label: "折旧净值" }, { key: "original_zy_no_assetList", label: "原zy编号" }, { key: "factory_no_assetList", label: "出厂编号" }, { key: "asset_dept_assetList", label: "资产部门" }, { key: "purchase_code_assetList", label: "采购编码" }, { key: "asset_responsible_assetList", label: "资产责任人" }, { key: "spec_model_assetList", label: "规格型号" }, { key: "asset_status_assetList", label: "资产状态" }, { key: "warranty_assetList", label: "保修期" } + ]}, + { key: "AssetAcceptance", label: "资产验收", fields: [ + { key: "accept_status_assetAcceptance", label: "验收状态" }, { key: "accept_responsible_assetAcceptance", label: "验收责任人" }, { key: "asset_class_assetAcceptance", label: "资产分类" }, { key: "asset_no_assetAcceptance", label: "资产编号" }, { key: "asset_name_assetAcceptance", label: "资产名称" }, { key: "attachment_assetAcceptance", label: "附件" }, { key: "accept_finish_time_assetAcceptance", label: "验收完成时间" }, { key: "factory_area_assetAcceptance", label: "所属厂区" }, { key: "factory_no_assetAcceptance", label: "出厂编号" }, { key: "asset_dept_assetAcceptance", label: "资产部门" }, { key: "plan_accept_time_assetAcceptance", label: "计划验收时间" }, { key: "remark_assetAcceptance", label: "备注说明" }, { key: "asset_responsible_assetAcceptance", label: "资产责任人" }, { key: "accept_start_time_assetAcceptance", label: "验收发起时间" }, { key: "purchase_no_assetAcceptance", label: "采购编号" } + ]}, + { key: "DeviceEntry", label: "设备进厂", fields: [ + { key: "accept_cycle_deviceEntry", label: "验收周期" }, { key: "agent_deviceEntry", label: "代理商" }, { key: "asset_class_deviceEntry", label: "资产分类" }, { key: "asset_no_deviceEntry", label: "资产编号" }, { key: "asset_name_deviceEntry", label: "资产名称" }, { key: "attachment_deviceEntry", label: "附件" }, { key: "contract_no_deviceEntry", label: "合同号" }, { key: "epc_deviceEntry", label: "EPC" }, { key: "factory_area_deviceEntry", label: "所属厂区" }, { key: "entry_time_deviceEntry", label: "进厂时间" }, { key: "original_value_deviceEntry", label: "资产原值" }, { key: "manufacturer_deviceEntry", label: "制造厂家" }, { key: "factory_no_deviceEntry", label: "出厂编号" }, { key: "asset_dept_deviceEntry", label: "资产部门" }, { key: "purchase_no_deviceEntry", label: "采购编号" }, { key: "remark_deviceEntry", label: "备注说明" }, { key: "asset_responsible_deviceEntry", label: "资产负责人" }, { key: "spec_model_deviceEntry", label: "规格型号" }, { key: "temp_return_date_deviceEntry", label: "临时设备计划退还日期" }, { key: "warranty_deviceEntry", label: "保修期" } + ]}, + { key: "DeviceMaintain", label: "设备维护", fields: [ + { key: "maintain_responsible_deviceMaintain", label: "维护责任人" }, { key: "asset_no_deviceMaintain", label: "资产编号" }, { key: "asset_name_deviceMaintain", label: "资产名称" }, { key: "attachment_deviceMaintain", label: "附件" }, { key: "create_time_deviceMaintain", label: "创建时间" }, { key: "maintain_content_deviceMaintain", label: "维护内容" }, { key: "this_maintain_time_deviceMaintain", label: "本次维护时间" }, { key: "next_maintain_time_deviceMaintain", label: "下次维护时间" }, { key: "asset_dept_deviceMaintain", label: "资产部门" }, { key: "maintain_cycle_deviceMaintain", label: "维护周期" }, { key: "spec_model_deviceMaintain", label: "规格型号" }, { key: "asset_status_deviceMaintain", label: "资产状态" } + ]}, + { key: "DeviceMetering", label: "设备计量", fields: [ + { key: "meter_responsible_deviceMetering", label: "计量负责人" }, { key: "asset_class_deviceMetering", label: "资产分类" }, { key: "asset_no_deviceMetering", label: "资产编号" }, { key: "asset_name_deviceMetering", label: "资产名称" }, { key: "attachment_deviceMetering", label: "附件" }, { key: "calibration_type_deviceMetering", label: "校正别" }, { key: "calibration_result_deviceMetering", label: "校准结果" }, { key: "this_calibration_date_deviceMetering", label: "本次校正日期" }, { key: "measure_type_deviceMetering", label: "计量类型" }, { key: "next_calibration_date_deviceMetering", label: "下次校正日期" }, { key: "factory_no_deviceMetering", label: "出厂编号" }, { key: "asset_dept_deviceMetering", label: "资产部门" }, { key: "cycle_deviceMetering", label: "周期" }, { key: "remark_deviceMetering", label: "备注说明" }, { key: "asset_responsible_deviceMetering", label: "资产责任人" }, { key: "spec_model_deviceMetering", label: "规格型号" }, { key: "asset_status_deviceMetering", label: "资产状态" }, { key: "update_time_deviceMetering", label: "更新时间" } + ]}, + { key: "DeviceRepair", label: "设备维修", fields: [ + { key: "repair_responsible_deviceRepair", label: "维修责任人" }, { key: "asset_class_deviceRepair", label: "资产分类" }, { key: "expected_return_date_deviceRepair", label: "预计外修回厂日期" }, { key: "fault_phenomenon_deviceRepair", label: "故障现象" }, { key: "asset_no_deviceRepair", label: "资产编号" }, { key: "asset_name_deviceRepair", label: "资产名称" }, { key: "fault_analysis_deviceRepair", label: "故障原因分析及维修具体情况" }, { key: "fault_type_deviceRepair", label: "故障类型" }, { key: "attachment_deviceRepair", label: "附件" }, { key: "manufacturer_deviceRepair", label: "制造厂家" }, { key: "repair_finish_time_deviceRepair", label: "维修完成时间" }, { key: "factory_no_deviceRepair", label: "出厂编号" }, { key: "external_repair_unit_deviceRepair", label: "外修单位" }, { key: "asset_dept_deviceRepair", label: "资产部门" }, { key: "remark_deviceRepair", label: "备注说明" }, { key: "internal_external_deviceRepair", label: "内修/外修" }, { key: "spec_model_deviceRepair", label: "规格型号" }, { key: "repair_start_time_deviceRepair", label: "维修发起时间" } + ]}, + { key: "DeviceTransfer", label: "设备转移", fields: [ + { key: "applicant_deviceTransfer", label: "申请人" }, { key: "original_dept_deviceTransfer", label: "资产原部门" }, { key: "asset_no_deviceTransfer", label: "资产编号" }, { key: "asset_name_deviceTransfer", label: "资产名称" }, { key: "receive_factory_deviceTransfer", label: "接收厂区" }, { key: "receive_dept_deviceTransfer", label: "接收部门" }, { key: "attachment_deviceTransfer", label: "附件" }, { key: "receive_responsible_deviceTransfer", label: "接收责任人" }, { key: "create_time_deviceTransfer", label: "创建时间" }, { key: "remark_deviceTransfer", label: "备注说明" }, { key: "factory_no_deviceTransfer", label: "出厂编号" }, { key: "spec_model_deviceTransfer", label: "规格型号" } + ]}, + { key: "DeviceLoan", label: "设备转借", fields: [ + { key: "applicant_dept_deviceLoan", label: "申请人部门" }, { key: "applicant_deviceLoan", label: "申请人" }, { key: "loan_due_time_deviceLoan", label: "转借到期时间" }, { key: "loan_factory_deviceLoan", label: "资产借用厂区" }, { key: "asset_no_deviceLoan", label: "资产编号" }, { key: "asset_name_deviceLoan", label: "资产名称" }, { key: "loan_responsible_deviceLoan", label: "资产借用责任人" }, { key: "factory_no_deviceLoan", label: "出厂编号" }, { key: "attachment_deviceLoan", label: "附件" }, { key: "create_time_deviceLoan", label: "创建时间" }, { key: "remark_deviceLoan", label: "备注说明" }, { key: "spec_model_deviceLoan", label: "规格型号" }, { key: "loan_start_time_deviceLoan", label: "转借发起时间" } + ]}, + { key: "EmployeeManage", label: "员工管理", fields: [ + { key: "create_time_employeeManage", label: "创建时间" }, { key: "email_employeeManage", label: "邮箱" }, { key: "employee_name_employeeManage", label: "员工名称" }, { key: "org_structure_employeeManage", label: "组织结构" }, { key: "contact_phone_employeeManage", label: "联系电话" } + ]}, + { key: "DeviceExFactory", label: "设备出厂", fields: [ + { key: "applicant_dept_deviceExFactory", label: "申请人部门" }, { key: "applicant_deviceExFactory", label: "申请人" }, { key: "asset_no_deviceExFactory", label: "资产编号" }, { key: "asset_name_deviceExFactory", label: "资产名称" }, { key: "attachment_deviceExFactory", label: "附件" }, { key: "create_time_deviceExFactory", label: "创建时间" }, { key: "expected_return_time_deviceExFactory", label: "预计返厂时间" }, { key: "ex_factory_time_deviceExFactory", label: "出厂时间" }, { key: "factory_no_deviceExFactory", label: "出厂编号" }, { key: "remark_deviceExFactory", label: "备注说明" }, { key: "spec_model_deviceExFactory", label: "规格型号" } + ]}, + { key: "FactoryManage", label: "厂区管理", fields: [ + { key: "creator_factoryManage", label: "创建人" }, { key: "create_time_factoryManage", label: "创建时间" }, { key: "factory_name_factoryManage", label: "厂区名称" }, { key: "remark_factoryManage", label: "备注" } + ]}, + { key: "InventoryDetail", label: "盘点详情", fields: [ + { key: "asset_no_inventoryDetail", label: "资产编号" }, { key: "asset_name_inventoryDetail", label: "资产名称" }, { key: "epc_inventoryDetail", label: "EPC" }, { key: "factory_no_inventoryDetail", label: "出厂编号" }, { key: "asset_dept_inventoryDetail", label: "资产部门" }, { key: "factory_inventoryDetail", label: "厂区" }, { key: "responsible_inventoryDetail", label: "责任人" }, { key: "info_machine_id_inventoryDetail", label: "信息机ID" }, { key: "info_machine_name_inventoryDetail", label: "信息机名称" }, { key: "spec_model_inventoryDetail", label: "规格型号" } + ]}, + { key: "AssetInventory", label: "资产盘点", fields: [ + { key: "inventory_no_assetInventory", label: "盘点单号" }, { key: "to_inventory_assetInventory", label: "应盘资产" }, { key: "create_time_assetInventory", label: "创建时间" }, { key: "loss_assets_assetInventory", label: "盘亏资产" }, { key: "gain_assets_assetInventory", label: "盘盈资产" }, { key: "no_epc_assets_assetInventory", label: "无EPC资产" }, { key: "inventory_time_assetInventory", label: "盘点时间" } + ]}, + { key: "IdleHandle", label: "闲置处理", fields: [ + { key: "apply_dept_idleHandle", label: "申请部门" }, { key: "years_to_plant_idleHandle", label: "到厂年限" }, { key: "applicant_idleHandle", label: "申请人" }, { key: "factory_no_idleHandle", label: "出厂编号" }, { key: "asset_no_idleHandle", label: "资产编号" }, { key: "asset_name_idleHandle", label: "资产名称" }, { key: "description_idleHandle", label: "描述说明" }, { key: "spec_model_idleHandle", label: "规格型号" }, { key: "attachment_idleHandle", label: "附件" }, { key: "asset_status_idleHandle", label: "资产状态" }, { key: "create_time_idleHandle", label: "创建时间" }, { key: "idle_opinion_idleHandle", label: "闲置处理意见" } + ]}, + { key: "MaterialMetering", label: "物料计量", fields: [ + { key: "meter_responsible_materialMetering", label: "计量负责人" }, { key: "material_no_materialMetering", label: "物料编号" }, { key: "remark_materialMetering", label: "备注说明" }, { key: "material_class_materialMetering", label: "物料分类" }, { key: "material_name_materialMetering", label: "物料名称" }, { key: "asset_responsible_materialMetering", label: "资产责任人" }, { key: "attachment_materialMetering", label: "附件" }, { key: "measure_type_materialMetering", label: "计量类型" }, { key: "spec_model_materialMetering", label: "规格型号" }, { key: "calibration_type_materialMetering", label: "校正别" }, { key: "next_calibration_date_materialMetering", label: "下次校正日期" }, { key: "material_status_materialMetering", label: "物料状态" }, { key: "calibration_result_materialMetering", label: "校准结果" }, { key: "asset_dept_materialMetering", label: "资产部门" }, { key: "update_time_materialMetering", label: "更新时间" }, { key: "this_calibration_date_materialMetering", label: "本次校正日期" }, { key: "cycle_materialMetering", label: "周期" } + ]}, + { key: "AccessControlManage", label: "门禁权限管理", fields: [ + { key: "asset_no_accessControlManage", label: "资产编号" }, { key: "access_control_accessControlManage", label: "门禁" }, { key: "asset_name_accessControlManage", label: "资产名称" }, { key: "asset_status_accessControlManage", label: "资产状态" }, { key: "epc_accessControlManage", label: "EPC" }, { key: "access_expire_time_accessControlManage", label: "门禁到期时间" }, { key: "asset_dept_accessControlManage", label: "资产部门" }, { key: "asset_responsible_accessControlManage", label: "资产负责人" } + ]}, + { key: "RoleManage", label: "角色管理", fields: [ + { key: "creator_roleManage", label: "创建人" }, { key: "create_time_roleManage", label: "创建时间" }, { key: "description_roleManage", label: "描述" }, { key: "role_name_roleManage", label: "角色名称" }, { key: "permission_type_roleManage", label: "权限类型" } + ]}, + { key: "SensorManage", label: "信息机管理", fields: [ + { key: "create_time_sensorManage", label: "创建时间" }, { key: "factory_name_sensorManage", label: "厂区名称" }, { key: "sensor_no_sensorManage", label: "信息机编号" }, { key: "sensor_name_sensorManage", label: "信息机名称" }, { key: "sensor_type_sensorManage", label: "信息机类型" }, { key: "online_status_sensorManage", label: "在线状态" } + ]}, + { key: "UserManage", label: "用户管理", fields: [ + { key: "create_time_userManage", label: "创建时间" }, { key: "email_userManage", label: "邮箱" }, { key: "employee_name_userManage", label: "员工名称" }, { key: "data_permission_userManage", label: "数据权限" }, { key: "description_userManage", label: "描述" }, { key: "role_name_userManage", label: "角色名称" }, { key: "contact_phone_userManage", label: "联系电话" }, { key: "username_userManage", label: "用户名" } + ]}, +]; + +/** 每组内按 field.key 去重,保证 key 不重复(保留首次出现) */ +function dedupeFieldsByKey(groups) { + return groups.map((group) => { + const seen = new Set(); + const fields = group.fields.filter((f) => { + if (seen.has(f.key)) return false; + seen.add(f.key); + return true; + }); + return { ...group, fields }; + }); +} + +export const FIELD_PERMISSION_GROUPS = dedupeFieldsByKey(RAW_FIELD_PERMISSION_GROUPS); diff --git a/web/src/i18n.js b/web/src/i18n.js new file mode 100644 index 0000000..5aa72d8 --- /dev/null +++ b/web/src/i18n.js @@ -0,0 +1,29 @@ +import { createI18n } from 'vue-i18n'; +import zh from './locales/zh.js'; +import en from './locales/en.js'; +import th from './locales/th.js'; + +const messages = { + 'zh': zh, + 'zh-CN': zh, + 'en': en, + 'en-US': en, + 'th': th, + 'th-TH': th +}; + +// 暂时固定为中文(不读取历史 language,避免英文/泰文残留) +const FIXED_LOCALE = 'zh-CN'; +if (typeof localStorage !== 'undefined') { + localStorage.setItem('language', FIXED_LOCALE); +} + +const i18n = createI18n({ + legacy: false, + locale: FIXED_LOCALE, + fallbackLocale: 'zh-CN', + messages +}); + +export default i18n; + diff --git a/web/src/images/assets/access.png b/web/src/images/assets/access.png new file mode 100644 index 0000000..eea8f5c Binary files /dev/null and b/web/src/images/assets/access.png differ diff --git a/web/src/images/assets/close.png b/web/src/images/assets/close.png new file mode 100644 index 0000000..d59cf7c Binary files /dev/null and b/web/src/images/assets/close.png differ diff --git a/web/src/images/assets/comment.svg b/web/src/images/assets/comment.svg new file mode 100644 index 0000000..11cbe5d --- /dev/null +++ b/web/src/images/assets/comment.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/src/images/assets/del.png b/web/src/images/assets/del.png new file mode 100644 index 0000000..1ecb9ad Binary files /dev/null and b/web/src/images/assets/del.png differ diff --git a/web/src/images/assets/delhui.png b/web/src/images/assets/delhui.png new file mode 100644 index 0000000..bd7f79d Binary files /dev/null and b/web/src/images/assets/delhui.png differ diff --git a/web/src/images/assets/document.png b/web/src/images/assets/document.png new file mode 100644 index 0000000..226321e Binary files /dev/null and b/web/src/images/assets/document.png differ diff --git a/web/src/images/assets/edit.png b/web/src/images/assets/edit.png new file mode 100644 index 0000000..81f1fad Binary files /dev/null and b/web/src/images/assets/edit.png differ diff --git a/web/src/images/assets/file.png b/web/src/images/assets/file.png new file mode 100644 index 0000000..a161b70 Binary files /dev/null and b/web/src/images/assets/file.png differ diff --git a/web/src/images/assets/goback.png b/web/src/images/assets/goback.png new file mode 100644 index 0000000..3b3270b Binary files /dev/null and b/web/src/images/assets/goback.png differ diff --git a/web/src/images/assets/gobackdel.png b/web/src/images/assets/gobackdel.png new file mode 100644 index 0000000..62aa4f6 Binary files /dev/null and b/web/src/images/assets/gobackdel.png differ diff --git a/web/src/images/assets/gobackdelhover.png b/web/src/images/assets/gobackdelhover.png new file mode 100644 index 0000000..1ecb9ad Binary files /dev/null and b/web/src/images/assets/gobackdelhover.png differ diff --git a/web/src/images/assets/gobackhover.png b/web/src/images/assets/gobackhover.png new file mode 100644 index 0000000..05a101b Binary files /dev/null and b/web/src/images/assets/gobackhover.png differ diff --git a/web/src/images/assets/load.png b/web/src/images/assets/load.png new file mode 100644 index 0000000..bedcc9d Binary files /dev/null and b/web/src/images/assets/load.png differ diff --git a/web/src/images/assets/manule.svg b/web/src/images/assets/manule.svg new file mode 100644 index 0000000..8722ec2 --- /dev/null +++ b/web/src/images/assets/manule.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/src/images/assets/month.svg b/web/src/images/assets/month.svg new file mode 100644 index 0000000..d0c344d --- /dev/null +++ b/web/src/images/assets/month.svg @@ -0,0 +1,3 @@ + + + diff --git a/web/src/images/assets/open.png b/web/src/images/assets/open.png new file mode 100644 index 0000000..704af3b Binary files /dev/null and b/web/src/images/assets/open.png differ diff --git a/web/src/images/assets/screen.png b/web/src/images/assets/screen.png new file mode 100644 index 0000000..59922f2 Binary files /dev/null and b/web/src/images/assets/screen.png differ diff --git a/web/src/images/assets/update.png b/web/src/images/assets/update.png new file mode 100644 index 0000000..9e5107c Binary files /dev/null and b/web/src/images/assets/update.png differ diff --git a/web/src/images/assets/upload.png b/web/src/images/assets/upload.png new file mode 100644 index 0000000..62bd0d2 Binary files /dev/null and b/web/src/images/assets/upload.png differ diff --git a/web/src/images/commen/addIcon.png b/web/src/images/commen/addIcon.png new file mode 100644 index 0000000..c1bc204 Binary files /dev/null and b/web/src/images/commen/addIcon.png differ diff --git a/web/src/images/commen/close.png b/web/src/images/commen/close.png new file mode 100644 index 0000000..f8d4593 Binary files /dev/null and b/web/src/images/commen/close.png differ diff --git a/web/src/images/commen/fail.png b/web/src/images/commen/fail.png new file mode 100644 index 0000000..00427b5 Binary files /dev/null and b/web/src/images/commen/fail.png differ diff --git a/web/src/images/commen/search.png b/web/src/images/commen/search.png new file mode 100644 index 0000000..95717cb Binary files /dev/null and b/web/src/images/commen/search.png differ diff --git a/web/src/images/commen/success.png b/web/src/images/commen/success.png new file mode 100644 index 0000000..985bfcb Binary files /dev/null and b/web/src/images/commen/success.png differ diff --git a/web/src/images/commen/time.png b/web/src/images/commen/time.png new file mode 100644 index 0000000..0b25514 Binary files /dev/null and b/web/src/images/commen/time.png differ diff --git a/web/src/images/download/allIn.png b/web/src/images/download/allIn.png new file mode 100644 index 0000000..47253cd Binary files /dev/null and b/web/src/images/download/allIn.png differ diff --git a/web/src/images/download/allInSelect.png b/web/src/images/download/allInSelect.png new file mode 100644 index 0000000..5785169 Binary files /dev/null and b/web/src/images/download/allInSelect.png differ diff --git a/web/src/images/download/down.png b/web/src/images/download/down.png new file mode 100644 index 0000000..677226d Binary files /dev/null and b/web/src/images/download/down.png differ diff --git a/web/src/images/download/download.png b/web/src/images/download/download.png new file mode 100644 index 0000000..a9b34d4 Binary files /dev/null and b/web/src/images/download/download.png differ diff --git a/web/src/images/download/downloadSelect.png b/web/src/images/download/downloadSelect.png new file mode 100644 index 0000000..314121d Binary files /dev/null and b/web/src/images/download/downloadSelect.png differ diff --git a/web/src/images/download/export.png b/web/src/images/download/export.png new file mode 100644 index 0000000..fa06ab8 Binary files /dev/null and b/web/src/images/download/export.png differ diff --git a/web/src/images/download/exportSelect.png b/web/src/images/download/exportSelect.png new file mode 100644 index 0000000..78b9cf5 Binary files /dev/null and b/web/src/images/download/exportSelect.png differ diff --git a/web/src/images/download/file.png b/web/src/images/download/file.png new file mode 100644 index 0000000..ad0f839 Binary files /dev/null and b/web/src/images/download/file.png differ diff --git a/web/src/images/export/error.png b/web/src/images/export/error.png new file mode 100644 index 0000000..ea8ea23 Binary files /dev/null and b/web/src/images/export/error.png differ diff --git a/web/src/images/export/upload.png b/web/src/images/export/upload.png new file mode 100644 index 0000000..bd98aba Binary files /dev/null and b/web/src/images/export/upload.png differ diff --git a/web/src/images/login/Rectangle.png b/web/src/images/login/Rectangle.png new file mode 100644 index 0000000..081cdfc Binary files /dev/null and b/web/src/images/login/Rectangle.png differ diff --git a/web/src/images/login/add.png b/web/src/images/login/add.png new file mode 100644 index 0000000..08c398a Binary files /dev/null and b/web/src/images/login/add.png differ diff --git a/web/src/images/login/bottom.png b/web/src/images/login/bottom.png new file mode 100644 index 0000000..3173305 Binary files /dev/null and b/web/src/images/login/bottom.png differ diff --git a/web/src/images/login/btn.png b/web/src/images/login/btn.png new file mode 100644 index 0000000..c9b469f Binary files /dev/null and b/web/src/images/login/btn.png differ diff --git a/web/src/images/login/ch.png b/web/src/images/login/ch.png new file mode 100644 index 0000000..d8daf3f Binary files /dev/null and b/web/src/images/login/ch.png differ diff --git a/web/src/images/login/close.png b/web/src/images/login/close.png new file mode 100644 index 0000000..1493d90 Binary files /dev/null and b/web/src/images/login/close.png differ diff --git a/web/src/images/login/close@2x.png b/web/src/images/login/close@2x.png new file mode 100644 index 0000000..f8d4593 Binary files /dev/null and b/web/src/images/login/close@2x.png differ diff --git a/web/src/images/login/confirm.png b/web/src/images/login/confirm.png new file mode 100644 index 0000000..547312d Binary files /dev/null and b/web/src/images/login/confirm.png differ diff --git a/web/src/images/login/del.png b/web/src/images/login/del.png new file mode 100644 index 0000000..1ecb9ad Binary files /dev/null and b/web/src/images/login/del.png differ diff --git a/web/src/images/login/delClose.png b/web/src/images/login/delClose.png new file mode 100644 index 0000000..f8d4593 Binary files /dev/null and b/web/src/images/login/delClose.png differ diff --git a/web/src/images/login/en.png b/web/src/images/login/en.png new file mode 100644 index 0000000..2fbf77a Binary files /dev/null and b/web/src/images/login/en.png differ diff --git a/web/src/images/login/loginBg.png b/web/src/images/login/loginBg.png new file mode 100644 index 0000000..6a8f560 Binary files /dev/null and b/web/src/images/login/loginBg.png differ diff --git a/web/src/images/login/none.png b/web/src/images/login/none.png new file mode 100644 index 0000000..456de50 Binary files /dev/null and b/web/src/images/login/none.png differ diff --git a/web/src/images/login/open.png b/web/src/images/login/open.png new file mode 100644 index 0000000..5a56e8c Binary files /dev/null and b/web/src/images/login/open.png differ diff --git a/web/src/images/login/passord.png b/web/src/images/login/passord.png new file mode 100644 index 0000000..e4c6e05 Binary files /dev/null and b/web/src/images/login/passord.png differ diff --git a/web/src/images/login/title.png b/web/src/images/login/title.png new file mode 100644 index 0000000..cab053d Binary files /dev/null and b/web/src/images/login/title.png differ diff --git a/web/src/images/login/tn.png b/web/src/images/login/tn.png new file mode 100644 index 0000000..059bf88 Binary files /dev/null and b/web/src/images/login/tn.png differ diff --git a/web/src/images/login/top.png b/web/src/images/login/top.png new file mode 100644 index 0000000..186cde4 Binary files /dev/null and b/web/src/images/login/top.png differ diff --git a/web/src/images/login/user.png b/web/src/images/login/user.png new file mode 100644 index 0000000..4522bea Binary files /dev/null and b/web/src/images/login/user.png differ diff --git a/web/src/images/logo.png b/web/src/images/logo.png new file mode 100644 index 0000000..ea9ea94 Binary files /dev/null and b/web/src/images/logo.png differ diff --git a/web/src/images/notice/alarm.png b/web/src/images/notice/alarm.png new file mode 100644 index 0000000..290791f Binary files /dev/null and b/web/src/images/notice/alarm.png differ diff --git a/web/src/images/notice/close.png b/web/src/images/notice/close.png new file mode 100644 index 0000000..f8d4593 Binary files /dev/null and b/web/src/images/notice/close.png differ diff --git a/web/src/images/notice/down.png b/web/src/images/notice/down.png new file mode 100644 index 0000000..e9a39da Binary files /dev/null and b/web/src/images/notice/down.png differ diff --git a/web/src/images/notice/low.svg b/web/src/images/notice/low.svg new file mode 100644 index 0000000..ebdf315 --- /dev/null +++ b/web/src/images/notice/low.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/web/src/images/notice/notice.png b/web/src/images/notice/notice.png new file mode 100644 index 0000000..03de143 Binary files /dev/null and b/web/src/images/notice/notice.png differ diff --git a/web/src/images/notice/system.png b/web/src/images/notice/system.png new file mode 100644 index 0000000..fc5a6e7 Binary files /dev/null and b/web/src/images/notice/system.png differ diff --git a/web/src/images/notice/time.png b/web/src/images/notice/time.png new file mode 100644 index 0000000..c7951d2 Binary files /dev/null and b/web/src/images/notice/time.png differ diff --git a/web/src/images/notice/up.png b/web/src/images/notice/up.png new file mode 100644 index 0000000..a83804d Binary files /dev/null and b/web/src/images/notice/up.png differ diff --git a/web/src/images/sider/assets.png b/web/src/images/sider/assets.png new file mode 100644 index 0000000..b5bd683 Binary files /dev/null and b/web/src/images/sider/assets.png differ diff --git a/web/src/images/sider/foldCompanyLoago.svg b/web/src/images/sider/foldCompanyLoago.svg new file mode 100644 index 0000000..a6ba87b --- /dev/null +++ b/web/src/images/sider/foldCompanyLoago.svg @@ -0,0 +1,4 @@ + + + + diff --git a/web/src/images/sider/foldlogo.svg b/web/src/images/sider/foldlogo.svg new file mode 100644 index 0000000..601f452 --- /dev/null +++ b/web/src/images/sider/foldlogo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/src/images/sider/log.svg b/web/src/images/sider/log.svg new file mode 100644 index 0000000..a27b018 --- /dev/null +++ b/web/src/images/sider/log.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/src/images/sider/metering.png b/web/src/images/sider/metering.png new file mode 100644 index 0000000..f87ebf7 Binary files /dev/null and b/web/src/images/sider/metering.png differ diff --git a/web/src/images/sider/newLogo.svg b/web/src/images/sider/newLogo.svg new file mode 100644 index 0000000..5228e39 --- /dev/null +++ b/web/src/images/sider/newLogo.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/src/images/sider/overview.svg b/web/src/images/sider/overview.svg new file mode 100644 index 0000000..a3b2c1e --- /dev/null +++ b/web/src/images/sider/overview.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/web/src/images/sider/siderTop.png b/web/src/images/sider/siderTop.png new file mode 100644 index 0000000..473c4c8 Binary files /dev/null and b/web/src/images/sider/siderTop.png differ diff --git a/web/src/images/sider/system.png b/web/src/images/sider/system.png new file mode 100644 index 0000000..814ed3e Binary files /dev/null and b/web/src/images/sider/system.png differ diff --git a/web/src/locales/en.js b/web/src/locales/en.js new file mode 100644 index 0000000..976e361 --- /dev/null +++ b/web/src/locales/en.js @@ -0,0 +1,1094 @@ +export default { + login: { + title: "Account Login", + username: "Username", + password: "Password", + autoLogin: "Remember me", + loginButton: "Login" + }, + menu: { + systemManagement: "System Management", + employeeManagement: "Employee Management", + userManagement: "User Management", + roleManagement: "Role Management", + factoryManagement: "Factory Management", + sensorManagement: "Sensor Management", + operationLogParent: "Operation Logs", + operationLog: "Operation Log", + assetManagement:"Asset Management", + attachmentManage:"Attach Management", + assetList:"Asset List", + assetProcess:"Asset Process", + deviceMaintain:"Device Maintain", + deviceHistory:"Device History", + deviceRepair:"Device Repair", + assetInventory:"Asset Inventory", + accessControlManage:"Access Control Management", + notificationManage:"Notification Management", + accessAlarmRecord:"Access Alarm Record", + assetAlarmRecord:"Asset Alarm Record", + measurementManagement:"Measurement Management", + deviceMetering:"Device Metering", + measureMaterialManage:"Material Metering", + overviewDashboard:"Overview Dashboard", + logout: "Logout" + }, + header: { + messageNotification: "Message Notification", + searchPlaceholder: "Please search...", + noticeDialogTitle: "Message Notification", + deviceAlarm: "Device Alarm", + systemNotification: "System Notification", + accessControlAlarm: "Access Control Alarm", + infoMachineOfflineReminder: "Info Machine Offline Reminder", + epcDisassemblyReminder: "EPC Disassembly Reminder", + epcLowBatteryReminder: "EPC Low Battery Reminder", + noticeReadAll: "Mark All as Read", + noticeUnread: "Unread", + noticeRead: "Read", + noticeExpand: "Expand", + noticeCollapse: "Collapse", + noticeLoading: "Loading...", + noticeNoMore: "No more notifications", + noticeEmpty: "No notifications", + noticeFetchListFail: "Failed to load notifications", + noticeReadAllFail: "Failed to mark all as read", + noticeReadAllSuccessDetail: "Marked as read successfully" + }, + importExport: { + importExport: "Import/Export", + downloadTemplate: "Download Template", + batchImport: "Batch Import", + export: "Export" + }, + batchImport: { + dialogTitle: "Import File", + step1Title: "Confirm Upload", + step1Desc: "Validation complete", + step2Title: "Upload Result", + step2DescError: "Upload failed", + step2DescSuccess: "Upload success", + step2DescPending: "Validation result", + clickUpload: "Click to upload", + dragHere: "Or drag file here", + parsing: "Parsing data...", + validationDone: "Validation complete, click Start Upload", + uploadFail: "Upload failed", + totalRows: "Total rows", + successCount: "Success", + failCount: "Failed", + firstError: "First error", + downloadErrorLink: "Download error file", + parseDone: "Parse complete", + downloadTemplateResult: "Download template match result", + downloadDataResult: "Download data validation result", + hintBatch: "(Please upload in batches if over 200k rows)", + reupload: "Re-upload", + startUpload: "Start Upload" + }, + common: { + selectAll: "Select All ({count} selected)", + selectedTotal: "{selected} selected / {total} total", + firstPage: "First", + prevPage: "Previous", + nextPage: "Next", + lastPage: "Last", + processing: "Processing...", + search: "Search", + reset: "Reset", + searchBtn: "Search", + resetBtn: "Reset", + pageUnderDevelopment: "Page under development", + batchDelete: "Batch Delete", + confirm: "Confirm", + cancel: "Cancel", + confirmDelete: "Confirm Delete", + deleteSingleConfirm: "Are you sure you want to delete this data?", + deleteBatchConfirm: "Are you sure you want to delete the selected {count} items?", + add: "Add", + update: "Update", + edit: "Edit", + detail: "Detail", + searchPlaceholder: "Please enter.....", + selectTimeRange: "Select {label} Range", + searchColumnPlaceholder: "Search {label}", + creatorName: "Creator", + createTime: "Create Time", + comment: "Comment", + description: "Description", + addSuccess: "Add Success", + addSuccessDetail: "Successfully added!", + editSuccess: "Edit Success", + editSuccessDetail: "Successfully updated!", + addFail: "Add Failed", + editFail: "Edit Failed", + deleteSuccess: "Delete Success", + deleteSuccessDetail: "Successfully deleted!", + deleteBatchSuccessDetail: "Deleted {count} items", + deleteFail: "Delete Failed", + operationFail: "Operation Failed", + tip: "Tip", + success: "Success", + warning: "Warning", + error: "Error", + requiredField: "{label} is required", + emailReminder: "Email Reminder", + emailReminderUpdateSuccess: "Email reminder updated successfully", + emailReminderUpdateFail: "Failed to update email reminder" + }, + employee: { + addEmployee: "Add Employee", + search: "Search", + batchDelete: "Batch Delete", + searchPlaceholder: "Please enter.....", + employeeName: "Employee Name", + contactPhone: "Contact Phone", + email: "Email", + emailInfo: "Email Info", + organizationStructure: "Organization Structure", + createTime: "Create Time", + selectTimeRange: "Select {label} Range", + searchColumn: "Search {label}", + query: "Query", + reset: "Reset", + close: "Close", + confirm: "Confirm", + cancel: "Cancel", + confirmDelete: "Confirm Delete", + deleteSingleConfirm: "Are you sure you want to delete this data?", + deleteBatchConfirm: "Are you sure you want to delete the selected {count} items?", + add: "Add", + edit: "Edit", + detail: "Detail", + xinXin: "Xinxin", + employeeNameRequired: "Employee name is required" + }, + user: { + addUser: "Add User", + editUser: "Edit User", + detailUser: "User Detail", + userName: "User Name", + employeeName: "Employee Name", + contactPhone: "Contact Phone", + email: "Email", + comment: "Comment", + roleName: "Role Name", + createTime: "Create Time", + userPassword: "Password", + confirmPassword: "Confirm Password", + manageEmployee: "Manage Employee", + manageRole: "Manage Role", + selectEmployee: "Please select employee", + selectRole: "Please select role", + selectedRolesCount: "{count} roles selected", + userNameRequired: "User name is required", + userPasswordRequired: "User password is required", + confirmPasswordRequired: "Confirm password is required", + manageEmployeeRequired: "Manage employee is required", + manageRoleRequired: "Manage role is required" + }, + operationLog: { + title: "Operation Log", + timestamp: "Time", + level: "Level", + source: "Source", + action: "Action", + message: "Message", + pageInfo: "{count} items on this page", + fetchFail: "Failed to load logs" + }, + role: { + addRole: "Add Role", + editRole: "Edit Role", + detailRole: "Role Detail", + roleName: "Role Name", + comment: "Comment", + creatorName: "Creator", + createTime: "Create Time", + noticePermission: "Notice Permission", + selectNoticePermission: "Please select notice permission", + roleNameRequired: "Role name is required", + noticePermissionRequired: "Notice permission is required", + importSuccess: "Role import successful", + advancedSettings: "Advanced Settings", + configurePagePermission: "Configure Page Permissions", + configureDataPermission: "Configure Data Permissions", + dataPermissionSubtitle: "(Unchecked fields are hidden from this role)", + all: "All", + submit: "Submit", + pagePermission: { + equipmentRepairReport: "Device Repair Report", + equipmentAcceptanceReport: "Device Acceptance Report", + equipmentMaintenanceReport: "Device Maintenance Report", + equipmentMeteringReport: "Device Metering Report" + }, + dataPermissionGroup: { + AssetAlarmRecord: "Asset Alarm Record", + AssetList: "Asset List", + AssetAcceptance: "Asset Acceptance", + DeviceEntry: "Device Entry", + DeviceMaintain: "Device Maintenance", + DeviceMetering: "Device Metering", + DeviceRepair: "Device Repair", + DeviceTransfer: "Device Transfer", + DeviceLoan: "Device Loan", + EmployeeManage: "Employee Management", + DeviceExFactory: "Device Ex-Factory", + FactoryManage: "Factory Management", + InventoryDetail: "Inventory Detail", + AssetInventory: "Asset Inventory", + IdleHandle: "Idle Handling", + MaterialMetering: "Material Metering", + AccessControlManage: "Access Control Management", + RoleManage: "Role Management", + SensorManage: "Sensor Management", + UserManage: "User Management", + OperationLog: "Operation Log" + }, + dataPermissionField: { + alarm_time_assetAlarmRecord: "Alarm Time", + alarm_type_assetAlarmRecord: "Alarm Type", + asset_no_assetAlarmRecord: "Asset No.", + asset_name_assetAlarmRecord: "Asset Name", + current_factory_assetAlarmRecord: "Current Plant Area", + epc_assetAlarmRecord: "EPC", + spec_model_assetAlarmRecord: "Specification Model", + factory_area_assetAlarmRecord: "Plant Area", + asset_dept_assetAlarmRecord: "Asset Department", + responsible_assetAlarmRecord: "Responsible Person", + signal_machine_assetAlarmRecord: "Signal Machine", + info_machine_name_assetAlarmRecord: "Info Machine Name", + agent_assetList: "Agent", + asset_no_assetList: "Asset No.", + asset_name_assetList: "Asset Name", + sub_asset_no_assetList: "Sub-asset No.", + sub_asset_assetList: "Sub-asset", + attachment_assetList: "Attachment", + entry_time_assetList: "Entry Time", + asset_class_assetList: "Asset Classification", + depreciation_period_assetList: "Depreciation Periods", + epc_assetList: "EPC", + factory_area_assetList: "Plant Area", + anti_dismantle_assetList: "Anti-tamper Reminder", + measure_type_assetList: "Measurement Type", + original_value_assetList: "Asset Original Value", + under_voltage_alarm_assetList: "Under-voltage Alarm", + maintain_type_assetList: "Maintenance Type", + manufacturer_assetList: "Manufacturer", + doc_no_assetList: "Data Number", + remark_assetList: "Remarks", + net_value_assetList: "Net Depreciation Value", + original_zy_no_assetList: "Original ZY No.", + factory_no_assetList: "Factory Number", + asset_dept_assetList: "Asset Department", + purchase_code_assetList: "Purchase Code", + asset_responsible_assetList: "Asset Responsible Person", + spec_model_assetList: "Specification Model", + asset_status_assetList: "Asset Status", + warranty_assetList: "Warranty Period", + accept_status_assetAcceptance: "Acceptance Status", + accept_responsible_assetAcceptance: "Acceptance Responsible", + asset_class_assetAcceptance: "Asset Classification", + asset_no_assetAcceptance: "Asset No.", + asset_name_assetAcceptance: "Asset Name", + attachment_assetAcceptance: "Attachment", + accept_finish_time_assetAcceptance: "Acceptance Completion Time", + factory_area_assetAcceptance: "Plant Area", + factory_no_assetAcceptance: "Factory Number", + asset_dept_assetAcceptance: "Asset Department", + plan_accept_time_assetAcceptance: "Planned Acceptance Time", + remark_assetAcceptance: "Remarks", + asset_responsible_assetAcceptance: "Asset Responsible Person", + accept_start_time_assetAcceptance: "Acceptance Initiation Time", + purchase_no_assetAcceptance: "Purchase No.", + accept_cycle_deviceEntry: "Acceptance Cycle", + agent_deviceEntry: "Agent", + asset_class_deviceEntry: "Asset Classification", + asset_no_deviceEntry: "Asset No.", + asset_name_deviceEntry: "Asset Name", + attachment_deviceEntry: "Attachment", + contract_no_deviceEntry: "Contract No.", + epc_deviceEntry: "EPC", + factory_area_deviceEntry: "Plant Area", + entry_time_deviceEntry: "Entry Time", + original_value_deviceEntry: "Asset Original Value", + manufacturer_deviceEntry: "Manufacturer", + factory_no_deviceEntry: "Factory Number", + asset_dept_deviceEntry: "Asset Department", + purchase_no_deviceEntry: "Purchase No.", + remark_deviceEntry: "Remarks", + asset_responsible_deviceEntry: "Asset Responsible Person", + spec_model_deviceEntry: "Specification Model", + temp_return_date_deviceEntry: "Temp. Return Date", + warranty_deviceEntry: "Warranty Period", + maintain_responsible_deviceMaintain: "Maintenance Responsible", + asset_no_deviceMaintain: "Asset No.", + asset_name_deviceMaintain: "Asset Name", + attachment_deviceMaintain: "Attachment", + create_time_deviceMaintain: "Create Time", + maintain_content_deviceMaintain: "Maintenance Content", + this_maintain_time_deviceMaintain: "This Maintenance Time", + next_maintain_time_deviceMaintain: "Next Maintenance Time", + asset_dept_deviceMaintain: "Asset Department", + maintain_cycle_deviceMaintain: "Maintenance Cycle", + spec_model_deviceMaintain: "Specification Model", + asset_status_deviceMaintain: "Asset Status", + meter_responsible_deviceMetering: "Metering Responsible", + asset_class_deviceMetering: "Asset Classification", + asset_no_deviceMetering: "Asset No.", + asset_name_deviceMetering: "Asset Name", + attachment_deviceMetering: "Attachment", + calibration_type_deviceMetering: "Calibration Type", + calibration_result_deviceMetering: "Calibration Result", + this_calibration_date_deviceMetering: "This Calibration Date", + measure_type_deviceMetering: "Measurement Type", + next_calibration_date_deviceMetering: "Next Calibration Date", + factory_no_deviceMetering: "Factory Number", + asset_dept_deviceMetering: "Asset Department", + cycle_deviceMetering: "Cycle", + remark_deviceMetering: "Remarks", + asset_responsible_deviceMetering: "Asset Responsible Person", + spec_model_deviceMetering: "Specification Model", + asset_status_deviceMetering: "Asset Status", + update_time_deviceMetering: "Update Time", + repair_responsible_deviceRepair: "Repair Responsible", + asset_class_deviceRepair: "Asset Classification", + expected_return_date_deviceRepair: "Expected Return Date", + fault_phenomenon_deviceRepair: "Fault Phenomenon", + asset_no_deviceRepair: "Asset No.", + asset_name_deviceRepair: "Asset Name", + fault_analysis_deviceRepair: "Fault Cause and Repair Details", + fault_type_deviceRepair: "Fault Type", + attachment_deviceRepair: "Attachment", + manufacturer_deviceRepair: "Manufacturer", + repair_finish_time_deviceRepair: "Repair Completion Time", + factory_no_deviceRepair: "Factory Number", + external_repair_unit_deviceRepair: "External Repair Unit", + asset_dept_deviceRepair: "Asset Department", + remark_deviceRepair: "Remarks", + internal_external_deviceRepair: "Internal/External Repair", + spec_model_deviceRepair: "Specification Model", + repair_start_time_deviceRepair: "Repair Initiation Time", + applicant_deviceTransfer: "Applicant", + original_dept_deviceTransfer: "Original Department", + asset_no_deviceTransfer: "Asset No.", + asset_name_deviceTransfer: "Asset Name", + receive_factory_deviceTransfer: "Receive Plant Area", + receive_dept_deviceTransfer: "Receive Department", + attachment_deviceTransfer: "Attachment", + receive_responsible_deviceTransfer: "Receive Responsible", + create_time_deviceTransfer: "Create Time", + remark_deviceTransfer: "Remarks", + factory_no_deviceTransfer: "Factory Number", + spec_model_deviceTransfer: "Specification Model", + applicant_dept_deviceLoan: "Applicant Department", + applicant_deviceLoan: "Applicant", + loan_due_time_deviceLoan: "Loan Due Time", + loan_factory_deviceLoan: "Borrow Plant Area", + asset_no_deviceLoan: "Asset No.", + asset_name_deviceLoan: "Asset Name", + loan_responsible_deviceLoan: "Borrow Responsible", + factory_no_deviceLoan: "Factory Number", + attachment_deviceLoan: "Attachment", + create_time_deviceLoan: "Create Time", + remark_deviceLoan: "Remarks", + spec_model_deviceLoan: "Specification Model", + loan_start_time_deviceLoan: "Loan Initiation Time", + create_time_employeeManage: "Create Time", + email_employeeManage: "Email", + employee_name_employeeManage: "Employee Name", + org_structure_employeeManage: "Organization Structure", + contact_phone_employeeManage: "Contact Phone", + applicant_dept_deviceExFactory: "Applicant Department", + applicant_deviceExFactory: "Applicant", + asset_no_deviceExFactory: "Asset No.", + asset_name_deviceExFactory: "Asset Name", + attachment_deviceExFactory: "Attachment", + create_time_deviceExFactory: "Create Time", + expected_return_time_deviceExFactory: "Expected Return Time", + ex_factory_time_deviceExFactory: "Ex-factory Time", + factory_no_deviceExFactory: "Factory Number", + remark_deviceExFactory: "Remarks", + spec_model_deviceExFactory: "Specification Model", + creator_factoryManage: "Creator", + create_time_factoryManage: "Create Time", + factory_name_factoryManage: "Factory Name", + remark_factoryManage: "Remark", + asset_no_inventoryDetail: "Asset No.", + asset_name_inventoryDetail: "Asset Name", + epc_inventoryDetail: "EPC", + factory_no_inventoryDetail: "Factory Number", + asset_dept_inventoryDetail: "Asset Department", + factory_inventoryDetail: "Plant Area", + responsible_inventoryDetail: "Responsible Person", + info_machine_id_inventoryDetail: "Info Machine ID", + info_machine_name_inventoryDetail: "Info Machine Name", + spec_model_inventoryDetail: "Specification Model", + inventory_no_assetInventory: "Inventory No.", + to_inventory_assetInventory: "To Inventory", + create_time_assetInventory: "Create Time", + loss_assets_assetInventory: "Shortage", + gain_assets_assetInventory: "Surplus", + no_epc_assets_assetInventory: "No EPC", + inventory_time_assetInventory: "Inventory Time", + apply_dept_idleHandle: "Apply Department", + years_to_plant_idleHandle: "Years to Plant", + applicant_idleHandle: "Applicant", + factory_no_idleHandle: "Factory Number", + asset_no_idleHandle: "Asset No.", + asset_name_idleHandle: "Asset Name", + description_idleHandle: "Description", + spec_model_idleHandle: "Specification Model", + attachment_idleHandle: "Attachment", + asset_status_idleHandle: "Asset Status", + create_time_idleHandle: "Create Time", + idle_opinion_idleHandle: "Idle Opinion", + meter_responsible_materialMetering: "Metering Responsible", + material_no_materialMetering: "Material No.", + remark_materialMetering: "Remarks", + material_class_materialMetering: "Material Category", + material_name_materialMetering: "Material Name", + asset_responsible_materialMetering: "Asset Responsible Person", + attachment_materialMetering: "Attachment", + measure_type_materialMetering: "Measurement Type", + spec_model_materialMetering: "Specification Model", + calibration_type_materialMetering: "Calibration Type", + next_calibration_date_materialMetering: "Next Calibration Date", + material_status_materialMetering: "Material Status", + calibration_result_materialMetering: "Calibration Result", + asset_dept_materialMetering: "Asset Department", + update_time_materialMetering: "Update Time", + this_calibration_date_materialMetering: "This Calibration Date", + cycle_materialMetering: "Cycle", + asset_no_accessControlManage: "Asset No.", + access_control_accessControlManage: "Access Control", + asset_name_accessControlManage: "Asset Name", + asset_status_accessControlManage: "Asset Status", + epc_accessControlManage: "EPC", + access_expire_time_accessControlManage: "Access Expiry Time", + asset_dept_accessControlManage: "Asset Department", + asset_responsible_accessControlManage: "Asset Responsible", + creator_roleManage: "Creator", + create_time_roleManage: "Create Time", + description_roleManage: "Description", + role_name_roleManage: "Role Name", + permission_type_roleManage: "Permission Type", + create_time_sensorManage: "Create Time", + factory_name_sensorManage: "Factory Name", + sensor_no_sensorManage: "Sensor Number", + sensor_name_sensorManage: "Sensor Name", + sensor_type_sensorManage: "Sensor Type", + online_status_sensorManage: "Online Status", + create_time_userManage: "Create Time", + email_userManage: "Email", + employee_name_userManage: "Employee Name", + data_permission_userManage: "Data Permission", + description_userManage: "Description", + role_name_userManage: "Role Name", + contact_phone_userManage: "Contact Phone", + username_userManage: "Username" + } + }, + factory: { + addFactory: "Add Factory", + editFactory: "Edit Factory", + detailFactory: "Factory Detail", + factoryName: "Factory Name", + comment: "Comment", + creatorName: "Creator", + createTime: "Create Time", + factoryNameRequired: "Factory name is required" + }, + sensor: { + addSensor: "Add Sensor", + editSensor: "Edit Sensor", + detailSensor: "Sensor Detail", + sensorNumber: "Sensor Number", + sensorName: "Sensor Name", + factoryName: "Factory Name", + onlineStatus: "Online Status", + sensorType: "Sensor Type", + createTime: "Create Time", + relatedFactory: "Related Factory", + selectSensorType: "Please select sensor type", + selectFactory: "Please select factory", + sensorNameRequired: "Sensor/Info machine name is required", + sensorTypeRequired: "Sensor/Info machine type is required", + factoryAreaRequired: "Related factory is required" + }, + measureMaterial: { + addMaterialMetering: "Add Material Metering", + editMaterialMetering: "Edit Material Metering", + materialName: "Material Name", + materialNumber: "Material Number", + period: "Cycle", + periodMonths: "Cycle (months)", + nextCalibrateTime: "Next Calibration Time", + nextCalibrate: "Next Calibration", + attachments: "Attachments", + attachmentName: "Attachment Name", + materialCategory: "Material Category", + assetDepartment: "Asset Department", + typeSpecification: "Specification Model", + assetPic: "Asset Responsible Person", + calibrationResult: "Calibration Result", + measurementType: "Measurement Type", + calibrationType: "Calibration Type", + calibrationTypeShort: "Calibration Type", + meteringPic: "Measurement Responsible Person", + comment: "Remark", + commentInfo: "Remark Info", + calibrateTime: "Calibration Time", + materialStatus: "Material Status", + pleaseAddAttachment: "Please add attachment", + addAttachment: "Add Attachment", + selectAttachment: "Select Attachment", + confirmSelect: "Confirm Select", + templateDownloadSuccess: "Template downloaded successfully", + importSuccess: "Material metering imported successfully", + importFail: "Material metering import failed", + exportSuccess: "Export successful", + exportFail: "Export failed", + getDataFail: "Failed to fetch data", + requiredField: " is required", + selectedAttachmentsCount: "Selected {count} attachment(s)", + pleaseSelectAtLeastOneFile: "Please select at least one file", + nonMetering: "Non-metering", + currentMonthMetering: "Current Month Metering", + batchUpdate: "Batch Update", + batchUpdateSuccess: "Batch update successful", + batchUpdateFail: "Batch update failed", + pleaseSelectAtLeastOne: "Please select at least one record" + }, + deviceMetering: { + addDeviceMetering: "Add Device Metering", + editDeviceMetering: "Edit Device Metering", + selectAssetName: "Select Asset Name", + pleaseSelectAssetName: "Please select asset name", + pleaseSelectMeasurementType: "Please select measurement type", + importSuccess: "Device metering imported successfully", + importFail: "Device metering import failed", + pleaseSelectOneAsset: "Please select one asset", + qualificationPass: "Pass", + qualificationFail: "Fail", + templateFileName: "DeviceMeteringImportTemplate.xlsx", + exportFileNamePrefix: "DeviceMeteringExport", + getDataFail: "Failed to fetch data", + batchUpdateSuccessDetail: "Batch update completed successfully.", + getAssetListFail: "Failed to fetch asset list", + pleaseSelectCalibrationType: "Please select calibration type", + pleaseSelectCalibrationResult: "Please select calibration result", + calibrationTypeInternal: "Internal Calibration", + calibrationTypeExternal: "External Calibration", + calibrationTypeExempt: "Exempt", + calibrationResultPass: "Pass", + calibrationResultLimited: "Limited Use", + calibrationResultFail: "Fail" + }, + deviceRepair: { + addDeviceRepair: "Add Device Repair", + editDeviceRepair: "Edit Device Repair", + batchUpdate: "Batch Update", + repairPic: "Repair Responsible Person", + calibrationResult: "Calibration Result", + faultPhenomenon: "Fault Phenomenon", + internalOrExternalRepair: "Internal/External Repair", + faultReasonAndRepairContent: "Fault Cause and Repair Content", + externalRepairUnit: "External Repair Unit", + faultCategory: "Fault Category", + repairedReturnDate: "Repair Return Date", + repairInitiationDate: "Repair Initiation Time", + createTime: "Create Time", + initiationTime: "Initiation Time", + completionTime: "Completion Time", + pleaseSelectAssetName: "Please select asset name", + pleaseEnterFaultPhenomenon: "Enter fault phenomenon", + pleaseEnterExternalRepairUnit: "Enter external repair unit", + pleaseEnterFaultCategory: "Enter fault category", + pleaseSelectRepairInitiationDate: "Select repair initiation time", + pleaseSelectCompletionTime: "Select repair completion time", + pleaseEnterRepairPic: "Enter repair responsible person", + pleaseEnterInternalOrExternalRepair: "Enter internal/external repair", + pleaseSelectRepairedReturnDate: "Select repair return date", + pleaseEnterFaultReasonAndRepairContent: "Enter fault cause and repair content", + pleaseEnterComment: "Enter remark", + selectAssetName: "Select Asset Name", + assetSelectorSearchPlaceholder: "Please enter what you want to search...", + assetSelectorColumnId: "ID", + assetSelectorConfirm: "Confirm", + pleaseSelectOneAsset: "Please select one asset", + getAssetListFail: "Failed to fetch asset list", + templateFileName: "DeviceRepairImportTemplate.xlsx", + templateDownloadSuccess: "Template downloaded successfully", + importSuccess: "Device repair imported successfully", + importFail: "Device repair import failed", + exportFileNamePrefix: "DeviceRepairExport", + pleaseFillAtLeastOneBatch: "Please fill in at least one field to update", + batchUpdateSuccess: "Batch update successful", + batchUpdateFail: "Batch update failed", + pleaseSelectAtLeastOne: "Please select at least one item", + getDataFail: "Failed to fetch device repair data" + }, + deviceMaintain: { + addMaintenancePlan: "Add Maintenance Plan", + remarkUpdate: "Remark Update", + batchUpdate: "Batch Update", + addMaintenancePlanTitle: "Add Device Maintenance Plan", + editMaintenancePlanTitle: "Edit Device Maintenance Plan", + assetName: "Asset Name", + assetNumber: "Asset Number", + maintenancePic: "Maintenance Responsible", + attachments: "Attachments", + assetStatus: "Asset Status", + assetDepartment: "Asset Department", + typeSpecification: "Specification & Model", + productionNumber: "Factory Number", + originZyNumber: "Origin ZY Number", + maintenancePeriod: "Maintenance Period", + maintenancePeriodDays: "Maintenance Period (days)", + maintenanceContent: "Maintenance Content", + comment: "Remark", + nextMaintenanceTime: "Next Maintenance Time", + maintenanceTime: "Maintenance Time", + createTime: "Create Time", + deviceHistory: "Device Maintenance History", + attachmentName: "Attachment Name", + pleaseAddAttachment: "Please add attachment", + addAttachment: "Add Attachment", + pleaseEnterComment: "Please enter remark", + maintenancePersonnel: "Maintenance Personnel", + pleaseEnterMaintenancePersonnel: "Please enter maintenance personnel", + pleaseEnterMaintenanceContent: "Please enter maintenance content", + pleaseSelectMaintenanceTime: "Please select maintenance time", + batchImportTitle: "Batch Import", + parseTemplate: "Parse Template", + parseTemplateDesc: "Verify template format", + parseData: "Parse Data", + parseDataDesc: "Verify upload data format", + confirmUpload: "Confirm Upload", + confirmUploadDesc: "Verification complete, confirm upload", + pleaseSelectFile: "Please select file to upload", + uploadHintLarge: "(For over 200k records, please upload in batches)", + reupload: "Re-upload", + startUpload: "Start Upload", + pleaseSelectAssetName: "Please select asset name", + submit: "Submit", + getAssetListFail: "Failed to fetch asset list", + pleaseSelectOneAsset: "Please select one asset", + getDataFail: "Failed to fetch device maintenance data", + maintenancePeriodRequired: "Maintenance period is required", + maintenancePicRequired: "Maintenance responsible is required", + assetNameRequired: "Asset name is required", + maintenanceContentRequired: "Maintenance content is required", + pleaseSelectAtLeastOne: "Please select at least one item", + batchUpdateSuccess: "Batch update successful", + batchUpdateFail: "Batch update failed", + remarkUpdateSuccess: "Remark update successful", + remarkUpdateFail: "Remark update failed", + templateDownloadSuccess: "Template downloaded successfully", + templateFileName: "DeviceMaintainImportTemplate.xlsx", + pleaseSelectFileFirst: "Please select a file first", + importSuccess: "Device maintenance plan imported successfully", + importFail: "Device maintenance plan import failed", + exportFileNamePrefix: "DeviceMaintainExport", + exportNotImplemented: "Export not implemented" + }, + deviceHistory: { + pageTitle: "Device Maintenance History", + searchPlaceholder: "Please enter what you want to search...", + addMaintenanceHistory: "Add Maintenance History", + maintenancePlan: "Maintenance Plan", + maintenancePersonnel: "Maintenance Personnel", + maintenanceContent: "Maintenance Content", + attachments: "Attachments", + maintenanceTime: "Maintenance Time", + addTitle: "Add Device Maintenance History", + editTitle: "Edit Maintenance History", + maintenancePersonnelLabel: "Maintenance Personnel:", + maintenanceContentLabel: "Maintenance Content:", + maintenancePlanLabel: "Maintenance Plan:", + pleaseSelectMaintenancePlan: "Please select maintenance plan", + maintenanceTimeLabel: "Maintenance Time:", + attachmentNameLabel: "Attachment Name:", + pleaseAddAttachment: "Please add attachment", + addAttachment: "Add Attachment", + selectMaintenancePlan: "Select Maintenance Plan", + searchContentPlaceholder: "Please enter what you want to search...", + assetName: "Asset Name", + assetNumber: "Asset Number", + maintenancePic: "Maintenance Responsible", + maintenancePersonnelRequired: "Maintenance personnel is required", + maintenanceTimeRequired: "Maintenance time is required", + maintenancePlanRequired: "Maintenance plan is required", + pleaseSelectOneAsset: "Please select one asset", + getDataFail: "Failed to fetch device maintenance history data", + operationFailRetry: "Operation failed, please try again" + }, + assetList: { + addAssetList: "Add Asset List", + editAssetList: "Edit Asset List", + accessControl: "Access Control", + batchUpdate: "Batch Update", + accessControlConfig: "Access Control Config", + accessListHint: "Access list (checked items will not alarm when passed):", + permissionExpiryTime: "Permission expiry time:", + loading: "Loading...", + submit: "Submit", + getDataFail: "Failed to fetch asset list data", + templateFileName: "AssetListImportTemplate.xlsx", + templateDownloadSuccess: "Template downloaded successfully", + downloadTemplateFail: "Failed to download template", + importSuccess: "Asset list imported successfully", + importFail: "Asset list import failed", + exportSuccess: "Export successful", + exportFail: "Export failed", + exportFileNamePrefix: "AssetListExport", + selectedAttachmentsCount: "Selected {count} attachment(s)", + pleaseSelectAtLeastOneFile: "Please select at least one file", + pleaseSelectAtLeastOne: "Please select at least one item", + getAccessControlListFail: "Failed to get access control list", + accessControlSaveSuccess: "Access control saved successfully", + accessControlSaveFail: "Failed to save access control", + pleaseFillAtLeastOneBatch: "Please fill in at least one field to update", + batchUpdateSuccess: "Batch update successful", + batchUpdateFail: "Batch update failed", + getFactoryAreaListFail: "Failed to get factory area list", + selectDate: "Select date", + accessControlSelectAtLeastOne: "Please select at least one access control", + accessControlSelectExpiryDate: "Please select permission expiry time", + epc: "EPC", + assetName: "Asset Name", + assetNumber: "Asset Number", + deviceStatus: "Device Status", + originZyNumber: "Origin ZY Number", + typeSpecification: "Specification Model", + productionNumber: "Factory Number", + assetDepartment: "Asset Department", + factoryArea: "Factory Area", + manufacturer: "Manufacturer", + assetStatus: "Asset Status", + maintenanceType: "Maintenance Type", + measurementType: "Measurement Type", + assetCategory: "Asset Category", + assetPic: "Asset Responsible Person", + responsiblePerson: "Responsible Person", + warrantyPeriod: "Warranty Period", + entryTime: "Entry Time", + assetOriginalValue: "Asset Original Value", + agent: "Agent", + depreciationPeriod: "Depreciation Period", + ancillaryAssets: "Ancillary Assets", + procurementCode: "Procurement Code", + procurementCodeNumber: "Procurement Number", + ancillaryAssetsNumber: "Ancillary Assets Number", + dataNumber: "Data Number", + lowVoltageWarning: "Low Voltage Warning", + assetAntiTheftRemind: "Asset Anti-theft Remind", + netDepreciationValue: "Net Depreciation Value", + attachments: "Attachments", + comment: "Remark", + createTime: "Create Time", + pleaseAddAttachment: "Please add attachment", + addAttachment: "Add Attachment", + enterAssetStatus: "Enter asset status", + enterDeviceStatus: "Enter device status", + selectMaintenanceType: "Select maintenance type", + selectMeasurementType: "Select measurement type", + enterAncillaryAssets: "Enter ancillary assets", + enterOriginZyNumber: "Enter origin ZY number", + enterDataNumber: "Enter data number", + enterLowVoltageWarning: "Enter low voltage warning", + enterAncillaryAssetsNumber: "Enter ancillary assets number", + enterNetDepreciationValue: "Net depreciation value", + enterRemark: "Enter remark", + enterAssetDepartment: "Enter asset department", + enterAssetPic: "Enter asset responsible person", + enterFactoryArea: "Enter factory area", + enterRemarkBatch: "Enter remark", + enterPassword: "Enter password", + passwordLabel: "Enter password:", + statusOnline: "Online", + statusOffline: "Offline", + statusUnknown: "Unknown", + statusShutdown: "Shutdown", + statusMaintenance: "Maintenance", + statusExternalRepair: "External Repair", + statusNormal: "Normal" + }, + assetInventory: { + autoInventory: "Manual Inventory", + inventorying: "Inventorying...", + inventoryNumber: "Inventory No.", + shouldInventoryAssets: "To Inventory", + lostAssets: "Shortage", + profitAssets: "Surplus", + noEpcAssets: "No EPC", + inventoryTime: "Inventory Time", + historyData: "History Data", + searchPlaceholder: "Please enter what you want to search...", + exportSuccess: "Export successful", + exportFail: "Export failed", + autoInventoryTriggered: "Manual inventory triggered", + inventoryCommandIssuedSuccess: "Inventory command issued successfully", + autoInventoryFailed: "Manual inventory failed", + exportFileNamePrefix: "AssetInventoryExport", + exportSuffix: "Export", + inventoryDataErrorPrefix: "Asset inventory data ", + historyDataErrorPrefix: "History data ", + infoMachineId: "Info Machine ID", + infoMachineName: "Info Machine Name", + getAssetListFail: "Failed to fetch asset list", + getDataFail: "Failed to fetch data", + getHistoryDataFail: "Failed to fetch history data", + error: "Error" + }, + alarmRecord: { + tabAccessAlarm: "Access Alarm", + tabInventoryAlarm: "Inventory Alarm", + belongFactoryArea: "Factory Area", + currentFactoryArea: "Current Factory Area", + alarmTime: "Alarm Time", + infoMachineName: "Info Machine Name", + signalMachine: "Signal Machine", + alarmType: "Alarm Type", + accessAlarmExportFileName: "AccessAlarmRecordExport", + inventoryAlarmExportFileName: "InventoryAlarmRecordExport", + accessAlarmListErrorPrefix: "Access alarm record list ", + inventoryAlarmListErrorPrefix: "Inventory alarm record list ", + getDataFail: "Failed to fetch data", + exportSuccess: "Export successful", + exportFail: "Export failed", + error: "Error" + }, + attachmentManage: { + selectAll: "Select All", + selectedCount: "({count} selected)", + rename: "Rename", + delete: "Delete", + batchDownload: "Batch Download", + rootDir: "Root", + newFolder: "New Folder", + recycleBin: "Recycle Bin", + fullscreen: "Fullscreen", + exitFullscreen: "Exit Fullscreen", + attachmentName: "Name", + modifiedDate: "Modified", + type: "Type", + size: "Size", + action: "Action", + loading: "Loading...", + dragUploadHint: "Drag files here to upload", + download: "Download", + noFiles: "No files", + selectedItems: "{count} selected / ", + totalItems: "{count} items", + add: "Add", + uploadFile: "Upload File", + pleaseEnterFolderName: "Enter folder name", + confirmDelete: "Confirm Delete", + deleteConfirmMessage: "Delete {names}?", + pleaseEnterNewName: "Enter new name", + uploadTitle: "Upload File", + cancelUpload: "Cancel Upload", + waitUpload: "Waiting...", + uploadDone: "Done ({size})", + uploadFailed: "Upload failed", + confirmCancelUpload: "Confirm Cancel Upload", + confirmCancelUploadMessage: "Cancel upload?", + cancelUploadHint: "Files being uploaded will be interrupted", + name: "Name", + path: "Path", + recycleEmpty: "Recycle bin is empty", + recycleTotal: "{count} items", + confirmDeletePermanent: "Permanently delete {names}?", + properties: "Properties", + propertyType: "Type:", + propertyOriginalPath: "Original location:", + propertySize: "Size:", + propertyDeletedTime: "Deleted:", + propertyCreatedTime: "Created:", + restore: "Restore (R)", + restoreSuccess: "Restored successfully", + batchRestoreSuccess: "Restored {count} item(s)", + batchRestore: "Batch Restore", + batchDelete: "Batch Delete", + batchDeleteRecycleSuccess: "Deleted {success} item(s){failPart}", + batchDeleteRecycleFailPart: ", failed {count} item(s)", + batchDeleteRecycleAllFail: "All items failed to delete", + deleteSuccess: "Deleted", + deleteSuccessDetail: "Selected items deleted successfully!", + deleteFail: "Delete failed", + pleaseEnterFolderNameTip: "Please enter folder name", + createFolderSuccess: "Folder created successfully", + pleaseEnterNewNameTip: "Please enter new name", + renameSuccess: "Renamed successfully", + renameFail: "Rename failed", + downloadSuccess: "File downloaded successfully", + downloadFail: "Download failed", + pleaseSelectAtLeastOne: "Please select at least one item", + batchDownloadSuccess: "Downloaded {count} file(s)", + batchDownloadFail: "Batch download failed", + uploadCanceled: "Canceled", + uploadCanceledDetail: "Upload canceled", + pasteNoContent: "Nothing to paste", + pasteSuccess: "Pasted {success} item(s){failPart}", + pasteFailPart: ", failed {count} item(s)", + pasteFail: "Paste failed", + targetExistsSameName: "A file or folder with the same name already exists", + moveSuccess: "Moved {name}", + moveFail: "Move failed", + uploadSuccessDetail: "Uploaded {success} file(s){failPart}", + uploadFailPart: ", failed {count}", + uploadAllFail: "All files failed to upload", + uploadFail: "Upload failed", + loadListFail: "Failed to load file list, please try again", + loadListFailShort: "Failed to load file list", + typeFolder: "Folder", + typeFile: "File", + typePdf: "PDF Document", + typeDoc: "Word Document", + typeXlsx: "Excel Document", + typePpt: "PowerPoint Document", + typeTxt: "Text Document", + typeJson: "JSON File", + typeJs: "JavaScript File", + typeTs: "TypeScript File", + typeVue: "Vue File", + typeHtml: "HTML Document", + typeCss: "CSS File", + typeJpeg: "JPEG Image", + typePng: "PNG Image", + typeGif: "GIF Image", + typeZip: "ZIP Archive", + typeRar: "RAR Archive", + type7z: "7Z Archive", + typeLnk: "Shortcut", + typeExe: "Executable" + }, + accessControlManage: { + addAccessControl: "Add Access Control", + editAccessControl: "Edit Access Control", + accessControlBtn: "Access Control", + accessListLink: "Access List", + accessColumn: "Access", + expirationTime: "Access Expiry Time", + selectInfoMachinePlaceholder: "Please select info machine name", + selectAssetNamePlaceholder: "Please select asset name", + infoMachineNameLabel: "Info Machine Name", + expirationTimeLabel: "Access Expiry Time", + assetNameLabel: "Asset Name", + selectDatePlaceholder: "Please select date", + accessListDialogTitle: "Access List", + infoMachineType: "Info Machine Type", + typeAccess: "Access", + typeInventory: "Inventory", + onlineStatus: "Online Status", + factoryName: "Factory Name", + infoMachineNumber: "Info Machine Number", + searchKeywordPlaceholder: "Please enter search keyword...", + searchContentPlaceholder: "Please enter what you want to search...", + close: "Close", + selectAttachment: "Select Attachment", + selectAssetNameTitle: "Select Asset Name", + selectInfoMachineTitle: "Select Info Machine Name", + statusInUse: "In Use", + statusAccept: "Acceptance", + getAssetListFail: "Failed to fetch asset list", + getDataFail: "Failed to fetch data", + dataErrorPrefix: "Access control data ", + pleaseSelectOneAsset: "Please select one asset", + getInfoMachineListFail: "Failed to fetch info machine list", + pleaseSelectAtLeastOneInfoMachine: "Please select at least one info machine", + getAccessListFail: "Failed to fetch access list", + pleaseSelectAtLeastOne: "Please select at least one item", + accessControlSaveSuccess: "Access control saved successfully", + accessControlSaveFail: "Failed to save access control", + infoMachineNameRequired: "Info machine name is required", + expirationTimeRequired: "Access expiry time is required", + assetNameRequired: "Asset name is required", + error: "Error", + totalCount: "{count} total" + }, + equipmentMeteringReportPage: { + reportPageTitle: "Monthly equipment metering report", + statisticsTitle: "Monthly equipment metering report statistics", + selectDepartment: "Select department", + toggleAllDepartments: "Select all", + year: "Year", + month: "Month", + assetDepartment: "Asset department", + actualCompleted: "Actual completed quantity", + shouldCompleted: "Should be completed quantity", + onTimeRate: "On-time metering rate", + departmentsSelectedSummary: "{count} departments selected", + summaryColumn: "Summary" + }, + equipmentRepairReportPage: { + pageTitle: "Equipment repair report", + section1Title: "Monthly equipment failure rate by department", + section2Title: "Annual equipment failure rate", + section3Title: "Equipment failure rate by vendor", + selectVendor: "Select vendor", + statUnit: "Unit", + statPeriod: "Period", + summaryUnit: "Summary", + accidentCount: "Incidents", + totalEquipment: "Total equipment", + ratioRow: "Ratio", + failureRateTarget: "Failure rate target", + vendorsSelectedSummary: "{count} vendors selected", + toggleAllVendors: "Select all", + chartPlaceholderHint: "Chart area", + rowMetricColumn: "Metric", + failureCount: "Failures", + internalRepairDone: "Completed repairs (in-house)", + externalRepairDone: "Completed repairs (external)", + underRepair: "Under repair", + failureRate: "Equipment failure rate" + }, + overviewDashboardPage: { + monthlySectionTitle: "Monthly statistics dashboard", + annualSectionTitle: "Annual statistics dashboard", + assetDeptSectionTitle: "By asset department", + manufacturerSectionTitle: "By manufacturer", + assetYearSectionTitle: "By asset year", + chartAssetQty: "Asset quantity", + chartAssetNetValue: "Net asset value", + monthSuffix: "", + monthlyMetrics: { + entry_count: "Entry count", + exit_count: "Exit count", + acceptance_count: "Completed acceptance count", + pending_acceptance_count: "Pending acceptance count", + acceptance_overdue_rate: "Acceptance overdue rate", + maintenance_completed_count: "Maintenance completed count", + maintenance_on_time_rate: "Maintenance on-time rate", + metering_completed_count: "Metering completed count", + metering_on_time_rate: "Metering on-time rate", + equipment_failure_count: "Equipment failure count", + equipment_failure_rate: "Equipment failure rate", + repair_completed_title: "Repairs completed", + repair_under_repair_title: "Cumulative under repair", + repair_internal_external_hint: "Internal count / external count", + idle_equipment_count: "Idle equipment count", + idle_asset_value: "Idle asset net value", + }, + annualMetrics: { + entry_count: "Entry count (annual)", + exit_count: "Exit count (annual)", + acceptance_count: "Completed acceptance count (annual)", + pending_acceptance_count: "Pending acceptance count (annual)", + acceptance_overdue_rate: "Acceptance overdue rate (annual)", + equipment_failure_count: "Equipment failure count (annual)", + equipment_failure_rate: "Equipment failure rate (annual)", + idle_equipment_count: "Idle equipment count (annual)", + idle_asset_value: "Idle asset net value (annual)", + maintenance_completed_count: "Maintenance completed count (annual)", + maintenance_rate: "Maintenance rate (annual)", + maintenance_on_time_rate: "Maintenance on-time rate (annual)", + metering_completed_count: "Metering completed count (annual)", + metering_rate: "Metering rate (annual)", + }, + } +}; + diff --git a/web/src/locales/th.js b/web/src/locales/th.js new file mode 100644 index 0000000..f68eaff --- /dev/null +++ b/web/src/locales/th.js @@ -0,0 +1,1094 @@ +export default { + login: { + title: "เข้าสู่ระบบ", + username: "ชื่อผู้ใช้", + password: "รหัสผ่าน", + autoLogin: "เข้าสู่ระบบอัตโนมัติครั้งถัดไป", + loginButton: "เข้าสู่ระบบ" + }, + menu: { + systemManagement: "การจัดการระบบ", + employeeManagement: "การจัดการพนักงาน", + userManagement: "การจัดการผู้ใช้", + roleManagement: "การจัดการบทบาท", + factoryManagement: "การจัดการโรงงาน", + sensorManagement: "การจัดการเซ็นเซอร์", + operationLogParent: "บันทึกการดำเนินการ", + operationLog: "บันทึกการดำเนินการ", + assetManagement:"การจัดการสินทรัพย์", + attachmentManage:"การจัดการไฟล์แนบ", + assetList:"รายการสินทรัพย์", + assetProcess:"กระบวนการสินทรัพย์", + deviceMaintain:"การบำรุงรักษาอุปกรณ์", + deviceHistory:"ประวัติการบำรุงรักษาอุปกรณ์", + deviceRepair:"การซ่อมแซมอุปกรณ์", + assetInventory:"การตรวจนับสินทรัพย์", + accessControlManage:"การจัดการสิทธิ์การเข้าถึง", + notificationManage:"การจัดการการแจ้งเตือน", + accessAlarmRecord:"บันทึกการแจ้งเตือนการเข้าถึง", + assetAlarmRecord:"บันทึกการแจ้งเตือนสินทรัพย์", + measurementManagement:"การจัดการการวัด", + deviceMetering:"การวัดอุปกรณ์", + measureMaterialManage:"การวัดวัสดุ", + overviewDashboard:"แดชบอร์ดภาพรวม", + logout: "ออกจากระบบ" + }, + header: { + messageNotification: "การแจ้งเตือน", + searchPlaceholder: "กรุณาพิมพ์สิ่งที่ต้องการค้นหา...", + noticeDialogTitle: "การแจ้งเตือน", + deviceAlarm: "การแจ้งเตือนอุปกรณ์", + systemNotification: "การแจ้งเตือนระบบ", + accessControlAlarm: "การแจ้งเตือนการควบคุมการเข้าถึง", + infoMachineOfflineReminder: "การแจ้งเตือนเครื่องข้อมูลออฟไลน์", + epcDisassemblyReminder: "การแจ้งเตือนการถอด EPC", + epcLowBatteryReminder: "การแจ้งเตือนแบตเตอรี่ EPC ต่ำ", + noticeReadAll: "ทำเครื่องหมายว่าอ่านทั้งหมด", + noticeUnread: "ยังไม่อ่าน", + noticeRead: "อ่านแล้ว", + noticeExpand: "ขยาย", + noticeCollapse: "ย่อ", + noticeLoading: "กำลังโหลด...", + noticeNoMore: "ไม่มีการแจ้งเตือนเพิ่มเติม", + noticeEmpty: "ยังไม่มีการแจ้งเตือน", + noticeFetchListFail: "โหลดการแจ้งเตือนไม่สำเร็จ", + noticeReadAllFail: "ทำเครื่องหมายว่าอ่านทั้งหมดไม่สำเร็จ", + noticeReadAllSuccessDetail: "ทำเครื่องหมายว่าอ่านแล้วสำเร็จ" + }, + importExport: { + importExport: "นำเข้า/ส่งออก", + downloadTemplate: "ดาวน์โหลดเทมเพลต", + batchImport: "นำเข้าหลายรายการ", + export: "ส่งออก" + }, + batchImport: { + dialogTitle: "นำเข้าไฟล์", + step1Title: "ยืนยันการอัปโหลด", + step1Desc: "ตรวจสอบเสร็จสิ้น", + step2Title: "ผลการอัปโหลด", + step2DescError: "อัปโหลดไม่สำเร็จ", + step2DescSuccess: "อัปโหลดสำเร็จ", + step2DescPending: "ผลการตรวจสอบ", + clickUpload: "คลิกเพื่ออัปโหลด", + dragHere: "หรือลากไฟล์มาวางที่นี่", + parsing: "กำลังวิเคราะห์ข้อมูล...", + validationDone: "ตรวจสอบเสร็จแล้ว กรุณาคลิกเริ่มอัปโหลด", + uploadFail: "อัปโหลดไม่สำเร็จ", + totalRows: "จำนวนแถวทั้งหมด", + successCount: "สำเร็จ", + failCount: "ไม่สำเร็จ", + firstError: "ข้อผิดพลาดแรก", + downloadErrorLink: "ดาวน์โหลดไฟล์ข้อผิดพลาด", + parseDone: "วิเคราะห์เสร็จสิ้น", + downloadTemplateResult: "ดาวน์โหลดผลการจับคู่เทมเพลต", + downloadDataResult: "ดาวน์โหลดผลการตรวจสอบข้อมูล", + hintBatch: "(กรุณาอัปโหลดเป็นชุดหากเกิน 200,000 แถว)", + reupload: "อัปโหลดใหม่", + startUpload: "เริ่มอัปโหลด" + }, + common: { + selectAll: "เลือกทั้งหมด (เลือกแล้ว {count} รายการ)", + selectedTotal: "เลือกแล้ว {selected} รายการ/ทั้งหมด {total} รายการ", + firstPage: "หน้าแรก", + prevPage: "หน้าก่อน", + nextPage: "หน้าถัดไป", + lastPage: "หน้าสุดท้าย", + processing: "กำลังดำเนินการ...", + search: "ค้นหา", + reset: "รีเซ็ต", + searchBtn: "ค้นหา", + resetBtn: "รีเซ็ต", + pageUnderDevelopment: "หน้านี้อยู่ระหว่างพัฒนา", + batchDelete: "ลบหลายรายการ", + confirm: "ยืนยัน", + cancel: "ยกเลิก", + confirmDelete: "ยืนยันการลบ", + deleteSingleConfirm: "คุณแน่ใจหรือไม่ว่าต้องการลบข้อมูลนี้?", + deleteBatchConfirm: "คุณแน่ใจหรือไม่ว่าต้องการลบรายการที่เลือก {count} รายการ?", + add: "เพิ่ม", + update: "อัปเดต", + edit: "แก้ไข", + detail: "รายละเอียด", + searchPlaceholder: "กรุณากรอก.....", + selectTimeRange: "เลือกช่วง {label}", + searchColumnPlaceholder: "ค้นหา {label}", + creatorName: "ผู้สร้าง", + createTime: "เวลาสร้าง", + comment: "คำอธิบาย", + description: "รายละเอียด", + addSuccess: "เพิ่มสำเร็จ", + addSuccessDetail: "เพิ่มข้อมูลเรียบร้อยแล้ว!", + editSuccess: "แก้ไขสำเร็จ", + editSuccessDetail: "อัปเดตข้อมูลเรียบร้อยแล้ว!", + addFail: "เพิ่มไม่สำเร็จ", + editFail: "แก้ไขไม่สำเร็จ", + deleteSuccess: "ลบสำเร็จ", + deleteSuccessDetail: "ลบข้อมูลเรียบร้อยแล้ว!", + deleteBatchSuccessDetail: "ลบแล้ว {count} รายการ", + deleteFail: "ลบไม่สำเร็จ", + operationFail: "ดำเนินการไม่สำเร็จ", + tip: "คำเตือน", + success: "สำเร็จ", + warning: "คำเตือน", + error: "ข้อผิดพลาด", + requiredField: "{label} จำเป็น", + emailReminder: "การแจ้งเตือนทางอีเมล", + emailReminderUpdateSuccess: "อัปเดตการแจ้งเตือนทางอีเมลสำเร็จ", + emailReminderUpdateFail: "อัปเดตการแจ้งเตือนทางอีเมลไม่สำเร็จ" + }, + employee: { + addEmployee: "เพิ่มพนักงาน", + search: "ค้นหา", + batchDelete: "ลบหลายรายการ", + searchPlaceholder: "กรุณากรอก.....", + employeeName: "ชื่อพนักงาน", + contactPhone: "เบอร์โทรศัพท์", + email: "อีเมล", + emailInfo: "ข้อมูลอีเมล", + organizationStructure: "โครงสร้างองค์กร", + createTime: "เวลาสร้าง", + selectTimeRange: "เลือกช่วงเวลา {label}", + searchColumn: "ค้นหา {label}", + query: "ค้นหา", + reset: "รีเซ็ต", + close: "ปิด", + confirm: "ยืนยัน", + cancel: "ยกเลิก", + confirmDelete: "ยืนยันการลบ", + deleteSingleConfirm: "คุณแน่ใจหรือไม่ว่าต้องการลบข้อมูลนี้?", + deleteBatchConfirm: "คุณแน่ใจหรือไม่ว่าต้องการลบรายการที่เลือก {count} รายการ?", + add: "เพิ่ม", + edit: "แก้ไข", + detail: "รายละเอียด", + xinXin: "Xinxin", + employeeNameRequired: "ชื่อพนักงานเป็นฟิลด์บังคับ" + }, + user: { + addUser: "เพิ่มผู้ใช้", + editUser: "แก้ไขผู้ใช้", + detailUser: "รายละเอียดผู้ใช้", + userName: "ชื่อผู้ใช้", + employeeName: "ชื่อพนักงาน", + contactPhone: "เบอร์โทรศัพท์", + email: "อีเมล", + comment: "คำอธิบาย", + roleName: "ชื่อบทบาท", + createTime: "เวลาสร้าง", + userPassword: "รหัสผ่าน", + confirmPassword: "ยืนยันรหัสผ่าน", + manageEmployee: "จัดการพนักงาน", + manageRole: "จัดการบทบาท", + selectEmployee: "กรุณาเลือกพนักงาน", + selectRole: "กรุณาเลือกบทบาท", + selectedRolesCount: "เลือกแล้ว {count} บทบาท", + userNameRequired: "ชื่อผู้ใช้เป็นฟิลด์บังคับ", + userPasswordRequired: "รหัสผ่านผู้ใช้เป็นฟิลด์บังคับ", + confirmPasswordRequired: "ยืนยันรหัสผ่านเป็นฟิลด์บังคับ", + manageEmployeeRequired: "จัดการพนักงานเป็นฟิลด์บังคับ", + manageRoleRequired: "จัดการบทบาทเป็นฟิลด์บังคับ" + }, + operationLog: { + title: "บันทึกการดำเนินการ", + timestamp: "เวลา", + level: "ระดับ", + source: "แหล่งที่มา", + action: "การดำเนินการ", + message: "ข้อความ", + pageInfo: "{count} รายการในหน้านี้", + fetchFail: "โหลดบันทึกไม่สำเร็จ" + }, + role: { + addRole: "เพิ่มบทบาท", + editRole: "แก้ไขบทบาท", + detailRole: "รายละเอียดบทบาท", + roleName: "ชื่อบทบาท", + comment: "คำอธิบาย", + creatorName: "ผู้สร้าง", + createTime: "เวลาสร้าง", + noticePermission: "สิทธิ์การแจ้งเตือน", + selectNoticePermission: "กรุณาเลือกสิทธิ์การแจ้งเตือน", + roleNameRequired: "ชื่อบทบาทเป็นฟิลด์บังคับ", + noticePermissionRequired: "สิทธิ์การแจ้งเตือนเป็นฟิลด์บังคับ", + importSuccess: "นำเข้าบทบาทสำเร็จ", + advancedSettings: "การตั้งค่าขั้นสูง", + configurePagePermission: "กำหนดสิทธิ์หน้า", + configureDataPermission: "กำหนดสิทธิ์ข้อมูล", + dataPermissionSubtitle: "(ฟิลด์ที่ไม่ได้เลือกจะไม่แสดงสำหรับบทบาทนี้)", + all: "ทั้งหมด", + submit: "ส่ง", + pagePermission: { + equipmentRepairReport: "รายงานการซ่อมแซมอุปกรณ์", + equipmentAcceptanceReport: "รายงานการรับรองอุปกรณ์", + equipmentMaintenanceReport: "รายงานการบำรุงรักษาอุปกรณ์", + equipmentMeteringReport: "รายงานการวัดอุปกรณ์" + }, + dataPermissionGroup: { + AssetAlarmRecord: "บันทึกการแจ้งเตือนสินทรัพย์", + AssetList: "รายการสินทรัพย์", + AssetAcceptance: "การรับรองสินทรัพย์", + DeviceEntry: "อุปกรณ์เข้าโรงงาน", + DeviceMaintain: "การบำรุงรักษาอุปกรณ์", + DeviceMetering: "การวัดอุปกรณ์", + DeviceRepair: "การซ่อมแซมอุปกรณ์", + DeviceTransfer: "การโอนอุปกรณ์", + DeviceLoan: "การยืมอุปกรณ์", + EmployeeManage: "การจัดการพนักงาน", + DeviceExFactory: "อุปกรณ์ออกจากโรงงาน", + FactoryManage: "การจัดการโรงงาน", + InventoryDetail: "รายละเอียดการตรวจนับ", + AssetInventory: "การตรวจนับสินทรัพย์", + IdleHandle: "การจัดการสินทรัพย์ idle", + MaterialMetering: "การวัดวัสดุ", + AccessControlManage: "การจัดการสิทธิ์การเข้าถึง", + RoleManage: "การจัดการบทบาท", + SensorManage: "การจัดการเซ็นเซอร์", + UserManage: "การจัดการผู้ใช้", + OperationLog: "บันทึกการดำเนินการ" + }, + dataPermissionField: { + alarm_time_assetAlarmRecord: "เวลาแจ้งเตือน", + alarm_type_assetAlarmRecord: "ประเภทการแจ้งเตือน", + asset_no_assetAlarmRecord: "หมายเลขสินทรัพย์", + asset_name_assetAlarmRecord: "ชื่อสินทรัพย์", + current_factory_assetAlarmRecord: "พื้นที่โรงงานปัจจุบัน", + epc_assetAlarmRecord: "EPC", + spec_model_assetAlarmRecord: "รุ่นและขนาด", + factory_area_assetAlarmRecord: "พื้นที่โรงงาน", + asset_dept_assetAlarmRecord: "แผนกสินทรัพย์", + responsible_assetAlarmRecord: "ผู้รับผิดชอบ", + signal_machine_assetAlarmRecord: "เครื่องสัญญาณ", + info_machine_name_assetAlarmRecord: "ชื่อเครื่องข้อมูล", + agent_assetList: "ตัวแทน", + asset_no_assetList: "หมายเลขสินทรัพย์", + asset_name_assetList: "ชื่อสินทรัพย์", + sub_asset_no_assetList: "หมายเลขสินทรัพย์ย่อย", + sub_asset_assetList: "สินทรัพย์ย่อย", + attachment_assetList: "เอกสารแนบ", + entry_time_assetList: "เวลานำเข้า", + asset_class_assetList: "หมวดหมู่สินทรัพย์", + depreciation_period_assetList: "รอบค่าเสื่อม", + epc_assetList: "EPC", + factory_area_assetList: "พื้นที่โรงงาน", + anti_dismantle_assetList: "การแจ้งเตือนป้องกันการโจรกรรม", + measure_type_assetList: "ประเภทการวัด", + original_value_assetList: "มูลค่าต้นทุนสินทรัพย์", + under_voltage_alarm_assetList: "การแจ้งเตือนแรงดันต่ำ", + maintain_type_assetList: "ประเภทการบำรุงรักษา", + manufacturer_assetList: "ผู้ผลิต", + doc_no_assetList: "หมายเลขข้อมูล", + remark_assetList: "หมายเหตุ", + net_value_assetList: "มูลค่าค่าเสื่อมสุทธิ", + original_zy_no_assetList: "หมายเลข ZY เดิม", + factory_no_assetList: "หมายเลขโรงงาน", + asset_dept_assetList: "แผนกสินทรัพย์", + purchase_code_assetList: "รหัสจัดซื้อ", + asset_responsible_assetList: "ผู้รับผิดชอบสินทรัพย์", + spec_model_assetList: "รุ่นและขนาด", + asset_status_assetList: "สถานะสินทรัพย์", + warranty_assetList: "ระยะเวลารับประกัน", + accept_status_assetAcceptance: "สถานะการรับรอง", + accept_responsible_assetAcceptance: "ผู้รับผิดชอบการรับรอง", + asset_class_assetAcceptance: "หมวดหมู่สินทรัพย์", + asset_no_assetAcceptance: "หมายเลขสินทรัพย์", + asset_name_assetAcceptance: "ชื่อสินทรัพย์", + attachment_assetAcceptance: "เอกสารแนบ", + accept_finish_time_assetAcceptance: "เวลาเสร็จสิ้นการรับรอง", + factory_area_assetAcceptance: "พื้นที่โรงงาน", + factory_no_assetAcceptance: "หมายเลขโรงงาน", + asset_dept_assetAcceptance: "แผนกสินทรัพย์", + plan_accept_time_assetAcceptance: "เวลารับรองตามแผน", + remark_assetAcceptance: "หมายเหตุ", + asset_responsible_assetAcceptance: "ผู้รับผิดชอบสินทรัพย์", + accept_start_time_assetAcceptance: "เวลาเริ่มการรับรอง", + purchase_no_assetAcceptance: "หมายเลขจัดซื้อ", + accept_cycle_deviceEntry: "รอบการรับรอง", + agent_deviceEntry: "ตัวแทน", + asset_class_deviceEntry: "หมวดหมู่สินทรัพย์", + asset_no_deviceEntry: "หมายเลขสินทรัพย์", + asset_name_deviceEntry: "ชื่อสินทรัพย์", + attachment_deviceEntry: "เอกสารแนบ", + contract_no_deviceEntry: "หมายเลขสัญญา", + epc_deviceEntry: "EPC", + factory_area_deviceEntry: "พื้นที่โรงงาน", + entry_time_deviceEntry: "เวลานำเข้า", + original_value_deviceEntry: "มูลค่าต้นทุนสินทรัพย์", + manufacturer_deviceEntry: "ผู้ผลิต", + factory_no_deviceEntry: "หมายเลขโรงงาน", + asset_dept_deviceEntry: "แผนกสินทรัพย์", + purchase_no_deviceEntry: "หมายเลขจัดซื้อ", + remark_deviceEntry: "หมายเหตุ", + asset_responsible_deviceEntry: "ผู้รับผิดชอบสินทรัพย์", + spec_model_deviceEntry: "รุ่นและขนาด", + temp_return_date_deviceEntry: "วันที่ส่งคืนชั่วคราว", + warranty_deviceEntry: "ระยะเวลารับประกัน", + maintain_responsible_deviceMaintain: "ผู้รับผิดชอบบำรุงรักษา", + asset_no_deviceMaintain: "หมายเลขสินทรัพย์", + asset_name_deviceMaintain: "ชื่อสินทรัพย์", + attachment_deviceMaintain: "เอกสารแนบ", + create_time_deviceMaintain: "เวลาสร้าง", + maintain_content_deviceMaintain: "เนื้อหาการบำรุงรักษา", + this_maintain_time_deviceMaintain: "เวลาบำรุงรักษาครั้งนี้", + next_maintain_time_deviceMaintain: "เวลาบำรุงรักษาครั้งถัดไป", + asset_dept_deviceMaintain: "แผนกสินทรัพย์", + maintain_cycle_deviceMaintain: "รอบการบำรุงรักษา", + spec_model_deviceMaintain: "รุ่นและขนาด", + asset_status_deviceMaintain: "สถานะสินทรัพย์", + meter_responsible_deviceMetering: "ผู้รับผิดชอบการวัด", + asset_class_deviceMetering: "หมวดหมู่สินทรัพย์", + asset_no_deviceMetering: "หมายเลขสินทรัพย์", + asset_name_deviceMetering: "ชื่อสินทรัพย์", + attachment_deviceMetering: "เอกสารแนบ", + calibration_type_deviceMetering: "ประเภทการสอบเทียบ", + calibration_result_deviceMetering: "ผลการสอบเทียบ", + this_calibration_date_deviceMetering: "วันที่สอบเทียบครั้งนี้", + measure_type_deviceMetering: "ประเภทการวัด", + next_calibration_date_deviceMetering: "วันที่สอบเทียบครั้งถัดไป", + factory_no_deviceMetering: "หมายเลขโรงงาน", + asset_dept_deviceMetering: "แผนกสินทรัพย์", + cycle_deviceMetering: "รอบ", + remark_deviceMetering: "หมายเหตุ", + asset_responsible_deviceMetering: "ผู้รับผิดชอบสินทรัพย์", + spec_model_deviceMetering: "รุ่นและขนาด", + asset_status_deviceMetering: "สถานะสินทรัพย์", + update_time_deviceMetering: "เวลาอัปเดต", + repair_responsible_deviceRepair: "ผู้รับผิดชอบการซ่อม", + asset_class_deviceRepair: "หมวดหมู่สินทรัพย์", + expected_return_date_deviceRepair: "วันที่ส่งคืนที่คาดไว้", + fault_phenomenon_deviceRepair: "อาการขัดข้อง", + asset_no_deviceRepair: "หมายเลขสินทรัพย์", + asset_name_deviceRepair: "ชื่อสินทรัพย์", + fault_analysis_deviceRepair: "สาเหตุและรายละเอียดการซ่อม", + fault_type_deviceRepair: "ประเภทข้อบกพร่อง", + attachment_deviceRepair: "เอกสารแนบ", + manufacturer_deviceRepair: "ผู้ผลิต", + repair_finish_time_deviceRepair: "เวลาเสร็จสิ้นการซ่อม", + factory_no_deviceRepair: "หมายเลขโรงงาน", + external_repair_unit_deviceRepair: "หน่วยซ่อมภายนอก", + asset_dept_deviceRepair: "แผนกสินทรัพย์", + remark_deviceRepair: "หมายเหตุ", + internal_external_deviceRepair: "ซ่อมภายใน/ภายนอก", + spec_model_deviceRepair: "รุ่นและขนาด", + repair_start_time_deviceRepair: "เวลาเริ่มการซ่อม", + applicant_deviceTransfer: "ผู้สมัคร", + original_dept_deviceTransfer: "แผนกเดิม", + asset_no_deviceTransfer: "หมายเลขสินทรัพย์", + asset_name_deviceTransfer: "ชื่อสินทรัพย์", + receive_factory_deviceTransfer: "พื้นที่โรงงานรับ", + receive_dept_deviceTransfer: "แผนกรับ", + attachment_deviceTransfer: "เอกสารแนบ", + receive_responsible_deviceTransfer: "ผู้รับผิดชอบรับ", + create_time_deviceTransfer: "เวลาสร้าง", + remark_deviceTransfer: "หมายเหตุ", + factory_no_deviceTransfer: "หมายเลขโรงงาน", + spec_model_deviceTransfer: "รุ่นและขนาด", + applicant_dept_deviceLoan: "แผนกผู้สมัคร", + applicant_deviceLoan: "ผู้สมัคร", + loan_due_time_deviceLoan: "เวลาคืนยืม", + loan_factory_deviceLoan: "พื้นที่ยืม", + asset_no_deviceLoan: "หมายเลขสินทรัพย์", + asset_name_deviceLoan: "ชื่อสินทรัพย์", + loan_responsible_deviceLoan: "ผู้รับผิดชอบการยืม", + factory_no_deviceLoan: "หมายเลขโรงงาน", + attachment_deviceLoan: "เอกสารแนบ", + create_time_deviceLoan: "เวลาสร้าง", + remark_deviceLoan: "หมายเหตุ", + spec_model_deviceLoan: "รุ่นและขนาด", + loan_start_time_deviceLoan: "เวลาเริ่มการยืม", + create_time_employeeManage: "เวลาสร้าง", + email_employeeManage: "อีเมล", + employee_name_employeeManage: "ชื่อพนักงาน", + org_structure_employeeManage: "โครงสร้างองค์กร", + contact_phone_employeeManage: "เบอร์โทรศัพท์", + applicant_dept_deviceExFactory: "แผนกผู้สมัคร", + applicant_deviceExFactory: "ผู้สมัคร", + asset_no_deviceExFactory: "หมายเลขสินทรัพย์", + asset_name_deviceExFactory: "ชื่อสินทรัพย์", + attachment_deviceExFactory: "เอกสารแนบ", + create_time_deviceExFactory: "เวลาสร้าง", + expected_return_time_deviceExFactory: "เวลาส่งคืนที่คาดไว้", + ex_factory_time_deviceExFactory: "เวลาออกจากโรงงาน", + factory_no_deviceExFactory: "หมายเลขโรงงาน", + remark_deviceExFactory: "หมายเหตุ", + spec_model_deviceExFactory: "รุ่นและขนาด", + creator_factoryManage: "ผู้สร้าง", + create_time_factoryManage: "เวลาสร้าง", + factory_name_factoryManage: "ชื่อโรงงาน", + remark_factoryManage: "หมายเหตุ", + asset_no_inventoryDetail: "หมายเลขสินทรัพย์", + asset_name_inventoryDetail: "ชื่อสินทรัพย์", + epc_inventoryDetail: "EPC", + factory_no_inventoryDetail: "หมายเลขโรงงาน", + asset_dept_inventoryDetail: "แผนกสินทรัพย์", + factory_inventoryDetail: "พื้นที่โรงงาน", + responsible_inventoryDetail: "ผู้รับผิดชอบ", + info_machine_id_inventoryDetail: "รหัสเครื่องข้อมูล", + info_machine_name_inventoryDetail: "ชื่อเครื่องข้อมูล", + spec_model_inventoryDetail: "รุ่นและขนาด", + inventory_no_assetInventory: "เลขที่ตรวจนับ", + to_inventory_assetInventory: "ต้องตรวจนับ", + create_time_assetInventory: "เวลาสร้าง", + loss_assets_assetInventory: "ขาด", + gain_assets_assetInventory: "เกิน", + no_epc_assets_assetInventory: "ไม่มี EPC", + inventory_time_assetInventory: "เวลาตรวจนับ", + apply_dept_idleHandle: "แผนกสมัคร", + years_to_plant_idleHandle: "ปีถึงโรงงาน", + applicant_idleHandle: "ผู้สมัคร", + factory_no_idleHandle: "หมายเลขโรงงาน", + asset_no_idleHandle: "หมายเลขสินทรัพย์", + asset_name_idleHandle: "ชื่อสินทรัพย์", + description_idleHandle: "คำอธิบาย", + spec_model_idleHandle: "รุ่นและขนาด", + attachment_idleHandle: "เอกสารแนบ", + asset_status_idleHandle: "สถานะสินทรัพย์", + create_time_idleHandle: "เวลาสร้าง", + idle_opinion_idleHandle: "ความเห็นการ idle", + meter_responsible_materialMetering: "ผู้รับผิดชอบการวัด", + material_no_materialMetering: "หมายเลขวัสดุ", + remark_materialMetering: "หมายเหตุ", + material_class_materialMetering: "หมวดหมู่วัสดุ", + material_name_materialMetering: "ชื่อวัสดุ", + asset_responsible_materialMetering: "ผู้รับผิดชอบสินทรัพย์", + attachment_materialMetering: "เอกสารแนบ", + measure_type_materialMetering: "ประเภทการวัด", + spec_model_materialMetering: "รุ่นและขนาด", + calibration_type_materialMetering: "ประเภทการสอบเทียบ", + next_calibration_date_materialMetering: "วันที่สอบเทียบครั้งถัดไป", + material_status_materialMetering: "สถานะวัสดุ", + calibration_result_materialMetering: "ผลการสอบเทียบ", + asset_dept_materialMetering: "แผนกสินทรัพย์", + update_time_materialMetering: "เวลาอัปเดต", + this_calibration_date_materialMetering: "วันที่สอบเทียบครั้งนี้", + cycle_materialMetering: "รอบ", + asset_no_accessControlManage: "หมายเลขสินทรัพย์", + access_control_accessControlManage: "การควบคุมการเข้าถึง", + asset_name_accessControlManage: "ชื่อสินทรัพย์", + asset_status_accessControlManage: "สถานะสินทรัพย์", + epc_accessControlManage: "EPC", + access_expire_time_accessControlManage: "เวลาหมดอายุการเข้าถึง", + asset_dept_accessControlManage: "แผนกสินทรัพย์", + asset_responsible_accessControlManage: "ผู้รับผิดชอบสินทรัพย์", + creator_roleManage: "ผู้สร้าง", + create_time_roleManage: "เวลาสร้าง", + description_roleManage: "คำอธิบาย", + role_name_roleManage: "ชื่อบทบาท", + permission_type_roleManage: "ประเภทสิทธิ์", + create_time_sensorManage: "เวลาสร้าง", + factory_name_sensorManage: "ชื่อโรงงาน", + sensor_no_sensorManage: "หมายเลขเซ็นเซอร์", + sensor_name_sensorManage: "ชื่อเซ็นเซอร์", + sensor_type_sensorManage: "ประเภทเซ็นเซอร์", + online_status_sensorManage: "สถานะออนไลน์", + create_time_userManage: "เวลาสร้าง", + email_userManage: "อีเมล", + employee_name_userManage: "ชื่อพนักงาน", + data_permission_userManage: "สิทธิ์ข้อมูล", + description_userManage: "คำอธิบาย", + role_name_userManage: "ชื่อบทบาท", + contact_phone_userManage: "เบอร์โทรศัพท์", + username_userManage: "ชื่อผู้ใช้" + } + }, + factory: { + addFactory: "เพิ่มโรงงาน", + editFactory: "แก้ไขโรงงาน", + detailFactory: "รายละเอียดโรงงาน", + factoryName: "ชื่อโรงงาน", + comment: "คำอธิบาย", + creatorName: "ผู้สร้าง", + createTime: "เวลาสร้าง", + factoryNameRequired: "ชื่อโรงงานเป็นฟิลด์บังคับ" + }, + sensor: { + addSensor: "เพิ่มเซ็นเซอร์", + editSensor: "แก้ไขเซ็นเซอร์", + detailSensor: "รายละเอียดเซ็นเซอร์", + sensorNumber: "หมายเลขเซ็นเซอร์", + sensorName: "ชื่อเซ็นเซอร์", + factoryName: "ชื่อโรงงาน", + onlineStatus: "สถานะออนไลน์", + sensorType: "ประเภทเซ็นเซอร์", + createTime: "เวลาสร้าง", + relatedFactory: "โรงงานที่เกี่ยวข้อง", + selectSensorType: "กรุณาเลือกประเภทเซ็นเซอร์", + selectFactory: "กรุณาเลือกโรงงาน", + sensorNameRequired: "ชื่อเซ็นเซอร์/เครื่องข้อมูลเป็นฟิลด์บังคับ", + sensorTypeRequired: "ประเภทเซ็นเซอร์/เครื่องข้อมูลเป็นฟิลด์บังคับ", + factoryAreaRequired: "โรงงานที่เกี่ยวข้องเป็นฟิลด์บังคับ" + }, + measureMaterial: { + addMaterialMetering: "เพิ่มการวัดวัสดุ", + editMaterialMetering: "แก้ไขการวัดวัสดุ", + materialName: "ชื่อวัสดุ", + materialNumber: "หมายเลขวัสดุ", + period: "รอบ", + periodMonths: "รอบ (เดือน)", + nextCalibrateTime: "เวลาสอบเทียบครั้งถัดไป", + nextCalibrate: "สอบเทียบครั้งถัดไป", + attachments: "เอกสารแนบ", + attachmentName: "ชื่อเอกสารแนบ", + materialCategory: "หมวดหมู่วัสดุ", + assetDepartment: "แผนกสินทรัพย์", + typeSpecification: "รุ่นและข้อมูลจำเพาะ", + assetPic: "ผู้รับผิดชอบสินทรัพย์", + calibrationResult: "ผลการสอบเทียบ", + measurementType: "ประเภทการวัด", + calibrationType: "ประเภทการสอบเทียบ", + calibrationTypeShort: "ประเภทการสอบเทียบ", + meteringPic: "ผู้รับผิดชอบการวัด", + comment: "หมายเหตุ", + commentInfo: "ข้อมูลหมายเหตุ", + calibrateTime: "เวลาสอบเทียบ", + materialStatus: "สถานะวัสดุ", + pleaseAddAttachment: "กรุณาเพิ่มเอกสารแนบ", + addAttachment: "เพิ่มเอกสารแนบ", + selectAttachment: "เลือกเอกสารแนบ", + confirmSelect: "ยืนยันการเลือก", + templateDownloadSuccess: "ดาวน์โหลดเทมเพลตสำเร็จ", + importSuccess: "นำเข้าการวัดวัสดุสำเร็จ", + importFail: "นำเข้าการวัดวัสดุไม่สำเร็จ", + exportSuccess: "ส่งออกสำเร็จ", + exportFail: "ส่งออกไม่สำเร็จ", + getDataFail: "ดึงข้อมูลไม่สำเร็จ", + requiredField: " เป็นฟิลด์บังคับ", + selectedAttachmentsCount: "เลือกแล้ว {count} ไฟล์แนบ", + pleaseSelectAtLeastOneFile: "กรุณาเลือกอย่างน้อยหนึ่งไฟล์", + nonMetering: "ไม่มีการวัด", + currentMonthMetering: "การวัดเดือนปัจจุบัน", + batchUpdate: "อัปเดตจำนวนมาก", + batchUpdateSuccess: "อัปเดตจำนวนมากสำเร็จ", + batchUpdateFail: "อัปเดตจำนวนมากไม่สำเร็จ", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ" + }, + deviceMetering: { + addDeviceMetering: "เพิ่มการวัดอุปกรณ์", + editDeviceMetering: "แก้ไขการวัดอุปกรณ์", + selectAssetName: "เลือกชื่อสินทรัพย์", + pleaseSelectAssetName: "กรุณาเลือกชื่อสินทรัพย์", + pleaseSelectMeasurementType: "กรุณาเลือกประเภทการวัด", + importSuccess: "นำเข้าการวัดอุปกรณ์สำเร็จ", + importFail: "นำเข้าการวัดอุปกรณ์ไม่สำเร็จ", + pleaseSelectOneAsset: "กรุณาเลือกสินทรัพย์หนึ่งรายการ", + qualificationPass: "ผ่าน", + qualificationFail: "ไม่ผ่าน", + templateFileName: "DeviceMeteringImportTemplate.xlsx", + exportFileNamePrefix: "DeviceMeteringExport", + getDataFail: "ดึงข้อมูลไม่สำเร็จ", + batchUpdateSuccessDetail: "อัปเดตจำนวนมากสำเร็จ", + getAssetListFail: "ดึงรายการสินทรัพย์ไม่สำเร็จ", + pleaseSelectCalibrationType: "กรุณาเลือกประเภทการสอบเทียบ", + pleaseSelectCalibrationResult: "กรุณาเลือกผลการสอบเทียบ", + calibrationTypeInternal: "สอบเทียบภายใน", + calibrationTypeExternal: "สอบเทียบภายนอก", + calibrationTypeExempt: "ยกเว้น", + calibrationResultPass: "ผ่าน", + calibrationResultLimited: "ใช้จำกัด", + calibrationResultFail: "ไม่ผ่าน" + }, + deviceRepair: { + addDeviceRepair: "เพิ่มการซ่อมแซมอุปกรณ์", + editDeviceRepair: "แก้ไขการซ่อมแซมอุปกรณ์", + batchUpdate: "อัปเดตจำนวนมาก", + repairPic: "ผู้รับผิดชอบการซ่อมแซม", + calibrationResult: "ผลการสอบเทียบ", + faultPhenomenon: "อาการขัดข้อง", + internalOrExternalRepair: "ซ่อมภายใน/ภายนอก", + faultReasonAndRepairContent: "สาเหตุและการซ่อมแซม", + externalRepairUnit: "หน่วยซ่อมภายนอก", + faultCategory: "หมวดหมู่ข้อบกพร่อง", + repairedReturnDate: "วันที่ส่งคืนหลังซ่อม", + repairInitiationDate: "เวลาเริ่มการซ่อม", + createTime: "เวลาที่สร้าง", + initiationTime: "เวลาเริ่มต้น", + completionTime: "เวลาเสร็จสิ้น", + pleaseSelectAssetName: "กรุณาเลือกชื่อสินทรัพย์", + pleaseEnterFaultPhenomenon: "กรอกอาการขัดข้อง", + pleaseEnterExternalRepairUnit: "กรอกหน่วยซ่อมภายนอก", + pleaseEnterFaultCategory: "กรอกหมวดหมู่ข้อบกพร่อง", + pleaseSelectRepairInitiationDate: "เลือกเวลาเริ่มการซ่อม", + pleaseSelectCompletionTime: "เลือกเวลาเสร็จสิ้นการซ่อม", + pleaseEnterRepairPic: "กรอกผู้รับผิดชอบการซ่อมแซม", + pleaseEnterInternalOrExternalRepair: "กรอกซ่อมภายใน/ภายนอก", + pleaseSelectRepairedReturnDate: "เลือกวันที่ส่งคืนหลังซ่อม", + pleaseEnterFaultReasonAndRepairContent: "กรอกสาเหตุและการซ่อมแซม", + pleaseEnterComment: "กรอกหมายเหตุ", + selectAssetName: "เลือกชื่อสินทรัพย์", + assetSelectorSearchPlaceholder: "กรุณาพิมพ์สิ่งที่ต้องการค้นหา...", + assetSelectorColumnId: "ID", + assetSelectorConfirm: "ยืนยัน", + pleaseSelectOneAsset: "กรุณาเลือกสินทรัพย์หนึ่งรายการ", + getAssetListFail: "ดึงรายการสินทรัพย์ไม่สำเร็จ", + templateFileName: "DeviceRepairImportTemplate.xlsx", + templateDownloadSuccess: "ดาวน์โหลดเทมเพลตสำเร็จ", + importSuccess: "นำเข้าการซ่อมแซมอุปกรณ์สำเร็จ", + importFail: "นำเข้าการซ่อมแซมอุปกรณ์ไม่สำเร็จ", + exportFileNamePrefix: "DeviceRepairExport", + pleaseFillAtLeastOneBatch: "กรุณากรอกอย่างน้อยหนึ่งฟิลด์เพื่ออัปเดต", + batchUpdateSuccess: "อัปเดตจำนวนมากสำเร็จ", + batchUpdateFail: "อัปเดตจำนวนมากไม่สำเร็จ", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ", + getDataFail: "ดึงข้อมูลการซ่อมแซมอุปกรณ์ไม่สำเร็จ" + }, + deviceMaintain: { + addMaintenancePlan: "เพิ่มแผนบำรุงรักษา", + remarkUpdate: "อัปเดตหมายเหตุ", + batchUpdate: "อัปเดตจำนวนมาก", + addMaintenancePlanTitle: "เพิ่มแผนบำรุงรักษาอุปกรณ์", + editMaintenancePlanTitle: "แก้ไขแผนบำรุงรักษาอุปกรณ์", + assetName: "ชื่อสินทรัพย์", + assetNumber: "หมายเลขสินทรัพย์", + maintenancePic: "ผู้รับผิดชอบบำรุงรักษา", + attachments: "ไฟล์แนบ", + assetStatus: "สถานะสินทรัพย์", + assetDepartment: "แผนกสินทรัพย์", + typeSpecification: "รุ่นและขนาด", + productionNumber: "หมายเลขโรงงาน", + originZyNumber: "หมายเลข ZY เดิม", + maintenancePeriod: "ระยะเวลาบำรุงรักษา", + maintenancePeriodDays: "ระยะเวลาบำรุงรักษา/วัน", + maintenanceContent: "เนื้อหาการบำรุงรักษา", + comment: "หมายเหตุ", + nextMaintenanceTime: "เวลาบำรุงรักษาครั้งถัดไป", + maintenanceTime: "เวลาบำรุงรักษา", + createTime: "เวลาที่สร้าง", + deviceHistory: "ประวัติการบำรุงรักษาอุปกรณ์", + attachmentName: "ชื่อไฟล์แนบ", + pleaseAddAttachment: "กรุณาเพิ่มไฟล์แนบ", + addAttachment: "เพิ่มไฟล์แนบ", + pleaseEnterComment: "กรุณากรอกหมายเหตุ", + maintenancePersonnel: "เจ้าหน้าที่บำรุงรักษา", + pleaseEnterMaintenancePersonnel: "กรุณากรอกเจ้าหน้าที่บำรุงรักษา", + pleaseEnterMaintenanceContent: "กรุณากรอกเนื้อหาการบำรุงรักษา", + pleaseSelectMaintenanceTime: "กรุณาเลือกเวลาบำรุงรักษา", + batchImportTitle: "นำเข้าหลายรายการ", + parseTemplate: "วิเคราะห์เทมเพลต", + parseTemplateDesc: "ตรวจสอบรูปแบบเทมเพลต", + parseData: "วิเคราะห์ข้อมูล", + parseDataDesc: "ตรวจสอบรูปแบบข้อมูลที่อัปโหลด", + confirmUpload: "ยืนยันการอัปโหลด", + confirmUploadDesc: "การตรวจสอบเสร็จสิ้น ยืนยันการอัปโหลด", + pleaseSelectFile: "กรุณาเลือกไฟล์ที่จะอัปโหลด", + uploadHintLarge: "(ข้อมูลเกิน 200k รายการ กรุณาอัปโหลดเป็นชุด)", + reupload: "อัปโหลดใหม่", + startUpload: "เริ่มอัปโหลด", + pleaseSelectAssetName: "กรุณาเลือกชื่อสินทรัพย์", + submit: "ส่ง", + getAssetListFail: "ดึงรายการสินทรัพย์ไม่สำเร็จ", + pleaseSelectOneAsset: "กรุณาเลือกสินทรัพย์หนึ่งรายการ", + getDataFail: "ดึงข้อมูลแผนบำรุงรักษาอุปกรณ์ไม่สำเร็จ", + maintenancePeriodRequired: "ระยะเวลาบำรุงรักษาเป็นฟิลด์บังคับ", + maintenancePicRequired: "ผู้รับผิดชอบบำรุงรักษาเป็นฟิลด์บังคับ", + assetNameRequired: "ชื่อสินทรัพย์เป็นฟิลด์บังคับ", + maintenanceContentRequired: "เนื้อหาการบำรุงรักษาเป็นฟิลด์บังคับ", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ", + batchUpdateSuccess: "อัปเดตจำนวนมากสำเร็จ", + batchUpdateFail: "อัปเดตจำนวนมากไม่สำเร็จ", + remarkUpdateSuccess: "อัปเดตหมายเหตุสำเร็จ", + remarkUpdateFail: "อัปเดตหมายเหตุไม่สำเร็จ", + templateDownloadSuccess: "ดาวน์โหลดเทมเพลตสำเร็จ", + templateFileName: "DeviceMaintainImportTemplate.xlsx", + pleaseSelectFileFirst: "กรุณาเลือกไฟล์ก่อน", + importSuccess: "นำเข้าแผนบำรุงรักษาอุปกรณ์สำเร็จ", + importFail: "นำเข้าแผนบำรุงรักษาอุปกรณ์ไม่สำเร็จ", + exportFileNamePrefix: "DeviceMaintainExport", + exportNotImplemented: "ฟังก์ชันส่งออกยังไม่พร้อม" + }, + deviceHistory: { + pageTitle: "ประวัติการบำรุงรักษาอุปกรณ์", + searchPlaceholder: "กรุณาพิมพ์สิ่งที่ต้องการค้นหา...", + addMaintenanceHistory: "เพิ่มประวัติการบำรุงรักษา", + maintenancePlan: "แผนบำรุงรักษา", + maintenancePersonnel: "เจ้าหน้าที่บำรุงรักษา", + maintenanceContent: "เนื้อหาการบำรุงรักษา", + attachments: "ไฟล์แนบ", + maintenanceTime: "เวลาบำรุงรักษา", + addTitle: "เพิ่มประวัติการบำรุงรักษาอุปกรณ์", + editTitle: "แก้ไขประวัติการบำรุงรักษา", + maintenancePersonnelLabel: "เจ้าหน้าที่บำรุงรักษา:", + maintenanceContentLabel: "เนื้อหาการบำรุงรักษา:", + maintenancePlanLabel: "แผนบำรุงรักษา:", + pleaseSelectMaintenancePlan: "กรุณาเลือกแผนบำรุงรักษา", + maintenanceTimeLabel: "เวลาบำรุงรักษา:", + attachmentNameLabel: "ชื่อไฟล์แนบ:", + pleaseAddAttachment: "กรุณาเพิ่มไฟล์แนบ", + addAttachment: "เพิ่มไฟล์แนบ", + selectMaintenancePlan: "เลือกแผนบำรุงรักษา", + searchContentPlaceholder: "กรุณาพิมพ์สิ่งที่ต้องการค้นหา...", + assetName: "ชื่อสินทรัพย์", + assetNumber: "หมายเลขสินทรัพย์", + maintenancePic: "ผู้รับผิดชอบบำรุงรักษา", + maintenancePersonnelRequired: "เจ้าหน้าที่บำรุงรักษาเป็นฟิลด์บังคับ", + maintenanceTimeRequired: "เวลาบำรุงรักษาเป็นฟิลด์บังคับ", + maintenancePlanRequired: "แผนบำรุงรักษาเป็นฟิลด์บังคับ", + pleaseSelectOneAsset: "กรุณาเลือกสินทรัพย์หนึ่งรายการ", + getDataFail: "ดึงข้อมูลประวัติการบำรุงรักษาอุปกรณ์ไม่สำเร็จ", + operationFailRetry: "ดำเนินการล้มเหลว กรุณาลองอีกครั้ง" + }, + assetList: { + addAssetList: "เพิ่มรายการสินทรัพย์", + editAssetList: "แก้ไขรายการสินทรัพย์", + accessControl: "สิทธิ์การเข้าถึง", + batchUpdate: "อัปเดตจำนวนมาก", + accessControlConfig: "การกำหนดค่าสิทธิ์การเข้าถึง", + accessListHint: "รายการการเข้าถึง (รายการที่เลือกจะไม่แจ้งเตือนเมื่อผ่าน):", + permissionExpiryTime: "เวลาหมดอายุสิทธิ์:", + loading: "กำลังโหลด...", + submit: "ส่ง", + getDataFail: "ดึงข้อมูลรายการสินทรัพย์ไม่สำเร็จ", + templateFileName: "AssetListImportTemplate.xlsx", + templateDownloadSuccess: "ดาวน์โหลดเทมเพลตสำเร็จ", + downloadTemplateFail: "ดาวน์โหลดเทมเพลตล้มเหลว", + importSuccess: "นำเข้ารายการสินทรัพย์สำเร็จ", + importFail: "นำเข้ารายการสินทรัพย์ล้มเหลว", + exportSuccess: "ส่งออกสำเร็จ", + exportFail: "ส่งออกล้มเหลว", + exportFileNamePrefix: "AssetListExport", + selectedAttachmentsCount: "เลือก {count} ไฟล์แนบ", + pleaseSelectAtLeastOneFile: "กรุณาเลือกอย่างน้อยหนึ่งไฟล์", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ", + getAccessControlListFail: "ดึงรายการการเข้าถึงไม่สำเร็จ", + accessControlSaveSuccess: "บันทึกสิทธิ์การเข้าถึงสำเร็จ", + accessControlSaveFail: "บันทึกสิทธิ์การเข้าถึงไม่สำเร็จ", + pleaseFillAtLeastOneBatch: "กรุณากรอกอย่างน้อยหนึ่งฟิลด์เพื่ออัปเดต", + batchUpdateSuccess: "อัปเดตจำนวนมากสำเร็จ", + batchUpdateFail: "อัปเดตจำนวนมากไม่สำเร็จ", + getFactoryAreaListFail: "ดึงรายการพื้นที่โรงงานไม่สำเร็จ", + selectDate: "เลือกวันที่", + accessControlSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งจุดควบคุมการเข้าถึง", + accessControlSelectExpiryDate: "กรุณาเลือกวันหมดอายุสิทธิ์", + epc: "EPC", + assetName: "ชื่อสินทรัพย์", + assetNumber: "หมายเลขสินทรัพย์", + deviceStatus: "สถานะอุปกรณ์", + originZyNumber: "หมายเลข ZY เดิม", + typeSpecification: "รุ่นและข้อมูลจำเพาะ", + productionNumber: "หมายเลขโรงงาน", + assetDepartment: "แผนกสินทรัพย์", + factoryArea: "พื้นที่โรงงาน", + manufacturer: "ผู้ผลิต", + assetStatus: "สถานะสินทรัพย์", + maintenanceType: "ประเภทการบำรุงรักษา", + measurementType: "ประเภทการวัด", + assetCategory: "หมวดหมู่สินทรัพย์", + assetPic: "ผู้รับผิดชอบสินทรัพย์", + responsiblePerson: "ผู้รับผิดชอบ", + warrantyPeriod: "ระยะเวลาการรับประกัน", + entryTime: "เวลานำเข้า", + assetOriginalValue: "มูลค่าต้นทุนสินทรัพย์", + agent: "ตัวแทน", + depreciationPeriod: "รอบการคิดค่าเสื่อม", + ancillaryAssets: "สินทรัพย์เสริม", + procurementCode: "รหัสจัดซื้อ", + procurementCodeNumber: "หมายเลขจัดซื้อ", + ancillaryAssetsNumber: "หมายเลขสินทรัพย์เสริม", + dataNumber: "หมายเลขข้อมูล", + lowVoltageWarning: "การแจ้งเตือนแรงดันต่ำ", + assetAntiTheftRemind: "การแจ้งเตือนป้องกันการโจรกรรมสินทรัพย์", + netDepreciationValue: "มูลค่าค่าเสื่อมสุทธิ", + attachments: "เอกสารแนบ", + comment: "หมายเหตุ", + createTime: "เวลาสร้าง", + pleaseAddAttachment: "กรุณาเพิ่มเอกสารแนบ", + addAttachment: "เพิ่มเอกสารแนบ", + enterAssetStatus: "กรุณากรอกสถานะสินทรัพย์", + enterDeviceStatus: "กรุณากรอกสถานะอุปกรณ์", + selectMaintenanceType: "กรุณาเลือกประเภทการบำรุงรักษา", + selectMeasurementType: "กรุณาเลือกประเภทการวัด", + enterAncillaryAssets: "กรุณากรอกสินทรัพย์เสริม", + enterOriginZyNumber: "กรุณากรอกหมายเลข ZY เดิม", + enterDataNumber: "กรุณากรอกหมายเลขข้อมูล", + enterLowVoltageWarning: "กรุณากรอกการแจ้งเตือนแรงดันต่ำ", + enterAncillaryAssetsNumber: "กรุณากรอกหมายเลขสินทรัพย์เสริม", + enterNetDepreciationValue: "มูลค่าค่าเสื่อมสุทธิ", + enterRemark: "กรุณากรอกหมายเหตุ", + enterAssetDepartment: "กรุณากรอกแผนกสินทรัพย์", + enterAssetPic: "กรุณากรอกผู้รับผิดชอบสินทรัพย์", + enterFactoryArea: "กรุณากรอกพื้นที่โรงงาน", + enterRemarkBatch: "กรุณากรอกหมายเหตุ", + enterPassword: "กรุณากรอกรหัสผ่าน", + passwordLabel: "กรุณากรอกรหัสผ่าน:", + statusOnline: "ออนไลน์", + statusOffline: "ออฟไลน์", + statusUnknown: "ไม่ทราบ", + statusShutdown: "ปิดเครื่อง", + statusMaintenance: "บำรุงรักษา", + statusExternalRepair: "ซ่อมภายนอก", + statusNormal: "ปกติ" + }, + assetInventory: { + autoInventory: "ตรวจนับด้วยตนเอง", + inventorying: "กำลังตรวจนับ...", + inventoryNumber: "เลขที่ตรวจนับ", + shouldInventoryAssets: "ต้องตรวจนับ", + lostAssets: "ขาด", + profitAssets: "เกิน", + noEpcAssets: "ไม่มี EPC", + inventoryTime: "เวลาตรวจนับ", + historyData: "ข้อมูลประวัติ", + searchPlaceholder: "กรุณาป้อนสิ่งที่ต้องการค้นหา...", + exportSuccess: "ส่งออกสำเร็จ", + exportFail: "ส่งออกไม่สำเร็จ", + autoInventoryTriggered: "เริ่มตรวจนับด้วยตนเองแล้ว", + inventoryCommandIssuedSuccess: "ออกคำสั่งตรวจนับสำเร็จ", + autoInventoryFailed: "ตรวจนับด้วยตนเองล้มเหลว", + exportFileNamePrefix: "AssetInventoryExport", + exportSuffix: "Export", + inventoryDataErrorPrefix: "ข้อมูลการตรวจนับสินทรัพย์ ", + historyDataErrorPrefix: "ข้อมูลประวัติ ", + infoMachineId: "รหัสเครื่องข้อมูล", + infoMachineName: "ชื่อเครื่องข้อมูล", + getAssetListFail: "ดึงรายการสินทรัพย์ไม่สำเร็จ", + getDataFail: "ดึงข้อมูลไม่สำเร็จ", + getHistoryDataFail: "ดึงข้อมูลประวัติไม่สำเร็จ", + error: "ข้อผิดพลาด" + }, + alarmRecord: { + tabAccessAlarm: "การแจ้งเตือนการเข้าถึง", + tabInventoryAlarm: "การแจ้งเตือนการตรวจนับ", + belongFactoryArea: "พื้นที่โรงงาน", + currentFactoryArea: "พื้นที่โรงงานปัจจุบัน", + alarmTime: "เวลาแจ้งเตือน", + infoMachineName: "ชื่อเครื่องข้อมูล", + signalMachine: "เครื่องสัญญาณ", + alarmType: "ประเภทการแจ้งเตือน", + accessAlarmExportFileName: "AccessAlarmRecordExport", + inventoryAlarmExportFileName: "InventoryAlarmRecordExport", + accessAlarmListErrorPrefix: "รายการบันทึกการแจ้งเตือนการเข้าถึง ", + inventoryAlarmListErrorPrefix: "รายการบันทึกการแจ้งเตือนการตรวจนับ ", + getDataFail: "ดึงข้อมูลไม่สำเร็จ", + exportSuccess: "ส่งออกสำเร็จ", + exportFail: "ส่งออกไม่สำเร็จ", + error: "ข้อผิดพลาด" + }, + attachmentManage: { + selectAll: "เลือกทั้งหมด", + selectedCount: "(เลือกแล้ว {count} รายการ)", + rename: "เปลี่ยนชื่อ", + delete: "ลบ", + batchDownload: "ดาวน์โหลดหลายรายการ", + rootDir: "โฟลเดอร์หลัก", + newFolder: "โฟลเดอร์ใหม่", + recycleBin: "ถังรีไซเคิล", + fullscreen: "เต็มจอ", + exitFullscreen: "ออกจากเต็มจอ", + attachmentName: "ชื่อ", + modifiedDate: "แก้ไขเมื่อ", + type: "ประเภท", + size: "ขนาด", + action: "การดำเนินการ", + loading: "กำลังโหลด...", + dragUploadHint: "ลากไฟล์มาวางเพื่ออัปโหลด", + download: "ดาวน์โหลด", + noFiles: "ไม่มีไฟล์", + selectedItems: "เลือกแล้ว {count} รายการ/ ", + totalItems: "{count} รายการ", + add: "เพิ่ม", + uploadFile: "อัปโหลดไฟล์", + pleaseEnterFolderName: "กรอกชื่อโฟลเดอร์", + confirmDelete: "ยืนยันการลบ", + deleteConfirmMessage: "ลบ {names} ใช่หรือไม่?", + pleaseEnterNewName: "กรอกชื่อใหม่", + uploadTitle: "อัปโหลดไฟล์", + cancelUpload: "ยกเลิกการอัปโหลด", + waitUpload: "รอ...", + uploadDone: "เสร็จแล้ว ({size})", + uploadFailed: "อัปโหลดไม่สำเร็จ", + confirmCancelUpload: "ยืนยันยกเลิกการอัปโหลด", + confirmCancelUploadMessage: "ยกเลิกการอัปโหลดใช่หรือไม่?", + cancelUploadHint: "ไฟล์ที่กำลังอัปโหลดจะถูกยกเลิก", + name: "ชื่อ", + path: "เส้นทาง", + recycleEmpty: "ถังรีไซเคิลว่างเปล่า", + recycleTotal: "{count} รายการ", + confirmDeletePermanent: "ลบ {names} แบบถาวรใช่หรือไม่?", + properties: "คุณสมบัติ", + propertyType: "ประเภท:", + propertyOriginalPath: "ตำแหน่งเดิม:", + propertySize: "ขนาด:", + propertyDeletedTime: "เวลาลบ:", + propertyCreatedTime: "เวลาสร้าง:", + restore: "กู้คืน (R)", + restoreSuccess: "กู้คืนสำเร็จ", + batchRestoreSuccess: "กู้คืน {count} รายการ", + batchRestore: "กู้คืนหลายรายการ", + batchDelete: "ลบหลายรายการ", + batchDeleteRecycleSuccess: "ลบ {success} รายการ{failPart}", + batchDeleteRecycleFailPart: ", ล้มเหลว {count} รายการ", + batchDeleteRecycleAllFail: "ลบทุกรายการไม่สำเร็จ", + deleteSuccess: "ลบสำเร็จ", + deleteSuccessDetail: "ลบรายการที่เลือกเรียบร้อยแล้ว!", + deleteFail: "ลบไม่สำเร็จ", + pleaseEnterFolderNameTip: "กรุณากรอกชื่อโฟลเดอร์", + createFolderSuccess: "สร้างโฟลเดอร์สำเร็จ", + pleaseEnterNewNameTip: "กรุณากรอกชื่อใหม่", + renameSuccess: "เปลี่ยนชื่อสำเร็จ", + renameFail: "เปลี่ยนชื่อไม่สำเร็จ", + downloadSuccess: "ดาวน์โหลดไฟล์สำเร็จ", + downloadFail: "ดาวน์โหลดไม่สำเร็จ", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ", + batchDownloadSuccess: "ดาวน์โหลด {count} ไฟล์", + batchDownloadFail: "ดาวน์โหลดหลายรายการไม่สำเร็จ", + uploadCanceled: "ยกเลิกแล้ว", + uploadCanceledDetail: "ยกเลิกการอัปโหลด", + pasteNoContent: "ไม่มีเนื้อหาให้วาง", + pasteSuccess: "วาง {success} รายการ{failPart}", + pasteFailPart: ", ล้มเหลว {count} รายการ", + pasteFail: "วางไม่สำเร็จ", + targetExistsSameName: "มีไฟล์หรือโฟลเดอร์ชื่อเดียวกันอยู่แล้ว", + moveSuccess: "ย้าย {name} สำเร็จ", + moveFail: "ย้ายไม่สำเร็จ", + uploadSuccessDetail: "อัปโหลด {success} ไฟล์{failPart}", + uploadFailPart: ", ล้มเหลว {count}", + uploadAllFail: "อัปโหลดไฟล์ทั้งหมดไม่สำเร็จ", + uploadFail: "อัปโหลดไม่สำเร็จ", + loadListFail: "โหลดรายการไฟล์ไม่สำเร็จ กรุณาลองใหม่", + loadListFailShort: "โหลดรายการไฟล์ไม่สำเร็จ", + typeFolder: "โฟลเดอร์", + typeFile: "ไฟล์", + typePdf: "เอกสาร PDF", + typeDoc: "เอกสาร Word", + typeXlsx: "เอกสาร Excel", + typePpt: "เอกสาร PowerPoint", + typeTxt: "เอกสารข้อความ", + typeJson: "ไฟล์ JSON", + typeJs: "ไฟล์ JavaScript", + typeTs: "ไฟล์ TypeScript", + typeVue: "ไฟล์ Vue", + typeHtml: "เอกสาร HTML", + typeCss: "ไฟล์ CSS", + typeJpeg: "รูป JPEG", + typePng: "รูป PNG", + typeGif: "รูป GIF", + typeZip: "ไฟล์ ZIP", + typeRar: "ไฟล์ RAR", + type7z: "ไฟล์ 7Z", + typeLnk: "ทางลัด", + typeExe: "ไฟล์ปฏิบัติการ" + }, + accessControlManage: { + addAccessControl: "เพิ่มการควบคุมการเข้าถึง", + editAccessControl: "แก้ไขการควบคุมการเข้าถึง", + accessControlBtn: "การควบคุมการเข้าถึง", + accessListLink: "รายการการเข้าถึง", + accessColumn: "การเข้าถึง", + expirationTime: "เวลาหมดอายุการเข้าถึง", + selectInfoMachinePlaceholder: "กรุณาเลือกชื่อเครื่องข้อมูล", + selectAssetNamePlaceholder: "กรุณาเลือกชื่อสินทรัพย์", + infoMachineNameLabel: "ชื่อเครื่องข้อมูล", + expirationTimeLabel: "เวลาหมดอายุการเข้าถึง", + assetNameLabel: "ชื่อสินทรัพย์", + selectDatePlaceholder: "กรุณาเลือกวันที่", + accessListDialogTitle: "รายการการเข้าถึง", + infoMachineType: "ประเภทเครื่องข้อมูล", + typeAccess: "การเข้าถึง", + typeInventory: "การตรวจนับ", + onlineStatus: "สถานะออนไลน์", + factoryName: "ชื่อโรงงาน", + infoMachineNumber: "หมายเลขเครื่องข้อมูล", + searchKeywordPlaceholder: "กรุณาป้อนคำค้นหา...", + searchContentPlaceholder: "กรุณาป้อนสิ่งที่ต้องการค้นหา...", + close: "ปิด", + selectAttachment: "เลือกเอกสารแนบ", + selectAssetNameTitle: "เลือกชื่อสินทรัพย์", + selectInfoMachineTitle: "เลือกชื่อเครื่องข้อมูล", + statusInUse: "กำลังใช้", + statusAccept: "การรับรอง", + getAssetListFail: "ดึงรายการสินทรัพย์ไม่สำเร็จ", + getDataFail: "ดึงข้อมูลไม่สำเร็จ", + dataErrorPrefix: "ข้อมูลการควบคุมการเข้าถึง ", + pleaseSelectOneAsset: "กรุณาเลือกสินทรัพย์หนึ่งรายการ", + getInfoMachineListFail: "ดึงรายการเครื่องข้อมูลไม่สำเร็จ", + pleaseSelectAtLeastOneInfoMachine: "กรุณาเลือกอย่างน้อยหนึ่งเครื่องข้อมูล", + getAccessListFail: "ดึงรายการการเข้าถึงไม่สำเร็จ", + pleaseSelectAtLeastOne: "กรุณาเลือกอย่างน้อยหนึ่งรายการ", + accessControlSaveSuccess: "บันทึกการควบคุมการเข้าถึงสำเร็จ", + accessControlSaveFail: "บันทึกการควบคุมการเข้าถึงไม่สำเร็จ", + infoMachineNameRequired: "ชื่อเครื่องข้อมูลเป็นฟิลด์บังคับ", + expirationTimeRequired: "เวลาหมดอายุการเข้าถึงเป็นฟิลด์บังคับ", + assetNameRequired: "ชื่อสินทรัพย์เป็นฟิลด์บังคับ", + error: "ข้อผิดพลาด", + totalCount: "ทั้งหมด {count} รายการ" + }, + equipmentMeteringReportPage: { + reportPageTitle: "รายงานการวัดอุปกรณ์รายเดือน", + statisticsTitle: "สถิติรายงานการวัดอุปกรณ์รายเดือน", + selectDepartment: "เลือกแผนก", + toggleAllDepartments: "เลือกทั้งหมด", + year: "ปี", + month: "เดือน", + assetDepartment: "แผนกสินทรัพย์", + actualCompleted: "จำนวนที่เสร็จจริง", + shouldCompleted: "จำนวนที่ควรเสร็จ", + onTimeRate: "อัตราการวัดตรงเวลา", + departmentsSelectedSummary: "เลือก {count} แผนก", + summaryColumn: "สรุป" + }, + equipmentRepairReportPage: { + pageTitle: "รายงานการซ่อมอุปกรณ์", + section1Title: "อัตราความผิดพลาดรายเดือนตามแผนก", + section2Title: "อัตราความผิดพลาดรายปี", + section3Title: "อัตราความผิดพลาดตามผู้ผลิต", + selectVendor: "เลือกผู้ผลิต", + statUnit: "หน่วย", + statPeriod: "ช่วงเวลา", + summaryUnit: "สรุป", + accidentCount: "จำนวนเหตุการณ์", + totalEquipment: "จำนวนอุปกรณ์ทั้งหมด", + ratioRow: "อัตราส่วน", + failureRateTarget: "เป้าอัตราความผิดพลาด", + vendorsSelectedSummary: "เลือก {count} ผู้ผลิต", + toggleAllVendors: "เลือกทั้งหมด", + chartPlaceholderHint: "พื้นที่กราฟ", + rowMetricColumn: "ตัวชี้วัด", + failureCount: "จำนวนความผิดพลาด", + internalRepairDone: "ซ่อมเสร็จ (ภายใน)", + externalRepairDone: "ซ่อมเสร็จ (ภายนอก)", + underRepair: "กำลังซ่อม", + failureRate: "อัตราความผิดพลาดของอุปกรณ์" + }, + overviewDashboardPage: { + monthlySectionTitle: "แดชบอร์ดสถิติรายเดือน", + annualSectionTitle: "แดชบอร์ดสถิติรายปี", + assetDeptSectionTitle: "จัดกลุ่มตามแผนกสินทรัพย์", + manufacturerSectionTitle: "จัดกลุ่มตามผู้ผลิต", + assetYearSectionTitle: "การกระจายตามปีของสินทรัพย์", + chartAssetQty: "จำนวนสินทรัพย์", + chartAssetNetValue: "มูลค่าสุทธิของสินทรัพย์", + monthSuffix: "", + monthlyMetrics: { + entry_count: "จำนวนเข้า", + exit_count: "จำนวนออก", + acceptance_count: "จำนวนรับรองเสร็จ", + pending_acceptance_count: "จำนวนรอรับรอง", + acceptance_overdue_rate: "สัดส่วนเกินกำหนดรับรอง", + maintenance_completed_count: "จำนวนบำรุงเสร็จ", + maintenance_on_time_rate: "อัตราบำรุงตรงเวลา", + metering_completed_count: "จำนวนมิเตอร์ริงเสร็จ", + metering_on_time_rate: "อัตรามิเตอร์ริงตรงเวลา", + equipment_failure_count: "จำนวนความผิดปกติอุปกรณ์รวม", + equipment_failure_rate: "อัตราความผิดปกติอุปกรณ์", + repair_completed_title: "ซ่อมเสร็จ", + repair_under_repair_title: "สะสมกำลังซ่อม", + repair_internal_external_hint: "จำนวนภายใน / จำนวนภายนอก", + idle_equipment_count: "จำนวนอุปกรณ์ว่าง", + idle_asset_value: "มูลค่าสุทธิสินทรัพย์ว่าง", + }, + annualMetrics: { + entry_count: "จำนวนเข้า (รายปี)", + exit_count: "จำนวนออก (รายปี)", + acceptance_count: "จำนวนรับรองเสร็จ (รายปี)", + pending_acceptance_count: "จำนวนรอรับรอง (รายปี)", + acceptance_overdue_rate: "สัดส่วนเกินกำหนดรับรอง (รายปี)", + equipment_failure_count: "จำนวนความผิดปกติอุปกรณ์รวม (รายปี)", + equipment_failure_rate: "อัตราความผิดปกติอุปกรณ์ (รายปี)", + idle_equipment_count: "จำนวนอุปกรณ์ว่าง (รายปี)", + idle_asset_value: "มูลค่าสุทธิสินทรัพย์ว่าง (รายปี)", + maintenance_completed_count: "จำนวนใบบำรุงเสร็จ (รายปี)", + maintenance_rate: "สัดส่วนการบำรุง (รายปี)", + maintenance_on_time_rate: "อัตราบำรุงตรงเวลา (รายปี)", + metering_completed_count: "จำนวนมิเตอร์ริงเสร็จ (รายปี)", + metering_rate: "สัดส่วนมิเตอร์ริง (รายปี)", + }, + } +}; + diff --git a/web/src/locales/zh.js b/web/src/locales/zh.js new file mode 100644 index 0000000..268bfca --- /dev/null +++ b/web/src/locales/zh.js @@ -0,0 +1,1096 @@ + +export default { + login: { + title: "欢迎登录园区系统管理平台", + username: "用户名", + password: "密码", + autoLogin: "下次自动登录", + loginButton: "立即登录" + }, + menu: { + systemManagement: "系统管理", + employeeManagement: "员工管理", + userManagement: "用户管理", + roleManagement: "角色管理", + factoryManagement: "厂区管理", + sensorManagement: "信息机管理", + operationLogParent: "操作日志", + operationLog: "操作日志", + assetManagement: "资产管理", + attachmentManage:"附件管理", + assetList:"资产台账", + assetProcess:"资产流程", + deviceMaintain:"设备维护", + deviceHistory:"设备维护历史", + deviceRepair:"设备维修", + assetInventory:"资产盘点", + accessControlManage:"门禁权限管理", + notificationManage:"盘点报警记录", + accessAlarmRecord:"门禁报警记录", + assetAlarmRecord:"资产报警记录", + measurementManagement:"计量管理", + deviceMetering:"设备计量", + measureMaterialManage:"物料计量", + overviewDashboard:"概览看板", + + logout: "退出" + }, + header: { + messageNotification: "消息通知", + searchPlaceholder: "请输入您要搜索的...", + noticeDialogTitle: "消息通知", + deviceAlarm: "设备报警", + systemNotification: "系统通知", + accessControlAlarm: "门禁报警", + infoMachineOfflineReminder: "信息机离线提醒", + epcDisassemblyReminder: "EPC拆卸提醒", + epcLowBatteryReminder: "EPC低电量提醒", + noticeReadAll: "全部已读", + noticeUnread: "未读", + noticeRead: "已读", + noticeExpand: "展开", + noticeCollapse: "收起", + noticeLoading: "加载中...", + noticeNoMore: "没有更多通知了", + noticeEmpty: "暂无通知", + noticeFetchListFail: "获取通知列表失败", + noticeReadAllFail: "消息通知全部已读失败", + noticeReadAllSuccessDetail: "已读成功" + }, + importExport: { + importExport: "导入/导出", + downloadTemplate: "下载导入模板", + batchImport: "批量导入", + export: "导出" + }, + batchImport: { + dialogTitle: "导入文件", + step1Title: "确认上传", + step1Desc: "验证完成", + step2Title: "上传结果", + step2DescError: "上传失败", + step2DescSuccess: "上传成功", + step2DescPending: "验证结果", + clickUpload: "点击上传", + dragHere: "拖拽到此区域", + parsing: "解析数据中...", + validationDone: "校验已完成,请点击开始上传", + uploadFail: "上传失败", + totalRows: "总行数", + successCount: "成功", + failCount: "失败", + firstError: "首条错误", + downloadErrorLink: "点击下载错误链接", + parseDone: "解析完成", + downloadTemplateResult: "下载模板匹配结果", + downloadDataResult: "下载数据验证结果", + hintBatch: "(超过20w条数据请分批次上传)", + reupload: "重新上传", + startUpload: "开始上传" + }, + common: { + selectAll: "全选(已选{count}个)", + selectedTotal: "已选{selected}项/共{total}项", + firstPage: "第一页", + prevPage: "上一页", + nextPage: "下一页", + lastPage: "最后一页", + processing: "处理中...", + search: "查询", + reset: "重置", + searchBtn: "搜索", + resetBtn: "重置", + pageUnderDevelopment: "待开发页面", + batchDelete: "批量删除", + confirm: "确定", + cancel: "取消", + confirmDelete: "确认删除", + deleteSingleConfirm: "确定要删除这条数据吗?", + deleteBatchConfirm: "确定要删除选中的 {count} 条数据吗?", + add: "新增", + update: "更新", + edit: "编辑", + detail: "详情", + searchPlaceholder: "请输入.....", + selectTimeRange: "选择 {label} 范围", + searchColumnPlaceholder: "搜索 {label}", + creatorName: "创建人", + createTime: "创建时间", + comment: "描述", + description: "描述信息", + addSuccess: "新增成功", + addSuccessDetail: "已成功新增此条信息!", + editSuccess: "编辑成功", + editSuccessDetail: "已成功编辑此条信息!", + addFail: "新增失败", + editFail: "编辑失败", + deleteSuccess: "删除成功", + deleteSuccessDetail: "已成功删除此条信息!", + deleteBatchSuccessDetail: "已删除 {count} 条数据", + deleteFail: "删除失败", + operationFail: "操作失败", + tip: "提示", + success: "成功", + warning: "警告", + error: "错误", + requiredField: "{label}为必传字段", + emailReminder: "邮件提醒", + emailReminderUpdateSuccess: "邮件提醒更改成功", + emailReminderUpdateFail: "邮件提醒更改失败" + }, + employee: { + addEmployee: "新增员工", + search: "查询", + batchDelete: "批量删除", + searchPlaceholder: "请输入.....", + employeeName: "员工名称", + contactPhone: "联系电话", + email: "邮箱", + emailInfo: "邮箱信息", + organizationStructure: "组织结构", + createTime: "创建时间", + selectTimeRange: "选择 {label} 范围", + searchColumn: "查询 {label}", + query: "查询", + reset: "重置", + close: "关闭", + confirm: "确定", + cancel: "取消", + confirmDelete: "确认删除", + deleteSingleConfirm: "确定要删除这条数据吗?", + deleteBatchConfirm: "确定要删除选中的 {count} 条数据吗?", + add: "新增", + edit: "编辑", + detail: "详情", + xinXin: "新芯", + employeeNameRequired: "员工名称为必传字段" + }, + user: { + addUser: "新增用户", + editUser: "编辑用户", + detailUser: "用户详情", + userName: "用户名称", + employeeName: "员工名称", + contactPhone: "联系电话", + email: "邮箱", + comment: "描述", + roleName: "角色名称", + createTime: "创建时间", + userPassword: "用户密码", + confirmPassword: "确认密码", + manageEmployee: "管理员工", + manageRole: "管理角色", + selectEmployee: "请选择员工", + selectRole: "请选择角色", + selectedRolesCount: "已选择{count}个角色", + userNameRequired: "用户名称为必传字段", + userPasswordRequired: "用户密码为必传字段", + confirmPasswordRequired: "确认密码为必传字段", + manageEmployeeRequired: "管理员工为必传字段", + manageRoleRequired: "管理角色为必传字段" + }, + operationLog: { + title: "操作日志", + timestamp: "时间", + level: "级别", + source: "来源", + action: "操作", + message: "内容", + pageInfo: "本页 {count} 条", + fetchFail: "获取日志失败" + }, + role: { + addRole: "新增角色", + editRole: "编辑角色", + detailRole: "角色详情", + roleName: "角色名称", + comment: "描述", + creatorName: "创建人", + createTime: "创建时间", + noticePermission: "通知权限", + selectNoticePermission: "请选择通知权限", + roleNameRequired: "角色名称为必传字段", + noticePermissionRequired: "通知权限为必传字段", + importSuccess: "角色导入成功", + advancedSettings: "高级设置", + configurePagePermission: "配置页面权限", + configureDataPermission: "配置数据权限", + dataPermissionSubtitle: "(当前角色无法看见未勾选的字段)", + all: "全部", + submit: "提交", + pagePermission: { + equipmentRepairReport: "设备维修报表", + equipmentAcceptanceReport: "设备验收报表", + equipmentMaintenanceReport: "设备维护报表", + equipmentMeteringReport: "设备计量报表" + }, + dataPermissionGroup: { + AssetAlarmRecord: "资产报警记录", + AssetList: "资产列表", + AssetAcceptance: "资产验收", + DeviceEntry: "设备进厂", + DeviceMaintain: "设备维护", + DeviceMetering: "设备计量", + DeviceRepair: "设备维修", + DeviceTransfer: "设备转移", + DeviceLoan: "设备转借", + EmployeeManage: "员工管理", + DeviceExFactory: "设备出厂", + FactoryManage: "厂区管理", + InventoryDetail: "盘点详情", + AssetInventory: "资产盘点", + IdleHandle: "闲置处理", + MaterialMetering: "物料计量", + AccessControlManage: "门禁权限管理", + RoleManage: "角色管理", + SensorManage: "信息机管理", + UserManage: "用户管理", + OperationLog: "操作日志" + }, + dataPermissionField: { + alarm_time_assetAlarmRecord: "报警时间", + alarm_type_assetAlarmRecord: "报警类型", + asset_no_assetAlarmRecord: "资产编号", + asset_name_assetAlarmRecord: "资产名称", + current_factory_assetAlarmRecord: "当前厂区", + epc_assetAlarmRecord: "EPC", + spec_model_assetAlarmRecord: "规格型号", + factory_area_assetAlarmRecord: "所属厂区", + asset_dept_assetAlarmRecord: "资产部门", + responsible_assetAlarmRecord: "责任人", + signal_machine_assetAlarmRecord: "信号机", + info_machine_name_assetAlarmRecord: "信息机名称", + agent_assetList: "代理商", + asset_no_assetList: "资产编号", + asset_name_assetList: "资产名称", + sub_asset_no_assetList: "附属资产编号", + sub_asset_assetList: "附属资产", + attachment_assetList: "附件", + entry_time_assetList: "进厂时间", + asset_class_assetList: "资产分类", + depreciation_period_assetList: "折旧期数", + epc_assetList: "EPC", + factory_area_assetList: "所属厂区", + anti_dismantle_assetList: "资产防拆提醒", + measure_type_assetList: "计量类型", + original_value_assetList: "资产原值", + under_voltage_alarm_assetList: "欠压告警", + maintain_type_assetList: "维护类型", + manufacturer_assetList: "制造厂家", + doc_no_assetList: "资料编号", + remark_assetList: "备注说明", + net_value_assetList: "折旧净值", + original_zy_no_assetList: "原zy编号", + factory_no_assetList: "出厂编号", + asset_dept_assetList: "资产部门", + purchase_code_assetList: "采购编码", + asset_responsible_assetList: "资产责任人", + spec_model_assetList: "规格型号", + asset_status_assetList: "资产状态", + warranty_assetList: "保修期", + accept_status_assetAcceptance: "验收状态", + accept_responsible_assetAcceptance: "验收责任人", + asset_class_assetAcceptance: "资产分类", + asset_no_assetAcceptance: "资产编号", + asset_name_assetAcceptance: "资产名称", + attachment_assetAcceptance: "附件", + accept_finish_time_assetAcceptance: "验收完成时间", + factory_area_assetAcceptance: "所属厂区", + factory_no_assetAcceptance: "出厂编号", + asset_dept_assetAcceptance: "资产部门", + plan_accept_time_assetAcceptance: "计划验收时间", + remark_assetAcceptance: "备注说明", + asset_responsible_assetAcceptance: "资产责任人", + accept_start_time_assetAcceptance: "验收发起时间", + purchase_no_assetAcceptance: "采购编号", + accept_cycle_deviceEntry: "验收周期", + agent_deviceEntry: "代理商", + asset_class_deviceEntry: "资产分类", + asset_no_deviceEntry: "资产编号", + asset_name_deviceEntry: "资产名称", + attachment_deviceEntry: "附件", + contract_no_deviceEntry: "合同号", + epc_deviceEntry: "EPC", + factory_area_deviceEntry: "所属厂区", + entry_time_deviceEntry: "进厂时间", + original_value_deviceEntry: "资产原值", + manufacturer_deviceEntry: "制造厂家", + factory_no_deviceEntry: "出厂编号", + asset_dept_deviceEntry: "资产部门", + purchase_no_deviceEntry: "采购编号", + remark_deviceEntry: "备注说明", + asset_responsible_deviceEntry: "资产负责人", + spec_model_deviceEntry: "规格型号", + temp_return_date_deviceEntry: "临时设备计划退还日期", + warranty_deviceEntry: "保修期", + maintain_responsible_deviceMaintain: "维护责任人", + asset_no_deviceMaintain: "资产编号", + asset_name_deviceMaintain: "资产名称", + attachment_deviceMaintain: "附件", + create_time_deviceMaintain: "创建时间", + maintain_content_deviceMaintain: "维护内容", + this_maintain_time_deviceMaintain: "本次维护时间", + next_maintain_time_deviceMaintain: "下次维护时间", + asset_dept_deviceMaintain: "资产部门", + maintain_cycle_deviceMaintain: "维护周期", + spec_model_deviceMaintain: "规格型号", + asset_status_deviceMaintain: "资产状态", + meter_responsible_deviceMetering: "计量负责人", + asset_class_deviceMetering: "资产分类", + asset_no_deviceMetering: "资产编号", + asset_name_deviceMetering: "资产名称", + attachment_deviceMetering: "附件", + calibration_type_deviceMetering: "校正别", + calibration_result_deviceMetering: "校准结果", + this_calibration_date_deviceMetering: "本次校正日期", + measure_type_deviceMetering: "计量类型", + next_calibration_date_deviceMetering: "下次校正日期", + factory_no_deviceMetering: "出厂编号", + asset_dept_deviceMetering: "资产部门", + cycle_deviceMetering: "周期", + remark_deviceMetering: "备注说明", + asset_responsible_deviceMetering: "资产责任人", + spec_model_deviceMetering: "规格型号", + asset_status_deviceMetering: "资产状态", + update_time_deviceMetering: "更新时间", + repair_responsible_deviceRepair: "维修责任人", + asset_class_deviceRepair: "资产分类", + expected_return_date_deviceRepair: "预计外修回厂日期", + fault_phenomenon_deviceRepair: "故障现象", + asset_no_deviceRepair: "资产编号", + asset_name_deviceRepair: "资产名称", + fault_analysis_deviceRepair: "故障原因分析及维修具体情况", + fault_type_deviceRepair: "故障类型", + attachment_deviceRepair: "附件", + manufacturer_deviceRepair: "制造厂家", + repair_finish_time_deviceRepair: "维修完成时间", + factory_no_deviceRepair: "出厂编号", + external_repair_unit_deviceRepair: "外修单位", + asset_dept_deviceRepair: "资产部门", + remark_deviceRepair: "备注说明", + internal_external_deviceRepair: "内修/外修", + spec_model_deviceRepair: "规格型号", + repair_start_time_deviceRepair: "维修发起时间", + applicant_deviceTransfer: "申请人", + original_dept_deviceTransfer: "资产原部门", + asset_no_deviceTransfer: "资产编号", + asset_name_deviceTransfer: "资产名称", + receive_factory_deviceTransfer: "接收厂区", + receive_dept_deviceTransfer: "接收部门", + attachment_deviceTransfer: "附件", + receive_responsible_deviceTransfer: "接收责任人", + create_time_deviceTransfer: "创建时间", + remark_deviceTransfer: "备注说明", + factory_no_deviceTransfer: "出厂编号", + spec_model_deviceTransfer: "规格型号", + applicant_dept_deviceLoan: "申请人部门", + applicant_deviceLoan: "申请人", + loan_due_time_deviceLoan: "转借到期时间", + loan_factory_deviceLoan: "资产借用厂区", + asset_no_deviceLoan: "资产编号", + asset_name_deviceLoan: "资产名称", + loan_responsible_deviceLoan: "资产借用责任人", + factory_no_deviceLoan: "出厂编号", + attachment_deviceLoan: "附件", + create_time_deviceLoan: "创建时间", + remark_deviceLoan: "备注说明", + spec_model_deviceLoan: "规格型号", + loan_start_time_deviceLoan: "转借发起时间", + create_time_employeeManage: "创建时间", + email_employeeManage: "邮箱", + employee_name_employeeManage: "员工名称", + org_structure_employeeManage: "组织结构", + contact_phone_employeeManage: "联系电话", + applicant_dept_deviceExFactory: "申请人部门", + applicant_deviceExFactory: "申请人", + asset_no_deviceExFactory: "资产编号", + asset_name_deviceExFactory: "资产名称", + attachment_deviceExFactory: "附件", + create_time_deviceExFactory: "创建时间", + expected_return_time_deviceExFactory: "预计返厂时间", + ex_factory_time_deviceExFactory: "出厂时间", + factory_no_deviceExFactory: "出厂编号", + remark_deviceExFactory: "备注说明", + spec_model_deviceExFactory: "规格型号", + creator_factoryManage: "创建人", + create_time_factoryManage: "创建时间", + factory_name_factoryManage: "厂区名称", + remark_factoryManage: "备注", + asset_no_inventoryDetail: "资产编号", + asset_name_inventoryDetail: "资产名称", + epc_inventoryDetail: "EPC", + factory_no_inventoryDetail: "出厂编号", + asset_dept_inventoryDetail: "资产部门", + factory_inventoryDetail: "厂区", + responsible_inventoryDetail: "责任人", + info_machine_id_inventoryDetail: "信息机ID", + info_machine_name_inventoryDetail: "信息机名称", + spec_model_inventoryDetail: "规格型号", + inventory_no_assetInventory: "盘点单号", + to_inventory_assetInventory: "应盘资产", + create_time_assetInventory: "创建时间", + loss_assets_assetInventory: "盘亏资产", + gain_assets_assetInventory: "盘盈资产", + no_epc_assets_assetInventory: "无EPC资产", + inventory_time_assetInventory: "盘点时间", + apply_dept_idleHandle: "申请部门", + years_to_plant_idleHandle: "到厂年限", + applicant_idleHandle: "申请人", + factory_no_idleHandle: "出厂编号", + asset_no_idleHandle: "资产编号", + asset_name_idleHandle: "资产名称", + description_idleHandle: "描述说明", + spec_model_idleHandle: "规格型号", + attachment_idleHandle: "附件", + asset_status_idleHandle: "资产状态", + create_time_idleHandle: "创建时间", + idle_opinion_idleHandle: "闲置处理意见", + meter_responsible_materialMetering: "计量负责人", + material_no_materialMetering: "物料编号", + remark_materialMetering: "备注说明", + material_class_materialMetering: "物料分类", + material_name_materialMetering: "物料名称", + asset_responsible_materialMetering: "资产责任人", + attachment_materialMetering: "附件", + measure_type_materialMetering: "计量类型", + spec_model_materialMetering: "规格型号", + calibration_type_materialMetering: "校正别", + next_calibration_date_materialMetering: "下次校正日期", + material_status_materialMetering: "物料状态", + calibration_result_materialMetering: "校准结果", + asset_dept_materialMetering: "资产部门", + update_time_materialMetering: "更新时间", + this_calibration_date_materialMetering: "本次校正日期", + cycle_materialMetering: "周期", + asset_no_accessControlManage: "资产编号", + access_control_accessControlManage: "门禁", + asset_name_accessControlManage: "资产名称", + asset_status_accessControlManage: "资产状态", + epc_accessControlManage: "EPC", + access_expire_time_accessControlManage: "门禁到期时间", + asset_dept_accessControlManage: "资产部门", + asset_responsible_accessControlManage: "资产负责人", + creator_roleManage: "创建人", + create_time_roleManage: "创建时间", + description_roleManage: "描述", + role_name_roleManage: "角色名称", + permission_type_roleManage: "权限类型", + create_time_sensorManage: "创建时间", + factory_name_sensorManage: "厂区名称", + sensor_no_sensorManage: "信息机编号", + sensor_name_sensorManage: "信息机名称", + sensor_type_sensorManage: "信息机类型", + online_status_sensorManage: "在线状态", + create_time_userManage: "创建时间", + email_userManage: "邮箱", + employee_name_userManage: "员工名称", + data_permission_userManage: "数据权限", + description_userManage: "描述", + role_name_userManage: "角色名称", + contact_phone_userManage: "联系电话", + username_userManage: "用户名" + } + }, + factory: { + addFactory: "新增厂区", + editFactory: "编辑厂区", + detailFactory: "厂区详情", + factoryName: "厂区名称", + comment: "描述", + creatorName: "创建人", + createTime: "创建时间", + factoryNameRequired: "厂区名称为必传字段" + }, + sensor: { + addSensor: "新增信息机", + editSensor: "编辑信息机", + detailSensor: "信息机详情", + sensorNumber: "信息机编号", + sensorName: "信息机名称", + factoryName: "厂区名称", + onlineStatus: "在线状态", + sensorType: "信息机类型", + createTime: "创建时间", + relatedFactory: "关联厂区", + selectSensorType: "请选择信息机类型", + selectFactory: "请选择厂区", + sensorNameRequired: "信息机名称为必传字段", + sensorTypeRequired: "信息机类型为必传字段", + factoryAreaRequired: "关联厂区为必传字段" + }, + measureMaterial: { + addMaterialMetering: "新增物料计量", + editMaterialMetering: "编辑物料计量", + materialName: "物料名称", + materialNumber: "物料编号", + period: "周期", + periodMonths: "周期(月)", + nextCalibrateTime: "下次校正时间", + nextCalibrate: "下次校正", + attachments: "附件", + attachmentName: "附件名称", + materialCategory: "物料分类", + assetDepartment: "资产部门", + typeSpecification: "规格型号", + assetPic: "资产责任人", + calibrationResult: "校准结果", + measurementType: "计量类型", + calibrationType: "校正类别", + calibrationTypeShort: "校正别", + meteringPic: "计量负责人", + comment: "备注说明", + commentInfo: "备注信息", + calibrateTime: "校正时间", + materialStatus: "物料状态", + pleaseAddAttachment: "请添加附件", + addAttachment: "添加附件", + selectAttachment: "选择附件", + confirmSelect: "确认选择", + templateDownloadSuccess: "模板下载成功", + importSuccess: "物料计量导入成功", + importFail: "物料计量导入失败", + exportSuccess: "导出成功", + exportFail: "导出失败", + getDataFail: "获取数据失败", + requiredField: "为必传字段", + selectedAttachmentsCount: "已选择 {count} 个附件", + pleaseSelectAtLeastOneFile: "请至少选择一个文件", + nonMetering: "非计量", + currentMonthMetering: "当月计量", + batchUpdate: "批量更新", + batchUpdateSuccess: "批量更新成功", + batchUpdateFail: "批量更新失败", + pleaseSelectAtLeastOne: "请至少选择一条数据" + }, + deviceMetering: { + addDeviceMetering: "新增设备计量", + editDeviceMetering: "编辑设备计量", + selectAssetName: "选择资产名称", + pleaseSelectAssetName: "请选择资产名称", + pleaseSelectMeasurementType: "请选择计量类型", + importSuccess: "设备计量导入成功", + importFail: "设备计量导入失败", + pleaseSelectOneAsset: "请选择一个资产", + qualificationPass: "合格", + qualificationFail: "失败", + templateFileName: "设备计量导入模板.xlsx", + exportFileNamePrefix: "设备计量导出", + getDataFail: "获取数据失败", + batchUpdateSuccessDetail: "已成功批量更新所选信息!", + getAssetListFail: "获取资产列表失败", + pleaseSelectCalibrationType: "请选择校正类别", + pleaseSelectCalibrationResult: "请选择校准结果", + calibrationTypeInternal: "内校", + calibrationTypeExternal: "外校", + calibrationTypeExempt: "免校", + calibrationResultPass: "合格", + calibrationResultLimited: "限用", + calibrationResultFail: "不合格" + }, + deviceRepair: { + addDeviceRepair: "新增设备维修", + editDeviceRepair: "编辑设备维修", + batchUpdate: "批量更新", + repairPic: "维修责任人", + calibrationResult: "校准结果", + faultPhenomenon: "故障现象", + internalOrExternalRepair: "内修/外修", + faultReasonAndRepairContent: "故障原因以及维修内容", + externalRepairUnit: "外修单位", + faultCategory: "故障类别", + repairedReturnDate: "维修外修回厂日期", + repairInitiationDate: "维修发起时间", + createTime: "创建时间", + initiationTime: "发起时间", + completionTime: "完成时间", + pleaseSelectAssetName: "请选择资产名称", + pleaseEnterFaultPhenomenon: "请输入故障现象", + pleaseEnterExternalRepairUnit: "请输入外修单位", + pleaseEnterFaultCategory: "请输入故障类别", + pleaseSelectRepairInitiationDate: "请选择维修发起时间", + pleaseSelectCompletionTime: "请选择维修完成时间", + pleaseEnterRepairPic: "请输入维修责任人", + pleaseEnterInternalOrExternalRepair: "请输入内修/外修", + pleaseSelectRepairedReturnDate: "请选择维修外修回厂日期", + pleaseEnterFaultReasonAndRepairContent: "请输入故障原因以及维修内容", + pleaseEnterComment: "请输入备注说明", + selectAssetName: "选择资产名称", + assetSelectorSearchPlaceholder: "请输入您要搜索的内容...", + assetSelectorColumnId: "ID", + assetSelectorConfirm: "确认", + pleaseSelectOneAsset: "请选择一个资产", + getAssetListFail: "获取资产列表失败", + templateFileName: "设备维修导入模板.xlsx", + templateDownloadSuccess: "模板下载成功", + importSuccess: "设备维修导入成功", + importFail: "设备维修导入失败", + exportFileNamePrefix: "设备维修导出", + pleaseFillAtLeastOneBatch: "请至少填写一项要更新的内容", + batchUpdateSuccess: "批量更新成功", + batchUpdateFail: "批量更新失败", + pleaseSelectAtLeastOne: "请至少选择一项", + getDataFail: "获取设备维修数据失败" + }, + deviceMaintain: { + addMaintenancePlan: "新增维护计划", + remarkUpdate: "备注更新", + batchUpdate: "批量更新", + addMaintenancePlanTitle: "新增设备维护计划", + editMaintenancePlanTitle: "编辑设备维护计划", + assetName: "资产名称", + assetNumber: "资产编号", + maintenancePic: "维护责任人", + attachments: "附件", + assetStatus: "资产状态", + assetDepartment: "资产部门", + typeSpecification: "规格型号", + productionNumber: "出厂编号", + originZyNumber: "原zy编号", + maintenancePeriod: "维护周期", + maintenancePeriodDays: "维护周期/天", + maintenanceContent: "维护内容", + comment: "备注说明", + nextMaintenanceTime: "下次维护时间", + maintenanceTime: "维护时间", + createTime: "创建时间", + deviceHistory: "设备维护历史", + attachmentName: "附件名称", + pleaseAddAttachment: "请添加附件", + addAttachment: "添加附件", + pleaseEnterComment: "请输入备注说明", + maintenancePersonnel: "维护人员", + pleaseEnterMaintenancePersonnel: "请输入维护人员", + pleaseEnterMaintenanceContent: "请输入维护内容", + pleaseSelectMaintenanceTime: "请选择维护时间", + batchImportTitle: "批量导入", + parseTemplate: "解析模板", + parseTemplateDesc: "验证传入模板是否符合要求", + parseData: "解析数据", + parseDataDesc: "验证待上传数据格式是否有误", + confirmUpload: "确认上传", + confirmUploadDesc: "验证完成,确认上传", + pleaseSelectFile: "请选择要上传的文件", + uploadHintLarge: "(超过20w条数据请分批次上传)", + reupload: "重新上传", + startUpload: "开始上传", + pleaseSelectAssetName: "请选择资产名称", + submit: "提交", + getAssetListFail: "获取资产列表失败", + pleaseSelectOneAsset: "请选择一个资产", + getDataFail: "获取设备维护计划数据失败", + maintenancePeriodRequired: "维护周期为必传字段", + maintenancePicRequired: "维护责任人为必传字段", + assetNameRequired: "资产名称为必传字段", + maintenanceContentRequired: "维护内容为必传字段", + pleaseSelectAtLeastOne: "请至少选择一条数据", + batchUpdateSuccess: "批量更新成功", + batchUpdateFail: "批量更新失败", + remarkUpdateSuccess: "备注更新成功", + remarkUpdateFail: "备注更新失败", + templateDownloadSuccess: "模板下载成功", + templateFileName: "设备维护计划导入模板.xlsx", + pleaseSelectFileFirst: "请先选择文件", + importSuccess: "设备维护计划导入成功", + importFail: "设备维护计划导入失败", + exportFileNamePrefix: "设备维护计划导出", + exportNotImplemented: "导出功能待实现" + }, + deviceHistory: { + pageTitle: "设备维护历史", + searchPlaceholder: "请输入您要搜索的...", + addMaintenanceHistory: "新增维护历史", + maintenancePlan: "维护计划", + maintenancePersonnel: "维护人员", + maintenanceContent: "维护内容", + attachments: "附件", + maintenanceTime: "维护时间", + addTitle: "新增设备维护历史", + editTitle: "编辑维护历史", + maintenancePersonnelLabel: "维护人员:", + maintenanceContentLabel: "维护内容:", + maintenancePlanLabel: "维护计划:", + pleaseSelectMaintenancePlan: "请选择维护计划", + maintenanceTimeLabel: "维护时间:", + attachmentNameLabel: "附件名称:", + pleaseAddAttachment: "请添加附件", + addAttachment: "添加附件", + selectMaintenancePlan: "选择维护计划", + searchContentPlaceholder: "请输入您要搜索的内容...", + assetName: "资产名称", + assetNumber: "资产编号", + maintenancePic: "维护责任人", + maintenancePersonnelRequired: "维护人员为必传字段", + maintenanceTimeRequired: "维护时间为必传字段", + maintenancePlanRequired: "维护计划为必传字段", + pleaseSelectOneAsset: "请选择一个资产", + getDataFail: "获取设备维护历史数据失败", + operationFailRetry: "操作失败,请重试" + }, + assetList: { + addAssetList: "新增资产台账", + editAssetList: "编辑资产台账", + accessControl: "门禁权限", + batchUpdate: "批量更新", + accessControlConfig: "门禁权限配置", + accessListHint: "门禁列表(已勾选的门禁通过时候将不报警):", + permissionExpiryTime: "权限到期时间:", + loading: "加载中...", + submit: "提交", + getDataFail: "获取资产台账数据失败", + templateFileName: "资产台账导入模板.xlsx", + templateDownloadSuccess: "模板下载成功", + downloadTemplateFail: "下载模板失败", + importSuccess: "资产台账导入成功", + importFail: "资产台账导入失败", + exportSuccess: "导出成功", + exportFail: "导出失败", + exportFileNamePrefix: "资产台账导出", + selectedAttachmentsCount: "已选择 {count} 个附件", + pleaseSelectAtLeastOneFile: "请至少选择一个文件", + pleaseSelectAtLeastOne: "请至少选择一项", + getAccessControlListFail: "获取门禁列表失败", + accessControlSaveSuccess: "门禁权限保存成功", + accessControlSaveFail: "保存门禁权限失败", + pleaseFillAtLeastOneBatch: "请至少填写一项要更新的内容", + batchUpdateSuccess: "批量更新成功", + batchUpdateFail: "批量更新失败", + getFactoryAreaListFail: "获取厂区列表失败", + selectDate: "请选择日期", + accessControlSelectAtLeastOne: "请至少选择一个门禁", + accessControlSelectExpiryDate: "请选择权限到期时间", + epc: "EPC", + assetName: "资产名称", + assetNumber: "资产编号", + deviceStatus: "状态", + originZyNumber: "原zy编号", + typeSpecification: "规格型号", + productionNumber: "出厂编号", + assetDepartment: "资产部门", + factoryArea: "所属厂区", + manufacturer: "制造厂家", + assetStatus: "资产状态", + maintenanceType: "维护类型", + measurementType: "计量类型", + assetCategory: "资产分类", + assetPic: "资产责任人", + responsiblePerson: "责任人", + warrantyPeriod: "保修期", + entryTime: "进厂时间", + assetOriginalValue: "资产原值", + agent: "代理商", + depreciationPeriod: "折旧期数", + ancillaryAssets: "附属资产", + procurementCode: "采购编码", + procurementCodeNumber: "采购编号", + ancillaryAssetsNumber: "附属资产编号", + dataNumber: "资料编号", + lowVoltageWarning: "欠压告警", + assetAntiTheftRemind: "资产防拆提醒", + netDepreciationValue: "净折旧值", + attachments: "附件", + comment: "备注说明", + createTime: "创建时间", + pleaseAddAttachment: "请添加附件", + addAttachment: "添加附件", + enterAssetStatus: "请输入资产状态", + enterDeviceStatus: "请输入状态", + selectMaintenanceType: "请选择维护类型", + selectMeasurementType: "请选择计量类型", + enterAncillaryAssets: "请输入附属资产", + enterOriginZyNumber: "请输入原zy编号", + enterDataNumber: "请输入资料编号", + enterLowVoltageWarning: "请输入欠压警告", + enterAncillaryAssetsNumber: "请输入附属资产编号", + enterNetDepreciationValue: "净折旧值", + enterRemark: "请输入备注说明", + enterAssetDepartment: "请输入资产部门", + enterAssetPic: "请输入资产责任人", + enterFactoryArea: "请输入所属厂区", + enterRemarkBatch: "请输入备注说明", + enterPassword: "请输入密码", + passwordLabel: "请输入密码:", + statusOnline: "在线", + statusOffline: "离线", + statusUnknown: "未知状态", + statusShutdown: "停机", + statusMaintenance: "检修", + statusExternalRepair: "外修", + statusNormal: "正常" + }, + assetInventory: { + autoInventory: "主动盘点", + inventorying: "盘点中...", + inventoryNumber: "盘点单号", + shouldInventoryAssets: "应盘资产", + lostAssets: "盘亏资产", + profitAssets: "盘盈资产", + noEpcAssets: "无EPC资产", + inventoryTime: "盘点时间", + historyData: "历史数据", + searchPlaceholder: "请输入您要搜索的内容...", + exportSuccess: "导出成功", + exportFail: "导出失败", + autoInventoryTriggered: "主动盘点已触发", + inventoryCommandIssuedSuccess: "盘点指令下发成功", + autoInventoryFailed: "主动盘点失败", + exportFileNamePrefix: "资产盘点导出", + exportSuffix: "导出", + inventoryDataErrorPrefix: "获取资产盘点数据", + historyDataErrorPrefix: "获取历史数据", + infoMachineId: "信息机ID", + infoMachineName: "信息机名称", + getAssetListFail: "获取资产列表失败", + getDataFail: "获取数据失败", + getHistoryDataFail: "获取历史数据失败", + error: "错误" + }, + alarmRecord: { + tabAccessAlarm: "门禁报警", + tabInventoryAlarm: "盘点报警", + belongFactoryArea: "所属厂区", + currentFactoryArea: "当前厂区", + alarmTime: "报警时间", + infoMachineName: "信息机名称", + signalMachine: "信号机", + alarmType: "报警类型", + accessAlarmExportFileName: "门禁报警记录导出", + inventoryAlarmExportFileName: "盘点报警记录导出", + accessAlarmListErrorPrefix: "门禁报警记录列表", + inventoryAlarmListErrorPrefix: "盘点报警记录列表", + getDataFail: "获取数据失败", + exportSuccess: "导出成功", + exportFail: "导出失败", + error: "错误" + }, + attachmentManage: { + selectAll: "全选", + selectedCount: "(已选{count}个)", + rename: "重命名", + delete: "删除", + batchDownload: "批量下载", + rootDir: "根目录", + newFolder: "新建文件夹", + recycleBin: "回收站", + fullscreen: "全屏模式", + exitFullscreen: "退出全屏", + attachmentName: "附件名称", + modifiedDate: "修改日期", + type: "类型", + size: "大小", + action: "操作", + loading: "加载中...", + dragUploadHint: "拖拽文件到此处上传", + download: "下载", + noFiles: "暂无文件", + selectedItems: "已选择 {count} 项/", + totalItems: "{count} 项", + add: "添加", + uploadFile: "上传文件", + pleaseEnterFolderName: "请输入文件夹名称", + confirmDelete: "确认删除", + deleteConfirmMessage: "确定要删除 {names} 吗?", + pleaseEnterNewName: "请输入新名称", + uploadTitle: "上传文件", + cancelUpload: "取消上传", + waitUpload: "等待上传...", + uploadDone: "上传完成 ({size})", + uploadFailed: "上传失败", + confirmCancelUpload: "确认取消上传", + confirmCancelUploadMessage: "确定要取消上传吗?", + cancelUploadHint: "正在上传的文件将被中断", + name: "名称", + path: "路径", + recycleEmpty: "回收站为空", + recycleTotal: "共{count} 项", + confirmDeletePermanent: "确定要永久删除 {names} 吗?", + properties: "属性", + propertyType: "类型:", + propertyOriginalPath: "原位置:", + propertySize: "大小:", + propertyDeletedTime: "删除时间:", + propertyCreatedTime: "创建时间:", + restore: "还原(R)", + restoreSuccess: "还原成功", + batchRestoreSuccess: "成功还原 {count} 项", + batchRestore: "批量还原", + batchDelete: "批量删除", + batchDeleteRecycleSuccess: "成功删除 {success} 项{failPart}", + batchDeleteRecycleFailPart: ",失败 {count} 项", + batchDeleteRecycleAllFail: "所有项删除失败", + deleteSuccess: "删除成功", + deleteSuccessDetail: "已成功删除所选内容!", + deleteFail: "删除失败", + pleaseEnterFolderNameTip: "请输入文件夹名称", + createFolderSuccess: "创建文件夹成功", + pleaseEnterNewNameTip: "请输入新名称", + renameSuccess: "重命名成功", + renameFail: "重命名失败", + downloadSuccess: "文件下载成功", + downloadFail: "下载文件失败", + pleaseSelectAtLeastOne: "请至少选择一项", + batchDownloadSuccess: "成功下载 {count} 个文件", + batchDownloadFail: "批量下载文件失败", + uploadCanceled: "已取消", + uploadCanceledDetail: "上传已取消", + pasteNoContent: "没有可粘贴的内容", + pasteSuccess: "成功粘贴 {success} 项{failPart}", + pasteFailPart: ",失败 {count} 项", + pasteFail: "粘贴失败", + targetExistsSameName: "目标位置已存在同名文件/文件夹", + moveSuccess: "成功移动 {name}", + moveFail: "移动文件/文件夹失败", + uploadSuccessDetail: "成功上传 {success} 个文件{failPart}", + uploadFailPart: ",失败 {count} 个", + uploadAllFail: "所有文件上传失败", + uploadFail: "上传文件失败", + loadListFail: "加载文件列表失败,请稍后重试", + loadListFailShort: "加载文件列表失败", + typeFolder: "文件夹", + typeFile: "文件", + typePdf: "PDF 文档", + typeDoc: "Word 文档", + typeXlsx: "Excel 文档", + typePpt: "PowerPoint 文档", + typeTxt: "文本文档", + typeJson: "JSON 源文件", + typeJs: "JavaScript 源文件", + typeTs: "TypeScript 源文件", + typeVue: "Vue 源文件", + typeHtml: "HTML 文档", + typeCss: "CSS 样式表", + typeJpeg: "JPEG 图像", + typePng: "PNG 图像", + typeGif: "GIF 图像", + typeZip: "ZIP 压缩文件", + typeRar: "RAR 压缩文件", + type7z: "7Z 压缩文件", + typeLnk: "快捷方式", + typeExe: "可执行文件" + }, + accessControlManage: { + addAccessControl: "新增门禁权限", + editAccessControl: "编辑门禁权限", + accessControlBtn: "门禁权限", + accessListLink: "门禁列表", + accessColumn: "门禁", + expirationTime: "门禁到期时间", + selectInfoMachinePlaceholder: "请选择信息机名称", + selectAssetNamePlaceholder: "请选择资产名称", + infoMachineNameLabel: "信息机名称", + expirationTimeLabel: "门禁到期时间", + assetNameLabel: "资产名称", + selectDatePlaceholder: "请选择日期", + accessListDialogTitle: "门禁列表", + infoMachineType: "信息机类型", + typeAccess: "门禁", + typeInventory: "盘点", + onlineStatus: "在线状态", + factoryName: "厂区名称", + infoMachineNumber: "信息机编号", + searchKeywordPlaceholder: "请输入搜索关键词...", + searchContentPlaceholder: "请输入您要搜索的内容...", + close: "关闭", + selectAttachment: "选择附件", + selectAssetNameTitle: "选择资产名称", + selectInfoMachineTitle: "选择信息机名称", + statusInUse: "在用", + statusAccept: "验收", + getAssetListFail: "获取资产列表失败", + getDataFail: "获取数据失败", + dataErrorPrefix: "获取门禁权限数据", + pleaseSelectOneAsset: "请选择一个资产", + getInfoMachineListFail: "获取信息机列表失败", + pleaseSelectAtLeastOneInfoMachine: "请至少选择一个信息机", + getAccessListFail: "获取门禁列表失败", + pleaseSelectAtLeastOne: "请至少选择一项", + accessControlSaveSuccess: "门禁权限保存成功", + accessControlSaveFail: "保存门禁权限失败", + infoMachineNameRequired: "信息机名称为必传字段", + expirationTimeRequired: "门禁到期时间为必传字段", + assetNameRequired: "资产名称为必传字段", + error: "错误", + totalCount: "共{count}项" + }, + equipmentMeteringReportPage: { + reportPageTitle: "月度设备计量报表", + statisticsTitle: "月度计量设备报表统计", + selectDepartment: "选择部门", + toggleAllDepartments: "选择所有", + year: "年", + month: "月", + assetDepartment: "资产部门", + actualCompleted: "实际完成数量", + shouldCompleted: "应完成数量", + onTimeRate: "按时计量率", + departmentsSelectedSummary: "已选 {count} 个部门", + summaryColumn: "汇总" + }, + equipmentRepairReportPage: { + pageTitle: "设备维修报表", + section1Title: "按部门统计展示本月设备故障率", + section2Title: "按年度统计展示设备故障率", + section3Title: "按厂商统计展示设备故障率", + selectVendor: "选择厂商", + statUnit: "统计单位", + statPeriod: "统计周期", + summaryUnit: "汇总", + accidentCount: "事故数量", + totalEquipment: "设备总数", + ratioRow: "比率", + failureRateTarget: "故障率目标值", + vendorsSelectedSummary: "已选 {count} 个厂商", + toggleAllVendors: "选择所有", + chartPlaceholderHint: "图表区域", + rowMetricColumn: "指标", + failureCount: "故障数量", + internalRepairDone: "完成维修-内修", + externalRepairDone: "完成维修-外修", + underRepair: "维修中", + failureRate: "设备故障率" + }, + overviewDashboardPage: { + monthlySectionTitle: "按月度统计展示的数据工作台", + annualSectionTitle: "按年度统计展示的数据工作台", + assetDeptSectionTitle: "按资产部门分类", + manufacturerSectionTitle: "按制造厂商分类", + assetYearSectionTitle: "按资产年份分布", + chartAssetQty: "资产数量", + chartAssetNetValue: "资产净值", + monthSuffix: "月", + monthlyMetrics: { + entry_count: "进场设备数量", + exit_count: "出场设备数量", + acceptance_count: "完成验收设备数量", + pending_acceptance_count: "待验收设备数量", + acceptance_overdue_rate: "验收逾期占比", + maintenance_completed_count: "完成设备维护数量", + maintenance_on_time_rate: "维护及时率", + metering_completed_count: "完成计量数量", + metering_on_time_rate: "计量及时率", + equipment_failure_count: "设备故障总数量", + equipment_failure_rate: "设备故障率", + repair_completed_title: "维修完成", + repair_under_repair_title: "累计的维修中", + repair_internal_external_hint: "内修数量和外修数量", + idle_equipment_count: "闲置设备数量", + idle_asset_value: "闲置资产净值", + }, + annualMetrics: { + entry_count: "进场设备数量(年度)", + exit_count: "出场设备数量(年度)", + acceptance_count: "年度完成验收设备数量", + pending_acceptance_count: "待验收设备数量(年度)", + acceptance_overdue_rate: "验收超期占比(年度)", + equipment_failure_count: "设备故障总数量(年度)", + equipment_failure_rate: "设备总故障率(年度)", + idle_equipment_count: "年度闲置设备数量", + idle_asset_value: "年度闲置资产净值", + maintenance_completed_count: "年度完成设备维护数量", + maintenance_rate: "年度维护占比", + maintenance_on_time_rate: "年度维护及时率", + metering_completed_count: "年度完成计量数量", + metering_rate: "年度计量占比", + }, + } +}; + diff --git a/web/src/main.js b/web/src/main.js new file mode 100644 index 0000000..bbbe88b --- /dev/null +++ b/web/src/main.js @@ -0,0 +1,87 @@ +import { createApp } from "vue"; +import ElementPlus from "element-plus"; +import "element-plus/dist/index.css"; +import zhCn from "element-plus/es/locale/lang/zh-cn"; +import App from "./App.vue"; +import "@fortawesome/fontawesome-free/css/all.min.css"; +import NProgress from "nprogress"; +import "nprogress/nprogress.css"; +import { createRouter, createWebHistory } from "vue-router"; +import { routes } from "./router"; +import PrimeVue from "primevue/config"; +import Aura from "@primeuix/themes/aura"; +import ToastService from "primevue/toastservice"; +import ConfirmationService from "primevue/confirmationservice"; +import "primeicons/primeicons.css"; +import "./style.css"; +import { loadRuntimeConfig } from "./utils/config"; +import { createPinia } from "pinia"; +import i18n from "./i18n"; +import 'vuefinder/dist/style.css' +import VueFinder from 'vuefinder' +import Dialog from 'primevue/dialog' + +// 全局禁用 Dialog 的 ESC 关闭 +if (Dialog.props?.closeOnEscape) { + Dialog.props.closeOnEscape.default = false; +} + +async function init() { + // 加载运行时配置 + await loadRuntimeConfig(); + + const app = createApp(App); + + app.use(createPinia()); + app.use(i18n); + + const router = createRouter({ + history: createWebHistory(import.meta.env.VITE_APP_BASE_PATH), + routes, + }); + + NProgress.configure({ easing: "ease", speed: 500, showSpinner: false }); + + router.beforeEach((to, from, next) => { + NProgress.start(); + next(); + }); + + router.afterEach(() => { + NProgress.done(); + }); + + app.use(router); + app.use(ElementPlus, { + locale: zhCn, + }); + app.use(ToastService); + app.use(ConfirmationService); + app.use(PrimeVue, { + theme: { + preset: Aura, + options: { + prefix: 'p', + darkModeSelector: false, + }, + semantic: { + primary: { + 50: 'orange.50', + 100: 'orange.100', + 200: 'orange.200', + 300: 'orange.300', + 400: 'orange.400', + 500: 'orange.500', // 主橙色 + 600: 'orange.600', + 700: 'orange.700', + 800: 'orange.800', + 900: 'orange.900', + }, + }, + }, + }); + app.use(VueFinder) + app.mount("#app"); +} + +init(); diff --git a/web/src/router/index.js b/web/src/router/index.js new file mode 100644 index 0000000..04bbae6 --- /dev/null +++ b/web/src/router/index.js @@ -0,0 +1,163 @@ +import NoFound from "../views/NoFound.vue"; +import { getTimesheetRouteName } from "../configs/common.js"; + +const routes = [ + { + path: "/", + component: () => import("../views/Layout.vue"), + redirect: { name: getTimesheetRouteName("OverviewDashboard") }, + children: [ + // 登录(保留路由供退出登录跳转;启动默认进入概览看板,不再强制先进登录页) + { + path: "login", + alias: ["Login"], + name: getTimesheetRouteName("Login"), + component: () => import("../views/Login.vue"), + }, + // 概览看板 + { + path: "OverviewDashboard", + name: getTimesheetRouteName("OverviewDashboard"), + component: () => import("../views/overview/OverviewDashboard.vue"), + }, + { + path: "EquipmentRepairReport", + name: getTimesheetRouteName("EquipmentRepairReport"), + component: () => import("../views/overview/EquipmentRepairReport.vue"), + }, + { + path: "EquipmentAcceptanceReport", + name: getTimesheetRouteName("EquipmentAcceptanceReport"), + component: () => import("../views/overview/EquipmentAcceptanceReport.vue"), + }, + { + path: "EquipmentMaintenanceReport", + name: getTimesheetRouteName("EquipmentMaintenanceReport"), + component: () => import("../views/overview/EquipmentMaintenanceReport.vue"), + }, + { + path: "EquipmentMeteringReport", + name: getTimesheetRouteName("EquipmentMeteringReport"), + component: () => import("../views/overview/EquipmentMeteringReport.vue"), + }, + // 系统管理 + // 员工管理 + { + path: "EmployeeManage", + name: getTimesheetRouteName("EmployeeManage"), + component: () => import("../views/system/EmployeeManage.vue"), + }, + // 用户管理 + { + path: "UserManage", + name: getTimesheetRouteName("UserManage"), + component: () => import("../views/system/UserManage.vue"), + }, + // 角色管理 + { + path: "RoleManage", + name: getTimesheetRouteName("RoleManage"), + component: () => import("../views/system/RoleManage.vue"), + }, + // 厂区管理 + { + path: "FactoryManage", + name: getTimesheetRouteName("FactoryManage"), + component: () => import("../views/system/FactoryManage.vue"), + }, + //信息机管理 + { + path: "SensorManage", + name: getTimesheetRouteName("SensorManage"), + component: () => import("../views/system/SensorManage.vue"), + }, + { + path: "OperationLog", + name: getTimesheetRouteName("OperationLog"), + component: () => import("../views/system/OperationLog.vue"), + }, + // 资产管理 + // 附件管理 + { + path: "AttachmentManage", + name: getTimesheetRouteName("AttachmentManage"), + component: () => import("../views/asset/AttachmentManage.vue"), + }, + // 资产台账 + { + path: "AssetList", + name: getTimesheetRouteName("AssetList"), + component: () => import("../views/asset/AssetList.vue"), + }, + // 资产流程 + { + path: "AssetProcess", + name: getTimesheetRouteName("AssetProcess"), + component: () => import("../views/asset/AssetProcess.vue"), + }, + // 设备维护 + { + path: "DeviceMaintain", + name: getTimesheetRouteName("DeviceMaintain"), + component: () => import("../views/asset/DeviceMaintain.vue"), + }, + // 设备维修 + { + path: "DeviceRepair", + name: getTimesheetRouteName("DeviceRepair"), + component: () => import("../views/asset/DeviceRepair.vue"), + }, + // 资产盘点 + { + path: "AssetInventory", + name: getTimesheetRouteName("AssetInventory"), + component: () => import("../views/asset/AssetInventory.vue"), + }, + // 门禁权限管理 + { + path: "AccessControlManage", + name: getTimesheetRouteName("AccessControlManage"), + component: () => import("../views/asset/AccessControlManage.vue"), + }, + // 通知管理 + { + path: "NotificationManage", + name: getTimesheetRouteName("NotificationManage"), + component: () => import("../views/asset/NotificationManage.vue"), + }, + // 门禁报警记录 + { + path: "AccessAlarmRecord", + name: getTimesheetRouteName("AccessAlarmRecord"), + component: () => import("../views/asset/AccessAlarmRecord.vue"), + }, + // 资产报警记录(门禁/盘点 Tab) + { + path: "AssetAlarmRecord", + name: getTimesheetRouteName("AssetAlarmRecord"), + component: () => import("../views/asset/AssetAlarmRecord.vue"), + }, + + // 计量管理 + // 设备计量 + { + path: "DeviceMetering", + name: getTimesheetRouteName("DeviceMetering"), + component: () => import("../views/measurement/DeviceMetering.vue"), + }, + // 物料计量 + { + path: "MeasureMaterialManage", + name: getTimesheetRouteName("MeasureMaterialManage"), + component: () => import("../views/measurement/MeasureMaterialManage.vue"), + }, + ] + }, + { + path: "/:pathMatch(.*)*", + name: getTimesheetRouteName("NoFound"), + component: NoFound, + }, +]; + +export { routes }; diff --git a/web/src/store/index.js b/web/src/store/index.js new file mode 100644 index 0000000..ad85db4 --- /dev/null +++ b/web/src/store/index.js @@ -0,0 +1,8 @@ +import { createPrefixedDefineStore } from '../utils/piniaHelpers'; + +// Define the unique ID for the timesheet sub-application. +const APP_ID = 'timesheet'; + +// Create and export the app-specific defineStore function. +// All stores within the timesheet app should import defineStore from this file. +export const defineStore = createPrefixedDefineStore(APP_ID); diff --git a/web/src/store/system.js b/web/src/store/system.js new file mode 100644 index 0000000..fe85867 --- /dev/null +++ b/web/src/store/system.js @@ -0,0 +1,141 @@ +import { defineStore } from './index'; +import { getTablist as getEmployeeList } from '../api/system/employmanage'; +import { getTablist as getRoleList, getPermisssionPage } from '../api/system/rolemanage'; +import { getTablist as getFactoryList } from '../api/system/factorymanage'; + +export const useSystemStore = defineStore('system', { + state: () => ({ + employeeList: [], + roleList: [], + factoryList: [], + permissionCodes: [], + /** 各模块页面的字段显示/隐藏权限(来自 getPermisssionPage 的 advanced_permissions) */ + advancedPermissionCodes: [], + loadingEmployees: false, + loadingRoles: false, + loadingFactories: false, + }), + + actions: { + // 获取员工列表 + async fetchEmployeeList() { + if (this.loadingEmployees) { + return; + } + this.loadingEmployees = true; + try { + const params = { + page: { + page_num: 1, + page_size: 1000, // 获取所有员工 + }, + search: "", + sort: [{ + column: "create_at", + order: "desc", + }], + filter: {}, + }; + const res = await getEmployeeList(params); + this.employeeList = res.data || []; + return this.employeeList; + } catch (error) { + console.error("获取员工列表失败:", error); + throw error; + } finally { + this.loadingEmployees = false; + } + }, + + // 获取角色列表 + async fetchRoleList() { + if (this.loadingRoles) { + return; + } + this.loadingRoles = true; + try { + const params = { + page: { + page_num: 1, + page_size: 1000, // 获取所有角色 + }, + search: "", + sort: [{ + column: "create_at", + order: "desc", + }], + filter: {}, + }; + const res = await getRoleList(params); + this.roleList = res.data || []; + return this.roleList; + } catch (error) { + console.error("获取角色列表失败:", error); + throw error; + } finally { + this.loadingRoles = false; + } + }, + + // 获取厂区列表 + async fetchFactoryList() { + if (this.loadingFactories) { + return; + } + this.loadingFactories = true; + try { + const params = { + page: { + page_num: 1, + page_size: 1000, // 获取所有厂区 + }, + search: "", + sort: [{ + column: "create_at", + order: "desc", + }], + filter: {}, + }; + const res = await getFactoryList(params); + this.factoryList = res.data || []; + return this.factoryList; + } catch (error) { + console.error("获取厂区列表失败:", error); + throw error; + } finally { + this.loadingFactories = false; + } + }, + + // 获取当前用户页面权限(左侧菜单展示用)、各模块字段显示隐藏权限;角色管理保存后可调用以刷新 + async fetchPermissionCodes() { + try { + const res = await getPermisssionPage({}); + if (res?.code === 0 && res?.data) { + this.permissionCodes = Array.isArray(res.data.page_permissions) ? res.data.page_permissions : []; + this.advancedPermissionCodes = Array.isArray(res.data.advanced_permissions) ? res.data.advanced_permissions : []; + } else { + this.permissionCodes = []; + this.advancedPermissionCodes = []; + } + return this.permissionCodes; + } catch (_) { + this.permissionCodes = []; + this.advancedPermissionCodes = []; + return []; + } + }, + }, + + getters: { + // 获取员工选项(用于下拉框) + employeeOptions: (state) => state.employeeList, + + // 获取角色选项(用于下拉框) + roleOptions: (state) => state.roleList, + + // 获取厂区选项(用于下拉框) + factoryOptions: (state) => state.factoryList, + }, +}); + diff --git a/web/src/store/ui.js b/web/src/store/ui.js new file mode 100644 index 0000000..4f823a3 --- /dev/null +++ b/web/src/store/ui.js @@ -0,0 +1,15 @@ +import { defineStore } from './index'; + +export const useUiStore = defineStore('ui', { + state: () => ({ + isSidebarCollapsed: false, + }), + actions: { + toggleSidebarCollapsed() { + this.isSidebarCollapsed = !this.isSidebarCollapsed; + }, + setSidebarCollapsed(collapsed) { + this.isSidebarCollapsed = !!collapsed; + }, + }, +}); diff --git a/assets/.gitkeep b/web/src/store/user.js similarity index 100% rename from assets/.gitkeep rename to web/src/store/user.js diff --git a/web/src/style.css b/web/src/style.css new file mode 100644 index 0000000..232938e --- /dev/null +++ b/web/src/style.css @@ -0,0 +1,250 @@ +html { + /* background-color: rgba(27, 38, 54, 1); */ + text-align: center; + color: white; + font-size: 16px; +} + +body { + margin: 0; + color: white; + font-family: "Nunito", -apple-system, BlinkMacSystemFont, "Segoe UI", + "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", + "Helvetica Neue", sans-serif; +} + +/* 字体文件不存在,已移除 @font-face 声明,使用系统字体回退 */ + +#app { + height: 100vh; + text-align: center; +} + +/* 覆盖PrimeVue的CSS变量(如果使用) */ +:root { + --p-button-primary-bg: #3067E5 !important; + --p-button-primary-border-color: #3067E5 !important; + --p-button-primary-hover-bg: #3067E5 !important; + --p-button-primary-hover-border-color: #3067E5 !important; + --p-button-primary-active-bg: #3067E5 !important; + --p-button-primary-active-border-color: #3067E5 !important; + /* Checkbox CSS 变量 */ + --p-checkbox-checked-bg: #3067E5 !important; + --p-checkbox-checked-border-color: #3067E5 !important; + --p-checkbox-focus-ring: rgba(255, 107, 53, 0.2) !important; + --p-highlight-bg: #3067E5 !important; + --p-highlight-border-color: #3067E5 !important; + /* 下拉选项高亮统一偏蓝,避免主题绿色 */ + --p-listbox-option-highlight-bg: #E6F0FF !important; + --p-listbox-option-highlight-text-color: #3067E5 !important; +} + +/* 全局设置所有Button为橙色 - 使用更高优先级的选择器 */ +button.p-button, +.p-button, +button.p-button:not(.p-button-text):not(.p-button-outlined):not(.p-button-link) { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + color: #ffffff !important; + transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, transform 0.2s ease !important; +} + +button.p-button:hover, +.p-button:hover, +button.p-button:not(.p-button-text):not(.p-button-outlined):not(.p-button-link):hover { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + color: #ffffff !important; + transform: translateY(-1px) !important; +} + +button.p-button:focus, +.p-button:focus, +button.p-button:not(.p-button-text):not(.p-button-outlined):not(.p-button-link):focus { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + box-shadow: 0 0 0 0.2rem rgba(255, 152, 0, 0.5) !important; + color: #ffffff !important; +} + +button.p-button:active, +.p-button:active, +button.p-button:not(.p-button-text):not(.p-button-outlined):not(.p-button-link):active { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + color: #ffffff !important; +} + +/* 主要按钮(p-button-primary) */ +button.p-button.p-button-primary, +.p-button.p-button-primary { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + color: #ffffff !important; + transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, transform 0.2s ease !important; +} + +button.p-button.p-button-primary:hover, +.p-button.p-button-primary:hover { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + color: #ffffff !important; + transform: translateY(-1px) !important; +} + +/* 危险按钮也使用橙色系(深橙色) */ +button.p-button.p-button-danger, +.p-button.p-button-danger { + background-color: #ff5722 !important; + border-color: #ff5722 !important; + color: #ffffff !important; + transition: background-color 0.3s ease, border-color 0.3s ease, color 0.3s ease, transform 0.2s ease !important; +} + +button.p-button.p-button-danger:hover, +.p-button.p-button-danger:hover { + background-color: #f4511e !important; + border-color: #f4511e !important; + color: #ffffff !important; + transform: translateY(-1px) !important; +} + +/* 文本按钮的悬停效果也使用橙色 */ +button.p-button.p-button-text, +.p-button.p-button-text { + transition: background-color 0.3s ease, color 0.3s ease, transform 0.2s ease !important; +} + +button.p-button.p-button-text:hover, +.p-button.p-button-text:hover { + background-color: rgba(255, 152, 0, 0.1) !important; + color: #3067E5 !important; + transform: translateY(-1px) !important; +} + +button.p-button.p-button-text:focus, +.p-button.p-button-text:focus { + background-color: rgba(255, 152, 0, 0.1) !important; + color: #3067E5 !important; +} + +/* Checkbox 全局橙色主题 - 使用更强的选择器覆盖 PrimeVue 默认样式 */ +.p-checkbox .p-checkbox-box, +div.p-checkbox .p-checkbox-box, +.p-checkbox-box { + border-color: #3067E5 !important; +} + +.p-checkbox .p-checkbox-box.p-highlight, +div.p-checkbox .p-checkbox-box.p-highlight, +.p-checkbox-box.p-highlight, +.p-checkbox-box[data-p-highlight="true"], +.p-checkbox-box[aria-checked="true"] { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + background: #3067E5 !important; +} + +.p-checkbox .p-checkbox-box.p-highlight .p-checkbox-icon, +div.p-checkbox .p-checkbox-box.p-highlight .p-checkbox-icon, +.p-checkbox-box.p-highlight .p-checkbox-icon, +.p-checkbox-box[aria-checked="true"] .p-checkbox-icon { + color: #ffffff !important; +} + +.p-checkbox .p-checkbox-box.p-highlight:hover, +div.p-checkbox .p-checkbox-box.p-highlight:hover, +.p-checkbox-box.p-highlight:hover { + background-color: #3067E5 !important; + border-color: #3067E5 !important; + background: #3067E5 !important; +} + +.p-checkbox .p-checkbox-box:not(.p-disabled):not(.p-highlight):hover { + border-color: #3067E5 !important; + background-color: rgba(255, 107, 53, 0.1) !important; +} + +.p-checkbox .p-checkbox-box:not(.p-disabled).p-focus { + border-color: #3067E5 !important; + box-shadow: 0 0 0 0.2rem rgba(255, 107, 53, 0.2) !important; +} + +.p-checkbox .p-checkbox-box.p-highlight.p-focus { + border-color: #3067E5 !important; + box-shadow: 0 0 0 0.2rem rgba(255, 107, 53, 0.2) !important; +} + +/* 表格排序列头样式 - 移除背景色,确保文字可见 */ +.p-datatable-thead > tr > th.p-sortable-column.p-highlight, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight:hover, +.p-datatable-thead > tr > th.p-sortable-column-active, +.p-datatable-thead > tr > th.p-sortable-column-active:hover { + background-color: transparent !important; + color: #333333 !important; +} + +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-icon { + color: inherit !important; +} + +/* 所有排序箭头图标都使用蓝色 */ +.p-datatable-thead > tr > th.p-sortable-column .p-sortable-column-icon, +.p-datatable-thead > tr > th.p-sortable-column .p-sortable-column-badge, +.p-datatable-thead > tr > th.p-sortable-column .p-column-sorter, +.p-datatable-thead > tr > th.p-sortable-column .p-sortable-column-icon.pi-sort-up, +.p-datatable-thead > tr > th.p-sortable-column .p-sortable-column-icon.pi-sort-down, +.p-datatable-thead > tr > th.p-sortable-column .p-sortable-column-icon.pi-sort-alt, +.p-datatable-thead > tr > th.p-sortable-column i.pi-sort-up, +.p-datatable-thead > tr > th.p-sortable-column i.pi-sort-down, +.p-datatable-thead > tr > th.p-sortable-column i.pi-sort-alt, +.p-datatable-thead > tr > th.p-sortable-column span.p-sortable-column-icon, +.p-datatable-thead > tr > th.p-sortable-column span.p-sortable-column-icon i { + color: #3067E5 !important; +} + +/* 选中状态的排序箭头图标使用默认颜色 */ +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-icon, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-badge, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-column-sorter, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-icon.pi-sort-up, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-icon.pi-sort-down, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight .p-sortable-column-icon.pi-sort-alt, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight i.pi-sort-up, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight i.pi-sort-down, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight i.pi-sort-alt, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight span.p-sortable-column-icon, +.p-datatable-thead > tr > th.p-sortable-column.p-highlight span.p-sortable-column-icon i { + color: inherit !important; +} + +.p-datatable-column-sorted { + background-color: transparent !important; + color: #333333 !important; +} +:deep(.p-checkbox .p-checkbox-box) { + border-color: #3067E5 !important; +} +:deep(.p-checkbox-checked .p-checkbox-box){ + background-color: #3067E5 !important; + border-color: #3067E5 !important; + background: #3067E5 !important; +} +:deep(.p-checkbox .p-checkbox-box.p-highlight:hover) { + background-color: #3067E5 !important; + border-color: #3067E5 !important; +} + +/* 下拉框/Select 选项统一偏蓝色,去除绿色 */ +.p-select-overlay .p-select-option.p-select-option-selected, +.p-select-overlay .p-select-option[data-p-selected="true"] { + background: #E6F0FF !important; + color: #3067E5 !important; +} +.p-select-overlay .p-select-option:hover, +.p-select-overlay .p-select-option.p-focus { + background: #E6F0FF !important; + color: #3067E5 !important; +} + +/* #3067E5 */ \ No newline at end of file diff --git a/web/src/utils/attachmentRequest.js b/web/src/utils/attachmentRequest.js new file mode 100644 index 0000000..63b27cb --- /dev/null +++ b/web/src/utils/attachmentRequest.js @@ -0,0 +1,97 @@ +// 附件管理专用的 axios 实例 +import axios from 'axios' +import { getApiBaseUrl } from './config' + +// 创建附件管理专用的 axios 实例 +const attachmentRequest = axios.create({ + timeout: 600_000, // 10分钟超时,支持大文件上传下载 + maxContentLength: Infinity, // 移除响应内容大小限制 + maxBodyLength: Infinity, // 移除请求体大小限制 +}) + +// 请求拦截器:自动添加认证信息 +attachmentRequest.interceptors.request.use( + (config) => { + // 动态获取 baseURL(如果未显式设置) + if (config.baseURL === undefined || config.baseURL === null) { + // 自动获取 baseURL + let baseURL = getApiBaseUrl() || '' + // 移除 baseURL 末尾的斜杠,避免与 URL 路径拼接时出现双斜杠 + if (baseURL) { + baseURL = baseURL.replace(/\/+$/, '') + } + // 对于 WebDAV 标准操作(非批量下载),在开发模式下使用相对路径走代理 + // 批量下载路径是 /webdav/download/files,需要完整的 baseURL + if (config.url && config.url.startsWith('/webdav/') && !config.url.includes('/download/')) { + config.baseURL = '' + } else { + config.baseURL = baseURL + } + } + // 如果显式设置了 baseURL(即使是空字符串),则使用它,不做任何处理 + + // 从 localStorage 获取 token 和 uid,并添加到 header + const token = localStorage.getItem('token') + const uid = localStorage.getItem('uid') + + if (token) { + config.headers.token = token + config.headers.Authorization = `Bearer ${token}` + } + + if (uid) { + config.headers.uid = uid + } + + // 对于 PUT 请求(文件上传),确保 Content-Type 正确设置 + if (config.method === 'put' || config.method === 'PUT') { + if (config.data instanceof File || config.data instanceof Blob) { + // 如果没有设置 Content-Type,使用文件类型或默认值 + if (!config.headers['Content-Type']) { + config.headers['Content-Type'] = config.data.type || 'application/octet-stream' + } + // 确保方法正确 + config.method = 'PUT' + } + } + + // 对于 POST 请求(批量下载),确保 Content-Type 正确设置 + if (config.method === 'post' || config.method === 'POST') { + if (config.data && typeof config.data === 'object' && !config.headers['Content-Type']) { + config.headers['Content-Type'] = 'application/json' + } + } + + return config + }, + (error) => { + return Promise.reject(error) + } +) + +// 响应拦截器:处理响应数据 +attachmentRequest.interceptors.response.use( + (response) => { + // 对于 blob 响应类型(下载),直接返回 + if (response.config.responseType === 'blob') { + return response + } + // 对于其他响应,返回 data + return response.data + }, + (error) => { + // 处理取消请求 + if (axios.isCancel && axios.isCancel(error)) { + return Promise.reject(new Error('上传已取消')) + } + // 兼容新版本 axios (v0.22+) + if (error.name === 'CanceledError' || error.code === 'ERR_CANCELED' || error.message === 'canceled') { + return Promise.reject(new Error('上传已取消')) + } + console.error('附件请求失败:', error) + return Promise.reject(error) + } +) + +export default attachmentRequest + diff --git a/web/src/utils/config.js b/web/src/utils/config.js new file mode 100644 index 0000000..a74a12f --- /dev/null +++ b/web/src/utils/config.js @@ -0,0 +1,100 @@ +/** + * 运行时配置加载模块 + * 支持三种模式: + * 1. 开发模式 - 直接使用环境变量 + * 2. 作为 Portal 子应用 - 从 localStorage 读取主应用配置 + * 3. 独立运行 - 从 config.json 加载配置 + */ + +let runtimeConfig = null; +let configLoaded = false; + +/** + * 加载运行时配置 + * 优先级: localStorage > config.json > import.meta.env + * @returns {Promise} + */ +export async function loadRuntimeConfig() { + if (configLoaded) { + return; + } + + // 开发模式直接使用环境变量 + if (import.meta.env.MODE === "development") { + configLoaded = true; + return; + } + + // 独立运行模式: 从 config.json 加载 + try { + const response = await fetch("/config.json"); + if (response.ok) { + runtimeConfig = await response.json(); + if (runtimeConfig) { + // 存入 localStorage 供后续使用 + localStorage.setItem( + "__PORTAL_ENV__", + JSON.stringify(runtimeConfig) + ); + } + } else { + console.warn( + "config.json not found, using build-time environment variables" + ); + } + } catch (error) { + console.warn( + "Failed to load runtime config, using build-time environment variables:", + error + ); + } + + configLoaded = true; +} + +/** + * 获取环境变量值 + * @param {string} varName 环境变量名 + * @returns {string | null} + */ +export function getEnvVar(varName) { + const env = import.meta.env.MODE; + if (env === "development") { + return import.meta.env[varName] || null; + } else if (env === "production") { + const storedConfig = localStorage.getItem("__PORTAL_ENV__"); + if (storedConfig) { + try { + const runtimeConfig = JSON.parse(storedConfig); + if (runtimeConfig && varName in runtimeConfig) { + return runtimeConfig[varName]; + } + } catch (e) { + console.warn("Failed to parse localStorage config:", e); + } + } + } + return null; +} + +/** + * 获取API基础URL + * @returns {string | null} + */ +export function getApiBaseUrl() { + const baseURL = getEnvVar("VITE_RFID_API_BASE_URL"); + + // 开发模式下,如果没有配置,返回空字符串,让 Vite 代理处理请求 + if (import.meta.env.MODE === "development") { + return baseURL || ""; + } + + // 生产模式下,如果没有配置,返回 null 并提示错误 + if (!baseURL) { + console.error( + "VITE_RFID_API_BASE_URL is not configured. " + + "Please set it in .env.development (dev) or docker environment variables (production)." + ); + } + return baseURL; +} diff --git a/web/src/utils/debounce.js b/web/src/utils/debounce.js new file mode 100644 index 0000000..58c72db --- /dev/null +++ b/web/src/utils/debounce.js @@ -0,0 +1,92 @@ +/** + * 防抖函数 + * @param {Function} func 需要防抖的函数 + * @param {number} wait 延迟时间(毫秒) + * @param {boolean} immediate 是否立即执行(默认false) + * @returns {Function} 防抖后的函数 + */ +export function debounce(func, wait = 300, immediate = false) { + let timeout = null; + + const debounced = function(...args) { + const context = this; + + // 清除之前的定时器 + if (timeout) { + clearTimeout(timeout); + } + + // 如果设置了立即执行 + if (immediate) { + // 如果还没有执行过,立即执行 + const callNow = !timeout; + timeout = setTimeout(() => { + timeout = null; + }, wait); + + if (callNow) { + // 执行函数(支持异步函数,但不等待其完成) + func.apply(context, args); + } + } else { + // 延迟执行(支持异步函数,但不等待其完成) + timeout = setTimeout(() => { + func.apply(context, args); + }, wait); + } + }; + + // 添加取消方法 + debounced.cancel = function() { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + }; + + return debounced; +} + +/** + * 节流函数(可选,如果需要的话) + * @param {Function} func 需要节流的函数 + * @param {number} wait 延迟时间(毫秒) + * @returns {Function} 节流后的函数 + */ +export function throttle(func, wait = 300) { + let timeout = null; + let previous = 0; + + const throttled = function(...args) { + const context = this; + const now = Date.now(); + const remaining = wait - (now - previous); + + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + func.apply(context, args); + } else if (!timeout) { + timeout = setTimeout(() => { + previous = Date.now(); + timeout = null; + func.apply(context, args); + }, remaining); + } + }; + + // 添加取消方法 + throttled.cancel = function() { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = 0; + }; + + return throttled; +} + diff --git a/web/src/utils/piniaHelpers.js b/web/src/utils/piniaHelpers.js new file mode 100644 index 0000000..3f698f5 --- /dev/null +++ b/web/src/utils/piniaHelpers.js @@ -0,0 +1,26 @@ +import { defineStore as originalDefineStore } from 'pinia'; + +/** + * A factory function that creates a prefixed version of Pinia's defineStore. + * This is a reusable utility for multi-app environments to prevent store ID collisions. + * + * @param {string} prefix - The unique prefix for the application, e.g., 'alarmhub'. + * @returns {Function} A new defineStore function that automatically adds the prefix. + */ +export function createPrefixedDefineStore(prefix) { + if (!prefix) { + throw new Error('A prefix must be provided to createPrefixedDefineStore.'); + } + + /** + * The returned function that mimics Pinia's defineStore but with automatic prefixing. + * @param {string} id - The unique identifier for the store (within the app). + * @param {...any} args - The remaining arguments for defineStore (setup or options). + * @returns The store instance created by Pinia. + */ + return function defineStore(id, ...args) { + const prefixedId = `${prefix}-${id}`; + return originalDefineStore(prefixedId, ...args); + }; +} + diff --git a/web/src/utils/request.js b/web/src/utils/request.js new file mode 100644 index 0000000..073c705 --- /dev/null +++ b/web/src/utils/request.js @@ -0,0 +1,238 @@ +import axios from "axios"; +import { ElMessage } from "element-plus"; +import { getApiBaseUrl } from "./config"; + +// 创建 axios 实例 +const service = axios.create({ + timeout: 300_000, // 请求超时时间 (300秒,支持大文件上传) + maxContentLength: Infinity, // 移除响应内容大小限制 + maxBodyLength: Infinity, // 移除请求体大小限制 +}); + +// 请求拦截器 +service.interceptors.request.use( + (config) => { + // 动态获取baseURL,支持运行时配置 + if (!config.baseURL) { + let baseURL = getApiBaseUrl(); + // 允许空字符串(开发模式下使用 Vite 代理时有效) + if (baseURL === null || baseURL === undefined) { + return Promise.reject( + new Error("API base URL is not configured") + ); + } + // 移除 baseURL 末尾的斜杠,避免与 URL 路径拼接时出现双斜杠 + if (baseURL) { + baseURL = baseURL.replace(/\/+$/, ''); + } + config.baseURL = baseURL; + } + + // 从localStorage获取token和uid,并添加到header + const token = localStorage.getItem("token"); + const uid = localStorage.getItem("uid"); + const language = localStorage.getItem("language") || "zh-CN"; + + if (token) { + config.headers.token = token; + config.headers.Authorization = `Bearer ${token}`; + } + + if (uid) { + config.headers.uid = uid; + } + + // 添加 Accept-Language 请求头 + config.headers['Accept-Language'] = language; + + // 对于 DELETE 请求,如果提供了 data,确保 Content-Type 被设置 + // 某些服务器需要明确设置 Content-Type 才能正确接收 DELETE 请求的 body + if (config.method === 'delete' && config.data) { + if (!config.headers['Content-Type']) { + config.headers['Content-Type'] = 'application/json'; + } + } + + // 对于文件上传请求(PUT方法),增加超时时间并确保没有大小限制 + const method = (config.method || '').toLowerCase(); + if (method === 'put' && (config.data instanceof File || config.data instanceof Blob)) { + // 对于大文件上传,使用更长的超时时间 + config.timeout = 600_000; // 10分钟 + // 确保没有大小限制 + config.maxContentLength = Infinity; + config.maxBodyLength = Infinity; + // 确保 PUT 方法被正确设置 + config.method = 'PUT'; + // 对于 WebDAV PUT 请求,确保 baseURL 为空,直接使用相对路径走代理 + if (config.url && config.url.startsWith('/webdav/')) { + config.baseURL = ''; + } + } + + // 对于 WebDAV PROPFIND 请求,设置适当的请求头 + // 注意:如果后端包装了 WebDAV 并接受 JSON,保持默认行为 + if (method === 'propfind') { + // 确保方法名正确(axios 会保持原样) + // 确保 Depth 头正确设置(已在 attachmentmanage.js 中设置) + + // 如果有 data,确保有 Content-Type + if (config.data && !config.headers['Content-Type']) { + config.headers['Content-Type'] = 'application/json'; + } + + // 如果没有 data,确保不发送 Content-Type(PROPFIND 通常不需要 body) + if (!config.data) { + // 移除可能被自动添加的 Content-Type + if (config.headers['Content-Type'] === 'application/json') { + delete config.headers['Content-Type']; + } + } + } + + return config; + }, + (error) => Promise.reject(error) +); + +// 响应拦截器 +service.interceptors.response.use( + (response) => { + // 文件下载等 blob 响应:直接返回完整 response,由调用方处理 + if (response.config.responseType === 'blob') { + return response; + } + + // WebDAV 方法列表 + const webdavMethods = ['propfind', 'mkcol', 'delete', 'move', 'put', 'copy', 'lock', 'unlock', 'proppatch']; + const responseMethod = (response.config.method || '').toLowerCase(); + + // 对于 WebDAV PROPFIND 请求,特殊处理 + // 如果返回的是 XML 字符串,直接返回 + // 如果返回的是 JSON(后端包装了),按正常流程处理 + if (responseMethod === 'propfind') { + const data = response.data; + + // 如果是字符串,检查是否是 XML + if (typeof data === 'string') { + const trimmedData = data.trim(); + // 检查是否包含 XML 内容(可能是完整的 XML 或部分 XML) + if (trimmedData.startsWith('<') || trimmedData.includes(' 10000) { + // console.log('PROPFIND 响应: 字符串类型,长度:', trimmedData.length, '预览:', trimmedData.substring(0, 500)) + } + return trimmedData; + } else { + // 字符串但不是 XML,可能是错误信息 + console.warn('PROPFIND 响应是字符串但不是 XML:', trimmedData.substring(0, 200)) + // 仍然返回,让解析函数处理 + return trimmedData; + } + } + + // 如果是对象,检查是否有 code 字段(标准 JSON 响应格式) + if (typeof data === 'object' && data !== null) { + if (data.code !== undefined) { + // 有 code 字段,按标准格式处理 + if (data.code !== 0) { + const errorMsg = data.msg || data.message || "Error"; + const error = new Error(errorMsg); + error.response = response; + error.data = data; + return Promise.reject(error); + } + return data; + } else { + // 没有 code 字段,可能是直接的 WebDAV 响应对象,直接返回 + return data; + } + } + + // 其他情况,记录并返回 + console.warn('PROPFIND 响应类型未知:', typeof data, data) + return data; + } + + // 对于其他 WebDAV 方法(MKCOL、DELETE、MOVE、PUT 等),如果 HTTP 状态码是 2xx,直接返回成功 + // WebDAV 协议中,这些方法的成功由 HTTP 状态码表示(如 201 Created),响应体可能为空或没有 code 字段 + if (webdavMethods.includes(responseMethod)) { + const status = response.status; + // HTTP 2xx 状态码表示成功 + if (status >= 200 && status < 300) { + // 如果响应体为空或没有 code 字段,直接返回成功 + const data = response.data; + if (!data || (typeof data === 'object' && data.code === undefined)) { + return data || {}; + } + // 如果有 code 字段,按标准格式处理 + if (data.code !== undefined) { + if (data.code !== 0) { + const errorMsg = data.msg || data.message || "Error"; + const error = new Error(errorMsg); + error.response = response; + error.data = data; + return Promise.reject(error); + } + return data; + } + return data; + } + } + + // 处理 207 Multi-Status 状态码(WebDAV 批量操作的标准响应) + // 207 表示请求成功,但包含多个状态码,这是正常的,不应视为错误 + const status = response.status; + if (status === 207) { + // 207 Multi-Status 是成功状态码,直接返回响应数据 + return response.data || {}; + } + + const res = response.data; + + if (res.code !== 0) { + const errorMsg = res.msg || res.message || "Error"; + // 不在这里自动显示错误,让组件层面处理 + const error = new Error(errorMsg); + error.response = response; + error.data = res; + return Promise.reject(error); + } else { + return res; + } + }, + (error) => { + // 处理网络错误 + let errorMessage = "网络错误"; + + if ( + error.code === "ECONNABORTED" || + error.message.includes("timeout") + ) { + errorMessage = "请求超时,请检查网络连接或稍后重试"; + } else if (error.response) { + // 服务器返回了错误状态码 + if (error.response.status === 401) { + localStorage.clear(); + // 可以在这里添加跳转到登录页的逻辑 + } + errorMessage = + error.response.data?.msg || + error.response.data?.message || + `服务器错误: ${error.response.status}`; + } else if (error.request) { + // 请求已发出但没有收到响应 + errorMessage = "无法连接到服务器,请检查网络连接"; + } else { + errorMessage = error.message || "未知错误"; + } + + // 不在这里自动显示错误,让组件层面统一处理 + console.error("Network Error:", errorMessage, error); + const errorObj = new Error(errorMessage); + errorObj.response = error.response; + errorObj.data = error.response?.data; + return Promise.reject(errorObj); + } +); + +export default service; diff --git a/web/src/views/Layout.vue b/web/src/views/Layout.vue new file mode 100644 index 0000000..c45e887 --- /dev/null +++ b/web/src/views/Layout.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/web/src/views/Login.vue b/web/src/views/Login.vue new file mode 100644 index 0000000..d98aaa6 --- /dev/null +++ b/web/src/views/Login.vue @@ -0,0 +1,501 @@ + + + + + diff --git a/web/src/views/NoFound.vue b/web/src/views/NoFound.vue new file mode 100644 index 0000000..b01a024 --- /dev/null +++ b/web/src/views/NoFound.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/web/src/views/asset/AccessAlarmRecord.vue b/web/src/views/asset/AccessAlarmRecord.vue new file mode 100644 index 0000000..066d2cb --- /dev/null +++ b/web/src/views/asset/AccessAlarmRecord.vue @@ -0,0 +1,7 @@ + + + diff --git a/web/src/views/asset/AccessControlManage.vue b/web/src/views/asset/AccessControlManage.vue new file mode 100644 index 0000000..696c0d2 --- /dev/null +++ b/web/src/views/asset/AccessControlManage.vue @@ -0,0 +1,4080 @@ + + + + + + + + diff --git a/web/src/views/asset/AssetAlarmRecord.vue b/web/src/views/asset/AssetAlarmRecord.vue new file mode 100644 index 0000000..eb94cd0 --- /dev/null +++ b/web/src/views/asset/AssetAlarmRecord.vue @@ -0,0 +1,86 @@ + + + + diff --git a/web/src/views/asset/AssetInventory.vue b/web/src/views/asset/AssetInventory.vue new file mode 100644 index 0000000..84bbea5 --- /dev/null +++ b/web/src/views/asset/AssetInventory.vue @@ -0,0 +1,2869 @@ + + + + + + diff --git a/web/src/views/asset/AssetList.vue b/web/src/views/asset/AssetList.vue new file mode 100644 index 0000000..0eb0d57 --- /dev/null +++ b/web/src/views/asset/AssetList.vue @@ -0,0 +1,4249 @@ + +