diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuSortingService.ts b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuSortingService.ts index 3fa499a527..f916695176 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuSortingService.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/DataGridContextMenu/DataGridContextMenuSortingService.ts @@ -50,6 +50,18 @@ export class DataGridContextMenuSortingService { return sorting.getSortMode(columnName); } + private getSortingConstraints(model: IDatabaseDataModel, resultIndex: number) { + const sorting = model.source.getAction(resultIndex, ResultSetSortAction); + return sorting.getSortingConstraints(); + } + + private async removeSortingConstraints(model: IDatabaseDataModel, resultIndex: number) { + const sorting = model.source.getAction(resultIndex, ResultSetSortAction); + + sorting.removeSortingConstraints(); + await model.refresh(); + } + register(): void { this.dataGridContextMenuService.add( this.contextMenuService.getRootMenuToken(), @@ -80,10 +92,7 @@ export class DataGridContextMenuSortingService { context.data.model, context.data.resultIndex, context.data.column) === ESortMode.asc, - titleGetter: context => { - const columnName = this.getColumnName(context.data.model, context.data.resultIndex, context.data.column); - return `Order by ${columnName || ''} ASC`; - }, + title: 'ASC', } ); this.dataGridContextMenuService.add( @@ -102,27 +111,41 @@ export class DataGridContextMenuSortingService { context.data.model, context.data.resultIndex, context.data.column) === ESortMode.desc, - titleGetter: context => { - const columnName = this.getColumnName(context.data.model, context.data.resultIndex, context.data.column); - return `Order by ${columnName || ''} DESC`; - }, + title: 'DESC', } ); this.dataGridContextMenuService.add( this.getMenuSortingToken(), { - id: 'toggleSorting', + id: 'disableSorting', isPresent(context) { return context.contextType === DataGridContextMenuService.cellContext; }, isDisabled: context => context.data.model.isLoading(), onClick: async context => { - const nextSortMode = getNextSortMode( - this.getSortMode(context.data.model, context.data.resultIndex, context.data.column) - ); - await this.changeSortMode(context.data.model, context.data.resultIndex, context.data.column, nextSortMode); + await this.changeSortMode(context.data.model, context.data.resultIndex, context.data.column, null); }, - title: 'data_grid_table_sorting_toggle', + type: 'radio', + isChecked: context => this.getSortMode( + context.data.model, + context.data.resultIndex, + context.data.column) === null, + title: 'data_grid_table_disable_sorting', + } + ); + this.dataGridContextMenuService.add( + this.getMenuSortingToken(), + { + id: 'disableAllSorting', + isPresent: context => { + const sortingConstraints = this.getSortingConstraints(context.data.model, context.data.resultIndex); + return context.contextType === DataGridContextMenuService.cellContext && sortingConstraints.length > 1; + }, + isDisabled: context => context.data.model.isLoading(), + onClick: async context => { + await this.removeSortingConstraints(context.data.model, context.data.resultIndex); + }, + title: 'data_grid_table_disable_all_sorting', } ); } diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableColumnHeader/TableColumnHeader.tsx b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableColumnHeader/TableColumnHeader.tsx index 776815ce77..02f31146b8 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableColumnHeader/TableColumnHeader.tsx +++ b/webapp/packages/plugin-data-spreadsheet-new/src/DataGrid/TableColumnHeader/TableColumnHeader.tsx @@ -117,17 +117,17 @@ export const TableColumnHeader: React.FC> = observer(fu // TODO we want to get "sortable" property from SqlResultColumn data const sortable = model.source.results.length === 1; - const currentSortMode = sorting.getSortMode(columnName); + const currentSortMode = sorting.getSortMode(column?.name || ''); const columnTooltip = columnName + (column?.fullTypeName ? ': ' + column.fullTypeName : ''); const handleSort = (e: React.MouseEvent) => { e.stopPropagation(); - if (loading) { + if (loading || !column?.name) { return; } - const nextSortMode = getNextSortMode(sorting.getSortMode(columnName)); - sorting.setSortMode(columnName, nextSortMode, e.ctrlKey || e.metaKey); + const nextSortMode = getNextSortMode(sorting.getSortMode(column.name)); + sorting.setSortMode(column.name, nextSortMode, e.ctrlKey || e.metaKey); model.refresh(); }; diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts index afddde70c7..409665d81a 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/en.ts @@ -1,5 +1,6 @@ export default [ ['data_grid_table_sorting', 'Sorting'], - ['data_grid_table_sorting_toggle', 'Toggle sorting'], + ['data_grid_table_disable_sorting', 'Disabled'], + ['data_grid_table_disable_all_sorting', 'Disable all'], ['data_grid_table_tooltip_column_header_sort', 'Sort by column'], ]; diff --git a/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts b/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts index a9369744fd..7f97a1cdcf 100644 --- a/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts +++ b/webapp/packages/plugin-data-spreadsheet-new/src/locales/ru.ts @@ -1,5 +1,6 @@ export default [ ['data_grid_table_sorting', 'Сортировка'], - ['data_grid_table_sorting_toggle', 'Переключить сортировку'], + ['data_grid_table_disable_sorting', 'Отключена'], + ['data_grid_table_disable_all_sorting', 'Отключить всю'], ['data_grid_table_tooltip_column_header_sort', 'Сортировка по колонке'], ]; diff --git a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetSortAction.ts b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetSortAction.ts index e2b4ce1d2b..be8531d233 100644 --- a/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetSortAction.ts +++ b/webapp/packages/plugin-data-viewer/src/DatabaseDataModel/Actions/ResultSet/ResultSetSortAction.ts @@ -53,6 +53,24 @@ export class ResultSetSortAction extends DatabaseDataAction ({ ...constaint, orderPosition: idx })); } + getSortingConstraints() { + if (!this.source.options) { + throw new Error('Options must be provided'); + } + + return this.source.options.constraints + .filter(constraint => constraint.orderAsc !== undefined); + } + + removeSortingConstraints() { + if (!this.source.options) { + throw new Error('Options must be provided'); + } + + this.source.options.constraints = this.source.options.constraints + .filter(constaint => constaint.orderAsc === undefined); + } + setSortMode(columnName: string, sortMode: SortMode, multiple: boolean): void { if (!this.source.options) { throw new Error('Options must be provided');