Skip to content

Commit c1cab16

Browse files
authored
Merge branch 'main' into astandrik.move-query-templates-to-a-hierarchical-menu-1153
2 parents 163583c + 1728e61 commit c1cab16

29 files changed

+276
-110
lines changed

package-lock.json

Lines changed: 10 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"@gravity-ui/table": "^0.5.0",
2525
"@gravity-ui/uikit": "^6.20.1",
2626
"@gravity-ui/websql-autocomplete": "^9.1.0",
27+
"@hookform/resolvers": "^3.9.0",
2728
"@reduxjs/toolkit": "^2.2.3",
2829
"@tanstack/react-table": "^8.19.3",
2930
"axios": "^1.7.3",

src/containers/App/App.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ body,
4242
--ydb-color-status-grey: var(--g-color-base-neutral-heavy);
4343
--ydb-color-status-green: var(--g-color-base-positive-heavy);
4444
--ydb-color-status-yellow: var(--g-color-base-warning-heavy);
45-
--ydb-color-status-orange: #ff922e;
45+
--ydb-color-status-orange: var(--g-color-private-orange-500-solid);
4646
--ydb-color-status-red: var(--g-color-base-danger-heavy);
4747
--ydb-color-status-blue: var(--g-color-base-info-heavy);
4848
--ydb-color-status-black: var(--g-color-base-misc-heavy);

src/containers/Nodes/Nodes.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import React from 'react';
22

33
import {ASCENDING} from '@gravity-ui/react-data-table/build/esm/lib/constants';
4+
import {TableColumnSetup} from '@gravity-ui/uikit';
45
import {StringParam, useQueryParams} from 'use-query-params';
56

67
import {EntitiesCount} from '../../components/EntitiesCount';
@@ -33,13 +34,12 @@ import {
3334
} from '../../utils/hooks';
3435
import {
3536
NodesUptimeFilterValues,
36-
isSortableNodesProperty,
3737
isUnavailableNode,
3838
nodesUptimeFilterValuesSchema,
3939
} from '../../utils/nodes';
4040

41-
import {getNodesColumns} from './columns/columns';
4241
import {NODES_COLUMNS_WIDTH_LS_KEY} from './columns/constants';
42+
import {useNodesSelectedColumns} from './columns/hooks';
4343
import i18n from './i18n';
4444

4545
import './Nodes.scss';
@@ -65,6 +65,11 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
6565
const problemFilter = useTypedSelector(selectProblemFilter);
6666
const [autoRefreshInterval] = useAutoRefreshInterval();
6767

68+
const {columnsToShow, columnsToSelect, setColumns} = useNodesSelectedColumns({
69+
getNodeRef: additionalNodesProps.getNodeRef,
70+
database,
71+
});
72+
6873
const {
6974
currentData: data,
7075
isLoading,
@@ -114,20 +119,18 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
114119
label={'Nodes'}
115120
loading={isLoading}
116121
/>
122+
<TableColumnSetup
123+
popupWidth={200}
124+
items={columnsToSelect}
125+
showStatus
126+
onUpdate={setColumns}
127+
sortable={false}
128+
/>
117129
</React.Fragment>
118130
);
119131
};
120132

121133
const renderTable = () => {
122-
const rawColumns = getNodesColumns({
123-
getNodeRef: additionalNodesProps.getNodeRef,
124-
database,
125-
});
126-
127-
const columns = rawColumns.map((column) => {
128-
return {...column, sortable: isSortableNodesProperty(column.name)};
129-
});
130-
131134
if (nodes.length === 0) {
132135
if (
133136
problemFilter !== ProblemFilterValues.ALL ||
@@ -141,7 +144,7 @@ export const Nodes = ({path, database, additionalNodesProps = {}}: NodesProps) =
141144
<ResizeableDataTable
142145
columnsWidthLSKey={NODES_COLUMNS_WIDTH_LS_KEY}
143146
data={nodes || []}
144-
columns={columns}
147+
columns={columnsToShow}
145148
settings={DEFAULT_TABLE_SETTINGS}
146149
sortOrder={sort}
147150
onSort={handleSort}

src/containers/Nodes/PaginatedNodes.tsx

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React from 'react';
22

3+
import {TableColumnSetup} from '@gravity-ui/uikit';
34
import {StringParam, useQueryParams} from 'use-query-params';
45

56
import {EntitiesCount} from '../../components/EntitiesCount';
@@ -27,13 +28,12 @@ import {cn} from '../../utils/cn';
2728
import {useTypedDispatch, useTypedSelector} from '../../utils/hooks';
2829
import {
2930
NodesUptimeFilterValues,
30-
isSortableNodesProperty,
3131
isUnavailableNode,
3232
nodesUptimeFilterValuesSchema,
3333
} from '../../utils/nodes';
3434

35-
import {getNodesColumns} from './columns/columns';
3635
import {NODES_COLUMNS_WIDTH_LS_KEY} from './columns/constants';
36+
import {useNodesSelectedColumns} from './columns/hooks';
3737
import {getNodes} from './getNodes';
3838
import i18n from './i18n';
3939

@@ -69,6 +69,11 @@ export const PaginatedNodes = ({
6969
return {path, database, searchValue, problemFilter, uptimeFilter};
7070
}, [path, database, searchValue, problemFilter, uptimeFilter]);
7171

72+
const {columnsToShow, columnsToSelect, setColumns} = useNodesSelectedColumns({
73+
getNodeRef: additionalNodesProps?.getNodeRef,
74+
database,
75+
});
76+
7277
const getRowClassName: GetRowClassName<NodesPreparedEntity> = (row) => {
7378
return b('node', {unavailable: isUnavailableNode(row)});
7479
};
@@ -102,6 +107,13 @@ export const PaginatedNodes = ({
102107
label={'Nodes'}
103108
loading={!inited}
104109
/>
110+
<TableColumnSetup
111+
popupWidth={200}
112+
items={columnsToSelect}
113+
showStatus
114+
onUpdate={setColumns}
115+
sortable={false}
116+
/>
105117
</React.Fragment>
106118
);
107119
};
@@ -125,20 +137,11 @@ export const PaginatedNodes = ({
125137
return <ResponseError error={error} />;
126138
};
127139

128-
const rawColumns = getNodesColumns({
129-
getNodeRef: additionalNodesProps?.getNodeRef,
130-
database,
131-
});
132-
133-
const columns = rawColumns.map((column) => {
134-
return {...column, sortable: isSortableNodesProperty(column.name)};
135-
});
136-
137140
return (
138141
<ResizeablePaginatedTable
139142
columnsWidthLSKey={NODES_COLUMNS_WIDTH_LS_KEY}
140143
parentContainer={parentContainer}
141-
columns={columns}
144+
columns={columnsToShow}
142145
fetchData={getNodes}
143146
limit={50}
144147
renderControls={renderControls}

src/containers/Nodes/columns/columns.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {getLoadSeverityForNode} from '../../../store/reducers/nodes/utils';
1212
import type {GetNodeRefFunc} from '../../../types/additionalProps';
1313
import {EMPTY_DATA_PLACEHOLDER} from '../../../utils/constants';
1414
import {formatStorageValuesToGb} from '../../../utils/dataFormatters/dataFormatters';
15+
import {isSortableNodesProperty} from '../../../utils/nodes';
1516

1617
import {NODES_COLUMNS_IDS, NODES_COLUMNS_TITLES} from './constants';
1718
import type {GetNodesColumnsProps, NodesColumn} from './types';
@@ -213,7 +214,7 @@ const sessionsColumn: NodesColumn = {
213214
};
214215

215216
export function getNodesColumns({database, getNodeRef}: GetNodesColumnsProps): NodesColumn[] {
216-
return [
217+
const columns = [
217218
nodeIdColumn,
218219
getHostColumn(getNodeRef, database),
219220
dataCenterColumn,
@@ -225,6 +226,10 @@ export function getNodesColumns({database, getNodeRef}: GetNodesColumnsProps): N
225226
loadAverageColumn,
226227
getTabletsColumn(database),
227228
];
229+
230+
return columns.map((column) => {
231+
return {...column, sortable: isSortableNodesProperty(column.name)};
232+
});
228233
}
229234

230235
export function getTopNodesByLoadColumns(

src/containers/Nodes/columns/constants.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import type {ValueOf} from '../../../types/common';
33
import i18n from './i18n';
44

55
export const NODES_COLUMNS_WIDTH_LS_KEY = 'nodesTableColumnsWidth';
6+
export const NODES_TABLE_SELECTED_COLUMNS_LS_KEY = 'nodesTableSelectedColumns';
67

78
export const NODES_COLUMNS_IDS = {
89
NodeId: 'NodeId',
@@ -23,6 +24,21 @@ export const NODES_COLUMNS_IDS = {
2324

2425
type NodesColumnId = ValueOf<typeof NODES_COLUMNS_IDS>;
2526

27+
export const DEFAULT_NODES_COLUMNS: NodesColumnId[] = [
28+
'NodeId',
29+
'Host',
30+
'DC',
31+
'Rack',
32+
'Version',
33+
'Uptime',
34+
'Memory',
35+
'CPU',
36+
'LoadAverage',
37+
'Tablets',
38+
];
39+
40+
export const REQUIRED_NODES_COLUMNS: NodesColumnId[] = ['NodeId'];
41+
2642
// This code is running when module is initialized and correct language may not be set yet
2743
// get functions guarantee that i18n fields will be inited on render with current render language
2844
export const NODES_COLUMNS_TITLES = {
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React from 'react';
2+
3+
import {useSelectedColumns} from '../../../utils/hooks/useSelectedColumns';
4+
5+
import {getNodesColumns} from './columns';
6+
import {
7+
DEFAULT_NODES_COLUMNS,
8+
NODES_COLUMNS_TITLES,
9+
NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
10+
REQUIRED_NODES_COLUMNS,
11+
} from './constants';
12+
import type {GetNodesColumnsProps} from './types';
13+
14+
export function useNodesSelectedColumns(params: GetNodesColumnsProps) {
15+
const columns = React.useMemo(() => {
16+
return getNodesColumns(params);
17+
}, [params]);
18+
19+
return useSelectedColumns(
20+
columns,
21+
NODES_TABLE_SELECTED_COLUMNS_LS_KEY,
22+
NODES_COLUMNS_TITLES,
23+
DEFAULT_NODES_COLUMNS,
24+
REQUIRED_NODES_COLUMNS,
25+
);
26+
}

src/containers/Tenant/ObjectSummary/ObjectSummary.tsx

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -180,16 +180,31 @@ export function ObjectSummary({
180180

181181
const title = <EntityTitle data={PathDescription} />;
182182

183-
const getDatabaseOverview = () => [
184-
{
185-
label: i18n('summary.paths'),
186-
value: PathDescription?.DomainDescription?.PathsInside,
187-
},
188-
{
189-
label: i18n('summary.shards'),
190-
value: PathDescription?.DomainDescription?.ShardsInside,
191-
},
192-
];
183+
const getDatabaseOverview = () => {
184+
const {PathsInside, ShardsInside, PathsLimit, ShardsLimit} =
185+
PathDescription?.DomainDescription ?? {};
186+
let paths = formatNumber(PathsInside);
187+
let shards = formatNumber(ShardsInside);
188+
189+
if (paths && PathsLimit) {
190+
paths = `${paths} / ${formatNumber(PathsLimit)}`;
191+
}
192+
193+
if (shards && ShardsLimit) {
194+
shards = `${shards} / ${formatNumber(ShardsLimit)}`;
195+
}
196+
197+
return [
198+
{
199+
label: i18n('summary.paths'),
200+
value: paths,
201+
},
202+
{
203+
label: i18n('summary.shards'),
204+
value: shards,
205+
},
206+
];
207+
};
193208

194209
const getPathTypeOverview: Record<EPathType, (() => InfoViewerItem[]) | undefined> = {
195210
[EPathType.EPathTypeInvalid]: undefined,

src/containers/Tenant/Query/QueryEditorControls/utils/getChangedQueryExecutionSettings.test.ts

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
import type {QuerySettings} from '../../../../../types/store/query';
22
import {
3+
DEFAULT_QUERY_SETTINGS,
34
QUERY_MODES,
45
STATISTICS_MODES,
56
TRACING_LEVELS,
67
TRANSACTION_MODES,
78
} from '../../../../../utils/query';
89

9-
const DEFAULT_QUERY_SETTINGS: QuerySettings = {
10-
queryMode: QUERY_MODES.query,
11-
transactionMode: TRANSACTION_MODES.implicit,
12-
timeout: '60',
13-
statisticsMode: STATISTICS_MODES.none,
14-
tracingLevel: TRACING_LEVELS.detailed,
15-
};
16-
1710
import getChangedQueryExecutionSettings from './getChangedQueryExecutionSettings';
1811

1912
describe('getChangedQueryExecutionSettings', () => {
@@ -27,7 +20,8 @@ describe('getChangedQueryExecutionSettings', () => {
2720
const currentSettings: QuerySettings = {
2821
...DEFAULT_QUERY_SETTINGS,
2922
queryMode: QUERY_MODES.data,
30-
timeout: '30',
23+
timeout: 30,
24+
limitRows: undefined,
3125
};
3226
const result = getChangedQueryExecutionSettings(currentSettings, DEFAULT_QUERY_SETTINGS);
3327
expect(result).toEqual(['queryMode', 'timeout']);
@@ -37,7 +31,8 @@ describe('getChangedQueryExecutionSettings', () => {
3731
const currentSettings: QuerySettings = {
3832
queryMode: QUERY_MODES.data,
3933
transactionMode: TRANSACTION_MODES.onlinero,
40-
timeout: '90',
34+
timeout: 90,
35+
limitRows: DEFAULT_QUERY_SETTINGS.limitRows,
4136
statisticsMode: STATISTICS_MODES.basic,
4237
tracingLevel: TRACING_LEVELS.basic,
4338
};

0 commit comments

Comments
 (0)