neue Homepage auf react basis

This commit is contained in:
2026-08-07 21:39:30 +02:00
parent 164bdd19ad
commit ee89442c04
52191 changed files with 1230242 additions and 58 deletions
@@ -0,0 +1,19 @@
import type { GridColumnGroup, GridColumnGroupingModel } from "../../../models/gridColumnGrouping.mjs";
export type GridColumnGroupLookup = {
[groupId: string]: Omit<GridColumnGroup, 'children'>;
};
export type GridGroupingStructure = {
groupId: null | string;
columnFields: string[];
};
export interface GridColumnsGroupingState {
lookup: GridColumnGroupLookup;
headerStructure: GridGroupingStructure[][];
unwrappedGroupingModel: {
[columnField: string]: GridColumnGroup['groupId'][];
};
maxDepth: number;
}
export interface GridColumnGroupingInternalCache {
lastColumnGroupingModel?: GridColumnGroupingModel;
}
@@ -0,0 +1,19 @@
import type { GridColumnGroup, GridColumnGroupingModel } from "../../../models/gridColumnGrouping.js";
export type GridColumnGroupLookup = {
[groupId: string]: Omit<GridColumnGroup, 'children'>;
};
export type GridGroupingStructure = {
groupId: null | string;
columnFields: string[];
};
export interface GridColumnsGroupingState {
lookup: GridColumnGroupLookup;
headerStructure: GridGroupingStructure[][];
unwrappedGroupingModel: {
[columnField: string]: GridColumnGroup['groupId'][];
};
maxDepth: number;
}
export interface GridColumnGroupingInternalCache {
lastColumnGroupingModel?: GridColumnGroupingModel;
}
@@ -0,0 +1,5 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
@@ -0,0 +1 @@
export {};
@@ -0,0 +1,20 @@
import type { GridStateCommunity } from "../../../models/gridStateCommunity.mjs";
/**
* @category ColumnGrouping
* @ignore - do not document.
*/
export declare const gridColumnGroupingSelector: import("@mui/x-data-grid").OutputSelector<GridStateCommunity, unknown, import("@mui/x-data-grid").GridColumnsGroupingState>;
export declare const gridColumnGroupsUnwrappedModelSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => {
[columnField: string]: string[];
};
export declare const gridColumnGroupsLookupSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => import("./gridColumnGroupsInterfaces.mjs").GridColumnGroupLookup;
export declare const gridColumnGroupsHeaderStructureSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => import("./gridColumnGroupsInterfaces.mjs").GridGroupingStructure[][];
export declare const gridColumnGroupsHeaderMaxDepthSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => number;
@@ -0,0 +1,20 @@
import type { GridStateCommunity } from "../../../models/gridStateCommunity.js";
/**
* @category ColumnGrouping
* @ignore - do not document.
*/
export declare const gridColumnGroupingSelector: import("@mui/x-data-grid").OutputSelector<GridStateCommunity, unknown, import("@mui/x-data-grid").GridColumnsGroupingState>;
export declare const gridColumnGroupsUnwrappedModelSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => {
[columnField: string]: string[];
};
export declare const gridColumnGroupsLookupSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => import("./gridColumnGroupsInterfaces.js").GridColumnGroupLookup;
export declare const gridColumnGroupsHeaderStructureSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => import("./gridColumnGroupsInterfaces.js").GridGroupingStructure[][];
export declare const gridColumnGroupsHeaderMaxDepthSelector: (args_0: import("react").RefObject<{
state: GridStateCommunity;
} | null>) => number;
@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.gridColumnGroupsUnwrappedModelSelector = exports.gridColumnGroupsLookupSelector = exports.gridColumnGroupsHeaderStructureSelector = exports.gridColumnGroupsHeaderMaxDepthSelector = exports.gridColumnGroupingSelector = void 0;
var _createSelector = require("../../../utils/createSelector");
/**
* @category ColumnGrouping
* @ignore - do not document.
*/
const gridColumnGroupingSelector = exports.gridColumnGroupingSelector = (0, _createSelector.createRootSelector)(state => state.columnGrouping);
const gridColumnGroupsUnwrappedModelSelector = exports.gridColumnGroupsUnwrappedModelSelector = (0, _createSelector.createSelectorMemoized)(gridColumnGroupingSelector, columnGrouping => columnGrouping?.unwrappedGroupingModel ?? {});
const gridColumnGroupsLookupSelector = exports.gridColumnGroupsLookupSelector = (0, _createSelector.createSelectorMemoized)(gridColumnGroupingSelector, columnGrouping => columnGrouping?.lookup ?? {});
const gridColumnGroupsHeaderStructureSelector = exports.gridColumnGroupsHeaderStructureSelector = (0, _createSelector.createSelectorMemoized)(gridColumnGroupingSelector, columnGrouping => columnGrouping?.headerStructure ?? []);
const gridColumnGroupsHeaderMaxDepthSelector = exports.gridColumnGroupsHeaderMaxDepthSelector = (0, _createSelector.createSelector)(gridColumnGroupingSelector, columnGrouping => columnGrouping?.maxDepth ?? 0);
@@ -0,0 +1,10 @@
import { createSelector, createRootSelector, createSelectorMemoized } from "../../../utils/createSelector.mjs";
/**
* @category ColumnGrouping
* @ignore - do not document.
*/
export const gridColumnGroupingSelector = createRootSelector(state => state.columnGrouping);
export const gridColumnGroupsUnwrappedModelSelector = createSelectorMemoized(gridColumnGroupingSelector, columnGrouping => columnGrouping?.unwrappedGroupingModel ?? {});
export const gridColumnGroupsLookupSelector = createSelectorMemoized(gridColumnGroupingSelector, columnGrouping => columnGrouping?.lookup ?? {});
export const gridColumnGroupsHeaderStructureSelector = createSelectorMemoized(gridColumnGroupingSelector, columnGrouping => columnGrouping?.headerStructure ?? []);
export const gridColumnGroupsHeaderMaxDepthSelector = createSelector(gridColumnGroupingSelector, columnGrouping => columnGrouping?.maxDepth ?? 0);
@@ -0,0 +1,19 @@
import type { GridColumnGroupingModel, GridColumnNode, GridColumnGroup } from "../../../models/gridColumnGrouping.mjs";
import type { GridColDef } from "../../../models/colDef/index.mjs";
import type { GridColumnGroupLookup, GridGroupingStructure } from "./gridColumnGroupsInterfaces.mjs";
type UnwrappedGroupingModel = {
[key: GridColDef['field']]: GridColumnGroup['groupId'][];
};
export declare const createGroupLookup: (columnGroupingModel: GridColumnNode[]) => GridColumnGroupLookup;
/**
* This is a function that provide for each column the array of its parents.
* Parents are ordered from the root to the leaf.
* @param columnGroupingModel The model such as provided in DataGrid props
* @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
*/
export declare const unwrapGroupingColumnModel: (columnGroupingModel?: GridColumnGroupingModel) => UnwrappedGroupingModel;
export declare const getColumnGroupsHeaderStructure: (orderedColumns: string[], unwrappedGroupingModel: UnwrappedGroupingModel, pinnedFields: {
right?: string[];
left?: string[];
}) => GridGroupingStructure[][];
export {};
@@ -0,0 +1,19 @@
import type { GridColumnGroupingModel, GridColumnNode, GridColumnGroup } from "../../../models/gridColumnGrouping.js";
import type { GridColDef } from "../../../models/colDef/index.js";
import type { GridColumnGroupLookup, GridGroupingStructure } from "./gridColumnGroupsInterfaces.js";
type UnwrappedGroupingModel = {
[key: GridColDef['field']]: GridColumnGroup['groupId'][];
};
export declare const createGroupLookup: (columnGroupingModel: GridColumnNode[]) => GridColumnGroupLookup;
/**
* This is a function that provide for each column the array of its parents.
* Parents are ordered from the root to the leaf.
* @param columnGroupingModel The model such as provided in DataGrid props
* @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
*/
export declare const unwrapGroupingColumnModel: (columnGroupingModel?: GridColumnGroupingModel) => UnwrappedGroupingModel;
export declare const getColumnGroupsHeaderStructure: (orderedColumns: string[], unwrappedGroupingModel: UnwrappedGroupingModel, pinnedFields: {
right?: string[];
left?: string[];
}) => GridGroupingStructure[][];
export {};
@@ -0,0 +1,130 @@
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.unwrapGroupingColumnModel = exports.getColumnGroupsHeaderStructure = exports.createGroupLookup = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _formatErrorMessage2 = _interopRequireDefault(require("@mui/x-internals/formatErrorMessage"));
var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
var _gridColumnGrouping = require("../../../models/gridColumnGrouping");
const _excluded = ["groupId", "children"];
const createGroupLookup = columnGroupingModel => {
const groupLookup = {};
for (let i = 0; i < columnGroupingModel.length; i += 1) {
const node = columnGroupingModel[i];
if ((0, _gridColumnGrouping.isLeaf)(node)) {
continue;
}
const {
groupId,
children
} = node,
other = (0, _objectWithoutPropertiesLoose2.default)(node, _excluded);
if (!groupId) {
throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X Data Grid: An element of the columnGroupingModel is missing both `field` and `groupId`. ' + 'Each column group must have a groupId to identify it. ' + 'Add a groupId to the column group definition.' : (0, _formatErrorMessage2.default)(74));
}
if (process.env.NODE_ENV !== 'production' && !children) {
console.warn(`MUI X: group groupId=${groupId} has no children.`);
}
const groupParam = (0, _extends2.default)({}, other, {
groupId
});
const subTreeLookup = createGroupLookup(children);
if (subTreeLookup[groupId] !== undefined || groupLookup[groupId] !== undefined) {
throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Data Grid: The groupId "${groupId}" is used multiple times in the columnGroupingModel. ` + 'Each groupId must be unique within the column grouping model. ' + 'Use unique groupId values for each column group.' : (0, _formatErrorMessage2.default)(75, groupId));
}
Object.assign(groupLookup, subTreeLookup);
groupLookup[groupId] = groupParam;
}
return groupLookup;
};
// This is the recurrence function that help writing `unwrapGroupingColumnModel()`
exports.createGroupLookup = createGroupLookup;
const recurrentUnwrapGroupingColumnModel = (columnGroupNode, parents, unwrappedGroupingModelToComplete) => {
if ((0, _gridColumnGrouping.isLeaf)(columnGroupNode)) {
if (unwrappedGroupingModelToComplete[columnGroupNode.field] !== undefined) {
throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Data Grid: The field "${columnGroupNode.field}" appears multiple times in the columnGroupingModel. ` + `It is found in both: "${unwrappedGroupingModelToComplete[columnGroupNode.field].join(' > ')}" and "${parents.join(' > ')}". ` + 'Each field should only appear once in the grouping model.' : (0, _formatErrorMessage2.default)(76, columnGroupNode.field, unwrappedGroupingModelToComplete[columnGroupNode.field].join(' > '), parents.join(' > ')));
}
unwrappedGroupingModelToComplete[columnGroupNode.field] = parents;
return;
}
const {
groupId,
children
} = columnGroupNode;
children.forEach(child => {
recurrentUnwrapGroupingColumnModel(child, [...parents, groupId], unwrappedGroupingModelToComplete);
});
};
/**
* This is a function that provide for each column the array of its parents.
* Parents are ordered from the root to the leaf.
* @param columnGroupingModel The model such as provided in DataGrid props
* @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
*/
const unwrapGroupingColumnModel = columnGroupingModel => {
if (!columnGroupingModel) {
return {};
}
const unwrappedSubTree = {};
columnGroupingModel.forEach(columnGroupNode => {
recurrentUnwrapGroupingColumnModel(columnGroupNode, [], unwrappedSubTree);
});
return unwrappedSubTree;
};
exports.unwrapGroupingColumnModel = unwrapGroupingColumnModel;
const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel, pinnedFields) => {
const getParents = field => unwrappedGroupingModel[field] ?? [];
const groupingHeaderStructure = [];
const maxDepth = Math.max(0, ...orderedColumns.map(field => getParents(field).length));
const haveSameParents = (field1, field2, depth) => {
const a = getParents(field1);
const b = getParents(field2);
for (let i = 0; i <= depth; i += 1) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
};
const haveDifferentContainers = (field1, field2) => {
const left = pinnedFields?.left;
const right = pinnedFields?.right;
const inLeft1 = !!left?.includes(field1);
const inLeft2 = !!left?.includes(field2);
const inRight1 = !!right?.includes(field1);
const inRight2 = !!right?.includes(field2);
return inLeft1 !== inLeft2 || inRight1 !== inRight2;
};
for (let depth = 0; depth < maxDepth; depth += 1) {
const depthStructure = [];
for (let i = 0; i < orderedColumns.length; i += 1) {
const field = orderedColumns[i];
const groupId = getParents(field)[depth] ?? null;
if (depthStructure.length === 0) {
depthStructure.push({
columnFields: [field],
groupId
});
continue;
}
const lastGroup = depthStructure[depthStructure.length - 1];
const prevField = lastGroup.columnFields[lastGroup.columnFields.length - 1];
if (lastGroup.groupId !== groupId || !haveSameParents(prevField, field, depth) || haveDifferentContainers(prevField, field)) {
depthStructure.push({
columnFields: [field],
groupId
});
} else {
lastGroup.columnFields.push(field);
}
}
groupingHeaderStructure.push(depthStructure);
}
return groupingHeaderStructure;
};
exports.getColumnGroupsHeaderStructure = getColumnGroupsHeaderStructure;
@@ -0,0 +1,120 @@
import _extends from "@babel/runtime/helpers/esm/extends";
import _formatErrorMessage from "@mui/x-internals/formatErrorMessage";
import _objectWithoutPropertiesLoose from "@babel/runtime/helpers/esm/objectWithoutPropertiesLoose";
const _excluded = ["groupId", "children"];
import { isLeaf } from "../../../models/gridColumnGrouping.mjs";
export const createGroupLookup = columnGroupingModel => {
const groupLookup = {};
for (let i = 0; i < columnGroupingModel.length; i += 1) {
const node = columnGroupingModel[i];
if (isLeaf(node)) {
continue;
}
const {
groupId,
children
} = node,
other = _objectWithoutPropertiesLoose(node, _excluded);
if (!groupId) {
throw new Error(process.env.NODE_ENV !== "production" ? 'MUI X Data Grid: An element of the columnGroupingModel is missing both `field` and `groupId`. ' + 'Each column group must have a groupId to identify it. ' + 'Add a groupId to the column group definition.' : _formatErrorMessage(74));
}
if (process.env.NODE_ENV !== 'production' && !children) {
console.warn(`MUI X: group groupId=${groupId} has no children.`);
}
const groupParam = _extends({}, other, {
groupId
});
const subTreeLookup = createGroupLookup(children);
if (subTreeLookup[groupId] !== undefined || groupLookup[groupId] !== undefined) {
throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Data Grid: The groupId "${groupId}" is used multiple times in the columnGroupingModel. ` + 'Each groupId must be unique within the column grouping model. ' + 'Use unique groupId values for each column group.' : _formatErrorMessage(75, groupId));
}
Object.assign(groupLookup, subTreeLookup);
groupLookup[groupId] = groupParam;
}
return groupLookup;
};
// This is the recurrence function that help writing `unwrapGroupingColumnModel()`
const recurrentUnwrapGroupingColumnModel = (columnGroupNode, parents, unwrappedGroupingModelToComplete) => {
if (isLeaf(columnGroupNode)) {
if (unwrappedGroupingModelToComplete[columnGroupNode.field] !== undefined) {
throw new Error(process.env.NODE_ENV !== "production" ? `MUI X Data Grid: The field "${columnGroupNode.field}" appears multiple times in the columnGroupingModel. ` + `It is found in both: "${unwrappedGroupingModelToComplete[columnGroupNode.field].join(' > ')}" and "${parents.join(' > ')}". ` + 'Each field should only appear once in the grouping model.' : _formatErrorMessage(76, columnGroupNode.field, unwrappedGroupingModelToComplete[columnGroupNode.field].join(' > '), parents.join(' > ')));
}
unwrappedGroupingModelToComplete[columnGroupNode.field] = parents;
return;
}
const {
groupId,
children
} = columnGroupNode;
children.forEach(child => {
recurrentUnwrapGroupingColumnModel(child, [...parents, groupId], unwrappedGroupingModelToComplete);
});
};
/**
* This is a function that provide for each column the array of its parents.
* Parents are ordered from the root to the leaf.
* @param columnGroupingModel The model such as provided in DataGrid props
* @returns An object `{[field]: groupIds}` where `groupIds` is the parents of the column `field`
*/
export const unwrapGroupingColumnModel = columnGroupingModel => {
if (!columnGroupingModel) {
return {};
}
const unwrappedSubTree = {};
columnGroupingModel.forEach(columnGroupNode => {
recurrentUnwrapGroupingColumnModel(columnGroupNode, [], unwrappedSubTree);
});
return unwrappedSubTree;
};
export const getColumnGroupsHeaderStructure = (orderedColumns, unwrappedGroupingModel, pinnedFields) => {
const getParents = field => unwrappedGroupingModel[field] ?? [];
const groupingHeaderStructure = [];
const maxDepth = Math.max(0, ...orderedColumns.map(field => getParents(field).length));
const haveSameParents = (field1, field2, depth) => {
const a = getParents(field1);
const b = getParents(field2);
for (let i = 0; i <= depth; i += 1) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
};
const haveDifferentContainers = (field1, field2) => {
const left = pinnedFields?.left;
const right = pinnedFields?.right;
const inLeft1 = !!left?.includes(field1);
const inLeft2 = !!left?.includes(field2);
const inRight1 = !!right?.includes(field1);
const inRight2 = !!right?.includes(field2);
return inLeft1 !== inLeft2 || inRight1 !== inRight2;
};
for (let depth = 0; depth < maxDepth; depth += 1) {
const depthStructure = [];
for (let i = 0; i < orderedColumns.length; i += 1) {
const field = orderedColumns[i];
const groupId = getParents(field)[depth] ?? null;
if (depthStructure.length === 0) {
depthStructure.push({
columnFields: [field],
groupId
});
continue;
}
const lastGroup = depthStructure[depthStructure.length - 1];
const prevField = lastGroup.columnFields[lastGroup.columnFields.length - 1];
if (lastGroup.groupId !== groupId || !haveSameParents(prevField, field, depth) || haveDifferentContainers(prevField, field)) {
depthStructure.push({
columnFields: [field],
groupId
});
} else {
lastGroup.columnFields.push(field);
}
}
groupingHeaderStructure.push(depthStructure);
}
return groupingHeaderStructure;
};
@@ -0,0 +1,2 @@
export * from "./gridColumnGroupsSelector.mjs";
export type { GridColumnsGroupingState } from "./gridColumnGroupsInterfaces.mjs";
@@ -0,0 +1,2 @@
export * from "./gridColumnGroupsSelector.js";
export type { GridColumnsGroupingState } from "./gridColumnGroupsInterfaces.js";
@@ -0,0 +1,16 @@
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
var _gridColumnGroupsSelector = require("./gridColumnGroupsSelector");
Object.keys(_gridColumnGroupsSelector).forEach(function (key) {
if (key === "default" || key === "__esModule") return;
if (key in exports && exports[key] === _gridColumnGroupsSelector[key]) return;
Object.defineProperty(exports, key, {
enumerable: true,
get: function () {
return _gridColumnGroupsSelector[key];
}
});
});
@@ -0,0 +1,2 @@
export * from "./gridColumnGroupsSelector.mjs";
export {};
@@ -0,0 +1,10 @@
import type { RefObject } from '@mui/x-internals/types';
import type { GridPrivateApiCommunity } from "../../../models/api/gridApiCommunity.mjs";
import type { DataGridProcessedProps } from "../../../models/props/DataGridProps.mjs";
import type { GridStateInitializer } from "../../utils/useGridInitializeState.mjs";
export declare const columnGroupsStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'columnGroupingModel'>>;
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
export declare const useGridColumnGrouping: (apiRef: RefObject<GridPrivateApiCommunity>, props: Pick<DataGridProcessedProps, 'columnGroupingModel'>) => void;
@@ -0,0 +1,10 @@
import type { RefObject } from '@mui/x-internals/types';
import type { GridPrivateApiCommunity } from "../../../models/api/gridApiCommunity.js";
import type { DataGridProcessedProps } from "../../../models/props/DataGridProps.js";
import type { GridStateInitializer } from "../../utils/useGridInitializeState.js";
export declare const columnGroupsStateInitializer: GridStateInitializer<Pick<DataGridProcessedProps, 'columnGroupingModel'>>;
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
export declare const useGridColumnGrouping: (apiRef: RefObject<GridPrivateApiCommunity>, props: Pick<DataGridProcessedProps, 'columnGroupingModel'>) => void;
@@ -0,0 +1,119 @@
"use strict";
'use client';
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useGridColumnGrouping = exports.columnGroupsStateInitializer = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var React = _interopRequireWildcard(require("react"));
var _gridColumnGroupsSelector = require("./gridColumnGroupsSelector");
var _useGridApiMethod = require("../../utils/useGridApiMethod");
var _gridColumnGroupsUtils = require("./gridColumnGroupsUtils");
var _useGridEvent = require("../../utils/useGridEvent");
var _columns = require("../columns");
const columnGroupsStateInitializer = (state, props, apiRef) => {
apiRef.current.caches.columnGrouping = {
lastColumnGroupingModel: props.columnGroupingModel
};
if (!props.columnGroupingModel) {
return (0, _extends2.default)({}, state, {
columnGrouping: undefined
});
}
const columnFields = (0, _columns.gridColumnFieldsSelector)(apiRef);
const visibleColumnFields = (0, _columns.gridVisibleColumnFieldsSelector)(apiRef);
const groupLookup = (0, _gridColumnGroupsUtils.createGroupLookup)(props.columnGroupingModel ?? []);
const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(props.columnGroupingModel ?? []);
const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel, apiRef.current.state.pinnedColumns ?? {});
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
return (0, _extends2.default)({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
};
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
exports.columnGroupsStateInitializer = columnGroupsStateInitializer;
const useGridColumnGrouping = (apiRef, props) => {
/**
* API METHODS
*/
const getColumnGroupPath = React.useCallback(field => {
const unwrappedGroupingModel = (0, _gridColumnGroupsSelector.gridColumnGroupsUnwrappedModelSelector)(apiRef);
return unwrappedGroupingModel[field] ?? [];
}, [apiRef]);
const getAllGroupDetails = React.useCallback(() => {
const columnGroupLookup = (0, _gridColumnGroupsSelector.gridColumnGroupsLookupSelector)(apiRef);
return columnGroupLookup;
}, [apiRef]);
const columnGroupingApi = {
getColumnGroupPath,
getAllGroupDetails
};
(0, _useGridApiMethod.useGridApiMethod)(apiRef, columnGroupingApi, 'public');
const handleColumnIndexChange = React.useCallback(() => {
const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(props.columnGroupingModel ?? []);
apiRef.current.setState(state => {
const orderedFields = state.columns?.orderedFields ?? [];
const pinnedColumns = state.pinnedColumns ?? {};
const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(orderedFields, unwrappedGroupingModel, pinnedColumns);
return (0, _extends2.default)({}, state, {
columnGrouping: (0, _extends2.default)({}, state.columnGrouping, {
headerStructure: columnGroupsHeaderStructure
})
});
});
}, [apiRef, props.columnGroupingModel]);
const updateColumnGroupingState = React.useCallback(columnGroupingModel => {
if (!columnGroupingModel && !apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
apiRef.current.caches.columnGrouping.lastColumnGroupingModel = columnGroupingModel;
// @ts-expect-error Move this logic to `Pro` package
const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
const columnFields = (0, _columns.gridColumnFieldsSelector)(apiRef);
const visibleColumnFields = (0, _columns.gridVisibleColumnFieldsSelector)(apiRef);
const groupLookup = (0, _gridColumnGroupsUtils.createGroupLookup)(columnGroupingModel ?? []);
const unwrappedGroupingModel = (0, _gridColumnGroupsUtils.unwrapGroupingColumnModel)(columnGroupingModel ?? []);
const columnGroupsHeaderStructure = (0, _gridColumnGroupsUtils.getColumnGroupsHeaderStructure)(columnFields, unwrappedGroupingModel, pinnedColumns);
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
apiRef.current.setState(state => {
return (0, _extends2.default)({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
});
}, [apiRef]);
(0, _useGridEvent.useGridEvent)(apiRef, 'columnIndexChange', handleColumnIndexChange);
(0, _useGridEvent.useGridEvent)(apiRef, 'columnsChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
(0, _useGridEvent.useGridEvent)(apiRef, 'columnVisibilityModelChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
/**
* EFFECTS
*/
React.useEffect(() => {
if (props.columnGroupingModel === apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
updateColumnGroupingState(props.columnGroupingModel);
}, [apiRef, updateColumnGroupingState, props.columnGroupingModel]);
};
exports.useGridColumnGrouping = useGridColumnGrouping;
@@ -0,0 +1,110 @@
'use client';
import _extends from "@babel/runtime/helpers/esm/extends";
import * as React from 'react';
import { gridColumnGroupsLookupSelector, gridColumnGroupsUnwrappedModelSelector } from "./gridColumnGroupsSelector.mjs";
import { useGridApiMethod } from "../../utils/useGridApiMethod.mjs";
import { createGroupLookup, getColumnGroupsHeaderStructure, unwrapGroupingColumnModel } from "./gridColumnGroupsUtils.mjs";
import { useGridEvent } from "../../utils/useGridEvent.mjs";
import { gridColumnFieldsSelector, gridVisibleColumnFieldsSelector } from "../columns/index.mjs";
export const columnGroupsStateInitializer = (state, props, apiRef) => {
apiRef.current.caches.columnGrouping = {
lastColumnGroupingModel: props.columnGroupingModel
};
if (!props.columnGroupingModel) {
return _extends({}, state, {
columnGrouping: undefined
});
}
const columnFields = gridColumnFieldsSelector(apiRef);
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
const groupLookup = createGroupLookup(props.columnGroupingModel ?? []);
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, apiRef.current.state.pinnedColumns ?? {});
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
return _extends({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
};
/**
* @requires useGridColumns (method, event)
* @requires useGridParamsApi (method)
*/
export const useGridColumnGrouping = (apiRef, props) => {
/**
* API METHODS
*/
const getColumnGroupPath = React.useCallback(field => {
const unwrappedGroupingModel = gridColumnGroupsUnwrappedModelSelector(apiRef);
return unwrappedGroupingModel[field] ?? [];
}, [apiRef]);
const getAllGroupDetails = React.useCallback(() => {
const columnGroupLookup = gridColumnGroupsLookupSelector(apiRef);
return columnGroupLookup;
}, [apiRef]);
const columnGroupingApi = {
getColumnGroupPath,
getAllGroupDetails
};
useGridApiMethod(apiRef, columnGroupingApi, 'public');
const handleColumnIndexChange = React.useCallback(() => {
const unwrappedGroupingModel = unwrapGroupingColumnModel(props.columnGroupingModel ?? []);
apiRef.current.setState(state => {
const orderedFields = state.columns?.orderedFields ?? [];
const pinnedColumns = state.pinnedColumns ?? {};
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(orderedFields, unwrappedGroupingModel, pinnedColumns);
return _extends({}, state, {
columnGrouping: _extends({}, state.columnGrouping, {
headerStructure: columnGroupsHeaderStructure
})
});
});
}, [apiRef, props.columnGroupingModel]);
const updateColumnGroupingState = React.useCallback(columnGroupingModel => {
if (!columnGroupingModel && !apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
apiRef.current.caches.columnGrouping.lastColumnGroupingModel = columnGroupingModel;
// @ts-expect-error Move this logic to `Pro` package
const pinnedColumns = apiRef.current.getPinnedColumns?.() ?? {};
const columnFields = gridColumnFieldsSelector(apiRef);
const visibleColumnFields = gridVisibleColumnFieldsSelector(apiRef);
const groupLookup = createGroupLookup(columnGroupingModel ?? []);
const unwrappedGroupingModel = unwrapGroupingColumnModel(columnGroupingModel ?? []);
const columnGroupsHeaderStructure = getColumnGroupsHeaderStructure(columnFields, unwrappedGroupingModel, pinnedColumns);
const maxDepth = visibleColumnFields.length === 0 ? 0 : Math.max(...visibleColumnFields.map(field => unwrappedGroupingModel[field]?.length ?? 0));
apiRef.current.setState(state => {
return _extends({}, state, {
columnGrouping: {
lookup: groupLookup,
unwrappedGroupingModel,
headerStructure: columnGroupsHeaderStructure,
maxDepth
}
});
});
}, [apiRef]);
useGridEvent(apiRef, 'columnIndexChange', handleColumnIndexChange);
useGridEvent(apiRef, 'columnsChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
useGridEvent(apiRef, 'columnVisibilityModelChange', () => {
updateColumnGroupingState(props.columnGroupingModel);
});
/**
* EFFECTS
*/
React.useEffect(() => {
if (props.columnGroupingModel === apiRef.current.caches.columnGrouping.lastColumnGroupingModel) {
return;
}
updateColumnGroupingState(props.columnGroupingModel);
}, [apiRef, updateColumnGroupingState, props.columnGroupingModel]);
};