diff --git a/CHANGELOG.md b/CHANGELOG.md index ef748c159..88d53dfc6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,49 @@ # Changelog +## [6.8.0](https://github.com/ydb-platform/ydb-embedded-ui/compare/v6.7.0...v6.8.0) (2024-07-03) + + +### Features + +* **Acl:** improve view ([#955](https://github.com/ydb-platform/ydb-embedded-ui/issues/955)) ([46aff45](https://github.com/ydb-platform/ydb-embedded-ui/commit/46aff451d7768a44d50d4fe56ff4cedb0be505b0)) +* add action "Create async replication" ([#959](https://github.com/ydb-platform/ydb-embedded-ui/issues/959)) ([75b0fa8](https://github.com/ydb-platform/ydb-embedded-ui/commit/75b0fa8532a2a051f3e7042f97d98ca0125a93ae)) +* add ReadOnly label to replicated tables ([#970](https://github.com/ydb-platform/ydb-embedded-ui/issues/970)) ([669f7f0](https://github.com/ydb-platform/ydb-embedded-ui/commit/669f7f00e0dc8d0dcbac6f54cf854915a2ca1ac0)) + + +### Bug Fixes + +* expand the column 'degraded' width ([#962](https://github.com/ydb-platform/ydb-embedded-ui/issues/962)) ([0d13d53](https://github.com/ydb-platform/ydb-embedded-ui/commit/0d13d53810f4ccbc5aa2545911021126274fbaf8)) +* fix replication template ([#973](https://github.com/ydb-platform/ydb-embedded-ui/issues/973)) ([071b0a7](https://github.com/ydb-platform/ydb-embedded-ui/commit/071b0a76b46c860015018c59c961c0dbb7ea3459)) +* **TenantNavigation:** fix radio button value ([#969](https://github.com/ydb-platform/ydb-embedded-ui/issues/969)) ([7d85393](https://github.com/ydb-platform/ydb-embedded-ui/commit/7d85393f42e96e567fc670e122d8e94a0f4b6c7b)) +* update deps ([#975](https://github.com/ydb-platform/ydb-embedded-ui/issues/975)) ([89703da](https://github.com/ydb-platform/ydb-embedded-ui/commit/89703da7276aaf50b5bd1058ee786210a5867d7d)) +* **UserSettings:** fix highlight on search ([#972](https://github.com/ydb-platform/ydb-embedded-ui/issues/972)) ([6fbd52c](https://github.com/ydb-platform/ydb-embedded-ui/commit/6fbd52c2725c1c5313f04b92217356e749ab7fe6)) + +## [6.7.0](https://github.com/ydb-platform/ydb-embedded-ui/compare/v6.6.1...v6.7.0) (2024-06-28) + + +### Features + +* add "Create column table" action ([#957](https://github.com/ydb-platform/ydb-embedded-ui/issues/957)) ([6cb3e2b](https://github.com/ydb-platform/ydb-embedded-ui/commit/6cb3e2b65bd8ed3d9de723fa03ce33848c3f7f05)) +* add auto-increment for raw table type ([#929](https://github.com/ydb-platform/ydb-embedded-ui/issues/929)) ([87e22cd](https://github.com/ydb-platform/ydb-embedded-ui/commit/87e22cd2f490f14cdb03a24dd45e6712018ec234)) +* **api:** add retries on errors ([#934](https://github.com/ydb-platform/ydb-embedded-ui/issues/934)) ([86faa42](https://github.com/ydb-platform/ydb-embedded-ui/commit/86faa42c49c9c757c5aa75eb65567eae0a34e260)) +* **autoRefresh:** move auto refresh to separate reducer ([#943](https://github.com/ydb-platform/ydb-embedded-ui/issues/943)) ([a391e94](https://github.com/ydb-platform/ydb-embedded-ui/commit/a391e9408595d7c6ac3903a13244644475d10ece)) +* **autoRefresh:** use user settings to store auto refresh interval ([#956](https://github.com/ydb-platform/ydb-embedded-ui/issues/956)) ([99a24ce](https://github.com/ydb-platform/ydb-embedded-ui/commit/99a24ceadda3623e59743a9c510810994b0c0a42)) +* **Header:** use InternalLink for breadcrumb items ([#913](https://github.com/ydb-platform/ydb-embedded-ui/issues/913)) ([cdf36da](https://github.com/ydb-platform/ydb-embedded-ui/commit/cdf36daab24e9a558e5c80f6a8672afd1e84e668)) +* **HealthCheck:** show aggregated status in preview ([#839](https://github.com/ydb-platform/ydb-embedded-ui/issues/839)) ([71d316c](https://github.com/ydb-platform/ydb-embedded-ui/commit/71d316c111cdbec2f417fcb54c54144377d326e6)) +* **Navigation:** relocate tenant nav to main space ([#936](https://github.com/ydb-platform/ydb-embedded-ui/issues/936)) ([6161d97](https://github.com/ydb-platform/ydb-embedded-ui/commit/6161d97c3c6a7aa0108cb1af8945ada9f039ec00)) +* **schema:** use rtk-query ([#948](https://github.com/ydb-platform/ydb-embedded-ui/issues/948)) ([524e815](https://github.com/ydb-platform/ydb-embedded-ui/commit/524e815bc593c60381aa78135bf02b3c2f2b8103)) +* **store:** rewrite some reducers to rtk-query ([#942](https://github.com/ydb-platform/ydb-embedded-ui/issues/942)) ([59d41f2](https://github.com/ydb-platform/ydb-embedded-ui/commit/59d41f2868633ae5934d68de44aa538013f9a4ae)) +* **user-settings:** sync user settings with LS ([#951](https://github.com/ydb-platform/ydb-embedded-ui/issues/951)) ([9919358](https://github.com/ydb-platform/ydb-embedded-ui/commit/99193580050336b80a6e65544c0d8fcc9294796e)) + + +### Bug Fixes + +* handle with undefined value of row and column in issue position ([#932](https://github.com/ydb-platform/ydb-embedded-ui/issues/932)) ([2cb27c5](https://github.com/ydb-platform/ydb-embedded-ui/commit/2cb27c575b9f307e6fe164f7e18a3328b4d5a487)) +* rework overview pane in schema browser ([#954](https://github.com/ydb-platform/ydb-embedded-ui/issues/954)) ([ed46a5f](https://github.com/ydb-platform/ydb-embedded-ui/commit/ed46a5f74480813d1eeb3567fae699f4193bd8c7)) +* **TableInfo:** scroll ([#946](https://github.com/ydb-platform/ydb-embedded-ui/issues/946)) ([190992e](https://github.com/ydb-platform/ydb-embedded-ui/commit/190992e25fc422e79f8feb68b6a653b24043aa66)) +* **Tablets:** enable sort by fqdn ([#947](https://github.com/ydb-platform/ydb-embedded-ui/issues/947)) ([e33dc72](https://github.com/ydb-platform/ydb-embedded-ui/commit/e33dc724045340b2492a6b75325147887582fb7d)) +* typo in prettier ([#931](https://github.com/ydb-platform/ydb-embedded-ui/issues/931)) ([e08a36a](https://github.com/ydb-platform/ydb-embedded-ui/commit/e08a36ac67d42691311b9c7ae709f54016ff945d)) + ## [6.6.1](https://github.com/ydb-platform/ydb-embedded-ui/compare/v6.6.0...v6.6.1) (2024-06-14) diff --git a/commitlint.config.js b/commitlint.config.js index 3347cb961..efd4ad90a 100644 --- a/commitlint.config.js +++ b/commitlint.config.js @@ -1 +1,6 @@ -module.exports = {extends: ['@commitlint/config-conventional']}; +module.exports = { + extends: ['@commitlint/config-conventional'], + rules: { + 'header-max-length': [2, 'always', 72], + }, +}; diff --git a/package-lock.json b/package-lock.json index ebadd8535..246eb674d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,27 +1,27 @@ { "name": "ydb-embedded-ui", - "version": "6.6.1", + "version": "6.8.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ydb-embedded-ui", - "version": "6.6.1", + "version": "6.8.0", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/axios-wrapper": "^1.4.1", - "@gravity-ui/chartkit": "^5.5.0", - "@gravity-ui/components": "^3.6.2", - "@gravity-ui/date-utils": "^2.4.0", - "@gravity-ui/i18n": "^1.5.0", - "@gravity-ui/icons": "^2.9.1", - "@gravity-ui/navigation": "^2.10.0", + "@gravity-ui/chartkit": "^5.9.0", + "@gravity-ui/components": "^3.7.0", + "@gravity-ui/date-utils": "^2.5.3", + "@gravity-ui/i18n": "^1.5.1", + "@gravity-ui/icons": "^2.10.0", + "@gravity-ui/navigation": "^2.16.0", "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", - "@gravity-ui/uikit": "^6.15.0", + "@gravity-ui/uikit": "^6.20.1", "@gravity-ui/websql-autocomplete": "^9.1.0", "@reduxjs/toolkit": "^2.2.3", - "axios": "^1.6.8", + "axios": "^1.7.2", "axios-retry": "^4.4.0", "colord": "^2.9.3", "copy-to-clipboard": "^3.3.3", @@ -33,17 +33,17 @@ "path-to-regexp": "^3.0.0", "qs": "^6.12.0", "react-error-boundary": "^4.0.13", - "react-helmet-async": "2.0.4", + "react-helmet-async": "^2.0.5", "react-json-inspector": "^7.1.1", "react-list": "^0.8.17", "react-monaco-editor": "^0.55.0", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "react-router": "^5.3.4", "react-router-dom": "^5.3.4", "react-split": "^2.0.14", "redux": "^5.0.1", "redux-location-state": "^2.8.2", - "tslib": "^2.6.2", + "tslib": "^2.6.3", "url": "^0.11.3", "use-query-params": "^2.2.1", "web-vitals": "^1.1.2", @@ -51,47 +51,47 @@ "zod": "^3.23.8" }, "devDependencies": { - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@gravity-ui/eslint-config": "^3.2.0", "@gravity-ui/prettier-config": "^1.1.0", "@gravity-ui/stylelint-config": "^4.0.1", "@gravity-ui/tsconfig": "^1.0.0", "@playwright/test": "^1.42.1", - "@testing-library/jest-dom": "^6.4.2", + "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^14.2.2", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", "@types/numeral": "^2.0.5", - "@types/qs": "^6.9.14", - "@types/react": "^18.2.73", - "@types/react-dom": "^18.2.23", + "@types/qs": "^6.9.15", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", "copyfiles": "^2.4.1", "http-proxy-middleware": "^2.0.6", "husky": "^9.0.11", "jest-transform-css": "^6.0.1", - "lint-staged": "^15.2.2", + "lint-staged": "^15.2.7", "npm-run-all": "^4.1.5", "postcss": "^8.4.38", "prettier": "^3.2.5", "prop-types": "^15.8.1", - "react": "^18.2.0", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^18.2.0", + "react-dom": "^18.3.1", "react-scripts": "^5.0.1", "sass": "^1.72.0", "source-map-explorer": "^2.5.3", - "stylelint": "^15.0.0", - "ts-jest": "^29.1.2", - "typescript": "^5.4.3" + "stylelint": "^15.11.0", + "ts-jest": "^29.1.5", + "typescript": "^5.5.3" }, "peerDependencies": { "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "^18.3.1", + "react-dom": "^18.3.1" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -104,9 +104,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.3.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz", - "integrity": "sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.0.tgz", + "integrity": "sha512-Ff9+ksdQQB3rMncgqDK78uLznstjyfIf2Arnh22pW8kBpLs6rpKDwgnZT46hin5Hl1WzazzK64DOrhSwYpS7bQ==", "dev": true }, "node_modules/@ampproject/remapping": { @@ -2177,13 +2177,13 @@ "integrity": "sha512-SFBwUHMcb7TFFK5ld88+JhecoEun3/kHZ6KvLDjj3w5hv/tfRV8mtGHA8N42uMctXLF4bPEcr96xwXXcRFuweg==" }, "node_modules/@commitlint/cli": { - "version": "19.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.2.1.tgz", - "integrity": "sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", "dev": true, "dependencies": { - "@commitlint/format": "^19.0.3", - "@commitlint/lint": "^19.1.0", + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", "@commitlint/load": "^19.2.0", "@commitlint/read": "^19.2.1", "@commitlint/types": "^19.0.3", @@ -2390,9 +2390,9 @@ } }, "node_modules/@commitlint/config-conventional": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.1.0.tgz", - "integrity": "sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -2442,9 +2442,9 @@ } }, "node_modules/@commitlint/format": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.0.3.tgz", - "integrity": "sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==", + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -2467,9 +2467,9 @@ } }, "node_modules/@commitlint/is-ignored": { - "version": "19.0.3", - "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.0.3.tgz", - "integrity": "sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", "dev": true, "dependencies": { "@commitlint/types": "^19.0.3", @@ -2480,12 +2480,12 @@ } }, "node_modules/@commitlint/lint": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.1.0.tgz", - "integrity": "sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==", + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", "dev": true, "dependencies": { - "@commitlint/is-ignored": "^19.0.3", + "@commitlint/is-ignored": "^19.2.2", "@commitlint/parse": "^19.0.3", "@commitlint/rules": "^19.0.3", "@commitlint/types": "^19.0.3" @@ -3541,9 +3541,9 @@ } }, "node_modules/@gravity-ui/chartkit": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/chartkit/-/chartkit-5.5.0.tgz", - "integrity": "sha512-IDWObVY7oL1dIbwzVtd4DDz881jYYDgwoSK3hmsMl9SQFzDVs4UG1b4ZMpJt3HQvZek3B5K09Fb40Ij53M+SCg==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/chartkit/-/chartkit-5.9.0.tgz", + "integrity": "sha512-cRR1Y09YnAWIbyOzg2mjpoCtCFV7XAaJh25UjNKJZZO8k2BBroevHY3XIBUg7G+37kwF/S9asfABCsfPkpVOtw==", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/date-utils": "^2.1.0", @@ -3561,9 +3561,9 @@ } }, "node_modules/@gravity-ui/components": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/@gravity-ui/components/-/components-3.6.2.tgz", - "integrity": "sha512-b9Pcw23g2vb9CMc7xMs/FwWpK4tWkhA7VUwgBw6izE24gMFbz6TcsQHwmPrKe1HgoyX4QYd5gpv8hh1yGLsfYA==", + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/components/-/components-3.7.0.tgz", + "integrity": "sha512-cWmVOa6rErZY+F3Ws9zD6vvKlU2nn4eUFzS17R0TlVa4uaIcT2WsPGwAracby/o3Ys1gpSK71AkpW/c8lgcvog==", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/date-utils": "^2.1.0", @@ -3580,9 +3580,9 @@ } }, "node_modules/@gravity-ui/date-utils": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-2.4.0.tgz", - "integrity": "sha512-Bm2s4tsrRoNeBjc1Jxz16xRouR4OljADkPUE1aRAf+aQqZfS1hog/sHnXX802B/LrseoYJbxgLE98aNm5cryZg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/@gravity-ui/date-utils/-/date-utils-2.5.3.tgz", + "integrity": "sha512-WetzttqlW454yGsh/LBo0AxuqIFT0erENCMYAfemhu6qLiuqy35NdDGP6VA4iDkWiSPFuQ1sRoVU8tC+OwiPEg==", "dependencies": { "dayjs": "1.11.10", "lodash": "^4.17.0" @@ -3845,14 +3845,14 @@ } }, "node_modules/@gravity-ui/i18n": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/i18n/-/i18n-1.5.0.tgz", - "integrity": "sha512-ggn+VKiNiWv/hTkTEqFxvTC5VXgUXCH5va0a4kulrThATH8lptF/z13CTiqjXuAimlGdys0S+zoIwTsQ/ATQPg==" + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/i18n/-/i18n-1.5.1.tgz", + "integrity": "sha512-ZvaQtRUf4Yl9zi0+SMzjlDeHp9+p5IXkNu2k6RtW04c+RYKA1jX+umeKNwzft4iR3+KxDlpLX2trTFEW6W7HKQ==" }, "node_modules/@gravity-ui/icons": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/@gravity-ui/icons/-/icons-2.9.1.tgz", - "integrity": "sha512-0OH6YrVxFpHjk3x1f5GWlC+3Ek7LncNy95C9g94C13MhRtMRe0l/ZwSgbOmQ72lDxvQrmidt095Ft+mfID9XmQ==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/icons/-/icons-2.10.0.tgz", + "integrity": "sha512-xS0G4+TM7cD2cCKS4wVc01c4lLe/OreKjm4sHwrOtJWH4EawaRbpkuwtgUDcUvY2EryIcI6lgV+8o714m6lcyQ==", "peerDependencies": { "react": "*" }, @@ -3863,9 +3863,9 @@ } }, "node_modules/@gravity-ui/navigation": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-2.10.0.tgz", - "integrity": "sha512-7e9sZ4ntmMUnt1fYBQUAP0sgwomEBa52918spa/x4OliDqLgY31xFLra7uwkR3MoKrf6M6eebj9nrCH1IQucjg==", + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/@gravity-ui/navigation/-/navigation-2.16.0.tgz", + "integrity": "sha512-9KgigJvO+tBUiuXHP87myHiAcuZtEfmDy2uYS7/6VWQIKBQeFVFG4LP063P31zXmTM8yW6wQCKNlfcRibfgArw==", "dependencies": { "react-transition-group": "^4.4.1", "tslib": "^2.4.0" @@ -3945,9 +3945,9 @@ "dev": true }, "node_modules/@gravity-ui/uikit": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.15.0.tgz", - "integrity": "sha512-UYy1iDgsqbN3y+RKVEZHlPwxwAnrD3YzFgNtg+q/l8g4Inz9uK1W/8WBAKyvbp7cqdoSGONq0t0UsoAtJhybfg==", + "version": "6.20.1", + "resolved": "https://registry.npmjs.org/@gravity-ui/uikit/-/uikit-6.20.1.tgz", + "integrity": "sha512-BtkEWkpPLvXm7C/R23jp1nRwWkcd+pmBbsuJZU4qoYASFk0uhq7apkrrPcfCX+9Qk3PXiZg8xHwUlqjG33y0bw==", "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/i18n": "^1.3.0", @@ -5619,18 +5619,18 @@ } }, "node_modules/@testing-library/jest-dom": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.2.tgz", - "integrity": "sha512-CzqH0AFymEMG48CpzXFriYYkOjk6ZGPCLMhW9e9jg3KMCn5OfJecF8GtGW7yGfR/IgCe3SX8BSwjdzI6BBbZLw==", + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.4.6.tgz", + "integrity": "sha512-8qpnGVincVDLEcQXWaHOf6zmlbwTKc6Us6PPu4CRnPXCzo2OGBS5cwgMMOWdxDpEz1mkbvXHpEy99M5Yvt682w==", "dev": true, "dependencies": { - "@adobe/css-tools": "^4.3.2", + "@adobe/css-tools": "^4.4.0", "@babel/runtime": "^7.9.2", "aria-query": "^5.0.0", "chalk": "^3.0.0", "css.escape": "^1.5.1", "dom-accessibility-api": "^0.6.3", - "lodash": "^4.17.15", + "lodash": "^4.17.21", "redent": "^3.0.0" }, "engines": { @@ -6020,9 +6020,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.14", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.14.tgz", - "integrity": "sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { @@ -6032,18 +6032,18 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "dev": true, "dependencies": { "@types/react": "*" @@ -7285,9 +7285,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", @@ -7743,12 +7743,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -8203,9 +8203,9 @@ } }, "node_modules/cli-truncate/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", @@ -11894,9 +11894,9 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "dependencies": { "to-regex-range": "^5.0.1" @@ -16870,21 +16870,21 @@ "dev": true }, "node_modules/lint-staged": { - "version": "15.2.2", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.2.tgz", - "integrity": "sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==", - "dev": true, - "dependencies": { - "chalk": "5.3.0", - "commander": "11.1.0", - "debug": "4.3.4", - "execa": "8.0.1", - "lilconfig": "3.0.0", - "listr2": "8.0.1", - "micromatch": "4.0.5", - "pidtree": "0.6.0", - "string-argv": "0.3.2", - "yaml": "2.3.4" + "version": "15.2.7", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-15.2.7.tgz", + "integrity": "sha512-+FdVbbCZ+yoh7E/RosSdqKJyUM2OEjTciH0TFNkawKgvFp1zbGlEC39RADg+xKBG1R4mhoH2j85myBQZ5wR+lw==", + "dev": true, + "dependencies": { + "chalk": "~5.3.0", + "commander": "~12.1.0", + "debug": "~4.3.4", + "execa": "~8.0.1", + "lilconfig": "~3.1.1", + "listr2": "~8.2.1", + "micromatch": "~4.0.7", + "pidtree": "~0.6.0", + "string-argv": "~0.3.2", + "yaml": "~2.4.2" }, "bin": { "lint-staged": "bin/lint-staged.js" @@ -16909,12 +16909,12 @@ } }, "node_modules/lint-staged/node_modules/commander": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-11.1.0.tgz", - "integrity": "sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==", + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", "dev": true, "engines": { - "node": ">=16" + "node": ">=18" } }, "node_modules/lint-staged/node_modules/execa": { @@ -16974,12 +16974,15 @@ } }, "node_modules/lint-staged/node_modules/lilconfig": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", - "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz", + "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==", "dev": true, "engines": { "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lint-staged/node_modules/mimic-fn": { @@ -17061,25 +17064,28 @@ } }, "node_modules/lint-staged/node_modules/yaml": { - "version": "2.3.4", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", - "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.5.tgz", + "integrity": "sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==", "dev": true, + "bin": { + "yaml": "bin.mjs" + }, "engines": { "node": ">= 14" } }, "node_modules/listr2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.0.1.tgz", - "integrity": "sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==", + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-8.2.3.tgz", + "integrity": "sha512-Lllokma2mtoniUOS94CcOErHWAug5iu7HOmDrvWgpw8jyQH2fomgB+7lZS4HWZxytUuQwkGOwe49FvwVaA85Xw==", "dev": true, "dependencies": { "cli-truncate": "^4.0.0", "colorette": "^2.0.20", "eventemitter3": "^5.0.1", "log-update": "^6.0.0", - "rfdc": "^1.3.0", + "rfdc": "^1.4.1", "wrap-ansi": "^9.0.0" }, "engines": { @@ -17548,12 +17554,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", "dev": true, "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -20469,9 +20475,9 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -20708,15 +20714,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.1" } }, "node_modules/react-error-boundary": { @@ -20742,17 +20748,16 @@ "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" }, "node_modules/react-helmet-async": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.4.tgz", - "integrity": "sha512-yxjQMWposw+akRfvpl5+8xejl4JtUlHnEBcji6u8/e6oc7ozT+P9PNTWMhCbz2y9tc5zPegw2BvKjQA+NwdEjQ==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/react-helmet-async/-/react-helmet-async-2.0.5.tgz", + "integrity": "sha512-rYUYHeus+i27MvFE+Jaa4WsyBKGkL6qVgbJvSBoX8mbsWoABJXdEO0bZyi0F6i+4f0NuIb8AvqPMj3iXFHkMwg==", "dependencies": { "invariant": "^2.2.4", "react-fast-compare": "^3.2.2", "shallowequal": "^1.1.0" }, "peerDependencies": { - "react": "^16.6.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + "react": "^16.6.0 || ^17.0.0 || ^18.0.0" } }, "node_modules/react-is": { @@ -20827,9 +20832,9 @@ } }, "node_modules/react-redux": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.0.tgz", - "integrity": "sha512-6qoDzIO+gbrza8h3hjMA9aq4nwVFCKFtY2iLxCtVT38Swyy2C/dJCGBXHeHLtx6qlg/8qzc2MrhOeduf5K32wQ==", + "version": "9.1.2", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-9.1.2.tgz", + "integrity": "sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==", "dependencies": { "@types/use-sync-external-store": "^0.0.3", "use-sync-external-store": "^1.0.0" @@ -20837,16 +20842,12 @@ "peerDependencies": { "@types/react": "^18.2.25", "react": "^18.0", - "react-native": ">=0.69", "redux": "^5.0.0" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, - "react-native": { - "optional": true - }, "redux": { "optional": true } @@ -22873,9 +22874,9 @@ } }, "node_modules/rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "node_modules/rimraf": { @@ -23135,9 +23136,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -25131,9 +25132,9 @@ } }, "node_modules/ts-jest": { - "version": "29.1.2", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.2.tgz", - "integrity": "sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==", + "version": "29.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.1.5.tgz", + "integrity": "sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==", "dev": true, "dependencies": { "bs-logger": "0.x", @@ -25149,10 +25150,11 @@ "ts-jest": "cli.js" }, "engines": { - "node": "^16.10.0 || ^18.0.0 || >=20.0.0" + "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" }, "peerDependencies": { "@babel/core": ">=7.0.0-beta.0 <8", + "@jest/transform": "^29.0.0", "@jest/types": "^29.0.0", "babel-jest": "^29.0.0", "jest": "^29.0.0", @@ -25162,6 +25164,9 @@ "@babel/core": { "optional": true }, + "@jest/transform": { + "optional": true + }, "@jest/types": { "optional": true }, @@ -25268,9 +25273,9 @@ } }, "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -25410,9 +25415,9 @@ } }, "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.5.3.tgz", + "integrity": "sha512-/hreyEujaB0w76zKo6717l3L0o/qEUtRgdvUBvlkhoWeOVMjMuHNHk0BRBzikzuGDqNmPQbg5ifMEqsHLiIUcQ==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -26536,9 +26541,9 @@ "dev": true }, "node_modules/wrap-ansi/node_modules/string-width": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.1.0.tgz", - "integrity": "sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", + "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", "dev": true, "dependencies": { "emoji-regex": "^10.3.0", diff --git a/package.json b/package.json index df908d4a1..042faf554 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ydb-embedded-ui", - "version": "6.6.1", + "version": "6.8.0", "files": [ "dist" ], @@ -12,18 +12,18 @@ "dependencies": { "@bem-react/classname": "^1.6.0", "@gravity-ui/axios-wrapper": "^1.4.1", - "@gravity-ui/chartkit": "^5.5.0", - "@gravity-ui/components": "^3.6.2", - "@gravity-ui/date-utils": "^2.4.0", - "@gravity-ui/i18n": "^1.5.0", - "@gravity-ui/icons": "^2.9.1", - "@gravity-ui/navigation": "^2.10.0", + "@gravity-ui/chartkit": "^5.9.0", + "@gravity-ui/components": "^3.7.0", + "@gravity-ui/date-utils": "^2.5.3", + "@gravity-ui/i18n": "^1.5.1", + "@gravity-ui/icons": "^2.10.0", + "@gravity-ui/navigation": "^2.16.0", "@gravity-ui/paranoid": "^2.0.1", "@gravity-ui/react-data-table": "^2.1.1", - "@gravity-ui/uikit": "^6.15.0", + "@gravity-ui/uikit": "^6.20.1", "@gravity-ui/websql-autocomplete": "^9.1.0", "@reduxjs/toolkit": "^2.2.3", - "axios": "^1.6.8", + "axios": "^1.7.2", "axios-retry": "^4.4.0", "colord": "^2.9.3", "copy-to-clipboard": "^3.3.3", @@ -35,17 +35,17 @@ "path-to-regexp": "^3.0.0", "qs": "^6.12.0", "react-error-boundary": "^4.0.13", - "react-helmet-async": "2.0.4", + "react-helmet-async": "^2.0.5", "react-json-inspector": "^7.1.1", "react-list": "^0.8.17", "react-monaco-editor": "^0.55.0", - "react-redux": "^9.1.0", + "react-redux": "^9.1.2", "react-router": "^5.3.4", "react-router-dom": "^5.3.4", "react-split": "^2.0.14", "redux": "^5.0.1", "redux-location-state": "^2.8.2", - "tslib": "^2.6.2", + "tslib": "^2.6.3", "url": "^0.11.3", "use-query-params": "^2.2.1", "web-vitals": "^1.1.2", @@ -66,7 +66,7 @@ "lint:other": "npm run prettier -- --check", "prettier": "prettier '**/*.{json,yaml,yml,md}'", "unimported": "npx unimported --no-cache", - "package": "rm -rf dist && tsc -p tsconfig.package.json && copyfiles -u 1 'src/**/*.{css,scss,svg}' dist/src", + "package": "rm -rf dist && tsc -p tsconfig.package.json && copyfiles -u 1 'src/**/*.{css,scss,svg}' dist", "test": "react-app-rewired test", "eject": "react-scripts eject", "prepublishOnly": "npm run package", @@ -122,54 +122,54 @@ ] }, "devDependencies": { - "@commitlint/cli": "^19.2.1", - "@commitlint/config-conventional": "^19.1.0", + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@gravity-ui/eslint-config": "^3.2.0", "@gravity-ui/prettier-config": "^1.1.0", "@gravity-ui/stylelint-config": "^4.0.1", "@gravity-ui/tsconfig": "^1.0.0", "@playwright/test": "^1.42.1", - "@testing-library/jest-dom": "^6.4.2", + "@testing-library/jest-dom": "^6.4.6", "@testing-library/react": "^14.2.2", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.12", "@types/lodash": "^4.17.0", "@types/numeral": "^2.0.5", - "@types/qs": "^6.9.14", - "@types/react": "^18.2.73", - "@types/react-dom": "^18.2.23", + "@types/qs": "^6.9.15", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", "@types/react-router": "^5.1.20", "@types/react-router-dom": "^5.3.3", "copyfiles": "^2.4.1", "http-proxy-middleware": "^2.0.6", "husky": "^9.0.11", "jest-transform-css": "^6.0.1", - "lint-staged": "^15.2.2", + "lint-staged": "^15.2.7", "npm-run-all": "^4.1.5", "postcss": "^8.4.38", "prettier": "^3.2.5", "prop-types": "^15.8.1", - "react": "^18.2.0", + "react": "^18.3.1", "react-app-rewired": "^2.2.1", - "react-dom": "^18.2.0", + "react-dom": "^18.3.1", "react-scripts": "^5.0.1", "sass": "^1.72.0", "source-map-explorer": "^2.5.3", - "stylelint": "^15.0.0", - "ts-jest": "^29.1.2", - "typescript": "^5.4.3" + "stylelint": "^15.11.0", + "ts-jest": "^29.1.5", + "typescript": "^5.5.3" }, "peerDependencies": { "prop-types": "^15.8.1", - "react": "^18.2.0", - "react-dom": "^18.2.0" + "react": "^18.3.1", + "react-dom": "^18.3.1" }, "overrides": { "fork-ts-checker-webpack-plugin": "^9.0.2", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "redux": "^5.0.1", - "typescript": "^5.4.3", - "monaco-editor": "^0.48.0" + "react": "$react", + "react-dom": "$react-dom", + "redux": "$redux", + "typescript": "$typescript", + "monaco-editor": "$monaco-editor" } } diff --git a/src/components/FullNodeViewer/FullNodeViewer.tsx b/src/components/FullNodeViewer/FullNodeViewer.tsx index 667c33def..5cdd3b1f5 100644 --- a/src/components/FullNodeViewer/FullNodeViewer.tsx +++ b/src/components/FullNodeViewer/FullNodeViewer.tsx @@ -35,7 +35,7 @@ export const FullNodeViewer = ({node, className}: FullNodeViewerProps) => { {label: 'Rack', value: node?.Rack}, ); - const averageInfo = node?.LoadAverage?.map((load, loadIndex) => ({ + const averageInfo = node?.LoadAveragePercents?.map((load, loadIndex) => ({ label: LOAD_AVERAGE_TIME_INTERVALS[loadIndex], value: ( diff --git a/src/components/InfoViewer/InfoViewer.tsx b/src/components/InfoViewer/InfoViewer.tsx index 780497028..09e000a30 100644 --- a/src/components/InfoViewer/InfoViewer.tsx +++ b/src/components/InfoViewer/InfoViewer.tsx @@ -2,6 +2,8 @@ import React from 'react'; import {cn} from '../../utils/cn'; +import i18n from './i18n'; + import './InfoViewer.scss'; export interface InfoViewerItem { @@ -10,7 +12,7 @@ export interface InfoViewerItem { } export interface InfoViewerProps { - title?: string; + title?: React.ReactNode; info?: InfoViewerItem[]; dots?: boolean; size?: 's'; @@ -53,7 +55,7 @@ export const InfoViewer = ({ ))} ) : ( - No {title} data + i18n('no-data') )} ); diff --git a/src/components/InfoViewer/i18n/en.json b/src/components/InfoViewer/i18n/en.json index 5c4f44aaa..2ed830fef 100644 --- a/src/components/InfoViewer/i18n/en.json +++ b/src/components/InfoViewer/i18n/en.json @@ -1,4 +1,5 @@ { "common.created": "Created", - "common.type": "Type" + "common.type": "Type", + "no-data": "No data" } diff --git a/src/components/InfoViewer/i18n/index.ts b/src/components/InfoViewer/i18n/index.ts index 33853de36..b7acedb9e 100644 --- a/src/components/InfoViewer/i18n/index.ts +++ b/src/components/InfoViewer/i18n/index.ts @@ -1,8 +1,7 @@ import {registerKeysets} from '../../../utils/i18n'; import en from './en.json'; -import ru from './ru.json'; const COMPONENT = 'ydb-components-info-viewer'; -export default registerKeysets(COMPONENT, {ru, en}); +export default registerKeysets(COMPONENT, {en}); diff --git a/src/components/InfoViewer/i18n/ru.json b/src/components/InfoViewer/i18n/ru.json deleted file mode 100644 index f88f2cb2f..000000000 --- a/src/components/InfoViewer/i18n/ru.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "common.created": "Создано", - "common.type": "Тип" -} diff --git a/src/containers/AppWithClusters/AppWithClusters.tsx b/src/containers/AppWithClusters/AppWithClusters.tsx index 84d8d24ab..1567ebacc 100644 --- a/src/containers/AppWithClusters/AppWithClusters.tsx +++ b/src/containers/AppWithClusters/AppWithClusters.tsx @@ -31,7 +31,7 @@ const defaultUserSettings = settings; defaultUserSettings[2].sections[0].settings.push({ title: i18n('settings.useClusterBalancerAsBackend.title'), - helpPopoverContent: i18n('settings.useClusterBalancerAsBackend.popover'), + description: i18n('settings.useClusterBalancerAsBackend.popover'), settingKey: USE_CLUSTER_BALANCER_AS_BACKEND_KEY, }); diff --git a/src/containers/Nodes/getNodesColumns.tsx b/src/containers/Nodes/getNodesColumns.tsx index 53bb70217..73cd56517 100644 --- a/src/containers/Nodes/getNodesColumns.tsx +++ b/src/containers/Nodes/getNodesColumns.tsx @@ -136,13 +136,12 @@ const cpuColumn: NodesColumn = { const loadAverageColumn: NodesColumn = { name: NODES_COLUMNS_IDS.LoadAverage, header: 'Load average', - sortAccessor: ({LoadAverage = []}) => - LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0), + sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0], defaultOrder: DataTable.DESCENDING, render: ({row}) => - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( ) : ( '—' diff --git a/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx b/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx index eb554831c..70c7c1ba8 100644 --- a/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx +++ b/src/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx @@ -106,7 +106,8 @@ const erasureColumn: StorageGroupsColumn = { const degradedColumn: StorageGroupsColumn = { name: GROUPS_COLUMNS_IDS.Degraded, header: 'Degraded', - width: 100, + width: 110, + resizeMinWidth: 110, render: ({row}) => row.Degraded ? ( @@ -120,8 +121,8 @@ const degradedColumn: StorageGroupsColumn = { const usageColumn: StorageGroupsColumn = { name: GROUPS_COLUMNS_IDS.Usage, header: 'Usage', - width: 100, - resizeMinWidth: 70, + width: 75, + resizeMinWidth: 75, render: ({row}) => { // without a limit the usage can be evaluated as 0, // but the absence of a value is more clear diff --git a/src/containers/Tenant/Acl/Acl.scss b/src/containers/Tenant/Acl/Acl.scss index 8fa11a339..bc84893ac 100644 --- a/src/containers/Tenant/Acl/Acl.scss +++ b/src/containers/Tenant/Acl/Acl.scss @@ -1,17 +1,22 @@ @import '../../../styles/mixins.scss'; .ydb-acl { - &__result { - align-self: flex-start; - } - + width: 100%; &__owner-container { - position: sticky; - z-index: 2; - top: 0; - + padding-bottom: 25px; + } + &__result { padding-bottom: 16px; + } - background-color: var(--g-color-base-background); + &__owner { + font-weight: 600; + } + &__definition-content { + display: flex; + flex-direction: column; + } + &__group-label { + @include subheader-2-typography(); } } diff --git a/src/containers/Tenant/Acl/Acl.tsx b/src/containers/Tenant/Acl/Acl.tsx index 469549f15..fea22afaa 100644 --- a/src/containers/Tenant/Acl/Acl.tsx +++ b/src/containers/Tenant/Acl/Acl.tsx @@ -1,28 +1,20 @@ import React from 'react'; -import type {Column} from '@gravity-ui/react-data-table'; +import type {DefinitionListItem} from '@gravity-ui/components'; +import {DefinitionList} from '@gravity-ui/components'; import {ResponseError} from '../../../components/Errors/ResponseError'; import {Loader} from '../../../components/Loader'; -import {ResizeableDataTable} from '../../../components/ResizeableDataTable/ResizeableDataTable'; import {schemaAclApi} from '../../../store/reducers/schemaAcl/schemaAcl'; import type {TACE} from '../../../types/api/acl'; +import {valueIsDefined} from '../../../utils'; import {cn} from '../../../utils/cn'; -import {DEFAULT_TABLE_SETTINGS} from '../../../utils/constants'; import i18n from '../i18n'; import './Acl.scss'; const b = cn('ydb-acl'); -const ACL_COLUMNS_WIDTH_LS_KEY = 'aclTableColumnsWidth'; - -const TABLE_SETTINGS = { - ...DEFAULT_TABLE_SETTINGS, - dynamicRender: false, - stickyTop: 36, -}; - const prepareLogin = (value: string | undefined) => { if (value && value.endsWith('@staff') && !value.startsWith('svc_')) { const login = value.split('@')[0]; @@ -32,42 +24,107 @@ const prepareLogin = (value: string | undefined) => { return value; }; -const columns: Column[] = [ - { - name: 'AccessType', - header: 'Access Type', - sortable: false, - render: ({row}) => row.AccessType, - }, - { - name: 'AccessRights', - header: 'Access Rights', - render: ({row}) => { - return row.AccessRights?.map((item, index) => { - return
{item}
; - }); - }, - sortable: false, - }, - { - name: 'Subject', - sortable: false, - render: ({row}) => { - return prepareLogin(row.Subject); - }, - width: 140, - }, - { - name: 'InheritanceType', - header: 'Inheritance Type', - render: ({row}) => { - return row.InheritanceType?.map((item, index) => { - return
{item}
; - }); +const aclParams = ['access', 'type', 'inheritance'] as const; + +type AclParameter = (typeof aclParams)[number]; + +const aclParamToName: Record = { + access: 'Access', + type: 'Access type', + inheritance: 'Inheritance type', +}; + +const defaultInheritanceType = ['Object', 'Container']; +const defaultAccessType = 'Allow'; + +const defaultInheritanceTypeSet = new Set(defaultInheritanceType); + +function normalizeAcl(acl: TACE[]) { + return acl.map((ace) => { + const {AccessRules = [], AccessRights = [], AccessType, InheritanceType, Subject} = ace; + const access = AccessRules.concat(AccessRights); + //"Allow" is default access type. We want to show it only if it isn't default + const type = AccessType === defaultAccessType ? undefined : AccessType; + let inheritance; + // ['Object', 'Container'] - is default inheritance type. We want to show it only if it isn't default + if ( + InheritanceType?.length !== defaultInheritanceTypeSet.size || + InheritanceType.some((t) => !defaultInheritanceTypeSet.has(t)) + ) { + inheritance = InheritanceType; + } + return { + access: access.length ? access : undefined, + type, + inheritance, + Subject, + }; + }); +} + +interface DefinitionValueProps { + value: string | string[]; +} + +function DefinitionValue({value}: DefinitionValueProps) { + const normalizedValue = typeof value === 'string' ? [value] : value; + return ( +
+ {normalizedValue.map((el) => ( + {el} + ))} +
+ ); +} + +function getAclListItems(acl?: TACE[]): DefinitionListItem[] { + if (!acl || !acl.length) { + return []; + } + + const normalizedAcl = normalizeAcl(acl); + + return normalizedAcl.map(({Subject, ...data}) => { + const definedDataEntries = Object.entries(data).filter(([_key, value]) => + Boolean(value), + ) as [AclParameter, string | string[]][]; + + if (definedDataEntries.length === 1 && definedDataEntries[0][0] === 'access') { + return { + name: Subject, + content: , + }; + } + return { + label: {Subject}, + items: aclParams + .map((key) => { + const value = data[key]; + if (value) { + return { + name: aclParamToName[key], + content: , + }; + } + return undefined; + }) + .filter(valueIsDefined), + }; + }); +} + +function getOwnerItem(owner?: string) { + const preparedOwner = prepareLogin(owner); + if (!preparedOwner) { + return []; + } + return [ + { + name: {preparedOwner}, + content: {i18n('acl.owner')}, }, - sortable: false, - }, -]; + ] as DefinitionListItem[]; +} export const Acl = ({path}: {path: string}) => { const {currentData, isFetching, error} = schemaAclApi.useGetSchemaAclQuery({path}); @@ -75,33 +132,9 @@ export const Acl = ({path}: {path: string}) => { const loading = isFetching && !currentData; const {acl, owner} = currentData || {}; - const renderTable = () => { - if (!acl || !acl.length) { - return null; - } - - return ( - - ); - }; - - const renderOwner = () => { - if (!owner) { - return null; - } + const aclListItems = getAclListItems(acl); - return ( -
- {`${i18n('acl.owner')}: `} - {prepareLogin(owner)} -
- ); - }; + const ownerItem = getOwnerItem(owner); if (loading) { return ; @@ -117,10 +150,16 @@ export const Acl = ({path}: {path: string}) => { return (
-
- {renderOwner()} - {renderTable()} -
+ {ownerItem.length ? ( + + ) : null} + {aclListItems.length ? ( + + ) : null}
); }; diff --git a/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx b/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx index 07fb6513a..a87c16762 100644 --- a/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx +++ b/src/containers/Tenant/Diagnostics/Overview/TableInfo/TableInfo.tsx @@ -4,7 +4,7 @@ import {InfoViewer} from '../../../../../components/InfoViewer'; import type {KeyValueRow} from '../../../../../types/api/query'; import type {EPathType, TEvDescribeSchemeResult} from '../../../../../types/api/schema'; import {cn} from '../../../../../utils/cn'; -import {getEntityName} from '../../../utils'; +import {EntityTitle} from '../../../EntityTitle/EntityTitle'; import i18n from './i18n'; import {prepareTableInfo} from './prepareTableInfo'; @@ -20,7 +20,7 @@ interface TableInfoProps { } export const TableInfo = ({data, type, olapStats}: TableInfoProps) => { - const entityName = getEntityName(data?.PathDescription); + const title = ; const { generalInfo = [], @@ -33,9 +33,9 @@ export const TableInfo = ({data, type, olapStats}: TableInfoProps) => {
{entityName}
} + renderEmptyState={() =>
{title}
} />
diff --git a/src/containers/Tenant/EntityTitle/EntityTitle.tsx b/src/containers/Tenant/EntityTitle/EntityTitle.tsx new file mode 100644 index 000000000..953291d40 --- /dev/null +++ b/src/containers/Tenant/EntityTitle/EntityTitle.tsx @@ -0,0 +1,23 @@ +import {Flex, Label} from '@gravity-ui/uikit'; + +import type {TPathDescription} from '../../../types/api/schema'; +import i18n from '../i18n'; +import {getEntityName, isReadOnlyTable} from '../utils'; + +interface EntityTitleProps { + data?: TPathDescription; +} + +export function EntityTitle({data}: EntityTitleProps) { + const entityName = getEntityName(data); + + if (isReadOnlyTable(data)) { + return ( + + {entityName} + + ); + } + + return entityName; +} diff --git a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx index ca7c84d57..c558bd5b8 100644 --- a/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx +++ b/src/containers/Tenant/ObjectSummary/ObjectSummary.tsx @@ -15,7 +15,6 @@ import type {InfoViewerItem} from '../../../components/InfoViewer/InfoViewer'; import {LinkWithIcon} from '../../../components/LinkWithIcon/LinkWithIcon'; import {Loader} from '../../../components/Loader'; import SplitPane from '../../../components/SplitPane'; -import {getEntityName} from '../../../containers/Tenant/utils'; import routes, {createExternalUILink, createHref} from '../../../routes'; import {schemaApi, setShowPreview} from '../../../store/reducers/schema/schema'; import { @@ -33,6 +32,7 @@ import { import {formatDateTime, formatSecondsToHours} from '../../../utils/dataFormatters/dataFormatters'; import {useTypedDispatch, useTypedSelector} from '../../../utils/hooks'; import {Acl} from '../Acl/Acl'; +import {EntityTitle} from '../EntityTitle/EntityTitle'; import {SchemaTree} from '../Schema/SchemaTree/SchemaTree'; import {SchemaViewer} from '../Schema/SchemaViewer/SchemaViewer'; import {TENANT_INFO_TABS, TENANT_SCHEMA_TAB, TenantTabsGroups} from '../TenantPages'; @@ -159,7 +159,8 @@ export function ObjectSummary({ }); const {PathDescription} = currentObjectData; - const title = getEntityName(PathDescription); + + const title = ; const getPathTypeOverview: Record InfoViewerItem[]) | undefined> = { [EPathType.EPathTypeInvalid]: undefined, diff --git a/src/containers/Tenant/TenantNavigation/TenantNavigation.tsx b/src/containers/Tenant/TenantNavigation/TenantNavigation.tsx index a346fba13..61fbc2626 100644 --- a/src/containers/Tenant/TenantNavigation/TenantNavigation.tsx +++ b/src/containers/Tenant/TenantNavigation/TenantNavigation.tsx @@ -40,7 +40,7 @@ export const TenantNavigation = () => { onUpdate={handleUpdate} size="l" className={b('body')} - defaultValue={getCurrentItem().id} + value={getCurrentItem().id} options={navigationItems.map(transformItemToOption)} />
diff --git a/src/containers/Tenant/i18n/en.json b/src/containers/Tenant/i18n/en.json index defb9ee44..8b358bb9a 100644 --- a/src/containers/Tenant/i18n/en.json +++ b/src/containers/Tenant/i18n/en.json @@ -21,6 +21,7 @@ "summary.mode": "Mode", "summary.format": "Format", "summary.retention": "Retention", + "label.read-only": "ReadOnly", "actions.copied": "The path is copied to the clipboard", "actions.notCopied": "Couldn’t copy the path", "actions.copyPath": "Copy path", @@ -29,6 +30,7 @@ "actions.createExternalTable": "Create external table...", "actions.createTopic": "Create topic...", "actions.createColumnTable": "Create column table...", + "actions.createAsyncReplication": "Create async replication...", "actions.createView": "Create view...", "actions.dropTable": "Drop table...", "actions.dropTopic": "Drop topic...", @@ -36,5 +38,7 @@ "actions.alterTable": "Alter table...", "actions.alterTopic": "Alter topic...", "actions.selectQuery": "Select query...", - "actions.upsertQuery": "Upsert query..." + "actions.upsertQuery": "Upsert query...", + "actions.alterReplication": "Alter async replicaton...", + "actions.dropReplication": "Drop async replicaton..." } diff --git a/src/containers/Tenant/utils/index.ts b/src/containers/Tenant/utils/index.ts index f85b2ccca..d0861b5a8 100644 --- a/src/containers/Tenant/utils/index.ts +++ b/src/containers/Tenant/utils/index.ts @@ -7,3 +7,9 @@ export const getEntityName = (pathDescription?: TPathDescription) => { return mapPathTypeToEntityName(PathType, PathSubType); }; + +export const isReadOnlyTable = (pathDescription?: TPathDescription) => { + return pathDescription?.UserAttributes?.some(({Key, Value}) => { + return Key === '__async_replica' && Value === 'true'; + }); +}; diff --git a/src/containers/Tenant/utils/queryTemplates.ts b/src/containers/Tenant/utils/queryTemplates.ts index a6958cbe4..7b367bc38 100644 --- a/src/containers/Tenant/utils/queryTemplates.ts +++ b/src/containers/Tenant/utils/queryTemplates.ts @@ -42,6 +42,20 @@ CREATE TABLE \`${path}/ydb_column_table\` ( PARTITION BY HASH(id) WITH (STORE = COLUMN)`; }; +export const createAsyncReplicationTemplate = () => { + return `CREATE OBJECT secret_name (TYPE SECRET) WITH value="secret_value"; + +CREATE ASYNC REPLICATION my_replication +FOR \`/remote_database/table_name\` AS \`local_table_name\` --[, \`/remote_database/another_table_name\` AS \`another_local_table_name\` ...] +WITH ( + CONNECTION_STRING="grpcs://mydb.ydb.tech:2135/?database=/remote_database", + TOKEN_SECRET_NAME = "secret_name" + -- ENDPOINT="mydb.ydb.tech:2135", + -- DATABASE=\`/remote_database\`, + -- USER="user", + -- PASSWORD_SECRET_NAME="your_password" +);`; +}; export const alterTableTemplate = (path: string) => { return `ALTER TABLE \`${path}\` ADD COLUMN is_deleted Bool;`; @@ -131,3 +145,10 @@ export const createViewTemplate = (path: string) => { export const dropViewTemplate = (path: string) => { return `DROP VIEW \`${path}\`;`; }; +export const dropAsyncReplicationTemplate = (path: string) => { + return `DROP ASYNC REPLICATION \`${path}\`;`; +}; + +export const alterAsyncReplicationTemplate = (path: string) => { + return `ALTER ASYNC REPLICATION \`${path}\` SET (STATE = "DONE", FAILOVER_MODE = "FORCE");`; +}; diff --git a/src/containers/Tenant/utils/schemaActions.ts b/src/containers/Tenant/utils/schemaActions.ts index 95aee7d3c..f3b34ecf1 100644 --- a/src/containers/Tenant/utils/schemaActions.ts +++ b/src/containers/Tenant/utils/schemaActions.ts @@ -9,13 +9,16 @@ import createToast from '../../../utils/createToast'; import i18n from '../i18n'; import { + alterAsyncReplicationTemplate, alterTableTemplate, alterTopicTemplate, + createAsyncReplicationTemplate, createColumnTableTemplate, createExternalTableTemplate, createTableTemplate, createTopicTemplate, createViewTemplate, + dropAsyncReplicationTemplate, dropExternalTableTemplate, dropTopicTemplate, dropViewTemplate, @@ -49,6 +52,9 @@ const bindActions = ( return { createTable: inputQuery(createTableTemplate, 'script'), createColumnTable: inputQuery(createColumnTableTemplate, 'script'), + createAsyncReplication: inputQuery(createAsyncReplicationTemplate, 'script'), + alterAsyncReplication: inputQuery(alterAsyncReplicationTemplate, 'script'), + dropAsyncReplication: inputQuery(dropAsyncReplicationTemplate, 'script'), alterTable: inputQuery(alterTableTemplate, 'script'), selectQuery: inputQuery(selectQueryTemplate), upsertQuery: inputQuery(upsertQueryTemplate), @@ -92,6 +98,10 @@ export const getActions = [ {text: i18n('actions.createTable'), action: actions.createTable}, {text: i18n('actions.createColumnTable'), action: actions.createColumnTable}, + { + text: i18n('actions.createAsyncReplication'), + action: actions.createAsyncReplication, + }, {text: i18n('actions.createTopic'), action: actions.createTopic}, {text: i18n('actions.createView'), action: actions.createView}, ], @@ -135,12 +145,20 @@ export const getActions = [{text: i18n('actions.dropView'), action: actions.dropView}], ]; + const ASYNC_REPLICATION_SET: ActionsSet = [ + [copyItem], + [ + {text: i18n('actions.alterReplication'), action: actions.alterAsyncReplication}, + {text: i18n('actions.dropReplication'), action: actions.dropAsyncReplication}, + ], + ]; + const JUST_COPY: ActionsSet = [copyItem]; // verbose mapping to guarantee a correct actions set for new node types // TS will error when a new type is added in the lib but is not mapped here const nodeTypeToActions: Record = { - async_replication: JUST_COPY, + async_replication: ASYNC_REPLICATION_SET, database: DIR_SET, directory: DIR_SET, diff --git a/src/containers/UserSettings/Setting.tsx b/src/containers/UserSettings/Setting.tsx index c251eb555..14c3bb07d 100644 --- a/src/containers/UserSettings/Setting.tsx +++ b/src/containers/UserSettings/Setting.tsx @@ -1,10 +1,13 @@ -import {Settings} from '@gravity-ui/navigation'; import {RadioButton, Switch} from '@gravity-ui/uikit'; -import {LabelWithPopover} from '../../components/LabelWithPopover/LabelWithPopover'; import {useSetting} from '../../utils/hooks'; -import {b} from './UserSettings'; +export interface SettingsInfoFieldProps { + type: 'info'; + title: string; + description?: React.ReactNode; + content: React.ReactNode; +} export type SettingsElementType = 'switch' | 'radio'; @@ -13,7 +16,6 @@ export interface SettingProps { title: string; description?: React.ReactNode; settingKey: string; - helpPopoverContent?: React.ReactNode; options?: {value: string; content: string}[]; defaultValue?: unknown; onValueUpdate?: VoidFunction; @@ -22,9 +24,6 @@ export interface SettingProps { export const Setting = ({ type = 'switch', settingKey, - title, - description, - helpPopoverContent, options, defaultValue, onValueUpdate, @@ -36,73 +35,30 @@ export const Setting = ({ onValueUpdate?.(); }; - const renderTitleComponent = (value: React.ReactNode) => { - if (helpPopoverContent) { - return ( - - ); + switch (type) { + case 'switch': { + return ; } - return value; - }; - - const getSettingsElement = (elementType: SettingsElementType) => { - switch (elementType) { - case 'switch': { - return ; - } - - case 'radio': { - if (!options) { - return null; - } - - return ( - - {options.map(({value, content}) => { - return ( - - {content} - - ); - })} - - ); + case 'radio': { + if (!options) { + return null; } - default: - return null; + return ( + + {options.map(({value, content}) => { + return ( + + {content} + + ); + })} + + ); } - }; - - return ( - - {getSettingsElement(type)} - - ); -}; - -export interface SettingsInfoFieldProps { - type: 'info'; - title: string; - description?: React.ReactNode; - content: React.ReactNode; -} -export const SettingsInfoField = ({title, description, content}: SettingsInfoFieldProps) => { - return ( - - {content} - - ); + default: + return null; + } }; diff --git a/src/containers/UserSettings/UserSettings.scss b/src/containers/UserSettings/UserSettings.scss deleted file mode 100644 index 62068a567..000000000 --- a/src/containers/UserSettings/UserSettings.scss +++ /dev/null @@ -1,9 +0,0 @@ -.ydb-user-settings { - &__item-with-popup { - max-width: 180px; - } - - &__popup { - max-width: 370px; - } -} diff --git a/src/containers/UserSettings/UserSettings.tsx b/src/containers/UserSettings/UserSettings.tsx index b0057d706..2500d0de3 100644 --- a/src/containers/UserSettings/UserSettings.tsx +++ b/src/containers/UserSettings/UserSettings.tsx @@ -1,15 +1,9 @@ import {Settings} from '@gravity-ui/navigation'; -import {cn} from '../../utils/cn'; - -import {Setting, SettingsInfoField} from './Setting'; +import {Setting} from './Setting'; import type {YDBEmbeddedUISettings} from './settings'; import {settings} from './settings'; -import './UserSettings.scss'; - -export const b = cn('ydb-user-settings'); - interface UserSettingsProps { settings?: YDBEmbeddedUISettings; } @@ -30,13 +24,16 @@ export const UserSettings = ({settings: userSettings = settings}: UserSettingsPr {sectionSettings.map((setting) => { if (setting.type === 'info') { return ( - + + {setting.content} + ); } - return ; + return ( + + + + ); })} ); diff --git a/src/containers/UserSettings/i18n/en.json b/src/containers/UserSettings/i18n/en.json index 03f80807e..0de5561ca 100644 --- a/src/containers/UserSettings/i18n/en.json +++ b/src/containers/UserSettings/i18n/en.json @@ -32,13 +32,13 @@ "settings.invertedDisks.title": "Inverted disks space indicators", "settings.useNodesEndpoint.title": "Break the Nodes tab in Diagnostics", - "settings.useNodesEndpoint.popover": "Use /viewer/json/nodes endpoint for Nodes Tab in diagnostics. It could return incorrect data on some versions", + "settings.useNodesEndpoint.popover": "Use /viewer/json/nodes endpoint for Nodes tab in diagnostics. It could return incorrect data on versions before 24-1", "settings.useVirtualTables.title": "Use table with data load on scroll for Nodes and Storage tabs", "settings.useVirtualTables.popover": "It will increase performance, but could work unstable", "settings.queryUseMultiSchema.title": "Allow queries with multiple result sets", - "settings.queryUseMultiSchema.popover": "Use 'multi' schema for queries that enables queries with multiple result sets. Returns nothing on versions 23-3 and older", + "settings.queryUseMultiSchema.popover": "Use 'multi' schema for queries. It enables queries with multiple result sets. It returns nothing on versions 23-3 and older", "settings.about.interfaceVersionInfoField.title": "Interface version" } diff --git a/src/containers/UserSettings/settings.tsx b/src/containers/UserSettings/settings.tsx index 62b0414ed..9a47202c4 100644 --- a/src/containers/UserSettings/settings.tsx +++ b/src/containers/UserSettings/settings.tsx @@ -96,17 +96,17 @@ export const invertedDisksSetting: SettingProps = { export const useNodesEndpointSetting: SettingProps = { settingKey: USE_NODES_ENDPOINT_IN_DIAGNOSTICS_KEY, title: i18n('settings.useNodesEndpoint.title'), - helpPopoverContent: i18n('settings.useNodesEndpoint.popover'), + description: i18n('settings.useNodesEndpoint.popover'), }; export const useVirtualTables: SettingProps = { settingKey: USE_BACKEND_PARAMS_FOR_TABLES_KEY, title: i18n('settings.useVirtualTables.title'), - helpPopoverContent: i18n('settings.useVirtualTables.popover'), + description: i18n('settings.useVirtualTables.popover'), }; export const queryUseMultiSchemaSetting: SettingProps = { settingKey: QUERY_USE_MULTI_SCHEMA_KEY, title: i18n('settings.queryUseMultiSchema.title'), - helpPopoverContent: i18n('settings.queryUseMultiSchema.popover'), + description: i18n('settings.queryUseMultiSchema.popover'), }; export const enableAutocompleteSetting: SettingProps = { diff --git a/src/containers/Versions/NodesTable/NodesTable.tsx b/src/containers/Versions/NodesTable/NodesTable.tsx index bcb892824..d2e0ef04c 100644 --- a/src/containers/Versions/NodesTable/NodesTable.tsx +++ b/src/containers/Versions/NodesTable/NodesTable.tsx @@ -51,12 +51,12 @@ const columns: Column[] = [ align: DataTable.LEFT, }, { - name: 'uptime', + name: 'Uptime', header: 'Uptime', sortAccessor: ({StartTime}) => StartTime && -StartTime, width: 120, align: DataTable.LEFT, - render: ({row}) => row.uptime, + render: ({row}) => row.Uptime, }, { name: 'MemoryUsed', @@ -90,15 +90,14 @@ const columns: Column[] = [ { name: 'LoadAverage', header: 'Load average', - sortAccessor: ({LoadAverage = []}) => - LoadAverage.slice(0, 1).reduce((acc, item) => acc + item, 0), + sortAccessor: ({LoadAveragePercents = []}) => LoadAveragePercents[0], defaultOrder: DataTable.DESCENDING, width: 140, resizeMinWidth: 140, render: ({row}) => - row.LoadAverage && row.LoadAverage.length > 0 ? ( + row.LoadAveragePercents && row.LoadAveragePercents.length > 0 ? ( ({ @@ -13,12 +11,7 @@ export const clusterNodesApi = api.injectEndpoints({ try { const result = await window.api.getClusterNodes(); const {SystemStateInfo: nodes = []} = result; - const data: PreparedClusterNode[] = nodes.map((node) => { - return { - ...node, - uptime: calcUptime(node.StartTime), - }; - }); + const data: PreparedClusterNode[] = nodes.map(prepareNodeSystemState); return {data}; } catch (error) { return {error}; diff --git a/src/store/reducers/nodes/types.ts b/src/store/reducers/nodes/types.ts index 8800ce8d7..05e3e7a68 100644 --- a/src/store/reducers/nodes/types.ts +++ b/src/store/reducers/nodes/types.ts @@ -34,6 +34,7 @@ export interface NodesPreparedEntity { PoolStats?: TPoolStats[]; LoadAverage?: number[]; + LoadAveragePercents?: number[]; Tablets?: TFullTabletStateInfo[] | TComputeTabletStateInfo[]; Endpoints?: TEndpoint[]; diff --git a/src/store/reducers/nodes/utils.ts b/src/store/reducers/nodes/utils.ts index 0190b4edc..caec30288 100644 --- a/src/store/reducers/nodes/utils.ts +++ b/src/store/reducers/nodes/utils.ts @@ -2,17 +2,18 @@ import type {TComputeInfo, TComputeNodeInfo, TComputeTenantInfo} from '../../../ import type {TNodesInfo} from '../../../types/api/nodes'; import {calcUptime} from '../../../utils/dataFormatters/dataFormatters'; import {generateEvaluator} from '../../../utils/generateEvaluator'; -import {prepareNodeSystemState} from '../../../utils/nodes'; +import {calculateLoadAveragePercents, prepareNodeSystemState} from '../../../utils/nodes'; import type {NodesHandledResponse, NodesPreparedEntity} from './types'; -const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string) => { +const prepareComputeNode = (node: TComputeNodeInfo, tenantName?: string): NodesPreparedEntity => { return { ...node, // v2 response has tenant name, v1 - doesn't TenantName: node.Tenant ?? tenantName, SystemState: node?.Overall, Uptime: calcUptime(node?.StartTime), + LoadAveragePercents: calculateLoadAveragePercents(node), DC: node.DataCenter, }; diff --git a/src/styles/mixins.scss b/src/styles/mixins.scss index 571b99130..af80fbe18 100644 --- a/src/styles/mixins.scss +++ b/src/styles/mixins.scss @@ -35,6 +35,11 @@ line-height: var(--g-text-subheader-3-line-height); } +@mixin subheader-2-typography() { + font-size: var(--g-text-subheader-2-font-size); + line-height: var(--g-text-subheader-2-line-height); +} + @mixin header-1-typography() { font-size: var(--g-text-header-1-font-size); line-height: var(--g-text-header-1-line-height); diff --git a/src/styles/themes.scss b/src/styles/themes.scss index df980850d..1d543486f 100644 --- a/src/styles/themes.scss +++ b/src/styles/themes.scss @@ -7,7 +7,7 @@ .g-root { --g-text-header-font-weight: 500; - --g-text-subheader-font-weight: 500; + --g-text-subheader-font-weight: 600; --g-text-display-font-weight: 500; --g-text-accent-font-weight: 500; diff --git a/src/types/api/acl.ts b/src/types/api/acl.ts index ae0bae32e..411c4e651 100644 --- a/src/types/api/acl.ts +++ b/src/types/api/acl.ts @@ -19,7 +19,8 @@ export interface TMetaCommonInfo { export interface TACE { AccessType: string; AccessRights?: string[]; + AccessRules?: string[]; Subject: string; InheritanceType?: string[]; - AccessRule: string; + AccessRule?: string; } diff --git a/src/types/api/schema/schema.ts b/src/types/api/schema/schema.ts index 2bc0c781d..f4929b271 100644 --- a/src/types/api/schema/schema.ts +++ b/src/types/api/schema/schema.ts @@ -61,6 +61,7 @@ export interface TPathDescription { /** info about the path itself */ Self?: TDirEntry; DomainDescription?: TDomainDescription; + UserAttributes?: TUserAttribute[]; // for directory Children?: TDirEntry[]; @@ -309,3 +310,8 @@ interface TTablePartition { /** uint64 */ DatashardId?: string; } + +interface TUserAttribute { + Key?: string; + Value?: string; +} diff --git a/src/utils/nodes.ts b/src/utils/nodes.ts index 93106d444..60c7f84bf 100644 --- a/src/utils/nodes.ts +++ b/src/utils/nodes.ts @@ -3,6 +3,7 @@ import {z} from 'zod'; import type {NodesPreparedEntity} from '../store/reducers/nodes/types'; import {ProblemFilterValues} from '../store/reducers/settings/settings'; import type {ProblemFilterValue} from '../store/reducers/settings/types'; +import type {TComputeNodeInfo} from '../types/api/compute'; import {EFlag} from '../types/api/enums'; import type {TSystemStateInfo} from '../types/api/nodes'; import type {TNodeInfo} from '../types/api/nodesList'; @@ -12,6 +13,8 @@ import type {NodesMap} from '../types/store/nodesList'; import {HOUR_IN_SECONDS} from './constants'; import {calcUptime} from './dataFormatters/dataFormatters'; +import {valueIsDefined} from '.'; + export enum NodesUptimeFilterValues { 'All' = 'All', 'SmallUptime' = 'SmallUptime', @@ -38,9 +41,22 @@ export const prepareNodesMap = (nodesList?: TNodeInfo[]) => { }, new Map()); }; +export function calculateLoadAveragePercents(node: TSystemStateInfo | TComputeNodeInfo = {}) { + const {LoadAverage, NumberOfCpus} = node; + + if (!valueIsDefined(LoadAverage) || !valueIsDefined(NumberOfCpus)) { + return undefined; + } + + return LoadAverage.map((value) => { + return (value * 100) / NumberOfCpus; + }); +} + export interface PreparedNodeSystemState extends TSystemStateInfo { Rack?: string; DC?: string; + LoadAveragePercents?: number[]; Uptime: string; } @@ -53,11 +69,14 @@ export const prepareNodeSystemState = ( const Uptime = calcUptime(systemState.StartTime); + const LoadAveragePercents = calculateLoadAveragePercents(systemState); + return { ...systemState, Rack, DC, Uptime, + LoadAveragePercents, }; }; diff --git a/tsconfig.json b/tsconfig.json index 58aec1883..f8d811f10 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -2,7 +2,9 @@ "extends": "@gravity-ui/tsconfig/tsconfig", "compilerOptions": { "outDir": "build/esm", - "module": "esnext", + "target": "ES2018", + "module": "ESNext", + "moduleResolution": "Bundler", "jsx": "react-jsx", "lib": ["dom", "dom.iterable", "esnext"], "allowSyntheticDefaultImports": true, diff --git a/tsconfig.package.json b/tsconfig.package.json index 8185af8cf..1858681a4 100644 --- a/tsconfig.package.json +++ b/tsconfig.package.json @@ -2,10 +2,11 @@ "extends": "./tsconfig", "compilerOptions": { "outDir": "dist", + "rootDir": "src", "declaration": true, "noEmit": false, "importHelpers": true }, - "include": ["src/**/*", "package.json"], + "include": ["src/**/*"], "exclude": ["src/setup*", "src/index.tsx", "**/__tests__", "**/tests"] }