@snabcentr/client-ui 3.30.0 → 3.31.0
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/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.d.ts +97 -0
- package/cart/add-or-editing-cart-item-dialog/index.d.ts +2 -0
- package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts +48 -0
- package/cart/index.d.ts +1 -0
- package/directives/index.d.ts +1 -0
- package/directives/select-on-focusin/sc-select-on-focusin.directive.d.ts +14 -0
- package/esm2022/cart/add-or-editing-cart-item-dialog/add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component.mjs +196 -0
- package/esm2022/cart/add-or-editing-cart-item-dialog/index.mjs +3 -0
- package/esm2022/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.mjs +74 -0
- package/esm2022/cart/index.mjs +2 -1
- package/esm2022/directives/index.mjs +2 -1
- package/esm2022/directives/select-on-focusin/sc-select-on-focusin.directive.mjs +31 -0
- package/fesm2022/snabcentr-client-ui.mjs +274 -6
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/release_notes.tmp +3 -3
- package/styles/tailwind/tailwind.scss +5 -0
@@ -0,0 +1,97 @@
|
|
1
|
+
import { OnInit } from '@angular/core';
|
2
|
+
import { FormControl, FormGroup } from '@angular/forms';
|
3
|
+
import { ScCartItem, ScINewCartItemBase, ScProduct } from '@snabcentr/client-core';
|
4
|
+
import * as i0 from "@angular/core";
|
5
|
+
/**
|
6
|
+
* Компонент добавления / изменения товара в корзине.
|
7
|
+
*/
|
8
|
+
export declare class ScAddOrEditingCartItemFormComponent implements OnInit {
|
9
|
+
/**
|
10
|
+
* Группа полей добавления / изменения товара в корзине.
|
11
|
+
*/
|
12
|
+
readonly form: FormGroup<{
|
13
|
+
length?: FormControl<number | null>;
|
14
|
+
quantity: FormControl<number | null>;
|
15
|
+
marker: FormControl<string | null>;
|
16
|
+
}>;
|
17
|
+
/**
|
18
|
+
* Данные о товаре.
|
19
|
+
*/
|
20
|
+
readonly product: import("@angular/core").InputSignal<ScProduct>;
|
21
|
+
/**
|
22
|
+
* Данные о товаре в корзине.
|
23
|
+
*/
|
24
|
+
readonly cartItem: import("@angular/core").InputSignal<ScCartItem | undefined>;
|
25
|
+
/**
|
26
|
+
* Признак загрузки данных.
|
27
|
+
*/
|
28
|
+
readonly isLoading: import("@angular/core").InputSignal<boolean>;
|
29
|
+
/**
|
30
|
+
* Признак возможности продажи товара на метраж.
|
31
|
+
*/
|
32
|
+
protected readonly productIsMeasurable: import("@angular/core").Signal<boolean>;
|
33
|
+
/**
|
34
|
+
* Кратность количества для товара.
|
35
|
+
*/
|
36
|
+
protected readonly productMultiplicity: import("@angular/core").Signal<number>;
|
37
|
+
/**
|
38
|
+
* Минимальный метраж для товара.
|
39
|
+
*/
|
40
|
+
protected readonly minLength: import("@angular/core").Signal<number>;
|
41
|
+
/**
|
42
|
+
* Максимальный метраж для товара.
|
43
|
+
*/
|
44
|
+
protected readonly maxLength: import("@angular/core").Signal<number | undefined>;
|
45
|
+
/**
|
46
|
+
* Шаг изменения метража.
|
47
|
+
*/
|
48
|
+
protected readonly lengthStep: import("@angular/core").Signal<number | undefined>;
|
49
|
+
/**
|
50
|
+
* Подсказка по минимальному и максимальному метражу товара.
|
51
|
+
*/
|
52
|
+
protected readonly lengthHint: import("@angular/core").Signal<string>;
|
53
|
+
/**
|
54
|
+
* Итоговая стоимость заказа.
|
55
|
+
*/
|
56
|
+
protected readonly totalCost: import("@angular/core").Signal<number | undefined>;
|
57
|
+
/**
|
58
|
+
* {@link Output} события добавления товара в корзину.
|
59
|
+
*/
|
60
|
+
readonly addToCart: import("@angular/core").OutputEmitterRef<ScINewCartItemBase>;
|
61
|
+
/**
|
62
|
+
* {@link Output} события редактирования товара в корзине.
|
63
|
+
*/
|
64
|
+
readonly editCartItem: import("@angular/core").OutputEmitterRef<Omit<ScINewCartItemBase, "productId">>;
|
65
|
+
/**
|
66
|
+
* Объект-помощник для работы со значениями единиц измерения товара.
|
67
|
+
*/
|
68
|
+
private readonly unitsHelper;
|
69
|
+
/**
|
70
|
+
* Сервис для сбора метрик о действиях пользователей.
|
71
|
+
*/
|
72
|
+
private readonly userMetrikaService;
|
73
|
+
/**
|
74
|
+
* Сервис конвертации данных.
|
75
|
+
*/
|
76
|
+
private readonly convertersService;
|
77
|
+
/** @inheritDoc */
|
78
|
+
ngOnInit(): void;
|
79
|
+
/**
|
80
|
+
* Обработчик события шага метража.
|
81
|
+
*
|
82
|
+
* @param step Шаг.
|
83
|
+
*/
|
84
|
+
protected onStepLength(step: number): void;
|
85
|
+
/**
|
86
|
+
* Обработчик события шага количества.
|
87
|
+
*
|
88
|
+
* @param step Шаг.
|
89
|
+
*/
|
90
|
+
protected onStepQuantity(step: number): void;
|
91
|
+
/**
|
92
|
+
* Обработчик события отправки формы.
|
93
|
+
*/
|
94
|
+
protected onSubmit(): void;
|
95
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ScAddOrEditingCartItemFormComponent, never>;
|
96
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScAddOrEditingCartItemFormComponent, "sc-add-or-editing-cart-item-form", never, { "product": { "alias": "product"; "required": true; "isSignal": true; }; "cartItem": { "alias": "cartItem"; "required": false; "isSignal": true; }; "isLoading": { "alias": "isLoading"; "required": false; "isSignal": true; }; }, { "addToCart": "addToCart"; "editCartItem": "editCartItem"; }, never, never, true, never>;
|
97
|
+
}
|
package/cart/add-or-editing-cart-item-dialog/sc-add-or-editing-cart-item-dialog.component.d.ts
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
import { Signal } from '@angular/core';
|
2
|
+
import { ScCartItem, ScINewCartItemBase, ScProduct } from '@snabcentr/client-core';
|
3
|
+
import { TuiDialogContext } from '@taiga-ui/core';
|
4
|
+
import { Observable, Subject } from 'rxjs';
|
5
|
+
import { ScAddOrEditingCartItemFormComponent } from './add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component';
|
6
|
+
import * as i0 from "@angular/core";
|
7
|
+
/**
|
8
|
+
* Компонент добавления / изменения товара в корзине.
|
9
|
+
*/
|
10
|
+
export declare class ScAddOrEditingCartItemDialogComponent {
|
11
|
+
/**
|
12
|
+
* Компонент формы добавления / изменения товара в корзине.
|
13
|
+
*/
|
14
|
+
readonly formComponent: Signal<ScAddOrEditingCartItemFormComponent>;
|
15
|
+
/**
|
16
|
+
* {@link Subject} события отправки формы.
|
17
|
+
*/
|
18
|
+
readonly onSubmit: Subject<ScINewCartItemBase | Omit<ScINewCartItemBase, 'productId'>>;
|
19
|
+
/**
|
20
|
+
* {@link Observable} запроса добавления / изменения товара в корзине.
|
21
|
+
*/
|
22
|
+
readonly submit$: Observable<import("@snabcentr/client-core").ScCart | null>;
|
23
|
+
/**
|
24
|
+
* {@link Observable} изменения состояния загрузки данных.
|
25
|
+
*/
|
26
|
+
readonly loading: Signal<boolean>;
|
27
|
+
/**
|
28
|
+
* Контекст диалогового окна.
|
29
|
+
*/
|
30
|
+
readonly context: TuiDialogContext<boolean, {
|
31
|
+
product: ScProduct;
|
32
|
+
cartItem: ScCartItem | undefined;
|
33
|
+
}>;
|
34
|
+
/**
|
35
|
+
* Данные о товаре.
|
36
|
+
*/
|
37
|
+
readonly product: ScProduct;
|
38
|
+
/**
|
39
|
+
* Данные о товаре в корзине.
|
40
|
+
*/
|
41
|
+
readonly cartItem: ScCartItem | undefined;
|
42
|
+
/**
|
43
|
+
* Сервис для работы с корзиной.
|
44
|
+
*/
|
45
|
+
private readonly cartService;
|
46
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ScAddOrEditingCartItemDialogComponent, never>;
|
47
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ScAddOrEditingCartItemDialogComponent, "sc-add-or-editing-cart-item-dialog", never, {}, {}, never, never, true, never>;
|
48
|
+
}
|
package/cart/index.d.ts
CHANGED
package/directives/index.d.ts
CHANGED
@@ -4,3 +4,4 @@ export * from './abstract-price-card/abstract-sc-price-card.directive';
|
|
4
4
|
export * from './terminal-link/sc-terminal-link.directive';
|
5
5
|
export * from './links';
|
6
6
|
export * from './sc-date-value-transformer.directive';
|
7
|
+
export * from './select-on-focusin/sc-select-on-focusin.directive';
|
@@ -0,0 +1,14 @@
|
|
1
|
+
import * as i0 from "@angular/core";
|
2
|
+
/**
|
3
|
+
* Директива для обработки события фокуса поля ввода, для последующего выделения содержимого поля ввода.
|
4
|
+
*/
|
5
|
+
export declare class ScSelectOnFocusinDirective {
|
6
|
+
/**
|
7
|
+
* Слушатель и обработчик события `focusin`.
|
8
|
+
*
|
9
|
+
* @param target Целевой объект события `focusin`.
|
10
|
+
*/
|
11
|
+
protected onFocusIn(target: HTMLElement): void;
|
12
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ScSelectOnFocusinDirective, never>;
|
13
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<ScSelectOnFocusinDirective, "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber]", never, {}, {}, never, never, true, never>;
|
14
|
+
}
|
@@ -0,0 +1,196 @@
|
|
1
|
+
/* eslint-disable sonarjs/no-nested-template-literals,@typescript-eslint/unbound-method */
|
2
|
+
import { AsyncPipe, NgIf } from '@angular/common';
|
3
|
+
import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';
|
4
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
5
|
+
import { FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
6
|
+
import { ScConvertersService, ScUnitsHelper, ScUserMetrikaGoalsEnum, ScUserMetrikaService, } from '@snabcentr/client-core';
|
7
|
+
import { TuiAmountPipe } from '@taiga-ui/addon-commerce';
|
8
|
+
import { tuiControlValue, tuiMarkControlAsTouchedAndValidate } from '@taiga-ui/cdk';
|
9
|
+
import { TuiButton, TuiError, TuiLabel, TuiNumberFormat, TuiTextfield } from '@taiga-ui/core';
|
10
|
+
import { TuiAppearance, TuiWithAppearance } from '@taiga-ui/core/directives/appearance';
|
11
|
+
import { TuiIcons, TuiWithIcons } from '@taiga-ui/core/directives/icons';
|
12
|
+
import { TuiButtonLoading, TuiChip, TuiFieldErrorPipe, TuiInputNumber } from '@taiga-ui/kit';
|
13
|
+
import { TuiInputModule } from '@taiga-ui/legacy';
|
14
|
+
import { combineLatest, debounceTime, map, of } from 'rxjs';
|
15
|
+
import { ScNextInputFocusModule } from '../../../directives/next-input-focus/sc-next-input-focus.module';
|
16
|
+
import { ScSelectOnFocusinDirective } from '../../../directives/select-on-focusin/sc-select-on-focusin.directive';
|
17
|
+
import { stepValidator } from '../../../validators/step-validator';
|
18
|
+
import * as i0 from "@angular/core";
|
19
|
+
import * as i1 from "@angular/forms";
|
20
|
+
import * as i2 from "../../../directives/next-input-focus/sc-next-input-focus.directive";
|
21
|
+
import * as i3 from "@taiga-ui/legacy";
|
22
|
+
import * as i4 from "@taiga-ui/legacy/components/primitive-textfield";
|
23
|
+
import * as i5 from "@taiga-ui/kit";
|
24
|
+
import * as i6 from "@taiga-ui/core";
|
25
|
+
/**
|
26
|
+
* Компонент добавления / изменения товара в корзине.
|
27
|
+
*/
|
28
|
+
export class ScAddOrEditingCartItemFormComponent {
|
29
|
+
constructor() {
|
30
|
+
/**
|
31
|
+
* Группа полей добавления / изменения товара в корзине.
|
32
|
+
*/
|
33
|
+
this.form = new FormGroup({
|
34
|
+
quantity: new FormControl(null, Validators.required),
|
35
|
+
marker: new FormControl(''),
|
36
|
+
});
|
37
|
+
/**
|
38
|
+
* Данные о товаре.
|
39
|
+
*/
|
40
|
+
this.product = input.required();
|
41
|
+
/**
|
42
|
+
* Данные о товаре в корзине.
|
43
|
+
*/
|
44
|
+
this.cartItem = input();
|
45
|
+
/**
|
46
|
+
* Признак загрузки данных.
|
47
|
+
*/
|
48
|
+
this.isLoading = input(false);
|
49
|
+
/**
|
50
|
+
* Признак возможности продажи товара на метраж.
|
51
|
+
*/
|
52
|
+
this.productIsMeasurable = computed(() => this.unitsHelper.productIsMeasurable(this.product()));
|
53
|
+
/**
|
54
|
+
* Кратность количества для товара.
|
55
|
+
*/
|
56
|
+
this.productMultiplicity = computed(() => this.unitsHelper.productMultiplicity(this.product()));
|
57
|
+
/**
|
58
|
+
* Минимальный метраж для товара.
|
59
|
+
*/
|
60
|
+
this.minLength = computed(() => this.cartItem()?.length ?? this.product().properties?.minLength ?? (this.product().ignoreMinCountCheck ? 0 : this.product().minCount) ?? 1);
|
61
|
+
/**
|
62
|
+
* Максимальный метраж для товара.
|
63
|
+
*/
|
64
|
+
this.maxLength = computed(() => this.product().properties?.maxLength);
|
65
|
+
/**
|
66
|
+
* Шаг изменения метража.
|
67
|
+
*/
|
68
|
+
this.lengthStep = computed(() => this.product().properties?.lengthStep ?? (this.product().ignoreMinCountCheck ? 0 : this.product().minCount));
|
69
|
+
/**
|
70
|
+
* Подсказка по минимальному и максимальному метражу товара.
|
71
|
+
*/
|
72
|
+
this.lengthHint = computed(() => {
|
73
|
+
const min = this.minLength();
|
74
|
+
const max = this.maxLength();
|
75
|
+
// eslint-disable-next-line sonarjs/no-nested-conditional, @typescript-eslint/no-unnecessary-condition
|
76
|
+
return (min ?? max) ? `(${min ? `от ${min}` : ''}${min && max ? ' ' : ''}${max ? `до ${max}` : ''} ${this.product().unit})` : '';
|
77
|
+
});
|
78
|
+
/**
|
79
|
+
* Итоговая стоимость заказа.
|
80
|
+
*/
|
81
|
+
this.totalCost = toSignal(combineLatest({
|
82
|
+
// eslint-disable-next-line unicorn/explicit-length-check
|
83
|
+
length: this.form.controls.length ? tuiControlValue(this.form.controls.length) : of(1),
|
84
|
+
quantity: tuiControlValue(this.form.controls.quantity),
|
85
|
+
}).pipe(debounceTime(0), // Исправляем ошибку NG0950.
|
86
|
+
map(({ length, quantity }) => (this.product().costRub ?? 0) * length * quantity), map((sum) => Math.round(sum * 100) / 100)));
|
87
|
+
/**
|
88
|
+
* {@link Output} события добавления товара в корзину.
|
89
|
+
*/
|
90
|
+
this.addToCart = output();
|
91
|
+
/**
|
92
|
+
* {@link Output} события редактирования товара в корзине.
|
93
|
+
*/
|
94
|
+
this.editCartItem = output();
|
95
|
+
/**
|
96
|
+
* Объект-помощник для работы со значениями единиц измерения товара.
|
97
|
+
*/
|
98
|
+
this.unitsHelper = inject(ScUnitsHelper);
|
99
|
+
/**
|
100
|
+
* Сервис для сбора метрик о действиях пользователей.
|
101
|
+
*/
|
102
|
+
this.userMetrikaService = inject(ScUserMetrikaService);
|
103
|
+
/**
|
104
|
+
* Сервис конвертации данных.
|
105
|
+
*/
|
106
|
+
this.convertersService = inject(ScConvertersService);
|
107
|
+
}
|
108
|
+
/** @inheritDoc */
|
109
|
+
ngOnInit() {
|
110
|
+
if (this.productIsMeasurable()) {
|
111
|
+
this.form.addControl('length', new FormControl(this.minLength(), [Validators.required, Validators.min(0.01)]));
|
112
|
+
}
|
113
|
+
this.form.patchValue({
|
114
|
+
quantity: this.cartItem()?.quantity ?? this.unitsHelper.productMultiplicity(this.product()),
|
115
|
+
});
|
116
|
+
this.form.controls.quantity.addValidators(stepValidator(this.unitsHelper.productStepForValidator(this.product())));
|
117
|
+
this.form.controls.length?.addValidators(stepValidator(this.product().properties?.lengthStep ?? (this.product().ignoreMinCountCheck ? 0 : (this.product().minCount ?? 0))));
|
118
|
+
this.userMetrikaService.emitUserMetrikaEvent({
|
119
|
+
target: ScUserMetrikaGoalsEnum.cartItemAddShow,
|
120
|
+
params: { product_id: this.product().id },
|
121
|
+
});
|
122
|
+
}
|
123
|
+
/**
|
124
|
+
* Обработчик события шага метража.
|
125
|
+
*
|
126
|
+
* @param step Шаг.
|
127
|
+
*/
|
128
|
+
onStepLength(step) {
|
129
|
+
// eslint-disable-next-line unicorn/explicit-length-check
|
130
|
+
if (!this.productIsMeasurable() || !this.form.controls.length) {
|
131
|
+
return;
|
132
|
+
}
|
133
|
+
const length = this.form.controls.length.value ?? 0;
|
134
|
+
this.form.controls.length.setValue(Math.max(this.minLength(), length - (length % step) + step));
|
135
|
+
}
|
136
|
+
/**
|
137
|
+
* Обработчик события шага количества.
|
138
|
+
*
|
139
|
+
* @param step Шаг.
|
140
|
+
*/
|
141
|
+
onStepQuantity(step) {
|
142
|
+
const quantity = this.form.controls.quantity.value ?? 0;
|
143
|
+
this.form.controls.quantity.setValue(Math.max(this.productMultiplicity(), quantity - (quantity % step) + step));
|
144
|
+
}
|
145
|
+
/**
|
146
|
+
* Обработчик события отправки формы.
|
147
|
+
*/
|
148
|
+
onSubmit() {
|
149
|
+
const value = this.convertersService.removeNull(this.form.value);
|
150
|
+
if (!this.cartItem()) {
|
151
|
+
value.productId = this.product().id;
|
152
|
+
}
|
153
|
+
const step = this.lengthStep();
|
154
|
+
if (this.productIsMeasurable() && step) {
|
155
|
+
value.quantity = Math.round(value.quantity * (value.length / step));
|
156
|
+
value.length = step;
|
157
|
+
}
|
158
|
+
tuiMarkControlAsTouchedAndValidate(this.form);
|
159
|
+
if (this.cartItem()) {
|
160
|
+
this.editCartItem.emit(value);
|
161
|
+
}
|
162
|
+
else {
|
163
|
+
this.addToCart.emit(value);
|
164
|
+
}
|
165
|
+
}
|
166
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScAddOrEditingCartItemFormComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
167
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "18.2.13", type: ScAddOrEditingCartItemFormComponent, isStandalone: true, selector: "sc-add-or-editing-cart-item-form", inputs: { product: { classPropertyName: "product", publicName: "product", isSignal: true, isRequired: true, transformFunction: null }, cartItem: { classPropertyName: "cartItem", publicName: "cartItem", isSignal: true, isRequired: false, transformFunction: null }, isLoading: { classPropertyName: "isLoading", publicName: "isLoading", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { addToCart: "addToCart", editCartItem: "editCartItem" }, ngImport: i0, template: "<!-- \u0424\u043E\u0440\u043C\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u0440\u044F\u0435\u043C\u043E\u0433\u043E \u0442\u043E\u0432\u0430\u0440\u0430. -->\n<form\n *ngIf=\"product\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit()\"\n ScNextInputFocus\n class=\"flex flex-col gap-2\"\n>\n <!-- \u0414\u043B\u0438\u043D\u0430 \u0442\u043E\u0432\u0430\u0440\u0430 (\u043C\u0435\u0442\u0440\u0430\u0436) -->\n <label\n *ngIf=\"productIsMeasurable()\"\n tuiLabel\n >\n \u041C\u0435\u0442\u0440\u0430\u0436, {{ product().unit }} {{ lengthHint() }}\n\n <tui-textfield>\n <input\n tuiInputNumber\n formControlName=\"length\"\n [tuiNumberFormat]=\"{ precision: 2 }\"\n [max]=\"maxLength() || null\"\n [min]=\"minLength() || null\"\n (keydown.arrowDown)=\"onStepLength(-(lengthStep() ?? 0.01))\"\n (keydown.arrowUp)=\"onStepLength(lengthStep() ?? 0.01)\"\n autocomplete=\"length\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n <p\n *ngIf=\"lengthStep()\"\n class=\"tui-form__field-note\"\n >\n \u041C\u0435\u0442\u0440\u0430\u0436 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u0435\u043D {{ lengthStep() }}\n </p>\n </label>\n\n <!-- \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <label tuiLabel>\n \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442.\n <tui-textfield>\n @let step = lengthStep();\n <tui-chip\n *ngIf=\"productMultiplicity() && step\"\n size=\"s\"\n appearance=\"negative\"\n class=\"font-bold\"\n >\n x {{ step }} {{ product().unit }}\n </tui-chip>\n\n <input\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n tuiInputNumber\n [tuiNumberFormat]=\"{ decimalMode: 'not-zero' }\"\n [min]=\"productMultiplicity()\"\n (keydown.arrowDown)=\"onStepQuantity(-productMultiplicity())\"\n (keydown.arrowUp)=\"onStepQuantity(productMultiplicity())\"\n formControlName=\"quantity\"\n autocomplete=\"quantity\"\n />\n </tui-textfield>\n <p class=\"tui-form__field-note\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u043E {{ productMultiplicity() }}</p>\n <tui-error\n formControlName=\"quantity\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 -->\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430\n <tui-input formControlName=\"marker\">\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430\n <input\n tuiTextfieldLegacy\n autocomplete=\"marker\"\n />\n </tui-input>\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043D\u043E\u043F\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F / \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u043E\u0432\u0430\u0440\u0430 \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443 -->\n <div class=\"flex flex-col items-center\">\n @let cost = totalCost();\n\n <div *ngIf=\"cost\">\n \u0418\u0442\u043E\u0433\u043E:<span class=\"text-2xl font-bold\">\n {{ cost | tuiAmount: 'RUB' | async }}\n {{ product().currency }}</span\n >\n </div>\n\n <!-- \u041A\u043D\u043E\u043F\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F / \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u043E\u0432\u0430\u0440\u0430 \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443 -->\n <button\n tuiButton\n iconStart=\"@tui.check\"\n [disabled]=\"form.invalid\"\n [loading]=\"isLoading()\"\n type=\"submit\"\n class=\"mt-2\"\n >\n {{ cartItem() ? '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' : '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' }}\n </button>\n </div>\n</form>\n", dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: "ngmodule", type: ScNextInputFocusModule }, { kind: "directive", type: i2.ScNextInputFocusDirective, selector: "form[ScNextInputFocus]" }, { 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: TuiLabel, selector: "label[tuiLabel]" }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber]" }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "component", type: TuiError, selector: "tui-error", inputs: ["error"] }, { kind: "ngmodule", type: TuiInputModule }, { kind: "component", type: i3.TuiInputComponent, selector: "tui-input" }, { kind: "directive", type: i3.TuiInputDirective, selector: "tui-input" }, { kind: "component", type: i4.TuiTextfieldComponent, selector: "input[tuiTextfieldLegacy], textarea[tuiTextfieldLegacy]" }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: TuiButtonLoading, selector: "[tuiButton][loading],[tuiIconButton][loading]", inputs: ["size", "loading"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TuiFieldErrorPipe, name: "tuiFieldError" }, { kind: "directive", type: i5.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "component", type: i6.TuiTextfieldComponent, selector: "tui-textfield", inputs: ["content", "filler"] }, { kind: "pipe", type: TuiAmountPipe, name: "tuiAmount" }, { kind: "directive", type: TuiChip, selector: "tui-chip,[tuiChip]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
168
|
+
}
|
169
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScAddOrEditingCartItemFormComponent, decorators: [{
|
170
|
+
type: Component,
|
171
|
+
args: [{ standalone: true, selector: 'sc-add-or-editing-cart-item-form', imports: [
|
172
|
+
NgIf,
|
173
|
+
FormsModule,
|
174
|
+
ScNextInputFocusModule,
|
175
|
+
ReactiveFormsModule,
|
176
|
+
TuiLabel,
|
177
|
+
ScSelectOnFocusinDirective,
|
178
|
+
TuiNumberFormat,
|
179
|
+
TuiError,
|
180
|
+
TuiInputModule,
|
181
|
+
TuiAppearance,
|
182
|
+
TuiWithAppearance,
|
183
|
+
TuiIcons,
|
184
|
+
TuiWithIcons,
|
185
|
+
TuiButton,
|
186
|
+
TuiButtonLoading,
|
187
|
+
AsyncPipe,
|
188
|
+
TuiFieldErrorPipe,
|
189
|
+
TuiInputNumber,
|
190
|
+
TuiNumberFormat,
|
191
|
+
TuiTextfield,
|
192
|
+
TuiAmountPipe,
|
193
|
+
TuiChip,
|
194
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "<!-- \u0424\u043E\u0440\u043C\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u0438\u0437\u043C\u0435\u0440\u044F\u0435\u043C\u043E\u0433\u043E \u0442\u043E\u0432\u0430\u0440\u0430. -->\n<form\n *ngIf=\"product\"\n [formGroup]=\"form\"\n (ngSubmit)=\"onSubmit()\"\n ScNextInputFocus\n class=\"flex flex-col gap-2\"\n>\n <!-- \u0414\u043B\u0438\u043D\u0430 \u0442\u043E\u0432\u0430\u0440\u0430 (\u043C\u0435\u0442\u0440\u0430\u0436) -->\n <label\n *ngIf=\"productIsMeasurable()\"\n tuiLabel\n >\n \u041C\u0435\u0442\u0440\u0430\u0436, {{ product().unit }} {{ lengthHint() }}\n\n <tui-textfield>\n <input\n tuiInputNumber\n formControlName=\"length\"\n [tuiNumberFormat]=\"{ precision: 2 }\"\n [max]=\"maxLength() || null\"\n [min]=\"minLength() || null\"\n (keydown.arrowDown)=\"onStepLength(-(lengthStep() ?? 0.01))\"\n (keydown.arrowUp)=\"onStepLength(lengthStep() ?? 0.01)\"\n autocomplete=\"length\"\n />\n </tui-textfield>\n <tui-error\n formControlName=\"length\"\n [error]=\"[] | tuiFieldError | async\"\n />\n <p\n *ngIf=\"lengthStep()\"\n class=\"tui-form__field-note\"\n >\n \u041C\u0435\u0442\u0440\u0430\u0436 \u0434\u043E\u043B\u0436\u0435\u043D \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u0435\u043D {{ lengthStep() }}\n </p>\n </label>\n\n <!-- \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0442\u043E\u0432\u0430\u0440\u0430 -->\n <label tuiLabel>\n \u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E, \u0448\u0442.\n <tui-textfield>\n @let step = lengthStep();\n <tui-chip\n *ngIf=\"productMultiplicity() && step\"\n size=\"s\"\n appearance=\"negative\"\n class=\"font-bold\"\n >\n x {{ step }} {{ product().unit }}\n </tui-chip>\n\n <input\n placeholder=\"\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E\"\n tuiInputNumber\n [tuiNumberFormat]=\"{ decimalMode: 'not-zero' }\"\n [min]=\"productMultiplicity()\"\n (keydown.arrowDown)=\"onStepQuantity(-productMultiplicity())\"\n (keydown.arrowUp)=\"onStepQuantity(productMultiplicity())\"\n formControlName=\"quantity\"\n autocomplete=\"quantity\"\n />\n </tui-textfield>\n <p class=\"tui-form__field-note\">\u041A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u0434\u043E\u043B\u0436\u043D\u043E \u0431\u044B\u0442\u044C \u043A\u0440\u0430\u0442\u043D\u043E {{ productMultiplicity() }}</p>\n <tui-error\n formControlName=\"quantity\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430 -->\n <label tuiLabel>\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430\n <tui-input formControlName=\"marker\">\n \u041C\u0430\u0440\u043A\u0438\u0440\u043E\u0432\u043A\u0430\n <input\n tuiTextfieldLegacy\n autocomplete=\"marker\"\n />\n </tui-input>\n <tui-error\n formControlName=\"marker\"\n [error]=\"[] | tuiFieldError | async\"\n />\n </label>\n\n <!-- \u041A\u043D\u043E\u043F\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F / \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u043E\u0432\u0430\u0440\u0430 \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443 -->\n <div class=\"flex flex-col items-center\">\n @let cost = totalCost();\n\n <div *ngIf=\"cost\">\n \u0418\u0442\u043E\u0433\u043E:<span class=\"text-2xl font-bold\">\n {{ cost | tuiAmount: 'RUB' | async }}\n {{ product().currency }}</span\n >\n </div>\n\n <!-- \u041A\u043D\u043E\u043F\u043A\u0430 \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F / \u0440\u0435\u0434\u0430\u043A\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F \u0442\u043E\u0432\u0430\u0440\u0430 \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443 -->\n <button\n tuiButton\n iconStart=\"@tui.check\"\n [disabled]=\"form.invalid\"\n [loading]=\"isLoading()\"\n type=\"submit\"\n class=\"mt-2\"\n >\n {{ cartItem() ? '\u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C' : '\u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0432 \u043A\u043E\u0440\u0437\u0438\u043D\u0443' }}\n </button>\n </div>\n</form>\n" }]
|
195
|
+
}] });
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWRpYWxvZy9hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZm9ybS9zYy1hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZm9ybS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZGlhbG9nL2FkZC1vci1lZGl0aW5nLWNhcnQtaXRlbS1mb3JtL3NjLWFkZC1vci1lZGl0aW5nLWNhcnQtaXRlbS1mb3JtLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDBGQUEwRjtBQUUxRixPQUFPLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVHLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUVILG1CQUFtQixFQUluQixhQUFhLEVBQ2Isc0JBQXNCLEVBQ3RCLG9CQUFvQixHQUN2QixNQUFNLHdCQUF3QixDQUFDO0FBQ2hDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGtDQUFrQyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8s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R0EsNENEMUVRLElBQUksNEZBQ0osV0FBVywycEJBQ1gsc0JBQXNCLDZIQUN0QixtQkFBbUIsZ1ZBQ25CLFFBQVEsNERBQ1IsMEJBQTBCLG9KQUMxQixlQUFlLDJGQUNmLFFBQVEsd0VBQ1IsY0FBYywrU0FLZCxTQUFTLG9JQUNULGdCQUFnQixrSEFDaEIsU0FBUyx5Q0FDVCxpQkFBaUIsMlNBSWpCLGFBQWEsa0RBQ2IsT0FBTzs7NEZBSUYsbUNBQW1DO2tCQTlCL0MsU0FBUztpQ0FDTSxJQUFJLFlBQ04sa0NBQWtDLFdBRW5DO3dCQUNMLElBQUk7d0JBQ0osV0FBVzt3QkFDWCxzQkFBc0I7d0JBQ3RCLG1CQUFtQjt3QkFDbkIsUUFBUTt3QkFDUiwwQkFBMEI7d0JBQzFCLGVBQWU7d0JBQ2YsUUFBUTt3QkFDUixjQUFjO3dCQUNkLGFBQWE7d0JBQ2IsaUJBQWlCO3dCQUNqQixRQUFRO3dCQUNSLFlBQVk7d0JBQ1osU0FBUzt3QkFDVCxnQkFBZ0I7d0JBQ2hCLFNBQVM7d0JBQ1QsaUJBQWlCO3dCQUNqQixjQUFjO3dCQUNkLGVBQWU7d0JBQ2YsWUFBWTt3QkFDWixhQUFhO3dCQUNiLE9BQU87cUJBQ1YsbUJBQ2dCLHVCQUF1QixDQUFDLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBzb25hcmpzL25vLW5lc3RlZC10ZW1wbGF0ZS1saXRlcmFscyxAdHlwZXNjcmlwdC1lc2xpbnQvdW5ib3VuZC1tZXRob2QgKi9cblxuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBpbmplY3QsIGlucHV0LCBPbkluaXQsIG91dHB1dCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwLCBGb3Jtc01vZHVsZSwgUmVhY3RpdmVGb3Jtc01vZHVsZSwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gICAgU2NDYXJ0SXRlbSxcbiAgICBTY0NvbnZlcnRlcnNTZXJ2aWNlLFxuICAgIFNjSU5ld0NhcnRJdGVtQmFzZSxcbiAgICBTY0lOZXdDYXJ0SXRlbU1lYXN1cmVkLFxuICAgIFNjUHJvZHVjdCxcbiAgICBTY1VuaXRzSGVscGVyLFxuICAgIFNjVXNlck1ldHJpa2FHb2Fsc0VudW0sXG4gICAgU2NVc2VyTWV0cmlrYVNlcnZpY2UsXG59IGZyb20gJ0BzbmFiY2VudHIvY2xpZW50LWNvcmUnO1xuaW1wb3J0IHsgVHVpQW1vdW50UGlwZSB9IGZyb20gJ0B0YWlnYS11aS9hZGRvbi1jb21tZXJjZSc7XG5pbXBvcnQgeyB0dWlDb250cm9sVmFsdWUsIHR1aU1hcmtDb250cm9sQXNUb3VjaGVkQW5kVmFsaWRhdGUgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aUJ1dHRvbiwgVHVpRXJyb3IsIFR1aUxhYmVsLCBUdWlOdW1iZXJGb3JtYXQsIFR1aVRleHRmaWVsZCB9IGZyb20gJ0B0YWlnYS11aS9jb3JlJztcbmltcG9ydCB7IFR1aUFwcGVhcmFuY2UsIFR1aVdpdGhBcHBlYXJhbmNlIH0gZnJvbSAnQHRhaWdhLXVpL2NvcmUvZGlyZWN0aXZlcy9hcHBlYXJhbmNlJztcbmltcG9ydCB7IFR1aUljb25zLCBUdWlXaXRoSWNvbnMgfSBmcm9tICdAdGFpZ2EtdWkvY29yZS9kaXJlY3RpdmVzL2ljb25zJztcbmltcG9ydCB7IFR1aUJ1dHRvbkxvYWRpbmcsIFR1aUNoaXAsIFR1aUZpZWxkRXJyb3JQaXBlLCBUdWlJbnB1dE51bWJlciB9IGZyb20gJ0B0YWlnYS11aS9raXQnO1xuaW1wb3J0IHsgVHVpSW5wdXRNb2R1bGUgfSBmcm9tICdAdGFpZ2EtdWkvbGVnYWN5JztcbmltcG9ydCB7IGNvbWJpbmVMYXRlc3QsIGRlYm91bmNlVGltZSwgbWFwLCBvZiB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBTY05leHRJbnB1dEZvY3VzTW9kdWxlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9uZXh0LWlucHV0LWZvY3VzL3NjLW5leHQtaW5wdXQtZm9jdXMubW9kdWxlJztcbmltcG9ydCB7IFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vZGlyZWN0aXZlcy9zZWxlY3Qtb24tZm9jdXNpbi9zYy1zZWxlY3Qtb24tZm9jdXNpbi5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgc3RlcFZhbGlkYXRvciB9IGZyb20gJy4uLy4uLy4uL3ZhbGlkYXRvcnMvc3RlcC12YWxpZGF0b3InO1xuXG4vKipcbiAqINCa0L7QvNC/0L7QvdC10L3RgiDQtNC+0LHQsNCy0LvQtdC90LjRjyAvINC40LfQvNC10L3QtdC90LjRjyDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gKi9cbkBDb21wb25lbnQoe1xuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgc2VsZWN0b3I6ICdzYy1hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZm9ybScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWFkZC1vci1lZGl0aW5nLWNhcnQtaXRlbS1mb3JtLmNvbXBvbmVudC5odG1sJyxcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIE5nSWYsXG4gICAgICAgIEZvcm1zTW9kdWxlLFxuICAgICAgICBTY05leHRJbnB1dEZvY3VzTW9kdWxlLFxuICAgICAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgICAgICBUdWlMYWJlbCxcbiAgICAgICAgU2NTZWxlY3RPbkZvY3VzaW5EaXJlY3RpdmUsXG4gICAgICAgIFR1aU51bWJlckZvcm1hdCxcbiAgICAgICAgVHVpRXJyb3IsXG4gICAgICAgIFR1aUlucHV0TW9kdWxlLFxuICAgICAgICBUdWlBcHBlYXJhbmNlLFxuICAgICAgICBUdWlXaXRoQXBwZWFyYW5jZSxcbiAgICAgICAgVHVpSWNvbnMsXG4gICAgICAgIFR1aVdpdGhJY29ucyxcbiAgICAgICAgVHVpQnV0dG9uLFxuICAgICAgICBUdWlCdXR0b25Mb2FkaW5nLFxuICAgICAgICBBc3luY1BpcGUsXG4gICAgICAgIFR1aUZpZWxkRXJyb3JQaXBlLFxuICAgICAgICBUdWlJbnB1dE51bWJlcixcbiAgICAgICAgVHVpTnVtYmVyRm9ybWF0LFxuICAgICAgICBUdWlUZXh0ZmllbGQsXG4gICAgICAgIFR1aUFtb3VudFBpcGUsXG4gICAgICAgIFR1aUNoaXAsXG4gICAgXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgU2NBZGRPckVkaXRpbmdDYXJ0SXRlbUZvcm1Db21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICAgIC8qKlxuICAgICAqINCT0YDRg9C/0L/QsCDQv9C+0LvQtdC5INC00L7QsdCw0LLQu9C10L3QuNGPIC8g0LjQt9C80LXQvdC10L3QuNGPINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybSA9IG5ldyBGb3JtR3JvdXA8e1xuICAgICAgICBsZW5ndGg/OiBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPjtcbiAgICAgICAgcXVhbnRpdHk6IEZvcm1Db250cm9sPG51bWJlciB8IG51bGw+O1xuICAgICAgICBtYXJrZXI6IEZvcm1Db250cm9sPHN0cmluZyB8IG51bGw+O1xuICAgIH0+KHtcbiAgICAgICAgcXVhbnRpdHk6IG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPihudWxsLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgICAgbWFya2VyOiBuZXcgRm9ybUNvbnRyb2w8c3RyaW5nIHwgbnVsbD4oJycpLFxuICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICog0JTQsNC90L3Ri9C1INC+INGC0L7QstCw0YDQtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgcHJvZHVjdCA9IGlucHV0LnJlcXVpcmVkPFNjUHJvZHVjdD4oKTtcblxuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSDQviDRgtC+0LLQsNGA0LUg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGNhcnRJdGVtID0gaW5wdXQ8U2NDYXJ0SXRlbSB8IHVuZGVmaW5lZD4oKTtcblxuICAgIC8qKlxuICAgICAqINCf0YDQuNC30L3QsNC6INC30LDQs9GA0YPQt9C60Lgg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBpc0xvYWRpbmcgPSBpbnB1dChmYWxzZSk7XG5cbiAgICAvKipcbiAgICAgKiDQn9GA0LjQt9C90LDQuiDQstC+0LfQvNC+0LbQvdC+0YHRgtC4INC/0YDQvtC00LDQttC4INGC0L7QstCw0YDQsCDQvdCwINC80LXRgtGA0LDQti5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgcHJvZHVjdElzTWVhc3VyYWJsZSA9IGNvbXB1dGVkKCgpID0+IHRoaXMudW5pdHNIZWxwZXIucHJvZHVjdElzTWVhc3VyYWJsZSh0aGlzLnByb2R1Y3QoKSkpO1xuXG4gICAgLyoqXG4gICAgICog0JrRgNCw0YLQvdC+0YHRgtGMINC60L7Qu9C40YfQtdGB0YLQstCwINC00LvRjyDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHByb2R1Y3RNdWx0aXBsaWNpdHkgPSBjb21wdXRlZCgoKSA9PiB0aGlzLnVuaXRzSGVscGVyLnByb2R1Y3RNdWx0aXBsaWNpdHkodGhpcy5wcm9kdWN0KCkpKTtcblxuICAgIC8qKlxuICAgICAqINCc0LjQvdC40LzQsNC70YzQvdGL0Lkg0LzQtdGC0YDQsNC2INC00LvRjyDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pbkxlbmd0aCA9IGNvbXB1dGVkKFxuICAgICAgICAoKSA9PiB0aGlzLmNhcnRJdGVtKCk/Lmxlbmd0aCA/PyB0aGlzLnByb2R1Y3QoKS5wcm9wZXJ0aWVzPy5taW5MZW5ndGggPz8gKHRoaXMucHJvZHVjdCgpLmlnbm9yZU1pbkNvdW50Q2hlY2sgPyAwIDogdGhpcy5wcm9kdWN0KCkubWluQ291bnQpID8/IDFcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICog0JzQsNC60YHQuNC80LDQu9GM0L3Ri9C5INC80LXRgtGA0LDQtiDQtNC70Y8g0YLQvtCy0LDRgNCwLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCByZWFkb25seSBtYXhMZW5ndGggPSBjb21wdXRlZCgoKSA9PiB0aGlzLnByb2R1Y3QoKS5wcm9wZXJ0aWVzPy5tYXhMZW5ndGgpO1xuXG4gICAgLyoqXG4gICAgICog0KjQsNCzINC40LfQvNC10L3QtdC90LjRjyDQvNC10YLRgNCw0LbQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGVuZ3RoU3RlcCA9IGNvbXB1dGVkKCgpID0+IHRoaXMucHJvZHVjdCgpLnByb3BlcnRpZXM/Lmxlbmd0aFN0ZXAgPz8gKHRoaXMucHJvZHVjdCgpLmlnbm9yZU1pbkNvdW50Q2hlY2sgPyAwIDogdGhpcy5wcm9kdWN0KCkubWluQ291bnQpKTtcblxuICAgIC8qKlxuICAgICAqINCf0L7QtNGB0LrQsNC30LrQsCDQv9C+INC80LjQvdC40LzQsNC70YzQvdC+0LzRgyDQuCDQvNCw0LrRgdC40LzQsNC70YzQvdC+0LzRgyDQvNC10YLRgNCw0LbRgyDRgtC+0LLQsNGA0LAuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGxlbmd0aEhpbnQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG1pbiA9IHRoaXMubWluTGVuZ3RoKCk7XG4gICAgICAgIGNvbnN0IG1heCA9IHRoaXMubWF4TGVuZ3RoKCk7XG5cbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHNvbmFyanMvbm8tbmVzdGVkLWNvbmRpdGlvbmFsLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW5uZWNlc3NhcnktY29uZGl0aW9uXG4gICAgICAgIHJldHVybiAobWluID8/IG1heCkgPyBgKCR7bWluID8gYNC+0YIgJHttaW59YCA6ICcnfSR7bWluICYmIG1heCA/ICcgJyA6ICcnfSR7bWF4ID8gYNC00L4gJHttYXh9YCA6ICcnfSAke3RoaXMucHJvZHVjdCgpLnVuaXR9KWAgOiAnJztcbiAgICB9KTtcblxuICAgIC8qKlxuICAgICAqINCY0YLQvtCz0L7QstCw0Y8g0YHRgtC+0LjQvNC+0YHRgtGMINC30LDQutCw0LfQsC5cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgdG90YWxDb3N0ID0gdG9TaWduYWwoXG4gICAgICAgIGNvbWJpbmVMYXRlc3Qoe1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHVuaWNvcm4vZXhwbGljaXQtbGVuZ3RoLWNoZWNrXG4gICAgICAgICAgICBsZW5ndGg6IHRoaXMuZm9ybS5jb250cm9scy5sZW5ndGggPyB0dWlDb250cm9sVmFsdWU8bnVtYmVyPih0aGlzLmZvcm0uY29udHJvbHMubGVuZ3RoKSA6IG9mKDEpLFxuICAgICAgICAgICAgcXVhbnRpdHk6IHR1aUNvbnRyb2xWYWx1ZTxudW1iZXI+KHRoaXMuZm9ybS5jb250cm9scy5xdWFudGl0eSksXG4gICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICBkZWJvdW5jZVRpbWUoMCksIC8vINCY0YHQv9GA0LDQstC70Y/QtdC8INC+0YjQuNCx0LrRgyBORzA5NTAuXG4gICAgICAgICAgICBtYXAoKHsgbGVuZ3RoLCBxdWFudGl0eSB9KSA9PiAodGhpcy5wcm9kdWN0KCkuY29zdFJ1YiA/PyAwKSAqIGxlbmd0aCAqIHF1YW50aXR5KSxcbiAgICAgICAgICAgIG1hcCgoc3VtKSA9PiBNYXRoLnJvdW5kKHN1bSAqIDEwMCkgLyAxMDApXG4gICAgICAgIClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE91dHB1dH0g0YHQvtCx0YvRgtC40Y8g0LTQvtCx0LDQstC70LXQvdC40Y8g0YLQvtCy0LDRgNCwINCyINC60L7RgNC30LjQvdGDLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBhZGRUb0NhcnQgPSBvdXRwdXQ8U2NJTmV3Q2FydEl0ZW1CYXNlPigpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE91dHB1dH0g0YHQvtCx0YvRgtC40Y8g0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGVkaXRDYXJ0SXRlbSA9IG91dHB1dDxPbWl0PFNjSU5ld0NhcnRJdGVtQmFzZSwgJ3Byb2R1Y3RJZCc+PigpO1xuXG4gICAgLyoqXG4gICAgICog0J7QsdGK0LXQutGCLdC/0L7QvNC+0YnQvdC40Log0LTQu9GPINGA0LDQsdC+0YLRiyDRgdC+INC30L3QsNGH0LXQvdC40Y/QvNC4INC10LTQuNC90LjRhiDQuNC30LzQtdGA0LXQvdC40Y8g0YLQvtCy0LDRgNCwLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgdW5pdHNIZWxwZXI6IFNjVW5pdHNIZWxwZXIgPSBpbmplY3QoU2NVbml0c0hlbHBlcik7XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGB0LHQvtGA0LAg0LzQtdGC0YDQuNC6INC+INC00LXQudGB0YLQstC40Y/RhSDQv9C+0LvRjNC30L7QstCw0YLQtdC70LXQuS5cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IHVzZXJNZXRyaWthU2VydmljZTogU2NVc2VyTWV0cmlrYVNlcnZpY2UgPSBpbmplY3QoU2NVc2VyTWV0cmlrYVNlcnZpY2UpO1xuXG4gICAgLyoqXG4gICAgICog0KHQtdGA0LLQuNGBINC60L7QvdCy0LXRgNGC0LDRhtC40Lgg0LTQsNC90L3Ri9GFLlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY29udmVydGVyc1NlcnZpY2U6IFNjQ29udmVydGVyc1NlcnZpY2UgPSBpbmplY3QoU2NDb252ZXJ0ZXJzU2VydmljZSk7XG5cbiAgICAvKiogQGluaGVyaXREb2MgKi9cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnByb2R1Y3RJc01lYXN1cmFibGUoKSkge1xuICAgICAgICAgICAgdGhpcy5mb3JtLmFkZENvbnRyb2woJ2xlbmd0aCcsIG5ldyBGb3JtQ29udHJvbDxudW1iZXIgfCBudWxsPih0aGlzLm1pbkxlbmd0aCgpLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMC4wMSldKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZvcm0ucGF0Y2hWYWx1ZSh7XG4gICAgICAgICAgICBxdWFudGl0eTogdGhpcy5jYXJ0SXRlbSgpPy5xdWFudGl0eSA/PyB0aGlzLnVuaXRzSGVscGVyLnByb2R1Y3RNdWx0aXBsaWNpdHkodGhpcy5wcm9kdWN0KCkpLFxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmZvcm0uY29udHJvbHMucXVhbnRpdHkuYWRkVmFsaWRhdG9ycyhzdGVwVmFsaWRhdG9yKHRoaXMudW5pdHNIZWxwZXIucHJvZHVjdFN0ZXBGb3JWYWxpZGF0b3IodGhpcy5wcm9kdWN0KCkpKSk7XG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5sZW5ndGg/LmFkZFZhbGlkYXRvcnMoc3RlcFZhbGlkYXRvcih0aGlzLnByb2R1Y3QoKS5wcm9wZXJ0aWVzPy5sZW5ndGhTdGVwID8/ICh0aGlzLnByb2R1Y3QoKS5pZ25vcmVNaW5Db3VudENoZWNrID8gMCA6ICh0aGlzLnByb2R1Y3QoKS5taW5Db3VudCA/PyAwKSkpKTtcblxuICAgICAgICB0aGlzLnVzZXJNZXRyaWthU2VydmljZS5lbWl0VXNlck1ldHJpa2FFdmVudCh7XG4gICAgICAgICAgICB0YXJnZXQ6IFNjVXNlck1ldHJpa2FHb2Fsc0VudW0uY2FydEl0ZW1BZGRTaG93LFxuICAgICAgICAgICAgcGFyYW1zOiB7IHByb2R1Y3RfaWQ6IHRoaXMucHJvZHVjdCgpLmlkIH0sXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqINCe0LHRgNCw0LHQvtGC0YfQuNC6INGB0L7QsdGL0YLQuNGPINGI0LDQs9CwINC80LXRgtGA0LDQttCwLlxuICAgICAqXG4gICAgICogQHBhcmFtIHN0ZXAg0KjQsNCzLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBvblN0ZXBMZW5ndGgoc3RlcDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSB1bmljb3JuL2V4cGxpY2l0LWxlbmd0aC1jaGVja1xuICAgICAgICBpZiAoIXRoaXMucHJvZHVjdElzTWVhc3VyYWJsZSgpIHx8ICF0aGlzLmZvcm0uY29udHJvbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBsZW5ndGggPSB0aGlzLmZvcm0uY29udHJvbHMubGVuZ3RoLnZhbHVlID8/IDA7XG5cbiAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzLmxlbmd0aC5zZXRWYWx1ZShNYXRoLm1heCh0aGlzLm1pbkxlbmd0aCgpLCBsZW5ndGggLSAobGVuZ3RoICUgc3RlcCkgKyBzdGVwKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICog0J7QsdGA0LDQsdC+0YLRh9C40Log0YHQvtCx0YvRgtC40Y8g0YjQsNCz0LAg0LrQvtC70LjRh9C10YHRgtCy0LAuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gc3RlcCDQqNCw0LMuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU3RlcFF1YW50aXR5KHN0ZXA6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBjb25zdCBxdWFudGl0eSA9IHRoaXMuZm9ybS5jb250cm9scy5xdWFudGl0eS52YWx1ZSA/PyAwO1xuXG4gICAgICAgIHRoaXMuZm9ybS5jb250cm9scy5xdWFudGl0eS5zZXRWYWx1ZShNYXRoLm1heCh0aGlzLnByb2R1Y3RNdWx0aXBsaWNpdHkoKSwgcXVhbnRpdHkgLSAocXVhbnRpdHkgJSBzdGVwKSArIHN0ZXApKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiDQntCx0YDQsNCx0L7RgtGH0LjQuiDRgdC+0LHRi9GC0LjRjyDQvtGC0L/RgNCw0LLQutC4INGE0L7RgNC80YsuXG4gICAgICovXG4gICAgcHJvdGVjdGVkIG9uU3VibWl0KCk6IHZvaWQge1xuICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuY29udmVydGVyc1NlcnZpY2UucmVtb3ZlTnVsbDxTY0lOZXdDYXJ0SXRlbU1lYXN1cmVkPih0aGlzLmZvcm0udmFsdWUgYXMgU2NJTmV3Q2FydEl0ZW1NZWFzdXJlZCk7XG5cbiAgICAgICAgaWYgKCF0aGlzLmNhcnRJdGVtKCkpIHtcbiAgICAgICAgICAgIHZhbHVlLnByb2R1Y3RJZCA9IHRoaXMucHJvZHVjdCgpLmlkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgc3RlcCA9IHRoaXMubGVuZ3RoU3RlcCgpO1xuXG4gICAgICAgIGlmICh0aGlzLnByb2R1Y3RJc01lYXN1cmFibGUoKSAmJiBzdGVwKSB7XG4gICAgICAgICAgICB2YWx1ZS5xdWFudGl0eSA9IE1hdGgucm91bmQodmFsdWUucXVhbnRpdHkgKiAodmFsdWUubGVuZ3RoIC8gc3RlcCkpO1xuICAgICAgICAgICAgdmFsdWUubGVuZ3RoID0gc3RlcDtcbiAgICAgICAgfVxuXG4gICAgICAgIHR1aU1hcmtDb250cm9sQXNUb3VjaGVkQW5kVmFsaWRhdGUodGhpcy5mb3JtKTtcblxuICAgICAgICBpZiAodGhpcy5jYXJ0SXRlbSgpKSB7XG4gICAgICAgICAgICB0aGlzLmVkaXRDYXJ0SXRlbS5lbWl0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYWRkVG9DYXJ0LmVtaXQodmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiPCEtLSDQpNC+0YDQvNCwINC00L7QsdCw0LLQu9C10L3QuNGPINC40LfQvNC10YDRj9C10LzQvtCz0L4g0YLQvtCy0LDRgNCwLiAtLT5cbjxmb3JtXG4gICAgKm5nSWY9XCJwcm9kdWN0XCJcbiAgICBbZm9ybUdyb3VwXT1cImZvcm1cIlxuICAgIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdCgpXCJcbiAgICBTY05leHRJbnB1dEZvY3VzXG4gICAgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCJcbj5cbiAgICA8IS0tINCU0LvQuNC90LAg0YLQvtCy0LDRgNCwICjQvNC10YLRgNCw0LYpIC0tPlxuICAgIDxsYWJlbFxuICAgICAgICAqbmdJZj1cInByb2R1Y3RJc01lYXN1cmFibGUoKVwiXG4gICAgICAgIHR1aUxhYmVsXG4gICAgPlxuICAgICAgICDQnNC10YLRgNCw0LYsIHt7IHByb2R1Y3QoKS51bml0IH19IHt7IGxlbmd0aEhpbnQoKSB9fVxuXG4gICAgICAgIDx0dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgdHVpSW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJsZW5ndGhcIlxuICAgICAgICAgICAgICAgIFt0dWlOdW1iZXJGb3JtYXRdPVwieyBwcmVjaXNpb246IDIgfVwiXG4gICAgICAgICAgICAgICAgW21heF09XCJtYXhMZW5ndGgoKSB8fCBudWxsXCJcbiAgICAgICAgICAgICAgICBbbWluXT1cIm1pbkxlbmd0aCgpIHx8IG51bGxcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93RG93bik9XCJvblN0ZXBMZW5ndGgoLShsZW5ndGhTdGVwKCkgPz8gMC4wMSkpXCJcbiAgICAgICAgICAgICAgICAoa2V5ZG93bi5hcnJvd1VwKT1cIm9uU3RlcExlbmd0aChsZW5ndGhTdGVwKCkgPz8gMC4wMSlcIlxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cImxlbmd0aFwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3R1aS10ZXh0ZmllbGQ+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxlbmd0aFwiXG4gICAgICAgICAgICBbZXJyb3JdPVwiW10gfCB0dWlGaWVsZEVycm9yIHwgYXN5bmNcIlxuICAgICAgICAvPlxuICAgICAgICA8cFxuICAgICAgICAgICAgKm5nSWY9XCJsZW5ndGhTdGVwKClcIlxuICAgICAgICAgICAgY2xhc3M9XCJ0dWktZm9ybV9fZmllbGQtbm90ZVwiXG4gICAgICAgID5cbiAgICAgICAgICAgINCc0LXRgtGA0LDQtiDQtNC+0LvQttC10L0g0LHRi9GC0Ywg0LrRgNCw0YLQtdC9IHt7IGxlbmd0aFN0ZXAoKSB9fVxuICAgICAgICA8L3A+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0JrQvtC70LjRh9C10YHRgtCy0L4g0YLQvtCy0LDRgNCwIC0tPlxuICAgIDxsYWJlbCB0dWlMYWJlbD5cbiAgICAgICAg0JrQvtC70LjRh9C10YHRgtCy0L4sINGI0YIuXG4gICAgICAgIDx0dWktdGV4dGZpZWxkPlxuICAgICAgICAgICAgQGxldCBzdGVwID0gbGVuZ3RoU3RlcCgpO1xuICAgICAgICAgICAgPHR1aS1jaGlwXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJwcm9kdWN0TXVsdGlwbGljaXR5KCkgJiYgc3RlcFwiXG4gICAgICAgICAgICAgICAgc2l6ZT1cInNcIlxuICAgICAgICAgICAgICAgIGFwcGVhcmFuY2U9XCJuZWdhdGl2ZVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb250LWJvbGRcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHgge3sgc3RlcCB9fSB7eyBwcm9kdWN0KCkudW5pdCB9fVxuICAgICAgICAgICAgPC90dWktY2hpcD5cblxuICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCLQmtC+0LvQuNGH0LXRgdGC0LLQvlwiXG4gICAgICAgICAgICAgICAgdHVpSW5wdXROdW1iZXJcbiAgICAgICAgICAgICAgICBbdHVpTnVtYmVyRm9ybWF0XT1cInsgZGVjaW1hbE1vZGU6ICdub3QtemVybycgfVwiXG4gICAgICAgICAgICAgICAgW21pbl09XCJwcm9kdWN0TXVsdGlwbGljaXR5KClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmFycm93RG93bik9XCJvblN0ZXBRdWFudGl0eSgtcHJvZHVjdE11bHRpcGxpY2l0eSgpKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uYXJyb3dVcCk9XCJvblN0ZXBRdWFudGl0eShwcm9kdWN0TXVsdGlwbGljaXR5KCkpXCJcbiAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJxdWFudGl0eVwiXG4gICAgICAgICAgICAgICAgYXV0b2NvbXBsZXRlPVwicXVhbnRpdHlcIlxuICAgICAgICAgICAgLz5cbiAgICAgICAgPC90dWktdGV4dGZpZWxkPlxuICAgICAgICA8cCBjbGFzcz1cInR1aS1mb3JtX19maWVsZC1ub3RlXCI+0JrQvtC70LjRh9C10YHRgtCy0L4g0LTQvtC70LbQvdC+INCx0YvRgtGMINC60YDQsNGC0L3QviB7eyBwcm9kdWN0TXVsdGlwbGljaXR5KCkgfX08L3A+XG4gICAgICAgIDx0dWktZXJyb3JcbiAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cInF1YW50aXR5XCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0JzQsNGA0LrQuNGA0L7QstC60LAgLS0+XG4gICAgPGxhYmVsIHR1aUxhYmVsPlxuICAgICAgICDQnNCw0YDQutC40YDQvtCy0LrQsFxuICAgICAgICA8dHVpLWlucHV0IGZvcm1Db250cm9sTmFtZT1cIm1hcmtlclwiPlxuICAgICAgICAgICAg0JzQsNGA0LrQuNGA0L7QstC60LBcbiAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgIHR1aVRleHRmaWVsZExlZ2FjeVxuICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm1hcmtlclwiXG4gICAgICAgICAgICAvPlxuICAgICAgICA8L3R1aS1pbnB1dD5cbiAgICAgICAgPHR1aS1lcnJvclxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwibWFya2VyXCJcbiAgICAgICAgICAgIFtlcnJvcl09XCJbXSB8IHR1aUZpZWxkRXJyb3IgfCBhc3luY1wiXG4gICAgICAgIC8+XG4gICAgPC9sYWJlbD5cblxuICAgIDwhLS0g0JrQvdC+0L/QutCwINC00L7QsdCw0LLQu9C10L3QuNGPIC8g0YDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjRjyDRgtC+0LLQsNGA0LAg0LIg0LrQvtGA0LfQuNC90YMgLS0+XG4gICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgIEBsZXQgY29zdCA9IHRvdGFsQ29zdCgpO1xuXG4gICAgICAgIDxkaXYgKm5nSWY9XCJjb3N0XCI+XG4gICAgICAgICAgICDQmNGC0L7Qs9C+OjxzcGFuIGNsYXNzPVwidGV4dC0yeGwgZm9udC1ib2xkXCI+XG4gICAgICAgICAgICAgICAge3sgY29zdCB8IHR1aUFtb3VudDogJ1JVQicgfCBhc3luYyB9fVxuICAgICAgICAgICAgICAgIHt7IHByb2R1Y3QoKS5jdXJyZW5jeSB9fTwvc3BhblxuICAgICAgICAgICAgPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tINCa0L3QvtC/0LrQsCDQtNC+0LHQsNCy0LvQtdC90LjRjyAvINGA0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40Y8g0YLQvtCy0LDRgNCwINCyINC60L7RgNC30LjQvdGDIC0tPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICB0dWlCdXR0b25cbiAgICAgICAgICAgIGljb25TdGFydD1cIkB0dWkuY2hlY2tcIlxuICAgICAgICAgICAgW2Rpc2FibGVkXT1cImZvcm0uaW52YWxpZFwiXG4gICAgICAgICAgICBbbG9hZGluZ109XCJpc0xvYWRpbmcoKVwiXG4gICAgICAgICAgICB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgIGNsYXNzPVwibXQtMlwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IGNhcnRJdGVtKCkgPyAn0JjQt9C80LXQvdC40YLRjCcgOiAn0JTQvtCx0LDQstC40YLRjCDQsiDQutC+0YDQt9C40L3RgycgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG48L2Zvcm0+XG4iXX0=
|
@@ -0,0 +1,3 @@
|
|
1
|
+
export * from './add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component';
|
2
|
+
export * from './sc-add-or-editing-cart-item-dialog.component';
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZGlhbG9nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsNEVBQTRFLENBQUM7QUFDM0YsY0FBYyxnREFBZ0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0vc2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWRpYWxvZy5jb21wb25lbnQnO1xuIl19
|
@@ -0,0 +1,74 @@
|
|
1
|
+
/* eslint-disable sonarjs/no-nested-template-literals,@typescript-eslint/unbound-method,@typescript-eslint/no-unused-vars */
|
2
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
3
|
+
import { ChangeDetectionStrategy, Component, inject, viewChild } from '@angular/core';
|
4
|
+
import { toSignal } from '@angular/core/rxjs-interop';
|
5
|
+
import { ScCartService } from '@snabcentr/client-core';
|
6
|
+
import { tuiIsFalsy } from '@taiga-ui/cdk';
|
7
|
+
import { injectContext } from '@taiga-ui/polymorpheus';
|
8
|
+
import { isObject } from 'lodash-es';
|
9
|
+
import { catchError, map, of, share, startWith, Subject, switchMap, tap } from 'rxjs';
|
10
|
+
import { ScAddOrEditingCartItemFormComponent } from './add-or-editing-cart-item-form/sc-add-or-editing-cart-item-form.component';
|
11
|
+
import * as i0 from "@angular/core";
|
12
|
+
/**
|
13
|
+
* Компонент добавления / изменения товара в корзине.
|
14
|
+
*/
|
15
|
+
export class ScAddOrEditingCartItemDialogComponent {
|
16
|
+
constructor() {
|
17
|
+
/**
|
18
|
+
* Компонент формы добавления / изменения товара в корзине.
|
19
|
+
*/
|
20
|
+
this.formComponent = viewChild.required(ScAddOrEditingCartItemFormComponent);
|
21
|
+
/**
|
22
|
+
* {@link Subject} события отправки формы.
|
23
|
+
*/
|
24
|
+
this.onSubmit = new Subject();
|
25
|
+
/**
|
26
|
+
* {@link Observable} запроса добавления / изменения товара в корзине.
|
27
|
+
*/
|
28
|
+
this.submit$ = this.onSubmit.pipe(switchMap((value) => (this.cartItem && !('productId' in value) ? this.cartService.patchCartItem$(this.cartItem.id, value) : this.cartService.addToCart$(value)).pipe(tap(() => {
|
29
|
+
this.context.$implicit.complete();
|
30
|
+
}), catchError((error) => {
|
31
|
+
if (error instanceof HttpErrorResponse) {
|
32
|
+
const { errors, message } = error.error;
|
33
|
+
if (errors && isObject(errors)) {
|
34
|
+
Object.entries(errors).forEach(([k, v]) => {
|
35
|
+
this.formComponent().form.get(k)?.setErrors({ serverResponse: v });
|
36
|
+
});
|
37
|
+
}
|
38
|
+
if (message) {
|
39
|
+
this.formComponent().form.setErrors({ serverResponse: [message] });
|
40
|
+
}
|
41
|
+
this.formComponent().form.updateValueAndValidity();
|
42
|
+
this.formComponent().form.markAsDirty();
|
43
|
+
}
|
44
|
+
return of();
|
45
|
+
}), startWith(null))), startWith(), share());
|
46
|
+
/**
|
47
|
+
* {@link Observable} изменения состояния загрузки данных.
|
48
|
+
*/
|
49
|
+
this.loading = toSignal(this.submit$.pipe(map(tuiIsFalsy)), { initialValue: false });
|
50
|
+
/**
|
51
|
+
* Контекст диалогового окна.
|
52
|
+
*/
|
53
|
+
this.context = injectContext();
|
54
|
+
/**
|
55
|
+
* Данные о товаре.
|
56
|
+
*/
|
57
|
+
this.product = this.context.data.product;
|
58
|
+
/**
|
59
|
+
* Данные о товаре в корзине.
|
60
|
+
*/
|
61
|
+
this.cartItem = this.context.data.cartItem;
|
62
|
+
/**
|
63
|
+
* Сервис для работы с корзиной.
|
64
|
+
*/
|
65
|
+
this.cartService = inject(ScCartService);
|
66
|
+
}
|
67
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScAddOrEditingCartItemDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
68
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: ScAddOrEditingCartItemDialogComponent, isStandalone: true, selector: "sc-add-or-editing-cart-item-dialog", viewQueries: [{ propertyName: "formComponent", first: true, predicate: ScAddOrEditingCartItemFormComponent, descendants: true, isSignal: true }], ngImport: i0, template: "@if (product) {\n <sc-add-or-editing-cart-item-form\n [product]=\"product\"\n [cartItem]=\"cartItem\"\n (addToCart)=\"onSubmit.next($event)\"\n (editCartItem)=\"onSubmit.next($event)\"\n [isLoading]=\"loading()\"\n ></sc-add-or-editing-cart-item-form>\n}\n", dependencies: [{ kind: "component", type: ScAddOrEditingCartItemFormComponent, selector: "sc-add-or-editing-cart-item-form", inputs: ["product", "cartItem", "isLoading"], outputs: ["addToCart", "editCartItem"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
69
|
+
}
|
70
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScAddOrEditingCartItemDialogComponent, decorators: [{
|
71
|
+
type: Component,
|
72
|
+
args: [{ standalone: true, selector: 'sc-add-or-editing-cart-item-dialog', imports: [ScAddOrEditingCartItemFormComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (product) {\n <sc-add-or-editing-cart-item-form\n [product]=\"product\"\n [cartItem]=\"cartItem\"\n (addToCart)=\"onSubmit.next($event)\"\n (editCartItem)=\"onSubmit.next($event)\"\n [isLoading]=\"loading()\"\n ></sc-add-or-editing-cart-item-form>\n}\n" }]
|
73
|
+
}] });
|
74
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWRpYWxvZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZGlhbG9nL3NjLWFkZC1vci1lZGl0aW5nLWNhcnQtaXRlbS1kaWFsb2cuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2NhcnQvYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWRpYWxvZy9zYy1hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZGlhbG9nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLDRIQUE0SDtBQUU1SCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDOUYsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3RELE9BQU8sRUFBYyxhQUFhLEVBQWlDLE1BQU0sd0JBQXdCLENBQUM7QUFDbEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUdsRyxPQUFPLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSw0RUFBNEUsQ0FBQzs7QUFFakk7O0dBRUc7QUFRSCxNQUFNLE9BQU8scUNBQXFDO0lB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QUFvQyxXQUVyQyxDQUFDLG1DQUFtQyxDQUFDLG1CQUM3Qix1QkFBdUIsQ0FBQyxNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLyogZXNsaW50LWRpc2FibGUgc29uYXJqcy9uby1uZXN0ZWQtdGVtcGxhdGUtbGl0ZXJhbHMsQHR5cGVzY3JpcHQtZXNsaW50L3VuYm91bmQtbWV0aG9kLEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG5pbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGluamVjdCwgU2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgU2NDYXJ0SXRlbSwgU2NDYXJ0U2VydmljZSwgU2NJTmV3Q2FydEl0ZW1CYXNlLCBTY1Byb2R1Y3QgfSBmcm9tICdAc25hYmNlbnRyL2NsaWVudC1jb3JlJztcbmltcG9ydCB7IHR1aUlzRmFsc3kgfSBmcm9tICdAdGFpZ2EtdWkvY2RrJztcbmltcG9ydCB7IFR1aURpYWxvZ0NvbnRleHQgfSBmcm9tICdAdGFpZ2EtdWkvY29yZSc7XG5pbXBvcnQgeyBpbmplY3RDb250ZXh0IH0gZnJvbSAnQHRhaWdhLXVpL3BvbHltb3JwaGV1cyc7XG5pbXBvcnQgeyBpc09iamVjdCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBjYXRjaEVycm9yLCBtYXAsIE9ic2VydmFibGUsIG9mLCBzaGFyZSwgc3RhcnRXaXRoLCBTdWJqZWN0LCBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcGlFcnJvclJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vYXV0aC9pbnRlcmZhY2VzL2FwaS1lcnJvci1yZXNwb25zZSc7XG5pbXBvcnQgeyBTY0FkZE9yRWRpdGluZ0NhcnRJdGVtRm9ybUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0vc2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0uY29tcG9uZW50JztcblxuLyoqXG4gKiDQmtC+0LzQv9C+0L3QtdC90YIg0LTQvtCx0LDQstC70LXQvdC40Y8gLyDQuNC30LzQtdC90LXQvdC40Y8g0YLQvtCy0LDRgNCwINCyINC60L7RgNC30LjQvdC1LlxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIHNlbGVjdG9yOiAnc2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWRpYWxvZycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NjLWFkZC1vci1lZGl0aW5nLWNhcnQtaXRlbS1kaWFsb2cuY29tcG9uZW50Lmh0bWwnLFxuICAgIGltcG9ydHM6IFtTY0FkZE9yRWRpdGluZ0NhcnRJdGVtRm9ybUNvbXBvbmVudF0sXG4gICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG59KVxuZXhwb3J0IGNsYXNzIFNjQWRkT3JFZGl0aW5nQ2FydEl0ZW1EaWFsb2dDb21wb25lbnQge1xuICAgIC8qKlxuICAgICAqINCa0L7QvNC/0L7QvdC10L3RgiDRhNC+0YDQvNGLINC00L7QsdCw0LLQu9C10L3QuNGPIC8g0LjQt9C80LXQvdC10L3QuNGPINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZm9ybUNvbXBvbmVudCA9IHZpZXdDaGlsZC5yZXF1aXJlZDxTY0FkZE9yRWRpdGluZ0NhcnRJdGVtRm9ybUNvbXBvbmVudD4oU2NBZGRPckVkaXRpbmdDYXJ0SXRlbUZvcm1Db21wb25lbnQpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIFN1YmplY3R9INGB0L7QsdGL0YLQuNGPINC+0YLQv9GA0LDQstC60Lgg0YTQvtGA0LzRiy5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgb25TdWJtaXQ6IFN1YmplY3Q8U2NJTmV3Q2FydEl0ZW1CYXNlIHwgT21pdDxTY0lOZXdDYXJ0SXRlbUJhc2UsICdwcm9kdWN0SWQnPj4gPSBuZXcgU3ViamVjdDxTY0lOZXdDYXJ0SXRlbUJhc2UgfCBPbWl0PFNjSU5ld0NhcnRJdGVtQmFzZSwgJ3Byb2R1Y3RJZCc+PigpO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC30LDQv9GA0L7RgdCwINC00L7QsdCw0LLQu9C10L3QuNGPIC8g0LjQt9C80LXQvdC10L3QuNGPINGC0L7QstCw0YDQsCDQsiDQutC+0YDQt9C40L3QtS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3VibWl0JCA9IHRoaXMub25TdWJtaXQucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh2YWx1ZSkgPT5cbiAgICAgICAgICAgICh0aGlzLmNhcnRJdGVtICYmICEoJ3Byb2R1Y3RJZCcgaW4gdmFsdWUpID8gdGhpcy5jYXJ0U2VydmljZS5wYXRjaENhcnRJdGVtJCh0aGlzLmNhcnRJdGVtLmlkLCB2YWx1ZSkgOiB0aGlzLmNhcnRTZXJ2aWNlLmFkZFRvQ2FydCQodmFsdWUgYXMgU2NJTmV3Q2FydEl0ZW1CYXNlKSkucGlwZShcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQuJGltcGxpY2l0LmNvbXBsZXRlKCk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgZXJyb3JzLCBtZXNzYWdlIH0gPSBlcnJvci5lcnJvciBhcyBBcGlFcnJvclJlc3BvbnNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3JzICYmIGlzT2JqZWN0KGVycm9ycykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZW50cmllcyhlcnJvcnMpLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db21wb25lbnQoKS5mb3JtLmdldChrKT8uc2V0RXJyb3JzKHsgc2VydmVyUmVzcG9uc2U6IHYgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtQ29tcG9uZW50KCkuZm9ybS5zZXRFcnJvcnMoeyBzZXJ2ZXJSZXNwb25zZTogW21lc3NhZ2VdIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1Db21wb25lbnQoKS5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybUNvbXBvbmVudCgpLmZvcm0ubWFya0FzRGlydHkoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzdGFydFdpdGgobnVsbClcbiAgICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgICAgc3RhcnRXaXRoKCksXG4gICAgICAgIHNoYXJlKClcbiAgICApO1xuXG4gICAgLyoqXG4gICAgICoge0BsaW5rIE9ic2VydmFibGV9INC40LfQvNC10L3QtdC90LjRjyDRgdC+0YHRgtC+0Y/QvdC40Y8g0LfQsNCz0YDRg9C30LrQuCDQtNCw0L3QvdGL0YUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGxvYWRpbmc6IFNpZ25hbDxib29sZWFuPiA9IHRvU2lnbmFsKHRoaXMuc3VibWl0JC5waXBlKG1hcCh0dWlJc0ZhbHN5KSksIHsgaW5pdGlhbFZhbHVlOiBmYWxzZSB9KTtcblxuICAgIC8qKlxuICAgICAqINCa0L7QvdGC0LXQutGB0YIg0LTQuNCw0LvQvtCz0L7QstC+0LPQviDQvtC60L3QsC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgY29udGV4dCA9IGluamVjdENvbnRleHQ8VHVpRGlhbG9nQ29udGV4dDxib29sZWFuLCB7IHByb2R1Y3Q6IFNjUHJvZHVjdDsgY2FydEl0ZW06IFNjQ2FydEl0ZW0gfCB1bmRlZmluZWQgfT4+KCk7XG5cbiAgICAvKipcbiAgICAgKiDQlNCw0L3QvdGL0LUg0L4g0YLQvtCy0LDRgNC1LlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBwcm9kdWN0ID0gdGhpcy5jb250ZXh0LmRhdGEucHJvZHVjdDtcblxuICAgIC8qKlxuICAgICAqINCU0LDQvdC90YvQtSDQviDRgtC+0LLQsNGA0LUg0LIg0LrQvtGA0LfQuNC90LUuXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IGNhcnRJdGVtID0gdGhpcy5jb250ZXh0LmRhdGEuY2FydEl0ZW07XG5cbiAgICAvKipcbiAgICAgKiDQodC10YDQstC40YEg0LTQu9GPINGA0LDQsdC+0YLRiyDRgSDQutC+0YDQt9C40L3QvtC5LlxuICAgICAqL1xuICAgIHByaXZhdGUgcmVhZG9ubHkgY2FydFNlcnZpY2U6IFNjQ2FydFNlcnZpY2UgPSBpbmplY3QoU2NDYXJ0U2VydmljZSk7XG59XG4iLCJAaWYgKHByb2R1Y3QpIHtcbiAgICA8c2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm1cbiAgICAgICAgW3Byb2R1Y3RdPVwicHJvZHVjdFwiXG4gICAgICAgIFtjYXJ0SXRlbV09XCJjYXJ0SXRlbVwiXG4gICAgICAgIChhZGRUb0NhcnQpPVwib25TdWJtaXQubmV4dCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRDYXJ0SXRlbSk9XCJvblN1Ym1pdC5uZXh0KCRldmVudClcIlxuICAgICAgICBbaXNMb2FkaW5nXT1cImxvYWRpbmcoKVwiXG4gICAgPjwvc2MtYWRkLW9yLWVkaXRpbmctY2FydC1pdGVtLWZvcm0+XG59XG4iXX0=
|
package/esm2022/cart/index.mjs
CHANGED
@@ -1,3 +1,4 @@
|
|
1
1
|
export * from './cart-item/sc-cart-item.component';
|
2
2
|
export * from './sc-car-add-products-from-csv-dialog/sc-car-add-products-from-csv-dialog.component';
|
3
|
-
|
3
|
+
export * from './add-or-editing-cart-item-dialog';
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvY2FydC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG9DQUFvQyxDQUFDO0FBQ25ELGNBQWMscUZBQXFGLENBQUM7QUFDcEcsY0FBYyxtQ0FBbUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY2FydC1pdGVtL3NjLWNhcnQtaXRlbS5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zYy1jYXItYWRkLXByb2R1Y3RzLWZyb20tY3N2LWRpYWxvZy9zYy1jYXItYWRkLXByb2R1Y3RzLWZyb20tY3N2LWRpYWxvZy5jb21wb25lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9hZGQtb3ItZWRpdGluZy1jYXJ0LWl0ZW0tZGlhbG9nJztcbiJdfQ==
|
@@ -4,4 +4,5 @@ export * from './abstract-price-card/abstract-sc-price-card.directive';
|
|
4
4
|
export * from './terminal-link/sc-terminal-link.directive';
|
5
5
|
export * from './links';
|
6
6
|
export * from './sc-date-value-transformer.directive';
|
7
|
-
|
7
|
+
export * from './select-on-focusin/sc-select-on-focusin.directive';
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGllbnQtdWkvZGlyZWN0aXZlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGtEQUFrRCxDQUFDO0FBQ2pFLGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyx3REFBd0QsQ0FBQztBQUN2RSxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyxvREFBb0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vbmV4dC1pbnB1dC1mb2N1cy9zYy1uZXh0LWlucHV0LWZvY3VzLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL25leHQtaW5wdXQtZm9jdXMvc2MtbmV4dC1pbnB1dC1mb2N1cy5tb2R1bGUnO1xuZXhwb3J0ICogZnJvbSAnLi9hYnN0cmFjdC1wcmljZS1jYXJkL2Fic3RyYWN0LXNjLXByaWNlLWNhcmQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vdGVybWluYWwtbGluay9zYy10ZXJtaW5hbC1saW5rLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpbmtzJztcbmV4cG9ydCAqIGZyb20gJy4vc2MtZGF0ZS12YWx1ZS10cmFuc2Zvcm1lci5kaXJlY3RpdmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zZWxlY3Qtb24tZm9jdXNpbi9zYy1zZWxlY3Qtb24tZm9jdXNpbi5kaXJlY3RpdmUnO1xuIl19
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { Directive } from '@angular/core';
|
2
|
+
import * as i0 from "@angular/core";
|
3
|
+
/**
|
4
|
+
* Директива для обработки события фокуса поля ввода, для последующего выделения содержимого поля ввода.
|
5
|
+
*/
|
6
|
+
export class ScSelectOnFocusinDirective {
|
7
|
+
/**
|
8
|
+
* Слушатель и обработчик события `focusin`.
|
9
|
+
*
|
10
|
+
* @param target Целевой объект события `focusin`.
|
11
|
+
*/
|
12
|
+
// eslint-disable-next-line class-methods-use-this
|
13
|
+
onFocusIn(target) {
|
14
|
+
if (target instanceof HTMLInputElement) {
|
15
|
+
target.select();
|
16
|
+
}
|
17
|
+
}
|
18
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScSelectOnFocusinDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
19
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: ScSelectOnFocusinDirective, isStandalone: true, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber]", host: { listeners: { "focusin": "onFocusIn($event.target)" } }, ngImport: i0 }); }
|
20
|
+
}
|
21
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: ScSelectOnFocusinDirective, decorators: [{
|
22
|
+
type: Directive,
|
23
|
+
args: [{
|
24
|
+
standalone: true,
|
25
|
+
selector: 'tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber]',
|
26
|
+
host: {
|
27
|
+
'(focusin)': 'onFocusIn($event.target)',
|
28
|
+
},
|
29
|
+
}]
|
30
|
+
}] });
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Mtc2VsZWN0LW9uLWZvY3VzaW4uZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpZW50LXVpL2RpcmVjdGl2ZXMvc2VsZWN0LW9uLWZvY3VzaW4vc2Mtc2VsZWN0LW9uLWZvY3VzaW4uZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7O0FBRTFDOztHQUVHO0FBUUgsTUFBTSxPQUFPLDBCQUEwQjtJQUNuQzs7OztPQUlHO0lBQ0gsa0RBQWtEO0lBQ3hDLFNBQVMsQ0FBQyxNQUFtQjtRQUNuQyxJQUFJLE1BQU0sWUFBWSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3JDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNwQixDQUFDO0lBQ0wsQ0FBQzsrR0FYUSwwQkFBMEI7bUdBQTFCLDBCQUEwQjs7NEZBQTFCLDBCQUEwQjtrQkFQdEMsU0FBUzttQkFBQztvQkFDUCxVQUFVLEVBQUUsSUFBSTtvQkFDaEIsUUFBUSxFQUFFLHlHQUF5RztvQkFDbkgsSUFBSSxFQUFFO3dCQUNGLFdBQVcsRUFBRSwwQkFBMEI7cUJBQzFDO2lCQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8qKlxuICog0JTQuNGA0LXQutGC0LjQstCwINC00LvRjyDQvtCx0YDQsNCx0L7RgtC60Lgg0YHQvtCx0YvRgtC40Y8g0YTQvtC60YPRgdCwINC/0L7Qu9GPINCy0LLQvtC00LAsINC00LvRjyDQv9C+0YHQu9C10LTRg9GO0YnQtdCz0L4g0LLRi9C00LXQu9C10L3QuNGPINGB0L7QtNC10YDQttC40LzQvtCz0L4g0L/QvtC70Y8g0LLQstC+0LTQsC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBzZWxlY3RvcjogJ3R1aS1pbnB1dC1udW1iZXIsIHR1aS1pbnB1dCwgdHVpLWlucHV0LXBob25lLCB0dWktaW5wdXQtZGF0ZSwgdHVpLWlucHV0LXBhc3N3b3JkLCBpbnB1dFt0dWlJbnB1dE51bWJlcl0nLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgJyhmb2N1c2luKSc6ICdvbkZvY3VzSW4oJGV2ZW50LnRhcmdldCknLFxuICAgIH0sXG59KVxuZXhwb3J0IGNsYXNzIFNjU2VsZWN0T25Gb2N1c2luRGlyZWN0aXZlIHtcbiAgICAvKipcbiAgICAgKiDQodC70YPRiNCw0YLQtdC70Ywg0Lgg0L7QsdGA0LDQsdC+0YLRh9C40Log0YHQvtCx0YvRgtC40Y8gYGZvY3VzaW5gLlxuICAgICAqXG4gICAgICogQHBhcmFtIHRhcmdldCDQptC10LvQtdCy0L7QuSDQvtCx0YrQtdC60YIg0YHQvtCx0YvRgtC40Y8gYGZvY3VzaW5gLlxuICAgICAqL1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gICAgcHJvdGVjdGVkIG9uRm9jdXNJbih0YXJnZXQ6IEhUTUxFbGVtZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50KSB7XG4gICAgICAgICAgICB0YXJnZXQuc2VsZWN0KCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=
|