@quadrel-enterprise-ui/framework 20.26.2 → 20.27.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -3355,6 +3355,7 @@ declare class QdMockFilterItemDateRangeComponent {
3355
3355
  timePickerConfig?: QdFormTimepickerConfiguration;
3356
3356
  testId: any;
3357
3357
  get dataTestId(): string;
3358
+ open(): void;
3358
3359
  static ɵfac: i0.ɵɵFactoryDeclaration<QdMockFilterItemDateRangeComponent, never>;
3359
3360
  static ɵcmp: i0.ɵɵComponentDeclaration<QdMockFilterItemDateRangeComponent, "qd-filter-item-date-range", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "itemIndex": { "alias": "itemIndex"; "required": false; }; "timePickerConfig": { "alias": "timePickerConfig"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, {}, never, never, false, never>;
3360
3361
  }
@@ -3412,12 +3413,15 @@ declare class QdMockFilterService {
3412
3413
  private postBodyWithEmptyDefaultSubjects;
3413
3414
  private categoryByIdSubject;
3414
3415
  private itemByIdSubject;
3416
+ private loadingSubject;
3415
3417
  initializeFilterState(): void;
3416
3418
  updateFilterState(): void;
3417
3419
  getFilterState(): void;
3418
3420
  setFilterSelection: any;
3419
3421
  updateItem: any;
3420
3422
  setItemIsActive: any;
3423
+ clearCategorySelection: any;
3424
+ setItemsLoading: any;
3421
3425
  selectFilterDataById$: any;
3422
3426
  getQueryString$(filterId: any): Observable<string>;
3423
3427
  getFilterUrlParameter$(filterId: any): Observable<string>;
@@ -3426,6 +3430,7 @@ declare class QdMockFilterService {
3426
3430
  getPostBodyWithEmptyDefault$(filterId: any): Observable<QdFilterPostBodyData>;
3427
3431
  getCategoryById$(filterId: any): Observable<any>;
3428
3432
  getItemById$(filterId: any): Observable<any>;
3433
+ getItemsLoading$(filterId: any): Observable<boolean>;
3429
3434
  getQueryStringSubject(filterId: any): Subject<string>;
3430
3435
  getFilterUrlParameterSubject(filterId: any): Subject<string>;
3431
3436
  getPostBodySubject(filterId: any): Subject<QdFilterPostBodyData>;
@@ -3434,6 +3439,7 @@ declare class QdMockFilterService {
3434
3439
  getMaxDate$: any;
3435
3440
  emitCategory(value: any, filterId: any): void;
3436
3441
  emitItem(value: any, filterId: any): void;
3442
+ emitLoading(value: any, filterId: any): void;
3437
3443
  static ɵfac: i0.ɵɵFactoryDeclaration<QdMockFilterService, never>;
3438
3444
  static ɵprov: i0.ɵɵInjectableDeclaration<QdMockFilterService>;
3439
3445
  }
@@ -5190,6 +5196,7 @@ interface QdPopoverSizeConstraints {
5190
5196
  * - The returned Observable emits `true` once initial sizing is applied and overlay is visible.
5191
5197
  * - Even if autosize is turned off, the minimum and maximum width or height constraints are always enforced as hard limits.
5192
5198
  * - This means the popover can never be smaller or larger than the values you set, no matter what content it contains.
5199
+ * - The width is also capped to the current screen width, so the popover never reaches past the screen edge — even if a larger maxWidth is set.
5193
5200
  *
5194
5201
  * #### For the hidden-content measuring
5195
5202
  * @see https://stackoverflow.com/questions/1841124/find-the-potential-width-of-a-hidden-element
@@ -5209,6 +5216,7 @@ declare class QdPopoverSizingService {
5209
5216
  observe(host: HTMLElement, popover: HTMLElement, overlayRef: OverlayRef, autoSize: QdPopoverAutoSizeConfig, constraints: QdPopoverSizeConstraints): Observable<boolean>;
5210
5217
  private showOverlay;
5211
5218
  private hideOverlay;
5219
+ private resolveWidthLimits;
5212
5220
  private applySize;
5213
5221
  private measureContentSize;
5214
5222
  disconnect(): void;
@@ -5223,6 +5231,26 @@ declare class QdPopoverParentService {
5223
5231
  static ɵprov: i0.ɵɵInjectableDeclaration<QdPopoverParentService>;
5224
5232
  }
5225
5233
 
5234
+ /**
5235
+ * **QdPopoverOnClickDirective**
5236
+ *
5237
+ * Shows a popover next to its host element and opens or closes it on host click.
5238
+ *
5239
+ * It is an internal building block. Quadrel components such as dropdowns, menu buttons and
5240
+ * filters build on it; consumers do not use it directly.
5241
+ *
5242
+ * #### Features:
5243
+ * - Opens the popover on click and closes it on the next click or an outside click.
5244
+ * - With `qdPopoverEnableKeyControl`, Enter and Space open it, Escape and Tab close it.
5245
+ * - Sizes the popover to its host or content within the min/max limits, and never wider than the screen.
5246
+ * - Places it with the Angular CDK; with `qdPopoverFlipIntoViewport` it opens to the side that has room instead of off the screen edge.
5247
+ * - Keeps only one popover open: opening one closes the others, but a nested popover keeps its parents open.
5248
+ *
5249
+ * #### Notes & Best Practices
5250
+ * - Emits `opened` and `closed` so consumers can react.
5251
+ * - The flip is opt-in, so popovers that already sit correctly stay as they are.
5252
+ * - Not part of the public API; use the higher-level components like `qd-dropdown` or `qd-menu-button` instead.
5253
+ */
5226
5254
  declare class QdPopoverOnClickDirective implements OnInit, OnDestroy {
5227
5255
  protected hostRef: ElementRef<HTMLElement>;
5228
5256
  protected overlayPositionBuilder: OverlayPositionBuilder;
@@ -5241,6 +5269,7 @@ declare class QdPopoverOnClickDirective implements OnInit, OnDestroy {
5241
5269
  qdPopoverMaxWidth: number | 'none';
5242
5270
  qdPopoverAutoSize: QdPopoverAutoSizeConfig;
5243
5271
  qdPopoverEnableKeyControl: boolean;
5272
+ qdPopoverFlipIntoViewport: boolean;
5244
5273
  readonly opened: EventEmitter<any>;
5245
5274
  readonly closed: EventEmitter<any>;
5246
5275
  handleClick(event: MouseEvent): void;
@@ -5251,14 +5280,26 @@ declare class QdPopoverOnClickDirective implements OnInit, OnDestroy {
5251
5280
  private _host;
5252
5281
  private _popoverRef;
5253
5282
  private _positionStrategyInstance;
5283
+ private _resolvedPositions;
5254
5284
  private _subscriptions;
5255
5285
  constructor();
5256
5286
  ngOnInit(): void;
5257
5287
  ngOnDestroy(): void;
5258
5288
  open(): void;
5289
+ /**
5290
+ * Re-aligns an open overlay with its origin element.
5291
+ *
5292
+ * The connected position is only recomputed on scroll/resize, not when a
5293
+ * layout reflow moves the origin (e.g. a chip or action buttons appearing in
5294
+ * the host). Call this after such a reflow to keep the overlay attached to the
5295
+ * host. Deferred by one frame so the new layout is measured, and a no-op while
5296
+ * the overlay is detached, so it stays cheap to call on discrete events.
5297
+ */
5298
+ updatePosition(): void;
5259
5299
  close(): void;
5260
5300
  private popoverInstance;
5261
5301
  private initPositionStrategy;
5302
+ private withHorizontalFallbacks;
5262
5303
  private createOverlay;
5263
5304
  private runSizingAndOpen;
5264
5305
  private setPopoverContent;
@@ -5268,7 +5309,7 @@ declare class QdPopoverOnClickDirective implements OnInit, OnDestroy {
5268
5309
  private unsubscribeAll;
5269
5310
  private cleanup;
5270
5311
  static ɵfac: i0.ɵɵFactoryDeclaration<QdPopoverOnClickDirective, never>;
5271
- static ɵdir: i0.ɵɵDirectiveDeclaration<QdPopoverOnClickDirective, "[qdPopoverOnClick]", ["qdPopoverOnClick"], { "qdPopoverOnClick": { "alias": "qdPopoverOnClick"; "required": false; }; "positionStrategy": { "alias": "positionStrategy"; "required": false; }; "qdPopoverCloseStrategy": { "alias": "qdPopoverCloseStrategy"; "required": false; }; "qdPopoverDisabled": { "alias": "qdPopoverDisabled"; "required": false; }; "qdPopoverStopPropagation": { "alias": "qdPopoverStopPropagation"; "required": false; }; "qdPopoverBackgroundColor": { "alias": "qdPopoverBackgroundColor"; "required": false; }; "qdPopoverMaxHeight": { "alias": "qdPopoverMaxHeight"; "required": false; }; "qdPopoverMinWidth": { "alias": "qdPopoverMinWidth"; "required": false; }; "qdPopoverMaxWidth": { "alias": "qdPopoverMaxWidth"; "required": false; }; "qdPopoverAutoSize": { "alias": "qdPopoverAutoSize"; "required": false; }; "qdPopoverEnableKeyControl": { "alias": "qdPopoverEnableKeyControl"; "required": false; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, false, never>;
5312
+ static ɵdir: i0.ɵɵDirectiveDeclaration<QdPopoverOnClickDirective, "[qdPopoverOnClick]", ["qdPopoverOnClick"], { "qdPopoverOnClick": { "alias": "qdPopoverOnClick"; "required": false; }; "positionStrategy": { "alias": "positionStrategy"; "required": false; }; "qdPopoverCloseStrategy": { "alias": "qdPopoverCloseStrategy"; "required": false; }; "qdPopoverDisabled": { "alias": "qdPopoverDisabled"; "required": false; }; "qdPopoverStopPropagation": { "alias": "qdPopoverStopPropagation"; "required": false; }; "qdPopoverBackgroundColor": { "alias": "qdPopoverBackgroundColor"; "required": false; }; "qdPopoverMaxHeight": { "alias": "qdPopoverMaxHeight"; "required": false; }; "qdPopoverMinWidth": { "alias": "qdPopoverMinWidth"; "required": false; }; "qdPopoverMaxWidth": { "alias": "qdPopoverMaxWidth"; "required": false; }; "qdPopoverAutoSize": { "alias": "qdPopoverAutoSize"; "required": false; }; "qdPopoverEnableKeyControl": { "alias": "qdPopoverEnableKeyControl"; "required": false; }; "qdPopoverFlipIntoViewport": { "alias": "qdPopoverFlipIntoViewport"; "required": false; }; }, { "opened": "opened"; "closed": "closed"; }, never, never, false, never>;
5272
5313
  }
5273
5314
 
5274
5315
  /**
@@ -6288,6 +6329,7 @@ declare class QdDatepickerComponent implements ControlValueAccessor, OnInit, OnC
6288
6329
  registerOnTouched(fn: () => void): void;
6289
6330
  writeValue(date: Date): void;
6290
6331
  setDisabledState(disabled: boolean): void;
6332
+ open(): void;
6291
6333
  handleUpdatedDate($rawValue: QdInputRawEventValue): void;
6292
6334
  handleUpdatedTime($event: string): void;
6293
6335
  handleUpdatedDateTime($rawValue: QdInputRawEventValue): void;
@@ -11521,6 +11563,7 @@ declare class QdFilterService {
11521
11563
  private queryStringSubjects;
11522
11564
  private filterUrlParameterSubjects;
11523
11565
  private postBodySubjects;
11566
+ private itemsLoadingSubjects;
11524
11567
  getItems$(filterId: any, categoryIndex: any): Observable<any>;
11525
11568
  getItemById$(filterId: any, categoryIndex: any, itemIndex: any): Observable<QdFilterItem>;
11526
11569
  getMinDate$(filterId: any, categoryIndex: any, itemIndex: any): Observable<string | undefined>;
@@ -11540,6 +11583,7 @@ declare class QdFilterService {
11540
11583
  selectFilterDataById$(filterId: any): Observable<QdFilterCategory[]>;
11541
11584
  selectHasActiveCategory$(filterId: any): Observable<boolean>;
11542
11585
  getCategoryById$(filterId: any, categoryIndex: any): Observable<any>;
11586
+ getItemsLoading$(filterId: any, categoryIndex: any): Observable<boolean>;
11543
11587
  getFilterCategoryValue$(filterId: any, categoryIndex: any): Observable<any>;
11544
11588
  /**
11545
11589
  * Action dispatcher
@@ -11555,6 +11599,9 @@ declare class QdFilterService {
11555
11599
  resetEmissionReplaySubjects(filterId: any): void;
11556
11600
  setCategoryFilter(filterId: any, categoryIndex: number, filter: string): void;
11557
11601
  resetCategoryFilter(filterId: string, categoryIndex: number): void;
11602
+ clearCategorySelection(filterId: string, categoryIndex: number): void;
11603
+ setItemsLoading(filterId: string, categoryIndex: number, loading: boolean): void;
11604
+ private getItemsLoadingSubject;
11558
11605
  private getQueryStringSubject;
11559
11606
  private getFilterUrlParameterSubject;
11560
11607
  private getPostBodySubject;
@@ -11563,43 +11610,123 @@ declare class QdFilterService {
11563
11610
  }
11564
11611
 
11565
11612
  /**
11566
- * The **QdFilter** is responsible for the filtering of data.
11613
+ * **QdFilterComponent** lets users build and apply a filter with several categories over a data set.
11614
+ *
11615
+ * #### **Features**
11616
+ *
11617
+ * - **Category types**: single and multi select dropdowns, a boolean toggle, date and date-time pickers, date and date-time ranges, and free text. A select dropdown can also show a filter field that narrows the item list.
11618
+ * - **Outputs**: react to the applied selection through the query-string and post-body outputs, or read the current selection at any time.
11619
+ * - **Multi-staging**: chain categories so one stage loads its items from the selection of another.
11620
+ * - **URL sync**: the selection is kept in the URL, so a view can be shared, bookmarked, and reopened.
11621
+ *
11622
+ * #### **Quick start**
11623
+ *
11624
+ * **1. Add the filter to the template**
11625
+ *
11626
+ * ```html
11627
+ * <qd-filter
11628
+ * [filterData]="myFilterConfig"
11629
+ * (queryStringOutput)="callBackendWithQueryString($event)"
11630
+ * (postBodyOutput)="callBackendWithResultObject($event)"
11631
+ * ></qd-filter>
11632
+ * ```
11633
+ *
11634
+ * **2. Define the config in your component**
11635
+ *
11636
+ * ```typescript
11637
+ * myFilterConfig: QdFilterConfigData = {
11638
+ * categories: [
11639
+ * {
11640
+ * type: 'singleSelect',
11641
+ * category: 'controlObject',
11642
+ * i18n: 'i18n.my.category.controlObject',
11643
+ * items: [
11644
+ * { item: 'vehicle', i18n: 'i18n.my.item.vehicle', active: true },
11645
+ * { item: 'article', i18n: 'i18n.my.item.article' }
11646
+ * ],
11647
+ * filter: true
11648
+ * },
11649
+ * {
11650
+ * type: 'multiSelect',
11651
+ * category: 'enrollmentCountry',
11652
+ * i18n: 'i18n.my.category.enrollmentCountry',
11653
+ * items: [
11654
+ * { item: 'de', i18n: 'i18n.my.item.de' },
11655
+ * { item: 'ch', i18n: 'i18n.my.item.ch' }
11656
+ * ]
11657
+ * }
11658
+ * ],
11659
+ * uid: 'overview-filter'
11660
+ * };
11661
+ * ```
11662
+ *
11663
+ * The `filterData` input is the only configuration. It holds the categories and the behavior flags.
11567
11664
  *
11568
- * Hirarchical structure::
11569
- * - **Filter**: Name of the component.
11570
- * - **Categories**: A list of one or more different categories.
11571
- * - **Items**: A list with one or more items belongs to a parent category.
11665
+ * #### **Category types**
11572
11666
  *
11573
- * ### Filter selection ###
11667
+ * A category sets its type to one of: singleSelect, multiSelect, boolean, date, dateTime,
11668
+ * dateRange, dateTimeRange or freeText. Single and multi select show a dropdown, boolean is a
11669
+ * toggle, the date types open a picker (the date-time variants add a time picker), and free text
11670
+ * is a text field applied on enter.
11574
11671
  *
11575
- * To get the applied filters you can listen to the outputs `(queryStringOutput)` and `(postBodyOutput)`.
11576
- * These outputs will be emitted when the filter is triggered. The `(queryStringOutput)` returns
11577
- * the applied filters as an url string with an encoded *filter* parameter. The `(postBodyOutput)`
11578
- * yields an object containing the categories and active items.
11672
+ * On a single or multi select you can add a filter field above the items with `filter: true` to
11673
+ * narrow the item list. It has no effect on the other types.
11579
11674
  *
11580
- * In addition to the outputs, you also can query the current filter selection with the
11581
- * filter component methods `getCurrentQueryString`, `getCurrentFilterUrlParameterString` and `getCurrentPostBody`.
11675
+ * #### **Filter selection**
11582
11676
  *
11583
- * ### Preserve filter state ###
11677
+ * Listen to the outputs to react when the user applies the filter. The query-string output gives
11678
+ * the selection as a URL string (for example filter=...); the post-body output gives it as an
11679
+ * object with the active categories and their values.
11584
11680
  *
11585
- * To preserve the filter state when navigating, for example between detail and overview page, you just have to define
11586
- * a uid in the filter data config.
11681
+ * The outputs fire when the user applies the filter, on reset (only when a preselection exists),
11682
+ * when the last active item is removed, and on load if a category starts active.
11587
11683
  *
11588
- * ### Multi Staging Filters
11684
+ * To read the selection without waiting for an apply, call `getCurrentQueryString` or
11685
+ * `getCurrentPostBody`, or subscribe to `getFilterChanges$` for a continuous stream.
11589
11686
  *
11590
- * To build a dependency chain of filters you can use the `dependsOn` property of a filter that depends on
11591
- * other filters. In the `dependsOn` property you set the names of the filter categories the category depends on.
11592
- * Always when one of these categories change the `itemsResolver` will be called with the list
11593
- * of categories given in `dependsOn`. The `itemsResolver` can also be defined in the config where `dependsOn`
11594
- * is also defined.
11687
+ * #### **Multi-staging filters**
11595
11688
  *
11596
- * If the items resolver has not been called yet or when it returns an empty array of items,
11597
- * the corresponding filter stage won't be rendered.
11689
+ * To chain categories, give one a `dependsOn` list and an `itemsResolver`. In `dependsOn` you
11690
+ * name the parent categories. The resolver receives the active parents and returns the items for
11691
+ * this stage.
11598
11692
  *
11599
- * #### Support
11693
+ * ```typescript
11694
+ * const cityCategory: QdDependentFilterCategory = {
11695
+ * type: 'multiSelect',
11696
+ * category: 'city',
11697
+ * i18n: 'i18n.my.category.city',
11698
+ * dependsOn: ['country'],
11699
+ * itemsResolver: ([country]) =>
11700
+ * loadCitiesFor(country.items.filter(item => item.active)),
11701
+ * filter: true
11702
+ * };
11703
+ * ```
11600
11704
  *
11601
- * Multi Staging Filters only work for `singleSelect` and `multiSelect` filters.
11705
+ * The stage appears once every parent has an active item. While its items load, the open
11706
+ * dropdown shows a loading text instead of the list. If the resolver returns nothing, the list
11707
+ * stays empty. Multi-staging works only for single and multi select categories.
11602
11708
  *
11709
+ * #### **URL synchronization**
11710
+ *
11711
+ * The filter keeps its selection in the URL filter parameter: it is saved when the selection
11712
+ * changes and read back when the page opens, so a user can share or bookmark the URL and return
11713
+ * to the same filter.
11714
+ *
11715
+ * This is on by default. With more than one filter in a view, only one may own the URL, so set
11716
+ * `connectWithRouter` to false on every other filter.
11717
+ *
11718
+ * #### **Preserve filter state**
11719
+ *
11720
+ * Give the config a stable `uid` to keep the selection while the user moves around the app, for
11721
+ * example from an overview to a detail page and back. The selection is restored the next time a
11722
+ * filter with the same `uid` is shown.
11723
+ *
11724
+ * #### **Reset behavior**
11725
+ *
11726
+ * An item set to active is a preselection. The reset button reads "Reset" when there is no
11727
+ * preselection, and "Back to preselection" when the config starts with active items. It restores
11728
+ * the initial state. With instant filtering (`isInstantFiltering`) the apply and reset buttons
11729
+ * are hidden and the filter applies on every change.
11603
11730
  */
11604
11731
  declare class QdFilterComponent implements OnInit, OnChanges, OnDestroy {
11605
11732
  readonly filterService: QdFilterService;
@@ -11846,6 +11973,7 @@ declare class QdFilterItemDateComponent implements OnInit, OnDestroy {
11846
11973
  clickTimePlaceholder: EventEmitter<boolean>;
11847
11974
  testId: string;
11848
11975
  get dataTestId(): string;
11976
+ private datepicker?;
11849
11977
  datepickerConfig: QdFormDatepickerConfiguration;
11850
11978
  item: Date;
11851
11979
  private _destroyed$;
@@ -11853,36 +11981,12 @@ declare class QdFilterItemDateComponent implements OnInit, OnDestroy {
11853
11981
  ngOnDestroy(): void;
11854
11982
  handleDateChange(date: Date): void;
11855
11983
  handleClickTimePlaceholder($event: boolean): void;
11984
+ open(): void;
11856
11985
  private subscribeGetItem;
11857
11986
  static ɵfac: i0.ɵɵFactoryDeclaration<QdFilterItemDateComponent, never>;
11858
11987
  static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemDateComponent, "qd-filter-item-date", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "itemIndex": { "alias": "itemIndex"; "required": false; }; "timePickerConfig": { "alias": "timePickerConfig"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, { "clickTimePlaceholder": "clickTimePlaceholder"; }, never, never, false, never>;
11859
11988
  }
11860
11989
 
11861
- declare class QdFilterItemDateRangeCategoryComponent implements OnInit {
11862
- private readonly filterService;
11863
- filterId: string;
11864
- categoryIndex: number;
11865
- testId: string;
11866
- timePickerConfig?: QdFormTimepickerConfiguration;
11867
- i18n$: Observable<string>;
11868
- fromItem$: Observable<QdFilterItem>;
11869
- fromItemIndex: number;
11870
- fromItemTimePickerConfig: QdFormTimepickerConfiguration;
11871
- fromItemTimePlaceholderClicked: boolean;
11872
- untilItem$: Observable<QdFilterItem>;
11873
- untilItemIndex: number;
11874
- untilItemTimePickerConfig: QdFormTimepickerConfiguration;
11875
- untilItemTimePlaceholderClicked: boolean;
11876
- ngOnInit(): void;
11877
- removeItem(itemIndex: any): void;
11878
- handleFromTimePlaceholderClicked($event: boolean): void;
11879
- handleUntilTimePlaceholderClicked($event: boolean): void;
11880
- private setCategoryI18n;
11881
- private setFromItem;
11882
- static ɵfac: i0.ɵɵFactoryDeclaration<QdFilterItemDateRangeCategoryComponent, never>;
11883
- static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemDateRangeCategoryComponent, "qd-filter-category-date-range", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; "timePickerConfig": { "alias": "timePickerConfig"; "required": false; }; }, {}, never, never, false, never>;
11884
- }
11885
-
11886
11990
  declare class QdFilterItemDateRangeComponent implements OnInit, OnDestroy {
11887
11991
  private readonly filterService;
11888
11992
  filterId: string;
@@ -11896,6 +12000,8 @@ declare class QdFilterItemDateRangeComponent implements OnInit, OnDestroy {
11896
12000
  private _destroyed$;
11897
12001
  get itemClassName(): string;
11898
12002
  get dataTestId(): string;
12003
+ private datepicker?;
12004
+ open(): void;
11899
12005
  get minDate$(): Observable<string | undefined>;
11900
12006
  get maxDate$(): Observable<string | undefined>;
11901
12007
  ngOnInit(): void;
@@ -11909,6 +12015,32 @@ declare class QdFilterItemDateRangeComponent implements OnInit, OnDestroy {
11909
12015
  static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemDateRangeComponent, "qd-filter-item-date-range", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "itemIndex": { "alias": "itemIndex"; "required": false; }; "timePickerConfig": { "alias": "timePickerConfig"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, { "clickTimePlaceholder": "clickTimePlaceholder"; }, never, never, false, never>;
11910
12016
  }
11911
12017
 
12018
+ declare class QdFilterItemDateRangeCategoryComponent implements OnInit {
12019
+ private readonly filterService;
12020
+ filterId: string;
12021
+ categoryIndex: number;
12022
+ testId: string;
12023
+ timePickerConfig?: QdFormTimepickerConfiguration;
12024
+ i18n$: Observable<string>;
12025
+ fromItem$: Observable<QdFilterItem>;
12026
+ fromItemIndex: number;
12027
+ fromItemTimePickerConfig: QdFormTimepickerConfiguration;
12028
+ fromItemTimePlaceholderClicked: boolean;
12029
+ untilItem$: Observable<QdFilterItem>;
12030
+ untilItemIndex: number;
12031
+ untilItemTimePickerConfig: QdFormTimepickerConfiguration;
12032
+ untilItemTimePlaceholderClicked: boolean;
12033
+ ngOnInit(): void;
12034
+ openItem(itemRef: QdFilterItemDateRangeComponent, event: Event): void;
12035
+ removeItem(itemIndex: any): void;
12036
+ handleFromTimePlaceholderClicked($event: boolean): void;
12037
+ handleUntilTimePlaceholderClicked($event: boolean): void;
12038
+ private setCategoryI18n;
12039
+ private setFromItem;
12040
+ static ɵfac: i0.ɵɵFactoryDeclaration<QdFilterItemDateRangeCategoryComponent, never>;
12041
+ static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemDateRangeCategoryComponent, "qd-filter-category-date-range", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; "timePickerConfig": { "alias": "timePickerConfig"; "required": false; }; }, {}, never, never, false, never>;
12042
+ }
12043
+
11912
12044
  declare class QdFilterItemFreeTextComponent implements OnInit, OnDestroy {
11913
12045
  private readonly filterService;
11914
12046
  filterId: string;
@@ -11921,6 +12053,7 @@ declare class QdFilterItemFreeTextComponent implements OnInit, OnDestroy {
11921
12053
  i18n: any;
11922
12054
  get dataTestId(): string;
11923
12055
  get value(): string;
12056
+ inputValue: string;
11924
12057
  private _destroyed$;
11925
12058
  ngOnInit(): void;
11926
12059
  ngOnDestroy(): void;
@@ -11931,8 +12064,14 @@ declare class QdFilterItemFreeTextComponent implements OnInit, OnDestroy {
11931
12064
  static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemFreeTextComponent, "qd-filter-item-free-text", never, { "filterId": { "alias": "filterId"; "required": false; }; "isInstantFiltering": { "alias": "isInstantFiltering"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "itemIndex": { "alias": "itemIndex"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, { "enterClick": "enterClick"; }, never, never, false, never>;
11932
12065
  }
11933
12066
 
12067
+ interface QdFilterItemEntry {
12068
+ item: QdFilterItem;
12069
+ itemIndex: number;
12070
+ }
11934
12071
  declare class QdFilterItemSelectCategoryComponent implements OnInit {
11935
12072
  private readonly filterService;
12073
+ private readonly breakpointService;
12074
+ readonly isMobile$: Observable<boolean>;
11936
12075
  filterId: string;
11937
12076
  categoryIndex: number;
11938
12077
  testId: string;
@@ -11944,10 +12083,18 @@ declare class QdFilterItemSelectCategoryComponent implements OnInit {
11944
12083
  items: QdFilterItem[];
11945
12084
  dependsOn: string[];
11946
12085
  showSelectButton$: Observable<boolean>;
12086
+ itemsLoading$: Observable<boolean>;
11947
12087
  positionStrategy: ConnectedPosition[];
11948
12088
  maxFlyoutHeight: number;
11949
12089
  private _destroyRef;
12090
+ private frozenSelectedKeys;
12091
+ private frozenUnselectedKeys;
11950
12092
  get closeButton(): boolean;
12093
+ get activeItemCount(): number;
12094
+ get selectedDropdownEntries(): QdFilterItemEntry[];
12095
+ get unselectedDropdownEntries(): QdFilterItemEntry[];
12096
+ get showSelectedSeparator(): boolean;
12097
+ get hasNoVisibleItems(): boolean;
11951
12098
  get buttonClassName(): string;
11952
12099
  get layerContentClassName(): string;
11953
12100
  get filterCategoryValue$(): Observable<string>;
@@ -11956,9 +12103,14 @@ declare class QdFilterItemSelectCategoryComponent implements OnInit {
11956
12103
  onLayerClosed(): void;
11957
12104
  closeLayer(): void;
11958
12105
  close(itemIndex: string): void;
12106
+ clearAll(): void;
12107
+ trackByItem(_index: number, entry: QdFilterItemEntry): string;
12108
+ private freezeDropdownOrder;
12109
+ private toEntries;
11959
12110
  changeValue($event: string): void;
11960
12111
  private initCategorySubscription;
11961
12112
  private initItemsSubscription;
12113
+ private haveSameItemKeys;
11962
12114
  private initShowSelectButton;
11963
12115
  static ɵfac: i0.ɵɵFactoryDeclaration<QdFilterItemSelectCategoryComponent, never>;
11964
12116
  static ɵcmp: i0.ɵɵComponentDeclaration<QdFilterItemSelectCategoryComponent, "qd-filter-category-select", never, { "filterId": { "alias": "filterId"; "required": false; }; "categoryIndex": { "alias": "categoryIndex"; "required": false; }; "testId": { "alias": "data-test-id"; "required": false; }; }, {}, never, never, false, never>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@quadrel-enterprise-ui/framework",
3
- "version": "20.26.2",
3
+ "version": "20.27.1",
4
4
  "exports": {
5
5
  "./jest-preset": "./jest-preset.js",
6
6
  "./package.json": {
@@ -33,6 +33,8 @@
33
33
  "i18n.qd.container.toolbar.filter.reset": "Zurücksetzen",
34
34
  "i18n.qd.container.toolbar.filter.backToPreSelect": "Zurück zur Vorauswahl",
35
35
  "i18n.qd.filter.layer.caption": "Filter",
36
+ "i18n.qd.filter.noResults": "Keine Treffer",
37
+ "i18n.qd.filter.loading": "Wird geladen …",
36
38
  "i18n.qd.filter.category.date": "Datum",
37
39
  "i18n.qd.filter.category.dateRange": "Datumsbereich",
38
40
  "i18n.qd.filter.date.on": "am",
@@ -33,6 +33,8 @@
33
33
  "i18n.qd.container.toolbar.filter.reset": "Reset",
34
34
  "i18n.qd.container.toolbar.filter.backToPreSelect": "Back to preselection",
35
35
  "i18n.qd.filter.layer.caption": "Filter",
36
+ "i18n.qd.filter.noResults": "No results",
37
+ "i18n.qd.filter.loading": "Loading …",
36
38
  "i18n.qd.filter.category.date": "Date",
37
39
  "i18n.qd.filter.category.dateRange": "Date range",
38
40
  "i18n.qd.filter.date.on": "on",
@@ -68,12 +70,10 @@
68
70
  "i18n.qd.input.units.percentage": "%",
69
71
  "i18n.qd.input.options.loading": "Suggestions are loading...",
70
72
  "i18n.qd.input.options.error": "Error loading suggestions",
71
-
72
73
  "i18n.qd.input.number.ambiguousHint.comma": "The entered value is interpreted according to the regional formatting and uses a comma (,) as the decimal separator.",
73
74
  "i18n.qd.input.number.ambiguousHint.dot": "The entered value is interpreted according to the regional formatting and uses a dot (.) as the decimal separator.",
74
75
  "i18n.qd.input.number.invalidCharacters.comma": "The entered value is invalid. Expected number format: \"123,45\".",
75
76
  "i18n.qd.input.number.invalidCharacters.dot": "The entered value is invalid. Expected number format: \"123.45\".",
76
-
77
77
  "i18n.qd.multiInput.label.tariffNumbers": "[en]Tarifnummern",
78
78
  "i18n.qd.multiInput.label.tariffNumbers.hint": "[en]Bitte erfassen Sie mindestens eine Tarifnummer.",
79
79
  "i18n.qd.multiInput.label.tariffNumbers.hintFormat": "[en]Bitte erfassen Sie mindestens eine Tarifnummer (Format: 9- od. 13-stellig).",
@@ -33,6 +33,8 @@
33
33
  "i18n.qd.container.toolbar.filter.reset": "Réinitialiser",
34
34
  "i18n.qd.container.toolbar.filter.backToPreSelect": "Retour à la présélection",
35
35
  "i18n.qd.filter.layer.caption": "Filtre",
36
+ "i18n.qd.filter.noResults": "Aucun résultat",
37
+ "i18n.qd.filter.loading": "Chargement …",
36
38
  "i18n.qd.filter.category.date": "Date",
37
39
  "i18n.qd.filter.category.dateRange": "Plage de dates",
38
40
  "i18n.qd.filter.date.on": "le",
@@ -68,12 +70,10 @@
68
70
  "i18n.qd.input.units.percentage": "%",
69
71
  "i18n.qd.input.options.loading": "[fr] Vorschläge werden geladen...",
70
72
  "i18n.qd.input.options.error": "[fr] Fehler beim Laden der Vorschläge",
71
-
72
73
  "i18n.qd.input.number.ambiguousHint.comma": "La valeur saisie est interprétée conformément au format régional et utilise une virgule (,) comme séparateur décimal.",
73
74
  "i18n.qd.input.number.ambiguousHint.dot": "La valeur saisie est interprétée conformément au format régional et utilise un point (.) comme séparateur décimal.",
74
75
  "i18n.qd.input.number.invalidCharacters.comma": "La valeur saisie est invalide. Format numérique attendu : « 123,45 ».",
75
76
  "i18n.qd.input.number.invalidCharacters.dot": "La valeur saisie est invalide. Format numérique attendu : « 123.45 ».",
76
-
77
77
  "i18n.qd.multiInput.label.tariffNumbers": "[fr]Tarifnummern",
78
78
  "i18n.qd.multiInput.label.tariffNumbers.hint": "[fr]Bitte erfassen Sie mindestens eine Tarifnummer.",
79
79
  "i18n.qd.multiInput.label.tariffNumbers.hintFormat": "[fr]Bitte erfassen Sie mindestens eine Tarifnummer (Format: 9- od. 13-stellig).",
@@ -33,6 +33,8 @@
33
33
  "i18n.qd.container.toolbar.filter.reset": "Azzerare",
34
34
  "i18n.qd.container.toolbar.filter.backToPreSelect": "Torna alla preselezione",
35
35
  "i18n.qd.filter.layer.caption": "Filtrare",
36
+ "i18n.qd.filter.noResults": "Nessun risultato",
37
+ "i18n.qd.filter.loading": "Caricamento …",
36
38
  "i18n.qd.filter.category.date": "Date",
37
39
  "i18n.qd.filter.category.dateRange": "Intervallo di date",
38
40
  "i18n.qd.filter.date.on": "il",
@@ -68,12 +70,10 @@
68
70
  "i18n.qd.input.units.percentage": "%",
69
71
  "i18n.qd.input.options.loading": "[it] Vorschläge werden geladen...",
70
72
  "i18n.qd.input.options.error": "[it] Fehler beim Laden der Vorschläge",
71
-
72
73
  "i18n.qd.input.number.ambiguousHint.comma": "Il valore inserito viene interpretato in base al formato regionale e utilizza una virgola (,) come separatore decimale.",
73
74
  "i18n.qd.input.number.ambiguousHint.dot": "Il valore inserito viene interpretato in base al formato regionale e utilizza un punto (.) come separatore decimale.",
74
75
  "i18n.qd.input.number.invalidCharacters.comma": "Il valore inserito non è valido. Formato numerico previsto: \"123,45\".",
75
76
  "i18n.qd.input.number.invalidCharacters.dot": "Il valore inserito non è valido. Formato numerico previsto: \"123.45\".",
76
-
77
77
  "i18n.qd.multiInput.label.tariffNumbers": "[it]Tarifnummern",
78
78
  "i18n.qd.multiInput.label.tariffNumbers.hint": "[it]Bitte erfassen Sie mindestens eine Tarifnummer.",
79
79
  "i18n.qd.multiInput.label.tariffNumbers.hintFormat": "[it]Bitte erfassen Sie mindestens eine Tarifnummer (Format: 9- od. 13-stellig).",