@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.
Files changed (149) hide show
  1. package/breadcrumbs/index.d.ts +1 -2
  2. package/buttons/index.d.ts +20 -13
  3. package/datatable/index.d.ts +8 -8
  4. package/dynamic/index.d.ts +5 -5
  5. package/fesm2022/theseam-ui-common-asset-reader.mjs +28 -29
  6. package/fesm2022/theseam-ui-common-asset-reader.mjs.map +1 -1
  7. package/fesm2022/theseam-ui-common-breadcrumbs.mjs +25 -31
  8. package/fesm2022/theseam-ui-common-breadcrumbs.mjs.map +1 -1
  9. package/fesm2022/theseam-ui-common-buttons.mjs +108 -66
  10. package/fesm2022/theseam-ui-common-buttons.mjs.map +1 -1
  11. package/fesm2022/theseam-ui-common-card.mjs +21 -21
  12. package/fesm2022/theseam-ui-common-card.mjs.map +1 -1
  13. package/fesm2022/theseam-ui-common-carousel.mjs +28 -30
  14. package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
  15. package/fesm2022/theseam-ui-common-checkbox.mjs +27 -27
  16. package/fesm2022/theseam-ui-common-checkbox.mjs.map +1 -1
  17. package/fesm2022/theseam-ui-common-confirm-dialog.mjs +23 -27
  18. package/fesm2022/theseam-ui-common-confirm-dialog.mjs.map +1 -1
  19. package/fesm2022/theseam-ui-common-core.mjs +31 -11
  20. package/fesm2022/theseam-ui-common-core.mjs.map +1 -1
  21. package/fesm2022/theseam-ui-common-data-exporter.mjs +18 -19
  22. package/fesm2022/theseam-ui-common-data-exporter.mjs.map +1 -1
  23. package/fesm2022/theseam-ui-common-data-filters.mjs +80 -64
  24. package/fesm2022/theseam-ui-common-data-filters.mjs.map +1 -1
  25. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +51 -49
  26. package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
  27. package/fesm2022/theseam-ui-common-datatable-dynamic.mjs +145 -112
  28. package/fesm2022/theseam-ui-common-datatable-dynamic.mjs.map +1 -1
  29. package/fesm2022/theseam-ui-common-datatable.mjs +581 -385
  30. package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
  31. package/fesm2022/theseam-ui-common-dynamic-component-loader.mjs +12 -14
  32. package/fesm2022/theseam-ui-common-dynamic-component-loader.mjs.map +1 -1
  33. package/fesm2022/theseam-ui-common-dynamic.mjs +60 -48
  34. package/fesm2022/theseam-ui-common-dynamic.mjs.map +1 -1
  35. package/fesm2022/theseam-ui-common-footer-bar.mjs +9 -15
  36. package/fesm2022/theseam-ui-common-footer-bar.mjs.map +1 -1
  37. package/fesm2022/theseam-ui-common-form-field-error.mjs +60 -43
  38. package/fesm2022/theseam-ui-common-form-field-error.mjs.map +1 -1
  39. package/fesm2022/theseam-ui-common-form-field.mjs +120 -74
  40. package/fesm2022/theseam-ui-common-form-field.mjs.map +1 -1
  41. package/fesm2022/theseam-ui-common-framework.mjs +669 -543
  42. package/fesm2022/theseam-ui-common-framework.mjs.map +1 -1
  43. package/fesm2022/theseam-ui-common-google-maps.mjs +206 -149
  44. package/fesm2022/theseam-ui-common-google-maps.mjs.map +1 -1
  45. package/fesm2022/theseam-ui-common-graphql.mjs +252 -195
  46. package/fesm2022/theseam-ui-common-graphql.mjs.map +1 -1
  47. package/fesm2022/theseam-ui-common-icon.mjs +125 -89
  48. package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
  49. package/fesm2022/theseam-ui-common-layout.mjs +18 -26
  50. package/fesm2022/theseam-ui-common-layout.mjs.map +1 -1
  51. package/fesm2022/theseam-ui-common-loading.mjs +19 -28
  52. package/fesm2022/theseam-ui-common-loading.mjs.map +1 -1
  53. package/fesm2022/theseam-ui-common-menu.mjs +124 -95
  54. package/fesm2022/theseam-ui-common-menu.mjs.map +1 -1
  55. package/fesm2022/theseam-ui-common-modal.mjs +177 -129
  56. package/fesm2022/theseam-ui-common-modal.mjs.map +1 -1
  57. package/fesm2022/theseam-ui-common-models.mjs +3 -3
  58. package/fesm2022/theseam-ui-common-models.mjs.map +1 -1
  59. package/fesm2022/theseam-ui-common-navigation-reload.mjs +13 -11
  60. package/fesm2022/theseam-ui-common-navigation-reload.mjs.map +1 -1
  61. package/fesm2022/theseam-ui-common-popover.mjs +81 -88
  62. package/fesm2022/theseam-ui-common-popover.mjs.map +1 -1
  63. package/fesm2022/theseam-ui-common-progress.mjs +15 -19
  64. package/fesm2022/theseam-ui-common-progress.mjs.map +1 -1
  65. package/fesm2022/theseam-ui-common-rich-text.mjs +65 -52
  66. package/fesm2022/theseam-ui-common-rich-text.mjs.map +1 -1
  67. package/fesm2022/theseam-ui-common-scrollbar.mjs +12 -9
  68. package/fesm2022/theseam-ui-common-scrollbar.mjs.map +1 -1
  69. package/fesm2022/theseam-ui-common-services.mjs +41 -26
  70. package/fesm2022/theseam-ui-common-services.mjs.map +1 -1
  71. package/fesm2022/theseam-ui-common-shared.mjs +123 -67
  72. package/fesm2022/theseam-ui-common-shared.mjs.map +1 -1
  73. package/fesm2022/theseam-ui-common-storage.mjs +9 -6
  74. package/fesm2022/theseam-ui-common-storage.mjs.map +1 -1
  75. package/fesm2022/theseam-ui-common-story-helpers.mjs +148 -86
  76. package/fesm2022/theseam-ui-common-story-helpers.mjs.map +1 -1
  77. package/fesm2022/theseam-ui-common-tabbed.mjs +43 -39
  78. package/fesm2022/theseam-ui-common-tabbed.mjs.map +1 -1
  79. package/fesm2022/theseam-ui-common-table-cell-type.mjs +34 -38
  80. package/fesm2022/theseam-ui-common-table-cell-type.mjs.map +1 -1
  81. package/fesm2022/theseam-ui-common-table-cell-types.mjs +182 -144
  82. package/fesm2022/theseam-ui-common-table-cell-types.mjs.map +1 -1
  83. package/fesm2022/theseam-ui-common-table.mjs +50 -39
  84. package/fesm2022/theseam-ui-common-table.mjs.map +1 -1
  85. package/fesm2022/theseam-ui-common-tel-input.mjs +98 -63
  86. package/fesm2022/theseam-ui-common-tel-input.mjs.map +1 -1
  87. package/fesm2022/theseam-ui-common-testing.mjs +13 -10
  88. package/fesm2022/theseam-ui-common-testing.mjs.map +1 -1
  89. package/fesm2022/theseam-ui-common-tiled-select.mjs +54 -50
  90. package/fesm2022/theseam-ui-common-tiled-select.mjs.map +1 -1
  91. package/fesm2022/theseam-ui-common-toggle-edit.mjs +41 -37
  92. package/fesm2022/theseam-ui-common-toggle-edit.mjs.map +1 -1
  93. package/fesm2022/theseam-ui-common-toggle-group.mjs +30 -31
  94. package/fesm2022/theseam-ui-common-toggle-group.mjs.map +1 -1
  95. package/fesm2022/theseam-ui-common-tooltip.mjs +225 -66
  96. package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
  97. package/fesm2022/theseam-ui-common-unsaved-changes-dialog.mjs +14 -12
  98. package/fesm2022/theseam-ui-common-unsaved-changes-dialog.mjs.map +1 -1
  99. package/fesm2022/theseam-ui-common-utils.mjs +113 -77
  100. package/fesm2022/theseam-ui-common-utils.mjs.map +1 -1
  101. package/fesm2022/theseam-ui-common-validators.mjs +10 -9
  102. package/fesm2022/theseam-ui-common-validators.mjs.map +1 -1
  103. package/fesm2022/theseam-ui-common-vertical-list-filter.mjs +39 -17
  104. package/fesm2022/theseam-ui-common-vertical-list-filter.mjs.map +1 -1
  105. package/fesm2022/theseam-ui-common-viewers.mjs +79 -56
  106. package/fesm2022/theseam-ui-common-viewers.mjs.map +1 -1
  107. package/fesm2022/theseam-ui-common-widget.mjs +288 -314
  108. package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
  109. package/framework/base-layout/base-layout.component.scss +9 -4
  110. package/framework/base-layout/styles/_variables.scss +4 -9
  111. package/framework/dashboard/dashboard-widgets/dashboard-widgets.component.scss +6 -4
  112. package/framework/index.d.ts +6 -6
  113. package/framework/nav/nav-item/nav-item.component.scss +7 -6
  114. package/framework/nav/styles/_themes/light/_variables.scss +21 -5
  115. package/framework/nav/styles/_themes/primary/_variables.scss +21 -5
  116. package/framework/side-nav/side-nav-item/side-nav-item.component.scss +5 -2
  117. package/framework/side-nav/styles/_themes/light/_variables.scss +5 -1
  118. package/framework/side-nav/styles/_themes/primary/_variables.scss +25 -5
  119. package/graphql/index.d.ts +5 -5
  120. package/modal/README.md +5 -5
  121. package/modal/index.d.ts +1 -1
  122. package/models/index.d.ts +1 -1
  123. package/package.json +59 -59
  124. package/popover/index.d.ts +0 -2
  125. package/progress/progress-circle/styles/_variables.scss +15 -3
  126. package/story-helpers/index.d.ts +11 -1
  127. package/styles/bootstrap/_bootstrap.scss +34 -34
  128. package/styles/bootstrap/_bs-styles.scss +4 -8
  129. package/styles/bootstrap/_bs-utilities.scss +4 -4
  130. package/styles/bootstrap/_bs-variables.scss +65 -70
  131. package/styles/common/_forms.scss +9 -10
  132. package/styles/common/_global.scss +0 -1
  133. package/styles/common/_hacks.scss +1 -1
  134. package/styles/common/_table.scss +0 -1
  135. package/styles/common/_text.scss +3 -1
  136. package/styles/theme.scss +1 -1
  137. package/styles/vendor/ng-select/_ng-select-bs4.scss +292 -294
  138. package/styles/vendor/ngx-datatable/_ngx-datatable.scss +63 -32
  139. package/styles/vendor/ngx-datatable/_themes/bootstrap/_variables.scss +37 -10
  140. package/styles/vendor/ngx-datatable/_themes/material/_variables.scss +3 -1
  141. package/styles/vendor/quill/_quill.scss +15 -9
  142. package/tel-input/README.md +27 -27
  143. package/utils/index.d.ts +3 -3
  144. package/viewers/index.d.ts +9 -2
  145. package/widget/_widget-theme.scss +1 -1
  146. package/widget/styles/_variables.scss +2 -2
  147. package/widget/widget/widget.component.scss +0 -2
  148. package/widget/widget-content-components/widget-tile/widget-tile.component.scss +1 -3
  149. 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
- 'sort': 1,
48
- 'order': 2,
47
+ sort: 1,
48
+ order: 2,
49
49
  'hide-column': 3,
50
- 'width': 4,
51
- 'filter': 5
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
- 'sort': 'Sort',
76
- 'order': 'Order',
75
+ sort: 'Sort',
76
+ order: 'Order',
77
77
  'hide-column': 'Visibility',
78
- 'width': 'Width',
79
- 'filter': 'Filter'
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
- 'sort': 'sort',
89
- 'order': 'arrows-alt',
88
+ sort: 'sort',
89
+ order: 'arrows-alt',
90
90
  'hide-column': 'eye-slash',
91
- 'width': 'arrows-alt-h',
92
- 'filter': 'filter'
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.1", ngImport: i0, type: AlterationDisplayService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
110
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.1", ngImport: i0, type: AlterationDisplayService, providedIn: 'root' });
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.1", ngImport: i0, type: AlterationDisplayService, decorators: [{
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
- 'sort': faSort,
126
- 'order': faArrowsAlt,
125
+ sort: faSort,
126
+ order: faArrowsAlt,
127
127
  'hide-column': faEyeSlash,
128
- 'width': faArrowsAltH,
129
- 'filter': faFilter,
130
- 'default': faCog
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] || this.typeIcons.default;
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.1", ngImport: i0, type: AlterationItemComponent, deps: [{ token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
170
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", type: AlterationItemComponent, isStandalone: true, selector: "seam-alteration-item", inputs: { item: "item", compact: "compact" }, ngImport: i0, template: "<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", 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"] }] });
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.1", ngImport: i0, type: AlterationItemComponent, decorators: [{
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 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", 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
+ 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.1", ngImport: i0, type: AlterationsListComponent, deps: [{ token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
205
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", 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 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", 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"] }] });
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.1", ngImport: i0, type: AlterationsListComponent, decorators: [{
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 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", 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
+ 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.observe('lt-md')
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.1", ngImport: i0, type: AlterationsDiffComponent, deps: [{ token: i1.TheSeamLayoutService }, { token: AlterationDisplayService }], target: i0.ɵɵFactoryTarget.Component });
323
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "20.3.1", 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\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", 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
+ 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.1", ngImport: i0, type: AlterationsDiffComponent, decorators: [{
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\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", 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"] }]
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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"}