Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 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
@@ -1,5 +1,5 @@
import { ToastViewController } from '@ts/grids/grid_core/toast/m_toast_controller';
import { ToastView } from '@ts/grids/grid_core/toast/m_toast_view';
import { ToastViewController } from '@ts/grids/grid_core/toast/toast_controller';
import { ToastView } from '@ts/grids/grid_core/toast/toast_view';

import gridCore from '../m_core';

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,18 @@ import type { RowKey } from '../../m_types';
import gridCoreUtils from '../../m_utils';
import type { InternalRequestCallbacks } from '../types';
import { getAICommandColumnDefaultOptions, isAIColumnAutoMode, isPromptOption } from '../utils';
import { AIColumnIntegrationController } from './m_ai_column_integration_controller';
import { AIColumnIntegrationController } from './ai_column_integration_controller';

const getDefaultCellValue = (
column: Column,
cellValue: string | undefined,
): string | null => {
if (cellValue === undefined) {
return column.ai?.emptyText ?? null;
}

return column.ai?.noDataText ?? null;
};

export class AIColumnController extends Controller {
private dataController!: DataController;
Expand Down Expand Up @@ -68,15 +79,17 @@ export class AIColumnController extends Controller {
}

private addAICommandColumn(): void {
const that = this;
const { dataSourceController, aiColumnIntegrationController } = this;
const {
dataSourceController,
aiColumnIntegrationController,
} = this;

this.columnsController.addCommandColumn({
...getAICommandColumnDefaultOptions(),
calculateCellValue(data: RawItemData) {
const key = dataSourceController.keyOf(data);
const cellValue = aiColumnIntegrationController.getAIColumnText(this.name, key);
const defaultValue = that.getDefaultCellValue(this, cellValue);
const defaultValue = getDefaultCellValue(this, cellValue);

// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
return cellValue || defaultValue;
Expand Down Expand Up @@ -282,7 +295,7 @@ export class AIColumnController extends Controller {

// API methods

public publicMethods() {
public publicMethods(): string[] {
return [
'abortAIColumnRequest',
'sendAIColumnRequest',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { Controller } from '../../m_modules';
import type { RowKey } from '../../m_types';
import type { InternalRequestCallbacks } from '../types';
import { getDataFromRowItems, isKeyMissingInData, reduceDataCachedKeys } from '../utils';
import { AIColumnCacheController } from './m_ai_column_cache_controller';
import { AIColumnCacheController } from './ai_column_cache_controller';

export class AIColumnIntegrationController extends Controller {
private aborts: Record<string, (() => void) | undefined> = { };
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { Column } from '@ts/grids/grid_core/columns_controller/types';

import { ViewController } from '../../m_modules';
import type { AIPromptEditorView } from '../views/m_ai_prompt_editor_view';
import type { AIPromptEditorView } from '../views/ai_prompt_editor_view';

export class AIPromptEditorViewController extends ViewController {
private aiPromptEditorView!: AIPromptEditorView;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { AIColumnController } from './controllers/m_ai_column_controller';
export { AIPromptEditorViewController } from './controllers/m_ai_prompt_editor_view_controller';
export { columnHeadersViewExtender } from './views/m_ai_column_view';
export { AIPromptEditorView } from './views/m_ai_prompt_editor_view';
export { AIColumnController } from './controllers/ai_column_controller';
export { AIPromptEditorViewController } from './controllers/ai_prompt_editor_view_controller';
export { columnHeadersViewExtender } from './views/ai_column_view';
export { AIPromptEditorView } from './views/ai_prompt_editor_view';
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import type { Column } from '@ts/grids/grid_core/columns_controller/types';
import type { ColumnHeadersView } from '../../column_headers/m_column_headers';
import type { ColumnsResizerViewController } from '../../columns_resizing_reordering/m_columns_resizing_reordering';
import type { ModuleType } from '../../m_types';
import type { ColumnViewTemplate } from '../../views/types';
import { AI_COLUMN_NAME, CLASSES, ICON_NAMES } from '../const';
import type { AIColumnController } from '../controllers/m_ai_column_controller';
import type { AIPromptEditorViewController } from '../controllers/m_ai_prompt_editor_view_controller';
import type { AIColumnController } from '../controllers/ai_column_controller';
import type { AIPromptEditorViewController } from '../controllers/ai_prompt_editor_view_controller';
import { createAIHeaderContainer, createChatSparkleOutlineIcon } from '../dom';
import {
isAIColumnHeader,
Expand All @@ -20,7 +21,7 @@ import {

export const columnHeadersViewExtender = (
Base: ModuleType<ColumnHeadersView>,
) => class AIColumnHeadersViewExtender extends Base {
): ModuleType<ColumnHeadersView> => class AIColumnHeadersViewExtender extends Base {
private aiColumnController!: AIColumnController;

private aiPromptEditorController!: AIPromptEditorViewController;
Expand All @@ -29,7 +30,9 @@ export const columnHeadersViewExtender = (

private activeDropDownButtonInstance!: DropDownButton | null;

private aiColumnOptionChangedHandler!: (column: Column, optionName: string, value: unknown) => void;
private aiColumnOptionChangedHandler!: (
column: Column, optionName: string, value: unknown,
) => void;

private getDropDownButtonItems(column: Column): Item[] {
return [
Expand Down Expand Up @@ -75,6 +78,7 @@ export const columnHeadersViewExtender = (
// eslint-disable-next-line default-case
switch (actionName) {
case 'autoFill':
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.aiPromptEditorController.show($container[0], column);
break;
case 'regenerate':
Expand Down Expand Up @@ -138,16 +142,17 @@ export const columnHeadersViewExtender = (
super.getHeaderDefaultTemplate($container, options);
}

protected _processTemplate(template, options) {
protected _processTemplate(template, options): ColumnViewTemplate {
const renderingTemplate = super._processTemplate(template, options);
const { column } = options;
const needToRenderHeaderDropDownButton = isAIColumnHeader(options.column, options.rowType)
&& isHeaderDropDownButtonVisible(options.column);

if (renderingTemplate && needToRenderHeaderDropDownButton) {
return {
render: (args) => {
render: (args): void => {
renderingTemplate.render(args);
this.renderHeaderDropDownButton(args.model.column, $(args.container));
this.renderHeaderDropDownButton(column, $(args.container));
},
};
}
Expand Down Expand Up @@ -180,7 +185,9 @@ export const columnHeadersViewExtender = (
* when the cell resize is initiated.
* Calling this method is necessary to fix bug T252661.
*/
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.activeDropDownButtonInstance?.close();
// eslint-disable-next-line @typescript-eslint/no-floating-promises
this.aiPromptEditorController.hide();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import { AIPromptEditorModel } from '@ts/grids/grid_core/__tests__/__mock__/mode
import type { Column } from '@ts/grids/grid_core/columns_controller/types';

import { AIPromptEditor } from '../../ai_prompt_editor/ai_prompt_editor';
import { AIPromptEditorView } from './m_ai_prompt_editor_view';
import { AIPromptEditorView } from './ai_prompt_editor_view';

jest.mock('../../ai_prompt_editor/ai_prompt_editor', (): any => {
const original = jest.requireActual<any>('../../ai_prompt_editor/ai_prompt_editor');
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import type { ColumnsController } from '../../columns_controller/m_columns_contr
import { getColumnHeaderCellSelector } from '../../columns_controller/m_columns_controller_utils';
import { View } from '../../m_modules';
import { AI_COLUMN_NAME } from '../const';
import type { AIColumnController } from '../controllers/m_ai_column_controller';
import type { AIColumnController } from '../controllers/ai_column_controller';
import {
isAIColumnAutoMode,
isEditorOptions,
Expand Down Expand Up @@ -85,7 +85,7 @@ export class AIPromptEditorView extends View {
}
}

private ensureAIPromptEditorVisibility() {
private ensureAIPromptEditorVisibility(): void {
const aiColumns = this.aiColumnController.getAIColumns();
const aiColumnsWithVisiblePopup = aiColumns.filter((column) => column.ai?.popup?.visible);
if (aiColumnsWithVisiblePopup.length > 0) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import { CLASSES as REORDERING_CLASSES } from '../columns_resizing_reordering/co
import type { HeadersKeyboardNavigationController } from '../keyboard_navigation/m_headers_keyboard_navigation';
import { registerKeyboardAction } from '../m_accessibility';
import { ColumnsView } from '../views/m_columns_view';
import type { ColumnViewTemplate } from '../views/types';
import { CLASSES } from './const';

const HEADERS_CLASS = 'headers';
Expand Down Expand Up @@ -197,7 +198,7 @@ export class ColumnHeadersView extends ColumnContextMenuMixin(ColumnsView) {
};
}

protected _processTemplate(template, options) {
protected _processTemplate(template, options): ColumnViewTemplate {
const that = this;
let resultTemplate;
const { column } = options;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import type { DataChange } from '@ts/grids/grid_core/data_controller/types';
import type { EditingController } from '@ts/grids/grid_core/editing/m_editing';
import modules from '@ts/grids/grid_core/m_modules';
import type { OptionChanged } from '@ts/grids/grid_core/m_types';
import type { ToastViewController } from '@ts/grids/grid_core/toast/m_toast_controller';
import type { ToastViewController } from '@ts/grids/grid_core/toast/toast_controller';
import type { ResizingController } from '@ts/grids/grid_core/views/m_grid_view';
import type { RowsView } from '@ts/grids/grid_core/views/m_rows_view';

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import type { DeferredObj } from '@js/core/utils/deferred';
import { Deferred } from '@js/core/utils/deferred';
import type { DataController } from '@ts/grids/grid_core/data_controller/data_controller';
import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/m_filter_sync';
import type { FilterSyncController } from '@ts/grids/grid_core/filter_sync/filter_sync';
import type { ModuleType, OptionChanged } from '@ts/grids/grid_core/m_types';

export const filterSyncDataControllerExtender = (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import type { InternalGridOptions } from '@ts/grids/grid_core/m_types';

import { filterSyncColumnHeadersViewExtender } from './extenders/filter_sync_column_headers_view';
import { filterSyncDataControllerExtender } from './extenders/filter_sync_data_controller';
import { FilterSyncController } from './m_filter_sync';
import { FilterSyncController } from './filter_sync';

export const filterSyncModule = {
defaultOptions(): Pick<InternalGridOptions, 'filterValue' | 'filterSyncEnabled'> {
Expand Down

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

for some reason this file is recognized as new one, not renamed
perhaps this is because of added types - we can try to move it outside file

Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
import dateSerialization from '@js/core/utils/date_serialization';
import { isDate } from '@js/core/utils/type';
import type { OrderingDescriptor } from '@js/data/data.types';

import type { RawItemData } from '../data_source_adapter/types';

type ValueGetter = (data: RawItemData) => unknown;

interface SortFilterValueOptions {
isRemoteFiltering: boolean;
dateSerializationFormat: string | undefined;
getSelector: (selector: string) => ValueGetter | undefined;
}

interface SortFilterValue {
getter: ValueGetter;
rawValue: unknown;
safeValue: unknown;
}

// TODO Vinogradov: Move it to ts and cover with unit tests.
const getSortFilterValue = (
sortInfo: OrderingDescriptor<RawItemData>,
rowData: RawItemData,
{
isRemoteFiltering,
dateSerializationFormat,
getSelector,
}: SortFilterValueOptions,
): SortFilterValue => {
const { selector } = sortInfo;
const getter: ValueGetter = typeof selector === 'function'
? selector
: getSelector(selector) ?? ((data): unknown => data[selector]);
const rawValue = getter(rowData);

const safeValue = isRemoteFiltering && isDate(rawValue)
? dateSerialization.serializeDate(rawValue, dateSerializationFormat)
: rawValue;

return {
getter,
rawValue,
safeValue,
};
};

export const UiGridCoreFocusUtils = {
getSortFilterValue,
};
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import gridCoreUtils from '../m_utils';
import type { RowsView } from '../views/m_rows_view';
import type { VirtualScrollingDataControllerExtension } from '../virtual_scrolling/index';
import type { FocusDataSourceControllerExtension } from './extenders/focus_data_source_controller';
import { UiGridCoreFocusUtils } from './m_focus_utils';
import { UiGridCoreFocusUtils } from './focus_utils';
import type { FocusDataControllerExtension } from './types';

const ROW_FOCUSED_CLASS = 'dx-row-focused';
Expand Down Expand Up @@ -824,7 +824,7 @@ export const focusDataControllerExtender = (
private _generateOperationFilterByKey(key, rowData, useGroup) {
const dateSerializationFormat = this.option('dateSerializationFormat');
const remoteOperations = this.dataSourceController.remoteOperations();
const isRemoteFiltering = remoteOperations.filtering;
const isRemoteFiltering = Boolean(remoteOperations.filtering);
const isRemoteSorting = remoteOperations.sorting;

let filter = this._generateFilterByKey(key, '<');
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { isDefined, isEmptyObject } from '@js/core/utils/type';
import type { Column } from '@ts/grids/grid_core/columns_controller/types';

import type { ColumnFocusDispatcher } from './column_focus_dispatcher';
import { Direction } from './const';
import type { ColumnFocusDispatcher } from './m_column_focus_dispatcher';
import { KeyboardNavigationController as KeyboardNavigationControllerCore } from './m_keyboard_navigation_core';

export class ColumnKeyboardNavigationController extends KeyboardNavigationControllerCore {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@ import type { Views } from '../m_types';
import { StickyPosition } from '../sticky_columns/const';
import { GridCoreStickyColumnsDom } from '../sticky_columns/dom';
import { getColumnFixedPosition } from '../sticky_columns/utils';
import { ColumnFocusDispatcher } from './column_focus_dispatcher';
import { Direction } from './const';
import { ColumnFocusDispatcher } from './m_column_focus_dispatcher';
import { ColumnKeyboardNavigationController } from './m_column_keyboard_navigation_core';

export class HeadersKeyboardNavigationController extends ColumnKeyboardNavigationController {
Expand Down
14 changes: 7 additions & 7 deletions packages/devextreme/js/__internal/grids/grid_core/m_types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -214,12 +214,12 @@ export interface Controllers {
errorHandling: import('./error_handling/error_handling_view_controller').ErrorHandlingViewController;
export: import('../data_grid/export/m_export').ExportController;
filter: import('./filter/filter_controller').FilterController;
filterSync: import('./filter_sync/m_filter_sync').FilterSyncController;
filterSync: import('./filter_sync/filter_sync').FilterSyncController;
filterBuilder: import('./filter_builder/m_filter_builder').FilterBuilderController;
focus: import('./focus/m_focus').FocusController;
headerFilter: import('./header_filter/m_header_filter').HeaderFilterController;
keyboardNavigation: import('./keyboard_navigation/m_keyboard_navigation').KeyboardNavigationController;
columnFocusDispatcher: import('./keyboard_navigation/m_column_focus_dispatcher').ColumnFocusDispatcher;
columnFocusDispatcher: import('./keyboard_navigation/column_focus_dispatcher').ColumnFocusDispatcher;
headersKeyboardNavigation: import('./keyboard_navigation/m_headers_keyboard_navigation').HeadersKeyboardNavigationController;
groupPanelKeyboardNavigation: import('../data_grid/keyboard_navigation/m_group_panel_keyboard_navigation').GroupPanelKeyboardNavigationController;
resizing: import('./views/m_grid_view').ResizingController;
Expand All @@ -229,9 +229,9 @@ export interface Controllers {
stateStoring: import('./state_storing/state_storing_controller_core').StateStoringController;
synchronizeScrolling: import('./views/m_grid_view').SynchronizeScrollingController;
tablePosition: import('./columns_resizing_reordering/m_columns_resizing_reordering').TablePositionViewController;
toastViewController: import('./toast/m_toast_controller').ToastViewController;
aiColumn: import('./ai_column/controllers/m_ai_column_controller').AIColumnController;
aiPromptEditor: import('./ai_column/controllers/m_ai_prompt_editor_view_controller').AIPromptEditorViewController;
toastViewController: import('./toast/toast_controller').ToastViewController;
aiColumn: import('./ai_column/controllers/ai_column_controller').AIColumnController;
aiPromptEditor: import('./ai_column/controllers/ai_prompt_editor_view_controller').AIPromptEditorViewController;
aiAssistant: import('./ai_assistant/ai_assistant_controller').AIAssistantController;
aiAssistantViewController: import('./ai_assistant/ai_assistant_view_controller').AIAssistantViewController;
}
Expand All @@ -256,8 +256,8 @@ export interface Views {
gridView: import('./views/m_grid_view').GridView;
filterBuilderView: import('./filter_builder/m_filter_builder').FilterBuilderView;
filterPanelView: import('./filter_panel/m_filter_panel').FilterPanelView;
toastView: import('./toast/m_toast_view').ToastView;
aiPromptEditorView: import('./ai_column/views/m_ai_prompt_editor_view').AIPromptEditorView;
toastView: import('./toast/toast_view').ToastView;
aiPromptEditorView: import('./ai_column/views/ai_prompt_editor_view').AIPromptEditorView;
aiAssistantView: import('./ai_assistant/ai_assistant_view').AIAssistantView;
}

Expand Down
Loading
Loading