@theseam/ui-common 1.0.2-beta.83 → 1.0.2-beta.84

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.
@@ -3,6 +3,8 @@ import { OnInit, OnDestroy, QueryList } from '@angular/core';
3
3
  import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
4
4
  import { NumberInput, BooleanInput } from '@angular/cdk/coercion';
5
5
  import { Observable } from 'rxjs';
6
+ import * as _angular_cdk_testing from '@angular/cdk/testing';
7
+ import { ComponentHarness } from '@angular/cdk/testing';
6
8
 
7
9
  declare class TheSeamCarouselSlideDirective {
8
10
  private readonly template;
@@ -97,4 +99,22 @@ declare class TheSeamCarouselModule {
97
99
  static ɵinj: i0.ɵɵInjectorDeclaration<TheSeamCarouselModule>;
98
100
  }
99
101
 
100
- export { TheSeamCarouselComponent, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
102
+ declare class TheSeamCarouselHarness extends ComponentHarness {
103
+ static hostSelector: string;
104
+ _content: () => Promise<_angular_cdk_testing.TestElement>;
105
+ _prevSlideButton: () => Promise<_angular_cdk_testing.TestElement | null>;
106
+ _nextSlideButton: () => Promise<_angular_cdk_testing.TestElement | null>;
107
+ _playButton: () => Promise<_angular_cdk_testing.TestElement | null>;
108
+ _pauseButton: () => Promise<_angular_cdk_testing.TestElement | null>;
109
+ activeTileIndex(): Promise<string | null>;
110
+ goToPreviousSlide(): Promise<void>;
111
+ goToNextSlide(): Promise<void>;
112
+ goToSlide(index: number): Promise<void>;
113
+ hasPreviousSlideButton(): Promise<boolean>;
114
+ hasNextSlideButton(): Promise<boolean>;
115
+ hasSlideButton(index: number): Promise<boolean>;
116
+ hasSlideButtons(): Promise<boolean>;
117
+ hasAutoPlayToggleButton(): Promise<boolean>;
118
+ }
119
+
120
+ export { TheSeamCarouselComponent, TheSeamCarouselHarness, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
@@ -18,7 +18,7 @@ import { Router } from '@angular/router';
18
18
  import * as i38 from '@theseam/ui-common/confirm-dialog';
19
19
  import { SeamConfirmDialogService } from '@theseam/ui-common/confirm-dialog';
20
20
  import * as i32 from '@theseam/ui-common/menu';
21
- import { MenuComponent } from '@theseam/ui-common/menu';
21
+ import { MenuComponent, TheSeamMenuItemHarnessFilters, TheSeamMenuItemHarness } from '@theseam/ui-common/menu';
22
22
  import { ThemeTypes } from '@theseam/ui-common/models';
23
23
  import * as i43 from '@theseam/ui-common/table-cell-type';
24
24
  import { TableCellTypeName, TableCellTypeConfig, TableCellTypeColumn, TableCellTypeExportProps, TheSeamTableCellTypeColumnAlign } from '@theseam/ui-common/table-cell-type';
@@ -45,9 +45,13 @@ import * as i33 from '@theseam/ui-common/buttons';
45
45
  import * as i37 from '@angular/cdk/portal';
46
46
  import * as i39 from '@theseam/ui-common/popover';
47
47
  import * as i40 from '@theseam/ui-common/checkbox';
48
+ import { TheSeamCheckboxHarness } from '@theseam/ui-common/checkbox';
48
49
  import * as i41 from '@theseam/ui-common/form-field';
49
50
  import * as i45 from '@ng-select/ng-select';
50
51
  import * as i46 from '@theseam/ui-common/toggle-group';
52
+ import * as _angular_cdk_testing from '@angular/cdk/testing';
53
+ import { BaseHarnessFilters, ComponentHarness, ComponentHarnessConstructor, HarnessPredicate, ContentContainerComponentHarness } from '@angular/cdk/testing';
54
+ import { TheSeamNgSelectHarness } from '@theseam/ui-common/testing';
51
55
 
52
56
  declare class DatatableActionMenuItemComponent {
53
57
  label: string | undefined | null;
@@ -1391,5 +1395,297 @@ declare class TheSeamDatatableModule {
1391
1395
  static ɵinj: i0.ɵɵInjectorDeclaration<TheSeamDatatableModule>;
1392
1396
  }
1393
1397
 
1394
- export { CURRENT_DATATABLE_PREFERENCES_VERSION, ColumnsAlteration, ColumnsDataFilter, ColumnsFiltersService, DatatableActionMenuComponent, DatatableActionMenuItemComponent, DatatableActionMenuItemDirective, DatatableActionMenuToggleDirective, DatatableCellTplDirective, DatatableColumnChangesService, DatatableColumnComponent, DatatableColumnFilterMenuComponent, DatatableColumnFilterSearchDateComponent, DatatableColumnFilterSearchNumericComponent, DatatableColumnFilterSearchTextComponent, DatatableColumnFilterTplDirective, DatatableColumnPreferencesButtonComponent, DatatableColumnPreferencesComponent, DatatableComponent, DatatableDataSource, DatatableExportButtonComponent, DatatableFilterDirective, DatatableFooterTplDirective, DatatableGqlDataSource, DatatableMenuBarColumnCenterComponent, DatatableMenuBarColumnLeftComponent, DatatableMenuBarColumnRightComponent, DatatableMenuBarComponent, DatatableMenuBarRowComponent, DatatableMenuBarTextComponent, DatatablePreferencesService, DatatableRefreshButtonComponent, DatatableRefreshService, DatatableRowActionItemDirective, DatatableRowDetailTplDirective, EMPTY_DATATABLE_PREFERENCES, SearchDateColumnsDataFilter, SearchNumericColumnsDataFilter, SearchTextColumnsDataFilter, THESEAM_COLUMNS_DATA_FILTER, THESEAM_COLUMNS_DATA_FILTERS_DEFAULT, THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_DATE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES, THESEAM_DATATABLE, THESEAM_DATATABLE_CONFIG, THESEAM_DATATABLE_PREFERENCES_ACCESSOR, THESEAM_MENUBAR_ITEM_DATA, TheSeamDatatableColumnFilterDirective, TheSeamDatatableFooterDirective, TheSeamDatatableModule, TheSeamDatatableRowDetailDirective, TheSeamDatatableScrollbarHelperService, _THESEAM_DATATABLE, _THESEAM_DATATABLE_ACCESSOR, _THESEAM_DATA_FILTER_CONTAINER, getFormattedDateForComparison, isColumnBoundToProp, mapColumnsAlterationsStates, withStoredColumnInfo };
1395
- export type { ColumnsAlterationState, ColumnsDataFilterState, ColumnsDataFilterStateState, ICellContext, IDatatableExportButtonData, MenubarItemData, SortEvent, SortItem, TheSeamColumnsDataFilterDateSearchDateType, TheSeamColumnsDataFilterDateSearchForm, TheSeamColumnsDataFilterDateSearchFormState, TheSeamColumnsDataFilterDateSearchOptions, TheSeamColumnsDataFilterDateSearchType, TheSeamColumnsDataFilterNumericSearchForm, TheSeamColumnsDataFilterNumericSearchFormState, TheSeamColumnsDataFilterNumericSearchType, TheSeamColumnsDataFilterTextSearchForm, TheSeamColumnsDataFilterTextSearchFormState, TheSeamColumnsDataFilterTextSearchType, TheSeamDatatableAccessor, TheSeamDatatableColumn, TheSeamDatatableColumnFilterUpdateMethod, TheSeamDatatableColumnFilterable, TheSeamDatatableColumnFilterableConfig, TheSeamDatatableColumnHidable, TheSeamDatatableConfig, TheSeamDatatableDateColumnFilterableConfig, TheSeamDatatableMessages, TheSeamDatatablePreferences, TheSeamDatatablePreferencesAccessor, TheSeamDatatablePreferencesColumn, TheSeamDatatablePreferences_v1, TheSeamDatatablePreferences_v2, TheSeamDatatableRow, TheSeamPageInfo };
1398
+ declare const SIMPLE_COLUMNS: TheSeamDatatableColumn[];
1399
+ declare const SIMPLE_ROWS: {
1400
+ name: string;
1401
+ age: number;
1402
+ color: string;
1403
+ }[];
1404
+ declare const FILTERABLE_COLUMNS: TheSeamDatatableColumn[];
1405
+ declare const FILTERABLE_ROWS: ({
1406
+ name: string;
1407
+ age: any;
1408
+ color: string;
1409
+ candy: string;
1410
+ candyAttributes: string[];
1411
+ startDate: string;
1412
+ } | {
1413
+ name: string;
1414
+ age: null;
1415
+ color: null;
1416
+ candy: null;
1417
+ candyAttributes: undefined;
1418
+ startDate: null;
1419
+ })[];
1420
+ declare function createRows(count: number): {
1421
+ name: string;
1422
+ age: number;
1423
+ color: string;
1424
+ }[];
1425
+
1426
+ type TheSeamDatatableActionMenuHarnessFilters = BaseHarnessFilters;
1427
+ declare class TheSeamDatatableActionMenuHarness extends ComponentHarness {
1428
+ static hostSelector: string;
1429
+ static with<T extends TheSeamDatatableActionMenuHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableActionMenuHarnessFilters): HarnessPredicate<T>;
1430
+ private _getMenuHarness;
1431
+ /** Whether the action menu is open. */
1432
+ isOpen(): Promise<boolean>;
1433
+ /** Opens the action menu. */
1434
+ open(): Promise<void>;
1435
+ /** Closes the action menu. */
1436
+ close(): Promise<void>;
1437
+ /**
1438
+ * Gets the menu items in the action menu.
1439
+ * The menu must be opened first (call `open()`) or use `clickItem()` which opens automatically.
1440
+ */
1441
+ getItems(filters?: Omit<TheSeamMenuItemHarnessFilters, 'ancestor'>): Promise<TheSeamMenuItemHarness[]>;
1442
+ /**
1443
+ * Opens the menu and clicks an item by text.
1444
+ * Supports sub-menu navigation via additional filter arguments.
1445
+ */
1446
+ clickItem(itemFilter: Omit<TheSeamMenuItemHarnessFilters, 'ancestor'>, ...subItemFilters: Omit<TheSeamMenuItemHarnessFilters, 'ancestor'>[]): Promise<void>;
1447
+ }
1448
+
1449
+ interface TheSeamDatatableCellHarnessFilters extends BaseHarnessFilters {
1450
+ /** Filters based on the text content of the cell. */
1451
+ text?: string | RegExp;
1452
+ }
1453
+ declare class TheSeamDatatableCellHarness extends ComponentHarness {
1454
+ static hostSelector: string;
1455
+ static with<T extends TheSeamDatatableCellHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableCellHarnessFilters): HarnessPredicate<T>;
1456
+ /** Gets the text content of the cell. */
1457
+ getText(): Promise<string>;
1458
+ /** Clicks the cell. */
1459
+ click(): Promise<void>;
1460
+ /**
1461
+ * Gets a child harness of the given type from within this cell.
1462
+ * Useful for retrieving cell-type harnesses (e.g., currency, date, icon).
1463
+ *
1464
+ * Returns `null` if no matching harness is found.
1465
+ */
1466
+ getCellTypeHarness<T extends ComponentHarness>(harnessType: ComponentHarnessConstructor<T>): Promise<T | null>;
1467
+ }
1468
+
1469
+ type TheSeamDatatableColumnFilterMenuHarnessFilters = BaseHarnessFilters;
1470
+ declare class TheSeamDatatableColumnFilterMenuHarness extends ComponentHarness {
1471
+ static hostSelector: string;
1472
+ static with<T extends TheSeamDatatableColumnFilterMenuHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableColumnFilterMenuHarnessFilters): HarnessPredicate<T>;
1473
+ /** Gets the filter type by checking which sub-component is rendered. */
1474
+ getFilterType(): Promise<'search-text' | 'search-numeric' | 'search-date' | 'custom'>;
1475
+ /** Gets the search type ng-select harness. */
1476
+ getSearchTypeSelect(): Promise<TheSeamNgSelectHarness>;
1477
+ /** Gets the current search type value (e.g. "Contains", "Equals", "Between"). */
1478
+ getSearchType(): Promise<string | null>;
1479
+ /**
1480
+ * Selects a search type from the dropdown by its displayed label
1481
+ * (e.g. `'Before'`, `'Contains'`, `'Between'`).
1482
+ *
1483
+ * Note: this matches the visible option text, not the underlying form value
1484
+ * (e.g. pass `'Before'` not `'lt'`).
1485
+ */
1486
+ selectSearchType(label: string | RegExp): Promise<void>;
1487
+ /** Gets the primary search input (formControlName="searchText"). */
1488
+ getSearchInput(): Promise<_angular_cdk_testing.TestElement | null>;
1489
+ /** Gets the range start input (formControlName="fromText"). */
1490
+ getRangeStartInput(): Promise<_angular_cdk_testing.TestElement | null>;
1491
+ /** Gets the range end input (formControlName="toText"). */
1492
+ getRangeEndInput(): Promise<_angular_cdk_testing.TestElement | null>;
1493
+ /**
1494
+ * Sets the primary search value.
1495
+ * Clears any existing value first, then types the new value.
1496
+ */
1497
+ setSearchValue(value: string): Promise<void>;
1498
+ /**
1499
+ * Sets the range values (for "Between" search types on numeric/date filters).
1500
+ */
1501
+ setRangeValues(from: string, to: string): Promise<void>;
1502
+ /** Clicks the "Clear" button to reset the filter. */
1503
+ clear(): Promise<void>;
1504
+ /** Clicks the "Apply" button (only present in submit mode). */
1505
+ apply(): Promise<void>;
1506
+ /** Whether the "Apply" button is present (submit mode). */
1507
+ hasApplyButton(): Promise<boolean>;
1508
+ /** Whether the "Clear" button is disabled (filter is already at default). */
1509
+ isClearDisabled(): Promise<boolean>;
1510
+ }
1511
+
1512
+ type TheSeamDatatableColumnPreferencesButtonHarnessFilters = BaseHarnessFilters;
1513
+ declare class TheSeamDatatableColumnPreferencesButtonHarness extends ComponentHarness {
1514
+ static hostSelector: string;
1515
+ private _documentRootLocator;
1516
+ static with<T extends TheSeamDatatableColumnPreferencesButtonHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableColumnPreferencesButtonHarnessFilters): HarnessPredicate<T>;
1517
+ private _getMenuHarness;
1518
+ /** Opens the preferences menu by clicking the button. */
1519
+ open(): Promise<void>;
1520
+ /** Closes the preferences menu. */
1521
+ close(): Promise<void>;
1522
+ /** Whether the preferences menu is open. */
1523
+ isOpen(): Promise<boolean>;
1524
+ /**
1525
+ * Opens the "Show/Hide Columns" popover and returns the checkbox harnesses
1526
+ * for each column. The checkboxes are rendered inside a CDK overlay popover.
1527
+ */
1528
+ getColumnCheckboxes(): Promise<TheSeamCheckboxHarness[]>;
1529
+ /**
1530
+ * Toggles a column's visibility by name.
1531
+ * Opens the Show/Hide Columns popover and clicks the matching checkbox.
1532
+ */
1533
+ toggleColumn(name: string | RegExp): Promise<void>;
1534
+ /** Clicks the "Reset Columns" menu item. */
1535
+ resetColumns(): Promise<void>;
1536
+ }
1537
+
1538
+ type TheSeamDatatableExportButtonHarnessFilters = BaseHarnessFilters;
1539
+ declare class TheSeamDatatableExportButtonHarness extends ComponentHarness {
1540
+ static hostSelector: string;
1541
+ static with<T extends TheSeamDatatableExportButtonHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableExportButtonHarnessFilters): HarnessPredicate<T>;
1542
+ private _getMenuHarness;
1543
+ /** Opens the export menu. */
1544
+ open(): Promise<void>;
1545
+ /** Closes the export menu. */
1546
+ close(): Promise<void>;
1547
+ /** Whether the export menu is open. */
1548
+ isOpen(): Promise<boolean>;
1549
+ /** Whether the export button is disabled. */
1550
+ isDisabled(): Promise<boolean>;
1551
+ /** Gets the exporter menu items. The menu must be opened first or use `clickExporter()`. */
1552
+ getExporters(filters?: Omit<TheSeamMenuItemHarnessFilters, 'ancestor'>): Promise<TheSeamMenuItemHarness[]>;
1553
+ /** Opens the menu and clicks an exporter by label. */
1554
+ clickExporter(label: string | RegExp): Promise<void>;
1555
+ }
1556
+
1557
+ type SortDirection = 'asc' | 'desc' | 'none';
1558
+ interface TheSeamDatatableHeaderCellHarnessFilters extends BaseHarnessFilters {
1559
+ /** Filters based on the column name text. */
1560
+ name?: string | RegExp;
1561
+ /** Filters based on the sort direction. */
1562
+ sortDirection?: SortDirection;
1563
+ }
1564
+ declare class TheSeamDatatableHeaderCellHarness extends ComponentHarness {
1565
+ static hostSelector: string;
1566
+ static with<T extends TheSeamDatatableHeaderCellHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableHeaderCellHarnessFilters): HarnessPredicate<T>;
1567
+ /** Gets the column name text. */
1568
+ getName(): Promise<string>;
1569
+ /** Gets the current sort direction of this column. */
1570
+ getSortDirection(): Promise<SortDirection>;
1571
+ /** Whether this column is sortable. */
1572
+ isSortable(): Promise<boolean>;
1573
+ /** Clicks the sort button to cycle the sort direction. */
1574
+ sort(): Promise<void>;
1575
+ /** Whether this column has a filter button. */
1576
+ isFilterable(): Promise<boolean>;
1577
+ /** Whether the column filter is currently active. */
1578
+ isFilterActive(): Promise<boolean>;
1579
+ /** Opens the column filter menu by clicking the filter button. */
1580
+ openFilter(): Promise<void>;
1581
+ /**
1582
+ * Opens the filter and returns the filter menu harness.
1583
+ * The filter menu renders in a CDK overlay, so this uses the document root locator.
1584
+ */
1585
+ getFilterMenu(): Promise<TheSeamDatatableColumnFilterMenuHarness>;
1586
+ /** Whether this header cell is a checkbox column (select-all). */
1587
+ isCheckboxColumn(): Promise<boolean>;
1588
+ /** Clicks the select-all checkbox in this header cell. */
1589
+ clickCheckbox(): Promise<void>;
1590
+ }
1591
+
1592
+ type TheSeamDatatableMenuBarHarnessFilters = BaseHarnessFilters;
1593
+ declare class TheSeamDatatableMenuBarHarness extends ContentContainerComponentHarness<string> {
1594
+ static hostSelector: string;
1595
+ static with<T extends TheSeamDatatableMenuBarHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableMenuBarHarnessFilters): HarnessPredicate<T>;
1596
+ /** Gets the text content of the menu bar. */
1597
+ getTextContent(): Promise<string>;
1598
+ }
1599
+
1600
+ interface TheSeamDatatablePagerButtonHarnessFilters extends BaseHarnessFilters {
1601
+ /** Filters based on the page number of the button. */
1602
+ pageNumber?: number | string | RegExp | null;
1603
+ }
1604
+ declare class TheSeamDatatablePagerButtonHarness extends ComponentHarness {
1605
+ static hostSelector: string;
1606
+ /** Creates a `HarnessPredicate` used to locate a particular `MyMenuHarness`. */
1607
+ static with(options: TheSeamDatatablePagerButtonHarnessFilters): HarnessPredicate<TheSeamDatatablePagerButtonHarness>;
1608
+ getLabel(): Promise<string | null>;
1609
+ getAnchor(): Promise<_angular_cdk_testing.TestElement>;
1610
+ }
1611
+
1612
+ declare class TheSeamDatatablePagerHarness extends ComponentHarness {
1613
+ static hostSelector: string;
1614
+ private readonly _activePageButton;
1615
+ getPageButtonHarness(pageNumber: number): Promise<TheSeamDatatablePagerButtonHarness>;
1616
+ getCurrentPageNumber(): Promise<number>;
1617
+ }
1618
+
1619
+ interface TheSeamDatatableRowHarnessFilters extends BaseHarnessFilters {
1620
+ /** Filters based on whether the row is selected. */
1621
+ selected?: boolean;
1622
+ }
1623
+ declare class TheSeamDatatableRowHarness extends ComponentHarness {
1624
+ static hostSelector: string;
1625
+ static with<T extends TheSeamDatatableRowHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableRowHarnessFilters): HarnessPredicate<T>;
1626
+ /** Gets all cells in this row, optionally filtered. */
1627
+ getCells(filters?: TheSeamDatatableCellHarnessFilters): Promise<TheSeamDatatableCellHarness[]>;
1628
+ /** Gets a cell by its index in the row. */
1629
+ getCell(index: number): Promise<TheSeamDatatableCellHarness>;
1630
+ /** Convenience method to get the text content of a cell by index. */
1631
+ getCellText(index: number): Promise<string>;
1632
+ /** Whether this row is selected. */
1633
+ isSelected(): Promise<boolean>;
1634
+ /** Clicks the row to activate it. */
1635
+ click(): Promise<void>;
1636
+ /** Gets the action menu harness for this row, or `null` if no action menu exists. */
1637
+ getActionMenu(): Promise<TheSeamDatatableActionMenuHarness | null>;
1638
+ /** Whether this row's detail section is expanded. */
1639
+ isExpanded(): Promise<boolean>;
1640
+ /** Gets the row detail content element, or `null` if not expanded. */
1641
+ getDetailContent(): Promise<_angular_cdk_testing.TestElement | null>;
1642
+ /** Whether this row has a selection checkbox. */
1643
+ hasCheckbox(): Promise<boolean>;
1644
+ /** Clicks the selection checkbox on this row. */
1645
+ clickCheckbox(): Promise<void>;
1646
+ }
1647
+
1648
+ type TheSeamDatatableHarnessFilters = BaseHarnessFilters;
1649
+ declare class TheSeamDatatableHarness extends ComponentHarness {
1650
+ static hostSelector: string;
1651
+ static with<T extends TheSeamDatatableHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableHarnessFilters): HarnessPredicate<T>;
1652
+ private readonly _pager;
1653
+ getCurrentPage(): Promise<number>;
1654
+ getPager(): Promise<TheSeamDatatablePagerHarness | null>;
1655
+ /** Gets all visible body rows, optionally filtered. */
1656
+ getRows(filters?: TheSeamDatatableRowHarnessFilters): Promise<TheSeamDatatableRowHarness[]>;
1657
+ /** Gets a body row by its index. */
1658
+ getRow(index: number): Promise<TheSeamDatatableRowHarness>;
1659
+ /** Gets the number of visible body rows. */
1660
+ getRowCount(): Promise<number>;
1661
+ /** Gets all header cells, optionally filtered. */
1662
+ getHeaderCells(filters?: TheSeamDatatableHeaderCellHarnessFilters): Promise<TheSeamDatatableHeaderCellHarness[]>;
1663
+ /** Gets a header cell by column name. */
1664
+ getHeaderCell(name: string | RegExp): Promise<TheSeamDatatableHeaderCellHarness>;
1665
+ /** Gets the number of visible columns. */
1666
+ getColumnCount(): Promise<number>;
1667
+ /** Gets all currently selected rows. */
1668
+ getSelectedRows(): Promise<TheSeamDatatableRowHarness[]>;
1669
+ /** Gets the menu bar harness, or `null` if no menu bar is present. */
1670
+ getMenuBar(): Promise<TheSeamDatatableMenuBarHarness | null>;
1671
+ /** Gets the column preferences button harness, or `null` if not present. */
1672
+ getColumnPreferencesButton(): Promise<TheSeamDatatableColumnPreferencesButtonHarness | null>;
1673
+ /** Gets the text content of a cell by row and column index. */
1674
+ getCellText(rowIndex: number, colIndex: number): Promise<string>;
1675
+ /** Whether the table is showing its empty message (no rows). */
1676
+ isEmpty(): Promise<boolean>;
1677
+ }
1678
+
1679
+ type TheSeamDatatableRefreshButtonHarnessFilters = BaseHarnessFilters;
1680
+ declare class TheSeamDatatableRefreshButtonHarness extends ComponentHarness {
1681
+ static hostSelector: string;
1682
+ static with<T extends TheSeamDatatableRefreshButtonHarness>(this: ComponentHarnessConstructor<T>, options?: TheSeamDatatableRefreshButtonHarnessFilters): HarnessPredicate<T>;
1683
+ private readonly _button;
1684
+ /** Clicks the refresh button. */
1685
+ click(): Promise<void>;
1686
+ /** Whether the underlying button is disabled. */
1687
+ isDisabled(): Promise<boolean>;
1688
+ }
1689
+
1690
+ export { CURRENT_DATATABLE_PREFERENCES_VERSION, ColumnsAlteration, ColumnsDataFilter, ColumnsFiltersService, DatatableActionMenuComponent, DatatableActionMenuItemComponent, DatatableActionMenuItemDirective, DatatableActionMenuToggleDirective, DatatableCellTplDirective, DatatableColumnChangesService, DatatableColumnComponent, DatatableColumnFilterMenuComponent, DatatableColumnFilterSearchDateComponent, DatatableColumnFilterSearchNumericComponent, DatatableColumnFilterSearchTextComponent, DatatableColumnFilterTplDirective, DatatableColumnPreferencesButtonComponent, DatatableColumnPreferencesComponent, DatatableComponent, DatatableDataSource, DatatableExportButtonComponent, DatatableFilterDirective, DatatableFooterTplDirective, DatatableGqlDataSource, DatatableMenuBarColumnCenterComponent, DatatableMenuBarColumnLeftComponent, DatatableMenuBarColumnRightComponent, DatatableMenuBarComponent, DatatableMenuBarRowComponent, DatatableMenuBarTextComponent, DatatablePreferencesService, DatatableRefreshButtonComponent, DatatableRefreshService, DatatableRowActionItemDirective, DatatableRowDetailTplDirective, EMPTY_DATATABLE_PREFERENCES, FILTERABLE_COLUMNS, FILTERABLE_ROWS, SIMPLE_COLUMNS, SIMPLE_ROWS, SearchDateColumnsDataFilter, SearchNumericColumnsDataFilter, SearchTextColumnsDataFilter, THESEAM_COLUMNS_DATA_FILTER, THESEAM_COLUMNS_DATA_FILTERS_DEFAULT, THESEAM_COLUMNS_DATA_FILTER_DATE_RANGE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_DATE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_DATE_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_RANGE_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_NUMERIC_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_SEARCH_NAME, THESEAM_COLUMNS_DATA_FILTER_TEXT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_SELECT_SEARCH_TYPES, THESEAM_COLUMNS_DATA_FILTER_TEXT_TEXT_SEARCH_TYPES, THESEAM_DATATABLE, THESEAM_DATATABLE_CONFIG, THESEAM_DATATABLE_PREFERENCES_ACCESSOR, THESEAM_MENUBAR_ITEM_DATA, TheSeamDatatableActionMenuHarness, TheSeamDatatableCellHarness, TheSeamDatatableColumnFilterDirective, TheSeamDatatableColumnFilterMenuHarness, TheSeamDatatableColumnPreferencesButtonHarness, TheSeamDatatableExportButtonHarness, TheSeamDatatableFooterDirective, TheSeamDatatableHarness, TheSeamDatatableHeaderCellHarness, TheSeamDatatableMenuBarHarness, TheSeamDatatableModule, TheSeamDatatablePagerButtonHarness, TheSeamDatatablePagerHarness, TheSeamDatatableRefreshButtonHarness, TheSeamDatatableRowDetailDirective, TheSeamDatatableRowHarness, TheSeamDatatableScrollbarHelperService, _THESEAM_DATATABLE, _THESEAM_DATATABLE_ACCESSOR, _THESEAM_DATA_FILTER_CONTAINER, createRows, getFormattedDateForComparison, isColumnBoundToProp, mapColumnsAlterationsStates, withStoredColumnInfo };
1691
+ export type { ColumnsAlterationState, ColumnsDataFilterState, ColumnsDataFilterStateState, ICellContext, IDatatableExportButtonData, MenubarItemData, SortDirection, SortEvent, SortItem, TheSeamColumnsDataFilterDateSearchDateType, TheSeamColumnsDataFilterDateSearchForm, TheSeamColumnsDataFilterDateSearchFormState, TheSeamColumnsDataFilterDateSearchOptions, TheSeamColumnsDataFilterDateSearchType, TheSeamColumnsDataFilterNumericSearchForm, TheSeamColumnsDataFilterNumericSearchFormState, TheSeamColumnsDataFilterNumericSearchType, TheSeamColumnsDataFilterTextSearchForm, TheSeamColumnsDataFilterTextSearchFormState, TheSeamColumnsDataFilterTextSearchType, TheSeamDatatableAccessor, TheSeamDatatableActionMenuHarnessFilters, TheSeamDatatableCellHarnessFilters, TheSeamDatatableColumn, TheSeamDatatableColumnFilterMenuHarnessFilters, TheSeamDatatableColumnFilterUpdateMethod, TheSeamDatatableColumnFilterable, TheSeamDatatableColumnFilterableConfig, TheSeamDatatableColumnHidable, TheSeamDatatableColumnPreferencesButtonHarnessFilters, TheSeamDatatableConfig, TheSeamDatatableDateColumnFilterableConfig, TheSeamDatatableExportButtonHarnessFilters, TheSeamDatatableHarnessFilters, TheSeamDatatableHeaderCellHarnessFilters, TheSeamDatatableMenuBarHarnessFilters, TheSeamDatatableMessages, TheSeamDatatablePreferences, TheSeamDatatablePreferencesAccessor, TheSeamDatatablePreferencesColumn, TheSeamDatatablePreferences_v1, TheSeamDatatablePreferences_v2, TheSeamDatatableRefreshButtonHarnessFilters, TheSeamDatatableRow, TheSeamDatatableRowHarnessFilters, TheSeamPageInfo };
@@ -2,6 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { OnInit, OnDestroy } from '@angular/core';
3
3
  import * as _fortawesome_fontawesome_common_types from '@fortawesome/fontawesome-common-types';
4
4
  import { TheSeamLayoutService } from '@theseam/ui-common/layout';
5
+ import { ComponentHarness } from '@angular/cdk/testing';
5
6
 
6
7
  interface AlterationDisplayItem {
7
8
  id: string;
@@ -97,5 +98,64 @@ declare class AlterationsDiffComponent implements OnInit, OnDestroy {
97
98
  static ɵcmp: i0.ɵɵComponentDeclaration<AlterationsDiffComponent, "seam-alterations-diff", never, { "currentItems": { "alias": "currentItems"; "required": false; }; "pendingItems": { "alias": "pendingItems"; "required": false; }; "diffMode": { "alias": "diffMode"; "required": false; }; "initialDiffState": { "alias": "initialDiffState"; "required": false; }; "compact": { "alias": "compact"; "required": false; }; }, {}, never, never, true, never>;
98
99
  }
99
100
 
100
- export { AlterationDisplayService, AlterationItemComponent, AlterationsDiffComponent, AlterationsListComponent };
101
+ declare class AlterationItemHarness extends ComponentHarness {
102
+ static hostSelector: string;
103
+ private _getCard;
104
+ private _getTypeBadge;
105
+ private _getIcon;
106
+ private _getSummary;
107
+ private _getDiffState;
108
+ private _getDetails;
109
+ getType(): Promise<string>;
110
+ getTypeDisplayName(): Promise<string>;
111
+ getSummary(): Promise<string>;
112
+ getDiffState(): Promise<string | null>;
113
+ getDetails(): Promise<string[]>;
114
+ hasDetails(): Promise<boolean>;
115
+ hasBorderSuccess(): Promise<boolean>;
116
+ hasBorderDanger(): Promise<boolean>;
117
+ hasBorderWarning(): Promise<boolean>;
118
+ getBadgeClass(): Promise<string>;
119
+ isVisible(): Promise<boolean>;
120
+ }
121
+
122
+ declare class AlterationsListHarness extends ComponentHarness {
123
+ static hostSelector: string;
124
+ private _getTitle;
125
+ private _getCount;
126
+ private _getEmptyState;
127
+ private _getItems;
128
+ getTitle(): Promise<string | null>;
129
+ getCount(): Promise<string | null>;
130
+ hasEmptyState(): Promise<boolean>;
131
+ getEmptyStateText(): Promise<string | null>;
132
+ getItems(): Promise<AlterationItemHarness[]>;
133
+ getItemCount(): Promise<number>;
134
+ getItemByType(type: string): Promise<AlterationItemHarness | null>;
135
+ getItemTypes(): Promise<string[]>;
136
+ hasItems(): Promise<boolean>;
137
+ }
138
+
139
+ declare class AlterationsDiffHarness extends ComponentHarness {
140
+ static hostSelector: string;
141
+ private _getDiffSummary;
142
+ private _getCurrentList;
143
+ private _getPendingList;
144
+ private _getCurrentListMobile;
145
+ private _getPendingListMobile;
146
+ private _getDesktopLayout;
147
+ private _getMobileLayout;
148
+ hasDiffSummary(): Promise<boolean>;
149
+ getDiffSummaryText(): Promise<string | null>;
150
+ isDesktopLayout(): Promise<boolean>;
151
+ isMobileLayout(): Promise<boolean>;
152
+ getCurrentList(): Promise<AlterationsListHarness | null>;
153
+ getPendingList(): Promise<AlterationsListHarness | null>;
154
+ getCurrentItemCount(): Promise<number>;
155
+ getPendingItemCount(): Promise<number>;
156
+ hasCurrentEmptyState(): Promise<boolean>;
157
+ hasPendingEmptyState(): Promise<boolean>;
158
+ }
159
+
160
+ export { AlterationDisplayService, AlterationItemComponent, AlterationItemHarness, AlterationsDiffComponent, AlterationsDiffHarness, AlterationsListComponent, AlterationsListHarness };
101
161
  export type { AlterationDiffMode, AlterationDiffState, AlterationDisplayItem, AlterationVisualState };
@@ -12,6 +12,7 @@ import * as i1 from '@theseam/ui-common/icon';
12
12
  import { TheSeamIconModule } from '@theseam/ui-common/icon';
13
13
  import * as i2 from '@theseam/ui-common/buttons';
14
14
  import { TheSeamButtonsModule } from '@theseam/ui-common/buttons';
15
+ import { ComponentHarness } from '@angular/cdk/testing';
15
16
 
16
17
  class TheSeamCarouselSlideDirective {
17
18
  template = inject((TemplateRef));
@@ -259,9 +260,55 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.15", ngImpo
259
260
  }]
260
261
  }] });
261
262
 
263
+ class TheSeamCarouselHarness extends ComponentHarness {
264
+ static hostSelector = 'seam-carousel';
265
+ _content = this.locatorFor('.carousel-content');
266
+ _prevSlideButton = this.locatorForOptional('[title="Go to previous slide"]');
267
+ _nextSlideButton = this.locatorForOptional('[title="Go to next slide"]');
268
+ _playButton = this.locatorForOptional('[title="Play"]');
269
+ _pauseButton = this.locatorForOptional('[title="Pause"]');
270
+ async activeTileIndex() {
271
+ return (await this._content()).getAttribute('data-slide-index');
272
+ }
273
+ async goToPreviousSlide() {
274
+ const prevSlideButton = await this._prevSlideButton();
275
+ if (prevSlideButton === null) {
276
+ throw Error('Previous slide button not found.');
277
+ }
278
+ return prevSlideButton.click();
279
+ }
280
+ async goToNextSlide() {
281
+ const nextSlideButton = await this._nextSlideButton();
282
+ if (nextSlideButton === null) {
283
+ throw Error('Next slide button not found.');
284
+ }
285
+ return nextSlideButton.click();
286
+ }
287
+ async goToSlide(index) {
288
+ return (await this.locatorFor(`[title="Go to slide ${index + 1}"]`)()).click();
289
+ }
290
+ async hasPreviousSlideButton() {
291
+ return (await this._prevSlideButton()) !== null;
292
+ }
293
+ async hasNextSlideButton() {
294
+ return (await this._nextSlideButton()) !== null;
295
+ }
296
+ async hasSlideButton(index) {
297
+ return ((await this.locatorForAll(`[title="Go to slide ${index + 1}"]`)()) !==
298
+ null);
299
+ }
300
+ async hasSlideButtons() {
301
+ return (await this.locatorForAll('[title^="Go to slide"]')()).length > 0;
302
+ }
303
+ async hasAutoPlayToggleButton() {
304
+ return ((await this._playButton()) !== null ||
305
+ (await this._pauseButton()) !== null);
306
+ }
307
+ }
308
+
262
309
  /**
263
310
  * Generated bundle index. Do not edit.
264
311
  */
265
312
 
266
- export { TheSeamCarouselComponent, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
313
+ export { TheSeamCarouselComponent, TheSeamCarouselHarness, TheSeamCarouselModule, TheSeamCarouselSlideDirective };
267
314
  //# sourceMappingURL=theseam-ui-common-carousel.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-carousel.mjs","sources":["../../../projects/ui-common/carousel/carousel-slide.directive.ts","../../../projects/ui-common/carousel/carousel.component.ts","../../../projects/ui-common/carousel/carousel.component.html","../../../projects/ui-common/carousel/carousel.module.ts","../../../projects/ui-common/carousel/theseam-ui-common-carousel.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core'\n\n@Directive({\n selector: '[seamCarouselSlide]',\n exportAs: 'seamCarouselSlide',\n})\nexport class TheSeamCarouselSlideDirective {\n private readonly template = inject(TemplateRef<any>)\n}\n","import { animate, style, transition, trigger } from '@angular/animations'\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n Component,\n ContentChildren,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core'\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion'\nimport {\n BehaviorSubject,\n combineLatest,\n interval,\n Observable,\n Subject,\n} from 'rxjs'\nimport {\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators'\n\nimport {\n faAngleLeft,\n faAngleRight,\n faPause,\n faPlay,\n} from '@fortawesome/free-solid-svg-icons'\nimport { InputBoolean, InputNumber } from '@theseam/ui-common/core'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\n\n@Component({\n selector: 'seam-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition('* => *', [\n style({ opacity: '0', height: '*' }),\n animate(250, style({ opacity: '1', height: '*' })),\n ]),\n ]),\n ],\n exportAs: 'seamCarousel',\n imports: [\n NgIf,\n NgFor,\n NgTemplateOutlet,\n AsyncPipe,\n TheSeamIconModule,\n TheSeamButtonsModule,\n ],\n})\nexport class TheSeamCarouselComponent implements OnInit, OnDestroy {\n static ngAcceptInputType_slideInterval: NumberInput\n static ngAcceptInputType_autoPlay: BooleanInput\n static ngAcceptInputType_pauseOnHover: BooleanInput\n static ngAcceptInputType_pauseOnFocus: BooleanInput\n static ngAcceptInputType_showPager: BooleanInput\n static ngAcceptInputType_showNavButtons: BooleanInput\n static ngAcceptInputType_showPauseButton: BooleanInput\n\n readonly faAngleRight = faAngleRight\n readonly faAngleLeft = faAngleLeft\n readonly faPause = faPause\n readonly faPlay = faPlay\n\n /**\n * Duration in ms that slide is displayed before paging.\n * Only applicable when `autoPlay === true`.\n * Defaults to 10000ms.\n */\n @Input() @InputNumber(10000) slideInterval = 10000\n\n /**\n * When `true`, carousel will page automatically.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() autoPlay = true\n\n /**\n * When `true`, will pause automatic paging when user mouses over carousel.\n * Timer will restart when user mouses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnHover = true\n\n /**\n * When `true`, will pause automatic paging when user focuses in on item in carousel.\n * Timer will restart when user focuses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnFocus = true\n\n /**\n * When `true`, will show pager row at the bottom of the carousel with clickable buttons to navigate directly to a page.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPager = true\n\n /**\n * When `true`, will show left and right nav button on either side of the carousel to navigate through pages.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showNavButtons = true\n\n /**\n * When `true`, will show pause/play button to stop/restart automatic paging.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPauseButton = true\n\n @ContentChildren(TheSeamCarouselSlideDirective)\n get slides(): QueryList<TheSeamCarouselSlideDirective> | undefined {\n return this._slides.value\n }\n set slides(value: QueryList<TheSeamCarouselSlideDirective> | undefined) {\n // Check if slides were added or removed that would make the active index not exist.\n const count = value?.length || 0\n const maxIdx = count >= 0 ? count - 1 : 0\n const activeIdx = this._pollActiveIndex.value\n if (activeIdx > maxIdx) {\n this._pollActiveIndex.next(maxIdx)\n } else if (count > 0 && activeIdx < 0) {\n this._pollActiveIndex.next(0)\n }\n\n this._slides.next(value)\n }\n private readonly _slides = new BehaviorSubject<\n QueryList<TheSeamCarouselSlideDirective> | undefined\n >(undefined)\n public readonly slides$ = this._slides.asObservable()\n\n public readonly activeSlide$: Observable<any | undefined>\n\n private readonly _pollActiveIndex = new BehaviorSubject<number>(0)\n public readonly activeIndex$ = this._pollActiveIndex.asObservable()\n\n private readonly _carouselPaused = new BehaviorSubject<boolean>(false)\n public readonly carouselPaused$ = this._carouselPaused.asObservable()\n\n private readonly _carouselStopped = new BehaviorSubject<boolean>(false)\n public readonly carouselStopped$ = this._carouselStopped.asObservable()\n\n private readonly _resetInterval = new Subject<void>()\n\n constructor() {\n this.activeSlide$ = this._pollActiveIndex.pipe(\n startWith(0),\n switchMap((i) => this.slides$.pipe(map((slides) => slides?.get(i)))),\n )\n }\n\n ngOnInit(): void {\n combineLatest([this.carouselPaused$, this.carouselStopped$])\n .pipe(\n tap(([paused, stopped]) => {\n if (paused || stopped) {\n this._resetInterval.next(undefined)\n } else {\n this._startInterval()\n }\n }),\n )\n .subscribe()\n }\n\n ngOnDestroy(): void {\n this._resetInterval.next(undefined)\n this._resetInterval.complete()\n }\n\n private _startInterval() {\n this._resetInterval.next(undefined)\n if (this.autoPlay) {\n interval(this.slideInterval)\n .pipe(\n takeUntil(this._resetInterval),\n tap(() => {\n this.pageCarousel(1)\n }),\n )\n .subscribe()\n }\n }\n\n focusIn() {\n if (this.pauseOnFocus) {\n this.pauseTimer()\n }\n }\n\n focusOut() {\n if (this.pauseOnFocus) {\n this.startTimer()\n }\n }\n\n mouseEnter() {\n if (this.pauseOnHover) {\n this.pauseTimer()\n }\n }\n\n mouseLeave() {\n if (this.pauseOnHover) {\n this.startTimer()\n }\n }\n\n pauseTimer() {\n this._carouselPaused.next(true)\n }\n\n startTimer() {\n if (!this._carouselStopped.value) {\n this._carouselPaused.next(false)\n }\n }\n\n setCarousel(i: number) {\n this._pollActiveIndex.next(i)\n }\n\n pageCarousel(step: number) {\n this.slides$\n .pipe(\n take(1),\n filter((slides) => notNullOrUndefined(slides)),\n map((slides) => {\n const slidesLen = slides?.length || 1\n let index = this._pollActiveIndex.value\n index = index + step\n index = index < 0 ? slidesLen + index : index % slidesLen\n this._pollActiveIndex.next(index)\n }),\n )\n .subscribe()\n }\n\n toggleCarouselStop() {\n const carouselStopped = this._carouselStopped.value\n this._carouselStopped.next(!carouselStopped)\n }\n}\n","<ng-container *ngIf=\"slides$ | async as slides\">\n <div\n class=\"position-relative\"\n *ngIf=\"slides.length\"\n (focusin)=\"focusIn()\"\n (mouseenter)=\"mouseEnter()\"\n (focusout)=\"focusOut()\"\n (mouseleave)=\"mouseLeave()\"\n >\n <div class=\"d-flex\" style=\"min-height: 150px\">\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(-1)\"\n title=\"Go to previous slide\"\n >\n <seam-icon [icon]=\"faAngleLeft\"></seam-icon>\n </button>\n\n <div\n *ngIf=\"activeSlide$ | async as slide\"\n [@fadeInOut]=\"slide.template\"\n class=\"flex-grow-1 d-flex align-items-center\"\n >\n <div\n class=\"carousel-content w-100 py-1 px-2\"\n [attr.data-slide-index]=\"activeIndex$ | async\"\n >\n <ng-template [ngTemplateOutlet]=\"$any(slide.template)\"></ng-template>\n </div>\n </div>\n\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(1)\"\n title=\"Go to next slide\"\n >\n <seam-icon [icon]=\"faAngleRight\"></seam-icon>\n </button>\n </div>\n\n <div\n class=\"carousel-pages d-flex flex-wrap justify-content-center mt-3 mx-auto\"\n *ngIf=\"showPager && slides.length > 1\"\n >\n <button\n *ngFor=\"let q of slides; let i = index\"\n seamButton\n theme=\"light\"\n class=\"carousel-page\"\n [class.active]=\"(activeIndex$ | async) === i\"\n (click)=\"setCarousel(i)\"\n [title]=\"'Go to slide ' + (i + 1)\"\n ></button>\n </div>\n\n <div class=\"carousel-controls\" *ngIf=\"showPauseButton && autoPlay\">\n <button\n *ngIf=\"slides.length > 1\"\n seamButton\n (click)=\"toggleCarouselStop()\"\n [title]=\"(carouselStopped$ | async) ? 'Play' : 'Pause'\"\n >\n <seam-icon\n [icon]=\"faPlay\"\n *ngIf=\"carouselStopped$ | async; else pauseButton\"\n ></seam-icon>\n <ng-template #pauseButton>\n <seam-icon [icon]=\"faPause\"></seam-icon>\n </ng-template>\n </button>\n </div>\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\nimport { TheSeamCarouselComponent } from './carousel.component'\n\n@NgModule({\n imports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n exports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n})\nexport class TheSeamCarouselModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;MAMa,6BAA6B,CAAA;AACvB,IAAA,QAAQ,GAAG,MAAM,EAAC,WAAgB,EAAC;wGADzC,6BAA6B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA7B,6BAA6B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,QAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA7B,6BAA6B,EAAA,UAAA,EAAA,CAAA;kBAJzC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,QAAQ,EAAE,mBAAmB;AAC9B,iBAAA;;;MC0DY,wBAAwB,CAAA;IACnC,OAAO,+BAA+B;IACtC,OAAO,0BAA0B;IACjC,OAAO,8BAA8B;IACrC,OAAO,8BAA8B;IACrC,OAAO,2BAA2B;IAClC,OAAO,gCAAgC;IACvC,OAAO,iCAAiC;IAE/B,YAAY,GAAG,YAAY;IAC3B,WAAW,GAAG,WAAW;IACzB,OAAO,GAAG,OAAO;IACjB,MAAM,GAAG,MAAM;AAExB;;;;AAIG;IAC0B,aAAa,GAAG,KAAK;AAElD;;;AAGG;IACsB,QAAQ,GAAG,IAAI;AAExC;;;;;AAKG;IACsB,YAAY,GAAG,IAAI;AAE5C;;;;;AAKG;IACsB,YAAY,GAAG,IAAI;AAE5C;;;AAGG;IACsB,SAAS,GAAG,IAAI;AAEzC;;;AAGG;IACsB,cAAc,GAAG,IAAI;AAE9C;;;AAGG;IACsB,eAAe,GAAG,IAAI;AAE/C,IAAA,IACI,MAAM,GAAA;AACR,QAAA,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;IAC3B;IACA,IAAI,MAAM,CAAC,KAA2D,EAAA;;AAEpE,QAAA,MAAM,KAAK,GAAG,KAAK,EAAE,MAAM,IAAI,CAAC;AAChC,QAAA,MAAM,MAAM,GAAG,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC;AACzC,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;AAC7C,QAAA,IAAI,SAAS,GAAG,MAAM,EAAE;AACtB,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC;aAAO,IAAI,KAAK,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,EAAE;AACrC,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/B;AAEA,QAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;IAC1B;AACiB,IAAA,OAAO,GAAG,IAAI,eAAe,CAE5C,SAAS,CAAC;AACI,IAAA,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;AAErC,IAAA,YAAY;AAEX,IAAA,gBAAgB,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC;AAClD,IAAA,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;AAElD,IAAA,eAAe,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACtD,IAAA,eAAe,GAAG,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE;AAEpD,IAAA,gBAAgB,GAAG,IAAI,eAAe,CAAU,KAAK,CAAC;AACvD,IAAA,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,YAAY,EAAE;AAEtD,IAAA,cAAc,GAAG,IAAI,OAAO,EAAQ;AAErD,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAC5C,SAAS,CAAC,CAAC,CAAC,EACZ,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACrE;IACH;IAEA,QAAQ,GAAA;QACN,aAAa,CAAC,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,gBAAgB,CAAC;aACxD,IAAI,CACH,GAAG,CAAC,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,KAAI;AACxB,YAAA,IAAI,MAAM,IAAI,OAAO,EAAE;AACrB,gBAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;YACrC;iBAAO;gBACL,IAAI,CAAC,cAAc,EAAE;YACvB;AACF,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;IAChB;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE;IAChC;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC;AACnC,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,QAAQ,CAAC,IAAI,CAAC,aAAa;iBACxB,IAAI,CACH,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,EAC9B,GAAG,CAAC,MAAK;AACP,gBAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACtB,YAAA,CAAC,CAAC;AAEH,iBAAA,SAAS,EAAE;QAChB;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,QAAQ,GAAA;AACN,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,IAAI,CAAC,UAAU,EAAE;QACnB;IACF;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;IACjC;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE;AAChC,YAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC;QAClC;IACF;AAEA,IAAA,WAAW,CAAC,CAAS,EAAA;AACnB,QAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/B;AAEA,IAAA,YAAY,CAAC,IAAY,EAAA;AACvB,QAAA,IAAI,CAAC;aACF,IAAI,CACH,IAAI,CAAC,CAAC,CAAC,EACP,MAAM,CAAC,CAAC,MAAM,KAAK,kBAAkB,CAAC,MAAM,CAAC,CAAC,EAC9C,GAAG,CAAC,CAAC,MAAM,KAAI;AACb,YAAA,MAAM,SAAS,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC;AACrC,YAAA,IAAI,KAAK,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;AACvC,YAAA,KAAK,GAAG,KAAK,GAAG,IAAI;AACpB,YAAA,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,KAAK,GAAG,KAAK,GAAG,SAAS;AACzD,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC;AACnC,QAAA,CAAC,CAAC;AAEH,aAAA,SAAS,EAAE;IAChB;IAEA,kBAAkB,GAAA;AAChB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,gBAAgB,CAAC,KAAK;QACnD,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC,eAAe,CAAC;IAC9C;wGAjMW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,wBAAwB,4TA6DlB,6BAA6B,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,cAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EC5HhD,6zEA6EA,EAAA,MAAA,EAAA,CAAA,kbAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EDtBI,IAAI,EAAA,QAAA,EAAA,QAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACJ,KAAK,EAAA,QAAA,EAAA,kBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,cAAA,EAAA,eAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACL,gBAAgB,mJAEhB,iBAAiB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,aAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,oBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,MAAA,EAAA,MAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACjB,oBAAoB,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,sBAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,OAAA,EAAA,MAAA,EAAA,MAAA,CAAA,EAAA,QAAA,EAAA,CAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAFpB,SAAS,EAAA,IAAA,EAAA,OAAA,EAAA,CAAA,EAAA,UAAA,EAbC;YACV,OAAO,CAAC,WAAW,EAAE;gBACnB,UAAU,CAAC,QAAQ,EAAE;oBACnB,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpC,oBAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;iBACnD,CAAC;aACH,CAAC;AACH,SAAA,EAAA,CAAA;;AA8B4B,UAAA,CAAA;IAAnB,WAAW,CAAC,KAAK;AAAuB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,eAAA,EAAA,KAAA,CAAA,CAAA;AAMzB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAkB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA;AAQf,UAAA,CAAA;AAAf,IAAA,YAAY;AAAsB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;AAQnB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAsB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,cAAA,EAAA,KAAA,CAAA,CAAA;AAMnB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAmB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,WAAA,EAAA,KAAA,CAAA,CAAA;AAMhB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAwB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,gBAAA,EAAA,KAAA,CAAA,CAAA;AAMrB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAyB,CAAA,EAAA,wBAAA,CAAA,SAAA,EAAA,iBAAA,EAAA,KAAA,CAAA,CAAA;4FA3DpC,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAtBpC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,eAAe,EAAA,UAAA,EAGb;wBACV,OAAO,CAAC,WAAW,EAAE;4BACnB,UAAU,CAAC,QAAQ,EAAE;gCACnB,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AACpC,gCAAA,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC;6BACnD,CAAC;yBACH,CAAC;AACH,qBAAA,EAAA,QAAA,EACS,cAAc,EAAA,OAAA,EACf;wBACP,IAAI;wBACJ,KAAK;wBACL,gBAAgB;wBAChB,SAAS;wBACT,iBAAiB;wBACjB,oBAAoB;AACrB,qBAAA,EAAA,QAAA,EAAA,6zEAAA,EAAA,MAAA,EAAA,CAAA,kbAAA,CAAA,EAAA;;sBAqBA;;sBAMA;;sBAQA;;sBAQA;;sBAMA;;sBAMA;;sBAMA;;sBAEA,eAAe;uBAAC,6BAA6B;;;MEnHnC,qBAAqB,CAAA;wGAArB,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAArB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAHtB,wBAAwB,EAAE,6BAA6B,CAAA,EAAA,OAAA,EAAA,CACvD,wBAAwB,EAAE,6BAA6B,CAAA,EAAA,CAAA;AAEtD,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,YAHtB,wBAAwB,CAAA,EAAA,CAAA;;4FAGvB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAJjC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;AAClE,oBAAA,OAAO,EAAE,CAAC,wBAAwB,EAAE,6BAA6B,CAAC;AACnE,iBAAA;;;ACRD;;AAEG;;;;"}
1
+ {"version":3,"file":"theseam-ui-common-carousel.mjs","sources":["../../../projects/ui-common/carousel/carousel-slide.directive.ts","../../../projects/ui-common/carousel/carousel.component.ts","../../../projects/ui-common/carousel/carousel.component.html","../../../projects/ui-common/carousel/carousel.module.ts","../../../projects/ui-common/carousel/testing/carousel-harness.ts","../../../projects/ui-common/carousel/theseam-ui-common-carousel.ts"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core'\n\n@Directive({\n selector: '[seamCarouselSlide]',\n exportAs: 'seamCarouselSlide',\n})\nexport class TheSeamCarouselSlideDirective {\n private readonly template = inject(TemplateRef<any>)\n}\n","import { animate, style, transition, trigger } from '@angular/animations'\nimport { AsyncPipe, NgFor, NgIf, NgTemplateOutlet } from '@angular/common'\nimport {\n Component,\n ContentChildren,\n Input,\n OnDestroy,\n OnInit,\n QueryList,\n} from '@angular/core'\nimport { BooleanInput, NumberInput } from '@angular/cdk/coercion'\nimport {\n BehaviorSubject,\n combineLatest,\n interval,\n Observable,\n Subject,\n} from 'rxjs'\nimport {\n filter,\n map,\n startWith,\n switchMap,\n take,\n takeUntil,\n tap,\n} from 'rxjs/operators'\n\nimport {\n faAngleLeft,\n faAngleRight,\n faPause,\n faPlay,\n} from '@fortawesome/free-solid-svg-icons'\nimport { InputBoolean, InputNumber } from '@theseam/ui-common/core'\nimport { notNullOrUndefined } from '@theseam/ui-common/utils'\nimport { TheSeamIconModule } from '@theseam/ui-common/icon'\nimport { TheSeamButtonsModule } from '@theseam/ui-common/buttons'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\n\n@Component({\n selector: 'seam-carousel',\n templateUrl: './carousel.component.html',\n styleUrls: ['./carousel.component.scss'],\n animations: [\n trigger('fadeInOut', [\n transition('* => *', [\n style({ opacity: '0', height: '*' }),\n animate(250, style({ opacity: '1', height: '*' })),\n ]),\n ]),\n ],\n exportAs: 'seamCarousel',\n imports: [\n NgIf,\n NgFor,\n NgTemplateOutlet,\n AsyncPipe,\n TheSeamIconModule,\n TheSeamButtonsModule,\n ],\n})\nexport class TheSeamCarouselComponent implements OnInit, OnDestroy {\n static ngAcceptInputType_slideInterval: NumberInput\n static ngAcceptInputType_autoPlay: BooleanInput\n static ngAcceptInputType_pauseOnHover: BooleanInput\n static ngAcceptInputType_pauseOnFocus: BooleanInput\n static ngAcceptInputType_showPager: BooleanInput\n static ngAcceptInputType_showNavButtons: BooleanInput\n static ngAcceptInputType_showPauseButton: BooleanInput\n\n readonly faAngleRight = faAngleRight\n readonly faAngleLeft = faAngleLeft\n readonly faPause = faPause\n readonly faPlay = faPlay\n\n /**\n * Duration in ms that slide is displayed before paging.\n * Only applicable when `autoPlay === true`.\n * Defaults to 10000ms.\n */\n @Input() @InputNumber(10000) slideInterval = 10000\n\n /**\n * When `true`, carousel will page automatically.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() autoPlay = true\n\n /**\n * When `true`, will pause automatic paging when user mouses over carousel.\n * Timer will restart when user mouses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnHover = true\n\n /**\n * When `true`, will pause automatic paging when user focuses in on item in carousel.\n * Timer will restart when user focuses out.\n * Only applicable when `autoPlay === true`.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() pauseOnFocus = true\n\n /**\n * When `true`, will show pager row at the bottom of the carousel with clickable buttons to navigate directly to a page.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPager = true\n\n /**\n * When `true`, will show left and right nav button on either side of the carousel to navigate through pages.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showNavButtons = true\n\n /**\n * When `true`, will show pause/play button to stop/restart automatic paging.\n * Defaults to `true`.\n */\n @Input() @InputBoolean() showPauseButton = true\n\n @ContentChildren(TheSeamCarouselSlideDirective)\n get slides(): QueryList<TheSeamCarouselSlideDirective> | undefined {\n return this._slides.value\n }\n set slides(value: QueryList<TheSeamCarouselSlideDirective> | undefined) {\n // Check if slides were added or removed that would make the active index not exist.\n const count = value?.length || 0\n const maxIdx = count >= 0 ? count - 1 : 0\n const activeIdx = this._pollActiveIndex.value\n if (activeIdx > maxIdx) {\n this._pollActiveIndex.next(maxIdx)\n } else if (count > 0 && activeIdx < 0) {\n this._pollActiveIndex.next(0)\n }\n\n this._slides.next(value)\n }\n private readonly _slides = new BehaviorSubject<\n QueryList<TheSeamCarouselSlideDirective> | undefined\n >(undefined)\n public readonly slides$ = this._slides.asObservable()\n\n public readonly activeSlide$: Observable<any | undefined>\n\n private readonly _pollActiveIndex = new BehaviorSubject<number>(0)\n public readonly activeIndex$ = this._pollActiveIndex.asObservable()\n\n private readonly _carouselPaused = new BehaviorSubject<boolean>(false)\n public readonly carouselPaused$ = this._carouselPaused.asObservable()\n\n private readonly _carouselStopped = new BehaviorSubject<boolean>(false)\n public readonly carouselStopped$ = this._carouselStopped.asObservable()\n\n private readonly _resetInterval = new Subject<void>()\n\n constructor() {\n this.activeSlide$ = this._pollActiveIndex.pipe(\n startWith(0),\n switchMap((i) => this.slides$.pipe(map((slides) => slides?.get(i)))),\n )\n }\n\n ngOnInit(): void {\n combineLatest([this.carouselPaused$, this.carouselStopped$])\n .pipe(\n tap(([paused, stopped]) => {\n if (paused || stopped) {\n this._resetInterval.next(undefined)\n } else {\n this._startInterval()\n }\n }),\n )\n .subscribe()\n }\n\n ngOnDestroy(): void {\n this._resetInterval.next(undefined)\n this._resetInterval.complete()\n }\n\n private _startInterval() {\n this._resetInterval.next(undefined)\n if (this.autoPlay) {\n interval(this.slideInterval)\n .pipe(\n takeUntil(this._resetInterval),\n tap(() => {\n this.pageCarousel(1)\n }),\n )\n .subscribe()\n }\n }\n\n focusIn() {\n if (this.pauseOnFocus) {\n this.pauseTimer()\n }\n }\n\n focusOut() {\n if (this.pauseOnFocus) {\n this.startTimer()\n }\n }\n\n mouseEnter() {\n if (this.pauseOnHover) {\n this.pauseTimer()\n }\n }\n\n mouseLeave() {\n if (this.pauseOnHover) {\n this.startTimer()\n }\n }\n\n pauseTimer() {\n this._carouselPaused.next(true)\n }\n\n startTimer() {\n if (!this._carouselStopped.value) {\n this._carouselPaused.next(false)\n }\n }\n\n setCarousel(i: number) {\n this._pollActiveIndex.next(i)\n }\n\n pageCarousel(step: number) {\n this.slides$\n .pipe(\n take(1),\n filter((slides) => notNullOrUndefined(slides)),\n map((slides) => {\n const slidesLen = slides?.length || 1\n let index = this._pollActiveIndex.value\n index = index + step\n index = index < 0 ? slidesLen + index : index % slidesLen\n this._pollActiveIndex.next(index)\n }),\n )\n .subscribe()\n }\n\n toggleCarouselStop() {\n const carouselStopped = this._carouselStopped.value\n this._carouselStopped.next(!carouselStopped)\n }\n}\n","<ng-container *ngIf=\"slides$ | async as slides\">\n <div\n class=\"position-relative\"\n *ngIf=\"slides.length\"\n (focusin)=\"focusIn()\"\n (mouseenter)=\"mouseEnter()\"\n (focusout)=\"focusOut()\"\n (mouseleave)=\"mouseLeave()\"\n >\n <div class=\"d-flex\" style=\"min-height: 150px\">\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(-1)\"\n title=\"Go to previous slide\"\n >\n <seam-icon [icon]=\"faAngleLeft\"></seam-icon>\n </button>\n\n <div\n *ngIf=\"activeSlide$ | async as slide\"\n [@fadeInOut]=\"slide.template\"\n class=\"flex-grow-1 d-flex align-items-center\"\n >\n <div\n class=\"carousel-content w-100 py-1 px-2\"\n [attr.data-slide-index]=\"activeIndex$ | async\"\n >\n <ng-template [ngTemplateOutlet]=\"$any(slide.template)\"></ng-template>\n </div>\n </div>\n\n <button\n *ngIf=\"showNavButtons && slides.length > 1\"\n seamButton\n class=\"carousel-arrow px-2\"\n (click)=\"pageCarousel(1)\"\n title=\"Go to next slide\"\n >\n <seam-icon [icon]=\"faAngleRight\"></seam-icon>\n </button>\n </div>\n\n <div\n class=\"carousel-pages d-flex flex-wrap justify-content-center mt-3 mx-auto\"\n *ngIf=\"showPager && slides.length > 1\"\n >\n <button\n *ngFor=\"let q of slides; let i = index\"\n seamButton\n theme=\"light\"\n class=\"carousel-page\"\n [class.active]=\"(activeIndex$ | async) === i\"\n (click)=\"setCarousel(i)\"\n [title]=\"'Go to slide ' + (i + 1)\"\n ></button>\n </div>\n\n <div class=\"carousel-controls\" *ngIf=\"showPauseButton && autoPlay\">\n <button\n *ngIf=\"slides.length > 1\"\n seamButton\n (click)=\"toggleCarouselStop()\"\n [title]=\"(carouselStopped$ | async) ? 'Play' : 'Pause'\"\n >\n <seam-icon\n [icon]=\"faPlay\"\n *ngIf=\"carouselStopped$ | async; else pauseButton\"\n ></seam-icon>\n <ng-template #pauseButton>\n <seam-icon [icon]=\"faPause\"></seam-icon>\n </ng-template>\n </button>\n </div>\n </div>\n</ng-container>\n","import { NgModule } from '@angular/core'\n\nimport { TheSeamCarouselSlideDirective } from './carousel-slide.directive'\nimport { TheSeamCarouselComponent } from './carousel.component'\n\n@NgModule({\n imports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n exports: [TheSeamCarouselComponent, TheSeamCarouselSlideDirective],\n})\nexport class TheSeamCarouselModule {}\n","import { ComponentHarness } from '@angular/cdk/testing'\n\nexport class TheSeamCarouselHarness extends ComponentHarness {\n static hostSelector = 'seam-carousel'\n\n _content = this.locatorFor('.carousel-content')\n _prevSlideButton = this.locatorForOptional('[title=\"Go to previous slide\"]')\n _nextSlideButton = this.locatorForOptional('[title=\"Go to next slide\"]')\n _playButton = this.locatorForOptional('[title=\"Play\"]')\n _pauseButton = this.locatorForOptional('[title=\"Pause\"]')\n\n public async activeTileIndex() {\n return (await this._content()).getAttribute('data-slide-index')\n }\n\n public async goToPreviousSlide() {\n const prevSlideButton = await this._prevSlideButton()\n if (prevSlideButton === null) {\n throw Error('Previous slide button not found.')\n }\n return prevSlideButton.click()\n }\n\n public async goToNextSlide() {\n const nextSlideButton = await this._nextSlideButton()\n if (nextSlideButton === null) {\n throw Error('Next slide button not found.')\n }\n return nextSlideButton.click()\n }\n\n public async goToSlide(index: number) {\n return (\n await this.locatorFor(`[title=\"Go to slide ${index + 1}\"]`)()\n ).click()\n }\n\n public async hasPreviousSlideButton() {\n return (await this._prevSlideButton()) !== null\n }\n\n public async hasNextSlideButton() {\n return (await this._nextSlideButton()) !== null\n }\n\n public async hasSlideButton(index: number) {\n return (\n (await this.locatorForAll(`[title=\"Go to slide ${index + 1}\"]`)()) !==\n null\n )\n }\n\n public async hasSlideButtons() {\n return (await this.locatorForAll('[title^=\"Go to slide\"]')()).length > 0\n }\n\n public async hasAutoPlayToggleButton() {\n return (\n (await this._playButton()) !== null ||\n (await this._pauseButton()) !== null\n )\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}