UNPKG

@mui/x-data-grid-premium

Version:

The Premium plan edition of the MUI X Data Grid Components.

122 lines (121 loc) 5.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.rowGroupingReorderValidator = void 0; var _utils = require("./utils"); const validationRules = [ // ===== Basic invalid cases ===== { name: 'same-position', applies: ctx => ctx.sourceRowIndex === ctx.targetRowIndex, isInvalid: () => true, message: 'Source and target are the same' }, { name: 'adjacent-position', applies: ctx => _utils.conditions.isAdjacentPosition(ctx), isInvalid: () => true, message: 'Source and target are adjacent' }, { name: 'group-to-leaf', applies: _utils.conditions.isGroupToLeaf, isInvalid: () => true, message: 'Cannot drop group on leaf' }, // ===== Group to Group Rules ===== { name: 'group-to-group-above-leaf-belongs-to-source', applies: ctx => _utils.conditions.isGroupToGroup(ctx) && _utils.conditions.isDropAbove(ctx) && _utils.conditions.prevIsLeaf(ctx), isInvalid: _utils.conditions.prevBelongsToSource, message: 'Previous leaf belongs to source group or its descendants' }, { name: 'group-to-group-above-invalid-depth', applies: ctx => _utils.conditions.isGroupToGroup(ctx) && _utils.conditions.isDropAbove(ctx) && !_utils.conditions.sameDepth(ctx) && !(ctx.targetNode.depth < ctx.sourceNode.depth && (_utils.conditions.prevIsLeaf(ctx) || _utils.conditions.prevIsGroup(ctx) && _utils.conditions.prevDepthEqualsSource(ctx))), isInvalid: () => true, message: 'Invalid depth configuration for group above group' }, { name: 'group-to-group-above-different-parent-depth', applies: ctx => _utils.conditions.isGroupToGroup(ctx) && _utils.conditions.isDropAbove(ctx) && _utils.conditions.prevIsGroup(ctx) && _utils.conditions.prevDepthEqualsSource(ctx) && _utils.conditions.targetGroupExpanded(ctx), isInvalid: ctx => ctx.prevNode.depth !== ctx.sourceNode.depth, message: 'Cannot reorder groups with different depths' }, { name: 'group-to-group-below-invalid-config', applies: ctx => _utils.conditions.isGroupToGroup(ctx) && _utils.conditions.isDropBelow(ctx), isInvalid: ctx => { // Valid case 1: Same depth and target not expanded if (_utils.conditions.sameDepth(ctx) && _utils.conditions.targetGroupCollapsed(ctx)) { return false; } // Valid case 2: Target is parent level, expanded, with compatible first child if (_utils.conditions.targetDepthIsSourceMinusOne(ctx) && _utils.conditions.targetGroupExpanded(ctx) && _utils.conditions.targetFirstChildIsGroupWithSourceDepth(ctx)) { return false; } return true; }, message: 'Invalid group below group configuration' }, // ===== Leaf to Leaf Rules ===== { name: 'leaf-to-leaf-different-depth', applies: ctx => _utils.conditions.isLeafToLeaf(ctx) && !_utils.conditions.sameDepth(ctx), isInvalid: () => true, message: 'Leaves at different depths cannot be reordered' }, { name: 'leaf-to-leaf-invalid-below', applies: ctx => _utils.conditions.isLeafToLeaf(ctx) && _utils.conditions.sameDepth(ctx) && !_utils.conditions.sameParent(ctx) && _utils.conditions.isDropBelow(ctx), isInvalid: ctx => !(_utils.conditions.nextIsGroup(ctx) && ctx.sourceNode.depth > ctx.nextNode.depth) && !_utils.conditions.nextIsLeaf(ctx), message: 'Invalid leaf below leaf configuration' }, // ===== Leaf to Group Rules ===== { name: 'leaf-to-group-above-no-prev-leaf', applies: ctx => _utils.conditions.isLeafToGroup(ctx) && _utils.conditions.isDropAbove(ctx), isInvalid: ctx => !_utils.conditions.hasPrevNode(ctx) || !_utils.conditions.prevIsLeaf(ctx), message: 'No valid previous leaf for leaf above group' }, { name: 'leaf-to-group-above-depth-mismatch', applies: ctx => _utils.conditions.isLeafToGroup(ctx) && _utils.conditions.isDropAbove(ctx) && _utils.conditions.prevIsLeaf(ctx) && !(ctx.sourceNode.depth > ctx.targetNode.depth && ctx.targetNode.depth === 0), isInvalid: ctx => ctx.prevNode.depth !== ctx.sourceNode.depth, message: 'Previous node depth mismatch for leaf above group' }, { name: 'leaf-to-group-below-collapsed', applies: ctx => _utils.conditions.isLeafToGroup(ctx) && _utils.conditions.isDropBelow(ctx), isInvalid: _utils.conditions.targetGroupCollapsed, message: 'Cannot drop below collapsed group' }, { name: 'leaf-to-group-below-invalid-depth', applies: ctx => _utils.conditions.isLeafToGroup(ctx) && _utils.conditions.isDropBelow(ctx) && _utils.conditions.targetGroupExpanded(ctx), isInvalid: ctx => { // Valid case 1: Target is parent level if (ctx.sourceNode.depth > ctx.targetNode.depth && ctx.targetNode.depth === ctx.sourceNode.depth - 1) { return false; } // Valid case 2: First child has same depth as source if (_utils.conditions.targetFirstChildDepthEqualsSource(ctx)) { return false; } return true; }, message: 'Invalid depth configuration for leaf below group' }]; class RowReorderValidator { constructor(rules = validationRules) { this.rules = rules; } addRule(rule) { this.rules.push(rule); } removeRule(ruleName) { this.rules = this.rules.filter(r => r.name !== ruleName); } validate(context) { // Check all validation rules for (const rule of this.rules) { if (rule.applies(context) && rule.isInvalid(context)) { return false; } } return true; } } const rowGroupingReorderValidator = exports.rowGroupingReorderValidator = new RowReorderValidator(validationRules);