@truenas/ui-components 0.4.4 → 0.4.5
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.
|
@@ -2,7 +2,7 @@ import * as _truenas_ui_components from '@truenas/ui-components';
|
|
|
2
2
|
import * as _angular_core from '@angular/core';
|
|
3
3
|
import { Signal, InjectionToken, Renderer2, OnDestroy, ElementRef, AfterViewInit, OnInit, TemplateRef, AfterContentInit, Provider, ChangeDetectorRef, TrackByFunction, OnChanges, DoCheck, SimpleChanges, PipeTransform, ViewContainerRef, AfterViewChecked, ComponentRef } from '@angular/core';
|
|
4
4
|
import { ControlValueAccessor, NgControl, AbstractControl } from '@angular/forms';
|
|
5
|
-
import { ComponentHarness, BaseHarnessFilters, HarnessPredicate, TestKey, HarnessLoader } from '@angular/cdk/testing';
|
|
5
|
+
import { ComponentHarness, BaseHarnessFilters, HarnessPredicate, TestKey, HarnessLoader, ModifierKeys as ModifierKeys$1 } from '@angular/cdk/testing';
|
|
6
6
|
import { SafeHtml, SafeResourceUrl, DomSanitizer } from '@angular/platform-browser';
|
|
7
7
|
import { ComponentFixture } from '@angular/core/testing';
|
|
8
8
|
import { SelectionModel, DataSource, CollectionViewer } from '@angular/cdk/collections';
|
|
@@ -7601,9 +7601,7 @@ declare class TnDateRangeInputComponent implements ControlValueAccessor, OnInit,
|
|
|
7601
7601
|
endDayRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
|
|
7602
7602
|
endYearRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
|
|
7603
7603
|
calendarTemplate: _angular_core.Signal<TemplateRef<unknown>>;
|
|
7604
|
-
calendar: _angular_core.Signal<TnCalendarComponent>;
|
|
7605
7604
|
wrapperEl: _angular_core.Signal<ElementRef<HTMLDivElement>>;
|
|
7606
|
-
private destroy$;
|
|
7607
7605
|
private overlayRef?;
|
|
7608
7606
|
private portal?;
|
|
7609
7607
|
isOpen: _angular_core.WritableSignal<boolean>;
|
|
@@ -7617,9 +7615,9 @@ declare class TnDateRangeInputComponent implements ControlValueAccessor, OnInit,
|
|
|
7617
7615
|
endDay: _angular_core.WritableSignal<string>;
|
|
7618
7616
|
endYear: _angular_core.WritableSignal<string>;
|
|
7619
7617
|
private currentFocus;
|
|
7620
|
-
initialRange: _angular_core.Signal<DateRange>;
|
|
7621
7618
|
private overlay;
|
|
7622
7619
|
private viewContainerRef;
|
|
7620
|
+
private injector;
|
|
7623
7621
|
ngOnInit(): void;
|
|
7624
7622
|
ngOnDestroy(): void;
|
|
7625
7623
|
writeValue(value: DateRange): void;
|
|
@@ -7649,60 +7647,473 @@ declare class TnCalendarComponent implements OnInit {
|
|
|
7649
7647
|
minDate: _angular_core.InputSignal<Date | undefined>;
|
|
7650
7648
|
maxDate: _angular_core.InputSignal<Date | undefined>;
|
|
7651
7649
|
dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | undefined>;
|
|
7650
|
+
/**
|
|
7651
|
+
* Dates to flag as noteworthy — days a task runs, days with events, and the like.
|
|
7652
|
+
* Order and time-of-day are ignored; only the calendar day is compared. The
|
|
7653
|
+
* calendar owns how a marked day looks, so callers pass dates rather than styles.
|
|
7654
|
+
* Marking is independent of `selected`/`selectedRange`, which stay authoritative
|
|
7655
|
+
* where they overlap.
|
|
7656
|
+
*/
|
|
7657
|
+
markedDates: _angular_core.InputSignal<Date[] | undefined>;
|
|
7658
|
+
/**
|
|
7659
|
+
* Which month — or which page of years, in the year view — is on screen.
|
|
7660
|
+
*
|
|
7661
|
+
* Optional. Left unbound, the calendar opens on the month the bound value lives in and
|
|
7662
|
+
* drives navigation itself. Bind it, alongside `activeDateChange`, to drive the view
|
|
7663
|
+
* from outside: useful for a calendar that stays mounted while its value jumps to
|
|
7664
|
+
* another month, which the open-on-init behaviour alone won't follow.
|
|
7665
|
+
*
|
|
7666
|
+
* Unlike `selected`, this isn't strictly controlled — the calendar still navigates on
|
|
7667
|
+
* its own when the user pages or arrows around, so binding a constant here won't
|
|
7668
|
+
* freeze the view. Changing what you bind always wins.
|
|
7669
|
+
*/
|
|
7670
|
+
activeDate: _angular_core.InputSignal<Date | undefined>;
|
|
7671
|
+
/**
|
|
7672
|
+
* Locale for dates, month and weekday names, and which day the week starts on.
|
|
7673
|
+
*
|
|
7674
|
+
* Defaults to the app's `LOCALE_ID`, which is where an Angular app already declares
|
|
7675
|
+
* its locale — so a `ng build --localize` app is right without touching this. Bind it
|
|
7676
|
+
* only when one calendar needs a different locale from the rest of the app.
|
|
7677
|
+
*
|
|
7678
|
+
* Nothing here reads the browser's language on its own: doing so would quietly
|
|
7679
|
+
* disagree with `DatePipe` and every other locale-aware part of the app. An app that
|
|
7680
|
+
* wants that behaviour opts into it once, at bootstrap:
|
|
7681
|
+
* `{ provide: LOCALE_ID, useValue: navigator.language }`.
|
|
7682
|
+
*
|
|
7683
|
+
* Wording that isn't a date — "(marked)", the header button labels — comes from
|
|
7684
|
+
* `TN_CALENDAR_INTL` instead.
|
|
7685
|
+
*/
|
|
7686
|
+
locale: _angular_core.InputSignal<string | undefined>;
|
|
7687
|
+
private appLocale;
|
|
7688
|
+
private host;
|
|
7689
|
+
private injector;
|
|
7690
|
+
/** The locale actually in force: the input when bound, the app's otherwise. */
|
|
7691
|
+
protected resolvedLocale: _angular_core.Signal<string>;
|
|
7652
7692
|
rangeMode: _angular_core.InputSignal<boolean>;
|
|
7653
7693
|
selectedRange: _angular_core.InputSignal<DateRange | undefined>;
|
|
7654
7694
|
selectedChange: _angular_core.OutputEmitterRef<Date>;
|
|
7695
|
+
/**
|
|
7696
|
+
* The date the calendar is now sitting on — the month it shows, and the day holding
|
|
7697
|
+
* the grid's roving tabindex.
|
|
7698
|
+
*
|
|
7699
|
+
* This is navigation, not selection: it fires on paging, on arrow keys, and on
|
|
7700
|
+
* clicking a day (a click moves the active cell as well as choosing the date, so the
|
|
7701
|
+
* two never drift apart). Treat it as "the view moved", not "the user picked a date" —
|
|
7702
|
+
* `selectedChange` is the one that means a choice was made.
|
|
7703
|
+
*/
|
|
7655
7704
|
activeDateChange: _angular_core.OutputEmitterRef<Date>;
|
|
7656
7705
|
viewChanged: _angular_core.OutputEmitterRef<"month" | "year">;
|
|
7657
7706
|
selectedRangeChange: _angular_core.OutputEmitterRef<DateRange>;
|
|
7707
|
+
/**
|
|
7708
|
+
* Which month/year grid is on screen. Navigation state, not selection state.
|
|
7709
|
+
*
|
|
7710
|
+
* Follows the `activeDate` input whenever the caller changes it, but stays writable so
|
|
7711
|
+
* paging and arrow keys keep working with no echo back from the caller.
|
|
7712
|
+
*/
|
|
7658
7713
|
currentDate: _angular_core.WritableSignal<Date>;
|
|
7659
7714
|
currentView: _angular_core.WritableSignal<"month" | "year">;
|
|
7660
|
-
rangeState: _angular_core.WritableSignal<{
|
|
7661
|
-
start: Date | null;
|
|
7662
|
-
end: Date | null;
|
|
7663
|
-
selecting: "start" | "end";
|
|
7664
|
-
}>;
|
|
7665
|
-
private userHasInteracted;
|
|
7666
|
-
constructor();
|
|
7667
7715
|
ngOnInit(): void;
|
|
7668
|
-
private initializeRangeState;
|
|
7669
|
-
onMonthSelected(month: number): void;
|
|
7670
|
-
onYearSelected(year: number): void;
|
|
7671
7716
|
onViewChanged(view: 'month' | 'year'): void;
|
|
7672
7717
|
onPreviousClicked(): void;
|
|
7673
7718
|
onNextClicked(): void;
|
|
7719
|
+
/**
|
|
7720
|
+
* Steps the view one page in `direction`: a month in the day view, a page of years in
|
|
7721
|
+
* the year view — the same spans `PageUp`/`PageDown` move, and the same the header
|
|
7722
|
+
* labels.
|
|
7723
|
+
*
|
|
7724
|
+
* Carries the day across, clamped, rather than dropping to the 1st. The keyboard has
|
|
7725
|
+
* always done this, so resetting here left the roving tabindex somewhere different
|
|
7726
|
+
* depending on whether the user clicked the arrow or pressed the key.
|
|
7727
|
+
*/
|
|
7728
|
+
private page;
|
|
7674
7729
|
onSelectedChange(date: Date): void;
|
|
7730
|
+
/**
|
|
7731
|
+
* Works out the next range from the one the caller currently owns and emits it. The
|
|
7732
|
+
* calendar keeps no copy — what it renders next is whatever the caller binds back.
|
|
7733
|
+
*/
|
|
7675
7734
|
private handleRangeSelection;
|
|
7676
7735
|
onActiveDateChange(date: Date): void;
|
|
7677
|
-
onYearSelectedFromView(date: Date): void;
|
|
7678
7736
|
/**
|
|
7679
|
-
*
|
|
7737
|
+
* A year picked in the year grid moves the view to that year and returns to the day
|
|
7738
|
+
* grid. It is navigation, not selection — no `selectedChange` — so the user lands on
|
|
7739
|
+
* the month they asked for and picks a day from there.
|
|
7680
7740
|
*/
|
|
7681
|
-
|
|
7741
|
+
onYearSelectedFromView(date: Date): void;
|
|
7682
7742
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCalendarComponent, never>;
|
|
7683
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarComponent, "tn-calendar", never, { "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; "viewChanged": "viewChanged"; "selectedRangeChange": "selectedRangeChange"; }, never, never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
|
|
7743
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarComponent, "tn-calendar", never, { "startView": { "alias": "startView"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "markedDates": { "alias": "markedDates"; "required": false; "isSignal": true; }; "activeDate": { "alias": "activeDate"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; "viewChanged": "viewChanged"; "selectedRangeChange": "selectedRangeChange"; }, never, never, true, [{ directive: typeof TnTestIdDirective; inputs: { "tnTestId": "testId"; }; outputs: {}; }]>;
|
|
7684
7744
|
}
|
|
7685
7745
|
|
|
7746
|
+
/** The views `tn-calendar` can show. */
|
|
7747
|
+
type TnCalendarView = 'month' | 'year';
|
|
7748
|
+
/** A set of criteria that can be used to filter a list of calendar instances. */
|
|
7749
|
+
type CalendarHarnessFilters = BaseHarnessFilters;
|
|
7750
|
+
/** A set of criteria that can be used to filter a list of calendar cell instances. */
|
|
7751
|
+
interface CalendarCellHarnessFilters extends BaseHarnessFilters {
|
|
7752
|
+
/**
|
|
7753
|
+
* Filters based on the text of the cell — as rendered, so formatted for the app's
|
|
7754
|
+
* locale right down to the numerals. `'14'` finds nothing in a calendar showing
|
|
7755
|
+
* `١٤`. Prefer `date` (or `year`) unless the rendered text is what you mean to assert.
|
|
7756
|
+
*/
|
|
7757
|
+
text?: string | RegExp;
|
|
7758
|
+
/**
|
|
7759
|
+
* Filters day cells by the calendar day they represent, whatever the locale renders.
|
|
7760
|
+
* Time of day is ignored.
|
|
7761
|
+
*/
|
|
7762
|
+
date?: Date;
|
|
7763
|
+
/** Filters year cells by the year they represent, whatever the locale renders. */
|
|
7764
|
+
year?: number;
|
|
7765
|
+
/** Filters based on whether the cell is selected. */
|
|
7766
|
+
selected?: boolean;
|
|
7767
|
+
/** Filters based on whether the cell is activated using keyboard navigation. */
|
|
7768
|
+
active?: boolean;
|
|
7769
|
+
/** Filters based on whether the cell is disabled. */
|
|
7770
|
+
disabled?: boolean;
|
|
7771
|
+
/** Filters based on whether the cell represents today's date. */
|
|
7772
|
+
today?: boolean;
|
|
7773
|
+
/** Filters based on whether the cell is inside of the selected range. */
|
|
7774
|
+
inRange?: boolean;
|
|
7775
|
+
/** Filters based on whether the cell was flagged through `markedDates`. */
|
|
7776
|
+
marked?: boolean;
|
|
7777
|
+
}
|
|
7778
|
+
/**
|
|
7779
|
+
* Harness for interacting with a single day (or year) cell inside `tn-calendar`.
|
|
7780
|
+
*
|
|
7781
|
+
* Modelled on Angular Material's `MatCalendarCellHarness` so specs can move across
|
|
7782
|
+
* with the method names intact. Three differences worth knowing:
|
|
7783
|
+
*
|
|
7784
|
+
* - `isMarked()` is new — it reports the `markedDates` state, which Material has no
|
|
7785
|
+
* equivalent for.
|
|
7786
|
+
* - `getDate()` and the `date` filter are new, and are the reliable way to name a cell:
|
|
7787
|
+
* the text is formatted for the app's locale, so `'14'` misses a calendar rendering
|
|
7788
|
+
* `١٤`.
|
|
7789
|
+
* - There are no comparison-range or preview-range methods (`isComparisonRangeStart()`
|
|
7790
|
+
* and friends); `tn-calendar` has no comparison range to report.
|
|
7791
|
+
*
|
|
7792
|
+
* @example
|
|
7793
|
+
* ```typescript
|
|
7794
|
+
* const calendar = await loader.getHarness(TnCalendarHarness);
|
|
7795
|
+
* const [first] = await calendar.getCells({ date: new Date(2031, 4, 14) });
|
|
7796
|
+
* await first.select();
|
|
7797
|
+
* expect(await first.isSelected()).toBe(true);
|
|
7798
|
+
* ```
|
|
7799
|
+
*/
|
|
7800
|
+
declare class TnCalendarCellHarness extends ComponentHarness {
|
|
7801
|
+
/** The selector for a calendar cell. Padding cells render no button, so only real days match. */
|
|
7802
|
+
static hostSelector: string;
|
|
7803
|
+
private _content;
|
|
7804
|
+
/**
|
|
7805
|
+
* Gets a `HarnessPredicate` that can be used to search for a cell with specific attributes.
|
|
7806
|
+
*
|
|
7807
|
+
* @param options Options for filtering which cell instances are considered a match.
|
|
7808
|
+
* @returns A `HarnessPredicate` configured with the given options.
|
|
7809
|
+
*
|
|
7810
|
+
* @example
|
|
7811
|
+
* ```typescript
|
|
7812
|
+
* // Every day the schedule runs on
|
|
7813
|
+
* const runDays = await calendar.getCells({ marked: true });
|
|
7814
|
+
*
|
|
7815
|
+
* // The disabled days before minDate
|
|
7816
|
+
* const blocked = await calendar.getCells({ disabled: true });
|
|
7817
|
+
* ```
|
|
7818
|
+
*/
|
|
7819
|
+
static with(options?: CalendarCellHarnessFilters): HarnessPredicate<TnCalendarCellHarness>;
|
|
7820
|
+
/** Gets the text of the calendar cell. */
|
|
7821
|
+
getText(): Promise<string>;
|
|
7822
|
+
/** Gets the aria-label of the calendar cell. */
|
|
7823
|
+
getAriaLabel(): Promise<string>;
|
|
7824
|
+
/**
|
|
7825
|
+
* Gets the calendar day this cell represents, independent of how it is rendered —
|
|
7826
|
+
* `getText()` is formatted for the locale, so it reads `١٤` in Arabic while this still
|
|
7827
|
+
* answers the 14th. Midnight local time. `null` on a year cell, which has no day.
|
|
7828
|
+
*/
|
|
7829
|
+
getDate(): Promise<Date | null>;
|
|
7830
|
+
/**
|
|
7831
|
+
* Gets the year this cell represents, independent of how it is rendered. Works on year
|
|
7832
|
+
* cells; `null` on a day cell.
|
|
7833
|
+
*/
|
|
7834
|
+
getYear(): Promise<number | null>;
|
|
7835
|
+
/** The raw `YYYY-MM-DD` stamp, for comparing without rebuilding a `Date`. */
|
|
7836
|
+
protected getDateStamp(): Promise<string | null>;
|
|
7837
|
+
/** Whether the cell is selected. */
|
|
7838
|
+
isSelected(): Promise<boolean>;
|
|
7839
|
+
/** Whether the cell is disabled. */
|
|
7840
|
+
isDisabled(): Promise<boolean>;
|
|
7841
|
+
/**
|
|
7842
|
+
* Whether the cell holds the grid's roving tabindex — the one cell reachable with Tab,
|
|
7843
|
+
* which the arrow keys move. Independent of selection: arrowing around changes which
|
|
7844
|
+
* cell is active without selecting anything.
|
|
7845
|
+
*/
|
|
7846
|
+
isActive(): Promise<boolean>;
|
|
7847
|
+
/** Whether the cell represents today's date. */
|
|
7848
|
+
isToday(): Promise<boolean>;
|
|
7849
|
+
/** Whether the cell was flagged through the calendar's `markedDates` input. */
|
|
7850
|
+
isMarked(): Promise<boolean>;
|
|
7851
|
+
/** Whether the cell is the start of the selected range. */
|
|
7852
|
+
isRangeStart(): Promise<boolean>;
|
|
7853
|
+
/** Whether the cell is the end of the selected range. */
|
|
7854
|
+
isRangeEnd(): Promise<boolean>;
|
|
7855
|
+
/**
|
|
7856
|
+
* Whether the cell is part of the selected range, ends included — matching Material's
|
|
7857
|
+
* `isInRange()`. Use `isRangeStart()`/`isRangeEnd()` to single out the ends.
|
|
7858
|
+
*/
|
|
7859
|
+
isInRange(): Promise<boolean>;
|
|
7860
|
+
/** Selects the calendar cell. Won't do anything if the cell is disabled. */
|
|
7861
|
+
select(): Promise<void>;
|
|
7862
|
+
/**
|
|
7863
|
+
* Presses a key on the cell. The grid handles its keys on the cells themselves, so
|
|
7864
|
+
* this is how the roving tabindex is driven — arrows, Home/End and PageUp/PageDown
|
|
7865
|
+
* move the active cell, while Enter and Space select.
|
|
7866
|
+
*
|
|
7867
|
+
* @param key The key to press, e.g. `TestKey.RIGHT_ARROW`.
|
|
7868
|
+
* @param modifiers Modifier keys held while pressing, e.g. `{ shift: true }`.
|
|
7869
|
+
*
|
|
7870
|
+
* @example
|
|
7871
|
+
* ```typescript
|
|
7872
|
+
* const [cell] = await calendar.getCells({ active: true });
|
|
7873
|
+
* await cell.press(TestKey.PAGE_DOWN, { shift: true }); // a year on
|
|
7874
|
+
* ```
|
|
7875
|
+
*/
|
|
7876
|
+
press(key: TestKey | string, modifiers?: ModifierKeys$1): Promise<void>;
|
|
7877
|
+
/** Hovers over the calendar cell. */
|
|
7878
|
+
hover(): Promise<void>;
|
|
7879
|
+
/** Moves the mouse away from the calendar cell. */
|
|
7880
|
+
mouseAway(): Promise<void>;
|
|
7881
|
+
/** Focuses the calendar cell. */
|
|
7882
|
+
focus(): Promise<void>;
|
|
7883
|
+
/** Removes focus from the calendar cell. */
|
|
7884
|
+
blur(): Promise<void>;
|
|
7885
|
+
}
|
|
7886
|
+
/**
|
|
7887
|
+
* Harness for interacting with `tn-calendar` in tests.
|
|
7888
|
+
*
|
|
7889
|
+
* The method names mirror Angular Material's `MatCalendarHarness`, so a spec written
|
|
7890
|
+
* against the Material calendar moves over unchanged. Differences to know:
|
|
7891
|
+
*
|
|
7892
|
+
* - `getCurrentView()` resolves to `'month' | 'year'`. `tn-calendar` has no separate
|
|
7893
|
+
* multi-year view — its year view *is* the multi-year grid.
|
|
7894
|
+
* - Cell filters gain `marked` for the `markedDates` state and `date`/`year` for naming
|
|
7895
|
+
* a cell without going through its rendered text, and drop Material's
|
|
7896
|
+
* `inComparisonRange`, which has no equivalent here.
|
|
7897
|
+
*
|
|
7898
|
+
* @example
|
|
7899
|
+
* ```typescript
|
|
7900
|
+
* const calendar = await loader.getHarness(TnCalendarHarness);
|
|
7901
|
+
*
|
|
7902
|
+
* // Which days does the schedule run on this month?
|
|
7903
|
+
* const marked = await calendar.getCells({ marked: true });
|
|
7904
|
+
* expect(await parallel(() => marked.map((cell) => cell.getText()))).toEqual(['24', '25']);
|
|
7905
|
+
*
|
|
7906
|
+
* // Page forward a month
|
|
7907
|
+
* await calendar.next();
|
|
7908
|
+
* expect(await calendar.getCurrentViewLabel()).toBe('MAR 2022');
|
|
7909
|
+
*
|
|
7910
|
+
* // Pick a day
|
|
7911
|
+
* await calendar.selectCell({ date: new Date(2022, 2, 14) });
|
|
7912
|
+
* ```
|
|
7913
|
+
*/
|
|
7914
|
+
declare class TnCalendarHarness extends ComponentHarness {
|
|
7915
|
+
/** The selector for the host element of a `TnCalendarComponent` instance. */
|
|
7916
|
+
static hostSelector: string;
|
|
7917
|
+
private _periodButton;
|
|
7918
|
+
private _previousButton;
|
|
7919
|
+
private _nextButton;
|
|
7920
|
+
private _monthView;
|
|
7921
|
+
/**
|
|
7922
|
+
* Gets a `HarnessPredicate` that can be used to search for a calendar with specific
|
|
7923
|
+
* attributes.
|
|
7924
|
+
*
|
|
7925
|
+
* @param options Options for filtering which calendar instances are considered a match.
|
|
7926
|
+
* @returns A `HarnessPredicate` configured with the given options.
|
|
7927
|
+
*/
|
|
7928
|
+
static with(options?: CalendarHarnessFilters): HarnessPredicate<TnCalendarHarness>;
|
|
7929
|
+
/**
|
|
7930
|
+
* Gets a list of cells inside the calendar. Padding cells for days outside the month
|
|
7931
|
+
* are not included.
|
|
7932
|
+
*
|
|
7933
|
+
* @param filter Optionally filters which cells are included.
|
|
7934
|
+
*/
|
|
7935
|
+
getCells(filter?: CalendarCellHarnessFilters): Promise<TnCalendarCellHarness[]>;
|
|
7936
|
+
/** Gets the current view that is being shown inside the calendar. */
|
|
7937
|
+
getCurrentView(): Promise<TnCalendarView>;
|
|
7938
|
+
/** Gets the label of the current calendar view, e.g. `'MAR 2022'`. */
|
|
7939
|
+
getCurrentViewLabel(): Promise<string>;
|
|
7940
|
+
/** Changes the calendar view by clicking on the view toggle button. */
|
|
7941
|
+
changeView(): Promise<void>;
|
|
7942
|
+
/** Goes to the next page of the current view (e.g. next month when inside the month view). */
|
|
7943
|
+
next(): Promise<void>;
|
|
7944
|
+
/** Goes to the previous page of the current view (e.g. previous month in the month view). */
|
|
7945
|
+
previous(): Promise<void>;
|
|
7946
|
+
/**
|
|
7947
|
+
* Selects a cell in the current calendar view.
|
|
7948
|
+
*
|
|
7949
|
+
* @param filter An optional filter to apply to the cells. The first cell matching the
|
|
7950
|
+
* filter will be selected.
|
|
7951
|
+
*/
|
|
7952
|
+
selectCell(filter?: CalendarCellHarnessFilters): Promise<void>;
|
|
7953
|
+
/**
|
|
7954
|
+
* Gets the cell holding the grid's roving tabindex — the one cell Tab reaches, and the
|
|
7955
|
+
* one the arrow keys move.
|
|
7956
|
+
*
|
|
7957
|
+
* `null` only when every cell in the view is disabled, where there is nothing to focus.
|
|
7958
|
+
*/
|
|
7959
|
+
getActiveCell(): Promise<TnCalendarCellHarness | null>;
|
|
7960
|
+
/**
|
|
7961
|
+
* Moves the grid's roving tabindex with the keyboard, without going through the DOM.
|
|
7962
|
+
*
|
|
7963
|
+
* Arrows move by a day or a week (a year or a row of years); Home and End reach the
|
|
7964
|
+
* ends of the month or year page; PageUp and PageDown page, shifted by a year. Moving
|
|
7965
|
+
* never changes the selection — use `selectCell()` or `TnCalendarCellHarness.select()`
|
|
7966
|
+
* for that.
|
|
7967
|
+
*
|
|
7968
|
+
* @param key The key to press, e.g. `TestKey.RIGHT_ARROW`.
|
|
7969
|
+
* @param modifiers Modifier keys held while pressing, e.g. `{ shift: true }`.
|
|
7970
|
+
*
|
|
7971
|
+
* @example
|
|
7972
|
+
* ```typescript
|
|
7973
|
+
* await calendar.moveActiveCell(TestKey.DOWN_ARROW);
|
|
7974
|
+
* expect(await (await calendar.getActiveCell())!.getText()).toBe('17');
|
|
7975
|
+
* ```
|
|
7976
|
+
*/
|
|
7977
|
+
moveActiveCell(key: TestKey | string, modifiers?: ModifierKeys$1): Promise<void>;
|
|
7978
|
+
}
|
|
7979
|
+
|
|
7980
|
+
/**
|
|
7981
|
+
* The calendar's user-facing wording.
|
|
7982
|
+
*
|
|
7983
|
+
* Dates, month and weekday names and the first day of the week all come from the
|
|
7984
|
+
* locale, so they need no translation here — `Intl` already knows them. What is left is
|
|
7985
|
+
* prose: the state suffixes screen readers read out, and the names of the header
|
|
7986
|
+
* buttons. Those are the strings this carries.
|
|
7987
|
+
*/
|
|
7988
|
+
interface TnCalendarIntl {
|
|
7989
|
+
/** Appended to a day flagged through `markedDates`. */
|
|
7990
|
+
marked: string;
|
|
7991
|
+
/** Appended to the first day of the selected range. */
|
|
7992
|
+
rangeStart: string;
|
|
7993
|
+
/** Appended to the last day of the selected range. */
|
|
7994
|
+
rangeEnd: string;
|
|
7995
|
+
/** Appended to the days between the ends of the selected range. */
|
|
7996
|
+
inRange: string;
|
|
7997
|
+
/** Appended to the year cell for the current year. */
|
|
7998
|
+
currentYear: string;
|
|
7999
|
+
/** Accessible name for the day grid, given the month and year already formatted. */
|
|
8000
|
+
monthGridLabel: (period: string) => string;
|
|
8001
|
+
/** Accessible name for the year grid, given the span of years it shows. */
|
|
8002
|
+
yearGridLabel: (startYear: number, endYear: number) => string;
|
|
8003
|
+
/** Accessible name for the button that switches between the day and year grids. */
|
|
8004
|
+
chooseMonthAndYear: string;
|
|
8005
|
+
/** Accessible name for the back button in the day grid. */
|
|
8006
|
+
previousMonth: string;
|
|
8007
|
+
/** Accessible name for the forward button in the day grid. */
|
|
8008
|
+
nextMonth: string;
|
|
8009
|
+
/** Accessible name for the back button in the year grid. */
|
|
8010
|
+
previousYears: string;
|
|
8011
|
+
/** Accessible name for the forward button in the year grid. */
|
|
8012
|
+
nextYears: string;
|
|
8013
|
+
}
|
|
8014
|
+
/** The wording used when an app provides none of its own. */
|
|
8015
|
+
declare const TN_CALENDAR_INTL_DEFAULTS: TnCalendarIntl;
|
|
8016
|
+
/**
|
|
8017
|
+
* What an app may provide for {@link TN_CALENDAR_INTL}: the wording itself, or a signal
|
|
8018
|
+
* carrying it. Provide the signal form when the language can change while the app is
|
|
8019
|
+
* running — a plain object is read once and never again, so every open calendar would
|
|
8020
|
+
* keep the wording it was built with.
|
|
8021
|
+
*/
|
|
8022
|
+
type TnCalendarIntlInput = Partial<TnCalendarIntl> | Signal<Partial<TnCalendarIntl>>;
|
|
8023
|
+
/**
|
|
8024
|
+
* Injection token for the calendar's wording.
|
|
8025
|
+
*
|
|
8026
|
+
* Because the library ships no localized strings, this is the recommended hook for
|
|
8027
|
+
* wiring a translation service so every `tn-calendar` reads the same way. Anything left
|
|
8028
|
+
* out falls back to {@link TN_CALENDAR_INTL_DEFAULTS}, so an app can translate one
|
|
8029
|
+
* string without restating the rest.
|
|
8030
|
+
*
|
|
8031
|
+
* Dates themselves are not here — they follow `LOCALE_ID`, or the calendar's `locale`
|
|
8032
|
+
* input. See `TnCalendarComponent.locale`.
|
|
8033
|
+
*
|
|
8034
|
+
* @example
|
|
8035
|
+
* ```ts
|
|
8036
|
+
* // Fixed for the lifetime of the app — the language is chosen at build or bootstrap.
|
|
8037
|
+
* providers: [
|
|
8038
|
+
* {
|
|
8039
|
+
* provide: TN_CALENDAR_INTL,
|
|
8040
|
+
* useFactory: (translate: TranslateService): TnCalendarIntlInput => ({
|
|
8041
|
+
* marked: translate.instant('calendar.marked'),
|
|
8042
|
+
* previousMonth: translate.instant('calendar.previousMonth'),
|
|
8043
|
+
* yearGridLabel: (from, to) => translate.instant('calendar.years', { from, to }),
|
|
8044
|
+
* }),
|
|
8045
|
+
* deps: [TranslateService],
|
|
8046
|
+
* },
|
|
8047
|
+
* ];
|
|
8048
|
+
* ```
|
|
8049
|
+
*
|
|
8050
|
+
* @example
|
|
8051
|
+
* ```ts
|
|
8052
|
+
* // Switchable at runtime: a signal, so calendars already on screen follow along.
|
|
8053
|
+
* providers: [
|
|
8054
|
+
* {
|
|
8055
|
+
* provide: TN_CALENDAR_INTL,
|
|
8056
|
+
* useFactory: (): TnCalendarIntlInput => {
|
|
8057
|
+
* const translate = inject(TranslateService);
|
|
8058
|
+
* const lang = toSignal(translate.onLangChange, { initialValue: null });
|
|
8059
|
+
* return computed(() => {
|
|
8060
|
+
* lang(); // Re-read every string when the language changes.
|
|
8061
|
+
* return { marked: translate.instant('calendar.marked') };
|
|
8062
|
+
* });
|
|
8063
|
+
* },
|
|
8064
|
+
* },
|
|
8065
|
+
* ];
|
|
8066
|
+
* ```
|
|
8067
|
+
*/
|
|
8068
|
+
declare const TN_CALENDAR_INTL: InjectionToken<TnCalendarIntlInput>;
|
|
8069
|
+
/**
|
|
8070
|
+
* Resolves the wording for a calendar component: whatever the app provided, laid over
|
|
8071
|
+
* the built-in defaults.
|
|
8072
|
+
*
|
|
8073
|
+
* Returns a signal rather than a plain object so a language switch reaches calendars that
|
|
8074
|
+
* are already on screen. Read it inside a `computed` — as every caller here does — and
|
|
8075
|
+
* the labels recompute on their own.
|
|
8076
|
+
*/
|
|
8077
|
+
declare function injectTnCalendarIntl(): Signal<TnCalendarIntl>;
|
|
8078
|
+
|
|
7686
8079
|
declare class TnCalendarHeaderComponent {
|
|
7687
8080
|
currentDate: _angular_core.InputSignal<Date>;
|
|
7688
8081
|
currentView: _angular_core.InputSignal<"month" | "year">;
|
|
7689
|
-
|
|
7690
|
-
|
|
8082
|
+
/**
|
|
8083
|
+
* Locale for the month abbreviation. Falls back to the app's `LOCALE_ID`;
|
|
8084
|
+
* `tn-calendar` binds it from its own `locale` input.
|
|
8085
|
+
*/
|
|
8086
|
+
locale: _angular_core.InputSignal<string | undefined>;
|
|
7691
8087
|
viewChanged: _angular_core.OutputEmitterRef<"month" | "year">;
|
|
7692
8088
|
previousClicked: _angular_core.OutputEmitterRef<void>;
|
|
7693
8089
|
nextClicked: _angular_core.OutputEmitterRef<void>;
|
|
7694
|
-
private
|
|
8090
|
+
private appLocale;
|
|
8091
|
+
private intl;
|
|
8092
|
+
private resolvedLocale;
|
|
8093
|
+
/**
|
|
8094
|
+
* Ties the period button to its live region through `aria-describedby`. Counted rather
|
|
8095
|
+
* than drawn at random: two calendars on one page — a start and an end picker, say —
|
|
8096
|
+
* had a real chance of minting the same id out of only 10,000, and a duplicate id
|
|
8097
|
+
* silently unhooks the association with nothing to show for it.
|
|
8098
|
+
*/
|
|
7695
8099
|
periodLabelId: string;
|
|
7696
8100
|
periodLabel: _angular_core.Signal<string>;
|
|
7697
|
-
previousLabel: _angular_core.Signal<
|
|
7698
|
-
nextLabel: _angular_core.Signal<
|
|
8101
|
+
previousLabel: _angular_core.Signal<string>;
|
|
8102
|
+
nextLabel: _angular_core.Signal<string>;
|
|
8103
|
+
periodButtonLabel: _angular_core.Signal<string>;
|
|
7699
8104
|
toggleView(): void;
|
|
7700
8105
|
onPreviousClick(): void;
|
|
7701
8106
|
onNextClick(): void;
|
|
7702
8107
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnCalendarHeaderComponent, never>;
|
|
7703
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarHeaderComponent, "tn-calendar-header", never, { "currentDate": { "alias": "currentDate"; "required": false; "isSignal": true; }; "currentView": { "alias": "currentView"; "required": false; "isSignal": true; };
|
|
8108
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnCalendarHeaderComponent, "tn-calendar-header", never, { "currentDate": { "alias": "currentDate"; "required": false; "isSignal": true; }; "currentView": { "alias": "currentView"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; }, { "viewChanged": "viewChanged"; "previousClicked": "previousClicked"; "nextClicked": "nextClicked"; }, never, never, true, never>;
|
|
7704
8109
|
}
|
|
7705
8110
|
|
|
8111
|
+
/**
|
|
8112
|
+
* Which background the day indicator paints. Resolved to a single value per cell so
|
|
8113
|
+
* the precedence is stated once, in one place, rather than emerging from the relative
|
|
8114
|
+
* specificity of a handful of CSS rules.
|
|
8115
|
+
*/
|
|
8116
|
+
type CalendarCellFill = 'primary' | 'marked' | 'none';
|
|
7706
8117
|
interface CalendarCell {
|
|
7707
8118
|
value: number;
|
|
7708
8119
|
date: Date;
|
|
@@ -7711,8 +8122,26 @@ interface CalendarCell {
|
|
|
7711
8122
|
enabled: boolean;
|
|
7712
8123
|
selected: boolean;
|
|
7713
8124
|
today: boolean;
|
|
7714
|
-
|
|
7715
|
-
|
|
8125
|
+
/**
|
|
8126
|
+
* `YYYY-MM-DD` for this day, rendered as `data-tn-date`. A handle that survives
|
|
8127
|
+
* translation, for tests that would otherwise match on locale-formatted cell text.
|
|
8128
|
+
*/
|
|
8129
|
+
isoDate: string;
|
|
8130
|
+
/** Whether the date was listed in `markedDates`. */
|
|
8131
|
+
marked: boolean;
|
|
8132
|
+
/**
|
|
8133
|
+
* Whether the day is part of what the caller has chosen — the selected date in
|
|
8134
|
+
* single-date mode, or anywhere from the start to the end of the range in range mode.
|
|
8135
|
+
* Drives `aria-pressed`, which otherwise had nothing to report in range mode.
|
|
8136
|
+
*/
|
|
8137
|
+
inSelection: boolean;
|
|
8138
|
+
/** Background for the day indicator: selection and range caps outrank marking. */
|
|
8139
|
+
fill: CalendarCellFill;
|
|
8140
|
+
/**
|
|
8141
|
+
* Whether the indicator draws the today outline. Suppressed under a primary fill,
|
|
8142
|
+
* where a primary border and primary text would disappear into the fill.
|
|
8143
|
+
*/
|
|
8144
|
+
todayOutline: boolean;
|
|
7716
8145
|
rangeStart?: boolean;
|
|
7717
8146
|
rangeEnd?: boolean;
|
|
7718
8147
|
inRange?: boolean;
|
|
@@ -7723,33 +8152,114 @@ declare class TnMonthViewComponent {
|
|
|
7723
8152
|
minDate: _angular_core.InputSignal<Date | undefined>;
|
|
7724
8153
|
maxDate: _angular_core.InputSignal<Date | undefined>;
|
|
7725
8154
|
dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | undefined>;
|
|
8155
|
+
/**
|
|
8156
|
+
* Dates to flag as noteworthy — days a task runs, days with events, and the like.
|
|
8157
|
+
* Order and time-of-day are ignored; only the calendar day is compared. The
|
|
8158
|
+
* calendar owns how a marked day looks, so callers pass dates rather than styles.
|
|
8159
|
+
*/
|
|
8160
|
+
markedDates: _angular_core.InputSignal<Date[] | undefined>;
|
|
7726
8161
|
rangeMode: _angular_core.InputSignal<boolean>;
|
|
7727
|
-
selectedRange: _angular_core.InputSignal<
|
|
7728
|
-
start: Date | null;
|
|
7729
|
-
end: Date | null;
|
|
7730
|
-
selecting: "start" | "end";
|
|
7731
|
-
} | undefined>;
|
|
8162
|
+
selectedRange: _angular_core.InputSignal<DateRange | undefined>;
|
|
7732
8163
|
selectedChange: _angular_core.OutputEmitterRef<Date>;
|
|
7733
8164
|
activeDateChange: _angular_core.OutputEmitterRef<Date>;
|
|
7734
|
-
|
|
8165
|
+
/**
|
|
8166
|
+
* Locale for dates, weekday names and the first day of the week. Falls back to the
|
|
8167
|
+
* app's `LOCALE_ID`; `tn-calendar` binds it from its own `locale` input.
|
|
8168
|
+
*/
|
|
8169
|
+
locale: _angular_core.InputSignal<string | undefined>;
|
|
8170
|
+
private host;
|
|
8171
|
+
private injector;
|
|
8172
|
+
private appLocale;
|
|
8173
|
+
private intl;
|
|
8174
|
+
private resolvedLocale;
|
|
8175
|
+
/**
|
|
8176
|
+
* Which day the week starts on in this locale, as a `Date.getDay()` index. Everything
|
|
8177
|
+
* about the grid's shape hangs off it: the order of the headings and how many blank
|
|
8178
|
+
* cells precede the 1st.
|
|
8179
|
+
*/
|
|
8180
|
+
private weekStart;
|
|
8181
|
+
/** Day numbers in the locale's own numerals, without a thousands separator. */
|
|
8182
|
+
private dayFormat;
|
|
8183
|
+
/**
|
|
8184
|
+
* Column headings, named and ordered by the locale — Sunday first in the US, Monday
|
|
8185
|
+
* across most of Europe. The dates are an arbitrary week, used only to name the days.
|
|
8186
|
+
*/
|
|
8187
|
+
readonly weekdays: _angular_core.Signal<{
|
|
7735
8188
|
long: string;
|
|
7736
8189
|
short: string;
|
|
7737
|
-
}[]
|
|
8190
|
+
}[]>;
|
|
8191
|
+
private markedDateKeys;
|
|
8192
|
+
/**
|
|
8193
|
+
* Names the grid after the month it shows. Without it a screen-reader user arrowing
|
|
8194
|
+
* around hears each day but never which month they are in — the period only appears in
|
|
8195
|
+
* the header, outside the grid.
|
|
8196
|
+
*/
|
|
8197
|
+
gridLabel: _angular_core.Signal<string>;
|
|
8198
|
+
/**
|
|
8199
|
+
* The day of the month that carries `tabindex="0"` — the grid's single keyboard entry
|
|
8200
|
+
* point, per the roving tabindex pattern.
|
|
8201
|
+
*
|
|
8202
|
+
* It follows `activeDate`, but falls back to the nearest enabled day when that day
|
|
8203
|
+
* can't take focus. Without the fallback a month whose active day is disabled (say,
|
|
8204
|
+
* anything before `minDate`) would have no tabbable cell at all, leaving the grid
|
|
8205
|
+
* unreachable by keyboard. `null` only when the whole month is disabled, where there
|
|
8206
|
+
* is nothing worth focusing anyway.
|
|
8207
|
+
*
|
|
8208
|
+
* Derived from the month rather than from `calendarRows()`, which would be circular.
|
|
8209
|
+
*/
|
|
8210
|
+
activeDay: _angular_core.Signal<number | null>;
|
|
8211
|
+
private activeCellDate;
|
|
7738
8212
|
calendarRows: _angular_core.Signal<CalendarCell[][]>;
|
|
7739
8213
|
private createCell;
|
|
7740
8214
|
private createEmptyCell;
|
|
7741
8215
|
private isDateEnabled;
|
|
7742
|
-
|
|
8216
|
+
/**
|
|
8217
|
+
* Spells out the state a day is in, but only the parts no ARIA attribute already
|
|
8218
|
+
* carries. Selection lives on the button's `aria-pressed` and today on `aria-current`,
|
|
8219
|
+
* so repeating them here had screen readers announce each one twice. Marking and the
|
|
8220
|
+
* range positions have no attribute equivalent, and would otherwise be conveyed by
|
|
8221
|
+
* background colour alone.
|
|
8222
|
+
*/
|
|
7743
8223
|
private formatAriaLabel;
|
|
7744
8224
|
trackByDate(index: number, cell: CalendarCell): string;
|
|
7745
8225
|
trackByRow(index: number): number;
|
|
7746
8226
|
onCellClicked(cell: CalendarCell): void;
|
|
8227
|
+
/**
|
|
8228
|
+
* Moves the roving tabindex. Selection stays on click/Enter/Space, which the cells
|
|
8229
|
+
* are already buttons for, so this only ever changes which day is active.
|
|
8230
|
+
*
|
|
8231
|
+
* Moves that leave the displayed month emit an `activeDateChange` like any other
|
|
8232
|
+
* navigation; the grid re-renders on the new month with the target day active.
|
|
8233
|
+
*/
|
|
8234
|
+
onKeydown(event: KeyboardEvent): void;
|
|
8235
|
+
/**
|
|
8236
|
+
* The day a key aims at, and which way to look from there when that day is disabled.
|
|
8237
|
+
*
|
|
8238
|
+
* The search direction belongs to the key, not to where the target happens to fall
|
|
8239
|
+
* relative to the current day. Home and End mean "the ends of *this* month", so they
|
|
8240
|
+
* search inward: looking outward would step straight into the neighbouring month over
|
|
8241
|
+
* a single filtered-out boundary day and page the view, which is not what either key
|
|
8242
|
+
* promises. The arrows and the paging keys keep travelling the way they were already
|
|
8243
|
+
* headed, and crossing into the next month is the point of those.
|
|
8244
|
+
*/
|
|
8245
|
+
private targetForKey;
|
|
8246
|
+
/**
|
|
8247
|
+
* Steps past days the caller has disabled, so a gap in `dateFilter` or the far side of
|
|
8248
|
+
* `minDate`/`maxDate` doesn't park focus somewhere unusable.
|
|
8249
|
+
*
|
|
8250
|
+
* Searches the way the key asked for (see `targetForKey`), then doubles back if that
|
|
8251
|
+
* finds nothing. The fallback is for the ends of the allowed range: arrowing right at
|
|
8252
|
+
* `maxDate` finds nothing ahead, doubles back onto the day we started from, and the
|
|
8253
|
+
* caller reads that as "don't move".
|
|
8254
|
+
*/
|
|
8255
|
+
private nearestEnabled;
|
|
8256
|
+
/** Bounded, so an everything-disabled filter stops the move instead of spinning. */
|
|
8257
|
+
private scanForEnabled;
|
|
7747
8258
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMonthViewComponent, never>;
|
|
7748
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMonthViewComponent, "tn-month-view", never, { "activeDate": { "alias": "activeDate"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; }, never, never, true, never>;
|
|
8259
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMonthViewComponent, "tn-month-view", never, { "activeDate": { "alias": "activeDate"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "markedDates": { "alias": "markedDates"; "required": false; "isSignal": true; }; "rangeMode": { "alias": "rangeMode"; "required": false; "isSignal": true; }; "selectedRange": { "alias": "selectedRange"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; }, never, never, true, never>;
|
|
7749
8260
|
}
|
|
7750
8261
|
|
|
7751
8262
|
interface YearCell {
|
|
7752
|
-
value: number;
|
|
7753
8263
|
year: number;
|
|
7754
8264
|
label: string;
|
|
7755
8265
|
ariaLabel: string;
|
|
@@ -7763,25 +8273,86 @@ declare class TnMultiYearViewComponent {
|
|
|
7763
8273
|
minDate: _angular_core.InputSignal<Date | undefined>;
|
|
7764
8274
|
maxDate: _angular_core.InputSignal<Date | undefined>;
|
|
7765
8275
|
dateFilter: _angular_core.InputSignal<((date: Date) => boolean) | undefined>;
|
|
8276
|
+
/**
|
|
8277
|
+
* Locale for the year numerals — Arabic-Indic digits in `ar`, Western in `en`. Falls
|
|
8278
|
+
* back to the app's `LOCALE_ID`; `tn-calendar` binds it from its own `locale` input.
|
|
8279
|
+
*/
|
|
8280
|
+
locale: _angular_core.InputSignal<string | undefined>;
|
|
7766
8281
|
selectedChange: _angular_core.OutputEmitterRef<Date>;
|
|
7767
8282
|
activeDateChange: _angular_core.OutputEmitterRef<Date>;
|
|
7768
|
-
|
|
7769
|
-
|
|
8283
|
+
private host;
|
|
8284
|
+
private injector;
|
|
8285
|
+
private appLocale;
|
|
8286
|
+
private intl;
|
|
8287
|
+
/** Years read out in the locale's own numerals, without a thousands separator. */
|
|
8288
|
+
private yearFormat;
|
|
7770
8289
|
readonly yearsPerRow = 4;
|
|
7771
|
-
readonly yearRowCount
|
|
8290
|
+
readonly yearRowCount: number;
|
|
8291
|
+
/**
|
|
8292
|
+
* The page of years on screen. Pages are fixed blocks, so the active year sits
|
|
8293
|
+
* wherever it falls within one rather than in the middle — see `yearPageStart`.
|
|
8294
|
+
*/
|
|
7772
8295
|
yearRange: _angular_core.Signal<{
|
|
7773
8296
|
start: number;
|
|
7774
8297
|
end: number;
|
|
7775
8298
|
}>;
|
|
8299
|
+
/**
|
|
8300
|
+
* Names the grid after the span of years it shows, so a screen-reader user arrowing
|
|
8301
|
+
* around knows which page they are on rather than just hearing bare years.
|
|
8302
|
+
*/
|
|
8303
|
+
gridLabel: _angular_core.Signal<string>;
|
|
7776
8304
|
yearRows: _angular_core.Signal<YearCell[][]>;
|
|
8305
|
+
/**
|
|
8306
|
+
* The year that carries `tabindex="0"` — the grid's single keyboard entry point, per
|
|
8307
|
+
* the roving tabindex pattern. Follows `activeDate`, falling back to the nearest
|
|
8308
|
+
* enabled year in the page so a range whose active year is disabled still has a
|
|
8309
|
+
* tabbable cell. `null` only when every year on the page is disabled.
|
|
8310
|
+
*/
|
|
8311
|
+
activeYear: _angular_core.Signal<number | null>;
|
|
7777
8312
|
private createYearCell;
|
|
7778
8313
|
private isYearEnabled;
|
|
8314
|
+
/**
|
|
8315
|
+
* Selection is carried by the button's `aria-pressed`, so it is deliberately not
|
|
8316
|
+
* repeated here. "Current year" stays: `aria-current="date"` on a year cell is vague
|
|
8317
|
+
* enough that spelling it out earns its place.
|
|
8318
|
+
*/
|
|
7779
8319
|
private formatYearAriaLabel;
|
|
7780
8320
|
trackByYear(index: number, cell: YearCell): number;
|
|
7781
8321
|
trackByRow(index: number, row: YearCell[]): string;
|
|
7782
8322
|
onYearClicked(cell: YearCell): void;
|
|
8323
|
+
/**
|
|
8324
|
+
* Moves the roving tabindex across the year grid. Picking a year stays on
|
|
8325
|
+
* click/Enter/Space, which the cells are already buttons for.
|
|
8326
|
+
*
|
|
8327
|
+
* Moves past either end of the 24-year page emit an `activeDateChange` like the
|
|
8328
|
+
* header's paging buttons do, and the grid re-renders on the neighbouring page.
|
|
8329
|
+
*/
|
|
8330
|
+
onKeydown(event: KeyboardEvent): void;
|
|
8331
|
+
/**
|
|
8332
|
+
* The year a key aims at, and which way to look from there when that year is disabled.
|
|
8333
|
+
*
|
|
8334
|
+
* The search direction belongs to the key, not to where the target happens to fall
|
|
8335
|
+
* relative to the current year. Home and End mean "the ends of *this* page", so they
|
|
8336
|
+
* search inward: looking outward would step onto the neighbouring 24-year page over a
|
|
8337
|
+
* single ruled-out boundary year and turn the page, which is not what either key
|
|
8338
|
+
* promises. The arrows and the paging keys keep travelling the way they were already
|
|
8339
|
+
* headed, and moving onto the next page is the point of those.
|
|
8340
|
+
*/
|
|
8341
|
+
private targetForKey;
|
|
8342
|
+
/**
|
|
8343
|
+
* Steps past years the caller has disabled, so `minDate`/`maxDate` don't park focus
|
|
8344
|
+
* somewhere unusable.
|
|
8345
|
+
*
|
|
8346
|
+
* Searches the way the key asked for (see `targetForKey`), then doubles back if that
|
|
8347
|
+
* finds nothing. The fallback is for the ends of the allowed range: arrowing right at
|
|
8348
|
+
* `maxDate` finds nothing ahead, doubles back onto the year we started from, and the
|
|
8349
|
+
* caller reads that as "don't move".
|
|
8350
|
+
*/
|
|
8351
|
+
private nearestEnabledYear;
|
|
8352
|
+
/** Bounded, so an everything-disabled range stops the move instead of spinning. */
|
|
8353
|
+
private scanForEnabledYear;
|
|
7783
8354
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<TnMultiYearViewComponent, never>;
|
|
7784
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMultiYearViewComponent, "tn-multi-year-view", never, { "activeDate": { "alias": "activeDate"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; }, never, never, true, never>;
|
|
8355
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<TnMultiYearViewComponent, "tn-multi-year-view", never, { "activeDate": { "alias": "activeDate"; "required": false; "isSignal": true; }; "selected": { "alias": "selected"; "required": false; "isSignal": true; }; "minDate": { "alias": "minDate"; "required": false; "isSignal": true; }; "maxDate": { "alias": "maxDate"; "required": false; "isSignal": true; }; "dateFilter": { "alias": "dateFilter"; "required": false; "isSignal": true; }; "locale": { "alias": "locale"; "required": false; "isSignal": true; }; }, { "selectedChange": "selectedChange"; "activeDateChange": "activeDateChange"; }, never, never, true, never>;
|
|
7785
8356
|
}
|
|
7786
8357
|
|
|
7787
8358
|
declare class TnDateInputComponent implements ControlValueAccessor, OnInit, OnDestroy {
|
|
@@ -7803,9 +8374,7 @@ declare class TnDateInputComponent implements ControlValueAccessor, OnInit, OnDe
|
|
|
7803
8374
|
dayRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
|
|
7804
8375
|
yearRef: _angular_core.Signal<ElementRef<HTMLInputElement>>;
|
|
7805
8376
|
calendarTemplate: _angular_core.Signal<TemplateRef<unknown>>;
|
|
7806
|
-
calendar: _angular_core.Signal<TnCalendarComponent>;
|
|
7807
8377
|
wrapperEl: _angular_core.Signal<ElementRef<HTMLDivElement>>;
|
|
7808
|
-
private destroy$;
|
|
7809
8378
|
private overlayRef?;
|
|
7810
8379
|
private portal?;
|
|
7811
8380
|
isOpen: _angular_core.WritableSignal<boolean>;
|
|
@@ -10289,5 +10858,5 @@ declare const TN_THEME_DEFINITIONS: readonly TnThemeDefinition[];
|
|
|
10289
10858
|
*/
|
|
10290
10859
|
declare const THEME_MAP: Map<TnTheme, TnThemeDefinition>;
|
|
10291
10860
|
|
|
10292
|
-
export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, THEME_MAP, THEME_STORAGE_KEY, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_ERRORS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarComponent, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerHarness, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnFormSectionComponent, TnFormSectionHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, allowsCurrentDirectorySelection, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, getSelectableTypes, injectTnFormFieldAria, isPathWithinRoot, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, normalizeRootPath, optionTestId, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
|
|
10293
|
-
export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerCreateAction, FilePickerCreateActionEvent, FilePickerError, FilePickerHarnessFilters, FilePickerMode, FileSystemItem, FileSystemItemType, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnOptionTestIdSource, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipPosition, YearCell };
|
|
10861
|
+
export { CommonShortcuts, DEFAULT_THEME, DiskIconComponent, DiskType, FileSizePipe, InputType, LIGHT_THEME, LabelMarkupPipe, LabelTextPipe, LinuxModifierKeys, LinuxShortcuts, ModifierKeys, QuickShortcuts, ShortcutBuilder, THEME_MAP, THEME_STORAGE_KEY, TN_CALENDAR_INTL, TN_CALENDAR_INTL_DEFAULTS, TN_FORM_FIELD_CONTEXT, TN_FORM_FIELD_ERRORS, TN_TABLE_PAGER_DEFAULT_LABELS, TN_TABLE_PAGER_LABELS, TN_TEST_ATTR, TN_THEME_DEFINITIONS, TnAutocompleteComponent, TnAutocompleteHarness, TnBannerActionDirective, TnBannerComponent, TnBannerHarness, TnBrandedSpinnerComponent, TnButtonComponent, TnButtonHarness, TnButtonToggleComponent, TnButtonToggleGroupComponent, TnButtonToggleGroupHarness, TnButtonToggleHarness, TnCalendarCellHarness, TnCalendarComponent, TnCalendarHarness, TnCalendarHeaderComponent, TnCardComponent, TnCardFooterActionsDirective, TnCardHeaderActionsDirective, TnCardHeaderDirective, TnCellDefDirective, TnCheckboxComponent, TnCheckboxHarness, TnCheckboxLabelDirective, TnChipComponent, TnChipHarness, TnChipInputComponent, TnChipInputHarness, TnConfirmDialogComponent, TnDateInputComponent, TnDateInputHarness, TnDateRangeInputComponent, TnDateRangeInputHarness, TnDetailRowDefDirective, TnDialog, TnDialogHarness, TnDialogShellComponent, TnDialogTesting, TnDividerComponent, TnDividerDirective, TnDrawerComponent, TnDrawerContainerComponent, TnDrawerContainerHarness, TnDrawerContentComponent, TnDrawerHarness, TnEmptyComponent, TnEmptyHarness, TnExpansionPanelComponent, TnExpansionPanelHarness, TnFileInputComponent, TnFileInputHarness, TnFilePickerComponent, TnFilePickerHarness, TnFilePickerPopupComponent, TnFormFieldComponent, TnFormFieldHarness, TnFormSectionComponent, TnFormSectionHarness, TnHeaderCellDefDirective, TnIconButtonComponent, TnIconButtonHarness, TnIconComponent, TnIconHarness, TnIconRegistryService, TnIconTesting, TnInputComponent, TnInputDirective, TnInputHarness, TnKeyboardShortcutComponent, TnKeyboardShortcutService, TnListAvatarDirective, TnListComponent, TnListIconDirective, TnListItemComponent, TnListItemLineDirective, TnListItemPrimaryDirective, TnListItemSecondaryDirective, TnListItemTitleDirective, TnListItemTrailingDirective, TnListOptionComponent, TnListSubheaderComponent, TnMenuActivateHoverDirective, TnMenuComponent, TnMenuHarness, TnMenuItemComponent, TnMenuTesting, TnMenuTriggerDirective, TnMonthViewComponent, TnMultiYearViewComponent, TnNestedTreeDataSource, TnNestedTreeNodeComponent, TnParticleProgressBarComponent, TnProgressBarComponent, TnRadioComponent, TnRadioHarness, TnSelectComponent, TnSelectHarness, TnSelectionListComponent, TnSidePanelActionDirective, TnSidePanelComponent, TnSidePanelHarness, TnSidePanelHeaderActionDirective, TnSlideToggleComponent, TnSlideToggleHarness, TnSliderComponent, TnSliderThumbDirective, TnSliderWithLabelDirective, TnSpinnerComponent, TnSpriteLoaderService, TnStepComponent, TnStepperComponent, TnStepperHarness, TnStepperNextDirective, TnStepperPreviousDirective, TnTabComponent, TnTabHarness, TnTabPanelComponent, TnTabPanelHarness, TnTableColumnDirective, TnTableComponent, TnTableHarness, TnTablePagerComponent, TnTablePagerHarness, TnTabsComponent, TnTabsHarness, TnTestIdDirective, TnTheme, TnThemeService, TnTimeInputComponent, TnToastComponent, TnToastMock, TnToastPosition, TnToastRef, TnToastService, TnToastTesting, TnToastType, TnTooltipComponent, TnTooltipDirective, TnTreeComponent, TnTreeFlatDataSource, TnTreeFlattener, TnTreeHarness, TnTreeNodeComponent, TnTreeNodeHarness, TnTreeNodeOutletDirective, TnTreeVirtualScrollNodeOutletDirective, TnTreeVirtualScrollViewComponent, TnTreeVirtualScrollViewHarness, TruncatePathPipe, WindowsModifierKeys, WindowsShortcuts, allowsCurrentDirectorySelection, composeTestId, controlTestId, createFlatTreeControl, createLucideLibrary, createNestedTreeControl, createShortcut, defaultSpriteBasePath, defaultSpriteConfigPath, defaultTreeItemSize, formatSize, getSelectableTypes, injectTnCalendarIntl, injectTnFormFieldAria, isPathWithinRoot, kebabTestSegment, labelMarkupToHtml, labelMarkupToText, libIconMarker, normalizeRootPath, optionTestId, parseLabelMarkup, parseSize, registerLucideIcons, scopeTestId, setupLucideIntegration, tnIconMarker, writeTestId };
|
|
10862
|
+
export type { AutocompleteHarnessFilters, BannerHarnessFilters, ButtonHarnessFilters, ButtonToggleHarnessFilters, CalendarCell, CalendarCellFill, CalendarCellHarnessFilters, CalendarHarnessFilters, CheckboxHarnessFilters, ChipColor, ChipHarnessFilters, DateInputHarnessFilters, DateRange, DateRangeInputHarnessFilters, DialogHarnessFilters, EmptyHarnessFilters, ExpansionPanelHarnessFilters, FileInputHarnessFilters, FilePickerCallbacks, FilePickerCreateAction, FilePickerCreateActionEvent, FilePickerError, FilePickerHarnessFilters, FilePickerMode, FileSystemItem, FileSystemItemType, FlatTreeControlOptions, FormFieldHarnessFilters, FormSectionHarnessFilters, IconButtonHarnessFilters, IconHarnessFilters, IconLibrary, IconLibraryType, IconResult, IconSize, IconSource, IconTestingMockOverrides, InputHarnessFilters, KeyCombination, LabelMarkupSegment, LabelMarkupSegmentType, LabelType, LucideIconOptions, MenuHarnessFilters, MockIconRegistry, MockSpriteLoader, NestedTreeControlOptions, PathSegment, PlatformType, ProgressBarMode, RadioHarnessFilters, ResolvedIcon, SelectHarnessFilters, ShortcutHandler, SidePanelHarnessFilters, SizeStandard, SlideToggleColor, SlideToggleHarnessFilters, SpinnerMode, SpriteConfig, StepperHarnessFilters, SubscriptSizing, TabChangeEvent, TabHarnessFilters, TabPanelHarnessFilters, TabsHarnessFilters, TnAutocompleteOption, TnBannerType, TnButtonToggleType, TnCalendarIntl, TnCalendarIntlInput, TnCalendarView, TnCardAction, TnCardControl, TnCardFooterLink, TnCardHeaderStatus, TnChipInputHarnessFilters, TnChipInputOption, TnConfirmDialogData, TnDialogDefaults, TnDialogOpenTarget, TnDrawerMode, TnDrawerPosition, TnEmptySize, TnFlatTreeNode, TnFormFieldAriaBindings, TnFormFieldContext, TnFormFieldErrorMessage, TnFormFieldErrorMessages, TnFormFieldErrorResolver, TnMenuItem, TnOptionTestIdSource, TnSelectOption, TnSelectOptionGroup, TnSelectionChange, TnSortEvent, TnTableDataProvider, TnTableDataSource, TnTableHarnessFilters, TnTablePagerHarnessFilters, TnTablePagerLabels, TnTablePagination, TnTestAttrName, TnTestIdValue, TnThemeDefinition, TnToastCall, TnToastConfig, TnTreeExpansion, TnTreeHarnessFilters, TnTreeNodeHarnessFilters, TnTreeVirtualNodeData, TnTreeVirtualScrollViewHarnessFilters, TooltipPosition, YearCell };
|