diff --git a/.env b/.env index 13c259a3a..b1b1a381f 100644 --- a/.env +++ b/.env @@ -13,3 +13,4 @@ VITE_CRM_URL = '/crm' VITE_OMNI_WIDGET_URL = '/omni-widget' VITE_FLOW_DIAGRAM_URL = '/flow' VITE_START_PAGE_URL = '/' +VITE_RINGTONES_URL = '/ringtones' diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 6aecd1e78..000000000 --- a/.eslintignore +++ /dev/null @@ -1,3 +0,0 @@ -src/router -src/store -src/assets/js/loginAnimation.js diff --git a/.eslintrc.esm.js b/.eslintrc.esm.js deleted file mode 100644 index 1beb4dc6e..000000000 --- a/.eslintrc.esm.js +++ /dev/null @@ -1,30 +0,0 @@ -module.exports = { - root: true, - env: { - node: true, - es2022: true, - }, - extends: [ - 'plugin:vue/vue3-recommended', - ], - rules: { - 'no-console': 'off', - 'no-debugger': 'off', - 'no-useless-catch': 'off', - 'no-shadow': 'off', - 'no-empty': 'off', - indent: 'off', - 'no-underscore-dangle': 'off', - 'no-useless-escape': 'off', // regexp escapes - // 'import/no-cycle': 'off', - 'linebreak-style': 'off', - }, - overrides: [ - { - files: [ - '**/__tests__/*.{j,t}s?(x)', - '**/tests/unit/**/*.spec.{j,t}s?(x)', - ], - }, - ], -}; diff --git a/.husky/pre-push b/.husky/pre-commit similarity index 71% rename from .husky/pre-push rename to .husky/pre-commit index 8e924e2f5..80aa659b9 100755 --- a/.husky/pre-push +++ b/.husky/pre-commit @@ -2,3 +2,5 @@ . "$(dirname "$0")/_/husky.sh" # npm run test:unit + +npm run lint:pre-commit diff --git a/biome.json b/biome.json new file mode 100644 index 000000000..315b7d1d4 --- /dev/null +++ b/biome.json @@ -0,0 +1,26 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.8.3/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "formatter": { + "enabled": true, + "indentStyle": "space", + "indentWidth": 2, + "lineWidth": 100 + }, + "javascript": { + "formatter": { + "quoteStyle": "single" + } + }, + "vcs": { + "defaultBranch": "main" + } +} diff --git a/package-lock.json b/package-lock.json index 6421a5e05..0b1453f4a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "web-client", - "version": "24.04.0", + "version": "24.04.1", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "web-client", - "version": "24.04.0", + "version": "24.04.1", "dependencies": { "@vue/compat": "^3.2.47", "@vuelidate/core": "^2.0.0", "@vuelidate/validators": "^2.0.0", "@vueuse/core": "^10.3.0", "@webitel/flow-ui-sdk": "^0.1.14", - "@webitel/ui-sdk": "=24.4.38", + "@webitel/ui-sdk": "^24.6.59", "axios": "^1.6.8", "clipboard-copy": "^4.0.1", "cron-validator": "^1.3.1", @@ -34,15 +34,14 @@ "vue-router": "^4.2.5", "vue2-dropzone": "^3.6.0", "vuex": "^4.1.0", - "webitel-sdk": "^24.2.12" + "webitel-sdk": "^24.4.13" }, "devDependencies": { + "@biomejs/biome": "^1.8.3", "@vitejs/plugin-vue": "^4.4.0", "@vitest/coverage-v8": "^0.34.6", "@vue/test-utils": "^2.3.0", "csv-parse": "^5.0.4", - "eslint": "^8.51.0", - "eslint-plugin-vue": "^9.17.0", "happy-dom": "^12.9.1", "sass": "^1.49.7", "vite": "=5.1", @@ -52,15 +51,6 @@ "vue-color": "^2.8.1" } }, - "node_modules/@aashutoshrathi/word-wrap": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", - "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@ampproject/remapping": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", @@ -478,6 +468,161 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "node_modules/@biomejs/biome": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/biome/-/biome-1.8.3.tgz", + "integrity": "sha512-/uUV3MV+vyAczO+vKrPdOW0Iaet7UnJMU4bNMinggGJTAnBPjCoLEYcyYtYHNnUNYlv4xZMH6hVIQCAozq8d5w==", + "dev": true, + "hasInstallScript": true, + "bin": { + "biome": "bin/biome" + }, + "engines": { + "node": ">=14.21.3" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/biome" + }, + "optionalDependencies": { + "@biomejs/cli-darwin-arm64": "1.8.3", + "@biomejs/cli-darwin-x64": "1.8.3", + "@biomejs/cli-linux-arm64": "1.8.3", + "@biomejs/cli-linux-arm64-musl": "1.8.3", + "@biomejs/cli-linux-x64": "1.8.3", + "@biomejs/cli-linux-x64-musl": "1.8.3", + "@biomejs/cli-win32-arm64": "1.8.3", + "@biomejs/cli-win32-x64": "1.8.3" + } + }, + "node_modules/@biomejs/cli-darwin-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-arm64/-/cli-darwin-arm64-1.8.3.tgz", + "integrity": "sha512-9DYOjclFpKrH/m1Oz75SSExR8VKvNSSsLnVIqdnKexj6NwmiMlKk94Wa1kZEdv6MCOHGHgyyoV57Cw8WzL5n3A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-darwin-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-darwin-x64/-/cli-darwin-x64-1.8.3.tgz", + "integrity": "sha512-UeW44L/AtbmOF7KXLCoM+9PSgPo0IDcyEUfIoOXYeANaNXXf9mLUwV1GeF2OWjyic5zj6CnAJ9uzk2LT3v/wAw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64/-/cli-linux-arm64-1.8.3.tgz", + "integrity": "sha512-fed2ji8s+I/m8upWpTJGanqiJ0rnlHOK3DdxsyVLZQ8ClY6qLuPc9uehCREBifRJLl/iJyQpHIRufLDeotsPtw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-arm64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-arm64-musl/-/cli-linux-arm64-musl-1.8.3.tgz", + "integrity": "sha512-9yjUfOFN7wrYsXt/T/gEWfvVxKlnh3yBpnScw98IF+oOeCYb5/b/+K7YNqKROV2i1DlMjg9g/EcN9wvj+NkMuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64/-/cli-linux-x64-1.8.3.tgz", + "integrity": "sha512-I8G2QmuE1teISyT8ie1HXsjFRz9L1m5n83U1O6m30Kw+kPMPSKjag6QGUn+sXT8V+XWIZxFFBoTDEDZW2KPDDw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-linux-x64-musl": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-linux-x64-musl/-/cli-linux-x64-musl-1.8.3.tgz", + "integrity": "sha512-UHrGJX7PrKMKzPGoEsooKC9jXJMa28TUSMjcIlbDnIO4EAavCoVmNQaIuUSH0Ls2mpGMwUIf+aZJv657zfWWjA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-arm64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-arm64/-/cli-win32-arm64-1.8.3.tgz", + "integrity": "sha512-J+Hu9WvrBevfy06eU1Na0lpc7uR9tibm9maHynLIoAjLZpQU3IW+OKHUtyL8p6/3pT2Ju5t5emReeIS2SAxhkQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, + "node_modules/@biomejs/cli-win32-x64": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/@biomejs/cli-win32-x64/-/cli-win32-x64-1.8.3.tgz", + "integrity": "sha512-/PJ59vA1pnQeKahemaQf4Nyj7IKUvGQSc3Ze1uIGi+Wvr1xF7rGobSrAAG01T/gUDG21vkDsZYM03NAmPiVkqg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.21.3" + } + }, "node_modules/@esbuild/aix-ppc64": { "version": "0.19.12", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", @@ -846,62 +991,6 @@ "node": ">=12" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", - "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", - "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.6.0", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", - "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, "node_modules/@floating-ui/core": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz", @@ -959,39 +1048,6 @@ } } }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", - "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "debug": "^4.3.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true - }, "node_modules/@intlify/core-base": { "version": "9.10.1", "resolved": "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.10.1.tgz", @@ -1625,12 +1681,6 @@ "resolved": "https://registry.npmjs.org/@types/webrtc/-/webrtc-0.0.42.tgz", "integrity": "sha512-YyrG3yzw/JvZs0q3f9SY+AiJr0FJw1qhBjvoQJEUy07udiyakAax2A87BHpB3qnaxsm2ExCvhyUvjTxdsn+qSw==" }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true - }, "node_modules/@vitejs/plugin-vue": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.6.2.tgz", @@ -2200,9 +2250,9 @@ } }, "node_modules/@webitel/ui-sdk": { - "version": "24.4.38", - "resolved": "https://registry.npmjs.org/@webitel/ui-sdk/-/ui-sdk-24.4.38.tgz", - "integrity": "sha512-aGWZ/jU6NVxaLKAqwIUGwkM8QGCco/v7Ji8WIugwSpMa9V4MNEPxzhrQmykrRKOvORNAZkSg1zlioBSv8za0SA==", + "version": "24.6.59", + "resolved": "https://registry.npmjs.org/@webitel/ui-sdk/-/ui-sdk-24.6.59.tgz", + "integrity": "sha512-taisUQNZxhUp8/JpzV1PFJhOCfNC0J6BQcxhcS1zjyUlmQcXI7kk7WOzGivSDBs9SnwTXdRNmJkSsiF7okR/sw==", "dependencies": { "@floating-ui/vue": "^1.0.1", "@morev/vue-transitions": "^3.0.2", @@ -2210,26 +2260,28 @@ "@vuelidate/validators": "^2.0.4", "@vuepic/vue-datepicker": "^4.4.0", "@vueuse/components": "^10.7.2", - "axios": "^1.6.8", + "axios": "^1.7.1", "clipboard-copy": "^4.0.1", "csv-stringify": "^5.5.3", "deep-copy": "^1.4.2", "deep-equal": "^2.0.3", "deepmerge": "^4.3.1", - "file-saver": "^2.0.2", + "file-saver-es": "^2.0.5", "is-valid-domain": "^0.1.6", "jszip": "^3.5.0", "jszip-utils": "^0.1.0", "lodash": "^4.17.21", + "mitt": "^3.0.1", + "path-browserify": "^1.0.1", "plyr": "3.6.3", "query-string": "^8.1.0", "sortablejs": "^1.15.0", - "tiny-emitter": "^2.1.0", "vue-i18n": "^9.2.2", "vue-multiselect": "^3.0.0-beta.3", "vue-observe-visibility": "^2.0.0-alpha.1", "vue-router": "^4.1.6", - "webitel-sdk": "^24.2.6" + "webitel-sdk": "^24.2.16", + "xlsx": "^0.18.5" } }, "node_modules/@webitel/ui-sdk/node_modules/decode-uri-component": { @@ -2334,15 +2386,6 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, "node_modules/acorn-walk": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", @@ -2352,20 +2395,12 @@ "node": ">=0.4.0" } }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" } }, "node_modules/ansi-regex": { @@ -2404,12 +2439,6 @@ "node": ">= 8" } }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, "node_modules/arr-diff": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2559,9 +2588,9 @@ } }, "node_modules/axios": { - "version": "1.6.8", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", - "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.0", @@ -2931,15 +2960,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001620", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001620.tgz", @@ -2959,6 +2979,18 @@ } ] }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chai": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", @@ -2977,22 +3009,6 @@ "node": ">=4" } }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/check-error": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", @@ -3148,6 +3164,14 @@ "node": ">=0.8" } }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/collection-visit": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", @@ -3282,6 +3306,17 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/create-ecdh": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", @@ -3481,18 +3516,6 @@ "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==", "dev": true }, - "node_modules/cssesc": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/csso": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz", @@ -3633,12 +3656,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", @@ -3754,18 +3771,6 @@ "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", "dev": true }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -4050,182 +4055,16 @@ "node": ">=6" } }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.57.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", - "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.4", - "@eslint/js": "8.57.0", - "@humanwhocodes/config-array": "^0.11.14", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "@ungap/structured-clone": "^1.2.0", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.2", - "eslint-visitor-keys": "^3.4.3", - "espree": "^9.6.1", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3", - "strip-ansi": "^6.0.1", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-plugin-vue": { - "version": "9.23.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.23.0.tgz", - "integrity": "sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "natural-compare": "^1.4.0", - "nth-check": "^2.1.1", - "postcss-selector-parser": "^6.0.15", - "semver": "^7.6.0", - "vue-eslint-parser": "^9.4.2", - "xml-name-validator": "^4.0.0" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", - "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, - "dependencies": { - "acorn": "^8.9.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" }, "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" + "node": ">=4" } }, "node_modules/estree-walker": { @@ -4233,15 +4072,6 @@ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", @@ -4376,12 +4206,6 @@ "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, "node_modules/fast-equals": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/fast-equals/-/fast-equals-5.0.1.tgz", @@ -4416,18 +4240,6 @@ "node": ">= 6" } }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, "node_modules/fast-safe-stringify": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", @@ -4441,23 +4253,16 @@ "reusify": "^1.0.4" } }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, "node_modules/file-saver": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/file-saver/-/file-saver-2.0.5.tgz", "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" }, + "node_modules/file-saver-es": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/file-saver-es/-/file-saver-es-2.0.5.tgz", + "integrity": "sha512-Kg0lt+is9nOyi/VDms9miScNGot25jVFbjFccXuCL/shd2Q+rt70MALxHVkXllsX83JEBLiHQNjDPGd/6FIOoQ==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -4493,26 +4298,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", - "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.3", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true - }, "node_modules/follow-redirects": { "version": "1.15.6", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", @@ -4592,6 +4377,14 @@ "url": "https://ko-fi.com/tunnckoCore/commissions" } }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/fragment-cache": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", @@ -4756,18 +4549,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, "node_modules/glob/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -4792,21 +4573,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globby": { "version": "14.0.1", "resolved": "https://registry.npmjs.org/globby/-/globby-14.0.1.tgz", @@ -4848,12 +4614,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, "node_modules/graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -5222,31 +4982,6 @@ "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", "dev": true }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -5529,15 +5264,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-plain-obj": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", @@ -5853,18 +5579,6 @@ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -5876,12 +5590,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true - }, "node_modules/json-refs": { "version": "3.0.13", "resolved": "https://registry.npmjs.org/json-refs/-/json-refs-3.0.13.tgz", @@ -5928,18 +5636,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, "node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", @@ -5985,15 +5681,6 @@ "resolved": "https://registry.npmjs.org/jszip-utils/-/jszip-utils-0.1.0.tgz", "integrity": "sha512-tBNe0o3HAf8vo0BrOYnLPnXNo5A3KsRMnkBFYjh20Y3GPYGfgyoclEMgvVchx0nnL+mherPi74yLPIusHUQpZg==" }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.1" - } - }, "node_modules/kind-of": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", @@ -6008,19 +5695,6 @@ "resolved": "https://registry.npmjs.org/knitwork/-/knitwork-1.1.0.tgz", "integrity": "sha512-oHnmiBUVHz1V+URE77PNot2lv3QiYU2zQf1JjOVkMt3YDKGbu8NAFr+c4mcNOhdsGrB/VpVbRwPwhiXrPhxQbw==" }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/lie": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", @@ -6080,12 +5754,6 @@ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "node_modules/lodash.throttle": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", @@ -6350,6 +6018,11 @@ "node": ">=8" } }, + "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==" + }, "node_modules/mixin-deep": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", @@ -6515,12 +6188,6 @@ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", "integrity": "sha512-zkVhZUA3y8mbz652WrL5x0fB0ehrBkulWT3TomAQ9iDtyXZvzKeEA6GPxAItBYeNYl5yngKRX612qHOhvMkDeg==" }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, "node_modules/node-fetch-native": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", @@ -6857,23 +6524,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optionator": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", - "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, - "dependencies": { - "@aashutoshrathi/word-wrap": "^1.2.3", - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/os-browserify": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", @@ -6915,18 +6565,6 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/parse-asn1": { "version": "5.1.7", "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.7.tgz", @@ -6985,8 +6623,7 @@ "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==" }, "node_modules/path-exists": { "version": "4.0.0", @@ -7194,19 +6831,6 @@ "postcss": ">4 <9" } }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", - "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", - "dev": true, - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/posthtml": { "version": "0.9.2", "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", @@ -7269,15 +6893,6 @@ "posthtml-render": "^1.0.6" } }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/prettier": { "version": "2.8.8", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", @@ -7597,15 +7212,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -7631,41 +7237,6 @@ "node": ">=0.10.0" } }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/rimraf/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/ripemd160": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", @@ -8139,6 +7710,17 @@ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stackback": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", @@ -8366,18 +7948,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/strip-literal": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", @@ -8804,12 +8374,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, "node_modules/timers-browserify": { "version": "2.0.12", "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", @@ -8822,11 +8386,6 @@ "node": ">=0.6.0" } }, - "node_modules/tiny-emitter": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", - "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" - }, "node_modules/tinybench": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.6.0.tgz", @@ -8986,18 +8545,6 @@ "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw==", "dev": true }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", @@ -9007,18 +8554,6 @@ "node": ">=4" } }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/typescript": { "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", @@ -9566,30 +9101,6 @@ "integrity": "sha512-qdGXCtoBrwqk1BT6r2+1Wcvl583ZVkuSZ3or7Y1O2w5AvWtlvvxwjGhmz5DdPJS9xqRdDlgTJ/38ehWnEi0tFA==", "dev": true }, - "node_modules/vue-eslint-parser": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.2.tgz", - "integrity": "sha512-Ry9oiGmCAK91HrKMtCrKFWmSFWvYkpGglCeFAIqDdr9zdXmMMpJOmUJS7WWsW7fX81h6mwHmUZCQQ1E0PkSwYQ==", - "dev": true, - "dependencies": { - "debug": "^4.3.4", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.3.1", - "esquery": "^1.4.0", - "lodash": "^4.17.21", - "semver": "^7.3.6" - }, - "engines": { - "node": "^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - }, - "peerDependencies": { - "eslint": ">=6.0.0" - } - }, "node_modules/vue-i18n": { "version": "9.10.1", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.10.1.tgz", @@ -9669,9 +9180,9 @@ } }, "node_modules/webitel-sdk": { - "version": "24.2.12", - "resolved": "https://registry.npmjs.org/webitel-sdk/-/webitel-sdk-24.2.12.tgz", - "integrity": "sha512-5O0klvepANTe9upNrEgXoKsbCVO2jYEhMFUrieY+mh/sgcs4k4tIW/vwgOalFDRIHtlDeiHUZkhZTokpIJ7jTQ==", + "version": "24.4.13", + "resolved": "https://registry.npmjs.org/webitel-sdk/-/webitel-sdk-24.4.13.tgz", + "integrity": "sha512-8jMs/gjf3gBvHIkVU4k0/iwUz66T1NFfS0GGG37COPwTSqtYd3Cei8zKcm2HiYFpFZ2fVjKZYfW6BBuEUevJdg==", "dependencies": { "@types/webrtc": "~0.0.41", "deep-copy": "1.4.2", @@ -9681,7 +9192,7 @@ "query-string": "7.0.0" }, "peerDependencies": { - "axios": "^1.6.5", + "axios": "^1.6.8", "ee-ts": "1.0.1" } }, @@ -9816,6 +9327,22 @@ "node": ">=8" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -9915,13 +9442,24 @@ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, - "node_modules/xml-name-validator": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", - "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", - "dev": true, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, "engines": { - "node": ">=12" + "node": ">=0.8" } }, "node_modules/xtend": { diff --git a/package.json b/package.json index 01b36d30d..7c57fbb45 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,16 @@ { "name": "web-client", - "version": "24.04.1", + "version": "24.04-1.0", "private": true, "scripts": { "dev": "vite", "build": "vite build", "test:unit": "vitest", "preview": "vite preview", - "lint:fix": "eslint --fix --ext .js,.vue src" + "lint-all": "npx @biomejs/biome check --write ./src", + "lint-all:unsafe": "npx @biomejs/biome check --write --unsafe ./src", + "lint-changed:unsafe": "npx @biomejs/biome check --write --unsafe --changed", + "lint:pre-commit": "npx @biomejs/biome check --write --unsafe --changed --no-errors-on-unmatched" }, "type": "module", "dependencies": { @@ -16,7 +19,7 @@ "@vuelidate/validators": "^2.0.0", "@vueuse/core": "^10.3.0", "@webitel/flow-ui-sdk": "^0.1.14", - "@webitel/ui-sdk": "=24.4.38", + "@webitel/ui-sdk": "^24.6.59", "axios": "^1.6.8", "clipboard-copy": "^4.0.1", "cron-validator": "^1.3.1", @@ -37,15 +40,14 @@ "vue-router": "^4.2.5", "vue2-dropzone": "^3.6.0", "vuex": "^4.1.0", - "webitel-sdk": "^24.2.12" + "webitel-sdk": "^24.4.13" }, "devDependencies": { + "@biomejs/biome": "^1.8.3", "@vitejs/plugin-vue": "^4.4.0", "@vitest/coverage-v8": "^0.34.6", "@vue/test-utils": "^2.3.0", "csv-parse": "^5.0.4", - "eslint": "^8.51.0", - "eslint-plugin-vue": "^9.17.0", "happy-dom": "^12.9.1", "sass": "^1.49.7", "vite": "=5.1", diff --git a/src/app/api/PermissionsAPIService/APIPermissionsGetter.js b/src/app/api/PermissionsAPIService/APIPermissionsGetter.js index 17665c6f5..80e367c1b 100644 --- a/src/app/api/PermissionsAPIService/APIPermissionsGetter.js +++ b/src/app/api/PermissionsAPIService/APIPermissionsGetter.js @@ -1,11 +1,15 @@ -import instance from '../instance'; +import { getDefaultGetListResponse, getDefaultGetParams } from '@webitel/ui-sdk/src/api/defaults'; import applyTransform, { - camelToSnake, generateUrl, - merge, mergeEach, notify, - sanitize, snakeToCamel, - starToSearch + camelToSnake, + generateUrl, + merge, + mergeEach, + notify, + sanitize, + snakeToCamel, + starToSearch, } from '@webitel/ui-sdk/src/api/transformers'; -import { getDefaultGetListResponse, getDefaultGetParams } from '@webitel/ui-sdk/src/api/defaults'; +import instance from '../instance'; export default class APIPermissionsGetter { nestedUrl = 'acl'; @@ -23,7 +27,10 @@ export default class APIPermissionsGetter { const url = applyTransform(params, [ merge(getDefaultGetParams()), starToSearch('search'), - (params) => ({ ...params, q: params.search }), + (params) => ({ + ...params, + q: params.search, + }), sanitize(fieldsToSend), camelToSnake(), generateUrl(`${this.baseUrl}/${parentId}/${this.nestedUrl}`), @@ -42,9 +49,7 @@ export default class APIPermissionsGetter { next, }; } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; } @@ -54,19 +59,19 @@ export default class APIPermissionsGetter { ...item, access: { x: { - id: ((item.granted.match(/x/g) || []).length + 1), + id: (item.granted.match(/x/g) || []).length + 1, rule: 'x'.repeat((item.granted.match(/x/g) || []).length), }, r: { - id: ((item.granted.match(/r/g) || []).length + 1), + id: (item.granted.match(/r/g) || []).length + 1, rule: 'r'.repeat((item.granted.match(/r/g) || []).length), }, w: { - id: ((item.granted.match(/w/g) || []).length + 1), + id: (item.granted.match(/w/g) || []).length + 1, rule: 'w'.repeat((item.granted.match(/w/g) || []).length), }, d: { - id: ((item.granted.match(/d/g) || []).length + 1), + id: (item.granted.match(/d/g) || []).length + 1, rule: 'd'.repeat((item.granted.match(/d/g) || []).length), }, }, diff --git a/src/app/api/PermissionsAPIService/APIPermissionsPatcher.js b/src/app/api/PermissionsAPIService/APIPermissionsPatcher.js index c1100eff7..fc1589038 100644 --- a/src/app/api/PermissionsAPIService/APIPermissionsPatcher.js +++ b/src/app/api/PermissionsAPIService/APIPermissionsPatcher.js @@ -1,28 +1,22 @@ -import instance from '../instance'; import applyTransform, { camelToSnake, notify, snakeToCamel, } from '@webitel/ui-sdk/src/api/transformers'; +import instance from '../instance'; export default class APIPermissionsPatcher { constructor(baseUrl) { this.baseUrl = baseUrl; this.patcher = async ({ changes, id }) => { const afterUrl = 'acl'; - const body = applyTransform(changes, [ - camelToSnake(), - ]); + const body = applyTransform(changes, [camelToSnake()]); const url = `${baseUrl}/${id}/${afterUrl}`; try { const response = await instance.patch(url, body); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; } diff --git a/src/app/api/instance.js b/src/app/api/instance.js index 2bd6f16d5..2db5e05fe 100644 --- a/src/app/api/instance.js +++ b/src/app/api/instance.js @@ -1,12 +1,11 @@ import generateInstance from '@webitel/ui-sdk/src/api/axios/generateInstance'; -import updateTokenInterceptor - from '@webitel/ui-sdk/src/api/interceptors/request/updateToken.interceptor'; -import handleUnauthorizedInterceptor - from '@webitel/ui-sdk/src/api/interceptors/response/handleUnauthorized.interceptor'; +import updateTokenInterceptor from '@webitel/ui-sdk/src/api/interceptors/request/updateToken.interceptor'; +import handleUnauthorizedInterceptor from '@webitel/ui-sdk/src/api/interceptors/response/handleUnauthorized.interceptor'; export default generateInstance({ interceptors: { request: [updateTokenInterceptor], response: [handleUnauthorizedInterceptor], }, + baseURL: import.meta.env.VITE_API_URL, }); diff --git a/src/app/components/actions/delete-all-action.vue b/src/app/components/actions/delete-all-action.vue index c5f79f856..fedc2791d 100644 --- a/src/app/components/actions/delete-all-action.vue +++ b/src/app/components/actions/delete-all-action.vue @@ -25,7 +25,9 @@ export default { computed: { actionPanelDeleteTooltip() { return this.selectedCount - ? this.$t('iconHints.deleteSelected', { count: this.selectedCount }) + ? this.$t('iconHints.deleteSelected', { + count: this.selectedCount, + }) : this.$t('iconHints.deleteAll'); }, }, diff --git a/src/app/components/actions/index.js b/src/app/components/actions/index.js index 9e736361b..6f6968b77 100644 --- a/src/app/components/actions/index.js +++ b/src/app/components/actions/index.js @@ -1,7 +1,5 @@ import DeleteAllAction from './delete-all-action.vue'; -const actions = [ - DeleteAllAction, -]; +const actions = [DeleteAllAction]; export default actions; diff --git a/src/app/components/app.vue b/src/app/components/app.vue index e040acbf1..1c6c280f2 100755 --- a/src/app/components/app.vue +++ b/src/app/components/app.vue @@ -4,7 +4,6 @@ + + diff --git a/src/app/composables/useCheckingUnsavedChanges.js b/src/app/composables/useCheckingUnsavedChanges.js index a04f93934..85629fc49 100644 --- a/src/app/composables/useCheckingUnsavedChanges.js +++ b/src/app/composables/useCheckingUnsavedChanges.js @@ -1,7 +1,6 @@ -import { ref, computed } from 'vue'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import { computed, ref } from 'vue'; import { useStore } from 'vuex'; -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; export const useCheckingUnsavedChanges = (itemInstance) => { const isConfirmationUnsavedChangesPopup = ref(false); @@ -31,5 +30,5 @@ export const useCheckingUnsavedChanges = (itemInstance) => { addCheckingUnsavedChanges, removeCheckingUnsavedChanges, toggleIsConfirmationUnsavedChangesPopup, - } -} + }; +}; diff --git a/src/app/composables/useDummy.js b/src/app/composables/useDummy.js index 3001e4479..cdd4f22a4 100644 --- a/src/app/composables/useDummy.js +++ b/src/app/composables/useDummy.js @@ -1,23 +1,20 @@ import IsEmpty from '@webitel/ui-sdk/src/scripts/isEmpty'; -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { computed, ref, watch } from 'vue'; import { useRoute } from 'vue-router'; import { useStore } from 'vuex'; -import defaultDummyPicAfterSearchLight - from '../assets/dummy/adm-dummy-after-search-light.svg'; -import defaultDummyPicAfterSearchDark - from '../assets/dummy/adm-dummy-after-search-dark.svg'; +import defaultDummyPicAfterSearchDark from '../assets/dummy/adm-dummy-after-search-dark.svg'; +import defaultDummyPicAfterSearchLight from '../assets/dummy/adm-dummy-after-search-light.svg'; export function useDummy({ - namespace, - showAction, - hiddenText, - dummyPic, - dummyText, - dummyPicAfterSearch, - dummyTextAfterSearch = 'objects.emptyResultSearch', - }) { + namespace, + showAction, + hiddenText, + dummyPic, + dummyText, + dummyPicAfterSearch, + dummyTextAfterSearch = 'objects.emptyResultSearch', +}) { const store = useStore(); const route = useRoute(); @@ -28,25 +25,34 @@ export function useDummy({ const darkMode = computed(() => store.getters['appearance/DARK_MODE']); const dummyImgAfterSearch = computed(() => { - if(dummyPicAfterSearch) return dummyPicAfterSearch; + if (dummyPicAfterSearch) return dummyPicAfterSearch; return darkMode.value ? defaultDummyPicAfterSearchDark : defaultDummyPicAfterSearchLight; - }) + }); - watch(() => dataList, () => { - if (!dataList.value.length) { - if (IsEmpty(route?.query) ? search.value : Object.values(route.query) - .some((query) => query.length)) { - return dummy.value = { - src: dummyImgAfterSearch, - text: dummyTextAfterSearch, - }; - } else return dummy.value = { - src: dummyPic, - text: dummyText, - showAction, - hiddenText, - }; - } else return dummy.value = ''; - }, { deep: true }); + watch( + () => dataList, + () => { + if (!dataList.value.length) { + if ( + IsEmpty(route?.query) + ? search.value + : Object.values(route.query).some((query) => query.length) + ) { + return (dummy.value = { + src: dummyImgAfterSearch, + text: dummyTextAfterSearch, + }); + } + return (dummy.value = { + src: dummyPic, + text: dummyText, + showAction, + hiddenText, + }); + } + return (dummy.value = ''); + }, + { deep: true }, + ); return { dummy }; } diff --git a/src/app/locale/en/en.js b/src/app/locale/en/en.js index 07e03d681..c8aa1d457 100644 --- a/src/app/locale/en/en.js +++ b/src/app/locale/en/en.js @@ -18,22 +18,28 @@ export default { loginSubmit: 'Log in', carousel: { title1: 'Cloud vs. On-Site', - text1: 'Security policy does not allow to store data and use cloud services? With Webitel, you can build a contact center on your site!', + text1: + 'Security policy does not allow to store data and use cloud services? With Webitel, you can build a contact center on your site!', title2: 'Multichannel VS Omni-Channel', - text2: 'Be always and everywhere in touch with your customers! IVR-menu of any complexity, outbound, inbound interaction campaigns or message on social networks - now it\'s easier than ever!', + text2: + "Be always and everywhere in touch with your customers! IVR-menu of any complexity, outbound, inbound interaction campaigns or message on social networks - now it's easier than ever!", title3: 'Fault-tolerant infrastructure', - text3: 'No more unplanned downtime. Fast scaling and fault-tolerant architecture allows you to simultaneously serve more than 1000 customer calls per minute from different communication channels.', + text3: + 'No more unplanned downtime. Fast scaling and fault-tolerant architecture allows you to simultaneously serve more than 1000 customer calls per minute from different communication channels.', title4: 'Design', - text4: 'The new minimalistic interface with the most user-friendly admin panel that allows you to have quick access to all the necessary functions. Less clicks - more features.', + text4: + 'The new minimalistic interface with the most user-friendly admin panel that allows you to have quick access to all the necessary functions. Less clicks - more features.', title5: 'New agent group work module', - text5: 'The most efficient call distribution. An agent can have several skills at once for participating in different campaigns. The client is served only by professionals.', + text5: + 'The most efficient call distribution. An agent can have several skills at once for participating in different campaigns. The client is served only by professionals.', title6: 'Setting Permissions', - text6: 'New permissions management module - new opportunities for control. Users can make changes only to sections, as well as to actions.', + text6: + 'New permissions management module - new opportunities for control. Users can make changes only to sections, as well as to actions.', }, }, @@ -59,6 +65,12 @@ export default { webPhone: 'WebPhone', useWebPhone: 'Use WebPhone', useStun: 'Use STUN', + ringtones: { + title: 'Change ringtone', + ringtone: 'Ringtone', + customRingtone: 'Use the custom ringtone', + }, + callEnd: 'Call end tune infroming', }, validation: { @@ -162,7 +174,8 @@ export default { deleteConfirmation: { title: 'Confirm deletion', - askingAlert: 'Are you sure you want to delete {count} item? | Are you sure you want to delete {count} items?', + askingAlert: + 'Are you sure you want to delete {count} item? | Are you sure you want to delete {count} items?', undoneActionAlert: 'This action cannot be undone.', deleteAll: 'ALL', }, @@ -178,7 +191,8 @@ export default { objectHeader: {}, directory: { directory: 'Directory', - passwordInfo: 'Enter value only if you want to edit it (or create a new one). The empty field will leave the value unchanged', + passwordInfo: + 'Enter value only if you want to edit it (or create a new one). The empty field will leave the value unchanged', users: { users: 'User | Users', allUsers: 'All users', @@ -195,21 +209,23 @@ export default { license: 'License', devices: 'Devices', defaultDevice: 'Default device (from list of selected devices)', - deviceNotFound: 'Didn\'t find the device?', + deviceNotFound: "Didn't find the device?", createNewDevice: 'Add new', variables: 'Variables', varKey: 'Key', varVal: 'Value', token: 'Token | Tokens', tokenPopupHeader: 'Your token key has been created successfully!', - tokenPopupText: 'Download your key file now or copy it. If you do not download the key file now, you will not be able to retrieve your token key again. To help protect your security, store your token key securely and do not share it.', + tokenPopupText: + 'Download your key file now or copy it. If you do not download the key file now, you will not be able to retrieve your token key again. To help protect your security, store your token key securely and do not share it.', tokenPopupCopy: 'Copy to clipboard', tokenPopupSave: 'Save as TXT', userIp: 'User IP', userId: 'User ID', download: 'Download', regenerate: 'Regenerate', - askingAlert: 'Are you sure you want to regenerate the code? The user won’t be able to log in', + askingAlert: + 'Are you sure you want to regenerate the code? The user won’t be able to log in', }, license: { customers: 'Customers', @@ -228,9 +244,9 @@ export default { searchPlaceholder: 'Serial, product', domain: 'Domain', daysToExpire: { - '0': 'Expired', - '30': '30 or less', - '90': '90 or less', + 0: 'Expired', + 30: '30 or less', + 90: '90 or less', days: ' days', }, importLicense: 'Import license', @@ -248,7 +264,8 @@ export default { hotdeskDevice: 'Hot desking device', hotdeskDeviceSettings: 'Hot desking device settings', hotdeskIncorrectInput: 'Incorrect Host Name', - hotdeskInputHint: 'To make it easier to identify this device, you should cover it with friendly hot-desk aliases. Valid name must contain following characters: A-Z, a-z, 0-9, -, _', + hotdeskInputHint: + 'To make it easier to identify this device, you should cover it with friendly hot-desk aliases. Valid name must contain following characters: A-Z, a-z, 0-9, -, _', deviceSettings: 'Device settings', hostName: 'Host Name', phoneInfo: 'Phone info', @@ -268,7 +285,7 @@ export default { dialog: 'Dialog', onhold: 'On hold', }, - passwordSetFromAccount: 'If you won\'t set password, it would be the same as account', + passwordSetFromAccount: "If you won't set password, it would be the same as account", }, }, permissions: { @@ -302,9 +319,11 @@ export default { manageUserRolesDescription: 'Grants permission to manage a set of user roles', manageUserLicenseDescription: 'Grants permission to manage a set of user license', changeUserPasswordDescription: 'Grants permission to change the users password', - systemSettingDescription: 'Grants permission to access and manage the Configuration section', + systemSettingDescription: + 'Grants permission to access and manage the Configuration section', schemeVariables: 'Manage global variables', - schemeVariablesDescription: 'Grants permission to access and manage the Global variables section', + schemeVariablesDescription: + 'Grants permission to access and manage the Global variables section', }, addPermission: 'Add role permission', usage: 'Usage', @@ -327,9 +346,9 @@ export default { create: 'Create', delete: 'Delete', accessMode: { - '1': 'Forbidden', - '2': 'Allow', - '3': 'Allow with delegation', + 1: 'Forbidden', + 2: 'Allow', + 3: 'Allow with delegation', }, }, }, @@ -509,12 +528,11 @@ export default { SIPregistrationsDescription: 'SIP registration description', SIPtrunking: 'SIP Trunking', SIPtrunkingDescription: 'SIP trunking description', - }, chatGateways: { templates: { templates: 'Templates', - title: 'Workspace member\'s name', + title: "Workspace member's name", close: 'Chat complete message', join: 'Agent joining message', left: 'Agent disconnection message', @@ -526,7 +544,7 @@ export default { }, telegramApp: { telegramApp: 'Telegram App', - signedAs: 'You\'re signed as', + signedAs: "You're signed as", joinTelegram: 'Sign in to Telegram', metadata: { apiId: 'API id', @@ -572,7 +590,8 @@ export default { webchat: { webchat: 'Web chat', copyCode: 'Copy code for site', - copyCodeHint: 'You must regenerate and reinsert Widget code to website each time after Widget settings modification', + copyCodeHint: + 'You must regenerate and reinsert Widget code to website each time after Widget settings modification', metadata: { mediaMaxSize: 'Max media size (Mb)', }, @@ -583,7 +602,7 @@ export default { position: 'Position', btnColor: 'Button Color', logoUrl: 'Logo URL', - logoHint: 'Supported logo format is \'JPEG\' or \'PNG\', 24x24px', + logoHint: "Supported logo format is 'JPEG' or 'PNG', 24x24px", rounded: 'Rounded', square: 'Square', right: 'Right', @@ -720,12 +739,20 @@ export default { hooks: { eventTypes: { agentStatus: 'Agent status changed', - } + }, }, flows: { addFlowSchema: 'Add flow schema', editFlowSchema: 'Edit flow schema', }, + supervisors: { + addSupervisor: 'Add supervisor', + editSupervisor: 'Edit supervisor', + }, + agents: { + addAgent: 'Add agent', + editAgent: 'Edit agent', + }, }, members: { @@ -770,20 +797,25 @@ export default { tags: 'Tags', newQueue: 'New queue', blacklist: 'Stop list', - newQueueDescription: 'New queue descriotion', + newQueueDescription: 'New queue description', outboundIVRQueue: 'Outbound IVR queue', outboundIVR: 'Outbound IVR', - outboundIVRQueueDescription: 'An Outbound IVR allows an organization to automatically engage customers through multiple channels such as automated voice calls, SMS messages, email or social media posts using personalized notifications.', + outboundIVRQueueDescription: + 'An Outbound IVR allows an organization to automatically engage customers through multiple channels such as automated voice calls, SMS messages, email or social media posts using personalized notifications.', inboundQueue: 'Inbound queue', - inboundQueueDescription: 'An Inbound queue is that it\'s where callers are placed on hold, in a queue, while they wait to speak with a live agent.', + inboundQueueDescription: + "An Inbound queue is that it's where callers are placed on hold, in a queue, while they wait to speak with a live agent.", offlineQueue: 'Offline queue', - offlineQueueDescription: 'An Offline queue gives callers the option to stop waiting on hold, input their phone number and receive a callback as soon as it\'s their turn.', + offlineQueueDescription: + "An Offline queue gives callers the option to stop waiting on hold, input their phone number and receive a callback as soon as it's their turn.", previewDialer: 'Preview dialer', previewDialerDescription: 'Preview the contact before auto dialing them.', progressiveDialer: 'Progressive dialer', - progressiveDialerDescription: 'Progressive dialing minimizes wasted time between calls by automatically dialing a number from a call list as soon as an agent becomes available.', + progressiveDialerDescription: + 'Progressive dialing minimizes wasted time between calls by automatically dialing a number from a call list as soon as an agent becomes available.', predictiveDialer: 'Predictive dialer', - predictiveDialerDescription: 'A predictive dialer calls multiple numbers at one time. As soon as a customer answers, an agent is connected to them.', + predictiveDialerDescription: + 'A predictive dialer calls multiple numbers at one time. As soon as a customer answers, an agent is connected to them.', chatInboundQueue: 'Chat inbound queue', chatInboundQueueDescription: 'The same as inbound queue, but with chats', inboundJobQueue: 'Inbound task queue', @@ -846,7 +878,7 @@ export default { preSchema: 'Pre-executive schema', afterSchema: 'After-executive schema', maxCalls: 'Max tasks', - maxCallsHint: 'If value is 0, dialer won\'t call', + maxCallsHint: "If value is 0, dialer won't call", recordings: 'Recording', recordAll: 'Start record after answer', perNumbers: 'Dialing Attempts per each phone number', @@ -863,6 +895,8 @@ export default { communications: 'Communication type', manualDistribution: 'Manual distribution', lastMessageTimeout: 'Timeout from the last message', + stickyIgnoreStatus: 'Ignore agent status', + ignoreCalendar: 'Ignore calendar', processing: { processing: 'Processing', enabled: 'Waiting for call result', @@ -910,6 +944,14 @@ export default { active: 'Active', }, }, + skills: { + editSkill: 'Edit skill', + addSkill: 'Add skill', + }, + buckets: { + addBucket: 'Add bucket', + editBucket: 'Edit bucket', + }, }, res: { @@ -1015,7 +1057,8 @@ export default { source: 'Import destination', settings: 'Settings', mappings: 'Field mappings', - mappingsHint: 'In this section you should provide names of CSV file columns in inputs below in accordance with its labels', + mappingsHint: + 'In this section you should provide names of CSV file columns in inputs below in accordance with its labels', columnHeader: '{name} column', members: { clearMembers: 'Purge existing members', @@ -1026,7 +1069,8 @@ export default { tokens: 'Token | Tokens', allTokens: 'All tokens', expires: 'Expires on', - popupMessage: 'Download your key file now or copy it. If you do not download the key file now, you will not be able to retrieve your token key again. To help protect your security, store your token key securely and do not share it.', + popupMessage: + 'Download your key file now or copy it. If you do not download the key file now, you will not be able to retrieve your token key again. To help protect your security, store your token key securely and do not share it.', tokenCreated: 'Your token has been successfully created!', }, @@ -1036,7 +1080,8 @@ export default { type: 'Type', schema: 'Schema', newTrigger: 'New trigger', - newTriggerDescription: 'Choose a template to get going or start from scratch with a blank canvas', + newTriggerDescription: + 'Choose a template to get going or start from scratch with a blank canvas', onEvent: 'On event', onEventDescription: 'An event-based JSON Schema scheduler', cron: 'At time', @@ -1083,7 +1128,6 @@ export default { monthly: 'Monthly', }, }, - }, configuration: { configuration: 'Configuration | Configurations', @@ -1123,8 +1167,8 @@ export default { text: 'Sorry, you have not enough privileges to see this page.', }, page404: { - title: 'Looks like you\'re lost', - text: 'Sorry, we can\'t find the page you want.', + title: "Looks like you're lost", + text: "Sorry, we can't find the page you want.", }, }, diff --git a/src/app/locale/i18n.js b/src/app/locale/i18n.js index 3c1c6d606..23132273e 100644 --- a/src/app/locale/i18n.js +++ b/src/app/locale/i18n.js @@ -1,8 +1,8 @@ import { createI18n } from 'vue-i18n'; import en from './en/en'; +import kz from './kz/kz'; import ru from './ru/ru'; import ua from './ua/ua'; -import kz from './kz/kz'; const messages = { en, diff --git a/src/app/locale/kz/kz.js b/src/app/locale/kz/kz.js index 53aa32d2f..4e6d9c0d5 100644 --- a/src/app/locale/kz/kz.js +++ b/src/app/locale/kz/kz.js @@ -16,22 +16,28 @@ export default { loginSubmit: 'Кіру', carousel: { title1: 'Бұлт және Он-сайтқа', - text1: 'Қауіпсіздік саясатыңыз деректерді сақтауға және бұлттық қызметтерді пайдалануға мүмкіндік бермейді ме? Webitel көмегімен сіз өз сайтыңызда байланыс орталығын құра аласыз!', + text1: + 'Қауіпсіздік саясатыңыз деректерді сақтауға және бұлттық қызметтерді пайдалануға мүмкіндік бермейді ме? Webitel көмегімен сіз өз сайтыңызда байланыс орталығын құра аласыз!', title2: 'Көп арналы және ортақ арналы', - text2: 'Клиенттермен әрқашан, кез келген жерде байланыста болыңыз! Кез келген күрделі IVR мәзірі, кіріс, шығыс қарым-қатынас науқандары немесе әлеуметтік желілерге хабарламалар - енді тіпті оңай!', + text2: + 'Клиенттермен әрқашан, кез келген жерде байланыста болыңыз! Кез келген күрделі IVR мәзірі, кіріс, шығыс қарым-қатынас науқандары немесе әлеуметтік желілерге хабарламалар - енді тіпті оңай!', title3: 'Орнықты жұмыс істейтін инфрақұрылым', - text3: 'Енді ешқандай тұрып қалу болмайды және деректер жоғалмайды. Жылдам ауқымдау және орнықты жұмыс істейтін архитектура әр түрлі байланыс арналарынан минутына клиенттердің 1000-нан астам өтінішіне бір уақытта қызмет көрсетуге мүмкіндік береді.', + text3: + 'Енді ешқандай тұрып қалу болмайды және деректер жоғалмайды. Жылдам ауқымдау және орнықты жұмыс істейтін архитектура әр түрлі байланыс арналарынан минутына клиенттердің 1000-нан астам өтінішіне бір уақытта қызмет көрсетуге мүмкіндік береді.', title4: 'Дизайн', - text4: 'Барлық қажетті функцияларға жылдам қол жеткізуге мүмкіндік беретін ең ыңғайлы басқару панелі бар жаңа минималистік интерфейс. Аз клик - көп мүмкіндіктер.', + text4: + 'Барлық қажетті функцияларға жылдам қол жеткізуге мүмкіндік беретін ең ыңғайлы басқару панелі бар жаңа минималистік интерфейс. Аз клик - көп мүмкіндіктер.', title5: 'Оператор топтарымен жұмыстың жаңа модулі', - text5: 'Қоңырауларды барынша тиімді тарату. Оператордың әртүрлі науқандарға қатысу үшін бірнеше дағдылары болуы мүмкін. Клиентке тек кәсіби мамандар қызмет көрсетеді.', + text5: + 'Қоңырауларды барынша тиімді тарату. Оператордың әртүрлі науқандарға қатысу үшін бірнеше дағдылары болуы мүмкін. Клиентке тек кәсіби мамандар қызмет көрсетеді.', title6: 'Қол жеткізу құқықтарын күйге келтіру', - text6: 'Құқықтарды басқарудың жаңа модулі – бақылаудың жаңа мүмкіндіктері. Сіз енгізілген өзгерістерді қадағалай отырып, тек бөлімдерге ғана емес, пайдаланушылардың әрекеттеріне де құқық бере аласыз.', + text6: + 'Құқықтарды басқарудың жаңа модулі – бақылаудың жаңа мүмкіндіктері. Сіз енгізілген өзгерістерді қадағалай отырып, тек бөлімдерге ғана емес, пайдаланушылардың әрекеттеріне де құқық бере аласыз.', }, }, header: { @@ -131,7 +137,8 @@ export default { emptyResultSearch: 'Іздеу еш нәтиже бермеді', deleteConfirmation: { title: 'Жоюды растаңыз', - askingAlert: '{count} жазбасын жойғыңыз келетініне сенімдісіз бе? | {count} жазбасын жойғыңыз келетініне сенімдісіз бе?', + askingAlert: + '{count} жазбасын жойғыңыз келетініне сенімдісіз бе? | {count} жазбасын жойғыңыз келетініне сенімдісіз бе?', undoneActionAlert: 'Бұл әрекетті қайтару мүмкін емес.', deleteAll: 'БАРЛЫҒЫ', }, @@ -167,7 +174,8 @@ export default { varVal: 'Мәні', token: 'Токен | Токендер', tokenPopupHeader: 'Сіздің токен-кілтіңіз сәтті жасалды!', - tokenPopupText: 'Файлды қазір кілтпен жүктеп алыңыз немесе оны кейінірек пайдалану үшін көшіріңіз. Егер файл кілтін қазір жүктемесеңіз,токен-кілтіңізді қайтадан ала алмайсыз. Сіздің қауіпсіздігіңіз үшін токен-кілтіңізді ешкімге бермеңіз.', + tokenPopupText: + 'Файлды қазір кілтпен жүктеп алыңыз немесе оны кейінірек пайдалану үшін көшіріңіз. Егер файл кілтін қазір жүктемесеңіз,токен-кілтіңізді қайтадан ала алмайсыз. Сіздің қауіпсіздігіңіз үшін токен-кілтіңізді ешкімге бермеңіз.', tokenPopupCopy: 'Көшіру', tokenPopupSave: 'TXT форматында сақтаңыз', }, @@ -187,9 +195,9 @@ export default { searchPlaceholder: 'Серия, өнім', domain: 'Домен', daysToExpire: { - '0': 'Жарамдылық мерзімінің өтуі', - '30': '30 немесе одан аз', - '90': '90 немесе одан аз', + 0: 'Жарамдылық мерзімінің өтуі', + 30: '30 немесе одан аз', + 90: '90 немесе одан аз', days: 'күндер', }, importLicense: 'Лицензияны жүктеп алу', @@ -207,7 +215,8 @@ export default { hotdesk: 'Hot desking', hotdeskDevice: 'Hot desking құрылғы', hotdeskIncorrectInput: 'Хост атауы қате', - hotdeskInputHint: 'Хост атауы үшін дұрыс таңбаларды пайдаланыңыз. Рұқсат етілген таңбалар: A-Z, a-z, 0-9, -, _', + hotdeskInputHint: + 'Хост атауы үшін дұрыс таңбаларды пайдаланыңыз. Рұқсат етілген таңбалар: A-Z, a-z, 0-9, -, _', deviceSettings: 'Құрылғының баптаулары', hostName: 'Хост атауы', phoneInfo: 'Телефон туралы ақпарат', @@ -256,7 +265,8 @@ export default { exportDataGridDescription: 'Деректерді экспорттауға рұқсат береді', viewCdrPhoneNumbersDescription: 'Шифрланбаған телефон нөмірлерін көрсетуге рұқсат береді', manageUserRolesDescription: 'Пайдаланушы рөлдерінің жиынын басқаруға рұқсат береді', - manageUserLicenseDescription: 'Пайдаланушы лицензияларының жинағын басқаруға рұқсат береді', + manageUserLicenseDescription: + 'Пайдаланушы лицензияларының жинағын басқаруға рұқсат береді', changeUserPasswordDescription: 'Пайдаланушының құпиясөзін өзгертуге рұқсат береді', }, addPermission: 'Рөлге кіру құқығын қосыңыз', @@ -280,9 +290,9 @@ export default { create: 'Жасау', delete: 'Жою', accessMode: { - '1': 'Тыйым салынады', - '2': 'Рұқсат', - '3': 'Басқару ', + 1: 'Тыйым салынады', + 2: 'Рұқсат', + 3: 'Басқару ', }, }, }, @@ -292,9 +302,11 @@ export default { skills: 'Дағды | Дағдылар', capacity: 'Әлеует', minCapacity: 'Ең төменгі әлеует', - minCapacityLessOrEqualToMaxCapacityValidator: 'Ең жоғарғы әлеуеттен төмен немесе тең болуы керек', + minCapacityLessOrEqualToMaxCapacityValidator: + 'Ең жоғарғы әлеуеттен төмен немесе тең болуы керек', maxCapacity: 'Ең жоғарғы әлеует', - maxCapacityMoreOrEqualToMinCapacityValidator: 'Ең төменгі әлеуеттен үлкен немесе тең болуы керек', + maxCapacityMoreOrEqualToMinCapacityValidator: + 'Ең төменгі әлеуеттен үлкен немесе тең болуы керек', lvl: 'Деңгей', agentSkills: 'Оператор дағдылары | Операторлардың дағдылары', allSkills: 'Барлық дағдылар', @@ -502,7 +514,8 @@ export default { }, webchat: { copyCode: 'Кодты көшіру', - copyCodeHint: 'Баптауды әр өзгерткеннен кейін сайтқа Виджет кодын қайта жасау және енгізу қажет', + copyCodeHint: + 'Баптауды әр өзгерткеннен кейін сайтқа Виджет кодын қайта жасау және енгізу қажет', metadata: { mediaMaxSize: 'Ең жоғарғы файл көлемі (МБ)', }, @@ -513,7 +526,7 @@ export default { position: 'Орналастыру', btnColor: 'Батырманың түсі', logoUrl: 'Логотип URL', - logoHint: 'Қолданылатын логотип пішімі - \'JPEG\' немесе \'PNG\', 24x24px', + logoHint: "Қолданылатын логотип пішімі - 'JPEG' немесе 'PNG', 24x24px", rounded: 'Дөңгелек', square: 'квадрат ', right: 'Оң жақта', @@ -614,7 +627,8 @@ export default { emptyWorkspace: 'Абоненттер табылмады', resetMembers: { resetMembers: 'Абоненттерді қайта іске қосыңыз', - description: 'Сіз шынымен абоненттердің сәтсіз әрекеттері бойынша қайта қоңырау шалғыңыз келе ме? ', + description: + 'Сіз шынымен абоненттердің сәтсіз әрекеттері бойынша қайта қоңырау шалғыңыз келе ме? ', reset: 'Қайтадан қосу', successResetCount: '{count} абонент сәтті қайта іске қосылды', }, @@ -646,17 +660,22 @@ export default { newQueueDescription: 'Кезек түрлері', outboundIVRQueue: 'Шығыс IVR кезегі', outboundIVR: 'Шығыс IVR', - outboundIVRQueueDescription: 'Шығыс IVR ұйымға жеке хабарландыруларды қолдана отырып, автоматты дыбыстық қоңыраулар, SMS хабарламалар, электрондық пошта немесе әлеуметтік желілердегі хабарламалар сияқты бірнеше арна арқылы клиенттерді автоматты түрде тартуға мүмкіндік береді.', + outboundIVRQueueDescription: + 'Шығыс IVR ұйымға жеке хабарландыруларды қолдана отырып, автоматты дыбыстық қоңыраулар, SMS хабарламалар, электрондық пошта немесе әлеуметтік желілердегі хабарламалар сияқты бірнеше арна арқылы клиенттерді автоматты түрде тартуға мүмкіндік береді.', inboundQueue: 'Кіріс кезегі', - inboundQueueDescription: 'Кіріс кезегі: Қоңырау шалушылар оператормен сөйлесу үшін кезекте күтеді.', + inboundQueueDescription: + 'Кіріс кезегі: Қоңырау шалушылар оператормен сөйлесу үшін кезекте күтеді.', offlineQueue: 'Оффлайн кезек', - offlineQueueDescription: 'Автономды кезек қоңырау шалушыларға күтуді тоқтатуға, телефон нөмірін енгізуге және кері қоңырау шалуға мүмкіндік береді.', + offlineQueueDescription: + 'Автономды кезек қоңырау шалушыларға күтуді тоқтатуға, телефон нөмірін енгізуге және кері қоңырау шалуға мүмкіндік береді.', previewDialer: 'Қоңырауды алдын ала қарау', - previewDialerDescription: 'Қоңырау бастамашысы - оператор. Нөмірді автоматты түрде теру алдында байланысты алдын ала қарау. ', + previewDialerDescription: + 'Қоңырау бастамашысы - оператор. Нөмірді автоматты түрде теру алдында байланысты алдын ала қарау. ', progressiveDialer: 'Прогрессивті қоңырау шалу', progressiveDialerDescription: 'Операторды резервтеу арқылы шығыс науқан.', predictiveDialer: 'Болжамды қоңырау', - predictiveDialerDescription: 'Қоңырауды күту уақытын барынша азайту үшін операторды алдын ала резервтеусіз шығыс науқаны.', + predictiveDialerDescription: + 'Қоңырауды күту уақытын барынша азайту үшін операторды алдын ала резервтеусіз шығыс науқаны.', chatInboundQueue: 'Кіріс чат кезегі', chatInboundQueueDescription: 'Кіріс кезегі сияқты, бірақ чаттармен', inboundJobQueue: 'Кіріс жұмыс кезегі', @@ -687,7 +706,8 @@ export default { expire: 'аяқталады', originateTimeout: 'Күту уақыты', maxAgentLine: 'Операторға бір мезгілде соғылған қоңыраулар саны', - maxAgentLose: 'Желілер терілгенге дейін тоқтату үшін қабылданбаған қоңыраулардың ең көп саны', + maxAgentLose: + 'Желілер терілгенге дейін тоқтату үшін қабылданбаған қоңыраулардың ең көп саны', minAttempts: 'Болжамды түзімге ауысу әрекеттерінің саны', maxAbandonedRate: 'Қабылданбаған қоңыраулардың рұқсат етілген %', loadFactor: 'Жүктеме коэффициенті', @@ -832,7 +852,8 @@ export default { source: 'Импорттауды тағайындау', settings: 'Баптау', mappings: 'Өрістер маппингі', - mappingsHint: 'Бұл бөлімде CSV файлының бағандарының атауларын төменгі өрістерде олардың тақырыптарына сәйкес көрсету қажет', + mappingsHint: + 'Бұл бөлімде CSV файлының бағандарының атауларын төменгі өрістерде олардың тақырыптарына сәйкес көрсету қажет', columnHeader: 'Баған', members: { clearMembers: 'Абоненттерді жою', @@ -842,7 +863,8 @@ export default { tokens: 'Токен | Токендер ', allTokens: 'Барлық токендер ', expires: 'Мерзімі аяқталады', - popupMessage: 'Кілт файлын жүктеп алыңыз немесе оны көшіріп алыңыз. Кілт файлын қазір жүктеп алмасаңыз, оны қайтадан шығарып ала алмайсыз. Қауіпсіздікті арттыру үшін кілтті қауіпсіз жерде сақтаңыз және оны ешкімге бермеңіз', + popupMessage: + 'Кілт файлын жүктеп алыңыз немесе оны көшіріп алыңыз. Кілт файлын қазір жүктеп алмасаңыз, оны қайтадан шығарып ала алмайсыз. Қауіпсіздікті арттыру үшін кілтті қауіпсіз жерде сақтаңыз және оны ешкімге бермеңіз', tokenCreated: 'Сіздің токеніңіз сәтті жасалды', }, triggers: { diff --git a/src/app/locale/ru/ru.js b/src/app/locale/ru/ru.js index beaf0e6b2..a8fadbed6 100644 --- a/src/app/locale/ru/ru.js +++ b/src/app/locale/ru/ru.js @@ -18,22 +18,28 @@ export default { loginSubmit: 'Войти', carousel: { title1: 'Облако и в Он-сайт', - text1: 'Политика безопасности не позволяет хранить данные и использовать облачные сервисы? С Webitel вы можете построить контакт-центр на своей площадке!', + text1: + 'Политика безопасности не позволяет хранить данные и использовать облачные сервисы? С Webitel вы можете построить контакт-центр на своей площадке!', title2: 'Мультиканальность и Омниканальность', - text2: 'Будьте всегда и везде на связи со своими клиентами! IVR-меню любой сложности, входящие, исходящие кампании взаимодействия или сообщение в социальные сети - теперь просто как никогда!', + text2: + 'Будьте всегда и везде на связи со своими клиентами! IVR-меню любой сложности, входящие, исходящие кампании взаимодействия или сообщение в социальные сети - теперь просто как никогда!', title3: 'Отказоустойчивая инфраструктура', - text3: 'Больше никаких простоев и потерь данных. Быстрое масштабирование и отказоустойчивая архитектура позволяет обслуживать одновременно более 1000 обращений клиентов в минуту с разных каналов коммуникаций.', + text3: + 'Больше никаких простоев и потерь данных. Быстрое масштабирование и отказоустойчивая архитектура позволяет обслуживать одновременно более 1000 обращений клиентов в минуту с разных каналов коммуникаций.', title4: 'Дизайн', - text4: 'Новый минималистичный интерфейс с максимально удобной для пользователя админ-панелью, позволяющей иметь оперативный доступ ко всем необходимым функциям. Меньше кликов - больше возможностей.', + text4: + 'Новый минималистичный интерфейс с максимально удобной для пользователя админ-панелью, позволяющей иметь оперативный доступ ко всем необходимым функциям. Меньше кликов - больше возможностей.', title5: 'Новый модуль работы с операторскими группами', - text5: 'Максимально эффективное распределение звонков. Оператор может обладать сразу несколькими навыками для участия в разных кампаниях. Клиента обслуживают только профессионалы своего дела.', + text5: + 'Максимально эффективное распределение звонков. Оператор может обладать сразу несколькими навыками для участия в разных кампаниях. Клиента обслуживают только профессионалы своего дела.', title6: 'Настройка прав доступа', - text6: 'Новый модуль управления правами - новые возможности для контроля. Вы можете назначать права не только на разделы, но и на действия пользователей, при этом отслеживая вносимые изменения. ', + text6: + 'Новый модуль управления правами - новые возможности для контроля. Вы можете назначать права не только на разделы, но и на действия пользователей, при этом отслеживая вносимые изменения. ', }, }, @@ -59,6 +65,12 @@ export default { webPhone: 'Web-телефон', useWebPhone: 'Использовать Web-телефон', useStun: 'Использовать STUN', + ringtones: { + title: 'Поменять рингтон', + ringtone: 'Рингтон', + customRingtone: 'Использовать кастомный рингтон', + }, + callEnd: 'Звуковое оповещение про завершение звонка', }, validation: { @@ -162,7 +174,8 @@ export default { deleteConfirmation: { title: 'Подтвердите удаление', - askingAlert: 'Вы уверенны, что хотите удалить {count} запись? | Вы уверенны, что хотите удалить {count} записей?', + askingAlert: + 'Вы уверенны, что хотите удалить {count} запись? | Вы уверенны, что хотите удалить {count} записей?', undoneActionAlert: 'Это действие не может быть отменено.', deleteAll: 'ВСЕ', }, @@ -178,7 +191,8 @@ export default { objectHeader: {}, directory: { directory: 'Каталог', - passwordInfo: 'Введите значение только если хотите его перезаписать (или задать новое). Пустое поле оставит значение тем же.', + passwordInfo: + 'Введите значение только если хотите его перезаписать (или задать новое). Пустое поле оставит значение тем же.', users: { users: 'Пользователь | Пользователи', allUsers: 'Все пользователи', @@ -202,14 +216,16 @@ export default { varVal: 'Значение', token: 'Токен | Токены', tokenPopupHeader: 'Ваш токен-ключ был успешно создан!', - tokenPopupText: 'Загрузите файл с ключом сейчас или скопируйте его для дальнейшего использования. Если вы не загрузите файл ключа сейчас, вы не сможете получить свой токен-ключ снова. Для вашей безопасности никому не передавайте свой токен-ключ.', + tokenPopupText: + 'Загрузите файл с ключом сейчас или скопируйте его для дальнейшего использования. Если вы не загрузите файл ключа сейчас, вы не сможете получить свой токен-ключ снова. Для вашей безопасности никому не передавайте свой токен-ключ.', tokenPopupCopy: 'Копировать', tokenPopupSave: 'Сохранить в формате TXT', userIp: 'IP пользователя', userId: 'ID пользователя', download: 'Скачать', regenerate: 'Перегенерировать', - askingAlert: 'Вы уверены, что хотите перегенерировать QR-код? Пользователь потеряет возможность войти в систему', + askingAlert: + 'Вы уверены, что хотите перегенерировать QR-код? Пользователь потеряет возможность войти в систему', }, license: { customers: 'Пользователи', @@ -228,9 +244,9 @@ export default { searchPlaceholder: 'Серия, продукт', domain: 'Домен', daysToExpire: { - '0': 'Истечение срока действия', - '30': '30 или меньше', - '90': '90 или меньше', + 0: 'Истечение срока действия', + 30: '30 или меньше', + 90: '90 или меньше', days: ' дней', }, importLicense: 'Загрузить лицензию', @@ -248,7 +264,8 @@ export default { hotdesk: 'Hot desking', hotdeskDevice: 'Hot desking устройство', hotdeskIncorrectInput: 'Неправильное имя хоста', - hotdeskInputHint: 'Для имени хоста используйте правильные символы. Разрешены символы: A-Z, a-z, 0-9, -, _', + hotdeskInputHint: + 'Для имени хоста используйте правильные символы. Разрешены символы: A-Z, a-z, 0-9, -, _', deviceSettings: 'Настройки устройства', hostName: 'Имя хоста', phoneInfo: 'Информация о телефоне', @@ -296,15 +313,21 @@ export default { readDescription: 'Предоставляет разрешение на выбор объектов', writeDescription: 'Предоставляет разрешение на изменение объектов', eavesdropCallDescription: 'Предоставляет разрешение на прослушивание активного разговора', - playbackRecordFileDescription: 'Предоставляет разрешение на воспроизведение файлов с записями разговоров', + playbackRecordFileDescription: + 'Предоставляет разрешение на воспроизведение файлов с записями разговоров', exportDataGridDescription: 'Предоставляет разрешение на экспорт данных', - viewCdrPhoneNumbersDescription: 'Предоставляет разрешение на отображение незашифрованных телефонных номеров', - manageUserRolesDescription: 'Предоставляет разрешение на управление набором ролей пользователей', - manageUserLicenseDescription: 'Предоставляет разрешение на управление набором пользовательских лицензий', - changeUserPasswordDescription: 'Предоставляет разрешение на изменение пароля пользователя', + viewCdrPhoneNumbersDescription: + 'Предоставляет разрешение на отображение незашифрованных телефонных номеров', + manageUserRolesDescription: + 'Предоставляет разрешение на управление набором ролей пользователей', + manageUserLicenseDescription: + 'Предоставляет разрешение на управление набором пользовательских лицензий', + changeUserPasswordDescription: + 'Предоставляет разрешение на изменение пароля пользователя', systemSettingDescription: 'Предоставляет разрешение на управление разделом Конфигурация', schemeVariables: 'Управление глобальными переменными', - schemeVariablesDescription: 'Предоставляет разрешение на управление разделом Глобальные переменные', + schemeVariablesDescription: + 'Предоставляет разрешение на управление разделом Глобальные переменные', }, addPermission: 'Добавить право доступа для роли', usage: 'Использование', @@ -327,9 +350,9 @@ export default { create: 'Создавать', delete: 'Удалять', accessMode: { - '1': 'Запрещено', - '2': 'Разрешено', - '3': 'Управление', + 1: 'Запрещено', + 2: 'Разрешено', + 3: 'Управление', }, }, }, @@ -339,9 +362,11 @@ export default { skills: 'Навык | Навыки', capacity: 'Потенциал', minCapacity: 'Минимальный потенциал', - minCapacityLessOrEqualToMaxCapacityValidator: 'Должно быть меньше или равно Максимальному потенциалу', + minCapacityLessOrEqualToMaxCapacityValidator: + 'Должно быть меньше или равно Максимальному потенциалу', maxCapacity: 'Максимальный потенциал', - maxCapacityMoreOrEqualToMinCapacityValidator: 'Должно быть больше или равно Минимальному потенциалу', + maxCapacityMoreOrEqualToMinCapacityValidator: + 'Должно быть больше или равно Минимальному потенциалу', lvl: 'Уровень', agentSkills: 'Навыки оператора | Навыки операторов', allSkills: 'Все навыки', @@ -479,7 +504,8 @@ export default { }, chatplan: { - chatplan: 'Правило маршрутизации текстовых сообщений | Правила маршрутизации текстовых сообщений', + chatplan: + 'Правило маршрутизации текстовых сообщений | Правила маршрутизации текстовых сообщений', allChatplans: 'Все правила маршрутизации текстовых сообщений', }, @@ -572,7 +598,8 @@ export default { webchat: { webchat: 'Web chat', copyCode: 'Скопировать код', - copyCodeHint: 'Необходимо перегенерировать и вставить код Виджета на сайт после каждой модификации настроек', + copyCodeHint: + 'Необходимо перегенерировать и вставить код Виджета на сайт после каждой модификации настроек', metadata: { mediaMaxSize: 'Максимальный размер файла (Мб)', }, @@ -583,7 +610,7 @@ export default { position: 'Размещение', btnColor: 'Цвет кнопки', logoUrl: 'URL логотипа', - logoHint: 'Поддерживаемый формат логотипа - \'JPEG\' or \'PNG\', 24x24px', + logoHint: "Поддерживаемый формат логотипа - 'JPEG' or 'PNG', 24x24px", rounded: 'Круглая', square: 'Квадратная', right: 'Справа', @@ -611,7 +638,8 @@ export default { resultPageText: 'Текст та странице результата', headingText: 'Заголовок', subheadingText: 'Подзаголовок', - showDefaultHeading: 'Показать стандартный заголовок и подзаголовок на странице результата', + showDefaultHeading: + 'Показать стандартный заголовок и подзаголовок на странице результата', }, call: { title: 'Онлайн-звонок', @@ -718,12 +746,20 @@ export default { hooks: { eventTypes: { agentStatus: 'Изменение статуса оператора', - } + }, }, flows: { addFlowSchema: 'Добавить схему', editFlowSchema: 'Редактировать схему', }, + supervisors: { + addSupervisor: 'Добавить супервизора', + editSupervisor: 'Редактировать супервизора', + }, + agents: { + addAgent: 'Добавить оператора', + editAgent: 'Редактировать оператора', + }, }, members: { @@ -738,7 +774,8 @@ export default { emptyWorkspace: 'Абоненты не найдены', resetMembers: { resetMembers: 'Перезапустить абонентов', - description: 'Вы действительно хотите перезапустить повторный дозвон по неудачным попыткам абонентов?', + description: + 'Вы действительно хотите перезапустить повторный дозвон по неудачным попыткам абонентов?', reset: 'Перезапустить', successResetCount: 'Успешно перезапущено {count} абонентов', }, @@ -771,17 +808,22 @@ export default { newQueueDescription: 'Типы очередей', outboundIVRQueue: 'Исходящая IVR-очередь', outboundIVR: 'Исходящий IVR', - outboundIVRQueueDescription: 'Исходящий IVR позволяет организации автоматически привлекать клиентов по нескольким каналам, таким как автоматические голосовые вызовы, SMS-сообщения, электронная почта или сообщения в социальных сетях с использованием персонализированных уведомлений.', + outboundIVRQueueDescription: + 'Исходящий IVR позволяет организации автоматически привлекать клиентов по нескольким каналам, таким как автоматические голосовые вызовы, SMS-сообщения, электронная почта или сообщения в социальных сетях с использованием персонализированных уведомлений.', inboundQueue: 'Входящая очередь', - inboundQueueDescription: 'Входящая очередь: звонящие находятся в режиме ожидания в очереди, чтобы поговорить с живым оператором.', + inboundQueueDescription: + 'Входящая очередь: звонящие находятся в режиме ожидания в очереди, чтобы поговорить с живым оператором.', offlineQueue: 'Оффлайн очередь', - offlineQueueDescription: 'Автономная очередь дает возможность звонящим прекратить ожидание на удержании, ввести свой номер телефона и получить обратный вызов.', + offlineQueueDescription: + 'Автономная очередь дает возможность звонящим прекратить ожидание на удержании, ввести свой номер телефона и получить обратный вызов.', previewDialer: 'Превью обзвон', - previewDialerDescription: 'Инициатором звонка выступает оператор. Предварительный просмотр контакта перед автоматическим набором номера.', + previewDialerDescription: + 'Инициатором звонка выступает оператор. Предварительный просмотр контакта перед автоматическим набором номера.', progressiveDialer: 'Прогрессивный обзвон', progressiveDialerDescription: 'Исходящая кампания с резервированием оператора.', predictiveDialer: 'Предиктивный обзвон', - predictiveDialerDescription: 'Исходящая кампания без предварительного резервирования оператора для максимального сокращения времени ожидания звонка.', + predictiveDialerDescription: + 'Исходящая кампания без предварительного резервирования оператора для максимального сокращения времени ожидания звонка.', chatInboundQueue: 'Входящая очередь чатов', chatInboundQueueDescription: 'То же самое, что и Входящая очередь, но с чатами', inboundJobQueue: 'Входящая очередь заданий', @@ -862,6 +904,8 @@ export default { communications: 'Тип связи', manualDistribution: 'Ручное распределение', lastMessageTimeout: 'Время ожидания от последнего сообщения', + stickyIgnoreStatus: 'Игнорировать статус оператора', + ignoreCalendar: 'Игнорировать календарь', processing: { processing: 'Обработка', enabled: 'Ожидание результата задачи', @@ -909,6 +953,14 @@ export default { active: 'Активное действие', }, }, + skills: { + editSkill: 'Редактировать навык', + addSkill: 'Добавить навык', + }, + buckets: { + addBucket: 'Добавить корзину', + editBucket: 'Редактировать корзину', + }, }, res: { @@ -1015,7 +1067,8 @@ export default { source: 'Назначение импорта', settings: 'Настройки', mappings: 'Маппинги полей', - mappingsHint: 'В этой секции необходимо указать названия колонок CSV файла в полях ниже в соответствии с их заголовками', + mappingsHint: + 'В этой секции необходимо указать названия колонок CSV файла в полях ниже в соответствии с их заголовками', columnHeader: 'Колонка {name}', members: { clearMembers: 'Удалить существующих абонентов', @@ -1026,7 +1079,8 @@ export default { tokens: 'Токен | Токены', allTokens: 'Все токены', expires: 'Истекает', - popupMessage: 'Загрузите файл ключа или скопируйте его. Если вы не загрузите файл ключа сейчас, вы не сможете извлечь его еще раз. Чтобы повысить безопасность, храните ключ в надежном месте и не делитесь им.', + popupMessage: + 'Загрузите файл ключа или скопируйте его. Если вы не загрузите файл ключа сейчас, вы не сможете извлечь его еще раз. Чтобы повысить безопасность, храните ключ в надежном месте и не делитесь им.', tokenCreated: 'Ваш токен успешно создан!', }, @@ -1036,7 +1090,8 @@ export default { type: 'Тип', schema: 'Схема', newTrigger: 'Новый триггер', - newTriggerDescription: 'Choose a template to get going or start from scratch with a blank canvas', + newTriggerDescription: + 'Choose a template to get going or start from scratch with a blank canvas', onEvent: 'On event', onEventDescription: 'An event-based JSON Schema scheduler', cron: 'At time', diff --git a/src/app/locale/ua/ua.js b/src/app/locale/ua/ua.js index 157c0a054..4a6c1ef1d 100644 --- a/src/app/locale/ua/ua.js +++ b/src/app/locale/ua/ua.js @@ -9,7 +9,7 @@ export default { registerReset: 'Скинути пароль', detailsSubtitle: 'Введіть свої дані', resetPasswordLink: 'Забули пароль?', - user: 'Ім\'я користувача', + user: "Ім'я користувача", password: 'Пароль', confirmPassword: 'Підтвердіть пароль', key: 'Ліцензійний ключ', @@ -18,22 +18,28 @@ export default { loginSubmit: 'Ввійти', carousel: { title1: 'Cloud vs On-Site', - text1: 'Політика безпеки не дозволяє зберігати дані і використовувати хмарні сервіси? З Webitel Ви можете створити контакт-центр на своїй площадці!', + text1: + 'Політика безпеки не дозволяє зберігати дані і використовувати хмарні сервіси? З Webitel Ви можете створити контакт-центр на своїй площадці!', title2: 'Мультиканальність vs Омніканальність', - text2: 'Будьте завжди і всюди на зв\'язку зі своїми клієнтами! IVR-меню будь-якої складності, вхідні, вихідні кампанії взаємодії чи повідомлення в соцмережі - зараз просто, як ніколи!', + text2: + "Будьте завжди і всюди на зв'язку зі своїми клієнтами! IVR-меню будь-якої складності, вхідні, вихідні кампанії взаємодії чи повідомлення в соцмережі - зараз просто, як ніколи!", title3: 'Відмовостійка інфраструктура', - text3: 'Більше ніяких простоїв та втрат даних. Швидке масштабування та відмовостійка архітектура дозволяє одночасно обслуговувати більше 1000 звернень клієнтів за хвиилину з різних каналів комунікацій.', + text3: + 'Більше ніяких простоїв та втрат даних. Швидке масштабування та відмовостійка архітектура дозволяє одночасно обслуговувати більше 1000 звернень клієнтів за хвиилину з різних каналів комунікацій.', title4: 'Дизайн', - text4: 'Новий мінімалістичний інтерфейс з максимально зручною для користувача адмін-панеллю, що дозволяє мати оператичний доступ до всіх необхідних функцій. Менше кліків - більше можливостей.', + text4: + 'Новий мінімалістичний інтерфейс з максимально зручною для користувача адмін-панеллю, що дозволяє мати оператичний доступ до всіх необхідних функцій. Менше кліків - більше можливостей.', title5: 'Новий модуль роботи з операторськими групами', - text5: 'Максимально ефективне розподілення дзвінків. Оператор може мати одразу декілька навичок для участі у різних кампаніях. Клієнта обслуговують лише професіонали своєї справи.', + text5: + 'Максимально ефективне розподілення дзвінків. Оператор може мати одразу декілька навичок для участі у різних кампаніях. Клієнта обслуговують лише професіонали своєї справи.', title6: 'Налаштування прав доступу', - text6: 'Новий модуль управління правами - нові можливості для контролю. Ви можете надавати права не тільки на розділи, але і на дії користувачів, відслідковуючи при цьому зміни. ', + text6: + 'Новий модуль управління правами - нові можливості для контролю. Ви можете надавати права не тільки на розділи, але і на дії користувачів, відслідковуючи при цьому зміни. ', }, }, @@ -59,11 +65,17 @@ export default { webPhone: 'Web-телефон', useWebPhone: 'Використовувати Web-телефон', useStun: 'Використовувати STUN', + ringtones: { + title: 'Змінити рінгтон', + ringtone: 'Рінгтон', + customRingtone: 'Використовувати кастомний рінгтон', + }, + callEnd: 'Звукове сповіщення про завершення дзвінка', }, validation: { email: 'Введіть адресу електронної пошти', - required: 'Поле обов\'язкове для заповнення', + required: "Поле обов'язкове для заповнення", sameAs: 'Невірний пароль', gatewayHostValidator: 'Має виглядати як IPv4 або FQDN', ipValidator: 'Має виглядати як IPv4', @@ -123,7 +135,7 @@ export default { next: 'Далі', back: 'Назад', change: 'Замінити', - name: 'Ім\'я', + name: "Ім'я", title: 'Назва', description: 'Опис', user: 'Користувач', @@ -162,7 +174,8 @@ export default { deleteConfirmation: { title: 'Підтвердіть видалення', - askingAlert: 'Ви впевнені, що хочете видалити {count} запис? | Ви впевнені, що хочете видалити {count} записів?', + askingAlert: + 'Ви впевнені, що хочете видалити {count} запис? | Ви впевнені, що хочете видалити {count} записів?', undoneActionAlert: 'Дана дія не може бути скасована.', deleteAll: 'ВСІ', }, @@ -178,11 +191,12 @@ export default { objectHeader: {}, directory: { directory: 'Каталог', - passwordInfo: 'Введіть значення лише якщо хочете його перезаписати (або задати нове). Порожнє значення залишить пароль незмінним', + passwordInfo: + 'Введіть значення лише якщо хочете його перезаписати (або задати нове). Порожнє значення залишить пароль незмінним', users: { users: 'Користувач | Користувачі', allUsers: 'Всі користувачі', - searchPlaceholder: 'Ім\'я, користувач, номери телефону, статус', + searchPlaceholder: "Ім'я, користувач, номери телефону, статус", login: 'Логін', extensions: 'Внутрішній номер', state: 'Стан', @@ -202,14 +216,16 @@ export default { varVal: 'Значення', token: 'Токен | Токени', tokenPopupHeader: 'Ваш токен-ключ був успішно створений', - tokenPopupText: 'Завантажте файл з ключем зараз або скопіюйте його для подальшого використання. Якщо Ви не завантажите файл ключа зараз, то не зможете отримати свій токен-ключ знову. Для Вашої безпеки нікому не передвайте свій токен-ключ.', + tokenPopupText: + 'Завантажте файл з ключем зараз або скопіюйте його для подальшого використання. Якщо Ви не завантажите файл ключа зараз, то не зможете отримати свій токен-ключ знову. Для Вашої безпеки нікому не передвайте свій токен-ключ.', tokenPopupCopy: 'Копіювати', tokenPopupSave: 'Зберегти у форматі TXT', userIp: 'IP користувача', userId: 'ID користувача', download: 'Завантажити', regenerate: 'Перегенерувати', - askingAlert: 'Ви впевнені, що хочете перегенерувати QR-код? Користувач втратить можливість зайти в систему', + askingAlert: + 'Ви впевнені, що хочете перегенерувати QR-код? Користувач втратить можливість зайти в систему', }, license: { customers: 'Користувачі', @@ -228,9 +244,9 @@ export default { searchPlaceholder: 'Серія, продукт', domain: 'Домен', daysToExpire: { - '0': 'Час дії вичерпано', - '30': '30 або менше', - '90': '90 або менше', + 0: 'Час дії вичерпано', + 30: '30 або менше', + 90: '90 або менше', days: ' днів', }, importLicense: 'Завантажити ліцензію', @@ -242,15 +258,16 @@ export default { newDevice: 'Новий пристрій', newDeviceDescription: 'Опис нового пристрою', hotdeskDeviceSettings: 'Налаштування позмінного використання пристрою', - searchPlaceholder: 'Назва, користувач, ідентифікатор, ідентифікатор комп\'ютера', + searchPlaceholder: "Назва, користувач, ідентифікатор, ідентифікатор комп'ютера", authId: 'Ідентифікатор', presence: 'Актуальний статус', hotdesk: 'Hot desking', hotdeskDevice: 'Hot desking пристрій', - hotdeskIncorrectInput: 'Неправильне ім\'я хоста', - hotdeskInputHint: 'Для імені хоста використовуйте лише правильні символи. Дозволені символи: A-Z, a-z, 0-9, -, _', + hotdeskIncorrectInput: "Неправильне ім'я хоста", + hotdeskInputHint: + 'Для імені хоста використовуйте лише правильні символи. Дозволені символи: A-Z, a-z, 0-9, -, _', deviceSettings: 'Налаштування пристрою', - hostName: 'Ім\'я хоста', + hostName: "Ім'я хоста", phoneInfo: 'Інформація про телефон', phone: 'Телефон', vendor: 'Виробник', @@ -298,7 +315,8 @@ export default { eavesdropCallDescription: 'Надає дозвіл прослуховувати активну розмову', playbackRecordFileDescription: 'Надає дозвіл на відтворення файлів записів дзвінків', exportDataGridDescription: 'Надає дозвіл на експорт даних', - viewCdrPhoneNumbersDescription: 'Надає дозвіл на відображення незашифрованих телефонних номерів', + viewCdrPhoneNumbersDescription: + 'Надає дозвіл на відображення незашифрованих телефонних номерів', manageUserRolesDescription: 'Надає дозвіл на керування набором ролей користувачів', manageUserLicenseDescription: 'Надає дозвіл на керування набором ліцензій користувача', changeUserPasswordDescription: 'Надає дозвіл на зміну пароля користувача', @@ -327,9 +345,9 @@ export default { create: 'Створювати', delete: 'Видаляти', accessMode: { - '1': 'Заборонено', - '2': 'Дозволено', - '3': 'Управління', + 1: 'Заборонено', + 2: 'Дозволено', + 3: 'Управління', }, }, }, @@ -352,8 +370,10 @@ export default { assignSkillToAgents: 'Назначити навичку операторам', assignAgent: 'Призначити оператора', selectCapacityAndState: 'Вибрати потенціал і стан', - minCapacityLessOrEqualToMaxCapacityValidator: 'Має бути менше або рівне Максимальному потенціалу', - maxCapacityMoreOrEqualToMinCapacityValidator: 'Має бути більше або рівне Мінімальному потенціалу', + minCapacityLessOrEqualToMaxCapacityValidator: + 'Має бути менше або рівне Максимальному потенціалу', + maxCapacityMoreOrEqualToMinCapacityValidator: + 'Має бути більше або рівне Мінімальному потенціалу', }, buckets: { buckets: 'Кошик | Кошики', @@ -416,7 +436,7 @@ export default { tue: 'Вівторок', wed: 'Середа', thu: 'Четвер', - fri: 'П\'ятниця', + fri: "П'ятниця", sat: 'Субота', sun: 'Неділя', workingTime: 'Робочий час', @@ -424,9 +444,9 @@ export default { workStop: 'Кінець робочого часу', }, communications: { - communications: 'Тип зв\'язку | Типи зв\'язку', - allCommunications: 'Всі типи зв\'язку', - addCommunication: 'Додати тип зв\'язку', + communications: "Тип зв'язку | Типи зв'язку", + allCommunications: "Всі типи зв'язку", + addCommunication: "Додати тип зв'язку", code: 'Код', channels: { [EngineCommunicationChannels.Phone]: 'Телефон', @@ -479,7 +499,8 @@ export default { }, chatplan: { - chatplan: 'Правило маршрутизації текстових повідомлень | Правила маршрутизації текстових повідомлень', + chatplan: + 'Правило маршрутизації текстових повідомлень | Правила маршрутизації текстових повідомлень', allChatplans: 'Всі правила маршрутизації текстових повідомлень', }, @@ -500,7 +521,7 @@ export default { hostnameTrunking: 'Сервер/Хост шлюзу чи IP', hostnameRegister: 'Реєстратор/Сервер/Хост шлюзу чи IP', expire: 'Термін дії', - authID: 'Ім\'я користувача', + authID: "Ім'я користувача", account: 'Акаунт', outboundProxy: 'Адреса вихідного SIP-проксі', newGateway: 'Новий шлюз', @@ -514,10 +535,10 @@ export default { chatGateways: { templates: { templates: 'Шаблони', - title: 'Анонімне ім\'я абонента у Workspace', + title: "Анонімне ім'я абонента у Workspace", close: 'Повідомлення завершення чату', join: 'Повідомлення приєднання оператора', - left: 'Повідомлення від\'єднання оператора', + left: "Повідомлення від'єднання оператора", }, chatGateways: 'Текстовий шлюз | Текстові шлюзи', allChatGateways: 'Всі текстові шлюзи', @@ -573,7 +594,8 @@ export default { webchat: { webchat: 'Web chat', copyCode: 'Копіювати код', - copyCodeHint: 'Необхідно перегенерувати та вставити код Віджета на сайт після кожної модифікації налаштувань', + copyCodeHint: + 'Необхідно перегенерувати та вставити код Віджета на сайт після кожної модифікації налаштувань', metadata: { mediaMaxSize: 'Максимальний розмір файла (Мб)', }, @@ -584,7 +606,7 @@ export default { position: 'Розміщення', btnColor: 'Колір кнопки', logoUrl: 'URL логотипу', - logoHint: 'Підтримуваний формат логотипу - \'JPEG\' or \'PNG\', 24x24px', + logoHint: "Підтримуваний формат логотипу - 'JPEG' or 'PNG', 24x24px", rounded: 'Кругла', square: 'Квадратна', right: 'Справа', @@ -612,7 +634,8 @@ export default { resultPageText: 'Текст на сторінці результату', headingText: 'Заголовок', subheadingText: 'Підзаголовок', - showDefaultHeading: 'Показати стандартний заголовок та підзаголовок на сторінці результату', + showDefaultHeading: + 'Показати стандартний заголовок та підзаголовок на сторінці результату', }, call: { title: 'Онлайн-дзвінок', @@ -720,12 +743,20 @@ export default { hooks: { eventTypes: { agentStatus: 'Зміна статуту оператора', - } + }, }, flows: { addFlowSchema: 'Додати схему', editFlowSchema: 'Редагувати схему', }, + supervisors: { + addSupervisor: 'Додати супервізора', + editSupervisor: 'Редагувати супервізора', + }, + agents: { + addAgent: 'Додати оператора', + editAgent: 'Редагувати оператора', + }, }, members: { @@ -773,17 +804,22 @@ export default { newQueueDescription: 'Типи черг', outboundIVRQueue: 'Вихідна IVR-черга', outboundIVR: 'Вихідний IVR', - outboundIVRQueueDescription: 'Вихідний IVR дозволяє організації автоматично залучати клієнтів по кількох каналах, таких як автоматичні голосові виклики, SMS-повідомлення, електронна пошта або повідомлення в соцмережах з використанням персоналізованих сповіщень.', + outboundIVRQueueDescription: + 'Вихідний IVR дозволяє організації автоматично залучати клієнтів по кількох каналах, таких як автоматичні голосові виклики, SMS-повідомлення, електронна пошта або повідомлення в соцмережах з використанням персоналізованих сповіщень.', inboundQueue: 'Вхідна черга', - inboundQueueDescription: 'Абоненти вхідної черги знаходяться в режимі очікування, щоб поспілкуватися з живим оператором.', + inboundQueueDescription: + 'Абоненти вхідної черги знаходяться в режимі очікування, щоб поспілкуватися з живим оператором.', offlineQueue: 'Офлайн черга', - offlineQueueDescription: 'Автономна черга дає можливість абонентам завершити очікування на утриманні, ввести свій номер телефону і отримати зворотній дзвінок.', - previewDialer: 'Прев\'ю-обдзвін', - previewDialerDescription: 'Ініціатором дзвінка виступає оператор. Він попередньо переглядає контакт перед автоматичним набором номеру.', + offlineQueueDescription: + 'Автономна черга дає можливість абонентам завершити очікування на утриманні, ввести свій номер телефону і отримати зворотній дзвінок.', + previewDialer: "Прев'ю-обдзвін", + previewDialerDescription: + 'Ініціатором дзвінка виступає оператор. Він попередньо переглядає контакт перед автоматичним набором номеру.', progressiveDialer: 'Прогресивний обдзвін', progressiveDialerDescription: 'Вихідна кампанія з резервуванням оператора.', predictiveDialer: 'Предиктивний обдзвін', - predictiveDialerDescription: 'Вихідна кампанія без попереднього резервування оператора для максимального скорочення часу очікування дзвінка.', + predictiveDialerDescription: + 'Вихідна кампанія без попереднього резервування оператора для максимального скорочення часу очікування дзвінка.', chatInboundQueue: 'Вхідна черга чатів', chatInboundQueueDescription: 'Така ж вхідна черга, але для чатів', inboundJobQueue: 'Вхідна черга завдань', @@ -860,9 +896,11 @@ export default { greeting: 'Максимальна довжина привітання (мс)', initialSilence: 'Максимальна тривалість тиші перед привітанням (мс)', statisticTime: 'Інтервал перерахунку', - communications: 'Тип зв\'язку', + communications: "Тип зв'язку", manualDistribution: 'Ручне розподілення', lastMessageTimeout: 'Час очікування від останнього повідомлення', + stickyIgnoreStatus: 'Ігнорувати статус оператора', + ignoreCalendar: 'Ігнорувати календар', processing: { processing: 'Обробка', enabled: 'Очікування результату задачі', @@ -910,6 +948,14 @@ export default { active: 'Активна дія', }, }, + skills: { + editSkill: 'Редагувати навичку', + addSkill: 'Додати навичку', + }, + buckets: { + addBucket: 'Додати кошик', + editBucket: 'Редагувати кошик', + }, }, res: { @@ -951,7 +997,7 @@ export default { storage: 'Сховища', allStorages: 'Всі сховища', type: 'Тип', - maxSize: 'Об\'єм сховища (GB)', + maxSize: "Об'єм сховища (GB)", expireDays: 'Термін зберігання (днів)', priority: 'Пріоритет', newStorage: 'Нове сховище', @@ -1014,7 +1060,8 @@ export default { source: 'Призначення імпорту', settings: 'Налаштування', mappings: 'Мапінги полів', - mappingsHint: 'У цій секції необхідно вказати назви колонок CSV файлу у полях нижче у відповідності до їх заголовків', + mappingsHint: + 'У цій секції необхідно вказати назви колонок CSV файлу у полях нижче у відповідності до їх заголовків', columnHeader: 'Колонка {name}', members: { clearMembers: 'Видалити існуючих абонентів', @@ -1025,7 +1072,8 @@ export default { tokens: 'Токен | Токени', allTokens: 'Всі токени', expires: 'Закінчується', - popupMessage: 'Завантажте файл з ключем зараз або скопіюйте його для подальшого використання. Якщо Ви не завантажите файл ключа зараз, то не зможете отримати свій токен-ключ знову. Для Вашої безпеки нікому не передвайте свій токен-ключ.', + popupMessage: + 'Завантажте файл з ключем зараз або скопіюйте його для подальшого використання. Якщо Ви не завантажите файл ключа зараз, то не зможете отримати свій токен-ключ знову. Для Вашої безпеки нікому не передвайте свій токен-ключ.', tokenCreated: 'Ваш токен успішно створений', }, @@ -1060,7 +1108,7 @@ export default { system: 'Система', changelogs: { changelogs: 'Журнал змін | Журнали змін', - objects: 'Об\'єкт | Об\'єкти', + objects: "Об'єкт | Об'єкти", daysToStore: 'Днів зберігання', storage: 'Вивантажити в', logs: { @@ -1138,9 +1186,9 @@ export default { reload: 'Оновити', edit: 'Редагувати', delete: 'Видалити', - deleteAll: 'Видалити всі об\'єкти', - deleteSelected: 'Видалити {count} обраних об\'єктів', - deleteFiltered: 'Видалити всі відфільтровані об\'єкти', + deleteAll: "Видалити всі об'єкти", + deleteSelected: "Видалити {count} обраних об'єктів", + deleteFiltered: "Видалити всі відфільтровані об'єкти", generate: 'Створити', add: 'Додати', history: 'Історія', diff --git a/src/app/mixins/baseMixins/accessControlMixin/accessControlMixin.js b/src/app/mixins/baseMixins/accessControlMixin/accessControlMixin.js index cf8fd61a7..66c2ede8e 100644 --- a/src/app/mixins/baseMixins/accessControlMixin/accessControlMixin.js +++ b/src/app/mixins/baseMixins/accessControlMixin/accessControlMixin.js @@ -1,16 +1,24 @@ export default { computed: { hasReadAccess() { - return this.$store.getters['userinfo/HAS_READ_ACCESS']({ route: this.$route }); + return this.$store.getters['userinfo/HAS_READ_ACCESS']({ + route: this.$route, + }); }, hasCreateAccess() { - return this.$store.getters['userinfo/HAS_CREATE_ACCESS']({ route: this.$route }); + return this.$store.getters['userinfo/HAS_CREATE_ACCESS']({ + route: this.$route, + }); }, hasEditAccess() { - return this.$store.getters['userinfo/HAS_EDIT_ACCESS']({ route: this.$route }); + return this.$store.getters['userinfo/HAS_EDIT_ACCESS']({ + route: this.$route, + }); }, hasDeleteAccess() { - return this.$store.getters['userinfo/HAS_DELETE_ACCESS']({ route: this.$route }); + return this.$store.getters['userinfo/HAS_DELETE_ACCESS']({ + route: this.$route, + }); }, }, }; diff --git a/src/app/mixins/baseMixins/baseObjectMixin/baseObjectMixin.js b/src/app/mixins/baseMixins/baseObjectMixin/baseObjectMixin.js index 6fea2e6c3..379c6b9ca 100644 --- a/src/app/mixins/baseMixins/baseObjectMixin/baseObjectMixin.js +++ b/src/app/mixins/baseMixins/baseObjectMixin/baseObjectMixin.js @@ -1,6 +1,5 @@ import { mapActions } from 'vuex'; -import openedObjectValidationMixin - from '../openedObjectValidationMixin/openedObjectValidationMixin'; +import openedObjectValidationMixin from '../openedObjectValidationMixin/openedObjectValidationMixin'; import resetOnDestroyMixin from '../resetOnDestroyMixin/resetOnDestroyMixin'; /** @@ -19,14 +18,14 @@ export default { // if it's a new item // OR any fields have changed return !this.id || this.itemInstance._dirty - ? this.$t('objects.save') : this.$t('objects.saved'); + ? this.$t('objects.save') + : this.$t('objects.saved'); }, disabledSave() { // if there's a validation problem // OR it's edit and any fields haven't changed - return this.checkValidations() || - (!this.itemInstance._dirty && !!this.id); + return this.checkValidations() || (!this.itemInstance._dirty && !!this.id); }, }, @@ -64,7 +63,9 @@ export default { const routeName = this.$route.name.replace('-new', '-edit'); return this.$router.replace({ name: routeName, - params: { id: this.id }, + params: { + id: this.id, + }, hash: this.$route.hash, }); }, diff --git a/src/app/mixins/baseMixins/baseTableMixin/baseTableMixin.js b/src/app/mixins/baseMixins/baseTableMixin/baseTableMixin.js index 2bf9b80f4..06bdf38b8 100644 --- a/src/app/mixins/baseMixins/baseTableMixin/baseTableMixin.js +++ b/src/app/mixins/baseMixins/baseTableMixin/baseTableMixin.js @@ -10,11 +10,7 @@ import tableActionsHandlerMixin from './tableActionsMixin'; * @extends itemLinkMixin, tableActionsHandlerMixin */ export default { - mixins: [ - deleteMixin, - itemLinkMixin, - tableActionsHandlerMixin, - ], + mixins: [deleteMixin, itemLinkMixin, tableActionsHandlerMixin], data: () => ({ isLoaded: false, diff --git a/src/app/mixins/baseMixins/baseTableMixin/itemLinkMixin.js b/src/app/mixins/baseMixins/baseTableMixin/itemLinkMixin.js index deb5801d0..2d1b1aa98 100644 --- a/src/app/mixins/baseMixins/baseTableMixin/itemLinkMixin.js +++ b/src/app/mixins/baseMixins/baseTableMixin/itemLinkMixin.js @@ -7,7 +7,12 @@ export default { methods: { editLink({ id }) { const routeName = this.routeName || this.tableObjectRouteName; - return { name: `${routeName}-edit`, params: { id } }; + return { + name: `${routeName}-edit`, + params: { + id, + }, + }; }, }, }; diff --git a/src/app/mixins/baseMixins/baseTableMixin/tableActionsMixin.js b/src/app/mixins/baseMixins/baseTableMixin/tableActionsMixin.js index c8190ebd2..2a9d1143f 100644 --- a/src/app/mixins/baseMixins/baseTableMixin/tableActionsMixin.js +++ b/src/app/mixins/baseMixins/baseTableMixin/tableActionsMixin.js @@ -31,7 +31,9 @@ export default { this.isFilterFieldsOpened = true; }, resetFilters() { - this.$router.replace({ query: null }); + this.$router.replace({ + query: null, + }); }, }, }; diff --git a/src/app/mixins/baseMixins/openedObjectValidationMixin/openedObjectValidationMixin.js b/src/app/mixins/baseMixins/openedObjectValidationMixin/openedObjectValidationMixin.js index be81b6fe9..66dcc333e 100644 --- a/src/app/mixins/baseMixins/openedObjectValidationMixin/openedObjectValidationMixin.js +++ b/src/app/mixins/baseMixins/openedObjectValidationMixin/openedObjectValidationMixin.js @@ -9,12 +9,11 @@ export default { }, methods: { - checkValidations(validatedInstance = 'itemInstance') { + checkValidations() { const v = this.v$ ? this.v$ : this.v; - v[validatedInstance].$touch(); + v.$touch(); // if its still pending or an error is returned do not submit - return v[validatedInstance].$pending - || v[validatedInstance].$error; + return v.$pending || v.$error; }, }, }; diff --git a/src/app/mixins/navMixin.js b/src/app/mixins/navMixin.js index 0ad784b7a..b96563b98 100644 --- a/src/app/mixins/navMixin.js +++ b/src/app/mixins/navMixin.js @@ -6,7 +6,10 @@ export default { accessibleNav: 'ACCESSIBLE_NAV', }), nav() { - const navWithLocale = (nav) => ({ ...nav, name: this.$t(nav.locale) }); + const navWithLocale = (nav) => ({ + ...nav, + name: this.$t(nav.locale), + }); return this.accessibleNav.map((nav) => { if (nav.subNav) { return { diff --git a/src/app/mixins/objectPagesMixins/historyPopupMixin/historyPopupMixin.js b/src/app/mixins/objectPagesMixins/historyPopupMixin/historyPopupMixin.js index db73c0883..a833ef1b2 100644 --- a/src/app/mixins/objectPagesMixins/historyPopupMixin/historyPopupMixin.js +++ b/src/app/mixins/objectPagesMixins/historyPopupMixin/historyPopupMixin.js @@ -1,5 +1,4 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; import tableComponentMixin from '../objectTableMixin/tableComponentMixin'; diff --git a/src/app/mixins/objectPagesMixins/objectTableMixin/_internals/objectTableAccessControlMixin.js b/src/app/mixins/objectPagesMixins/objectTableMixin/_internals/objectTableAccessControlMixin.js index a61994db4..b393b8195 100644 --- a/src/app/mixins/objectPagesMixins/objectTableMixin/_internals/objectTableAccessControlMixin.js +++ b/src/app/mixins/objectPagesMixins/objectTableMixin/_internals/objectTableAccessControlMixin.js @@ -1,5 +1,4 @@ -import accessControlMixin - from '../../../baseMixins/accessControlMixin/accessControlMixin'; +import accessControlMixin from '../../../baseMixins/accessControlMixin/accessControlMixin'; export default { mixins: [accessControlMixin], diff --git a/src/app/mixins/objectPagesMixins/objectTableMixin/tableComponentMixin.js b/src/app/mixins/objectPagesMixins/objectTableMixin/tableComponentMixin.js index bdd7b100d..331295976 100644 --- a/src/app/mixins/objectPagesMixins/objectTableMixin/tableComponentMixin.js +++ b/src/app/mixins/objectPagesMixins/objectTableMixin/tableComponentMixin.js @@ -1,9 +1,7 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapGetters, mapState } from 'vuex'; import baseTableMixin from '../../baseMixins/baseTableMixin/baseTableMixin'; -import objectTableAccessControlMixin - from './_internals/objectTableAccessControlMixin'; +import objectTableAccessControlMixin from './_internals/objectTableAccessControlMixin'; /** * @fileOverview contains main tables (like the-agents.vue) common logic @@ -46,9 +44,10 @@ export default { let localizedText; // set "false" if no locale prop if (header.locale) { - localizedText = !header.locale || typeof header.locale === 'string' - ? this.$t(header.locale) - : this.$tc(...header.locale); + localizedText = + !header.locale || typeof header.locale === 'string' + ? this.$t(header.locale) + : this.$tc(...header.locale); } return { ...header, @@ -85,13 +84,18 @@ export default { }, }), create() { - this.$router.push({ name: `${this.routeName}-new` }); + this.$router.push({ + name: `${this.routeName}-new`, + }); }, edit(item) { this.$router.push(this.editLink(item)); }, sort(...params) { - this.dispatchSort({ header: params[0], nextSortOrder: params[1] }); + this.dispatchSort({ + header: params[0], + nextSortOrder: params[1], + }); }, }, }; diff --git a/src/app/mixins/objectPagesMixins/openedObjectMixin/_internals/openedObjectAccessControlMixin.js b/src/app/mixins/objectPagesMixins/openedObjectMixin/_internals/openedObjectAccessControlMixin.js index c0ece204e..ac95b6347 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectMixin/_internals/openedObjectAccessControlMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectMixin/_internals/openedObjectAccessControlMixin.js @@ -1,5 +1,4 @@ -import accessControlMixin - from '../../../baseMixins/accessControlMixin/accessControlMixin'; +import accessControlMixin from '../../../baseMixins/accessControlMixin/accessControlMixin'; export default { mixins: [accessControlMixin], diff --git a/src/app/mixins/objectPagesMixins/openedObjectMixin/nestedObjectMixin.js b/src/app/mixins/objectPagesMixins/openedObjectMixin/nestedObjectMixin.js index 1d54c45ea..f97d1d863 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectMixin/nestedObjectMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectMixin/nestedObjectMixin.js @@ -1,5 +1,4 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; import baseObjectMixin from '../../baseMixins/baseObjectMixin/baseObjectMixin'; @@ -44,8 +43,7 @@ export default { await this.addItem(); } this.close(); - } catch { - } + } catch {} } }, diff --git a/src/app/mixins/objectPagesMixins/openedObjectMixin/openedObjectMixin.js b/src/app/mixins/objectPagesMixins/openedObjectMixin/openedObjectMixin.js index 3ac1b23e4..5b265f2d5 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectMixin/openedObjectMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectMixin/openedObjectMixin.js @@ -1,13 +1,9 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; -import Permissions - from '../../../../modules/_shared/permissions-tab/components/permissions-tab.vue'; +import Permissions from '../../../../modules/_shared/permissions-tab/components/permissions-tab.vue'; import baseObjectMixin from '../../baseMixins/baseObjectMixin/baseObjectMixin'; -import headlineNavMixin - from '../../baseMixins/headlineNavMixin/headlineNavMixin'; -import openedObjectAccessControlMixin - from './_internals/openedObjectAccessControlMixin'; +import headlineNavMixin from '../../baseMixins/headlineNavMixin/headlineNavMixin'; +import openedObjectAccessControlMixin from './_internals/openedObjectAccessControlMixin'; /** * @fileOverview contains openedObject (wrapper with tabs, like opened-agent.vue) common logic @@ -16,11 +12,7 @@ import openedObjectAccessControlMixin * @extends baseObjectMixin */ export default { - mixins: [ - openedObjectAccessControlMixin, - headlineNavMixin, - baseObjectMixin, - ], + mixins: [openedObjectAccessControlMixin, headlineNavMixin, baseObjectMixin], components: { Permissions, }, @@ -70,6 +62,11 @@ export default { }, close() { + + // Need to close the tab if it was open in a new tab + // https://webitel.atlassian.net/browse/WTEL-4575 + + if(window.history.length === 1) window.close(); this.$router.go(-1); }, }, diff --git a/src/app/mixins/objectPagesMixins/openedObjectTabMixin/_internals/openedObjectTabAccessControlMixin.js b/src/app/mixins/objectPagesMixins/openedObjectTabMixin/_internals/openedObjectTabAccessControlMixin.js index 46ca8aae2..e7d8ecd58 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectTabMixin/_internals/openedObjectTabAccessControlMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectTabMixin/_internals/openedObjectTabAccessControlMixin.js @@ -1,5 +1,4 @@ -import accessControlMixin - from '../../../baseMixins/accessControlMixin/accessControlMixin'; +import accessControlMixin from '../../../baseMixins/accessControlMixin/accessControlMixin'; export default { mixins: [accessControlMixin], diff --git a/src/app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin.js b/src/app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin.js index 20647dc52..16956f11d 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin.js @@ -1,11 +1,8 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; -import openedObjectValidationMixin - from '../../baseMixins/openedObjectValidationMixin/openedObjectValidationMixin'; -import openedObjectTabAccessControlMixin - from './_internals/openedObjectTabAccessControlMixin'; +import openedObjectValidationMixin from '../../baseMixins/openedObjectValidationMixin/openedObjectValidationMixin'; +import openedObjectTabAccessControlMixin from './_internals/openedObjectTabAccessControlMixin'; /** * @fileOverview contains openedObject tab diff --git a/src/app/mixins/objectPagesMixins/openedObjectTableTabMixin/openedObjectTableTabMixin.js b/src/app/mixins/objectPagesMixins/openedObjectTableTabMixin/openedObjectTableTabMixin.js index fb6579e42..a7a3c6349 100644 --- a/src/app/mixins/objectPagesMixins/openedObjectTableTabMixin/openedObjectTableTabMixin.js +++ b/src/app/mixins/objectPagesMixins/openedObjectTableTabMixin/openedObjectTableTabMixin.js @@ -1,13 +1,9 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapGetters, mapState } from 'vuex'; -import ObjectListPopup - from '../../../components/utils/object-list-popup/object-list-popup.vue'; -import OnePlusMany - from '../../../components/utils/table-cell/one-plus-many-table-cell/one-plus-many-table-cell.vue'; +import ObjectListPopup from '../../../components/utils/object-list-popup/object-list-popup.vue'; +import OnePlusMany from '../../../components/utils/table-cell/one-plus-many-table-cell/one-plus-many-table-cell.vue'; import baseTableMixin from '../../baseMixins/baseTableMixin/baseTableMixin'; -import openedTabComponentMixin - from '../openedObjectTabMixin/openedTabComponentMixin'; +import openedTabComponentMixin from '../openedObjectTabMixin/openedTabComponentMixin'; /** * @fileOverview contains openedObject tab with table @@ -61,9 +57,8 @@ export default { if (!this.headersValue) return []; return this.headersValue.map((header) => ({ ...header, - text: typeof header.locale === 'string' - ? this.$t(header.locale) - : this.$tc(...header.locale), + text: + typeof header.locale === 'string' ? this.$t(header.locale) : this.$tc(...header.locale), })); }, }, @@ -123,7 +118,9 @@ export default { const routeName = this.$route.name.replace('-new', '-edit'); await this.$router.replace({ name: routeName, - params: { id: this.parentId }, + params: { + id: this.parentId, + }, }); } this.openPopup(); @@ -143,7 +140,10 @@ export default { this.openPopup(); }, sort(...params) { - this.dispatchSort({ header: params[0], nextSortOrder: params[1] }); + this.dispatchSort({ + header: params[0], + nextSortOrder: params[1], + }); }, }, }; diff --git a/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabMixin.js b/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabMixin.js index 5f08154c8..f067df305 100644 --- a/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabMixin.js +++ b/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabMixin.js @@ -1,11 +1,8 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; -import AccessMode - from '../../../../modules/permissions/modules/objects/store/_internals/enums/AccessMode.enum'; +import AccessMode from '../../../../modules/permissions/modules/objects/store/_internals/enums/AccessMode.enum'; import tableComponentMixin from '../objectTableMixin/tableComponentMixin'; -import openedTabComponentMixin - from '../openedObjectTabMixin/openedTabComponentMixin'; +import openedTabComponentMixin from '../openedObjectTabMixin/openedTabComponentMixin'; export default { mixins: [openedTabComponentMixin, tableComponentMixin], @@ -44,9 +41,8 @@ export default { if (!this.headersValue) return []; return this.headersValue.map((header) => ({ ...header, - text: typeof header.locale === 'string' - ? this.$t(header.locale) - : this.$tc(...header.locale), + text: + typeof header.locale === 'string' ? this.$t(header.locale) : this.$tc(...header.locale), })); }, dataList() { @@ -58,7 +54,10 @@ export default { name: this.$t(`objects.permissions.object.accessMode.${item.access[rule].id}`), }; }); - return { ...item, access }; + return { + ...item, + access, + }; }); }, accessOptions() { @@ -93,16 +92,25 @@ export default { return dispatch(`${this.namespace}/${this.subNamespace}/SORT`, payload); }, changeCreateAccessMode(dispatch, payload) { - return dispatch(`${this.namespace}/${this.subNamespace}/CHANGE_CREATE_ACCESS_MODE`, payload); + return dispatch( + `${this.namespace}/${this.subNamespace}/CHANGE_CREATE_ACCESS_MODE`, + payload, + ); }, changeReadAccessMode(dispatch, payload) { return dispatch(`${this.namespace}/${this.subNamespace}/CHANGE_READ_ACCESS_MODE`, payload); }, changeUpdateAccessMode(dispatch, payload) { - return dispatch(`${this.namespace}/${this.subNamespace}/CHANGE_UPDATE_ACCESS_MODE`, payload); + return dispatch( + `${this.namespace}/${this.subNamespace}/CHANGE_UPDATE_ACCESS_MODE`, + payload, + ); }, changeDeleteAccessMode(dispatch, payload) { - return dispatch(`${this.namespace}/${this.subNamespace}/CHANGE_DELETE_ACCESS_MODE`, payload); + return dispatch( + `${this.namespace}/${this.subNamespace}/CHANGE_DELETE_ACCESS_MODE`, + payload, + ); }, resetState(dispatch, payload) { return dispatch(`${this.namespace}/${this.subNamespace}/RESET_ITEM_STATE`, payload); diff --git a/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabRolePopupMixin.js b/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabRolePopupMixin.js index f2caff7a4..fed0427d5 100644 --- a/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabRolePopupMixin.js +++ b/src/app/mixins/objectPagesMixins/permissionsTabMixin/permissionsTabRolePopupMixin.js @@ -1,5 +1,4 @@ -import getNamespacedState - from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; +import getNamespacedState from '@webitel/ui-sdk/src/store/helpers/getNamespacedState'; import { mapActions, mapState } from 'vuex'; import RolesAPI from '../../../../modules/permissions/modules/roles/api/roles'; @@ -42,13 +41,17 @@ export default { // filter new roles async getAvailableGrantees(params) { const roles = await this.loadRoles(params); - roles.items = roles.items.filter((role) => ( - !this.dataList.some((usedRoles) => role.id === usedRoles.grantee.id))); + roles.items = roles.items.filter( + (role) => !this.dataList.some((usedRoles) => role.id === usedRoles.grantee.id), + ); return roles; }, async loadRoles(params) { const fields = ['name', 'id', 'user']; - return RolesAPI.getExtendedRoles({ ...params, fields }); + return RolesAPI.getExtendedRoles({ + ...params, + fields, + }); }, close() { this.$emit('close'); diff --git a/src/app/plugins/breakpoint.js b/src/app/plugins/breakpoint.js index bace09850..6752a6d1d 100644 --- a/src/app/plugins/breakpoint.js +++ b/src/app/plugins/breakpoint.js @@ -1,5 +1,3 @@ -import { - install, -} from '@webitel/ui-sdk/src/plugins/breakpoint/breakpoint.plugin'; +import { install } from '@webitel/ui-sdk/src/plugins/breakpoint/breakpoint.plugin'; export default { install }; diff --git a/src/app/plugins/webitel-ui.js b/src/app/plugins/webitel-ui.js index 0edd2e95d..633b882b1 100644 --- a/src/app/plugins/webitel-ui.js +++ b/src/app/plugins/webitel-ui.js @@ -1,8 +1,8 @@ -import '@webitel/ui-sdk/dist/img/sprite'; +// import '@webitel/ui-sdk/dist/img/sprite'; // import styles import '@webitel/ui-sdk/dist/ui-sdk.css'; -import WebitelUI from '@webitel/ui-sdk/dist/ui-sdk.mjs'; +import WebitelUI from '@webitel/ui-sdk/dist/ui-sdk.js'; // import locale import WebitelUIEn from '@webitel/ui-sdk/src/locale/en/en'; diff --git a/src/app/router/_internals/NavigationPages.lookup.js b/src/app/router/_internals/NavigationPages.lookup.js index 70a5c4b18..a1feceb82 100644 --- a/src/app/router/_internals/NavigationPages.lookup.js +++ b/src/app/router/_internals/NavigationPages.lookup.js @@ -1,7 +1,5 @@ -import AdminSections - from '@webitel/ui-sdk/src/enums/WebitelApplications/AdminSections.enum'; -import WebitelApplications - from '@webitel/ui-sdk/src/enums/WebitelApplications/WebitelApplications.enum'; +import AdminSections from '@webitel/ui-sdk/src/enums/WebitelApplications/AdminSections.enum'; +import WebitelApplications from '@webitel/ui-sdk/src/enums/WebitelApplications/WebitelApplications.enum'; const nav = Object.freeze([ { @@ -13,11 +11,13 @@ const nav = Object.freeze([ value: AdminSections.LICENSE, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.LICENSE}`, route: 'license', - }, { + }, + { value: AdminSections.USERS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.USERS}`, route: 'users', - }, { + }, + { value: AdminSections.DEVICES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.DEVICES}`, route: 'devices', @@ -33,25 +33,30 @@ const nav = Object.freeze([ value: AdminSections.FLOW, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.FLOW}`, route: 'flow', - }, { + }, + { value: AdminSections.DIALPLAN, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.DIALPLAN}`, route: 'dialplan', - }, { + }, + { value: AdminSections.GATEWAYS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.GATEWAYS}`, route: 'sip-gateways', - }, { + }, + { value: AdminSections.CHATPLAN, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.CHATPLAN}`, route: 'chatplan', - }, { + }, + { value: AdminSections.CHAT_GATEWAYS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.CHAT_GATEWAYS}`, route: 'chat-gateways', }, ], - }, { + }, + { value: 'lookups', locale: 'nav.lookups.lookups', route: '/lookups', @@ -60,37 +65,45 @@ const nav = Object.freeze([ value: AdminSections.SKILLS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.SKILLS}`, route: 'skills', - }, { + }, + { value: AdminSections.BUCKETS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.BUCKETS}`, route: 'buckets', - }, { + }, + { value: AdminSections.BLACKLIST, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.BLACKLIST}`, route: 'blacklist', - }, { + }, + { value: AdminSections.REGIONS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.REGIONS}`, route: 'regions', - }, { + }, + { value: AdminSections.CALENDARS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.CALENDARS}`, route: 'calendars', - }, { + }, + { value: AdminSections.COMMUNICATIONS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.COMMUNICATIONS}`, route: 'communications', - }, { + }, + { value: AdminSections.PAUSE_CAUSE, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.PAUSE_CAUSE}`, route: 'pause-cause', - }, { + }, + { value: AdminSections.MEDIA, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.MEDIA}`, route: 'media', }, ], - }, { + }, + { value: 'contact-center', locale: 'nav.ccenter.ccenter', route: '/contact-center', @@ -99,25 +112,30 @@ const nav = Object.freeze([ value: AdminSections.AGENTS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.AGENTS}`, route: 'agents', - }, { + }, + { value: AdminSections.TEAMS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.TEAMS}`, route: 'teams', - }, { + }, + { value: AdminSections.RESOURCES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.RESOURCES}`, route: 'resources', - }, { + }, + { value: AdminSections.RESOURCE_GROUPS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.RESOURCE_GROUPS}`, route: 'resource-groups', - }, { + }, + { value: AdminSections.QUEUES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.QUEUES}`, route: 'queues', }, ], - }, { + }, + { value: 'integrations', locale: 'nav.integrations.integrations', route: '/integrations', @@ -126,11 +144,13 @@ const nav = Object.freeze([ value: AdminSections.STORAGE, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.STORAGE}`, route: 'storage', - }, { + }, + { value: AdminSections.COGNITIVE_PROFILES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.COGNITIVE_PROFILES}`, route: 'cognitive-profiles', - }, { + }, + { value: AdminSections.EMAIL_PROFILES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.EMAIL_PROFILES}`, route: 'email-profiles', @@ -145,13 +165,15 @@ const nav = Object.freeze([ value: AdminSections.IMPORT_CSV, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.IMPORT_CSV}`, route: 'import-csv', - }, { + }, + { value: AdminSections.TRIGGERS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.TRIGGERS}`, route: 'triggers', }, ], - }, { + }, + { value: 'permissions', locale: 'nav.permissions.permissions', route: '/permissions', @@ -160,13 +182,15 @@ const nav = Object.freeze([ value: AdminSections.ROLES, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.ROLES}`, route: 'roles', - }, { + }, + { value: AdminSections.OBJECTS, locale: `WebitelApplications.${WebitelApplications.ADMIN}.sections.${AdminSections.OBJECTS}`, route: 'objects', }, ], - }, { + }, + { value: 'system', locale: 'nav.system.system', route: '/system', diff --git a/src/app/router/router.js b/src/app/router/router.js index 1bfa7b225..5f985f403 100755 --- a/src/app/router/router.js +++ b/src/app/router/router.js @@ -6,76 +6,139 @@ const ApplicationHub = () => import('../../modules/application-hub/components/ap const ModuleWrap = () => import('../../modules/_shared/object-wrap/the-object-wrap.vue'); const StartPage = () => import('../../modules/start-page/components/the-start-page.vue'); const Settings = () => import('../../modules/settings/components/the-settings.vue'); -const AccessDenied = () => import('../../modules/error-pages/components/the-access-denied-component.vue'); +const AccessDenied = () => + import('../../modules/error-pages/components/the-access-denied-component.vue'); const NotFound = () => import('../../modules/error-pages/components/the-not-found-component.vue'); -const PermissionsRoles = () => import('../../modules/permissions/modules/roles/components/the-roles.vue'); -const OpenedPermissionsRoles = () => import('../../modules/permissions/modules/roles/components/opened-role.vue'); -const PermissionsObjects = () => import('../../modules/permissions/modules/objects/components/the-objects-permissions.vue'); -const OpenedPermissionsObjects = () => import('../../modules/permissions/modules/objects/components/opened-object-permissions.vue'); +const PermissionsRoles = () => + import('../../modules/permissions/modules/roles/components/the-roles.vue'); +const OpenedPermissionsRoles = () => + import('../../modules/permissions/modules/roles/components/opened-role.vue'); +const PermissionsObjects = () => + import('../../modules/permissions/modules/objects/components/the-objects-permissions.vue'); +const OpenedPermissionsObjects = () => + import('../../modules/permissions/modules/objects/components/opened-object-permissions.vue'); const Devices = () => import('../../modules/directory/modules/devices/components/the-devices.vue'); -const OpenedDevice = () => import('../../modules/directory/modules/devices/components/opened-device.vue'); +const OpenedDevice = () => + import('../../modules/directory/modules/devices/components/opened-device.vue'); const Users = () => import('../../modules/directory/modules/users/components/the-users.vue'); const OpenedUser = () => import('../../modules/directory/modules/users/components/opened-user.vue'); const License = () => import('../../modules/directory/modules/license/components/the-license.vue'); -const Blacklists = () => import('../../modules/lookups/modules/blacklists/components/the-blacklists.vue'); +const Blacklists = () => + import('../../modules/lookups/modules/blacklists/components/the-blacklists.vue'); const Media = () => import('../../modules/lookups/modules/media/components/the-media.vue'); -const OpenedBlacklist = () => import('../../modules/lookups/modules/blacklists/components/opened-blacklist.vue'); -const Calendars = () => import('../../modules/lookups/modules/calendars/components/the-calendars.vue'); -const OpenedCalendar = () => import('../../modules/lookups/modules/calendars/components/opened-calendar.vue'); -const CommunicationTypes = () => import('../../modules/lookups/modules/communications/components/the-communication-types.vue'); -const OpenedCommunicationType = () => import('../../modules/lookups/modules/communications/components/opened-communication-type.vue'); +const OpenedBlacklist = () => + import('../../modules/lookups/modules/blacklists/components/opened-blacklist.vue'); +const Calendars = () => + import('../../modules/lookups/modules/calendars/components/the-calendars.vue'); +const OpenedCalendar = () => + import('../../modules/lookups/modules/calendars/components/opened-calendar.vue'); +const CommunicationTypes = () => + import('../../modules/lookups/modules/communications/components/the-communication-types.vue'); +const OpenedCommunicationType = () => + import('../../modules/lookups/modules/communications/components/opened-communication-type.vue'); const Regions = () => import('../../modules/lookups/modules/regions/components/the-regions.vue'); -const OpenedRegion = () => import('../../modules/lookups/modules/regions/components/opened-region.vue'); -const AgentPauseCause = () => import('../../modules/lookups/modules/agent-pause-cause/components/the-agent-pause-cause.vue'); -const OpenedAgentPauseCause = () => import('../../modules/lookups/modules/agent-pause-cause/components/opened-agent-pause-cause.vue'); -const SipGateways = () => import('../../modules/routing/modules/gateways/components/the-sip-gateways.vue'); -const OpenedGateway = () => import('../../modules/routing/modules/gateways/components/opened-sip-gateway.vue'); -const ChatGateways = () => import('../../modules/routing/modules/chat-gateways/components/the-chat-gateways.vue'); -const OpenedChatGateways = () => import('../../modules/routing/modules/chat-gateways/components/opened-chat-gateway.vue'); +const OpenedRegion = () => + import('../../modules/lookups/modules/regions/components/opened-region.vue'); +const AgentPauseCause = () => + import('../../modules/lookups/modules/agent-pause-cause/components/the-agent-pause-cause.vue'); +const OpenedAgentPauseCause = () => + import('../../modules/lookups/modules/agent-pause-cause/components/opened-agent-pause-cause.vue'); +const SipGateways = () => + import('../../modules/routing/modules/gateways/components/the-sip-gateways.vue'); +const OpenedGateway = () => + import('../../modules/routing/modules/gateways/components/opened-sip-gateway.vue'); +const ChatGateways = () => + import('../../modules/routing/modules/chat-gateways/components/the-chat-gateways.vue'); +const OpenedChatGateways = () => + import('../../modules/routing/modules/chat-gateways/components/opened-chat-gateway.vue'); const Flow = () => import('../../modules/routing/modules/flow/components/the-flow.vue'); const OpenedFlow = () => import('../../modules/routing/modules/flow/components/opened-flow.vue'); const Dialplan = () => import('../../modules/routing/modules/dialplan/components/the-dialplan.vue'); -const OpenedDialplan = () => import('../../modules/routing/modules/dialplan/components/opened-dialplan.vue'); +const OpenedDialplan = () => + import('../../modules/routing/modules/dialplan/components/opened-dialplan.vue'); const Chatplan = () => import('../../modules/routing/modules/chatplan/components/the-chatplan.vue'); -const OpenedChatplan = () => import('../../modules/routing/modules/chatplan/components/opened-chatplan.vue'); -const TheResources = () => import('../../modules/contact-center/modules/resources/components/the-resources.vue'); -const OpenedResource = () => import('../../modules/contact-center/modules/resources/components/opened-resource.vue'); -const ResourceGroups = () => import('../../modules/contact-center/modules/resource-groups/components/the-resource-groups.vue'); -const OpenedResourceGroup = () => import('../../modules/contact-center/modules/resource-groups/components/opened-resource-group.vue'); -const Agents = () => import('../../modules/contact-center/modules/agents/components/the-agents.vue'); -const OpenedAgent = () => import('../../modules/contact-center/modules/agents/components/opened-agent.vue'); +const OpenedChatplan = () => + import('../../modules/routing/modules/chatplan/components/opened-chatplan.vue'); +const TheResources = () => + import('../../modules/contact-center/modules/resources/components/the-resources.vue'); +const OpenedResource = () => + import('../../modules/contact-center/modules/resources/components/opened-resource.vue'); +const ResourceGroups = () => + import('../../modules/contact-center/modules/resource-groups/components/the-resource-groups.vue'); +const OpenedResourceGroup = () => + import( + '../../modules/contact-center/modules/resource-groups/components/opened-resource-group.vue' + ); +const Agents = () => + import('../../modules/contact-center/modules/agents/components/the-agents.vue'); +const OpenedAgent = () => + import('../../modules/contact-center/modules/agents/components/opened-agent.vue'); const Teams = () => import('../../modules/contact-center/modules/teams/components/the-teams.vue'); -const OpenedTeam = () => import('../../modules/contact-center/modules/teams/components/opened-team.vue'); -const AgentSkills = () => import('../../modules/lookups/modules/agent-skills/components/the-agent-skills.vue'); -const OpenedAgentSkill = () => import('../../modules/lookups/modules/agent-skills/components/opened-agent-skill.vue'); +const OpenedTeam = () => + import('../../modules/contact-center/modules/teams/components/opened-team.vue'); +const AgentSkills = () => + import('../../modules/lookups/modules/agent-skills/components/the-agent-skills.vue'); +const OpenedAgentSkill = () => + import('../../modules/lookups/modules/agent-skills/components/opened-agent-skill.vue'); const Buckets = () => import('../../modules/lookups/modules/buckets/components/the-buckets.vue'); -const OpenedBucket = () => import('../../modules/lookups/modules/buckets/components/opened-bucket.vue'); -const Queues = () => import('../../modules/contact-center/modules/queues/components/the-queues.vue'); -const Members = () => import('../../modules/contact-center/modules/queues/modules/members/components/the-queue-members.vue'); -const OpenedMember = () => import('../../modules/contact-center/modules/queues/modules/members/components/opened-queue-member.vue'); -const OpenedQueue = () => import('../../modules/contact-center/modules/queues/components/opened-queue.vue'); -const Storage = () => import('../../modules/integrations/modules/storage/components/the-storage.vue'); -const OpenedStorage = () => import('../../modules/integrations/modules/storage/components/opened-storage.vue'); -const CognitiveProfiles = () => import('../../modules/integrations/modules/cognitive-profiles/components/the-cognitive-profiles.vue'); -const EmailProfiles = () => import('../../modules/integrations/modules/email-profiles/components/the-email-profiles.vue'); -const SingleSignOn = () => import('../../modules/integrations/modules/single-sign-on/components/the-single-sign-on.vue'); -const ImportCsv = () => import('../../modules/integrations/modules/import-csv/components/the-import-csv.vue'); -const Triggers = () => import('../../modules/integrations/modules/triggers/components/the-triggers.vue'); -const OpenedCognitiveProfile = () => import('../../modules/integrations/modules/cognitive-profiles/components/opened-cognitive-profile.vue'); -const OpenedEmailProfile = () => import('../../modules/integrations/modules/email-profiles/components/opened-email-profile.vue'); -const OpenedSingleSignOn = () => import('../../modules/integrations/modules/single-sign-on/components/opened-single-sign-on.vue'); -const OpenedImportCsv = () => import('../../modules/integrations/modules/import-csv/components/opened-import-csv.vue'); -const OpenedTrigger = () => import('../../modules/integrations/modules/triggers/components/opened-trigger.vue'); -const Changelogs = () => import('../../modules/system/modules/changelogs/components/the-changelogs.vue'); -const OpenedChangelog = () => import('../../modules/system/modules/changelogs/components/opened-changelog.vue'); -const Configuration = () => import('../../modules/system/modules/configuration/components/the-configuration.vue'); -const GlobalVariables = () => import('../../modules/system/modules/global-variables/components/the-global-variables.vue'); +const OpenedBucket = () => + import('../../modules/lookups/modules/buckets/components/opened-bucket.vue'); +const Queues = () => + import('../../modules/contact-center/modules/queues/components/the-queues.vue'); +const Members = () => + import( + '../../modules/contact-center/modules/queues/modules/members/components/the-queue-members.vue' + ); +const OpenedMember = () => + import( + '../../modules/contact-center/modules/queues/modules/members/components/opened-queue-member.vue' + ); +const OpenedQueue = () => + import('../../modules/contact-center/modules/queues/components/opened-queue.vue'); +const Storage = () => + import('../../modules/integrations/modules/storage/components/the-storage.vue'); +const OpenedStorage = () => + import('../../modules/integrations/modules/storage/components/opened-storage.vue'); +const CognitiveProfiles = () => + import( + '../../modules/integrations/modules/cognitive-profiles/components/the-cognitive-profiles.vue' + ); +const EmailProfiles = () => + import('../../modules/integrations/modules/email-profiles/components/the-email-profiles.vue'); +const SingleSignOn = () => + import('../../modules/integrations/modules/single-sign-on/components/the-single-sign-on.vue'); +const ImportCsv = () => + import('../../modules/integrations/modules/import-csv/components/the-import-csv.vue'); +const Triggers = () => + import('../../modules/integrations/modules/triggers/components/the-triggers.vue'); +const OpenedCognitiveProfile = () => + import( + '../../modules/integrations/modules/cognitive-profiles/components/opened-cognitive-profile.vue' + ); +const OpenedEmailProfile = () => + import('../../modules/integrations/modules/email-profiles/components/opened-email-profile.vue'); +const OpenedSingleSignOn = () => + import('../../modules/integrations/modules/single-sign-on/components/opened-single-sign-on.vue'); +const OpenedImportCsv = () => + import('../../modules/integrations/modules/import-csv/components/opened-import-csv.vue'); +const OpenedTrigger = () => + import('../../modules/integrations/modules/triggers/components/opened-trigger.vue'); +const Changelogs = () => + import('../../modules/system/modules/changelogs/components/the-changelogs.vue'); +const OpenedChangelog = () => + import('../../modules/system/modules/changelogs/components/opened-changelog.vue'); +const Configuration = () => + import('../../modules/system/modules/configuration/components/the-configuration.vue'); +const GlobalVariables = () => + import('../../modules/system/modules/global-variables/components/the-global-variables.vue'); const checkAppAccess = (to, from, next) => { // check for === false because it can be undefined if (to.meta.requiresAccess === false) next(); - const hasReadAccess = store.getters['userinfo/CHECK_APP_ACCESS'](store.getters['userinfo/THIS_APP']); + const hasReadAccess = store.getters['userinfo/CHECK_APP_ACCESS']( + store.getters['userinfo/THIS_APP'], + ); if (hasReadAccess) { next(); } else { @@ -83,14 +146,16 @@ const checkAppAccess = (to, from, next) => { } }; -const checkRouteAccess = ((to, from, next) => { - const hasReadAccess = store.getters['userinfo/HAS_READ_ACCESS']({ route: to }); +const checkRouteAccess = (to, from, next) => { + const hasReadAccess = store.getters['userinfo/HAS_READ_ACCESS']({ + route: to, + }); if (hasReadAccess) { next(); } else { next('/access-denied'); } -}); +}; const router = createRouter({ history: createWebHistory(import.meta.env.BASE_URL), @@ -742,7 +807,7 @@ router.beforeEach((to, from, next) => { } else if (to.query.accessToken) { // assume that access token was set from query before app initialization in main.js const newQuery = { ...to.query }; - delete newQuery.accessToken; + newQuery.accessToken = undefined; next({ ...to, query: newQuery }); } else { next(); diff --git a/src/app/store/BaseStoreModules/StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin.js b/src/app/store/BaseStoreModules/StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin.js index e9e97ff5e..f012be2bb 100644 --- a/src/app/store/BaseStoreModules/StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin.js +++ b/src/app/store/BaseStoreModules/StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin.js @@ -22,7 +22,10 @@ const actions = { }, SET_ITEM_PROPERTY: (context, payload) => { context.commit('SET_ITEM_PROPERTY', payload); - context.commit('SET_ITEM_PROPERTY', { prop: '_dirty', value: true }); + context.commit('SET_ITEM_PROPERTY', { + prop: '_dirty', + value: true, + }); }, RESET_ITEM_STATE: async (context) => { context.commit('RESET_ITEM_STATE'); diff --git a/src/app/store/BaseStoreModules/StoreModuleMixins/BaseTableStoreModuleMixin.js b/src/app/store/BaseStoreModules/StoreModuleMixins/BaseTableStoreModuleMixin.js index b8333dd51..3a66847a9 100644 --- a/src/app/store/BaseStoreModules/StoreModuleMixins/BaseTableStoreModuleMixin.js +++ b/src/app/store/BaseStoreModules/StoreModuleMixins/BaseTableStoreModuleMixin.js @@ -1,7 +1,4 @@ -import { - SortSymbols, - sortToQueryAdapter, -} from '@webitel/ui-sdk/src/scripts/sortQueryAdapters'; +import { SortSymbols, sortToQueryAdapter } from '@webitel/ui-sdk/src/scripts/sortQueryAdapters'; import deepCopy from 'deep-copy'; const state = { @@ -32,25 +29,26 @@ const actions = { */ context.commit('SET_IS_NEXT', false); - const query = { ...context.getters['filters/GET_FILTERS'], ..._query }; + const query = { + ...context.getters['filters/GET_FILTERS'], + ..._query, + }; try { - let { - items = [], - next = false, - aggs = {}, - } = await context.dispatch('GET_LIST', query); + let { items = [], next = false, aggs = {} } = await context.dispatch('GET_LIST', query); /* [https://my.webitel.com/browse/WTEL-3793] - * When deleting the last item from list, - * if there are other items on the previous page, you need to go back */ - if (!items.length && context.state.page > - 1) return context.dispatch('PREV_PAGE'); + * When deleting the last item from list, + * if there are other items on the previous page, you need to go back */ + if (!items.length && context.state.page > 1) return context.dispatch('PREV_PAGE'); /* we should set _isSelected property to all items in tables cause their checkbox selection - * is based on this property. Previously, this prop was set it api consumers, but now - * admin-specific were replaced by webitel-sdk consumers and i supposed it will be - * weird to set this property in each api file through defaultListObject */ - items = items.map((item) => ({ ...item, _isSelected: false })); + * is based on this property. Previously, this prop was set it api consumers, but now + * admin-specific were replaced by webitel-sdk consumers and i supposed it will be + * weird to set this property in each api file through defaultListObject */ + items = items.map((item) => ({ + ...item, + _isSelected: false, + })); const afterHook = await context.dispatch('BEFORE_SET_DATA_LIST_HOOK', { items, @@ -95,7 +93,10 @@ const actions = { ? `${sortToQueryAdapter(nextSortOrder)}${header.field}` : nextSortOrder; context.commit('SET_SORT', sort); - context.dispatch('UPDATE_HEADER_SORT', { header, nextSortOrder }); + context.dispatch('UPDATE_HEADER_SORT', { + header, + nextSortOrder, + }); await context.dispatch('RESET_PAGE'); return context.dispatch('LOAD_DATA_LIST'); }, @@ -105,25 +106,31 @@ const actions = { if (oldHeader.sort !== undefined) { return { ...oldHeader, - sort: oldHeader.field === header.field - ? nextSortOrder - : SortSymbols.NONE, + sort: oldHeader.field === header.field ? nextSortOrder : SortSymbols.NONE, }; } return oldHeader; }); context.commit('SET_HEADERS', headers); }, - PATCH_ITEM_PROPERTY: async (context, { - item, index, prop, value, - }) => { - await context.commit('PATCH_ITEM_PROPERTY', { index, prop, value }); + PATCH_ITEM_PROPERTY: async (context, { item, index, prop, value }) => { + await context.commit('PATCH_ITEM_PROPERTY', { + index, + prop, + value, + }); const id = item?.id || context.state.dataList[index].id; const changes = { [prop]: value }; try { - await context.dispatch('PATCH_ITEM', { id, changes }); + await context.dispatch('PATCH_ITEM', { + id, + changes, + }); context.commit('PATCH_ITEM_PROPERTY', { - item, index, prop, value, + item, + index, + prop, + value, }); } catch { context.dispatch('LOAD_DATA_LIST'); @@ -150,10 +157,8 @@ const actions = { throw err; } }, - DELETE_BULK: async ( - context, - deleted, - ) => Promise.allSettled(deleted.map((item) => context.dispatch('DELETE_SINGLE', item))), + DELETE_BULK: async (context, deleted) => + Promise.allSettled(deleted.map((item) => context.dispatch('DELETE_SINGLE', item))), // REMOVE_ITEM: async (context, index) => { // const id = context.state.dataList[index].id; // context.commit('REMOVE_ITEM', index); diff --git a/src/app/store/BaseStoreModules/StoreModules/HistoryStoreModule/HistoryStoreModule.js b/src/app/store/BaseStoreModules/StoreModules/HistoryStoreModule/HistoryStoreModule.js index bec40d20c..4076e9969 100644 --- a/src/app/store/BaseStoreModules/StoreModules/HistoryStoreModule/HistoryStoreModule.js +++ b/src/app/store/BaseStoreModules/StoreModules/HistoryStoreModule/HistoryStoreModule.js @@ -1,7 +1,5 @@ -import BaseStoreModule - from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; -import BaseOpenedInstanceModule - from '../../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; +import BaseStoreModule from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; +import BaseOpenedInstanceModule from '../../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; import BaseTableModule from '../../StoreModuleMixins/BaseTableStoreModuleMixin'; export class HistoryStoreModule extends BaseStoreModule { diff --git a/src/app/store/BaseStoreModules/StoreModules/NestedObjectStoreModule.js b/src/app/store/BaseStoreModules/StoreModules/NestedObjectStoreModule.js index fcd283ac5..b2bf611b7 100644 --- a/src/app/store/BaseStoreModules/StoreModules/NestedObjectStoreModule.js +++ b/src/app/store/BaseStoreModules/StoreModules/NestedObjectStoreModule.js @@ -1,8 +1,6 @@ -import BaseStoreModule - from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; +import BaseStoreModule from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; import deepCopy from 'deep-copy'; -import BaseOpenedInstanceModule - from '../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; +import BaseOpenedInstanceModule from '../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; import BaseTableModule from '../StoreModuleMixins/BaseTableStoreModuleMixin'; const DEFAULT_STATE = BaseTableModule.generateState(); @@ -10,12 +8,8 @@ const DEFAULT_ITEM_STATE = BaseOpenedInstanceModule.generateState(); export default class NestedObjectStoreModule extends BaseStoreModule { getters = { - GET_ITEM_BY_ID: (state) => (itemId) => ( - state.dataList.find((item) => item.id === itemId) - ), - GET_ITEM_PROP_BY_ID: (state, getters) => (itemId, prop) => ( - getters.GET_ITEM_BY_ID(itemId)[prop] - ), + GET_ITEM_BY_ID: (state) => (itemId) => state.dataList.find((item) => item.id === itemId), + GET_ITEM_PROP_BY_ID: (state, getters) => (itemId, prop) => getters.GET_ITEM_BY_ID(itemId)[prop], }; actions = { @@ -55,11 +49,21 @@ export default class NestedObjectStoreModule extends BaseStoreModule { constructor({ resettableState, resettableItemState, headers } = {}) { super(); const state = { parentId: 0 }; - this._resettableState = () => deepCopy({ - ...DEFAULT_STATE, ...resettableState, - headers, - }); - this._resettableItemState = () => deepCopy({ ...DEFAULT_ITEM_STATE, ...resettableItemState }); - this.state = { ...state, ...this._resettableState(), ...this._resettableItemState() }; + this._resettableState = () => + deepCopy({ + ...DEFAULT_STATE, + ...resettableState, + headers, + }); + this._resettableItemState = () => + deepCopy({ + ...DEFAULT_ITEM_STATE, + ...resettableItemState, + }); + this.state = { + ...state, + ...this._resettableState(), + ...this._resettableItemState(), + }; } } diff --git a/src/app/store/BaseStoreModules/StoreModules/ObjectStoreModule.js b/src/app/store/BaseStoreModules/StoreModules/ObjectStoreModule.js index d004ed654..a0b2ee038 100644 --- a/src/app/store/BaseStoreModules/StoreModules/ObjectStoreModule.js +++ b/src/app/store/BaseStoreModules/StoreModules/ObjectStoreModule.js @@ -1,8 +1,6 @@ -import BaseStoreModule - from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; +import BaseStoreModule from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; import deepCopy from 'deep-copy'; -import BaseOpenedInstanceModule - from '../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; +import BaseOpenedInstanceModule from '../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; import BaseTableModule from '../StoreModuleMixins/BaseTableStoreModuleMixin'; export default class ObjectStoreModule extends BaseStoreModule { @@ -40,10 +38,11 @@ export default class ObjectStoreModule extends BaseStoreModule { constructor({ resettableState, headers } = {}) { super(); - this._resettableState = () => deepCopy({ - ...BaseOpenedInstanceModule.generateState(), - ...resettableState, - }); + this._resettableState = () => + deepCopy({ + ...BaseOpenedInstanceModule.generateState(), + ...resettableState, + }); this.state = { ...BaseTableModule.generateState(), headers, diff --git a/src/app/store/BaseStoreModules/StoreModules/PermissionsStoreModule/PermissionsStoreModule.js b/src/app/store/BaseStoreModules/StoreModules/PermissionsStoreModule/PermissionsStoreModule.js index deb72e8b6..85d414c18 100644 --- a/src/app/store/BaseStoreModules/StoreModules/PermissionsStoreModule/PermissionsStoreModule.js +++ b/src/app/store/BaseStoreModules/StoreModules/PermissionsStoreModule/PermissionsStoreModule.js @@ -1,11 +1,7 @@ -import BaseStoreModule - from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; -import PermissionsAPI - from '../../../../../modules/_shared/permissions-tab/api/PermissionsAPI'; -import AccessMode - from '../../../../../modules/permissions/modules/objects/store/_internals/enums/AccessMode.enum'; -import BaseOpenedInstanceModule - from '../../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; +import BaseStoreModule from '@webitel/ui-sdk/src/store/BaseStoreModules/BaseStoreModule'; +import PermissionsAPI from '../../../../../modules/_shared/permissions-tab/api/PermissionsAPI'; +import AccessMode from '../../../../../modules/permissions/modules/objects/store/_internals/enums/AccessMode.enum'; +import BaseOpenedInstanceModule from '../../StoreModuleMixins/BaseOpenedInstanceStoreModuleMixin'; import BaseTableModule from '../../StoreModuleMixins/BaseTableStoreModuleMixin'; import defaultHeaders from './_internals/headers'; @@ -18,22 +14,26 @@ export class PermissionsStoreModule extends BaseStoreModule { ...BaseTableModule.getActions(), ...BaseOpenedInstanceModule.getActions(), - CHANGE_CREATE_ACCESS_MODE: ( - context, - payload, - ) => context.dispatch('CHANGE_ACCESS_MODE', { ruleName: 'x', ...payload }), - CHANGE_READ_ACCESS_MODE: ( - context, - payload, - ) => context.dispatch('CHANGE_ACCESS_MODE', { ruleName: 'r', ...payload }), - CHANGE_UPDATE_ACCESS_MODE: ( - context, - payload, - ) => context.dispatch('CHANGE_ACCESS_MODE', { ruleName: 'w', ...payload }), - CHANGE_DELETE_ACCESS_MODE: ( - context, - payload, - ) => context.dispatch('CHANGE_ACCESS_MODE', { ruleName: 'd', ...payload }), + CHANGE_CREATE_ACCESS_MODE: (context, payload) => + context.dispatch('CHANGE_ACCESS_MODE', { + ruleName: 'x', + ...payload, + }), + CHANGE_READ_ACCESS_MODE: (context, payload) => + context.dispatch('CHANGE_ACCESS_MODE', { + ruleName: 'r', + ...payload, + }), + CHANGE_UPDATE_ACCESS_MODE: (context, payload) => + context.dispatch('CHANGE_ACCESS_MODE', { + ruleName: 'w', + ...payload, + }), + CHANGE_DELETE_ACCESS_MODE: (context, payload) => + context.dispatch('CHANGE_ACCESS_MODE', { + ruleName: 'd', + ...payload, + }), CHANGE_ACCESS_MODE: async (context, { mode, ruleName, item }) => { const have = item.access[ruleName]; let want; @@ -65,7 +65,10 @@ export class PermissionsStoreModule extends BaseStoreModule { grants: want, }; try { - await context.dispatch('PATCH_ACCESS_MODE', { item, changes }); + await context.dispatch('PATCH_ACCESS_MODE', { + item, + changes, + }); } catch (err) { throw err; } finally { @@ -78,7 +81,9 @@ export class PermissionsStoreModule extends BaseStoreModule { grants: 'r', }; try { - await context.dispatch('PATCH_ACCESS_MODE', { changes }); + await context.dispatch('PATCH_ACCESS_MODE', { + changes, + }); } catch { } finally { context.dispatch('LOAD_DATA_LIST'); @@ -111,9 +116,8 @@ export class PermissionsStoreModule extends BaseStoreModule { generateAPIActions(url) { const permissionsAPI = new PermissionsAPI(url); this.actions.GET_LIST = (context) => permissionsAPI.getList(context.state); - this.actions.PATCH_ACCESS_MODE = (context, { changes }) => ( - permissionsAPI.patch(context.state.parentId, [changes]) - ); + this.actions.PATCH_ACCESS_MODE = (context, { changes }) => + permissionsAPI.patch(context.state.parentId, [changes]); return this; } } diff --git a/src/app/utils/validators.js b/src/app/utils/validators.js index 3acad52a3..1bab222f2 100644 --- a/src/app/utils/validators.js +++ b/src/app/utils/validators.js @@ -1,9 +1,10 @@ +import { helpers } from '@vuelidate/validators'; + export const macValidator = (value) => { if (typeof value === 'undefined' || value === null || value === '') { return true; } - return /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/ - .test(value); + return /^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$/.test(value); }; export const ipValidator = (value) => { @@ -13,18 +14,23 @@ export const ipValidator = (value) => { if (value === '127.0.0.1' || value === '0.0.0.0') { return false; } - return /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/ - .test(value); + return /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test( + value, + ); }; export const gatewayHostValidator = (value) => { if (typeof value === 'undefined' || value === null || value === '') { return true; } - return /^(sips?:)?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:[0-9]{1,5})?$/ - .test(value) || - /^(sips?:)?(?=.{1,254}$)((?=[a-z0-9-]{1,63}\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}/i - .test(value); + return ( + /^(sips?:)?(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])(:[0-9]{1,5})?$/.test( + value, + ) || + /^(sips?:)?(?=.{1,254}$)((?=[a-z0-9-]{1,63}\.)(xn--+)?[a-z0-9]+(-[a-z0-9]+)*\.)+[a-z]{2,63}/i.test( + value, + ) + ); }; export const sipAccountValidator = (value) => { @@ -43,13 +49,21 @@ export const timerangeNotIntersect = (array) => { let ranges = [{ start: array[0].start, end: array[0].end }]; array.reduce((prev, curr) => { if (prev.day !== curr.day) { - ranges = [{ start: curr.start, end: curr.end }]; + ranges = [ + { + start: curr.start, + end: curr.end, + }, + ]; return curr; } ranges.forEach((range) => { - if ((curr.start >= range.start && curr.end <= range.end) // if [..{--}..] - || (curr.start <= range.start && curr.end >= range.start) // or {--[--}....] - || (curr.start <= range.end && curr.end >= range.end)) { // or [....{--]-} + if ( + (curr.start >= range.start && curr.end <= range.end) || // if [..{--}..] + (curr.start <= range.start && curr.end >= range.start) || // or {--[--}....] + (curr.start <= range.end && curr.end >= range.end) + ) { + // or [....{--]-} isIntersecting = true; } }); @@ -59,10 +73,8 @@ export const timerangeNotIntersect = (array) => { return !isIntersecting; }; -export const lessOrEqualTo = (comparedProp) => (value, vm) => value <= - vm[comparedProp]; -export const moreOrEqualTo = (comparedProp) => (value, vm) => value >= - vm[comparedProp]; +export const lessOrEqualTo = (comparedProp) => (value, vm) => value <= vm[comparedProp]; +export const moreOrEqualTo = (comparedProp) => (value, vm) => value >= vm[comparedProp]; export const regExpValidator = (value) => { try { @@ -71,3 +83,12 @@ export const regExpValidator = (value) => { return false; } }; +export const isRegExpMatched = (regExp, errorMessage) => { + return helpers.withParams( + { type: 'isRegExpMatched', regExp, errorMessage }, + (value) => { + if (!value) return true; + return regExp.test(value); + } + ); +}; diff --git a/src/main.js b/src/main.js index 1caba7c7b..432553f36 100755 --- a/src/main.js +++ b/src/main.js @@ -26,13 +26,14 @@ const fetchConfig = async () => { const setTokenFromUrl = () => { try { - const queryMap = window.location.search.slice(1) - .split('&') - .reduce((obj, query) => { - const [key, value] = query.split('='); - obj[key] = value; - return obj; - }, {}); + const queryMap = window.location.search + .slice(1) + .split('&') + .reduce((obj, query) => { + const [key, value] = query.split('='); + obj[key] = value; + return obj; + }, {}); if (queryMap.accessToken) { localStorage.setItem('access-token', queryMap.accessToken); @@ -46,11 +47,11 @@ const initSession = async () => store.dispatch('userinfo/OPEN_SESSION', { instan const createVueInstance = () => { const app = createApp(App) - .use(router) - .use(store) - .use(i18n) - .use(...WebitelUi) - .use(BreakpointPlugin); + .use(router) + .use(store) + .use(i18n) + .use(...WebitelUi) + .use(BreakpointPlugin); ActionComponents.forEach((component) => { app.component(component.name, component); diff --git a/src/modules/_shared/permissions-tab/api/PermissionsAPI.js b/src/modules/_shared/permissions-tab/api/PermissionsAPI.js index 3c1c2b88a..038ed23fc 100644 --- a/src/modules/_shared/permissions-tab/api/PermissionsAPI.js +++ b/src/modules/_shared/permissions-tab/api/PermissionsAPI.js @@ -1,7 +1,5 @@ -import APIPermissionsGetter - from '../../../../app/api/PermissionsAPIService/APIPermissionsGetter'; -import APIPermissionsPatcher - from '../../../../app/api/PermissionsAPIService/APIPermissionsPatcher'; +import APIPermissionsGetter from '../../../../app/api/PermissionsAPIService/APIPermissionsGetter'; +import APIPermissionsPatcher from '../../../../app/api/PermissionsAPIService/APIPermissionsPatcher'; export default class PermissionsAPI { constructor(url) { @@ -17,10 +15,11 @@ export default class PermissionsAPI { static patchByUrl = (url) => { const permissionsPatcher = new APIPermissionsPatcher(url); - return (parentId, changes) => permissionsPatcher.patchItem({ - id: parentId, - changes, - }); + return (parentId, changes) => + permissionsPatcher.patchItem({ + id: parentId, + changes, + }); }; getList(params) { @@ -28,6 +27,9 @@ export default class PermissionsAPI { } patch(parentId, changes) { - return this._permissionsPatcher.patchItem({ id: parentId, changes }); + return this._permissionsPatcher.patchItem({ + id: parentId, + changes, + }); } } diff --git a/src/modules/_shared/permissions-tab/components/_internals/permissions-role-column.vue b/src/modules/_shared/permissions-tab/components/_internals/permissions-role-column.vue index 7de683b21..d9ee8d3bc 100644 --- a/src/modules/_shared/permissions-tab/components/_internals/permissions-role-column.vue +++ b/src/modules/_shared/permissions-tab/components/_internals/permissions-role-column.vue @@ -9,7 +9,6 @@ diff --git a/src/modules/contact-center/modules/queues/components/opened-queue-general.vue b/src/modules/contact-center/modules/queues/components/opened-queue-general.vue index 3b44f1545..7ff2c5acb 100644 --- a/src/modules/contact-center/modules/queues/components/opened-queue-general.vue +++ b/src/modules/contact-center/modules/queues/components/opened-queue-general.vue @@ -21,7 +21,7 @@ :search-method="loadDropdownOptionsCalendarList" :v="v.itemInstance.calendar" :value="itemInstance.calendar" - required + :required="v.itemInstance.calendar" @input="setItemProp({ prop: 'calendar', value: $event })" /> import { EngineRoutingSchemaType } from 'webitel-sdk'; -import openedTabComponentMixin - from '../../../../../app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin'; +import openedTabComponentMixin from '../../../../../app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin'; import BlacklistsAPI from '../../../../lookups/modules/blacklists/api/blacklists'; import CalendarsAPI from '../../../../lookups/modules/calendars/api/calendars'; import MediaAPI from '../../../../lookups/modules/media/api/media'; @@ -160,11 +159,15 @@ export default { computed: { strategy: { get() { - return this.dropdownOptionsStrategyList - .find((strategy) => strategy.value === this.itemInstance.strategy); + return this.dropdownOptionsStrategyList.find( + (strategy) => strategy.value === this.itemInstance.strategy, + ); }, set(value) { - this.setItemProp({ prop: 'strategy', value: value.value }); + this.setItemProp({ + prop: 'strategy', + value: value.value, + }); }, }, @@ -175,11 +178,13 @@ export default { })); }, specificControls() { - return QueueTypeProperties[this.itemInstance.type].controls - .reduce((controls, control) => ({ - ...controls, - [control]: true, - }), {}); + return QueueTypeProperties[this.itemInstance.type].controls.reduce( + (controls, control) => ({ + ...controls, + [control]: true, + }), + {}, + ); }, }, @@ -197,7 +202,10 @@ export default { return FlowsAPI.getLookup(params); }, loadDropdownOptionsServiceSchemaList(params) { - return FlowsAPI.getLookup({ ...params, type: [EngineRoutingSchemaType.Service] }); + return FlowsAPI.getLookup({ + ...params, + type: [EngineRoutingSchemaType.Service], + }); }, loadDropdownOptionsMediaList(params) { return MediaAPI.getLookup(params); diff --git a/src/modules/contact-center/modules/queues/components/opened-queue-params.vue b/src/modules/contact-center/modules/queues/components/opened-queue-params.vue index e8bf1a7e5..6b1074ebf 100644 --- a/src/modules/contact-center/modules/queues/components/opened-queue-params.vue +++ b/src/modules/contact-center/modules/queues/components/opened-queue-params.vue @@ -270,6 +270,21 @@ type="number" @input="setItemPayloadProp({ prop: 'stickyAgentSec', value: +$event })" /> + + import { mapActions } from 'vuex'; import { QueueType } from 'webitel-sdk/esm2015/enums'; -import openedTabComponentMixin - from '../../../../../app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin'; +import openedTabComponentMixin from '../../../../../app/mixins/objectPagesMixins/openedObjectTabMixin/openedTabComponentMixin'; import QueueTypeProperties from '../lookups/QueueTypeProperties.lookup'; import StatisticTimeList from '../store/_internals/lookups/StatisticTime.lookup'; import ToneList from '../store/_internals/lookups/Tone.lookup'; @@ -307,38 +321,49 @@ export default { autoAnswerTone: { get() { if (this.itemInstance.payload.autoAnswerTone) { - return this.ToneList - .find((tone) => tone.value === this.itemInstance.payload.autoAnswerTone); + return this.ToneList.find( + (tone) => tone.value === this.itemInstance.payload.autoAnswerTone, + ); } /* https://my.webitel.com/browse/WTEL-3268 */ /* For queues with types INBOUND_QUEUE, PROGRESSIVE_DIALER, */ /* PREDICTIVE_DIALER add a default alert tone if there is no value */ - if (this.itemInstance.type === QueueType.INBOUND_QUEUE - || this.itemInstance.type === QueueType.PROGRESSIVE_DIALER - || this.itemInstance.type === QueueType.PREDICTIVE_DIALER) { + if ( + this.itemInstance.type === QueueType.INBOUND_QUEUE || + this.itemInstance.type === QueueType.PROGRESSIVE_DIALER || + this.itemInstance.type === QueueType.PREDICTIVE_DIALER + ) { return this.ToneList.find((tone) => tone.value === 'default'); } - }, set(value) { - this.setItemPayloadProp({ prop: 'autoAnswerTone', value: value.value }); + this.setItemPayloadProp({ + prop: 'autoAnswerTone', + value: value.value, + }); }, }, statisticTime: { get() { - return this.dropdownOptionsStatisticTimeList - .find((time) => time.value === this.itemInstance.payload.statisticTime); + return this.dropdownOptionsStatisticTimeList.find( + (time) => time.value === this.itemInstance.payload.statisticTime, + ); }, set(value) { - this.setItemPayloadProp({ prop: 'statisticTime', value: value.value }); + this.setItemPayloadProp({ + prop: 'statisticTime', + value: value.value, + }); }, }, specificControls() { - return QueueTypeProperties[this.itemInstance.type].controls - .reduce((controls, control) => ({ - ...controls, - [control]: true, - }), {}); + return QueueTypeProperties[this.itemInstance.type].controls.reduce( + (controls, control) => ({ + ...controls, + [control]: true, + }), + {}, + ); }, dropdownOptionsStatisticTimeList() { diff --git a/src/modules/contact-center/modules/queues/components/opened-queue-processing.vue b/src/modules/contact-center/modules/queues/components/opened-queue-processing.vue index 3dd4fe7ed..8cf2a4661 100644 --- a/src/modules/contact-center/modules/queues/components/opened-queue-processing.vue +++ b/src/modules/contact-center/modules/queues/components/opened-queue-processing.vue @@ -48,8 +48,7 @@ diff --git a/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-communication.vue b/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-communication.vue index 506af9ad2..298b4e3c9 100644 --- a/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-communication.vue +++ b/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-communication.vue @@ -80,15 +80,12 @@ diff --git a/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-destinations-popup.vue b/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-destinations-popup.vue index 1768d529e..d1ad35431 100644 --- a/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-destinations-popup.vue +++ b/src/modules/contact-center/modules/queues/modules/members/components/communications/opened-queue-member-destinations-popup.vue @@ -41,8 +41,7 @@ diff --git a/src/modules/contact-center/modules/resources/components/opened-resource-general.vue b/src/modules/contact-center/modules/resources/components/opened-resource-general.vue index 5d629cdb8..dbacd09d4 100644 --- a/src/modules/contact-center/modules/resources/components/opened-resource-general.vue +++ b/src/modules/contact-center/modules/resources/components/opened-resource-general.vue @@ -77,8 +77,7 @@ diff --git a/src/modules/contact-center/modules/resources/modules/display/components/opened-resource-numbers.vue b/src/modules/contact-center/modules/resources/modules/display/components/opened-resource-numbers.vue index 418708e9f..7d9a07fa2 100644 --- a/src/modules/contact-center/modules/resources/modules/display/components/opened-resource-numbers.vue +++ b/src/modules/contact-center/modules/resources/modules/display/components/opened-resource-numbers.vue @@ -98,13 +98,11 @@ diff --git a/src/modules/integrations/modules/storage/components/_unused/opened-storage-backblaze.vue b/src/modules/integrations/modules/storage/components/_unused/opened-storage-backblaze.vue index c85c0e3b6..98fd25be6 100644 --- a/src/modules/integrations/modules/storage/components/_unused/opened-storage-backblaze.vue +++ b/src/modules/integrations/modules/storage/components/_unused/opened-storage-backblaze.vue @@ -36,8 +36,7 @@ + diff --git a/src/modules/routing/modules/dialplan/store/dialplan.js b/src/modules/routing/modules/dialplan/store/dialplan.js index 44b568fb0..ec19273a7 100644 --- a/src/modules/routing/modules/dialplan/store/dialplan.js +++ b/src/modules/routing/modules/dialplan/store/dialplan.js @@ -1,5 +1,4 @@ -import ObjectStoreModule - from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; +import ObjectStoreModule from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; import DialplanAPI from '../api/dialplan'; import headers from './_internals/headers'; @@ -21,7 +20,10 @@ const actions = { await context.commit('SWAP_ROWS', {fromId, toId}); */ try { - await DialplanAPI.moveDialplan({ fromId, toId }); + await DialplanAPI.moveDialplan({ + fromId, + toId, + }); } catch { } finally { // context.dispatch('LOAD_DATA_LIST'); @@ -40,8 +42,8 @@ const mutations = { }; const dialplan = new ObjectStoreModule({ resettableState, headers }) -.attachAPIModule(DialplanAPI) -.generateAPIActions() -.getModule({ actions, mutations }); + .attachAPIModule(DialplanAPI) + .generateAPIActions() + .getModule({ actions, mutations }); export default dialplan; diff --git a/src/modules/routing/modules/flow/api/flow.js b/src/modules/routing/modules/flow/api/flow.js index fd87251fb..321ea0abd 100644 --- a/src/modules/routing/modules/flow/api/flow.js +++ b/src/modules/routing/modules/flow/api/flow.js @@ -1,7 +1,4 @@ -import { - getDefaultGetListResponse, - getDefaultGetParams, -} from '@webitel/ui-sdk/src/api/defaults'; +import { getDefaultGetListResponse, getDefaultGetParams } from '@webitel/ui-sdk/src/api/defaults'; import applyTransform, { camelToSnake, merge, @@ -11,10 +8,7 @@ import applyTransform, { snakeToCamel, starToSearch, } from '@webitel/ui-sdk/src/api/transformers'; -import { - EngineRoutingSchemaType, - RoutingSchemaServiceApiFactory, -} from 'webitel-sdk'; +import { EngineRoutingSchemaType, RoutingSchemaServiceApiFactory } from 'webitel-sdk'; import instance from '../../../../../app/api/instance'; import configuration from '../../../../../app/api/openAPIConfig'; @@ -24,7 +18,7 @@ const flowService = new RoutingSchemaServiceApiFactory(configuration, '', instan CONVERT "SCHEMA" FIELD TO JSON TO PREVENT ITS CHANGE BY CAMEL-SNAKE TRANSFORMERS */ -const doNotConvertKeys = ['schema']; +const doNotConvertKeys = ['schema', 'tags']; const fieldsToSend = ['name', 'schema', 'type', 'payload', 'editor', 'tags']; @@ -39,26 +33,14 @@ const getFlowList = async (params) => { }; if (paramsCopy.type) { - const _type = Array.isArray(paramsCopy.type) - ? paramsCopy.type - : [paramsCopy.type]; + const _type = Array.isArray(paramsCopy.type) ? paramsCopy.type : [paramsCopy.type]; if (!paramsCopy.type.includes(EngineRoutingSchemaType.Default)) { _type.push(EngineRoutingSchemaType.Default); } paramsCopy.type = _type; } - const { - page, - size, - search, - sort, - fields, - id, - name, - type, - tags, - } = applyTransform(paramsCopy, [ + const { page, size, search, sort, fields, id, name, type, tags } = applyTransform(paramsCopy, [ merge(getDefaultGetParams()), starToSearch('search'), camelToSnake(doNotConvertKeys), @@ -82,16 +64,11 @@ const getFlowList = async (params) => { merge(getDefaultGetListResponse()), ]); return { - items: applyTransform(items, [ - mergeEach(defaultObject), - ]), + items: applyTransform(items, [mergeEach(defaultObject)]), next, }; } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; const getFlow = async ({ itemId: id }) => { @@ -118,18 +95,13 @@ const getFlow = async ({ itemId: id }) => { itemResponseHandler, ]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; const preRequestHandler = (item) => ({ ...item, - schema: typeof item.schema === 'string' - ? JSON.parse(item.schema) - : item.schema, + schema: typeof item.schema === 'string' ? JSON.parse(item.schema) : item.schema, }); const addFlow = async ({ itemInstance }) => { @@ -152,10 +124,7 @@ const addFlow = async ({ itemInstance }) => { }), ]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; const updateFlow = async ({ itemInstance, itemId: id }) => { @@ -178,10 +147,7 @@ const updateFlow = async ({ itemInstance, itemId: id }) => { }), ]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; @@ -190,27 +156,18 @@ const deleteFlow = async ({ id }) => { const response = await flowService.deleteRoutingSchema(id); return applyTransform(response.data, []); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; -const getFlowsLookup = (params) => getFlowList({ - ...params, - fields: params.fields || ['id', 'name', 'type'], -}); +const getFlowsLookup = (params) => + getFlowList({ + ...params, + fields: params.fields || ['id', 'name', 'type'], + }); const getFlowTags = async (params) => { - const { - page, - size, - search, - sort, - fields, - ids, - } = applyTransform(params, [ + const { page, size, search, sort, fields, ids } = applyTransform(params, [ merge(getDefaultGetParams()), starToSearch(), camelToSnake(doNotConvertKeys), @@ -233,10 +190,7 @@ const getFlowTags = async (params) => { next, }; } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; diff --git a/src/modules/routing/modules/flow/components/__tests__/the-flow.spec.js b/src/modules/routing/modules/flow/components/__tests__/the-flow.spec.js index beb97ea95..5c397d46d 100644 --- a/src/modules/routing/modules/flow/components/__tests__/the-flow.spec.js +++ b/src/modules/routing/modules/flow/components/__tests__/the-flow.spec.js @@ -1,7 +1,6 @@ import { shallowMount } from '@vue/test-utils'; import { reactive } from 'vue'; -import tableComponentComputedMock - from '../../../../../../../tests/unit/mocks/tableComponentComputed.mock'; +import tableComponentComputedMock from '../../../../../../../tests/unit/mocks/tableComponentComputed.mock'; import { useDummy } from '../../../../../../app/composables/useDummy'; import TheFlow from '../the-flow.vue'; @@ -10,7 +9,9 @@ useDummy.mockImplementation(() => ({ store: reactive({}) })); describe('TheFlow', () => { it('renders a component', () => { - const wrapper = shallowMount(TheFlow, { computed: tableComponentComputedMock() }); + const wrapper = shallowMount(TheFlow, { + computed: tableComponentComputedMock(), + }); expect(wrapper.exists()).toBe(true); }); }); diff --git a/src/modules/routing/modules/flow/components/confirmation-unsaved-changes-popup.vue b/src/modules/routing/modules/flow/components/confirmation-unsaved-changes-popup.vue index 03fd0c5db..f763f90dc 100644 --- a/src/modules/routing/modules/flow/components/confirmation-unsaved-changes-popup.vue +++ b/src/modules/routing/modules/flow/components/confirmation-unsaved-changes-popup.vue @@ -1,6 +1,7 @@ diff --git a/src/modules/routing/modules/flow/components/the-flow.vue b/src/modules/routing/modules/flow/components/the-flow.vue index ca9a73c00..c5dcc5bba 100644 --- a/src/modules/routing/modules/flow/components/the-flow.vue +++ b/src/modules/routing/modules/flow/components/the-flow.vue @@ -27,8 +27,8 @@ /> @@ -65,17 +65,18 @@ - - - - - - - - - + +
@@ -162,6 +163,8 @@ diff --git a/src/modules/routing/modules/flow/components/upload-flow-popup.vue b/src/modules/routing/modules/flow/components/upload-flow-popup.vue index a7593ebb0..de62b242a 100644 --- a/src/modules/routing/modules/flow/components/upload-flow-popup.vue +++ b/src/modules/routing/modules/flow/components/upload-flow-popup.vue @@ -1,5 +1,6 @@ diff --git a/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-tags-filter.spec.js b/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-tags-filter.spec.js index 4ee25cb97..51fb8fc73 100644 --- a/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-tags-filter.spec.js +++ b/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-tags-filter.spec.js @@ -1,6 +1,5 @@ import { shallowMount } from '@vue/test-utils'; -import filterComponentMixinMock - from '../../../../../../../../../tests/unit/mocks/mixinMocks/filterComponentMixin.mock'; +import filterComponentMixinMock from '../../../../../../../../../tests/unit/mocks/mixinMocks/filterComponentMixin.mock'; import FlowTagsFilter from '../flow-tags-filter.vue'; describe('FlowTagsFilter', () => { diff --git a/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-type-filter.spec.js b/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-type-filter.spec.js index 7ec19b46f..29e4aae95 100644 --- a/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-type-filter.spec.js +++ b/src/modules/routing/modules/flow/modules/filters/components/__tests__/flow-type-filter.spec.js @@ -1,6 +1,5 @@ import { shallowMount } from '@vue/test-utils'; -import filterComponentMixinMock - from '../../../../../../../../../tests/unit/mocks/mixinMocks/filterComponentMixin.mock'; +import filterComponentMixinMock from '../../../../../../../../../tests/unit/mocks/mixinMocks/filterComponentMixin.mock'; import FlowTypeFilter from '../flow-type-filter.vue'; describe('FlowTypeFilter', () => { diff --git a/src/modules/routing/modules/flow/modules/filters/components/flow-tags-filter.vue b/src/modules/routing/modules/flow/modules/filters/components/flow-tags-filter.vue index 6202ebd91..e4a71fe8d 100644 --- a/src/modules/routing/modules/flow/modules/filters/components/flow-tags-filter.vue +++ b/src/modules/routing/modules/flow/modules/filters/components/flow-tags-filter.vue @@ -25,7 +25,10 @@ export default { }), methods: { handleInput(value) { - this.setValue({ filter: this.filterQuery, value }); + this.setValue({ + filter: this.filterQuery, + value, + }); this.setValueToQuery({ value, filterQuery: this.filterQuery, @@ -36,7 +39,9 @@ export default { return this.filterSchema.search(params); }, fetchSelected(tags) { - return tags.map((name) => ({ name })); + return tags.map((name) => ({ + name, + })); }, }, }; diff --git a/src/modules/routing/modules/flow/modules/filters/components/flow-type-filter.vue b/src/modules/routing/modules/flow/modules/filters/components/flow-type-filter.vue index 7794a24ab..37f55b7a8 100644 --- a/src/modules/routing/modules/flow/modules/filters/components/flow-type-filter.vue +++ b/src/modules/routing/modules/flow/modules/filters/components/flow-type-filter.vue @@ -40,13 +40,22 @@ export default { }), methods: { handleChange(value) { - this.setValue({ filter: this.filterQuery, value }); - this.setValueToQuery({ filterQuery: this.filterQuery, value }); + this.setValue({ + filter: this.filterQuery, + value, + }); + this.setValueToQuery({ + filterQuery: this.filterQuery, + value, + }); }, restoreValue(_value) { // if only 1 checkbox is seelcted, returned value is string const value = Array.isArray(_value) ? _value : [_value]; - this.setValue({ filter: this.filterQuery, value }); + this.setValue({ + filter: this.filterQuery, + value, + }); }, }, }; diff --git a/src/modules/routing/modules/flow/modules/filters/components/the-flow-filters.vue b/src/modules/routing/modules/flow/modules/filters/components/the-flow-filters.vue index 1cd9c4f80..9c2372a50 100644 --- a/src/modules/routing/modules/flow/modules/filters/components/the-flow-filters.vue +++ b/src/modules/routing/modules/flow/modules/filters/components/the-flow-filters.vue @@ -34,7 +34,9 @@ export default { }, }), resetFilters() { - this.$router.push({ query: null }); + this.$router.push({ + query: null, + }); this.resetFilterValues(); }, }, diff --git a/src/modules/routing/modules/flow/modules/filters/store/filters.js b/src/modules/routing/modules/flow/modules/filters/store/filters.js index 502a492f4..75a64c312 100644 --- a/src/modules/routing/modules/flow/modules/filters/store/filters.js +++ b/src/modules/routing/modules/flow/modules/filters/store/filters.js @@ -1,9 +1,6 @@ -import ApiFilterSchema - from '@webitel/ui-sdk/src/modules/QueryFilters/classes/ApiFilterSchema'; -import BaseFilterSchema - from '@webitel/ui-sdk/src/modules/QueryFilters/classes/BaseFilterSchema'; -import QueryFiltersStoreModule - from '@webitel/ui-sdk/src/modules/QueryFilters/store/QueryFiltersStoreModule'; +import ApiFilterSchema from '@webitel/ui-sdk/src/modules/QueryFilters/classes/ApiFilterSchema'; +import BaseFilterSchema from '@webitel/ui-sdk/src/modules/QueryFilters/classes/BaseFilterSchema'; +import QueryFiltersStoreModule from '@webitel/ui-sdk/src/modules/QueryFilters/store/QueryFiltersStoreModule'; import { EngineRoutingSchemaType } from 'webitel-sdk'; import FlowsAPI from '../../../api/flow'; diff --git a/src/modules/routing/modules/flow/store/flow.js b/src/modules/routing/modules/flow/store/flow.js index 1c50419a0..d7f648283 100644 --- a/src/modules/routing/modules/flow/store/flow.js +++ b/src/modules/routing/modules/flow/store/flow.js @@ -1,5 +1,4 @@ -import ObjectStoreModule - from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; +import ObjectStoreModule from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; import FlowAPI from '../api/flow'; import filters from '../modules/filters/store/filters'; import headers from './_internals/headers'; @@ -20,9 +19,9 @@ const state = { }; const flow = new ObjectStoreModule({ resettableState, headers }) -.attachAPIModule(FlowAPI) -.setChildModules({ filters }) -.generateAPIActions() -.getModule({ state }); + .attachAPIModule(FlowAPI) + .setChildModules({ filters }) + .generateAPIActions() + .getModule({ state }); export default flow; diff --git a/src/modules/routing/modules/gateways/api/gateways.js b/src/modules/routing/modules/gateways/api/gateways.js index 765907324..3ea568a44 100644 --- a/src/modules/routing/modules/gateways/api/gateways.js +++ b/src/modules/routing/modules/gateways/api/gateways.js @@ -1,7 +1,4 @@ -import { - getDefaultGetListResponse, - getDefaultGetParams, -} from '@webitel/ui-sdk/src/api/defaults'; +import { getDefaultGetListResponse, getDefaultGetParams } from '@webitel/ui-sdk/src/api/defaults'; import applyTransform, { camelToSnake, generateUrl, @@ -42,16 +39,11 @@ const getGatewayList = async (params) => { merge(getDefaultGetListResponse()), ]); return { - items: applyTransform(items, [ - mergeEach(defaultObject), - ]), + items: applyTransform(items, [mergeEach(defaultObject)]), next, }; } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; @@ -63,15 +55,22 @@ const getGateway = async ({ itemId: id }) => { port: null, }; - const result = { ...trunkingGateway(), ...response }; - result.ipacl = result.ipacl.map((acl) => ( - { ...defaultIPacl, ...acl } - )); + const result = { + ...trunkingGateway(), + ...response, + }; + result.ipacl = result.ipacl.map((acl) => ({ + ...defaultIPacl, + ...acl, + })); return result; }; const coerceRegisterResponse = (response) => { - const result = { ...registerGateway(), ...response }; + const result = { + ...registerGateway(), + ...response, + }; return result; }; @@ -84,15 +83,9 @@ const getGateway = async ({ itemId: id }) => { try { const response = await instance.get(url); - return applyTransform(response.data, [ - snakeToCamel(), - itemResponseHandler, - ]); + return applyTransform(response.data, [snakeToCamel(), itemResponseHandler]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; @@ -116,58 +109,34 @@ const fieldsToSend = [ ]; const addGateway = async ({ itemInstance }) => { - const item = applyTransform(itemInstance, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const item = applyTransform(itemInstance, [sanitize(fieldsToSend), camelToSnake()]); try { const response = await instance.post(baseUrl, item); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; const updateGateway = async ({ itemInstance, itemId: id }) => { - const item = applyTransform(itemInstance, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const item = applyTransform(itemInstance, [sanitize(fieldsToSend), camelToSnake()]); const url = `${baseUrl}/${id}`; try { const response = await instance.put(url, item); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; const patchGateway = async ({ changes, id }) => { - const body = applyTransform(changes, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const body = applyTransform(changes, [sanitize(fieldsToSend), camelToSnake()]); const url = `${baseUrl}/${id}`; try { const response = await instance.patch(url, body); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; @@ -177,17 +146,15 @@ const deleteGateway = async ({ id }) => { const response = await instance.delete(url); return applyTransform(response.data, []); } catch (err) { - throw applyTransform(err, [ - - notify, - ]); + throw applyTransform(err, [notify]); } }; -const getGatewaysLookup = (params) => getGatewayList({ - ...params, - fields: params.fields || ['id', 'name'], -}); +const getGatewaysLookup = (params) => + getGatewayList({ + ...params, + fields: params.fields || ['id', 'name'], + }); const GatewaysAPI = { getList: getGatewayList, diff --git a/src/modules/routing/modules/gateways/components/create-gateway-popup.vue b/src/modules/routing/modules/gateways/components/create-gateway-popup.vue index ba7dbe6f6..56f3e40e7 100644 --- a/src/modules/routing/modules/gateways/components/create-gateway-popup.vue +++ b/src/modules/routing/modules/gateways/components/create-gateway-popup.vue @@ -46,14 +46,15 @@ export default { }, createGateway() { if (this.selected) { - this.$router.push({ name: `${RouteNames.GATEWAYS}-${this.selected.value}-new` }); + this.$router.push({ + name: `${RouteNames.GATEWAYS}-${this.selected.value}-new`, + }); } }, close() { this.$emit('close'); }, }, - }; diff --git a/src/modules/routing/modules/gateways/components/opened-register-sip-gateway-general.vue b/src/modules/routing/modules/gateways/components/opened-register-sip-gateway-general.vue index 92d35a331..c6eb91cbe 100644 --- a/src/modules/routing/modules/gateways/components/opened-register-sip-gateway-general.vue +++ b/src/modules/routing/modules/gateways/components/opened-register-sip-gateway-general.vue @@ -68,10 +68,9 @@ + + diff --git a/src/modules/settings/components/custom-ringtone.vue b/src/modules/settings/components/custom-ringtone.vue new file mode 100644 index 000000000..b0702512e --- /dev/null +++ b/src/modules/settings/components/custom-ringtone.vue @@ -0,0 +1,106 @@ + + + + + + diff --git a/src/modules/settings/components/the-settings.vue b/src/modules/settings/components/the-settings.vue index ed28a17e7..edd5422e9 100644 --- a/src/modules/settings/components/the-settings.vue +++ b/src/modules/settings/components/the-settings.vue @@ -10,35 +10,7 @@ in a column and give them half the width of the screen-->
-
-

- {{ $t('settings.changePassword') }} -

-
-
- - - - {{ $t('objects.save') }} - - +
@@ -53,6 +25,7 @@ :value="language" class="language-list" @input="changeLanguage" + :clearable="false" />
@@ -82,31 +55,50 @@
+
+
+

+ {{ $t('settings.callEnd') }} +

+
+
+
+

{{ $t('objects.status') }}

+ +
+
+
+ diff --git a/src/modules/start-page/components/the-start-page.vue b/src/modules/start-page/components/the-start-page.vue index 28d9b8da3..202120efa 100644 --- a/src/modules/start-page/components/the-start-page.vue +++ b/src/modules/start-page/components/the-start-page.vue @@ -40,7 +40,10 @@ export default { if (!this.selected.subNav) return []; return this.selected.subNav.map((subNav) => { const route = `${this.selected.route}/${subNav.route}`; - return { ...subNav, route }; + return { + ...subNav, + route, + }; }); }, }, diff --git a/src/modules/system/modules/changelogs/api/changelogs.js b/src/modules/system/modules/changelogs/api/changelogs.js index 87d62b1bd..75f137c7b 100644 --- a/src/modules/system/modules/changelogs/api/changelogs.js +++ b/src/modules/system/modules/changelogs/api/changelogs.js @@ -1,7 +1,4 @@ -import { - getDefaultGetListResponse, - getDefaultGetParams, -} from '@webitel/ui-sdk/src/api/defaults'; +import { getDefaultGetListResponse, getDefaultGetParams } from '@webitel/ui-sdk/src/api/defaults'; import applyTransform, { camelToSnake, merge, @@ -22,114 +19,64 @@ const getList = async (params) => { enabled: false, }; - const { - page, - size, - search, - sort, - fields, - id, - } = applyTransform(params, [ + const { page, size, search, sort, fields, id } = applyTransform(params, [ merge(getDefaultGetParams()), starToSearch('search'), ]); try { - const response = await service.searchConfig( - page, - size, - search, - sort, - fields, - id, - ); + const response = await service.searchConfig(page, size, search, sort, fields, id); const { items, next } = applyTransform(response.data, [ snakeToCamel(), merge(getDefaultGetListResponse()), ]); return { - items: applyTransform(items, [ - mergeEach(defaultObject), - ]), + items: applyTransform(items, [mergeEach(defaultObject)]), next, }; } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; const get = async ({ itemId: id }) => { try { const response = await service.readConfig(id); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; -const fieldsToSend = [ - 'object', - 'storage', - 'daysToStore', - 'period', - 'enabled', - 'description', -]; +const fieldsToSend = ['object', 'storage', 'daysToStore', 'period', 'enabled', 'description']; const add = async ({ itemInstance }) => { - const item = applyTransform(itemInstance, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const item = applyTransform(itemInstance, [sanitize(fieldsToSend), camelToSnake()]); try { const response = await service.createConfig(item); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; const update = async ({ itemInstance, itemId: id }) => { - const item = applyTransform(itemInstance, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const item = applyTransform(itemInstance, [sanitize(fieldsToSend), camelToSnake()]); try { const response = await service.updateConfig(id, item); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; const patch = async ({ id, changes }) => { - const body = applyTransform(changes, [ - sanitize(fieldsToSend), - camelToSnake(), - ]); + const body = applyTransform(changes, [sanitize(fieldsToSend), camelToSnake()]); try { const response = await service.patchConfig(id, body); - return applyTransform(response.data, [ - snakeToCamel(), - ]); + return applyTransform(response.data, [snakeToCamel()]); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; @@ -138,16 +85,15 @@ const deleteItem = async ({ id }) => { const response = await service.deleteConfig(id); return applyTransform(response.data, []); } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; -const getLookup = (params) => getList({ - ...params, - fields: params.fields || ['id', 'object'], -}); +const getLookup = (params) => + getList({ + ...params, + fields: params.fields || ['id', 'object'], + }); const getObjectsList = async ({ includeExisting } = {}) => { try { @@ -161,9 +107,7 @@ const getObjectsList = async ({ includeExisting } = {}) => { next, }; } catch (err) { - throw applyTransform(err, [ - notify, - ]); + throw applyTransform(err, [notify]); } }; diff --git a/src/modules/system/modules/changelogs/components/opened-changelog-general.vue b/src/modules/system/modules/changelogs/components/opened-changelog-general.vue index e22c27766..1cec64f16 100644 --- a/src/modules/system/modules/changelogs/components/opened-changelog-general.vue +++ b/src/modules/system/modules/changelogs/components/opened-changelog-general.vue @@ -54,8 +54,7 @@ diff --git a/src/modules/system/modules/global-variables/store/global-variables.js b/src/modules/system/modules/global-variables/store/global-variables.js index 3d41de27b..5ca2cbbb2 100644 --- a/src/modules/system/modules/global-variables/store/global-variables.js +++ b/src/modules/system/modules/global-variables/store/global-variables.js @@ -1,7 +1,6 @@ -import ObjectStoreModule - from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; -import headers from './_internals/headers'; +import ObjectStoreModule from '../../../../../app/store/BaseStoreModules/StoreModules/ObjectStoreModule'; import GlobalVariablesAPI from '../api/global-variables'; +import headers from './_internals/headers'; const actions = { // https://webitel.atlassian.net/browse/WTEL-4195 diff --git a/src/modules/userinfo/store/_internals/lookups/ObjectsList.lookup.js b/src/modules/userinfo/store/_internals/lookups/ObjectsList.lookup.js index 394204d90..fc7eed94b 100644 --- a/src/modules/userinfo/store/_internals/lookups/ObjectsList.lookup.js +++ b/src/modules/userinfo/store/_internals/lookups/ObjectsList.lookup.js @@ -1,58 +1,61 @@ /* eslint-disable max-len, no-multi-spaces */ -import AdminSections - from '@webitel/ui-sdk/src/enums/WebitelApplications/AdminSections.enum'; +import AdminSections from '@webitel/ui-sdk/src/enums/WebitelApplications/AdminSections.enum'; import RouteNames from '../../../../../app/router/_internals/RouteNames.enum'; export default Object.freeze([ // DIRECTORY - { field: null, name: AdminSections.LICENSE, route: RouteNames.LICENSE }, // permissions: add - { field: 'users', name: AdminSections.USERS, route: RouteNames.USERS }, // scope: users - { field: 'devices', name: AdminSections.DEVICES, route: RouteNames.DEVICES }, // scope: devices + { field: null, name: AdminSections.LICENSE, route: RouteNames.LICENSE }, // permissions: add + { field: 'users', name: AdminSections.USERS, route: RouteNames.USERS }, // scope: users + { + field: 'devices', + name: AdminSections.DEVICES, + route: RouteNames.DEVICES, + }, // scope: devices // ROUTING - { field: 'flow', name: AdminSections.FLOW, route: RouteNames.FLOW }, // scope: flow + { field: 'flow', name: AdminSections.FLOW, route: RouteNames.FLOW }, // scope: flow { field: 'acr_routing', name: AdminSections.DIALPLAN, route: RouteNames.DIALPLAN, - }, // scope: acr_routing + }, // scope: acr_routing { field: 'gateways', name: AdminSections.GATEWAYS, route: RouteNames.GATEWAYS, - }, // scope: gateways + }, // scope: gateways { field: 'acr_chat_plan', name: AdminSections.CHATPLAN, route: RouteNames.CHATPLAN, - }, // scope: acr_chat_plan + }, // scope: acr_chat_plan { field: 'chats', name: AdminSections.CHAT_GATEWAYS, route: RouteNames.CHAT_GATEWAYS, - }, // scope: chats + }, // scope: chats // LOOKUPS { field: 'dictionaries', name: AdminSections.SKILLS, route: RouteNames.SKILLS, - }, // scope: dictionaries + }, // scope: dictionaries { field: 'cc_list', name: AdminSections.BLACKLIST, route: RouteNames.BLACKLIST, - }, // scope: cc_list + }, // scope: cc_list { field: 'calendars', name: AdminSections.CALENDARS, route: RouteNames.CALENDARS, - }, // scope: calendars + }, // scope: calendars { field: 'dictionaries', name: AdminSections.REGIONS, route: RouteNames.REGIONS, - }, // scope: dictionaries + }, // scope: dictionaries { field: 'dictionaries', name: AdminSections.BUCKETS, @@ -62,36 +65,40 @@ export default Object.freeze([ field: 'dictionaries', name: AdminSections.COMMUNICATIONS, route: RouteNames.COMMUNICATIONS, - }, // scope: dictionaries + }, // scope: dictionaries { field: 'dictionaries', name: AdminSections.PAUSE_CAUSE, route: RouteNames.PAUSE_CAUSE, - }, // scope: dictionaries - { field: 'media_file', name: AdminSections.MEDIA, route: RouteNames.MEDIA }, // scope: media_file + }, // scope: dictionaries + { field: 'media_file', name: AdminSections.MEDIA, route: RouteNames.MEDIA }, // scope: media_file // CONTACT CENTER - { field: 'cc_agent', name: AdminSections.AGENTS, route: RouteNames.AGENTS }, // scope: cc_agent - { field: 'cc_queue', name: AdminSections.QUEUES, route: RouteNames.QUEUES }, // scope: cc_queue - { field: 'cc_queue', name: AdminSections.MEMBERS, route: RouteNames.MEMBERS }, // scope: cc_queue + { field: 'cc_agent', name: AdminSections.AGENTS, route: RouteNames.AGENTS }, // scope: cc_agent + { field: 'cc_queue', name: AdminSections.QUEUES, route: RouteNames.QUEUES }, // scope: cc_queue + { + field: 'cc_queue', + name: AdminSections.MEMBERS, + route: RouteNames.MEMBERS, + }, // scope: cc_queue { field: 'cc_resource_group', name: AdminSections.RESOURCE_GROUPS, route: RouteNames.RESOURCE_GROUPS, - }, // scope: cc_resource_group + }, // scope: cc_resource_group { field: 'cc_resource', name: AdminSections.RESOURCES, route: RouteNames.RESOURCES, - }, // scope: cc_resource - { field: 'cc_team', name: AdminSections.TEAMS, route: RouteNames.TEAMS }, // scope: cc_team + }, // scope: cc_resource + { field: 'cc_team', name: AdminSections.TEAMS, route: RouteNames.TEAMS }, // scope: cc_team // INTEGRATIONS { field: 'storage_profile', name: AdminSections.STORAGE, route: RouteNames.STORAGE, - }, // scope: storage_profile + }, // scope: storage_profile { field: 'cognitive_profile', name: AdminSections.COGNITIVE_PROFILES, @@ -124,6 +131,6 @@ export default Object.freeze([ }, // PERMISSIONS - { field: null, name: AdminSections.OBJECTS, route: RouteNames.OBJECTS }, // permissions: add - { field: 'roles', name: AdminSections.ROLES, route: RouteNames.ROLES }, // scope: roles + { field: null, name: AdminSections.OBJECTS, route: RouteNames.OBJECTS }, // permissions: add + { field: 'roles', name: AdminSections.ROLES, route: RouteNames.ROLES }, // scope: roles ]); diff --git a/src/modules/userinfo/store/_internals/scripts/convertScope.js b/src/modules/userinfo/store/_internals/scripts/convertScope.js index 9af85cdef..50abcb78d 100644 --- a/src/modules/userinfo/store/_internals/scripts/convertScope.js +++ b/src/modules/userinfo/store/_internals/scripts/convertScope.js @@ -5,11 +5,16 @@ const convertScope = (initialScope) => { if (initialScope) { // iterate over ObjectsList and collect included classes scope = ObjectsList.reduce((objects, object) => { - const initialScopeObject = initialScope.find((obj) => obj.class === - object.field); + const initialScopeObject = initialScope.find((obj) => obj.class === object.field); if (initialScopeObject) { - const newObject = { ...object, access: initialScopeObject.access }; - return { ...objects, [object.name]: newObject }; + const newObject = { + ...object, + access: initialScopeObject.access, + }; + return { + ...objects, + [object.name]: newObject, + }; } return objects; }, {}); diff --git a/src/modules/userinfo/store/userinfo.js b/src/modules/userinfo/store/userinfo.js index 9d3fd808e..9870253d6 100644 --- a/src/modules/userinfo/store/userinfo.js +++ b/src/modules/userinfo/store/userinfo.js @@ -1,9 +1,6 @@ -import WebitelApplications - from '@webitel/ui-sdk/src/enums/WebitelApplications/WebitelApplications.enum'; -import UserinfoStoreModule - from '@webitel/ui-sdk/src/modules/Userinfo/store/UserinfoStoreModule'; -import NavigationPages - from '../../../app/router/_internals/NavigationPages.lookup'; +import WebitelApplications from '@webitel/ui-sdk/src/enums/WebitelApplications/WebitelApplications.enum'; +import UserinfoStoreModule from '@webitel/ui-sdk/src/modules/Userinfo/store/UserinfoStoreModule'; +import NavigationPages from '../../../app/router/_internals/NavigationPages.lookup'; import convertScope from './_internals/scripts/convertScope'; const state = { @@ -11,21 +8,24 @@ const state = { }; const getters = { - ACCESSIBLE_NAV: (state, getters) => NavigationPages.reduce(( - accumulator, - nav, - ) => { - const subNav = nav.subNav.filter((subNav) => ( - getters.HAS_READ_ACCESS({ name: subNav.value }) - )); - if (subNav.length) { - const newNav = { ...nav, subNav }; - return [...accumulator, newNav]; - } - return accumulator; - }, []), + ACCESSIBLE_NAV: (state, getters) => + NavigationPages.reduce((accumulator, nav) => { + const subNav = nav.subNav.filter((subNav) => + getters.HAS_READ_ACCESS({ + name: subNav.value, + }), + ); + if (subNav.length) { + const newNav = { + ...nav, + subNav, + }; + return [...accumulator, newNav]; + } + return accumulator; + }, []), - IS_CHANGE_USER_PASSWORD_ALLOW: (state) => !!state.permissions['change_user_password'], + IS_CHANGE_USER_PASSWORD_ALLOW: (state) => !!state.permissions.change_user_password, }; const actions = {