Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import { adaptivityModule } from '@ts/grids/grid_core/adaptivity/adaptivity_module';

import gridCore from '../m_core';
import { adaptivityExportExtender } from './extenders/adaptivity_export';

gridCore.registerModule('adaptivity', {
...adaptivityModule,
extenders: {
...adaptivityModule.extenders,
controllers: {
...adaptivityModule.extenders?.controllers,
export: adaptivityExportExtender,
},
},
});
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import type { ExportController } from '@ts/grids/data_grid/export/m_export';
import type { ModuleType } from '@ts/grids/grid_core/m_types';

import { HIDDEN_COLUMNS_WIDTH } from '../../../grid_core/adaptivity/const';

export const adaptivityExportExtender = (
Base: ModuleType<ExportController>,
): ModuleType<ExportController> => class AdaptivityExportExtender extends Base {
protected _updateColumnWidth(column, width): void {
super._updateColumnWidth(
column,
column.visibleWidth === HIDDEN_COLUMNS_WIDTH ? column.bestFitWidth : width,
);
}
};
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import './keyboard_navigation/m_group_panel_keyboard_navigation';
import './summary/m_summary';
import './module_not_extended/sticky_columns';
import './module_not_extended/column_fixing';
import './module_not_extended/adaptivity';
import './adaptivity/adaptivity_module';
import './module_not_extended/virtual_columns';
import './export/m_export';
import './focus/m_focus';
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import type { Module } from '../m_types';
import { adaptivityColumnsExtender } from './extenders/adaptivity_columns';
import { adaptivityColumnsResizerExtender } from './extenders/adaptivity_columns_resizer';
import { adaptivityDataControllerExtender } from './extenders/adaptivity_data_controller';
import { adaptivityDraggingHeaderExtender } from './extenders/adaptivity_dragging_header';
import { adaptivityEditingExtender } from './extenders/adaptivity_editing';
import { adaptivityEditorFactoryExtender } from './extenders/adaptivity_editor_factory';
import { adaptivityHeadersKeyboardNavigationExtender } from './extenders/adaptivity_headers_keyboard_navigation';
import { adaptivityKeyboardNavigationExtender } from './extenders/adaptivity_keyboard_navigation';
import { adaptivityResizingControllerExtender } from './extenders/adaptivity_resizing_controller';
import { adaptivityRowsViewExtender } from './extenders/adaptivity_rows_view';
import { AdaptiveColumnsController } from './m_adaptivity';

export const adaptivityModule: Module = {
defaultOptions() {
return {
columnHidingEnabled: false,
};
},
controllers: {
adaptiveColumns: AdaptiveColumnsController,
},
extenders: {
views: {
rowsView: adaptivityRowsViewExtender,
},
controllers: {
columnsResizer: adaptivityColumnsResizerExtender,
draggingHeader: adaptivityDraggingHeaderExtender,
editing: adaptivityEditingExtender,
resizing: adaptivityResizingControllerExtender,
data: adaptivityDataControllerExtender,
editorFactory: adaptivityEditorFactoryExtender,
columns: adaptivityColumnsExtender,
keyboardNavigation: adaptivityKeyboardNavigationExtender,
headersKeyboardNavigation: adaptivityHeadersKeyboardNavigationExtender,
},
},
};
Original file line number Diff line number Diff line change
@@ -1 +1,32 @@
export const COLUMN_HEADERS_VIEW = 'columnHeadersView' as const;
export const ROWS_VIEW = 'rowsView' as const;
export const FOOTER_VIEW = 'footerView' as const;
export const COLUMN_VIEWS = [COLUMN_HEADERS_VIEW, ROWS_VIEW, FOOTER_VIEW] as const;

export const ADAPTIVE_NAMESPACE = 'dxDataGridAdaptivity';
export const HIDDEN_COLUMNS_WIDTH = 'adaptiveHidden';
export const ADAPTIVE_ROW_TYPE = 'detailAdaptive';

export const FORM_ITEM_CONTENT_CLASS = 'dx-field-item-content';
export const FORM_ITEM_MODIFIED = 'dx-item-modified';

export const HIDDEN_COLUMN_CLASS = 'hidden-column';
export const ADAPTIVE_COLUMN_BUTTON_CLASS = 'adaptive-more';
export const ADAPTIVE_COLUMN_NAME_CLASS = 'dx-command-adaptive';
export const COMMAND_ADAPTIVE_HIDDEN_CLASS = 'dx-command-adaptive-hidden';
export const ADAPTIVE_DETAIL_ROW_CLASS = 'dx-adaptive-detail-row';
export const ADAPTIVE_ITEM_TEXT_CLASS = 'dx-adaptive-item-text';
export const MASTER_DETAIL_CELL_CLASS = 'dx-master-detail-cell';
export const LAST_DATA_CELL_CLASS = 'dx-last-data-cell';
export const ADAPTIVE_COLUMN_NAME = 'adaptive';
export const EDIT_MODE_BATCH = 'batch';
export const EDIT_MODE_ROW = 'row';
export const EDIT_MODE_FORM = 'form';
export const EDIT_MODE_POPUP = 'popup';
export const REVERT_TOOLTIP_CLASS = 'revert-tooltip';
export const GROUP_CELL_CLASS = 'dx-group-cell';
export const GROUP_ROW_CLASS = 'dx-group-row';

export const EXPAND_ARIA_NAME = 'dxDataGrid-ariaAdaptiveExpand';
export const COLLAPSE_ARIA_NAME = 'dxDataGrid-ariaAdaptiveCollapse';
export const LEGACY_SCROLLING_MODE = 'scrolling.legacyMode';
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/no-unsafe-return */
import type { ColumnsController } from '@ts/grids/grid_core/columns_controller/m_columns_controller';
import type { Column } from '@ts/grids/grid_core/columns_controller/types';
import type { ModuleType } from '@ts/grids/grid_core/m_types';

import { HIDDEN_COLUMNS_WIDTH } from '../const';
import type { AdaptiveColumnsController } from '../m_adaptivity';

export const adaptivityColumnsExtender = (
Base: ModuleType<ColumnsController>,
): ModuleType<ColumnsController> => class AdaptivityColumnsExtender extends Base {
private adaptiveColumnsController!: AdaptiveColumnsController;

public init(isApplyingUserState?: boolean): void {
super.init(isApplyingUserState);
this.adaptiveColumnsController = this.getController('adaptiveColumns');
}

protected _isColumnVisible(column) {
return super._isColumnVisible(column) && !column.adaptiveHidden;
}

public getVisibleDataColumnsByBandColumn(bandColumnIndex: number) {
return super.getVisibleDataColumnsByBandColumn(bandColumnIndex)
.filter((column) => column.visibleWidth !== HIDDEN_COLUMNS_WIDTH);
}

public isAdaptiveHiddenColumn(column: Column): boolean {
return super.isAdaptiveHiddenColumn(column)
|| this.adaptiveColumnsController.isColumnHidden(column);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
/* eslint-disable @stylistic/max-len */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable no-plusplus */
import type { dxElementWrapper } from '@js/core/renderer';
import type { ColumnsResizerViewController } from '@ts/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering';
import type { ModuleType } from '@ts/grids/grid_core/m_types';

import { HIDDEN_COLUMNS_WIDTH } from '../const';

export const adaptivityColumnsResizerExtender = (
Base: ModuleType<ColumnsResizerViewController>,
): ModuleType<ColumnsResizerViewController> => class AdaptivityColumnsResizerExtender extends Base {
protected _pointCreated(point, columns, cells?: dxElementWrapper) {
const result = super._pointCreated(point, columns, cells);
const currentColumn = columns[point.columnIndex] || {};
const nextColumnIndex = this._getNextColumnIndex(point.columnIndex);
const nextColumn = columns[nextColumnIndex] || {};
const hasHiddenColumnsOnly = nextColumnIndex !== point.columnIndex + 1 && nextColumn.command;
const hasAdaptiveHiddenWidth = currentColumn.visibleWidth === HIDDEN_COLUMNS_WIDTH || hasHiddenColumnsOnly;

return result || hasAdaptiveHiddenWidth;
}

protected _getNextColumnIndex(currentColumnIndex) {
const visibleColumns = this._columnsController.getVisibleColumns();
let index = super._getNextColumnIndex(currentColumnIndex);

while (visibleColumns[index]?.visibleWidth === HIDDEN_COLUMNS_WIDTH) {
index++;
}

return index;
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
/* eslint-disable @stylistic/max-len */
/* eslint-disable @typescript-eslint/explicit-function-return-type */
/* eslint-disable @typescript-eslint/no-explicit-any */
/* eslint-disable @typescript-eslint/no-this-alias */
/* eslint-disable @typescript-eslint/no-unsafe-return */
/* eslint-disable consistent-return */
/* eslint-disable no-param-reassign */
/* eslint-disable no-plusplus */
/* eslint-disable prefer-rest-params */
import { isDefined } from '@js/core/utils/type';
import type { DataController } from '@ts/grids/grid_core/data_controller/data_controller';
import type { DataChange, ProcessedItem } from '@ts/grids/grid_core/data_controller/types';
import type { RawItemData } from '@ts/grids/grid_core/data_source_adapter/types';
import type { ModuleType } from '@ts/grids/grid_core/m_types';
import gridCoreUtils from '@ts/grids/grid_core/m_utils';

import {
ADAPTIVE_ROW_TYPE,
COLLAPSE_ARIA_NAME,
EXPAND_ARIA_NAME,
LEGACY_SCROLLING_MODE,
} from '../const';
import type { AdaptiveColumnsController } from '../m_adaptivity';

export const adaptivityDataControllerExtender = (
Base: ModuleType<DataController>,
): ModuleType<DataController> => class AdaptivityDataControllerExtender extends Base {
private _adaptiveExpandedKey: any;

protected adaptiveColumnsController!: AdaptiveColumnsController;

public init() {
super.init();
this._adaptiveExpandedKey = undefined;
this.adaptiveColumnsController = this.getController('adaptiveColumns');
}

protected _processItems(items: RawItemData[], change: DataChange): ProcessedItem[] {
const processedItems = super._processItems(items, change);
const { changeType } = change;

if ((changeType === 'loadingAll') || !isDefined(this._adaptiveExpandedKey)) {
return processedItems;
}

const expandRowIndex = gridCoreUtils.getIndexByKey(this._adaptiveExpandedKey, processedItems);
const newMode = this.option(LEGACY_SCROLLING_MODE) === false;

if (expandRowIndex >= 0) {
const item = processedItems[expandRowIndex];
processedItems.splice(expandRowIndex + 1, 0, {
visible: true,
rowType: ADAPTIVE_ROW_TYPE,
key: item.key,
data: item.data,
// @ts-expect-error treelist specific field
node: item.node,
modifiedValues: item.modifiedValues,
isNewRow: item.isNewRow,
values: item.values,
});
} else if (changeType === 'refresh' && !(newMode && change.repaintChangesOnly)) {
this._adaptiveExpandedKey = undefined;
}

return processedItems;
}

private _getRowIndicesForExpand(key) {
// @ts-expect-error
const rowIndices = super._getRowIndicesForExpand.apply(this, arguments);

if (this.adaptiveColumnsController.isAdaptiveDetailRowExpanded(key)) {
const lastRowIndex = rowIndices[rowIndices.length - 1];
rowIndices.push(lastRowIndex + 1);
}

return rowIndices;
}

private adaptiveExpandedKey(value) {
if (isDefined(value)) {
this._adaptiveExpandedKey = value;
} else {
return this._adaptiveExpandedKey;
}
}
Comment on lines +81 to +87

private toggleExpandAdaptiveDetailRow(key, alwaysExpanded) {
const that = this;

let oldExpandLoadedRowIndex = gridCoreUtils.getIndexByKey(that._adaptiveExpandedKey, that._items);
let newExpandLoadedRowIndex = gridCoreUtils.getIndexByKey(key, that._items);

if (oldExpandLoadedRowIndex >= 0 && oldExpandLoadedRowIndex === newExpandLoadedRowIndex && !alwaysExpanded) {
key = undefined;
newExpandLoadedRowIndex = -1;
}

const oldKey = that._adaptiveExpandedKey;
that._adaptiveExpandedKey = key;

if (oldExpandLoadedRowIndex >= 0) {
oldExpandLoadedRowIndex++;
}
if (newExpandLoadedRowIndex >= 0) {
newExpandLoadedRowIndex++;
}

const rowIndexDelta = that.getRowIndexDelta();

that.updateItems({
allowInvisibleRowIndices: true,
changeType: 'update',
rowIndices: [oldExpandLoadedRowIndex - rowIndexDelta, newExpandLoadedRowIndex - rowIndexDelta],
});

this.adaptiveColumnsController.updateCommandAdaptiveAriaLabel(key, COLLAPSE_ARIA_NAME);
this.adaptiveColumnsController.updateCommandAdaptiveAriaLabel(oldKey, EXPAND_ARIA_NAME);
}
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
/* eslint-disable @typescript-eslint/explicit-function-return-type */
import type { DraggingHeaderViewController } from '@ts/grids/grid_core/columns_resizing_reordering/m_columns_resizing_reordering';
import type { ModuleType } from '@ts/grids/grid_core/m_types';

import { HIDDEN_COLUMNS_WIDTH } from '../const';

export const adaptivityDraggingHeaderExtender = (
Base: ModuleType<DraggingHeaderViewController>,
): ModuleType<DraggingHeaderViewController> => class AdaptivityDraggingHeaderExtender extends Base {
protected _pointCreated({
point, columns, location, sourceColumn, cells,
}) {
const result = super._pointCreated({
point, columns, location, sourceColumn, cells,
});
const column = columns[point.columnIndex - 1] || {};
const hasAdaptiveHiddenWidth = column.visibleWidth === HIDDEN_COLUMNS_WIDTH;

return result || hasAdaptiveHiddenWidth;
}
};
Loading
Loading