@kuzntsv/uikit 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +63 -0
- package/assets/_navbar-theme.scss +25 -0
- package/auth/auth.types.d.ts +1 -0
- package/auth/directives/disable-if-role.directive.d.ts +12 -0
- package/auth/directives/disable-if-unauthorized.directive.d.ts +13 -0
- package/auth/directives/hide-if-role-not.directive.d.ts +12 -0
- package/auth/directives/hide-if-unauthorized.directive.d.ts +13 -0
- package/auth/directives/index.d.ts +4 -0
- package/auth/index.d.ts +4 -0
- package/auth/login-form.component.d.ts +16 -0
- package/auth/login-page.component.d.ts +29 -0
- package/auth/models/user.d.ts +7 -0
- package/auth/permit-form.component.d.ts +18 -0
- package/auth/services/auth-guard.service.d.ts +2 -0
- package/auth/services/auth-role.service.d.ts +10 -0
- package/auth/services/auth-user.service.d.ts +35 -0
- package/auth/services/auth.service.d.ts +44 -0
- package/auth/services/index.d.ts +5 -0
- package/auth/services/role-guard.service.d.ts +2 -0
- package/base/base-classes/base-class.d.ts +3 -0
- package/base/base-classes/base-edit-class.d.ts +17 -0
- package/base/base-classes/base-edit-dialog-data.d.ts +9 -0
- package/base/base-classes/base-entity-action.d.ts +10 -0
- package/base/base-classes/base-filter-class.d.ts +7 -0
- package/base/base-classes/base-nav-bar-menu-class.d.ts +11 -0
- package/base/base-classes/base-page-class.d.ts +117 -0
- package/base/base-classes/base-service-class.d.ts +23 -0
- package/base/base-classes/index.d.ts +8 -0
- package/base/base-toolbar/base-toolbar.service.d.ts +7 -0
- package/base/base-toolbar/components/base-toolbar.component.d.ts +67 -0
- package/base/index.d.ts +2 -0
- package/base/interfaces/alert-service.interface.d.ts +44 -0
- package/base/interfaces/index.d.ts +1 -0
- package/core/animations/animations.service.d.ts +10 -0
- package/core/animations/index.d.ts +2 -0
- package/core/animations/route.animations.d.ts +6 -0
- package/core/index.d.ts +1 -0
- package/fesm2022/kuzntsv-uikit.mjs +2540 -0
- package/fesm2022/kuzntsv-uikit.mjs.map +1 -0
- package/guards/index.d.ts +1 -0
- package/guards/redirect-guard.d.ts +8 -0
- package/index.d.ts +5 -0
- package/loader/index.d.ts +2 -0
- package/loader/loader.service.d.ts +11 -0
- package/loader/progress-spinner.component.d.ts +9 -0
- package/models/deserializable.model.d.ts +3 -0
- package/models/environment.model.d.ts +12 -0
- package/models/index.d.ts +3 -0
- package/models/sec-user-view.model.d.ts +16 -0
- package/models/sec-user.model.d.ts +12 -0
- package/package.json +23 -0
- package/pipes/index.d.ts +3 -0
- package/pipes/safe.pipe.d.ts +10 -0
- package/pipes/time.pipe.d.ts +7 -0
- package/pipes/truncate.pipe.d.ts +7 -0
- package/public-api.d.ts +10 -0
- package/services/alert.service.d.ts +16 -0
- package/services/avatar.service.d.ts +11 -0
- package/services/export.service.d.ts +9 -0
- package/services/index.d.ts +4 -0
- package/services/local-storage-service.d.ts +10 -0
- package/services/log.service.d.ts +10 -0
- package/shared/chip-input-autocomplete/chip-input-autocomplete.component.d.ts +28 -0
- package/shared/chip-input-autocomplete/index.d.ts +2 -0
- package/shared/chip-input-autocomplete/models/chip-item.d.ts +4 -0
- package/shared/chip-input-autocomplete/models/index.d.ts +1 -0
- package/shared/date-range-filter/date-range-filter.component.d.ts +22 -0
- package/shared/date-range-filter/index.d.ts +2 -0
- package/shared/date-range-filter/models/date-formats.d.ts +11 -0
- package/shared/date-range-filter/models/date-range.d.ts +5 -0
- package/shared/date-range-filter/models/index.d.ts +2 -0
- package/shared/dialog/dialog.component.d.ts +11 -0
- package/shared/dialog/index.d.ts +2 -0
- package/shared/dialog/models/dialog-action.d.ts +6 -0
- package/shared/dialog/models/dialog-data.d.ts +7 -0
- package/shared/dialog/models/index.d.ts +2 -0
- package/shared/index.d.ts +9 -0
- package/shared/logo/imz-logo.component.d.ts +5 -0
- package/shared/logo/index.d.ts +1 -0
- package/shared/navbar/index.d.ts +1 -0
- package/shared/navbar/navbar.d.ts +24 -0
- package/shared/not-found/index.d.ts +1 -0
- package/shared/not-found/not-found.component.d.ts +6 -0
- package/shared/select-autocomplete-with-virtual-scroll/index.d.ts +1 -0
- package/shared/select-autocomplete-with-virtual-scroll/models/index.d.ts +1 -0
- package/shared/select-autocomplete-with-virtual-scroll/models/select-item.d.ts +4 -0
- package/shared/select-autocomplete-with-virtual-scroll/select-autocomplete-with-virtual-scroll.component.d.ts +27 -0
- package/shared/select-with-group/index.d.ts +2 -0
- package/shared/select-with-group/models/index.d.ts +2 -0
- package/shared/select-with-group/models/select-group.d.ts +5 -0
- package/shared/select-with-group/models/select-item.d.ts +4 -0
- package/shared/select-with-group/select-with-group.component.d.ts +21 -0
- package/shared/table/index.d.ts +3 -0
- package/shared/table/models/column-options.interface.d.ts +26 -0
- package/shared/table/models/context-menu-options.interface.d.ts +22 -0
- package/shared/table/models/index.d.ts +2 -0
- package/shared/table/table.component.d.ts +75 -0
- package/shared/table/table.state.d.ts +11 -0
- package/types/index.d.ts +1 -0
- package/types/types.d.ts +6 -0
|
@@ -0,0 +1,2540 @@
|
|
|
1
|
+
import * as i0 from '@angular/core';
|
|
2
|
+
import { EventEmitter, HostListener, Output, ViewChild, Component, Input, Injectable, ChangeDetectionStrategy, Directive, inject, Inject, Pipe } from '@angular/core';
|
|
3
|
+
import { MatCard, MatCardHeader, MatCardTitle, MatCardContent } from '@angular/material/card';
|
|
4
|
+
import * as i1 from '@angular/forms';
|
|
5
|
+
import { FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
6
|
+
import { MatButton, MatIconButton, MatAnchor } from '@angular/material/button';
|
|
7
|
+
import { MatFormField, MatLabel, MatError, MatSuffix, MatHint } from '@angular/material/form-field';
|
|
8
|
+
import { MatIcon } from '@angular/material/icon';
|
|
9
|
+
import { MatInput } from '@angular/material/input';
|
|
10
|
+
import * as i1$2 from '@angular/common/http';
|
|
11
|
+
import { HttpHeaders, HttpClient, HttpParams } from '@angular/common/http';
|
|
12
|
+
import * as i2 from '@angular/router';
|
|
13
|
+
import { DefaultUrlSerializer, Router, RouterLink } from '@angular/router';
|
|
14
|
+
import { BehaviorSubject, Subject, Subscription, forkJoin, Observable, startWith } from 'rxjs';
|
|
15
|
+
import * as i1$1 from '@angular/material/snack-bar';
|
|
16
|
+
import { ComponentPortal } from '@angular/cdk/portal';
|
|
17
|
+
import { MatProgressSpinner } from '@angular/material/progress-spinner';
|
|
18
|
+
import * as i1$3 from '@angular/cdk/overlay';
|
|
19
|
+
import { map, debounceTime, distinctUntilChanged, startWith as startWith$1 } from 'rxjs/operators';
|
|
20
|
+
import { MatToolbar } from '@angular/material/toolbar';
|
|
21
|
+
import { MatTooltip } from '@angular/material/tooltip';
|
|
22
|
+
import { MatMenu, MatMenuTrigger, MatMenuItem, MatMenuContent } from '@angular/material/menu';
|
|
23
|
+
import { MatDivider } from '@angular/material/divider';
|
|
24
|
+
import * as i1$4 from '@angular/material/dialog';
|
|
25
|
+
import { MAT_DIALOG_DATA, MatDialogTitle, MatDialogContent, MatDialogActions, MatDialogClose, MatDialogConfig } from '@angular/material/dialog';
|
|
26
|
+
import { query, sequence, style, animate, stagger, trigger, transition } from '@angular/animations';
|
|
27
|
+
import * as i1$5 from '@angular/platform-browser';
|
|
28
|
+
import * as XLSX from 'xlsx';
|
|
29
|
+
import { ENTER, COMMA } from '@angular/cdk/keycodes';
|
|
30
|
+
import { AsyncPipe } from '@angular/common';
|
|
31
|
+
import * as i2$1 from '@angular/material/autocomplete';
|
|
32
|
+
import { MatAutocompleteModule, MatOption } from '@angular/material/autocomplete';
|
|
33
|
+
import * as i4 from '@angular/material/chips';
|
|
34
|
+
import { MatChipsModule } from '@angular/material/chips';
|
|
35
|
+
import * as i3 from '@angular/material/core';
|
|
36
|
+
import { MAT_DATE_LOCALE, MAT_DATE_FORMATS, MatOption as MatOption$1, MatOptgroup } from '@angular/material/core';
|
|
37
|
+
import { MatDateRangeInput, MatStartDate, MatEndDate, MatDatepickerToggle, MatDateRangePicker } from '@angular/material/datepicker';
|
|
38
|
+
import 'moment/locale/ru';
|
|
39
|
+
import moment from 'moment';
|
|
40
|
+
import * as i4$1 from '@angular/cdk/scrolling';
|
|
41
|
+
import { ScrollingModule } from '@angular/cdk/scrolling';
|
|
42
|
+
import { MatSelect, MatFormField as MatFormField$1, MatLabel as MatLabel$1 } from '@angular/material/select';
|
|
43
|
+
import { SelectionModel } from '@angular/cdk/collections';
|
|
44
|
+
import { MatCheckbox } from '@angular/material/checkbox';
|
|
45
|
+
import { MatPaginator } from '@angular/material/paginator';
|
|
46
|
+
import { MatSort, MatSortHeader } from '@angular/material/sort';
|
|
47
|
+
import { MatTableDataSource, MatTable, MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatCellDef, MatCell, MatNoDataRow, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow } from '@angular/material/table';
|
|
48
|
+
|
|
49
|
+
class PermitFormComponent {
|
|
50
|
+
hidy;
|
|
51
|
+
submitted = new EventEmitter();
|
|
52
|
+
mouseEvent = MouseEvent;
|
|
53
|
+
constructor() {
|
|
54
|
+
}
|
|
55
|
+
mouseHandling() {
|
|
56
|
+
this.hidy?.nativeElement.focus();
|
|
57
|
+
}
|
|
58
|
+
ngOnInit() {
|
|
59
|
+
// Обнуляем значение Input
|
|
60
|
+
if (this.hidy) {
|
|
61
|
+
this.hidy.nativeElement.value = null;
|
|
62
|
+
this.hidy.nativeElement.focus();
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Поле ввода
|
|
67
|
+
*
|
|
68
|
+
* @param событие нажатия на клавишу
|
|
69
|
+
*/
|
|
70
|
+
onKeydown(event) {
|
|
71
|
+
if (event.key === 'Enter') {
|
|
72
|
+
const permit = this.hidy?.nativeElement.value;
|
|
73
|
+
if (permit) {
|
|
74
|
+
this.submitted.emit(permit);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: PermitFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
79
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: PermitFormComponent, isStandalone: true, selector: "lib-permit-form", outputs: { submitted: "submitted" }, host: { listeners: { "document:mouseup": "mouseHandling($event)" } }, viewQueries: [{ propertyName: "hidy", first: true, predicate: ["hidy"], descendants: true }], ngImport: i0, template: `
|
|
80
|
+
<mat-card appearance="outlined">
|
|
81
|
+
<mat-card-header>
|
|
82
|
+
<mat-card-title>
|
|
83
|
+
Приложите пропуск
|
|
84
|
+
</mat-card-title>
|
|
85
|
+
</mat-card-header>
|
|
86
|
+
<mat-card-content>
|
|
87
|
+
<div class="permit"></div>
|
|
88
|
+
</mat-card-content>
|
|
89
|
+
</mat-card>
|
|
90
|
+
<input #hidy class="hidy" type="text" (keydown)="onKeydown($event)"/>
|
|
91
|
+
`, isInline: true, styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-title,mat-card-content{display:flex;justify-content:center}mat-card-content{font-size:16px}div.permit{border:none;width:300px;background-size:300px;height:180px}div.permit button div{margin-bottom:200px;color:#000;font-size:34px}input.hidy{opacity:0;position:absolute;left:-200px;top:-200px}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }] });
|
|
92
|
+
}
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: PermitFormComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'lib-permit-form', template: `
|
|
96
|
+
<mat-card appearance="outlined">
|
|
97
|
+
<mat-card-header>
|
|
98
|
+
<mat-card-title>
|
|
99
|
+
Приложите пропуск
|
|
100
|
+
</mat-card-title>
|
|
101
|
+
</mat-card-header>
|
|
102
|
+
<mat-card-content>
|
|
103
|
+
<div class="permit"></div>
|
|
104
|
+
</mat-card-content>
|
|
105
|
+
</mat-card>
|
|
106
|
+
<input #hidy class="hidy" type="text" (keydown)="onKeydown($event)"/>
|
|
107
|
+
`, imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent], styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-title,mat-card-content{display:flex;justify-content:center}mat-card-content{font-size:16px}div.permit{border:none;width:300px;background-size:300px;height:180px}div.permit button div{margin-bottom:200px;color:#000;font-size:34px}input.hidy{opacity:0;position:absolute;left:-200px;top:-200px}\n"] }]
|
|
108
|
+
}], ctorParameters: () => [], propDecorators: { hidy: [{
|
|
109
|
+
type: ViewChild,
|
|
110
|
+
args: ['hidy']
|
|
111
|
+
}], submitted: [{
|
|
112
|
+
type: Output
|
|
113
|
+
}], mouseHandling: [{
|
|
114
|
+
type: HostListener,
|
|
115
|
+
args: ['document:mouseup', ['$event']]
|
|
116
|
+
}] } });
|
|
117
|
+
|
|
118
|
+
class LoginFormComponent {
|
|
119
|
+
errorMessage = '';
|
|
120
|
+
submitted = new EventEmitter();
|
|
121
|
+
hide = true;
|
|
122
|
+
form = new FormGroup({
|
|
123
|
+
username: new FormControl('', [Validators.required]),
|
|
124
|
+
password: new FormControl('', [Validators.required]),
|
|
125
|
+
});
|
|
126
|
+
isDisabled = false;
|
|
127
|
+
constructor() { }
|
|
128
|
+
set pending(isPending) {
|
|
129
|
+
this.isDisabled = isPending;
|
|
130
|
+
if (isPending) {
|
|
131
|
+
this.form.disable();
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.form.enable();
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
submit() {
|
|
138
|
+
if (this.form.valid) {
|
|
139
|
+
this.submitted.emit(this.form.value);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
143
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: LoginFormComponent, isStandalone: true, selector: "lib-login-form", inputs: { errorMessage: "errorMessage", pending: "pending" }, outputs: { submitted: "submitted" }, ngImport: i0, template: "<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 (\u041F\u0440\u0438\u043C\u0435\u0440: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u041F\u0430\u0440\u043E\u043B\u044C</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"\u041F\u0430\u0440\u043E\u043B\u044C\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage) {\r\n <p class=\"loginError\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\">\u0412\u043E\u0439\u0442\u0438</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n", styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-header{justify-content:center}mat-card-content{font-size:16px}.loginError{padding:16px;width:300px;color:#fff;background-color:red}.loginButtons{display:flex;flex-direction:row;justify-content:flex-end}.watcher{cursor:default}\n"], dependencies: [{ kind: "component", type: MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "component", type: MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatCardContent, selector: "mat-card-content" }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }] });
|
|
144
|
+
}
|
|
145
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginFormComponent, decorators: [{
|
|
146
|
+
type: Component,
|
|
147
|
+
args: [{ selector: 'lib-login-form', imports: [MatCard, MatCardHeader, MatCardTitle, MatCardContent, FormsModule, ReactiveFormsModule, MatFormField, MatLabel, MatInput, MatError, MatIcon, MatSuffix, MatButton], template: "<mat-card appearance=\"outlined\">\r\n <mat-card-header>\r\n <mat-card-title>\r\n \u0410\u0432\u0442\u043E\u0440\u0438\u0437\u0430\u0446\u0438\u044F\r\n </mat-card-title>\r\n </mat-card-header>\r\n <mat-card-content>\r\n <form [formGroup]=\"form\" (ngSubmit)=\"submit()\">\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F</mat-label>\r\n <input type=\"text\" pattern=\"[A-Za-z]{1,}.[A-Za-z]{1,}.[A-Za-z]*\"\r\n matInput\r\n autocomplete=\"on\"\r\n name=\"login-form-username\"\r\n placeholder=\"\u0418\u043C\u044F \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044F\"\r\n formControlName=\"username\">\r\n @if (form.controls['username'].hasError('pattern')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0439\u0442\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u043C\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 (\u041F\u0440\u0438\u043C\u0435\u0440: a.p.petrov)\r\n </mat-error>\r\n }\r\n @if (form.controls['username'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n <p>\r\n <mat-form-field>\r\n <mat-label>\u041F\u0430\u0440\u043E\u043B\u044C</mat-label>\r\n <input [type]=\"hide ? 'password' : 'text'\" matInput placeholder=\"\u041F\u0430\u0440\u043E\u043B\u044C\" formControlName=\"password\">\r\n <mat-icon class=\"watcher\" matSuffix (mousedown)=\"hide=false\" (mouseup)=\"hide=true\"\r\n >{{ hide ? 'visibility_off' : 'visibility'}}</mat-icon>\r\n @if (form.controls['password'].hasError('required')) {\r\n <mat-error>\r\n \u041F\u043E\u0436\u0430\u043B\u0443\u0439\u0441\u0442\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u0438\u0442\u0435 \u044D\u0442\u043E \u043F\u043E\u043B\u0435\r\n </mat-error>\r\n }\r\n </mat-form-field>\r\n </p>\r\n\r\n @if (errorMessage) {\r\n <p class=\"loginError\">\r\n {{ errorMessage }}\r\n </p>\r\n }\r\n\r\n <p class=\"loginButtons\">\r\n <button type=\"submit\" mat-button mat-stroked-button color=\"primary\" [disabled]=\"isDisabled\">\u0412\u043E\u0439\u0442\u0438</button>\r\n </p>\r\n\r\n </form>\r\n </mat-card-content>\r\n </mat-card>\r\n", styles: [":host{display:flex;justify-content:center;margin:32px 0}.mat-mdc-form-field{width:100%;min-width:300px}mat-card-header{justify-content:center}mat-card-content{font-size:16px}.loginError{padding:16px;width:300px;color:#fff;background-color:red}.loginButtons{display:flex;flex-direction:row;justify-content:flex-end}.watcher{cursor:default}\n"] }]
|
|
148
|
+
}], ctorParameters: () => [], propDecorators: { errorMessage: [{
|
|
149
|
+
type: Input
|
|
150
|
+
}], submitted: [{
|
|
151
|
+
type: Output
|
|
152
|
+
}], pending: [{
|
|
153
|
+
type: Input
|
|
154
|
+
}] } });
|
|
155
|
+
|
|
156
|
+
class Environment {
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
class LogService {
|
|
160
|
+
env;
|
|
161
|
+
logPrefix = '';
|
|
162
|
+
constructor(env) {
|
|
163
|
+
this.env = env;
|
|
164
|
+
}
|
|
165
|
+
log(...args) {
|
|
166
|
+
if (!this.env.production) {
|
|
167
|
+
// Prepend log prefix log string
|
|
168
|
+
args.unshift(this.logPrefix + ' ');
|
|
169
|
+
// Pass along arguments to console.log
|
|
170
|
+
console.log(args.join(' '));
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, deps: [{ token: Environment }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
174
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, providedIn: 'root' });
|
|
175
|
+
}
|
|
176
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LogService, decorators: [{
|
|
177
|
+
type: Injectable,
|
|
178
|
+
args: [{
|
|
179
|
+
providedIn: 'root'
|
|
180
|
+
}]
|
|
181
|
+
}], ctorParameters: () => [{ type: Environment }] });
|
|
182
|
+
|
|
183
|
+
// Сервис для вывода сообщений(ошибки, успеха)
|
|
184
|
+
class AlertService {
|
|
185
|
+
_snackBar;
|
|
186
|
+
// eslint-disable-next-line no-magic-numbers
|
|
187
|
+
duration = 5000;
|
|
188
|
+
constructor(_snackBar) {
|
|
189
|
+
this._snackBar = _snackBar;
|
|
190
|
+
}
|
|
191
|
+
openSnackBar(message, action, duration = this.duration) {
|
|
192
|
+
this._snackBar.open(message, action, {
|
|
193
|
+
duration,
|
|
194
|
+
panelClass: ['red-snackbar'],
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
success(message, duration = this.duration) {
|
|
198
|
+
this.openSnackBar(message, 'Закрыть', duration);
|
|
199
|
+
}
|
|
200
|
+
info(message, duration = this.duration) {
|
|
201
|
+
this.openSnackBar(message, 'Закрыть', duration);
|
|
202
|
+
}
|
|
203
|
+
helper(message, duration = this.duration) {
|
|
204
|
+
this.openSnackBar(message, 'Закрыть', duration);
|
|
205
|
+
}
|
|
206
|
+
warning(message, duration = this.duration) {
|
|
207
|
+
this.openSnackBar(message, 'Закрыть', duration);
|
|
208
|
+
}
|
|
209
|
+
error(message, duration = this.duration) {
|
|
210
|
+
this.openSnackBar(message, 'Закрыть', duration);
|
|
211
|
+
}
|
|
212
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, deps: [{ token: i1$1.MatSnackBar }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
213
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, providedIn: 'root' });
|
|
214
|
+
}
|
|
215
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AlertService, decorators: [{
|
|
216
|
+
type: Injectable,
|
|
217
|
+
args: [{
|
|
218
|
+
providedIn: 'root'
|
|
219
|
+
}]
|
|
220
|
+
}], ctorParameters: () => [{ type: i1$1.MatSnackBar }] });
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* Сущность пользователя из API
|
|
224
|
+
*/
|
|
225
|
+
class User {
|
|
226
|
+
id = 0;
|
|
227
|
+
username = '';
|
|
228
|
+
firstName = '';
|
|
229
|
+
lastName = '';
|
|
230
|
+
prof = '';
|
|
231
|
+
depart = 0;
|
|
232
|
+
area = '';
|
|
233
|
+
tabnum = '';
|
|
234
|
+
mail = '';
|
|
235
|
+
phone = '';
|
|
236
|
+
roles = '';
|
|
237
|
+
rolesArray = [];
|
|
238
|
+
roleList = [];
|
|
239
|
+
idHuman = '';
|
|
240
|
+
token = '';
|
|
241
|
+
// Время действия токена
|
|
242
|
+
expires_in = 0;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Сервис для работы с объектом в local Storage
|
|
246
|
+
*/
|
|
247
|
+
class UserService {
|
|
248
|
+
user;
|
|
249
|
+
constructor() {
|
|
250
|
+
if (localStorage.getItem('sed_currentUser')) {
|
|
251
|
+
this.user = JSON.parse(localStorage.getItem('sed_currentUser') || '');
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
this.user = new User();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
get dept() {
|
|
258
|
+
return this.user?.depart;
|
|
259
|
+
}
|
|
260
|
+
/** Получить данные о пользователе */
|
|
261
|
+
get userData() {
|
|
262
|
+
return this.user;
|
|
263
|
+
}
|
|
264
|
+
/** Изменить данные пользователя в localStorage */
|
|
265
|
+
set userData(user) {
|
|
266
|
+
localStorage.setItem('sed_currentUser', JSON.stringify(user));
|
|
267
|
+
this.user = JSON.parse(localStorage.getItem('sed_currentUser') || '');
|
|
268
|
+
}
|
|
269
|
+
/** Удаляет данные о пользователе из localStorage. */
|
|
270
|
+
removeUser() {
|
|
271
|
+
localStorage.removeItem('sed_currentUser');
|
|
272
|
+
}
|
|
273
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
274
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, providedIn: 'root' });
|
|
275
|
+
}
|
|
276
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: UserService, decorators: [{
|
|
277
|
+
type: Injectable,
|
|
278
|
+
args: [{
|
|
279
|
+
providedIn: 'root'
|
|
280
|
+
}]
|
|
281
|
+
}], ctorParameters: () => [] });
|
|
282
|
+
|
|
283
|
+
// Сервис авторизации
|
|
284
|
+
class AuthService {
|
|
285
|
+
http;
|
|
286
|
+
router;
|
|
287
|
+
console;
|
|
288
|
+
alertService;
|
|
289
|
+
user;
|
|
290
|
+
// Указываем какой сервер использовать
|
|
291
|
+
baseRoute = 'mainApi/';
|
|
292
|
+
// Хранит доступные пользователю действия
|
|
293
|
+
permissions = ['VIEW'];
|
|
294
|
+
defaultRoles = [];
|
|
295
|
+
// Хранит роли пользователя
|
|
296
|
+
roles$;
|
|
297
|
+
loggedIn$;
|
|
298
|
+
// Роль для скрытия элементов.
|
|
299
|
+
hideRole = 'HIDE';
|
|
300
|
+
// Объект, хранящий статус авторизации
|
|
301
|
+
defaultHeader = {
|
|
302
|
+
headers: new HttpHeaders().set('content-type', 'application/x-www-form-urlencoded')
|
|
303
|
+
};
|
|
304
|
+
idHuman;
|
|
305
|
+
constructor(http, router, console, alertService, user) {
|
|
306
|
+
this.http = http;
|
|
307
|
+
this.router = router;
|
|
308
|
+
this.console = console;
|
|
309
|
+
this.alertService = alertService;
|
|
310
|
+
this.user = user;
|
|
311
|
+
this.console.logPrefix = 'Auth Service';
|
|
312
|
+
this.idHuman = localStorage.getItem('id_human');
|
|
313
|
+
if (this.user?.userData?.roleList) {
|
|
314
|
+
this.roles$ = new BehaviorSubject(this.user?.userData?.roleList);
|
|
315
|
+
}
|
|
316
|
+
else {
|
|
317
|
+
this.roles$ = new BehaviorSubject(this.defaultRoles);
|
|
318
|
+
}
|
|
319
|
+
this.loggedIn$ = new BehaviorSubject((!!this.user.userData && !!this.user.userData.token));
|
|
320
|
+
}
|
|
321
|
+
/** Проверка разрешений */
|
|
322
|
+
hasPermission(authPermission) {
|
|
323
|
+
return !!(this.permissions &&
|
|
324
|
+
this.permissions.find(permission => permission === authPermission));
|
|
325
|
+
}
|
|
326
|
+
/** Проверка ролей */
|
|
327
|
+
hasRole(roles, checkRole) {
|
|
328
|
+
if (roles) {
|
|
329
|
+
return !!roles.find(role => (role === checkRole || role === 'ADMIN'));
|
|
330
|
+
}
|
|
331
|
+
else {
|
|
332
|
+
return false;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
/** Проверка массива ролей */
|
|
336
|
+
hasRoles(roles, checkRoles) {
|
|
337
|
+
if (roles) {
|
|
338
|
+
for (const checkRole of checkRoles) {
|
|
339
|
+
if (roles.find(role => (role === checkRole || role === 'ADMIN'))) {
|
|
340
|
+
return true;
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return false;
|
|
345
|
+
}
|
|
346
|
+
/** Элемент скрывается, если у пользователя нет ни одной роли из перереданных в "roles"
|
|
347
|
+
или в списке "roles" есть роль "hideRole". */
|
|
348
|
+
isHideElement(roles, checkRoles) {
|
|
349
|
+
if (!roles)
|
|
350
|
+
return false;
|
|
351
|
+
if (roles.indexOf(this.hideRole) !== -1)
|
|
352
|
+
return true;
|
|
353
|
+
for (const role of roles) {
|
|
354
|
+
if (role && (role.length !== 0) && this.hasRole(checkRoles, role)) {
|
|
355
|
+
return false;
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
return true;
|
|
359
|
+
}
|
|
360
|
+
// /** Сменить роль без side эффекта */
|
|
361
|
+
// public changeRole(role: string) {
|
|
362
|
+
// this.roles$.next([role]);
|
|
363
|
+
// }
|
|
364
|
+
// /** Сменить роли без side эффекта */
|
|
365
|
+
// public changeRoles(roles: string[]) {
|
|
366
|
+
// this.roles$.next(roles);
|
|
367
|
+
// }
|
|
368
|
+
/** Запрос авторизации */
|
|
369
|
+
login(username, password, idCas, returnUrl = '', onErrorFn) {
|
|
370
|
+
const passwordEncoded = encodeURIComponent(password);
|
|
371
|
+
let body = `username=${username}&password=${passwordEncoded}`;
|
|
372
|
+
if (idCas) {
|
|
373
|
+
body += `&idcas=${idCas}`;
|
|
374
|
+
}
|
|
375
|
+
if (this.idHuman) {
|
|
376
|
+
body += `&idhuman=${this.idHuman}`;
|
|
377
|
+
}
|
|
378
|
+
this.http.post(this.baseRoute + 'jwt', body, this.defaultHeader)
|
|
379
|
+
.subscribe({
|
|
380
|
+
next: data => {
|
|
381
|
+
this.successLoginAction(data, returnUrl);
|
|
382
|
+
this.alertService.success('Успешная авторизация');
|
|
383
|
+
},
|
|
384
|
+
error: (error) => {
|
|
385
|
+
this.console.log(error);
|
|
386
|
+
this.alertService.error('Ошибка при авторизации: ' + error, 0);
|
|
387
|
+
if (onErrorFn) {
|
|
388
|
+
onErrorFn();
|
|
389
|
+
}
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
/** Aвторизация по пропуску */
|
|
394
|
+
loginByPermit(permit, idCas, returnUrl = '') {
|
|
395
|
+
let body = `permit=${permit}`;
|
|
396
|
+
if (idCas) {
|
|
397
|
+
body += `&idcas=${idCas}`;
|
|
398
|
+
}
|
|
399
|
+
if (this.idHuman) {
|
|
400
|
+
body += `&idhuman=${this.idHuman}`;
|
|
401
|
+
}
|
|
402
|
+
return this.http.post(this.baseRoute + 'jwt', body, this.defaultHeader)
|
|
403
|
+
.subscribe({
|
|
404
|
+
next: (data) => {
|
|
405
|
+
this.successLoginAction(data, returnUrl);
|
|
406
|
+
this.alertService.success('Успешная авторизация');
|
|
407
|
+
},
|
|
408
|
+
error: (error) => {
|
|
409
|
+
this.console.log(error);
|
|
410
|
+
this.alertService.error('Ошибка при авторизации: ' + error, 0);
|
|
411
|
+
}
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
/** Разлогиниться */
|
|
415
|
+
logout(returnUrl = '') {
|
|
416
|
+
// Убирает(удаляет) пользователя из локального хранилища когда он разлогинивается
|
|
417
|
+
this.user.removeUser();
|
|
418
|
+
// localStorage.removeItem('sed_currentUser');
|
|
419
|
+
// Отправляем подписчикам события что человек вышел
|
|
420
|
+
this.loggedIn$.next(false);
|
|
421
|
+
// Переход на страницу авторизации
|
|
422
|
+
if (returnUrl) {
|
|
423
|
+
// указываем целевой маршрут в параметре
|
|
424
|
+
this.router.navigate(['/login'], { queryParams: { returnUrl } }).then();
|
|
425
|
+
}
|
|
426
|
+
else {
|
|
427
|
+
this.router.navigate(['/login']).then();
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
// Получить роли пользователя
|
|
431
|
+
getRoles() {
|
|
432
|
+
return this.http.get(this.baseRoute + 'jwt/webroles');
|
|
433
|
+
}
|
|
434
|
+
// /** Инициализация ролей */
|
|
435
|
+
// private initRole() {
|
|
436
|
+
// if (this.hasRole(this.roles$.getValue(), this.defaultRole)) {
|
|
437
|
+
// this.roleService.getRoles().subscribe({
|
|
438
|
+
// next: (data: string[]) => {
|
|
439
|
+
// this.roles$.next(data['Roles']);
|
|
440
|
+
// },
|
|
441
|
+
// error: (error: any) => {
|
|
442
|
+
// this.console.log(error);
|
|
443
|
+
// this.alert.error('Ошибка при получении списка ролей пользователя: ' + error);
|
|
444
|
+
// }
|
|
445
|
+
// });
|
|
446
|
+
// }
|
|
447
|
+
// }
|
|
448
|
+
/** При успешной авторизации */
|
|
449
|
+
successLoginAction(user, returnUrl = '') {
|
|
450
|
+
this.user.userData = user;
|
|
451
|
+
this.loggedIn$.next(true);
|
|
452
|
+
// init roles
|
|
453
|
+
this.roles$.next(this.user.userData.roleList);
|
|
454
|
+
if (returnUrl) {
|
|
455
|
+
const decodeUrl = decodeURIComponent(returnUrl);
|
|
456
|
+
// указан целевой маршрут
|
|
457
|
+
if (decodeUrl.includes('?')) {
|
|
458
|
+
// есть параметры строки запроса
|
|
459
|
+
const serializer = new DefaultUrlSerializer();
|
|
460
|
+
// параметры строки запроса
|
|
461
|
+
const params = serializer.parse(decodeUrl).queryParams;
|
|
462
|
+
//console.log('successLoginAction params = ', params);
|
|
463
|
+
// выделение маршрута
|
|
464
|
+
const url = decodeUrl.slice(0, decodeUrl.indexOf('?'));
|
|
465
|
+
this.router.navigate([url], { queryParams: params });
|
|
466
|
+
}
|
|
467
|
+
else {
|
|
468
|
+
this.router.navigate([decodeUrl]);
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
else {
|
|
472
|
+
// не указан целевой маршрут, переход на главную
|
|
473
|
+
this.router.navigate(['']);
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, deps: [{ token: i1$2.HttpClient }, { token: i2.Router }, { token: LogService }, { token: AlertService }, { token: UserService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
477
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, providedIn: 'root' });
|
|
478
|
+
}
|
|
479
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthService, decorators: [{
|
|
480
|
+
type: Injectable,
|
|
481
|
+
args: [{
|
|
482
|
+
providedIn: 'root'
|
|
483
|
+
}]
|
|
484
|
+
}], ctorParameters: () => [{ type: i1$2.HttpClient }, { type: i2.Router }, { type: LogService }, { type: AlertService }, { type: UserService }] });
|
|
485
|
+
|
|
486
|
+
class ProgressSpinnerComponent {
|
|
487
|
+
cdRef;
|
|
488
|
+
constructor(cdRef) {
|
|
489
|
+
this.cdRef = cdRef;
|
|
490
|
+
}
|
|
491
|
+
ngAfterViewInit() {
|
|
492
|
+
this.cdRef.detectChanges();
|
|
493
|
+
}
|
|
494
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ProgressSpinnerComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
495
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: ProgressSpinnerComponent, isStandalone: true, selector: "lib-loader", ngImport: i0, template: `
|
|
496
|
+
<div class="loading-indicator" mat-dialog-content>
|
|
497
|
+
<mat-progress-spinner mode="indeterminate">
|
|
498
|
+
</mat-progress-spinner>
|
|
499
|
+
</div>
|
|
500
|
+
`, isInline: true, styles: [".loading-indicator{position:fixed;z-index:999;height:2em;width:2em;overflow:initial;margin:auto;inset:0}.loading-indicator:before{content:\"\";display:block;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d}\n"], dependencies: [{ kind: "component", type: MatProgressSpinner, selector: "mat-progress-spinner, mat-spinner", inputs: ["color", "mode", "value", "diameter", "strokeWidth"], exportAs: ["matProgressSpinner"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
501
|
+
}
|
|
502
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ProgressSpinnerComponent, decorators: [{
|
|
503
|
+
type: Component,
|
|
504
|
+
args: [{ selector: 'lib-loader', template: `
|
|
505
|
+
<div class="loading-indicator" mat-dialog-content>
|
|
506
|
+
<mat-progress-spinner mode="indeterminate">
|
|
507
|
+
</mat-progress-spinner>
|
|
508
|
+
</div>
|
|
509
|
+
`, changeDetection: ChangeDetectionStrategy.OnPush, imports: [MatProgressSpinner], styles: [".loading-indicator{position:fixed;z-index:999;height:2em;width:2em;overflow:initial;margin:auto;inset:0}.loading-indicator:before{content:\"\";display:block;position:fixed;top:0;left:0;width:100%;height:100%;background-color:#0000004d}\n"] }]
|
|
510
|
+
}], ctorParameters: () => [{ type: i0.ChangeDetectorRef }] });
|
|
511
|
+
|
|
512
|
+
class LoaderService {
|
|
513
|
+
overlay;
|
|
514
|
+
overlayRef = null;
|
|
515
|
+
constructor(overlay) {
|
|
516
|
+
this.overlay = overlay;
|
|
517
|
+
}
|
|
518
|
+
show() {
|
|
519
|
+
if (!this.overlayRef) {
|
|
520
|
+
this.overlayRef = this.overlay.create();
|
|
521
|
+
}
|
|
522
|
+
const spinnerOverlayPortal = new ComponentPortal(ProgressSpinnerComponent);
|
|
523
|
+
// Иправление ошибки Expression has changed after it was checked
|
|
524
|
+
setTimeout(() => {
|
|
525
|
+
if (!this.overlayRef?.hasAttached()) {
|
|
526
|
+
this.overlayRef?.attach(spinnerOverlayPortal);
|
|
527
|
+
}
|
|
528
|
+
});
|
|
529
|
+
}
|
|
530
|
+
hide() {
|
|
531
|
+
if (this.overlayRef) {
|
|
532
|
+
this.overlayRef.detach();
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, deps: [{ token: i1$3.Overlay }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
536
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, providedIn: 'root' });
|
|
537
|
+
}
|
|
538
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoaderService, decorators: [{
|
|
539
|
+
type: Injectable,
|
|
540
|
+
args: [{
|
|
541
|
+
providedIn: 'root'
|
|
542
|
+
}]
|
|
543
|
+
}], ctorParameters: () => [{ type: i1$3.Overlay }] });
|
|
544
|
+
|
|
545
|
+
class LoginPageComponent {
|
|
546
|
+
authService;
|
|
547
|
+
route;
|
|
548
|
+
loaderService;
|
|
549
|
+
pending = false;
|
|
550
|
+
error = '';
|
|
551
|
+
isKiosk = false;
|
|
552
|
+
/** Идентификатор АС */
|
|
553
|
+
idCas = 0;
|
|
554
|
+
/** Подписка на Идентификатор АС */
|
|
555
|
+
sub;
|
|
556
|
+
/** Url страницы, с которой был переход (после входа вернет на неё) */
|
|
557
|
+
returnUrl = '';
|
|
558
|
+
constructor(authService, route, loaderService) {
|
|
559
|
+
this.authService = authService;
|
|
560
|
+
this.route = route;
|
|
561
|
+
this.loaderService = loaderService;
|
|
562
|
+
this.sub = this.route.data.subscribe(data => {
|
|
563
|
+
this.idCas = data['idCas'];
|
|
564
|
+
});
|
|
565
|
+
}
|
|
566
|
+
ngOnInit() {
|
|
567
|
+
if (localStorage.getItem('id_human') || localStorage.getItem('kiosk-keyboard-layout')) {
|
|
568
|
+
// this.isKiosk = true;
|
|
569
|
+
}
|
|
570
|
+
this.route.queryParams.subscribe(params => {
|
|
571
|
+
this.returnUrl = params['returnUrl'];
|
|
572
|
+
//console.log('constructor this.returnUrl = ', this.returnUrl);
|
|
573
|
+
//this.returnUrl = this.returnUrl.slice(this.returnUrl.lastIndexOf('returnUrl=') + 'returnUrl='.length);
|
|
574
|
+
//console.log('constructor NEW this.returnUrl = ', this.returnUrl);
|
|
575
|
+
});
|
|
576
|
+
}
|
|
577
|
+
ngOnDestroy() {
|
|
578
|
+
this.sub.unsubscribe();
|
|
579
|
+
}
|
|
580
|
+
onSubmitError() {
|
|
581
|
+
return () => {
|
|
582
|
+
this.pending = false;
|
|
583
|
+
this.loaderService.hide();
|
|
584
|
+
};
|
|
585
|
+
}
|
|
586
|
+
onSubmit($event) {
|
|
587
|
+
this.loaderService.show();
|
|
588
|
+
this.pending = true;
|
|
589
|
+
this.authService.login($event.username, $event.password, this.idCas, this.returnUrl, this.onSubmitError());
|
|
590
|
+
}
|
|
591
|
+
onSubmitPermit($event) {
|
|
592
|
+
const permit = $event;
|
|
593
|
+
this.authService.loginByPermit(permit, this.idCas, this.returnUrl);
|
|
594
|
+
}
|
|
595
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginPageComponent, deps: [{ token: AuthService }, { token: i2.ActivatedRoute }, { token: LoaderService }], target: i0.ɵɵFactoryTarget.Component });
|
|
596
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: LoginPageComponent, isStandalone: true, selector: "lib-login-page", ngImport: i0, template: `
|
|
597
|
+
@if (!isKiosk) {
|
|
598
|
+
<lib-login-form
|
|
599
|
+
(submitted)="onSubmit($event)"
|
|
600
|
+
[pending]="pending"
|
|
601
|
+
[errorMessage]="error">
|
|
602
|
+
</lib-login-form>
|
|
603
|
+
}
|
|
604
|
+
@if (isKiosk) {
|
|
605
|
+
<lib-permit-form
|
|
606
|
+
(submitted)="onSubmitPermit($event)"
|
|
607
|
+
>
|
|
608
|
+
</lib-permit-form>
|
|
609
|
+
}
|
|
610
|
+
`, isInline: true, dependencies: [{ kind: "component", type: LoginFormComponent, selector: "lib-login-form", inputs: ["errorMessage", "pending"], outputs: ["submitted"] }, { kind: "component", type: PermitFormComponent, selector: "lib-permit-form", outputs: ["submitted"] }] });
|
|
611
|
+
}
|
|
612
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LoginPageComponent, decorators: [{
|
|
613
|
+
type: Component,
|
|
614
|
+
args: [{ selector: 'lib-login-page', template: `
|
|
615
|
+
@if (!isKiosk) {
|
|
616
|
+
<lib-login-form
|
|
617
|
+
(submitted)="onSubmit($event)"
|
|
618
|
+
[pending]="pending"
|
|
619
|
+
[errorMessage]="error">
|
|
620
|
+
</lib-login-form>
|
|
621
|
+
}
|
|
622
|
+
@if (isKiosk) {
|
|
623
|
+
<lib-permit-form
|
|
624
|
+
(submitted)="onSubmitPermit($event)"
|
|
625
|
+
>
|
|
626
|
+
</lib-permit-form>
|
|
627
|
+
}
|
|
628
|
+
`, imports: [LoginFormComponent, PermitFormComponent] }]
|
|
629
|
+
}], ctorParameters: () => [{ type: AuthService }, { type: i2.ActivatedRoute }, { type: LoaderService }] });
|
|
630
|
+
|
|
631
|
+
class DisableIfUnauthorizedDirective {
|
|
632
|
+
el;
|
|
633
|
+
authservice;
|
|
634
|
+
permission;
|
|
635
|
+
constructor(el, authservice) {
|
|
636
|
+
this.el = el;
|
|
637
|
+
this.authservice = authservice;
|
|
638
|
+
}
|
|
639
|
+
ngOnInit() {
|
|
640
|
+
if (this.permission && !this.authservice.hasPermission(this.permission)) {
|
|
641
|
+
this.el.nativeElement.disabled = true;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfUnauthorizedDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
645
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: DisableIfUnauthorizedDirective, isStandalone: true, selector: "[libDisableIfUnauthorized]", inputs: { permission: ["libDisableIfUnauthorized", "permission"] }, ngImport: i0 });
|
|
646
|
+
}
|
|
647
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfUnauthorizedDirective, decorators: [{
|
|
648
|
+
type: Directive,
|
|
649
|
+
args: [{
|
|
650
|
+
selector: '[libDisableIfUnauthorized]',
|
|
651
|
+
standalone: true
|
|
652
|
+
}]
|
|
653
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { permission: [{
|
|
654
|
+
type: Input,
|
|
655
|
+
args: ['libDisableIfUnauthorized']
|
|
656
|
+
}] } });
|
|
657
|
+
|
|
658
|
+
class HideIfUnauthorizedDirective {
|
|
659
|
+
el;
|
|
660
|
+
authService;
|
|
661
|
+
permission;
|
|
662
|
+
constructor(el, authService) {
|
|
663
|
+
this.el = el;
|
|
664
|
+
this.authService = authService;
|
|
665
|
+
}
|
|
666
|
+
ngOnInit() {
|
|
667
|
+
if (this.permission && !this.authService.hasPermission(this.permission)) {
|
|
668
|
+
this.el.nativeElement.style.display = 'none';
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfUnauthorizedDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
672
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: HideIfUnauthorizedDirective, isStandalone: true, selector: "[libHideIfUnauthorized]", inputs: { permission: ["libHideIfUnauthorized", "permission"] }, ngImport: i0 });
|
|
673
|
+
}
|
|
674
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfUnauthorizedDirective, decorators: [{
|
|
675
|
+
type: Directive,
|
|
676
|
+
args: [{
|
|
677
|
+
selector: '[libHideIfUnauthorized]',
|
|
678
|
+
standalone: true
|
|
679
|
+
}]
|
|
680
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { permission: [{
|
|
681
|
+
type: Input,
|
|
682
|
+
args: ['libHideIfUnauthorized']
|
|
683
|
+
}] } });
|
|
684
|
+
|
|
685
|
+
class DisableIfRoleDirective {
|
|
686
|
+
el;
|
|
687
|
+
authService;
|
|
688
|
+
role = '';
|
|
689
|
+
constructor(el, authService) {
|
|
690
|
+
this.el = el;
|
|
691
|
+
this.authService = authService;
|
|
692
|
+
}
|
|
693
|
+
ngOnInit() {
|
|
694
|
+
this.authService.roles$.subscribe((userRoles) => {
|
|
695
|
+
if (this.role) {
|
|
696
|
+
if (!this.authService.hasRole(userRoles, this.role)) {
|
|
697
|
+
this.el.nativeElement.disabled = true;
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
this.el.nativeElement.disabled = false;
|
|
701
|
+
}
|
|
702
|
+
}
|
|
703
|
+
});
|
|
704
|
+
}
|
|
705
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfRoleDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
706
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: DisableIfRoleDirective, isStandalone: true, selector: "[libDisableIfRole]", inputs: { role: ["libDisableIfRole", "role"] }, ngImport: i0 });
|
|
707
|
+
}
|
|
708
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DisableIfRoleDirective, decorators: [{
|
|
709
|
+
type: Directive,
|
|
710
|
+
args: [{
|
|
711
|
+
selector: '[libDisableIfRole]',
|
|
712
|
+
standalone: true
|
|
713
|
+
}]
|
|
714
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { role: [{
|
|
715
|
+
type: Input,
|
|
716
|
+
args: ['libDisableIfRole']
|
|
717
|
+
}] } });
|
|
718
|
+
|
|
719
|
+
class HideIfRoleNotDirective {
|
|
720
|
+
el;
|
|
721
|
+
authService;
|
|
722
|
+
roles = [];
|
|
723
|
+
constructor(el, authService) {
|
|
724
|
+
this.el = el;
|
|
725
|
+
this.authService = authService;
|
|
726
|
+
}
|
|
727
|
+
// Элемент скрывается, если у пользователя нет ни одной роли из перереданных в "roles"
|
|
728
|
+
// или в списке "roles" есть роль "hideRole".
|
|
729
|
+
ngOnInit() {
|
|
730
|
+
if (this.roles) {
|
|
731
|
+
this.authService.roles$.subscribe((userRoles) => {
|
|
732
|
+
const isHide = this.authService.isHideElement(this.roles, userRoles);
|
|
733
|
+
if (isHide) {
|
|
734
|
+
this.el.nativeElement.style.display = 'none';
|
|
735
|
+
}
|
|
736
|
+
else {
|
|
737
|
+
this.el.nativeElement.style.display = 'inherit';
|
|
738
|
+
}
|
|
739
|
+
});
|
|
740
|
+
}
|
|
741
|
+
}
|
|
742
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfRoleNotDirective, deps: [{ token: i0.ElementRef }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Directive });
|
|
743
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: HideIfRoleNotDirective, isStandalone: true, selector: "[libHideIfRoleNot]", inputs: { roles: ["libHideIfRoleNot", "roles"] }, ngImport: i0 });
|
|
744
|
+
}
|
|
745
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: HideIfRoleNotDirective, decorators: [{
|
|
746
|
+
type: Directive,
|
|
747
|
+
args: [{
|
|
748
|
+
selector: '[libHideIfRoleNot]',
|
|
749
|
+
standalone: true
|
|
750
|
+
}]
|
|
751
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: AuthService }], propDecorators: { roles: [{
|
|
752
|
+
type: Input,
|
|
753
|
+
args: ['libHideIfRoleNot']
|
|
754
|
+
}] } });
|
|
755
|
+
|
|
756
|
+
class AuthGuardService {
|
|
757
|
+
auth;
|
|
758
|
+
router;
|
|
759
|
+
constructor(auth, router) {
|
|
760
|
+
this.auth = auth;
|
|
761
|
+
this.router = router;
|
|
762
|
+
}
|
|
763
|
+
canActivate(route, state) {
|
|
764
|
+
const isLogin = this.auth.loggedIn$.value;
|
|
765
|
+
if (!isLogin) {
|
|
766
|
+
console.log('state.url =', state.url);
|
|
767
|
+
// Если не зарегистрирован вернуть в форму авторизации
|
|
768
|
+
this.router.navigate(['/login'], { queryParams: { returnUrl: state.url } });
|
|
769
|
+
}
|
|
770
|
+
return isLogin;
|
|
771
|
+
}
|
|
772
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, deps: [{ token: AuthService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
773
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, providedIn: 'root' });
|
|
774
|
+
}
|
|
775
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AuthGuardService, decorators: [{
|
|
776
|
+
type: Injectable,
|
|
777
|
+
args: [{
|
|
778
|
+
providedIn: 'root'
|
|
779
|
+
}]
|
|
780
|
+
}], ctorParameters: () => [{ type: AuthService }, { type: i2.Router }] });
|
|
781
|
+
const authGuard = (route, state) => inject(AuthGuardService).canActivate(route, state);
|
|
782
|
+
|
|
783
|
+
class RoleGuardService {
|
|
784
|
+
router;
|
|
785
|
+
authService;
|
|
786
|
+
roles = [];
|
|
787
|
+
constructor(router, authService) {
|
|
788
|
+
this.router = router;
|
|
789
|
+
this.authService = authService;
|
|
790
|
+
}
|
|
791
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
792
|
+
canActivate(route, state) {
|
|
793
|
+
this.roles = route.data['roles'];
|
|
794
|
+
return this.authService.roles$.pipe(map((userRoles) => this.authService.hasRoles(userRoles, this.roles)));
|
|
795
|
+
}
|
|
796
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, deps: [{ token: i2.Router }, { token: AuthService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
797
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, providedIn: 'root' });
|
|
798
|
+
}
|
|
799
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleGuardService, decorators: [{
|
|
800
|
+
type: Injectable,
|
|
801
|
+
args: [{
|
|
802
|
+
providedIn: 'root'
|
|
803
|
+
}]
|
|
804
|
+
}], ctorParameters: () => [{ type: i2.Router }, { type: AuthService }] });
|
|
805
|
+
const roleGuard = (route, state) => inject(RoleGuardService).canActivate(route, state);
|
|
806
|
+
|
|
807
|
+
// Вычисление разрешений на модули по ролям
|
|
808
|
+
class RoleService {
|
|
809
|
+
http;
|
|
810
|
+
// Указываем какой сервер использовать
|
|
811
|
+
baseRoute = 'mainApi/';
|
|
812
|
+
constructor(http) {
|
|
813
|
+
this.http = http;
|
|
814
|
+
}
|
|
815
|
+
// Получить роли пользователя
|
|
816
|
+
getRoles() {
|
|
817
|
+
return this.http.get(this.baseRoute + 'jwt/webroles');
|
|
818
|
+
}
|
|
819
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
820
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, providedIn: 'root' });
|
|
821
|
+
}
|
|
822
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RoleService, decorators: [{
|
|
823
|
+
type: Injectable,
|
|
824
|
+
args: [{
|
|
825
|
+
providedIn: 'root'
|
|
826
|
+
}]
|
|
827
|
+
}], ctorParameters: () => [{ type: i1$2.HttpClient }] });
|
|
828
|
+
|
|
829
|
+
class BaseToolbarService {
|
|
830
|
+
baseRoute = 'BaseToolbar';
|
|
831
|
+
constructor() { }
|
|
832
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
833
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, providedIn: 'root' });
|
|
834
|
+
}
|
|
835
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarService, decorators: [{
|
|
836
|
+
type: Injectable,
|
|
837
|
+
args: [{
|
|
838
|
+
providedIn: 'root'
|
|
839
|
+
}]
|
|
840
|
+
}], ctorParameters: () => [] });
|
|
841
|
+
|
|
842
|
+
class BaseToolbarComponent {
|
|
843
|
+
rolesNewBtn = [];
|
|
844
|
+
rolesEditBtn = [];
|
|
845
|
+
rolesRemoveBtn = [];
|
|
846
|
+
rolesCopyBtn = [];
|
|
847
|
+
rolesExcelBtn = [];
|
|
848
|
+
rolesCsvBtn = [];
|
|
849
|
+
rolesPdfBtn = [];
|
|
850
|
+
rolesPrintBtn = [];
|
|
851
|
+
rolesRefreshBtn = [];
|
|
852
|
+
rolesClearBtn = [];
|
|
853
|
+
newBtnDisabled = false;
|
|
854
|
+
editBtnDisabled = false;
|
|
855
|
+
removeBtnDisabled = false;
|
|
856
|
+
copyBtnDisabled = false;
|
|
857
|
+
excelBtnDisabled = false;
|
|
858
|
+
csvBtnDisabled = false;
|
|
859
|
+
pdfBtnDisabled = false;
|
|
860
|
+
printBtnDisabled = false;
|
|
861
|
+
refreshBtnDisabled = false;
|
|
862
|
+
clearBtnDisabled = false;
|
|
863
|
+
newBtnTooltip = 'Добавить';
|
|
864
|
+
editBtnTooltip = 'Изменить';
|
|
865
|
+
removeBtnTooltip = 'Удалить';
|
|
866
|
+
copyBtnTooltip = 'Скопировать';
|
|
867
|
+
excelBtnTooltip = 'Экспортировать в Excel';
|
|
868
|
+
csvBtnTooltip = 'Экспортировать в Csv';
|
|
869
|
+
pdfBtnTooltip = 'Экспортировать в Pdf';
|
|
870
|
+
printBtnTooltip = 'Печатать';
|
|
871
|
+
refreshBtnTooltip = 'Обновить данные';
|
|
872
|
+
clearBtnTooltip = 'Очистить фильтр';
|
|
873
|
+
/** Список элементов контекстного меню. */
|
|
874
|
+
newBtnOpt = [];
|
|
875
|
+
clickedNewBtn = new EventEmitter();
|
|
876
|
+
clickedEditBtn = new EventEmitter();
|
|
877
|
+
clickedRemoveBtn = new EventEmitter();
|
|
878
|
+
clickedCopyBtn = new EventEmitter();
|
|
879
|
+
clickedExcelBtn = new EventEmitter();
|
|
880
|
+
clickedCsvBtn = new EventEmitter();
|
|
881
|
+
clickedPdfBtn = new EventEmitter();
|
|
882
|
+
clickedPrintBtn = new EventEmitter();
|
|
883
|
+
clickedRefreshBtn = new EventEmitter();
|
|
884
|
+
clickedClearBtn = new EventEmitter();
|
|
885
|
+
// DI
|
|
886
|
+
authService = inject(AuthService);
|
|
887
|
+
userRoles = [];
|
|
888
|
+
subscription;
|
|
889
|
+
constructor() {
|
|
890
|
+
// получить права пользователя
|
|
891
|
+
this.subscription = this.authService.roles$.subscribe((userRoles) => {
|
|
892
|
+
this.userRoles = userRoles;
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
ngOnDestroy() {
|
|
896
|
+
if (this.subscription)
|
|
897
|
+
this.subscription.unsubscribe();
|
|
898
|
+
}
|
|
899
|
+
isShow(roles) {
|
|
900
|
+
return !this.authService.isHideElement(roles, this.userRoles);
|
|
901
|
+
}
|
|
902
|
+
onNewClick() {
|
|
903
|
+
this.clickedNewBtn.emit();
|
|
904
|
+
}
|
|
905
|
+
onEditClick() {
|
|
906
|
+
this.clickedEditBtn.emit();
|
|
907
|
+
}
|
|
908
|
+
onRemoveClick() {
|
|
909
|
+
this.clickedRemoveBtn.emit();
|
|
910
|
+
}
|
|
911
|
+
onCopyClick() {
|
|
912
|
+
this.clickedCopyBtn.emit();
|
|
913
|
+
}
|
|
914
|
+
onExcelClick() {
|
|
915
|
+
this.clickedExcelBtn.emit();
|
|
916
|
+
}
|
|
917
|
+
onCsvClick() {
|
|
918
|
+
this.clickedCsvBtn.emit();
|
|
919
|
+
}
|
|
920
|
+
onPdfClick() {
|
|
921
|
+
this.clickedPdfBtn.emit();
|
|
922
|
+
}
|
|
923
|
+
onPrintClick() {
|
|
924
|
+
this.clickedPrintBtn.emit();
|
|
925
|
+
}
|
|
926
|
+
onRefreshGridClick() {
|
|
927
|
+
this.clickedRefreshBtn.emit();
|
|
928
|
+
}
|
|
929
|
+
onClearClick() {
|
|
930
|
+
this.clickedClearBtn.emit();
|
|
931
|
+
}
|
|
932
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
933
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseToolbarComponent, isStandalone: true, selector: "lib-base-toolbar", inputs: { rolesNewBtn: "rolesNewBtn", rolesEditBtn: "rolesEditBtn", rolesRemoveBtn: "rolesRemoveBtn", rolesCopyBtn: "rolesCopyBtn", rolesExcelBtn: "rolesExcelBtn", rolesCsvBtn: "rolesCsvBtn", rolesPdfBtn: "rolesPdfBtn", rolesPrintBtn: "rolesPrintBtn", rolesRefreshBtn: "rolesRefreshBtn", rolesClearBtn: "rolesClearBtn", newBtnDisabled: "newBtnDisabled", editBtnDisabled: "editBtnDisabled", removeBtnDisabled: "removeBtnDisabled", copyBtnDisabled: "copyBtnDisabled", excelBtnDisabled: "excelBtnDisabled", csvBtnDisabled: "csvBtnDisabled", pdfBtnDisabled: "pdfBtnDisabled", printBtnDisabled: "printBtnDisabled", refreshBtnDisabled: "refreshBtnDisabled", clearBtnDisabled: "clearBtnDisabled", newBtnTooltip: "newBtnTooltip", editBtnTooltip: "editBtnTooltip", removeBtnTooltip: "removeBtnTooltip", copyBtnTooltip: "copyBtnTooltip", excelBtnTooltip: "excelBtnTooltip", csvBtnTooltip: "csvBtnTooltip", pdfBtnTooltip: "pdfBtnTooltip", printBtnTooltip: "printBtnTooltip", refreshBtnTooltip: "refreshBtnTooltip", clearBtnTooltip: "clearBtnTooltip", newBtnOpt: "newBtnOpt" }, outputs: { clickedNewBtn: "clickedNewBtn", clickedEditBtn: "clickedEditBtn", clickedRemoveBtn: "clickedRemoveBtn", clickedCopyBtn: "clickedCopyBtn", clickedExcelBtn: "clickedExcelBtn", clickedCsvBtn: "clickedCsvBtn", clickedPdfBtn: "clickedPdfBtn", clickedPrintBtn: "clickedPrintBtn", clickedRefreshBtn: "clickedRefreshBtn", clickedClearBtn: "clickedClearBtn" }, providers: [
|
|
934
|
+
BaseToolbarService
|
|
935
|
+
], ngImport: i0, template: "<mat-toolbar>\r\n @if (isShow(rolesNewBtn)) {\r\n @if (newBtnOpt && newBtnOpt.length > 0) {\r\n <button [disabled]=\"newBtnDisabled\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n\r\n @for (menuItem of newBtnOpt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isShow(rolesEditBtn)) {\r\n <button [disabled]=\"editBtnDisabled\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRemoveBtn)) {\r\n <button [disabled]=\"removeBtnDisabled\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCopyBtn)) {\r\n <button [disabled]=\"copyBtnDisabled\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesExcelBtn)) {\r\n <button [disabled]=\"excelBtnDisabled\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCsvBtn)) {\r\n <button [disabled]=\"csvBtnDisabled\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPdfBtn)) {\r\n <button [disabled]=\"pdfBtnDisabled\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPrintBtn)) {\r\n <button [disabled]=\"printBtnDisabled\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRefreshBtn)) {\r\n <button [disabled]=\"refreshBtnDisabled\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesClearBtn)) {\r\n <button [disabled]=\"clearBtnDisabled\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n", styles: [""], dependencies: [{ kind: "component", type: MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }] });
|
|
936
|
+
}
|
|
937
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseToolbarComponent, decorators: [{
|
|
938
|
+
type: Component,
|
|
939
|
+
args: [{ selector: 'lib-base-toolbar', imports: [MatToolbar, MatIconButton, MatTooltip, MatIcon, MatMenu, MatDivider, MatMenuTrigger, MatMenuItem], providers: [
|
|
940
|
+
BaseToolbarService
|
|
941
|
+
], template: "<mat-toolbar>\r\n @if (isShow(rolesNewBtn)) {\r\n @if (newBtnOpt && newBtnOpt.length > 0) {\r\n <button [disabled]=\"newBtnDisabled\" [matMenuTriggerFor]=\"menuNewBtn\"\r\n mat-icon-button [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n <mat-menu #menuNewBtn=\"matMenu\">\r\n\r\n @for (menuItem of newBtnOpt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(\"\") : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn('') : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn('') : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n\r\n </mat-menu>\r\n } \r\n @else {\r\n <button [disabled]=\"newBtnDisabled\" (click)=\"onNewClick()\"\r\n mat-icon-button routerLink=\"new\" routerLinkActive=\"active\" [matTooltip]=\"newBtnTooltip\">\r\n <mat-icon>add</mat-icon>\r\n </button>\r\n }\r\n }\r\n\r\n @if (isShow(rolesEditBtn)) {\r\n <button [disabled]=\"editBtnDisabled\" (click)=\"onEditClick()\"\r\n mat-icon-button routerLink=\"edit\" color=\"primary\" routerLinkActive=\"active\" [matTooltip]=\"editBtnTooltip\">\r\n <mat-icon>edit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRemoveBtn)) {\r\n <button [disabled]=\"removeBtnDisabled\" (click)=\"onRemoveClick()\"\r\n mat-icon-button routerLink=\"delete\" color=\"warn\" routerLinkActive=\"active\" [matTooltip]=\"removeBtnTooltip\">\r\n <mat-icon>remove</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCopyBtn)) {\r\n <button [disabled]=\"copyBtnDisabled\" (click)=\"onCopyClick()\"\r\n mat-icon-button routerLink=\"delete\" routerLinkActive=\"active\" [matTooltip]=\"copyBtnTooltip\">\r\n <mat-icon>content_copy</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesExcelBtn)) {\r\n <button [disabled]=\"excelBtnDisabled\" (click)=\"onExcelClick()\"\r\n mat-icon-button routerLink=\"excel\" routerLinkActive=\"active\" [matTooltip]=\"excelBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">explicit</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesCsvBtn)) {\r\n <button [disabled]=\"csvBtnDisabled\" (click)=\"onCsvClick()\"\r\n mat-icon-button routerLink=\"csv\" routerLinkActive=\"active\" [matTooltip]=\"csvBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">download</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPdfBtn)) {\r\n <button [disabled]=\"pdfBtnDisabled\" (click)=\"onPdfClick()\"\r\n mat-icon-button routerLink=\"pdf\" routerLinkActive=\"active\" [matTooltip]=\"pdfBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">picture_as_pdf</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesPrintBtn)) {\r\n <button [disabled]=\"printBtnDisabled\" (click)=\"onPrintClick()\"\r\n mat-icon-button routerLink=\"print\" routerLinkActive=\"active\" [matTooltip]=\"printBtnTooltip\">\r\n <mat-icon class=\"material-icons-outlined\">print_outline</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesRefreshBtn)) {\r\n <button [disabled]=\"refreshBtnDisabled\" (click)=\"onRefreshGridClick()\"\r\n mat-icon-button routerLink=\"refresh\" routerLinkActive=\"active\" [matTooltip]=\"refreshBtnTooltip\">\r\n <mat-icon>refresh</mat-icon>\r\n </button>\r\n }\r\n @if (isShow(rolesClearBtn)) {\r\n <button [disabled]=\"clearBtnDisabled\" (click)=\"onClearClick()\"\r\n mat-icon-button routerLink=\"clear\" routerLinkActive=\"active\" [matTooltip]=\"clearBtnTooltip\">\r\n <mat-icon>clear</mat-icon>\r\n </button>\r\n }\r\n</mat-toolbar>\r\n" }]
|
|
942
|
+
}], ctorParameters: () => [], propDecorators: { rolesNewBtn: [{
|
|
943
|
+
type: Input
|
|
944
|
+
}], rolesEditBtn: [{
|
|
945
|
+
type: Input
|
|
946
|
+
}], rolesRemoveBtn: [{
|
|
947
|
+
type: Input
|
|
948
|
+
}], rolesCopyBtn: [{
|
|
949
|
+
type: Input
|
|
950
|
+
}], rolesExcelBtn: [{
|
|
951
|
+
type: Input
|
|
952
|
+
}], rolesCsvBtn: [{
|
|
953
|
+
type: Input
|
|
954
|
+
}], rolesPdfBtn: [{
|
|
955
|
+
type: Input
|
|
956
|
+
}], rolesPrintBtn: [{
|
|
957
|
+
type: Input
|
|
958
|
+
}], rolesRefreshBtn: [{
|
|
959
|
+
type: Input
|
|
960
|
+
}], rolesClearBtn: [{
|
|
961
|
+
type: Input
|
|
962
|
+
}], newBtnDisabled: [{
|
|
963
|
+
type: Input
|
|
964
|
+
}], editBtnDisabled: [{
|
|
965
|
+
type: Input
|
|
966
|
+
}], removeBtnDisabled: [{
|
|
967
|
+
type: Input
|
|
968
|
+
}], copyBtnDisabled: [{
|
|
969
|
+
type: Input
|
|
970
|
+
}], excelBtnDisabled: [{
|
|
971
|
+
type: Input
|
|
972
|
+
}], csvBtnDisabled: [{
|
|
973
|
+
type: Input
|
|
974
|
+
}], pdfBtnDisabled: [{
|
|
975
|
+
type: Input
|
|
976
|
+
}], printBtnDisabled: [{
|
|
977
|
+
type: Input
|
|
978
|
+
}], refreshBtnDisabled: [{
|
|
979
|
+
type: Input
|
|
980
|
+
}], clearBtnDisabled: [{
|
|
981
|
+
type: Input
|
|
982
|
+
}], newBtnTooltip: [{
|
|
983
|
+
type: Input
|
|
984
|
+
}], editBtnTooltip: [{
|
|
985
|
+
type: Input
|
|
986
|
+
}], removeBtnTooltip: [{
|
|
987
|
+
type: Input
|
|
988
|
+
}], copyBtnTooltip: [{
|
|
989
|
+
type: Input
|
|
990
|
+
}], excelBtnTooltip: [{
|
|
991
|
+
type: Input
|
|
992
|
+
}], csvBtnTooltip: [{
|
|
993
|
+
type: Input
|
|
994
|
+
}], pdfBtnTooltip: [{
|
|
995
|
+
type: Input
|
|
996
|
+
}], printBtnTooltip: [{
|
|
997
|
+
type: Input
|
|
998
|
+
}], refreshBtnTooltip: [{
|
|
999
|
+
type: Input
|
|
1000
|
+
}], clearBtnTooltip: [{
|
|
1001
|
+
type: Input
|
|
1002
|
+
}], newBtnOpt: [{
|
|
1003
|
+
type: Input
|
|
1004
|
+
}], clickedNewBtn: [{
|
|
1005
|
+
type: Output
|
|
1006
|
+
}], clickedEditBtn: [{
|
|
1007
|
+
type: Output
|
|
1008
|
+
}], clickedRemoveBtn: [{
|
|
1009
|
+
type: Output
|
|
1010
|
+
}], clickedCopyBtn: [{
|
|
1011
|
+
type: Output
|
|
1012
|
+
}], clickedExcelBtn: [{
|
|
1013
|
+
type: Output
|
|
1014
|
+
}], clickedCsvBtn: [{
|
|
1015
|
+
type: Output
|
|
1016
|
+
}], clickedPdfBtn: [{
|
|
1017
|
+
type: Output
|
|
1018
|
+
}], clickedPrintBtn: [{
|
|
1019
|
+
type: Output
|
|
1020
|
+
}], clickedRefreshBtn: [{
|
|
1021
|
+
type: Output
|
|
1022
|
+
}], clickedClearBtn: [{
|
|
1023
|
+
type: Output
|
|
1024
|
+
}] } });
|
|
1025
|
+
|
|
1026
|
+
var Action;
|
|
1027
|
+
(function (Action) {
|
|
1028
|
+
Action["Add"] = "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435";
|
|
1029
|
+
Action["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435";
|
|
1030
|
+
})(Action || (Action = {}));
|
|
1031
|
+
|
|
1032
|
+
class BaseEditClass {
|
|
1033
|
+
title = '';
|
|
1034
|
+
dialogData;
|
|
1035
|
+
form;
|
|
1036
|
+
dialogRef;
|
|
1037
|
+
constructor() {
|
|
1038
|
+
}
|
|
1039
|
+
onNoClick(event) {
|
|
1040
|
+
this.dialogRef?.close(null);
|
|
1041
|
+
event.preventDefault(); // иначе сработает onSubmit
|
|
1042
|
+
}
|
|
1043
|
+
onSubmit() {
|
|
1044
|
+
if (this.form) {
|
|
1045
|
+
if (this.form.valid) {
|
|
1046
|
+
if (this.dialogData)
|
|
1047
|
+
Object.keys(this.form.controls).forEach(controlName => this.dialogData.entity[controlName] = this.form?.controls[controlName].value);
|
|
1048
|
+
this.dialogRef?.close(this.dialogData);
|
|
1049
|
+
}
|
|
1050
|
+
else {
|
|
1051
|
+
Object.keys(this.form.controls).forEach(controlName => this.form?.controls[controlName].markAsTouched());
|
|
1052
|
+
}
|
|
1053
|
+
}
|
|
1054
|
+
}
|
|
1055
|
+
formActionIsAdd() {
|
|
1056
|
+
return this.dialogData?.action === Action.Add;
|
|
1057
|
+
}
|
|
1058
|
+
formActionIsEdit() {
|
|
1059
|
+
return this.dialogData?.action === Action.Edit;
|
|
1060
|
+
}
|
|
1061
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseEditClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1062
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseEditClass, isStandalone: true, ngImport: i0 });
|
|
1063
|
+
}
|
|
1064
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseEditClass, decorators: [{
|
|
1065
|
+
type: Directive
|
|
1066
|
+
}], ctorParameters: () => [] });
|
|
1067
|
+
|
|
1068
|
+
var EntityAction;
|
|
1069
|
+
(function (EntityAction) {
|
|
1070
|
+
EntityAction["Init"] = "\u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F";
|
|
1071
|
+
EntityAction["Add"] = "\u0414\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u0435";
|
|
1072
|
+
EntityAction["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0435";
|
|
1073
|
+
EntityAction["Delete"] = "\u0423\u0434\u0430\u043B\u0435\u043D\u0438\u0435";
|
|
1074
|
+
})(EntityAction || (EntityAction = {}));
|
|
1075
|
+
|
|
1076
|
+
class BaseFilterClass {
|
|
1077
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1078
|
+
defaultDebounceTime = 500;
|
|
1079
|
+
constructor() {
|
|
1080
|
+
}
|
|
1081
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseFilterClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1082
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseFilterClass, isStandalone: true, ngImport: i0 });
|
|
1083
|
+
}
|
|
1084
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseFilterClass, decorators: [{
|
|
1085
|
+
type: Directive
|
|
1086
|
+
}], ctorParameters: () => [] });
|
|
1087
|
+
|
|
1088
|
+
class BaseNavBarMenuClass {
|
|
1089
|
+
// DI
|
|
1090
|
+
router = inject(Router);
|
|
1091
|
+
constructor() {
|
|
1092
|
+
}
|
|
1093
|
+
/** Нажата средняя кнопка (открыть ссылку в новой вкладке). */
|
|
1094
|
+
onMiddleClick(event, baseUrl, menu) {
|
|
1095
|
+
// 1 - Auxiliary button pressed (usually the middle button)
|
|
1096
|
+
if (event.button === 1) {
|
|
1097
|
+
// event.preventDefault();
|
|
1098
|
+
menu.closeMenu();
|
|
1099
|
+
const urlTree = this.router.serializeUrl(this.router.createUrlTree([baseUrl]));
|
|
1100
|
+
window.open(urlTree, '_blank');
|
|
1101
|
+
}
|
|
1102
|
+
}
|
|
1103
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseNavBarMenuClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1104
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BaseNavBarMenuClass, isStandalone: true, ngImport: i0 });
|
|
1105
|
+
}
|
|
1106
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseNavBarMenuClass, decorators: [{
|
|
1107
|
+
type: Directive
|
|
1108
|
+
}], ctorParameters: () => [] });
|
|
1109
|
+
|
|
1110
|
+
class AnimationsService {
|
|
1111
|
+
static routeAnimationType = 'ALL';
|
|
1112
|
+
constructor() {
|
|
1113
|
+
AnimationsService.routeAnimationType = 'ALL';
|
|
1114
|
+
}
|
|
1115
|
+
static isRouteAnimationsType(type) {
|
|
1116
|
+
// console.log('isRouteAnimationsType ', AnimationsService.routeAnimationType, type, AnimationsService.routeAnimationType === type);
|
|
1117
|
+
return AnimationsService.routeAnimationType === type;
|
|
1118
|
+
}
|
|
1119
|
+
updateRouteAnimationType(pageAnimations, elementsAnimations) {
|
|
1120
|
+
AnimationsService.routeAnimationType =
|
|
1121
|
+
pageAnimations && elementsAnimations
|
|
1122
|
+
? 'ALL'
|
|
1123
|
+
: pageAnimations
|
|
1124
|
+
? 'PAGE'
|
|
1125
|
+
: elementsAnimations
|
|
1126
|
+
? 'ELEMENTS'
|
|
1127
|
+
: 'NONE';
|
|
1128
|
+
}
|
|
1129
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1130
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, providedIn: 'root' });
|
|
1131
|
+
}
|
|
1132
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AnimationsService, decorators: [{
|
|
1133
|
+
type: Injectable,
|
|
1134
|
+
args: [{
|
|
1135
|
+
providedIn: 'root'
|
|
1136
|
+
}]
|
|
1137
|
+
}], ctorParameters: () => [] });
|
|
1138
|
+
|
|
1139
|
+
const ROUTE_ANIMATIONS_ELEMENTS = 'route-animations-elements';
|
|
1140
|
+
const STEPS_ALL = [
|
|
1141
|
+
// PAGE
|
|
1142
|
+
query(':enter > *', style({ opacity: 0, position: 'fixed' }), {
|
|
1143
|
+
optional: true
|
|
1144
|
+
}),
|
|
1145
|
+
// ELEMENTS
|
|
1146
|
+
query(':enter .' + ROUTE_ANIMATIONS_ELEMENTS, style({ opacity: 0 }), {
|
|
1147
|
+
optional: true
|
|
1148
|
+
}),
|
|
1149
|
+
// PAGE
|
|
1150
|
+
sequence([
|
|
1151
|
+
query(':leave > *', [
|
|
1152
|
+
style({ transform: 'translateY(0%)', opacity: 1 }),
|
|
1153
|
+
animate('0.2s ease-in-out', style({ transform: 'translateY(-3%)', opacity: 0 })),
|
|
1154
|
+
style({ position: 'fixed' })
|
|
1155
|
+
], { optional: true }),
|
|
1156
|
+
query(':enter > *', [
|
|
1157
|
+
style({
|
|
1158
|
+
transform: 'translateY(-3%)',
|
|
1159
|
+
opacity: 0,
|
|
1160
|
+
position: 'static'
|
|
1161
|
+
}),
|
|
1162
|
+
animate('0.5s ease-in-out', style({ transform: 'translateY(0%)', opacity: 1 }))
|
|
1163
|
+
], { optional: true })
|
|
1164
|
+
]),
|
|
1165
|
+
// ELEMENTS
|
|
1166
|
+
query(':enter .' + ROUTE_ANIMATIONS_ELEMENTS,
|
|
1167
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1168
|
+
stagger(75, [
|
|
1169
|
+
style({ transform: 'translateY(10%)', opacity: 0 }),
|
|
1170
|
+
animate('0.5s ease-in-out', style({ transform: 'translateY(0%)', opacity: 1 }))
|
|
1171
|
+
]), { optional: true })
|
|
1172
|
+
];
|
|
1173
|
+
const STEPS_NONE = [];
|
|
1174
|
+
const STEPS_PAGE = [STEPS_ALL[0], STEPS_ALL[2]];
|
|
1175
|
+
const STEPS_ELEMENTS = [STEPS_ALL[1], STEPS_ALL[3]];
|
|
1176
|
+
const isRouteAnimationsAll = () => AnimationsService.isRouteAnimationsType('ALL');
|
|
1177
|
+
const isRouteAnimationsNone = () => AnimationsService.isRouteAnimationsType('NONE');
|
|
1178
|
+
const isRouteAnimationsPage = () => AnimationsService.isRouteAnimationsType('PAGE');
|
|
1179
|
+
const isRouteAnimationsElements = () => AnimationsService.isRouteAnimationsType('ELEMENTS');
|
|
1180
|
+
const routeAnimations = trigger('routeAnimations', [
|
|
1181
|
+
transition(isRouteAnimationsAll, STEPS_ALL),
|
|
1182
|
+
transition(isRouteAnimationsNone, STEPS_NONE),
|
|
1183
|
+
transition(isRouteAnimationsPage, STEPS_PAGE),
|
|
1184
|
+
transition(isRouteAnimationsElements, STEPS_ELEMENTS)
|
|
1185
|
+
]);
|
|
1186
|
+
|
|
1187
|
+
class LocalStorageService {
|
|
1188
|
+
constructor() { }
|
|
1189
|
+
saveData(key, value) {
|
|
1190
|
+
localStorage.setItem(key, value);
|
|
1191
|
+
}
|
|
1192
|
+
getData(key) {
|
|
1193
|
+
return localStorage.getItem(key);
|
|
1194
|
+
}
|
|
1195
|
+
removeData(key) {
|
|
1196
|
+
localStorage.removeItem(key);
|
|
1197
|
+
}
|
|
1198
|
+
clearData() {
|
|
1199
|
+
localStorage.clear();
|
|
1200
|
+
}
|
|
1201
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1202
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, providedIn: 'root' });
|
|
1203
|
+
}
|
|
1204
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: LocalStorageService, decorators: [{
|
|
1205
|
+
type: Injectable,
|
|
1206
|
+
args: [{
|
|
1207
|
+
providedIn: 'root'
|
|
1208
|
+
}]
|
|
1209
|
+
}], ctorParameters: () => [] });
|
|
1210
|
+
|
|
1211
|
+
class DialogComponent {
|
|
1212
|
+
dialogRef;
|
|
1213
|
+
data;
|
|
1214
|
+
constructor(dialogRef, data) {
|
|
1215
|
+
this.dialogRef = dialogRef;
|
|
1216
|
+
this.data = data;
|
|
1217
|
+
if (!data.title) {
|
|
1218
|
+
data.title = 'Подтверждение';
|
|
1219
|
+
}
|
|
1220
|
+
if (!data.btnNoTitle) {
|
|
1221
|
+
data.btnNoTitle = 'Нет';
|
|
1222
|
+
}
|
|
1223
|
+
if (!data.btnYesTitle) {
|
|
1224
|
+
data.btnYesTitle = 'Да';
|
|
1225
|
+
}
|
|
1226
|
+
}
|
|
1227
|
+
onNoClick() {
|
|
1228
|
+
this.dialogRef.close();
|
|
1229
|
+
}
|
|
1230
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DialogComponent, deps: [{ token: i1$4.MatDialogRef }, { token: MAT_DIALOG_DATA }], target: i0.ɵɵFactoryTarget.Component });
|
|
1231
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: DialogComponent, isStandalone: true, selector: "lib-dialog", ngImport: i0, template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\n</div>\n\n", styles: [""], dependencies: [{ kind: "directive", type: MatDialogTitle, selector: "[mat-dialog-title], [matDialogTitle]", inputs: ["id"], exportAs: ["matDialogTitle"] }, { kind: "directive", type: MatDialogContent, selector: "[mat-dialog-content], mat-dialog-content, [matDialogContent]" }, { kind: "directive", type: MatDialogActions, selector: "[mat-dialog-actions], mat-dialog-actions, [matDialogActions]", inputs: ["align"] }, { kind: "component", type: MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: MatDialogClose, selector: "[mat-dialog-close], [matDialogClose]", inputs: ["aria-label", "type", "mat-dialog-close", "matDialogClose"], exportAs: ["matDialogClose"] }] });
|
|
1232
|
+
}
|
|
1233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DialogComponent, decorators: [{
|
|
1234
|
+
type: Component,
|
|
1235
|
+
args: [{ selector: 'lib-dialog', imports: [MatDialogTitle, MatDialogContent, MatDialogActions, MatButton, MatDialogClose], template: "<h1 mat-dialog-title>{{ data.title }}</h1>\n<div mat-dialog-content>\n <div style=\"white-space: pre-line\">{{ data.message }}</div>\n</div>\n<div mat-dialog-actions align=\"end\">\n <button mat-raised-button (click)=\"onNoClick()\" cdkFocusInitial>{{ data.btnNoTitle }}</button>\n <button mat-raised-button color=\"warn\" [mat-dialog-close]=\"data.id\">{{ data.btnYesTitle }}</button>\n</div>\n\n" }]
|
|
1236
|
+
}], ctorParameters: () => [{ type: i1$4.MatDialogRef }, { type: undefined, decorators: [{
|
|
1237
|
+
type: Inject,
|
|
1238
|
+
args: [MAT_DIALOG_DATA]
|
|
1239
|
+
}] }] });
|
|
1240
|
+
|
|
1241
|
+
class BasePageClass {
|
|
1242
|
+
routeAnimationsElements = ROUTE_ANIMATIONS_ELEMENTS;
|
|
1243
|
+
/** Данные для табличного компонента. */
|
|
1244
|
+
data$ = new BehaviorSubject([]);
|
|
1245
|
+
/** Количество записей по фильтру. */
|
|
1246
|
+
length$ = new BehaviorSubject(0);
|
|
1247
|
+
entityService;
|
|
1248
|
+
entityType;
|
|
1249
|
+
entityEditComponent;
|
|
1250
|
+
extraData;
|
|
1251
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1252
|
+
defaultPageIndex = 0;
|
|
1253
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1254
|
+
defaultPageSize = 10;
|
|
1255
|
+
dialog;
|
|
1256
|
+
dialogEditWidth = 'auto';
|
|
1257
|
+
dialogRemoveWidth = '400px';
|
|
1258
|
+
alertService;
|
|
1259
|
+
routeAddress = '';
|
|
1260
|
+
/** Сообщение при удалении записе(й). */
|
|
1261
|
+
removalMessage = '';
|
|
1262
|
+
/** Заголовок страницы. */
|
|
1263
|
+
pageTitle = '';
|
|
1264
|
+
/**
|
|
1265
|
+
* Создание записи: вызывается перед окрытием диалога.
|
|
1266
|
+
*/
|
|
1267
|
+
beforeOpenDialogOnNewEvent;
|
|
1268
|
+
/**
|
|
1269
|
+
* Редактирование записи: вызывается перед окрытием диалога.
|
|
1270
|
+
*/
|
|
1271
|
+
beforeOpenDialogOnEditEvent;
|
|
1272
|
+
/**
|
|
1273
|
+
* Создание записи: вызывается перед сохранением объекта.
|
|
1274
|
+
*/
|
|
1275
|
+
beforeSaveOnNewEvent;
|
|
1276
|
+
/**
|
|
1277
|
+
* Редактирование записи: вызывается перед сохранением объекта.
|
|
1278
|
+
*/
|
|
1279
|
+
beforeSaveOnEditEvent;
|
|
1280
|
+
/**
|
|
1281
|
+
* Создание записи: вызывается после сохранения объекта.
|
|
1282
|
+
*/
|
|
1283
|
+
afterSaveOnNewEvent;
|
|
1284
|
+
/**
|
|
1285
|
+
* Редактирование записи: вызывается после сохранения объекта.
|
|
1286
|
+
*/
|
|
1287
|
+
afterSaveOnEditEvent;
|
|
1288
|
+
editorRoles = [];
|
|
1289
|
+
executeRoles = [];
|
|
1290
|
+
/** Список ролей, для которых скрыть элемент. */
|
|
1291
|
+
hideRoles = ['HIDE'];
|
|
1292
|
+
/** Загрузка данных. */
|
|
1293
|
+
loadData$ = new Subject();
|
|
1294
|
+
/** Загрузка количества записей. */
|
|
1295
|
+
loadLength$ = new Subject();
|
|
1296
|
+
/** Очистка фильтра. */
|
|
1297
|
+
clearFilter$ = new Subject();
|
|
1298
|
+
/** Разрешен выбор нескольких строк. */
|
|
1299
|
+
allowMultiSelect = false;
|
|
1300
|
+
/** Выбранные строки в таблице. */
|
|
1301
|
+
selected = [];
|
|
1302
|
+
/** Состояние сортировки, пагинации. */
|
|
1303
|
+
tableState;
|
|
1304
|
+
/** Доступность кнопки "Изменить". */
|
|
1305
|
+
editBtnDisabled = true;
|
|
1306
|
+
/** Доступность кнопки "Удалить". */
|
|
1307
|
+
removeBtnDisabled = true;
|
|
1308
|
+
/** Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью. */
|
|
1309
|
+
dblClickedEventEnable = true;
|
|
1310
|
+
// Список элементов контекстного меню.
|
|
1311
|
+
opt = [];
|
|
1312
|
+
// DI
|
|
1313
|
+
router = inject(Router);
|
|
1314
|
+
localStorage = inject(LocalStorageService);
|
|
1315
|
+
subscription = new Subscription();
|
|
1316
|
+
constructor() {
|
|
1317
|
+
this.tableState = {
|
|
1318
|
+
sortActive: this.localStorage.getData(this.constructor.name + 'SortActive') || '',
|
|
1319
|
+
sortDirection: (this.localStorage.getData(this.constructor.name + 'SortDirection') || ''),
|
|
1320
|
+
pageIndex: Number(this.localStorage.getData(this.constructor.name + 'PageIndex')) || this.defaultPageIndex,
|
|
1321
|
+
pageSize: Number(this.localStorage.getData(this.constructor.name + 'PageSize')) || this.defaultPageSize
|
|
1322
|
+
};
|
|
1323
|
+
}
|
|
1324
|
+
ngOnDestroy() {
|
|
1325
|
+
if (this.subscription)
|
|
1326
|
+
this.subscription.unsubscribe();
|
|
1327
|
+
}
|
|
1328
|
+
onPageChange(pageState) {
|
|
1329
|
+
this.localStorage.saveData(this.constructor.name + 'PageIndex', pageState.pageIndex.toString());
|
|
1330
|
+
this.localStorage.saveData(this.constructor.name + 'PageSize', pageState.pageSize.toString());
|
|
1331
|
+
this.loadData$.next(null);
|
|
1332
|
+
this.loadLength$.next(null);
|
|
1333
|
+
}
|
|
1334
|
+
onSortChange(sortState) {
|
|
1335
|
+
this.localStorage.saveData(this.constructor.name + 'SortActive', sortState.sortActive);
|
|
1336
|
+
this.localStorage.saveData(this.constructor.name + 'SortDirection', sortState.sortDirection);
|
|
1337
|
+
this.loadData$.next(null);
|
|
1338
|
+
this.loadLength$.next(null);
|
|
1339
|
+
}
|
|
1340
|
+
entityFactory(type) {
|
|
1341
|
+
return new type();
|
|
1342
|
+
}
|
|
1343
|
+
/** Cобытие изменение выбранных записей. */
|
|
1344
|
+
onSelectionChange(selected) {
|
|
1345
|
+
this.selected = selected;
|
|
1346
|
+
this.editBtnDisabledUpdate(this.selected);
|
|
1347
|
+
this.removeBtnDisabledUpdate(this.selected);
|
|
1348
|
+
}
|
|
1349
|
+
/** Обновление доступности кнопки "Изменить" - вызывается при изменении выбранных записей. */
|
|
1350
|
+
editBtnDisabledUpdate(selected) {
|
|
1351
|
+
this.editBtnDisabled = !(selected && selected.length === 1);
|
|
1352
|
+
}
|
|
1353
|
+
/** Обновление доступности кнопки "Удалить" - вызывается при изменении выбранных записей. */
|
|
1354
|
+
removeBtnDisabledUpdate(selected) {
|
|
1355
|
+
this.removeBtnDisabled = !(selected && selected.length > 0);
|
|
1356
|
+
}
|
|
1357
|
+
/** Cобытие двойной клик. */
|
|
1358
|
+
onRowDoubleClicked() {
|
|
1359
|
+
this.editEvent();
|
|
1360
|
+
}
|
|
1361
|
+
/** Cобытие создание. */
|
|
1362
|
+
newEvent() {
|
|
1363
|
+
if (this.entityEditComponent) {
|
|
1364
|
+
const data = { action: Action.Add, entity: new this.entityType(null) };
|
|
1365
|
+
// Назначить значения полей объекта перед окрытием диалога.
|
|
1366
|
+
if (this.beforeOpenDialogOnNewEvent) {
|
|
1367
|
+
this.beforeOpenDialogOnNewEvent(data.entity, data.extraData);
|
|
1368
|
+
}
|
|
1369
|
+
// Открытие окна
|
|
1370
|
+
const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);
|
|
1371
|
+
// Обработка закрытия окна
|
|
1372
|
+
const subs = dialogRef.afterClosed().subscribe((result) => {
|
|
1373
|
+
// Проверка результата
|
|
1374
|
+
if (result && result.entity && (Object.keys(result.entity).length !== 0)) {
|
|
1375
|
+
// Дополнительные действия перед сохранением объекта.
|
|
1376
|
+
if (this.beforeSaveOnNewEvent)
|
|
1377
|
+
this.beforeSaveOnNewEvent(result.entity, result.extraData);
|
|
1378
|
+
const subs = this.entityService.newObject(result.entity)
|
|
1379
|
+
.subscribe({
|
|
1380
|
+
next: (obj) => {
|
|
1381
|
+
// Дополнительные действия после сохранения объекта.
|
|
1382
|
+
if (this.afterSaveOnNewEvent) {
|
|
1383
|
+
const callback = () => {
|
|
1384
|
+
this.refreshEvent();
|
|
1385
|
+
this.alertService?.success('Запись добавлена.');
|
|
1386
|
+
};
|
|
1387
|
+
this.afterSaveOnNewEvent(callback.bind(this), obj, result.extraData);
|
|
1388
|
+
}
|
|
1389
|
+
else {
|
|
1390
|
+
this.refreshEvent();
|
|
1391
|
+
this.alertService?.success('Запись добавлена.');
|
|
1392
|
+
}
|
|
1393
|
+
},
|
|
1394
|
+
error: (error) => {
|
|
1395
|
+
console.log('error', error);
|
|
1396
|
+
this.alertService?.error('Произошла ошибка при добавлении записи: ' + error, 0);
|
|
1397
|
+
}
|
|
1398
|
+
});
|
|
1399
|
+
this.subscription?.add(subs);
|
|
1400
|
+
}
|
|
1401
|
+
});
|
|
1402
|
+
this.subscription?.add(subs);
|
|
1403
|
+
// Закрытие окна по нажатию Escape
|
|
1404
|
+
const subs2 = dialogRef.keydownEvents().subscribe((event) => {
|
|
1405
|
+
if (event.key === 'Escape') {
|
|
1406
|
+
dialogRef.close(null);
|
|
1407
|
+
}
|
|
1408
|
+
});
|
|
1409
|
+
this.subscription?.add(subs2);
|
|
1410
|
+
}
|
|
1411
|
+
else {
|
|
1412
|
+
this.alertService?.warning('Действие не доступно.');
|
|
1413
|
+
}
|
|
1414
|
+
}
|
|
1415
|
+
/** Cобытие редактирование. */
|
|
1416
|
+
editEvent() {
|
|
1417
|
+
if (this.selected && this.selected.length === 1) {
|
|
1418
|
+
if (this.entityEditComponent) {
|
|
1419
|
+
const data = { action: Action.Edit, entity: this.selected[0] };
|
|
1420
|
+
// Назначить значения полей объекта перед окрытием диалога.
|
|
1421
|
+
if (this.beforeOpenDialogOnEditEvent) {
|
|
1422
|
+
this.beforeOpenDialogOnEditEvent(data.entity, data.extraData);
|
|
1423
|
+
}
|
|
1424
|
+
// Открытие окна
|
|
1425
|
+
const dialogRef = this.openDialog(this.entityEditComponent, data, this.dialog);
|
|
1426
|
+
// Обработка закрытия окна
|
|
1427
|
+
const subs = dialogRef.afterClosed().subscribe((result) => {
|
|
1428
|
+
// Проверка результата
|
|
1429
|
+
if (result && result.entity && (Object.keys(result.entity).length !== 0)) {
|
|
1430
|
+
// Дополнительные действия перед сохранением объекта.
|
|
1431
|
+
if (this.beforeSaveOnEditEvent)
|
|
1432
|
+
this.beforeSaveOnEditEvent(result.entity, result.extraData);
|
|
1433
|
+
const subs = this.entityService.editObject(result.entity)
|
|
1434
|
+
.subscribe({
|
|
1435
|
+
next: () => {
|
|
1436
|
+
// Дополнительные действия после сохранения объекта.
|
|
1437
|
+
if (this.afterSaveOnEditEvent) {
|
|
1438
|
+
const callback = () => {
|
|
1439
|
+
this.refreshEvent();
|
|
1440
|
+
this.alertService?.success('Запись изменена.');
|
|
1441
|
+
};
|
|
1442
|
+
this.afterSaveOnEditEvent(callback.bind(this), result.entity, result.extraData);
|
|
1443
|
+
}
|
|
1444
|
+
else {
|
|
1445
|
+
this.refreshEvent();
|
|
1446
|
+
this.alertService?.success('Запись изменена.');
|
|
1447
|
+
}
|
|
1448
|
+
},
|
|
1449
|
+
error: (error) => {
|
|
1450
|
+
console.log('error', error);
|
|
1451
|
+
this.alertService?.error('Произошла ошибка при изменении записи: ' + error, 0);
|
|
1452
|
+
}
|
|
1453
|
+
});
|
|
1454
|
+
this.subscription?.add(subs);
|
|
1455
|
+
}
|
|
1456
|
+
});
|
|
1457
|
+
this.subscription?.add(subs);
|
|
1458
|
+
// Закрытие окна по нажатию Escape
|
|
1459
|
+
const subs2 = dialogRef.keydownEvents().subscribe((event) => {
|
|
1460
|
+
if (event.key === 'Escape') {
|
|
1461
|
+
dialogRef.close(null);
|
|
1462
|
+
}
|
|
1463
|
+
});
|
|
1464
|
+
this.subscription?.add(subs2);
|
|
1465
|
+
}
|
|
1466
|
+
else {
|
|
1467
|
+
this.alertService?.warning('Действие не доступно.');
|
|
1468
|
+
}
|
|
1469
|
+
}
|
|
1470
|
+
}
|
|
1471
|
+
/** Cобытие удаление. */
|
|
1472
|
+
removeEvent() {
|
|
1473
|
+
// если вырбана запись(и)
|
|
1474
|
+
if (this.selected && this.selected.length > 0) {
|
|
1475
|
+
const dialogRef = this.openDialogRemoveConfirm(this.removalMessage);
|
|
1476
|
+
if (dialogRef) {
|
|
1477
|
+
const subs = dialogRef.afterClosed().subscribe((result) => {
|
|
1478
|
+
// при подтверждении возвращается 'delete'
|
|
1479
|
+
if (result === 'delete') {
|
|
1480
|
+
const sourcesObject = {};
|
|
1481
|
+
this.selected.forEach((item, index) => sourcesObject['obj' + index] = this.entityService.deleteObject(item));
|
|
1482
|
+
// ждем, когда выполнятся все запросы
|
|
1483
|
+
const subs = forkJoin(sourcesObject)
|
|
1484
|
+
.subscribe({
|
|
1485
|
+
next: () => {
|
|
1486
|
+
this.refreshEvent();
|
|
1487
|
+
this.alertService?.success('Выбранные записи удалены.');
|
|
1488
|
+
},
|
|
1489
|
+
error: (error) => {
|
|
1490
|
+
console.log('error', error);
|
|
1491
|
+
this.alertService?.error('Произошла ошибка при удалении записи: ' + error, 0);
|
|
1492
|
+
}
|
|
1493
|
+
});
|
|
1494
|
+
this.subscription?.add(subs);
|
|
1495
|
+
}
|
|
1496
|
+
});
|
|
1497
|
+
this.subscription?.add(subs);
|
|
1498
|
+
// Закрытие окна по нажатию Escape
|
|
1499
|
+
const subs2 = dialogRef.keydownEvents().subscribe((event) => {
|
|
1500
|
+
if (event.key === 'Escape') {
|
|
1501
|
+
dialogRef.close(null);
|
|
1502
|
+
}
|
|
1503
|
+
});
|
|
1504
|
+
this.subscription?.add(subs2);
|
|
1505
|
+
}
|
|
1506
|
+
}
|
|
1507
|
+
}
|
|
1508
|
+
/** Событие обновления данных. */
|
|
1509
|
+
refreshEvent() {
|
|
1510
|
+
this.loadData$.next(null);
|
|
1511
|
+
this.loadLength$.next(null);
|
|
1512
|
+
}
|
|
1513
|
+
/** Cобытие очистки фильтра. */
|
|
1514
|
+
clearEvent() {
|
|
1515
|
+
this.clearFilter$.next(null);
|
|
1516
|
+
}
|
|
1517
|
+
/** Изменение сообщения об удалении. */
|
|
1518
|
+
onRemovalMessageChange(message) {
|
|
1519
|
+
this.removalMessage = message;
|
|
1520
|
+
}
|
|
1521
|
+
/** Изменение заголовка страницы. */
|
|
1522
|
+
onPageTitleChange(title) {
|
|
1523
|
+
this.pageTitle = title;
|
|
1524
|
+
}
|
|
1525
|
+
openDialog(entityComponent, data, dialog) {
|
|
1526
|
+
// create dialog config
|
|
1527
|
+
const dialogConfig = new MatDialogConfig();
|
|
1528
|
+
dialogConfig.disableClose = true;
|
|
1529
|
+
dialogConfig.autoFocus = true;
|
|
1530
|
+
dialogConfig.width = this.dialogEditWidth;
|
|
1531
|
+
dialogConfig.data = data;
|
|
1532
|
+
dialogConfig.panelClass = this.entityType.name + '-edit-dialog';
|
|
1533
|
+
// return dialog
|
|
1534
|
+
return dialog.open(entityComponent, dialogConfig);
|
|
1535
|
+
}
|
|
1536
|
+
openDialogRemoveConfirm(removalMessage) {
|
|
1537
|
+
let message = 'Вы хотите удалить ';
|
|
1538
|
+
message += removalMessage ?
|
|
1539
|
+
removalMessage :
|
|
1540
|
+
this.allowMultiSelect ? `выбранные записи (${this.selected.length})?` : 'выбранную запись?';
|
|
1541
|
+
return this.dialog?.open(DialogComponent, {
|
|
1542
|
+
width: this.dialogRemoveWidth,
|
|
1543
|
+
data: {
|
|
1544
|
+
id: 'delete',
|
|
1545
|
+
title: 'Подтверждение',
|
|
1546
|
+
message: message,
|
|
1547
|
+
btnNoTitle: 'Отмена',
|
|
1548
|
+
btnYesTitle: 'Удалить'
|
|
1549
|
+
}
|
|
1550
|
+
});
|
|
1551
|
+
}
|
|
1552
|
+
// contextMenu: Документы потока (в новой вкладке).
|
|
1553
|
+
onMiddleButton(baseUrl, queryParamName, queryParamValue) {
|
|
1554
|
+
return ($event, item, contextMenu) => {
|
|
1555
|
+
// Нажата средняя кнопка (в новой вкладке).
|
|
1556
|
+
// 1 - Auxiliary button pressed (usually the middle button)
|
|
1557
|
+
if ($event.button === 1) {
|
|
1558
|
+
//$event.preventDefault();
|
|
1559
|
+
contextMenu.closeMenu();
|
|
1560
|
+
// Converts the route into a string that can be used
|
|
1561
|
+
// with the window.open() function
|
|
1562
|
+
const url = this.router.serializeUrl(queryParamName && queryParamValue ?
|
|
1563
|
+
this.router.createUrlTree([baseUrl], { queryParams: { [queryParamName]: item[queryParamValue] } })
|
|
1564
|
+
: this.router.createUrlTree([baseUrl]));
|
|
1565
|
+
window.open(url, '_blank');
|
|
1566
|
+
}
|
|
1567
|
+
};
|
|
1568
|
+
}
|
|
1569
|
+
dateToString(date) {
|
|
1570
|
+
return date ? (new Date(date)).toLocaleString('ru-RU', { timeZone: 'Europe/Samara' }) : null; // MSK+01
|
|
1571
|
+
}
|
|
1572
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BasePageClass, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
1573
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "19.2.2", type: BasePageClass, isStandalone: true, ngImport: i0 });
|
|
1574
|
+
}
|
|
1575
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BasePageClass, decorators: [{
|
|
1576
|
+
type: Directive
|
|
1577
|
+
}], ctorParameters: () => [] });
|
|
1578
|
+
|
|
1579
|
+
class BaseServiceClass {
|
|
1580
|
+
baseRoute = '';
|
|
1581
|
+
entityType;
|
|
1582
|
+
countRoute = 'count';
|
|
1583
|
+
basePageRoute = 'page';
|
|
1584
|
+
basePageSizeRoute = 'pageSize';
|
|
1585
|
+
http = inject(HttpClient);
|
|
1586
|
+
constructor() { }
|
|
1587
|
+
getObjects() {
|
|
1588
|
+
return this.http.get(this.baseRoute)
|
|
1589
|
+
.pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));
|
|
1590
|
+
}
|
|
1591
|
+
getObject(id) {
|
|
1592
|
+
return this.http.get(this.baseRoute + id)
|
|
1593
|
+
.pipe(map(data => new this.entityType(data).deserialize(data)));
|
|
1594
|
+
}
|
|
1595
|
+
getCount() {
|
|
1596
|
+
return this.http.get(this.baseRoute + this.countRoute);
|
|
1597
|
+
}
|
|
1598
|
+
getObjectsByPaging(pageIndex, pageSize, sortColumn, direction) {
|
|
1599
|
+
const params = this.getParams(pageIndex, pageSize, sortColumn, direction);
|
|
1600
|
+
return this.http.get(this.baseRoute, { params })
|
|
1601
|
+
.pipe(map(data => data.map(item => new this.entityType(item).deserialize(item))));
|
|
1602
|
+
}
|
|
1603
|
+
newObject(entity) {
|
|
1604
|
+
return this.http.post(this.baseRoute, entity);
|
|
1605
|
+
}
|
|
1606
|
+
editObject(entity) {
|
|
1607
|
+
return this.http.put(this.baseRoute + entity.id, entity);
|
|
1608
|
+
}
|
|
1609
|
+
deleteObject(entity) {
|
|
1610
|
+
return this.http.delete(this.baseRoute + entity.id);
|
|
1611
|
+
}
|
|
1612
|
+
getParams(pageIndex, pageSize, sortColumn, direction) {
|
|
1613
|
+
let params = new HttpParams();
|
|
1614
|
+
if (pageIndex)
|
|
1615
|
+
params = params.append('page', pageIndex);
|
|
1616
|
+
if (pageSize)
|
|
1617
|
+
params = params.append('limit', pageSize);
|
|
1618
|
+
if (sortColumn)
|
|
1619
|
+
params = params.append('column', sortColumn);
|
|
1620
|
+
if (direction)
|
|
1621
|
+
params = params.append('direction', direction);
|
|
1622
|
+
return params;
|
|
1623
|
+
}
|
|
1624
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1625
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, providedIn: 'root' });
|
|
1626
|
+
}
|
|
1627
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseServiceClass, decorators: [{
|
|
1628
|
+
type: Injectable,
|
|
1629
|
+
args: [{
|
|
1630
|
+
providedIn: 'root'
|
|
1631
|
+
}]
|
|
1632
|
+
}], ctorParameters: () => [] });
|
|
1633
|
+
|
|
1634
|
+
class RedirectGuard {
|
|
1635
|
+
constructor() { }
|
|
1636
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
1637
|
+
canActivate(route, state) {
|
|
1638
|
+
console.log(route.data['externalUrl']);
|
|
1639
|
+
window.location.href = route.data['externalUrl'];
|
|
1640
|
+
return true;
|
|
1641
|
+
}
|
|
1642
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1643
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, providedIn: 'root' });
|
|
1644
|
+
}
|
|
1645
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: RedirectGuard, decorators: [{
|
|
1646
|
+
type: Injectable,
|
|
1647
|
+
args: [{
|
|
1648
|
+
providedIn: 'root'
|
|
1649
|
+
}]
|
|
1650
|
+
}], ctorParameters: () => [] });
|
|
1651
|
+
|
|
1652
|
+
class SecUser {
|
|
1653
|
+
id = 0;
|
|
1654
|
+
login = '';
|
|
1655
|
+
fio = '';
|
|
1656
|
+
dept = 0;
|
|
1657
|
+
tabnum = 0;
|
|
1658
|
+
userView;
|
|
1659
|
+
constructor(init) {
|
|
1660
|
+
if (init) {
|
|
1661
|
+
Object.assign(this, init);
|
|
1662
|
+
}
|
|
1663
|
+
else {
|
|
1664
|
+
this.id = 0;
|
|
1665
|
+
this.login = '';
|
|
1666
|
+
this.dept = 0;
|
|
1667
|
+
this.tabnum = 0;
|
|
1668
|
+
this.fio = '';
|
|
1669
|
+
}
|
|
1670
|
+
}
|
|
1671
|
+
deserialize(input) {
|
|
1672
|
+
Object.assign(this, input);
|
|
1673
|
+
return this;
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
class SafePipe {
|
|
1678
|
+
sanitizer;
|
|
1679
|
+
constructor(sanitizer) {
|
|
1680
|
+
this.sanitizer = sanitizer;
|
|
1681
|
+
}
|
|
1682
|
+
transform(url) {
|
|
1683
|
+
return this.sanitizer.bypassSecurityTrustResourceUrl(url);
|
|
1684
|
+
}
|
|
1685
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, deps: [{ token: i1$5.DomSanitizer }], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1686
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, isStandalone: true, name: "safe" });
|
|
1687
|
+
}
|
|
1688
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: SafePipe, decorators: [{
|
|
1689
|
+
type: Pipe,
|
|
1690
|
+
args: [{
|
|
1691
|
+
name: 'safe'
|
|
1692
|
+
}]
|
|
1693
|
+
}], ctorParameters: () => [{ type: i1$5.DomSanitizer }] });
|
|
1694
|
+
|
|
1695
|
+
class TimePipe {
|
|
1696
|
+
transform(value) {
|
|
1697
|
+
// const hour = Math.abs(value) >= 60 ? Math.round(value / 60) + 'ч.' : '';
|
|
1698
|
+
// const minute = ' ' + Math.abs(value % 60) + 'м.';
|
|
1699
|
+
// return value === 0 ? '0' : hour + ' ' + minute;
|
|
1700
|
+
const hour = Math.abs(value) >= 60 ? Math.floor(Math.abs(value) / 60).toString().padStart(2, '0') : '00';
|
|
1701
|
+
const minute = Math.abs(value % 60).toString().padStart(2, '0');
|
|
1702
|
+
const time = hour + ':' + minute;
|
|
1703
|
+
return value < 0 ? '-' + time : time;
|
|
1704
|
+
}
|
|
1705
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1706
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, isStandalone: true, name: "time" });
|
|
1707
|
+
}
|
|
1708
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TimePipe, decorators: [{
|
|
1709
|
+
type: Pipe,
|
|
1710
|
+
args: [{
|
|
1711
|
+
name: 'time'
|
|
1712
|
+
}]
|
|
1713
|
+
}] });
|
|
1714
|
+
|
|
1715
|
+
class TruncatePipe {
|
|
1716
|
+
// Usage:
|
|
1717
|
+
// {{ str | truncate:[20] }} // or
|
|
1718
|
+
// {{ str | truncate:[20, '...'] }} // or|
|
|
1719
|
+
transform(value, args) {
|
|
1720
|
+
const limit = args.length > 0 ? parseInt(args[0], 10) : 20;
|
|
1721
|
+
const trail = args.length > 1 ? args[1] : '...';
|
|
1722
|
+
return value.length > limit ? value.substring(0, limit) + trail : value;
|
|
1723
|
+
}
|
|
1724
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe });
|
|
1725
|
+
static ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, isStandalone: true, name: "truncate" });
|
|
1726
|
+
}
|
|
1727
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TruncatePipe, decorators: [{
|
|
1728
|
+
type: Pipe,
|
|
1729
|
+
args: [{
|
|
1730
|
+
name: 'truncate'
|
|
1731
|
+
}]
|
|
1732
|
+
}] });
|
|
1733
|
+
|
|
1734
|
+
class AvatarService {
|
|
1735
|
+
http;
|
|
1736
|
+
baseRoute = 'common/human/';
|
|
1737
|
+
constructor(http) {
|
|
1738
|
+
this.http = http;
|
|
1739
|
+
}
|
|
1740
|
+
getAvatarById(idHuman) {
|
|
1741
|
+
return this.http.get(this.baseRoute + idHuman + '/avatar', { responseType: 'arraybuffer' });
|
|
1742
|
+
}
|
|
1743
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, deps: [{ token: i1$2.HttpClient }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1744
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, providedIn: 'root' });
|
|
1745
|
+
}
|
|
1746
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: AvatarService, decorators: [{
|
|
1747
|
+
type: Injectable,
|
|
1748
|
+
args: [{
|
|
1749
|
+
providedIn: 'root'
|
|
1750
|
+
}]
|
|
1751
|
+
}], ctorParameters: () => [{ type: i1$2.HttpClient }] });
|
|
1752
|
+
|
|
1753
|
+
class ExportService {
|
|
1754
|
+
constructor() {
|
|
1755
|
+
}
|
|
1756
|
+
// Экспорт в CSV
|
|
1757
|
+
exportCSV(data, filename = 'data', arrHeader, newHeaders) {
|
|
1758
|
+
const csvData = this.convertToCSV(data, arrHeader, newHeaders);
|
|
1759
|
+
console.log(csvData);
|
|
1760
|
+
const blob = new Blob(['\ufeff' + csvData], { type: 'text/csv;charset=utf-8;' });
|
|
1761
|
+
const dwldLink = document.createElement('a');
|
|
1762
|
+
const url = URL.createObjectURL(blob);
|
|
1763
|
+
const isSafariBrowser = navigator.userAgent.indexOf('Safari') !== -1 && navigator.userAgent.indexOf('Chrome') === -1;
|
|
1764
|
+
if (isSafariBrowser) { //if Safari open in new window to save file with random filename.
|
|
1765
|
+
dwldLink.setAttribute('target', '_blank');
|
|
1766
|
+
}
|
|
1767
|
+
dwldLink.setAttribute('href', url);
|
|
1768
|
+
dwldLink.setAttribute('download', filename + '.csv');
|
|
1769
|
+
dwldLink.style.visibility = 'hidden';
|
|
1770
|
+
document.body.appendChild(dwldLink);
|
|
1771
|
+
dwldLink.click();
|
|
1772
|
+
document.body.removeChild(dwldLink);
|
|
1773
|
+
}
|
|
1774
|
+
convertToCSV(objArray, headerList, newHeaders) {
|
|
1775
|
+
const array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
|
|
1776
|
+
let str = '';
|
|
1777
|
+
let row = 'S.No,';
|
|
1778
|
+
for (const index in newHeaders) {
|
|
1779
|
+
if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {
|
|
1780
|
+
row += newHeaders[index] + ',';
|
|
1781
|
+
}
|
|
1782
|
+
}
|
|
1783
|
+
row = row.slice(0, -1);
|
|
1784
|
+
str += row + '\r\n';
|
|
1785
|
+
for (let i = 0; i < array.length; i++) {
|
|
1786
|
+
let line = (i + 1) + '';
|
|
1787
|
+
for (const index in headerList) {
|
|
1788
|
+
if (Object.prototype.hasOwnProperty.call(newHeaders, index)) {
|
|
1789
|
+
const head = headerList[index];
|
|
1790
|
+
line += ',' + array[i][head];
|
|
1791
|
+
}
|
|
1792
|
+
}
|
|
1793
|
+
str += line + '\r\n';
|
|
1794
|
+
}
|
|
1795
|
+
return str;
|
|
1796
|
+
}
|
|
1797
|
+
// Экспорт в Excel
|
|
1798
|
+
exportExcel(data, heading, sheetName = 'sheet1', filename = 'data') {
|
|
1799
|
+
const wb = XLSX.utils.book_new();
|
|
1800
|
+
const ws = XLSX.utils.json_to_sheet([]);
|
|
1801
|
+
XLSX.utils.sheet_add_aoa(ws, heading);
|
|
1802
|
+
XLSX.utils.sheet_add_json(ws, data, { origin: 'A2', skipHeader: true });
|
|
1803
|
+
XLSX.utils.book_append_sheet(wb, ws, sheetName);
|
|
1804
|
+
XLSX.writeFile(wb, filename + '.xlsx');
|
|
1805
|
+
}
|
|
1806
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
1807
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, providedIn: 'root' });
|
|
1808
|
+
}
|
|
1809
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ExportService, decorators: [{
|
|
1810
|
+
type: Injectable,
|
|
1811
|
+
args: [{
|
|
1812
|
+
providedIn: 'root'
|
|
1813
|
+
}]
|
|
1814
|
+
}], ctorParameters: () => [] });
|
|
1815
|
+
|
|
1816
|
+
class BaseMatChipComponent {
|
|
1817
|
+
// Все элементы
|
|
1818
|
+
items$ = new BehaviorSubject([]);
|
|
1819
|
+
// Выбранные элементы, ключи (ChipItem.value)
|
|
1820
|
+
selectedItems$ = new Observable();
|
|
1821
|
+
// Заголовок
|
|
1822
|
+
title = '';
|
|
1823
|
+
// Событие изменения выбранных элементов
|
|
1824
|
+
selectedItemsChange = new EventEmitter();
|
|
1825
|
+
input;
|
|
1826
|
+
separatorKeysCodes = [ENTER, COMMA];
|
|
1827
|
+
inputCtrl = new FormControl();
|
|
1828
|
+
filteredItems$;
|
|
1829
|
+
selectedItems = [];
|
|
1830
|
+
// Все элементы
|
|
1831
|
+
items = [];
|
|
1832
|
+
subscription;
|
|
1833
|
+
constructor() {
|
|
1834
|
+
}
|
|
1835
|
+
ngOnInit() {
|
|
1836
|
+
this.subscription = this.items$.subscribe(data => {
|
|
1837
|
+
// console.log('ITEMS$ data', data);
|
|
1838
|
+
this.items = data;
|
|
1839
|
+
if (this.items.length > 0) {
|
|
1840
|
+
this.filteredItems$ = this.inputCtrl.valueChanges.pipe(startWith(null), map(item => (item ? this._filter(item) : this.items.slice())));
|
|
1841
|
+
const subs = this.selectedItems$.subscribe(items => {
|
|
1842
|
+
// console.log('ITEMS', items);
|
|
1843
|
+
if (items)
|
|
1844
|
+
this.selectedItems = this.items.filter(s => items.includes(s.value));
|
|
1845
|
+
});
|
|
1846
|
+
this.subscription?.add(subs);
|
|
1847
|
+
}
|
|
1848
|
+
});
|
|
1849
|
+
}
|
|
1850
|
+
ngOnDestroy() {
|
|
1851
|
+
if (this.subscription)
|
|
1852
|
+
this.subscription.unsubscribe();
|
|
1853
|
+
}
|
|
1854
|
+
remove(value) {
|
|
1855
|
+
this.selectedItems = [...this.selectedItems];
|
|
1856
|
+
const index = this.selectedItems.map(i => i.value).indexOf(value);
|
|
1857
|
+
if (index >= 0) {
|
|
1858
|
+
this.selectedItems.splice(index, 1);
|
|
1859
|
+
this.selectedItemsChange.emit(this.selectedItems.map(i => i.value));
|
|
1860
|
+
}
|
|
1861
|
+
}
|
|
1862
|
+
selected(event) {
|
|
1863
|
+
this.selectedItems = [...this.selectedItems];
|
|
1864
|
+
const item = this.items.find(s => s.value == event.option.value);
|
|
1865
|
+
if (item) {
|
|
1866
|
+
this.selectedItems.push(item);
|
|
1867
|
+
}
|
|
1868
|
+
this.selectedItemsChange.emit(this.selectedItems.map(i => i.value));
|
|
1869
|
+
if (this.input)
|
|
1870
|
+
this.input.nativeElement.value = '';
|
|
1871
|
+
this.inputCtrl.setValue(null);
|
|
1872
|
+
}
|
|
1873
|
+
_filter(value) {
|
|
1874
|
+
const filterValue = value.toLowerCase();
|
|
1875
|
+
return this.items.filter(item => item.viewValue.toLowerCase().includes(filterValue));
|
|
1876
|
+
}
|
|
1877
|
+
onCloseClick($event) {
|
|
1878
|
+
$event.stopPropagation();
|
|
1879
|
+
this.selectedItemsChange.emit([]);
|
|
1880
|
+
}
|
|
1881
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseMatChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1882
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseMatChipComponent, isStandalone: true, selector: "lib-chip-input-autocomplete", inputs: { items$: "items$", selectedItems$: "selectedItems$", title: "title" }, outputs: { selectedItemsChange: "selectedItemsChange" }, viewQueries: [{ propertyName: "input", first: true, predicate: ["input"], descendants: true }], ngImport: i0, template: "<mat-form-field class=\"chip-list\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-chip-grid #chipList aria-label=\"'\u0412\u044B\u0431\u043E\u0440 '+title\">\r\n @for (item of selectedItems; track item) {\r\n <mat-chip-row color=\"primary\"\r\n (removed)=\"remove(item.value)\">\r\n {{ item.viewValue }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input\r\n #input\r\n [placeholder]=\"'\u0412\u0432\u0435\u0434\u0438\u0442\u0435 '+title+'...'\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n >\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n @for (item of filteredItems$ | async; track item) {\r\n <mat-option [value]=\"item.value\"\r\n [disabled]=\"(selectedItems$ | async)?.includes(item.value)\">\r\n {{ item.viewValue }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (selectedItems.length>0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onCloseClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".chip-list{width:100%}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatChipsModule }, { kind: "component", type: i4.MatChipGrid, selector: "mat-chip-grid", inputs: ["disabled", "placeholder", "required", "value", "errorStateMatcher"], outputs: ["change", "valueChange"] }, { kind: "directive", type: i4.MatChipInput, selector: "input[matChipInputFor]", inputs: ["matChipInputFor", "matChipInputAddOnBlur", "matChipInputSeparatorKeyCodes", "placeholder", "id", "disabled"], outputs: ["matChipInputTokenEnd"], exportAs: ["matChipInput", "matChipInputFor"] }, { kind: "directive", type: i4.MatChipRemove, selector: "[matChipRemove]" }, { kind: "component", type: i4.MatChipRow, selector: "mat-chip-row, [mat-chip-row], mat-basic-chip-row, [mat-basic-chip-row]", inputs: ["editable"], outputs: ["edited"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }] });
|
|
1883
|
+
}
|
|
1884
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseMatChipComponent, decorators: [{
|
|
1885
|
+
type: Component,
|
|
1886
|
+
args: [{ selector: 'lib-chip-input-autocomplete', imports: [MatFormField, AsyncPipe, FormsModule, ReactiveFormsModule, MatAutocompleteModule, MatIcon, MatOption, MatChipsModule, MatLabel], template: "<mat-form-field class=\"chip-list\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-chip-grid #chipList aria-label=\"'\u0412\u044B\u0431\u043E\u0440 '+title\">\r\n @for (item of selectedItems; track item) {\r\n <mat-chip-row color=\"primary\"\r\n (removed)=\"remove(item.value)\">\r\n {{ item.viewValue }}\r\n <button matChipRemove>\r\n <mat-icon>cancel</mat-icon>\r\n </button>\r\n </mat-chip-row>\r\n }\r\n </mat-chip-grid>\r\n <input\r\n #input\r\n [placeholder]=\"'\u0412\u0432\u0435\u0434\u0438\u0442\u0435 '+title+'...'\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [matChipInputFor]=\"chipList\"\r\n [matChipInputSeparatorKeyCodes]=\"separatorKeysCodes\"\r\n >\r\n <mat-autocomplete #auto=\"matAutocomplete\" (optionSelected)=\"selected($event)\">\r\n @for (item of filteredItems$ | async; track item) {\r\n <mat-option [value]=\"item.value\"\r\n [disabled]=\"(selectedItems$ | async)?.includes(item.value)\">\r\n {{ item.viewValue }}\r\n </mat-option>\r\n }\r\n </mat-autocomplete>\r\n @if (selectedItems.length>0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onCloseClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".chip-list{width:100%}\n"] }]
|
|
1887
|
+
}], ctorParameters: () => [], propDecorators: { items$: [{
|
|
1888
|
+
type: Input
|
|
1889
|
+
}], selectedItems$: [{
|
|
1890
|
+
type: Input
|
|
1891
|
+
}], title: [{
|
|
1892
|
+
type: Input
|
|
1893
|
+
}], selectedItemsChange: [{
|
|
1894
|
+
type: Output
|
|
1895
|
+
}], input: [{
|
|
1896
|
+
type: ViewChild,
|
|
1897
|
+
args: ['input']
|
|
1898
|
+
}] } });
|
|
1899
|
+
|
|
1900
|
+
function dateFormat(date) {
|
|
1901
|
+
if (date)
|
|
1902
|
+
return moment(date).format("YYYY-MM-DD");
|
|
1903
|
+
else
|
|
1904
|
+
return '';
|
|
1905
|
+
}
|
|
1906
|
+
|
|
1907
|
+
// See the Moment.js docs for the meaning of these formats:
|
|
1908
|
+
// https://momentjs.com/docs/#/displaying/format/
|
|
1909
|
+
const MY_FORMATS = {
|
|
1910
|
+
parse: {
|
|
1911
|
+
dateInput: 'DD.MM.YYYY',
|
|
1912
|
+
},
|
|
1913
|
+
display: {
|
|
1914
|
+
dateInput: 'DD.MM.YYYY',
|
|
1915
|
+
monthYearLabel: 'MMM YYYY',
|
|
1916
|
+
dateA11yLabel: 'LL',
|
|
1917
|
+
monthYearA11yLabel: 'MMMM YYYY',
|
|
1918
|
+
},
|
|
1919
|
+
};
|
|
1920
|
+
|
|
1921
|
+
class DateRangeFilterComponent {
|
|
1922
|
+
label = '';
|
|
1923
|
+
dateRange$ = new BehaviorSubject({ begin: '', end: '' });
|
|
1924
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1925
|
+
minDate = new Date(2020, 0, 1);
|
|
1926
|
+
clearFilter$ = new Subject();
|
|
1927
|
+
required = false;
|
|
1928
|
+
dateRangeChange = new EventEmitter();
|
|
1929
|
+
form;
|
|
1930
|
+
subscription;
|
|
1931
|
+
constructor() {
|
|
1932
|
+
this.form = new FormGroup({
|
|
1933
|
+
begin: new FormControl(),
|
|
1934
|
+
end: new FormControl(),
|
|
1935
|
+
});
|
|
1936
|
+
}
|
|
1937
|
+
ngOnInit() {
|
|
1938
|
+
this.subscription = this.dateRange$.subscribe((value) => {
|
|
1939
|
+
console.log(value);
|
|
1940
|
+
if (this.form) {
|
|
1941
|
+
this.form.controls['begin'].setValue(value.begin ? new Date(value.begin) : null);
|
|
1942
|
+
this.form.controls['end'].setValue(value.end ? new Date(value.begin) : null);
|
|
1943
|
+
}
|
|
1944
|
+
this.dateRangeChange.emit(this.rangeToDateDateRange(this.form.value));
|
|
1945
|
+
});
|
|
1946
|
+
if (this.required) {
|
|
1947
|
+
this.form.controls['begin'].addValidators(Validators.required);
|
|
1948
|
+
this.form.controls['end'].addValidators(Validators.required);
|
|
1949
|
+
}
|
|
1950
|
+
// подписка на изменение периода
|
|
1951
|
+
this.form.valueChanges
|
|
1952
|
+
.pipe(
|
|
1953
|
+
// eslint-disable-next-line no-magic-numbers
|
|
1954
|
+
debounceTime(500), distinctUntilChanged())
|
|
1955
|
+
.subscribe({
|
|
1956
|
+
next: range => {
|
|
1957
|
+
if (this.required) {
|
|
1958
|
+
if (range.begin && range.end) {
|
|
1959
|
+
this.dateRangeChange.emit(this.rangeToDateDateRange(range));
|
|
1960
|
+
}
|
|
1961
|
+
}
|
|
1962
|
+
else {
|
|
1963
|
+
this.dateRangeChange.emit(this.rangeToDateDateRange(range));
|
|
1964
|
+
}
|
|
1965
|
+
}
|
|
1966
|
+
});
|
|
1967
|
+
const subs = this.clearFilter$.subscribe(() => {
|
|
1968
|
+
this.form.reset();
|
|
1969
|
+
});
|
|
1970
|
+
this.subscription?.add(subs);
|
|
1971
|
+
}
|
|
1972
|
+
ngOnDestroy() {
|
|
1973
|
+
if (this.subscription)
|
|
1974
|
+
this.subscription.unsubscribe();
|
|
1975
|
+
}
|
|
1976
|
+
rangeToDateDateRange(range) {
|
|
1977
|
+
return {
|
|
1978
|
+
begin: range.begin ? dateFormat(range.begin) : '',
|
|
1979
|
+
end: range.end ? dateFormat(range.end) : ''
|
|
1980
|
+
};
|
|
1981
|
+
}
|
|
1982
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangeFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1983
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: DateRangeFilterComponent, isStandalone: true, selector: "lib-date-range-filter", inputs: { label: "label", dateRange$: "dateRange$", minDate: "minDate", clearFilter$: "clearFilter$", required: "required" }, outputs: { dateRangeChange: "dateRangeChange" }, providers: [
|
|
1984
|
+
{ provide: MAT_DATE_LOCALE, useValue: 'ru' },
|
|
1985
|
+
{ provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
|
|
1986
|
+
], ngImport: i0, template: "<mat-form-field appearance=\"fill\">\n <mat-label>{{label}}</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n [min]=\"minDate\">\n <input matStartDate formControlName=\"begin\" placeholder=\"\u0414\u0430\u0442\u0430 \u043D\u0430\u0447\u0430\u043B\u0430\">\n <input matEndDate formControlName=\"end\" placeholder=\"\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\">\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n <mat-error>\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434</mat-error>\n</mat-form-field>\n\n", styles: ["mat-form-field{margin-right:16px}\n"], dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "component", type: MatDateRangeInput, selector: "mat-date-range-input", inputs: ["rangePicker", "required", "dateFilter", "min", "max", "disabled", "separator", "comparisonStart", "comparisonEnd"], exportAs: ["matDateRangeInput"] }, { 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.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { 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: MatStartDate, selector: "input[matStartDate]", outputs: ["dateChange", "dateInput"] }, { kind: "directive", type: MatEndDate, selector: "input[matEndDate]", outputs: ["dateChange", "dateInput"] }, { kind: "component", type: MatDatepickerToggle, selector: "mat-datepicker-toggle", inputs: ["for", "tabIndex", "aria-label", "disabled", "disableRipple"], exportAs: ["matDatepickerToggle"] }, { kind: "directive", type: MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "component", type: MatDateRangePicker, selector: "mat-date-range-picker", exportAs: ["matDateRangePicker"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }] });
|
|
1987
|
+
}
|
|
1988
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: DateRangeFilterComponent, decorators: [{
|
|
1989
|
+
type: Component,
|
|
1990
|
+
args: [{ selector: 'lib-date-range-filter', imports: [MatFormField, MatLabel, MatDateRangeInput, FormsModule, ReactiveFormsModule, MatStartDate, MatEndDate,
|
|
1991
|
+
MatDatepickerToggle, MatSuffix, MatDateRangePicker, MatError], providers: [
|
|
1992
|
+
{ provide: MAT_DATE_LOCALE, useValue: 'ru' },
|
|
1993
|
+
{ provide: MAT_DATE_FORMATS, useValue: MY_FORMATS },
|
|
1994
|
+
], template: "<mat-form-field appearance=\"fill\">\n <mat-label>{{label}}</mat-label>\n <mat-date-range-input\n [rangePicker]=\"picker\"\n [formGroup]=\"form\"\n [min]=\"minDate\">\n <input matStartDate formControlName=\"begin\" placeholder=\"\u0414\u0430\u0442\u0430 \u043D\u0430\u0447\u0430\u043B\u0430\">\n <input matEndDate formControlName=\"end\" placeholder=\"\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F\">\n </mat-date-range-input>\n <mat-datepicker-toggle matIconSuffix [for]=\"picker\"></mat-datepicker-toggle>\n <mat-date-range-picker #picker></mat-date-range-picker>\n <mat-error>\u0423\u043A\u0430\u0436\u0438\u0442\u0435 \u043F\u0435\u0440\u0438\u043E\u0434</mat-error>\n</mat-form-field>\n\n", styles: ["mat-form-field{margin-right:16px}\n"] }]
|
|
1995
|
+
}], ctorParameters: () => [], propDecorators: { label: [{
|
|
1996
|
+
type: Input
|
|
1997
|
+
}], dateRange$: [{
|
|
1998
|
+
type: Input
|
|
1999
|
+
}], minDate: [{
|
|
2000
|
+
type: Input
|
|
2001
|
+
}], clearFilter$: [{
|
|
2002
|
+
type: Input
|
|
2003
|
+
}], required: [{
|
|
2004
|
+
type: Input
|
|
2005
|
+
}], dateRangeChange: [{
|
|
2006
|
+
type: Output
|
|
2007
|
+
}] } });
|
|
2008
|
+
|
|
2009
|
+
var DialogAction;
|
|
2010
|
+
(function (DialogAction) {
|
|
2011
|
+
DialogAction["Add"] = "\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C";
|
|
2012
|
+
DialogAction["Edit"] = "\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C";
|
|
2013
|
+
DialogAction["Delete"] = "\u0423\u0434\u0430\u043B\u0438\u0442\u044C";
|
|
2014
|
+
DialogAction["None"] = "";
|
|
2015
|
+
})(DialogAction || (DialogAction = {}));
|
|
2016
|
+
|
|
2017
|
+
/* eslint-disable max-len */
|
|
2018
|
+
class ImzLogoComponent {
|
|
2019
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ImzLogoComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2020
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: ImzLogoComponent, isStandalone: true, selector: "lib-imz-logo", ngImport: i0, template: `
|
|
2021
|
+
<svg id="logo_mechan" viewBox="0 0 116 32" width="100%" height="100%" fill="white">
|
|
2022
|
+
<path d="M53.080 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.41v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.005 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.003 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006zM47.53 19.26c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-5.5l-2 5.5c-0.014 0.044-0.038 0.081-0.070 0.11l-0 0c-0.036 0.032-0.080 0.056-0.128 0.069l-0.002 0.001h-1.080c-0.028-0.027-0.049-0.060-0.060-0.098l-0-0.002-1.94-5.5v5.5c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-6c-0.001-0.012-0.002-0.027-0.002-0.042 0-0.142 0.054-0.271 0.142-0.369l-0 0c0.091-0.087 0.215-0.141 0.352-0.141 0.010 0 0.020 0 0.030 0.001l-0.001-0h0.9c0.062-0.007 0.133-0.012 0.205-0.012s0.143 0.004 0.214 0.012l-0.009-0.001c0.114 0.024 0.215 0.069 0.303 0.132l-0.003-0.002c0.086 0.064 0.156 0.144 0.208 0.236l0.002 0.004c0.059 0.106 0.11 0.229 0.147 0.358l0.003 0.012 1.46 4 1.51-4c0.043-0.143 0.094-0.265 0.156-0.382l-0.006 0.012c0.051-0.093 0.115-0.172 0.189-0.239l0.001-0.001c0.070-0.059 0.154-0.104 0.246-0.129l0.004-0.001c0.051-0.007 0.11-0.011 0.17-0.011s0.119 0.004 0.177 0.012l-0.007-0.001h0.87c0.036-0.007 0.078-0.010 0.12-0.010s0.084 0.004 0.124 0.011l-0.004-0.001c0.068 0.022 0.125 0.060 0.17 0.11l0 0c0.044 0.047 0.078 0.104 0.099 0.167l0.001 0.003c0.006 0.035 0.009 0.074 0.009 0.115s-0.003 0.080-0.010 0.119l0.001-0.004zM90.39 0.27c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.069-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.045 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.080l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.026 0.003 0.056 0.004 0.087 0.004 0.109 0 0.213-0.020 0.309-0.056l-0.006 0.002c0.077-0.035 0.143-0.079 0.201-0.131l-0.001 0.001c0.076-0.050 0.137-0.118 0.179-0.197l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.031 0.035 0.053 0.080 0.060 0.129l0 0.001zM91.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.31 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.39-3.5 0.1-0.090c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM84.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.21 0.27-0.15 0.22-2.3 3.46-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM77.63 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.7c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.1c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.39c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.188-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.513l0.008-0.027 0.49-1.34c-0.003-0.018-0.004-0.039-0.004-0.060s0.001-0.042 0.004-0.062l-0 0.002c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.167l-0.011 0.003c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.226 0.18 0.318 0.288l0.002 0.002c0.102 0.123 0.195 0.26 0.273 0.407l0.007 0.013c0.091 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.083 0.071 0.183 0.097 0.287l0.003 0.013c0.019 0.037 0.036 0.080 0.049 0.125l0.001 0.005zM71.63 7.83c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002c-0.023 0.042-0.050 0.078-0.080 0.11l0-0c-0.064 0.057-0.136 0.107-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.353 0.127-0.76 0.2-1.185 0.2-0.005 0-0.011 0-0.016-0h0.001c-0.017 0-0.038 0.001-0.058 0.001-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.301-0.304-0.535-0.675-0.674-1.090l-0.006-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.020-0.001-0.044-0.001-0.068 0-0.519 0.084-1.019 0.24-1.485l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.333-0.122 0.717-0.193 1.117-0.193 0.050 0 0.1 0.001 0.15 0.003l-0.007-0c0.081-0.008 0.175-0.012 0.27-0.012s0.189 0.004 0.282 0.013l-0.012-0.001c0.184 0.031 0.345 0.072 0.501 0.126l-0.021-0.006c0.155 0.050 0.287 0.108 0.412 0.176l-0.012-0.006c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.071 0.273-0.111 0.587-0.111 0.911 0 0.031 0 0.063 0.001 0.094l-0-0.005c-0 0.014-0 0.031-0 0.048 0 0.338 0.044 0.667 0.126 0.979l-0.006-0.027c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.417l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.31-0.19c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.070 0.17 0.070 0.27 0.070 0.4zM64.41 6.83c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.15-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.96h1c0.012 0 0.025 0 0.039 0 0.157 0 0.309-0.022 0.453-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.025-0.080 0.039-0.173 0.039-0.269 0-0.046-0.003-0.092-0.010-0.136l0.001 0.005zM64 4c0.013-0.060 0.020-0.129 0.020-0.2s-0.007-0.14-0.021-0.207l0.001 0.006c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.141-0.038-0.302-0.060-0.469-0.060-0.014 0-0.029 0-0.043 0.001l0.002-0h-0.69v1.76h0.71c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.113-0.044 0.21-0.109 0.29-0.19l0-0c0.101-0.076 0.182-0.173 0.238-0.285l0.002-0.005c0.008-0.048 0.012-0.104 0.012-0.16s-0.004-0.112-0.013-0.166l0.001 0.006zM65.78 6.85c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.177 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.93c-0.001-0.013-0.002-0.029-0.002-0.044 0-0.111 0.043-0.211 0.113-0.286l-0 0c0.073-0.062 0.168-0.1 0.272-0.1 0.006 0 0.012 0 0.018 0l-0.001-0h1.71c0.017-0 0.038-0 0.058-0 0.352 0 0.694 0.040 1.022 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.184 0.222-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.036 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.121 0.136 0.219 0.295 0.286 0.469l0.004 0.011c0.070 0.182 0.11 0.393 0.11 0.613 0 0.006-0 0.012-0 0.018v-0.001zM59.65 8.31c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.86c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.026 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.43v1.7h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.027 0.1 0.048 0.22 0.059 0.342l0.001 0.008zM54.57 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.16c-0.048-0.015-0.089-0.043-0.12-0.080l-0-0c-0.029-0.034-0.053-0.074-0.069-0.117l-0.001-0.003-0.48-1.53c-0.063-0.208-0.137-0.387-0.228-0.556l0.008 0.016c-0.073-0.135-0.163-0.251-0.269-0.349l-0.001-0.001c-0.097-0.1-0.218-0.176-0.354-0.218l-0.006-0.002c-0.124-0.038-0.266-0.060-0.413-0.060-0.002 0-0.005 0-0.008 0h-0.27v2.72c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.070c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001v-2.71h-0.27c-0.044-0.005-0.095-0.008-0.147-0.008-0.14 0-0.275 0.021-0.403 0.061l0.010-0.003c-0.132 0.043-0.246 0.112-0.34 0.2l0-0c-0.1 0.099-0.183 0.215-0.247 0.342l-0.003 0.008c-0.073 0.145-0.141 0.318-0.194 0.496l-0.006 0.024-0.48 1.53c-0.017 0.046-0.041 0.086-0.070 0.121l0-0.001c-0.030 0.038-0.071 0.066-0.118 0.080l-0.002 0h-1.15c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001s0 0 0-0.060c-0.001-0.014-0.002-0.029-0.002-0.045s0.001-0.031 0.002-0.047l-0 0.002v-0.12l0.060-0.16 0.47-1.35c0.085-0.255 0.173-0.466 0.274-0.67l-0.014 0.030c0.083-0.164 0.176-0.305 0.283-0.434l-0.003 0.004c0.092-0.112 0.197-0.207 0.315-0.287l0.005-0.003c0.112-0.075 0.241-0.142 0.376-0.195l0.014-0.005c-0.13-0.041-0.242-0.096-0.345-0.163l0.005 0.003c-0.112-0.073-0.208-0.159-0.288-0.258l-0.002-0.002c-0.096-0.119-0.182-0.254-0.254-0.397l-0.006-0.013c-0.058-0.148-0.116-0.335-0.163-0.526l-0.007-0.034-0.4-1.21c-0.028-0.070-0.056-0.157-0.077-0.246l-0.003-0.014c-0.003-0.024-0.004-0.052-0.004-0.080s0.001-0.056 0.004-0.083l-0 0.003c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001c0.028-0.031 0.066-0.053 0.109-0.060l0.001-0h1.12c0.045 0.015 0.083 0.043 0.11 0.079l0 0.001c0.025 0.034 0.046 0.074 0.059 0.117l0.001 0.003 0.43 1.43c0.056 0.194 0.121 0.36 0.198 0.518l-0.008-0.019c0.062 0.128 0.143 0.237 0.239 0.33l0.001 0c0.086 0.080 0.189 0.142 0.304 0.178l0.006 0.002c0.121 0.038 0.261 0.060 0.406 0.060 0.005 0 0.010-0 0.015-0h0.269v-2.54c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001c0.025-0.032 0.059-0.056 0.099-0.070l0.001-0h1.070c0.044 0.012 0.082 0.036 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.27c0.006 0 0.013 0 0.021 0 0.139 0 0.273-0.022 0.398-0.063l-0.009 0.003c0.125-0.041 0.232-0.106 0.32-0.19l-0 0c0.096-0.094 0.176-0.203 0.237-0.323l0.003-0.007c0.072-0.139 0.137-0.302 0.185-0.471l0.005-0.019 0.43-1.42c0.020-0.046 0.047-0.086 0.080-0.12l-0 0c0.027-0.037 0.065-0.065 0.108-0.080l0.002-0h1.1c0.044 0.008 0.081 0.030 0.11 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0 0.070 0 0.15-0.080 0.26l-0.4 1.19c-0.075 0.227-0.153 0.415-0.242 0.597l0.012-0.027c-0.073 0.152-0.156 0.284-0.253 0.404l0.003-0.004c-0.084 0.103-0.18 0.192-0.285 0.267l-0.005 0.003c-0.101 0.069-0.216 0.129-0.338 0.176l-0.012 0.004c0.15 0.065 0.278 0.135 0.399 0.216l-0.009-0.006c0.122 0.087 0.227 0.186 0.318 0.297l0.002 0.003c0.101 0.128 0.191 0.272 0.264 0.426l0.006 0.014c0.081 0.165 0.169 0.377 0.246 0.593l0.014 0.047 0.46 1.35 0.060 0.16v0.21c0.031 0.015 0.057 0.032 0.081 0.051l-0.001-0.001zM45.19 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.32 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM43.73 28.25c0 0.014 0.001 0.031 0.001 0.048 0 0.309-0.070 0.603-0.196 0.864l0.005-0.012c-0.132 0.263-0.318 0.481-0.545 0.646l-0.005 0.003c-0.245 0.179-0.532 0.317-0.843 0.396l-0.017 0.004c-0.316 0.083-0.68 0.13-1.054 0.13-0.016 0-0.032-0-0.048-0l0.002 0c-0.091 0.008-0.198 0.012-0.305 0.012s-0.214-0.004-0.319-0.013l0.014 0.001c-0.189-0.032-0.354-0.073-0.514-0.127l0.023 0.007-0.33-0.21-0.18-0.11c-0.031-0.025-0.058-0.055-0.079-0.089l-0.001-0.001c-0.003-0.020-0.005-0.042-0.005-0.065s0.002-0.045 0.006-0.067l-0 0.002c-0.002-0.033-0.003-0.071-0.003-0.11s0.001-0.077 0.004-0.115l-0 0.005c0-0.090 0-0.19 0-0.32-0.010-0.045-0.016-0.097-0.016-0.15s0.006-0.105 0.016-0.155l-0.001 0.005c0.020-0.047 0.066-0.080 0.12-0.080v0c0.067 0.006 0.129 0.028 0.182 0.061l-0.002-0.001 0.29 0.15c0.12 0.055 0.263 0.107 0.411 0.146l0.019 0.004c0.168 0.045 0.361 0.070 0.56 0.070 0.011 0 0.021-0 0.031-0l-0.002 0c0.003 0 0.007 0 0.010 0 0.178 0 0.35-0.026 0.513-0.073l-0.013 0.003c0.149-0.040 0.279-0.106 0.393-0.192l-0.003 0.002c0.104-0.080 0.188-0.18 0.248-0.295l0.002-0.005c0.057-0.11 0.090-0.24 0.090-0.378 0-0.004-0-0.008-0-0.012v0.001c0-0.005 0-0.010 0-0.016 0-0.146-0.029-0.285-0.083-0.411l0.003 0.007c-0.056-0.13-0.141-0.237-0.248-0.319l-0.002-0.001c-0.125-0.090-0.272-0.159-0.431-0.198l-0.009-0.002c-0.177-0.045-0.38-0.070-0.589-0.070-0.014 0-0.029 0-0.043 0l0.002-0h-0.92c-0.036-0.016-0.064-0.044-0.080-0.079l-0-0.001c-0.005-0.024-0.008-0.052-0.008-0.080s0.003-0.056 0.008-0.083l-0 0.003c0-0.070 0-0.16 0-0.27-0.002-0.037-0.003-0.081-0.003-0.125s0.001-0.088 0.003-0.131l-0 0.006c-0.004-0.023-0.006-0.049-0.006-0.075s0.002-0.052 0.007-0.078l-0 0.003c0.015-0.034 0.039-0.061 0.069-0.080l0.001-0h0.84c0.012 0 0.027 0 0.042 0 0.187 0 0.369-0.022 0.544-0.064l-0.016 0.003c0.156-0.038 0.294-0.104 0.413-0.192l-0.003 0.002c0.105-0.079 0.189-0.18 0.248-0.295l0.002-0.005c0.057-0.114 0.090-0.248 0.090-0.39 0-0.003-0-0.007-0-0.010v0.001c0-0.004 0-0.008 0-0.013 0-0.118-0.022-0.23-0.062-0.333l0.002 0.006c-0.042-0.104-0.107-0.192-0.189-0.259l-0.001-0.001c-0.090-0.075-0.197-0.133-0.314-0.168l-0.006-0.002c-0.128-0.038-0.275-0.060-0.427-0.060-0.012 0-0.023 0-0.035 0l0.002-0c-0.005-0-0.012-0-0.018-0-0.196 0-0.386 0.026-0.568 0.074l0.015-0.003c-0.171 0.044-0.314 0.091-0.453 0.148l0.023-0.008-0.31 0.15c-0.054 0.035-0.118 0.060-0.188 0.070l-0.002 0h-0.060c-0.002-0.011-0.004-0.023-0.004-0.035s0.001-0.024 0.004-0.036l-0 0.001c-0.003-0.023-0.005-0.049-0.005-0.075s0.002-0.052 0.005-0.078l-0 0.003c0-0.060 0-0.14 0-0.25s0-0.13 0-0.19c-0.002-0.024-0.003-0.052-0.003-0.080s0.001-0.056 0.003-0.084l-0 0.004c-0.002-0.020-0.003-0.042-0.003-0.065s0.001-0.046 0.004-0.068l-0 0.003c0.022-0.042 0.048-0.079 0.080-0.11v0c0.064-0.049 0.136-0.092 0.213-0.127l0.007-0.003c0.118-0.056 0.257-0.107 0.402-0.146l0.018-0.004c0.15-0.046 0.336-0.088 0.526-0.117l0.024-0.003c0.097-0.008 0.211-0.012 0.325-0.012s0.228 0.004 0.34 0.013l-0.015-0.001c0.023-0.001 0.051-0.001 0.079-0.001 0.31 0 0.61 0.040 0.896 0.116l-0.024-0.006c0.26 0.068 0.488 0.182 0.684 0.333l-0.004-0.003c0.176 0.139 0.316 0.317 0.407 0.521l0.003 0.009c0.089 0.206 0.14 0.445 0.14 0.696 0 0.008-0 0.017-0 0.025v-0.001c0 0.005 0 0.010 0 0.015 0 0.205-0.033 0.403-0.094 0.588l0.004-0.013c-0.115 0.346-0.345 0.628-0.643 0.806l-0.007 0.004c-0.144 0.089-0.311 0.158-0.489 0.198l-0.011 0.002c0.215 0.022 0.412 0.083 0.589 0.174l-0.009-0.004c0.341 0.181 0.602 0.474 0.736 0.829l0.004 0.011c0.070 0.175 0.11 0.377 0.11 0.589 0 0 0 0.001 0 0.001v-0zM115.19 11.010c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.070-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.046 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.079l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.006 0 0.012 0 0.019 0 0.104 0 0.205-0.018 0.297-0.052l-0.006 0.002c0.092-0.031 0.172-0.075 0.242-0.131l-0.002 0.001c0.063-0.051 0.114-0.114 0.149-0.187l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.058 0.003 0.11 0.025 0.15 0.060l-0-0zM115.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM108.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM102.43 19.41c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.71c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.080c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.46c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.54h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.189-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.514l0.008-0.027 0.45-1.35c0.015-0.046 0.035-0.086 0.061-0.121l-0.001 0.001c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.166l-0.011 0.004c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.227 0.18 0.318 0.288l0.002 0.002c0.106 0.123 0.202 0.261 0.284 0.407l0.007 0.013c0.090 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.084 0.071 0.183 0.097 0.287l0.003 0.013c0.010 0.038 0.017 0.082 0.020 0.128l0 0.002zM96.43 18.57c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002-0.080 0.11c-0.064 0.057-0.136 0.106-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.15 0.054-0.331 0.102-0.518 0.137l-0.022 0.003c-0.198 0.038-0.427 0.060-0.66 0.060h-0c-0.017 0-0.038 0-0.058 0-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.266-0.295-0.471-0.649-0.595-1.040l-0.005-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.023-0.001-0.050-0.001-0.077 0-0.519 0.084-1.019 0.24-1.486l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.368-0.152 0.794-0.24 1.242-0.24 0.010 0 0.020 0 0.030 0h-0.002c0.359 0.005 0.702 0.067 1.023 0.177l-0.023-0.007c0.149 0.025 0.28 0.060 0.407 0.105l-0.017-0.005c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.075 0.3-0.118 0.645-0.118 1s0.043 0.7 0.124 1.029l-0.006-0.029c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.416l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.27-0.16c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.080 0.11 0.080 0.21 0.080 0.34zM90.71 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.43c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.42v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.022 0.103 0.036 0.224 0.040 0.347l0 0.003zM85.2 19.36c0.005 0.013 0.008 0.029 0.008 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.070l-0.002 0h-1.070c-0.047-0.013-0.088-0.038-0.12-0.070v0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.36h-1.080c-0.007 0-0.016 0-0.025 0-0.345 0-0.682-0.036-1.006-0.106l0.031 0.006c-0.301-0.062-0.567-0.184-0.795-0.354l0.005 0.004c-0.225-0.175-0.4-0.405-0.506-0.669l-0.004-0.011c-0.115-0.298-0.181-0.642-0.181-1.002 0-0.031 0.001-0.062 0.001-0.092l-0 0.004v-1.83c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.028-0.033 0.066-0.058 0.108-0.070l0.002-0h1.070c0.047 0.013 0.088 0.038 0.12 0.070v0c0.006 0.013 0.009 0.029 0.009 0.045s-0.003 0.032-0.009 0.046l0-0.001v1.8c-0 0.005-0 0.010-0 0.015 0 0.187 0.026 0.367 0.073 0.539l-0.003-0.014c0.041 0.15 0.117 0.278 0.22 0.38l0 0c0.109 0.106 0.243 0.185 0.393 0.228l0.007 0.002c0.173 0.051 0.372 0.080 0.577 0.080 0.015 0 0.030-0 0.045-0l-0.002 0h0.91v-3c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.032-0.032 0.073-0.057 0.118-0.070l0.002-0h1.070c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001zM79.070 19.36c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.17c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.57c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM72.070 19.36c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.090c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-2.75h-2.6v2.73c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.080c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-6.34c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.013 0.081 0.037 0.11 0.070l0 0c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001v2.49h2.54v-2.49c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.090c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001zM62.7 14.050v0l-0.94 2.88h1.9zM65.8 19.050c0.031 0.084 0.059 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.023-0.031-0.040-0.068-0.050-0.108l-0-0.002-0.46-1.41h-2.57l-0.43 1.31c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.74c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0.001h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.031 0.046 0.055 0.099 0.069 0.157l0.001 0.003zM59.15 19.050c0.045 0.082 0.086 0.178 0.117 0.278l0.003 0.012c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.063 0.044-0.142 0.070-0.226 0.070-0.001 0-0.003 0-0.004-0h-1.070c-0.048-0.012-0.089-0.036-0.12-0.070l-0-0c-0.024-0.029-0.045-0.062-0.059-0.098l-0.001-0.002-1.29-2.5-1.26 2.44c-0.020 0.038-0.043 0.071-0.070 0.1l0-0c-0.031 0.034-0.072 0.058-0.118 0.070l-0.002 0h-1.030c-0 0-0 0-0 0-0.076 0-0.146-0.026-0.2-0.070l0.001 0c-0.014-0.024-0.023-0.054-0.023-0.085s0.008-0.061 0.023-0.086l-0 0.001c0.037-0.111 0.081-0.207 0.134-0.297l-0.004 0.007 1.62-3-1.57-2.71c-0.044-0.083-0.088-0.182-0.125-0.284l-0.005-0.016c-0.017-0.024-0.026-0.053-0.026-0.085s0.010-0.061 0.027-0.085l-0 0.001c0.061-0.043 0.138-0.069 0.22-0.070h1.14c0.048 0.010 0.090 0.035 0.12 0.070l0 0 0.070 0.1 1.19 2.24 1.15-2.24 0.070-0.1c0.028-0.034 0.066-0.058 0.109-0.070l0.001-0h0.99c0.002-0 0.004-0 0.007-0 0.077 0 0.148 0.026 0.204 0.071l-0.001-0.001c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.036 0.117-0.077 0.216-0.125 0.311l0.005-0.011-1.47 2.72zM68.37 24.6h-1.57q-0.090 0.79-0.19 1.39c-0.060 0.4-0.12 0.75-0.18 1.060s-0.12 0.56-0.19 0.78c-0.064 0.233-0.129 0.422-0.203 0.607l0.013-0.037c-0.064 0.16-0.131 0.295-0.208 0.424l0.008-0.014c-0.076 0.119-0.149 0.221-0.226 0.318l0.006-0.008h2.74zM70.57 31.84c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.023 0.028-0.053 0.049-0.089 0.060l-0.001 0h-0.95c-0.040-0.011-0.074-0.032-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-1.63h-4.5v1.59c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.026 0.028-0.060 0.049-0.099 0.060l-0.001 0h-1.020c-0.040-0.009-0.075-0.030-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.43c-0.002-0.014-0.004-0.029-0.004-0.046 0-0.067 0.024-0.128 0.064-0.175l-0 0c0.046-0.044 0.109-0.071 0.178-0.071 0.008 0 0.015 0 0.023 0.001l-0.001-0h0.31c0.080-0.12 0.16-0.24 0.24-0.37 0.076-0.126 0.15-0.274 0.212-0.429l0.008-0.021c0.070-0.17 0.14-0.38 0.21-0.62s0.13-0.53 0.2-0.87 0.13-0.75 0.2-1.23 0.14-1 0.21-1.66c0.010-0.128 0.053-0.244 0.121-0.342l-0.001 0.002c0.062-0.068 0.152-0.111 0.251-0.111 0.007 0 0.013 0 0.020 0.001l-0.001-0h3.46c0.007-0 0.014-0.001 0.022-0.001 0.105 0 0.199 0.042 0.268 0.111v0c0.069 0.079 0.111 0.183 0.111 0.296 0 0.012-0 0.024-0.001 0.035l0-0.002v5.2h0.57c0.006-0.001 0.013-0.001 0.020-0.001 0.071 0 0.135 0.031 0.179 0.081l0 0c0.038 0.055 0.060 0.123 0.060 0.196 0 0.005-0 0.010-0 0.014l0-0.001zM61.97 26.84c0.001-0.026 0.001-0.058 0.001-0.089 0-0.322-0.029-0.637-0.086-0.943l0.005 0.032c-0.047-0.282-0.145-0.535-0.285-0.759l0.005 0.009c-0.132-0.204-0.311-0.367-0.522-0.476l-0.008-0.004c-0.228-0.108-0.495-0.171-0.776-0.171-0.019 0-0.038 0-0.056 0.001l0.003-0c-0.017-0.001-0.037-0.001-0.057-0.001-0.286 0-0.556 0.071-0.792 0.195l0.009-0.004c-0.225 0.126-0.409 0.298-0.546 0.504l-0.004 0.006c-0.136 0.212-0.237 0.461-0.288 0.727l-0.002 0.013c-0.057 0.27-0.090 0.581-0.090 0.9v0c-0 0.021-0 0.046-0 0.071 0 0.328 0.029 0.65 0.085 0.962l-0.005-0.033c0.049 0.286 0.147 0.542 0.285 0.77l-0.005-0.010c0.13 0.206 0.309 0.37 0.523 0.477l0.008 0.003c0.226 0.102 0.49 0.161 0.768 0.161 0.025 0 0.050-0 0.075-0.001l-0.004 0c0.017 0.001 0.037 0.001 0.057 0.001 0.286 0 0.556-0.071 0.792-0.195l-0.009 0.004c0.226-0.124 0.411-0.296 0.546-0.504l0.004-0.006c0.136-0.215 0.237-0.467 0.288-0.737l0.002-0.013c0.063-0.27 0.102-0.583 0.11-0.904l0-0.006zM63.41 26.77c0 0.019 0 0.042 0 0.065 0 0.512-0.077 1.006-0.22 1.471l0.009-0.035c-0.131 0.437-0.344 0.815-0.623 1.133l0.003-0.003c-0.27 0.305-0.604 0.546-0.982 0.703l-0.018 0.007c-0.394 0.153-0.851 0.241-1.328 0.241-0.029 0-0.058-0-0.086-0.001l0.004 0c-0.020 0-0.043 0.001-0.067 0.001-0.466 0-0.914-0.077-1.333-0.219l0.029 0.009c-0.395-0.129-0.731-0.346-0.999-0.629l-0.001-0.001c-0.267-0.296-0.47-0.655-0.585-1.051l-0.005-0.019c-0.127-0.439-0.201-0.943-0.201-1.464 0-0.030 0-0.060 0.001-0.091l-0 0.005c-0-0.017-0-0.037-0-0.057 0-0.504 0.077-0.99 0.22-1.447l-0.009 0.034c0.133-0.43 0.346-0.8 0.623-1.113l-0.003 0.003c0.271-0.301 0.605-0.539 0.982-0.694l0.018-0.006c0.4-0.159 0.864-0.25 1.349-0.25 0.021 0 0.043 0 0.064 0.001l-0.003-0c0.026-0.001 0.056-0.001 0.086-0.001 0.455 0 0.893 0.073 1.303 0.209l-0.029-0.008c0.395 0.129 0.731 0.346 0.999 0.629l0.001 0.001c0.27 0.296 0.477 0.654 0.595 1.051l0.005 0.019c0.14 0.446 0.22 0.959 0.22 1.49v0zM54.77 28.25c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.151-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.93h1c0.011 0 0.024 0 0.038 0 0.157 0 0.31-0.022 0.454-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.051-0.116 0.081-0.251 0.081-0.393 0-0.013-0-0.026-0.001-0.038l0 0.002zM54.42 25.35c0-0.008 0-0.018 0-0.028 0-0.123-0.022-0.24-0.063-0.349l0.002 0.007c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.14-0.038-0.302-0.060-0.468-0.060-0.015 0-0.030 0-0.044 0.001l0.002-0h-0.69v1.75h0.76c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.124-0.034 0.231-0.093 0.321-0.171l-0.001 0.001c0.074-0.081 0.132-0.177 0.168-0.284l0.002-0.006c0.038-0.105 0.060-0.227 0.060-0.354 0-0.009-0-0.018-0-0.027l0 0.001zM56.2 28.2c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.178 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.92c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h1.69c0.003 0 0.006 0 0.010 0 0.351 0 0.693 0.040 1.020 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.183 0.223-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.035 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.117 0.136 0.212 0.295 0.276 0.469l0.004 0.011c0.094 0.183 0.158 0.397 0.179 0.623l0.001 0.007zM47.2 24.75v0l-0.94 2.88h1.9zM50.3 29.75c0.031 0.083 0.058 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.017-0.036-0.026-0.078-0.026-0.123 0-0.035 0.006-0.068 0.017-0.099l-0.001 0.002-0.44-1.36h-2.56l-0.46 1.36c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.75c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.034 0.046 0.062 0.099 0.079 0.156l0.001 0.004zM7.38 3.41h-5.38v20.23c0.125 2.259 1.937 4.057 4.19 4.16l0.010 0h2.59c0.033-0.001 0.072-0.002 0.111-0.002 1.247 0 2.36 0.57 3.094 1.465l0.006 0.007c0.724-0.902 1.827-1.474 3.063-1.474 0.115 0 0.229 0.005 0.342 0.015l-0.015-0.001h2.41c2.245-0.090 4.049-1.857 4.199-4.077l0.001-0.013v-20.31h-5.37l-2.070-2.070h9.5v22.3c-0.134 3.386-2.859 6.094-6.24 6.2l-0.010 0h-3.38c-1.241 0.024-2.259 0.949-2.428 2.147l-0.002 0.013c-0.178-1.198-1.182-2.113-2.406-2.15l-0.004-0h-3.5c-3.383-0.22-6.048-2.997-6.090-6.406l-0-0.004v-22.1h9.49zM12 0l-3.44 3.4v2.6l2.62-2.55v11.26l-2.6 2.52v2.54l2.6-2.53v1.34l-2.6 2.55v2.54l2.59-2.53v1.27l-2.6 2.54v2.52l3.43-3.36 3.43 3.38v-2.54l-2.59-2.52v-1.31l2.59 2.54v-2.56l-2.6-2.52v-1.36l2.59 2.53v-2.52l-2.6-2.5v-11.3l2.62 2.52v-2.54z"></path>
|
|
2023
|
+
</svg>
|
|
2024
|
+
`, isInline: true });
|
|
2025
|
+
}
|
|
2026
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: ImzLogoComponent, decorators: [{
|
|
2027
|
+
type: Component,
|
|
2028
|
+
args: [{
|
|
2029
|
+
selector: 'lib-imz-logo',
|
|
2030
|
+
template: `
|
|
2031
|
+
<svg id="logo_mechan" viewBox="0 0 116 32" width="100%" height="100%" fill="white">
|
|
2032
|
+
<path d="M53.080 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.41v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.005 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.003 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006zM47.53 19.26c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-5.5l-2 5.5c-0.014 0.044-0.038 0.081-0.070 0.11l-0 0c-0.036 0.032-0.080 0.056-0.128 0.069l-0.002 0.001h-1.080c-0.028-0.027-0.049-0.060-0.060-0.098l-0-0.002-1.94-5.5v5.5c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.040c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.004-0.013-0.006-0.029-0.006-0.045s0.002-0.032 0.007-0.046l-0 0.001v-6c-0.001-0.012-0.002-0.027-0.002-0.042 0-0.142 0.054-0.271 0.142-0.369l-0 0c0.091-0.087 0.215-0.141 0.352-0.141 0.010 0 0.020 0 0.030 0.001l-0.001-0h0.9c0.062-0.007 0.133-0.012 0.205-0.012s0.143 0.004 0.214 0.012l-0.009-0.001c0.114 0.024 0.215 0.069 0.303 0.132l-0.003-0.002c0.086 0.064 0.156 0.144 0.208 0.236l0.002 0.004c0.059 0.106 0.11 0.229 0.147 0.358l0.003 0.012 1.46 4 1.51-4c0.043-0.143 0.094-0.265 0.156-0.382l-0.006 0.012c0.051-0.093 0.115-0.172 0.189-0.239l0.001-0.001c0.070-0.059 0.154-0.104 0.246-0.129l0.004-0.001c0.051-0.007 0.11-0.011 0.17-0.011s0.119 0.004 0.177 0.012l-0.007-0.001h0.87c0.036-0.007 0.078-0.010 0.12-0.010s0.084 0.004 0.124 0.011l-0.004-0.001c0.068 0.022 0.125 0.060 0.17 0.11l0 0c0.044 0.047 0.078 0.104 0.099 0.167l0.001 0.003c0.006 0.035 0.009 0.074 0.009 0.115s-0.003 0.080-0.010 0.119l0.001-0.004zM90.39 0.27c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.069-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.045 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.080l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.026 0.003 0.056 0.004 0.087 0.004 0.109 0 0.213-0.020 0.309-0.056l-0.006 0.002c0.077-0.035 0.143-0.079 0.201-0.131l-0.001 0.001c0.076-0.050 0.137-0.118 0.179-0.197l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.031 0.035 0.053 0.080 0.060 0.129l0 0.001zM91.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.31 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.39-3.5 0.1-0.090c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM84.18 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.21 0.27-0.15 0.22-2.3 3.46-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM77.63 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.7c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.1c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.39c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.188-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.513l0.008-0.027 0.49-1.34c-0.003-0.018-0.004-0.039-0.004-0.060s0.001-0.042 0.004-0.062l-0 0.002c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.167l-0.011 0.003c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.226 0.18 0.318 0.288l0.002 0.002c0.102 0.123 0.195 0.26 0.273 0.407l0.007 0.013c0.091 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.083 0.071 0.183 0.097 0.287l0.003 0.013c0.019 0.037 0.036 0.080 0.049 0.125l0.001 0.005zM71.63 7.83c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002c-0.023 0.042-0.050 0.078-0.080 0.11l0-0c-0.064 0.057-0.136 0.107-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.353 0.127-0.76 0.2-1.185 0.2-0.005 0-0.011 0-0.016-0h0.001c-0.017 0-0.038 0.001-0.058 0.001-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.301-0.304-0.535-0.675-0.674-1.090l-0.006-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.020-0.001-0.044-0.001-0.068 0-0.519 0.084-1.019 0.24-1.485l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.333-0.122 0.717-0.193 1.117-0.193 0.050 0 0.1 0.001 0.15 0.003l-0.007-0c0.081-0.008 0.175-0.012 0.27-0.012s0.189 0.004 0.282 0.013l-0.012-0.001c0.184 0.031 0.345 0.072 0.501 0.126l-0.021-0.006c0.155 0.050 0.287 0.108 0.412 0.176l-0.012-0.006c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.071 0.273-0.111 0.587-0.111 0.911 0 0.031 0 0.063 0.001 0.094l-0-0.005c-0 0.014-0 0.031-0 0.048 0 0.338 0.044 0.667 0.126 0.979l-0.006-0.027c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.417l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.31-0.19c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.070 0.17 0.070 0.27 0.070 0.4zM64.41 6.83c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.15-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.96h1c0.012 0 0.025 0 0.039 0 0.157 0 0.309-0.022 0.453-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.025-0.080 0.039-0.173 0.039-0.269 0-0.046-0.003-0.092-0.010-0.136l0.001 0.005zM64 4c0.013-0.060 0.020-0.129 0.020-0.2s-0.007-0.14-0.021-0.207l0.001 0.006c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.141-0.038-0.302-0.060-0.469-0.060-0.014 0-0.029 0-0.043 0.001l0.002-0h-0.69v1.76h0.71c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.113-0.044 0.21-0.109 0.29-0.19l0-0c0.101-0.076 0.182-0.173 0.238-0.285l0.002-0.005c0.008-0.048 0.012-0.104 0.012-0.16s-0.004-0.112-0.013-0.166l0.001 0.006zM65.78 6.85c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.177 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.93c-0.001-0.013-0.002-0.029-0.002-0.044 0-0.111 0.043-0.211 0.113-0.286l-0 0c0.073-0.062 0.168-0.1 0.272-0.1 0.006 0 0.012 0 0.018 0l-0.001-0h1.71c0.017-0 0.038-0 0.058-0 0.352 0 0.694 0.040 1.022 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.184 0.222-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.036 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.121 0.136 0.219 0.295 0.286 0.469l0.004 0.011c0.070 0.182 0.11 0.393 0.11 0.613 0 0.006-0 0.012-0 0.018v-0.001zM59.65 8.31c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.44c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.86c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.026 0.004 0.055 0.004 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.43v1.7h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.069 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.027 0.1 0.048 0.22 0.059 0.342l0.001 0.008zM54.57 8.67c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.16c-0.048-0.015-0.089-0.043-0.12-0.080l-0-0c-0.029-0.034-0.053-0.074-0.069-0.117l-0.001-0.003-0.48-1.53c-0.063-0.208-0.137-0.387-0.228-0.556l0.008 0.016c-0.073-0.135-0.163-0.251-0.269-0.349l-0.001-0.001c-0.097-0.1-0.218-0.176-0.354-0.218l-0.006-0.002c-0.124-0.038-0.266-0.060-0.413-0.060-0.002 0-0.005 0-0.008 0h-0.27v2.72c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.070c-0.040-0.014-0.074-0.038-0.1-0.070l-0-0c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001v-2.71h-0.27c-0.044-0.005-0.095-0.008-0.147-0.008-0.14 0-0.275 0.021-0.403 0.061l0.010-0.003c-0.132 0.043-0.246 0.112-0.34 0.2l0-0c-0.1 0.099-0.183 0.215-0.247 0.342l-0.003 0.008c-0.073 0.145-0.141 0.318-0.194 0.496l-0.006 0.024-0.48 1.53c-0.017 0.046-0.041 0.086-0.070 0.121l0-0.001c-0.030 0.038-0.071 0.066-0.118 0.080l-0.002 0h-1.15c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001s0 0 0-0.060c-0.001-0.014-0.002-0.029-0.002-0.045s0.001-0.031 0.002-0.047l-0 0.002v-0.12l0.060-0.16 0.47-1.35c0.085-0.255 0.173-0.466 0.274-0.67l-0.014 0.030c0.083-0.164 0.176-0.305 0.283-0.434l-0.003 0.004c0.092-0.112 0.197-0.207 0.315-0.287l0.005-0.003c0.112-0.075 0.241-0.142 0.376-0.195l0.014-0.005c-0.13-0.041-0.242-0.096-0.345-0.163l0.005 0.003c-0.112-0.073-0.208-0.159-0.288-0.258l-0.002-0.002c-0.096-0.119-0.182-0.254-0.254-0.397l-0.006-0.013c-0.058-0.148-0.116-0.335-0.163-0.526l-0.007-0.034-0.4-1.21c-0.028-0.070-0.056-0.157-0.077-0.246l-0.003-0.014c-0.003-0.024-0.004-0.052-0.004-0.080s0.001-0.056 0.004-0.083l-0 0.003c-0.005-0.015-0.008-0.032-0.008-0.050s0.003-0.035 0.008-0.051l-0 0.001c0.028-0.031 0.066-0.053 0.109-0.060l0.001-0h1.12c0.045 0.015 0.083 0.043 0.11 0.079l0 0.001c0.025 0.034 0.046 0.074 0.059 0.117l0.001 0.003 0.43 1.43c0.056 0.194 0.121 0.36 0.198 0.518l-0.008-0.019c0.062 0.128 0.143 0.237 0.239 0.33l0.001 0c0.086 0.080 0.189 0.142 0.304 0.178l0.006 0.002c0.121 0.038 0.261 0.060 0.406 0.060 0.005 0 0.010-0 0.015-0h0.269v-2.54c-0.005-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.009-0.051l-0 0.001c0.025-0.032 0.059-0.056 0.099-0.070l0.001-0h1.070c0.044 0.012 0.082 0.036 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.53h0.27c0.006 0 0.013 0 0.021 0 0.139 0 0.273-0.022 0.398-0.063l-0.009 0.003c0.125-0.041 0.232-0.106 0.32-0.19l-0 0c0.096-0.094 0.176-0.203 0.237-0.323l0.003-0.007c0.072-0.139 0.137-0.302 0.185-0.471l0.005-0.019 0.43-1.42c0.020-0.046 0.047-0.086 0.080-0.12l-0 0c0.027-0.037 0.065-0.065 0.108-0.080l0.002-0h1.1c0.044 0.008 0.081 0.030 0.11 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0 0.070 0 0.15-0.080 0.26l-0.4 1.19c-0.075 0.227-0.153 0.415-0.242 0.597l0.012-0.027c-0.073 0.152-0.156 0.284-0.253 0.404l0.003-0.004c-0.084 0.103-0.18 0.192-0.285 0.267l-0.005 0.003c-0.101 0.069-0.216 0.129-0.338 0.176l-0.012 0.004c0.15 0.065 0.278 0.135 0.399 0.216l-0.009-0.006c0.122 0.087 0.227 0.186 0.318 0.297l0.002 0.003c0.101 0.128 0.191 0.272 0.264 0.426l0.006 0.014c0.081 0.165 0.169 0.377 0.246 0.593l0.014 0.047 0.46 1.35 0.060 0.16v0.21c0.031 0.015 0.057 0.032 0.081 0.051l-0.001-0.001zM45.19 8.67c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.56c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.2 0.27-0.15 0.22-2.32 3.46-0.090 0.1c-0.033 0.031-0.073 0.056-0.118 0.069l-0.002 0.001h-0.99c-0.041-0.011-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.42c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.070l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.14-0.080c0.031-0.029 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM43.73 28.25c0 0.014 0.001 0.031 0.001 0.048 0 0.309-0.070 0.603-0.196 0.864l0.005-0.012c-0.132 0.263-0.318 0.481-0.545 0.646l-0.005 0.003c-0.245 0.179-0.532 0.317-0.843 0.396l-0.017 0.004c-0.316 0.083-0.68 0.13-1.054 0.13-0.016 0-0.032-0-0.048-0l0.002 0c-0.091 0.008-0.198 0.012-0.305 0.012s-0.214-0.004-0.319-0.013l0.014 0.001c-0.189-0.032-0.354-0.073-0.514-0.127l0.023 0.007-0.33-0.21-0.18-0.11c-0.031-0.025-0.058-0.055-0.079-0.089l-0.001-0.001c-0.003-0.020-0.005-0.042-0.005-0.065s0.002-0.045 0.006-0.067l-0 0.002c-0.002-0.033-0.003-0.071-0.003-0.11s0.001-0.077 0.004-0.115l-0 0.005c0-0.090 0-0.19 0-0.32-0.010-0.045-0.016-0.097-0.016-0.15s0.006-0.105 0.016-0.155l-0.001 0.005c0.020-0.047 0.066-0.080 0.12-0.080v0c0.067 0.006 0.129 0.028 0.182 0.061l-0.002-0.001 0.29 0.15c0.12 0.055 0.263 0.107 0.411 0.146l0.019 0.004c0.168 0.045 0.361 0.070 0.56 0.070 0.011 0 0.021-0 0.031-0l-0.002 0c0.003 0 0.007 0 0.010 0 0.178 0 0.35-0.026 0.513-0.073l-0.013 0.003c0.149-0.040 0.279-0.106 0.393-0.192l-0.003 0.002c0.104-0.080 0.188-0.18 0.248-0.295l0.002-0.005c0.057-0.11 0.090-0.24 0.090-0.378 0-0.004-0-0.008-0-0.012v0.001c0-0.005 0-0.010 0-0.016 0-0.146-0.029-0.285-0.083-0.411l0.003 0.007c-0.056-0.13-0.141-0.237-0.248-0.319l-0.002-0.001c-0.125-0.090-0.272-0.159-0.431-0.198l-0.009-0.002c-0.177-0.045-0.38-0.070-0.589-0.070-0.014 0-0.029 0-0.043 0l0.002-0h-0.92c-0.036-0.016-0.064-0.044-0.080-0.079l-0-0.001c-0.005-0.024-0.008-0.052-0.008-0.080s0.003-0.056 0.008-0.083l-0 0.003c0-0.070 0-0.16 0-0.27-0.002-0.037-0.003-0.081-0.003-0.125s0.001-0.088 0.003-0.131l-0 0.006c-0.004-0.023-0.006-0.049-0.006-0.075s0.002-0.052 0.007-0.078l-0 0.003c0.015-0.034 0.039-0.061 0.069-0.080l0.001-0h0.84c0.012 0 0.027 0 0.042 0 0.187 0 0.369-0.022 0.544-0.064l-0.016 0.003c0.156-0.038 0.294-0.104 0.413-0.192l-0.003 0.002c0.105-0.079 0.189-0.18 0.248-0.295l0.002-0.005c0.057-0.114 0.090-0.248 0.090-0.39 0-0.003-0-0.007-0-0.010v0.001c0-0.004 0-0.008 0-0.013 0-0.118-0.022-0.23-0.062-0.333l0.002 0.006c-0.042-0.104-0.107-0.192-0.189-0.259l-0.001-0.001c-0.090-0.075-0.197-0.133-0.314-0.168l-0.006-0.002c-0.128-0.038-0.275-0.060-0.427-0.060-0.012 0-0.023 0-0.035 0l0.002-0c-0.005-0-0.012-0-0.018-0-0.196 0-0.386 0.026-0.568 0.074l0.015-0.003c-0.171 0.044-0.314 0.091-0.453 0.148l0.023-0.008-0.31 0.15c-0.054 0.035-0.118 0.060-0.188 0.070l-0.002 0h-0.060c-0.002-0.011-0.004-0.023-0.004-0.035s0.001-0.024 0.004-0.036l-0 0.001c-0.003-0.023-0.005-0.049-0.005-0.075s0.002-0.052 0.005-0.078l-0 0.003c0-0.060 0-0.14 0-0.25s0-0.13 0-0.19c-0.002-0.024-0.003-0.052-0.003-0.080s0.001-0.056 0.003-0.084l-0 0.004c-0.002-0.020-0.003-0.042-0.003-0.065s0.001-0.046 0.004-0.068l-0 0.003c0.022-0.042 0.048-0.079 0.080-0.11v0c0.064-0.049 0.136-0.092 0.213-0.127l0.007-0.003c0.118-0.056 0.257-0.107 0.402-0.146l0.018-0.004c0.15-0.046 0.336-0.088 0.526-0.117l0.024-0.003c0.097-0.008 0.211-0.012 0.325-0.012s0.228 0.004 0.34 0.013l-0.015-0.001c0.023-0.001 0.051-0.001 0.079-0.001 0.31 0 0.61 0.040 0.896 0.116l-0.024-0.006c0.26 0.068 0.488 0.182 0.684 0.333l-0.004-0.003c0.176 0.139 0.316 0.317 0.407 0.521l0.003 0.009c0.089 0.206 0.14 0.445 0.14 0.696 0 0.008-0 0.017-0 0.025v-0.001c0 0.005 0 0.010 0 0.015 0 0.205-0.033 0.403-0.094 0.588l0.004-0.013c-0.115 0.346-0.345 0.628-0.643 0.806l-0.007 0.004c-0.144 0.089-0.311 0.158-0.489 0.198l-0.011 0.002c0.215 0.022 0.412 0.083 0.589 0.174l-0.009-0.004c0.341 0.181 0.602 0.474 0.736 0.829l0.004 0.011c0.070 0.175 0.11 0.377 0.11 0.589 0 0 0 0.001 0 0.001v-0zM115.19 11.010c-0 0.198-0.037 0.387-0.104 0.561l0.004-0.011c-0.070 0.186-0.18 0.344-0.319 0.469l-0.001 0.001c-0.165 0.142-0.362 0.252-0.579 0.317l-0.011 0.003c-0.246 0.077-0.529 0.121-0.822 0.121-0.024 0-0.047-0-0.071-0.001l0.004 0c-0.019 0-0.041 0.001-0.063 0.001-0.287 0-0.565-0.040-0.828-0.116l0.021 0.005c-0.226-0.064-0.423-0.167-0.593-0.303l0.003 0.003c-0.145-0.121-0.258-0.276-0.327-0.452l-0.003-0.008c-0.070-0.175-0.11-0.378-0.11-0.59v-0c-0.005-0.020-0.009-0.042-0.009-0.065s0.003-0.046 0.009-0.067l-0 0.002c0.024-0.036 0.058-0.064 0.099-0.079l0.001-0.001c0.029-0.004 0.061-0.007 0.095-0.007s0.066 0.002 0.099 0.007l-0.004-0h0.75c0.034 0.018 0.062 0.046 0.079 0.079l0.001 0.001c0.004 0.018 0.007 0.039 0.007 0.060s-0.002 0.042-0.007 0.062l0-0.002c-0.008 0.036-0.013 0.078-0.013 0.12s0.005 0.084 0.013 0.124l-0.001-0.004c0.036 0.076 0.087 0.139 0.149 0.189l0.001 0.001c0.068 0.058 0.148 0.105 0.234 0.138l0.006 0.002c0.089 0.032 0.192 0.050 0.299 0.050 0.004 0 0.007-0 0.011-0h-0.001c0.006 0 0.012 0 0.019 0 0.104 0 0.205-0.018 0.297-0.052l-0.006 0.002c0.092-0.031 0.172-0.075 0.242-0.131l-0.002 0.001c0.063-0.051 0.114-0.114 0.149-0.187l0.001-0.003c0.032-0.071 0.050-0.153 0.050-0.24 0-0.004-0-0.007-0-0.011v0.001c-0.004-0.017-0.006-0.036-0.006-0.055s0.002-0.038 0.006-0.057l-0 0.002c0.017-0.035 0.045-0.063 0.079-0.080l0.001-0h0.92c0.042 0.016 0.076 0.044 0.1 0.079l0 0.001c0.058 0.003 0.11 0.025 0.15 0.060l-0-0zM115.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM108.98 19.41c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.080c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.62c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM102.43 19.41c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.15c-0.052-0.015-0.096-0.043-0.13-0.080l-0-0c-0.027-0.034-0.047-0.074-0.059-0.118l-0.001-0.002-0.54-1.51c-0.072-0.213-0.153-0.395-0.249-0.567l0.009 0.017c-0.077-0.139-0.17-0.257-0.279-0.359l-0.001-0.001c-0.094-0.088-0.208-0.157-0.334-0.198l-0.006-0.002c-0.128-0.038-0.276-0.060-0.428-0.060-0.001 0-0.001 0-0.002 0h-0.35v2.71c0.005 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.009 0.051l0-0.001c-0.029 0.033-0.066 0.057-0.108 0.070l-0.002 0h-1.080c-0.043-0.015-0.080-0.039-0.11-0.070l-0-0c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001v-6.46c-0.006-0.015-0.009-0.032-0.009-0.050s0.003-0.035 0.010-0.051l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.006 0.015 0.009 0.032 0.009 0.050s-0.003 0.035-0.010 0.051l0-0.001v2.54h0.31c0.007 0 0.016 0 0.025 0 0.138 0 0.27-0.022 0.394-0.063l-0.009 0.003c0.124-0.047 0.231-0.115 0.32-0.2l-0 0c0.102-0.1 0.189-0.216 0.256-0.342l0.004-0.008c0.081-0.15 0.158-0.329 0.222-0.514l0.008-0.027 0.45-1.35c0.015-0.046 0.035-0.086 0.061-0.121l-0.001 0.001c0.030-0.038 0.071-0.066 0.118-0.080l0.002-0h1.11c0.041 0.008 0.075 0.030 0.1 0.060l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001c0.003 0.026 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.088l0-0.003c-0.026 0.106-0.054 0.193-0.086 0.277l0.006-0.017-0.45 1.2c-0.082 0.226-0.166 0.414-0.262 0.595l0.012-0.025c-0.078 0.152-0.165 0.283-0.263 0.404l0.003-0.004c-0.084 0.103-0.179 0.192-0.286 0.267l-0.004 0.003c-0.098 0.066-0.21 0.123-0.329 0.166l-0.011 0.004c0.147 0.062 0.272 0.129 0.389 0.206l-0.009-0.006c0.121 0.085 0.227 0.18 0.318 0.288l0.002 0.002c0.106 0.123 0.202 0.261 0.284 0.407l0.007 0.013c0.090 0.167 0.185 0.371 0.267 0.581l0.013 0.039 0.55 1.4c0.037 0.084 0.071 0.183 0.097 0.287l0.003 0.013c0.010 0.038 0.017 0.082 0.020 0.128l0 0.002zM96.43 18.57c0 0.090 0 0.16 0 0.22 0.002 0.024 0.003 0.052 0.003 0.080s-0.001 0.056-0.003 0.084l0-0.004c0.003 0.017 0.004 0.036 0.004 0.055s-0.001 0.038-0.004 0.057l0-0.002-0.080 0.11c-0.064 0.057-0.136 0.106-0.214 0.147l-0.006 0.003c-0.111 0.063-0.243 0.123-0.38 0.174l-0.020 0.006c-0.15 0.054-0.331 0.102-0.518 0.137l-0.022 0.003c-0.198 0.038-0.427 0.060-0.66 0.060h-0c-0.017 0-0.038 0-0.058 0-0.428 0-0.837-0.077-1.216-0.218l0.024 0.008c-0.394-0.136-0.73-0.356-0.999-0.639l-0.001-0.001c-0.266-0.295-0.471-0.649-0.595-1.040l-0.005-0.020c-0.134-0.419-0.211-0.902-0.211-1.402 0-0.027 0-0.055 0.001-0.082l-0 0.004c-0-0.023-0.001-0.050-0.001-0.077 0-0.519 0.084-1.019 0.24-1.486l-0.010 0.033c0.144-0.433 0.363-0.806 0.643-1.123l-0.003 0.003c0.271-0.297 0.605-0.532 0.982-0.684l0.018-0.006c0.368-0.152 0.794-0.24 1.242-0.24 0.010 0 0.020 0 0.030 0h-0.002c0.359 0.005 0.702 0.067 1.023 0.177l-0.023-0.007c0.149 0.025 0.28 0.060 0.407 0.105l-0.017-0.005c0.095 0.050 0.177 0.106 0.252 0.171l-0.002-0.001 0.1 0.12c0.003 0.018 0.005 0.039 0.005 0.060s-0.002 0.042-0.005 0.062l0-0.002c0.002 0.025 0.003 0.055 0.003 0.085s-0.001 0.060-0.003 0.089l0-0.004c0 0.070 0 0.15 0 0.24s0 0.19 0 0.27c0.004 0.027 0.006 0.058 0.006 0.090s-0.002 0.063-0.006 0.094l0-0.004c-0.013 0.039-0.033 0.073-0.060 0.1l0-0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0c-0.078-0.009-0.146-0.042-0.2-0.090l0 0-0.31-0.2c-0.128-0.075-0.277-0.142-0.433-0.195l-0.017-0.005c-0.174-0.057-0.375-0.091-0.583-0.091-0.017 0-0.033 0-0.050 0.001l0.002-0c-0.011-0-0.025-0.001-0.038-0.001-0.499 0-0.941 0.247-1.209 0.626l-0.003 0.005c-0.151 0.211-0.268 0.458-0.337 0.725l-0.003 0.015c-0.075 0.3-0.118 0.645-0.118 1s0.043 0.7 0.124 1.029l-0.006-0.029c0.072 0.276 0.193 0.516 0.353 0.725l-0.003-0.005c0.144 0.181 0.329 0.324 0.541 0.416l0.009 0.003c0.206 0.089 0.445 0.14 0.696 0.14 0.008 0 0.017-0 0.025-0h-0.001c0.007 0 0.016 0 0.024 0 0.216 0 0.424-0.033 0.62-0.094l-0.015 0.004c0.174-0.056 0.323-0.121 0.465-0.197l-0.015 0.007 0.27-0.16c0.053-0.042 0.117-0.070 0.188-0.080l0.002-0h0.080c0.024 0.021 0.041 0.048 0.050 0.079l0 0.001c0.002 0.025 0.004 0.055 0.004 0.085s-0.001 0.060-0.004 0.089l0-0.004c0.080 0.11 0.080 0.21 0.080 0.34zM90.71 19c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.015 0.037-0.039 0.067-0.069 0.090l-0.001 0c-0.013 0.005-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.008l0.001 0h-3.43c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.87c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h3.46c0.027 0.024 0.047 0.054 0.060 0.088l0 0.002c0.003 0.025 0.005 0.055 0.005 0.085s-0.002 0.059-0.005 0.089l0-0.004c0.002 0.039 0.004 0.084 0.004 0.13s-0.001 0.091-0.004 0.136l0-0.006c0.002 0.037 0.004 0.081 0.004 0.125s-0.001 0.088-0.004 0.131l0-0.006c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c-0.014 0.035-0.034 0.066-0.060 0.090l-0 0c-0.012 0.004-0.026 0.006-0.040 0.006s-0.028-0.002-0.041-0.007l0.001 0h-2.42v1.71h2c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c0.008 0.075 0.012 0.162 0.012 0.25s-0.004 0.175-0.013 0.261l0.001-0.011c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.006 0.083l0-0.003c-0.013 0.038-0.038 0.068-0.069 0.090l-0.001 0c-0.013 0.004-0.029 0.007-0.045 0.007s-0.032-0.003-0.046-0.007l0.001 0h-2v1.9h2.43c0.013-0.005 0.029-0.008 0.045-0.008s0.032 0.003 0.046 0.008l-0.001-0c0.031 0.023 0.055 0.053 0.070 0.089l0.001 0.001c0.003 0.024 0.005 0.052 0.005 0.080s-0.002 0.056-0.005 0.083l0-0.003c0.022 0.103 0.036 0.224 0.040 0.347l0 0.003zM85.2 19.36c0.005 0.013 0.008 0.029 0.008 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.070l-0.002 0h-1.070c-0.047-0.013-0.088-0.038-0.12-0.070v0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.36h-1.080c-0.007 0-0.016 0-0.025 0-0.345 0-0.682-0.036-1.006-0.106l0.031 0.006c-0.301-0.062-0.567-0.184-0.795-0.354l0.005 0.004c-0.225-0.175-0.4-0.405-0.506-0.669l-0.004-0.011c-0.115-0.298-0.181-0.642-0.181-1.002 0-0.031 0.001-0.062 0.001-0.092l-0 0.004v-1.83c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.028-0.033 0.066-0.058 0.108-0.070l0.002-0h1.070c0.047 0.013 0.088 0.038 0.12 0.070v0c0.006 0.013 0.009 0.029 0.009 0.045s-0.003 0.032-0.009 0.046l0-0.001v1.8c-0 0.005-0 0.010-0 0.015 0 0.187 0.026 0.367 0.073 0.539l-0.003-0.014c0.041 0.15 0.117 0.278 0.22 0.38l0 0c0.109 0.106 0.243 0.185 0.393 0.228l0.007 0.002c0.173 0.051 0.372 0.080 0.577 0.080 0.015 0 0.030-0 0.045-0l-0.002 0h0.91v-3c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.032-0.032 0.073-0.057 0.118-0.070l0.002-0h1.070c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001zM79.070 19.36c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.17c-0.044-0.012-0.082-0.037-0.11-0.070l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-3.57c0-0.14 0-0.27 0-0.4s0-0.25 0-0.35v0l-0.1 0.17-0.12 0.2-0.14 0.22-0.15 0.22-2.35 3.51-0.090 0.1c-0.033 0.031-0.073 0.055-0.118 0.069l-0.002 0.001h-0.96c-0.041-0.012-0.076-0.036-0.1-0.069l-0-0.001c-0.004-0.015-0.007-0.032-0.007-0.050s0.002-0.035 0.007-0.051l-0 0.001v-6.4c-0.005-0.013-0.008-0.029-0.008-0.045s0.003-0.032 0.008-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.012 0.082 0.037 0.11 0.070l0 0c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001v3.59c0 0.11 0 0.23 0 0.35s0 0.25 0 0.37v0l0.23-0.38 0.28-0.43 2.35-3.51 0.080-0.090c0.031-0.030 0.067-0.053 0.108-0.069l0.002-0.001h0.96c0.041 0.014 0.075 0.038 0.1 0.070l0 0c0.005 0.015 0.008 0.032 0.008 0.050s-0.003 0.035-0.008 0.051l0-0.001zM72.070 19.36c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.029 0.032-0.066 0.056-0.108 0.069l-0.002 0.001h-1.090c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-2.75h-2.6v2.73c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001c-0.028 0.033-0.066 0.058-0.108 0.070l-0.002 0h-1.080c-0.044-0.014-0.081-0.038-0.11-0.070l-0-0c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001v-6.34c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.080c0.044 0.013 0.081 0.037 0.11 0.070l0 0c0.004 0.013 0.006 0.029 0.006 0.045s-0.002 0.032-0.007 0.046l0-0.001v2.49h2.54v-2.49c-0.004-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.007-0.046l-0 0.001c0.029-0.032 0.066-0.056 0.108-0.069l0.002-0.001h1.090c0.044 0.014 0.081 0.038 0.11 0.070l0 0c0.004 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.007 0.046l0-0.001zM62.7 14.050v0l-0.94 2.88h1.9zM65.8 19.050c0.031 0.084 0.059 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.023-0.031-0.040-0.068-0.050-0.108l-0-0.002-0.46-1.41h-2.57l-0.43 1.31c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.74c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0.001h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.031 0.046 0.055 0.099 0.069 0.157l0.001 0.003zM59.15 19.050c0.045 0.082 0.086 0.178 0.117 0.278l0.003 0.012c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.063 0.044-0.142 0.070-0.226 0.070-0.001 0-0.003 0-0.004-0h-1.070c-0.048-0.012-0.089-0.036-0.12-0.070l-0-0c-0.024-0.029-0.045-0.062-0.059-0.098l-0.001-0.002-1.29-2.5-1.26 2.44c-0.020 0.038-0.043 0.071-0.070 0.1l0-0c-0.031 0.034-0.072 0.058-0.118 0.070l-0.002 0h-1.030c-0 0-0 0-0 0-0.076 0-0.146-0.026-0.2-0.070l0.001 0c-0.014-0.024-0.023-0.054-0.023-0.085s0.008-0.061 0.023-0.086l-0 0.001c0.037-0.111 0.081-0.207 0.134-0.297l-0.004 0.007 1.62-3-1.57-2.71c-0.044-0.083-0.088-0.182-0.125-0.284l-0.005-0.016c-0.017-0.024-0.026-0.053-0.026-0.085s0.010-0.061 0.027-0.085l-0 0.001c0.061-0.043 0.138-0.069 0.22-0.070h1.14c0.048 0.010 0.090 0.035 0.12 0.070l0 0 0.070 0.1 1.19 2.24 1.15-2.24 0.070-0.1c0.028-0.034 0.066-0.058 0.109-0.070l0.001-0h0.99c0.002-0 0.004-0 0.007-0 0.077 0 0.148 0.026 0.204 0.071l-0.001-0.001c0.015 0.024 0.024 0.053 0.024 0.085s-0.009 0.061-0.025 0.086l0-0.001c-0.036 0.117-0.077 0.216-0.125 0.311l0.005-0.011-1.47 2.72zM68.37 24.6h-1.57q-0.090 0.79-0.19 1.39c-0.060 0.4-0.12 0.75-0.18 1.060s-0.12 0.56-0.19 0.78c-0.064 0.233-0.129 0.422-0.203 0.607l0.013-0.037c-0.064 0.16-0.131 0.295-0.208 0.424l0.008-0.014c-0.076 0.119-0.149 0.221-0.226 0.318l0.006-0.008h2.74zM70.57 31.84c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.023 0.028-0.053 0.049-0.089 0.060l-0.001 0h-0.95c-0.040-0.011-0.074-0.032-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-1.63h-4.5v1.59c0.005 0.013 0.007 0.029 0.007 0.045s-0.003 0.032-0.008 0.046l0-0.001c-0.026 0.028-0.060 0.049-0.099 0.060l-0.001 0h-1.020c-0.040-0.009-0.075-0.030-0.1-0.060l-0-0c-0.005-0.013-0.007-0.029-0.007-0.045s0.003-0.032 0.008-0.046l-0 0.001v-2.43c-0.002-0.014-0.004-0.029-0.004-0.046 0-0.067 0.024-0.128 0.064-0.175l-0 0c0.046-0.044 0.109-0.071 0.178-0.071 0.008 0 0.015 0 0.023 0.001l-0.001-0h0.31c0.080-0.12 0.16-0.24 0.24-0.37 0.076-0.126 0.15-0.274 0.212-0.429l0.008-0.021c0.070-0.17 0.14-0.38 0.21-0.62s0.13-0.53 0.2-0.87 0.13-0.75 0.2-1.23 0.14-1 0.21-1.66c0.010-0.128 0.053-0.244 0.121-0.342l-0.001 0.002c0.062-0.068 0.152-0.111 0.251-0.111 0.007 0 0.013 0 0.020 0.001l-0.001-0h3.46c0.007-0 0.014-0.001 0.022-0.001 0.105 0 0.199 0.042 0.268 0.111v0c0.069 0.079 0.111 0.183 0.111 0.296 0 0.012-0 0.024-0.001 0.035l0-0.002v5.2h0.57c0.006-0.001 0.013-0.001 0.020-0.001 0.071 0 0.135 0.031 0.179 0.081l0 0c0.038 0.055 0.060 0.123 0.060 0.196 0 0.005-0 0.010-0 0.014l0-0.001zM61.97 26.84c0.001-0.026 0.001-0.058 0.001-0.089 0-0.322-0.029-0.637-0.086-0.943l0.005 0.032c-0.047-0.282-0.145-0.535-0.285-0.759l0.005 0.009c-0.132-0.204-0.311-0.367-0.522-0.476l-0.008-0.004c-0.228-0.108-0.495-0.171-0.776-0.171-0.019 0-0.038 0-0.056 0.001l0.003-0c-0.017-0.001-0.037-0.001-0.057-0.001-0.286 0-0.556 0.071-0.792 0.195l0.009-0.004c-0.225 0.126-0.409 0.298-0.546 0.504l-0.004 0.006c-0.136 0.212-0.237 0.461-0.288 0.727l-0.002 0.013c-0.057 0.27-0.090 0.581-0.090 0.9v0c-0 0.021-0 0.046-0 0.071 0 0.328 0.029 0.65 0.085 0.962l-0.005-0.033c0.049 0.286 0.147 0.542 0.285 0.77l-0.005-0.010c0.13 0.206 0.309 0.37 0.523 0.477l0.008 0.003c0.226 0.102 0.49 0.161 0.768 0.161 0.025 0 0.050-0 0.075-0.001l-0.004 0c0.017 0.001 0.037 0.001 0.057 0.001 0.286 0 0.556-0.071 0.792-0.195l-0.009 0.004c0.226-0.124 0.411-0.296 0.546-0.504l0.004-0.006c0.136-0.215 0.237-0.467 0.288-0.737l0.002-0.013c0.063-0.27 0.102-0.583 0.11-0.904l0-0.006zM63.41 26.77c0 0.019 0 0.042 0 0.065 0 0.512-0.077 1.006-0.22 1.471l0.009-0.035c-0.131 0.437-0.344 0.815-0.623 1.133l0.003-0.003c-0.27 0.305-0.604 0.546-0.982 0.703l-0.018 0.007c-0.394 0.153-0.851 0.241-1.328 0.241-0.029 0-0.058-0-0.086-0.001l0.004 0c-0.020 0-0.043 0.001-0.067 0.001-0.466 0-0.914-0.077-1.333-0.219l0.029 0.009c-0.395-0.129-0.731-0.346-0.999-0.629l-0.001-0.001c-0.267-0.296-0.47-0.655-0.585-1.051l-0.005-0.019c-0.127-0.439-0.201-0.943-0.201-1.464 0-0.030 0-0.060 0.001-0.091l-0 0.005c-0-0.017-0-0.037-0-0.057 0-0.504 0.077-0.99 0.22-1.447l-0.009 0.034c0.133-0.43 0.346-0.8 0.623-1.113l-0.003 0.003c0.271-0.301 0.605-0.539 0.982-0.694l0.018-0.006c0.4-0.159 0.864-0.25 1.349-0.25 0.021 0 0.043 0 0.064 0.001l-0.003-0c0.026-0.001 0.056-0.001 0.086-0.001 0.455 0 0.893 0.073 1.303 0.209l-0.029-0.008c0.395 0.129 0.731 0.346 0.999 0.629l0.001 0.001c0.27 0.296 0.477 0.654 0.595 1.051l0.005 0.019c0.14 0.446 0.22 0.959 0.22 1.49v0zM54.77 28.25c0-0.003 0-0.006 0-0.010 0-0.148-0.029-0.289-0.083-0.417l0.003 0.007c-0.052-0.124-0.13-0.228-0.229-0.309l-0.001-0.001c-0.107-0.085-0.234-0.151-0.373-0.188l-0.007-0.002c-0.169-0.045-0.363-0.070-0.564-0.070-0.016 0-0.032 0-0.049 0l0.002-0h-0.81v1.93h1c0.011 0 0.024 0 0.038 0 0.157 0 0.31-0.022 0.454-0.063l-0.012 0.003c0.131-0.040 0.244-0.102 0.342-0.181l-0.002 0.001c0.092-0.079 0.167-0.175 0.218-0.285l0.002-0.005c0.051-0.116 0.081-0.251 0.081-0.393 0-0.013-0-0.026-0.001-0.038l0 0.002zM54.42 25.35c0-0.008 0-0.018 0-0.028 0-0.123-0.022-0.24-0.063-0.349l0.002 0.007c-0.041-0.108-0.106-0.199-0.189-0.269l-0.001-0.001c-0.090-0.072-0.197-0.127-0.314-0.159l-0.006-0.001c-0.14-0.038-0.302-0.060-0.468-0.060-0.015 0-0.030 0-0.044 0.001l0.002-0h-0.69v1.75h0.76c0.014 0.001 0.031 0.001 0.048 0.001 0.151 0 0.296-0.026 0.431-0.074l-0.009 0.003c0.124-0.034 0.231-0.093 0.321-0.171l-0.001 0.001c0.074-0.081 0.132-0.177 0.168-0.284l0.002-0.006c0.038-0.105 0.060-0.227 0.060-0.354 0-0.009-0-0.018-0-0.027l0 0.001zM56.2 28.2c0 0.007 0 0.016 0 0.025 0 0.223-0.037 0.438-0.104 0.639l0.004-0.014c-0.065 0.199-0.157 0.371-0.273 0.524l0.003-0.004c-0.119 0.151-0.258 0.28-0.414 0.386l-0.006 0.004c-0.153 0.104-0.327 0.195-0.513 0.264l-0.017 0.006c-0.178 0.065-0.387 0.117-0.603 0.148l-0.017 0.002c-0.21 0.032-0.452 0.050-0.698 0.050-0.015 0-0.029-0-0.044-0l0.002 0h-1.8c-0.004 0-0.009 0-0.014 0-0.105 0-0.202-0.038-0.277-0.101l0.001 0.001c-0.075-0.076-0.121-0.18-0.121-0.295 0-0.012 0.001-0.024 0.002-0.036l-0 0.002v-5.92c-0.001-0.010-0.001-0.022-0.001-0.035 0-0.115 0.046-0.22 0.121-0.295l-0 0c0.074-0.062 0.171-0.1 0.276-0.1 0.005 0 0.010 0 0.015 0l-0.001-0h1.69c0.003 0 0.006 0 0.010 0 0.351 0 0.693 0.040 1.020 0.116l-0.030-0.006c0.274 0.064 0.515 0.175 0.726 0.324l-0.006-0.004c0.192 0.135 0.345 0.314 0.446 0.522l0.004 0.008c0.101 0.213 0.16 0.462 0.16 0.725 0 0.012-0 0.024-0 0.037l0-0.002c0 0.004 0 0.010 0 0.015 0 0.158-0.022 0.312-0.063 0.457l0.003-0.012c-0.043 0.148-0.105 0.278-0.183 0.395l0.003-0.005c-0.084 0.12-0.183 0.223-0.297 0.308l-0.003 0.003c-0.115 0.090-0.247 0.164-0.39 0.217l-0.010 0.003c0.199 0.035 0.377 0.098 0.54 0.185l-0.010-0.005c0.164 0.090 0.303 0.204 0.418 0.338l0.002 0.002c0.117 0.136 0.212 0.295 0.276 0.469l0.004 0.011c0.094 0.183 0.158 0.397 0.179 0.623l0.001 0.007zM47.2 24.75v0l-0.94 2.88h1.9zM50.3 29.75c0.031 0.083 0.058 0.184 0.078 0.288l0.002 0.012c0.013 0.025 0.020 0.054 0.020 0.085s-0.007 0.060-0.021 0.086l0.001-0.001c-0.058 0.043-0.131 0.069-0.21 0.070h-1.050c-0.044-0.012-0.082-0.036-0.11-0.070l-0-0c-0.017-0.036-0.026-0.078-0.026-0.123 0-0.035 0.006-0.068 0.017-0.099l-0.001 0.002-0.44-1.36h-2.56l-0.46 1.36c-0.011 0.045-0.028 0.086-0.051 0.122l0.001-0.002c-0.027 0.038-0.064 0.066-0.108 0.080l-0.002 0c-0.032 0.005-0.068 0.007-0.105 0.007s-0.073-0.003-0.109-0.008l0.004 0h-0.75c-0 0-0.001 0-0.001 0-0.072 0-0.139-0.026-0.189-0.070l0 0c-0.011-0.025-0.018-0.054-0.018-0.085s0.007-0.060 0.019-0.086l-0.001 0.001c0.022-0.112 0.049-0.209 0.084-0.303l-0.004 0.013 2.080-6c0.016-0.053 0.040-0.1 0.071-0.141l-0.001 0.001c0.033-0.039 0.078-0.067 0.128-0.080l0.002-0c0.038-0.005 0.081-0.007 0.125-0.007s0.087 0.003 0.13 0.008l-0.005-0h0.92c0.044-0.005 0.094-0.008 0.145-0.008s0.101 0.003 0.151 0.009l-0.006-0.001c0.060 0.014 0.112 0.046 0.15 0.090l0 0c0.034 0.046 0.062 0.099 0.079 0.156l0.001 0.004zM7.38 3.41h-5.38v20.23c0.125 2.259 1.937 4.057 4.19 4.16l0.010 0h2.59c0.033-0.001 0.072-0.002 0.111-0.002 1.247 0 2.36 0.57 3.094 1.465l0.006 0.007c0.724-0.902 1.827-1.474 3.063-1.474 0.115 0 0.229 0.005 0.342 0.015l-0.015-0.001h2.41c2.245-0.090 4.049-1.857 4.199-4.077l0.001-0.013v-20.31h-5.37l-2.070-2.070h9.5v22.3c-0.134 3.386-2.859 6.094-6.24 6.2l-0.010 0h-3.38c-1.241 0.024-2.259 0.949-2.428 2.147l-0.002 0.013c-0.178-1.198-1.182-2.113-2.406-2.15l-0.004-0h-3.5c-3.383-0.22-6.048-2.997-6.090-6.406l-0-0.004v-22.1h9.49zM12 0l-3.44 3.4v2.6l2.62-2.55v11.26l-2.6 2.52v2.54l2.6-2.53v1.34l-2.6 2.55v2.54l2.59-2.53v1.27l-2.6 2.54v2.52l3.43-3.36 3.43 3.38v-2.54l-2.59-2.52v-1.31l2.59 2.54v-2.56l-2.6-2.52v-1.36l2.59 2.53v-2.52l-2.6-2.5v-11.3l2.62 2.52v-2.54z"></path>
|
|
2033
|
+
</svg>
|
|
2034
|
+
`,
|
|
2035
|
+
standalone: true
|
|
2036
|
+
}]
|
|
2037
|
+
}] });
|
|
2038
|
+
|
|
2039
|
+
class NavBarComponent {
|
|
2040
|
+
authService;
|
|
2041
|
+
avatarService;
|
|
2042
|
+
dialog;
|
|
2043
|
+
router;
|
|
2044
|
+
loggedIn$;
|
|
2045
|
+
roles$;
|
|
2046
|
+
fioUser = '';
|
|
2047
|
+
photoURL = '';
|
|
2048
|
+
subscription;
|
|
2049
|
+
constructor(authService, userService, avatarService, dialog, router) {
|
|
2050
|
+
this.authService = authService;
|
|
2051
|
+
this.avatarService = avatarService;
|
|
2052
|
+
this.dialog = dialog;
|
|
2053
|
+
this.router = router;
|
|
2054
|
+
this.loggedIn$ = this.authService.loggedIn$;
|
|
2055
|
+
this.roles$ = this.authService.roles$;
|
|
2056
|
+
this.fioUser = '';
|
|
2057
|
+
this.subscription = this.loggedIn$.subscribe({
|
|
2058
|
+
next: (value) => {
|
|
2059
|
+
if (value) {
|
|
2060
|
+
if (userService.userData) {
|
|
2061
|
+
if (userService.userData.lastName && userService.userData.firstName) {
|
|
2062
|
+
this.fioUser = userService.userData.lastName + ' ' + userService.userData.firstName;
|
|
2063
|
+
}
|
|
2064
|
+
if (userService.userData.idHuman) {
|
|
2065
|
+
// Аватар сотрудника.
|
|
2066
|
+
const subs = this.avatarService.getAvatarById(Number(userService.userData.idHuman))
|
|
2067
|
+
.subscribe((image) => {
|
|
2068
|
+
if (image) {
|
|
2069
|
+
const blob = new Blob([image], { "type": "image/jpeg" });
|
|
2070
|
+
this.photoURL = URL.createObjectURL(blob);
|
|
2071
|
+
}
|
|
2072
|
+
});
|
|
2073
|
+
this.subscription?.add(subs);
|
|
2074
|
+
}
|
|
2075
|
+
}
|
|
2076
|
+
}
|
|
2077
|
+
}
|
|
2078
|
+
});
|
|
2079
|
+
}
|
|
2080
|
+
ngOnDestroy() {
|
|
2081
|
+
if (this.subscription)
|
|
2082
|
+
this.subscription.unsubscribe();
|
|
2083
|
+
}
|
|
2084
|
+
logout() {
|
|
2085
|
+
this.authService.logout(this.router.url);
|
|
2086
|
+
}
|
|
2087
|
+
openDialog() {
|
|
2088
|
+
const dialogRef = this.dialog.open(DialogComponent, {
|
|
2089
|
+
width: '400px',
|
|
2090
|
+
data: {
|
|
2091
|
+
id: 'logout',
|
|
2092
|
+
title: 'Подтверждение',
|
|
2093
|
+
message: 'Вы хотите выйти?',
|
|
2094
|
+
btnNoTitle: 'Отмена',
|
|
2095
|
+
btnYesTitle: 'Выйти'
|
|
2096
|
+
}
|
|
2097
|
+
});
|
|
2098
|
+
const subs = dialogRef.afterClosed().subscribe((id) => {
|
|
2099
|
+
if (id) {
|
|
2100
|
+
this.logout();
|
|
2101
|
+
}
|
|
2102
|
+
});
|
|
2103
|
+
this.subscription?.add(subs);
|
|
2104
|
+
}
|
|
2105
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NavBarComponent, deps: [{ token: AuthService }, { token: UserService }, { token: AvatarService }, { token: i1$4.MatDialog }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
2106
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: NavBarComponent, isStandalone: true, selector: "lib-navbar", ngImport: i0, template: "@if (loggedIn$ | async) {\r\n <nav class=\"lib-navbar-header\">\r\n <a class=\"logo-mechan\" routerLink=\"/\">\r\n <lib-imz-logo></lib-imz-logo>\r\n </a>\r\n\r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n\r\n @if ((loggedIn$ | async) === false || !photoURL) {\r\n <mat-icon [matTooltip]=\"(roles$ | async)?.join(',')||''\">account_circle</mat-icon>\r\n }\r\n @if ((loggedIn$ | async) && photoURL) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"photoURL | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser\"\r\n [matTooltip]=\"(roles$ | async)?.join(',')||''\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"(roles$ | async)?.join(',') || ''\">\r\n {{ fioUser }}\r\n </span>\r\n\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">\u0412\u044B\u0439\u0442\u0438 <mat-icon>logout</mat-icon></a>\r\n </nav>\r\n}", styles: [".lib-navbar-header{display:flex;flex-wrap:wrap;align-items:center;padding:8px 16px}.logo-mechan{height:38px;width:140px}.flex-spacer{flex-grow:1}.user-name{margin-left:8px;line-height:1rem;white-space:normal}.user-photo{border-radius:50%;width:32px;height:32px;margin-right:10px}.mat-mdc-button{color:#fff!important;padding-left:16px!important;padding-right:16px!important}.mdc-button{letter-spacing:normal}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: MatAnchor, selector: "a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: ImzLogoComponent, selector: "lib-imz-logo" }, { kind: "pipe", type: SafePipe, name: "safe" }] });
|
|
2107
|
+
}
|
|
2108
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NavBarComponent, decorators: [{
|
|
2109
|
+
type: Component,
|
|
2110
|
+
args: [{ selector: 'lib-navbar', imports: [RouterLink, MatAnchor, MatMenuTrigger, MatMenu, MatMenuItem, MatDivider, MatIcon, MatTooltip,
|
|
2111
|
+
AsyncPipe, ImzLogoComponent, SafePipe], template: "@if (loggedIn$ | async) {\r\n <nav class=\"lib-navbar-header\">\r\n <a class=\"logo-mechan\" routerLink=\"/\">\r\n <lib-imz-logo></lib-imz-logo>\r\n </a>\r\n\r\n <ng-content></ng-content>\r\n\r\n <div class=\"flex-spacer\"></div>\r\n\r\n @if ((loggedIn$ | async) === false || !photoURL) {\r\n <mat-icon [matTooltip]=\"(roles$ | async)?.join(',')||''\">account_circle</mat-icon>\r\n }\r\n @if ((loggedIn$ | async) && photoURL) {\r\n <img\r\n class=\"user-photo\"\r\n [src]=\"photoURL | safe\"\r\n loading=\"lazy\"\r\n [alt]=\"fioUser\"\r\n [matTooltip]=\"(roles$ | async)?.join(',')||''\">\r\n }\r\n\r\n <span class = \"user-name\" [matTooltip]=\"(roles$ | async)?.join(',') || ''\">\r\n {{ fioUser }}\r\n </span>\r\n\r\n <a mat-button class=\"pm-button\" (click)=\"openDialog()\">\u0412\u044B\u0439\u0442\u0438 <mat-icon>logout</mat-icon></a>\r\n </nav>\r\n}", styles: [".lib-navbar-header{display:flex;flex-wrap:wrap;align-items:center;padding:8px 16px}.logo-mechan{height:38px;width:140px}.flex-spacer{flex-grow:1}.user-name{margin-left:8px;line-height:1rem;white-space:normal}.user-photo{border-radius:50%;width:32px;height:32px;margin-right:10px}.mat-mdc-button{color:#fff!important;padding-left:16px!important;padding-right:16px!important}.mdc-button{letter-spacing:normal}\n"] }]
|
|
2112
|
+
}], ctorParameters: () => [{ type: AuthService }, { type: UserService }, { type: AvatarService }, { type: i1$4.MatDialog }, { type: i2.Router }] });
|
|
2113
|
+
|
|
2114
|
+
class NotFoundComponent {
|
|
2115
|
+
constructor() {
|
|
2116
|
+
}
|
|
2117
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NotFoundComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2118
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.2", type: NotFoundComponent, isStandalone: true, selector: "lib-not-found", ngImport: i0, template: "<div class=\"center\">\r\n <h3 class=\"mat-display-1\">\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430</h3>\r\n</div>\r\n", styles: [".center{display:flex;justify-content:center;margin:3rem}\n"] });
|
|
2119
|
+
}
|
|
2120
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: NotFoundComponent, decorators: [{
|
|
2121
|
+
type: Component,
|
|
2122
|
+
args: [{ selector: 'lib-not-found', standalone: true, template: "<div class=\"center\">\r\n <h3 class=\"mat-display-1\">\u0421\u0442\u0440\u0430\u043D\u0438\u0446\u0430 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D\u0430</h3>\r\n</div>\r\n", styles: [".center{display:flex;justify-content:center;margin:3rem}\n"] }]
|
|
2123
|
+
}], ctorParameters: () => [] });
|
|
2124
|
+
|
|
2125
|
+
class BaseSelectAutocompleteWithVirtualScrollComponent {
|
|
2126
|
+
// https://stackblitz.com/edit/autocomplete-with-virtual-scroll-dc9u2g
|
|
2127
|
+
// Все элементы
|
|
2128
|
+
items$ = new BehaviorSubject([]);
|
|
2129
|
+
// Выбранный элемент
|
|
2130
|
+
selectedItem$ = new BehaviorSubject(undefined);
|
|
2131
|
+
// Заголовок
|
|
2132
|
+
title = '';
|
|
2133
|
+
// Видимость
|
|
2134
|
+
isVisible = true;
|
|
2135
|
+
// Обязательность
|
|
2136
|
+
isRequired = false;
|
|
2137
|
+
// Доступность
|
|
2138
|
+
isDisabled = false;
|
|
2139
|
+
// Доступность
|
|
2140
|
+
width = '200';
|
|
2141
|
+
// Событие изменения выбранного элемента
|
|
2142
|
+
selectedItemChange = new EventEmitter();
|
|
2143
|
+
height = '200px';
|
|
2144
|
+
// input элемент
|
|
2145
|
+
inputCtrl = new FormControl();
|
|
2146
|
+
// отфильтрованные (отображаемые) элементы
|
|
2147
|
+
filteredItems$ = new BehaviorSubject([]);
|
|
2148
|
+
subscription;
|
|
2149
|
+
constructor() {
|
|
2150
|
+
}
|
|
2151
|
+
ngOnInit() {
|
|
2152
|
+
//console.log('isVisible = ', this.isVisible);
|
|
2153
|
+
//console.log('isDisabled = ', this.isDisabled);
|
|
2154
|
+
this.subscription = this.items$.subscribe(data => {
|
|
2155
|
+
console.log('ITEMS$ data', data);
|
|
2156
|
+
console.log('onLoad: this.selectedItem$.value =', this.selectedItem$.value);
|
|
2157
|
+
this.filteredItems$.next(data);
|
|
2158
|
+
if (this.selectedItem$.value)
|
|
2159
|
+
this.inputCtrl.setValue(this.selectedItem$.value);
|
|
2160
|
+
// if (this.items.length > 0) {
|
|
2161
|
+
// this.filteredItems$ = this.inputCtrl.valueChanges.pipe(
|
|
2162
|
+
// startWith(null),
|
|
2163
|
+
// map(item => (item ? this._filter(item) : this.items.slice())),
|
|
2164
|
+
// );
|
|
2165
|
+
const subs = this.selectedItem$.subscribe(item => {
|
|
2166
|
+
console.log('ITEM =', item);
|
|
2167
|
+
this.inputCtrl.setValue(item);
|
|
2168
|
+
// if (item)
|
|
2169
|
+
// this.selectedItems = this.items.filter(s => items.includes(s.value));
|
|
2170
|
+
});
|
|
2171
|
+
this.subscription?.add(subs);
|
|
2172
|
+
});
|
|
2173
|
+
// Listen for changes to the input
|
|
2174
|
+
const subs = this.inputCtrl.valueChanges
|
|
2175
|
+
.pipe(startWith$1(''),
|
|
2176
|
+
// eslint-disable-next-line no-magic-numbers
|
|
2177
|
+
debounceTime(500), distinctUntilChanged(),
|
|
2178
|
+
// Note: If the option value is bound to object, after selecting the option
|
|
2179
|
+
// Note: the value will change from string to {}. We want to perform search
|
|
2180
|
+
// Note: only when the type is string (no match)
|
|
2181
|
+
//filter(q => typeof q === 'string'),
|
|
2182
|
+
//tap((v) => console.log('v=', v)),
|
|
2183
|
+
map((value) => {
|
|
2184
|
+
// Filter the options
|
|
2185
|
+
if (typeof value === 'undefined') {
|
|
2186
|
+
this.filteredItems$.next(this.items$.value);
|
|
2187
|
+
}
|
|
2188
|
+
else {
|
|
2189
|
+
if (typeof value !== 'object') {
|
|
2190
|
+
console.log('v1=', value);
|
|
2191
|
+
this.filteredItems$.next(this.items$.value.filter(option => option.viewValue
|
|
2192
|
+
.toLowerCase()
|
|
2193
|
+
.includes(value.toLowerCase())));
|
|
2194
|
+
}
|
|
2195
|
+
else {
|
|
2196
|
+
// typeof value === 'object'
|
|
2197
|
+
console.log('v2=', value);
|
|
2198
|
+
if (value) {
|
|
2199
|
+
// this.predmet = value;
|
|
2200
|
+
this.filteredItems$.next(this.items$.value.filter((option) => (option.viewValue)
|
|
2201
|
+
.toLowerCase()
|
|
2202
|
+
.includes(value.viewValue.toLowerCase())));
|
|
2203
|
+
}
|
|
2204
|
+
else {
|
|
2205
|
+
this.filteredItems$.next(this.items$.value);
|
|
2206
|
+
}
|
|
2207
|
+
}
|
|
2208
|
+
}
|
|
2209
|
+
// Recompute how big the viewport should be.
|
|
2210
|
+
// eslint-disable-next-line no-magic-numbers
|
|
2211
|
+
if (this.filteredItems$.value.length < 4) {
|
|
2212
|
+
// eslint-disable-next-line no-magic-numbers
|
|
2213
|
+
this.height = this.filteredItems$.value.length * 50 + 'px';
|
|
2214
|
+
}
|
|
2215
|
+
else {
|
|
2216
|
+
this.height = '200px';
|
|
2217
|
+
}
|
|
2218
|
+
console.log('update filteredItems$.value=', this.filteredItems$.value);
|
|
2219
|
+
}))
|
|
2220
|
+
.subscribe();
|
|
2221
|
+
this.subscription?.add(subs);
|
|
2222
|
+
if (this.isDisabled) {
|
|
2223
|
+
this.inputCtrl.disable();
|
|
2224
|
+
}
|
|
2225
|
+
else {
|
|
2226
|
+
this.inputCtrl.enable();
|
|
2227
|
+
}
|
|
2228
|
+
}
|
|
2229
|
+
ngOnDestroy() {
|
|
2230
|
+
if (this.subscription)
|
|
2231
|
+
this.subscription.unsubscribe();
|
|
2232
|
+
}
|
|
2233
|
+
onSelectedItemChange(item) {
|
|
2234
|
+
console.log("onSelectedItemChange, item=", item);
|
|
2235
|
+
// this.selectedItem$.next(item);
|
|
2236
|
+
this.selectedItemChange.emit(item);
|
|
2237
|
+
}
|
|
2238
|
+
onClearClick($event) {
|
|
2239
|
+
$event.stopPropagation();
|
|
2240
|
+
this.inputCtrl.setValue("");
|
|
2241
|
+
}
|
|
2242
|
+
displayWithFn(lookup) {
|
|
2243
|
+
return lookup
|
|
2244
|
+
? lookup.viewValue
|
|
2245
|
+
: null;
|
|
2246
|
+
}
|
|
2247
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectAutocompleteWithVirtualScrollComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2248
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseSelectAutocompleteWithVirtualScrollComponent, isStandalone: true, selector: "lib-select-autocomplete-with-virtual-scroll", inputs: { items$: "items$", selectedItem$: "selectedItem$", title: "title", isVisible: "isVisible", isRequired: "isRequired", isDisabled: "isDisabled", width: "width" }, outputs: { selectedItemChange: "selectedItemChange" }, ngImport: i0, template: "@if (isVisible) {\r\n <mat-form-field [style.width.px]=\"width\">\r\n <mat-label>{{title}}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem$.value) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems$\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 {{title}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0432\u0432\u043E\u0434\u0438\u0442\u044C ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}", styles: ["mat-form-field{margin-right:12px}.autocomplete-item{height:50px}\n"], dependencies: [{ 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: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatAutocompleteModule }, { kind: "component", type: i2$1.MatAutocomplete, selector: "mat-autocomplete", inputs: ["aria-label", "aria-labelledby", "displayWith", "autoActiveFirstOption", "autoSelectActiveOption", "requireSelection", "panelWidth", "disableRipple", "class", "hideSingleSelectionIndicator"], outputs: ["optionSelected", "opened", "closed", "optionActivated"], exportAs: ["matAutocomplete"] }, { kind: "component", type: i3.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "directive", type: i2$1.MatAutocompleteTrigger, selector: "input[matAutocomplete], textarea[matAutocomplete]", inputs: ["matAutocomplete", "matAutocompletePosition", "matAutocompleteConnectedTo", "autocomplete", "matAutocompleteDisabled"], exportAs: ["matAutocompleteTrigger"] }, { kind: "directive", type: MatHint, selector: "mat-hint", inputs: ["align", "id"] }, { kind: "directive", type: MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "ngmodule", type: ScrollingModule }, { kind: "directive", type: i4$1.CdkFixedSizeVirtualScroll, selector: "cdk-virtual-scroll-viewport[itemSize]", inputs: ["itemSize", "minBufferPx", "maxBufferPx"] }, { kind: "directive", type: i4$1.CdkVirtualForOf, selector: "[cdkVirtualFor][cdkVirtualForOf]", inputs: ["cdkVirtualForOf", "cdkVirtualForTrackBy", "cdkVirtualForTemplate", "cdkVirtualForTemplateCacheSize"] }, { kind: "component", type: i4$1.CdkVirtualScrollViewport, selector: "cdk-virtual-scroll-viewport", inputs: ["orientation", "appendOnly"], outputs: ["scrolledIndexChange"] }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }] });
|
|
2249
|
+
}
|
|
2250
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectAutocompleteWithVirtualScrollComponent, decorators: [{
|
|
2251
|
+
type: Component,
|
|
2252
|
+
args: [{ selector: 'lib-select-autocomplete-with-virtual-scroll', imports: [FormsModule, ReactiveFormsModule, MatAutocompleteModule, MatHint, MatError, MatOption, MatIcon,
|
|
2253
|
+
MatFormField, ScrollingModule, MatInput, MatLabel], template: "@if (isVisible) {\r\n <mat-form-field [style.width.px]=\"width\">\r\n <mat-label>{{title}}</mat-label>\r\n <input type=\"text\"\r\n [placeholder]=title\r\n aria-label=\"Number\"\r\n matInput\r\n (ngModelChange)=\"onSelectedItemChange($event)\"\r\n [formControl]=\"inputCtrl\"\r\n [matAutocomplete]=\"auto\"\r\n [required]=\"isRequired ? 'required' : ''\"\r\n >\r\n @if (!isDisabled && selectedItem$.value) {\r\n <button mat-button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClearClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n <mat-autocomplete #auto=\"matAutocomplete\" [displayWith]=\"displayWithFn\" showPanel=\"true\">\r\n <cdk-virtual-scroll-viewport class=\"autocomplete-test-viewport\" [style.height]=\"height\" itemSize=\"25\">\r\n <mat-option *cdkVirtualFor=\"let option of filteredItems$\" [value]=\"option\" class=\"autocomplete-item\">\r\n {{option.viewValue}}\r\n </mat-option>\r\n </cdk-virtual-scroll-viewport>\r\n </mat-autocomplete>\r\n @if (inputCtrl.invalid) {\r\n <mat-error>\u0412\u0432\u0435\u0434\u0438\u0442\u0435 {{title}}</mat-error>\r\n }\r\n @if (!inputCtrl.value) {\r\n <mat-hint>\u041D\u0430\u0447\u043D\u0438\u0442\u0435 \u0432\u0432\u043E\u0434\u0438\u0442\u044C ...</mat-hint>\r\n }\r\n </mat-form-field>\r\n}", styles: ["mat-form-field{margin-right:12px}.autocomplete-item{height:50px}\n"] }]
|
|
2254
|
+
}], ctorParameters: () => [], propDecorators: { items$: [{
|
|
2255
|
+
type: Input
|
|
2256
|
+
}], selectedItem$: [{
|
|
2257
|
+
type: Input
|
|
2258
|
+
}], title: [{
|
|
2259
|
+
type: Input
|
|
2260
|
+
}], isVisible: [{
|
|
2261
|
+
type: Input
|
|
2262
|
+
}], isRequired: [{
|
|
2263
|
+
type: Input
|
|
2264
|
+
}], isDisabled: [{
|
|
2265
|
+
type: Input
|
|
2266
|
+
}], width: [{
|
|
2267
|
+
type: Input
|
|
2268
|
+
}], selectedItemChange: [{
|
|
2269
|
+
type: Output
|
|
2270
|
+
}] } });
|
|
2271
|
+
|
|
2272
|
+
class BaseSelectWithGroupComponent {
|
|
2273
|
+
// Все группы
|
|
2274
|
+
groups$ = new BehaviorSubject([]);
|
|
2275
|
+
// Выбранные элементы, ключи (BaseSelectItem.value)
|
|
2276
|
+
selectedItems$ = new Observable();
|
|
2277
|
+
// Заголовок
|
|
2278
|
+
title = '';
|
|
2279
|
+
// Событие изменения выбранных элементов
|
|
2280
|
+
selectedItemsChange = new EventEmitter();
|
|
2281
|
+
separatorKeysCodes = [ENTER, COMMA];
|
|
2282
|
+
control = new FormControl([]);
|
|
2283
|
+
subscription;
|
|
2284
|
+
constructor() {
|
|
2285
|
+
}
|
|
2286
|
+
ngOnInit() {
|
|
2287
|
+
this.groups$.subscribe(data => {
|
|
2288
|
+
if (data.length > 0) {
|
|
2289
|
+
this.subscription = this.selectedItems$.subscribe(items => {
|
|
2290
|
+
this.control.setValue(items.map(i => Number(i)));
|
|
2291
|
+
});
|
|
2292
|
+
}
|
|
2293
|
+
});
|
|
2294
|
+
}
|
|
2295
|
+
ngOnDestroy() {
|
|
2296
|
+
if (this.subscription)
|
|
2297
|
+
this.subscription.unsubscribe();
|
|
2298
|
+
}
|
|
2299
|
+
selectionChange($event) {
|
|
2300
|
+
this.selectedItemsChange.emit($event.value.map((i) => i.toString()));
|
|
2301
|
+
}
|
|
2302
|
+
onClick($event) {
|
|
2303
|
+
$event.stopPropagation();
|
|
2304
|
+
// this.control.setValue('');
|
|
2305
|
+
this.selectedItemsChange.emit([]);
|
|
2306
|
+
}
|
|
2307
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectWithGroupComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2308
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: BaseSelectWithGroupComponent, isStandalone: true, selector: "lib-select-with-group", inputs: { groups$: "groups$", selectedItems$: "selectedItems$", title: "title" }, outputs: { selectedItemsChange: "selectedItemsChange" }, ngImport: i0, template: "<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of (groups$ | async); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".select-with-group{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: MatOption$1, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "component", type: MatOptgroup, selector: "mat-optgroup", inputs: ["label", "disabled"], exportAs: ["matOptgroup"] }, { kind: "component", type: MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: MatFormField$1, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel$1, selector: "mat-label" }, { kind: "pipe", type: AsyncPipe, name: "async" }] });
|
|
2309
|
+
}
|
|
2310
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: BaseSelectWithGroupComponent, decorators: [{
|
|
2311
|
+
type: Component,
|
|
2312
|
+
args: [{ selector: 'lib-select-with-group', imports: [FormsModule, ReactiveFormsModule, MatIcon, MatOption$1, MatOptgroup, MatSelect, MatFormField$1, MatLabel$1,
|
|
2313
|
+
AsyncPipe], template: "<mat-form-field class=\"select-with-group\" appearance=\"fill\">\r\n <mat-label>{{ title }}</mat-label>\r\n <mat-select [formControl]=\"control\" (selectionChange)=\"selectionChange($event)\" multiple>\r\n @for (group of (groups$ | async); track group) {\r\n <mat-optgroup [label]=\"group.name\">\r\n @for (item of group.items; track item) {\r\n <mat-option [value]=\"item.value\" >\r\n {{item.viewValue}}\r\n </mat-option>\r\n }\r\n </mat-optgroup>\r\n }\r\n\r\n </mat-select>\r\n @if (control.value && control.value!.length > 0) {\r\n <button matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"onClick($event)\">\r\n <mat-icon>close</mat-icon>\r\n </button>\r\n }\r\n</mat-form-field>\r\n", styles: [".select-with-group{width:100%}\n"] }]
|
|
2314
|
+
}], ctorParameters: () => [], propDecorators: { groups$: [{
|
|
2315
|
+
type: Input
|
|
2316
|
+
}], selectedItems$: [{
|
|
2317
|
+
type: Input
|
|
2318
|
+
}], title: [{
|
|
2319
|
+
type: Input
|
|
2320
|
+
}], selectedItemsChange: [{
|
|
2321
|
+
type: Output
|
|
2322
|
+
}] } });
|
|
2323
|
+
|
|
2324
|
+
class TableComponent {
|
|
2325
|
+
/** Отображаемые данные. */
|
|
2326
|
+
data$ = new BehaviorSubject([]);
|
|
2327
|
+
/** Настройки колонок. */
|
|
2328
|
+
columnOptions = [];
|
|
2329
|
+
/** Количество записе. */
|
|
2330
|
+
length$ = new BehaviorSubject(0);
|
|
2331
|
+
/** Состояние сортировки, пагинации. */
|
|
2332
|
+
tableState = {};
|
|
2333
|
+
/** Разрешен выбор нескольких строк. */
|
|
2334
|
+
allowMultiSelect = false;
|
|
2335
|
+
/** Ссылка на страницу в приложении */
|
|
2336
|
+
rowRouterLinkField = '';
|
|
2337
|
+
/** Список элементов контекстного меню. */
|
|
2338
|
+
opt = [];
|
|
2339
|
+
/** Роли которым разрешено отправлять событие rowDoubleClicked при двойном щелчке мышью. */
|
|
2340
|
+
rolesDblClickedEvent = [];
|
|
2341
|
+
/** */
|
|
2342
|
+
pageStateChange = new EventEmitter();
|
|
2343
|
+
/** */
|
|
2344
|
+
sortStateChange = new EventEmitter();
|
|
2345
|
+
/** */
|
|
2346
|
+
selectionChange = new EventEmitter();
|
|
2347
|
+
/** */
|
|
2348
|
+
rowDoubleClicked = new EventEmitter();
|
|
2349
|
+
sort;
|
|
2350
|
+
paginator;
|
|
2351
|
+
contextMenu;
|
|
2352
|
+
/** Выбранная строка, для которого будет показываться меню при нажатии правой кнопки мыши. */
|
|
2353
|
+
itemForMenu;
|
|
2354
|
+
/** Позиция в которой отображается контекстное меню. */
|
|
2355
|
+
contextMenuPosition = { x: '0px', y: '0px' };
|
|
2356
|
+
// eslint-disable-next-line no-magic-numbers
|
|
2357
|
+
defaultPageIndex = 0;
|
|
2358
|
+
// eslint-disable-next-line no-magic-numbers
|
|
2359
|
+
defaultPageSize = 10;
|
|
2360
|
+
/** Источник данных для отображения. */
|
|
2361
|
+
dataSource = new MatTableDataSource();
|
|
2362
|
+
/** Выбранные записи. */
|
|
2363
|
+
selection = new SelectionModel();
|
|
2364
|
+
/** Список отображаемых колонок (формируется из @columnOptions). */
|
|
2365
|
+
displayedColumns;
|
|
2366
|
+
// DI
|
|
2367
|
+
authService = inject(AuthService);
|
|
2368
|
+
// Разрешено ли отправлять событие rowDoubleClicked при двойном щелчке мышью.
|
|
2369
|
+
dblClickedEventEnable = true;
|
|
2370
|
+
subscription;
|
|
2371
|
+
constructor() {
|
|
2372
|
+
// получить права пользователя
|
|
2373
|
+
this.subscription = this.authService.roles$.subscribe((userRoles) => {
|
|
2374
|
+
this.dblClickedEventEnable = !this.authService.isHideElement(this.rolesDblClickedEvent, userRoles);
|
|
2375
|
+
});
|
|
2376
|
+
}
|
|
2377
|
+
ngOnInit() {
|
|
2378
|
+
this.displayedColumns = ['select'].concat(this.columnOptions?.filter(c => !c.hide).map((item) => item.name) || []);
|
|
2379
|
+
const subs = this.data$.subscribe(data => {
|
|
2380
|
+
this.dataSource.data = data;
|
|
2381
|
+
// сохранить выделенные строки, если они все еще есть в данных
|
|
2382
|
+
const selected = this.selection.selected;
|
|
2383
|
+
this.selection.clear();
|
|
2384
|
+
data.filter(v => selected.map(s => JSON.stringify(s)).includes(JSON.stringify(v))).map(d => {
|
|
2385
|
+
this.selection.select(d);
|
|
2386
|
+
});
|
|
2387
|
+
});
|
|
2388
|
+
this.subscription?.add(subs);
|
|
2389
|
+
// пересоздаем, т.к. параметр allowMultiSelect появляется только сейчас
|
|
2390
|
+
this.selection = new SelectionModel(this.allowMultiSelect);
|
|
2391
|
+
}
|
|
2392
|
+
ngOnDestroy() {
|
|
2393
|
+
if (this.subscription)
|
|
2394
|
+
this.subscription.unsubscribe();
|
|
2395
|
+
}
|
|
2396
|
+
ngAfterViewInit() {
|
|
2397
|
+
// подписи элементов управления пагинатора (MatPaginatorIntl)
|
|
2398
|
+
if (this.paginator) {
|
|
2399
|
+
this.paginator._intl.itemsPerPageLabel = 'Записей на странице';
|
|
2400
|
+
this.paginator._intl.firstPageLabel = 'Первая страница';
|
|
2401
|
+
this.paginator._intl.previousPageLabel = 'Предыдущая страница';
|
|
2402
|
+
this.paginator._intl.nextPageLabel = 'Следующая страница';
|
|
2403
|
+
this.paginator._intl.lastPageLabel = 'Последняя страница';
|
|
2404
|
+
// изменение пагинации
|
|
2405
|
+
const subs = this.paginator.page.subscribe(page => {
|
|
2406
|
+
this.tableState.pageSize = page.pageSize;
|
|
2407
|
+
this.tableState.pageIndex = page.pageIndex;
|
|
2408
|
+
this.pageStateChange.emit({
|
|
2409
|
+
pageIndex: page.pageIndex,
|
|
2410
|
+
pageSize: page.pageSize
|
|
2411
|
+
});
|
|
2412
|
+
});
|
|
2413
|
+
this.subscription?.add(subs);
|
|
2414
|
+
}
|
|
2415
|
+
// изменение сортировки
|
|
2416
|
+
if (this.sort) {
|
|
2417
|
+
const subs = this.sort.sortChange
|
|
2418
|
+
.subscribe(sort => {
|
|
2419
|
+
this.tableState.sortActive = sort.active;
|
|
2420
|
+
this.tableState.sortDirection = sort.direction;
|
|
2421
|
+
this.sortStateChange.emit({
|
|
2422
|
+
sortActive: sort.active,
|
|
2423
|
+
sortDirection: sort.direction
|
|
2424
|
+
});
|
|
2425
|
+
});
|
|
2426
|
+
this.subscription?.add(subs);
|
|
2427
|
+
}
|
|
2428
|
+
// изменение выбранных записей
|
|
2429
|
+
if (this.selection) {
|
|
2430
|
+
const subs = this.selection.changed.subscribe(change => {
|
|
2431
|
+
this.selectionChange.emit(change.source.selected);
|
|
2432
|
+
});
|
|
2433
|
+
this.subscription?.add(subs);
|
|
2434
|
+
}
|
|
2435
|
+
}
|
|
2436
|
+
/** Whether the number of selected elements matches the total number of rows. */
|
|
2437
|
+
isAllSelected() {
|
|
2438
|
+
const numSelected = this.selection.selected.length;
|
|
2439
|
+
const numRows = this.dataSource.data.length;
|
|
2440
|
+
return numSelected === numRows;
|
|
2441
|
+
}
|
|
2442
|
+
/** Selects all rows if they are not all selected; otherwise clear selection. */
|
|
2443
|
+
masterToggle() {
|
|
2444
|
+
console.log(this.selection.isMultipleSelection());
|
|
2445
|
+
if (this.isAllSelected()) {
|
|
2446
|
+
this.selection.clear();
|
|
2447
|
+
}
|
|
2448
|
+
else {
|
|
2449
|
+
this.dataSource.data.forEach(row => this.selection.select(row));
|
|
2450
|
+
}
|
|
2451
|
+
}
|
|
2452
|
+
/** При щелчке по строке. */
|
|
2453
|
+
onRowClicked(row) {
|
|
2454
|
+
// выделение строки при щелчке по строке
|
|
2455
|
+
if (this.selection.isSelected(row)) {
|
|
2456
|
+
this.selection.deselect(row);
|
|
2457
|
+
}
|
|
2458
|
+
else {
|
|
2459
|
+
this.selection.select(row);
|
|
2460
|
+
}
|
|
2461
|
+
}
|
|
2462
|
+
/** При двойном щелчке по строке. */
|
|
2463
|
+
onRowDblClicked(row) {
|
|
2464
|
+
// выделение строки при двойном щелчке по строке
|
|
2465
|
+
this.selection.clear();
|
|
2466
|
+
this.selection.select(row);
|
|
2467
|
+
if (this.dblClickedEventEnable)
|
|
2468
|
+
this.rowDoubleClicked.emit(row);
|
|
2469
|
+
}
|
|
2470
|
+
/** При вызове контекстного меню. */
|
|
2471
|
+
onContextMenu(event, itemForMenu) {
|
|
2472
|
+
if (this.opt && this.opt.length === 0) {
|
|
2473
|
+
// если нет пунктов меню, то не показываем меню
|
|
2474
|
+
return;
|
|
2475
|
+
}
|
|
2476
|
+
event.preventDefault();
|
|
2477
|
+
this.itemForMenu = itemForMenu;
|
|
2478
|
+
this.contextMenuPosition.x = event.clientX + 'px';
|
|
2479
|
+
this.contextMenuPosition.y = event.clientY + 'px';
|
|
2480
|
+
// как это (menuData) использовать в шаблоне не понятно, поэтому использую this.itemForMenu
|
|
2481
|
+
// https://www.concretepage.com/angular-material/passing-data-to-mat-menu-angular-material
|
|
2482
|
+
if (this.contextMenu) {
|
|
2483
|
+
this.contextMenu.menuData = { itemForMenu };
|
|
2484
|
+
this.contextMenu.menu?.focusFirstItem('mouse');
|
|
2485
|
+
this.contextMenu.openMenu();
|
|
2486
|
+
}
|
|
2487
|
+
}
|
|
2488
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TableComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2489
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.2.2", type: TableComponent, isStandalone: true, selector: "lib-table", inputs: { data$: "data$", columnOptions: "columnOptions", length$: "length$", tableState: "tableState", allowMultiSelect: "allowMultiSelect", rowRouterLinkField: "rowRouterLinkField", opt: "opt", rolesDblClickedEvent: "rolesDblClickedEvent" }, outputs: { pageStateChange: "pageStateChange", sortStateChange: "sortStateChange", selectionChange: "selectionChange", rowDoubleClicked: "rowDoubleClicked" }, viewQueries: [{ propertyName: "sort", first: true, predicate: MatSort, descendants: true }, { propertyName: "paginator", first: true, predicate: MatPaginator, descendants: true }, { propertyName: "contextMenu", first: true, predicate: MatMenuTrigger, descendants: true }], ngImport: i0, template: "<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"tableState.sortActive || ''\"\r\n [matSortDirection]=\"tableState.sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- \u0412\u044B\u0431\u043E\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <!-- <td mat-footer-cell *matFooterCellDef></td>-->\r\n </ng-container>\r\n\r\n @for (item of columnOptions; track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n }\r\n <!-- <td mat-footer-cell *matFooterCellDef>-->\r\n <!-- </td>-->\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n \u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row;\r\n columns: displayedColumns;\" (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" class=\"element-row\"\r\n [class.selected-row]=\"selection.isSelected(row)\">\r\n <!-- [class.fact-done-row]=\"row.quantFact >= row.quantPlan\"-->\r\n </tr>\r\n <!-- <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>-->\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length$.value\"\r\n [pageIndex]=\"tableState.pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"tableState.pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n", styles: [".component-container{display:flex;flex-direction:column;height:100%}.table-container{display:flex;flex-direction:column;justify-content:space-between;flex:auto;margin:0 20px;overflow:auto;height:400px}.center{position:absolute;inset:0 0 56px;background:#00000026;z-index:1;display:flex;align-items:center;justify-content:center}.mat-column-select{overflow:initial}tr.mat-footer-row{font-weight:700;height:56px}.mat-table{overflow-x:scroll}.mat-cell,.mat-header-cell{word-wrap:initial;display:table-cell;padding:0 10px;line-break:unset;white-space:nowrap;overflow:hidden;vertical-align:middle}.mat-row,.mat-header-row{display:table-row}tr.element-row:not(.selected-row):hover{background:#f5f5f5}tr.element-row:not(.selected-row):active{background:#efefef}.selected-row{background-color:#eee}.fact-done-row{background-color:#eefdec}a,a:visited,a:hover,a:active{color:inherit}.pre-wrap{white-space:pre-wrap}\n"], dependencies: [{ kind: "component", type: MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: MatSort, selector: "[matSort]", inputs: ["matSortActive", "matSortStart", "matSortDirection", "matSortDisableClear", "matSortDisabled"], outputs: ["matSortChange"], exportAs: ["matSort"] }, { kind: "directive", type: MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: MatSortHeader, selector: "[mat-sort-header]", inputs: ["mat-sort-header", "arrowPosition", "start", "disabled", "sortActionDescription", "disableClear"], exportAs: ["matSortHeader"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: MatNoDataRow, selector: "ng-template[matNoDataRow]" }, { kind: "directive", type: MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "component", type: MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "directive", type: MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "component", type: MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "directive", type: MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "component", type: MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "directive", type: MatMenuContent, selector: "ng-template[matMenuContent]" }, { kind: "component", type: MatDivider, selector: "mat-divider", inputs: ["vertical", "inset"] }, { kind: "component", type: MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] });
|
|
2490
|
+
}
|
|
2491
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.2", ngImport: i0, type: TableComponent, decorators: [{
|
|
2492
|
+
type: Component,
|
|
2493
|
+
args: [{ selector: 'lib-table', imports: [MatTable, MatSort, MatColumnDef, MatHeaderCellDef, MatHeaderCell, MatCheckbox, MatCellDef, MatCell,
|
|
2494
|
+
MatSortHeader, MatIcon, RouterLink, MatNoDataRow, MatHeaderRowDef, MatHeaderRow, MatRowDef, MatRow,
|
|
2495
|
+
MatMenuTrigger, MatMenu, MatMenuContent, MatDivider, MatMenuItem, MatPaginator], template: "<div class=\"component-container\">\r\n <div class=\"table-container\">\r\n <table mat-table [dataSource]=\"dataSource\"\r\n matSort\r\n [matSortActive]=\"tableState.sortActive || ''\"\r\n [matSortDirection]=\"tableState.sortDirection\"\r\n matSortDisableClear>\r\n\r\n <!-- \u0412\u044B\u0431\u043E\u0440 \u0441\u0442\u0440\u043E\u043A\u0438 Column -->\r\n <ng-container matColumnDef=\"select\">\r\n <th mat-header-cell *matHeaderCellDef>\r\n @if (allowMultiSelect) {\r\n <mat-checkbox (change)=\"$event ? masterToggle() : null\" [checked]=\"selection.hasValue() && isAllSelected()\"\r\n [indeterminate]=\"selection.hasValue() && !isAllSelected()\">\r\n </mat-checkbox>\r\n }\r\n </th>\r\n <td mat-cell *matCellDef=\"let row\">\r\n <mat-checkbox (click)=\"$event.stopPropagation()\" (change)=\"$event ? selection.toggle(row) : null\"\r\n [checked]=\"selection.isSelected(row)\">\r\n </mat-checkbox>\r\n </td>\r\n <!-- <td mat-footer-cell *matFooterCellDef></td>-->\r\n </ng-container>\r\n\r\n @for (item of columnOptions; track item) {\r\n <ng-container matColumnDef={{item.name}}>\r\n <th mat-header-cell *matHeaderCellDef mat-sort-header [disabled]=\"item.titleSortDisable\">{{item.title}}</th>\r\n @if (!item.format) {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'pre-wrap') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\" class=\"pre-wrap\">\r\n {{element[item.name]}}\r\n </td>\r\n }\r\n @if (item.format === 'link') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [href]=\"element[item.name]\" target=\"_blank\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'linkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [href]=\"element[item.name]\" target=\"_blank\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'routerLink') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <a [routerLink]=\"[element[item.name]]\">{{element[item.name]}}</a>\r\n </td>\r\n }\r\n @if (item.format === 'routerLinkIcon') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n @if (element[item.name]) {\r\n <a [routerLink]=\"[element[item.name]]\">\r\n @if (item.icon) {\r\n <mat-icon>{{item.icon}}</mat-icon>\r\n } \r\n @if (item.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{item.symbol}}</span>\r\n }\r\n </a>\r\n }\r\n </td>\r\n }\r\n @if (item.format === 'checkbox') {\r\n <td mat-cell *matCellDef=\"let element\" (contextmenu)=\"onContextMenu($event, element)\">\r\n <mat-checkbox [checked]=\"element[item.name] === 1\" [disabled]=\"true\"></mat-checkbox>\r\n </td>\r\n }\r\n <!-- <td mat-footer-cell *matFooterCellDef>-->\r\n <!-- </td>-->\r\n </ng-container>\r\n }\r\n\r\n <tr class=\"mat-row\" *matNoDataRow>\r\n <td class=\"mat-cell\" colspan=\"9999\">\r\n \u041D\u0435\u0442 \u0434\u0430\u043D\u043D\u044B\u0445 \u0434\u043B\u044F \u043E\u0442\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u044F\r\n </td>\r\n </tr>\r\n\r\n <tr mat-header-row *matHeaderRowDef=\"displayedColumns; sticky: true\"></tr>\r\n <tr mat-row *matRowDef=\"let row;\r\n columns: displayedColumns;\" (click)=\"onRowClicked(row)\" (dblclick)=\"onRowDblClicked(row)\" class=\"element-row\"\r\n [class.selected-row]=\"selection.isSelected(row)\">\r\n <!-- [class.fact-done-row]=\"row.quantFact >= row.quantPlan\"-->\r\n </tr>\r\n <!-- <tr mat-footer-row *matFooterRowDef=\"displayedColumns\"></tr>-->\r\n </table>\r\n <div style=\"visibility: hidden; position: fixed\"\r\n [style.left]=\"contextMenuPosition.x\"\r\n [style.top]=\"contextMenuPosition.y\"\r\n [matMenuTriggerFor]=\"contextMenu\" #menuTrigger=\"matMenuTrigger\">\r\n </div>\r\n <mat-menu #contextMenu=\"matMenu\">\r\n <ng-template matMenuContent let-id=\"id\">\r\n @for (menuItem of opt; track menuItem) {\r\n @if (menuItem.title === '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <mat-divider></mat-divider>\r\n }\r\n @if (menuItem.title !== '-' && !(menuItem.hideFn ? menuItem.hideFn(itemForMenu) : menuItem.hide)) {\r\n <button mat-menu-item\r\n (click)=\"menuItem.onClickFn ? menuItem.onClickFn(itemForMenu) : ''\"\r\n (mousedown)=\"menuItem.onClickMiddleFn ? menuItem.onClickMiddleFn($event, itemForMenu, menuTrigger) : ''\"\r\n [disabled]=\"menuItem.disabledFn ? menuItem.disabledFn(itemForMenu) : menuItem.disabled\">\r\n @if (menuItem.icon) {\r\n <mat-icon>{{menuItem.icon}}</mat-icon>\r\n }\r\n @if (menuItem.symbol) {\r\n <span class=\"material-symbols-outlined-light\">{{menuItem.symbol}}</span>\r\n }\r\n {{ menuItem.title }}\r\n </button>\r\n }\r\n }\r\n </ng-template>\r\n </mat-menu>\r\n</div>\r\n\r\n\r\n<mat-paginator [length]=\"length$.value\"\r\n [pageIndex]=\"tableState.pageIndex || defaultPageIndex\"\r\n [pageSizeOptions]=\"[5, 10, 20, 50, 100]\"\r\n [pageSize]=\"tableState.pageSize || defaultPageSize\"\r\n showFirstLastButtons\r\n itemsPerPageLabel=\"\"\r\n></mat-paginator>\r\n</div>\r\n", styles: [".component-container{display:flex;flex-direction:column;height:100%}.table-container{display:flex;flex-direction:column;justify-content:space-between;flex:auto;margin:0 20px;overflow:auto;height:400px}.center{position:absolute;inset:0 0 56px;background:#00000026;z-index:1;display:flex;align-items:center;justify-content:center}.mat-column-select{overflow:initial}tr.mat-footer-row{font-weight:700;height:56px}.mat-table{overflow-x:scroll}.mat-cell,.mat-header-cell{word-wrap:initial;display:table-cell;padding:0 10px;line-break:unset;white-space:nowrap;overflow:hidden;vertical-align:middle}.mat-row,.mat-header-row{display:table-row}tr.element-row:not(.selected-row):hover{background:#f5f5f5}tr.element-row:not(.selected-row):active{background:#efefef}.selected-row{background-color:#eee}.fact-done-row{background-color:#eefdec}a,a:visited,a:hover,a:active{color:inherit}.pre-wrap{white-space:pre-wrap}\n"] }]
|
|
2496
|
+
}], ctorParameters: () => [], propDecorators: { data$: [{
|
|
2497
|
+
type: Input
|
|
2498
|
+
}], columnOptions: [{
|
|
2499
|
+
type: Input
|
|
2500
|
+
}], length$: [{
|
|
2501
|
+
type: Input
|
|
2502
|
+
}], tableState: [{
|
|
2503
|
+
type: Input
|
|
2504
|
+
}], allowMultiSelect: [{
|
|
2505
|
+
type: Input
|
|
2506
|
+
}], rowRouterLinkField: [{
|
|
2507
|
+
type: Input
|
|
2508
|
+
}], opt: [{
|
|
2509
|
+
type: Input
|
|
2510
|
+
}], rolesDblClickedEvent: [{
|
|
2511
|
+
type: Input
|
|
2512
|
+
}], pageStateChange: [{
|
|
2513
|
+
type: Output
|
|
2514
|
+
}], sortStateChange: [{
|
|
2515
|
+
type: Output
|
|
2516
|
+
}], selectionChange: [{
|
|
2517
|
+
type: Output
|
|
2518
|
+
}], rowDoubleClicked: [{
|
|
2519
|
+
type: Output
|
|
2520
|
+
}], sort: [{
|
|
2521
|
+
type: ViewChild,
|
|
2522
|
+
args: [MatSort]
|
|
2523
|
+
}], paginator: [{
|
|
2524
|
+
type: ViewChild,
|
|
2525
|
+
args: [MatPaginator]
|
|
2526
|
+
}], contextMenu: [{
|
|
2527
|
+
type: ViewChild,
|
|
2528
|
+
args: [MatMenuTrigger]
|
|
2529
|
+
}] } });
|
|
2530
|
+
|
|
2531
|
+
/*
|
|
2532
|
+
* Public API Surface of uikit
|
|
2533
|
+
*/
|
|
2534
|
+
|
|
2535
|
+
/**
|
|
2536
|
+
* Generated bundle index. Do not edit.
|
|
2537
|
+
*/
|
|
2538
|
+
|
|
2539
|
+
export { Action, AlertService, AnimationsService, AuthService, AvatarService, BaseEditClass, BaseFilterClass, BaseMatChipComponent, BaseNavBarMenuClass, BasePageClass, BaseSelectAutocompleteWithVirtualScrollComponent, BaseSelectWithGroupComponent, BaseServiceClass, BaseToolbarComponent, DateRangeFilterComponent, DialogAction, DialogComponent, DisableIfRoleDirective, DisableIfUnauthorizedDirective, EntityAction, Environment, ExportService, HideIfRoleNotDirective, HideIfUnauthorizedDirective, ImzLogoComponent, LoaderService, LocalStorageService, LoginPageComponent, MY_FORMATS, NavBarComponent, NotFoundComponent, ProgressSpinnerComponent, ROUTE_ANIMATIONS_ELEMENTS, RedirectGuard, RoleService, SafePipe, SecUser, TableComponent, TimePipe, TruncatePipe, User, UserService, authGuard, dateFormat, isRouteAnimationsAll, isRouteAnimationsElements, isRouteAnimationsNone, isRouteAnimationsPage, roleGuard, routeAnimations };
|
|
2540
|
+
//# sourceMappingURL=kuzntsv-uikit.mjs.map
|