From e083d4ba502ea0c5138afc602379e959c2c9139c Mon Sep 17 00:00:00 2001 From: Illia Obukhau <8282906+iobuhov@users.noreply.github.com> Date: Thu, 20 Nov 2025 14:44:58 +0100 Subject: [PATCH 01/20] refactor: migrate event controllers from DI to React Context for simplified architecture --- .../datagrid-web/src/Datagrid.tsx | 57 ++++++++++++++++- .../src/components/RowsRenderer.tsx | 20 ++---- .../row-interaction/CellEventsController.ts | 61 ++++++++----------- .../datagrid-web/src/helpers/root-context.ts | 23 +++++++ .../src/helpers/useDataGridJSActions.ts | 6 +- .../model/containers/Datagrid.container.ts | 9 +-- .../src/model/containers/Root.container.ts | 2 +- .../src/model/hooks/injection-hooks.ts | 4 -- .../datagrid-web/src/model/tokens.ts | 4 +- .../datagrid-web/src/utils/test-utils.tsx | 1 + .../src/selection/select-action-handler.ts | 2 +- 11 files changed, 115 insertions(+), 74 deletions(-) create mode 100644 packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts diff --git a/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx b/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx index 3eeddd6be1..0fd98997a9 100644 --- a/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx @@ -1,22 +1,73 @@ +import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper"; +import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController"; +import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst"; import { ContainerProvider } from "brandi-react"; import { observer } from "mobx-react-lite"; import { ReactElement } from "react"; import { DatagridContainerProps } from "../typings/DatagridProps"; import { Widget } from "./components/Widget"; import { useDataExport } from "./features/data-export/useDataExport"; +import { useCellEventsController } from "./features/row-interaction/CellEventsController"; +import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController"; +import { LegacyContext } from "./helpers/root-context"; import { useDataGridJSActions } from "./helpers/useDataGridJSActions"; -import { useColumnsStore, useExportProgressService } from "./model/hooks/injection-hooks"; +import { + useColumnsStore, + useDatagridConfig, + useExportProgressService, + useMainGate, + useSelectActions, + useSelectionHelper +} from "./model/hooks/injection-hooks"; import { useDatagridContainer } from "./model/hooks/useDatagridContainer"; const DatagridRoot = observer((props: DatagridContainerProps): ReactElement => { + const config = useDatagridConfig(); + const gate = useMainGate(); const columnsStore = useColumnsStore(); const exportProgress = useExportProgressService(); + const items = gate.props.datasource.items ?? []; const [abortExport] = useDataExport(props, columnsStore, exportProgress); - useDataGridJSActions(); + const selectionHelper = useSelectionHelper(); - return ; + const selectActionHelper = useSelectActions(); + + const clickActionHelper = useClickActionHelper({ + onClickTrigger: props.onClickTrigger, + onClick: props.onClick + }); + + useDataGridJSActions(selectActionHelper); + + const visibleColumnsCount = config.checkboxColumnEnabled + ? columnsStore.visibleColumns.length + 1 + : columnsStore.visibleColumns.length; + + const focusController = useFocusTargetController({ + rows: items.length, + columns: visibleColumnsCount, + pageSize: props.pageSize + }); + + const cellEventsController = useCellEventsController(selectActionHelper, clickActionHelper, focusController); + + const checkboxEventsController = useCheckboxEventsController(selectActionHelper, focusController); + + return ( + + + + ); }); DatagridRoot.displayName = "DatagridComponent"; diff --git a/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx index 11de6a4e44..65c620c21c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx @@ -1,15 +1,8 @@ import { KeyNavProvider } from "@mendix/widget-plugin-grid/keyboard-navigation/context"; import { observer } from "mobx-react-lite"; import { ReactElement } from "react"; -import { - useCellEventsHandler, - useColumnsStore, - useDatagridConfig, - useFocusService, - useRowClass, - useRows, - useSelectActions -} from "../model/hooks/injection-hooks"; +import { useLegacyContext } from "../helpers/root-context"; +import { useColumnsStore, useDatagridConfig, useRowClass, useRows } from "../model/hooks/injection-hooks"; import { Row } from "./Row"; export const RowsRenderer = observer(function RowsRenderer(): ReactElement { @@ -17,18 +10,15 @@ export const RowsRenderer = observer(function RowsRenderer(): ReactElement { const config = useDatagridConfig(); const { visibleColumns } = useColumnsStore(); const rowClass = useRowClass(); - const cellEventsController = useCellEventsHandler(); - const focusService = useFocusService(); - const selectActions = useSelectActions(); - + const { cellEventsController, focusController, selectActionHelper } = useLegacyContext(); return ( - + {rows.map((item, rowIndex) => { return ( + focusController: FocusTargetController ): CellEventsController { - // Placeholder function, actual implementation will depend on the specific context and services available. - const cellContextFactory = (item: ObjectItem): CellContext => ({ - type: "cell", - item, - pageSize: pageSize.get(), - selectionType: config.selectionType, - selectionMethod: config.selectionMethod, - selectionMode: config.selectionMode, - clickTrigger: clickHelper.clickTrigger - }); + const pageSize = 10; + return useMemo(() => { + const cellContextFactory = (item: ObjectItem): CellContext => ({ + item, + pageSize: selectHelper.pageSize, + selectionType: selectHelper.selectionType, + selectionMethod: selectHelper.selectionMethod, + selectionMode: selectHelper.selectionMode, + clickTrigger: clickHelper.clickTrigger + }); - return new CellEventsController( - cellContextFactory, - selectActions.select, - selectActions.selectPage, - selectActions.selectAdjacent, - clickHelper.onExecuteAction, - focusController.dispatch - ); + return new CellEventsController( + cellContextFactory, + selectHelper.onSelect, + selectHelper.onSelectAll, + selectHelper.onSelectAdjacent, + clickHelper.onExecuteAction, + focusController.dispatch + ); + }, [selectHelper, clickHelper, focusController]); } diff --git a/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts b/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts new file mode 100644 index 0000000000..95bfeca571 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts @@ -0,0 +1,23 @@ +import { FocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/FocusTargetController"; +import { SelectionHelperService } from "@mendix/widget-plugin-grid/main"; +import { createContext, useContext } from "react"; +import { SelectActionHelper } from "../model/services/GridSelectActionsProvider.service"; +import { EventsController } from "../typings/CellComponent"; + +export interface LegacyRootScope { + selectionHelper: SelectionHelperService | undefined; + selectActionHelper: SelectActionHelper; + cellEventsController: EventsController; + checkboxEventsController: EventsController; + focusController: FocusTargetController; +} + +export const LegacyContext = createContext(null); + +export const useLegacyContext = (): LegacyRootScope => { + const contextValue = useContext(LegacyContext); + if (!contextValue) { + throw new Error("useDatagridRootScope must be used within a root context provider"); + } + return contextValue; +}; diff --git a/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts b/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts index 78f70a245e..2c57da66bc 100644 --- a/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts +++ b/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts @@ -1,9 +1,9 @@ import { useOnClearSelectionEvent, useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks"; -import { useDatagridConfig, useSelectActions } from "../model/hooks/injection-hooks"; +import { SelectActionsService } from "@mendix/widget-plugin-grid/main"; +import { useDatagridConfig } from "../model/hooks/injection-hooks"; -export function useDataGridJSActions(): void { +export function useDataGridJSActions(selectActions: SelectActionsService): void { const info = useDatagridConfig(); - const selectActions = useSelectActions(); useOnResetFiltersEvent(info.name, info.filtersChannelName); useOnClearSelectionEvent({ widgetName: info.name, diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 2493dfe82c..ab94ffbad5 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -27,7 +27,6 @@ import { PageControlService } from "../../features/pagination/PageControl.servic import { paginationConfig } from "../../features/pagination/pagination.config"; import { customPaginationAtom, dynamicPageAtom, dynamicPageSizeAtom } from "../../features/pagination/pagination.model"; import { PaginationViewModel } from "../../features/pagination/Pagination.viewModel"; -import { createCellEventsController } from "../../features/row-interaction/CellEventsController"; import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController"; import { SelectAllModule } from "../../features/select-all/SelectAllModule.container"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; @@ -47,7 +46,7 @@ injected(ColumnGroupStore, CORE.setupService, CORE.mainGate, CORE.config, DG.fil injected(DatasourceParamsController, CORE.setupService, DG.query, DG.combinedFilter, CORE.columnsStore); injected(DatasourceService, CORE.setupService, DG.queryGate, DG.refreshInterval.optional); injected(GridBasicData, CORE.mainGate); -injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.selectionDialogVM); +injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.progressService); injected(GridSizeStore, CORE.atoms.hasMoreItems, DG.paginationConfig, DG.setPageAction); /** Pagination **/ @@ -96,7 +95,6 @@ injected(createFocusController, CORE.setupService, DG.virtualLayout); injected(creteCheckboxEventsController, CORE.config, DG.selectActions, DG.focusService, DG.pageSize); injected(layoutAtom, CORE.atoms.itemCount, CORE.atoms.columnCount, DG.pageSize); injected(createClickActionHelper, CORE.setupService, CORE.mainGate); -injected(createCellEventsController, CORE.config, DG.selectActions, DG.focusService, DG.clickActionHelper, DG.pageSize); // selection counter injected( @@ -168,8 +166,6 @@ export class DatagridContainer extends Container { this.bind(DG.focusService).toInstance(createFocusController).inSingletonScope(); // Checkbox events service this.bind(DG.checkboxEventsHandler).toInstance(creteCheckboxEventsController).inSingletonScope(); - // Cell events service - this.bind(DG.cellEventsHandler).toInstance(createCellEventsController).inSingletonScope(); // Click action helper this.bind(DG.clickActionHelper).toInstance(createClickActionHelper).inSingletonScope(); } @@ -231,9 +227,6 @@ export class DatagridContainer extends Container { // Bind selection counter position this.bind(DG.selectionCounterCfg).toConstant({ position: props.selectionCounterPosition }); - // Bind selection type - this.bind(DG.selectionType).toConstant(config.selectionType); - this.postInit(props, config); return this; diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts index d62d242228..db58eb57fa 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts @@ -31,7 +31,7 @@ injected(hasMoreItemsAtom, CORE.mainGate); injected(visibleColumnsCountAtom, CORE.columnsStore); injected(isAllItemsPresentAtom, CORE.atoms.offset, CORE.atoms.hasMoreItems); injected(rowsAtom, CORE.mainGate); -injected(columnCount, CORE.atoms.visibleColumnsCount, CORE.config); +injected(columnCount, CORE.atoms.columnCount, CORE.config); // selection injected( diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index 2d3cca8eba..187a845a90 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -21,9 +21,5 @@ export const [useRowClass] = createInjectionHooks(DG.rowClass); export const [useDatagridRootVM] = createInjectionHooks(DG.datagridRootVM); export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); -export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); -export const [useFocusService] = createInjectionHooks(DG.focusService); -export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); -export const [useCellEventsHandler] = createInjectionHooks(DG.cellEventsHandler); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index cdcf6d5911..3b4eb157be 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -31,7 +31,6 @@ import { DynamicPaginationFeature } from "../features/pagination/DynamicPaginati import { GridPageControl } from "../features/pagination/GridPageControl"; import { PaginationViewModel } from "../features/pagination/Pagination.viewModel"; import { PaginationConfig } from "../features/pagination/pagination.config"; -import { CellEventsController } from "../features/row-interaction/CellEventsController"; import { CheckboxEventsController } from "../features/row-interaction/CheckboxEventsController"; import { SelectAllBarViewModel } from "../features/select-all/SelectAllBar.viewModel"; import { SelectionProgressDialogViewModel } from "../features/select-all/SelectionProgressDialog.viewModel"; @@ -145,8 +144,7 @@ export const DG_TOKENS = { virtualLayout: token>("@computed:virtualLayout"), clickActionHelper: token("@service:ClickActionHelper"), focusService: token("@service:FocusTargetController"), - checkboxEventsHandler: token("@service:CheckboxEventsController"), - cellEventsHandler: token("@service:CellEventsController") + checkboxEventsHandler: token("@service:CheckboxEventsController") }; /** "Select all" module tokens. */ diff --git a/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx b/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx index 006aa771f8..a2f4d9c646 100644 --- a/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx @@ -2,6 +2,7 @@ import { dynamic, list, listAttribute, listExpression } from "@mendix/widget-plu import { ColumnsType, DatagridContainerProps } from "../../typings/DatagridProps"; import { ColumnStore } from "../helpers/state/column/ColumnStore"; import { IColumnParentStore } from "../helpers/state/ColumnGroupStore"; +import { SelectActionHelper } from "../model/services/GridSelectActionsProvider.service"; import { ColumnId, GridColumn } from "../typings/GridColumn"; export const column = (header = "Test", patch?: (col: ColumnsType) => void): ColumnsType => { diff --git a/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts b/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts index 165f58d6cb..c5bcccad46 100644 --- a/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts +++ b/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts @@ -6,7 +6,7 @@ import { SelectAdjacentFx, SelectAllFx, SelectFx, SelectionType, WidgetSelection export class SelectActionHandler { constructor( private selection: WidgetSelectionProperty, - protected selectionHelper: SelectionHelperService | undefined + protected selectionHelper: SelectionHelperService ) {} get selectionType(): SelectionType { From f0041286d614bd7442045606a1bfd27610392b88 Mon Sep 17 00:00:00 2001 From: Illia Obukhau <8282906+iobuhov@users.noreply.github.com> Date: Thu, 20 Nov 2025 16:47:40 +0100 Subject: [PATCH 02/20] refactor: migrate event handlers to container --- .../datagrid-web/src/Datagrid.tsx | 57 +---------------- .../src/components/RowsRenderer.tsx | 20 ++++-- .../row-interaction/CellEventsController.ts | 61 +++++++++++-------- .../datagrid-web/src/helpers/root-context.ts | 23 ------- .../src/helpers/useDataGridJSActions.ts | 6 +- .../model/containers/Datagrid.container.ts | 9 ++- .../src/model/containers/Root.container.ts | 2 +- .../src/model/hooks/injection-hooks.ts | 4 ++ .../datagrid-web/src/model/tokens.ts | 4 +- 9 files changed, 73 insertions(+), 113 deletions(-) delete mode 100644 packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts diff --git a/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx b/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx index 0fd98997a9..3eeddd6be1 100644 --- a/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/Datagrid.tsx @@ -1,73 +1,22 @@ -import { useClickActionHelper } from "@mendix/widget-plugin-grid/helpers/ClickActionHelper"; -import { useFocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/useFocusTargetController"; -import { useConst } from "@mendix/widget-plugin-mobx-kit/react/useConst"; import { ContainerProvider } from "brandi-react"; import { observer } from "mobx-react-lite"; import { ReactElement } from "react"; import { DatagridContainerProps } from "../typings/DatagridProps"; import { Widget } from "./components/Widget"; import { useDataExport } from "./features/data-export/useDataExport"; -import { useCellEventsController } from "./features/row-interaction/CellEventsController"; -import { useCheckboxEventsController } from "./features/row-interaction/CheckboxEventsController"; -import { LegacyContext } from "./helpers/root-context"; import { useDataGridJSActions } from "./helpers/useDataGridJSActions"; -import { - useColumnsStore, - useDatagridConfig, - useExportProgressService, - useMainGate, - useSelectActions, - useSelectionHelper -} from "./model/hooks/injection-hooks"; +import { useColumnsStore, useExportProgressService } from "./model/hooks/injection-hooks"; import { useDatagridContainer } from "./model/hooks/useDatagridContainer"; const DatagridRoot = observer((props: DatagridContainerProps): ReactElement => { - const config = useDatagridConfig(); - const gate = useMainGate(); const columnsStore = useColumnsStore(); const exportProgress = useExportProgressService(); - const items = gate.props.datasource.items ?? []; const [abortExport] = useDataExport(props, columnsStore, exportProgress); - const selectionHelper = useSelectionHelper(); + useDataGridJSActions(); - const selectActionHelper = useSelectActions(); - - const clickActionHelper = useClickActionHelper({ - onClickTrigger: props.onClickTrigger, - onClick: props.onClick - }); - - useDataGridJSActions(selectActionHelper); - - const visibleColumnsCount = config.checkboxColumnEnabled - ? columnsStore.visibleColumns.length + 1 - : columnsStore.visibleColumns.length; - - const focusController = useFocusTargetController({ - rows: items.length, - columns: visibleColumnsCount, - pageSize: props.pageSize - }); - - const cellEventsController = useCellEventsController(selectActionHelper, clickActionHelper, focusController); - - const checkboxEventsController = useCheckboxEventsController(selectActionHelper, focusController); - - return ( - - - - ); + return ; }); DatagridRoot.displayName = "DatagridComponent"; diff --git a/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx index 65c620c21c..11de6a4e44 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/RowsRenderer.tsx @@ -1,8 +1,15 @@ import { KeyNavProvider } from "@mendix/widget-plugin-grid/keyboard-navigation/context"; import { observer } from "mobx-react-lite"; import { ReactElement } from "react"; -import { useLegacyContext } from "../helpers/root-context"; -import { useColumnsStore, useDatagridConfig, useRowClass, useRows } from "../model/hooks/injection-hooks"; +import { + useCellEventsHandler, + useColumnsStore, + useDatagridConfig, + useFocusService, + useRowClass, + useRows, + useSelectActions +} from "../model/hooks/injection-hooks"; import { Row } from "./Row"; export const RowsRenderer = observer(function RowsRenderer(): ReactElement { @@ -10,15 +17,18 @@ export const RowsRenderer = observer(function RowsRenderer(): ReactElement { const config = useDatagridConfig(); const { visibleColumns } = useColumnsStore(); const rowClass = useRowClass(); - const { cellEventsController, focusController, selectActionHelper } = useLegacyContext(); + const cellEventsController = useCellEventsHandler(); + const focusService = useFocusService(); + const selectActions = useSelectActions(); + return ( - + {rows.map((item, rowIndex) => { return ( ): CellEventsController { - const pageSize = 10; - return useMemo(() => { - const cellContextFactory = (item: ObjectItem): CellContext => ({ - item, - pageSize: selectHelper.pageSize, - selectionType: selectHelper.selectionType, - selectionMethod: selectHelper.selectionMethod, - selectionMode: selectHelper.selectionMode, - clickTrigger: clickHelper.clickTrigger - }); + // Placeholder function, actual implementation will depend on the specific context and services available. + const cellContextFactory = (item: ObjectItem): CellContext => ({ + type: "cell", + item, + pageSize: pageSize.get(), + selectionType: config.selectionType, + selectionMethod: config.selectionMethod, + selectionMode: config.selectionMode, + clickTrigger: clickHelper.clickTrigger + }); - return new CellEventsController( - cellContextFactory, - selectHelper.onSelect, - selectHelper.onSelectAll, - selectHelper.onSelectAdjacent, - clickHelper.onExecuteAction, - focusController.dispatch - ); - }, [selectHelper, clickHelper, focusController]); + return new CellEventsController( + cellContextFactory, + selectActions.select, + selectActions.selectPage, + selectActions.selectAdjacent, + clickHelper.onExecuteAction, + focusController.dispatch + ); } diff --git a/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts b/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts deleted file mode 100644 index 95bfeca571..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/helpers/root-context.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { FocusTargetController } from "@mendix/widget-plugin-grid/keyboard-navigation/FocusTargetController"; -import { SelectionHelperService } from "@mendix/widget-plugin-grid/main"; -import { createContext, useContext } from "react"; -import { SelectActionHelper } from "../model/services/GridSelectActionsProvider.service"; -import { EventsController } from "../typings/CellComponent"; - -export interface LegacyRootScope { - selectionHelper: SelectionHelperService | undefined; - selectActionHelper: SelectActionHelper; - cellEventsController: EventsController; - checkboxEventsController: EventsController; - focusController: FocusTargetController; -} - -export const LegacyContext = createContext(null); - -export const useLegacyContext = (): LegacyRootScope => { - const contextValue = useContext(LegacyContext); - if (!contextValue) { - throw new Error("useDatagridRootScope must be used within a root context provider"); - } - return contextValue; -}; diff --git a/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts b/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts index 2c57da66bc..78f70a245e 100644 --- a/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts +++ b/packages/pluggableWidgets/datagrid-web/src/helpers/useDataGridJSActions.ts @@ -1,9 +1,9 @@ import { useOnClearSelectionEvent, useOnResetFiltersEvent } from "@mendix/widget-plugin-external-events/hooks"; -import { SelectActionsService } from "@mendix/widget-plugin-grid/main"; -import { useDatagridConfig } from "../model/hooks/injection-hooks"; +import { useDatagridConfig, useSelectActions } from "../model/hooks/injection-hooks"; -export function useDataGridJSActions(selectActions: SelectActionsService): void { +export function useDataGridJSActions(): void { const info = useDatagridConfig(); + const selectActions = useSelectActions(); useOnResetFiltersEvent(info.name, info.filtersChannelName); useOnClearSelectionEvent({ widgetName: info.name, diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index ab94ffbad5..90c8e5a4d1 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -22,6 +22,7 @@ import { Container, injected } from "brandi"; import { MainGateProps } from "../../../typings/MainGateProps"; import { WidgetRootViewModel } from "../../features/base/WidgetRoot.viewModel"; import { EmptyPlaceholderViewModel } from "../../features/empty-message/EmptyPlaceholder.viewModel"; +import { createCellEventsController } from "../../features/row-interaction/CellEventsController"; import { DynamicPaginationFeature } from "../../features/pagination/DynamicPagination.feature"; import { PageControlService } from "../../features/pagination/PageControl.service"; import { paginationConfig } from "../../features/pagination/pagination.config"; @@ -46,7 +47,7 @@ injected(ColumnGroupStore, CORE.setupService, CORE.mainGate, CORE.config, DG.fil injected(DatasourceParamsController, CORE.setupService, DG.query, DG.combinedFilter, CORE.columnsStore); injected(DatasourceService, CORE.setupService, DG.queryGate, DG.refreshInterval.optional); injected(GridBasicData, CORE.mainGate); -injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.progressService); +injected(WidgetRootViewModel, CORE.mainGate, CORE.config, DG.exportProgressService, SA_TOKENS.selectionDialogVM); injected(GridSizeStore, CORE.atoms.hasMoreItems, DG.paginationConfig, DG.setPageAction); /** Pagination **/ @@ -95,6 +96,7 @@ injected(createFocusController, CORE.setupService, DG.virtualLayout); injected(creteCheckboxEventsController, CORE.config, DG.selectActions, DG.focusService, DG.pageSize); injected(layoutAtom, CORE.atoms.itemCount, CORE.atoms.columnCount, DG.pageSize); injected(createClickActionHelper, CORE.setupService, CORE.mainGate); +injected(createCellEventsController, CORE.config, DG.selectActions, DG.focusService, DG.clickActionHelper, DG.pageSize); // selection counter injected( @@ -166,6 +168,8 @@ export class DatagridContainer extends Container { this.bind(DG.focusService).toInstance(createFocusController).inSingletonScope(); // Checkbox events service this.bind(DG.checkboxEventsHandler).toInstance(creteCheckboxEventsController).inSingletonScope(); + // Cell events service + this.bind(DG.cellEventsHandler).toInstance(createCellEventsController).inSingletonScope(); // Click action helper this.bind(DG.clickActionHelper).toInstance(createClickActionHelper).inSingletonScope(); } @@ -227,6 +231,9 @@ export class DatagridContainer extends Container { // Bind selection counter position this.bind(DG.selectionCounterCfg).toConstant({ position: props.selectionCounterPosition }); + // Bind selection type + this.bind(DG.selectionType).toConstant(config.selectionType); + this.postInit(props, config); return this; diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts index db58eb57fa..d62d242228 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Root.container.ts @@ -31,7 +31,7 @@ injected(hasMoreItemsAtom, CORE.mainGate); injected(visibleColumnsCountAtom, CORE.columnsStore); injected(isAllItemsPresentAtom, CORE.atoms.offset, CORE.atoms.hasMoreItems); injected(rowsAtom, CORE.mainGate); -injected(columnCount, CORE.atoms.columnCount, CORE.config); +injected(columnCount, CORE.atoms.visibleColumnsCount, CORE.config); // selection injected( diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index 187a845a90..4f48b8b10c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,3 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); +export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); +export const [useFocusService] = createInjectionHooks(DG.focusService); +export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); +export const [useCellEventsHandler] = createInjectionHooks(DG.cellEventsHandler); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index 3b4eb157be..cdcf6d5911 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -31,6 +31,7 @@ import { DynamicPaginationFeature } from "../features/pagination/DynamicPaginati import { GridPageControl } from "../features/pagination/GridPageControl"; import { PaginationViewModel } from "../features/pagination/Pagination.viewModel"; import { PaginationConfig } from "../features/pagination/pagination.config"; +import { CellEventsController } from "../features/row-interaction/CellEventsController"; import { CheckboxEventsController } from "../features/row-interaction/CheckboxEventsController"; import { SelectAllBarViewModel } from "../features/select-all/SelectAllBar.viewModel"; import { SelectionProgressDialogViewModel } from "../features/select-all/SelectionProgressDialog.viewModel"; @@ -144,7 +145,8 @@ export const DG_TOKENS = { virtualLayout: token>("@computed:virtualLayout"), clickActionHelper: token("@service:ClickActionHelper"), focusService: token("@service:FocusTargetController"), - checkboxEventsHandler: token("@service:CheckboxEventsController") + checkboxEventsHandler: token("@service:CheckboxEventsController"), + cellEventsHandler: token("@service:CellEventsController") }; /** "Select all" module tokens. */ From ae84d71dff48426fd5c0f5f049b7b98a0d1592e0 Mon Sep 17 00:00:00 2001 From: Yordan Date: Thu, 20 Nov 2025 13:02:24 +0100 Subject: [PATCH 03/20] refactor: extract drag & drop state and logic to mobx --- .../features/column/ColumnHeader.viewModel.ts | 114 ++++++++++++++++++ .../features/column/HeaderDragnDrop.store.ts | 36 ++++++ .../model/containers/Datagrid.container.ts | 3 + .../src/model/hooks/injection-hooks.ts | 1 + .../datagrid-web/src/model/tokens.ts | 2 + 5 files changed, 156 insertions(+) create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts new file mode 100644 index 0000000000..27be4adede --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts @@ -0,0 +1,114 @@ +import { makeAutoObservable } from "mobx"; +import { DragEvent, DragEventHandler } from "react"; +import { HeaderDragnDropStore } from "./HeaderDragnDrop.store"; +import { ColumnId } from "../../typings/GridColumn"; +import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; + +/** + * View model for a single column header drag & drop interactions. + * Encapsulates previous `useDraggable` hook logic and uses MobX store for shared drag state. + */ +export class ColumnHeaderViewModel { + private readonly dndStore: HeaderDragnDropStore; + private readonly columnsStore: ColumnGroupStore; + private readonly columnsDraggable: boolean; + + constructor(params: { dndStore: HeaderDragnDropStore; columnsStore: ColumnGroupStore; columnsDraggable: boolean }) { + this.dndStore = params.dndStore; + this.columnsStore = params.columnsStore; + this.columnsDraggable = params.columnsDraggable; + makeAutoObservable(this); + } + + get dropTarget(): [ColumnId, "before" | "after"] | undefined { + return this.dndStore.dragOver; + } + + get dragging(): [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined { + return this.dndStore.isDragging; + } + + /** Handlers exposed to the component. */ + get draggableProps(): { + draggable?: boolean; + onDragStart?: DragEventHandler; + onDragOver?: DragEventHandler; + onDrop?: DragEventHandler; + onDragEnter?: DragEventHandler; + onDragEnd?: DragEventHandler; + } { + if (!this.columnsDraggable) { + return {}; + } + return { + draggable: true, + onDragStart: this.handleDragStart, + onDragOver: this.handleDragOver, + onDrop: this.handleOnDrop, + onDragEnter: this.handleDragEnter, + onDragEnd: this.handleDragEnd + }; + } + + private handleDragStart = (e: DragEvent): void => { + const elt = (e.target as HTMLDivElement).closest(".th") as HTMLDivElement; + if (!elt) { + return; + } + const columnId = (elt.dataset.columnId ?? "") as ColumnId; + const columnAtTheLeft = (elt.previousElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; + const columnAtTheRight = (elt.nextElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; + this.dndStore.setIsDragging([columnAtTheLeft, columnId, columnAtTheRight]); + }; + + private handleDragOver = (e: DragEvent): void => { + const dragging = this.dragging; + if (!dragging) { + return; + } + const columnId = (e.currentTarget as HTMLDivElement).dataset.columnId as ColumnId; + if (!columnId) { + return; + } + e.preventDefault(); + const [leftSiblingColumnId, draggingColumnId, rightSiblingColumnId] = dragging; + if (columnId === draggingColumnId) { + if (this.dropTarget !== undefined) { + this.dndStore.setDragOver(undefined); + } + return; + } + let isAfter: boolean; + if (columnId === leftSiblingColumnId) { + isAfter = false; + } else if (columnId === rightSiblingColumnId) { + isAfter = true; + } else { + const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect(); + isAfter = rect.width / 2 + (this.dropTarget?.[1] === "after" ? -10 : 10) < e.clientX - rect.left; + } + const newPosition: "before" | "after" = isAfter ? "after" : "before"; + if (columnId !== this.dropTarget?.[0] || newPosition !== this.dropTarget?.[1]) { + this.dndStore.setDragOver([columnId, newPosition]); + } + }; + + private handleDragEnter = (e: DragEvent): void => { + e.preventDefault(); + }; + + private handleDragEnd = (): void => { + this.dndStore.clearDragState(); + }; + + private handleOnDrop = (_e: DragEvent): void => { + const dragging = this.dragging; + const dropTarget = this.dropTarget; + this.handleDragEnd(); + if (!dragging || !dropTarget) { + return; + } + // Reorder columns using existing columns store logic + this.columnsStore.swapColumns(dragging[1], dropTarget); + }; +} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts new file mode 100644 index 0000000000..14090ab1ae --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts @@ -0,0 +1,36 @@ +import { action, makeAutoObservable } from "mobx"; +import { ColumnId } from "../../typings/GridColumn"; + +export class HeaderDragnDropStore { + private _dragOver: [ColumnId, "before" | "after"] | undefined = undefined; + private _isDragging: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined = undefined; + + constructor() { + makeAutoObservable(this, { + setDragOver: action, + setIsDragging: action, + clearDragState: action + }); + } + + get dragOver(): [ColumnId, "before" | "after"] | undefined { + return this._dragOver; + } + + get isDragging(): [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined { + return this._isDragging; + } + + setDragOver(value: [ColumnId, "before" | "after"] | undefined): void { + this._dragOver = value; + } + + setIsDragging(value: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined): void { + this._isDragging = value; + } + + clearDragState(): void { + this._dragOver = undefined; + this._isDragging = undefined; + } +} diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 90c8e5a4d1..3ca4e2208a 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -31,6 +31,7 @@ import { PaginationViewModel } from "../../features/pagination/Pagination.viewMo import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController"; import { SelectAllModule } from "../../features/select-all/SelectAllModule.container"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; +import { HeaderDragnDropStore } from "../../features/column/HeaderDragnDrop.store"; import { GridBasicData } from "../../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../../helpers/state/GridPersonalizationStore"; import { DatagridConfig } from "../configs/Datagrid.config"; @@ -116,6 +117,8 @@ export class DatagridContainer extends Container { this.bind(DG.basicDate).toInstance(GridBasicData).inSingletonScope(); // Columns store this.bind(CORE.columnsStore).toInstance(ColumnGroupStore).inSingletonScope(); + // Drag and Drop store + this.bind(DG.headerDragDrop).toInstance(HeaderDragnDropStore).inSingletonScope(); // Query service this.bind(DG.query).toInstance(DatasourceService).inSingletonScope(); // Grid sizing and scrolling store diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index 4f48b8b10c..e17c4432b9 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,6 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); +export const [useHeaderDragDrop] = createInjectionHooks(DG.headerDragDrop); export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); export const [useFocusService] = createInjectionHooks(DG.focusService); export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index cdcf6d5911..3f1e877fe1 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -38,6 +38,7 @@ import { SelectionProgressDialogViewModel } from "../features/select-all/Selecti import { ColumnGroupStore } from "../helpers/state/ColumnGroupStore"; import { GridBasicData } from "../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../helpers/state/GridPersonalizationStore"; +import { HeaderDragnDropStore } from "../features/column/HeaderDragnDrop.store"; import { DatasourceParamsController } from "../model/services/DatasourceParamsController"; import { GridColumn } from "../typings/GridColumn"; import { DatagridConfig } from "./configs/Datagrid.config"; @@ -146,6 +147,7 @@ export const DG_TOKENS = { clickActionHelper: token("@service:ClickActionHelper"), focusService: token("@service:FocusTargetController"), checkboxEventsHandler: token("@service:CheckboxEventsController"), + headerDragDrop: token("HeaderDragnDropStore"), cellEventsHandler: token("@service:CellEventsController") }; From 77b819cabb8bc683ad7c894d6445e39f85db3e51 Mon Sep 17 00:00:00 2001 From: Yordan Date: Thu, 20 Nov 2025 13:04:03 +0100 Subject: [PATCH 04/20] refactor: update components to use new state management --- .../src/components/ColumnContainer.tsx | 127 ++++++++++ .../src/components/ColumnHeader.tsx | 29 +++ .../src/components/GridHeader.tsx | 13 +- .../datagrid-web/src/components/Header.tsx | 238 ------------------ 4 files changed, 159 insertions(+), 248 deletions(-) create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx delete mode 100644 packages/pluggableWidgets/datagrid-web/src/components/Header.tsx diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx new file mode 100644 index 0000000000..e537707f67 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -0,0 +1,127 @@ +import classNames from "classnames"; +import { HTMLAttributes, KeyboardEvent, ReactElement, ReactNode, useMemo } from "react"; +import { FaArrowsAltV } from "./icons/FaArrowsAltV"; +import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; +import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; + +import ColumnHeader from "./ColumnHeader"; + +import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDragDrop } from "../model/hooks/injection-hooks"; +import { GridColumn } from "../typings/GridColumn"; +import { ColumnResizerProps } from "./ColumnResizer"; +import { ColumnHeaderViewModel } from "../features/column/ColumnHeader.viewModel"; +import { observer } from "mobx-react-lite"; + +export interface ColumnContainerProps { + isLast?: boolean; + resizer: ReactElement; +} + +export const ColumnContainer = observer(function ColumnContainer(props: ColumnContainerProps): ReactElement { + const { columnsFilterable, id: gridId } = useDatagridConfig(); + const columnsStore = useColumnsStore(); + const column = useColumn(); + const { canDrag, canSort } = column; + + const headerDragDropStore = useHeaderDragDrop(); + const columnHeaderVM = useMemo( + () => + new ColumnHeaderViewModel({ + dndStore: headerDragDropStore, + columnsStore, + columnsDraggable: canDrag + }), + [headerDragDropStore, columnsStore, canDrag] + ); + const draggableProps = columnHeaderVM.draggableProps; + const dropTarget = columnHeaderVM.dropTarget; + const isDragging = columnHeaderVM.dragging; + + const sortProps = canSort ? getSortProps(column) : null; + const caption = column.header.trim(); + + return ( +
+
+ + {canSort ? : null} + + {columnsFilterable && ( +
+ {columnsStore.columnFilters[column.columnIndex]?.renderFilterWidgets()} +
+ )} +
+ {column.canResize ? props.resizer : null} +
+ ); +}); + +function SortIcon(): ReactNode { + const column = useColumn(); + switch (column.sortDir) { + case "asc": + return ; + case "desc": + return ; + default: + return ; + } +} + +function getAriaSort(canSort: boolean, column: GridColumn): "ascending" | "descending" | "none" | undefined { + if (!canSort) { + return undefined; + } + + switch (column.sortDir) { + case "asc": + return "ascending"; + case "desc": + return "descending"; + default: + return "none"; + } +} + +function getSortProps(column: GridColumn): HTMLAttributes { + return { + onClick: () => { + column.toggleSort(); + }, + onKeyDown: (e: KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + column.toggleSort(); + } + }, + role: "button", + tabIndex: 0 + }; +} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx new file mode 100644 index 0000000000..a27a18e7af --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -0,0 +1,29 @@ +import classNames from "classnames"; +import { HTMLAttributes, ReactElement, ReactNode } from "react"; + +export interface ColumnHeaderProps { + children?: ReactNode; + sortProps?: HTMLAttributes | null; + canSort: boolean; + caption: string; + isDragging?: [string | undefined, string, string | undefined] | undefined; + columnAlignment?: "left" | "center" | "right"; +} + +export default function ColumnHeader(props: ColumnHeaderProps): ReactElement { + return ( +
+ {props.caption.length > 0 ? props.caption : "\u00a0"} + {props.children} +
+ ); +} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx index a378cd42b7..bd4abcea4d 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx @@ -1,11 +1,10 @@ -import { ReactElement, useState } from "react"; +import { ReactElement } from "react"; import { useColumnsStore, useDatagridConfig, useGridSizeStore } from "../model/hooks/injection-hooks"; -import { ColumnId } from "../typings/GridColumn"; import { CheckboxColumnHeader } from "./CheckboxColumnHeader"; import { ColumnProvider } from "./ColumnProvider"; import { ColumnResizer } from "./ColumnResizer"; import { ColumnSelector } from "./ColumnSelector"; -import { Header } from "./Header"; +import { ColumnContainer } from "./ColumnContainer"; import { HeaderSkeletonLoader } from "./loader/HeaderSkeletonLoader"; export function GridHeader(): ReactElement { @@ -13,8 +12,6 @@ export function GridHeader(): ReactElement { const columnsStore = useColumnsStore(); const gridSizeStore = useGridSizeStore(); const columns = columnsStore.visibleColumns; - const [dragOver, setDragOver] = useState<[ColumnId, "before" | "after"] | undefined>(undefined); - const [isDragging, setIsDragging] = useState<[ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined>(); if (!columnsStore.loaded) { return ; @@ -26,9 +23,7 @@ export function GridHeader(): ReactElement { {columns.map(column => ( -
columnsStore.setIsResizing(true)} @@ -36,8 +31,6 @@ export function GridHeader(): ReactElement { setColumnWidth={(width: number) => column.setSize(width)} /> } - setDropTarget={setDragOver} - setIsDragging={setIsDragging} /> ))} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/Header.tsx b/packages/pluggableWidgets/datagrid-web/src/components/Header.tsx deleted file mode 100644 index 1c396b3b75..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/components/Header.tsx +++ /dev/null @@ -1,238 +0,0 @@ -import classNames from "classnames"; -import { - Dispatch, - DragEvent, - DragEventHandler, - HTMLAttributes, - KeyboardEvent, - ReactElement, - ReactNode, - SetStateAction, - useCallback -} from "react"; -import { FaArrowsAltV } from "./icons/FaArrowsAltV"; -import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; -import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; - -import { useColumn, useColumnsStore, useDatagridConfig } from "../model/hooks/injection-hooks"; -import { ColumnId, GridColumn } from "../typings/GridColumn"; -import { ColumnResizerProps } from "./ColumnResizer"; - -export interface HeaderProps { - isLast?: boolean; - resizer: ReactElement; - - dropTarget?: [ColumnId, "before" | "after"]; - isDragging?: [ColumnId | undefined, ColumnId, ColumnId | undefined]; - setDropTarget: Dispatch>; - setIsDragging: Dispatch>; -} - -export function Header(props: HeaderProps): ReactElement { - const { columnsFilterable, id: gridId, columnsDraggable, columnsResizable, columnsSortable } = useDatagridConfig(); - const columnsStore = useColumnsStore(); - const column = useColumn(); - const canDrag = columnsDraggable && column.canDrag; - const canSort = columnsSortable && column.canSort; - const canResize = columnsResizable && column.canResize; - - const draggableProps = useDraggable( - canDrag, - columnsStore.swapColumns.bind(columnsStore), - props.dropTarget, - props.setDropTarget, - props.isDragging, - props.setIsDragging - ); - - const sortIcon = canSort ? getSortIcon(column) : null; - const sortProps = canSort ? getSortProps(column) : null; - const caption = column.header.trim(); - - return ( -
-
-
- {caption.length > 0 ? caption : "\u00a0"} - {sortIcon} -
- {columnsFilterable && ( -
- {columnsStore.columnFilters[column.columnIndex]?.renderFilterWidgets()} -
- )} -
- {canResize ? props.resizer : null} -
- ); -} - -function useDraggable( - columnsDraggable: boolean, - setColumnOrder: (source: ColumnId, target: [ColumnId, "after" | "before"]) => void, - dropTarget: [ColumnId, "before" | "after"] | undefined, - setDropTarget: Dispatch>, - dragging: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined, - setDragging: Dispatch> -): { - draggable?: boolean; - onDragStart?: DragEventHandler; - onDragOver?: DragEventHandler; - onDrop?: DragEventHandler; - onDragEnter?: DragEventHandler; - onDragEnd?: DragEventHandler; -} { - const handleDragStart = useCallback( - (e: DragEvent): void => { - const elt = (e.target as HTMLDivElement).closest(".th") as HTMLDivElement; - const columnId = elt.dataset.columnId ?? ""; - - const columnAtTheLeft = (elt.previousElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; - const columnAtTheRight = (elt.nextElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; - - setDragging([columnAtTheLeft, columnId as ColumnId, columnAtTheRight]); - }, - [setDragging] - ); - - const handleDragOver = useCallback( - (e: DragEvent): void => { - if (!dragging) { - return; - } - const columnId = (e.currentTarget as HTMLDivElement).dataset.columnId as ColumnId; - if (!columnId) { - return; - } - e.preventDefault(); - - const [leftSiblingColumnId, draggingColumnId, rightSiblingColumnId] = dragging; - - if (columnId === draggingColumnId) { - // hover on itself place, no highlight - if (dropTarget !== undefined) { - setDropTarget(undefined); - } - return; - } - - let isAfter: boolean; - - if (columnId === leftSiblingColumnId) { - isAfter = false; - } else if (columnId === rightSiblingColumnId) { - isAfter = true; - } else { - // check position in element - const rect = e.currentTarget.getBoundingClientRect(); - isAfter = rect.width / 2 + (dropTarget?.[1] === "after" ? -10 : 10) < e.clientX - rect.left; - } - - const newPosition = isAfter ? "after" : "before"; - - if (columnId !== dropTarget?.[0] || newPosition !== dropTarget?.[1]) { - setDropTarget([columnId, newPosition]); - } - }, - [dragging, dropTarget, setDropTarget] - ); - - const handleDragEnter = useCallback((e: DragEvent): void => { - e.preventDefault(); - }, []); - - const handleDragEnd = useCallback((): void => { - setDragging(undefined); - setDropTarget(undefined); - }, [setDropTarget, setDragging]); - - const handleOnDrop = useCallback( - (_e: DragEvent): void => { - handleDragEnd(); - if (!dragging || !dropTarget) { - return; - } - - setColumnOrder(dragging[1], dropTarget); - }, - [handleDragEnd, setColumnOrder, dragging, dropTarget] - ); - - return columnsDraggable - ? { - draggable: true, - onDragStart: handleDragStart, - onDragOver: handleDragOver, - onDrop: handleOnDrop, - onDragEnter: handleDragEnter, - onDragEnd: handleDragEnd - } - : {}; -} - -function getSortIcon(column: GridColumn): ReactNode { - switch (column.sortDir) { - case "asc": - return ; - case "desc": - return ; - default: - return ; - } -} - -function getAriaSort(canSort: boolean, column: GridColumn): "ascending" | "descending" | "none" | undefined { - if (!canSort) { - return undefined; - } - - switch (column.sortDir) { - case "asc": - return "ascending"; - case "desc": - return "descending"; - default: - return "none"; - } -} - -function getSortProps(column: GridColumn): HTMLAttributes { - return { - onClick: () => { - column.toggleSort(); - }, - onKeyDown: (e: KeyboardEvent) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - column.toggleSort(); - } - }, - role: "button", - tabIndex: 0 - }; -} From 97446d777ea78fcc63780f8c8e6ef4d8a0735ede Mon Sep 17 00:00:00 2001 From: Yordan Date: Thu, 20 Nov 2025 13:05:33 +0100 Subject: [PATCH 05/20] refactor: remove obsolete tests and snapshots, create for new component --- .../src/components/__tests__/Header.spec.tsx | 176 ----------- .../__snapshots__/Header.spec.tsx.snap | 197 ------------ .../__tests__/ColumnHeader.viewModel.spec.ts | 299 ++++++++++++++++++ 3 files changed, 299 insertions(+), 373 deletions(-) delete mode 100644 packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx delete mode 100644 packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/Header.spec.tsx.snap create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx deleted file mode 100644 index 8700700918..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { dynamic } from "@mendix/widget-plugin-test-utils"; -import { render } from "@testing-library/react"; -import userEvent from "@testing-library/user-event"; -import { ContainerProvider } from "brandi-react"; -import { createDatagridContainer } from "../../model/containers/createDatagridContainer"; -import { CORE_TOKENS } from "../../model/tokens"; -import { column, mockContainerProps } from "../../utils/test-utils"; -import { ColumnProvider } from "../ColumnProvider"; -import { ColumnResizer } from "../ColumnResizer"; -import { Header, HeaderProps } from "../Header"; - -describe("Header", () => { - it("renders the structure correctly", () => { - const props = mockContainerProps({ - columns: [column("Column 1")] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
- - - ); - - expect(component.asFragment()).toMatchSnapshot(); - }); - - it("renders the structure correctly when sortable", () => { - const columnsType = column("Column 1", col => { - col.sortable = true; - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
- - - ); - - expect(component.asFragment()).toMatchSnapshot(); - }); - - it("renders the structure correctly when resizable", () => { - const columnsType = column("Column 1", col => { - col.resizable = true; - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
resizer} /> - - - ); - - expect(component.asFragment()).toMatchSnapshot(); - }); - - it("renders the structure correctly when draggable", () => { - const columnsType = column("Column 1", col => { - col.draggable = true; - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
- - - ); - - expect(component.asFragment()).toMatchSnapshot(); - }); - - it("renders the structure correctly when filterable with custom filter", () => { - const columnsType = column("Column 1", col => { - col.filter =
Custom filter
; - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
- - - ); - - expect(component.asFragment()).toMatchSnapshot(); - }); - - it("calls sort function when sortable", async () => { - const user = userEvent.setup(); - const columnsType = column("Column 1", col => { - col.sortable = true; - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - const spy = jest.spyOn(col, "toggleSort"); - - const component = render( - - -
- - - ); - const button = component.getByLabelText("sort Column 1"); - - expect(button).toBeInTheDocument(); - await user.click(button); - expect(spy).toHaveBeenCalled(); - }); - - it("renders the structure correctly when value is empty", () => { - const columnsType = column("Column 1", col => { - col.header = dynamic(" "); - }); - const props = mockContainerProps({ - columns: [columnsType] - }); - const [container] = createDatagridContainer(props); - const columns = container.get(CORE_TOKENS.columnsStore); - const col = columns.visibleColumns[0]; - - const component = render( - - -
- - - ); - expect(component.asFragment()).toMatchSnapshot(); - }); -}); - -function mockHeaderProps(): HeaderProps { - return { - dropTarget: undefined, - resizer: , - setDropTarget: jest.fn(), - setIsDragging: jest.fn() - }; -} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/Header.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/Header.spec.tsx.snap deleted file mode 100644 index 6deadade40..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/Header.spec.tsx.snap +++ /dev/null @@ -1,197 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Header renders the structure correctly 1`] = ` - -
-
-
- - Column 1 - -
-
-
-
- -`; - -exports[`Header renders the structure correctly when draggable 1`] = ` - -
-
-
- - Column 1 - -
-
-
-
- -`; - -exports[`Header renders the structure correctly when filterable with custom filter 1`] = ` - -
-
-
- - Column 1 - -
-
-
- Custom filter -
-
-
-
-
-`; - -exports[`Header renders the structure correctly when resizable 1`] = ` - -
-
-
- - Column 1 - -
-
-
-
- -`; - -exports[`Header renders the structure correctly when sortable 1`] = ` - -
-
-
- - Column 1 - - -
-
-
-
- -`; - -exports[`Header renders the structure correctly when value is empty 1`] = ` - -
-
-
- -   - -
-
-
-
- -`; diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts new file mode 100644 index 0000000000..bb8b0dde39 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts @@ -0,0 +1,299 @@ +import { DragEvent } from "react"; +import { ColumnHeaderViewModel } from "../ColumnHeader.viewModel"; +import { HeaderDragnDropStore } from "../HeaderDragnDrop.store"; +import { ColumnId } from "../../../typings/GridColumn"; + +describe("ColumnHeaderViewModel", () => { + let dndStore: HeaderDragnDropStore; + let mockColumnsStore: any; + + beforeEach(() => { + dndStore = new HeaderDragnDropStore(); + mockColumnsStore = { + swapColumns: jest.fn() + }; + }); + + describe("when columnsDraggable is false", () => { + it("returns empty draggableProps", () => { + const vm = new ColumnHeaderViewModel({ + dndStore, + columnsStore: mockColumnsStore, + columnsDraggable: false + }); + + expect(vm.draggableProps).toEqual({}); + }); + }); + + describe("when columnsDraggable is true", () => { + let vm: ColumnHeaderViewModel; + + beforeEach(() => { + vm = new ColumnHeaderViewModel({ + dndStore, + columnsStore: mockColumnsStore, + columnsDraggable: true + }); + }); + + it("returns draggable props with handlers", () => { + const props = vm.draggableProps; + + expect(props.draggable).toBe(true); + expect(props.onDragStart).toBeDefined(); + expect(props.onDragOver).toBeDefined(); + expect(props.onDrop).toBeDefined(); + expect(props.onDragEnter).toBeDefined(); + expect(props.onDragEnd).toBeDefined(); + }); + + describe("dropTarget", () => { + it("returns undefined initially", () => { + expect(vm.dropTarget).toBeUndefined(); + }); + + it("returns value from dndStore", () => { + dndStore.setDragOver(["col1" as ColumnId, "after"]); + expect(vm.dropTarget).toEqual(["col1", "after"]); + }); + }); + + describe("dragging", () => { + it("returns undefined initially", () => { + expect(vm.dragging).toBeUndefined(); + }); + + it("returns value from dndStore", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + expect(vm.dragging).toEqual(["col0", "col1", "col2"]); + }); + }); + + describe("handleDragStart", () => { + it("sets dragging state with column siblings", () => { + const mockElement = createMockElement("col1", "col0", "col2"); + const event = createMockDragEvent(mockElement); + + vm.draggableProps.onDragStart?.(event); + + expect(dndStore.isDragging).toEqual(["col0", "col1", "col2"]); + }); + + it("handles missing previous sibling", () => { + const mockElement = createMockElement("col1", undefined, "col2"); + const event = createMockDragEvent(mockElement); + + vm.draggableProps.onDragStart?.(event); + + expect(dndStore.isDragging).toEqual([undefined, "col1", "col2"]); + }); + + it("handles missing next sibling", () => { + const mockElement = createMockElement("col1", "col0", undefined); + const event = createMockDragEvent(mockElement); + + vm.draggableProps.onDragStart?.(event); + + expect(dndStore.isDragging).toEqual(["col0", "col1", undefined]); + }); + + it("does nothing when element is not found", () => { + const event = { + target: { + closest: jest.fn().mockReturnValue(null) + } + } as any; + + vm.draggableProps.onDragStart?.(event); + + expect(dndStore.isDragging).toBeUndefined(); + }); + }); + + describe("handleDragOver", () => { + beforeEach(() => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + }); + + it("does nothing when not dragging", () => { + dndStore.clearDragState(); + const event = createMockDragOverEvent("col2", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toBeUndefined(); + }); + + it("does nothing when columnId is missing", () => { + const event = createMockDragOverEvent("", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toBeUndefined(); + }); + + it("clears dropTarget when hovering over self", () => { + dndStore.setDragOver(["col2" as ColumnId, "after"]); + const event = createMockDragOverEvent("col1", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toBeUndefined(); + }); + + it("sets dropTarget to before when hovering over left sibling", () => { + const event = createMockDragOverEvent("col0", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toEqual(["col0", "before"]); + }); + + it("sets dropTarget to after when hovering over right sibling", () => { + const event = createMockDragOverEvent("col2", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toEqual(["col2", "after"]); + }); + + it("sets dropTarget to before when hovering on left side of non-sibling column", () => { + const event = createMockDragOverEvent("col5", 100, 30); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toEqual(["col5", "before"]); + }); + + it("sets dropTarget to after when hovering on right side of non-sibling column", () => { + const event = createMockDragOverEvent("col5", 100, 70); + + vm.draggableProps.onDragOver?.(event); + + expect(dndStore.dragOver).toEqual(["col5", "after"]); + }); + + it("does not update dropTarget if it hasn't changed", () => { + dndStore.setDragOver(["col5" as ColumnId, "after"]); + const setDragOverSpy = jest.spyOn(dndStore, "setDragOver"); + const event = createMockDragOverEvent("col5", 100, 70); + + vm.draggableProps.onDragOver?.(event); + + expect(setDragOverSpy).not.toHaveBeenCalled(); + }); + + it("prevents default behavior", () => { + const event = createMockDragOverEvent("col2", 100, 50); + + vm.draggableProps.onDragOver?.(event); + + expect(event.preventDefault).toHaveBeenCalled(); + }); + }); + + describe("handleDragEnter", () => { + it("prevents default behavior", () => { + const event = { preventDefault: jest.fn() } as any; + + vm.draggableProps.onDragEnter?.(event); + + expect(event.preventDefault).toHaveBeenCalled(); + }); + }); + + describe("handleDragEnd", () => { + it("clears drag state", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + dndStore.setDragOver(["col2" as ColumnId, "after"]); + + vm.draggableProps.onDragEnd?.({} as any); + + expect(dndStore.isDragging).toBeUndefined(); + expect(dndStore.dragOver).toBeUndefined(); + }); + }); + + describe("handleOnDrop", () => { + it("calls swapColumns with correct parameters", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + dndStore.setDragOver(["col3" as ColumnId, "after"]); + + vm.draggableProps.onDrop?.({} as any); + + expect(mockColumnsStore.swapColumns).toHaveBeenCalledWith("col1", ["col3", "after"]); + }); + + it("clears drag state after drop", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + dndStore.setDragOver(["col3" as ColumnId, "after"]); + + vm.draggableProps.onDrop?.({} as any); + + expect(dndStore.isDragging).toBeUndefined(); + expect(dndStore.dragOver).toBeUndefined(); + }); + + it("does not call swapColumns when not dragging", () => { + dndStore.setDragOver(["col3" as ColumnId, "after"]); + + vm.draggableProps.onDrop?.({} as any); + + expect(mockColumnsStore.swapColumns).not.toHaveBeenCalled(); + }); + + it("does not call swapColumns when no dropTarget", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + + vm.draggableProps.onDrop?.({} as any); + + expect(mockColumnsStore.swapColumns).not.toHaveBeenCalled(); + }); + + it("clears drag state even when drop is invalid", () => { + dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); + + vm.draggableProps.onDrop?.({} as any); + + expect(dndStore.isDragging).toBeUndefined(); + expect(dndStore.dragOver).toBeUndefined(); + }); + }); + }); +}); + +// Helper functions to create mock DOM elements and events + +function createMockElement( + columnId: string, + prevSiblingId: string | undefined, + nextSiblingId: string | undefined +): HTMLDivElement { + const element = { + dataset: { columnId }, + previousElementSibling: prevSiblingId ? { dataset: { columnId: prevSiblingId } } : null, + nextElementSibling: nextSiblingId ? { dataset: { columnId: nextSiblingId } } : null + } as any; + + return element; +} + +function createMockDragEvent(targetElement: HTMLDivElement): DragEvent { + return { + target: { + closest: jest.fn().mockReturnValue(targetElement) + } + } as any; +} + +function createMockDragOverEvent(columnId: string, width: number, clientX: number): DragEvent { + return { + currentTarget: { + dataset: { columnId }, + getBoundingClientRect: jest.fn().mockReturnValue({ width, left: 0 }) + }, + clientX, + preventDefault: jest.fn() + } as any; +} From 905e2a32dbf6568f97cc9e1841f09a7cfd3ae30d Mon Sep 17 00:00:00 2001 From: Yordan Date: Thu, 20 Nov 2025 14:30:27 +0100 Subject: [PATCH 06/20] refactor: rewrite columnreszier to use injection hooks --- .../src/components/ColumnResizer.tsx | 28 ++++++++----------- .../src/components/GridHeader.tsx | 10 +------ 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnResizer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnResizer.tsx index 90dc7f7449..bcbc4bcfe9 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnResizer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnResizer.tsx @@ -1,24 +1,18 @@ import { useEventCallback } from "@mendix/widget-plugin-hooks/useEventCallback"; import { MouseEvent, ReactElement, TouchEvent, useCallback, useEffect, useRef, useState } from "react"; +import { useColumn, useColumnsStore } from "../model/hooks/injection-hooks"; export interface ColumnResizerProps { minWidth?: number; - setColumnWidth: (width: number) => void; - onResizeEnds?: () => void; - onResizeStart?: () => void; } -export function ColumnResizer({ - minWidth = 50, - setColumnWidth, - onResizeEnds, - onResizeStart -}: ColumnResizerProps): ReactElement { +export function ColumnResizer({ minWidth = 50 }: ColumnResizerProps): ReactElement { + const column = useColumn(); + const columnsStore = useColumnsStore(); const [isResizing, setIsResizing] = useState(false); const [startPosition, setStartPosition] = useState(0); const [currentWidth, setCurrentWidth] = useState(0); const resizerReference = useRef(null); - const onStart = useEventCallback(onResizeStart); const onStartDrag = useCallback( (e: TouchEvent & MouseEvent): void => { @@ -26,12 +20,12 @@ export function ColumnResizer({ setStartPosition(mouseX); setIsResizing(true); if (resizerReference.current) { - const column = resizerReference.current.parentElement!; - setCurrentWidth(column.offsetWidth); + const columnElement = resizerReference.current.parentElement!; + setCurrentWidth(columnElement.offsetWidth); } - onStart(); + columnsStore.setIsResizing(true); }, - [onStart] + [columnsStore] ); const onEndDrag = useCallback((): void => { if (!isResizing) { @@ -39,9 +33,9 @@ export function ColumnResizer({ } setIsResizing(false); setCurrentWidth(0); - onResizeEnds?.(); - }, [onResizeEnds, isResizing]); - const setColumnWidthStable = useEventCallback(setColumnWidth); + columnsStore.setIsResizing(false); + }, [columnsStore, isResizing]); + const setColumnWidthStable = useEventCallback((width: number) => column.setSize(width)); const onMouseMove = useCallback( (e: TouchEvent & MouseEvent & Event): void => { if (!isResizing) { diff --git a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx index bd4abcea4d..cab4ef45f2 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx @@ -23,15 +23,7 @@ export function GridHeader(): ReactElement { {columns.map(column => ( - columnsStore.setIsResizing(true)} - onResizeEnds={() => columnsStore.setIsResizing(false)} - setColumnWidth={(width: number) => column.setSize(width)} - /> - } - /> + } /> ))} {columnsHidable && ( From cb926ba5b88cc17a8cc6e0ef47c65c23df0ba2b0 Mon Sep 17 00:00:00 2001 From: Yordan Date: Thu, 20 Nov 2025 14:49:41 +0100 Subject: [PATCH 07/20] refactor: enhance ColumnResizer test structure and update snapshot --- .../__tests__/ColumnResizer.spec.tsx | 18 +++++++++++++++++- .../__snapshots__/ColumnResizer.spec.tsx.snap | 2 ++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnResizer.spec.tsx b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnResizer.spec.tsx index 4fcd572b02..175375933c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnResizer.spec.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnResizer.spec.tsx @@ -1,9 +1,25 @@ import { render } from "@testing-library/react"; +import { ContainerProvider } from "brandi-react"; +import { createDatagridContainer } from "../../model/containers/createDatagridContainer"; +import { CORE_TOKENS as CORE } from "../../model/tokens"; +import { mockContainerProps } from "../../utils/test-utils"; +import { ColumnProvider } from "../ColumnProvider"; import { ColumnResizer } from "../ColumnResizer"; describe("Column Resizer", () => { it("renders the structure correctly", () => { - const component = render(); + const props = mockContainerProps(); + const [container] = createDatagridContainer(props); + const columnsStore = container.get(CORE.columnsStore); + const column = columnsStore.visibleColumns[0]; + + const component = render( + + + + + + ); expect(component).toMatchSnapshot(); }); diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap index 35e61c875c..531e05370c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap @@ -13,6 +13,7 @@ exports[`Column Resizer renders the structure correctly 1`] = ` class="column-resizer-bar" />
+
, "container":
@@ -24,6 +25,7 @@ exports[`Column Resizer renders the structure correctly 1`] = ` class="column-resizer-bar" />
+
, "debug": [Function], "findAllByAltText": [Function], From 7010ee1cc11214e8c8cf65a9076a47868fad42cf Mon Sep 17 00:00:00 2001 From: Yordan Date: Fri, 21 Nov 2025 10:25:26 +0100 Subject: [PATCH 08/20] refactor: fix failing test --- .../__tests__/__snapshots__/ColumnResizer.spec.tsx.snap | 2 -- packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx | 1 - 2 files changed, 3 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap index 531e05370c..35e61c875c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnResizer.spec.tsx.snap @@ -13,7 +13,6 @@ exports[`Column Resizer renders the structure correctly 1`] = ` class="column-resizer-bar" />
-
, "container":
@@ -25,7 +24,6 @@ exports[`Column Resizer renders the structure correctly 1`] = ` class="column-resizer-bar" />
- , "debug": [Function], "findAllByAltText": [Function], diff --git a/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx b/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx index a2f4d9c646..006aa771f8 100644 --- a/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/utils/test-utils.tsx @@ -2,7 +2,6 @@ import { dynamic, list, listAttribute, listExpression } from "@mendix/widget-plu import { ColumnsType, DatagridContainerProps } from "../../typings/DatagridProps"; import { ColumnStore } from "../helpers/state/column/ColumnStore"; import { IColumnParentStore } from "../helpers/state/ColumnGroupStore"; -import { SelectActionHelper } from "../model/services/GridSelectActionsProvider.service"; import { ColumnId, GridColumn } from "../typings/GridColumn"; export const column = (header = "Test", patch?: (col: ColumnsType) => void): ColumnsType => { From fb175811f8bcccec9642a5c21e77105528c3813d Mon Sep 17 00:00:00 2001 From: Yordan Date: Fri, 21 Nov 2025 15:19:22 +0100 Subject: [PATCH 09/20] feat: enhance drag-and-drop functionality with DragHandle component --- .../src/components/ColumnContainer.tsx | 64 ++++++++++++++++--- .../src/components/ColumnHeader.tsx | 1 - 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index e537707f67..9193037d13 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -1,5 +1,5 @@ import classNames from "classnames"; -import { HTMLAttributes, KeyboardEvent, ReactElement, ReactNode, useMemo } from "react"; +import { DragEventHandler, HTMLAttributes, KeyboardEvent, ReactElement, ReactNode, useMemo } from "react"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; @@ -16,6 +16,11 @@ export interface ColumnContainerProps { isLast?: boolean; resizer: ReactElement; } +interface DragHandleProps { + draggable: boolean; + onDragStart?: DragEventHandler; + onDragEnd?: DragEventHandler; +} export const ColumnContainer = observer(function ColumnContainer(props: ColumnContainerProps): ReactElement { const { columnsFilterable, id: gridId } = useDatagridConfig(); @@ -56,13 +61,7 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo onDragEnter={draggableProps.onDragEnter} onDragOver={draggableProps.onDragOver} > -
+
+ {draggableProps.draggable && ( + + )} + + {caption.length > 0 ? caption : "\u00a0"} + {canSort ? : null} {columnsFilterable && ( @@ -83,6 +92,45 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo ); }); +function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { + const handleMouseDown = (e: React.MouseEvent) => { + // Only stop propagation, don't prevent default - we need default for drag to work + e.stopPropagation(); + }; + + const handleClick = (e: React.MouseEvent) => { + // Stop click events from bubbling to prevent sorting + e.stopPropagation(); + e.preventDefault(); + }; + + const handleDragStart = (e: React.DragEvent) => { + // Don't stop propagation here - let the drag start properly + if (onDragStart) { + onDragStart(e); + } + }; + + const handleDragEnd = (e: React.DragEvent) => { + if (onDragEnd) { + onDragEnd(e); + } + }; + + return ( + + â ¿ + + ); +} + function SortIcon(): ReactNode { const column = useColumn(); switch (column.sortDir) { diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index a27a18e7af..710d244461 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -22,7 +22,6 @@ export default function ColumnHeader(props: ColumnHeaderProps): ReactElement { {...props.sortProps} aria-label={props.canSort ? "sort " + props.caption : props.caption} > - {props.caption.length > 0 ? props.caption : "\u00a0"} {props.children}
); From fce413613e6876294f644f011db4dad8d3100463 Mon Sep 17 00:00:00 2001 From: Yordan Date: Fri, 21 Nov 2025 15:31:35 +0100 Subject: [PATCH 10/20] refactor: fix lint errors --- .../datawidgets/web/_datagrid.scss | 18 ++++++++++++++++++ .../src/components/ColumnContainer.tsx | 19 ++++++++++++++----- 2 files changed, 32 insertions(+), 5 deletions(-) diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index 79b2ac631b..1e0be5f270 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -131,6 +131,24 @@ $root: ".widget-datagrid"; align-self: center; } + /* Drag handle */ + .drag-handle { + cursor: grab; + pointer-events: auto; + position: relative; + width: 14px; + padding: 0; + flex-grow: 0; + display: flex; + justify-content: center; + z-index: 1; + + &:hover { + background-color: var(--brand-primary-50, $brand-light); + color: var(--brand-primary, $brand-primary); + } + } + &:focus:not(:focus-visible) { outline: none; } diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index 9193037d13..bd18dcebc9 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -1,5 +1,14 @@ import classNames from "classnames"; -import { DragEventHandler, HTMLAttributes, KeyboardEvent, ReactElement, ReactNode, useMemo } from "react"; +import { + DragEvent, + DragEventHandler, + HTMLAttributes, + KeyboardEvent, + MouseEvent, + ReactElement, + ReactNode, + useMemo +} from "react"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; @@ -93,25 +102,25 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo }); function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { - const handleMouseDown = (e: React.MouseEvent) => { + const handleMouseDown = (e: MouseEvent): void => { // Only stop propagation, don't prevent default - we need default for drag to work e.stopPropagation(); }; - const handleClick = (e: React.MouseEvent) => { + const handleClick = (e: MouseEvent): void => { // Stop click events from bubbling to prevent sorting e.stopPropagation(); e.preventDefault(); }; - const handleDragStart = (e: React.DragEvent) => { + const handleDragStart = (e: DragEvent): void => { // Don't stop propagation here - let the drag start properly if (onDragStart) { onDragStart(e); } }; - const handleDragEnd = (e: React.DragEvent) => { + const handleDragEnd = (e: DragEvent): void => { if (onDragEnd) { onDragEnd(e); } From 7550f39a7faab271dd2b05d8e86ccfd97bb635f4 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Thu, 27 Nov 2025 16:31:18 +0100 Subject: [PATCH 11/20] refactor: standardize use of brandi --- .../datawidgets/web/_datagrid.scss | 4 + .../src/components/ColumnContainer.tsx | 159 ++--------------- .../src/components/ColumnHeader.tsx | 116 ++++++++++-- .../src/components/__tests__/Header.spec.tsx | 168 ++++++++++++++++++ ...wModel.ts => HeaderDragnDrop.viewModel.ts} | 34 ++-- ...c.ts => HeaderDragnDrop.viewModel.spec.ts} | 24 +-- .../model/containers/Datagrid.container.ts | 10 +- .../src/model/hooks/injection-hooks.ts | 2 +- .../datagrid-web/src/model/tokens.ts | 5 +- 9 files changed, 332 insertions(+), 190 deletions(-) create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx rename packages/pluggableWidgets/datagrid-web/src/features/column/{ColumnHeader.viewModel.ts => HeaderDragnDrop.viewModel.ts} (79%) rename packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/{ColumnHeader.viewModel.spec.ts => HeaderDragnDrop.viewModel.spec.ts} (95%) diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index 1e0be5f270..1f2b489f0b 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -149,6 +149,10 @@ $root: ".widget-datagrid"; } } + .drag-handle + .column-caption { + padding-inline-start: 4px; + } + &:focus:not(:focus-visible) { outline: none; } diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index bd18dcebc9..ac8d9c1d0a 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -1,163 +1,58 @@ import classNames from "classnames"; -import { - DragEvent, - DragEventHandler, - HTMLAttributes, - KeyboardEvent, - MouseEvent, - ReactElement, - ReactNode, - useMemo -} from "react"; -import { FaArrowsAltV } from "./icons/FaArrowsAltV"; -import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; -import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; - -import ColumnHeader from "./ColumnHeader"; - -import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDragDrop } from "../model/hooks/injection-hooks"; -import { GridColumn } from "../typings/GridColumn"; +import { ReactElement } from "react"; +import { ColumnHeader } from "./ColumnHeader"; +import { useColumn, useColumnsStore, useDatagridConfig, useColumnHeaderVM } from "../model/hooks/injection-hooks"; import { ColumnResizerProps } from "./ColumnResizer"; -import { ColumnHeaderViewModel } from "../features/column/ColumnHeader.viewModel"; import { observer } from "mobx-react-lite"; export interface ColumnContainerProps { isLast?: boolean; resizer: ReactElement; } -interface DragHandleProps { - draggable: boolean; - onDragStart?: DragEventHandler; - onDragEnd?: DragEventHandler; -} export const ColumnContainer = observer(function ColumnContainer(props: ColumnContainerProps): ReactElement { const { columnsFilterable, id: gridId } = useDatagridConfig(); - const columnsStore = useColumnsStore(); - const column = useColumn(); - const { canDrag, canSort } = column; + const { columnFilters } = useColumnsStore(); + const { canSort, columnId, columnIndex, canResize, sortDir, header } = useColumn(); + const { draggableProps, dropTarget, dragging } = useColumnHeaderVM(); - const headerDragDropStore = useHeaderDragDrop(); - const columnHeaderVM = useMemo( - () => - new ColumnHeaderViewModel({ - dndStore: headerDragDropStore, - columnsStore, - columnsDraggable: canDrag - }), - [headerDragDropStore, columnsStore, canDrag] - ); - const draggableProps = columnHeaderVM.draggableProps; - const dropTarget = columnHeaderVM.dropTarget; - const isDragging = columnHeaderVM.dragging; - - const sortProps = canSort ? getSortProps(column) : null; - const caption = column.header.trim(); + const caption = header.trim(); return (
-
- - {draggableProps.draggable && ( - - )} - - {caption.length > 0 ? caption : "\u00a0"} - - {canSort ? : null} - +
+ {columnsFilterable && ( -
- {columnsStore.columnFilters[column.columnIndex]?.renderFilterWidgets()} +
+ {columnFilters[columnIndex]?.renderFilterWidgets()}
)}
- {column.canResize ? props.resizer : null} + {canResize ? props.resizer : null}
); }); -function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { - const handleMouseDown = (e: MouseEvent): void => { - // Only stop propagation, don't prevent default - we need default for drag to work - e.stopPropagation(); - }; - - const handleClick = (e: MouseEvent): void => { - // Stop click events from bubbling to prevent sorting - e.stopPropagation(); - e.preventDefault(); - }; - - const handleDragStart = (e: DragEvent): void => { - // Don't stop propagation here - let the drag start properly - if (onDragStart) { - onDragStart(e); - } - }; - - const handleDragEnd = (e: DragEvent): void => { - if (onDragEnd) { - onDragEnd(e); - } - }; - - return ( - - â ¿ - - ); -} - -function SortIcon(): ReactNode { - const column = useColumn(); - switch (column.sortDir) { - case "asc": - return ; - case "desc": - return ; - default: - return ; - } -} - -function getAriaSort(canSort: boolean, column: GridColumn): "ascending" | "descending" | "none" | undefined { +function getAriaSort(canSort: boolean, sortDir: string | undefined): "ascending" | "descending" | "none" | undefined { if (!canSort) { return undefined; } - switch (column.sortDir) { + switch (sortDir) { case "asc": return "ascending"; case "desc": @@ -166,19 +61,3 @@ function getAriaSort(canSort: boolean, column: GridColumn): "ascending" | "desce return "none"; } } - -function getSortProps(column: GridColumn): HTMLAttributes { - return { - onClick: () => { - column.toggleSort(); - }, - onKeyDown: (e: KeyboardEvent) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - column.toggleSort(); - } - }, - role: "button", - tabIndex: 0 - }; -} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index 710d244461..ec01888225 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -1,28 +1,106 @@ import classNames from "classnames"; -import { HTMLAttributes, ReactElement, ReactNode } from "react"; - -export interface ColumnHeaderProps { - children?: ReactNode; - sortProps?: HTMLAttributes | null; - canSort: boolean; - caption: string; - isDragging?: [string | undefined, string, string | undefined] | undefined; - columnAlignment?: "left" | "center" | "right"; +import { DragEventHandler, DragEvent, HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode } from "react"; +import { FaArrowsAltV } from "./icons/FaArrowsAltV"; +import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; +import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; +import { useColumn, useColumnHeaderVM } from "../model/hooks/injection-hooks"; +import { observer } from "mobx-react-lite"; + +interface DragHandleProps { + draggable: boolean; + onDragStart?: DragEventHandler; + onDragEnd?: DragEventHandler; } -export default function ColumnHeader(props: ColumnHeaderProps): ReactElement { +export const ColumnHeader = observer(function ColumnHeader(): ReactElement { + const { draggableProps, dragging } = useColumnHeaderVM(); + const { header, canSort, alignment, toggleSort } = useColumn(); + const caption = header.trim(); + const sortProps = canSort ? getSortProps(toggleSort) : null; + return (
- {props.children} + {draggableProps.draggable && ( + + )} + {caption.length > 0 ? caption : "\u00a0"} + {canSort ? : null}
); +}); + +function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { + const handleMouseDown = (e: MouseEvent): void => { + // Only stop propagation, don't prevent default - we need default for drag to work + e.stopPropagation(); + }; + + const handleClick = (e: MouseEvent): void => { + // Stop click events from bubbling to prevent sorting + e.stopPropagation(); + e.preventDefault(); + }; + + const handleDragStart = (e: DragEvent): void => { + // Don't stop propagation here - let the drag start properly + if (onDragStart) { + onDragStart(e); + } + }; + + const handleDragEnd = (e: DragEvent): void => { + if (onDragEnd) { + onDragEnd(e); + } + }; + + return ( + + â ¿ + + ); +} + +function SortIcon(): ReactNode { + const column = useColumn(); + switch (column.sortDir) { + case "asc": + return ; + case "desc": + return ; + default: + return ; + } +} + +function getSortProps(toggleSort: () => void): HTMLAttributes { + return { + onClick: () => { + toggleSort(); + }, + onKeyDown: (e: KeyboardEvent) => { + if (e.key === "Enter" || e.key === " ") { + e.preventDefault(); + toggleSort(); + } + }, + role: "button", + tabIndex: 0 + }; } diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx new file mode 100644 index 0000000000..63167f0fe9 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/Header.spec.tsx @@ -0,0 +1,168 @@ +import { dynamic } from "@mendix/widget-plugin-test-utils"; +import "@testing-library/jest-dom"; +import { render } from "@testing-library/react"; +import userEvent from "@testing-library/user-event"; +import { ContainerProvider } from "brandi-react"; +import { createDatagridContainer } from "../../model/containers/createDatagridContainer"; +import { CORE_TOKENS } from "../../model/tokens"; +import { column, mockContainerProps } from "../../utils/test-utils"; +import { ColumnProvider } from "../ColumnProvider"; +import { ColumnContainer } from "../ColumnContainer"; +import { ColumnResizer } from "../ColumnResizer"; + +describe("ColumnContainer", () => { + it("renders the structure correctly", () => { + const props = mockContainerProps({ + columns: [column("Column 1")] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + } /> + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + + it("renders the structure correctly when sortable", () => { + const columnsType = column("Column 1", col => { + col.sortable = true; + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + } /> + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + + it("renders the structure correctly when resizable", () => { + const columnsType = column("Column 1", col => { + col.resizable = true; + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + resizer
} /> + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + + it("renders the structure correctly when draggable", () => { + const columnsType = column("Column 1", col => { + col.draggable = true; + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + } /> + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + + it("renders the structure correctly when filterable with custom filter", () => { + const columnsType = column("Column 1", col => { + col.filter =
Custom filter
; + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + } /> + + + ); + + expect(component.asFragment()).toMatchSnapshot(); + }); + + it("calls sort function when sortable", async () => { + const user = userEvent.setup(); + const columnsType = column("Column 1", col => { + col.sortable = true; + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + const spy = jest.spyOn(col, "toggleSort"); + + const component = render( + + + } /> + + + ); + const button = component.getByLabelText("sort Column 1"); + + expect(button).toBeInTheDocument(); + await user.click(button); + expect(spy).toHaveBeenCalled(); + }); + + it("renders the structure correctly when value is empty", () => { + const columnsType = column("Column 1", col => { + col.header = dynamic(" "); + }); + const props = mockContainerProps({ + columns: [columnsType] + }); + const [container] = createDatagridContainer(props); + const columns = container.get(CORE_TOKENS.columnsStore); + const col = columns.visibleColumns[0]; + + const component = render( + + + } /> + + + ); + expect(component.asFragment()).toMatchSnapshot(); + }); +}); diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts similarity index 79% rename from packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts rename to packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts index 27be4adede..775e0621da 100644 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/ColumnHeader.viewModel.ts +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts @@ -1,22 +1,20 @@ import { makeAutoObservable } from "mobx"; import { DragEvent, DragEventHandler } from "react"; import { HeaderDragnDropStore } from "./HeaderDragnDrop.store"; -import { ColumnId } from "../../typings/GridColumn"; +import { ColumnId, GridColumn } from "../../typings/GridColumn"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; /** * View model for a single column header drag & drop interactions. * Encapsulates previous `useDraggable` hook logic and uses MobX store for shared drag state. */ -export class ColumnHeaderViewModel { - private readonly dndStore: HeaderDragnDropStore; - private readonly columnsStore: ColumnGroupStore; - private readonly columnsDraggable: boolean; - - constructor(params: { dndStore: HeaderDragnDropStore; columnsStore: ColumnGroupStore; columnsDraggable: boolean }) { - this.dndStore = params.dndStore; - this.columnsStore = params.columnsStore; - this.columnsDraggable = params.columnsDraggable; +export class HeaderDragnDropViewModel { + constructor( + private dndStore: HeaderDragnDropStore, + private columnsStore: ColumnGroupStore, + private config: { columnsDraggable: boolean }, + private column: GridColumn + ) { makeAutoObservable(this); } @@ -28,6 +26,10 @@ export class ColumnHeaderViewModel { return this.dndStore.isDragging; } + get isDraggable(): boolean { + return this.config.columnsDraggable && this.column.canDrag; + } + /** Handlers exposed to the component. */ get draggableProps(): { draggable?: boolean; @@ -37,7 +39,7 @@ export class ColumnHeaderViewModel { onDragEnter?: DragEventHandler; onDragEnd?: DragEventHandler; } { - if (!this.columnsDraggable) { + if (!this.isDraggable) { return {}; } return { @@ -50,7 +52,7 @@ export class ColumnHeaderViewModel { }; } - private handleDragStart = (e: DragEvent): void => { + handleDragStart = (e: DragEvent): void => { const elt = (e.target as HTMLDivElement).closest(".th") as HTMLDivElement; if (!elt) { return; @@ -61,7 +63,7 @@ export class ColumnHeaderViewModel { this.dndStore.setIsDragging([columnAtTheLeft, columnId, columnAtTheRight]); }; - private handleDragOver = (e: DragEvent): void => { + handleDragOver = (e: DragEvent): void => { const dragging = this.dragging; if (!dragging) { return; @@ -93,15 +95,15 @@ export class ColumnHeaderViewModel { } }; - private handleDragEnter = (e: DragEvent): void => { + handleDragEnter = (e: DragEvent): void => { e.preventDefault(); }; - private handleDragEnd = (): void => { + handleDragEnd = (): void => { this.dndStore.clearDragState(); }; - private handleOnDrop = (_e: DragEvent): void => { + handleOnDrop = (_e: DragEvent): void => { const dragging = this.dragging; const dropTarget = this.dropTarget; this.handleDragEnd(); diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts similarity index 95% rename from packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts rename to packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts index bb8b0dde39..91490e3e39 100644 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/ColumnHeader.viewModel.spec.ts +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts @@ -1,40 +1,42 @@ import { DragEvent } from "react"; -import { ColumnHeaderViewModel } from "../ColumnHeader.viewModel"; +import { HeaderDragnDropViewModel } from "../HeaderDragnDrop.viewModel"; import { HeaderDragnDropStore } from "../HeaderDragnDrop.store"; import { ColumnId } from "../../../typings/GridColumn"; describe("ColumnHeaderViewModel", () => { let dndStore: HeaderDragnDropStore; let mockColumnsStore: any; + let mockColumn: any; beforeEach(() => { dndStore = new HeaderDragnDropStore(); mockColumnsStore = { swapColumns: jest.fn() }; + mockColumn = { + canDrag: true, + columnId: "col1" as ColumnId + }; }); describe("when columnsDraggable is false", () => { it("returns empty draggableProps", () => { - const vm = new ColumnHeaderViewModel({ + const vm = new HeaderDragnDropViewModel( dndStore, - columnsStore: mockColumnsStore, - columnsDraggable: false - }); + mockColumnsStore, + { columnsDraggable: false }, + mockColumn + ); expect(vm.draggableProps).toEqual({}); }); }); describe("when columnsDraggable is true", () => { - let vm: ColumnHeaderViewModel; + let vm: HeaderDragnDropViewModel; beforeEach(() => { - vm = new ColumnHeaderViewModel({ - dndStore, - columnsStore: mockColumnsStore, - columnsDraggable: true - }); + vm = new HeaderDragnDropViewModel(dndStore, mockColumnsStore, { columnsDraggable: true }, mockColumn); }); it("returns draggable props with handlers", () => { diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 3ca4e2208a..41e47856f9 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -31,7 +31,7 @@ import { PaginationViewModel } from "../../features/pagination/Pagination.viewMo import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController"; import { SelectAllModule } from "../../features/select-all/SelectAllModule.container"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; -import { HeaderDragnDropStore } from "../../features/column/HeaderDragnDrop.store"; +import { HeaderDragnDropViewModel } from "../../features/column/HeaderDragnDrop.viewModel"; import { GridBasicData } from "../../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../../helpers/state/GridPersonalizationStore"; import { DatagridConfig } from "../configs/Datagrid.config"; @@ -107,6 +107,9 @@ injected( DG.selectionCounterCfg.optional ); +// drag and drop +injected(HeaderDragnDropViewModel, DG.headerDragDrop, CORE.columnsStore, CORE.config, CORE.column); + export class DatagridContainer extends Container { id = `DatagridContainer@${generateUUID()}`; constructor(root: Container) { @@ -118,7 +121,7 @@ export class DatagridContainer extends Container { // Columns store this.bind(CORE.columnsStore).toInstance(ColumnGroupStore).inSingletonScope(); // Drag and Drop store - this.bind(DG.headerDragDrop).toInstance(HeaderDragnDropStore).inSingletonScope(); + this.bind(DG.columnHeaderVM).toInstance(HeaderDragnDropViewModel).inSingletonScope(); // Query service this.bind(DG.query).toInstance(DatasourceService).inSingletonScope(); // Grid sizing and scrolling store @@ -201,6 +204,9 @@ export class DatagridContainer extends Container { // Config this.bind(CORE.config).toConstant(config); + // Columns draggable setting + this.bind(DG.columnsDraggable).toConstant(config.columnsDraggable); + // Connect select all module this.bind(SA_TOKENS.progressService).toConstant(selectAllModule.get(SA_TOKENS.progressService)); this.bind(SA_TOKENS.selectionDialogVM).toConstant(selectAllModule.get(SA_TOKENS.selectionDialogVM)); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index e17c4432b9..f25c8a5ac0 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,7 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); -export const [useHeaderDragDrop] = createInjectionHooks(DG.headerDragDrop); +export const [useColumnHeaderVM] = createInjectionHooks(DG.columnHeaderVM); export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); export const [useFocusService] = createInjectionHooks(DG.focusService); export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index 3f1e877fe1..8246e82777 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -39,6 +39,7 @@ import { ColumnGroupStore } from "../helpers/state/ColumnGroupStore"; import { GridBasicData } from "../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../helpers/state/GridPersonalizationStore"; import { HeaderDragnDropStore } from "../features/column/HeaderDragnDrop.store"; +import { HeaderDragnDropViewModel } from "../features/column/HeaderDragnDrop.viewModel"; import { DatasourceParamsController } from "../model/services/DatasourceParamsController"; import { GridColumn } from "../typings/GridColumn"; import { DatagridConfig } from "./configs/Datagrid.config"; @@ -147,7 +148,9 @@ export const DG_TOKENS = { clickActionHelper: token("@service:ClickActionHelper"), focusService: token("@service:FocusTargetController"), checkboxEventsHandler: token("@service:CheckboxEventsController"), - headerDragDrop: token("HeaderDragnDropStore"), + headerDragDrop: token("@store:HeaderDragnDropStore"), + columnsDraggable: token("@const:columnsDraggable"), + columnHeaderVM: token("ColumnHeaderViewModel"), cellEventsHandler: token("@service:CellEventsController") }; From 488cebc923cb6aba977df489a1a1fc920ee494e8 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Fri, 28 Nov 2025 14:48:57 +0100 Subject: [PATCH 12/20] refactor: improve naming, consistency and clean up --- .../src/components/ColumnContainer.tsx | 17 ++++++------- .../src/components/ColumnHeader.tsx | 12 +++------ .../features/column/HeaderDragnDrop.store.ts | 5 ++++ .../column/HeaderDragnDrop.viewModel.ts | 25 ++----------------- .../model/containers/Datagrid.container.ts | 9 ++++--- .../src/model/hooks/injection-hooks.ts | 2 +- .../datagrid-web/src/model/tokens.ts | 3 +-- 7 files changed, 26 insertions(+), 47 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index ac8d9c1d0a..af29f9ad20 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -14,30 +14,29 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo const { columnsFilterable, id: gridId } = useDatagridConfig(); const { columnFilters } = useColumnsStore(); const { canSort, columnId, columnIndex, canResize, sortDir, header } = useColumn(); - const { draggableProps, dropTarget, dragging } = useColumnHeaderVM(); - + const vm = useColumnHeaderVM(); const caption = header.trim(); return (
{columnsFilterable && ( -
+
{columnFilters[columnIndex]?.renderFilterWidgets()}
)} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index ec01888225..6c0a5436be 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -13,24 +13,20 @@ interface DragHandleProps { } export const ColumnHeader = observer(function ColumnHeader(): ReactElement { - const { draggableProps, dragging } = useColumnHeaderVM(); const { header, canSort, alignment, toggleSort } = useColumn(); const caption = header.trim(); const sortProps = canSort ? getSortProps(toggleSort) : null; + const vm = useColumnHeaderVM(); return (
- {draggableProps.draggable && ( - + {vm.isDraggable && ( + )} {caption.length > 0 ? caption : "\u00a0"} {canSort ? : null} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts index 14090ab1ae..54fc13b982 100644 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts @@ -1,6 +1,11 @@ import { action, makeAutoObservable } from "mobx"; import { ColumnId } from "../../typings/GridColumn"; +/** + * MobX store for managing drag & drop state of column headers. + * Tracks which column is being dragged and where it can be dropped. + * @injectable + */ export class HeaderDragnDropStore { private _dragOver: [ColumnId, "before" | "after"] | undefined = undefined; private _isDragging: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined = undefined; diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts index 775e0621da..fed47eca29 100644 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts @@ -1,5 +1,5 @@ import { makeAutoObservable } from "mobx"; -import { DragEvent, DragEventHandler } from "react"; +import { DragEvent } from "react"; import { HeaderDragnDropStore } from "./HeaderDragnDrop.store"; import { ColumnId, GridColumn } from "../../typings/GridColumn"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; @@ -7,6 +7,7 @@ import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; /** * View model for a single column header drag & drop interactions. * Encapsulates previous `useDraggable` hook logic and uses MobX store for shared drag state. + * @injectable */ export class HeaderDragnDropViewModel { constructor( @@ -30,28 +31,6 @@ export class HeaderDragnDropViewModel { return this.config.columnsDraggable && this.column.canDrag; } - /** Handlers exposed to the component. */ - get draggableProps(): { - draggable?: boolean; - onDragStart?: DragEventHandler; - onDragOver?: DragEventHandler; - onDrop?: DragEventHandler; - onDragEnter?: DragEventHandler; - onDragEnd?: DragEventHandler; - } { - if (!this.isDraggable) { - return {}; - } - return { - draggable: true, - onDragStart: this.handleDragStart, - onDragOver: this.handleDragOver, - onDrop: this.handleOnDrop, - onDragEnter: this.handleDragEnter, - onDragEnd: this.handleDragEnd - }; - } - handleDragStart = (e: DragEvent): void => { const elt = (e.target as HTMLDivElement).closest(".th") as HTMLDivElement; if (!elt) { diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 41e47856f9..5524f296b3 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -31,6 +31,7 @@ import { PaginationViewModel } from "../../features/pagination/Pagination.viewMo import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController"; import { SelectAllModule } from "../../features/select-all/SelectAllModule.container"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; +import { HeaderDragnDropStore } from "../../features/column/HeaderDragnDrop.store"; import { HeaderDragnDropViewModel } from "../../features/column/HeaderDragnDrop.viewModel"; import { GridBasicData } from "../../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../../helpers/state/GridPersonalizationStore"; @@ -108,6 +109,7 @@ injected( ); // drag and drop +injected(HeaderDragnDropStore); injected(HeaderDragnDropViewModel, DG.headerDragDrop, CORE.columnsStore, CORE.config, CORE.column); export class DatagridContainer extends Container { @@ -121,7 +123,9 @@ export class DatagridContainer extends Container { // Columns store this.bind(CORE.columnsStore).toInstance(ColumnGroupStore).inSingletonScope(); // Drag and Drop store - this.bind(DG.columnHeaderVM).toInstance(HeaderDragnDropViewModel).inSingletonScope(); + this.bind(DG.headerDragDrop).toInstance(HeaderDragnDropStore).inSingletonScope(); + // Drag and Drop view model + this.bind(DG.headerDragnDropVM).toInstance(HeaderDragnDropViewModel).inSingletonScope(); // Query service this.bind(DG.query).toInstance(DatasourceService).inSingletonScope(); // Grid sizing and scrolling store @@ -204,9 +208,6 @@ export class DatagridContainer extends Container { // Config this.bind(CORE.config).toConstant(config); - // Columns draggable setting - this.bind(DG.columnsDraggable).toConstant(config.columnsDraggable); - // Connect select all module this.bind(SA_TOKENS.progressService).toConstant(selectAllModule.get(SA_TOKENS.progressService)); this.bind(SA_TOKENS.selectionDialogVM).toConstant(selectAllModule.get(SA_TOKENS.selectionDialogVM)); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index f25c8a5ac0..c9d531b37e 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,7 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); -export const [useColumnHeaderVM] = createInjectionHooks(DG.columnHeaderVM); +export const [useColumnHeaderVM] = createInjectionHooks(DG.headerDragnDropVM); export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); export const [useFocusService] = createInjectionHooks(DG.focusService); export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index 8246e82777..1f45c3455e 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -149,8 +149,7 @@ export const DG_TOKENS = { focusService: token("@service:FocusTargetController"), checkboxEventsHandler: token("@service:CheckboxEventsController"), headerDragDrop: token("@store:HeaderDragnDropStore"), - columnsDraggable: token("@const:columnsDraggable"), - columnHeaderVM: token("ColumnHeaderViewModel"), + headerDragnDropVM: token("@viewmodel:ColumnHeaderViewModel"), cellEventsHandler: token("@service:CellEventsController") }; From 9fb13a9cd371fb11a3769c3d30c2cac5ecd44542 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Mon, 1 Dec 2025 15:39:59 +0100 Subject: [PATCH 13/20] refactor: ensure consistent naming, prop destructuring, update tests --- .../datawidgets/web/_datagrid.scss | 3 + .../src/components/ColumnContainer.tsx | 7 +- .../src/components/ColumnHeader.tsx | 11 +- ...ader.spec.tsx => ColumnContainer.spec.tsx} | 0 .../ColumnContainer.spec.tsx.snap | 214 ++++++++++++++++++ .../HeaderDragnDrop.viewModel.spec.ts | 122 ++-------- .../src/model/hooks/injection-hooks.ts | 2 +- 7 files changed, 245 insertions(+), 114 deletions(-) rename packages/pluggableWidgets/datagrid-web/src/components/__tests__/{Header.spec.tsx => ColumnContainer.spec.tsx} (100%) create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index 1f2b489f0b..a85745ef2c 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -147,6 +147,9 @@ $root: ".widget-datagrid"; background-color: var(--brand-primary-50, $brand-light); color: var(--brand-primary, $brand-primary); } + :active { + cursor: grabbing; + } } .drag-handle + .column-caption { diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index af29f9ad20..979dcbe4d6 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -1,7 +1,7 @@ import classNames from "classnames"; import { ReactElement } from "react"; import { ColumnHeader } from "./ColumnHeader"; -import { useColumn, useColumnsStore, useDatagridConfig, useColumnHeaderVM } from "../model/hooks/injection-hooks"; +import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; import { ColumnResizerProps } from "./ColumnResizer"; import { observer } from "mobx-react-lite"; @@ -13,8 +13,9 @@ export interface ColumnContainerProps { export const ColumnContainer = observer(function ColumnContainer(props: ColumnContainerProps): ReactElement { const { columnsFilterable, id: gridId } = useDatagridConfig(); const { columnFilters } = useColumnsStore(); - const { canSort, columnId, columnIndex, canResize, sortDir, header } = useColumn(); - const vm = useColumnHeaderVM(); + const column = useColumn(); + const { canSort, columnId, columnIndex, canResize, sortDir, header } = column; + const vm = useHeaderDragnDropVM(); const caption = header.trim(); return ( diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index 6c0a5436be..0ae6ee3e39 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -1,9 +1,9 @@ import classNames from "classnames"; -import { DragEventHandler, DragEvent, HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode } from "react"; +import { DragEvent, DragEventHandler, HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode } from "react"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; -import { useColumn, useColumnHeaderVM } from "../model/hooks/injection-hooks"; +import { useColumn, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; import { observer } from "mobx-react-lite"; interface DragHandleProps { @@ -13,10 +13,11 @@ interface DragHandleProps { } export const ColumnHeader = observer(function ColumnHeader(): ReactElement { - const { header, canSort, alignment, toggleSort } = useColumn(); + const column = useColumn(); + const { header, canSort, alignment } = column; const caption = header.trim(); - const sortProps = canSort ? getSortProps(toggleSort) : null; - const vm = useColumnHeaderVM(); + const sortProps = canSort ? getSortProps(() => column.toggleSort()) : null; + const vm = useHeaderDragnDropVM(); return (
+
+
+
+ + Column 1 + +
+
+
+
+ +`; + +exports[`ColumnContainer renders the structure correctly when draggable 1`] = ` + +
+
+
+ + â ¿ + + + Column 1 + +
+
+
+
+ +`; + +exports[`ColumnContainer renders the structure correctly when filterable with custom filter 1`] = ` + +
+
+
+ + Column 1 + +
+
+
+ Custom filter +
+
+
+
+
+`; + +exports[`ColumnContainer renders the structure correctly when resizable 1`] = ` + +
+
+
+ + Column 1 + +
+
+
+
+ +`; + +exports[`ColumnContainer renders the structure correctly when sortable 1`] = ` + +
+
+
+ + Column 1 + + +
+
+
+
+ +`; + +exports[`ColumnContainer renders the structure correctly when value is empty 1`] = ` + +
+
+
+ +   + +
+
+
+
+ +`; diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts index 91490e3e39..a11aa24123 100644 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts @@ -20,7 +20,7 @@ describe("ColumnHeaderViewModel", () => { }); describe("when columnsDraggable is false", () => { - it("returns empty draggableProps", () => { + it("is not draggable", () => { const vm = new HeaderDragnDropViewModel( dndStore, mockColumnsStore, @@ -28,7 +28,7 @@ describe("ColumnHeaderViewModel", () => { mockColumn ); - expect(vm.draggableProps).toEqual({}); + expect(vm.isDraggable).toBe(false); }); }); @@ -39,37 +39,8 @@ describe("ColumnHeaderViewModel", () => { vm = new HeaderDragnDropViewModel(dndStore, mockColumnsStore, { columnsDraggable: true }, mockColumn); }); - it("returns draggable props with handlers", () => { - const props = vm.draggableProps; - - expect(props.draggable).toBe(true); - expect(props.onDragStart).toBeDefined(); - expect(props.onDragOver).toBeDefined(); - expect(props.onDrop).toBeDefined(); - expect(props.onDragEnter).toBeDefined(); - expect(props.onDragEnd).toBeDefined(); - }); - - describe("dropTarget", () => { - it("returns undefined initially", () => { - expect(vm.dropTarget).toBeUndefined(); - }); - - it("returns value from dndStore", () => { - dndStore.setDragOver(["col1" as ColumnId, "after"]); - expect(vm.dropTarget).toEqual(["col1", "after"]); - }); - }); - - describe("dragging", () => { - it("returns undefined initially", () => { - expect(vm.dragging).toBeUndefined(); - }); - - it("returns value from dndStore", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - expect(vm.dragging).toEqual(["col0", "col1", "col2"]); - }); + it("is draggable", () => { + expect(vm.isDraggable).toBe(true); }); describe("handleDragStart", () => { @@ -77,7 +48,7 @@ describe("ColumnHeaderViewModel", () => { const mockElement = createMockElement("col1", "col0", "col2"); const event = createMockDragEvent(mockElement); - vm.draggableProps.onDragStart?.(event); + vm.handleDragStart(event); expect(dndStore.isDragging).toEqual(["col0", "col1", "col2"]); }); @@ -86,7 +57,7 @@ describe("ColumnHeaderViewModel", () => { const mockElement = createMockElement("col1", undefined, "col2"); const event = createMockDragEvent(mockElement); - vm.draggableProps.onDragStart?.(event); + vm.handleDragStart(event); expect(dndStore.isDragging).toEqual([undefined, "col1", "col2"]); }); @@ -95,7 +66,7 @@ describe("ColumnHeaderViewModel", () => { const mockElement = createMockElement("col1", "col0", undefined); const event = createMockDragEvent(mockElement); - vm.draggableProps.onDragStart?.(event); + vm.handleDragStart(event); expect(dndStore.isDragging).toEqual(["col0", "col1", undefined]); }); @@ -107,7 +78,7 @@ describe("ColumnHeaderViewModel", () => { } } as any; - vm.draggableProps.onDragStart?.(event); + vm.handleDragStart(event); expect(dndStore.isDragging).toBeUndefined(); }); @@ -122,7 +93,7 @@ describe("ColumnHeaderViewModel", () => { dndStore.clearDragState(); const event = createMockDragOverEvent("col2", 100, 50); - vm.draggableProps.onDragOver?.(event); + vm.handleDragOver(event); expect(dndStore.dragOver).toBeUndefined(); }); @@ -130,7 +101,7 @@ describe("ColumnHeaderViewModel", () => { it("does nothing when columnId is missing", () => { const event = createMockDragOverEvent("", 100, 50); - vm.draggableProps.onDragOver?.(event); + vm.handleDragOver(event); expect(dndStore.dragOver).toBeUndefined(); }); @@ -139,7 +110,7 @@ describe("ColumnHeaderViewModel", () => { dndStore.setDragOver(["col2" as ColumnId, "after"]); const event = createMockDragOverEvent("col1", 100, 50); - vm.draggableProps.onDragOver?.(event); + vm.handleDragOver(event); expect(dndStore.dragOver).toBeUndefined(); }); @@ -147,7 +118,7 @@ describe("ColumnHeaderViewModel", () => { it("sets dropTarget to before when hovering over left sibling", () => { const event = createMockDragOverEvent("col0", 100, 50); - vm.draggableProps.onDragOver?.(event); + vm.handleDragOver(event); expect(dndStore.dragOver).toEqual(["col0", "before"]); }); @@ -155,51 +126,17 @@ describe("ColumnHeaderViewModel", () => { it("sets dropTarget to after when hovering over right sibling", () => { const event = createMockDragOverEvent("col2", 100, 50); - vm.draggableProps.onDragOver?.(event); + vm.handleDragOver(event); expect(dndStore.dragOver).toEqual(["col2", "after"]); }); - - it("sets dropTarget to before when hovering on left side of non-sibling column", () => { - const event = createMockDragOverEvent("col5", 100, 30); - - vm.draggableProps.onDragOver?.(event); - - expect(dndStore.dragOver).toEqual(["col5", "before"]); - }); - - it("sets dropTarget to after when hovering on right side of non-sibling column", () => { - const event = createMockDragOverEvent("col5", 100, 70); - - vm.draggableProps.onDragOver?.(event); - - expect(dndStore.dragOver).toEqual(["col5", "after"]); - }); - - it("does not update dropTarget if it hasn't changed", () => { - dndStore.setDragOver(["col5" as ColumnId, "after"]); - const setDragOverSpy = jest.spyOn(dndStore, "setDragOver"); - const event = createMockDragOverEvent("col5", 100, 70); - - vm.draggableProps.onDragOver?.(event); - - expect(setDragOverSpy).not.toHaveBeenCalled(); - }); - - it("prevents default behavior", () => { - const event = createMockDragOverEvent("col2", 100, 50); - - vm.draggableProps.onDragOver?.(event); - - expect(event.preventDefault).toHaveBeenCalled(); - }); }); describe("handleDragEnter", () => { it("prevents default behavior", () => { const event = { preventDefault: jest.fn() } as any; - vm.draggableProps.onDragEnter?.(event); + vm.handleDragEnter(event); expect(event.preventDefault).toHaveBeenCalled(); }); @@ -210,7 +147,7 @@ describe("ColumnHeaderViewModel", () => { dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); dndStore.setDragOver(["col2" as ColumnId, "after"]); - vm.draggableProps.onDragEnd?.({} as any); + vm.handleDragEnd(); expect(dndStore.isDragging).toBeUndefined(); expect(dndStore.dragOver).toBeUndefined(); @@ -222,7 +159,7 @@ describe("ColumnHeaderViewModel", () => { dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); dndStore.setDragOver(["col3" as ColumnId, "after"]); - vm.draggableProps.onDrop?.({} as any); + vm.handleOnDrop({} as any); expect(mockColumnsStore.swapColumns).toHaveBeenCalledWith("col1", ["col3", "after"]); }); @@ -231,32 +168,7 @@ describe("ColumnHeaderViewModel", () => { dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); dndStore.setDragOver(["col3" as ColumnId, "after"]); - vm.draggableProps.onDrop?.({} as any); - - expect(dndStore.isDragging).toBeUndefined(); - expect(dndStore.dragOver).toBeUndefined(); - }); - - it("does not call swapColumns when not dragging", () => { - dndStore.setDragOver(["col3" as ColumnId, "after"]); - - vm.draggableProps.onDrop?.({} as any); - - expect(mockColumnsStore.swapColumns).not.toHaveBeenCalled(); - }); - - it("does not call swapColumns when no dropTarget", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - - vm.draggableProps.onDrop?.({} as any); - - expect(mockColumnsStore.swapColumns).not.toHaveBeenCalled(); - }); - - it("clears drag state even when drop is invalid", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - - vm.draggableProps.onDrop?.({} as any); + vm.handleOnDrop({} as any); expect(dndStore.isDragging).toBeUndefined(); expect(dndStore.dragOver).toBeUndefined(); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index c9d531b37e..8a5ae2451e 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,7 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); -export const [useColumnHeaderVM] = createInjectionHooks(DG.headerDragnDropVM); +export const [useHeaderDragnDropVM] = createInjectionHooks(DG.headerDragnDropVM); export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); export const [useFocusService] = createInjectionHooks(DG.focusService); export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); From a4084c2f1fd21540723edf52362586faecf00ffb Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Tue, 2 Dec 2025 10:33:23 +0100 Subject: [PATCH 14/20] fix: update SelectActionHandler initialization to use null instead of undefined --- .../gallery-web/src/helpers/useItemSelectHelper.ts | 2 +- .../pluggableWidgets/gallery-web/src/utils/test-utils.tsx | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts b/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts index 050128f4e0..2e291dbca8 100644 --- a/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts +++ b/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts @@ -6,5 +6,5 @@ export function useItemSelectHelper( selectionHelper: SelectionHelper | undefined ): SelectActionHandler { // eslint-disable-next-line react-hooks/exhaustive-deps - return useMemo(() => new SelectActionHandler(selection, selectionHelper), [selectionHelper]); + return useMemo(() => new SelectActionHandler(selection, selectionHelper ?? null), [selectionHelper]); } diff --git a/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx b/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx index 0d5ac84aa3..2caffacba8 100644 --- a/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx +++ b/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx @@ -81,7 +81,7 @@ export function createMockGalleryContext(): GalleryRootScope { refreshInterval: 0 }); - const mockSelectHelper = new SelectActionHandler("None", undefined); + const mockSelectHelper = new SelectActionHandler("None", null); return { rootStore: mockStore, @@ -110,7 +110,7 @@ type Mocks = { export function mockProps(params: Helpers & Mocks = {}): GalleryProps { const { onClick = undefined, - selectHelper = new SelectActionHandler("None", undefined), + selectHelper = new SelectActionHandler("None", null), actionHelper = new ClickActionHelper("single", onClick), focusController = new FocusTargetController(new PositionController(), new VirtualGridLayout(3, 4, 10)), itemEventsController = new ItemEventsController( From 0117fbd6312feb37149b223a859b54b9d658c069 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Mon, 8 Dec 2025 18:26:30 +0100 Subject: [PATCH 15/20] fix: restore sort icon state, add dragndropdesign mode and react icon --- .../datawidgets/web/_datagrid.scss | 11 +++- .../src/Datagrid.editorPreview.tsx | 7 ++- .../src/components/ColumnHeader.tsx | 56 +++---------------- .../src/components/DragHandle.tsx | 46 +++++++++++++++ .../src/components/icons/FaGripVertical.tsx | 15 +++++ 5 files changed, 84 insertions(+), 51 deletions(-) create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/icons/FaGripVertical.tsx diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index a85745ef2c..850852725c 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -139,17 +139,24 @@ $root: ".widget-datagrid"; width: 14px; padding: 0; flex-grow: 0; + flex-shrink: 0; display: flex; justify-content: center; + align-self: normal; z-index: 1; &:hover { background-color: var(--brand-primary-50, $brand-light); - color: var(--brand-primary, $brand-primary); + svg { + color: var(--brand-primary, $brand-primary); + } } - :active { + &:active { cursor: grabbing; } + svg { + margin: 0; + } } .drag-handle + .column-caption { diff --git a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx index c7e8f0b31a..fcba79bf21 100644 --- a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx @@ -4,9 +4,11 @@ import { GUID, ObjectItem } from "mendix"; import { Selectable } from "mendix/preview/Selectable"; import { createContext, CSSProperties, PropsWithChildren, ReactElement, ReactNode, useContext } from "react"; import { ColumnsPreviewType, DatagridPreviewProps } from "typings/DatagridProps"; +import { DragHandle } from "./components/DragHandle"; import { FaArrowsAltV } from "./components/icons/FaArrowsAltV"; import { FaEye } from "./components/icons/FaEye"; import { ColumnPreview } from "./helpers/ColumnPreview"; + import "./ui/DatagridPreview.scss"; declare module "mendix/preview/Selectable" { @@ -157,7 +159,7 @@ function GridHeader(): ReactNode { } function ColumnHeader({ column }: { column: ColumnsPreviewType }): ReactNode { - const { columnsFilterable, columnsSortable, columnsHidable } = useProps(); + const { columnsFilterable, columnsSortable, columnsHidable, columnsDraggable } = useProps(); const columnPreview = new ColumnPreview(column, 0); const caption = columnPreview.header; const canSort = columnsSortable && columnPreview.canSort; @@ -172,6 +174,9 @@ function ColumnHeader({ column }: { column: ColumnsPreviewType }): ReactNode { >
+ {columnsDraggable && ( + {}} onDragEnd={() => {}} /> + )} {caption.length > 0 ? caption : "\u00a0"} {canSort && }
diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index 0ae6ee3e39..024ab37b12 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -1,15 +1,15 @@ import classNames from "classnames"; -import { DragEvent, DragEventHandler, HTMLAttributes, KeyboardEvent, MouseEvent, ReactElement, ReactNode } from "react"; +import { HTMLAttributes, KeyboardEvent, ReactElement, ReactNode } from "react"; +import { DragHandle } from "./DragHandle"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; import { useColumn, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; import { observer } from "mobx-react-lite"; +import { SortDirection } from "../typings/sorting"; -interface DragHandleProps { - draggable: boolean; - onDragStart?: DragEventHandler; - onDragEnd?: DragEventHandler; +interface SortIconProps { + direction: SortDirection | undefined; } export const ColumnHeader = observer(function ColumnHeader(): ReactElement { @@ -30,53 +30,13 @@ export const ColumnHeader = observer(function ColumnHeader(): ReactElement { )} {caption.length > 0 ? caption : "\u00a0"} - {canSort ? : null} + {canSort ? : null}
); }); -function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { - const handleMouseDown = (e: MouseEvent): void => { - // Only stop propagation, don't prevent default - we need default for drag to work - e.stopPropagation(); - }; - - const handleClick = (e: MouseEvent): void => { - // Stop click events from bubbling to prevent sorting - e.stopPropagation(); - e.preventDefault(); - }; - - const handleDragStart = (e: DragEvent): void => { - // Don't stop propagation here - let the drag start properly - if (onDragStart) { - onDragStart(e); - } - }; - - const handleDragEnd = (e: DragEvent): void => { - if (onDragEnd) { - onDragEnd(e); - } - }; - - return ( - - â ¿ - - ); -} - -function SortIcon(): ReactNode { - const column = useColumn(); - switch (column.sortDir) { +function SortIcon({ direction }: SortIconProps): ReactNode { + switch (direction) { case "asc": return ; case "desc": diff --git a/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx b/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx new file mode 100644 index 0000000000..d988dc4b23 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx @@ -0,0 +1,46 @@ +import { DragEvent, DragEventHandler, MouseEvent, ReactElement } from "react"; +import { FaGripVertical } from "./icons/FaGripVertical"; + +interface DragHandleProps { + draggable: boolean; + onDragStart?: DragEventHandler; + onDragEnd?: DragEventHandler; +} +export function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { + const handleMouseDown = (e: MouseEvent): void => { + // Only stop propagation, don't prevent default - we need default for drag to work + e.stopPropagation(); + }; + + const handleClick = (e: MouseEvent): void => { + // Stop click events from bubbling to prevent sorting + e.stopPropagation(); + e.preventDefault(); + }; + + const handleDragStart = (e: DragEvent): void => { + // Don't stop propagation here - let the drag start properly + if (onDragStart) { + onDragStart(e); + } + }; + + const handleDragEnd = (e: DragEvent): void => { + if (onDragEnd) { + onDragEnd(e); + } + }; + + return ( + + + + ); +} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/icons/FaGripVertical.tsx b/packages/pluggableWidgets/datagrid-web/src/components/icons/FaGripVertical.tsx new file mode 100644 index 0000000000..b0e198d488 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/icons/FaGripVertical.tsx @@ -0,0 +1,15 @@ +import { ReactElement } from "react"; + +/** + * Custom drag handle icon with 6 aligned dots in 3 rows + */ +export function FaGripVertical(): ReactElement { + return ( + + ); +} From 33c777c5024a5174aa063e3893c8585b0a343aa8 Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Tue, 9 Dec 2025 14:12:53 +0100 Subject: [PATCH 16/20] chore: update unit test snapshot --- .../datagrid-web/e2e/DataGrid.spec.js | 28 ++++++++----------- .../ColumnContainer.spec.tsx.snap | 13 ++++++++- 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js index 8a390bba23..5f301156b9 100644 --- a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js +++ b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js @@ -49,10 +49,9 @@ test.describe("capabilities: sorting", () => { await page.goto("/"); await page.waitForLoadState("networkidle"); await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1)).toHaveText("First Name"); - await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg")).toHaveAttribute( - "data-icon", - "arrows-alt-v" - ); + await expect( + page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='arrows-alt-v']") + ).toBeVisible(); await expect(page.getByRole("gridcell", { name: "12" }).first()).toHaveText("12"); }); @@ -60,15 +59,13 @@ test.describe("capabilities: sorting", () => { await page.goto("/"); await page.waitForLoadState("networkidle"); await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1)).toHaveText("First Name"); - await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg")).toHaveAttribute( - "data-icon", - "arrows-alt-v" - ); + await expect( + page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='arrows-alt-v']") + ).toBeVisible(); await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); - await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg")).toHaveAttribute( - "data-icon", - "long-arrow-alt-up" - ); + await expect( + page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='long-arrow-alt-up']") + ).toBeVisible(); await expect(page.getByRole("gridcell", { name: "10" }).first()).toHaveText("10"); }); @@ -78,10 +75,9 @@ test.describe("capabilities: sorting", () => { await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1)).toHaveText("First Name"); await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); - await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg")).toHaveAttribute( - "data-icon", - "long-arrow-alt-down" - ); + await expect( + page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='long-arrow-alt-down']") + ).toBeVisible(); await expect(page.getByRole("gridcell", { name: "12" }).first()).toHaveText("12"); }); }); diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap index 1516a489f8..e836624349 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap @@ -52,7 +52,18 @@ exports[`ColumnContainer renders the structure correctly when draggable 1`] = ` class="drag-handle" draggable="true" > - â ¿ + Date: Thu, 11 Dec 2025 16:42:20 +0100 Subject: [PATCH 17/20] fix: restore individual column reorder and reflect in preview, revert null pass --- .../datagrid-web/src/Datagrid.editorPreview.tsx | 2 +- .../datagrid-web/src/components/ColumnContainer.tsx | 6 +++--- .../datagrid-web/src/model/containers/Datagrid.container.ts | 4 ++-- .../gallery-web/src/helpers/useItemSelectHelper.ts | 2 +- .../pluggableWidgets/gallery-web/src/utils/test-utils.tsx | 4 ++-- .../src/selection/select-action-handler.ts | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx index fcba79bf21..914ed2dcaa 100644 --- a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx @@ -174,7 +174,7 @@ function ColumnHeader({ column }: { column: ColumnsPreviewType }): ReactNode { >
- {columnsDraggable && ( + {columnsDraggable && columnPreview.canDrag && ( {}} onDragEnd={() => {}} /> )} {caption.length > 0 ? caption : "\u00a0"} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index 979dcbe4d6..6e3744dc29 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -30,9 +30,9 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo style={!canSort ? { cursor: "unset" } : undefined} title={caption} data-column-id={columnId} - onDrop={vm.handleOnDrop} - onDragEnter={vm.handleDragEnter} - onDragOver={vm.handleDragOver} + onDrop={vm.isDraggable ? vm.handleOnDrop : undefined} + onDragEnter={vm.isDraggable ? vm.handleDragEnter : undefined} + onDragOver={vm.isDraggable ? vm.handleDragOver : undefined} >
diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 5524f296b3..4959148556 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -124,8 +124,8 @@ export class DatagridContainer extends Container { this.bind(CORE.columnsStore).toInstance(ColumnGroupStore).inSingletonScope(); // Drag and Drop store this.bind(DG.headerDragDrop).toInstance(HeaderDragnDropStore).inSingletonScope(); - // Drag and Drop view model - this.bind(DG.headerDragnDropVM).toInstance(HeaderDragnDropViewModel).inSingletonScope(); + // Drag and Drop view model (per column, not singleton) + this.bind(DG.headerDragnDropVM).toInstance(HeaderDragnDropViewModel).inTransientScope(); // Query service this.bind(DG.query).toInstance(DatasourceService).inSingletonScope(); // Grid sizing and scrolling store diff --git a/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts b/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts index 2e291dbca8..050128f4e0 100644 --- a/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts +++ b/packages/pluggableWidgets/gallery-web/src/helpers/useItemSelectHelper.ts @@ -6,5 +6,5 @@ export function useItemSelectHelper( selectionHelper: SelectionHelper | undefined ): SelectActionHandler { // eslint-disable-next-line react-hooks/exhaustive-deps - return useMemo(() => new SelectActionHandler(selection, selectionHelper ?? null), [selectionHelper]); + return useMemo(() => new SelectActionHandler(selection, selectionHelper), [selectionHelper]); } diff --git a/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx b/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx index 2caffacba8..0d5ac84aa3 100644 --- a/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx +++ b/packages/pluggableWidgets/gallery-web/src/utils/test-utils.tsx @@ -81,7 +81,7 @@ export function createMockGalleryContext(): GalleryRootScope { refreshInterval: 0 }); - const mockSelectHelper = new SelectActionHandler("None", null); + const mockSelectHelper = new SelectActionHandler("None", undefined); return { rootStore: mockStore, @@ -110,7 +110,7 @@ type Mocks = { export function mockProps(params: Helpers & Mocks = {}): GalleryProps { const { onClick = undefined, - selectHelper = new SelectActionHandler("None", null), + selectHelper = new SelectActionHandler("None", undefined), actionHelper = new ClickActionHelper("single", onClick), focusController = new FocusTargetController(new PositionController(), new VirtualGridLayout(3, 4, 10)), itemEventsController = new ItemEventsController( diff --git a/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts b/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts index c5bcccad46..165f58d6cb 100644 --- a/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts +++ b/packages/shared/widget-plugin-grid/src/selection/select-action-handler.ts @@ -6,7 +6,7 @@ import { SelectAdjacentFx, SelectAllFx, SelectFx, SelectionType, WidgetSelection export class SelectActionHandler { constructor( private selection: WidgetSelectionProperty, - protected selectionHelper: SelectionHelperService + protected selectionHelper: SelectionHelperService | undefined ) {} get selectionType(): SelectionType { From 28335e2fbd0a1b58584731d15e29eda257cf472f Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Thu, 18 Dec 2025 13:37:51 +0100 Subject: [PATCH 18/20] feat: enhance drag-and-drop functionality with new drag handle and styling adjustments --- .../datawidgets/web/_datagrid.scss | 86 +++++++++++-------- .../datawidgets/web/variables.scss | 2 +- .../src/components/ColumnContainer.tsx | 4 + .../src/components/ColumnHeader.tsx | 4 - .../ColumnContainer.spec.tsx.snap | 34 ++++---- 5 files changed, 74 insertions(+), 56 deletions(-) diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index 850852725c..8ed0d62e70 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -22,7 +22,7 @@ $root: ".widget-datagrid"; background-color: var(--bg-color-secondary, $bg-color-secondary); border-width: 0; border-color: var(--grid-border-color, $grid-border-color); - padding: var(--spacing-medium, $spacing-medium); + padding: 0 var(--spacing-medium, $spacing-medium); top: 0; min-width: 0; position: relative; @@ -44,7 +44,7 @@ $root: ".widget-datagrid"; top: 0; height: 100%; width: var(--spacing-smaller, $spacing-smaller); - background-color: $dragging-color-effect; + background-color: var(--brand-primary, $dragging-color-effect); z-index: 1; } @@ -92,6 +92,55 @@ $root: ".widget-datagrid"; } } + /* Drag handle */ + .drag-handle { + cursor: grab; + pointer-events: auto; + position: relative; + padding: 4px; + // margin-inline-end: 4px; + flex-grow: 0; + flex-shrink: 0; + display: flex; + justify-content: center; + align-self: normal; + z-index: 1; + opacity: 0; + transition: opacity 0.15s ease; + + &:hover { + // background-color: var(--brand-primary-50, $brand-light); + svg { + color: var(--brand-primary, $brand-primary); + } + } + &:active { + cursor: grabbing; + } + &:focus-visible { + opacity: 1; + } + svg { + margin: 0; + width: 8px; + } + } + + &:hover .drag-handle, + &:focus-within .drag-handle { + opacity: 1; + } + + /* Parent background change on drag handle hover */ + &:has(.drag-handle:hover) { + background-color: var(--brand-primary-50, $brand-light); + } + + /* Remove left padding when drag handle is present */ + &:has(.drag-handle) { + padding-left: 0; + } + /* Content of the column header */ .column-container { display: flex; @@ -99,6 +148,7 @@ $root: ".widget-datagrid"; flex-grow: 1; align-self: stretch; min-width: 0; + padding: var(--spacing-small, $spacing-small) 0; &:not(:has(.filter)) { .column-header { @@ -131,38 +181,6 @@ $root: ".widget-datagrid"; align-self: center; } - /* Drag handle */ - .drag-handle { - cursor: grab; - pointer-events: auto; - position: relative; - width: 14px; - padding: 0; - flex-grow: 0; - flex-shrink: 0; - display: flex; - justify-content: center; - align-self: normal; - z-index: 1; - - &:hover { - background-color: var(--brand-primary-50, $brand-light); - svg { - color: var(--brand-primary, $brand-primary); - } - } - &:active { - cursor: grabbing; - } - svg { - margin: 0; - } - } - - .drag-handle + .column-caption { - padding-inline-start: 4px; - } - &:focus:not(:focus-visible) { outline: none; } diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss index 8756e6e96b..7dafa4d574 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss @@ -33,7 +33,7 @@ $spacing-larger: 32px !default; $gallery-gap: $spacing-small !default; // Effects and animations -$dragging-color-effect: rgba(10, 19, 37, 0.8) !default; +$dragging-color-effect: $brand-primary !default; $skeleton-background: linear-gradient(90deg, rgba(194, 194, 194, 0.2) 0%, #d2d2d2 100%) !default; // Assets diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index 6e3744dc29..a6f0c233ef 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -4,6 +4,7 @@ import { ColumnHeader } from "./ColumnHeader"; import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; import { ColumnResizerProps } from "./ColumnResizer"; import { observer } from "mobx-react-lite"; +import { DragHandle } from "./DragHandle"; export interface ColumnContainerProps { isLast?: boolean; @@ -34,6 +35,9 @@ export const ColumnContainer = observer(function ColumnContainer(props: ColumnCo onDragEnter={vm.isDraggable ? vm.handleDragEnter : undefined} onDragOver={vm.isDraggable ? vm.handleDragOver : undefined} > + {vm.isDraggable && ( + + )}
{columnsFilterable && ( diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index 024ab37b12..b3632feff6 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -1,6 +1,5 @@ import classNames from "classnames"; import { HTMLAttributes, KeyboardEvent, ReactElement, ReactNode } from "react"; -import { DragHandle } from "./DragHandle"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; @@ -26,9 +25,6 @@ export const ColumnHeader = observer(function ColumnHeader(): ReactElement { {...sortProps} aria-label={canSort ? "sort " + caption : caption} > - {vm.isDraggable && ( - - )} {caption.length > 0 ? caption : "\u00a0"} {canSort ? : null}
diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap index e836624349..af030520b2 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap @@ -40,6 +40,23 @@ exports[`ColumnContainer renders the structure correctly when draggable 1`] = ` style="cursor: unset;" title="Column 1" > + + +
- - - From 07a7060a0727c2cd6d8d787aef3bfacbce1cf26b Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Tue, 23 Dec 2025 11:56:11 +0100 Subject: [PATCH 19/20] refactor: simplify boolean expressions --- .../datawidgets/web/_datagrid.scss | 126 ++++++----- .../datawidgets/web/variables.scss | 1 + .../datagrid-web/CHANGELOG.md | 4 + .../datagrid-web/package.json | 3 + .../src/Datagrid.editorPreview.tsx | 6 +- .../src/components/ColumnContainer.tsx | 38 ++-- .../src/components/ColumnHeader.tsx | 75 +++--- .../components/ColumnHeaderDragPreview.tsx | 38 ++++ .../src/components/DragHandle.tsx | 44 +--- .../src/components/DragHandleIcon.tsx | 15 ++ .../src/components/GridHeader.tsx | 71 ++++-- .../__tests__/ColumnContainer.spec.tsx | 73 ++---- .../ColumnContainer.spec.tsx.snap | 189 ++++++++++++---- .../src/features/column/HeaderDnd.store.ts | 33 +++ .../features/column/HeaderDnd.viewModel.ts | 168 ++++++++++++++ .../features/column/HeaderDragnDrop.store.ts | 41 ---- .../column/HeaderDragnDrop.viewModel.ts | 95 -------- .../__tests__/HeaderDnd.viewModel.spec.ts | 59 +++++ .../HeaderDragnDrop.viewModel.spec.ts | 213 ------------------ .../src/helpers/state/ColumnGroupStore.ts | 54 ++++- .../model/containers/Datagrid.container.ts | 17 +- .../src/model/hooks/injection-hooks.ts | 2 +- .../datagrid-web/src/model/tokens.ts | 8 +- pnpm-lock.yaml | 56 +++++ 24 files changed, 810 insertions(+), 619 deletions(-) create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/ColumnHeaderDragPreview.tsx create mode 100644 packages/pluggableWidgets/datagrid-web/src/components/DragHandleIcon.tsx create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.store.ts create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.viewModel.ts delete mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts delete mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts create mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDnd.viewModel.spec.ts delete mode 100644 packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss index 8ed0d62e70..52228d2547 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/_datagrid.scss @@ -22,7 +22,7 @@ $root: ".widget-datagrid"; background-color: var(--bg-color-secondary, $bg-color-secondary); border-width: 0; border-color: var(--grid-border-color, $grid-border-color); - padding: 0 var(--spacing-medium, $spacing-medium); + padding: var(--spacing-medium, $spacing-medium); top: 0; min-width: 0; position: relative; @@ -30,43 +30,6 @@ $root: ".widget-datagrid"; } .th { - &.dragging { - opacity: 0.5; - &.dragging-over-self { - opacity: 0.8; - } - } - - &.drop-after:after, - &.drop-before:after { - content: ""; - position: absolute; - top: 0; - height: 100%; - width: var(--spacing-smaller, $spacing-smaller); - background-color: var(--brand-primary, $dragging-color-effect); - - z-index: 1; - } - - &.drop-before { - &:after { - left: 0; - } - &:not(:first-child):after { - transform: translateX(-50%); - } - } - - &.drop-after { - &:after { - right: 0; - } - &:not(:last-child):after { - transform: translateX(50%); - } - } - /* Clickable column header (Sortable) */ .clickable { cursor: pointer; @@ -78,6 +41,8 @@ $root: ".widget-datagrid"; align-self: stretch; cursor: col-resize; margin-right: -12px; + margin-top: calc(0px - var(--spacing-medium, 16px)); + margin-bottom: calc(0px - var(--spacing-medium, 16px)); &:hover .column-resizer-bar { background-color: var(--brand-primary, $brand-primary); @@ -92,24 +57,31 @@ $root: ".widget-datagrid"; } } + &.locked-drag-active { + z-index: 2; + } + + &.dragging-over-self { + opacity: 0.25; + } + /* Drag handle */ .drag-handle { cursor: grab; pointer-events: auto; position: relative; - padding: 4px; - // margin-inline-end: 4px; + width: var(--spacing-medium, $spacing-medium); + padding: 0; flex-grow: 0; flex-shrink: 0; display: flex; justify-content: center; - align-self: normal; + align-self: center; z-index: 1; opacity: 0; transition: opacity 0.15s ease; &:hover { - // background-color: var(--brand-primary-50, $brand-light); svg { color: var(--brand-primary, $brand-primary); } @@ -120,14 +92,12 @@ $root: ".widget-datagrid"; &:focus-visible { opacity: 1; } - svg { + > svg { margin: 0; - width: 8px; } } - &:hover .drag-handle, - &:focus-within .drag-handle { + &:hover .drag-handle { opacity: 1; } @@ -136,9 +106,19 @@ $root: ".widget-datagrid"; background-color: var(--brand-primary-50, $brand-light); } - /* Remove left padding when drag handle is present */ - &:has(.drag-handle) { - padding-left: 0; + /* Drag preview (dnd-kit) should look like hovered header */ + &.drag-preview { + background-color: var(--brand-primary-50, $brand-light); + box-shadow: 0 4px 4px 0 rgba(0, 0, 0, 0.25); + border: 1px solid var(--gray-light, $gray-light); + + .drag-handle { + opacity: 1; + + svg { + color: var(--brand-primary, $brand-primary); + } + } } /* Content of the column header */ @@ -148,7 +128,6 @@ $root: ".widget-datagrid"; flex-grow: 1; align-self: stretch; min-width: 0; - padding: var(--spacing-small, $spacing-small) 0; &:not(:has(.filter)) { .column-header { @@ -164,7 +143,12 @@ $root: ".widget-datagrid"; align-items: baseline; font-weight: 600; - span { + .column-caption { + user-select: text; + cursor: text; + } + + span:not(.drag-handle) { min-width: 0; flex-grow: 1; text-overflow: ellipsis; @@ -174,13 +158,33 @@ $root: ".widget-datagrid"; } svg { - margin-left: 8px; + margin-inline-start: 8px; flex: 0 0 var(--btn-font-size, $btn-font-size); color: var(--gray-dark, $gray-dark); height: var(--btn-font-size, $btn-font-size); align-self: center; } + .sort-button { + background: none; + border: none; + padding: 0; + cursor: pointer; + display: flex; + align-items: center; + font-size: inherit; + color: inherit; + height: 100%; + + &:focus:not(:focus-visible) { + outline: none; + } + + &:focus-visible { + outline: 1px solid var(--brand-primary, $brand-primary); + } + } + &:focus:not(:focus-visible) { outline: none; } @@ -188,12 +192,22 @@ $root: ".widget-datagrid"; &:focus-visible { outline: 1px solid var(--brand-primary, $brand-primary); } + + &:has(.drag-handle) { + margin-inline-start: calc(var(--spacing-medium, 16px) * -1 + 1px); + .drag-handle svg { + flex: none; + margin: 0; + } + } } /* Header filter */ .filter { display: flex; - margin-top: 4px; + > * { + margin-top: 4px; + } > .form-group { margin-bottom: 0; } @@ -351,6 +365,12 @@ $root: ".widget-datagrid"; } } +.table-compact .table .th:hover .column-header:has(.drag-handle), +.table-compact .table .th.drag-preview .column-header:has(.drag-handle) { + margin-inline-start: 0; + transition: margin-inline-start 0.2s ease; +} + :where(.table .th .filter input:not([type="checkbox"])) { font-weight: normal; flex-grow: 1; diff --git a/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss b/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss index 7dafa4d574..1d2719721c 100644 --- a/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss +++ b/packages/modules/data-widgets/src/themesource/datawidgets/web/variables.scss @@ -13,6 +13,7 @@ $brand-light: #e6eaff !default; $grid-selected-row-background: $brand-light !default; // Text and icon colors +$gray-light: #6c7180 !default; $gray-dark: #606671 !default; $gray-darker: #3b4251 !default; $pagination-caption-color: #0a1325 !default; diff --git a/packages/pluggableWidgets/datagrid-web/CHANGELOG.md b/packages/pluggableWidgets/datagrid-web/CHANGELOG.md index fa3c5989f1..1523a95d77 100644 --- a/packages/pluggableWidgets/datagrid-web/CHANGELOG.md +++ b/packages/pluggableWidgets/datagrid-web/CHANGELOG.md @@ -6,6 +6,10 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), ## [Unreleased] +### Breaking changes + +- The DOM structure is rewritten, which may break existing CSS styling. We recommend checking the custom styling if there is any in your project. + ### Fixed - We added missing Dutch translations for Datagrid 2. diff --git a/packages/pluggableWidgets/datagrid-web/package.json b/packages/pluggableWidgets/datagrid-web/package.json index 1d261d2c48..2d26fab4b1 100644 --- a/packages/pluggableWidgets/datagrid-web/package.json +++ b/packages/pluggableWidgets/datagrid-web/package.json @@ -41,6 +41,9 @@ "verify": "rui-verify-package-format" }, "dependencies": { + "@dnd-kit/core": "^6.3.1", + "@dnd-kit/sortable": "^10.0.0", + "@dnd-kit/utilities": "^3.2.2", "@floating-ui/react": "^0.26.27", "@mendix/widget-plugin-component-kit": "workspace:*", "@mendix/widget-plugin-external-events": "workspace:*", diff --git a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx index 914ed2dcaa..810f56bb91 100644 --- a/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/Datagrid.editorPreview.tsx @@ -4,7 +4,6 @@ import { GUID, ObjectItem } from "mendix"; import { Selectable } from "mendix/preview/Selectable"; import { createContext, CSSProperties, PropsWithChildren, ReactElement, ReactNode, useContext } from "react"; import { ColumnsPreviewType, DatagridPreviewProps } from "typings/DatagridProps"; -import { DragHandle } from "./components/DragHandle"; import { FaArrowsAltV } from "./components/icons/FaArrowsAltV"; import { FaEye } from "./components/icons/FaEye"; import { ColumnPreview } from "./helpers/ColumnPreview"; @@ -159,7 +158,7 @@ function GridHeader(): ReactNode { } function ColumnHeader({ column }: { column: ColumnsPreviewType }): ReactNode { - const { columnsFilterable, columnsSortable, columnsHidable, columnsDraggable } = useProps(); + const { columnsFilterable, columnsSortable, columnsHidable } = useProps(); const columnPreview = new ColumnPreview(column, 0); const caption = columnPreview.header; const canSort = columnsSortable && columnPreview.canSort; @@ -174,9 +173,6 @@ function ColumnHeader({ column }: { column: ColumnsPreviewType }): ReactNode { >
- {columnsDraggable && columnPreview.canDrag && ( - {}} onDragEnd={() => {}} /> - )} {caption.length > 0 ? caption : "\u00a0"} {canSort && }
diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx index a6f0c233ef..403cef012d 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnContainer.tsx @@ -1,10 +1,10 @@ import classNames from "classnames"; import { ReactElement } from "react"; import { ColumnHeader } from "./ColumnHeader"; -import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; +import { useColumn, useColumnsStore, useDatagridConfig, useHeaderDndVM } from "../model/hooks/injection-hooks"; import { ColumnResizerProps } from "./ColumnResizer"; import { observer } from "mobx-react-lite"; -import { DragHandle } from "./DragHandle"; +import { useSortable } from "@dnd-kit/sortable"; export interface ColumnContainerProps { isLast?: boolean; @@ -12,41 +12,43 @@ export interface ColumnContainerProps { } export const ColumnContainer = observer(function ColumnContainer(props: ColumnContainerProps): ReactElement { - const { columnsFilterable, id: gridId } = useDatagridConfig(); - const { columnFilters } = useColumnsStore(); + const { columnsFilterable, columnsResizable, columnsSortable, id: gridId } = useDatagridConfig(); + const columnsStore = useColumnsStore(); + const { columnFilters } = columnsStore; const column = useColumn(); const { canSort, columnId, columnIndex, canResize, sortDir, header } = column; - const vm = useHeaderDragnDropVM(); + const isSortable = columnsSortable && canSort; + const isResizable = columnsResizable && canResize; const caption = header.trim(); + const vm = useHeaderDndVM(); + const { setNodeRef, transform, transition, isDragging } = useSortable({ + id: columnId + }); + const style = vm.getHeaderCellStyle(columnId, { transform, transition }); + const isLocked = !column.canDrag; return (
- {vm.isDraggable && ( - - )}
{columnsFilterable && ( -
+
{columnFilters[columnIndex]?.renderFilterWidgets()}
)}
- {canResize ? props.resizer : null} + {isResizable ? props.resizer : null}
); }); diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx index b3632feff6..d72972ba50 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeader.tsx @@ -1,37 +1,74 @@ import classNames from "classnames"; -import { HTMLAttributes, KeyboardEvent, ReactElement, ReactNode } from "react"; +import { KeyboardEvent, ReactElement, ReactNode } from "react"; import { FaArrowsAltV } from "./icons/FaArrowsAltV"; import { FaLongArrowAltDown } from "./icons/FaLongArrowAltDown"; import { FaLongArrowAltUp } from "./icons/FaLongArrowAltUp"; -import { useColumn, useHeaderDragnDropVM } from "../model/hooks/injection-hooks"; +import { DragHandle } from "./DragHandle"; +import { useColumn, useDatagridConfig, useHeaderDndVM } from "../model/hooks/injection-hooks"; import { observer } from "mobx-react-lite"; import { SortDirection } from "../typings/sorting"; +import { useSortable } from "@dnd-kit/sortable"; interface SortIconProps { direction: SortDirection | undefined; + onToggleSort?: () => void; + caption?: string; } export const ColumnHeader = observer(function ColumnHeader(): ReactElement { + const { columnsDraggable, columnsSortable } = useDatagridConfig(); const column = useColumn(); - const { header, canSort, alignment } = column; + const { columnId, header, canSort, alignment } = column; const caption = header.trim(); - const sortProps = canSort ? getSortProps(() => column.toggleSort()) : null; - const vm = useHeaderDragnDropVM(); + const isDndEnabled = columnsDraggable && column.canDrag; + const isSortable = columnsSortable && canSort; + const { attributes, listeners, setActivatorNodeRef } = useSortable({ + id: columnId, + disabled: !isDndEnabled + }); + const vm = useHeaderDndVM(); return (
+ {isDndEnabled && ( + + )} {caption.length > 0 ? caption : "\u00a0"} - {canSort ? : null} + {isSortable ? ( + column.toggleSort()} caption={caption} /> + ) : null}
); }); -function SortIcon({ direction }: SortIconProps): ReactNode { +function SortIcon({ direction, onToggleSort, caption }: SortIconProps): ReactNode { + const icon = getIconElement(direction); + + if (!onToggleSort) { + return icon; + } + + return ( + + ); +} + +function getIconElement(direction: SortDirection | undefined): ReactNode { switch (direction) { case "asc": return ; @@ -41,19 +78,3 @@ function SortIcon({ direction }: SortIconProps): ReactNode { return ; } } - -function getSortProps(toggleSort: () => void): HTMLAttributes { - return { - onClick: () => { - toggleSort(); - }, - onKeyDown: (e: KeyboardEvent) => { - if (e.key === "Enter" || e.key === " ") { - e.preventDefault(); - toggleSort(); - } - }, - role: "button", - tabIndex: 0 - }; -} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeaderDragPreview.tsx b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeaderDragPreview.tsx new file mode 100644 index 0000000000..929b3f6d78 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/ColumnHeaderDragPreview.tsx @@ -0,0 +1,38 @@ +import classNames from "classnames"; +import { ReactElement } from "react"; +import { useColumn, useColumnsStore, useDatagridConfig } from "../model/hooks/injection-hooks"; +import { ColumnHeader } from "./ColumnHeader"; + +/** + * Drag preview content for column header reordering. + * + * Rendered by @dnd-kit DragOverlay in a portal, so we provide the same selector context + * used by the datagrid SCSS to make it look like a real header. + */ +export function ColumnHeaderDragPreview(): ReactElement { + const { columnsFilterable, id: gridId } = useDatagridConfig(); + const { columnFilters } = useColumnsStore(); + const column = useColumn(); + const { columnId, columnIndex, header, size } = column; + const caption = header.trim(); + + return ( +
+
+
+
+ + {columnsFilterable && ( +
{columnFilters[columnIndex]?.renderFilterWidgets()}
+ )} +
+
+
+
+ ); +} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx b/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx index d988dc4b23..c3dedf5274 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/DragHandle.tsx @@ -1,44 +1,20 @@ -import { DragEvent, DragEventHandler, MouseEvent, ReactElement } from "react"; +import { ReactElement } from "react"; +import { DraggableAttributes, DraggableSyntheticListeners } from "@dnd-kit/core"; import { FaGripVertical } from "./icons/FaGripVertical"; interface DragHandleProps { - draggable: boolean; - onDragStart?: DragEventHandler; - onDragEnd?: DragEventHandler; + setActivatorNodeRef: (element: HTMLElement | null) => void; + listeners?: DraggableSyntheticListeners; + attributes?: DraggableAttributes; } -export function DragHandle({ draggable, onDragStart, onDragEnd }: DragHandleProps): ReactElement { - const handleMouseDown = (e: MouseEvent): void => { - // Only stop propagation, don't prevent default - we need default for drag to work - e.stopPropagation(); - }; - - const handleClick = (e: MouseEvent): void => { - // Stop click events from bubbling to prevent sorting - e.stopPropagation(); - e.preventDefault(); - }; - - const handleDragStart = (e: DragEvent): void => { - // Don't stop propagation here - let the drag start properly - if (onDragStart) { - onDragStart(e); - } - }; - - const handleDragEnd = (e: DragEvent): void => { - if (onDragEnd) { - onDragEnd(e); - } - }; - +export function DragHandle({ setActivatorNodeRef, listeners, attributes }: DragHandleProps): ReactElement { return ( diff --git a/packages/pluggableWidgets/datagrid-web/src/components/DragHandleIcon.tsx b/packages/pluggableWidgets/datagrid-web/src/components/DragHandleIcon.tsx new file mode 100644 index 0000000000..160eff94f4 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/components/DragHandleIcon.tsx @@ -0,0 +1,15 @@ +import { ReactElement } from "react"; +import { FaGripVertical } from "./icons/FaGripVertical"; + +/** + * Visual-only drag handle. + * + * For preview purposes only; does not implement drag-and-drop functionality. + */ +export function DragHandleIcon(): ReactElement { + return ( + + ); +} diff --git a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx index cab4ef45f2..ffd5dd10d8 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/GridHeader.tsx @@ -1,40 +1,69 @@ -import { ReactElement } from "react"; -import { useColumnsStore, useDatagridConfig, useGridSizeStore } from "../model/hooks/injection-hooks"; +import { ReactElement, useMemo } from "react"; +import { useColumnsStore, useDatagridConfig, useGridSizeStore, useHeaderDndVM } from "../model/hooks/injection-hooks"; import { CheckboxColumnHeader } from "./CheckboxColumnHeader"; import { ColumnProvider } from "./ColumnProvider"; import { ColumnResizer } from "./ColumnResizer"; import { ColumnSelector } from "./ColumnSelector"; import { ColumnContainer } from "./ColumnContainer"; import { HeaderSkeletonLoader } from "./loader/HeaderSkeletonLoader"; +import { observer } from "mobx-react-lite"; +import { DndContext, DragOverlay, KeyboardSensor, PointerSensor, useSensor, useSensors } from "@dnd-kit/core"; +import { horizontalListSortingStrategy, SortableContext, sortableKeyboardCoordinates } from "@dnd-kit/sortable"; +import { ColumnHeaderDragPreview } from "./ColumnHeaderDragPreview"; -export function GridHeader(): ReactElement { +export const GridHeader = observer(function GridHeader(): ReactElement { const { columnsHidable, id: gridId } = useDatagridConfig(); const columnsStore = useColumnsStore(); const gridSizeStore = useGridSizeStore(); const columns = columnsStore.visibleColumns; + const vm = useHeaderDndVM(); + const items = useMemo(() => columns.filter(c => c.canDrag).map(c => c.columnId), [columns]); + const sensors = useSensors( + useSensor(PointerSensor, { activationConstraint: { distance: 5 } }), + useSensor(KeyboardSensor, { coordinateGetter: sortableKeyboardCoordinates }) + ); if (!columnsStore.loaded) { return ; } return ( -
-
- - {columns.map(column => ( - - } /> + + +
+
+ + {columns.map(column => ( + + } /> + + ))} + {columnsHidable && ( + + )} +
+
+
+ + + {vm.activeColumn ? ( + + - ))} - {columnsHidable && ( - - )} -
-
+ ) : null} + + ); -} +}); diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnContainer.spec.tsx b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnContainer.spec.tsx index 63167f0fe9..177a4df096 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnContainer.spec.tsx +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/ColumnContainer.spec.tsx @@ -3,14 +3,29 @@ import "@testing-library/jest-dom"; import { render } from "@testing-library/react"; import userEvent from "@testing-library/user-event"; import { ContainerProvider } from "brandi-react"; +import { ReactElement } from "react"; import { createDatagridContainer } from "../../model/containers/createDatagridContainer"; import { CORE_TOKENS } from "../../model/tokens"; import { column, mockContainerProps } from "../../utils/test-utils"; import { ColumnProvider } from "../ColumnProvider"; import { ColumnContainer } from "../ColumnContainer"; import { ColumnResizer } from "../ColumnResizer"; +import { DndContext } from "@dnd-kit/core"; +import { horizontalListSortingStrategy, SortableContext } from "@dnd-kit/sortable"; describe("ColumnContainer", () => { + function renderWithProviders(container: any, col: any, element: ReactElement): ReturnType { + return render( + + + + {element} + + + + ); + } + it("renders the structure correctly", () => { const props = mockContainerProps({ columns: [column("Column 1")] @@ -19,13 +34,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - } /> - - - ); + const component = renderWithProviders(container, col, } />); expect(component.asFragment()).toMatchSnapshot(); }); @@ -41,13 +50,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - } /> - - - ); + const component = renderWithProviders(container, col, } />); expect(component.asFragment()).toMatchSnapshot(); }); @@ -63,13 +66,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - resizer
} /> - - - ); + const component = renderWithProviders(container, col, resizer
} />); expect(component.asFragment()).toMatchSnapshot(); }); @@ -85,13 +82,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - } /> - - - ); + const component = renderWithProviders(container, col, } />); expect(component.asFragment()).toMatchSnapshot(); }); @@ -107,13 +98,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - } /> - - - ); + const component = renderWithProviders(container, col, } />); expect(component.asFragment()).toMatchSnapshot(); }); @@ -131,14 +116,8 @@ describe("ColumnContainer", () => { const col = columns.visibleColumns[0]; const spy = jest.spyOn(col, "toggleSort"); - const component = render( - - - } /> - - - ); - const button = component.getByLabelText("sort Column 1"); + const component = renderWithProviders(container, col, } />); + const button = component.getByLabelText("Sort by Column 1"); expect(button).toBeInTheDocument(); await user.click(button); @@ -156,13 +135,7 @@ describe("ColumnContainer", () => { const columns = container.get(CORE_TOKENS.columnsStore); const col = columns.visibleColumns[0]; - const component = render( - - - } /> - - - ); + const component = renderWithProviders(container, col, } />); expect(component.asFragment()).toMatchSnapshot(); }); }); diff --git a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap index af030520b2..639aa7baee 100644 --- a/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap +++ b/packages/pluggableWidgets/datagrid-web/src/components/__tests__/__snapshots__/ColumnContainer.spec.tsx.snap @@ -6,7 +6,6 @@ exports[`ColumnContainer renders the structure correctly 1`] = ` class="th" data-column-id="0" role="columnheader" - style="cursor: unset;" title="Column 1" >
+ +
`; @@ -37,34 +52,37 @@ exports[`ColumnContainer renders the structure correctly when draggable 1`] = ` class="th" data-column-id="0" role="columnheader" - style="cursor: unset;" title="Column 1" > - - -
+ + + @@ -76,6 +94,23 @@ exports[`ColumnContainer renders the structure correctly when draggable 1`] = ` />
+ +
`; @@ -85,7 +120,6 @@ exports[`ColumnContainer renders the structure correctly when filterable with cu class="th" data-column-id="0" role="columnheader" - style="cursor: unset;" title="Column 1" >
+ +
`; @@ -120,7 +170,6 @@ exports[`ColumnContainer renders the structure correctly when resizable 1`] = ` class="th" data-column-id="0" role="columnheader" - style="cursor: unset;" title="Column 1" >
+ +
`; @@ -159,37 +224,56 @@ exports[`ColumnContainer renders the structure correctly when sortable 1`] = ` id="datagrid2_1:Datagrid@6-column0" >
Column 1 - + +
+ +
`; @@ -199,7 +283,6 @@ exports[`ColumnContainer renders the structure correctly when value is empty 1`] class="th" data-column-id="0" role="columnheader" - style="cursor: unset;" title="" >
+ +
`; diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.store.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.store.ts new file mode 100644 index 0000000000..9efe3794e0 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.store.ts @@ -0,0 +1,33 @@ +import { makeAutoObservable } from "mobx"; +import { ColumnId } from "../../typings/GridColumn"; + +export type DropPlacement = "before" | "after"; + +export class HeaderDndStore { + activeId: ColumnId | undefined = undefined; + overId: ColumnId | undefined = undefined; + placement: DropPlacement | undefined = undefined; + + constructor() { + makeAutoObservable(this); + } + + get isDragging(): boolean { + return Boolean(this.activeId); + } + + setActive(id: ColumnId | undefined): void { + this.activeId = id; + } + + setOver(overId: ColumnId | undefined, placement: DropPlacement | undefined): void { + this.overId = overId; + this.placement = placement; + } + + clear(): void { + this.activeId = undefined; + this.overId = undefined; + this.placement = undefined; + } +} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.viewModel.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.viewModel.ts new file mode 100644 index 0000000000..45036e8621 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDnd.viewModel.ts @@ -0,0 +1,168 @@ +import { makeAutoObservable } from "mobx"; +import { + closestCenter, + CollisionDetection, + DragCancelEvent, + DragEndEvent, + DragOverEvent, + DragStartEvent, + UniqueIdentifier +} from "@dnd-kit/core"; +import { CSS, Transform } from "@dnd-kit/utilities"; +import { CSSProperties } from "react"; +import { ColumnId, GridColumn } from "../../typings/GridColumn"; +import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; +import { DropPlacement, HeaderDndStore } from "./HeaderDnd.store"; + +export class HeaderDndViewModel { + constructor( + private store: HeaderDndStore, + private columnsStore: ColumnGroupStore + ) { + makeAutoObservable(this, {}, { autoBind: true }); + } + + get activeId(): ColumnId | undefined { + return this.store.activeId; + } + + get overId(): ColumnId | undefined { + return this.store.overId; + } + + get placement(): DropPlacement | undefined { + return this.store.placement; + } + + get isDragging(): boolean { + return this.store.isDragging; + } + + get activeColumn(): GridColumn | undefined { + const activeId = this.store.activeId; + if (!activeId) { + return undefined; + } + return this.columnsStore.availableColumns.find(c => c.columnId === activeId); + } + + /** + * dnd-kit collision detection implementation. + * + * Kept here so barrier rules live with the DnD state/logic, not the view. + */ + collisionDetection(args: Parameters[0]): ReturnType { + // Use the full set of droppable containers for collision detection so + // dnd-kit's sorting/animation calculations consider locked columns' positions. + // We still prevent final drops on locked columns in `onDragOver`/`onDragEnd`. + return closestCenter(args); + } + + /** + * Derive the inline style for a header cell based on sortable state. + * Only draggable columns receive transform/transition styles to avoid + * showing locked columns moving during a drag. + */ + getHeaderCellStyle( + columnId: ColumnId, + options: { transform: Transform | null; transition: string | undefined } + ): CSSProperties { + const columns = this.columnsStore.visibleColumns; + const idx = columns.findIndex(c => c.columnId === columnId); + // If column doesn't exist or is locked (non-draggable) + // do not apply transform/transition so it remains visually fixed during dnd. + if (idx < 0 || !columns[idx].canDrag) { + return {}; + } + + return { + ...(options.transform ? { transform: CSS.Transform.toString(options.transform) } : null), + ...(options.transition ? { transition: options.transition } : null) + }; + } + + /** + * Ids that are allowed to be used as "over" targets for the current active drag. + * Returns undefined when not currently dragging. + */ + private toColumnId(id: UniqueIdentifier | undefined): ColumnId | undefined { + return typeof id === "string" ? (id as ColumnId) : undefined; + } + + private computePlacement(active: ColumnId, over: ColumnId): DropPlacement | undefined { + // Compute placement based on the indices of movable columns only so + // locked (non-draggable / non-sortable) columns remain stationary during drags. + const columns = this.columnsStore.visibleColumns; + const movable = columns.filter(c => c.canDrag); + const activeIndex = movable.findIndex(c => c.columnId === active); + const overIndex = movable.findIndex(c => c.columnId === over); + if (activeIndex < 0 || overIndex < 0) { + return undefined; + } + return overIndex > activeIndex ? "after" : "before"; + } + + private isOverAllowed(over: ColumnId): boolean { + const columns = this.columnsStore.visibleColumns; + const overIndex = columns.findIndex(c => c.columnId === over); + if (overIndex < 0) { + return false; + } + + // Can't drop onto a non-draggable column. + const col = columns[overIndex]; + return Boolean(col.canDrag); + } + + onDragStart(e: DragStartEvent): void { + const activeId = this.toColumnId(e.active.id); + if (activeId) { + this.store.setActive(activeId); + } + } + + onDragOver(e: DragOverEvent): void { + const activeId = this.toColumnId(e.active.id); + const overId = this.toColumnId(e.over?.id); + + if (!activeId) { + this.store.setOver(undefined, undefined); + return; + } + + if (!overId || activeId === overId) { + this.store.setOver(undefined, undefined); + return; + } + + if (!this.isOverAllowed(overId)) { + this.store.setOver(undefined, undefined); + return; + } + + this.store.setOver(overId, this.computePlacement(activeId, overId)); + } + + onDragEnd(e: DragEndEvent): void { + const activeId = this.toColumnId(e.active.id); + const overId = this.toColumnId(e.over?.id); + + if (!activeId) { + this.store.clear(); + return; + } + + if (overId && activeId !== overId && this.isOverAllowed(overId)) { + const placement = this.computePlacement(activeId, overId); + if (placement) { + this.columnsStore.swapColumns(activeId, [overId, placement]); + } + } + + this.store.clear(); + } + + onDragCancel(_e: DragCancelEvent): void { + this.store.clear(); + } +} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts deleted file mode 100644 index 54fc13b982..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.store.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { action, makeAutoObservable } from "mobx"; -import { ColumnId } from "../../typings/GridColumn"; - -/** - * MobX store for managing drag & drop state of column headers. - * Tracks which column is being dragged and where it can be dropped. - * @injectable - */ -export class HeaderDragnDropStore { - private _dragOver: [ColumnId, "before" | "after"] | undefined = undefined; - private _isDragging: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined = undefined; - - constructor() { - makeAutoObservable(this, { - setDragOver: action, - setIsDragging: action, - clearDragState: action - }); - } - - get dragOver(): [ColumnId, "before" | "after"] | undefined { - return this._dragOver; - } - - get isDragging(): [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined { - return this._isDragging; - } - - setDragOver(value: [ColumnId, "before" | "after"] | undefined): void { - this._dragOver = value; - } - - setIsDragging(value: [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined): void { - this._isDragging = value; - } - - clearDragState(): void { - this._dragOver = undefined; - this._isDragging = undefined; - } -} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts deleted file mode 100644 index fed47eca29..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/HeaderDragnDrop.viewModel.ts +++ /dev/null @@ -1,95 +0,0 @@ -import { makeAutoObservable } from "mobx"; -import { DragEvent } from "react"; -import { HeaderDragnDropStore } from "./HeaderDragnDrop.store"; -import { ColumnId, GridColumn } from "../../typings/GridColumn"; -import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; - -/** - * View model for a single column header drag & drop interactions. - * Encapsulates previous `useDraggable` hook logic and uses MobX store for shared drag state. - * @injectable - */ -export class HeaderDragnDropViewModel { - constructor( - private dndStore: HeaderDragnDropStore, - private columnsStore: ColumnGroupStore, - private config: { columnsDraggable: boolean }, - private column: GridColumn - ) { - makeAutoObservable(this); - } - - get dropTarget(): [ColumnId, "before" | "after"] | undefined { - return this.dndStore.dragOver; - } - - get dragging(): [ColumnId | undefined, ColumnId, ColumnId | undefined] | undefined { - return this.dndStore.isDragging; - } - - get isDraggable(): boolean { - return this.config.columnsDraggable && this.column.canDrag; - } - - handleDragStart = (e: DragEvent): void => { - const elt = (e.target as HTMLDivElement).closest(".th") as HTMLDivElement; - if (!elt) { - return; - } - const columnId = (elt.dataset.columnId ?? "") as ColumnId; - const columnAtTheLeft = (elt.previousElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; - const columnAtTheRight = (elt.nextElementSibling as HTMLDivElement)?.dataset?.columnId as ColumnId; - this.dndStore.setIsDragging([columnAtTheLeft, columnId, columnAtTheRight]); - }; - - handleDragOver = (e: DragEvent): void => { - const dragging = this.dragging; - if (!dragging) { - return; - } - const columnId = (e.currentTarget as HTMLDivElement).dataset.columnId as ColumnId; - if (!columnId) { - return; - } - e.preventDefault(); - const [leftSiblingColumnId, draggingColumnId, rightSiblingColumnId] = dragging; - if (columnId === draggingColumnId) { - if (this.dropTarget !== undefined) { - this.dndStore.setDragOver(undefined); - } - return; - } - let isAfter: boolean; - if (columnId === leftSiblingColumnId) { - isAfter = false; - } else if (columnId === rightSiblingColumnId) { - isAfter = true; - } else { - const rect = (e.currentTarget as HTMLDivElement).getBoundingClientRect(); - isAfter = rect.width / 2 + (this.dropTarget?.[1] === "after" ? -10 : 10) < e.clientX - rect.left; - } - const newPosition: "before" | "after" = isAfter ? "after" : "before"; - if (columnId !== this.dropTarget?.[0] || newPosition !== this.dropTarget?.[1]) { - this.dndStore.setDragOver([columnId, newPosition]); - } - }; - - handleDragEnter = (e: DragEvent): void => { - e.preventDefault(); - }; - - handleDragEnd = (): void => { - this.dndStore.clearDragState(); - }; - - handleOnDrop = (_e: DragEvent): void => { - const dragging = this.dragging; - const dropTarget = this.dropTarget; - this.handleDragEnd(); - if (!dragging || !dropTarget) { - return; - } - // Reorder columns using existing columns store logic - this.columnsStore.swapColumns(dragging[1], dropTarget); - }; -} diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDnd.viewModel.spec.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDnd.viewModel.spec.ts new file mode 100644 index 0000000000..df3486ed35 --- /dev/null +++ b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDnd.viewModel.spec.ts @@ -0,0 +1,59 @@ +import { HeaderDndStore } from "../HeaderDnd.store"; +import { HeaderDndViewModel } from "../HeaderDnd.viewModel"; +import { ColumnId } from "../../../typings/GridColumn"; + +function col(id: string, canDrag: boolean): any { + return { columnId: id as ColumnId, canDrag }; +} + +describe("HeaderDndViewModel", () => { + it("does not swap across a non-draggable column barrier", () => { + const store = new HeaderDndStore(); + const columnsStore: any = { + visibleColumns: [col("A", true), col("B", false), col("C", true), col("D", true)], + availableColumns: [col("A", true), col("B", false), col("C", true), col("D", true)], + swapColumns: jest.fn() + }; + + const vm = new HeaderDndViewModel(store, columnsStore); + + // Try to drag C (right side) over A (left side). With the updated + // behavior draggable columns may swap across non-draggable columns. + vm.onDragEnd({ active: { id: "C" }, over: { id: "A" } } as any); + + expect(columnsStore.swapColumns).toHaveBeenCalledTimes(1); + expect(columnsStore.swapColumns).toHaveBeenCalledWith("C", ["A", "before"]); + }); + + it("allows swapping within the same draggable segment", () => { + const store = new HeaderDndStore(); + const columnsStore: any = { + visibleColumns: [col("A", true), col("B", false), col("C", true), col("D", true)], + availableColumns: [col("A", true), col("B", false), col("C", true), col("D", true)], + swapColumns: jest.fn() + }; + + const vm = new HeaderDndViewModel(store, columnsStore); + + // Drag D over C (same segment). Should reorder. + vm.onDragEnd({ active: { id: "D" }, over: { id: "C" } } as any); + + expect(columnsStore.swapColumns).toHaveBeenCalledTimes(1); + expect(columnsStore.swapColumns).toHaveBeenCalledWith("D", ["C", "before"]); + }); + + it("does not allow dropping onto a non-draggable column", () => { + const store = new HeaderDndStore(); + const columnsStore: any = { + visibleColumns: [col("A", true), col("B", false), col("C", true)], + availableColumns: [col("A", true), col("B", false), col("C", true)], + swapColumns: jest.fn() + }; + + const vm = new HeaderDndViewModel(store, columnsStore); + + vm.onDragEnd({ active: { id: "C" }, over: { id: "B" } } as any); + + expect(columnsStore.swapColumns).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts b/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts deleted file mode 100644 index a11aa24123..0000000000 --- a/packages/pluggableWidgets/datagrid-web/src/features/column/__tests__/HeaderDragnDrop.viewModel.spec.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { DragEvent } from "react"; -import { HeaderDragnDropViewModel } from "../HeaderDragnDrop.viewModel"; -import { HeaderDragnDropStore } from "../HeaderDragnDrop.store"; -import { ColumnId } from "../../../typings/GridColumn"; - -describe("ColumnHeaderViewModel", () => { - let dndStore: HeaderDragnDropStore; - let mockColumnsStore: any; - let mockColumn: any; - - beforeEach(() => { - dndStore = new HeaderDragnDropStore(); - mockColumnsStore = { - swapColumns: jest.fn() - }; - mockColumn = { - canDrag: true, - columnId: "col1" as ColumnId - }; - }); - - describe("when columnsDraggable is false", () => { - it("is not draggable", () => { - const vm = new HeaderDragnDropViewModel( - dndStore, - mockColumnsStore, - { columnsDraggable: false }, - mockColumn - ); - - expect(vm.isDraggable).toBe(false); - }); - }); - - describe("when columnsDraggable is true", () => { - let vm: HeaderDragnDropViewModel; - - beforeEach(() => { - vm = new HeaderDragnDropViewModel(dndStore, mockColumnsStore, { columnsDraggable: true }, mockColumn); - }); - - it("is draggable", () => { - expect(vm.isDraggable).toBe(true); - }); - - describe("handleDragStart", () => { - it("sets dragging state with column siblings", () => { - const mockElement = createMockElement("col1", "col0", "col2"); - const event = createMockDragEvent(mockElement); - - vm.handleDragStart(event); - - expect(dndStore.isDragging).toEqual(["col0", "col1", "col2"]); - }); - - it("handles missing previous sibling", () => { - const mockElement = createMockElement("col1", undefined, "col2"); - const event = createMockDragEvent(mockElement); - - vm.handleDragStart(event); - - expect(dndStore.isDragging).toEqual([undefined, "col1", "col2"]); - }); - - it("handles missing next sibling", () => { - const mockElement = createMockElement("col1", "col0", undefined); - const event = createMockDragEvent(mockElement); - - vm.handleDragStart(event); - - expect(dndStore.isDragging).toEqual(["col0", "col1", undefined]); - }); - - it("does nothing when element is not found", () => { - const event = { - target: { - closest: jest.fn().mockReturnValue(null) - } - } as any; - - vm.handleDragStart(event); - - expect(dndStore.isDragging).toBeUndefined(); - }); - }); - - describe("handleDragOver", () => { - beforeEach(() => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - }); - - it("does nothing when not dragging", () => { - dndStore.clearDragState(); - const event = createMockDragOverEvent("col2", 100, 50); - - vm.handleDragOver(event); - - expect(dndStore.dragOver).toBeUndefined(); - }); - - it("does nothing when columnId is missing", () => { - const event = createMockDragOverEvent("", 100, 50); - - vm.handleDragOver(event); - - expect(dndStore.dragOver).toBeUndefined(); - }); - - it("clears dropTarget when hovering over self", () => { - dndStore.setDragOver(["col2" as ColumnId, "after"]); - const event = createMockDragOverEvent("col1", 100, 50); - - vm.handleDragOver(event); - - expect(dndStore.dragOver).toBeUndefined(); - }); - - it("sets dropTarget to before when hovering over left sibling", () => { - const event = createMockDragOverEvent("col0", 100, 50); - - vm.handleDragOver(event); - - expect(dndStore.dragOver).toEqual(["col0", "before"]); - }); - - it("sets dropTarget to after when hovering over right sibling", () => { - const event = createMockDragOverEvent("col2", 100, 50); - - vm.handleDragOver(event); - - expect(dndStore.dragOver).toEqual(["col2", "after"]); - }); - }); - - describe("handleDragEnter", () => { - it("prevents default behavior", () => { - const event = { preventDefault: jest.fn() } as any; - - vm.handleDragEnter(event); - - expect(event.preventDefault).toHaveBeenCalled(); - }); - }); - - describe("handleDragEnd", () => { - it("clears drag state", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - dndStore.setDragOver(["col2" as ColumnId, "after"]); - - vm.handleDragEnd(); - - expect(dndStore.isDragging).toBeUndefined(); - expect(dndStore.dragOver).toBeUndefined(); - }); - }); - - describe("handleOnDrop", () => { - it("calls swapColumns with correct parameters", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - dndStore.setDragOver(["col3" as ColumnId, "after"]); - - vm.handleOnDrop({} as any); - - expect(mockColumnsStore.swapColumns).toHaveBeenCalledWith("col1", ["col3", "after"]); - }); - - it("clears drag state after drop", () => { - dndStore.setIsDragging(["col0" as ColumnId, "col1" as ColumnId, "col2" as ColumnId]); - dndStore.setDragOver(["col3" as ColumnId, "after"]); - - vm.handleOnDrop({} as any); - - expect(dndStore.isDragging).toBeUndefined(); - expect(dndStore.dragOver).toBeUndefined(); - }); - }); - }); -}); - -// Helper functions to create mock DOM elements and events - -function createMockElement( - columnId: string, - prevSiblingId: string | undefined, - nextSiblingId: string | undefined -): HTMLDivElement { - const element = { - dataset: { columnId }, - previousElementSibling: prevSiblingId ? { dataset: { columnId: prevSiblingId } } : null, - nextElementSibling: nextSiblingId ? { dataset: { columnId: nextSiblingId } } : null - } as any; - - return element; -} - -function createMockDragEvent(targetElement: HTMLDivElement): DragEvent { - return { - target: { - closest: jest.fn().mockReturnValue(targetElement) - } - } as any; -} - -function createMockDragOverEvent(columnId: string, width: number, clientX: number): DragEvent { - return { - currentTarget: { - dataset: { columnId }, - getBoundingClientRect: jest.fn().mockReturnValue({ width, left: 0 }) - }, - clientX, - preventDefault: jest.fn() - } as any; -} diff --git a/packages/pluggableWidgets/datagrid-web/src/helpers/state/ColumnGroupStore.ts b/packages/pluggableWidgets/datagrid-web/src/helpers/state/ColumnGroupStore.ts index e8cf112bd2..7288debf7c 100644 --- a/packages/pluggableWidgets/datagrid-web/src/helpers/state/ColumnGroupStore.ts +++ b/packages/pluggableWidgets/datagrid-web/src/helpers/state/ColumnGroupStore.ts @@ -127,10 +127,58 @@ export class ColumnGroupStore implements IColumnGroupStore, IColumnParentStore, swapColumns(source: ColumnId, [target, placement]: [ColumnId, "after" | "before"]): void { const columnSource = this._allColumnsById.get(source)!; const columnTarget = this._allColumnsById.get(target)!; - columnSource.orderWeight = columnTarget.orderWeight + (placement === "after" ? 1 : -1); - // normalize columns - this._allColumnsOrdered.forEach((column, idx) => { + // Reorder only among movable (draggable) columns so that locked + // (non-draggable) columns keep their original positions. + const allOrdered = this._allColumnsOrdered; + const movable = allOrdered.filter(c => c.canDrag); + + const srcMovIdx = movable.findIndex(c => c.columnId === source); + const tgtMovIdx = movable.findIndex(c => c.columnId === target); + + // Fallback to simple relative weight if either column is not in movable set + if (srcMovIdx < 0 || tgtMovIdx < 0) { + columnSource.orderWeight = columnTarget.orderWeight + (placement === "after" ? 1 : -1); + this._allColumnsOrdered.forEach((column, idx) => { + column.orderWeight = idx * 10; + }); + return; + } + + // Build new movable order with source removed and inserted at target position + const newMovable = movable.slice(); + // remove source + newMovable.splice(srcMovIdx, 1); + + // compute insert index relative to original movable indices + const originalTgtIdx = tgtMovIdx; + let insertIdx: number; + if (srcMovIdx < originalTgtIdx) { + // removing source shifted target left by 1 + insertIdx = originalTgtIdx - 1 + (placement === "after" ? 1 : 0); + } else { + insertIdx = originalTgtIdx + (placement === "after" ? 1 : 0); + } + + // clamp + if (insertIdx < 0) insertIdx = 0; + if (insertIdx > newMovable.length) insertIdx = newMovable.length; + + newMovable.splice(insertIdx, 0, columnSource); + + // Merge back into the full ordered list: replace movable slots in-order + const merged: ColumnStore[] = []; + let movableCursor = 0; + for (const col of allOrdered) { + if (col.canDrag) { + merged.push(newMovable[movableCursor++]); + } else { + merged.push(col); + } + } + + // normalize weights based on merged order + merged.forEach((column, idx) => { column.orderWeight = idx * 10; }); } diff --git a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts index 4959148556..73a54b915f 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/containers/Datagrid.container.ts @@ -31,8 +31,8 @@ import { PaginationViewModel } from "../../features/pagination/Pagination.viewMo import { creteCheckboxEventsController } from "../../features/row-interaction/CheckboxEventsController"; import { SelectAllModule } from "../../features/select-all/SelectAllModule.container"; import { ColumnGroupStore } from "../../helpers/state/ColumnGroupStore"; -import { HeaderDragnDropStore } from "../../features/column/HeaderDragnDrop.store"; -import { HeaderDragnDropViewModel } from "../../features/column/HeaderDragnDrop.viewModel"; +import { HeaderDndStore } from "../../features/column/HeaderDnd.store"; +import { HeaderDndViewModel } from "../../features/column/HeaderDnd.viewModel"; import { GridBasicData } from "../../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../../helpers/state/GridPersonalizationStore"; import { DatagridConfig } from "../configs/Datagrid.config"; @@ -108,9 +108,9 @@ injected( DG.selectionCounterCfg.optional ); -// drag and drop -injected(HeaderDragnDropStore); -injected(HeaderDragnDropViewModel, DG.headerDragDrop, CORE.columnsStore, CORE.config, CORE.column); +// header drag and drop (dnd-kit) +injected(HeaderDndStore); +injected(HeaderDndViewModel, DG.headerDndStore, CORE.columnsStore); export class DatagridContainer extends Container { id = `DatagridContainer@${generateUUID()}`; @@ -122,10 +122,9 @@ export class DatagridContainer extends Container { this.bind(DG.basicDate).toInstance(GridBasicData).inSingletonScope(); // Columns store this.bind(CORE.columnsStore).toInstance(ColumnGroupStore).inSingletonScope(); - // Drag and Drop store - this.bind(DG.headerDragDrop).toInstance(HeaderDragnDropStore).inSingletonScope(); - // Drag and Drop view model (per column, not singleton) - this.bind(DG.headerDragnDropVM).toInstance(HeaderDragnDropViewModel).inTransientScope(); + // Header drag and drop (dnd-kit) store/view model + this.bind(DG.headerDndStore).toInstance(HeaderDndStore).inSingletonScope(); + this.bind(DG.headerDndVM).toInstance(HeaderDndViewModel).inSingletonScope(); // Query service this.bind(DG.query).toInstance(DatasourceService).inSingletonScope(); // Grid sizing and scrolling store diff --git a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts index 8a5ae2451e..6cd9f1d9f2 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/hooks/injection-hooks.ts @@ -23,7 +23,7 @@ export const [useRows] = createInjectionHooks(CORE.rows); export const [useSelectActions] = createInjectionHooks(DG.selectActions); export const [useCustomPagination] = createInjectionHooks(DG.customPagination); export const [usePaginationConfig] = createInjectionHooks(DG.paginationConfig); -export const [useHeaderDragnDropVM] = createInjectionHooks(DG.headerDragnDropVM); +export const [useHeaderDndVM] = createInjectionHooks(DG.headerDndVM); export const [useClickActionHelper] = createInjectionHooks(DG.clickActionHelper); export const [useFocusService] = createInjectionHooks(DG.focusService); export const [useCheckboxEventsHandler] = createInjectionHooks(DG.checkboxEventsHandler); diff --git a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts index 1f45c3455e..d0e8fbb29a 100644 --- a/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts +++ b/packages/pluggableWidgets/datagrid-web/src/model/tokens.ts @@ -38,8 +38,8 @@ import { SelectionProgressDialogViewModel } from "../features/select-all/Selecti import { ColumnGroupStore } from "../helpers/state/ColumnGroupStore"; import { GridBasicData } from "../helpers/state/GridBasicData"; import { GridPersonalizationStore } from "../helpers/state/GridPersonalizationStore"; -import { HeaderDragnDropStore } from "../features/column/HeaderDragnDrop.store"; -import { HeaderDragnDropViewModel } from "../features/column/HeaderDragnDrop.viewModel"; +import { HeaderDndStore } from "../features/column/HeaderDnd.store"; +import { HeaderDndViewModel } from "../features/column/HeaderDnd.viewModel"; import { DatasourceParamsController } from "../model/services/DatasourceParamsController"; import { GridColumn } from "../typings/GridColumn"; import { DatagridConfig } from "./configs/Datagrid.config"; @@ -148,8 +148,8 @@ export const DG_TOKENS = { clickActionHelper: token("@service:ClickActionHelper"), focusService: token("@service:FocusTargetController"), checkboxEventsHandler: token("@service:CheckboxEventsController"), - headerDragDrop: token("@store:HeaderDragnDropStore"), - headerDragnDropVM: token("@viewmodel:ColumnHeaderViewModel"), + headerDndStore: token("@store:HeaderDndStore"), + headerDndVM: token("@viewmodel:HeaderDndViewModel"), cellEventsHandler: token("@service:CellEventsController") }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b4e4374c2d..52351f41e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1275,6 +1275,15 @@ importers: packages/pluggableWidgets/datagrid-web: dependencies: + '@dnd-kit/core': + specifier: ^6.3.1 + version: 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/sortable': + specifier: ^10.0.0 + version: 10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': + specifier: ^3.2.2 + version: 3.2.2(react@18.3.1) '@floating-ui/react': specifier: ^0.26.27 version: 0.26.28(react-dom@18.3.1(react@18.3.1))(react@18.3.1) @@ -3898,6 +3907,28 @@ packages: resolution: {integrity: sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==} engines: {node: '>=10.0.0'} + '@dnd-kit/accessibility@3.1.1': + resolution: {integrity: sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==} + peerDependencies: + react: '>=18.0.0 <19.0.0' + + '@dnd-kit/core@6.3.1': + resolution: {integrity: sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==} + peerDependencies: + react: '>=18.0.0 <19.0.0' + react-dom: '>=18.0.0 <19.0.0' + + '@dnd-kit/sortable@10.0.0': + resolution: {integrity: sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==} + peerDependencies: + '@dnd-kit/core': ^6.3.0 + react: '>=18.0.0 <19.0.0' + + '@dnd-kit/utilities@3.2.2': + resolution: {integrity: sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==} + peerDependencies: + react: '>=18.0.0 <19.0.0' + '@eslint-community/eslint-utils@4.9.0': resolution: {integrity: sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -11976,6 +12007,31 @@ snapshots: '@discoveryjs/json-ext@0.5.7': {} + '@dnd-kit/accessibility@3.1.1(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/accessibility': 3.1.1(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + tslib: 2.8.1 + + '@dnd-kit/sortable@10.0.0(@dnd-kit/core@6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react@18.3.1)': + dependencies: + '@dnd-kit/core': 6.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@dnd-kit/utilities': 3.2.2(react@18.3.1) + react: 18.3.1 + tslib: 2.8.1 + + '@dnd-kit/utilities@3.2.2(react@18.3.1)': + dependencies: + react: 18.3.1 + tslib: 2.8.1 + '@eslint-community/eslint-utils@4.9.0(eslint@7.32.0)': dependencies: eslint: 7.32.0 From a79017b708325736c0442b30786736250f6244ff Mon Sep 17 00:00:00 2001 From: Yordan Stoyanov Date: Tue, 13 Jan 2026 16:59:27 +0100 Subject: [PATCH 20/20] fix: update sorting test to use the correct sort button locator --- .../datagrid-web/e2e/DataGrid.spec.js | 8 ++++---- .../dataGridColumnContent-chromium-linux.png | Bin 16138 -> 16147 bytes .../datagrid-chromium-linux.png | Bin 10499 -> 10529 bytes ...agrid-virtual-scrolling-chromium-linux.png | Bin 36833 -> 37068 bytes ...dMultiSelectionCheckbox-chromium-linux.png | Bin 38217 -> 38241 bytes ...dMultiSelectionRowClick-chromium-linux.png | Bin 38719 -> 38792 bytes ...SingleSelectionCheckbox-chromium-linux.png | Bin 34376 -> 34407 bytes ...SingleSelectionRowClick-chromium-linux.png | Bin 34699 -> 34730 bytes 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js index 5f301156b9..fdd72d4d1f 100644 --- a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js +++ b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js @@ -1,5 +1,5 @@ import path from "path"; -import { test, expect } from "@playwright/test"; +import { expect, test } from "@playwright/test"; import * as XLSX from "xlsx"; import AxeBuilder from "@axe-core/playwright"; @@ -62,7 +62,7 @@ test.describe("capabilities: sorting", () => { await expect( page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='arrows-alt-v']") ).toBeVisible(); - await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); + await page.locator(".mx-name-datagrid1 .column-header").nth(1).locator(".sort-button").click(); await expect( page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='long-arrow-alt-up']") ).toBeVisible(); @@ -73,8 +73,8 @@ test.describe("capabilities: sorting", () => { await page.goto("/"); await page.waitForLoadState("networkidle"); await expect(page.locator(".mx-name-datagrid1 .column-header").nth(1)).toHaveText("First Name"); - await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); - await page.locator(".mx-name-datagrid1 .column-header").nth(1).click(); + await page.locator(".mx-name-datagrid1 .column-header").nth(1).locator(".sort-button").click(); + await page.locator(".mx-name-datagrid1 .column-header").nth(1).locator(".sort-button").click(); await expect( page.locator(".mx-name-datagrid1 .column-header").nth(1).locator("svg[data-icon='long-arrow-alt-down']") ).toBeVisible(); diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js-snapshots/dataGridColumnContent-chromium-linux.png b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js-snapshots/dataGridColumnContent-chromium-linux.png index 7c5d4f9ad5db5dcd06f2f0cbc6b065cf9871112f..2260710ab9268ebfcd4a386e93debc03ae281025 100644 GIT binary patch literal 16147 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 OA_ZC1cg1hbKK~Da@`4xu literal 16138 zcmeIZWl)=46fR1=lma!Ncv~DwpvAo{1&X^%iWA&|L%s@DtY~nG1PEFRL4p;EyIb&J z!68_HB!_8%g-aB{BpR7Ia-tV5Z_sZI9KkI!~xQ3bn`8~ROBqSu{iXYx< zk&xU>ziO}Ey?*tZ0`Q9^A$dTe`2MYqPx|&8xy}>Y%njn}?x_r`ZJWnGY(KX$-hayQ zp5bBCOOu7#x3Le-E;=agotD3g=1acM(D&^->FsiJbB17_8^a#Yo|9?PEWfZLJdG!V z_P-f=#xMJ|3*b^Y`q2jC^&0cK`>fo4KAT?dmDV|)A*P^yqpZyD9KN94yzX0c{xH6q z^-3WUk_1ps6urpJzs-MMOTG9jNuEUHQT!_-|F`@XX{t3VqNxlPLV~` zm8?nY`)t4*ll1~#3y9pYt;Vw4s}HW1z0#36e!j5IK;Klm{uH5ufnP1?$=^3Tn%mec zeOpI5GycQ~t0U>@rA6(~&ZtJ!P4UBtIvM9J@iUi`YKumG-);P{jL_wh`yP4*DZ|QE zKz923rCRePn`TW-SVSy< z_-h|k+So|q`>n#2&wrhPQ89sH<8FjjV2J3}*Ii_YvY)%S9ByfA1mXoD&OH2bu+=Oj zq0c5&dTA1%b)hjLOg|TYFKtkiR9Ig^L{i!u7>8SkAXJWhhD&pNJQ)c~Z#|mY_Z`qu z=*4Qf=#t-G#5lOWNa};Mwgk>2=TZ_Uzt&^)C2H6S=(73FksBDeYk9IVmk_oKuH9K( zPv#^<1@)I`Cy(NYtKl^iB$BSfuE`>ERh(8+BqorGFcD+!#>-^3U93f~f8MGPD1yNR z%3v>e+*Bg%5dLK=XT=DsU4eMbVPpDxkYRQ%6UC4PM6nz}-nXu?Ve{1Zu!re0GD0-+ zH=8fbE)d@ud9td&V3ekCN{Ifai*yTgT!px;_kLWvdKZiTpaN?zi@$r7w^@U9fh3<- zY1)@3JChwNA}4Z8Z^x7$DsH-Ydj;AL&xEbSHO0P>by|+YMOctwDH@;f51JCfTHd}R zV}AZh2nyS~nG|%GIU%WgAOkeIyuHzZ%aF+J4Pgpa&UJ`cqs6g!hQZa!+oyo7>Gz zoMXS{Jx6H*B@Egw=R+EhJ$u6tHH0b6e(ez-G0TxyUvtj9Trbm@_ml8Xcj^~9arF+^ zlZd7Yt_p{3i3QY!k{?WRbZ{)48R1Oq7GB?PTQOj+c-fqz?6X*Sn<=GiW#?{;q)D-9 z6V_GfN7-|9@Zwy%)5u{*u0+iaV8fH#pOpl z+rU0~XkLR_Nw501fg;^eU1ze~{YpxFZx7K#AZ&AHjL;G_N&2~dRMw<) zpmL8xg_*_l67-Ar3UF5fhSbZtQ0nm=-#q)e)2lmPSKhYLC8eDt^A1Q|>Fht^J1oL3 zCNxtgw7&XJ%P~o9%to<#=AI7jJ=@nl2C>jW5sCylsVhUY7y?t9%uVA0nphVyo`diM zIpRCtR;p^pQ)e1-1_-B5w_uM{qWS*nQx;&7eX5bR? z!;~7DNX0=EYGyoz0g>!>p9bm94!z1V!f$MK{Q>=fPz33!16IxGJdJSVOhd5u& z1Z%y2wAK{s=Gw`S_<*|h4OPRhXGBkrjh6~o|84y|n}&z1Qf8|k3m4oE19GKjv>kr# zKP;8IRe*AW;09v<6mQ=&4|bS@{gdAM?PSOhzAv1^?I>raXyd~(A9{k zMIw$jODg1cos01kHn}1mLTu`0&Nt!2C-(E-WmUs!RP|jwVK}Lfj)olN*2}5cnp~+o zs&l*4>t+Ce<1E_JmSr($-xqxh!JnnEgsV#)eIGg=Ul<@PxDZyqkEz@pblEeyn6<2i zoNAmnR1cR2TAzATN}(@V-jcGn2!ZKpR{Ao?`U0!%{cTN&*@Ye$ND26-Ch0j~m^Cb9 zP3=q1z_{G#g_#0IsP)VDF>=+w0$c}!WR>#3gdfuAC}$`MG5p+NF;P1sGUu(C^mun~ z-Rb%JG+O5}x@_ldb$(i7RQbJ*ZyUhAa3%xMTokLFq@I(3Y3j-Rz~ZUax^uL;8ifZ- z`n9JnCR!I?%MA4nY$i^CE21S~k; z{xL|DUzmd`HE~!l-ltzsPe}OHh?#(1DX!|ShmKZVn*A|d-+-_9=byz$-K|xB3Ct_QFZ+!Z1MxPek0AxV zocql(>`}w2DKAQJ%rPhx|H6xA!b!0RVOu~Q(PsQgU?kxfjpojX_@Y-*U-tDKPNzbJajT86wtD5mS74qR6(mv6jb;oMo#W0B#88^`s!v!9`n8z5w$F zD|N9_zzJb;6TiY#cHUQ>w6J|P89Qgk$9;?o_WdOVPQj_gQYV=~X1VI#f=uS!w)(-= z&ZhMj0frgRhbGg3X*Yu;Z~FWb#Q``T!M(SEJf+KIAha%d6g1CboG66PZ7{5k*`AMV zHtiEWCk}M#Ipw;!S5SR3+MIdcEH(m4szBt+ZQ6NzHuyHrhs8|o?v_yX9Oq-^rJehz z?(Ev0czjt?k}Iod_piJk%PRI1)ovUJkiZDw$QX}b;xs&&+k$p zDX>MRnQTLd@DZ~`k-_KQ(spV=$*e2ra|a~$B!c*7n_dNuR;xTe!h0__bjl!)(jse6 zDB{$G&jL|g(6U4O^iba8(ecrbwpyXY@`jY}jGmGM{vF@?pHIi$DsT8%$>s%18#2?? z<0|X+Vd=7#t5xqP%Sqt$M^iIrZ)=!qyR1#f)MFYi6V7Od-<~k~!m045pDK+XP*?nT zh8IZ_rnhLl+=&`r=b4%HwrSij3EW5&L9LY;uG(1ImDn`_rcjEediMSzTrMS?Ju;v@ zu0mL|yEWtf4NW_f!=~>~v{}zWOI&qLdFzL`iqaW{0%=p1E{o}_s~w^5PL1ob!YNRH zB*C9ETnrY|b7tq#glpvPY|`BmAQMOQo_tkiah%|g!6@?vd>tL7Z=D-#tn)LdOIq+d>&lp%-b3i^vB+N`JA|u+M)sH$F65)9Vcu`tUiU z&)4okoQ{WO*O6C|1CUlmtuwFH#>x31T=`KBUPlOrNu0b0*{X70if!s#{`NvRydstm zZDHB25H&+Xxr;SVC+?nq+8T+5BvUtRSG4_+x&;HuY;i$One~FuN23aAOjVV5iC}zQ z3u~?Bw<%w7k(#}fzyj|s1I3KRr^)ADHQ&F-*6_jm=3M+OwlRT$dsM19Ev}_|YWSQf zYyK1I-B+~aIX?b1;unL&?M;04{qUnj1?@e2x)H*1F|#f1Fk|{4G(hHqQLXS!ZIr*f z&0BMoVO@+)r<>un7lL83bu_xFqtWl>*0_flg+tB_8bO*Pa?s}GskJ=9sXxeNuXhig z4oRt9hl+t3p{QveIf!cyK#GUxxyjQRsnwZ;U9+w}+$d}uN=Rh_0co8b>m!iOR2wtJliAv8#$)SDQO9* zEt9o@5da1^%A+M@65&6I-v@&_)R_jRiB{TM-p%!_ML~kAAC}{zWdaQ}esGB-T>Qa! zXZhg$T8rV0GLCzgR~LvjgYmKY3y*d0FK}K6K2AUFU35_DZl{zQ39MdbS&L6QaDeRE z#c^z>jOqdF;Pr&9pl`~xHS7%lJVxDA1{dDQKfF6)zxTEEHZ|mmtKPMx zVG+o&Wo#s)5!i4tD$RRYyDsv z_SOV?5$C&qACOpEoU{FvoKF=Q|34+CWUnXmjU_QRa9-L~a;m%>P3&8QZDA#D8rZy4 zznff>tHMX(^D&uj^b1t}$)l&{b6+$RXYNh%8KoJ@40AA%?Dk11Z!Xi+Njpm%W*IyB z#{3iOXYZbqX}nntC@xcQ=KYKAXJCWpPAqf~#~SPpXN z6Krm`@{L+vy@bASFTsP~c)M*^AJL(c%Q3wzMro`0oOAEAts2s^p8T{sh+8R=>Gu6~ zl)7uIic*P6q0fpz_Ol1HNqf=k86Y{cm89?8*OiTq#bGnaVm<&$b{FVIpVEt+M{Jmm zZ}lE@hiRN}pm#XXuV2v3dR1=8;|!W%1)V>xygYee+(e4K(>{ac!jz{vwNTIfvZ& zqLG-AH-F4rY)S^E8Gl+GXdey$5;qHc<@8@?(Vy2vA>bFTt<3 zhy=|(ZPiGueFbt2Rgi4tY8;<)=^wZjx_Pd?5?a5*7ptryZp7l1P<1bU zf%oF)5d+?JPZ&{+2VhE)kq-?!1`>mHB5N!9 z3!Y*>R8C*QmGP#dllo~*yP_U;DW!W`1x-k987Gy~%7^^v@PnzQZE=Wb8aQn= za=+}7W0?)9IMv+Q@Ac+}p>wdy6=NUNmjaZ2pEr%ZKQ^ETVIqdaUnURx=KQkWP(bKW z>psl~mF{KxsU2}-tf7xi?@UVWG~jijF3&cDXEh{xU520>PJUwQcU6Mc9eWc~2NxC| zH}&;*2c6ydVEc%4=^CkS>rm+gV4Li2AaP**t7xB_x5t>Fq4XKK5=R(UI8DCzF->## zP^rGJ^PuQK=t36pBh+|w32ON*BvU#%ps^v3pXiBj+7X=!1eRx}`KE}9c=bOMw069P}Ch#n|jA0H5Kz=xi zkvYR8rY2S1sj1c3GpgbB_@OP&{Xte&X|ryEd3W1A@;5lX_LYwMpSo{e!!x64qrPPa z4|~WQ6hdBWE65GgAb&GR@xtkSN4SIobw<`6ZAi#E7M0Y#8a1m@!#M=l4 z!Lo{H($CtR!o_5ql#S-s_3g!F#Nr+-i}enxO%E#q)AYwSo+Mp%xA#Q2D2R>c$-z?n zKLkfV_6I7uc%wWn`_}i~iwRl1=QtJ4n@GB$Bt%;POik?_sVM_{coC;__LI|#nk@Uq zG`%+1JY-VpQ67BOdM93Sic)Zg8;=eJEJb<)c?XmynYo)yQXW^l-wimQ_TXb=WcdBc z44@iu*X%su3vQ<|&@rUraW^Wd&jTtBn&5acp*o;OC+l7O7EMFFQL3$It77DDjA_t- zxewVhoU6-RC01!QN6NZoA1{T&Ze%!FI9RJC_(IojH49FWa(Jr-_sY^zU}>CGc<49S zCnuTao_o7Vz1qWtjpgLG$WI>niQ@Ax3^|GC68F33$L=B9nl9jr=6)gNA=s#&8P zsDw5ddh%9ncZRF-m&Zx~WmGm_IK>pf><>*d>Av6WM5Fi9HVb^LddbeJdeyL6e6=Q1 znW9h7d`EikTE;6{qx(g54)3VNK``6Vs*^(p9U}=0Z(~%tA`mR-RcWGoTiWj*jJ@33 zlWv>b<6oP_Fonm}ys1)Fc4oSQ zg++|#wX>R=y8zE$X-q<1TcD{@GE#oZiLZ{Ro>HJveyWTcje>p={6Ozl4fG-)=dpkI zZu`~W@2*wRKhEhG59-UC*YJPYJj(L={d}jUuHW}ynW%zH6*XD(2tPGNR*;3mFyY8% z@6WW$wgJL5DdDXc@>XN5?O=Kbo^%=?xH3xpUfyraHZQA2@VvyI9u!D+aD&M3;VHC_79h;~hA=gqvJYeR{4#w=AI0 zn{MGN{>EjopL_E3_WY+ec?Wk53!5|yUP<0dp5alelDNt1?Ul;B$(xkr_*6Q<*6yW* z$2d!yaTZmRl?ym5H-6$`93p zru9G$p#isCc9Qf_7hYI1gZp)BrfR+ZJfQvd5nIFie$@09SoU^klC?9rPtQbPcb6MS z1o?U5^8DuWox_fVhVv%V-MP5jP_H{jJ8Ej+K;LC?Orw@%jd1?ZEGE~>tZ}5etkA;8 zUoe?CaXZ&0G ztay2btxWkPYkNHxxVO?+nE{QZ<6~M_Ka@Lf3c#w|s6gx|(s(7@fu4$pb~brbA8cPEmTezP9CEC4jeUhseN1}{SK9Vg>l0jL% z9nlyiv)Sr|li<)nz3OzO6On|hhM`F&1JjtrYL9ZE%~cN=U{WcL=v0omR44BT3y-;Q$>#TB|=-)57;fl8etuD&B#1ZvfB3vT_v zW;HQVtynnZmP@(KZ!prn>ZtGYU!rZ|=^J#5wCXm9)y_M;XN=B4cDo1a`q>|UKFc7S z{Go`ub{_L<)WH!iE9F$uY(}REr726BXg#fRyumHiwjmQ$o_RMuVU?WTRNxL+KS9_Ys$9?|OQUugbKldkyl8jJ6bTqG zi2d1Hx2zEoTv;q(e=9FKMn87}xtZnDa4_l}zb?Y=q{8j|_$341mruPGvm4U-M%gIW z{rHG=nGflx)MI-;*l-624y{eURvQ|yf017jUDB-daqnpaqaze#ntj+E5;C}4KtVye6t{_ zP`b4pPOz4N!>?7-0mbIUpJ=DLU{ju?wmpf0ng>TEB5ff_kGrSA(&d2x2ae8p*zZ3a z;BTQJnUAX566}R-Gwm<;Kh{>i2*UT?!1};=ySEONr7m0`qEzcTl@QSHV%0RGdeWGa@E#S6|daCqEE_ctBdJ z^9ainrK=}`ddG7N@!W#{65W@`11QRR-9l_yKXh0(cLwcnQU)+1k; zk0Qn}+kq2T68K0BNQ+dY+v}=D0JsskknM<|zyf*u(D7HAZ#}m22C5OSVuRi(BN!6f z@<$#uP7VadlC7E*>uRPomL)=~yPlhERSUly8f+hs7a8?VOe-qYboqY1U!*Q*H_@@T zZK{4&W=EtA%yI@xwSwb6)(gK<<9@^8JJZqSq&*lec@awJc06ICF-&)pila{kA}zyiF!Eh-`ADW?h%))Dr&0v&~Kg*gSa2*GCMF&QFT`@BisB~N=Qwqr2nYj1ZPOzDNoC*z^l**Sb- zuO_Gxk7`5DC&zHwW{ zG{fohmzw$vS6daQ^=Q3&gjk;RF-w35_(_4ymaIjMPn0BItXk#uKInCEmm>ElneU6a z6$C%{jV2g;$t0!rop^@5B-Pej(!+=PoW~QzjItgwW!nuiN8^cD!`RWH$HFe6f|BI| zLOq&ntR*$~74$IAV4|!F7zI`An>h>TIWlgQP?vl^+;EH34Qh~I3?+Odt2heFLL=w^PfaLGA4aW=w2n* zmhhCm?x#FroTIk_+wyi2=kf03({=5($f{YH*JG&p=bX}N(LNs6Yh3o9^s_MKSAWZ0 z4;BL5IW2YfaQDO-uZk#3$;b2V{8~Rb`v9Q<)e+ZBn~JK7dUGAH2ILi-fixrLFAy_o zvI@<-LL2#In+;0iGpwL7x#$sNEsC}QJ4vG%ktGwUKQ8{BKSF1*wHCdv@A#L8t=NJ3 zoRC0+G5d=ocPxLtU&x*jbRZt~#bfN4MrpGu$YFLh%pCpL+XpIpkPpL7>7@ zTwnrmy(7Oze%LKIepOFt8|3^-?6%+3f~R^XCl41heV>jlccNXbmp^!iqAYi;7GRt` ze?`*>db`;XpO^!TD^SywI`c-LlG+MKTP_x=C~?nFE`8>*mJV2f3{~_ z0mPZ0tu`}GX8fTWp;q1tvIHTG?M@=Rwp zn{=3PXowhqT$CxdOAP3G2aAi{6BftfQuM^jm82c*NCBMih$Dulq1$!evkJUX50`}r z#Tr3je(p7Mk^sYJsg&=>yB=w$K=03~ANL6-5yjKJ8>>6y6zz_UPYo?Hu6z3TF~GL z66XCP-S-(_!q#s=8hPh72pAi3`1xJG@)3dq<{bS*oosmIeBfTvGVyoNF;%b*RS44j7bH~1rsR8h`0CmnU z*lp99YID`(3Exlk?B#WTp4F1BweC^wjd&G?j8h|qY&IG1r0vqb7Ln2y@0(k>IX|Xp zb`;#-vq2zT(K;le)P+5DpwxKAw?{ws zR`|{l?@7bq7(URv+q|{N(Ogd4Ty7Ckr))B7GO+GKjn@RF5A63NMOVI@uXn33wM$S- z+{yBYntm*(x0|PBEY9-~Hqg3(&iEn%wmUzq!GlAJ@>EeHs5!5^Rs51t;QGb$vWWq^ zG0U=oy?EUkcWKsz_ik%FKIo7YQ?k;zy9(=%y-$`q>mGV#!9oVf)aU~rbNeRsA`|Q{ zhQ`pg;u7}K(Y_t$Me>u(E!?=K2s335oeC~Tf5 zOl^sQ6Y(mo!c&?UylM}>>nQ7{m+a}3S% z$<{+r1PK`#dz5#D;kCt(qNwD^<;4d|otPT#n^|Gw(KXo8`Bgvn$vGnvI=R(Fd%h}R z&*-NR0Wi4gUNwtzVXhacYM9O{jG}Q27j1kk@ekiZIfHu^J@%`U`Rv%^Bl0N1MpH{p zjNhGzyy(b7^BZnPB3KPG@Sa8{;hi~Rg0E|?XGi?y?soD4tmEJa=S422JU1(P}{KSM$%u9D7yf&%Rl)R-%sI?BteNHIrii#Y9KC!-_+eL z3p`v=aKIZ(aEBkSVe*ab5CmgqsnGGHC9tAUzb;QTdEJ!H@6zhZBE|Fve`!RjBRx3rkyUnQs@^^=?##RkF^@#6SO5J z?8m&c{8KInEzkbcNn#tx`>xfM>rRLO?ZNj|)V|$6Oa=g+_Qg||5IT;TRj z>k7KFG6`J3L1R>xGt!_IXo>1CXqi(pB%kX{;}^{AgO8t=?APx2@@--W#SEMG?nSQw ze;JBxQnQE5So)Lc47)I$AQR%my`thzbYL#dv?p{Iwx3PfewBQdsO72h!Ku6r{%L_d z#E2M{89%)^skc=-#$P;Ru^Nc1YwigWk#Ik%O{oj6t~@!fiv~Cw1-9GbsXB%xrgE#n z4AW&1PUItYrD>Ls@RU^LLpsMlEHv{IbAB9)$;cXK0RVg_;OhFS>~Y6sfORWrQzd?4 z)Y~ek@Nnt@4S+iD3HT&KTI~am#a>3!hVb;MBzl$e2_Cc4Dd4R052(HZTcDeL}xncop?qozNi zJ@n(gJz;5wE6FzA+Ldhj2sf_v3fhC&S!^k=sS4YPbSkm< zs-K@^|8&fIB*81oh)43`=SJfL^8$hsNo4<6s3K#pPPQrgi=w>R$mR20ra%Q#RbSu0 z8bxafWuA>K(oshJLxK%TBj4V7%Zh~e%;DnYb^w)JzkY~Q}`FZn1PDRK@|Zn95xHfN_JFPRzapA zaHCS+&lmS~w}RyxajDlz2lN~^9OG=ie&}~PNxLD^sf`k|FE>k)V3dpRR>D{8$Ih*W zR^QtD{#Xo=yT17|cxJ7Loo70%N)6&9*Ryn}7taZOqnevIdT;<8-w&)he;t3|ZXMK@ z-;c4dvyWVTpMwzO@-fvqP;H`19R2mCGh}wb^SWQ9T2HY_mgi4WL^KS>0aa-N935V z$_#~EpA=UKY^&_(s%kw+lpgLGFp417AY-(0G2k65`yhmwAZ^*0;#-vK)^qQVynjAt zj)(XpwCuIpe*t8w^b0Ql73h+cdL6yVfUA-Nu?GF0hk`fB*r=R%3s!lC0`9EoZf^DV zUc6`?BU#N`@kW*%PQZEP-fcNBdmEBlmlBK}rTTB%D{plnSx=KoD$2ta&fNXX$E^b) zPezQLY{6!q<}Ktb?9IW(-VUnWgt69h!VZ(_azKi&W{G`+hTy->779YyNDkU_nhUz~vcQd3f5m(HPyPf8?$Gm`c;EXh5-j*D7 zIH}yqfmO<5#c#)OZ5<_w6_C#x>qVzOv~{YpUWPT)g0+05cYlh0bg5GqsrYP~X&F@j zpR3MeJM)G~NsRV7IW#?WeQ+2kQtEkHu}S4pK_Ec zc~ogW^HDy_RnApl(0hWW;bkWTH4llfTxlB_kRc#=i{iRqy*76mv}~9Y6Q?BR=4RaA z!1HHo-DH1T<@3cDHUl%qwRRAbQ4TBY9l7AW&wx^L!KbbfTrqWrYOHf zY0FJ}kgk9E0a9H+-2B~g+?Z<6Gd=wZ2ip!tlh7+ljuk67K6A#&!y-X@b@v}tyo_G4 z3esBQ^yQu!u*O**lUFYmHN)l#yqwJsT;kgvz@kC+g(Fp-=)qLS&U~@I+gol4e z%Zl}AD*GvUF$qcX@>+k3Ur6qqg#8sH8ZZCj^l0$^KP-QeDsM_R zk3IWW3+MiZy4}|I$?oV5@_#8gKUA)`-+#MqvHZ&``v0%=|L}L2yWT*Pro+kRAQlod z$2bF=a5w%x>d`Lb&WHeNhA8Uis~+P9u@B)NRvO48njW_g_ZCZEG@SK`U8|Aj?$}J7 z8SaJs;>GV3OgAQw0;&!h7BjK79suZo{+8G9u( z4K8VA9j8K}_8PcqpZk!b{?A z{ay^Qw^?cRWnwkITa(?n`!66CR> zqnPr8^WU;CpPvE8>%?<#PfH9@9mbzc$Sq~T93Mf5G1U)y%Y%+>F=&9$<=a|;^VIa? zK_~x8RoJh?&zT_}R69BRfP9|zf2km!#}Uy7X1PtKV>lnAy{>(!Ja43>cBe9TK{Ht+ z%d|G(uwyARGuE(^23p>L%06;H#r~ zcR#?dF<~zJyyr4GYOr3cp6ICPGiJP6nyawf=5YIBs6_jUAQBS`q1`&vevxT>p77_= zw}lS|HH-Du0#Z{wco5iBY2mUTUyaRGs&@(0c2QqvCJJzg?ey{xUs>QFczyLl!k4T` z;k%DFPk|=$7e<>KF=_vE0Y5mUJ$ADw2zxFn=yV$&fdZwT`Mw_93CblDkp9|Q2}dmT zLyIV|+l3VLfOLevu9vB$%l;%P7S$2%A&79Ber4)riI%bMA!-RfGWi75co2YGgOoQ+VtUC#w48R!E1K-fRK#1R81VlmL&<;9E2Z=wR{|OhwjTTXW(oK(PeqB>-EyV zX81?qwe`2vRZ1yOO7-d}u$){eHdl)UZ-dGAFZm{szF~V-_|u|6HY7i3R4z&_mXx%3 z))SdRsHb3{7}iVEA4HAbXH&uv1`!RN1M88I>^$*z=7Q8ST7G$N+Nn;+&Ffch1c2#0iA zRL)J9Nl~GTA%Ct$K7A3f0?ZOXB*K`>wD?eqQuEJc5!g*~=h9msUm~K6T{4$0w^OTP2b(uj>kCno9fix+$9yGdANN{KRzomu(p%@ zI3>}Im;L!!cg7^_;N3#l*ICx)1N9ra{r4okJNO6%WlTDAl~zL5pa%+CvIS%^ce&bU zsHv8AR>drEmN9UV5^{=t;0u*Ppw9p?mctPy|eG!f4(z$-*?tb-nHJ(dcM!I!Zg(tC~h&`0ssIM zN{aGt0f4J-0DvnhH?I<}G!g>mA)*OR^SImPr zC@Gm(C|uhX!(%9h7)F==B)J>kpgIFYKR_&Ai!ZBR3v&$j;u%qe&jeu5EA?m6bi4-@zQ~V+o}Wq>24D zR{%0|w&RnNPXU1SGm@JCK(0*g6~H6e|F6r3^RjmhZhP5=P4?uA3y0V_!d{o>l$!A! zkK4Zf=vB=*B91p4xb55n7)+Q*r}Sv$K61uG>{iq`;& zpZ;Mvn>A_lum??n@wlyo^Wv3jBopY4qv6c7kD(qoSRuFtjZ~M|5%@8ne)#%b!qLTB zaj}5!=SO=Q+`ZBIC59;Tmn9`R!(fr!^cGz+jGe_CcxQ@SNF^_S2RlD=F>N6f=wU z1$@s@)#%Vv`i!kL3qgc~*^ORehb`IT9IBy~V!tLZK6Ugni95pWm<7DGa97Ut&~9gi zS&-|vFOn+!R0mR6XJ&Vl#J-*5zVtSi`1T`aU3V_Fn{s!j<3;oysqI32O&2&~Wl@LN zuF=z0F>#;sC4%&fHKY&$>Ak4wog-bp6v*0HiWTt^z|Bm`EDRYS3g$h=3DIlxZK7 z-^VB|;k>+)Mq?Q_PWiE4nVeU^+$Zc4s^Zc@?L&NFTg;YM^P@Zway02@_a&EP=06*z zzx991CSy5^AKkc;V(LQceRHb9i4YUfN{CEZqJc2ai61WnzPkr`$m=~=?4F*;kQt#u zP!{(fV;ZrYbwWrhJC^qlG6&4xzCCQ0Vzc&tdnB+Nu+Tzl^qdD-&Zj=RShM~ z(TQA$Ah`r9I^fiy>@R*x`o|XzN!EtOgP8Ey#iPEq;9s8IGj;lM@ZUq9H8mO}*!?F) zO>D>l#CWT7pSTYM3ur_cR1|0>GDpPH^)v01QZ%Qt1EDMNRjX6k%k~Fu4r(}TaMTVP zkI)>R<6fxkwV8ee5ia_}=XTG5@lJ-+0?xq@zn!(S#eF_&kRFS{gr@l1fZwW2&!XlI zYw`Doov(TOOYQ1P#%H_3$T`2(3jO{RydBQJxzEwAcV4#fZX-E?#4GYuIGEY}_Tg>6 z&gu$3r8TM{wN1kFiB(>aS%B z^lYACe7hQ>8G-x<(~I)aCYs~VUHj_e78kcyXx^Mij9n}_%@vHX2A-@hHYsU1_@MAB zx_roh)*;++tLw}ec&*i`b#othQCsRc8AIsbz^i0Ouj3RQ#pBJ4icgTqFCSYa7V`cs zhd0aik3ollSP;$>L749n=g9E9r~c8EedjCF>bo^XZ5tsIYDLNnHc9W>jFC$~7RrRtO_Z)^Z97p%M zKBWOmi|P42T%yO@w}0vHs6#vvdo5fTwUm%=1&*M)8>;ursAjyDN}=R;$t@(kg$t`K?GRc9B~je7^vOUfvEr>!q~p zojqALc|)ilUBAC_h_$dKSPVT_YuIB>kmBmukGJo-0)&hkwbW#SbW|5RpP04({JOi2 zE|YUOFlo$mFLQSKW%0yJndo$ z5)Yohj%&PYM4xsTrkpJni*M|-sBf%8=4jQrS_W-RBuv6_t7r<^$xyiGrxtt?O#{MMEL1;PlOn2QEOE9e46k z^}}A)f-pzvS<&O8$gAHVYkUXTWD~)RrvmmfpSKDtWsPn)p=v<>3a1TEdPI?x$Vm3B ziG%1NNty&9gtxlvekbD<#wD+TkxMODxC!28JjN$E3Dk$d@7ds6Ti_oLEJ+ex{=#n1g z?xY6sfKjz*v8ZrgaV{8i@5XTtM_!ZqD04qj^f;si7m(E7wv~7CE8DPFq-;*ur|VVS znRgjALq@fvL!3Ir^Z2+jaY=_sz~TTb`fUKKn35qqL7y7>iVvY9C#f6oZ;#6+{>es{o^20pVF}b^}cgb zsBLHf$jt0wW!mgUlpg2x!=z(P{^((*o?FVvB$VtA9n^J3Z+U49x!rGV;$2!^T;aT} zn>Ur&kM?~V0pvo|iTGPOmyW+7)Fd6Cn^a;j?zfmi9E6I7)ATGn!(DDGP9}M}5TH{a zv&~#K$_K0$9GqvS;>Pl8cd4c9a~nJi?K1Ney}{D2nLVH4e@w)=Buq8Kjnl2mcu=>Z zbDC~NOL17JM82x|S-y8^YUc@y?BxsT`uWqoO9v!ha6I6o%s3U6 zb}hsEw>N_WNc~w(=U4Xf)?T`)>m88-u`m2E;7cJ<2(l9n@5}yfzLJ+R*P8?d%bD|0 z(kz-uRXI2+tILeySecZmR}r;2xTNv7bNwmX<>Jko^h30ZF@w!qQV(G=NpK-ov(a2F zhk%n{p6#2FaKA*vr!Wj!&MY#C=J)f0)OuIg0Av`lp41Y{I&Ee5ZA280&-<1Bk(XG^IHW>0^)sl1Gd{PAF@gH|u@od*S_KmZEIRBY9oh zS8%vbZR!J}9b|#dx4xXouo}~Zi*ipk+v2W7koZ^vaORAYHjT9 z=xH6hdpp`h(yO^zByx20yzq8OBwv?$8cl#8bwdA57wR2r9MJ5_!b=C|p3vAeXG0;! zm6%24rMUZf#X-UmgpEeAG_d^J(b)=6H?uB+yOByqwWez;vPbYKnU;3w(>BeS!pM0{ z0gD&^rKW+?^LNaCgqBRjaxZ^tUhh~)*|ITOIRCo zEzN{A_^NEyk%ULKOde_T8nLRgRa)@_c~Hyb_h zYh)Ar?)0vvW-lqpsB+w(^gAjfrC5&w)o{A`J!<$98sU8Tsz6fgP+h@!z%oZWn-URc z=sdbQ+o<<)GqmAm&85uHP-eHXYtI%mC3u+Cey3|Z6p5r4z^?Kg2(OkW*5+SM;tZ$Z zAZmJf`UXynpVxw0D`QBqI1$3#N$qcM7gRLCtnj?8U=^fT-3P;ul%YNQ5h>}+D{EWv`i;PYLmVk738KMvuDGQd zg@qhVH$UbNwEtF24ag z9gJiB`6@G+D~~o)vJrfx0P(pwrvB9g;NsWGuZ=u`8*61V<34?={>4?E9jH|JFiU9W z?}>X|AjV_=hSo(PP6=nHi}(}W(r~Ee$>x|+{Ky*#ydM2wVdd8L_B|0_njeAx;RPs^ zqF?fOQM;Z>BZkV&S|eKn+J7#PeQcSJ;5Q09Hz@02SX9xQ0)Akcg?l%}(h>{13Qqj)>IAejf>Wv^*0)hT8wE zNdo|=|M(BP@_*8iWdZFF;A0sOdNzWAC^LDI5x7jU2KRx|*hbjSW*S`KLty#_Hg zPfm(lc_Ju)dP&>|f(ZlA6?-psD0YpDx4Ts6mc;cMPA?y;BgX3bz|I_{gKy=nLJsW< zed`sPW?*(Gz4RPCy)BD#z+e8#5fBnzGw_?_1@EI&dU`NOCoTo0x6NI6l$^5PrO_ib z$+qL^=kI|Zf_x;kc9zofXuS9+)^P-r%TwFLL1C3OuTMe>uu^Xc-RXxi+IrjJr3E@y z$fp=9u0Yb#(z3k@DPB*K{yHgAKaB~?|8+b^Idoj1rgrqn{)Q~Jm0eJoYZp*ub4C=E z=7x}zmIaOJg7wHTsEG5dk>=YX-(b~fb=5?H9;K}q8VC=6F|8mM5=Z@ONI9hwP*td`}N*6Kc`x%(1%BcUe?U!aaoEv*M z1HM7wE)3Kgy`_M#?NK;;ZI|6x7Meq$?SomRl9y4wf3YnL7kp3d3w^dz))yICdoL9V z@%<~|!*_-ruQZo0is5Nu!*bXS_DYX$EwJ50J=}|8o2(~MWkz1x+Z*ij8xu>_e=L%f z?Eby46#aUpDr%`P`gO*g+lM5~Q9^RAZRg9D0hL>vjkgSxpxUq1#=4j1V~$KD^O5uO zpe`ddlIj-{4xnsfb8naR)Hw9FPVoV>cmK@Z>7+I;V|yT}*rqQdO%ugANHfK_PFu@l zzbe>-vWh$FSj$x(()NUxJ&;Yx7)_UkUZD0v%et9o2EXjEUsw}1?^v4m1rPo{Z%VZ; zuxpPh>P6*Whjld2l6({=I#cYaYHyM&#dwZtc)KQ!$B{e9T3ziMQjh8(tDgq?$5loX z#&Le5SP7@|wy&&MuKI*ER)>ninpN@0NB5$HoMpwYAqI{f_8Y`h+PTJ47e^wSPlTi; z(sBa647+4cy{EIOh8^4vzj+TzV>ah@^7ZG0p8KYqtD$F;CPhJ1e5wPc(Vz|e&OQ6} z%LcJ6c);YeVJZJ<->C4l(EuAHSkUWx+D1#}E6|gvRA2N1t1{_oiSfaK4-^#*ih?Y& zwJVCfMa{Gv5`Me~caEMR`S}FNB<^=*>gNP)eycfRVKuY3Q>H!Mnn1In+3Z|!EI}}EALfWBiT0mHFh|b)84<3*aeS`uzH0=*03|hc&>gc@U^7X=8u2AHh$9t62J%HJ=Xt?79XUxI~gBLT_s|09SR3D`Ql*rhXDZp zgvWhlraMl+BC~)QbG`C+4ZeJ1UxWZM8Rp%Be7~kzn(No*&8S#J;C|*Ug{CzU%0vei ze_JKjq<*5Z^`xBn5*s+X|K!i8%w<$VWvQ*1tAuI#I`AL67XO(!CLfky+_JvV+d_n? z%-rClS_C{wg_XWfA3XPgh{Z$3c&+68E`>jL+21!@_Px-oeis7~e@Fos1o{ETe9?b< z>hT|(2KM(;2IiwWB>qWZr%1gSlEDXxCBRj1+e@6iNw`^xnVq{arn&gH7a|) zptF=$1U>DG2L2r$!OhoKJHM60tz<2APBfiJNIJ_7FRYSI7QpRnGmmjLxr|Y^NFUcd z)SK50bvW-ktE-l;3#Qo%wVlevbf$7mTMJNZ-TZnP#uu}fcnwHFYbGW<&>x(}{hqkQ zMKb9*)P(C`vfbiGk4b$tFxHZ6@~HEQ#2{QKs#(ZDeA!HALYVrw9#)Cy<-zA-IbN+j zTGeN2suRqZjIEb3w#Q1@cueenZSVhFwLD*uYN>l;Bw*DNd#T*{RDgREh%FdkmF^?r zMVjY1h@si|_pxMZehyQ^+3hC!^r)4yhcaAI7T>>(jE0z)Vd{3bJ1| zI?Pm77X*GNSTZ@b;6_eE`anIr(h48hh6ZH7_lMc|cGPHvb-7}L6sDR^?CO60oQ|qV zzHMXeJvt>{*S0%9DEhSFaimv9gMjWOq$5?e^1eCd33t1f43Qw86rqQ=$$HLnkIpBz z>f)t;Md}1Q+x$o?q zi!mZrzF#l82`}#l2O8$u|`@3Kz zI|Bg7)Tpek-kL*Vj&MXKWr7F4_3h6EKp>PFM49%XrLSz-@*19kV7zklZ*<$;xl?M^ z+U0rCZt8-fV#~aJZ;nr9$`b-1W^qolW5xRXW-TSK%@A^W)%*kYKs+uhS`B1og0O3G znEV?ADU5Re=*{6gl~re>3j00O&`{ROJ6oXoA}QdIA|7T*xV&J8ZVU8!JN@`@?98-)ZvxWl{mGa5iPokwS>k)_x8V!jB7nA?2=$xfMc|OQwT}HK*VlVb{ z4_mnY*lOZEscovCXupzmkFy{Tcs62F(>|8lh2PG0p46PN(2&GdEKOadMmC7V@RQm| zL`;6N@mS_E>)E%UW{)|;8H1MNxb|aTO<-un}NHX4gpL3xO?#3A!uK}sNV&$pmge4+}2+Df%4Pcs}atXUz;Bmzme-D92vs7SrsO=CaZ*zO>Ltv&71!i|fbx&2kj+EvP=l zMN=ZJ%c~J>IkqzL^9?1QDaWY}&M(t5QWL?4DbzpUr`JX}IYOUMaKR{S%teaDkeOd( zDuH`AzEC8?SCDW)6kURD9r>8crd@Z@DrCs>g>Qct-NN!_$q3#WY+KW^ET}zx`%X?+ zQ%>3y=J!GF_GJ&q9O=13w0_bk1eb9`A_i0!RIUiR;(`Hy}QNxJ())Wm(2*hXKi z51bNLfD&#p6NB*R__`OhLL&YFXZRzCwh`XO92CONcB*~KRaY+UyFGG^l!^?^T*^p{ zsL?H^j?>wJ7m5bc##?pi;$D|Wxc@cK9op}K>V8W*Q^?H_95J7N?A}!-c}n`sq|vWe z4oZHDV0|{glTd!sFmY=?;j<(mHzN9CeTDRP+a~dmLriVz9G0ii`eLP5A40gKG7@(z z$fbIqqm`O(qo_0|X&j9COk zm|y6!?F=t@{Zk{-*br?Qz!1&Zukx%V+D?m^()LYg2;TRMs1HwD>R&FoRG-df@Tumt z&ggA2oOKBnw47Tif4S@|*Fx~P{tR}tgcm~HS$Y9 z(@H!(P{EedeRw2}#qjge`QM5mk!Wl=-`oPe1^OLgt=nLi#g(F`{a*>^<(Da{7!}GQgFZLpWm44n&gEJ8I2*d9qd&U8k_AQ4+1n>-YOXD$3V!B;a6de219Q z8j0J_;8&5YcTgjfJ~i(Hhsx(pLD8=jr{#$gUMQ_UUgpDrXjpMK*X>eIRrQBzL(fY6 z%k(;Y{Y^T}TD?zTL@MY8ee>E@q1+$F?Yck>-CPU?Dq)}Or4K5-0w3q_BtG5%nKsr07LS#-4;afLh)bJ-m%2cGx7KDf{s z$9&W)m`YA6RXg|d%1cW#=?-KWgBj?-K-_-}1=S5TOl%#EBm|9CTzaozR6muNP3q#imTt+4_4 zZp>jAtD(y3<9ov7{=aLfq|q;jB-i_c%+e(*K~;{?;=({W8>{g%)r=QCN)pZBfea0` zxpzlrUv%t`X z)>7z}|K4?KnFC+16M-KjfUSl$T zIJe$fAc!sSoxvDStXw>w>2sI)AK0={d|NB@a`IQO!I^B3JpXfHk>u3Rr<>)WVF6Zu zMNbV6`flkYjiXsJG9+~g-I&w{htBg!GHW0`TO>%Bq+*r!jwJ%m1KMUy9g(e2srh)EQLp1pIpS6uER}^-zXKt1+VS4} z;ET}wUEzIOX*H!N_Qi!~B@Xabv;9rlfq?gXP9HA%U5yu`i{0;-pze(I}1_@A!F z=jrq;8erNt3%X;-t+3dx-5-oki`;R#ryZWhp0mnSaFJ2dm!*)s z8Ex5vPL}7;zP~bSYEi33z2sY!)my-w?+JRHd=QrkdjIQ0$PAO*W_V6uCyehuCNDLn z_3-es=*&#+oFAKSm`m;%dbW~$CZ}yZykyfxk&Y-tIml>ISgcf!?w?)!2X`C zlNc<8fo*qYA^Ws1ea;5My(JZ-MRfX7w4=p?`*5xH@)&YkouC*w_7 zZ5eN*t%(sskDFjs1P{f`fV*C{_-R(spk0mi8WDO_4lT3( zrQ04nf$$TfPLnGVR?bIq|6JjM7Z>?`vI#=IwK3Nk*!SsXX~k*qMX9-{JN_QkF?&is zmGP%0n!j!J?BTbW&!YDGrr9w@FJ5rFA2j5JnFm>l!z(Q`tt`~{PmIYkJwwPGUs%9z z0FN_&D5=z9zc4_18zOpk8^9|JW*Ui-kUTmEXX%SMGHgC_x4ySL>!x-$*i0j8oQ~8N zFG){*i3-(PLa?o$-{E^tr=URc71wHgkty4_YiOSJfF@Y?0v)(aNCFm6Q4Ba&Y%$wb z5-si#VOxn%31PdxzH8k6nKMt^RwLCiruUnfh#t*f*F*jv^j-hrw(kFM_)BI0fIw*A joZuuLbR_wsWUc`UjjYypQNrZJD*&a}>hfi;-hcWZJlmyF literal 10499 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 OP>@lTE`9YT@ZSLW6eYF* diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js-snapshots/datagrid-virtual-scrolling-chromium-linux.png b/packages/pluggableWidgets/datagrid-web/e2e/DataGrid.spec.js-snapshots/datagrid-virtual-scrolling-chromium-linux.png index 8779c63e44490f22bd22444afa720799f668cbc6..c90704cffed8df83bb003773b8463cf9f552a024 100644 GIT binary patch literal 37068 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 R@CnXiQJII?51zmJKL9jmE=T|X literal 36833 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 G_x}%|$$#4b diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGridSelection.spec.js-snapshots/datagridMultiSelectionCheckbox-chromium-linux.png b/packages/pluggableWidgets/datagrid-web/e2e/DataGridSelection.spec.js-snapshots/datagridMultiSelectionCheckbox-chromium-linux.png index cfee3848f63e9191ee93c6a44d8371d3358ccbdc..9b931a8913d8b9cde7244eb492f5c4283f3bd887 100644 GIT binary patch literal 38241 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 JF6*2UngERM+Q0w+ diff --git a/packages/pluggableWidgets/datagrid-web/e2e/DataGridSelection.spec.js-snapshots/datagridSingleSelectionCheckbox-chromium-linux.png b/packages/pluggableWidgets/datagrid-web/e2e/DataGridSelection.spec.js-snapshots/datagridSingleSelectionCheckbox-chromium-linux.png index fb2437d04ccc94d0b878ae2a7b318509d8202a2d..77a5633a41afd84526c95a8b4bf597e3e4fe8de9 100644 GIT binary patch literal 34407 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 literal 34699 zcmcG0cUY56ux~&GMFABobd}x(q&FKNU3v*kdhZYjRY5?ig7hw(5JK+|6s7kPI-$1^ zYUqSq!0$WvdCocap8L<`pUwO3?Ck9B?7s7xndQrSB^hEON+JLNKrH+2tttR;FH69C0RHpK^5wmo&6g!W>IvZ5Wl8=KaObjo zfBiobu<+s?K?Re&#d0C>S`?z9l^zlwJ`8vrq|pe2W0m6BE?WUQjm+)$bD!HSFPj_o zt&2N*Fso!Jr8k|Q;CyIkX_>ERh>Sj%tGr35LO`uKQY2rJSMZuq8?Y^Grz^@_P7&ZG zUiaq?D!#ff7HWqB+ubvo!YkROUSG)SW*z_Nvoxgg-W8`CEcgLNwKbMfnWdE)w=Q4# z<2zC?T>W@<*Z-?tmzJ9f-Z9Wq*Uvb9s{CKZ&U)<$5CrGrpaDRjWZqa8oAS#!8U0zoh=NLKvU?g zb5HF1_N`1baNo&#dAZCi1e*rH@|uq33`>IK&N+oc~l`>t8A=i2f__Coe4n;d6rikG^?LSBrzyRCaKp3^{h zXCesUkG#Nd-dk40f<`y_m;|hJCS_^pPDkVH)R;HU<)S4_{I1bzX%&LGI&$akl zVMs$SdOvzP@ng3cKMGM}AHReHGkTkW`7poM(4*8alsnRIC{q`?HZ9Yzu3^9lFPz?m zbav`-^@#SSqEW!fR|d+>bfqLwrUGuYax?2xkUaE^r*xX6z!OZ_^C}ew5uuWRfV*&R z8V-z~V#3%7YD{EnKWXPffL39kd*Z6+FPn}wws37Z9S9O~9Q4;6ag-RiP#p*m|l-_N;P+Z2(?uC`Vt>FFaG^6UT1 zo}NxY*C@q+s9UFnVI)bV9nLAe!_ZX{4EAhxQ>pKpTu4IdiyKX?qn6q@sb?XRGd&Iq z=SOmAI(?bii5R%$4}H1%DaC*Ch#ozq*7E`C`TBJa4-Am(Cc#r?Y>=f} zh`?po_|_NLUfOR|`GgXAy`+x|P7o?tpYr5RW0O~}ub*?RTKWkml5PvLjQJ=DEni3Y zbQSP&K7^tSmYQ3Yd|wIbTSp~NLn7a7^aiIZJo3TjS`Ie()aF=(LwKWKgFrTMb!*kd zqrr;U*{Grpfx06qJVQUhlb7F%-Sec7cM_;Y_5(PPBWNxXKa+i{`Yi!H!3G_>mSV~7 zVn3Jjbtd1@k)C?4BysOz%*bh8m$-SB_%q)1biomghOtQ9x&>^{lug9yj-y-IBL12a zhUBqX;3l*;g&uS3k85>~hj@E!puBlCj;(#Dm~gxwu$0F)QiK~ZsD+&wV%_iMtjLBP z_PRa33;m*_qyifqe%Hx^tvPeCf2O4sw}pFb4VCc4_#XX`qK{`5ADA9GpM(Rw&N2Ie z{n)lBX`q*vsF?GwGR4$1#ZKyJ-jn)_p;414`>`fWgmR9^ym_;*^_g40Oi5c*T9cM-hy#O-=)a z{d%WFnXC0`+`gT=J!HD6BP8l{13lysikx>KWmrs+UmE_QJX#t+Sy7Za5}}J5jg$FN z*7>vEeSDX5hEyJm`&n_6T4gRsD(Rag-W$#>=*Pc+j*?tI*%t)TDx6_rMu&#@%zYZA z$n$>)-qak9NTxA7gsh`A>Rb!n1V?qKQ4T})cG{nsNGAKD!GYe@=KE|wL0IB*v*iwW z0I+)d7%d42@_XSq87aPtfgj+QE)|dbO+g(h-re5Q@-D|4mmDsQ!;7=cSeY)w?WhFm z0NsPY;`h;N1}Woo_qk=p+F-)Neo~E+Rn=SL?nl3sl}M1d0~?zIict>NXItFL=gL^e z(*hA2MjhHy5tp2LPv2o1LthY+*SjjK0sb}x<;`k##*~>d>~!iYyz;iQk~4I_c^F6x zQ=)->wdIhsS>Z6=S{Lg9}q<;W|3fGD!NyA_U+w=?6HFu*)bejqS;fmvyPL;S50 z-1&YS9g)PN-IgT7rc{2Zrbdw8>@w%%5{4a_cDPS|^&x(?zgjlJ2h##lV_K#|qGrO8 zxSxR;d3wi!bFIBwqpmj99_dv|$Yqjw3RyvuH(7Sp)hxIzv)BryN}I{`9}5e6zGaqG zfz*C`t%`HQ&n(gxhm$jRMC^37PN7pIOXU%}`$t+2Pe6rLA?T5B_(#ICU{@wdZz+q;@aftnX{X_fBGfa+OOH zAn0_vqc2P&aU!-8vcGfdL=RB}9r0*=WJk4BlPS7D}a+uhNrG%iYkyj@7!+}vD8FiFry z>byE7IQb0LI1PVwkQ8(2KH(pw{%P8Pn^*n)3F;8tYT_-(-MKIg-z5*^5r}nouA@%Nd$RK~i zw*k~Ps`cuqQ>jT34cmxA%u_rnByE+Xx{}SnO1!VnN#5s}a|#Gj(0rZ>NqGImdOc^2 zY=e^CWSLVZ0i@_-;eDm8w91?bQmS|ognshz#PANGfcsup`k7N(dL-$K3IU{;;eZ|hhq`EXgmZQ6pC^*g$V@M+38~BTz!>+Vd2s`-NqTVu}be zm;sNii3y_T{g{!Q%>|jjs&KB^d$mM^$h=g}EA+ysl`4_D82w%##73X9X&(>D6<9V<^L2uaqB z{~qvLEU4!`KMb8Q`}%_NbcfE51<9gcn0@B(U`uXy`aa_(O_9}TZf$_3iIrJmT+#tJ zo&KOUhbvcj%l|d`N3QmJ{&7s_(oD+vL$d5evShnIH{(5lQQ^X|Fe%k#4 zcwYQ{&%Al()4so^&4Na0cjj|35(1zXYFh^73MyYY-kPmQ++!l$G%c^42T+vY-qv$pO3V z*+Bn&aN~1xePII0cMWf^UcZz`xJ?$9l#~<~7w2SXZk{W~a|*wrU;HLp4d}ufo0^*X z^=tkWZl!2Sp8g8A&gvw(-Y%IsOHNBm+uzEHX#Pu|T0l6vfla4t2Y-KjHH3E27?S2F z0o)+|-$yz%(q>XqhwBfo=*8$S9-XIrY%z=kSLiqGi)<7=c6A(H@fQv6=Cxlpy83!G zyF6dx>L(3qFg~-mY}@R@yY|p%=N*FaYa7c znKUpb6_W0$e}|Y5{>ciDOQVyE9otzAE#g@2-8{6epSY445TgRX(^i5@7B|NGmTLon zofI`@Ve5bEhPE5Tb4Wt%wK_Vq@7c)Sxi zwU}iT?q;Gzg6B11>q$8Dsob5JIk+kMAfrq07kvza=WQ)au_0`2@(p&P26FvU)&`-z zDSWZ{7NuKXK+5U0#iMykJ_Rl-&x-ZFoEyFKf+D07NLX3tJY`oLEI3A%Efy|R3CUJq1xAQl~EW=wD3@Z zuEG=DKno+$@&5GC{IYNELB48$azc#+s`b24tt*Z*u`OqY?f~nD^8zLW?qZiCQOmi} z6QWsyD^Ro__fqgV$2mCM(&yZm3Vc`wB$wxI!VDfUmJ6A^-X$1SiaT);_^_ zYENNr-C1RitW%89<*MULM%a(J8*twb$n|adu~w(TUwNef1|b$C%~ENdrRLKFijA9Y zZD@o=b9ms_bS6KsR$LM}m5}+OSQH&|rPIScInYvnZVWinl8qE8+eMGrGZyWBj0G=w zy{a}5L?YDc;HPNMr>Rq==TrVkio0&!SBjf9>7q|qlhCi}c?y9s^H&K>No+}SKVbmU znX{g32kmSf`c-;%v1!;)5`+~_WUJJlzj?ILcx1#hJpzq66$HC!W|RhRjeqtv)3;fs z)?}MoN8Ct1cH0`vSBi-bkBV~`&grUG^Aovu*bez3+Vo-BA5__QS#VqaH z`qfka4#-gd30$4kyG;-7&Pfb`PWUaEu~s`lU9}FqB}ZWLr@O`chJ_PlwP*OfjJIMd z+ci9zx7k`PVB*dWu90mQN(X{jcyRS??%fejp-CnIUVOd-Fv*pkjgv1}Z5m?9Q}ee? zuC&P@8{Y=+z{h0y`1Uu_%`_na`7G9_p+s)6_Sb;i!e#WYLz+1!x%Z1z`A}2i3C#sr zxzMO?0Sn{7oV{1OeF%CJKj6URbKu5WEY+uH&cJ%|hPm>Oh7!ZCM0j>}GtSESo?HHj zauE@lNlv<3<~;nBM>L`_s^J5n<~ij8Wad7WD3)65Ec{wbkE7Ku=My zX2=R?BV{tHiD#8@6Ii+!Qi?@j_ah#C;x0mceQ?L-jy{NDUUgQw^y|3!_UR*K2g8Y@{)qjqYNUfg+%HgXvateuQ$G*uwzR#L6%0G)K@$ru z1SmltZjjbhIjINOMnLWX&55698=~YQe8BsgJlUYOq$Fm>*&3)z?zB8ysq(}}!VVp( zQ!cp=<$f*bPxNca)9&dNqMB_pVo#?rj;UoqNYpQYG#AiTkT=mn0H-%dI>F$AI_@2ByRO5 z;8^rv{e2g#tD;evB27oF+y+J2HJbXM`rtZs)Mo#{(u^EzbKKY#;lArxuko4LHn>LI zB^O#}T%(corZ2b8*O~uvWaQ+!{#$AVDdoH=)N9W5U%z$!fxOm?ln;sBmE0)LeXR&G z@iUT5|62JlRYC+YHm9Rj6+IM?0T~pD7nqR^jg$p1y6K#HpZxg>R(8;g5Twtyj&maM zdSr2$0xc?Jn@;-P^MMz5cM=Uh5ZTX{+%x@3PF1n? zPTj&#tL00NpS|FLAJ=5A1!sJlxRpnS|tk&Q0X?jU4JWxF~T`6Y+@_>h1I5l^0nI{gFipzZCO{9>x5Zq+h|2_J0N6MeJp1cctoI~npz80%r@hLK$^H<8Nuwe2;&QR9Vk zanBbLPlZpj{L<^zXN^v0?NwDnpW6*E9}-YpE6D{9$+b%Ss_VjAkgSdOWv@J>;_0t0 z(7Hitq48@j5q6*rVui6QiB&kRUwFgRA*20xSY1yocbAdS{B#0WnyRf#0n?~rdW$m( zUfV8c2q&50I4}DoOTU>{1a6jxGvAXq);Y@^vE8Nm`gOFDnCna#b>!at?U7C58G9=@ zNM5zOgXYyeno1t8!xTXU7_$5gRt78}gA*Rwy5`rC>#~=KZ7Dh*p*Xz^!Ze4);{amb zi=?$;B98sWDuKVLPu#0YYgM&J5BEDL`-P+&zxN-cL5nGUlulyC`C1p<2Cjy9G+@sG>QRNrRz3&ldGYFa{g=v;k^AF9WO#Y3d^ z40_U{R-WH1|p`PLA4jZ_h2AmQb6|$}s37bW_-d``qt6nT~yv+$-)(zZ6;r}; zT+ze5k`JTS&!#8_Yrz4Xt!{5O#!8syk&DoJZ_A~jQ*-3P;8?Yy)Gm1va%Z!S3E zL+2ZqqWvk_P61wMEsi*UcXB1;>+c|v67omhyGNOipZ=Mt@z_-8?^y7PoT?d(0c!ZR zYte5VzR1Fn{l>9O&$i`_2{N+vy_jX-42a z4=iHe*N$4xF6wqn>%Lu=vh6>id8&A-KG0dpH{T!K5q6EP_UJ2@z>9W|KTqyaJ#anp zCA5fb4EE9?U0GR|Dk>hU(^`;vb-Eb8v(miz<`comiHC4#Nb`Qzs9jjko^C~Dof`|> zdag3T2QT@~(}|`6nDUY>8s3Vj?-k;W^TDn^vqU#!P}?|K_d`IaPS09r^2>ce{^AD7 zCpWv1{6j5q-jPP93*Vr$IsENc`2{?B;3iEuw`|Jc)=ntA9B8G#2z}d<0`=y?Q5-qi zt83X#z?SASQe|IH5$TDtJ3_^Jnuea?+?pQL5%25!{l*o&n>etFA~K9~*P0Fu;SWSB zq2;&6Jr%*0j1msR`sA)}=_Z?EJf zNOhz6rwh(QG7I-_Uo+XQc&O-u97S=bKVqP$3TUu}#TAd!MiA*y-F4lsO`DQq=ehp!lf`B=VpDG&}W;G&r zBao4(@jBHsVEj_tqTsrDL>}XmD8{xkHsWeYXv_^}S^^7nn=0y|P-sL%#6){%XXjx1 zRD1V3@<+Frmk(BV-h4IH&pP}~aV;5f$QwCQB!36)Y~DBFsfGyZj3`bz7$P~_t_!|o z2N2^U_{n?EDL9VmlvE3oy0eD5FntXR-a&WrXDV=c3o`=Y5{%hz8$E*VomAIfF)-J6O9ks5uI(m8SK)3PR!K(Z*?+y05(rkq`$Jvyr2!klYf%)*6p#&vOz z+Nh6+ix0lb$H&*z)h!=)Uh36HaW(JFVKIFGYIlB-7ns&$@nkW#UbQ^fH{Yu|?v&bg z*qY%vv)DYV#Q_tuyorPX=M_(nfn7R(HC2pB8&pxbuiY$d+{Mr2i2bt8pS9f&5SJ=M zQ3dX4Viu?L5OPJ=VgJHwvTZ#)Z2?rWf7l}jF%fZz^UX131W{KT_#(pmH!t9dyF$wz z!7K(79@SbrfEsdENEcg*Pe{0aC6m9E#|(g@{_g!s(>1#BJX_?>VHKMB$}0q5qEC;1 z)%oH47a9s2$yaH4)8r#6alFS$^%jpuu)3tYyt+#B)*Blab1=A&A&02p{lkaL2m;OJ z<)CXU6ciL-pF#szpU>NhAJ5wAFSX^pEx7_9PQT8Zj~yT*HFL6ZK%;V(gOk$`Tu_vn zYWL;7^>LNI)jN54dD#I*=De|qxVu4N`Z@XP2u67k@+hRr0Z4}6Qr$wyVw5;~d$|q{ z+?@drpEEl5$NF)bn|DNK3-a;B48gp$$RCX(Q@t0jyb3H_3Uwd55C}~u)5ipsO5NBb z>(ygD4mD#${gtT_dN0NvPvBxe6%}`%%R0+jA!Oly%0MRpAi|5jGR9brR-cJG%U)#! z01RsINty?EZlx>ga$imEbDkR%{{Mq-z<~uq>Lv z;Dyinz%;0dw4WxTdw5d!h4&xxG100By>6+wug^BalL~BJ)TtZx{Q`%sy#ET%`b~yw zXnGl*u2yCzTkaKuDL^q#PaMbF<2nVmE+)UX$Z%$U=JUKBEE@EUgu` zL6_U>B}J&&BTEPmvGu%xG4Soaod5I=#fqy^)vZ8( z;QBmuV){xI4coXMKYb!Lz8U|eN=Gr{%hOwpd297P8g($Q)&jdPxAC*H2F%m;hXYQm zMCy|*#7%5vMDwo6cAd-ltr1i8q@Tnyi}5;kL(w5IfvCu)ee~ZAyfjc%XuaT98n@KYdecH?wit? zO)nD_Qgkl0o%x1fzBFc8x9a&?B(uh!v^7J`0+wx%g~nFzbgI?N6+)5U3)6TfJx||K zjh19*4&7It=Hc>Tw%b!?m5tzs7rE-5M=pJ)Bl9Kc@HpbnrkPAPH-x=y37#;4CLI^* znPA$CyHOP-RU|_+VZH13Q)t~^hPr48y6}Wer9PjKEFaGp^wNr>Rb#X}$UcJV?6vpR ztoMFSN+OmN;@mXeOY&;{Nq_RYs8SkL9hAs#{Y{+0T*6-5ym&_QV4&b>$1V|{$(tOO z4-Y}F>2d^{{Q1@p8b$iI#jz6GTjsKNWT{W2oNYNzE7?;KO?D6VQRt6ds+*0KqE?bH z1tnWl3HDK5<(4+B{y|?jeSxR8XD&H?&w;Yd#bnLa4K6^k`_dl5S)Zw0?)dkG^OXL4 zWN)HJQ`(EB$0lS=1JTM~pvHo^YPb5LEDW_sby*_DjpgA3_wK zshQc>w|{j5RiFPC77@|=AB_$mM^fwB;3 zJ2cX{PwZhFmzm!K&>;8kn}W(+)GJxmdPUPkyua)%tQ$spiqxtJsD_SGhoKg{g;g3} zp%nqALtSB52FNl#wB&^ma$P;)4dLq?@Q(Z(`f8wDU7V40n-*{Rr>|-cgjHse^9zh6bB55F>A!6YwT$1BPFA%7s2?RV#j1Nv%-BHG zV=IdFd4(Bx->84vO7zmKrL%{A?v!I-l5G0Ov*NFSFh>O8%sP4MUBveWPIKCqHIqud zn{;RfSnGzGPOp_<0+>x~IL|;|f;xU3ed>WA%IoOf_e`zF=Fg`$@N+aO#ojSdD^JZt z?V?Y+81lq@#ThxN>dfp(6qQ|-B_A_clU6!KC<#4|Mj-h1UCaJZ*?(@37n=i-KS*6$ zwJ#`bIz*(1LB*v)y~AIQQO>wk1>9UNPFo)QR>9Edaq?WNYFR^nlkQ$gc@dgJNvczZ zO9*)xHhG_KEPPY*i_FCH9`+*<+sE0y9$;`nL!ib%Z^uJ7u+XL*JIz$8n4jv#nU-8J z4fgj}vyd$3$jV;+ARVAbT({Wc#5k6sGRaC;QGTTaK{hMD z;L5|tpl!3KlrG$Bced>y!`;DinrY!$y1C(LF>ZJ=7QHt4tS7nAWEICD-tdaHoc5ba zUhZ+3kP=!RkKu=_O-R#SQiJ%(~d-WJuFSu>EQUsF9X^;J2ZEl z0`IJ4j`Qv-YhMCuKO=WZ4+&(A*=EOcwYkIOtHdytw zd!h$Qob_Rx(%41YQFneQy}9gz3;SC5=IkwfZCQ;K>QQmhosxov_(_r(0UHX`xcH`0^1Jj0v4?_(<} zss+M9=v-yd$BE}#*3m;s(+?v_eMLJcJ`5c8bvC8CbEpb=>Nesob1 zzX0jD@1aql#)@uhuC5KFDz#|dow;``?iu%es!UPvGscbHh0!f_d3|OLIM^%6X77HQ za2YCQG|NfFlL)&^mgu%lK^ehsUs(9eP0eu`w|#wXYATV=_97Kw?%l^u{pq~YvBoF9*hm(j%plPHDAKln8cK6{H2 ziRxxz&cDI8Ma`GSYKu0<&OJF@4gzQzcUw@DuP{}4wru;`^xQX$7#c41GA5i(k&Anb zi`~|Xdw~n{Gk?rHR$m~IlJ5zb3E*_t)KOkKT1c%~J~-S!k$tBwQrZ}O=OmL(>SdAAiRYG#$DYEU_pr#p0! z-Ci2}?U{LTKv}3SuXN3aTW}h*=D$UZWCm7xmOqTki~G|uw**$pgLi?ARcEeA?;SM_3J>NKk2QXBamhBpasS2;p|Q1Yn^jsH>Sj=Bt_ zWo##UdXkdmuFp1oG3yk%olux8XtL;c`w)~JALrwIs-8C(HX$)NtD*XKuwRz7he_mM zzuQ8P@OV0wqu{~S#=8v;ys}9DyQJOcc8J1PE}bD3dCt{_O@juP4Vr!aM|1UGg3FNX zw{K~2aa=~xgM)({9NkNF$3ZOaWizRloZg2gV6@KaL0jvtB6u;`L$aEhng|4fmG#dy z===WWrSa%*{5!k;rHl-+qFPX|Qv<50qdN$kRBwl7IZJ%^v$d0N2gSswb$3UH^=z^H zi!u^ijlX5RQ&;~U6B9Gl&tk-T*)c*zm@X-q3VgR+kU`e()Ljk?4q`cRZV;j}Ca)ea7M4s7o3EnKaz^vh;tp$PCab#0+vvMwC_e zp(vtHhAVjJpfja=-!JO{vo|`F0g(}kHFxjls4lsMPjz>9Z*L3zix1NQ)O3D_sWZr{ zgAWiI>790ML+7X2vX-wWb%1rpprrejF#Q!L52sxU|CVCu;Gh|ga*LR}Ue9$5|KJty znEl*^i&e_=J5JvY$x9hePT`0+zOdb|`j_hR11QN3MA1|Wh>O$5dz$xQBj#XNb-7P) zc-rpsreo{;r)e0=*}48o)WPkmDurg38%E=s%AyJA@X@E^H(Zanmd8AheTjeu_#Isf*s z###bsaNHsJ`&3~3H_P+?g1-K@Ixos&BBQ9>5Syn)?4GVylis1 z==F2M^&VB7;1+zh4707?Qblw3{bDsIpg~)`dFsKtr|d#sf|)>8FPt4PY8KgY`0ojF zuFtNvuoJji8U86ZXYFH(s3T3ke>d7FL>5l6%FAG(z!seyMkPU8vRuf8O5-x!shIGQJLI&VG+~Tk2ks|DV-(62Ng@I9ESUu(^_fQ^8ETe?Zl#$PWR0h!7`xfx0TC^$^~pUnQ)JNE7Ykoq zT1Np*UiZ7;yskxJc4krsgS;7ejY&{?19rYKpyNy1=wqfhXQ<~^+g@slj5674fu6_b z)>&Zgk+pfjT`+R;oFCdn-7vX~IOm|Ja|FyK6GrAC7*S$#h zW@&4c7dk|F9Q$babf0z}$orYfr-gWVaOORN4>cV#Pqw(>141dJt{YXV>3~K?#F=5s zCl+E{j_4oI!qG?Pr7pN)b{iZ&T2raJ-8O%2FdmiG ziay?5NL*nHKl;#BfNZiPEC1y%927<>t~OOg;c~6gx9gA)>+)e`_X7h0ht| zLz-#w-BtOWS@xWEzjurlDiUIXxeC+=oQFQnNww;WIBRHB7qnq}GVFNQNO83Mg~um2 znlt6G)^8)kqzoy@de*Y@8oFw|qXpD?;Ttvc>x)HMxAH7V9`o)wkNbw*p_;?SJxd^U~Om1P}yJhysIXO8&}U%;MDeuH~N`1u(q1amKAij1_Y$*b*--StOh zf#(x*-0-Ci`qr(GE;Dw|3TokE@M<^3t{{NbyKBmUdz4Zzw=(SFOB6t4`Qt(V`%HXz zs!RUhDx>obrHa{O=jZLlSx~#DODh+Rmsi zXTvyti4eYcS_ynw zpFuxhcwcz!!c6hX`us?SBE(DMZ0EMbhp@G0B+xT8*VA=W2Th?zjh59!rq$Bvh_1as zny|IC(Z17d8NnKy>Qc2>hF=U3m+mNmxJ;xC2R5KViRDT&$@0JOF^QhrWfID_&)SkJ~$@$ksj z{jMqJDWr^O+|!JW{zV^MVK75F6YsL08=FlvcUUK>Q$Om~c<4Ti(2aff?j6|DYK6$I zA$!(E(3QucDpif&ZfkNJ+nVO$)cOOpu7+i`&@M=2ud(?Zz?t_j+GCYi?p8c(eTr(> zW6?Cbjq50zlj%=j5Tqd)EUvq-aKMpL#qi^2_Rcto5oANWfqDyBewdHS4-1#;U#f~7 z-lSnBg}AxT)ya<_)2C)ME|SIG+-LwHzq1)3Fhq)wcnwMPi1oCObqM6uy)U=o4+(B< z^)}JiFcA<)F}0?M(#}m~EWhD@!8-38EkCWR>`>*i8y7yt<8VgcQ>`ph<@6Bno`ZFr z_gzw_BDi;~#!0^q$S2b)ifLDIj76M(i+)O1T)cF@6omaI)beqJW|G?qH45@t^e9j6 z`vm`l`%;H{L3$z}7H$2mJn-j}2sAfZ)MagI=kW@`e!4_xP-S}_GsjT{ z=fT%8oA|d-fusc_SD!m8k?i0tA6jKg@V5S+=aTe60G5e-|HFj$H`K)&s~#IbT|VbJ zlS_K?AGK5H|Hgq1 zJXe}%(~4u{PX;n>S_$7NN7`>6Ui4;kMYk%(1n0ci_c|zY_1sC|uBMB6rx0>e*!QS^ z=ca5vd&Qa#qc?hLf91YgT}>EsWLFf?MWRc++fm2Y$Ep2mWur!lJ!vqn6d=z~!j$Vh zuNBUls@3Z{l6}~uVFP08kc`;V>=QIGP0p}^qD?4Ya^$Mb3-_J@2e~D^SM2)Y3~@J{!tJPF_#6f@e=ipy%(R0LUH^2DqUYbZjYi=)UhZqSF7Z{+qT2^R!o%$zA_p~I7R-xm33#o-8x{bT*A&H_6V(K_o z+4w32^u(_=$J`-ywE$E^$_DTib~tB|NWJl}?tzJobkXCnUwOaS#p`^_HjCy`I5d{h z$`Qma(|fX`L=S+CgC@(%Hyic#ya`Aw!JfLQq5M=n_Y<%p;uGt>w^vS>I93f1M;r0$ z5&Gv=Ll&!2xzNF3d4@vk>K$I+tpQC-wP}$Zr2vY!yad$&Q@GZ4UZz~WG2&AH-s{9rk8=Ld3 z_FLjN7WFy^JK-IjHO%?O4h@wM2-G{Dw$!2lbsB z#NctP-nlS-5i=lHQGa=HYuc3c>utM$dum`(ntl5bZsJ4r2PhB<``ND#;VI!o1n~dy z<*G{|!hiDPLoM+%3wAvQBmn@0Buw~dat{85SxzX+mY~A2icfrrga7Ld>wlBH|Hmxw ze+dFF;@fhu1}95-DhCIQyFzdYe!FfN2xvo$@d{~syxJx6H!&gO3Vd6juIZT~c@gv$ z6H~gX+n&F0g|xLHeew>gubfE!Kj_m}0A8AoiN~?&iHSM}<_2Y$sA;d>zo6eB#hYNZ z1Tt`OS7Byje6heKO~fYxbLD>UnCq7ERmAN|&fQZME*BKmq1@ZCzJln@VR1M>O7ssp zQF}WuSek3EJMEOJ#qg?5;nn$t@8Nex$%xH?_}V~oOQy{z`X7gY{|ZranGW*0UW3QN zz}n6ZsLi+RpYSYYnjj!A&%*nKdxSxHoXN=|EByCwhJPFr7twN~@y}oL8Rc>95@x57 z@M=3r)~n$@r?_#~-)!%Zy`-0b80r9hwAhztdv%`(kP!XpR&$wryo334NNB@;A6oRE zFt737rvLS>Jj)S)qBS?Lwzl@d?N_0KmwxNQC-Z*s;(A6~8*{!o8zCWKtw-1jz2C>LaOtTg znyuN4$`X&6N<6@Ok9_~WP?O0Eh{DY%WnpJ$XJK)AR%!S+%C8F&4OeI<9KMKsGldf! z6Qj>3RC3-YnXB~Hu`blD1ENtbde8#7w^K!Ke}J^0i}J6Ot+@@ z3w!uF$7#pW#Uq!0t$0HhzV;GhBK*9m;Cn~04BG`!_{8dAT zsIT5yGMrDeLtz7q>Gs}XieGVe)q@%ZM-2z2({pbdjQlK@4%WaaeZ)624e6S*`f$%G zF%kcBRA|6_VCUx_5kyA-{fr0i7}b?vjU!cM2#>znOz)PQofm6xmpkWF z$r5HNuZ^9h7bb$RPq!TkDiGd-gd|)!!guxZ^MzgtsB<;kRBxtcISXCX^O_yIHN-^W z7gP}g=V~YH>Jky4sF0D+rmeTph7dK$liC7L%)7ujg~Z#WkLtGd$&jd>vOMpQ#twGz zHqM*j4K;Rys75VAg*(YZnN2&EW~RM)@5cqVokq~9l2&^rB*67wq#Tcz59Ro4%`&7% z4(K0UZ#C~R5i&QlYyPwk2|BdZK$JRvj-%ta+2Cy3K?qal6LahOfQn+AGHl7wFAqL$ z)PqWo$9rK?>-b;1$`I<;Kek&Zq%kPa>MV60*E$P=Nj^yD7oYot3&i6z?49^P5U%gG zzMP}z<0FH8{LOW{JTixdU5lm)^^JZPK`T)y{>)uD$!*q&5JlEklzwi0s%fUr9$$#~ z3HsHj-|kq{s0(R=2=ve*vI^%iivtkpMALf_TkQLHl+mIcxWNE|oG}v=bK`iEtj;KS zH`w?X>+?9*3g=YNm*jwv|Gt$yjO90-=I=!bYVG1 zJp(MLs4C2!jh=Q(WLYl?)+ASpI4=Y$FK>KHiojZr2>MW2GiDBY46h25#6a#wPQ$fp z#Et$8Bb1_w-fGlt$y~E(C*)n(BI-L%&}Ed8Pg-utE7mvSN zrDQ+z>;d;f*XV7_y}3a%!-xWk>dh9?*3B=mpin*(GqC|!ZrbWsp&417mg<`N0ZA`0 z;T@|@j<-uqhFHoH_x&+xuBak8ph^F5wO)%~nz-n;Q)*B4TeqBEwUs{XCg*6Fyv#oK zU=<7FP@$4cs^H4(O;`&^DtPUCR${Sm=q`#mS)H7VcstuizsOA;B+j|hT}|hD#@=QMBRbM{{iyjw_N}c~<4IMK=mbJ7vS@98Re_k<{>bw!O^dK@ z9XsKD#!UA@4Y*GHiIVtc53o{`SSFUOBg;2yd7nSZkJ1gzLxvpNUtX3)y4wiVAHRvJ ztw{b~?R|ArlwI5JfR7@epo9nrNJ)c;fHV>!-Q6M}APmwCN+~JbA>An*gLF4TH$ykf z&@<;oect!^zV|%mi*wdGYn^rGA6Uc9zVCbQ>$>*us^3Pq*SX5mkjx_#R8{KIayp2^blJ{Qr8bsEvQz)l*7q&73W+M$ zI)g%~BAn)_Or;$YK|+f0Fc~(sVYhAn*%Oa4x6RF6Qo%g43y|xjl)CE8nW&mBt%kh#I!7f41^~qWsXvTzzIqNE$05_8YZkMA;#$O6gj2xyalNitp=@`HEvL``;AI zl9EQ7OKoV?mnFntsj6KaXLsw&MMmM)lu5C(6MZj=F{z~OWoEvE4=cWzYZk}7JbV-DCLu-}Srm3w0M;qZ9|q#XywJSy z`Wkuavuwl64xE^PZP^TX0=?&lCpVBAXFu?d{k^ zuHqaES8d#QH>O276UkubwFg{>VSD33K^w@tLhlCW?VTV;p}-?&&9O2{Q942rMw|c+ zMj{y^!hOkg^x*m-wQY7Y@ff{?TNfT>7DuJ)+%tDPHEAc6qm^Cll6f6QeuS#Ys@EC! z`Rx8QmWZxG}_A?Tv6<(Ae_?s7%eA51C63oF zmEy!s&-_x=b#uZ)moZoD*w^~(VO_b?Ev668IQmQV^xAjgZy|}3bkMpww1V0$4i==DLA1`eZiOV!^ z*q3Kf^q7YXxm0c)+ZYpB+_$qcTDVEHhCR}8>8AL(+phx;*X^RKd4Fn_Pu2c)we^0u z-V45(9N(#$yg(^W>!b7FetRD+kMBzn9w;0*hU`vN-SV&zX7iNBF(+%(BVPijQf%=?OXS`9h)XRkODC`P01d>-*K6|&mP1~z^IyHo=K2R zdj6WvBEsnjYhO09tn$#Y2Wpux2hMeSIMz71V1?sG#PEiOQv9mX1%6dmq;%zVfG;$| z`5w_M*odu~JWD4>Tzi&q!_QxZwSQ@;VDc*HhZ$2bp+R;y_gnDgF9n#JHKHv2o?QH)f$R%zwz>5MpEn zb^B6%!HV^ci#d5}m>12qV`X7sVPurfRR(;X16|l0-90WUjDm9@g~Zu=pXzdOT;)PNJ6#OwYHTC1iOPt!!Bng~$8~$ihTkFB_kJpZS>i*Yi ztgsmbQ?@=I-!xsOzTtbcXw$Ez5vC8W2k{aS1+j|Rj1*}V_V*+nzCY|u8&IE$dvO?gbx+|_ir-ntG`_=r ze#lt9nuqbRn&_7LlJC5!=U{_uuz4Tvoim$}GqGj2;i!4YqsQ{cdAfUJg48jOf`SCN za$V=gvPHNc)AeQQJ4Mp0`;r}j9mqQbbay^wKE5%&eb3zm{J!CGoRTnDpxnq&mW-1+ zZD*8onbdsQBLUHs(2}7K*?Wr2PyI6%@WdmTeYs$*;I2Mr{z?Y6kiFtN9sVpN@nc?@ zuUS{m%98>?$ru-usegdkCMf;jb5nL_xb94Ocktif_7cN&Ri;CUf{N3>OmkjDoODPF z_3l358aUnkv}QW*Io3HM8Nh2V{w`4`+e(LJ?o8?2X|i`!4*luP?E&Er008_XPND7C zJO^I#*EO%LaT+}!1u)!k(7>~H?BK)(LhQ#WCR;<22!Joewo ztL3SIo>1^a%XT3tfJnBzN$RiA(gI{ou)e=j_mS4mjdJPj4vePD8#vZ7%% zB~>?z?){M){&v%|>+r^_`AukNlss<$2w|G~ni|BE;98!E#&pSVBU8A3a+Ol7%UklH ztLz6$4CkfE&ajmgIz9jOxRI7zwtWF8+dlS+B~;&8x$eZr`Eh2_i}o_!l;WhZFTjZC zz=)k`*x$<@%GZp}*X`(3B;Mw8*f_Xx#HV5|XpIQaZ?7f4a6W+-pt%BdMP8qNT+43h z!PXp|E=*-i)h7wd^^#6^dGc~+K%JR<)5ZK~x3eI$x|NPB%lC?yp6hm#R2sCpI=?8T z`d%SEZ&C*0-Rc@Omt1VU!9diy&&1$DdL24jD>eh~>H5coPA9`^9oh9S^xy1l6nYri zMqXm^S@R58o2;T10@~=?ueDFXEKx@_ESs&BWFSzbhU)_2w{*frSIqB3%f*i9_D#nK z(S1#zwC$TN!6rs>YcPtcMNR_Kl`dE+=aB%X(!@~y7e87|oS*W*E&?dMGo%(gSN!nO z?RlTy9didWCC;jDHcz|9S}*L+Om;Rs5OrDbbWr5BX2MsjJai;C5Rd$d%O=pl+4PKqgJQ-hS&jhrO}d-+%Mz@xVA(IzRro8U zHZGn@H;QKv`6C<0E)Cw^KVz6)WnCY*si{Tz9|3h)N23*p(%VfaY8wvwuJ9=!hPSl5 zoH9zJ_0#H(6!Vu~8&yzdcR(XCaU7=PM%B`Y{do{Zsk+rOf&t3>i;@|7Nf4`!O+iI@ zc_x_S`r;KTrmL)M)7Ck;*?R3M7vb9b5#L;kCK4jN1z4J{FYqE_VFJy|N?y6^cVDJp zSq#4TwR8C=z8IY5^nuV>EZ4^$Km1R#>c-3-V8RGnSEmXRS^uPY#WZ`QX5myd_Ah(>w5ZTv(!}BC7J8rfnfjuMJJ>V@s_qCMN>)757E5rNs z#!aIe8NHdL$cULYAobyI&v_r+gnxvaKX}b@!HL)MVGee3^1< z*rc(4^7y27zLq8QM@FC9Rme&c`O8ZlND}vFGP`Z&kw6t#=1(IH(=eNU&KQ-bRNtlj zfG&pX5wJeR=aD5(i8hF-1lf&bo07bQ_EsC2e=UMSXo^l5~+RX7uOOf;0_1Jq5)WMwkIzjJF0N1 zcSh&!+s_4_U^3vtfbAY)Z++SohM-6I5Fn=m8w#B`}(~1F5j+} zc3f8#{JeMmBva;Gm~U-4+y*gwXexER>c1D%rS^sE#vIIZWVo%ge3;JGO8um)@qUCu z=Tj^@tKWu#>Xosjnv{i}h_Q*8p~IThYU6V4Y3m&x+_jKDRkOF(r=iffg#@~j5KX`J z-Vkh*Ol3S5Bt7rRZ+xP!w3HO26aD8q+yNvJM|RBHbthlfQ9)utyRpK`B-t6YoMKEbL<^DEj)GN*Sn8WJkdl`X~tI#5}ONkV<>wS{sFT%Zjcp%BtX=M#|52Q}!(^&D4;z`L;32 zwtzv>`Mgr8&vP|3Il21m`ag+xXV`laFA}fsnyO)A`z;}mvPnxbfP+XGRoo!^R>s9m z>6J;=S8dWBUhVpkHiwh2Y#of)CmkX*+&g(=oAtdwt?2+WRuVz2$J=>T^}{0>ObI$f z@^_~5IRV|%k1%Bk2dB(rAgqQ}d?&V=?$C38Q&Fdc0$r+!j;syyg2Mn02u|VOvVf(8 z&W}M0t#q@#w{4fw(s?dCJ#gO%x=#xsQ9Y!k!>;INK8gAT!_OmJ1lJx9L?cF})dYle zR}L&G56;d-Nj)7-etgCtii&34o&7Ft{@lY-c%tiW`PAzz!T9=va2l_A1ED`6y#REC zk1%a|o?!~4RB{goqCSt7eE#0hVaJD)nFvY4ZHOna(>u4{n@#%2pr$5|+4T2K-Sli* zin%IF;?>R^Su(_H&9OY5(I*A$Z;A!CDvwBQQRj{2(#!{C0=@ z%qUd1{y_?t(PCwKhmlIu7WWY;GAzYK6JtJw&4eX4@0qK4c7xYf$c+lc76&IxY;a0G z-O(u*J>F<2g&*qst2{^ahRkx>j|P3NR2~lk=LBC^PSJsJB0R1d6HcAmgUXZ3x!lGI z!XsEON5#K=IEXzr^;&=WG9J;>>i|UK)#)~T8Ul|3&q92uuJJRv;0C?iL<$=I!NQ{j zz$CqW^=b`T5e+IZ80vr~m7FA?42fEPyyk{1T8_gfUHH>%Z?vQsMM*8wpuVWPj+&iD zR?q+lbn?Smf4;@LKfdB#BinsRi4V=lJN1t>*Ff`iMkdu3Pbj2@O|wiN-uj`WosgLw zm=pV5eyx4246h$et?2Z#@;6g?d2`hfXldD{a_v~zGW(Yy-Y7>11Abyv<5*rxg7P@U z?SY13-K99%^f?{ITR}UjO!DdOXgsC=l)?Qp{udZ8n5kIU8Cq&G468G9){mJM&A5$5 z3YmL#q_lM!lcO)BfE+s4iHYtLV{dI%i_^ZT%-I?8Iy<|C z%hG%r$eAq$bZvn)`Np-o<2J0ASR!1u2P@qj%Kq=r|~-ll7R)$02W zD8r$tkl+xaDE-j9a?`a)jIP!17R4-~6Q$nkp&t^se@Kw<_HR*%%8OwZMtEx>wf8n2 z`;t{BzI#~mlFrvE{&>{~d#5puFNiwEN$oEy8T+uNLEXaC@W|Q-3<&B{l8m&pmY05F zz5Xosp86dR!FUtVTby;zbK|vPF+#leSQ2a9${p;5E_6p+T-1(pr#HQUCNbKi&q8%B zV)@XbkSNPpH&dGLNt~sHftN85rL_a_JLnm-s&KvPQm1oo-V&$L?Y)x!xuz+kQz+9- z-PeY}apkX*l10lRa3m7j=*e9t1!LAtV(EUNRb8tA?9IE&7LEuTa{!K!Er{5y$(3Ce z1I^@U{g@zyvNRhq1AsAbSF`xWdqY-pwMr6HvbV2qwFkAVRNr^S1m{}Kjge=jtn&O1 zE?c#_?7gsK{wJt=MZfYl>IT_FB~!}zXW^g@)z((I^vI(fDpw`Dh_z4VXNhy_NPy%! zTgZ%zZdnFmcQ*3$^ppI*AoFwXBfIj;IiU@e&w@KI zJ=bKy;wXEQA6RevszagY4I*lZ()MC0(>3b=5Z!eA{1{B|)`Q=!LK-zE3&-i3%|Sf` zn|diLuwh$0kuvXNiYkAvrQWa?%X(sLhW3+4f`B+Y^6Ut~M*+#ddL!1=nP6sXnui_MgD%KQq@szbEF|sCoHIft?YK)``i3J-PZQPIeYuV8bfbT4a!|{|5>*vs&FS zIcxA7&b{Y8<&Er*qv8;a6<}Go4pm+Yf?X^zG7Oks<}z6hd_?7{qkT>2NAchIcm1_& z&z;6t-tRG2J*ox3mLHq&C0y$WP?Q9y>Kt?{(8m-*4aEej%4qTT8nb8>YNkjE|Yt1X~F=u8xdkk(t9 zm^5ek#2HtHr4%xYx5VeARMD=v)Ba7MnE-8dwRvo^%;wBhRKQ}p*G5KiptBw?Il71B zcZ^p#CX8Wsrf+@O;sjxF((cB^(ZfS~AlE)^v}~h!UF-sU3^whQR-048ZBis$rrr(y z>3c;S#|eQUOv$*vuKHItQv=rP{{}rp1LTZ}l#u+lcPbuk3x+}fpg8wLlz`;-mp3^$ z%Dz9(U(wS*o48lME_uYB8s@Eo+paWt5poGy@iix4};=t(Q@7Y+-2l zO-U14oJBFrV!Zd^Xu=6w(i800+q;IjbhH`G{DZS_LU-6$o(f}ymh3NmsecWy$G|e;$0jVy%*-q;laiB>muM4C=A|DK zKmPW9h!~i%Ol~e&4{qS4%h#g2TSWBFZO(&3<-g)`ym;}V^W{nDQRfeh zkdDLmI5=9*etLYy-6Ysr{bIP`)@ny!X!<~0RPQb|h={6YM_mr$;80o9OO0XV?8oPL zhht5U?s^#rj5LWk^9Rb^)UC?h?|H$VGA9o-c(EwFTglR`&`OHoflaQ&iGPa_84umA z+m!N1W>{Qror`b~pVuCM3rJ&}Ipl0=P6D;OV+e}gIs7vrCpbOpb^L1~B4o+uiug38 z+Z>IR8Qu2@3(J+HK#J{GQ`ce1=9`j4&TiVT-5QaD?J2YFPnUi;uPKShMCKeo3+}qM z$ej-yO6njNb9{fC2{Dm%Hv{23v=lo6y6u6cKqEEl-NL~h*Vw13JuwbdfbURRsz|D- zsc9Unmqa*Q4hf#gRbf1!nz>HJ1lbz)CJObqLLZi%%&jl>gL|*GF8Wz9i7p{Y5bL9l z9O2q^+_z*OP8UY2A(=eeJg0(ur$fj?6;+God%>p?9-GEwZk~;?6&ZQmqhv@UbCc-| z%aaJYEh5npH^_5;)w>Q@}EYBTJcQcM4wm0THh z=N{RU*CQTrll`Eq=Lib9fIPK1TSXt3K zasN8vGxQRhHi<+m0aq8L{P;>gNOP2Qm6ikl6Lzia!(DFUPe;%yEqf>1&GQ?J^4n$# zMdJaaAAT6paTn~;_U(??zBecUC6oOHy@`{cX-v)}un0J_^Xww!M<2B0GHeET%%hwI z4czK{3ca-**6SEz4lq>@KMt@`XUV|B914X9S-ji;KjBX|C$*Cb#1weY8s(b)A}1+7 z8sD&kRRCF?E}FS|!?gI+xL~U^#ZiCY{G!lxxKu_pxd{HpOvgWEN4WIme+?zJW4END zzR{)mK)YVDpbAgyzBc3N$URS-#{(p#YuNsy`kkZO8|Rg0Bi`H7@Vpit=6|~`_W=*L z`(n)f$fIpxE!~XktwOnUL|%=m$65M~q2}BkZVUC3@_Ej}Y*X=++CstDMi!;vFQ?`C z65q{tHZ>-peU7h0rZw@WyFFvZqIg3+Ma%oE8ZE^kFm6 zepBC_lfB8Fe3Mc~V3R19#_o0b6-npL#iwkHn0Vor{RbaFFJa_{-^9qdol& zIYHj5^#h3KbfflT@JgQ(^ZID|2+Xq1axEn-)g9i~oRP62k=^4OQV-;f>En}C(3Y3+ zbG@#M%!B|=wA9;&FZ%|vdTX6{WC#+EkB>8%pl9H77EVr<4pCBWu30BC0CD+;3bBGi+Vgu2> zuwR|=88B5sI||0q=mlbg1h#Q;aS&vs?P{X9q~q@APZ6(=}Kkqtgl5w zu2Z(1y4vEd{t3L3Fx3zH(NkSw)$A2rJQ@Lc5P4lW*?Vq;x#WCVX&F-wKX!2s**J8F zu0ka7b)_xP&^+mO6>oy-0%hyD0G0cgkX2%pf%D;PUD|>IS}>b8mWIlG;NeXrCA&CG z+0NlrWN~rCX$v~op^3+B+xg?owlbl0@PW0FwPZn8J^qySR8?>#%D}K%3hqO^G_Wi9 zkn)S^W7<}+FC^f;sS@t(3>0%pD~uvU>tW&==Q>_GH4RY;Z&U?ig<3k&(dE6}C!?7A zwkJv0{Djn^aCeY1Y9?fWU3YE@KieJOc{z*z#i3p)kHPe~Z8U!+ z$3qZ-SrxK|B_>1Y1S0@l{ARsS((k9&)|^ciWz~CdbMy4e$cU*25d{TmeMB}H$c1sI zKpZ180>k2EwGOs2Okks-&MyS5m6+zoItHvf8eELE$BWAEs_F#b=m^z2j^`zFGJZcM z{l3x!PsFI=tZPJju43HM+B2RHE3eXJ zukTvd_2#vESkJw=VA_~Twsm(Z+L9q=)#yR*qmg`P79u)uiXQ&0@%u5XI-ZT93uQR~ zo$zybLXUb8EY{<~;c}GN7A0t}Mv!Am`R&l-aD4<#c*uUYxoto&g^<`@lz^Ub0aC7v z7RZeL)N9FXE2KfcPcQasEIpPAu)f$aMN+b|eS$;1z1vOS(mB?c8B+yK@@$fB;cls@ zUikQvxd92~eYHLk@TJS{8=KK+c23oUm-*+7Rm@Xs>H4ADw;yWLxolv7<@oNQTH$o$ z+CnJDp_01L>6VeqLDlrRMEf5`t!WT>tJpCuh?~Y<=`@wEbe%DugWL2}#U#-*xGhNo z+O<*2H0BFV0vg{ANs}zh+K%cX68YVsmrc|iwld>e@Of4(#Ra4M&WkUXcGD>O)6!R< z1y6Y-^%;DojiJ_bV=VzgMVQgx062+2fxnAZli(9w;n>XOO(c&jf4TD!+{N1jZm|pW zMdpu4%*(z{E-@YXA%WAXuP>BZU}UTfbkD2h`pKmXw!s$t?F}K|MunnzAIzk@+G>^e z+)Md;bAyj`?Dt)E=Tq_IWZyFsm)mUAMzBIDP`Usgs-gjq157bHw-r>UEFc60;4&J> zsWhd10o_S;+8k{hqcid|=Oj@~t#vTxUh+l*m@+2my6w}=B5vWgd%UwSqSo_j-QO3p z%*2k9OKc1`} zZM`|9v|(A|<37b^47;(xyV zS#HHL_FiE^m3&q1h-*#a?DwrE;Ll z<4?qyuO5c_T3c6ht+Q@-7!4FffwfJXoSqILJ^Hbw%NrXJS=HWtbbz1JUi$)}C8Ej3&A%F~_90H>Efyx^g83v<^|l zWOOY{R9a1{TpLdu;NV^k}ZNy2&A zFwR>^=qtIi{VSA5?}<6M@w{TrC4FYnn1f4yh}dswg7cy-eG>}i?Dcr8=lBc3wX?JM z+PP0(ZoEY7xQsckYcxz9RaE8aq0SQQU;2f$q}_;-ollr;>lY)1 zd=^X5611?l3%1%}gq>Y9Q`g#=(}4xXsEHt7tIF#uV3w>{A!_MiCjsO7t`%S9h%mf} z`iF(S%P}9ADYeq*^N?PnyPLA0eJ}`8s#yMh3 zA88}#+-c^&BXWjvX0`Qq*2n908rwl(fd?4g=UfH)bRBl2q;PEkH@@!{3|K0&yqp&& z9ua=}ASs1xHTXtKsCI>wH~ouiJ27Ou3KNit&4WqTO;2@86ucjO1yI;Tzgm4|^2%8= zR4NMP%?=7k{5r@)zH4mx9?NMTm;T3W9mC>%Zke<9^pY->dyy)_!iqUwomETfXemAq z07P;(otScd1suFB1PWk9exjU@R7U&dbN@VF(+hx~UU+|7QujBZkpKA5m49$e{{Inx z8UA0KPV+AlMNb8i4yREF0+K1~@LZP$K>-0#fZ@x;(9p`#z}U))HJOaCBo@Hm3L$F+ z*H!ON10L2O=;*S45u0jgmEE{OzY6dpDJj_<&I@QyNcqeiM{ZW;Dd#|ecHecVY({U9oc6Lw#KWrU)Wsc=}3t*05uEI?Ol(ZTHo0(YmKcW0gMWAU&A2!}yC zV!_81Y(CJ5fYl9Lnf3Le>1s8uOlA!6aa8F=uZ8kGH|lKi9rq#NT^u{lygr(Q>aAW( zeCAZ2fR)BmcBej5KlLs1b<$|~$h*S>fcuv|I>!re6PpAAFq_yrxOeKlne!XyjAJG`W8H zO^9;%8ys2pwJS^uQ89Rks0(*thW+R}6-@s%_tn+Gy180$b{f zgvZ13%RK4OFb&mJDVo)BzM|*H0rwO2Wf7Qn!qY%5(WLEJ&tuMM1Lawz3myJ zSqdaF1sXFi9sDt{%56%R2@uZvg!_Wmg2kYlYG2Ath38uyQ`Nz7JQ;3R`X#*NBu6hl z7#wBQC{UgSJ+>LcvRDhKaF2i3D7oH$vtT}EWo~&IrmR(Wd#F(ICWLi_t585NO|qll zQ=U1$%~{$U=a|w}Yf}@Os0Gf|o5hkT^TqUr8KZ?R(HJ~ewSGi+bLjiijR5R_b_LL4P)V%kS=V(WzQdGNEPf#CtLmbr-bHpW}sU zWCGroo;+Q6O+>lIeL#+I85+8&_-%+Uo!f`MGBA<=pM+J@b+quS>h_r2T-2`J{odko}^P?dk^i*j?7 zP<06_T+g>3lAL5pqtp)|gHrLpuLX!l(bNNHiQmfO@1%-jc0)5uaiCl-ZP3Ul!7krHz@OKKs0`*1SE2#;{ zR^yQ%2V3If1?a92{;1<hed<4Jchv?jn`io)a296Izt_x*a?>&0!= zHXb2DRoD`Ykz!iV4hDtjbBrR$38e!&^M8bC4#d(6si)*2x&Ze={!(riy?e-V{2X2)#We!z{xvAE{rXH8Y6?(R88-#<}#*M1? z6DvB>Ip&TQlePLige{jsyOd{eaKU`J+w5Fx*_8{IHTxqHPZM$$R|f}d9aPsnNK2sw zuQdDpw7%F6mM#tjrN*;9j{ahIw%6TQ4Zfi6%J!5tMrtS-M_)eJOUj{BLb zLi@)^pIgp6w(th{Jt-L%ZUFX1f&Zp1hQ{>U3>0t2K?IQ{;$+?;acS;wR?cQ@q%!&W z$?QI^hX(3w0-kr+AV@ZCu~To*vdm~|`oXNf{-ecR$HXm%*sC*8%eOa{TOR;ktIHYB z2@GVE3!Bx*w~c9ABI$_izGIYO?}KkP`9g1pG9(Khi6dWBC0{L9MVS<9K$MXrlq&YF zb|X38^{B^L@X}4+YaBX%y@%ke4M}9rbc9`=OqLZZHWaK-RBuY99_-?ZsCu;4QqXY^ z-3FTY#ctMz0=X+G)4w3Usi}#HoZy0j0_Nb};NGA=lE3V3cBAbDg&x3BA9R#WTYT1A zI9yLH2R#~xAo9LcAIL{{rZKPS8bJ!N0AHh2bVkdrZ7Mpt@Q_Lgp~6d+rfT`{H=>B` zX{MQNUxEtL9YlFrbH-*SF(9fy_Z%9U@W$;Xtn{Kmi|*D1#qvfn&LwTi=T@*SZiFt7 zuAqeaBb=o^iy68$eh818Zq?e%t`euNy zo&*3?5(-((`PY$Mkj(uJB2cP~uNKoN+vsJfE&o9v_7ttGmr%$E;wm7ftUSITryV^$Q6)3c` z%%bXg5ulcG=GuC_&Hnsgp`}zpEDX<%>GfZ}1-&^Pa6m z@f{14$+EEJB@xGsg{ZTm;*=`e1Z2{95;(-onO>YNNS{p5lD{2!`1xRwyC-r-C_`k+ zFJ8%U_tCViF|3<3<_uskeQFF$vv8>?>;BV*-C?0L8EQJVItdD?I*{dPwrEV z4J@Pcn94e5iveTBLfI~*_Krg7sQ1dcI&-#LSrwuu2V?O82}l0hTLQ>UAvX1d%Wu-e z7J!s(r2Y8<=PM2KH}~$r8s`QNr{(kQaD8tpc9e8m>{6%8ba4y(043M4O|_yC^TQx|kmR)eB%Yv%Ifa zZxHL~SM=^q$HR-INIkhiS10$=B<+MKPtOg{Es6%`I9{v0(BOSNY#_i+GPib4FfK_xmQEOGKJyz@2iBoltVi6a~*2+WWPT0bePBG7Q!0iDH)k zd3*};WR(D4K0^%t*c|B?CwCLDM)Z}X^yet8j>4l-Fev!!JNm1J#{2FZZJ=rz))F7i zWZA_@r^Us*K+W!W9;XFWRND%?Y2F{{c*uhfQfR#{V{aqUO|^~saOBnt<4cQd$du;s ze|D}d#ELm-Lyue~3w%a?!soZ4EVomWdBQkSqDahkRVc8gd`z|6@42@rJ=vh+*Mbf3 zpalG60J`18GdaoietEb=3zM(qD>)9?xhv=QM%#Uz?j7x6vTu1RuZqrBjpNnavWFn1 zudZy7tIiGWtTs0_4E17xeGxmlXA&BM$0( zilf_BRnmY`yZuykiC@J`|C&MlF?z$AeBkhBRm@|@CuCj}8TxO2mVqqr5SBhL2>#Q!B1!vGsQaGRyc$ME_KVdSL{ n@B@YNqFqS