@sinequa/atomic-angular 0.1.39 → 0.1.46

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.
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
- import { input, output, Component, Injectable, inject, HostBinding, InjectionToken, computed, signal, effect, assertInInjectionContext, runInInjectionContext, Injector, EventEmitter, Inject, viewChild, ElementRef, afterNextRender, untracked, linkedSignal, model, DestroyRef, Directive, Renderer2, HostListener, contentChildren, contentChild, TemplateRef, Pipe, ChangeDetectorRef, LOCALE_ID, Optional, forwardRef, afterEveryRender, Output, viewChildren, ViewContainerRef } from '@angular/core';
3
- import { DropdownComponent, DropdownContentComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, DialogComponent, DialogHeaderComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, ListItemComponent, InputComponent, cn, SwitchComponent, DialogService, TabsComponent, TabComponent, searchVariants, SearchIconComponent, XMarkIConComponent, PopoverContentComponent, HorizontalDividerComponent, PopoverComponent, ChevronRightIconComponent, LoadingCircleIconComponent, CircleCheckIconComponent, CardComponent, CardHeaderComponent, CardContentComponent, CardFooterComponent, VerticalDividerComponent } from '@sinequa/ui';
2
+ import { input, output, Component, Injectable, inject, HostBinding, InjectionToken, computed, signal, effect, assertInInjectionContext, runInInjectionContext, Injector, EventEmitter, Inject, viewChild, ElementRef, afterNextRender, untracked, linkedSignal, model, DestroyRef, Directive, Renderer2, HostListener, contentChildren, contentChild, TemplateRef, Pipe, ChangeDetectorRef, LOCALE_ID, Optional, afterEveryRender, Output, viewChildren, ViewContainerRef } from '@angular/core';
3
+ import { DropdownComponent, DropdownContentComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, DialogComponent, DialogHeaderComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, ListItemComponent, InputComponent, cn, SwitchComponent, DialogService, TabsComponent, TabComponent, searchVariants, SearchIcon, XMarkIConComponent, PopoverContentComponent, HorizontalDividerComponent, PopoverComponent, ChevronRightIconComponent, LoadingCircleIconComponent, CircleCheckIconComponent, CardComponent, CardHeaderComponent, CardContentComponent, CardFooterComponent, VerticalDividerComponent } from '@sinequa/ui';
4
4
  import { BehaviorSubject, Subscription, catchError, EMPTY, firstValueFrom, map, Subject, of, tap, throwError, from, forkJoin, filter, shareReplay, fromEvent, switchMap, debounceTime } from 'rxjs';
5
5
  import { ActivatedRoute, Router, NavigationEnd, RouterLink, RouterModule } from '@angular/router';
6
6
  import { signalStore, signalStoreFeature, withState, withMethods, patchState, getState, withComputed } from '@ngrx/signals';
@@ -12,12 +12,14 @@ import { Location, DatePipe, DATE_PIPE_DEFAULT_TIMEZONE, DATE_PIPE_DEFAULT_OPTIO
12
12
  import { TranslocoPipe, provideTranslocoScope, TranslocoService } from '@jsverse/transloco';
13
13
  import { cva } from 'class-variance-authority';
14
14
  import * as i1 from '@angular/forms';
15
- import { FormsModule, NG_VALUE_ACCESSOR, ReactiveFormsModule, FormGroup, FormControl, NonNullableFormBuilder } from '@angular/forms';
15
+ import { FormsModule, ReactiveFormsModule, FormGroup, FormControl, NonNullableFormBuilder } from '@angular/forms';
16
16
  import { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';
17
17
  import highlightWords from 'highlight-words';
18
18
  import { catchError as catchError$1 } from 'rxjs/operators';
19
19
  import * as i1$1 from '@angular/cdk/drag-drop';
20
20
  import { DragDropModule } from '@angular/cdk/drag-drop';
21
+ import * as i2 from '@angular/cdk/a11y';
22
+ import { A11yModule } from '@angular/cdk/a11y';
21
23
  import { Overlay } from '@angular/cdk/overlay';
22
24
 
23
25
  class DropdownListComponent {
@@ -2021,7 +2023,13 @@ function withSavedSearchesFeatures() {
2021
2023
  if (!search)
2022
2024
  return undefined;
2023
2025
  const savedSearches = store.savedSearches();
2024
- return savedSearches?.find(savedSearch => savedSearch.display === search);
2026
+ return savedSearches?.find(savedSearch => {
2027
+ const queryParams = savedSearch.url.split('?')[1];
2028
+ if (!queryParams)
2029
+ return false;
2030
+ const q = queryParams.split('&').find(qp => qp.startsWith('q='));
2031
+ return !!q && decodeURI(q.substring(2)) === search;
2032
+ });
2025
2033
  }
2026
2034
  })));
2027
2035
  }
@@ -2173,19 +2181,7 @@ class ApplicationService {
2173
2181
  const firstQuery = queriesMap[0];
2174
2182
  // We need to create a route path object for each tab in the first query
2175
2183
  // if the query has no tabs, we create a route with the query name as the tab name
2176
- const firstQueryConfig = {
2177
- name: firstQuery.name,
2178
- tabs: (firstQuery.tabSearch.tabs && firstQuery.tabSearch.tabs.length
2179
- ? firstQuery.tabSearch.tabs
2180
- : [{
2181
- name: firstQuery.name,
2182
- display: firstQuery.name,
2183
- value: firstQuery.name,
2184
- isDefault: false,
2185
- excludedIndices: [],
2186
- icon: ''
2187
- }])
2188
- };
2184
+ const firstQueryConfig = { name: firstQuery.name, tabs: firstQuery.tabSearch.tabs || [{ name: firstQuery.name }] };
2189
2185
  // We need to remove the current search route from the router config
2190
2186
  // the route exists in the router config because it was created in the app-routing.module.ts and we need it
2191
2187
  // to be able to navigate to the search page. We will recreate it with the new tabs
@@ -2420,7 +2416,7 @@ class AuditService {
2420
2416
  // Second event triggered when we come back
2421
2417
  document.addEventListener('visibilitychange', () => {
2422
2418
  if (document.visibilityState === 'visible') {
2423
- this.notify({ type: 'Navigation_Return' });
2419
+ this.notify({ type: "Navigation_Return" /* AuditEventType.Navigation_Return */ });
2424
2420
  }
2425
2421
  }, { once: true });
2426
2422
  }
@@ -2771,7 +2767,7 @@ class PreviewService {
2771
2767
  close(id, query) {
2772
2768
  const detail = this.getAuditPreviewDetail(id, query);
2773
2769
  const auditEvent = {
2774
- type: "Preview_Close",
2770
+ type: "Preview_Close" /* AuditEventType.Preview_Close */,
2775
2771
  detail
2776
2772
  };
2777
2773
  Audit.notify(auditEvent);
@@ -3715,8 +3711,11 @@ function withQueryParamsFeatures() {
3715
3711
  }
3716
3712
  if (filter && filter.value)
3717
3713
  return { ...filter, count: 1 };
3718
- if (filter && filter.values)
3719
- return { ...filter, count: filter.values.length };
3714
+ if (filter && filter.values) {
3715
+ // "filter.values" is an array of strings, Set() automatically deletes duplicates
3716
+ const uniqueValues = new Set(filter.values);
3717
+ return { ...filter, count: uniqueValues.size };
3718
+ }
3720
3719
  if (filter && Array.isArray(filter.filters) === false)
3721
3720
  return { ...filter, count: 1 };
3722
3721
  if (filter && Array.isArray(filter.filters))
@@ -4637,7 +4636,7 @@ class ExportService {
4637
4636
  exportedColumns: exportedColumns,
4638
4637
  selection: (selection ?? []).length > 0 ? selection : undefined,
4639
4638
  $auditRecord: {
4640
- type: "Search_ExportCSV",
4639
+ type: "Search_ExportCSV" /* AuditEventType.Search_ExportCSV */,
4641
4640
  detail: {
4642
4641
  resultid: results ? results.id : undefined
4643
4642
  }
@@ -5465,6 +5464,7 @@ class OverflowManagerDirective {
5465
5464
  direction = input('horizontal', ...(ngDevMode ? [{ debugName: "direction" }] : []));
5466
5465
  count = output();
5467
5466
  el = inject(ElementRef).nativeElement;
5467
+ destroyRef = inject(DestroyRef);
5468
5468
  resizeObserver = new ResizeObserver(() => this.countItems());
5469
5469
  countSub;
5470
5470
  _lastCount;
@@ -5479,10 +5479,11 @@ class OverflowManagerDirective {
5479
5479
  });
5480
5480
  // listens to the count output and toggles the visibility of the items
5481
5481
  this.countSub = this.count.subscribe(count => this.toggleToCount(count));
5482
- }
5483
- ngOnDestroy() {
5484
- this.countSub?.unsubscribe();
5485
- this.countSub = undefined;
5482
+ this.destroyRef.onDestroy(() => {
5483
+ this.resizeObserver.disconnect();
5484
+ this.countSub?.unsubscribe();
5485
+ this.countSub = undefined;
5486
+ });
5486
5487
  }
5487
5488
  /**
5488
5489
  * Counts the number of items that can fit before the stop element.
@@ -5895,15 +5896,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
5895
5896
  }] });
5896
5897
 
5897
5898
  class OperatorPipe {
5899
+ transloco = inject(TranslocoService);
5900
+ lastTransformedValue = null;
5901
+ cdr = inject(ChangeDetectorRef);
5902
+ destroyRef = inject(DestroyRef);
5898
5903
  transform(filter) {
5904
+ this.transloco.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(locale => {
5905
+ const transformedValue = this.transformFilter(filter, locale);
5906
+ if (transformedValue !== this.lastTransformedValue) {
5907
+ this.lastTransformedValue = transformedValue;
5908
+ this.cdr.markForCheck();
5909
+ }
5910
+ });
5911
+ return this.lastTransformedValue || this.transformFilter(filter);
5912
+ }
5913
+ transformFilter(filter, locale) {
5899
5914
  let op = this.transformOperator(filter?.operator);
5900
5915
  if (filter?.operator === 'between') {
5901
- return `> ${filter.start} ≤ ${filter.end}`;
5916
+ const { start, end } = filter;
5917
+ if (!start || !end) {
5918
+ return 'bad date range';
5919
+ }
5920
+ return `> ${new Intl.DateTimeFormat(locale).format(new Date(start))} ≤ ${new Intl.DateTimeFormat(locale).format(new Date(end))}`;
5902
5921
  }
5903
5922
  if (filter?.operator === 'and') {
5904
- return filter.display ?? filter.value ?? '';
5923
+ const value = filter?.display ?? filter?.value ?? '';
5924
+ const date = new Date(value);
5925
+ if (isNaN(date.getTime())) {
5926
+ return value;
5927
+ }
5928
+ else {
5929
+ return new Intl.DateTimeFormat(locale).format(date);
5930
+ }
5931
+ }
5932
+ const date = new Date(filter?.value || '');
5933
+ if (isNaN(date.getTime())) {
5934
+ return `${op} ${filter?.value || ''}`;
5935
+ }
5936
+ else {
5937
+ return `${op} ${new Intl.DateTimeFormat(locale).format(date)}`;
5905
5938
  }
5906
- return `${op} ${filter?.value || ''}`;
5907
5939
  }
5908
5940
  transformOperator(operator) {
5909
5941
  switch (operator) {
@@ -5924,14 +5956,14 @@ class OperatorPipe {
5924
5956
  }
5925
5957
  }
5926
5958
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
5927
- static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, isStandalone: true, name: "operator" });
5959
+ static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, isStandalone: true, name: "operator", pure: false });
5928
5960
  }
5929
5961
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: OperatorPipe, decorators: [{
5930
5962
  type: Pipe,
5931
5963
  args: [{
5932
5964
  name: 'operator',
5933
5965
  standalone: true,
5934
- pure: true
5966
+ pure: false
5935
5967
  }]
5936
5968
  }] });
5937
5969
 
@@ -6328,10 +6360,29 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6328
6360
 
6329
6361
  class SearchInputComponent {
6330
6362
  cn = cn;
6331
- searchElement = viewChild('search', ...(ngDevMode ? [{ debugName: "searchElement" }] : []));
6332
- onFocus = output();
6333
- onBlur = output();
6363
+ searchInput = viewChild.required('search');
6364
+ /**
6365
+ * Emits an event when an element is selected or deselected.
6366
+ *
6367
+ * @remarks
6368
+ * The event payload is either the selected HTMLElement or `null` if the selection is cleared.
6369
+ *
6370
+ * @eventProperty
6371
+ */
6334
6372
  onSelected = output();
6373
+ /**
6374
+ * A required form control for handling string input in the search component.
6375
+ *
6376
+ * This control is initialized using the `input.required` method, ensuring that
6377
+ * the associated input field is mandatory and will enforce validation for non-empty values.
6378
+ *
6379
+ * @remarks
6380
+ * This is typically used to bind to an Angular form input element, providing
6381
+ * reactive form validation and value tracking.
6382
+ *
6383
+ * @type FormControl<string>
6384
+ */
6385
+ control = input.required(...(ngDevMode ? [{ debugName: "control" }] : []));
6335
6386
  controls = input.required(...(ngDevMode ? [{ debugName: "controls" }] : []));
6336
6387
  keyboardNavigatorOptions = input({
6337
6388
  name: 'searchInputKeyboardNavigator',
@@ -6352,37 +6403,20 @@ class SearchInputComponent {
6352
6403
  variants = computed(() => {
6353
6404
  return searchVariants({ variant: this.variant(), class: this.class() });
6354
6405
  }, ...(ngDevMode ? [{ debugName: "variants" }] : []));
6355
- clearSearch(e) {
6356
- const searchEl = this.searchElement()?.nativeElement;
6357
- if (searchEl) {
6358
- searchEl.value = '';
6359
- searchEl.focus();
6360
- }
6361
- this.onChange('');
6406
+ onInput(event) {
6407
+ const inputElement = event.target;
6408
+ this.control().setValue(inputElement.value);
6409
+ this.control().markAsDirty();
6410
+ this.control().markAsTouched();
6362
6411
  }
6363
- /* ControlValueAccessor */
6364
- onChange = () => { };
6365
- onTouched = () => { };
6366
- writeValue(value) {
6367
- const searchEl = this.searchElement()?.nativeElement;
6368
- if (searchEl) {
6369
- searchEl.value = value;
6370
- }
6371
- }
6372
- registerOnChange(fn) {
6373
- this.onChange = fn;
6374
- }
6375
- registerOnTouched(fn) {
6376
- this.onTouched = fn;
6412
+ clearSearch(e) {
6413
+ e.stopImmediatePropagation();
6414
+ this.control().reset();
6415
+ this.control().updateValueAndValidity();
6416
+ this.searchInput()?.nativeElement.focus();
6377
6417
  }
6378
6418
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6379
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: SearchInputComponent, isStandalone: true, selector: "SearchInput", inputs: { controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null }, keyboardNavigatorOptions: { classPropertyName: "keyboardNavigatorOptions", publicName: "keyboardNavigatorOptions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onFocus: "onFocus", onBlur: "onBlur", onSelected: "onSelected" }, host: { properties: { "class": "cn(variants(), disabled() && 'pointer-events-none opacity-50')" } }, providers: [
6380
- {
6381
- provide: NG_VALUE_ACCESSOR,
6382
- useExisting: forwardRef(() => SearchInputComponent),
6383
- multi: true
6384
- }
6385
- ], viewQueries: [{ propertyName: "searchElement", first: true, predicate: ["search"], descendants: true, isSignal: true }], ngImport: i0, template: `
6419
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.2.0", version: "20.1.2", type: SearchInputComponent, isStandalone: true, selector: "SearchInput", inputs: { control: { classPropertyName: "control", publicName: "control", isSignal: true, isRequired: true, transformFunction: null }, controls: { classPropertyName: "controls", publicName: "controls", isSignal: true, isRequired: true, transformFunction: null }, keyboardNavigatorOptions: { classPropertyName: "keyboardNavigatorOptions", publicName: "keyboardNavigatorOptions", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, hotkey: { classPropertyName: "hotkey", publicName: "hotkey", isSignal: true, isRequired: false, transformFunction: null }, class: { classPropertyName: "class", publicName: "class", isSignal: true, isRequired: false, transformFunction: null }, variant: { classPropertyName: "variant", publicName: "variant", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onSelected: "onSelected" }, host: { properties: { "class": "cn(variants(), disabled() && 'pointer-events-none opacity-50')" } }, viewQueries: [{ propertyName: "searchInput", first: true, predicate: ["search"], descendants: true, isSignal: true }], ngImport: i0, template: `
6386
6420
  <SearchIcon class="text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90" />
6387
6421
  <input
6388
6422
  #search
@@ -6396,25 +6430,26 @@ class SearchInputComponent {
6396
6430
  aria-controls="{{ controls() }}"
6397
6431
  [keyboardNavigator]="keyboardNavigatorOptions()"
6398
6432
  [placeholder]="placeholder()"
6433
+ [value]="control().value || ''"
6399
6434
  [attr.aria-keyshortcuts]="hotkey()"
6400
- (onFocus)="onFocus.emit()"
6401
- (onBlur)="onBlur.emit()"
6402
6435
  (onSelected)="onSelected.emit($event)"
6403
- (input)="onChange(search.value)" />
6436
+ (input)="onInput($event)" />
6404
6437
 
6405
6438
  <button
6406
6439
  variant="icon"
6440
+ [tabindex]="control().value ? 0 : -1"
6407
6441
  class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6442
+ (keydown.enter)="clearSearch($event)"
6408
6443
  (click)="clearSearch($event)">
6409
- <XMark class="size-4" />
6444
+ <XMark class="size-4" aria-hidden="true" />
6410
6445
  </button>
6411
6446
 
6412
6447
  <ng-content />
6413
- `, isInline: true, styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"], dependencies: [{ kind: "component", type: SearchIconComponent, selector: "SearchIcon", inputs: ["class", "width", "height"] }, { kind: "component", type: XMarkIConComponent, selector: "XMark, xmark, x-mark", inputs: ["class", "width", "height"] }, { kind: "directive", type: KeyboardNavigatorDirective, selector: "input[role=\"combobox\"]", inputs: ["keyboardNavigator", "aria-controls"], outputs: ["onFocus", "onBlur", "onSelected"] }] });
6448
+ `, isInline: true, styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"], dependencies: [{ kind: "component", type: SearchIcon, selector: "SearchIcon", inputs: ["class", "width", "height"] }, { kind: "component", type: XMarkIConComponent, selector: "XMark, xmark, x-mark", inputs: ["class", "width", "height"] }, { kind: "directive", type: KeyboardNavigatorDirective, selector: "input[role=\"combobox\"]", inputs: ["keyboardNavigator", "aria-controls"], outputs: ["onFocus", "onBlur", "onSelected"] }] });
6414
6449
  }
6415
6450
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SearchInputComponent, decorators: [{
6416
6451
  type: Component,
6417
- args: [{ selector: 'SearchInput', standalone: true, imports: [SearchIconComponent, XMarkIConComponent, KeyboardNavigatorDirective], template: `
6452
+ args: [{ selector: 'SearchInput', standalone: true, imports: [SearchIcon, XMarkIConComponent, KeyboardNavigatorDirective], template: `
6418
6453
  <SearchIcon class="text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90" />
6419
6454
  <input
6420
6455
  #search
@@ -6428,29 +6463,24 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
6428
6463
  aria-controls="{{ controls() }}"
6429
6464
  [keyboardNavigator]="keyboardNavigatorOptions()"
6430
6465
  [placeholder]="placeholder()"
6466
+ [value]="control().value || ''"
6431
6467
  [attr.aria-keyshortcuts]="hotkey()"
6432
- (onFocus)="onFocus.emit()"
6433
- (onBlur)="onBlur.emit()"
6434
6468
  (onSelected)="onSelected.emit($event)"
6435
- (input)="onChange(search.value)" />
6469
+ (input)="onInput($event)" />
6436
6470
 
6437
6471
  <button
6438
6472
  variant="icon"
6473
+ [tabindex]="control().value ? 0 : -1"
6439
6474
  class="text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none"
6475
+ (keydown.enter)="clearSearch($event)"
6440
6476
  (click)="clearSearch($event)">
6441
- <XMark class="size-4" />
6477
+ <XMark class="size-4" aria-hidden="true" />
6442
6478
  </button>
6443
6479
 
6444
6480
  <ng-content />
6445
6481
  `, host: {
6446
6482
  '[class]': "cn(variants(), disabled() && 'pointer-events-none opacity-50')"
6447
- }, providers: [
6448
- {
6449
- provide: NG_VALUE_ACCESSOR,
6450
- useExisting: forwardRef(() => SearchInputComponent),
6451
- multi: true
6452
- }
6453
- ], styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"] }]
6483
+ }, styles: [":host input[type=search]::-ms-clear,:host input[type=search]::-ms-reveal{appearance:none;width:0;height:0}:host input[type=search]::-webkit-search-decoration,:host input[type=search]::-webkit-search-cancel-button,:host input[type=search]::-webkit-search-results-button,:host input[type=search]::-webkit-search-results-decoration{appearance:none}\n"] }]
6454
6484
  }] });
6455
6485
 
6456
6486
  class SortSelectorComponent {
@@ -6963,7 +6993,8 @@ class SearchListComponent {
6963
6993
  transloco = inject(TranslocoService);
6964
6994
  onClick(search) {
6965
6995
  const queryParams = {
6966
- q: search.queryParams?.text
6996
+ q: search.queryParams?.text,
6997
+ t: search.queryParams?.tab
6967
6998
  };
6968
6999
  if (search.queryParams?.filters && search.queryParams?.filters?.length > 0)
6969
7000
  queryParams.f = JSON.stringify(search.queryParams?.filters);
@@ -8375,13 +8406,14 @@ class SignInComponent {
8375
8406
  }
8376
8407
  }
8377
8408
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SignInComponent, deps: [{ token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
8378
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SignInComponent, isStandalone: true, selector: "signIn, signin, sign-in", providers: [provideTranslocoScope('login')], ngImport: i0, template: "<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: CardComponent, selector: ".card, card, Card", inputs: ["class"] }, { kind: "directive", type: CardHeaderComponent, selector: ".card-header, card-header, CardHeader, cardheader", inputs: ["class"] }, { kind: "directive", type: CardContentComponent, selector: ".card-content, card-content, CardContent, cardcontent", inputs: ["class"] }, { kind: "directive", type: CardFooterComponent, selector: ".card-footer, card-footer, CardFooter, cardfooter", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8409
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: SignInComponent, isStandalone: true, selector: "signIn, signin, sign-in", providers: [provideTranslocoScope('login')], ngImport: i0, template: "<Card cdkTrapFocus cdkTrapFocusAutoCapture=\"true\">\n <CardHeader>\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco: { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\">{{\n 'login.username' | transloco\n }}</label>\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\">{{\n 'login.password' | transloco\n }}</label>\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"], dependencies: [{ kind: "ngmodule", type: RouterModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: A11yModule }, { kind: "directive", type: i2.CdkTrapFocus, selector: "[cdkTrapFocus]", inputs: ["cdkTrapFocus", "cdkTrapFocusAutoCapture"], exportAs: ["cdkTrapFocus"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: CardComponent, selector: ".card, card, Card", inputs: ["class"] }, { kind: "directive", type: CardHeaderComponent, selector: ".card-header, card-header, CardHeader, cardheader", inputs: ["class"] }, { kind: "directive", type: CardContentComponent, selector: ".card-content, card-content, CardContent, cardcontent", inputs: ["class"] }, { kind: "directive", type: CardFooterComponent, selector: ".card-footer, card-footer, CardFooter, cardfooter", inputs: ["class"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
8379
8410
  }
8380
8411
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: SignInComponent, decorators: [{
8381
8412
  type: Component,
8382
8413
  args: [{ selector: 'signIn, signin, sign-in', standalone: true, providers: [provideTranslocoScope('login')], imports: [
8383
8414
  RouterModule,
8384
8415
  FormsModule,
8416
+ A11yModule,
8385
8417
  TranslocoPipe,
8386
8418
  InputComponent,
8387
8419
  ButtonComponent,
@@ -8389,7 +8421,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImpor
8389
8421
  CardHeaderComponent,
8390
8422
  CardContentComponent,
8391
8423
  CardFooterComponent
8392
- ], template: "<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"] }]
8424
+ ], template: "<Card cdkTrapFocus cdkTrapFocusAutoCapture=\"true\">\n <CardHeader>\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco: { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\">{{\n 'login.username' | transloco\n }}</label>\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\">{{\n 'login.password' | transloco\n }}</label>\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n", styles: [":host{min-height:100vh;display:flex;justify-content:center;align-items:center;padding:2rem}.btn-primary{background-color:#000;color:#fff}\n"] }]
8393
8425
  }], ctorParameters: () => [{ type: i0.DestroyRef }] });
8394
8426
 
8395
8427
  class LabelService {
@@ -9443,7 +9475,7 @@ class DateComponent extends AggregationComponent {
9443
9475
  this.updateForm(this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }));
9444
9476
  });
9445
9477
  this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(changes => {
9446
- this.validSelection.set(!!changes.option && (changes.option !== 'custom-range' || (changes.customRange?.from !== null && changes.customRange?.to !== null)));
9478
+ this.validSelection.set(!!changes.option && (changes.option !== 'custom-range' || changes.customRange?.from !== null || changes.customRange?.to !== null));
9447
9479
  });
9448
9480
  }
9449
9481
  aggregation = computed(() => {
@@ -10451,6 +10483,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10451
10483
  queryParamsStore = inject(QueryParamsStore);
10452
10484
  appStore = inject(AppStore);
10453
10485
  router = inject(Router);
10486
+ route = inject(ActivatedRoute);
10454
10487
  formBuilder = inject(NonNullableFormBuilder);
10455
10488
  overlay = inject(Overlay);
10456
10489
  transloco = inject(TranslocoService);
@@ -10472,10 +10505,6 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10472
10505
  title: this.formBuilder.group({
10473
10506
  operator: this.formBuilder.control('all'),
10474
10507
  value: this.formBuilder.control(undefined)
10475
- }),
10476
- location: this.formBuilder.group({
10477
- operator: this.formBuilder.control('all'),
10478
- value: this.formBuilder.control(undefined)
10479
10508
  })
10480
10509
  });
10481
10510
  currentTab = signal('all', ...(ngDevMode ? [{ debugName: "currentTab" }] : []));
@@ -10485,17 +10514,30 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10485
10514
  aggregations = signal(undefined, ...(ngDevMode ? [{ debugName: "aggregations" }] : []));
10486
10515
  tabs = computed(() => {
10487
10516
  const routeData = this.router.config.find(c => c.path === searchRoute);
10488
- return !routeData ? [] : ['all'].concat(routeData.children.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => c.path));
10517
+ return !routeData
10518
+ ? []
10519
+ : [{ path: 'all', display: 'All' }].concat(routeData.children.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => ({ path: c.path, display: c.data?.['display'] })));
10489
10520
  }, ...(ngDevMode ? [{ debugName: "tabs" }] : []));
10490
10521
  filters = computed(() => {
10491
- return (this.appStore
10522
+ const cjsonFilters = this.appStore
10492
10523
  .customizationJson()
10493
10524
  .filters?.filter(f => f.column !== '#date')
10494
10525
  .map(f => ({
10495
10526
  column: f.column,
10496
10527
  alias: this.appStore.getColumnAlias(f.column),
10528
+ display: f.display,
10497
10529
  items: this.aggregations()?.find(a => a.column === f.column)?.items
10498
- })) || []);
10530
+ })) || [];
10531
+ const appStoreFilters = this.appStore
10532
+ .getAuthorizedFilters(this.route)
10533
+ .filter(f => !cjsonFilters.some(cf => cf.column === f.column))
10534
+ .map((f) => ({
10535
+ column: f.column,
10536
+ alias: this.appStore.getColumnAlias(f.column),
10537
+ display: f.display,
10538
+ items: this.aggregations()?.find(a => a.column === f.column)?.items
10539
+ })) || [];
10540
+ return cjsonFilters.concat(appStoreFilters);
10499
10541
  }, ...(ngDevMode ? [{ debugName: "filters" }] : []));
10500
10542
  text = '';
10501
10543
  constructor() {
@@ -10515,7 +10557,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10515
10557
  }
10516
10558
  onSearch() {
10517
10559
  // this params alters the query text
10518
- const { content, title, location } = this.form.value;
10560
+ const { content, title } = this.form.value;
10519
10561
  let fieldedText = [];
10520
10562
  if (content && content.value) {
10521
10563
  const { operator = 'any', value = '' } = content;
@@ -10527,11 +10569,6 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10527
10569
  const text = this.formatFilter(operator, value, 'title');
10528
10570
  fieldedText.push(text);
10529
10571
  }
10530
- if (location && location.value) {
10531
- const { operator = 'any', value = '' } = location;
10532
- const text = this.formatFilter(operator, value, 'location');
10533
- fieldedText.push(text);
10534
- }
10535
10572
  let text = this.text;
10536
10573
  // now we have to join the fieldedText with the text
10537
10574
  // if text is empty, we must remove the leading space
@@ -10593,7 +10630,7 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10593
10630
  }
10594
10631
  }
10595
10632
  }
10596
- /** Format content/title/location filters */
10633
+ /** Format content/title filters */
10597
10634
  formatFilter(operator, value, field = '') {
10598
10635
  const fieldStr = field ? `${field}::` : '';
10599
10636
  switch (operator) {
@@ -10630,7 +10667,10 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10630
10667
  /** add item to current selection */
10631
10668
  addItem(item, filter) {
10632
10669
  const appliedFilter = this.appliedFilters().find(af => af.column === filter.column);
10633
- if (!appliedFilter.values.some(v => v.value === item.value)) {
10670
+ if (!appliedFilter) {
10671
+ this.appliedFilters.set(this.appliedFilters().concat([{ column: filter.column, values: [item] }]));
10672
+ }
10673
+ else if (!appliedFilter.values.some(v => v.value === item.value)) {
10634
10674
  appliedFilter.values.push(item);
10635
10675
  }
10636
10676
  }
@@ -10661,11 +10701,11 @@ class DrawerAdvancedFiltersComponent extends DrawerComponent {
10661
10701
  return res;
10662
10702
  }
10663
10703
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerAdvancedFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10664
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DrawerAdvancedFiltersComponent, isStandalone: true, selector: "advanced-filters", providers: [DrawerService, provideTranslocoScope('drawers')], usesInheritance: true, ngImport: i0, template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: DrawerNavbarComponent, selector: "app-drawer-navbar" }, { kind: "component", type: DropdownInputComponent, selector: "dropdown-input, DropdownInput", inputs: ["label", "placeholder", "noResultLabel", "suggestions", "selected"], outputs: ["onFocus", "onKeyUp", "removeItem", "addItem"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }] });
10704
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.1.2", type: DrawerAdvancedFiltersComponent, isStandalone: true, selector: "advanced-filters", providers: [DrawerService, provideTranslocoScope('drawers')], usesInheritance: true, ngImport: i0, template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab.path !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab.path)\">\n {{ tab.display | syslang | transloco }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n {{ filter.display || filter.alias | syslang | transloco }}\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.display || filter.alias | syslang | transloco\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "component", type: DrawerNavbarComponent, selector: "app-drawer-navbar" }, { kind: "component", type: DropdownInputComponent, selector: "dropdown-input, DropdownInput", inputs: ["label", "placeholder", "noResultLabel", "suggestions", "selected"], outputs: ["onFocus", "onKeyUp", "removeItem", "addItem"] }, { kind: "directive", type: ButtonComponent, selector: "button", inputs: ["class", "variant", "size"] }, { kind: "directive", type: InputComponent, selector: "input[type=\"text\"], input[type=\"email\"], input[type=\"password\"], input[type=\"number\"], input[type=\"tel\"], input[type=\"url\"], input[type=\"time\"]", inputs: ["class", "variant"] }, { kind: "pipe", type: TranslocoPipe, name: "transloco" }, { kind: "pipe", type: SyslangPipe, name: "syslang" }] });
10665
10705
  }
10666
10706
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.1.2", ngImport: i0, type: DrawerAdvancedFiltersComponent, decorators: [{
10667
10707
  type: Component,
10668
- args: [{ selector: 'advanced-filters', standalone: true, imports: [ReactiveFormsModule, TranslocoPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent], providers: [DrawerService, provideTranslocoScope('drawers')], template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"] }]
10708
+ args: [{ selector: 'advanced-filters', standalone: true, imports: [ReactiveFormsModule, TranslocoPipe, SyslangPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent], providers: [DrawerService, provideTranslocoScope('drawers')], template: "<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab.path !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab.path)\">\n {{ tab.display | syslang | transloco }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n {{ filter.display || filter.alias | syslang | transloco }}\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.display || filter.alias | syslang | transloco\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n", styles: [":host{--drawer-width: 46;--drawer-subdrawer-width: 400px;display:grid;justify-content:flex-end;position:absolute;top:0;height:100%;right:-100%;width:calc(100vw / 100 * var(--drawer-width) + var(--drawer-subdrawer-width));z-index:var(--z-drawer);grid-template-columns:0 1fr var(--drawer-subdrawer-width);transition:right .3s ease-in-out,transform .3s ease-in-out}:host[drawer-opened=true]{right:calc(var(--drawer-subdrawer-width) * -1);box-shadow:var(--drawer-box-shadow)}:host[drawer-extended=true]{width:100vw;right:calc(var(--spacing) * 0);grid-template-columns:1fr calc(var(--drawer-width) * 1%) var(--drawer-subdrawer-width);box-shadow:unset}:is() .dropdown{width:100%}:is() .dropdown-content{width:50%}\n"] }]
10669
10709
  }], ctorParameters: () => [] });
10670
10710
 
10671
10711
  class AdvancedSearchComponent {