diff --git a/packages/ui/src/ui/components/Dialog/Dialog.tsx b/packages/ui/src/ui/components/Dialog/Dialog.tsx index dc429597e..926ac7aaa 100644 --- a/packages/ui/src/ui/components/Dialog/Dialog.tsx +++ b/packages/ui/src/ui/components/Dialog/Dialog.tsx @@ -12,11 +12,11 @@ import ClusterSelectControl from './controls/ClusterSelectControl/ClusterSelectC import SortableListControl from '../../components/Dialog/controls/SortableListControl/SortableListControl'; import BytesControl, {NumberControl} from '../../components/Dialog/controls/BytesControl'; import RoleListControl from './controls/RoleListControl/RoleListControl'; -import CreateTableTabField from '../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableTabField/CreateTableTabField'; +import CreateTableTabField from '../../pages/navigation/modals/CreateTableModal/CreateTableTabField/CreateTableTabField'; import { GroupSuggestControl, LockSuggestControl, -} from '../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableSuggests/CreateTableSuggests'; +} from '../../pages/navigation/modals/CreateTableModal/CreateTableSuggests/CreateTableSuggests'; import SelectWithSubItems from './controls/SelectWithSubItems/SelectWithSubItems'; import CreatePoolParentSuggest from '../../pages/scheduling/Instruments/CreatePoolDialog/CreatePoolParentSuggest'; import TabletCellBundlesSuggest from '../../pages/components/TabletCellBundlesSuggest/TabletCellBundlesSuggest'; diff --git a/packages/ui/src/ui/pages/navigation/content/MapNode/MapNode.js b/packages/ui/src/ui/pages/navigation/content/MapNode/MapNode.js index 82bc99c32..b7831a9d2 100644 --- a/packages/ui/src/ui/pages/navigation/content/MapNode/MapNode.js +++ b/packages/ui/src/ui/pages/navigation/content/MapNode/MapNode.js @@ -17,7 +17,7 @@ import {SelectSingle} from '../../../../components/Select/Select'; import Error from '../../../../components/Error/Error'; import Icon from '../../../../components/Icon/Icon'; import TTLInfo from '../../../../components/TTLInfo/TTLInfo'; -import CreateTableModal from '../../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import CreateTableModal from '../../modals/CreateTableModal/CreateTableModal'; import {isCreateTableModalVisible} from '../../../../store/selectors/navigation/modals/create-table'; import MapNodesTable from './MapNodesTable'; diff --git a/packages/ui/src/ui/pages/navigation/modals/AttributesEditor.tsx b/packages/ui/src/ui/pages/navigation/modals/AttributesEditor.tsx index e0e21c572..4b1a59c1e 100644 --- a/packages/ui/src/ui/pages/navigation/modals/AttributesEditor.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/AttributesEditor.tsx @@ -43,7 +43,7 @@ import { normalizeErasureCodec, storageOptionFromErasureCodec, } from '../../../utils/cypress-attributes'; -import {makeLink} from '../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import {makeLink} from './CreateTableModal/CreateTableModal'; import { getCompressionCodecs, getErasureCodecs, diff --git a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal.scss b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableModal.scss similarity index 100% rename from packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal.scss rename to packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableModal.scss diff --git a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal.tsx b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableModal.tsx similarity index 95% rename from packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal.tsx rename to packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableModal.tsx index e190aed5e..901c62b7b 100644 --- a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableModal.tsx @@ -48,7 +48,7 @@ import {SelectWithSubItemsProps} from '../../../../components/Dialog/controls/Se import {docsUrl, getNewTableReplicasCount} from '../../../../config'; import './CreateTableModal.scss'; -import {DESCENDING} from './CreateTableTabField/CreateTableTabField'; +import {ASCENDING, DESCENDING} from './CreateTableTabField/CreateTableTabField'; import {FIX_MY_TYPE} from '../../../../types'; import UIFactory from '../../../../UIFactory'; @@ -67,10 +67,11 @@ export function makeLink(url: string, label = 'Help', inline = false) { return inline ? link :
{link}
; } -const TableType = { - DYNAMIC: 'dynamic', - STATIC: 'static', -}; +enum TableType { + QUEUE = 'queue', + DYNAMIC = 'dynamic', + STATIC = 'static', +} const AGGREGATE_CHOICES = [{value: SELECT_EMPTY_VALUE, text: 'default'}].concat( map_(AggrTypes, (i) => ({value: i, text: i})), @@ -165,7 +166,7 @@ interface TableSettingsTab { uniqueKeys: boolean; name: string; replicasCount: string; - tableType: 'static' | 'dynamic'; + tableType: TableType; } function genNewName(items: Array<{name: string}>, name: string) { @@ -245,9 +246,8 @@ class CreateTableModalContentImpl extends React.Component { } = values; const columns = this.reorderColumns(columnsRaw); - const isDynamic = tableType === TableType.DYNAMIC; const attributes: Record = { - dynamic: isDynamic, + dynamic: tableType === TableType.QUEUE || tableType == TableType.DYNAMIC, optimize_for, }; @@ -314,11 +314,11 @@ class CreateTableModalContentImpl extends React.Component { }); }; - validateColumnDataType(columnData: ColumnData, isDynamicTable: boolean) { + validateColumnDataType(columnData: ColumnData, tableType: TableType) { const {dataType, optional} = columnData || {}; if (dataType === ColumnDataTypes.ANY || dataType === ColumnDataTypes.YSON) { - if (isDynamicTable && this.isOrderedColumn(columnData)) { + if (tableType === TableType.DYNAMIC && this.isOrderedColumn(columnData)) { return `Key-column should not be of type [${dataType}]`; } if (!optional) { @@ -326,7 +326,11 @@ class CreateTableModalContentImpl extends React.Component { } } - if (isDynamicTable && this.isDescendingColumn(columnData)) { + if (tableType === TableType.QUEUE && this.isSortedColumn(columnData)) { + return 'Queue must not have any sorted columns'; + } + + if (tableType === TableType.DYNAMIC && this.isDescendingColumn(columnData)) { return "Dynamic tables do not support 'Descending' order"; } @@ -356,13 +360,13 @@ class CreateTableModalContentImpl extends React.Component { return undefined; } - validateColumnData(columnData: ColumnData, isDynamicTable: boolean) { + validateColumnData(columnData: ColumnData, tableType: TableType) { const res: Record = {}; const aggregate = this.validateAggregate(columnData); if (aggregate) { res.aggregate = aggregate; } - const dataType = this.validateColumnDataType(columnData, isDynamicTable); + const dataType = this.validateColumnDataType(columnData, tableType); if (dataType) { res.dataType = dataType; } @@ -398,11 +402,20 @@ class CreateTableModalContentImpl extends React.Component { return Boolean(this.props.keyColumns[id]); } + isAscendingColumn(columnData: ColumnData) { + const {id} = columnData; + return this.props.keyColumns[id] === ASCENDING; + } + isDescendingColumn(columnData: ColumnData) { const {id} = columnData; return this.props.keyColumns[id] === DESCENDING; } + isSortedColumn(columnData: ColumnData) { + return this.isAscendingColumn(columnData) || this.isDescendingColumn(columnData); + } + validateTableSettings(tableSettings: TableSettingsTab, columns: Array) { const res: Partial> = {}; const hasOrderedColumn = some_(columns, (colData) => this.isOrderedColumn(colData)); @@ -417,7 +430,11 @@ class CreateTableModalContentImpl extends React.Component { if (tableType === TableType.DYNAMIC && (!hasOrderedColumn || !hasUnorderedColumn)) { res.tableType = - 'Any dynamic table must have at least one sorted column and one unsorted column'; + 'Dynamic table must have at least one sorted column and one unsorted column'; + } + + if (tableType === TableType.QUEUE && hasOrderedColumn) { + res.tableType = 'Queue must not have any sorted columns'; } if (tableType === TableType.DYNAMIC && !res.tableType) { @@ -463,6 +480,7 @@ class CreateTableModalContentImpl extends React.Component { const columns: Array = values[COLUMNS]; this.columns = columns; const nameCounters: Record> = {}; + forEach_(columns, (columnData, index) => { const {name} = columnData; const nameIndexes = nameCounters[name]; @@ -473,10 +491,7 @@ class CreateTableModalContentImpl extends React.Component { } // Validate column - setError( - `${COLUMNS}[${index}]`, - this.validateColumnData(columnData, tableType === TableType.DYNAMIC), - ); + setError(`${COLUMNS}[${index}]`, this.validateColumnData(columnData, tableType)); }); forEach_(nameCounters, (indices) => { if (indices.length > 1) { @@ -610,11 +625,15 @@ class CreateTableModalContentImpl extends React.Component { options: [ { value: TableType.STATIC, - label: 'Static', + label: 'Static table', }, { value: TableType.DYNAMIC, - label: 'Dynamic', + label: 'Dynamic table', + }, + { + value: TableType.QUEUE, + label: 'Queue', }, ], }, diff --git a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableSuggests/CreateTableSuggests.tsx b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableSuggests/CreateTableSuggests.tsx similarity index 100% rename from packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableSuggests/CreateTableSuggests.tsx rename to packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableSuggests/CreateTableSuggests.tsx diff --git a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableTabField/CreateTableTabField.scss b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableTabField/CreateTableTabField.scss similarity index 100% rename from packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableTabField/CreateTableTabField.scss rename to packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableTabField/CreateTableTabField.scss diff --git a/packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableTabField/CreateTableTabField.tsx b/packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableTabField/CreateTableTabField.tsx similarity index 100% rename from packages/ui/src/ui/navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableTabField/CreateTableTabField.tsx rename to packages/ui/src/ui/pages/navigation/modals/CreateTableModal/CreateTableTabField/CreateTableTabField.tsx diff --git a/packages/ui/src/ui/pages/navigation/modals/RemoteCopyModal.tsx b/packages/ui/src/ui/pages/navigation/modals/RemoteCopyModal.tsx index 8b50616f6..cbaa906d8 100644 --- a/packages/ui/src/ui/pages/navigation/modals/RemoteCopyModal.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/RemoteCopyModal.tsx @@ -14,7 +14,7 @@ import { remoteCopy, } from '../../../store/actions/navigation/modals/remote-copy-modal'; import {getCluster} from '../../../store/selectors/global'; -import {makeLink} from '../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import {makeLink} from './CreateTableModal/CreateTableModal'; import {YTError} from '../../../types'; import {RemoteCopyParams} from '../../../../@types/types'; import {AxiosError} from 'axios'; diff --git a/packages/ui/src/ui/pages/navigation/modals/TableEraseModal.tsx b/packages/ui/src/ui/pages/navigation/modals/TableEraseModal.tsx index ad518502c..1541d44ef 100644 --- a/packages/ui/src/ui/pages/navigation/modals/TableEraseModal.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/TableEraseModal.tsx @@ -1,7 +1,7 @@ import React from 'react'; import {DialogError, FormApi, YTDFDialog} from '../../../components/Dialog'; -import {makeLink} from '../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import {makeLink} from './CreateTableModal/CreateTableModal'; import {useDispatch, useSelector} from 'react-redux'; import { hideTableEraseModal, diff --git a/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableMergeModal.tsx b/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableMergeModal.tsx index 5d4c663e8..5834d19bb 100644 --- a/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableMergeModal.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableMergeModal.tsx @@ -19,7 +19,7 @@ import { tableSortModalLoadColumns, } from '../../../../store/actions/navigation/modals/table-merge-sort-modal'; import {getCurrentUserName} from '../../../../store/selectors/global'; -import {makeLink} from '../../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import {makeLink} from '../CreateTableModal/CreateTableModal'; import {parseBytes} from '../../../../utils'; import {docsUrl} from '../../../../config'; import UIFactory from '../../../../UIFactory'; diff --git a/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableSortModal.tsx b/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableSortModal.tsx index 28c630f8d..8b53bed16 100644 --- a/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableSortModal.tsx +++ b/packages/ui/src/ui/pages/navigation/modals/TableMergeSortModal/TableSortModal.tsx @@ -19,7 +19,7 @@ import { tableSortModalLoadColumns, } from '../../../../store/actions/navigation/modals/table-merge-sort-modal'; import {getCurrentUserName} from '../../../../store/selectors/global'; -import {makeLink} from '../../../../navigation/Navigation/PathEditorModal/CreateTableModal/CreateTableModal'; +import {makeLink} from '../CreateTableModal/CreateTableModal'; import './TableSortModal.scss'; import {ColumnSortByInfo} from './TableSortByControl'; import {docsUrl} from '../../../../config'; diff --git a/packages/ui/tests/screenshots/pages/navigation/navigation.base.screen.ts-snapshots/Navigation-map-node---Content-2-chromium-linux.png b/packages/ui/tests/screenshots/pages/navigation/navigation.base.screen.ts-snapshots/Navigation-map-node---Content-2-chromium-linux.png index 14838f9e2..bfedd4df7 100644 Binary files a/packages/ui/tests/screenshots/pages/navigation/navigation.base.screen.ts-snapshots/Navigation-map-node---Content-2-chromium-linux.png and b/packages/ui/tests/screenshots/pages/navigation/navigation.base.screen.ts-snapshots/Navigation-map-node---Content-2-chromium-linux.png differ