@theseam/ui-common 1.0.0-beta.6 → 1.0.0-beta.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/breadcrumbs/index.d.ts +1 -2
- package/buttons/index.d.ts +20 -13
- package/datatable/index.d.ts +8 -8
- package/dynamic/index.d.ts +5 -5
- package/fesm2022/theseam-ui-common-asset-reader.mjs +28 -29
- package/fesm2022/theseam-ui-common-asset-reader.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-breadcrumbs.mjs +25 -31
- package/fesm2022/theseam-ui-common-breadcrumbs.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-buttons.mjs +108 -66
- package/fesm2022/theseam-ui-common-buttons.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-card.mjs +21 -21
- package/fesm2022/theseam-ui-common-card.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-carousel.mjs +28 -30
- package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-checkbox.mjs +27 -27
- package/fesm2022/theseam-ui-common-checkbox.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-confirm-dialog.mjs +23 -27
- package/fesm2022/theseam-ui-common-confirm-dialog.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-core.mjs +31 -11
- package/fesm2022/theseam-ui-common-core.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-data-exporter.mjs +18 -19
- package/fesm2022/theseam-ui-common-data-exporter.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-data-filters.mjs +80 -64
- package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +51 -49
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-dynamic.mjs +145 -112
- package/fesm2022/theseam-ui-common-datatable-dynamic.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable.mjs +581 -385
- package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-dynamic-component-loader.mjs +12 -14
- package/fesm2022/theseam-ui-common-dynamic-component-loader.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-dynamic.mjs +60 -48
- package/fesm2022/theseam-ui-common-dynamic.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-footer-bar.mjs +9 -15
- package/fesm2022/theseam-ui-common-footer-bar.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-form-field-error.mjs +60 -43
- package/fesm2022/theseam-ui-common-form-field-error.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-form-field.mjs +120 -74
- package/fesm2022/theseam-ui-common-form-field.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-framework.mjs +669 -543
- package/fesm2022/theseam-ui-common-framework.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-google-maps.mjs +206 -149
- package/fesm2022/theseam-ui-common-google-maps.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-graphql.mjs +252 -195
- package/fesm2022/theseam-ui-common-graphql.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-icon.mjs +125 -89
- package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-layout.mjs +18 -26
- package/fesm2022/theseam-ui-common-layout.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-loading.mjs +19 -28
- package/fesm2022/theseam-ui-common-loading.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-menu.mjs +124 -95
- package/fesm2022/theseam-ui-common-menu.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-modal.mjs +177 -129
- package/fesm2022/theseam-ui-common-modal.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-models.mjs +3 -3
- package/fesm2022/theseam-ui-common-models.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-navigation-reload.mjs +13 -11
- package/fesm2022/theseam-ui-common-navigation-reload.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-popover.mjs +81 -88
- package/fesm2022/theseam-ui-common-popover.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-progress.mjs +15 -19
- package/fesm2022/theseam-ui-common-progress.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-rich-text.mjs +65 -52
- package/fesm2022/theseam-ui-common-rich-text.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-scrollbar.mjs +12 -9
- package/fesm2022/theseam-ui-common-scrollbar.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-services.mjs +41 -26
- package/fesm2022/theseam-ui-common-services.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-shared.mjs +123 -67
- package/fesm2022/theseam-ui-common-shared.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-storage.mjs +9 -6
- package/fesm2022/theseam-ui-common-storage.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-story-helpers.mjs +148 -86
- package/fesm2022/theseam-ui-common-story-helpers.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tabbed.mjs +43 -39
- package/fesm2022/theseam-ui-common-tabbed.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-table-cell-type.mjs +34 -38
- package/fesm2022/theseam-ui-common-table-cell-type.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-table-cell-types.mjs +182 -144
- package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-table.mjs +50 -39
- package/fesm2022/theseam-ui-common-table.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tel-input.mjs +98 -63
- package/fesm2022/theseam-ui-common-tel-input.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-testing.mjs +13 -10
- package/fesm2022/theseam-ui-common-testing.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tiled-select.mjs +54 -50
- package/fesm2022/theseam-ui-common-tiled-select.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-toggle-edit.mjs +41 -37
- package/fesm2022/theseam-ui-common-toggle-edit.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-toggle-group.mjs +30 -31
- package/fesm2022/theseam-ui-common-toggle-group.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs +225 -66
- package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-unsaved-changes-dialog.mjs +14 -12
- package/fesm2022/theseam-ui-common-unsaved-changes-dialog.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-utils.mjs +113 -77
- package/fesm2022/theseam-ui-common-utils.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-validators.mjs +10 -9
- package/fesm2022/theseam-ui-common-validators.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-vertical-list-filter.mjs +39 -17
- package/fesm2022/theseam-ui-common-vertical-list-filter.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-viewers.mjs +79 -56
- package/fesm2022/theseam-ui-common-viewers.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-widget.mjs +288 -314
- package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
- package/framework/base-layout/base-layout.component.scss +9 -4
- package/framework/base-layout/styles/_variables.scss +4 -9
- package/framework/dashboard/dashboard-widgets/dashboard-widgets.component.scss +6 -4
- package/framework/index.d.ts +6 -6
- package/framework/nav/nav-item/nav-item.component.scss +7 -6
- package/framework/nav/styles/_themes/light/_variables.scss +21 -5
- package/framework/nav/styles/_themes/primary/_variables.scss +21 -5
- package/framework/side-nav/side-nav-item/side-nav-item.component.scss +5 -2
- package/framework/side-nav/styles/_themes/light/_variables.scss +5 -1
- package/framework/side-nav/styles/_themes/primary/_variables.scss +25 -5
- package/graphql/index.d.ts +5 -5
- package/modal/README.md +5 -5
- package/modal/index.d.ts +1 -1
- package/models/index.d.ts +1 -1
- package/package.json +59 -59
- package/popover/index.d.ts +0 -2
- package/progress/progress-circle/styles/_variables.scss +15 -3
- package/story-helpers/index.d.ts +11 -1
- package/styles/bootstrap/_bootstrap.scss +34 -34
- package/styles/bootstrap/_bs-styles.scss +4 -8
- package/styles/bootstrap/_bs-utilities.scss +4 -4
- package/styles/bootstrap/_bs-variables.scss +65 -70
- package/styles/common/_forms.scss +9 -10
- package/styles/common/_global.scss +0 -1
- package/styles/common/_hacks.scss +1 -1
- package/styles/common/_table.scss +0 -1
- package/styles/common/_text.scss +3 -1
- package/styles/theme.scss +1 -1
- package/styles/vendor/ng-select/_ng-select-bs4.scss +292 -294
- package/styles/vendor/ngx-datatable/_ngx-datatable.scss +63 -32
- package/styles/vendor/ngx-datatable/_themes/bootstrap/_variables.scss +37 -10
- package/styles/vendor/ngx-datatable/_themes/material/_variables.scss +3 -1
- package/styles/vendor/quill/_quill.scss +15 -9
- package/tel-input/README.md +27 -27
- package/utils/index.d.ts +3 -3
- package/viewers/index.d.ts +9 -2
- package/widget/_widget-theme.scss +1 -1
- package/widget/styles/_variables.scss +2 -2
- package/widget/widget/widget.component.scss +0 -2
- package/widget/widget-content-components/widget-tile/widget-tile.component.scss +1 -3
- package/widget/widget-footer/widget-footer.component.scss +0 -1
|
@@ -13,16 +13,16 @@ class AlterationDisplayService {
|
|
|
13
13
|
* Calculate the differences between current and pending alterations
|
|
14
14
|
*/
|
|
15
15
|
calculateDiff(current, pending) {
|
|
16
|
-
const currentIds = new Set(current.map(item => item.id));
|
|
17
|
-
const pendingIds = new Set(pending.map(item => item.id));
|
|
18
|
-
const added = pending.filter(item => !currentIds.has(item.id));
|
|
19
|
-
const removed = current.filter(item => !pendingIds.has(item.id));
|
|
16
|
+
const currentIds = new Set(current.map((item) => item.id));
|
|
17
|
+
const pendingIds = new Set(pending.map((item) => item.id));
|
|
18
|
+
const added = pending.filter((item) => !currentIds.has(item.id));
|
|
19
|
+
const removed = current.filter((item) => !pendingIds.has(item.id));
|
|
20
20
|
const unchanged = [];
|
|
21
21
|
const changed = [];
|
|
22
22
|
// Check for changes in items that exist in both arrays
|
|
23
23
|
for (const currentItem of current) {
|
|
24
24
|
if (pendingIds.has(currentItem.id)) {
|
|
25
|
-
const pendingItem = pending.find(item => item.id === currentItem.id);
|
|
25
|
+
const pendingItem = pending.find((item) => item.id === currentItem.id);
|
|
26
26
|
if (this._areItemsEqual(currentItem, pendingItem)) {
|
|
27
27
|
unchanged.push(currentItem);
|
|
28
28
|
}
|
|
@@ -35,7 +35,7 @@ class AlterationDisplayService {
|
|
|
35
35
|
added,
|
|
36
36
|
removed,
|
|
37
37
|
changed,
|
|
38
|
-
unchanged
|
|
38
|
+
unchanged,
|
|
39
39
|
};
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
@@ -44,11 +44,11 @@ class AlterationDisplayService {
|
|
|
44
44
|
groupAndSortItems(items) {
|
|
45
45
|
// Define type order: sort, order, hide-column, width, filter (filters last due to variation)
|
|
46
46
|
const typeOrder = {
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
sort: 1,
|
|
48
|
+
order: 2,
|
|
49
49
|
'hide-column': 3,
|
|
50
|
-
|
|
51
|
-
|
|
50
|
+
width: 4,
|
|
51
|
+
filter: 5,
|
|
52
52
|
};
|
|
53
53
|
return items.sort((a, b) => {
|
|
54
54
|
// First sort by type
|
|
@@ -72,11 +72,11 @@ class AlterationDisplayService {
|
|
|
72
72
|
*/
|
|
73
73
|
getTypeDisplayName(type) {
|
|
74
74
|
const typeNames = {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
sort: 'Sort',
|
|
76
|
+
order: 'Order',
|
|
77
77
|
'hide-column': 'Visibility',
|
|
78
|
-
|
|
79
|
-
|
|
78
|
+
width: 'Width',
|
|
79
|
+
filter: 'Filter',
|
|
80
80
|
};
|
|
81
81
|
return typeNames[type] || type;
|
|
82
82
|
}
|
|
@@ -85,11 +85,11 @@ class AlterationDisplayService {
|
|
|
85
85
|
*/
|
|
86
86
|
getTypeIconName(type) {
|
|
87
87
|
const typeIcons = {
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
sort: 'sort',
|
|
89
|
+
order: 'arrows-alt',
|
|
90
90
|
'hide-column': 'eye-slash',
|
|
91
|
-
|
|
92
|
-
|
|
91
|
+
width: 'arrows-alt-h',
|
|
92
|
+
filter: 'filter',
|
|
93
93
|
};
|
|
94
94
|
return typeIcons[type] || 'cog';
|
|
95
95
|
}
|
|
@@ -106,13 +106,13 @@ class AlterationDisplayService {
|
|
|
106
106
|
}
|
|
107
107
|
return arr1.every((item, index) => item === arr2[index]);
|
|
108
108
|
}
|
|
109
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
110
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.
|
|
109
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationDisplayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
110
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationDisplayService, providedIn: 'root' });
|
|
111
111
|
}
|
|
112
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
112
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationDisplayService, decorators: [{
|
|
113
113
|
type: Injectable,
|
|
114
114
|
args: [{
|
|
115
|
-
providedIn: 'root'
|
|
115
|
+
providedIn: 'root',
|
|
116
116
|
}]
|
|
117
117
|
}] });
|
|
118
118
|
|
|
@@ -122,12 +122,12 @@ class AlterationItemComponent {
|
|
|
122
122
|
compact = true;
|
|
123
123
|
// FontAwesome icons
|
|
124
124
|
typeIcons = {
|
|
125
|
-
|
|
126
|
-
|
|
125
|
+
sort: faSort,
|
|
126
|
+
order: faArrowsAlt,
|
|
127
127
|
'hide-column': faEyeSlash,
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
128
|
+
width: faArrowsAltH,
|
|
129
|
+
filter: faFilter,
|
|
130
|
+
default: faCog,
|
|
131
131
|
};
|
|
132
132
|
constructor(alterationDisplayService) {
|
|
133
133
|
this.alterationDisplayService = alterationDisplayService;
|
|
@@ -136,7 +136,8 @@ class AlterationItemComponent {
|
|
|
136
136
|
return this.alterationDisplayService.getTypeDisplayName(this.item.type);
|
|
137
137
|
}
|
|
138
138
|
get typeIcon() {
|
|
139
|
-
return this.typeIcons[this.item.type] ||
|
|
139
|
+
return (this.typeIcons[this.item.type] ||
|
|
140
|
+
this.typeIcons.default);
|
|
140
141
|
}
|
|
141
142
|
get borderClass() {
|
|
142
143
|
switch (this.item.diffState) {
|
|
@@ -166,12 +167,12 @@ class AlterationItemComponent {
|
|
|
166
167
|
return 'badge-secondary';
|
|
167
168
|
}
|
|
168
169
|
}
|
|
169
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
170
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.
|
|
170
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationItemComponent, deps: [{ token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
|
|
171
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.6", type: AlterationItemComponent, isStandalone: true, selector: "seam-alteration-item", inputs: { item: "item", compact: "compact" }, ngImport: i0, template: "<div\n class=\"card card-body py-2 px-3 mb-2\"\n [class]=\"borderClass\"\n [attr.data-testid]=\"'alteration-item-' + item.id\"\n>\n <div class=\"d-flex align-items-center\">\n <!-- Type badge -->\n <span\n class=\"badge mr-2\"\n [class]=\"badgeClass\"\n [attr.data-testid]=\"'alteration-type-' + item.type\"\n >\n {{ typeDisplayName }}\n </span>\n\n <!-- Type icon -->\n <seam-icon\n [icon]=\"typeIcon\"\n class=\"mr-2 text-muted\"\n [attr.data-testid]=\"'alteration-icon-' + item.type\"\n >\n </seam-icon>\n\n <!-- Summary text -->\n <span class=\"flex-grow-1\" [attr.data-testid]=\"'alteration-summary'\">\n {{ item.summary }}\n </span>\n\n <!-- Diff state indicator (optional visual indicator) -->\n <span\n *ngIf=\"item.diffState\"\n class=\"ml-2 small text-muted\"\n [attr.data-testid]=\"'alteration-diff-state'\"\n >\n <ng-container [ngSwitch]=\"item.diffState\">\n <span *ngSwitchCase=\"'added'\" class=\"text-success\">+</span>\n <span *ngSwitchCase=\"'removed'\" class=\"text-danger\">-</span>\n <span *ngSwitchCase=\"'changed'\" class=\"text-warning\">~</span>\n </ng-container>\n </span>\n </div>\n\n <!-- Expanded details (for future enhancement) -->\n <div\n *ngIf=\"!compact && item.details && item.details.length > 0\"\n class=\"mt-2 pt-2 border-top\"\n >\n <ul class=\"list-unstyled mb-0 small text-muted\">\n <li\n *ngFor=\"let detail of item.details\"\n [attr.data-testid]=\"'alteration-detail'\"\n >\n {{ detail }}\n </li>\n </ul>\n </div>\n</div>\n", styles: [".card{transition:border-color .15s ease-in-out}.card.compact .card-body{padding:.5rem .75rem}.card.border-success,.card.border-danger,.card.border-warning{border-width:2px}.badge{font-size:.75rem;font-weight:500}.badge.badge-warning{color:#212529}seam-icon{font-size:.875rem;width:1rem;height:1rem}.flex-grow-1{font-size:.875rem;line-height:1.25}.list-unstyled li{padding:.125rem 0;font-size:.8125rem}[data-testid=alteration-diff-state]{font-weight:700;font-size:1rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "ngmodule", type: TheSeamIconModule }, { kind: "component", type: i3.IconComponent, selector: "seam-icon", inputs: ["grayscaleOnDisable", "disabled", "iconClass", "icon", "size", "showDefaultOnError", "defaultIcon", "iconType"] }] });
|
|
171
172
|
}
|
|
172
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationItemComponent, decorators: [{
|
|
173
174
|
type: Component,
|
|
174
|
-
args: [{ selector: 'seam-alteration-item', standalone: true, imports: [CommonModule, TheSeamIconModule], template: "<div
|
|
175
|
+
args: [{ selector: 'seam-alteration-item', standalone: true, imports: [CommonModule, TheSeamIconModule], template: "<div\n class=\"card card-body py-2 px-3 mb-2\"\n [class]=\"borderClass\"\n [attr.data-testid]=\"'alteration-item-' + item.id\"\n>\n <div class=\"d-flex align-items-center\">\n <!-- Type badge -->\n <span\n class=\"badge mr-2\"\n [class]=\"badgeClass\"\n [attr.data-testid]=\"'alteration-type-' + item.type\"\n >\n {{ typeDisplayName }}\n </span>\n\n <!-- Type icon -->\n <seam-icon\n [icon]=\"typeIcon\"\n class=\"mr-2 text-muted\"\n [attr.data-testid]=\"'alteration-icon-' + item.type\"\n >\n </seam-icon>\n\n <!-- Summary text -->\n <span class=\"flex-grow-1\" [attr.data-testid]=\"'alteration-summary'\">\n {{ item.summary }}\n </span>\n\n <!-- Diff state indicator (optional visual indicator) -->\n <span\n *ngIf=\"item.diffState\"\n class=\"ml-2 small text-muted\"\n [attr.data-testid]=\"'alteration-diff-state'\"\n >\n <ng-container [ngSwitch]=\"item.diffState\">\n <span *ngSwitchCase=\"'added'\" class=\"text-success\">+</span>\n <span *ngSwitchCase=\"'removed'\" class=\"text-danger\">-</span>\n <span *ngSwitchCase=\"'changed'\" class=\"text-warning\">~</span>\n </ng-container>\n </span>\n </div>\n\n <!-- Expanded details (for future enhancement) -->\n <div\n *ngIf=\"!compact && item.details && item.details.length > 0\"\n class=\"mt-2 pt-2 border-top\"\n >\n <ul class=\"list-unstyled mb-0 small text-muted\">\n <li\n *ngFor=\"let detail of item.details\"\n [attr.data-testid]=\"'alteration-detail'\"\n >\n {{ detail }}\n </li>\n </ul>\n </div>\n</div>\n", styles: [".card{transition:border-color .15s ease-in-out}.card.compact .card-body{padding:.5rem .75rem}.card.border-success,.card.border-danger,.card.border-warning{border-width:2px}.badge{font-size:.75rem;font-weight:500}.badge.badge-warning{color:#212529}seam-icon{font-size:.875rem;width:1rem;height:1rem}.flex-grow-1{font-size:.875rem;line-height:1.25}.list-unstyled li{padding:.125rem 0;font-size:.8125rem}[data-testid=alteration-diff-state]{font-weight:700;font-size:1rem}\n"] }]
|
|
175
176
|
}], ctorParameters: () => [{ type: AlterationDisplayService }], propDecorators: { item: [{
|
|
176
177
|
type: Input
|
|
177
178
|
}], compact: [{
|
|
@@ -201,12 +202,12 @@ class AlterationsListComponent {
|
|
|
201
202
|
trackByItemId(index, item) {
|
|
202
203
|
return item.id;
|
|
203
204
|
}
|
|
204
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
205
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.
|
|
205
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationsListComponent, deps: [{ token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
|
|
206
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.6", type: AlterationsListComponent, isStandalone: true, selector: "seam-alterations-list", inputs: { items: "items", title: "title", diffState: "diffState", groupByType: "groupByType", sortWithinType: "sortWithinType", compact: "compact" }, ngImport: i0, template: "<div\n class=\"alterations-list\"\n [attr.data-testid]=\"'alterations-list-' + (diffState || 'default')\"\n>\n <!-- Title header -->\n <div *ngIf=\"title\" class=\"mb-3\">\n <h6\n class=\"mb-1 text-muted font-weight-bold\"\n [attr.data-testid]=\"'alterations-list-title'\"\n >\n {{ title }}\n </h6>\n <small class=\"text-muted\" [attr.data-testid]=\"'alterations-list-count'\">\n {{ items.length }} alteration{{ items.length === 1 ? '' : 's' }}\n </small>\n </div>\n\n <!-- Items list -->\n <div *ngIf=\"hasItems; else emptyState\" class=\"alterations-items\">\n <seam-alteration-item\n *ngFor=\"let item of sortedItems; trackBy: trackByItemId\"\n [item]=\"item\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'list-item-' + item.id\"\n >\n </seam-alteration-item>\n </div>\n\n <!-- Empty state -->\n <ng-template #emptyState>\n <div\n class=\"text-center py-4 text-muted\"\n [attr.data-testid]=\"'alterations-list-empty'\"\n >\n <p class=\"mb-0\">No alterations</p>\n <small>No changes have been made to the table configuration.</small>\n </div>\n </ng-template>\n</div>\n", styles: [".alterations-list{width:100%}.alterations-list h6{font-size:.875rem;text-transform:uppercase;letter-spacing:.5px}.alterations-list .alterations-items seam-alteration-item:last-child .card{margin-bottom:0}.alterations-list .text-center{border:1px dashed #dee2e6;border-radius:.25rem;background-color:#f8f9fa}.alterations-list .text-center p{font-size:.875rem;font-weight:500}.alterations-list .text-center small{font-size:.8125rem}@media(max-width:575.98px){.alterations-list h6{font-size:.8125rem}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: AlterationItemComponent, selector: "seam-alteration-item", inputs: ["item", "compact"] }] });
|
|
206
207
|
}
|
|
207
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
208
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationsListComponent, decorators: [{
|
|
208
209
|
type: Component,
|
|
209
|
-
args: [{ selector: 'seam-alterations-list', standalone: true, imports: [CommonModule, AlterationItemComponent], template: "<div
|
|
210
|
+
args: [{ selector: 'seam-alterations-list', standalone: true, imports: [CommonModule, AlterationItemComponent], template: "<div\n class=\"alterations-list\"\n [attr.data-testid]=\"'alterations-list-' + (diffState || 'default')\"\n>\n <!-- Title header -->\n <div *ngIf=\"title\" class=\"mb-3\">\n <h6\n class=\"mb-1 text-muted font-weight-bold\"\n [attr.data-testid]=\"'alterations-list-title'\"\n >\n {{ title }}\n </h6>\n <small class=\"text-muted\" [attr.data-testid]=\"'alterations-list-count'\">\n {{ items.length }} alteration{{ items.length === 1 ? '' : 's' }}\n </small>\n </div>\n\n <!-- Items list -->\n <div *ngIf=\"hasItems; else emptyState\" class=\"alterations-items\">\n <seam-alteration-item\n *ngFor=\"let item of sortedItems; trackBy: trackByItemId\"\n [item]=\"item\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'list-item-' + item.id\"\n >\n </seam-alteration-item>\n </div>\n\n <!-- Empty state -->\n <ng-template #emptyState>\n <div\n class=\"text-center py-4 text-muted\"\n [attr.data-testid]=\"'alterations-list-empty'\"\n >\n <p class=\"mb-0\">No alterations</p>\n <small>No changes have been made to the table configuration.</small>\n </div>\n </ng-template>\n</div>\n", styles: [".alterations-list{width:100%}.alterations-list h6{font-size:.875rem;text-transform:uppercase;letter-spacing:.5px}.alterations-list .alterations-items seam-alteration-item:last-child .card{margin-bottom:0}.alterations-list .text-center{border:1px dashed #dee2e6;border-radius:.25rem;background-color:#f8f9fa}.alterations-list .text-center p{font-size:.875rem;font-weight:500}.alterations-list .text-center small{font-size:.8125rem}@media(max-width:575.98px){.alterations-list h6{font-size:.8125rem}}\n"] }]
|
|
210
211
|
}], ctorParameters: () => [{ type: AlterationDisplayService }], propDecorators: { items: [{
|
|
211
212
|
type: Input
|
|
212
213
|
}], title: [{
|
|
@@ -238,9 +239,10 @@ class AlterationsDiffComponent {
|
|
|
238
239
|
}
|
|
239
240
|
ngOnInit() {
|
|
240
241
|
// Subscribe to mobile breakpoint changes
|
|
241
|
-
this.layoutService
|
|
242
|
+
this.layoutService
|
|
243
|
+
.observe('lt-md')
|
|
242
244
|
.pipe(takeUntil(this.destroy$))
|
|
243
|
-
.subscribe(isMobile => {
|
|
245
|
+
.subscribe((isMobile) => {
|
|
244
246
|
this.isMobile = isMobile;
|
|
245
247
|
});
|
|
246
248
|
// Calculate diff state
|
|
@@ -254,18 +256,18 @@ class AlterationsDiffComponent {
|
|
|
254
256
|
if (!this.diffState) {
|
|
255
257
|
return this.currentItems;
|
|
256
258
|
}
|
|
257
|
-
return this.currentItems.map(item => ({
|
|
259
|
+
return this.currentItems.map((item) => ({
|
|
258
260
|
...item,
|
|
259
|
-
_diffState: this.getItemDiffState(item, 'current')
|
|
261
|
+
_diffState: this.getItemDiffState(item, 'current'),
|
|
260
262
|
}));
|
|
261
263
|
}
|
|
262
264
|
get pendingItemsWithDiffState() {
|
|
263
265
|
if (!this.diffState) {
|
|
264
266
|
return this.pendingItems;
|
|
265
267
|
}
|
|
266
|
-
return this.pendingItems.map(item => ({
|
|
268
|
+
return this.pendingItems.map((item) => ({
|
|
267
269
|
...item,
|
|
268
|
-
_diffState: this.getItemDiffState(item, 'pending')
|
|
270
|
+
_diffState: this.getItemDiffState(item, 'pending'),
|
|
269
271
|
}));
|
|
270
272
|
}
|
|
271
273
|
get hasDifferences() {
|
|
@@ -308,23 +310,23 @@ class AlterationsDiffComponent {
|
|
|
308
310
|
return undefined;
|
|
309
311
|
}
|
|
310
312
|
const itemId = item.id;
|
|
311
|
-
if (this.diffState.added.some(addedItem => addedItem.id === itemId)) {
|
|
313
|
+
if (this.diffState.added.some((addedItem) => addedItem.id === itemId)) {
|
|
312
314
|
return context === 'pending' ? 'added' : undefined;
|
|
313
315
|
}
|
|
314
|
-
if (this.diffState.removed.some(removedItem => removedItem.id === itemId)) {
|
|
316
|
+
if (this.diffState.removed.some((removedItem) => removedItem.id === itemId)) {
|
|
315
317
|
return context === 'current' ? 'removed' : undefined;
|
|
316
318
|
}
|
|
317
|
-
if (this.diffState.changed.some(changedItem => changedItem.id === itemId)) {
|
|
319
|
+
if (this.diffState.changed.some((changedItem) => changedItem.id === itemId)) {
|
|
318
320
|
return 'changed';
|
|
319
321
|
}
|
|
320
322
|
return 'unchanged';
|
|
321
323
|
}
|
|
322
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.
|
|
323
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.
|
|
324
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationsDiffComponent, deps: [{ token: i1.TheSeamLayoutService }, { token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
|
|
325
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.6", type: AlterationsDiffComponent, isStandalone: true, selector: "seam-alterations-diff", inputs: { currentItems: "currentItems", pendingItems: "pendingItems", diffMode: "diffMode", initialDiffState: "initialDiffState", compact: "compact" }, ngImport: i0, template: "<div class=\"alterations-diff\" [attr.data-testid]=\"'alterations-diff'\">\n <!-- Diff summary header -->\n <div\n *ngIf=\"hasDifferences\"\n class=\"mb-3 p-2 bg-light border rounded\"\n [attr.data-testid]=\"'diff-summary'\"\n >\n <small class=\"text-muted font-weight-bold\">\n Changes: {{ differenceSummary }}\n </small>\n </div>\n\n <!-- Desktop layout: Side-by-side -->\n <div\n *ngIf=\"!isMobile; else mobileLayout\"\n class=\"row\"\n [attr.data-testid]=\"'desktop-layout'\"\n >\n <!-- Current alterations column -->\n <div class=\"col-md-6 pr-md-2\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations column -->\n <div class=\"col-md-6 pl-md-2\">\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n\n <!-- Mobile layout: Stacked -->\n <ng-template #mobileLayout>\n <div class=\"mobile-layout\" [attr.data-testid]=\"'mobile-layout'\">\n <!-- Current alterations -->\n <div class=\"mb-4\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations -->\n <div>\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".alterations-diff{width:100%}.alterations-diff .bg-light{background-color:#f8f9fa!important}.alterations-diff .bg-light small{font-size:.8125rem;text-transform:uppercase;letter-spacing:.5px}.alterations-diff .row{margin-left:-.5rem;margin-right:-.5rem}.alterations-diff .row .col-md-6.pr-md-2{padding-right:.5rem}.alterations-diff .row .col-md-6.pl-md-2{padding-left:.5rem}.alterations-diff .mobile-layout>div:not(:last-child){border-bottom:1px solid #dee2e6;padding-bottom:1rem}@media(min-width:768px){.alterations-diff .row .col-md-6:first-child:after{content:\"\";position:absolute;top:0;right:0;bottom:0;width:1px;background-color:#dee2e6;z-index:1}}@media(max-width:767.98px){.alterations-diff .bg-light{margin-left:-.25rem;margin-right:-.25rem;padding-left:.75rem!important;padding-right:.75rem!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: AlterationsListComponent, selector: "seam-alterations-list", inputs: ["items", "title", "diffState", "groupByType", "sortWithinType", "compact"] }] });
|
|
324
326
|
}
|
|
325
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.
|
|
327
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.6", ngImport: i0, type: AlterationsDiffComponent, decorators: [{
|
|
326
328
|
type: Component,
|
|
327
|
-
args: [{ selector: 'seam-alterations-diff', standalone: true, imports: [CommonModule, AlterationsListComponent], template: "<div class=\"alterations-diff\" [attr.data-testid]=\"'alterations-diff'\">\n
|
|
329
|
+
args: [{ selector: 'seam-alterations-diff', standalone: true, imports: [CommonModule, AlterationsListComponent], template: "<div class=\"alterations-diff\" [attr.data-testid]=\"'alterations-diff'\">\n <!-- Diff summary header -->\n <div\n *ngIf=\"hasDifferences\"\n class=\"mb-3 p-2 bg-light border rounded\"\n [attr.data-testid]=\"'diff-summary'\"\n >\n <small class=\"text-muted font-weight-bold\">\n Changes: {{ differenceSummary }}\n </small>\n </div>\n\n <!-- Desktop layout: Side-by-side -->\n <div\n *ngIf=\"!isMobile; else mobileLayout\"\n class=\"row\"\n [attr.data-testid]=\"'desktop-layout'\"\n >\n <!-- Current alterations column -->\n <div class=\"col-md-6 pr-md-2\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations column -->\n <div class=\"col-md-6 pl-md-2\">\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n\n <!-- Mobile layout: Stacked -->\n <ng-template #mobileLayout>\n <div class=\"mobile-layout\" [attr.data-testid]=\"'mobile-layout'\">\n <!-- Current alterations -->\n <div class=\"mb-4\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations -->\n <div>\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n </ng-template>\n</div>\n", styles: [".alterations-diff{width:100%}.alterations-diff .bg-light{background-color:#f8f9fa!important}.alterations-diff .bg-light small{font-size:.8125rem;text-transform:uppercase;letter-spacing:.5px}.alterations-diff .row{margin-left:-.5rem;margin-right:-.5rem}.alterations-diff .row .col-md-6.pr-md-2{padding-right:.5rem}.alterations-diff .row .col-md-6.pl-md-2{padding-left:.5rem}.alterations-diff .mobile-layout>div:not(:last-child){border-bottom:1px solid #dee2e6;padding-bottom:1rem}@media(min-width:768px){.alterations-diff .row .col-md-6:first-child:after{content:\"\";position:absolute;top:0;right:0;bottom:0;width:1px;background-color:#dee2e6;z-index:1}}@media(max-width:767.98px){.alterations-diff .bg-light{margin-left:-.25rem;margin-right:-.25rem;padding-left:.75rem!important;padding-right:.75rem!important}}\n"] }]
|
|
328
330
|
}], ctorParameters: () => [{ type: i1.TheSeamLayoutService }, { type: AlterationDisplayService }], propDecorators: { currentItems: [{
|
|
329
331
|
type: Input
|
|
330
332
|
}], pendingItems: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"theseam-ui-common-datatable-alterations-display.mjs","sources":["../../../projects/ui-common/datatable-alterations-display/services/alteration-display.service.ts","../../../projects/ui-common/datatable-alterations-display/alteration-item/alteration-item.component.ts","../../../projects/ui-common/datatable-alterations-display/alteration-item/alteration-item.component.html","../../../projects/ui-common/datatable-alterations-display/alterations-list/alterations-list.component.ts","../../../projects/ui-common/datatable-alterations-display/alterations-list/alterations-list.component.html","../../../projects/ui-common/datatable-alterations-display/alterations-diff/alterations-diff.component.ts","../../../projects/ui-common/datatable-alterations-display/alterations-diff/alterations-diff.component.html","../../../projects/ui-common/datatable-alterations-display/public-api.ts","../../../projects/ui-common/datatable-alterations-display/theseam-ui-common-datatable-alterations-display.ts"],"sourcesContent":["import { Injectable } from '@angular/core'\n\nimport { AlterationDisplayItem, AlterationDiffState } from '../models/alteration-display.model'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AlterationDisplayService {\n\n /**\n * Calculate the differences between current and pending alterations\n */\n calculateDiff(\n current: AlterationDisplayItem[],\n pending: AlterationDisplayItem[]\n ): AlterationDiffState {\n const currentIds = new Set(current.map(item => item.id))\n const pendingIds = new Set(pending.map(item => item.id))\n\n const added = pending.filter(item => !currentIds.has(item.id))\n const removed = current.filter(item => !pendingIds.has(item.id))\n\n const unchanged: AlterationDisplayItem[] = []\n const changed: AlterationDisplayItem[] = []\n\n // Check for changes in items that exist in both arrays\n for (const currentItem of current) {\n if (pendingIds.has(currentItem.id)) {\n const pendingItem = pending.find(item => item.id === currentItem.id)!\n\n if (this._areItemsEqual(currentItem, pendingItem)) {\n unchanged.push(currentItem)\n } else {\n changed.push(pendingItem) // Use the pending version for changed items\n }\n }\n }\n\n return {\n added,\n removed,\n changed,\n unchanged\n }\n }\n\n /**\n * Group and sort alteration items by type and sort order\n */\n groupAndSortItems(items: AlterationDisplayItem[]): AlterationDisplayItem[] {\n // Define type order: sort, order, hide-column, width, filter (filters last due to variation)\n const typeOrder: Record<string, number> = {\n 'sort': 1,\n 'order': 2,\n 'hide-column': 3,\n 'width': 4,\n 'filter': 5\n }\n\n return items.sort((a, b) => {\n // First sort by type\n const typeOrderA = typeOrder[a.type] || 999\n const typeOrderB = typeOrder[b.type] || 999\n\n if (typeOrderA !== typeOrderB) {\n return typeOrderA - typeOrderB\n }\n\n // Then sort by sortOrder within the same type\n const sortOrderA = a.sortOrder || 0\n const sortOrderB = b.sortOrder || 0\n\n if (sortOrderA !== sortOrderB) {\n return sortOrderA - sortOrderB\n }\n\n // Finally sort by id for consistent ordering\n return a.id.localeCompare(b.id)\n })\n }\n\n /**\n * Get a user-friendly type display name\n */\n getTypeDisplayName(type: string): string {\n const typeNames: Record<string, string> = {\n 'sort': 'Sort',\n 'order': 'Order',\n 'hide-column': 'Visibility',\n 'width': 'Width',\n 'filter': 'Filter'\n }\n return typeNames[type] || type\n }\n\n /**\n * Get an icon name for the alteration type (FontAwesome icon names)\n */\n getTypeIconName(type: string): string {\n const typeIcons: Record<string, string> = {\n 'sort': 'sort',\n 'order': 'arrows-alt',\n 'hide-column': 'eye-slash',\n 'width': 'arrows-alt-h',\n 'filter': 'filter'\n }\n return typeIcons[type] || 'cog'\n }\n\n private _areItemsEqual(item1: AlterationDisplayItem, item2: AlterationDisplayItem): boolean {\n // Compare all properties except sortOrder (which shouldn't affect equality)\n return (\n item1.id === item2.id &&\n item1.type === item2.type &&\n item1.summary === item2.summary &&\n this._areArraysEqual(item1.details || [], item2.details || [])\n )\n }\n\n private _areArraysEqual(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n return arr1.every((item, index) => item === arr2[index])\n }\n}\n","import { Component, Input } from '@angular/core'\nimport { CommonModule } from '@angular/common'\n\nimport { faSort, faArrowsAlt, faEyeSlash, faArrowsAltH, faFilter, faCog } from '@fortawesome/free-solid-svg-icons'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\n\nimport { AlterationDisplayItem, AlterationVisualState } from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\n\n@Component({\n selector: 'seam-alteration-item',\n standalone: true,\n imports: [CommonModule, TheSeamIconModule],\n templateUrl: './alteration-item.component.html',\n styleUrls: ['./alteration-item.component.scss']\n})\nexport class AlterationItemComponent {\n @Input() item!: AlterationDisplayItem\n @Input() compact = true\n\n // FontAwesome icons\n private readonly typeIcons = {\n 'sort': faSort,\n 'order': faArrowsAlt,\n 'hide-column': faEyeSlash,\n 'width': faArrowsAltH,\n 'filter': faFilter,\n 'default': faCog\n }\n\n constructor(private alterationDisplayService: AlterationDisplayService) {}\n\n get typeDisplayName(): string {\n return this.alterationDisplayService.getTypeDisplayName(this.item.type)\n }\n\n get typeIcon() {\n return this.typeIcons[this.item.type as keyof typeof this.typeIcons] || this.typeIcons.default\n }\n\n get borderClass(): string {\n switch (this.item.diffState) {\n case 'added':\n return 'border-success'\n case 'removed':\n return 'border-danger'\n case 'changed':\n return 'border-warning'\n default:\n return ''\n }\n }\n\n get badgeClass(): string {\n switch (this.item.type) {\n case 'sort':\n return 'badge-primary'\n case 'order':\n return 'badge-info'\n case 'hide-column':\n return 'badge-secondary'\n case 'width':\n return 'badge-dark'\n case 'filter':\n return 'badge-warning'\n default:\n return 'badge-secondary'\n }\n }\n}\n","<div class=\"card card-body py-2 px-3 mb-2\"\n [class]=\"borderClass\"\n [attr.data-testid]=\"'alteration-item-' + item.id\">\n\n <div class=\"d-flex align-items-center\">\n <!-- Type badge -->\n <span class=\"badge mr-2\"\n [class]=\"badgeClass\"\n [attr.data-testid]=\"'alteration-type-' + item.type\">\n {{ typeDisplayName }}\n </span>\n\n <!-- Type icon -->\n <seam-icon [icon]=\"typeIcon\"\n class=\"mr-2 text-muted\"\n [attr.data-testid]=\"'alteration-icon-' + item.type\">\n </seam-icon>\n\n <!-- Summary text -->\n <span class=\"flex-grow-1\"\n [attr.data-testid]=\"'alteration-summary'\">\n {{ item.summary }}\n </span>\n\n <!-- Diff state indicator (optional visual indicator) -->\n <span *ngIf=\"item.diffState\"\n class=\"ml-2 small text-muted\"\n [attr.data-testid]=\"'alteration-diff-state'\">\n <ng-container [ngSwitch]=\"item.diffState\">\n <span *ngSwitchCase=\"'added'\" class=\"text-success\">+</span>\n <span *ngSwitchCase=\"'removed'\" class=\"text-danger\">-</span>\n <span *ngSwitchCase=\"'changed'\" class=\"text-warning\">~</span>\n </ng-container>\n </span>\n </div>\n\n <!-- Expanded details (for future enhancement) -->\n <div *ngIf=\"!compact && item.details && item.details.length > 0\"\n class=\"mt-2 pt-2 border-top\">\n <ul class=\"list-unstyled mb-0 small text-muted\">\n <li *ngFor=\"let detail of item.details\"\n [attr.data-testid]=\"'alteration-detail'\">\n {{ detail }}\n </li>\n </ul>\n </div>\n</div>\n","import { Component, Input } from '@angular/core'\nimport { CommonModule } from '@angular/common'\n\nimport { AlterationDisplayItem, AlterationVisualState } from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\nimport { AlterationItemComponent } from '../alteration-item/alteration-item.component'\n\n@Component({\n selector: 'seam-alterations-list',\n standalone: true,\n imports: [CommonModule, AlterationItemComponent],\n templateUrl: './alterations-list.component.html',\n styleUrls: ['./alterations-list.component.scss']\n})\nexport class AlterationsListComponent {\n @Input() items: AlterationDisplayItem[] = []\n @Input() title?: string\n @Input() diffState?: 'current' | 'pending'\n @Input() groupByType = true\n @Input() sortWithinType = true\n @Input() compact = true\n\n constructor(private alterationDisplayService: AlterationDisplayService) {}\n\n get sortedItems(): AlterationDisplayItem[] {\n if (!this.groupByType && !this.sortWithinType) {\n return this.items\n }\n\n return this.alterationDisplayService.groupAndSortItems(this.items)\n }\n\n get hasItems(): boolean {\n return this.items && this.items.length > 0\n }\n\n trackByItemId(index: number, item: AlterationDisplayItem): string {\n return item.id\n }\n}\n","<div class=\"alterations-list\" [attr.data-testid]=\"'alterations-list-' + (diffState || 'default')\">\n\n <!-- Title header -->\n <div *ngIf=\"title\" class=\"mb-3\">\n <h6 class=\"mb-1 text-muted font-weight-bold\" [attr.data-testid]=\"'alterations-list-title'\">\n {{ title }}\n </h6>\n <small class=\"text-muted\" [attr.data-testid]=\"'alterations-list-count'\">\n {{ items.length }} alteration{{ items.length === 1 ? '' : 's' }}\n </small>\n </div>\n\n <!-- Items list -->\n <div *ngIf=\"hasItems; else emptyState\" class=\"alterations-items\">\n <seam-alteration-item\n *ngFor=\"let item of sortedItems; trackBy: trackByItemId\"\n [item]=\"item\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'list-item-' + item.id\">\n </seam-alteration-item>\n </div>\n\n <!-- Empty state -->\n <ng-template #emptyState>\n <div class=\"text-center py-4 text-muted\" [attr.data-testid]=\"'alterations-list-empty'\">\n <p class=\"mb-0\">No alterations</p>\n <small>No changes have been made to the table configuration.</small>\n </div>\n </ng-template>\n\n</div>\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { Subject, takeUntil } from 'rxjs'\n\nimport { TheSeamLayoutService } from '@theseam/ui-common/layout'\n\nimport { AlterationDisplayItem, AlterationDiffState, AlterationDiffMode, AlterationVisualState } from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\nimport { AlterationsListComponent } from '../alterations-list/alterations-list.component'\n\n@Component({\n selector: 'seam-alterations-diff',\n standalone: true,\n imports: [CommonModule, AlterationsListComponent],\n templateUrl: './alterations-diff.component.html',\n styleUrls: ['./alterations-diff.component.scss']\n})\nexport class AlterationsDiffComponent implements OnInit, OnDestroy {\n @Input() currentItems: AlterationDisplayItem[] = []\n @Input() pendingItems: AlterationDisplayItem[] = []\n @Input() diffMode: AlterationDiffMode = 'auto'\n @Input() initialDiffState?: AlterationDiffState\n @Input() compact = true\n\n isMobile = false\n diffState: AlterationDiffState | null = null\n\n private destroy$ = new Subject<void>()\n\n constructor(\n private layoutService: TheSeamLayoutService,\n private alterationDisplayService: AlterationDisplayService\n ) {}\n\n ngOnInit(): void {\n // Subscribe to mobile breakpoint changes\n this.layoutService.observe('lt-md')\n .pipe(takeUntil(this.destroy$))\n .subscribe(isMobile => {\n this.isMobile = isMobile\n })\n\n // Calculate diff state\n this.calculateDiffState()\n }\n\n ngOnDestroy(): void {\n this.destroy$.next()\n this.destroy$.complete()\n }\n\n get currentItemsWithDiffState(): AlterationDisplayItem[] {\n if (!this.diffState) {\n return this.currentItems\n }\n\n return this.currentItems.map(item => ({\n ...item,\n _diffState: this.getItemDiffState(item, 'current')\n }))\n }\n\n get pendingItemsWithDiffState(): AlterationDisplayItem[] {\n if (!this.diffState) {\n return this.pendingItems\n }\n\n return this.pendingItems.map(item => ({\n ...item,\n _diffState: this.getItemDiffState(item, 'pending')\n }))\n }\n\n get hasDifferences(): boolean {\n if (!this.diffState) {\n return false\n }\n\n return (\n this.diffState.added.length > 0 ||\n this.diffState.removed.length > 0 ||\n this.diffState.changed.length > 0\n )\n }\n\n get differenceSummary(): string {\n if (!this.diffState) {\n return 'No differences calculated'\n }\n\n const parts: string[] = []\n\n if (this.diffState.added.length > 0) {\n parts.push(`${this.diffState.added.length} added`)\n }\n\n if (this.diffState.removed.length > 0) {\n parts.push(`${this.diffState.removed.length} removed`)\n }\n\n if (this.diffState.changed.length > 0) {\n parts.push(`${this.diffState.changed.length} changed`)\n }\n\n if (parts.length === 0) {\n return 'No differences'\n }\n\n return parts.join(', ')\n }\n\n private calculateDiffState(): void {\n if (this.diffMode === 'manual' && this.initialDiffState) {\n this.diffState = this.initialDiffState\n } else {\n this.diffState = this.alterationDisplayService.calculateDiff(\n this.currentItems,\n this.pendingItems\n )\n }\n }\n\n private getItemDiffState(item: AlterationDisplayItem, context: 'current' | 'pending'): AlterationVisualState | undefined {\n if (!this.diffState) {\n return undefined\n }\n\n const itemId = item.id\n\n if (this.diffState.added.some(addedItem => addedItem.id === itemId)) {\n return context === 'pending' ? 'added' : undefined\n }\n\n if (this.diffState.removed.some(removedItem => removedItem.id === itemId)) {\n return context === 'current' ? 'removed' : undefined\n }\n\n if (this.diffState.changed.some(changedItem => changedItem.id === itemId)) {\n return 'changed'\n }\n\n return 'unchanged'\n }\n}\n","<div class=\"alterations-diff\" [attr.data-testid]=\"'alterations-diff'\">\n\n <!-- Diff summary header -->\n <div *ngIf=\"hasDifferences\" class=\"mb-3 p-2 bg-light border rounded\" [attr.data-testid]=\"'diff-summary'\">\n <small class=\"text-muted font-weight-bold\">\n Changes: {{ differenceSummary }}\n </small>\n </div>\n\n <!-- Desktop layout: Side-by-side -->\n <div *ngIf=\"!isMobile; else mobileLayout\" class=\"row\" [attr.data-testid]=\"'desktop-layout'\">\n\n <!-- Current alterations column -->\n <div class=\"col-md-6 pr-md-2\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list'\">\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations column -->\n <div class=\"col-md-6 pl-md-2\">\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list'\">\n </seam-alterations-list>\n </div>\n\n </div>\n\n <!-- Mobile layout: Stacked -->\n <ng-template #mobileLayout>\n <div class=\"mobile-layout\" [attr.data-testid]=\"'mobile-layout'\">\n\n <!-- Current alterations -->\n <div class=\"mb-4\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list-mobile'\">\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations -->\n <div>\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list-mobile'\">\n </seam-alterations-list>\n </div>\n\n </div>\n </ng-template>\n\n</div>\n","/*\n * Public API Surface of datatable-alterations-display\n */\n\n// Models\nexport * from './models/alteration-display.model'\n\n// Services\nexport * from './services/alteration-display.service'\n\n// Components\nexport * from './alteration-item/alteration-item.component'\nexport * from './alterations-list/alterations-list.component'\nexport * from './alterations-diff/alterations-diff.component'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AlterationDisplayService","i2.AlterationDisplayService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"theseam-ui-common-datatable-alterations-display.mjs","sources":["../../../projects/ui-common/datatable-alterations-display/services/alteration-display.service.ts","../../../projects/ui-common/datatable-alterations-display/alteration-item/alteration-item.component.ts","../../../projects/ui-common/datatable-alterations-display/alteration-item/alteration-item.component.html","../../../projects/ui-common/datatable-alterations-display/alterations-list/alterations-list.component.ts","../../../projects/ui-common/datatable-alterations-display/alterations-list/alterations-list.component.html","../../../projects/ui-common/datatable-alterations-display/alterations-diff/alterations-diff.component.ts","../../../projects/ui-common/datatable-alterations-display/alterations-diff/alterations-diff.component.html","../../../projects/ui-common/datatable-alterations-display/public-api.ts","../../../projects/ui-common/datatable-alterations-display/theseam-ui-common-datatable-alterations-display.ts"],"sourcesContent":["import { Injectable } from '@angular/core'\n\nimport {\n AlterationDisplayItem,\n AlterationDiffState,\n} from '../models/alteration-display.model'\n\n@Injectable({\n providedIn: 'root',\n})\nexport class AlterationDisplayService {\n /**\n * Calculate the differences between current and pending alterations\n */\n calculateDiff(\n current: AlterationDisplayItem[],\n pending: AlterationDisplayItem[],\n ): AlterationDiffState {\n const currentIds = new Set(current.map((item) => item.id))\n const pendingIds = new Set(pending.map((item) => item.id))\n\n const added = pending.filter((item) => !currentIds.has(item.id))\n const removed = current.filter((item) => !pendingIds.has(item.id))\n\n const unchanged: AlterationDisplayItem[] = []\n const changed: AlterationDisplayItem[] = []\n\n // Check for changes in items that exist in both arrays\n for (const currentItem of current) {\n if (pendingIds.has(currentItem.id)) {\n const pendingItem = pending.find((item) => item.id === currentItem.id)!\n\n if (this._areItemsEqual(currentItem, pendingItem)) {\n unchanged.push(currentItem)\n } else {\n changed.push(pendingItem) // Use the pending version for changed items\n }\n }\n }\n\n return {\n added,\n removed,\n changed,\n unchanged,\n }\n }\n\n /**\n * Group and sort alteration items by type and sort order\n */\n groupAndSortItems(items: AlterationDisplayItem[]): AlterationDisplayItem[] {\n // Define type order: sort, order, hide-column, width, filter (filters last due to variation)\n const typeOrder: Record<string, number> = {\n sort: 1,\n order: 2,\n 'hide-column': 3,\n width: 4,\n filter: 5,\n }\n\n return items.sort((a, b) => {\n // First sort by type\n const typeOrderA = typeOrder[a.type] || 999\n const typeOrderB = typeOrder[b.type] || 999\n\n if (typeOrderA !== typeOrderB) {\n return typeOrderA - typeOrderB\n }\n\n // Then sort by sortOrder within the same type\n const sortOrderA = a.sortOrder || 0\n const sortOrderB = b.sortOrder || 0\n\n if (sortOrderA !== sortOrderB) {\n return sortOrderA - sortOrderB\n }\n\n // Finally sort by id for consistent ordering\n return a.id.localeCompare(b.id)\n })\n }\n\n /**\n * Get a user-friendly type display name\n */\n getTypeDisplayName(type: string): string {\n const typeNames: Record<string, string> = {\n sort: 'Sort',\n order: 'Order',\n 'hide-column': 'Visibility',\n width: 'Width',\n filter: 'Filter',\n }\n return typeNames[type] || type\n }\n\n /**\n * Get an icon name for the alteration type (FontAwesome icon names)\n */\n getTypeIconName(type: string): string {\n const typeIcons: Record<string, string> = {\n sort: 'sort',\n order: 'arrows-alt',\n 'hide-column': 'eye-slash',\n width: 'arrows-alt-h',\n filter: 'filter',\n }\n return typeIcons[type] || 'cog'\n }\n\n private _areItemsEqual(\n item1: AlterationDisplayItem,\n item2: AlterationDisplayItem,\n ): boolean {\n // Compare all properties except sortOrder (which shouldn't affect equality)\n return (\n item1.id === item2.id &&\n item1.type === item2.type &&\n item1.summary === item2.summary &&\n this._areArraysEqual(item1.details || [], item2.details || [])\n )\n }\n\n private _areArraysEqual(arr1: string[], arr2: string[]): boolean {\n if (arr1.length !== arr2.length) {\n return false\n }\n\n return arr1.every((item, index) => item === arr2[index])\n }\n}\n","import { Component, Input } from '@angular/core'\nimport { CommonModule } from '@angular/common'\n\nimport {\n faSort,\n faArrowsAlt,\n faEyeSlash,\n faArrowsAltH,\n faFilter,\n faCog,\n} from '@fortawesome/free-solid-svg-icons'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\n\nimport {\n AlterationDisplayItem,\n AlterationVisualState,\n} from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\n\n@Component({\n selector: 'seam-alteration-item',\n standalone: true,\n imports: [CommonModule, TheSeamIconModule],\n templateUrl: './alteration-item.component.html',\n styleUrls: ['./alteration-item.component.scss'],\n})\nexport class AlterationItemComponent {\n @Input() item!: AlterationDisplayItem\n @Input() compact = true\n\n // FontAwesome icons\n private readonly typeIcons = {\n sort: faSort,\n order: faArrowsAlt,\n 'hide-column': faEyeSlash,\n width: faArrowsAltH,\n filter: faFilter,\n default: faCog,\n }\n\n constructor(private alterationDisplayService: AlterationDisplayService) {}\n\n get typeDisplayName(): string {\n return this.alterationDisplayService.getTypeDisplayName(this.item.type)\n }\n\n get typeIcon() {\n return (\n this.typeIcons[this.item.type as keyof typeof this.typeIcons] ||\n this.typeIcons.default\n )\n }\n\n get borderClass(): string {\n switch (this.item.diffState) {\n case 'added':\n return 'border-success'\n case 'removed':\n return 'border-danger'\n case 'changed':\n return 'border-warning'\n default:\n return ''\n }\n }\n\n get badgeClass(): string {\n switch (this.item.type) {\n case 'sort':\n return 'badge-primary'\n case 'order':\n return 'badge-info'\n case 'hide-column':\n return 'badge-secondary'\n case 'width':\n return 'badge-dark'\n case 'filter':\n return 'badge-warning'\n default:\n return 'badge-secondary'\n }\n }\n}\n","<div\n class=\"card card-body py-2 px-3 mb-2\"\n [class]=\"borderClass\"\n [attr.data-testid]=\"'alteration-item-' + item.id\"\n>\n <div class=\"d-flex align-items-center\">\n <!-- Type badge -->\n <span\n class=\"badge mr-2\"\n [class]=\"badgeClass\"\n [attr.data-testid]=\"'alteration-type-' + item.type\"\n >\n {{ typeDisplayName }}\n </span>\n\n <!-- Type icon -->\n <seam-icon\n [icon]=\"typeIcon\"\n class=\"mr-2 text-muted\"\n [attr.data-testid]=\"'alteration-icon-' + item.type\"\n >\n </seam-icon>\n\n <!-- Summary text -->\n <span class=\"flex-grow-1\" [attr.data-testid]=\"'alteration-summary'\">\n {{ item.summary }}\n </span>\n\n <!-- Diff state indicator (optional visual indicator) -->\n <span\n *ngIf=\"item.diffState\"\n class=\"ml-2 small text-muted\"\n [attr.data-testid]=\"'alteration-diff-state'\"\n >\n <ng-container [ngSwitch]=\"item.diffState\">\n <span *ngSwitchCase=\"'added'\" class=\"text-success\">+</span>\n <span *ngSwitchCase=\"'removed'\" class=\"text-danger\">-</span>\n <span *ngSwitchCase=\"'changed'\" class=\"text-warning\">~</span>\n </ng-container>\n </span>\n </div>\n\n <!-- Expanded details (for future enhancement) -->\n <div\n *ngIf=\"!compact && item.details && item.details.length > 0\"\n class=\"mt-2 pt-2 border-top\"\n >\n <ul class=\"list-unstyled mb-0 small text-muted\">\n <li\n *ngFor=\"let detail of item.details\"\n [attr.data-testid]=\"'alteration-detail'\"\n >\n {{ detail }}\n </li>\n </ul>\n </div>\n</div>\n","import { Component, Input } from '@angular/core'\nimport { CommonModule } from '@angular/common'\n\nimport {\n AlterationDisplayItem,\n AlterationVisualState,\n} from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\nimport { AlterationItemComponent } from '../alteration-item/alteration-item.component'\n\n@Component({\n selector: 'seam-alterations-list',\n standalone: true,\n imports: [CommonModule, AlterationItemComponent],\n templateUrl: './alterations-list.component.html',\n styleUrls: ['./alterations-list.component.scss'],\n})\nexport class AlterationsListComponent {\n @Input() items: AlterationDisplayItem[] = []\n @Input() title?: string\n @Input() diffState?: 'current' | 'pending'\n @Input() groupByType = true\n @Input() sortWithinType = true\n @Input() compact = true\n\n constructor(private alterationDisplayService: AlterationDisplayService) {}\n\n get sortedItems(): AlterationDisplayItem[] {\n if (!this.groupByType && !this.sortWithinType) {\n return this.items\n }\n\n return this.alterationDisplayService.groupAndSortItems(this.items)\n }\n\n get hasItems(): boolean {\n return this.items && this.items.length > 0\n }\n\n trackByItemId(index: number, item: AlterationDisplayItem): string {\n return item.id\n }\n}\n","<div\n class=\"alterations-list\"\n [attr.data-testid]=\"'alterations-list-' + (diffState || 'default')\"\n>\n <!-- Title header -->\n <div *ngIf=\"title\" class=\"mb-3\">\n <h6\n class=\"mb-1 text-muted font-weight-bold\"\n [attr.data-testid]=\"'alterations-list-title'\"\n >\n {{ title }}\n </h6>\n <small class=\"text-muted\" [attr.data-testid]=\"'alterations-list-count'\">\n {{ items.length }} alteration{{ items.length === 1 ? '' : 's' }}\n </small>\n </div>\n\n <!-- Items list -->\n <div *ngIf=\"hasItems; else emptyState\" class=\"alterations-items\">\n <seam-alteration-item\n *ngFor=\"let item of sortedItems; trackBy: trackByItemId\"\n [item]=\"item\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'list-item-' + item.id\"\n >\n </seam-alteration-item>\n </div>\n\n <!-- Empty state -->\n <ng-template #emptyState>\n <div\n class=\"text-center py-4 text-muted\"\n [attr.data-testid]=\"'alterations-list-empty'\"\n >\n <p class=\"mb-0\">No alterations</p>\n <small>No changes have been made to the table configuration.</small>\n </div>\n </ng-template>\n</div>\n","import { Component, Input, OnInit, OnDestroy } from '@angular/core'\nimport { CommonModule } from '@angular/common'\nimport { Subject, takeUntil } from 'rxjs'\n\nimport { TheSeamLayoutService } from '@theseam/ui-common/layout'\n\nimport {\n AlterationDisplayItem,\n AlterationDiffState,\n AlterationDiffMode,\n AlterationVisualState,\n} from '../models/alteration-display.model'\nimport { AlterationDisplayService } from '../services/alteration-display.service'\nimport { AlterationsListComponent } from '../alterations-list/alterations-list.component'\n\n@Component({\n selector: 'seam-alterations-diff',\n standalone: true,\n imports: [CommonModule, AlterationsListComponent],\n templateUrl: './alterations-diff.component.html',\n styleUrls: ['./alterations-diff.component.scss'],\n})\nexport class AlterationsDiffComponent implements OnInit, OnDestroy {\n @Input() currentItems: AlterationDisplayItem[] = []\n @Input() pendingItems: AlterationDisplayItem[] = []\n @Input() diffMode: AlterationDiffMode = 'auto'\n @Input() initialDiffState?: AlterationDiffState\n @Input() compact = true\n\n isMobile = false\n diffState: AlterationDiffState | null = null\n\n private destroy$ = new Subject<void>()\n\n constructor(\n private layoutService: TheSeamLayoutService,\n private alterationDisplayService: AlterationDisplayService,\n ) {}\n\n ngOnInit(): void {\n // Subscribe to mobile breakpoint changes\n this.layoutService\n .observe('lt-md')\n .pipe(takeUntil(this.destroy$))\n .subscribe((isMobile) => {\n this.isMobile = isMobile\n })\n\n // Calculate diff state\n this.calculateDiffState()\n }\n\n ngOnDestroy(): void {\n this.destroy$.next()\n this.destroy$.complete()\n }\n\n get currentItemsWithDiffState(): AlterationDisplayItem[] {\n if (!this.diffState) {\n return this.currentItems\n }\n\n return this.currentItems.map((item) => ({\n ...item,\n _diffState: this.getItemDiffState(item, 'current'),\n }))\n }\n\n get pendingItemsWithDiffState(): AlterationDisplayItem[] {\n if (!this.diffState) {\n return this.pendingItems\n }\n\n return this.pendingItems.map((item) => ({\n ...item,\n _diffState: this.getItemDiffState(item, 'pending'),\n }))\n }\n\n get hasDifferences(): boolean {\n if (!this.diffState) {\n return false\n }\n\n return (\n this.diffState.added.length > 0 ||\n this.diffState.removed.length > 0 ||\n this.diffState.changed.length > 0\n )\n }\n\n get differenceSummary(): string {\n if (!this.diffState) {\n return 'No differences calculated'\n }\n\n const parts: string[] = []\n\n if (this.diffState.added.length > 0) {\n parts.push(`${this.diffState.added.length} added`)\n }\n\n if (this.diffState.removed.length > 0) {\n parts.push(`${this.diffState.removed.length} removed`)\n }\n\n if (this.diffState.changed.length > 0) {\n parts.push(`${this.diffState.changed.length} changed`)\n }\n\n if (parts.length === 0) {\n return 'No differences'\n }\n\n return parts.join(', ')\n }\n\n private calculateDiffState(): void {\n if (this.diffMode === 'manual' && this.initialDiffState) {\n this.diffState = this.initialDiffState\n } else {\n this.diffState = this.alterationDisplayService.calculateDiff(\n this.currentItems,\n this.pendingItems,\n )\n }\n }\n\n private getItemDiffState(\n item: AlterationDisplayItem,\n context: 'current' | 'pending',\n ): AlterationVisualState | undefined {\n if (!this.diffState) {\n return undefined\n }\n\n const itemId = item.id\n\n if (this.diffState.added.some((addedItem) => addedItem.id === itemId)) {\n return context === 'pending' ? 'added' : undefined\n }\n\n if (\n this.diffState.removed.some((removedItem) => removedItem.id === itemId)\n ) {\n return context === 'current' ? 'removed' : undefined\n }\n\n if (\n this.diffState.changed.some((changedItem) => changedItem.id === itemId)\n ) {\n return 'changed'\n }\n\n return 'unchanged'\n }\n}\n","<div class=\"alterations-diff\" [attr.data-testid]=\"'alterations-diff'\">\n <!-- Diff summary header -->\n <div\n *ngIf=\"hasDifferences\"\n class=\"mb-3 p-2 bg-light border rounded\"\n [attr.data-testid]=\"'diff-summary'\"\n >\n <small class=\"text-muted font-weight-bold\">\n Changes: {{ differenceSummary }}\n </small>\n </div>\n\n <!-- Desktop layout: Side-by-side -->\n <div\n *ngIf=\"!isMobile; else mobileLayout\"\n class=\"row\"\n [attr.data-testid]=\"'desktop-layout'\"\n >\n <!-- Current alterations column -->\n <div class=\"col-md-6 pr-md-2\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations column -->\n <div class=\"col-md-6 pl-md-2\">\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n\n <!-- Mobile layout: Stacked -->\n <ng-template #mobileLayout>\n <div class=\"mobile-layout\" [attr.data-testid]=\"'mobile-layout'\">\n <!-- Current alterations -->\n <div class=\"mb-4\">\n <seam-alterations-list\n [items]=\"currentItems\"\n [title]=\"'Current Alterations'\"\n [diffState]=\"'current'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'current-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n\n <!-- Pending alterations -->\n <div>\n <seam-alterations-list\n [items]=\"pendingItems\"\n [title]=\"'Pending Alterations'\"\n [diffState]=\"'pending'\"\n [compact]=\"compact\"\n [attr.data-testid]=\"'pending-alterations-list-mobile'\"\n >\n </seam-alterations-list>\n </div>\n </div>\n </ng-template>\n</div>\n","/*\n * Public API Surface of datatable-alterations-display\n */\n\n// Models\nexport * from './models/alteration-display.model'\n\n// Services\nexport * from './services/alteration-display.service'\n\n// Components\nexport * from './alteration-item/alteration-item.component'\nexport * from './alterations-list/alterations-list.component'\nexport * from './alterations-diff/alterations-diff.component'\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.AlterationDisplayService","i2.AlterationDisplayService"],"mappings":"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"}
|