ngx-edu-sharing-metaqs2 0.9.31 → 0.9.33
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/lib/collection-count-history/collection-count-history.component.mjs +48 -32
- package/esm2022/lib/collection-count-history/monthpicker/monthpicker.component.mjs +7 -4
- package/esm2022/lib/components/collection-issues/collection-issues.component.mjs +2 -2
- package/esm2022/lib/components/donut-chart/donut-chart.component.mjs +9 -9
- package/esm2022/lib/components/filter/datepicker/datepicker.component.mjs +3 -3
- package/esm2022/lib/components/loading_indicator/overlay/overlay.service.mjs +41 -0
- package/esm2022/lib/components/loading_indicator/progress-spinner/progress-spinner.component.mjs +65 -0
- package/esm2022/lib/components/material-issues/material-issues.component.mjs +2 -2
- package/esm2022/lib/components/node-entry/node-entry.component.mjs +2 -2
- package/esm2022/lib/components/node-list/node-list.component.mjs +2 -2
- package/esm2022/lib/components/quality-matrix/quality_matrix.mjs +6 -5
- package/esm2022/lib/counts-with-history/counts-with-history.component.mjs +89 -84
- package/esm2022/lib/ng-meta-widgets-lib.module.mjs +8 -4
- package/esm2022/lib/tree-collection-details/tree-collection-details.component.mjs +17 -3
- package/esm2022/lib/tree-search-counts/tree-search-counts.component.mjs +5 -3
- package/esm2022/public-api.mjs +1 -2
- package/fesm2022/ngx-edu-sharing-metaqs2.mjs +277 -277
- package/fesm2022/ngx-edu-sharing-metaqs2.mjs.map +1 -1
- package/lib/collection-count-history/collection-count-history.component.d.ts +1 -0
- package/lib/collection-count-history/monthpicker/monthpicker.component.d.ts +2 -1
- package/lib/components/loading_indicator/overlay/overlay.service.d.ts +13 -0
- package/lib/components/loading_indicator/progress-spinner/progress-spinner.component.d.ts +21 -0
- package/lib/counts-with-history/counts-with-history.component.d.ts +27 -25
- package/lib/ng-meta-widgets-lib.module.d.ts +2 -1
- package/package.json +1 -1
- package/public-api.d.ts +0 -1
- package/esm2022/lib/materialtypes-by-sources/materialtypes-by-sources.component.mjs +0 -148
- package/lib/materialtypes-by-sources/materialtypes-by-sources.component.d.ts +0 -43
|
@@ -21,6 +21,7 @@ export declare class CollectionCountHistoryComponent implements OnInit {
|
|
|
21
21
|
protected granularities: DateTimeUnit[];
|
|
22
22
|
protected granularity: FormControl<DateTimeUnit>;
|
|
23
23
|
pageTitle: string;
|
|
24
|
+
isHistoryEnabled: import("@angular/core").WritableSignal<boolean>;
|
|
24
25
|
constructor(metaApi: MetaApiService, destroyRef: DestroyRef);
|
|
25
26
|
ngOnInit(): void;
|
|
26
27
|
registerDateRangeFilter(): void;
|
|
@@ -11,10 +11,11 @@ export declare class MonthpickerComponent implements OnDestroy {
|
|
|
11
11
|
start: FormControl<DateTime<boolean>>;
|
|
12
12
|
end: FormControl<DateTime<boolean>>;
|
|
13
13
|
}>;
|
|
14
|
+
disabled: boolean;
|
|
14
15
|
constructor();
|
|
15
16
|
protected setStart(date: DateTime<boolean>, picker: MatDatepicker<DateTime<boolean>>): void;
|
|
16
17
|
protected setEnd(date: DateTime<boolean>, picker: MatDatepicker<DateTime<boolean>>): void;
|
|
17
18
|
ngOnDestroy(): void;
|
|
18
19
|
static ɵfac: i0.ɵɵFactoryDeclaration<MonthpickerComponent, never>;
|
|
19
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MonthpickerComponent, "metaqs2-monthpicker", never, { "startView": { "alias": "startView"; "required": false; }; "inputGroup": { "alias": "inputGroup"; "required": true; }; }, {}, never, never, true, never>;
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<MonthpickerComponent, "metaqs2-monthpicker", never, { "startView": { "alias": "startView"; "required": false; }; "inputGroup": { "alias": "inputGroup"; "required": true; }; "disabled": { "alias": "disabled"; "required": false; }; }, {}, never, never, true, never>;
|
|
20
21
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { ElementRef, TemplateRef, ViewContainerRef } from '@angular/core';
|
|
2
|
+
import { Overlay, OverlayConfig, OverlayRef, PositionStrategy } from '@angular/cdk/overlay';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class OverlayService {
|
|
5
|
+
private overlay;
|
|
6
|
+
constructor(overlay: Overlay);
|
|
7
|
+
createOverlay(config: OverlayConfig): OverlayRef;
|
|
8
|
+
attachTemplatePortal(overlayRef: OverlayRef, templateRef: TemplateRef<any>, vcRef: ViewContainerRef): void;
|
|
9
|
+
positionGloballyCenter(): PositionStrategy;
|
|
10
|
+
positionFlexibleConnected(parent: Element | ElementRef): PositionStrategy;
|
|
11
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<OverlayService, never>;
|
|
12
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<OverlayService>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { ViewContainerRef, OnChanges, SimpleChanges, ElementRef } from '@angular/core';
|
|
2
|
+
import { OverlayService } from '../overlay/overlay.service';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
export declare class ProgressSpinnerComponent implements OnChanges {
|
|
5
|
+
private vcRef;
|
|
6
|
+
private overlayService;
|
|
7
|
+
private el;
|
|
8
|
+
color?: string;
|
|
9
|
+
diameter?: number;
|
|
10
|
+
strokeWidth?: number;
|
|
11
|
+
backdropEnabled: boolean;
|
|
12
|
+
positionGloballyCenter: boolean;
|
|
13
|
+
displayProgressSpinner: boolean;
|
|
14
|
+
private progressSpinnerRef;
|
|
15
|
+
private progressSpinnerOverlayConfig;
|
|
16
|
+
private overlayRef;
|
|
17
|
+
constructor(vcRef: ViewContainerRef, overlayService: OverlayService, el: ElementRef);
|
|
18
|
+
ngOnChanges(changes: SimpleChanges): void;
|
|
19
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ProgressSpinnerComponent, never>;
|
|
20
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ProgressSpinnerComponent, "metaqs2-progress-spinner", never, { "color": { "alias": "color"; "required": false; }; "diameter": { "alias": "diameter"; "required": false; }; "strokeWidth": { "alias": "strokeWidth"; "required": false; }; "backdropEnabled": { "alias": "backdropEnabled"; "required": false; }; "positionGloballyCenter": { "alias": "positionGloballyCenter"; "required": false; }; "displayProgressSpinner": { "alias": "displayProgressSpinner"; "required": false; }; }, {}, never, never, true, never>;
|
|
21
|
+
}
|
|
@@ -1,21 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DestroyRef, OnInit } from '@angular/core';
|
|
2
2
|
import { BehaviorSubject, Observable } from 'rxjs';
|
|
3
3
|
import { MetaApiService } from '../meta-api.service';
|
|
4
|
-
import { MatrixRowWithCounts, MatrixWithCounts, QualityMatrixHeader } from '../java-api';
|
|
4
|
+
import { Filter, MatrixRowWithCounts, MatrixWithCounts, QualityMatrixHeader } from '../java-api';
|
|
5
5
|
import { DateTime } from 'luxon';
|
|
6
6
|
import { FormControl, FormGroup } from '@angular/forms';
|
|
7
7
|
import { EditorialLinkService } from '../components/editorial-link-service/editorial-link.service';
|
|
8
8
|
import * as i0 from "@angular/core";
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
type PickKeysByPropertyType<TObject extends object, TPropertyType> = {
|
|
10
|
+
[TKey in keyof TObject]: TObject[TKey] extends TPropertyType ? TKey : never;
|
|
11
|
+
}[keyof TObject];
|
|
12
|
+
export declare class CountsWithHistoryComponent implements OnInit {
|
|
13
|
+
protected readonly metaApi: MetaApiService;
|
|
14
|
+
protected readonly destroyRef: DestroyRef;
|
|
11
15
|
private readonly linkService;
|
|
12
|
-
protected readonly
|
|
16
|
+
protected readonly loadingCount: import("@angular/core").WritableSignal<number>;
|
|
17
|
+
protected readonly isLoading: import("@angular/core").Signal<boolean>;
|
|
13
18
|
protected readonly timeFilterLoaded: import("@angular/core").WritableSignal<boolean>;
|
|
14
|
-
private readonly destroyed$;
|
|
15
19
|
protected readonly recentTypeCount$: BehaviorSubject<MatrixWithCounts>;
|
|
16
20
|
protected readonly pastTypeCount$: BehaviorSubject<MatrixWithCounts>;
|
|
17
|
-
|
|
18
|
-
|
|
21
|
+
protected readonly DateTime: typeof DateTime;
|
|
22
|
+
columns: import("@angular/core").WritableSignal<QualityMatrixHeader[]>;
|
|
23
|
+
apiMethod: PickKeysByPropertyType<MetaApiService, (it: Array<Filter>) => Observable<MatrixWithCounts>>;
|
|
19
24
|
columnTranslationkey: string | null;
|
|
20
25
|
pageTitle: string;
|
|
21
26
|
sourceType: 'replicationSource' | 'collection';
|
|
@@ -23,28 +28,25 @@ export declare class CountsWithHistoryComponent implements OnInit, OnDestroy {
|
|
|
23
28
|
start: FormControl<DateTime<boolean>>;
|
|
24
29
|
end: FormControl<DateTime<boolean>>;
|
|
25
30
|
}>;
|
|
26
|
-
|
|
31
|
+
readonly isHistoryEnabled: import("@angular/core").WritableSignal<boolean>;
|
|
32
|
+
readonly allColumns: import("@angular/core").Signal<string[]>;
|
|
33
|
+
readonly typeColumns: import("@angular/core").Signal<string[]>;
|
|
34
|
+
readonly recentColumns: import("@angular/core").Signal<string[]>;
|
|
35
|
+
readonly pastColumns: import("@angular/core").Signal<string[]>;
|
|
36
|
+
constructor(metaApi: MetaApiService, destroyRef: DestroyRef, linkService: EditorialLinkService);
|
|
37
|
+
ngOnInit(): void;
|
|
38
|
+
private getStartDateOfRange;
|
|
27
39
|
columnIdent(_index: number, col: QualityMatrixHeader): string;
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
get pastColumns(): string[];
|
|
31
|
-
get allColumns(): string[];
|
|
32
|
-
private registerDateRangeFilter;
|
|
33
|
-
private getTimeRangeFilter;
|
|
40
|
+
private getAvailableDateRange;
|
|
41
|
+
private getValuesInDateRange;
|
|
34
42
|
private getCountByDate;
|
|
35
43
|
protected pastTypeCount(row: MatrixRowWithCounts, columnid: string): {
|
|
36
|
-
delta?:
|
|
37
|
-
trend?:
|
|
38
|
-
value?:
|
|
39
|
-
} | {
|
|
40
|
-
delta: number;
|
|
41
|
-
trend: string;
|
|
42
|
-
value: number;
|
|
44
|
+
delta?: number;
|
|
45
|
+
trend?: string;
|
|
46
|
+
value?: number;
|
|
43
47
|
};
|
|
44
48
|
protected openInEditor(sourceId: string, issueId: string): Observable<string | null>;
|
|
45
|
-
ngOnInit(): void;
|
|
46
|
-
protected readonly DateTime: typeof DateTime;
|
|
47
|
-
ngOnDestroy(): void;
|
|
48
49
|
static ɵfac: i0.ɵɵFactoryDeclaration<CountsWithHistoryComponent, never>;
|
|
49
50
|
static ɵcmp: i0.ɵɵComponentDeclaration<CountsWithHistoryComponent, "metaqs2-counts-with-history", never, { "apiMethod": { "alias": "apiMethod"; "required": true; }; "columnTranslationkey": { "alias": "columnTranslationkey"; "required": false; }; "pageTitle": { "alias": "pageTitle"; "required": false; }; "sourceType": { "alias": "sourceType"; "required": true; }; }, {}, never, never, true, never>;
|
|
50
51
|
}
|
|
52
|
+
export {};
|
|
@@ -36,11 +36,12 @@ import * as i31 from "@ngx-translate/core";
|
|
|
36
36
|
import * as i32 from "./components/filter/quality-matrix-filter.component";
|
|
37
37
|
import * as i33 from "@angular/material/datepicker";
|
|
38
38
|
import * as i34 from "./components/filter/datepicker/datepicker.component";
|
|
39
|
+
import * as i35 from "./components/loading_indicator/progress-spinner/progress-spinner.component";
|
|
39
40
|
export declare class NgMetaWidgetsLibModule {
|
|
40
41
|
private readonly svgIconsService;
|
|
41
42
|
constructor(svgIconsService: SvgIconsService);
|
|
42
43
|
static forRoot(params: NgMetaWidgetsLibConfiguration): ModuleWithProviders<NgMetaWidgetsLibModule>;
|
|
43
44
|
static ɵfac: i0.ɵɵFactoryDeclaration<NgMetaWidgetsLibModule, never>;
|
|
44
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<NgMetaWidgetsLibModule, [typeof i1.WrapObservablePipe, typeof i2.QualityMatrixComponent, typeof i3.DonutChartComponent, typeof i4.DonutChartPipe, typeof i5.CollectionIssuesComponent, typeof i6.MaterialIssuesComponent, typeof i7.NodeEntryComponent, typeof i8.NodeListComponent, typeof i9.NodeImageUrlPipe], [typeof i10.BrowserModule, typeof i11.ApiModule, typeof i12.MatCardModule, typeof i13.MatTreeModule, typeof i14.BrowserAnimationsModule, typeof i15.MatIconModule, typeof i16.MatSliderModule, typeof i17.MatSlideToggleModule, typeof i18.MatButtonModule, typeof i19.MatProgressSpinnerModule, typeof i20.MatTableModule, typeof i21.MatGridListModule, typeof i22.MatFormFieldModule, typeof i23.MatInputModule, typeof i24.MatSidenavModule, typeof i25.FormsModule, typeof i26.MatSelectModule, typeof i25.ReactiveFormsModule, typeof i27.MatTooltipModule, typeof i28.MatListModule, typeof i29.MatSort, typeof i29.MatSortModule, typeof i30.MatCheckbox, typeof i31.TranslateModule, typeof i32.QualityMatrixFilterComponent, typeof i33.MatDateRangeInput, typeof i33.MatDatepickerToggle, typeof i33.MatDatepickerModule, typeof i33.MatDateRangePicker, typeof i33.MatDatepickerInput, typeof i33.MatDatepicker, typeof i34.DatepickerComponent], [typeof i5.CollectionIssuesComponent, typeof i6.MaterialIssuesComponent, typeof i8.NodeListComponent]>;
|
|
45
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<NgMetaWidgetsLibModule, [typeof i1.WrapObservablePipe, typeof i2.QualityMatrixComponent, typeof i3.DonutChartComponent, typeof i4.DonutChartPipe, typeof i5.CollectionIssuesComponent, typeof i6.MaterialIssuesComponent, typeof i7.NodeEntryComponent, typeof i8.NodeListComponent, typeof i9.NodeImageUrlPipe], [typeof i10.BrowserModule, typeof i11.ApiModule, typeof i12.MatCardModule, typeof i13.MatTreeModule, typeof i14.BrowserAnimationsModule, typeof i15.MatIconModule, typeof i16.MatSliderModule, typeof i17.MatSlideToggleModule, typeof i18.MatButtonModule, typeof i19.MatProgressSpinnerModule, typeof i20.MatTableModule, typeof i21.MatGridListModule, typeof i22.MatFormFieldModule, typeof i23.MatInputModule, typeof i24.MatSidenavModule, typeof i25.FormsModule, typeof i26.MatSelectModule, typeof i25.ReactiveFormsModule, typeof i27.MatTooltipModule, typeof i28.MatListModule, typeof i29.MatSort, typeof i29.MatSortModule, typeof i30.MatCheckbox, typeof i31.TranslateModule, typeof i32.QualityMatrixFilterComponent, typeof i33.MatDateRangeInput, typeof i33.MatDatepickerToggle, typeof i33.MatDatepickerModule, typeof i33.MatDateRangePicker, typeof i33.MatDatepickerInput, typeof i33.MatDatepicker, typeof i34.DatepickerComponent, typeof i35.ProgressSpinnerComponent], [typeof i5.CollectionIssuesComponent, typeof i6.MaterialIssuesComponent, typeof i8.NodeListComponent, typeof i2.QualityMatrixComponent]>;
|
|
45
46
|
static ɵinj: i0.ɵɵInjectorDeclaration<NgMetaWidgetsLibModule>;
|
|
46
47
|
}
|
package/package.json
CHANGED
package/public-api.d.ts
CHANGED
|
@@ -7,5 +7,4 @@ export * from './lib/components/node-list/node-list.component';
|
|
|
7
7
|
export * from './lib/components/collection-issues/collection-issues.component';
|
|
8
8
|
export * from './lib/components/material-issues/material-issues.component';
|
|
9
9
|
export * from './lib/collection-count-history/collection-count-history.component';
|
|
10
|
-
export * from './lib/materialtypes-by-sources/materialtypes-by-sources.component';
|
|
11
10
|
export * from './lib/counts-with-history/counts-with-history.component';
|
|
@@ -1,148 +0,0 @@
|
|
|
1
|
-
import { Component, signal } from '@angular/core';
|
|
2
|
-
import { MatCard, MatCardActions, MatCardContent, MatCardHeader, MatCardModule, MatCardTitle, } from '@angular/material/card';
|
|
3
|
-
import { MatTooltip } from '@angular/material/tooltip';
|
|
4
|
-
import { MatHeaderRow, MatHeaderRowDef, MatRow, MatRowDef, MatTable, MatTableModule } from '@angular/material/table';
|
|
5
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
6
|
-
import { TranslateModule } from '@ngx-translate/core';
|
|
7
|
-
import { NgClass, NgForOf, NgIf } from '@angular/common';
|
|
8
|
-
import { DateTime } from 'luxon';
|
|
9
|
-
import { finalize, takeUntil, tap } from 'rxjs/operators';
|
|
10
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
11
|
-
import { DatepickerComponent } from '../components/filter/datepicker/datepicker.component';
|
|
12
|
-
import { MatIcon } from '@angular/material/icon';
|
|
13
|
-
import * as i0 from "@angular/core";
|
|
14
|
-
import * as i1 from "../meta-api.service";
|
|
15
|
-
import * as i2 from "@angular/material/card";
|
|
16
|
-
import * as i3 from "@angular/material/table";
|
|
17
|
-
export class MaterialtypesBySourcesComponent {
|
|
18
|
-
constructor(metaApi) {
|
|
19
|
-
this.metaApi = metaApi;
|
|
20
|
-
this.isLoading = signal(true);
|
|
21
|
-
this.timeFilterLoaded = signal(false);
|
|
22
|
-
this.destroyed$ = new Subject();
|
|
23
|
-
this.recentTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
|
|
24
|
-
this.pastTypeCount$ = new BehaviorSubject({ columns: [], rows: [] });
|
|
25
|
-
this.columns = [];
|
|
26
|
-
/* In this widget's backend we do have data for today
|
|
27
|
-
* therefore we set the end date to today and use the timerange() endpoint to only set the start date
|
|
28
|
-
*/
|
|
29
|
-
this.range = new FormGroup({
|
|
30
|
-
start: new FormControl(),
|
|
31
|
-
end: new FormControl(DateTime.utc().startOf('day'), { nonNullable: true }),
|
|
32
|
-
});
|
|
33
|
-
this.DateTime = DateTime;
|
|
34
|
-
}
|
|
35
|
-
columnIdent(_index, col) {
|
|
36
|
-
return col.id;
|
|
37
|
-
}
|
|
38
|
-
get typeColumns() {
|
|
39
|
-
return this.columns.map((c) => c.id + '_type');
|
|
40
|
-
}
|
|
41
|
-
get recentColumns() {
|
|
42
|
-
return this.columns.map((c) => c.id + '_recent');
|
|
43
|
-
}
|
|
44
|
-
get pastColumns() {
|
|
45
|
-
return this.columns.map((c) => c.id + '_past');
|
|
46
|
-
}
|
|
47
|
-
get allColumns() {
|
|
48
|
-
//return this.recentColumns;
|
|
49
|
-
return this.pastColumns.flatMap((e, i) => [e, this.recentColumns[i]]);
|
|
50
|
-
}
|
|
51
|
-
pastTypeCount(row, columnid) {
|
|
52
|
-
if (!this.pastTypeCount$.value.rows.length) {
|
|
53
|
-
return {};
|
|
54
|
-
}
|
|
55
|
-
const past_row = this.pastTypeCount$.value.rows.find((pr) => pr.meta.id == row.meta.id);
|
|
56
|
-
const past_column = this.pastTypeCount$.value.columns.find((c) => c.id == columnid);
|
|
57
|
-
if (!past_row || !past_column) {
|
|
58
|
-
return {};
|
|
59
|
-
}
|
|
60
|
-
const currentValue = row.counts[columnid];
|
|
61
|
-
const pastValue = past_row.counts[columnid];
|
|
62
|
-
const delta = (currentValue || 0) - (pastValue || 0);
|
|
63
|
-
const trend = delta === 0 ? 'trending_flat' : delta < 0 ? 'trending_down' : 'trending_up';
|
|
64
|
-
return { delta, trend, value: pastValue };
|
|
65
|
-
}
|
|
66
|
-
registerDateRangeFilter() {
|
|
67
|
-
/* we cannot use the takeUntilDestroyed() helper here,
|
|
68
|
-
* because this method is indirectly called in the finalization of the getTimerangeFilter() call
|
|
69
|
-
*/
|
|
70
|
-
this.range.controls.end.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe((date) => {
|
|
71
|
-
this.getCountByDate(date).subscribe((response) => {
|
|
72
|
-
this.recentTypeCount$.next(response);
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
this.range.controls.start.valueChanges.pipe(takeUntil(this.destroyed$)).subscribe((date) => {
|
|
76
|
-
this.getCountByDate(date).subscribe((response) => {
|
|
77
|
-
this.pastTypeCount$.next(response);
|
|
78
|
-
});
|
|
79
|
-
});
|
|
80
|
-
}
|
|
81
|
-
getTimeRangeFilter() {
|
|
82
|
-
return this.metaApi
|
|
83
|
-
.getTimerangeFilter()
|
|
84
|
-
.pipe(finalize(() => {
|
|
85
|
-
this.timeFilterLoaded.set(true);
|
|
86
|
-
this.registerDateRangeFilter();
|
|
87
|
-
}))
|
|
88
|
-
.subscribe((rangeFilter) => {
|
|
89
|
-
if (rangeFilter) {
|
|
90
|
-
const startDate = DateTime.fromISO(rangeFilter.values.find((v) => v.id === 'rangeStart')?.label, {
|
|
91
|
-
zone: 'utc',
|
|
92
|
-
}).startOf('day');
|
|
93
|
-
this.range.setControl('start', new FormControl(startDate, { nonNullable: true }));
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
getCountByDate(date) {
|
|
98
|
-
this.isLoading.set(true);
|
|
99
|
-
const filter = {
|
|
100
|
-
field: 'asOf',
|
|
101
|
-
values: [{ id: date.toISO({ includeOffset: false }), label: '' }],
|
|
102
|
-
};
|
|
103
|
-
return this.metaApi
|
|
104
|
-
.getMaterialTypeCountsByReplicationSource([filter])
|
|
105
|
-
.pipe(finalize(() => this.isLoading.set(false)));
|
|
106
|
-
}
|
|
107
|
-
ngOnInit() {
|
|
108
|
-
this.getTimeRangeFilter();
|
|
109
|
-
this.getCountByDate(this.range.controls.end.value)
|
|
110
|
-
.pipe(tap((response) => {
|
|
111
|
-
this.columns = response.columns.slice();
|
|
112
|
-
}))
|
|
113
|
-
.subscribe((response) => {
|
|
114
|
-
this.recentTypeCount$.next(response);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
ngOnDestroy() {
|
|
118
|
-
this.destroyed$.next();
|
|
119
|
-
this.destroyed$.complete();
|
|
120
|
-
}
|
|
121
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialtypesBySourcesComponent, deps: [{ token: i1.MetaApiService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
122
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MaterialtypesBySourcesComponent, isStandalone: true, selector: "metaqs2-content-type-count", ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header>\n <mat-card-title>\n Qualit\u00E4tsmetrik: Inhaltsarten von Quellen{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n <mat-card-actions align=\"end\">and some knops</mat-card-actions>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >{{col.label}}</th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">{{ row.counts[col.id] ?? 'n/a' }}</td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>.", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a,.mat-mdc-cell a{cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a:hover,.mat-mdc-cell a:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_up{color:#4abeff}.trending_down{color:#c20808}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { kind: "directive", type: i2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
|
|
123
|
-
}
|
|
124
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MaterialtypesBySourcesComponent, decorators: [{
|
|
125
|
-
type: Component,
|
|
126
|
-
args: [{ selector: 'metaqs2-content-type-count', standalone: true, imports: [
|
|
127
|
-
MatCardModule,
|
|
128
|
-
MatCard,
|
|
129
|
-
MatCardHeader,
|
|
130
|
-
MatCardTitle,
|
|
131
|
-
MatCardContent,
|
|
132
|
-
MatCardActions,
|
|
133
|
-
MatTooltip,
|
|
134
|
-
MatTableModule,
|
|
135
|
-
MatTable,
|
|
136
|
-
TranslateModule,
|
|
137
|
-
MatHeaderRow,
|
|
138
|
-
MatHeaderRowDef,
|
|
139
|
-
MatRow,
|
|
140
|
-
MatRowDef,
|
|
141
|
-
NgForOf,
|
|
142
|
-
DatepickerComponent,
|
|
143
|
-
NgClass,
|
|
144
|
-
MatIcon,
|
|
145
|
-
NgIf,
|
|
146
|
-
], template: "<mat-card appearance=\"raised\">\n <mat-card-header>\n <mat-card-title>\n Qualit\u00E4tsmetrik: Inhaltsarten von Quellen{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n <mat-card-actions align=\"end\">and some knops</mat-card-actions>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >{{col.label}}</th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">{{ row.counts[col.id] ?? 'n/a' }}</td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>.", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a,.mat-mdc-cell a{cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a:hover,.mat-mdc-cell a:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_up{color:#4abeff}.trending_down{color:#c20808}\n"] }]
|
|
147
|
-
}], ctorParameters: () => [{ type: i1.MetaApiService }] });
|
|
148
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0ZXJpYWx0eXBlcy1ieS1zb3VyY2VzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9tYXRlcmlhbHR5cGVzLWJ5LXNvdXJjZXMvbWF0ZXJpYWx0eXBlcy1ieS1zb3VyY2VzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9tYXRlcmlhbHR5cGVzLWJ5LXNvdXJjZXMvbWF0ZXJpYWx0eXBlcy1ieS1zb3VyY2VzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQ0wsT0FBTyxFQUNQLGNBQWMsRUFDZCxjQUFjLEVBQ2QsYUFBYSxFQUNiLGFBQWEsRUFDYixZQUFZLEdBQ2IsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFlBQVksRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDckgsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDaEQsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RELE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3pELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUQsT0FBTyxF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RWQsZUFBZSwrQkFLZixPQUFPLG1IQUNQLG1CQUFtQixtR0FDbkIsT0FBTyxvRkFDUCxPQUFPLDJJQUNQLElBQUk7OzRGQU1LLCtCQUErQjtrQkE1QjNDLFNBQVM7K0JBQ0UsNEJBQTRCLGNBQzFCLElBQUksV0FDUDt3QkFDUCxhQUFhO3dCQUNiLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsY0FBYzt3QkFDZCxVQUFVO3dCQUNWLGNBQWM7d0JBQ2QsUUFBUTt3QkFDUixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixNQUFNO3dCQUNOLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxJQUFJO3FCQUNMIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1xuICBNYXRDYXJkLFxuICBNYXRDYXJkQWN0aW9ucyxcbiAgTWF0Q2FyZENvbnRlbnQsXG4gIE1hdENhcmRIZWFkZXIsXG4gIE1hdENhcmRNb2R1bGUsXG4gIE1hdENhcmRUaXRsZSxcbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRIZWFkZXJSb3csIE1hdEhlYWRlclJvd0RlZiwgTWF0Um93LCBNYXRSb3dEZWYsIE1hdFRhYmxlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIsIE1hdHJpeFJvd1dpdGhDb3VudHMsIE1hdHJpeFdpdGhDb3VudHMsIFF1YWxpdHlNYXRyaXhIZWFkZXIgfSBmcm9tICcuLi9qYXZhLWFwaSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IGZpbmFsaXplLCB0YWtlVW50aWwsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBEYXRlcGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcG9uZW50cy9maWx0ZXIvZGF0ZXBpY2tlci9kYXRlcGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBNYXRJY29uIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21ldGFxczItY29udGVudC10eXBlLWNvdW50JyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIE1hdENhcmRNb2R1bGUsXG4gICAgTWF0Q2FyZCxcbiAgICBNYXRDYXJkSGVhZGVyLFxuICAgIE1hdENhcmRUaXRsZSxcbiAgICBNYXRDYXJkQ29udGVudCxcbiAgICBNYXRDYXJkQWN0aW9ucyxcbiAgICBNYXRUb29sdGlwLFxuICAgIE1hdFRhYmxlTW9kdWxlLFxuICAgIE1hdFRhYmxlLFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBNYXRIZWFkZXJSb3csXG4gICAgTWF0SGVhZGVyUm93RGVmLFxuICAgIE1hdFJvdyxcbiAgICBNYXRSb3dEZWYsXG4gICAgTmdGb3JPZixcbiAgICBEYXRlcGlja2VyQ29tcG9uZW50LFxuICAgIE5nQ2xhc3MsXG4gICAgTWF0SWNvbixcbiAgICBOZ0lmLFxuICBdLFxuICAvL2NoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICB0ZW1wbGF0ZVVybDogJy4vbWF0ZXJpYWx0eXBlcy1ieS1zb3VyY2VzLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL21hdGVyaWFsdHlwZXMtYnktc291cmNlcy5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIE1hdGVyaWFsdHlwZXNCeVNvdXJjZXNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lRmlsdGVyTG9hZGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlY2VudFR5cGVDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hdHJpeFdpdGhDb3VudHM+KHsgY29sdW1uczogW10sIHJvd3M6IFtdIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFzdFR5cGVDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hdHJpeFdpdGhDb3VudHM+KHsgY29sdW1uczogW10sIHJvd3M6IFtdIH0pO1xuICBwcml2YXRlIGNvbHVtbnM6IFF1YWxpdHlNYXRyaXhIZWFkZXJbXSA9IFtdO1xuICAvKiBJbiB0aGlzIHdpZGdldCdzIGJhY2tlbmQgd2UgZG8gaGF2ZSBkYXRhIGZvciB0b2RheVxuICAgKiB0aGVyZWZvcmUgd2Ugc2V0IHRoZSBlbmQgZGF0ZSB0byB0b2RheSBhbmQgdXNlIHRoZSB0aW1lcmFuZ2UoKSBlbmRwb2ludCB0byBvbmx5IHNldCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cDx7XG4gICAgc3RhcnQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgICBlbmQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgfT4gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woRGF0ZVRpbWUudXRjKCkuc3RhcnRPZignZGF5JyksIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWV0YUFwaTogTWV0YUFwaVNlcnZpY2UpIHt9XG4gIGNvbHVtbklkZW50KF9pbmRleDogbnVtYmVyLCBjb2w6IFF1YWxpdHlNYXRyaXhIZWFkZXIpIHtcbiAgICByZXR1cm4gY29sLmlkO1xuICB9XG5cbiAgZ2V0IHR5cGVDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfdHlwZScpO1xuICB9XG5cbiAgZ2V0IHJlY2VudENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ19yZWNlbnQnKTtcbiAgfVxuXG4gIGdldCBwYXN0Q29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3Bhc3QnKTtcbiAgfVxuXG4gIGdldCBhbGxDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICAvL3JldHVybiB0aGlzLnJlY2VudENvbHVtbnM7XG4gICAgcmV0dXJuIHRoaXMucGFzdENvbHVtbnMuZmxhdE1hcCgoZSwgaSkgPT4gW2UsIHRoaXMucmVjZW50Q29sdW1uc1tpXV0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhc3RUeXBlQ291bnQocm93OiBNYXRyaXhSb3dXaXRoQ291bnRzLCBjb2x1bW5pZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpIHtcbiAgICAvKiB3ZSBjYW5ub3QgdXNlIHRoZSB0YWtlVW50aWxEZXN0cm95ZWQoKSBoZWxwZXIgaGVyZSxcbiAgICAgKiBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGluZGlyZWN0bHkgY2FsbGVkIGluIHRoZSBmaW5hbGl6YXRpb24gb2YgdGhlIGdldFRpbWVyYW5nZUZpbHRlcigpIGNhbGxcbiAgICAgKi9cbiAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XG4gICAgICB0aGlzLmdldENvdW50QnlEYXRlKGRhdGUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5yZWNlbnRUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5yYW5nZS5jb250cm9scy5zdGFydC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XG4gICAgICB0aGlzLmdldENvdW50QnlEYXRlKGRhdGUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5wYXN0VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaW1lUmFuZ2VGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVxuICAgICAgLmdldFRpbWVyYW5nZUZpbHRlcigpXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGltZUZpbHRlckxvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpO1xuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmFuZ2VGaWx0ZXIpID0+IHtcbiAgICAgICAgaWYgKHJhbmdlRmlsdGVyKSB7XG4gICAgICAgICAgY29uc3Qgc3RhcnREYXRlID0gRGF0ZVRpbWUuZnJvbUlTTyhyYW5nZUZpbHRlci52YWx1ZXMuZmluZCgodikgPT4gdi5pZCA9PT0gJ3JhbmdlU3RhcnQnKT8ubGFiZWwhLCB7XG4gICAgICAgICAgICB6b25lOiAndXRjJyxcbiAgICAgICAgICB9KS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgICB0aGlzLnJhbmdlLnNldENvbnRyb2woJ3N0YXJ0JywgbmV3IEZvcm1Db250cm9sPERhdGVUaW1lPihzdGFydERhdGUsIHsgbm9uTnVsbGFibGU6IHRydWUgfSkpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q291bnRCeURhdGUoZGF0ZTogRGF0ZVRpbWUpIHtcbiAgICB0aGlzLmlzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgY29uc3QgZmlsdGVyOiBGaWx0ZXIgPSB7XG4gICAgICBmaWVsZDogJ2FzT2YnLFxuICAgICAgdmFsdWVzOiBbeyBpZDogZGF0ZS50b0lTTyh7IGluY2x1ZGVPZmZzZXQ6IGZhbHNlIH0pISwgbGFiZWw6ICcnIH1dLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVxuICAgICAgLmdldE1hdGVyaWFsVHlwZUNvdW50c0J5UmVwbGljYXRpb25Tb3VyY2UoW2ZpbHRlcl0pXG4gICAgICAucGlwZShmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKSk7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmdldFRpbWVSYW5nZUZpbHRlcigpO1xuICAgIHRoaXMuZ2V0Q291bnRCeURhdGUodGhpcy5yYW5nZS5jb250cm9scy5lbmQudmFsdWUpXG4gICAgICAucGlwZShcbiAgICAgICAgdGFwKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMuY29sdW1ucyA9IHJlc3BvbnNlLmNvbHVtbnMuc2xpY2UoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IERhdGVUaW1lID0gRGF0ZVRpbWU7XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3llZCQuY29tcGxldGUoKTtcbiAgfVxufVxuIiwiPG1hdC1jYXJkIGFwcGVhcmFuY2U9XCJyYWlzZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlcj5cbiAgICA8bWF0LWNhcmQtdGl0bGU+XG4gICAgICBRdWFsaXTDpHRzbWV0cmlrOiBJbmhhbHRzYXJ0ZW4gdm9uIFF1ZWxsZW57e2lzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCJ9fVxuICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gIDwvbWF0LWNhcmQtaGVhZGVyPlxuICA8IS0tIGNvbnNpZGVyIHRvIHB1dCB0aGUgZmlsdGVyIGluIHRoZSB0YWJsZSBoZWFkZXIgdG8gYXZvaWQgdGhhdCBpdCBpcyBzY3JvbGxlZCBvdXQgb2Ygdmlldy0tPlxuICA8IS0tIHNob3cgdGhlIGZpbHRlciBhZnRlciB0aGUgdmFsdWVzIGFyZSBsb2FkZWQgdG8gYXZvaWQgbG9hZGluZyBjdXJyZW50IGRhdGEgdHdpY2UgLS0+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpXCI+XG4gICAgPG1ldGFxczItZGF0ZXBpY2tlciBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKClcIiBbaW5wdXRHcm91cF09XCJyYW5nZVwiID48L21ldGFxczItZGF0ZXBpY2tlcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuICA8bWF0LWNhcmQtYWN0aW9ucyBhbGlnbj1cImVuZFwiPmFuZCBzb21lIGtub3BzPC9tYXQtY2FyZC1hY3Rpb25zPlxuPC9tYXQtY2FyZD5cbjxtYXQtY2FyZD5cbiAgPHRhYmxlIFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3NcIiBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIHJvd3NwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlF1ZWxsZTwvdGg+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgbWF0VG9vbHRpcD1cInt7cm93Lm1ldGEuYWx0X2xhYmVsfX1cIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbFwiXG4gICAgICA+XG4gICAgICAgIHt7cm93Lm1ldGEubGFiZWx9fVxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3R5cGUnXCI+XG4gICAgICA8dGggY29sc3Bhbj1cIjJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cInt7Y29sLmxhYmVsfX1cIiA+e3tjb2wubGFiZWx9fTwvdGg+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBtb3N0IGN1cnJlbnQgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiByZWNlbnRUeXBlQ291bnQkLnZhbHVlLmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIiBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcmVjZW50J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID57eyByYW5nZS5jb250cm9scy5lbmQudmFsdWUudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9TSE9SVCkgfX08L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicmVjZW50LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvd1wiPnt7IHJvdy5jb3VudHNbY29sLmlkXSA/PyAnbi9hJyB9fTwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBvbmUgY29sdW1uIGZvciBlYWNoIHR5cGUgZm9yIHRoZSBvbGRlciBkYXRlLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ19wYXN0J1wiPlxuICAgICAgPHRoIGNsYXNzPVwicGFzdC1kYXRhLWNlbGxcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cIm5vIHRvb2x0aXBcIiA+XG4gICAgICAgIHt7IHBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoID8gcmFuZ2UuY29udHJvbHMuc3RhcnQudmFsdWUudG9Mb2NhbGVTdHJpbmcoRGF0ZVRpbWUuREFURV9TSE9SVCkgOiAnbm8gcGFzdCBkYXRhJyB9fVxuICAgICAgPC90aD5cbiAgICAgIDx0ZCBjbGFzcz1cInBhc3QtZGF0YS1jZWxsXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93O1wiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGggJiYgcGFzdFR5cGVDb3VudChyb3csIGNvbC5pZCkgYXMgdHJlbmRcIj5cbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCJ0cmVuZC50cmVuZFwiPiB7eyB0cmVuZC52YWx1ZSA/PyAnbi9hJyB9fTxtYXQtaWNvbiBhcmlhLWhpZGRlbj1cImZhbHNlXCIgW2F0dHIuYXJpYS1sYWJlbF09XCJ0cmVuZC50cmVuZFwiIFtmb250SWNvbl09XCJ0cmVuZC50cmVuZCFcIiAvPjwvc3Bhbj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImNkay12aXN1YWxseS1oaWRkZW5cIj57e3RyZW5kLnRyZW5kfX08L3NwYW4+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIGdlbmVyYXRlIGFjdHVhbCB0YWJsZSAtLT5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cIlsnbGFiZWwtY29sJ10uY29uY2F0KHR5cGVDb2x1bW5zKTsgc3RpY2t5OnRydWU7XCI+PC90cj5cbiAgICA8dHIgbWF0LWhlYWRlci1yb3cgKm1hdEhlYWRlclJvd0RlZj1cImFsbENvbHVtbnM7IHN0aWNreTogdHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtcm93ICptYXRSb3dEZWY9XCJsZXQgcm93OyBjb2x1bW5zOiBbJ2xhYmVsLWNvbCddLmNvbmNhdChhbGxDb2x1bW5zKVwiPjwvdHI+XG5cbiAgPC90YWJsZT5cbjwvbWF0LWNhcmQ+LiJdfQ==
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { OnDestroy, OnInit } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { MetaApiService } from '../meta-api.service';
|
|
4
|
-
import { MatrixRowWithCounts, MatrixWithCounts, QualityMatrixHeader } from '../java-api';
|
|
5
|
-
import { DateTime } from 'luxon';
|
|
6
|
-
import { FormControl, FormGroup } from '@angular/forms';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export declare class MaterialtypesBySourcesComponent implements OnInit, OnDestroy {
|
|
9
|
-
private readonly metaApi;
|
|
10
|
-
protected readonly isLoading: import("@angular/core").WritableSignal<boolean>;
|
|
11
|
-
protected readonly timeFilterLoaded: import("@angular/core").WritableSignal<boolean>;
|
|
12
|
-
private readonly destroyed$;
|
|
13
|
-
protected readonly recentTypeCount$: BehaviorSubject<MatrixWithCounts>;
|
|
14
|
-
protected readonly pastTypeCount$: BehaviorSubject<MatrixWithCounts>;
|
|
15
|
-
private columns;
|
|
16
|
-
readonly range: FormGroup<{
|
|
17
|
-
start: FormControl<DateTime<boolean>>;
|
|
18
|
-
end: FormControl<DateTime<boolean>>;
|
|
19
|
-
}>;
|
|
20
|
-
constructor(metaApi: MetaApiService);
|
|
21
|
-
columnIdent(_index: number, col: QualityMatrixHeader): string;
|
|
22
|
-
get typeColumns(): string[];
|
|
23
|
-
get recentColumns(): string[];
|
|
24
|
-
get pastColumns(): string[];
|
|
25
|
-
get allColumns(): string[];
|
|
26
|
-
protected pastTypeCount(row: MatrixRowWithCounts, columnid: string): {
|
|
27
|
-
delta?: undefined;
|
|
28
|
-
trend?: undefined;
|
|
29
|
-
value?: undefined;
|
|
30
|
-
} | {
|
|
31
|
-
delta: number;
|
|
32
|
-
trend: string;
|
|
33
|
-
value: number;
|
|
34
|
-
};
|
|
35
|
-
private registerDateRangeFilter;
|
|
36
|
-
private getTimeRangeFilter;
|
|
37
|
-
private getCountByDate;
|
|
38
|
-
ngOnInit(): void;
|
|
39
|
-
protected readonly DateTime: typeof DateTime;
|
|
40
|
-
ngOnDestroy(): void;
|
|
41
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<MaterialtypesBySourcesComponent, never>;
|
|
42
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<MaterialtypesBySourcesComponent, "metaqs2-content-type-count", never, {}, {}, never, never, true, never>;
|
|
43
|
-
}
|