@theseam/ui-common 1.0.2-beta.83 → 1.0.2-beta.85
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/ai/index.d.ts +170 -17
- package/carousel/index.d.ts +21 -1
- package/datatable/index.d.ts +299 -3
- package/datatable-alterations-display/index.d.ts +61 -1
- package/fesm2022/theseam-ui-common-ai.mjs +433 -103
- package/fesm2022/theseam-ui-common-ai.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-carousel.mjs +48 -1
- package/fesm2022/theseam-ui-common-carousel.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs +197 -1
- package/fesm2022/theseam-ui-common-datatable-alterations-display.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-datatable.mjs +668 -4
- package/fesm2022/theseam-ui-common-datatable.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-file-input.mjs +156 -1
- package/fesm2022/theseam-ui-common-file-input.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-icon.mjs +72 -1
- package/fesm2022/theseam-ui-common-icon.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs +110 -1
- package/fesm2022/theseam-ui-common-tooltip.mjs.map +1 -1
- package/fesm2022/theseam-ui-common-widget.mjs +23 -1
- package/fesm2022/theseam-ui-common-widget.mjs.map +1 -1
- package/file-input/index.d.ts +78 -1
- package/icon/index.d.ts +33 -3
- package/package.json +1 -1
- package/tooltip/index.d.ts +40 -2
- package/widget/index.d.ts +17 -2
|
@@ -7,6 +7,7 @@ import * as i3 from '@theseam/ui-common/icon';
|
|
|
7
7
|
import { TheSeamIconModule } from '@theseam/ui-common/icon';
|
|
8
8
|
import { Subject, takeUntil } from 'rxjs';
|
|
9
9
|
import * as i1 from '@theseam/ui-common/layout';
|
|
10
|
+
import { ComponentHarness } from '@angular/cdk/testing';
|
|
10
11
|
|
|
11
12
|
class AlterationDisplayService {
|
|
12
13
|
/**
|
|
@@ -339,6 +340,201 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
339
340
|
type: Input
|
|
340
341
|
}] } });
|
|
341
342
|
|
|
343
|
+
class AlterationItemHarness extends ComponentHarness {
|
|
344
|
+
static hostSelector = 'seam-alteration-item';
|
|
345
|
+
_getCard = this.locatorFor('.card');
|
|
346
|
+
_getTypeBadge = this.locatorFor('[data-testid^="alteration-type-"]');
|
|
347
|
+
_getIcon = this.locatorFor('[data-testid^="alteration-icon-"]');
|
|
348
|
+
_getSummary = this.locatorFor('[data-testid="alteration-summary"]');
|
|
349
|
+
_getDiffState = this.locatorForOptional('[data-testid="alteration-diff-state"]');
|
|
350
|
+
_getDetails = this.locatorForAll('[data-testid="alteration-detail"]');
|
|
351
|
+
async getType() {
|
|
352
|
+
const badge = await this._getTypeBadge();
|
|
353
|
+
const testId = await badge.getAttribute('data-testid');
|
|
354
|
+
return testId?.replace('alteration-type-', '') || '';
|
|
355
|
+
}
|
|
356
|
+
async getTypeDisplayName() {
|
|
357
|
+
const badge = await this._getTypeBadge();
|
|
358
|
+
return badge.text();
|
|
359
|
+
}
|
|
360
|
+
async getSummary() {
|
|
361
|
+
const summary = await this._getSummary();
|
|
362
|
+
return summary.text();
|
|
363
|
+
}
|
|
364
|
+
async getDiffState() {
|
|
365
|
+
const diffElement = await this._getDiffState();
|
|
366
|
+
if (!diffElement) {
|
|
367
|
+
return null;
|
|
368
|
+
}
|
|
369
|
+
const text = await diffElement.text();
|
|
370
|
+
if (text.includes('+'))
|
|
371
|
+
return 'added';
|
|
372
|
+
if (text.includes('-'))
|
|
373
|
+
return 'removed';
|
|
374
|
+
if (text.includes('~'))
|
|
375
|
+
return 'changed';
|
|
376
|
+
return 'unchanged';
|
|
377
|
+
}
|
|
378
|
+
async getDetails() {
|
|
379
|
+
const detailElements = await this._getDetails();
|
|
380
|
+
return Promise.all(detailElements.map((el) => el.text()));
|
|
381
|
+
}
|
|
382
|
+
async hasDetails() {
|
|
383
|
+
const details = await this._getDetails();
|
|
384
|
+
return details.length > 0;
|
|
385
|
+
}
|
|
386
|
+
async hasBorderSuccess() {
|
|
387
|
+
const card = await this._getCard();
|
|
388
|
+
const classes = await card.getAttribute('class');
|
|
389
|
+
return classes?.includes('border-success') || false;
|
|
390
|
+
}
|
|
391
|
+
async hasBorderDanger() {
|
|
392
|
+
const card = await this._getCard();
|
|
393
|
+
const classes = await card.getAttribute('class');
|
|
394
|
+
return classes?.includes('border-danger') || false;
|
|
395
|
+
}
|
|
396
|
+
async hasBorderWarning() {
|
|
397
|
+
const card = await this._getCard();
|
|
398
|
+
const classes = await card.getAttribute('class');
|
|
399
|
+
return classes?.includes('border-warning') || false;
|
|
400
|
+
}
|
|
401
|
+
async getBadgeClass() {
|
|
402
|
+
const badge = await this._getTypeBadge();
|
|
403
|
+
const classes = await badge.getAttribute('class');
|
|
404
|
+
const badgeClasses = classes?.split(' ').filter((cls) => cls.startsWith('badge-')) || [];
|
|
405
|
+
return badgeClasses[0] || '';
|
|
406
|
+
}
|
|
407
|
+
async isVisible() {
|
|
408
|
+
try {
|
|
409
|
+
await this._getCard();
|
|
410
|
+
return true;
|
|
411
|
+
}
|
|
412
|
+
catch {
|
|
413
|
+
return false;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
class AlterationsListHarness extends ComponentHarness {
|
|
419
|
+
static hostSelector = 'seam-alterations-list';
|
|
420
|
+
_getTitle = this.locatorForOptional('[data-testid="alterations-list-title"]');
|
|
421
|
+
_getCount = this.locatorForOptional('[data-testid="alterations-list-count"]');
|
|
422
|
+
_getEmptyState = this.locatorForOptional('[data-testid="alterations-list-empty"]');
|
|
423
|
+
_getItems = this.locatorForAll(AlterationItemHarness);
|
|
424
|
+
async getTitle() {
|
|
425
|
+
const titleElement = await this._getTitle();
|
|
426
|
+
return titleElement ? titleElement.text() : null;
|
|
427
|
+
}
|
|
428
|
+
async getCount() {
|
|
429
|
+
const countElement = await this._getCount();
|
|
430
|
+
return countElement ? countElement.text() : null;
|
|
431
|
+
}
|
|
432
|
+
async hasEmptyState() {
|
|
433
|
+
const emptyState = await this._getEmptyState();
|
|
434
|
+
return emptyState !== null;
|
|
435
|
+
}
|
|
436
|
+
async getEmptyStateText() {
|
|
437
|
+
const emptyState = await this._getEmptyState();
|
|
438
|
+
return emptyState ? emptyState.text() : null;
|
|
439
|
+
}
|
|
440
|
+
async getItems() {
|
|
441
|
+
return this._getItems();
|
|
442
|
+
}
|
|
443
|
+
async getItemCount() {
|
|
444
|
+
const items = await this.getItems();
|
|
445
|
+
return items.length;
|
|
446
|
+
}
|
|
447
|
+
async getItemByType(type) {
|
|
448
|
+
const items = await this.getItems();
|
|
449
|
+
for (const item of items) {
|
|
450
|
+
const itemType = await item.getType();
|
|
451
|
+
if (itemType === type) {
|
|
452
|
+
return item;
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
return null;
|
|
456
|
+
}
|
|
457
|
+
async getItemTypes() {
|
|
458
|
+
const items = await this.getItems();
|
|
459
|
+
const types = [];
|
|
460
|
+
for (const item of items) {
|
|
461
|
+
const type = await item.getType();
|
|
462
|
+
types.push(type);
|
|
463
|
+
}
|
|
464
|
+
return types;
|
|
465
|
+
}
|
|
466
|
+
async hasItems() {
|
|
467
|
+
const items = await this.getItems();
|
|
468
|
+
return items.length > 0;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
class AlterationsDiffHarness extends ComponentHarness {
|
|
473
|
+
static hostSelector = 'seam-alterations-diff';
|
|
474
|
+
_getDiffSummary = this.locatorForOptional('[data-testid="diff-summary"]');
|
|
475
|
+
_getCurrentList = this.locatorForOptional('[data-testid="current-alterations-list"]');
|
|
476
|
+
_getPendingList = this.locatorForOptional('[data-testid="pending-alterations-list"]');
|
|
477
|
+
_getCurrentListMobile = this.locatorForOptional('[data-testid="current-alterations-list-mobile"]');
|
|
478
|
+
_getPendingListMobile = this.locatorForOptional('[data-testid="pending-alterations-list-mobile"]');
|
|
479
|
+
_getDesktopLayout = this.locatorForOptional('[data-testid="desktop-layout"]');
|
|
480
|
+
_getMobileLayout = this.locatorForOptional('[data-testid="mobile-layout"]');
|
|
481
|
+
async hasDiffSummary() {
|
|
482
|
+
const summary = await this._getDiffSummary();
|
|
483
|
+
return summary !== null;
|
|
484
|
+
}
|
|
485
|
+
async getDiffSummaryText() {
|
|
486
|
+
const summary = await this._getDiffSummary();
|
|
487
|
+
return summary ? summary.text() : null;
|
|
488
|
+
}
|
|
489
|
+
async isDesktopLayout() {
|
|
490
|
+
const desktop = await this._getDesktopLayout();
|
|
491
|
+
return desktop !== null;
|
|
492
|
+
}
|
|
493
|
+
async isMobileLayout() {
|
|
494
|
+
const mobile = await this._getMobileLayout();
|
|
495
|
+
return mobile !== null;
|
|
496
|
+
}
|
|
497
|
+
async getCurrentList() {
|
|
498
|
+
try {
|
|
499
|
+
// Try desktop layout first
|
|
500
|
+
return await this.locatorFor(AlterationsListHarness)();
|
|
501
|
+
}
|
|
502
|
+
catch {
|
|
503
|
+
return null;
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
async getPendingList() {
|
|
507
|
+
try {
|
|
508
|
+
// Try to get the second list (pending)
|
|
509
|
+
const lists = await this.locatorForAll(AlterationsListHarness)();
|
|
510
|
+
return lists.length > 1 ? lists[1] : null;
|
|
511
|
+
}
|
|
512
|
+
catch {
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
async getCurrentItemCount() {
|
|
517
|
+
const currentList = await this.getCurrentList();
|
|
518
|
+
return currentList ? currentList.getItemCount() : 0;
|
|
519
|
+
}
|
|
520
|
+
async getPendingItemCount() {
|
|
521
|
+
const pendingList = await this.getPendingList();
|
|
522
|
+
return pendingList ? pendingList.getItemCount() : 0;
|
|
523
|
+
}
|
|
524
|
+
async hasCurrentEmptyState() {
|
|
525
|
+
const currentList = await this.getCurrentList();
|
|
526
|
+
return currentList ? currentList.hasEmptyState() : false;
|
|
527
|
+
}
|
|
528
|
+
async hasPendingEmptyState() {
|
|
529
|
+
const pendingList = await this.getPendingList();
|
|
530
|
+
return pendingList ? pendingList.hasEmptyState() : false;
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
/*
|
|
535
|
+
* Public API Surface of datatable-alterations-display testing
|
|
536
|
+
*/
|
|
537
|
+
|
|
342
538
|
/*
|
|
343
539
|
* Public API Surface of datatable-alterations-display
|
|
344
540
|
*/
|
|
@@ -348,5 +544,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
|
|
|
348
544
|
* Generated bundle index. Do not edit.
|
|
349
545
|
*/
|
|
350
546
|
|
|
351
|
-
export { AlterationDisplayService, AlterationItemComponent, AlterationsDiffComponent, AlterationsListComponent };
|
|
547
|
+
export { AlterationDisplayService, AlterationItemComponent, AlterationItemHarness, AlterationsDiffComponent, AlterationsDiffHarness, AlterationsListComponent, AlterationsListHarness };
|
|
352
548
|
//# sourceMappingURL=theseam-ui-common-datatable-alterations-display.mjs.map
|
|
@@ -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 {\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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"}
|
|
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/testing/alteration-item.harness.ts","../../../projects/ui-common/datatable-alterations-display/testing/alterations-list.harness.ts","../../../projects/ui-common/datatable-alterations-display/testing/alterations-diff.harness.ts","../../../projects/ui-common/datatable-alterations-display/testing/index.ts","../../../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","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class AlterationItemHarness extends ComponentHarness {\n static hostSelector = 'seam-alteration-item'\n\n private _getCard = this.locatorFor('.card')\n private _getTypeBadge = this.locatorFor('[data-testid^=\"alteration-type-\"]')\n private _getIcon = this.locatorFor('[data-testid^=\"alteration-icon-\"]')\n private _getSummary = this.locatorFor('[data-testid=\"alteration-summary\"]')\n private _getDiffState = this.locatorForOptional(\n '[data-testid=\"alteration-diff-state\"]',\n )\n private _getDetails = this.locatorForAll('[data-testid=\"alteration-detail\"]')\n\n async getType(): Promise<string> {\n const badge = await this._getTypeBadge()\n const testId = await badge.getAttribute('data-testid')\n return testId?.replace('alteration-type-', '') || ''\n }\n\n async getTypeDisplayName(): Promise<string> {\n const badge = await this._getTypeBadge()\n return badge.text()\n }\n\n async getSummary(): Promise<string> {\n const summary = await this._getSummary()\n return summary.text()\n }\n\n async getDiffState(): Promise<string | null> {\n const diffElement = await this._getDiffState()\n if (!diffElement) {\n return null\n }\n const text = await diffElement.text()\n if (text.includes('+')) return 'added'\n if (text.includes('-')) return 'removed'\n if (text.includes('~')) return 'changed'\n return 'unchanged'\n }\n\n async getDetails(): Promise<string[]> {\n const detailElements = await this._getDetails()\n return Promise.all(detailElements.map((el) => el.text()))\n }\n\n async hasDetails(): Promise<boolean> {\n const details = await this._getDetails()\n return details.length > 0\n }\n\n async hasBorderSuccess(): Promise<boolean> {\n const card = await this._getCard()\n const classes = await card.getAttribute('class')\n return classes?.includes('border-success') || false\n }\n\n async hasBorderDanger(): Promise<boolean> {\n const card = await this._getCard()\n const classes = await card.getAttribute('class')\n return classes?.includes('border-danger') || false\n }\n\n async hasBorderWarning(): Promise<boolean> {\n const card = await this._getCard()\n const classes = await card.getAttribute('class')\n return classes?.includes('border-warning') || false\n }\n\n async getBadgeClass(): Promise<string> {\n const badge = await this._getTypeBadge()\n const classes = await badge.getAttribute('class')\n const badgeClasses =\n classes?.split(' ').filter((cls) => cls.startsWith('badge-')) || []\n return badgeClasses[0] || ''\n }\n\n async isVisible(): Promise<boolean> {\n try {\n await this._getCard()\n return true\n } catch {\n return false\n }\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\nimport { AlterationItemHarness } from './alteration-item.harness'\n\nexport class AlterationsListHarness extends ComponentHarness {\n static hostSelector = 'seam-alterations-list'\n\n private _getTitle = this.locatorForOptional(\n '[data-testid=\"alterations-list-title\"]',\n )\n private _getCount = this.locatorForOptional(\n '[data-testid=\"alterations-list-count\"]',\n )\n private _getEmptyState = this.locatorForOptional(\n '[data-testid=\"alterations-list-empty\"]',\n )\n private _getItems = this.locatorForAll(AlterationItemHarness)\n\n async getTitle(): Promise<string | null> {\n const titleElement = await this._getTitle()\n return titleElement ? titleElement.text() : null\n }\n\n async getCount(): Promise<string | null> {\n const countElement = await this._getCount()\n return countElement ? countElement.text() : null\n }\n\n async hasEmptyState(): Promise<boolean> {\n const emptyState = await this._getEmptyState()\n return emptyState !== null\n }\n\n async getEmptyStateText(): Promise<string | null> {\n const emptyState = await this._getEmptyState()\n return emptyState ? emptyState.text() : null\n }\n\n async getItems(): Promise<AlterationItemHarness[]> {\n return this._getItems()\n }\n\n async getItemCount(): Promise<number> {\n const items = await this.getItems()\n return items.length\n }\n\n async getItemByType(type: string): Promise<AlterationItemHarness | null> {\n const items = await this.getItems()\n for (const item of items) {\n const itemType = await item.getType()\n if (itemType === type) {\n return item\n }\n }\n return null\n }\n\n async getItemTypes(): Promise<string[]> {\n const items = await this.getItems()\n const types: string[] = []\n for (const item of items) {\n const type = await item.getType()\n types.push(type)\n }\n return types\n }\n\n async hasItems(): Promise<boolean> {\n const items = await this.getItems()\n return items.length > 0\n }\n}\n","import { ComponentHarness } from '@angular/cdk/testing'\nimport { AlterationsListHarness } from './alterations-list.harness'\n\nexport class AlterationsDiffHarness extends ComponentHarness {\n static hostSelector = 'seam-alterations-diff'\n\n private _getDiffSummary = this.locatorForOptional(\n '[data-testid=\"diff-summary\"]',\n )\n private _getCurrentList = this.locatorForOptional(\n '[data-testid=\"current-alterations-list\"]',\n )\n private _getPendingList = this.locatorForOptional(\n '[data-testid=\"pending-alterations-list\"]',\n )\n private _getCurrentListMobile = this.locatorForOptional(\n '[data-testid=\"current-alterations-list-mobile\"]',\n )\n private _getPendingListMobile = this.locatorForOptional(\n '[data-testid=\"pending-alterations-list-mobile\"]',\n )\n private _getDesktopLayout = this.locatorForOptional(\n '[data-testid=\"desktop-layout\"]',\n )\n private _getMobileLayout = this.locatorForOptional(\n '[data-testid=\"mobile-layout\"]',\n )\n\n async hasDiffSummary(): Promise<boolean> {\n const summary = await this._getDiffSummary()\n return summary !== null\n }\n\n async getDiffSummaryText(): Promise<string | null> {\n const summary = await this._getDiffSummary()\n return summary ? summary.text() : null\n }\n\n async isDesktopLayout(): Promise<boolean> {\n const desktop = await this._getDesktopLayout()\n return desktop !== null\n }\n\n async isMobileLayout(): Promise<boolean> {\n const mobile = await this._getMobileLayout()\n return mobile !== null\n }\n\n async getCurrentList(): Promise<AlterationsListHarness | null> {\n try {\n // Try desktop layout first\n return await this.locatorFor(AlterationsListHarness)()\n } catch {\n return null\n }\n }\n\n async getPendingList(): Promise<AlterationsListHarness | null> {\n try {\n // Try to get the second list (pending)\n const lists = await this.locatorForAll(AlterationsListHarness)()\n return lists.length > 1 ? lists[1] : null\n } catch {\n return null\n }\n }\n\n async getCurrentItemCount(): Promise<number> {\n const currentList = await this.getCurrentList()\n return currentList ? currentList.getItemCount() : 0\n }\n\n async getPendingItemCount(): Promise<number> {\n const pendingList = await this.getPendingList()\n return pendingList ? pendingList.getItemCount() : 0\n }\n\n async hasCurrentEmptyState(): Promise<boolean> {\n const currentList = await this.getCurrentList()\n return currentList ? currentList.hasEmptyState() : false\n }\n\n async hasPendingEmptyState(): Promise<boolean> {\n const pendingList = await this.getPendingList()\n return pendingList ? pendingList.hasEmptyState() : false\n }\n}\n","/*\n * Public API Surface of datatable-alterations-display testing\n */\n\nexport * from './alteration-item.harness'\nexport * from './alterations-list.harness'\nexport * from './alterations-diff.harness'\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\nexport * from './testing'\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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"}
|