ms-data-grid
Version:
A powerful, customizable Angular data grid component with advanced features like sorting, filtering, pagination, column pinning, and taskbar actions. Perfect for enterprise applications.
118 lines • 17.2 kB
JavaScript
import { Injectable } from '@angular/core';
import * as i0 from "@angular/core";
export class SwapColumnsService {
constructor() { }
deepClone(obj) {
return JSON.parse(JSON.stringify(obj));
}
flattenColumnsWithPaths(columns) {
const result = [];
const recurse = (cols, currentPath = []) => {
cols.forEach((col, index) => {
const path = [...currentPath, index];
result.push({ col, path });
if (Array.isArray(col.children)) {
recurse(col.children, path);
}
});
};
recurse(columns);
return result;
}
findColumnByIndex(columns, index, flat, _path = [], currentPath = []) {
for (let i = 0; i < columns.length; i++) {
const col = columns[i];
const nextPath = [...currentPath, i];
if (flat[index] === col) {
return { column: col, parent: columns, path: nextPath };
}
if (Array.isArray(col?.children)) {
const result = this.findColumnByIndex(col?.children, index, flat, _path, nextPath);
if (result)
return result;
}
}
return null;
}
insertAtPath(columns, path, newColumn) {
const cloned = this.deepClone(columns);
let current = cloned;
for (let i = 0; i < path.length - 1; i++) {
if (!current[path[i]]?.children) {
current[path[i]].children = [];
}
current = current[path[i]]?.children;
}
const insertIndex = path[path.length - 1];
current.splice(insertIndex, 0, newColumn);
return cloned;
}
removeAtPath(columns, path) {
const cloned = this.deepClone(columns);
let current = cloned;
for (let i = 0; i < path.length - 1; i++) {
if (!current[path[i]]?.children) {
return cloned; // Safety: path is invalid
}
current = current[path[i]]?.children;
}
const removeIndex = path[path.length - 1];
if (Array.isArray(current) && current.length > removeIndex) {
current.splice(removeIndex, 1);
}
return cloned;
}
swapColumnsInTree(currentColumn, columns, fromIndex, toIndex) {
const flat = this.flattenColumnsWithPaths(columns);
if (fromIndex < 0 ||
toIndex < 0 ||
fromIndex >= flat.length ||
toIndex >= flat.length) {
return columns; // invalid indices
}
const fromInfo = this.findColumnByIndex(columns, fromIndex, flat);
const toInfo = this.findColumnByIndex(columns, toIndex, flat);
if (!fromInfo || !toInfo)
return columns;
const fromCol = fromInfo.column;
const toCol = toInfo.column;
let updatedCols = this.removeAtPath(columns, fromInfo.path);
// Case 1: Same parent
if (JSON.stringify(fromInfo.path.slice(0, -1)) ===
JSON.stringify(toInfo.path.slice(0, -1))) {
return this.insertAtPath(updatedCols, toInfo.path, fromCol);
}
// Case 2: Drop target is a group header
if (Array.isArray(toCol?.children)) {
const cloned = this.deepClone(updatedCols);
let parent = cloned;
for (let i = 0; i < toInfo.path.length - 1; i++) {
parent = parent[toInfo.path[i]].children;
}
const target = parent[toInfo.path[toInfo.path.length - 1]];
if (!target.children) {
target.children = [];
}
target.children.push(fromCol);
return cloned;
}
// Case 3: Drop target is a regular column → wrap both into a group
const groupHeader = {
headerName: toCol.headerName || 'Group',
children: [toCol, fromCol],
};
// Remove target from its original location
updatedCols = this.removeAtPath(updatedCols, toInfo.path);
// Insert group at target index
return this.insertAtPath(updatedCols, toInfo.path, groupHeader);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SwapColumnsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SwapColumnsService, providedIn: 'root' }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SwapColumnsService, decorators: [{
type: Injectable,
args: [{
providedIn: 'root',
}]
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhcC1jb2x1bW5zLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9kYXRhLWdyaWQvc3JjL2xpYi9zZXJ2aWNlcy9zd2FwLWNvbHVtbnMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOztBQUszQyxNQUFNLE9BQU8sa0JBQWtCO0lBQzdCLGdCQUFlLENBQUM7SUFFaEIsU0FBUyxDQUFDLEdBQVE7UUFDaEIsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsdUJBQXVCLENBQUMsT0FBYztRQUNwQyxNQUFNLE1BQU0sR0FBbUMsRUFBRSxDQUFDO1FBRWxELE1BQU0sT0FBTyxHQUFHLENBQUMsSUFBVyxFQUFFLGNBQXdCLEVBQUUsRUFBRSxFQUFFO1lBQzFELElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7Z0JBQzFCLE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztnQkFFM0IsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtvQkFDL0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7aUJBQzdCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDakIsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELGlCQUFpQixDQUNmLE9BQWMsRUFDZCxLQUFhLEVBQ2IsSUFBVyxF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Q0FBQzsrR0EzSlUsa0JBQWtCO21IQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7NEZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTd2FwQ29sdW1uc1NlcnZpY2Uge1xyXG4gIGNvbnN0cnVjdG9yKCkge31cclxuXHJcbiAgZGVlcENsb25lKG9iajogYW55KSB7XHJcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcclxuICB9XHJcblxyXG4gIGZsYXR0ZW5Db2x1bW5zV2l0aFBhdGhzKGNvbHVtbnM6IGFueVtdKTogeyBjb2w6IGFueTsgcGF0aDogbnVtYmVyW10gfVtdIHtcclxuICAgIGNvbnN0IHJlc3VsdDogeyBjb2w6IGFueTsgcGF0aDogbnVtYmVyW10gfVtdID0gW107XHJcblxyXG4gICAgY29uc3QgcmVjdXJzZSA9IChjb2xzOiBhbnlbXSwgY3VycmVudFBhdGg6IG51bWJlcltdID0gW10pID0+IHtcclxuICAgICAgY29scy5mb3JFYWNoKChjb2wsIGluZGV4KSA9PiB7XHJcbiAgICAgICAgY29uc3QgcGF0aCA9IFsuLi5jdXJyZW50UGF0aCwgaW5kZXhdO1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKHsgY29sLCBwYXRoIH0pO1xyXG5cclxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb2wuY2hpbGRyZW4pKSB7XHJcbiAgICAgICAgICByZWN1cnNlKGNvbC5jaGlsZHJlbiwgcGF0aCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgIH07XHJcblxyXG4gICAgcmVjdXJzZShjb2x1bW5zKTtcclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBmaW5kQ29sdW1uQnlJbmRleChcclxuICAgIGNvbHVtbnM6IGFueVtdLFxyXG4gICAgaW5kZXg6IG51bWJlcixcclxuICAgIGZsYXQ6IGFueVtdLFxyXG4gICAgX3BhdGg6IG51bWJlcltdW10gPSBbXSxcclxuICAgIGN1cnJlbnRQYXRoOiBudW1iZXJbXSA9IFtdXHJcbiAgKTogeyBjb2x1bW46IGFueTsgcGFyZW50OiBhbnlbXTsgcGF0aDogbnVtYmVyW10gfSB8IG51bGwge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGNvbCA9IGNvbHVtbnNbaV07XHJcbiAgICAgIGNvbnN0IG5leHRQYXRoID0gWy4uLmN1cnJlbnRQYXRoLCBpXTtcclxuXHJcbiAgICAgIGlmIChmbGF0W2luZGV4XSA9PT0gY29sKSB7XHJcbiAgICAgICAgcmV0dXJuIHsgY29sdW1uOiBjb2wsIHBhcmVudDogY29sdW1ucywgcGF0aDogbmV4dFBhdGggfTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sPy5jaGlsZHJlbikpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpbmRDb2x1bW5CeUluZGV4KFxyXG4gICAgICAgICAgY29sPy5jaGlsZHJlbixcclxuICAgICAgICAgIGluZGV4LFxyXG4gICAgICAgICAgZmxhdCxcclxuICAgICAgICAgIF9wYXRoLFxyXG4gICAgICAgICAgbmV4dFBhdGhcclxuICAgICAgICApO1xyXG4gICAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gbnVsbDtcclxuICB9XHJcblxyXG4gIGluc2VydEF0UGF0aChjb2x1bW5zOiBhbnlbXSwgcGF0aDogbnVtYmVyW10sIG5ld0NvbHVtbjogYW55KTogYW55W10ge1xyXG4gICAgY29uc3QgY2xvbmVkID0gdGhpcy5kZWVwQ2xvbmUoY29sdW1ucyk7XHJcbiAgICBsZXQgY3VycmVudCA9IGNsb25lZDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgIGlmICghY3VycmVudFtwYXRoW2ldXT8uY2hpbGRyZW4pIHtcclxuICAgICAgICBjdXJyZW50W3BhdGhbaV1dIS5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50ID0gY3VycmVudFtwYXRoW2ldXT8uY2hpbGRyZW47XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgaW5zZXJ0SW5kZXggPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XHJcbiAgICBjdXJyZW50LnNwbGljZShpbnNlcnRJbmRleCwgMCwgbmV3Q29sdW1uKTtcclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG5cclxuICByZW1vdmVBdFBhdGgoY29sdW1uczogYW55W10sIHBhdGg6IG51bWJlcltdKTogYW55W10ge1xyXG4gICAgY29uc3QgY2xvbmVkID0gdGhpcy5kZWVwQ2xvbmUoY29sdW1ucyk7XHJcbiAgICBsZXQgY3VycmVudCA9IGNsb25lZDtcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoIC0gMTsgaSsrKSB7XHJcbiAgICAgIGlmICghY3VycmVudFtwYXRoW2ldXT8uY2hpbGRyZW4pIHtcclxuICAgICAgICByZXR1cm4gY2xvbmVkOyAvLyBTYWZldHk6IHBhdGggaXMgaW52YWxpZFxyXG4gICAgICB9XHJcbiAgICAgIGN1cnJlbnQgPSBjdXJyZW50W3BhdGhbaV1dPy5jaGlsZHJlbjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZW1vdmVJbmRleCA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcclxuICAgIGlmIChBcnJheS5pc0FycmF5KGN1cnJlbnQpICYmIGN1cnJlbnQubGVuZ3RoID4gcmVtb3ZlSW5kZXgpIHtcclxuICAgICAgY3VycmVudC5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjbG9uZWQ7XHJcbiAgfVxyXG5cclxuICBzd2FwQ29sdW1uc0luVHJlZShcclxuICAgIGN1cnJlbnRDb2x1bW46IGFueSxcclxuICAgIGNvbHVtbnM6IGFueVtdLFxyXG4gICAgZnJvbUluZGV4OiBudW1iZXIsXHJcbiAgICB0b0luZGV4OiBudW1iZXJcclxuICApOiBhbnlbXSB7XHJcbiAgICBjb25zdCBmbGF0ID0gdGhpcy5mbGF0dGVuQ29sdW1uc1dpdGhQYXRocyhjb2x1bW5zKTtcclxuXHJcbiAgICBpZiAoXHJcbiAgICAgIGZyb21JbmRleCA8IDAgfHxcclxuICAgICAgdG9JbmRleCA8IDAgfHxcclxuICAgICAgZnJvbUluZGV4ID49IGZsYXQubGVuZ3RoIHx8XHJcbiAgICAgIHRvSW5kZXggPj0gZmxhdC5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICByZXR1cm4gY29sdW1uczsgLy8gaW52YWxpZCBpbmRpY2VzXHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZnJvbUluZm8gPSB0aGlzLmZpbmRDb2x1bW5CeUluZGV4KGNvbHVtbnMsIGZyb21JbmRleCwgZmxhdCk7XHJcbiAgICBjb25zdCB0b0luZm8gPSB0aGlzLmZpbmRDb2x1bW5CeUluZGV4KGNvbHVtbnMsIHRvSW5kZXgsIGZsYXQpO1xyXG5cclxuICAgIGlmICghZnJvbUluZm8gfHwgIXRvSW5mbykgcmV0dXJuIGNvbHVtbnM7XHJcblxyXG4gICAgY29uc3QgZnJvbUNvbCA9IGZyb21JbmZvLmNvbHVtbjtcclxuICAgIGNvbnN0IHRvQ29sID0gdG9JbmZvLmNvbHVtbjtcclxuXHJcbiAgICBsZXQgdXBkYXRlZENvbHMgPSB0aGlzLnJlbW92ZUF0UGF0aChjb2x1bW5zLCBmcm9tSW5mby5wYXRoKTtcclxuXHJcbiAgICAvLyBDYXNlIDE6IFNhbWUgcGFyZW50XHJcbiAgICBpZiAoXHJcbiAgICAgIEpTT04uc3RyaW5naWZ5KGZyb21JbmZvLnBhdGguc2xpY2UoMCwgLTEpKSA9PT1cclxuICAgICAgSlNPTi5zdHJpbmdpZnkodG9JbmZvLnBhdGguc2xpY2UoMCwgLTEpKVxyXG4gICAgKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmluc2VydEF0UGF0aCh1cGRhdGVkQ29scywgdG9JbmZvLnBhdGgsIGZyb21Db2wpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhc2UgMjogRHJvcCB0YXJnZXQgaXMgYSBncm91cCBoZWFkZXJcclxuICAgIGlmIChBcnJheS5pc0FycmF5KHRvQ29sPy5jaGlsZHJlbikpIHtcclxuICAgICAgY29uc3QgY2xvbmVkID0gdGhpcy5kZWVwQ2xvbmUodXBkYXRlZENvbHMpO1xyXG4gICAgICBsZXQgcGFyZW50ID0gY2xvbmVkO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0b0luZm8ucGF0aC5sZW5ndGggLSAxOyBpKyspIHtcclxuICAgICAgICBwYXJlbnQgPSBwYXJlbnRbdG9JbmZvLnBhdGhbaV1dLmNoaWxkcmVuO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjb25zdCB0YXJnZXQgPSBwYXJlbnRbdG9JbmZvLnBhdGhbdG9JbmZvLnBhdGgubGVuZ3RoIC0gMV1dO1xyXG4gICAgICBpZiAoIXRhcmdldC5jaGlsZHJlbikge1xyXG4gICAgICAgIHRhcmdldC5jaGlsZHJlbiA9IFtdO1xyXG4gICAgICB9XHJcblxyXG4gICAgICB0YXJnZXQuY2hpbGRyZW4ucHVzaChmcm9tQ29sKTtcclxuICAgICAgcmV0dXJuIGNsb25lZDtcclxuICAgIH1cclxuXHJcbiAgICAvLyBDYXNlIDM6IERyb3AgdGFyZ2V0IGlzIGEgcmVndWxhciBjb2x1bW4g4oaSIHdyYXAgYm90aCBpbnRvIGEgZ3JvdXBcclxuICAgIGNvbnN0IGdyb3VwSGVhZGVyID0ge1xyXG4gICAgICBoZWFkZXJOYW1lOiB0b0NvbC5oZWFkZXJOYW1lIHx8ICdHcm91cCcsXHJcbiAgICAgIGNoaWxkcmVuOiBbdG9Db2wsIGZyb21Db2xdLFxyXG4gICAgfTtcclxuXHJcbiAgICAvLyBSZW1vdmUgdGFyZ2V0IGZyb20gaXRzIG9yaWdpbmFsIGxvY2F0aW9uXHJcbiAgICB1cGRhdGVkQ29scyA9IHRoaXMucmVtb3ZlQXRQYXRoKHVwZGF0ZWRDb2xzLCB0b0luZm8ucGF0aCk7XHJcblxyXG4gICAgLy8gSW5zZXJ0IGdyb3VwIGF0IHRhcmdldCBpbmRleFxyXG4gICAgcmV0dXJuIHRoaXMuaW5zZXJ0QXRQYXRoKHVwZGF0ZWRDb2xzLCB0b0luZm8ucGF0aCwgZ3JvdXBIZWFkZXIpO1xyXG4gIH1cclxufVxyXG4iXX0=