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..91d4d0c43 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,9 +67,10 @@ 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(
@@ -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,19 +314,23 @@ 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) {
return `Column with type [${dataType}] should be optional.`;
}
}
+
+ if (tableType === TableType.QUEUE && this.isSortedColumn(columnData)) {
+ return "Queue must not have any sorted columns";
+ }
- if (isDynamicTable && this.isDescendingColumn(columnData)) {
+ 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];
@@ -475,7 +493,7 @@ class CreateTableModalContentImpl extends React.Component {
// Validate column
setError(
`${COLUMNS}[${index}]`,
- this.validateColumnData(columnData, tableType === TableType.DYNAMIC),
+ this.validateColumnData(columnData, tableType),
);
});
forEach_(nameCounters, (indices) => {
@@ -610,11 +628,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';