ydb-embedded-ui 4.19.3 → 4.20.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/dist/components/CellWithPopover/CellWithPopover.scss +13 -0
  3. package/dist/components/CellWithPopover/CellWithPopover.tsx +26 -0
  4. package/dist/components/LinkToSchemaObject/LinkToSchemaObject.tsx +20 -0
  5. package/dist/components/NodeHostWrapper/NodeHostWrapper.scss +0 -2
  6. package/dist/components/NodeHostWrapper/NodeHostWrapper.tsx +28 -29
  7. package/dist/components/QueryExecutionStatus/QueryExecutionStatus.tsx +3 -2
  8. package/dist/components/TruncatedQuery/TruncatedQuery.scss +8 -0
  9. package/dist/components/TruncatedQuery/TruncatedQuery.tsx +15 -1
  10. package/dist/components/UsageLabel/UsageLabel.scss +6 -0
  11. package/dist/components/UsageLabel/UsageLabel.tsx +22 -0
  12. package/dist/containers/AsideNavigation/AsideNavigation.tsx +13 -8
  13. package/dist/containers/AsideNavigation/i18n/en.json +13 -0
  14. package/dist/containers/AsideNavigation/i18n/index.ts +11 -0
  15. package/dist/containers/AsideNavigation/i18n/ru.json +13 -0
  16. package/dist/containers/Node/NodeStructure/Pdisk.tsx +74 -68
  17. package/dist/containers/Node/NodeStructure/Vdisk.tsx +9 -33
  18. package/dist/containers/Nodes/Nodes.tsx +10 -2
  19. package/dist/containers/Nodes/getNodesColumns.tsx +207 -123
  20. package/dist/containers/Storage/Storage.tsx +9 -2
  21. package/dist/containers/Storage/StorageGroups/StorageGroups.scss +0 -11
  22. package/dist/containers/Storage/StorageGroups/getStorageGroupsColumns.tsx +11 -11
  23. package/dist/containers/Storage/utils/index.ts +1 -22
  24. package/dist/containers/Tenant/Diagnostics/Describe/Describe.tsx +2 -3
  25. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.scss +0 -1
  26. package/dist/containers/Tenant/Diagnostics/DetailedOverview/DetailedOverview.tsx +4 -2
  27. package/dist/containers/Tenant/Diagnostics/Diagnostics.tsx +1 -0
  28. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckDetails.tsx +8 -1
  29. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/HealthcheckPreview.tsx +11 -1
  30. package/dist/containers/Tenant/Diagnostics/TenantOverview/Healthcheck/IssuesViewer/IssueTree.tsx +0 -1
  31. package/dist/containers/Tenant/Diagnostics/TenantOverview/MetricsCards/MetricsCards.tsx +3 -0
  32. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TenantCpu.tsx +21 -0
  33. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByCpu.tsx +53 -0
  34. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopNodesByLoad.tsx +53 -0
  35. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopQueries.tsx +83 -0
  36. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantCpu/TopShards.tsx +53 -0
  37. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TenantMemory.tsx +9 -0
  38. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantMemory/TopNodesByMemory.tsx +55 -0
  39. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.scss +44 -0
  40. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverview.tsx +35 -19
  41. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantOverviewTableLayout.tsx +53 -0
  42. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.tsx +4 -2
  43. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopGroups.tsx +9 -36
  44. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TopTables.tsx +22 -41
  45. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/en.json +3 -3
  46. package/dist/containers/Tenant/Diagnostics/TenantOverview/i18n/ru.json +3 -3
  47. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.scss +0 -2
  48. package/dist/containers/Tenant/Diagnostics/TopQueries/TopQueries.tsx +19 -61
  49. package/dist/containers/Tenant/Diagnostics/TopQueries/getTopQueriesColumns.tsx +102 -0
  50. package/dist/containers/Tenant/Diagnostics/TopShards/Filters/Filters.tsx +2 -2
  51. package/dist/containers/Tenant/Diagnostics/TopShards/TopShards.tsx +18 -97
  52. package/dist/containers/Tenant/Diagnostics/TopShards/getTopShardsColumns.tsx +138 -0
  53. package/dist/containers/Tenant/Info/ExternalTable/ExternalTable.tsx +2 -4
  54. package/dist/containers/Tenant/Query/ExecuteResult/{ExecuteResult.js → ExecuteResult.tsx} +51 -31
  55. package/dist/containers/Tenant/Query/Issues/Issues.tsx +4 -6
  56. package/dist/containers/Tenant/Query/QueryDuration/QueryDuration.tsx +1 -1
  57. package/dist/containers/Tenant/utils/paneVisibilityToggleHelpers.tsx +1 -1
  58. package/dist/routes.ts +26 -1
  59. package/dist/store/reducers/{executeTopQueries.ts → executeTopQueries/executeTopQueries.ts} +23 -75
  60. package/dist/{types/store/executeTopQueries.ts → store/reducers/executeTopQueries/types.ts} +3 -7
  61. package/dist/store/reducers/executeTopQueries/utils.ts +36 -0
  62. package/dist/store/reducers/index.ts +12 -2
  63. package/dist/store/reducers/nodes/types.ts +1 -0
  64. package/dist/store/reducers/nodes/utils.ts +16 -6
  65. package/dist/store/reducers/{shardsWorkload.ts → shardsWorkload/shardsWorkload.ts} +5 -11
  66. package/dist/{types/store/shardsWorkload.ts → store/reducers/shardsWorkload/types.ts} +3 -7
  67. package/dist/store/reducers/tenantOverview/topNodesByCpu/topNodesByCpu.ts +87 -0
  68. package/dist/store/reducers/tenantOverview/topNodesByCpu/types.ts +29 -0
  69. package/dist/store/reducers/tenantOverview/topNodesByLoad/topNodesByLoad.ts +87 -0
  70. package/dist/store/reducers/tenantOverview/topNodesByLoad/types.ts +29 -0
  71. package/dist/store/reducers/tenantOverview/topNodesByMemory/topNodesByMemory.ts +87 -0
  72. package/dist/store/reducers/tenantOverview/topNodesByMemory/types.ts +29 -0
  73. package/dist/store/reducers/tenantOverview/topQueries/tenantOverviewTopQueries.ts +93 -0
  74. package/dist/store/reducers/tenantOverview/topQueries/types.ts +14 -0
  75. package/dist/store/reducers/tenantOverview/topShards/tenantOverviewTopShards.ts +103 -0
  76. package/dist/store/reducers/tenantOverview/topShards/types.ts +14 -0
  77. package/dist/store/reducers/tenantOverview/topShards/utils.ts +3 -0
  78. package/dist/styles/mixins.scss +4 -0
  79. package/dist/types/additionalProps.ts +3 -1
  80. package/dist/types/api/compute.ts +1 -1
  81. package/dist/types/react-json-inspector.d.ts +21 -0
  82. package/dist/utils/diagnostics.ts +23 -0
  83. package/dist/utils/generateEvaluator.ts +21 -0
  84. package/dist/utils/generateHash.ts +11 -0
  85. package/package.json +3 -2
  86. package/dist/containers/Tenant/Diagnostics/TenantOverview/TenantStorage/TenantStorage.scss +0 -41
package/CHANGELOG.md CHANGED
@@ -1,5 +1,32 @@
1
1
  # Changelog
2
2
 
3
+ ## [4.20.1](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.20.0...v4.20.1) (2023-10-24)
4
+
5
+
6
+ ### Bug Fixes
7
+
8
+ * fix createExternalUILink ([#571](https://github.com/ydb-platform/ydb-embedded-ui/issues/571)) ([52546f1](https://github.com/ydb-platform/ydb-embedded-ui/commit/52546f17dbfdb255b2429836e880d6812b19d66a))
9
+ * fix incorrect truncate strings with popover ([#567](https://github.com/ydb-platform/ydb-embedded-ui/issues/567)) ([d82e65b](https://github.com/ydb-platform/ydb-embedded-ui/commit/d82e65b925b76dc539a76520eccf601951654e94))
10
+ * fix top queries table row height ([#565](https://github.com/ydb-platform/ydb-embedded-ui/issues/565)) ([b12dceb](https://github.com/ydb-platform/ydb-embedded-ui/commit/b12dcebdb0167fd5852c247bca48844ef6ab35af))
11
+ * refactor metrics storage section ([#568](https://github.com/ydb-platform/ydb-embedded-ui/issues/568)) ([db5d922](https://github.com/ydb-platform/ydb-embedded-ui/commit/db5d922d06b88c9d8a792220d2a178c81806c09e))
12
+ * update @types/react ([#570](https://github.com/ydb-platform/ydb-embedded-ui/issues/570)) ([1e38c5b](https://github.com/ydb-platform/ydb-embedded-ui/commit/1e38c5bb3b4b2139b2141636d6434c2a2ec65772))
13
+
14
+ ## [4.20.0](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.19.3...v4.20.0) (2023-10-19)
15
+
16
+
17
+ ### Features
18
+
19
+ * add top nodes by memory table ([#562](https://github.com/ydb-platform/ydb-embedded-ui/issues/562)) ([0d4ccf2](https://github.com/ydb-platform/ydb-embedded-ui/commit/0d4ccf2a85251fadad66182ab7d6ccd54a58e6cf))
20
+ * add top tables links ([#564](https://github.com/ydb-platform/ydb-embedded-ui/issues/564)) ([e9b918f](https://github.com/ydb-platform/ydb-embedded-ui/commit/e9b918f0abace890cfafd9d7b219be5b69cac820))
21
+ * **Storage:** hide nodes table for node page ([#557](https://github.com/ydb-platform/ydb-embedded-ui/issues/557)) ([9a25a00](https://github.com/ydb-platform/ydb-embedded-ui/commit/9a25a002b28824f7e616ac8143dbde12de0b0fb7))
22
+ * **TenantOverview:** add cpu tab to tenant diagnostics ([#550](https://github.com/ydb-platform/ydb-embedded-ui/issues/550)) ([3048f84](https://github.com/ydb-platform/ydb-embedded-ui/commit/3048f8478d97249da4f7b66c26ed55f6f21e0f81))
23
+
24
+
25
+ ### Bug Fixes
26
+
27
+ * add loader for healthcheck ([#563](https://github.com/ydb-platform/ydb-embedded-ui/issues/563)) ([6caea3d](https://github.com/ydb-platform/ydb-embedded-ui/commit/6caea3dec8f901090b0f8f7c1796880d7dc90a99))
28
+ * **LinkToSchemaObject:** fix schema link ([#566](https://github.com/ydb-platform/ydb-embedded-ui/issues/566)) ([6ca8a70](https://github.com/ydb-platform/ydb-embedded-ui/commit/6ca8a705b6ddacb1f845aabb7761fd22c0c3b4e0))
29
+
3
30
  ## [4.19.3](https://github.com/ydb-platform/ydb-embedded-ui/compare/v4.19.2...v4.19.3) (2023-10-13)
4
31
 
5
32
 
@@ -0,0 +1,13 @@
1
+ .ydb-cell-with-popover {
2
+ display: flex;
3
+
4
+ &__popover {
5
+ display: inline-block;
6
+ overflow: hidden;
7
+
8
+ max-width: 100%;
9
+
10
+ white-space: nowrap;
11
+ text-overflow: ellipsis;
12
+ }
13
+ }
@@ -0,0 +1,26 @@
1
+ import cn from 'bem-cn-lite';
2
+
3
+ import {Popover, type PopoverProps} from '@gravity-ui/uikit';
4
+
5
+ import './CellWithPopover.scss';
6
+
7
+ const b = cn('ydb-cell-with-popover');
8
+
9
+ interface CellWithPopoverProps extends PopoverProps {
10
+ wrapperClassName?: string;
11
+ }
12
+
13
+ export function CellWithPopover({
14
+ children,
15
+ className,
16
+ wrapperClassName,
17
+ ...props
18
+ }: CellWithPopoverProps) {
19
+ return (
20
+ <div className={b(null, wrapperClassName)}>
21
+ <Popover className={b('popover', className)} {...props}>
22
+ {children}
23
+ </Popover>
24
+ </div>
25
+ );
26
+ }
@@ -0,0 +1,20 @@
1
+ import type {Location} from 'history';
2
+
3
+ import {Link, type LinkProps} from '@gravity-ui/uikit';
4
+
5
+ import {createExternalUILink, parseQuery} from '../../routes';
6
+
7
+ interface LinkToSchemaObjectProps extends LinkProps {
8
+ path: string;
9
+ location: Location;
10
+ }
11
+
12
+ export function LinkToSchemaObject({path, location, ...props}: LinkToSchemaObjectProps) {
13
+ const queryParams = parseQuery(location);
14
+ const pathToSchemaObject = createExternalUILink({
15
+ ...queryParams,
16
+ schema: path,
17
+ });
18
+
19
+ return <Link view="normal" href={pathToSchemaObject} {...props} />;
20
+ }
@@ -1,6 +1,4 @@
1
1
  .ydb-node-host-wrapper {
2
- display: flex;
3
-
4
2
  &__host-wrapper {
5
3
  display: flex;
6
4
 
@@ -1,6 +1,6 @@
1
1
  import block from 'bem-cn-lite';
2
2
 
3
- import {Button, Popover, PopoverBehavior} from '@gravity-ui/uikit';
3
+ import {Button, PopoverBehavior} from '@gravity-ui/uikit';
4
4
 
5
5
  import type {NodesPreparedEntity} from '../../store/reducers/nodes/types';
6
6
  import type {NodeAddress} from '../../types/additionalProps';
@@ -10,6 +10,7 @@ import {isUnavailableNode} from '../../utils/nodes';
10
10
  import EntityStatus from '../EntityStatus/EntityStatus';
11
11
  import {NodeEndpointsTooltipContent} from '../TooltipsContent';
12
12
  import {IconWrapper} from '../Icon';
13
+ import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
13
14
 
14
15
  import './NodeHostWrapper.scss';
15
16
 
@@ -34,33 +35,31 @@ export const NodeHostWrapper = ({node, getNodeRef}: NodeHostWrapperProps) => {
34
35
  : undefined;
35
36
 
36
37
  return (
37
- <div className={b()}>
38
- <Popover
39
- disabled={!isNodeAvailable}
40
- content={<NodeEndpointsTooltipContent data={node} />}
41
- placement={['top', 'bottom']}
42
- behavior={PopoverBehavior.Immediate}
43
- >
44
- <div className={b('host-wrapper')}>
45
- <EntityStatus
46
- name={node.Host}
47
- status={node.SystemState}
48
- path={nodePath}
49
- hasClipboardButton
50
- className={b('host')}
51
- />
52
- {nodeRef && (
53
- <Button
54
- size="s"
55
- href={nodeRef}
56
- className={b('external-button')}
57
- target="_blank"
58
- >
59
- <IconWrapper name="external" />
60
- </Button>
61
- )}
62
- </div>
63
- </Popover>
64
- </div>
38
+ <CellWithPopover
39
+ disabled={!isNodeAvailable}
40
+ content={<NodeEndpointsTooltipContent data={node} />}
41
+ placement={['top', 'bottom']}
42
+ behavior={PopoverBehavior.Immediate}
43
+ >
44
+ <div className={b('host-wrapper')}>
45
+ <EntityStatus
46
+ name={node.Host}
47
+ status={node.SystemState}
48
+ path={nodePath}
49
+ hasClipboardButton
50
+ className={b('host')}
51
+ />
52
+ {nodeRef && (
53
+ <Button
54
+ size="s"
55
+ href={nodeRef}
56
+ className={b('external-button')}
57
+ target="_blank"
58
+ >
59
+ <IconWrapper name="external" />
60
+ </Button>
61
+ )}
62
+ </div>
63
+ </CellWithPopover>
65
64
  );
66
65
  };
@@ -14,14 +14,15 @@ const b = cn('kv-query-execution-status');
14
14
 
15
15
  interface QueryExecutionStatusProps {
16
16
  className?: string;
17
- error?: AxiosError | Record<string, any>;
17
+ // TODO: Remove Record<string, any> when ECONNABORTED error case is fully typed
18
+ error?: AxiosError | Record<string, any> | string;
18
19
  }
19
20
 
20
21
  export const QueryExecutionStatus = ({className, error}: QueryExecutionStatusProps) => {
21
22
  let icon: ReactNode;
22
23
  let label: string;
23
24
 
24
- if (error?.code === 'ECONNABORTED') {
25
+ if (typeof error === 'object' && error?.code === 'ECONNABORTED') {
25
26
  icon = <UiKitIcon data={questionIcon} size={16} />;
26
27
  label = 'Connection aborted';
27
28
  } else {
@@ -14,4 +14,12 @@
14
14
  }
15
15
  }
16
16
  }
17
+
18
+ &__popover-content {
19
+ overflow: hidden;
20
+
21
+ max-width: 600px;
22
+
23
+ white-space: pre;
24
+ }
17
25
  }
@@ -1,11 +1,13 @@
1
1
  import cn from 'bem-cn-lite';
2
2
 
3
+ import {CellWithPopover} from '../CellWithPopover/CellWithPopover';
4
+
3
5
  import './TruncatedQuery.scss';
4
6
 
5
7
  const b = cn('kv-truncated-query');
6
8
 
7
9
  interface TruncatedQueryProps {
8
- value: string | undefined;
10
+ value?: string;
9
11
  maxQueryHeight?: number;
10
12
  }
11
13
 
@@ -26,3 +28,15 @@ export const TruncatedQuery = ({value = '', maxQueryHeight = 6}: TruncatedQueryP
26
28
  }
27
29
  return <>{value}</>;
28
30
  };
31
+
32
+ interface OneLineQueryWithPopoverProps {
33
+ value?: string;
34
+ }
35
+
36
+ export const OneLineQueryWithPopover = ({value = ''}: OneLineQueryWithPopoverProps) => {
37
+ return (
38
+ <CellWithPopover contentClassName={b('popover-content')} content={value}>
39
+ {value}
40
+ </CellWithPopover>
41
+ );
42
+ };
@@ -0,0 +1,6 @@
1
+ .ydb-usage-label {
2
+ &_overload {
3
+ color: var(--yc-color-text-light-primary);
4
+ background-color: var(--yc-color-base-danger-heavy);
5
+ }
6
+ }
@@ -0,0 +1,22 @@
1
+ import cn from 'bem-cn-lite';
2
+
3
+ import {Label, type LabelProps} from '@gravity-ui/uikit';
4
+
5
+ const b = cn('ydb-usage-label');
6
+
7
+ interface UsageLabelProps extends LabelProps {
8
+ value: number | string;
9
+ overloadThreshold?: number;
10
+ }
11
+
12
+ export function UsageLabel({value, overloadThreshold = 90, theme, ...props}: UsageLabelProps) {
13
+ return (
14
+ <Label
15
+ theme={theme}
16
+ className={b({overload: Number(value) >= overloadThreshold})}
17
+ {...props}
18
+ >
19
+ {value || 0}%
20
+ </Label>
21
+ );
22
+ }
@@ -28,6 +28,7 @@ import {ASIDE_HEADER_COMPACT_KEY, TENANT_INITIAL_PAGE_KEY} from '../../utils/con
28
28
  import {getTenantPath} from '../Tenant/TenantPages';
29
29
  import {UserSettings} from '../UserSettings/UserSettings';
30
30
 
31
+ import i18n from './i18n';
31
32
  import './AsideNavigation.scss';
32
33
 
33
34
  const b = cn('kv-navigation');
@@ -58,15 +59,19 @@ function YbdInternalUser({ydbUser, logout}: YbdInternalUserProps) {
58
59
  return (
59
60
  <div className={b('internal-user')}>
60
61
  <div className={b('user-info-wrapper')}>
61
- <div className={b('ydb-internal-user-title')}>YDB user</div>
62
+ <div className={b('ydb-internal-user-title')}>{i18n('account.user')}</div>
62
63
  {ydbUser && <div className={b('username')}>{ydbUser}</div>}
63
64
  </div>
64
65
  {ydbUser ? (
65
- <Button view="flat-secondary" onClick={logout} title="logout">
66
+ <Button view="flat-secondary" title={i18n('account.logout')} onClick={logout}>
66
67
  <Icon data={signOutIcon} size={16} />
67
68
  </Button>
68
69
  ) : (
69
- <Button view="flat-secondary" title="login" onClick={handleLoginClick}>
70
+ <Button
71
+ view="flat-secondary"
72
+ title={i18n('account.login')}
73
+ onClick={handleLoginClick}
74
+ >
70
75
  <Icon data={signInIcon} size={16} />
71
76
  </Button>
72
77
  )}
@@ -91,7 +96,7 @@ function YdbUserDropdown({isCompact, popupAnchor, ydbUser}: YdbUserDropdownProps
91
96
  compact={isCompact}
92
97
  item={{
93
98
  id: 'user-popup',
94
- title: ydbUser?.login ?? 'Account',
99
+ title: ydbUser?.login ?? i18n('navigation-item.account'),
95
100
  current: isUserDropdownVisible,
96
101
  icon: iconData,
97
102
  iconSize: 22,
@@ -142,7 +147,7 @@ export const useGetLeftNavigationItems = () => {
142
147
  const items: MenuItem[] = [
143
148
  {
144
149
  id: TENANT_PAGES_IDS.query,
145
- title: 'Query',
150
+ title: i18n('pages.query'),
146
151
  icon: terminalIcon,
147
152
  iconSize: 20,
148
153
  location: getTenantPath({
@@ -152,7 +157,7 @@ export const useGetLeftNavigationItems = () => {
152
157
  },
153
158
  {
154
159
  id: TENANT_PAGES_IDS.diagnostics,
155
- title: 'Diagnostics',
160
+ title: i18n('pages.diagnostics'),
156
161
  icon: pulseIcon,
157
162
  iconSize: 20,
158
163
  location: getTenantPath({
@@ -212,7 +217,7 @@ function AsideNavigation(props: AsideNavigationProps) {
212
217
  compact={compact}
213
218
  item={{
214
219
  id: 'documentation',
215
- title: 'Documentation',
220
+ title: i18n('navigation-item.documentation'),
216
221
  icon: supportIcon,
217
222
  iconSize: 24,
218
223
  onItemClick: () => {
@@ -224,7 +229,7 @@ function AsideNavigation(props: AsideNavigationProps) {
224
229
  <FooterItem
225
230
  item={{
226
231
  id: 'user-settings',
227
- title: 'Settings',
232
+ title: i18n('navigation-item.settings'),
228
233
  icon: settingsIcon,
229
234
  iconSize: 24,
230
235
  current: visiblePanel === Panel.UserSettings,
@@ -0,0 +1,13 @@
1
+ {
2
+ "pages.query": "Query",
3
+ "pages.diagnostics": "Diagnostics",
4
+
5
+ "navigation-item.documentation": "Documentation",
6
+ "navigation-item.settings": "Settings",
7
+ "navigation-item.account": "Account",
8
+
9
+ "account.user": "YDB User",
10
+
11
+ "account.login": "Login",
12
+ "account.logout": "Logout"
13
+ }
@@ -0,0 +1,11 @@
1
+ import {i18n, Lang} from '../../../utils/i18n';
2
+
3
+ import en from './en.json';
4
+ import ru from './ru.json';
5
+
6
+ const COMPONENT = 'ydb-aside-navigation';
7
+
8
+ i18n.registerKeyset(Lang.En, COMPONENT, en);
9
+ i18n.registerKeyset(Lang.Ru, COMPONENT, ru);
10
+
11
+ export default i18n.keyset(COMPONENT);
@@ -0,0 +1,13 @@
1
+ {
2
+ "pages.query": "Редактор запросов",
3
+ "pages.diagnostics": "Диагностика",
4
+
5
+ "navigation-item.documentation": "Документация",
6
+ "navigation-item.settings": "Настройки",
7
+ "navigation-item.account": "Аккаунт",
8
+
9
+ "account.user": "Пользователь YDB",
10
+
11
+ "account.login": "Войти",
12
+ "account.logout": "Выйти"
13
+ }