@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,
|
|
3
|
-
import { DropdownComponent, DropdownContentComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, DialogComponent, DialogHeaderComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, ListItemComponent, InputComponent, cn, SwitchComponent, DialogService, TabsComponent, TabComponent, searchVariants,
|
|
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,
|
|
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 =>
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
5484
|
-
|
|
5485
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
6332
|
-
|
|
6333
|
-
|
|
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
|
-
|
|
6356
|
-
const
|
|
6357
|
-
|
|
6358
|
-
|
|
6359
|
-
|
|
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
|
-
|
|
6364
|
-
|
|
6365
|
-
|
|
6366
|
-
|
|
6367
|
-
|
|
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: {
|
|
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)="
|
|
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:
|
|
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: [
|
|
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)="
|
|
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
|
-
},
|
|
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 <
|
|
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' ||
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 }} "{{ currentTab() }}"</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
|
|
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 }} "{{ currentTab() }}"</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 {
|