@snabcentr/client-ui 3.7.0 → 3.8.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.
Potentially problematic release.
This version of @snabcentr/client-ui might be problematic. Click here for more details.
- package/contacts/sc-contacts.module.d.ts +4 -4
- package/directives/index.d.ts +1 -2
- package/directives/links/index.d.ts +4 -0
- package/directives/links/sc-email-link.directive.d.ts +25 -0
- package/directives/links/sc-link-location.d.ts +5 -0
- package/directives/links/sc-links.d.ts +7 -0
- package/directives/{tel-link → links}/sc-tel-link.directive.d.ts +15 -2
- package/error-handler/consts/error-change-handler.providers.d.ts +5 -0
- package/error-handler/error-block-status/error-block-status.component.d.ts +37 -0
- package/error-handler/index.d.ts +4 -0
- package/error-handler/interfaces/i-block-error.d.ts +17 -0
- package/error-handler/sc-error-handler.component.d.ts +40 -0
- package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +5 -5
- package/esm2022/contacts/sc-contacts.module.mjs +7 -11
- package/esm2022/directives/index.mjs +2 -3
- package/esm2022/directives/links/index.mjs +5 -0
- package/esm2022/directives/links/sc-email-link.directive.mjs +49 -0
- package/esm2022/directives/links/sc-link-location.mjs +2 -0
- package/esm2022/directives/links/sc-links.mjs +8 -0
- package/esm2022/directives/links/sc-tel-link.directive.mjs +79 -0
- package/esm2022/error-handler/consts/error-change-handler.providers.mjs +8 -0
- package/esm2022/error-handler/error-block-status/error-block-status.component.mjs +76 -0
- package/esm2022/error-handler/index.mjs +5 -0
- package/esm2022/error-handler/interfaces/i-block-error.mjs +2 -0
- package/esm2022/error-handler/sc-error-handler.component.mjs +58 -0
- package/esm2022/pipes/sc-formatted-phone.mjs +2 -2
- package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +9 -8
- package/esm2022/profile/sc-profile.module.mjs +7 -8
- package/esm2022/public-api.mjs +2 -1
- package/esm2022/user/sc-user.module.mjs +7 -7
- package/esm2022/user/user-managers/sc-user-managers.component.mjs +6 -5
- package/fesm2022/snabcentr-client-ui.mjs +648 -475
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/profile/sc-profile.module.d.ts +5 -3
- package/public-api.d.ts +1 -0
- package/release_notes.tmp +5 -5
- package/styles/taiga/snabcentr-tailwind-preset.js +10 -0
- package/styles/tailwind/tailwind.scss +62 -0
- package/user/sc-user.module.d.ts +4 -2
- package/directives/tel-link/sc-tel-link.module.d.ts +0 -11
- package/esm2022/directives/tel-link/sc-tel-link.directive.mjs +0 -58
- package/esm2022/directives/tel-link/sc-tel-link.module.mjs +0 -20
@@ -1,38 +1,38 @@
|
|
1
1
|
import * as i0 from '@angular/core';
|
2
|
-
import { EventEmitter, Component, ChangeDetectionStrategy, Inject, Input, Output, inject, DestroyRef, SkipSelf, Directive, HostBinding, ContentChild, ViewChild, NgModule,
|
2
|
+
import { EventEmitter, Component, ChangeDetectionStrategy, Inject, Input, Output, inject, DestroyRef, SkipSelf, Directive, HostBinding, ContentChild, ViewChild, NgModule, Pipe, ElementRef, HostListener, Renderer2, Optional, Injectable, ContentChildren, ChangeDetectorRef, signal, input, computed, output, effect, forwardRef, InjectionToken } from '@angular/core';
|
3
3
|
import * as i1 from '@snabcentr/client-core';
|
4
|
-
import { ScUserMetrikaGoalsEnum, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScOpfList,
|
4
|
+
import { ScUserMetrikaGoalsEnum, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScOpfList, ScPhoneService, ScUserMetrikaService, ScAuthService, SC_URLS, SC_PATH_IMAGE_NOT_FOUND, SEARCH_TERM, ScUnitsHelper, ScImageHelper, IS_RUNNING_ON_TERMINAL, ScWarehouseService, SEARCH_TERM_PROVIDERS, ScPaginationService, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PRODUCT_PAGINATION_OPTIONS, ScIconTypesEnum, ScDocumentInfoTypesEnum, ScSamplesService, ScUserService } from '@snabcentr/client-core';
|
5
5
|
import * as i6$1 from 'rxjs';
|
6
|
-
import { Subject, map, filter, switchMap, tap, catchError, of, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, combineLatest, debounceTime, throwError, shareReplay, skip, interval } from 'rxjs';
|
6
|
+
import { Subject, map, filter, switchMap, tap, catchError, of, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, combineLatest, debounceTime, throwError, shareReplay, skip, noop, interval } from 'rxjs';
|
7
7
|
import * as i2 from '@angular/common';
|
8
8
|
import { CommonModule } from '@angular/common';
|
9
9
|
import * as i1$1 from '@taiga-ui/core';
|
10
|
-
import { TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiButton,
|
10
|
+
import { TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiButton, TuiLabel, TuiError, TuiLoader, TuiDataList, TuiNotification, TuiLink, TuiDialog, TuiDialogService, TuiHint, TUI_MONTHS, TuiIcon, TuiFormatNumberPipe, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, tuiFadeIn } from '@taiga-ui/core';
|
11
11
|
import { HttpErrorResponse } from '@angular/common/http';
|
12
12
|
import * as i3 from '@angular/forms';
|
13
13
|
import { FormGroupDirective, FormGroup, FormControl, Validators, NgControl, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
14
14
|
import * as i6 from '@taiga-ui/cdk';
|
15
|
-
import { tuiControlValue, tuiIsFalsy, tuiIsPresent, tuiMarkControlAsTouchedAndValidate,
|
15
|
+
import { tuiControlValue, tuiIsFalsy, tuiIsPresent, tuiMarkControlAsTouchedAndValidate, TuiLet, TuiRepeatTimes, TUI_IS_MOBILE, TuiHovered, TuiDay, TuiDayRange, TuiMonth, tuiPure, tuiCreateTokenFromFactory, tuiCreateToken, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
16
16
|
import * as i4 from '@taiga-ui/legacy/components/primitive-textfield';
|
17
17
|
import * as i5 from '@taiga-ui/legacy';
|
18
|
-
import {
|
18
|
+
import { TuiInputModule, TuiTextfieldControllerModule, TuiComboBoxModule, TuiInputPhoneModule, TuiSelectModule, TuiInputPasswordModule, AbstractTuiNullableControl, TuiInputNumberComponent, AbstractTuiControl, TuiIslandDirective, TuiInputNumberModule } from '@taiga-ui/legacy';
|
19
19
|
import * as i8 from '@maskito/angular';
|
20
20
|
import { MaskitoDirective } from '@maskito/angular';
|
21
21
|
import * as i2$1 from '@taiga-ui/kit';
|
22
|
-
import { TuiAccordionItem, TuiElasticContainer, TuiAccordion,
|
22
|
+
import { TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiCarousel, TuiCheckbox, TuiStepper, TuiPreview, TuiBadge, TuiHighlight, TuiAvatar, TuiLineClamp, TuiPreviewDialogService, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree } from '@taiga-ui/kit';
|
23
23
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
24
24
|
import * as i3$1 from '@taiga-ui/core/components/data-list';
|
25
25
|
import * as i2$2 from '@taiga-ui/polymorpheus';
|
26
26
|
import { PolymorpheusTemplate, PolymorpheusOutlet, POLYMORPHEUS_CONTEXT, PolymorpheusComponent, injectContext } from '@taiga-ui/polymorpheus';
|
27
|
-
import * as i2$3 from 'angularx-qrcode';
|
28
|
-
import { QRCodeModule } from 'angularx-qrcode';
|
29
27
|
import * as i1$2 from '@taiga-ui/cdk/directives/item';
|
30
28
|
import * as i3$2 from '@ng-web-apis/intersection-observer';
|
31
29
|
import { IntersectionObserverService, WaIntersectionObserver } from '@ng-web-apis/intersection-observer';
|
32
|
-
import * as i2$
|
33
|
-
import { RouterModule, ActivatedRoute } from '@angular/router';
|
30
|
+
import * as i2$3 from '@angular/router';
|
31
|
+
import { RouterModule, ActivatedRoute, Router, NavigationEnd, RouterLink } from '@angular/router';
|
34
32
|
import * as i9 from '@taiga-ui/addon-commerce';
|
35
33
|
import { TuiCurrencyPipe } from '@taiga-ui/addon-commerce';
|
34
|
+
import * as i2$4 from 'angularx-qrcode';
|
35
|
+
import { QRCodeModule } from 'angularx-qrcode';
|
36
36
|
import { __decorate } from 'tslib';
|
37
37
|
import * as i5$1 from '@taiga-ui/addon-charts';
|
38
38
|
import { TuiLineDaysChart, TuiLineDaysChartHint, TuiAxes } from '@taiga-ui/addon-charts';
|
@@ -1499,219 +1499,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
1499
1499
|
}]
|
1500
1500
|
}] });
|
1501
1501
|
|
1502
|
-
/* eslint-disable
|
1502
|
+
/* eslint-disable class-methods-use-this */
|
1503
1503
|
/**
|
1504
|
-
*
|
1504
|
+
* Пайп для форматирования номера телефона.
|
1505
|
+
*
|
1506
|
+
* Если переданный номер телефона валиден, он будет отформатирован с использованием метода `formatPhoneNumber` сервиса `ScPhoneService`.
|
1507
|
+
* Если номер невалиден, возвращается исходное значение.
|
1505
1508
|
*/
|
1506
|
-
class
|
1509
|
+
class ScFormatePhonePipe {
|
1507
1510
|
/**
|
1508
|
-
*
|
1511
|
+
* Преобразует строковое значение номера телефона.
|
1509
1512
|
*
|
1510
|
-
* @param
|
1513
|
+
* @param value Строка, содержащая номер телефона.
|
1514
|
+
* @returns Отформатированный номер телефона, если он валиден, или исходное значение, если он невалиден.
|
1511
1515
|
*/
|
1512
|
-
|
1513
|
-
if (
|
1514
|
-
return;
|
1515
|
-
}
|
1516
|
-
event.preventDefault();
|
1517
|
-
const elements = this.focusableElements.toArray();
|
1518
|
-
const focusedIndex = elements.findIndex((control) => control.focused);
|
1519
|
-
if (focusedIndex !== -1) {
|
1520
|
-
const nextElement = elements[focusedIndex + 1]?.nativeFocusableElement;
|
1521
|
-
if (nextElement) {
|
1522
|
-
nextElement.focus();
|
1523
|
-
}
|
1516
|
+
transform(value) {
|
1517
|
+
if (ScPhoneService.isValidPhoneNumber(value)) {
|
1518
|
+
return ScPhoneService.formatPhoneNumber(value);
|
1524
1519
|
}
|
1520
|
+
return value; // Возвращаем оригинальный номер, если он невалиден.
|
1525
1521
|
}
|
1526
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
1527
|
-
static { this.ɵ
|
1528
|
-
}
|
1529
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusDirective, decorators: [{
|
1530
|
-
type: Directive,
|
1531
|
-
args: [{
|
1532
|
-
selector: 'form[ScNextInputFocus]',
|
1533
|
-
}]
|
1534
|
-
}], propDecorators: { focusableElements: [{
|
1535
|
-
type: ContentChildren,
|
1536
|
-
args: [AbstractTuiControl, { descendants: true }]
|
1537
|
-
}], onFormKeyDownEnter: [{
|
1538
|
-
type: HostListener,
|
1539
|
-
args: ['keydown', ['$event']]
|
1540
|
-
}] } });
|
1541
|
-
|
1542
|
-
/**
|
1543
|
-
* Модуль директивы для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
1544
|
-
*/
|
1545
|
-
class ScNextInputFocusModule {
|
1546
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1547
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, declarations: [ScNextInputFocusDirective], exports: [ScNextInputFocusDirective] }); }
|
1548
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule }); }
|
1522
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
1523
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, isStandalone: true, name: "scFormatePhone" }); }
|
1549
1524
|
}
|
1550
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
1551
|
-
type:
|
1525
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, decorators: [{
|
1526
|
+
type: Pipe,
|
1552
1527
|
args: [{
|
1553
|
-
|
1554
|
-
|
1528
|
+
standalone: true,
|
1529
|
+
name: 'scFormatePhone',
|
1555
1530
|
}]
|
1556
1531
|
}] });
|
1557
1532
|
|
1558
|
-
/* eslint-disable no-underscore-dangle */
|
1559
1533
|
/**
|
1560
|
-
*
|
1534
|
+
* Директива, которая управляет свойствами ссылки адреса электронной почты.
|
1561
1535
|
*/
|
1562
|
-
class
|
1536
|
+
class ScEmailLinkDirective {
|
1563
1537
|
constructor() {
|
1564
1538
|
/**
|
1565
|
-
*
|
1566
|
-
*/
|
1567
|
-
this.isMobile = inject(TUI_IS_MOBILE);
|
1568
|
-
/**
|
1569
|
-
* {@link FormControl} поля ввода количества товара в корзине.
|
1570
|
-
*/
|
1571
|
-
this.quantityControl = new FormControl(3, { updateOn: 'blur' });
|
1572
|
-
/**
|
1573
|
-
* Признак, что необходимо отобразить лоадер для поля ввода количества товара.
|
1574
|
-
*/
|
1575
|
-
this.quantityShowLoader = false;
|
1576
|
-
/**
|
1577
|
-
* Признак, что необходимо отобразить лоадер для кнопки избранных товаров и категорий.
|
1578
|
-
*/
|
1579
|
-
this.favoriteShowLoader = false;
|
1580
|
-
/**
|
1581
|
-
* {@link Observable} изменения статуса авторизации.
|
1582
|
-
*/
|
1583
|
-
this.authStatus$ = inject(ScAuthService).getAuthChange();
|
1584
|
-
/**
|
1585
|
-
* {@link Observable} поиска терма.
|
1586
|
-
*/
|
1587
|
-
this.search$ = inject(SEARCH_TERM);
|
1588
|
-
/**
|
1589
|
-
* Признак, что необходимо отобразить поле ввода количества товара.
|
1590
|
-
*/
|
1591
|
-
this.showQuantityControl = false;
|
1592
|
-
/**
|
1593
|
-
* Событие нажатия на кнопку "В избранное".
|
1594
|
-
*/
|
1595
|
-
this.clickFavoriteEvent = new EventEmitter();
|
1596
|
-
/**
|
1597
|
-
* Событие нажатия на кнопку "В корзину".
|
1598
|
-
*/
|
1599
|
-
this.clickAddToCartEvent = new EventEmitter();
|
1600
|
-
/**
|
1601
|
-
* Событие нажатия на кнопку очистки количества товара.
|
1602
|
-
*/
|
1603
|
-
this.clickClearEvent = new EventEmitter();
|
1604
|
-
/**
|
1605
|
-
* Событие нажатия на карточку товара.
|
1606
|
-
*/
|
1607
|
-
this.clickCardEvent = new EventEmitter();
|
1608
|
-
/**
|
1609
|
-
* Событие нажатия на историю цен.
|
1610
|
-
*/
|
1611
|
-
this.clickPriceHistoryEvent = new EventEmitter();
|
1612
|
-
/**
|
1613
|
-
* {@link Observable} изменения количества товара в корзине.
|
1614
|
-
*/
|
1615
|
-
this.quantityValueChanges = this.quantityControl.valueChanges;
|
1616
|
-
/**
|
1617
|
-
* Экземпляр класса-помощника для работы со значениями единиц измерения товара.
|
1618
|
-
*/
|
1619
|
-
this.unitsHelper = inject(ScUnitsHelper);
|
1620
|
-
/**
|
1621
|
-
* Хелпер для работы с изображениями товара.
|
1622
|
-
*/
|
1623
|
-
this.imageHelper = inject(ScImageHelper);
|
1624
|
-
/**
|
1625
|
-
* Путь до изображения 'Товар не найден'.
|
1539
|
+
* Ссылка на HTML элемент тега `<a>`.
|
1626
1540
|
*/
|
1627
|
-
this.
|
1541
|
+
this.elementReference = inject(ElementRef);
|
1628
1542
|
/**
|
1629
|
-
*
|
1543
|
+
* Сервис для сбора метрик о действиях пользователей.
|
1630
1544
|
*/
|
1631
|
-
this.
|
1632
|
-
}
|
1633
|
-
/**
|
1634
|
-
* Позиция товара в корзине.
|
1635
|
-
*
|
1636
|
-
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
1637
|
-
*/
|
1638
|
-
get cartItem() {
|
1639
|
-
return this._cartItem;
|
1640
|
-
}
|
1641
|
-
/**
|
1642
|
-
* Позиция товара в корзине
|
1643
|
-
*
|
1644
|
-
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
1645
|
-
*/
|
1646
|
-
set cartItem(value) {
|
1647
|
-
this._cartItem = value;
|
1648
|
-
this.quantityControl.patchValue(this._cartItem?.quantity ?? null, { emitEvent: false });
|
1649
|
-
this.quantityShowLoader = false;
|
1650
|
-
}
|
1651
|
-
/**
|
1652
|
-
* Объект товара.
|
1653
|
-
*/
|
1654
|
-
get product() {
|
1655
|
-
return this._product;
|
1656
|
-
}
|
1657
|
-
/**
|
1658
|
-
* Объект товара.
|
1659
|
-
*/
|
1660
|
-
set product(value) {
|
1661
|
-
this._product = value;
|
1662
|
-
}
|
1663
|
-
/**
|
1664
|
-
* Признак, что нужно показать скелетон.
|
1665
|
-
*/
|
1666
|
-
get skeletonVisible() {
|
1667
|
-
return !this.product;
|
1668
|
-
}
|
1669
|
-
/**
|
1670
|
-
* Возвращает ссылку на preview-изображение карточки товара.
|
1671
|
-
*/
|
1672
|
-
getCardImagePreview() {
|
1673
|
-
return this.product ? this.imageHelper.getImagePreview(this.product) : this.pathImageNotFound;
|
1674
|
-
}
|
1675
|
-
/**
|
1676
|
-
* Возвращает массив превью-изображений товара.
|
1677
|
-
*
|
1678
|
-
* @param product Объект товара.
|
1679
|
-
*/
|
1680
|
-
getCardImagePreviewList(product) {
|
1681
|
-
const images = this.imageHelper.getProductImagePreviewList(product);
|
1682
|
-
return images.length > 0 ? images : [this.pathImageNotFound];
|
1545
|
+
this.userMetrikaService = inject(ScUserMetrikaService);
|
1683
1546
|
}
|
1684
1547
|
/**
|
1685
|
-
*
|
1548
|
+
* Обработчик клика по ссылке.
|
1686
1549
|
*/
|
1687
|
-
|
1688
|
-
this.
|
1550
|
+
click() {
|
1551
|
+
const email = /mailto:([^?]+)/.exec(this.elementReference.nativeElement.href)?.at(1);
|
1552
|
+
if (email) {
|
1553
|
+
this.userMetrikaService.emitUserMetrikaEvent({
|
1554
|
+
target: ScUserMetrikaGoalsEnum.emailClick,
|
1555
|
+
params: {
|
1556
|
+
emailLocation: this.linkLocation,
|
1557
|
+
email: email,
|
1558
|
+
},
|
1559
|
+
});
|
1560
|
+
}
|
1689
1561
|
}
|
1690
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
1691
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type:
|
1562
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScEmailLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
1563
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScEmailLinkDirective, isStandalone: true, selector: "a[scEmailLink]", inputs: { linkLocation: "linkLocation" }, host: { listeners: { "click": "click()" } }, ngImport: i0 }); }
|
1692
1564
|
}
|
1693
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
1694
|
-
type: Directive
|
1695
|
-
|
1696
|
-
|
1697
|
-
|
1698
|
-
|
1699
|
-
|
1700
|
-
type: Input
|
1701
|
-
|
1702
|
-
|
1703
|
-
|
1704
|
-
|
1705
|
-
}], clickAddToCartEvent: [{
|
1706
|
-
type: Output
|
1707
|
-
}], clickClearEvent: [{
|
1708
|
-
type: Output
|
1709
|
-
}], clickCardEvent: [{
|
1710
|
-
type: Output
|
1711
|
-
}], clickPriceHistoryEvent: [{
|
1712
|
-
type: Output
|
1713
|
-
}], quantityValueChanges: [{
|
1714
|
-
type: Output
|
1565
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScEmailLinkDirective, decorators: [{
|
1566
|
+
type: Directive,
|
1567
|
+
args: [{
|
1568
|
+
standalone: true,
|
1569
|
+
selector: 'a[scEmailLink]',
|
1570
|
+
}]
|
1571
|
+
}], propDecorators: { linkLocation: [{
|
1572
|
+
type: Input,
|
1573
|
+
args: [{ required: true }]
|
1574
|
+
}], click: [{
|
1575
|
+
type: HostListener,
|
1576
|
+
args: ['click']
|
1715
1577
|
}] } });
|
1716
1578
|
|
1717
1579
|
/**
|
@@ -1728,225 +1590,72 @@ class ScTelLinkDirective {
|
|
1728
1590
|
*/
|
1729
1591
|
this.elementReference = inject(ElementRef);
|
1730
1592
|
/**
|
1731
|
-
*
|
1593
|
+
* Сервис для сбора метрик о действиях пользователей.
|
1732
1594
|
*/
|
1733
|
-
this.
|
1595
|
+
this.userMetrikaService = inject(ScUserMetrikaService);
|
1734
1596
|
}
|
1735
1597
|
/** @inheritDoc */
|
1736
1598
|
ngOnChanges(changes) {
|
1737
1599
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
1738
|
-
if (changes['
|
1600
|
+
if (changes['tel']) {
|
1739
1601
|
this.updateLinkState();
|
1740
1602
|
}
|
1741
1603
|
}
|
1604
|
+
/**
|
1605
|
+
* Обработчик клика по ссылке.
|
1606
|
+
*/
|
1607
|
+
click() {
|
1608
|
+
if (ScPhoneService.isValidPhoneNumber(this.tel)) {
|
1609
|
+
this.userMetrikaService.emitUserMetrikaEvent({
|
1610
|
+
target: ScUserMetrikaGoalsEnum.phoneClick,
|
1611
|
+
params: {
|
1612
|
+
phoneLocation: this.linkLocation,
|
1613
|
+
phone: this.tel,
|
1614
|
+
},
|
1615
|
+
});
|
1616
|
+
}
|
1617
|
+
}
|
1742
1618
|
/**
|
1743
1619
|
* Обновляет состояние ссылки на основе валидности номера телефона.
|
1744
1620
|
*/
|
1745
1621
|
updateLinkState() {
|
1746
|
-
if (ScPhoneService.isValidPhoneNumber(this.
|
1747
|
-
// Если номер валиден, активируем
|
1622
|
+
if (ScPhoneService.isValidPhoneNumber(this.tel)) {
|
1623
|
+
// Если номер валиден, активируем ссылку.
|
1748
1624
|
this.renderer.removeAttribute(this.elementReference.nativeElement, 'aria-disabled');
|
1749
1625
|
this.renderer.removeClass(this.elementReference.nativeElement, 'disabled');
|
1750
|
-
this.renderer.setAttribute(this.elementReference.nativeElement, 'href', `tel:${ScPhoneService.formatPhoneNumber(this.
|
1626
|
+
this.renderer.setAttribute(this.elementReference.nativeElement, 'href', `tel:${ScPhoneService.formatPhoneNumber(this.tel)}`);
|
1751
1627
|
}
|
1752
1628
|
else {
|
1753
|
-
// Если номер невалиден, отключаем
|
1629
|
+
// Если номер невалиден, отключаем ссылку.
|
1754
1630
|
this.renderer.setAttribute(this.elementReference.nativeElement, 'aria-disabled', 'true');
|
1755
1631
|
this.renderer.addClass(this.elementReference.nativeElement, 'disabled');
|
1756
1632
|
this.renderer.removeAttribute(this.elementReference.nativeElement, 'href');
|
1757
1633
|
}
|
1758
1634
|
}
|
1759
1635
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
1760
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTelLinkDirective, isStandalone: true, selector: "[scTelLink]", inputs: {
|
1636
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTelLinkDirective, isStandalone: true, selector: "a[scTelLink]", inputs: { tel: ["scTelLink", "tel"], linkLocation: "linkLocation" }, host: { listeners: { "click": "click()" } }, usesOnChanges: true, ngImport: i0 }); }
|
1761
1637
|
}
|
1762
1638
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkDirective, decorators: [{
|
1763
1639
|
type: Directive,
|
1764
1640
|
args: [{
|
1765
1641
|
standalone: true,
|
1766
|
-
selector: '[scTelLink]',
|
1642
|
+
selector: 'a[scTelLink]',
|
1767
1643
|
}]
|
1768
|
-
}], propDecorators: {
|
1769
|
-
type: Input
|
1644
|
+
}], propDecorators: { tel: [{
|
1645
|
+
type: Input,
|
1646
|
+
args: [{ alias: 'scTelLink', required: true }]
|
1647
|
+
}], linkLocation: [{
|
1648
|
+
type: Input,
|
1649
|
+
args: [{ required: true }]
|
1650
|
+
}], click: [{
|
1651
|
+
type: HostListener,
|
1652
|
+
args: ['click']
|
1770
1653
|
}] } });
|
1771
1654
|
|
1772
|
-
/* eslint-disable class-methods-use-this */
|
1773
1655
|
/**
|
1774
|
-
*
|
1775
|
-
*
|
1776
|
-
* Если переданный номер телефона валиден, он будет отформатирован с использованием метода `formatPhoneNumber` сервиса `ScPhoneService`.
|
1777
|
-
* Если номер невалиден, возвращается исходное значение.
|
1656
|
+
* Список директив ссылок.
|
1778
1657
|
*/
|
1779
|
-
|
1780
|
-
/**
|
1781
|
-
* Преобразует строковое значение номера телефона.
|
1782
|
-
*
|
1783
|
-
* @param value Строка, содержащая номер телефона.
|
1784
|
-
* @returns Отформатированный номер телефона, если он валиден, или исходное значение, если он невалиден.
|
1785
|
-
*/
|
1786
|
-
transform(value) {
|
1787
|
-
if (ScPhoneService.isValidPhoneNumber(value)) {
|
1788
|
-
return ScPhoneService.formatPhoneNumber(value);
|
1789
|
-
}
|
1790
|
-
return value; // Возвращаем оригинальный номер, если он невалиден
|
1791
|
-
}
|
1792
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
1793
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, isStandalone: true, name: "scFormatePhone" }); }
|
1794
|
-
}
|
1795
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, decorators: [{
|
1796
|
-
type: Pipe,
|
1797
|
-
args: [{
|
1798
|
-
standalone: true,
|
1799
|
-
name: 'scFormatePhone',
|
1800
|
-
}]
|
1801
|
-
}] });
|
1802
|
-
|
1803
|
-
/**
|
1804
|
-
* Модуль валидации значения номера телефона.
|
1805
|
-
*/
|
1806
|
-
class ScTelLinkModule {
|
1807
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1808
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, imports: [ScFormatePhonePipe, ScTelLinkDirective], exports: [ScFormatePhonePipe, ScTelLinkDirective] }); }
|
1809
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule }); }
|
1810
|
-
}
|
1811
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, decorators: [{
|
1812
|
-
type: NgModule,
|
1813
|
-
args: [{
|
1814
|
-
imports: [ScFormatePhonePipe, ScTelLinkDirective],
|
1815
|
-
exports: [ScFormatePhonePipe, ScTelLinkDirective],
|
1816
|
-
}]
|
1817
|
-
}] });
|
1818
|
-
|
1819
|
-
/**
|
1820
|
-
* Компонент QR кода.
|
1821
|
-
*/
|
1822
|
-
class ScQRCodeDialogComponent {
|
1823
|
-
/**
|
1824
|
-
* Инициализирует экземпляр класса {@link ScQRCodeDialogComponent}.
|
1825
|
-
*
|
1826
|
-
* @param vCardService Сервис для работы с vCard.
|
1827
|
-
* @param context Контекст диалогового окна, в котором открыт компонент.
|
1828
|
-
* @param terminal Провайдер данных о терминале.
|
1829
|
-
*/
|
1830
|
-
constructor(vCardService, context, terminal) {
|
1831
|
-
this.vCardService = vCardService;
|
1832
|
-
this.context = context;
|
1833
|
-
this.terminal = terminal;
|
1834
|
-
/**
|
1835
|
-
* Свойство, от которого зависит наличие атрибута `data-terminal-view` у `:host` компонента.
|
1836
|
-
*/
|
1837
|
-
this.terminalView = this.terminal.isRunningOnTerminal;
|
1838
|
-
}
|
1839
|
-
/**
|
1840
|
-
* Выполняет скачивание генерируемого vCard файла контакта.
|
1841
|
-
*/
|
1842
|
-
downloadVCard() {
|
1843
|
-
if (!this.terminal.isRunningOnTerminal && this.isVCardData()) {
|
1844
|
-
this.vCardService.downloadVCard(this.context.data.qrdata);
|
1845
|
-
}
|
1846
|
-
}
|
1847
|
-
/**
|
1848
|
-
* Проверяет что в диалоговое окно были переданы данные в формате `vCard`.
|
1849
|
-
*/
|
1850
|
-
isVCardData() {
|
1851
|
-
// eslint-disable-next-line unicorn/better-regex
|
1852
|
-
return /BEGIN:VCARD[\s\S]*END:VCARD/i.test(this.context.data.qrdata);
|
1853
|
-
}
|
1854
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, deps: [{ token: i1.ScVCardService }, { token: POLYMORPHEUS_CONTEXT }, { token: IS_RUNNING_ON_TERMINAL }], target: i0.ɵɵFactoryTarget.Component }); }
|
1855
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScQRCodeDialogComponent, selector: "sc-qrcode-dialog", host: { properties: { "attr.data-terminal-view": "this.terminalView" } }, ngImport: i0, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"], dependencies: [{ kind: "component", type: i2$3.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
1856
|
-
}
|
1857
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, decorators: [{
|
1858
|
-
type: Component,
|
1859
|
-
args: [{ selector: 'sc-qrcode-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"] }]
|
1860
|
-
}], ctorParameters: () => [{ type: i1.ScVCardService }, { type: undefined, decorators: [{
|
1861
|
-
type: Inject,
|
1862
|
-
args: [POLYMORPHEUS_CONTEXT]
|
1863
|
-
}] }, { type: undefined, decorators: [{
|
1864
|
-
type: Inject,
|
1865
|
-
args: [IS_RUNNING_ON_TERMINAL]
|
1866
|
-
}] }], propDecorators: { terminalView: [{
|
1867
|
-
type: HostBinding,
|
1868
|
-
args: ['attr.data-terminal-view']
|
1869
|
-
}] } });
|
1870
|
-
|
1871
|
-
/**
|
1872
|
-
* Модуль QR кода.
|
1873
|
-
*/
|
1874
|
-
class ScQRCodeModule {
|
1875
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
1876
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, declarations: [ScQRCodeDialogComponent], imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewAction, i2$1.TuiPreviewZoom], exports: [ScQRCodeDialogComponent] }); }
|
1877
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, imports: [CommonModule, QRCodeModule, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewZoom] }); }
|
1878
|
-
}
|
1879
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, decorators: [{
|
1880
|
-
type: NgModule,
|
1881
|
-
args: [{
|
1882
|
-
declarations: [ScQRCodeDialogComponent],
|
1883
|
-
imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, ...TuiPreview],
|
1884
|
-
exports: [ScQRCodeDialogComponent],
|
1885
|
-
}]
|
1886
|
-
}] });
|
1887
|
-
|
1888
|
-
/* eslint-disable lodash/prefer-lodash-method */
|
1889
|
-
/**
|
1890
|
-
* Директива открытия диалогового окна с QRCode для ссылок `tel:` и `mailto:` на терминале.
|
1891
|
-
*/
|
1892
|
-
class ScTerminalLinkDirective {
|
1893
|
-
constructor() {
|
1894
|
-
/**
|
1895
|
-
* Ссылка на HTML элемент тега `<a>`.
|
1896
|
-
*/
|
1897
|
-
this.elementReference = inject(ElementRef);
|
1898
|
-
/**
|
1899
|
-
* Сервис для работы с диалоговыми окнами TuiDialog.
|
1900
|
-
*/
|
1901
|
-
this.dialog = inject(TuiDialogService);
|
1902
|
-
/**
|
1903
|
-
* Провайдер данных о терминале.
|
1904
|
-
*/
|
1905
|
-
this.terminal = inject(IS_RUNNING_ON_TERMINAL);
|
1906
|
-
}
|
1907
|
-
/**
|
1908
|
-
* Обработчик клика по ссылке.
|
1909
|
-
*
|
1910
|
-
* @param event Событие клика.
|
1911
|
-
*/
|
1912
|
-
onClick(event) {
|
1913
|
-
if (this.terminal.isRunningOnTerminal && this.isLinkTelOrMail()) {
|
1914
|
-
// Отключение базового события для терминала.
|
1915
|
-
event.preventDefault();
|
1916
|
-
this.openQRCodeDialog();
|
1917
|
-
}
|
1918
|
-
}
|
1919
|
-
/**
|
1920
|
-
* Открывает диалоговое окно с QR-кодом.
|
1921
|
-
*/
|
1922
|
-
openQRCodeDialog() {
|
1923
|
-
this.dialog
|
1924
|
-
.open(new PolymorpheusComponent(ScQRCodeDialogComponent), {
|
1925
|
-
size: 's',
|
1926
|
-
// Передаём ссылку формата `mailto:example@example.com` `tel:+70000000000` вместо vCard, так как для vCard данных недостаточно.
|
1927
|
-
data: { qrdata: this.elementReference.nativeElement.href },
|
1928
|
-
})
|
1929
|
-
.subscribe();
|
1930
|
-
}
|
1931
|
-
/**
|
1932
|
-
* Проверяет ведёт ли ссылка на телефон или адрес электронной почты.
|
1933
|
-
*/
|
1934
|
-
isLinkTelOrMail() {
|
1935
|
-
return this.elementReference.nativeElement.href.startsWith('tel:') || this.elementReference.nativeElement.href.startsWith('mailto:');
|
1936
|
-
}
|
1937
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
1938
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTerminalLinkDirective, isStandalone: true, selector: "a[href]", host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); }
|
1939
|
-
}
|
1940
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, decorators: [{
|
1941
|
-
type: Directive,
|
1942
|
-
args: [{
|
1943
|
-
standalone: true,
|
1944
|
-
selector: 'a[href]',
|
1945
|
-
}]
|
1946
|
-
}], propDecorators: { onClick: [{
|
1947
|
-
type: HostListener,
|
1948
|
-
args: ['click', ['$event']]
|
1949
|
-
}] } });
|
1658
|
+
const ScLinks = [ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe];
|
1950
1659
|
|
1951
1660
|
/**
|
1952
1661
|
* Модуль полей ввода.
|
@@ -2094,11 +1803,11 @@ class ScContactsAccordionComponent {
|
|
2094
1803
|
this.deleteButtonClick = new EventEmitter();
|
2095
1804
|
}
|
2096
1805
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
2097
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type:
|
1806
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n linkLocation=\"contact\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n scEmailLink\n linkLocation=\"contact\"\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTelLinkDirective, selector: "a[scTelLink]", inputs: ["scTelLink", "linkLocation"] }, { kind: "directive", type: ScEmailLinkDirective, selector: "a[scEmailLink]", inputs: ["linkLocation"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
2098
1807
|
}
|
2099
1808
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsAccordionComponent, decorators: [{
|
2100
1809
|
type: Component,
|
2101
|
-
args: [{ selector: 'sc-contacts-accordion', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n" }]
|
1810
|
+
args: [{ selector: 'sc-contacts-accordion', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n linkLocation=\"contact\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n scEmailLink\n linkLocation=\"contact\"\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n" }]
|
2102
1811
|
}], propDecorators: { contacts$: [{
|
2103
1812
|
type: Input
|
2104
1813
|
}], addContactClick: [{
|
@@ -2127,11 +1836,7 @@ class ScContactsModule {
|
|
2127
1836
|
TuiSelectModule, i1$1.TuiDataListComponent, i1$1.TuiDataListDirective, i1$1.TuiOption, i1$1.TuiOptGroup, i2$1.TuiDataListWrapperComponent, i2$1.TuiDataListGroupWrapperComponent, i3$1.TuiDataListDirective, TuiLabel,
|
2128
1837
|
TuiInputModule,
|
2129
1838
|
TuiInputPhoneModule,
|
2130
|
-
TuiError,
|
2131
|
-
ScTerminalLinkDirective,
|
2132
|
-
ScFormatePhonePipe,
|
2133
|
-
ScTelLinkDirective,
|
2134
|
-
TuiButtonLoading], exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent] }); }
|
1839
|
+
TuiError, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiButtonLoading], exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent] }); }
|
2135
1840
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsModule, imports: [CommonModule,
|
2136
1841
|
FormsModule,
|
2137
1842
|
ReactiveFormsModule,
|
@@ -2167,9 +1872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
2167
1872
|
TuiInputModule,
|
2168
1873
|
TuiInputPhoneModule,
|
2169
1874
|
TuiError,
|
2170
|
-
|
2171
|
-
ScFormatePhonePipe,
|
2172
|
-
ScTelLinkDirective,
|
1875
|
+
...ScLinks,
|
2173
1876
|
TuiButtonLoading,
|
2174
1877
|
],
|
2175
1878
|
exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent],
|
@@ -3120,7 +2823,7 @@ class ScCategoryCardComponent {
|
|
3120
2823
|
this.cdr.markForCheck();
|
3121
2824
|
}
|
3122
2825
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScCategoryCardComponent, deps: [{ token: SC_URLS }, { token: SC_PATH_IMAGE_NOT_FOUND }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
3123
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScCategoryCardComponent, selector: "sc-category-card", inputs: { category: "category", size: "size", enableHover: "enableHover", href: "href" }, outputs: { clickOnFavoriteEvent: "clickOnFavoriteEvent" }, host: { properties: { "attr.data-size": "this.size" } }, ngImport: i0, template: "<div class=\"relative\">\n <a\n (tuiHoveredChange)=\"onHovered($event)\"\n [routerLink]=\"href ?? null\"\n class=\"category-button flex flex-col overflow-hidden rounded-tui-radius-m border border-tui-base-04 text-center\"\n >\n <div class=\"img-wrapper w-full grow overflow-hidden\">\n <img\n *ngIf=\"category && category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full object-cover\"\n />\n\n <div\n *ngIf=\"!category\"\n class=\"img-wrapper size-full bg-tui-base-02\"\n ></div>\n\n <img\n *ngIf=\"category && !category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full rounded-xl object-contain p-2\"\n />\n </div>\n\n <div class=\"name flex w-full items-center justify-center\">\n @if (category) {\n @if (enableHover && !isMobile) {\n <tui-line-clamp\n [content]=\"category.name\"\n class=\"pointer-events-none\"\n [lineHeight]=\"size === 'm' ? 26 : 24\"\n [linesLimit]=\"isHover ? 4 : 2\"\n />\n } @else {\n {{ category.name }}\n }\n } @else {\n <div class=\"skeleton-name rounded-tui-radius-s bg-tui-base-02\"></div>\n }\n </div>\n </a>\n <sc-favorite-button\n *ngIf=\"category && (authStatus$ | async)\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"category.isFavorite\"\n (clickEvent)=\"clickOnFavoriteEvent.emit()\"\n class=\"absolute left-1 top-1\"\n ></sc-favorite-button>\n</div>\n", styles: [":host{--tui-duration: .15s}:host[data-size=m] a.category-button{width:100%;height:12.5rem}:host[data-size=m] a.category-button .img-wrapper{max-height:8.75rem}:host[data-size=m] a.category-button .name{padding:.25rem 1rem;margin-block:auto;font-size:.9375rem;line-height:1.5rem;font-weight:800}:host[data-size=m] a.category-button .name .skeleton-name{width:10rem;height:1rem}:host[data-size=s] a.category-button{width:100%;height:10rem}:host[data-size=s] a.category-button .img-wrapper{max-height:7rem}:host[data-size=s] a.category-button .name{padding:.25rem .5rem;margin-block:auto;font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=s] a.category-button .name .skeleton-name{width:7rem;height:.75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$
|
2826
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScCategoryCardComponent, selector: "sc-category-card", inputs: { category: "category", size: "size", enableHover: "enableHover", href: "href" }, outputs: { clickOnFavoriteEvent: "clickOnFavoriteEvent" }, host: { properties: { "attr.data-size": "this.size" } }, ngImport: i0, template: "<div class=\"relative\">\n <a\n (tuiHoveredChange)=\"onHovered($event)\"\n [routerLink]=\"href ?? null\"\n class=\"category-button flex flex-col overflow-hidden rounded-tui-radius-m border border-tui-base-04 text-center\"\n >\n <div class=\"img-wrapper w-full grow overflow-hidden\">\n <img\n *ngIf=\"category && category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full object-cover\"\n />\n\n <div\n *ngIf=\"!category\"\n class=\"img-wrapper size-full bg-tui-base-02\"\n ></div>\n\n <img\n *ngIf=\"category && !category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full rounded-xl object-contain p-2\"\n />\n </div>\n\n <div class=\"name flex w-full items-center justify-center\">\n @if (category) {\n @if (enableHover && !isMobile) {\n <tui-line-clamp\n [content]=\"category.name\"\n class=\"pointer-events-none\"\n [lineHeight]=\"size === 'm' ? 26 : 24\"\n [linesLimit]=\"isHover ? 4 : 2\"\n />\n } @else {\n {{ category.name }}\n }\n } @else {\n <div class=\"skeleton-name rounded-tui-radius-s bg-tui-base-02\"></div>\n }\n </div>\n </a>\n <sc-favorite-button\n *ngIf=\"category && (authStatus$ | async)\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"category.isFavorite\"\n (clickEvent)=\"clickOnFavoriteEvent.emit()\"\n class=\"absolute left-1 top-1\"\n ></sc-favorite-button>\n</div>\n", styles: [":host{--tui-duration: .15s}:host[data-size=m] a.category-button{width:100%;height:12.5rem}:host[data-size=m] a.category-button .img-wrapper{max-height:8.75rem}:host[data-size=m] a.category-button .name{padding:.25rem 1rem;margin-block:auto;font-size:.9375rem;line-height:1.5rem;font-weight:800}:host[data-size=m] a.category-button .name .skeleton-name{width:10rem;height:1rem}:host[data-size=s] a.category-button{width:100%;height:10rem}:host[data-size=s] a.category-button .img-wrapper{max-height:7rem}:host[data-size=s] a.category-button .name{padding:.25rem .5rem;margin-block:auto;font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=s] a.category-button .name .skeleton-name{width:7rem;height:.75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i2$1.TuiLineClamp, selector: "tui-line-clamp", inputs: ["lineHeight", "content", "linesLimit"], outputs: ["overflownChange"] }, { kind: "directive", type: i6.TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }, { kind: "component", type: ScFavoriteButtonComponent, selector: "sc-favorite-button", inputs: ["isFavorite", "showLoader", "disabled"], outputs: ["clickEvent"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
3124
2827
|
}
|
3125
2828
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScCategoryCardComponent, decorators: [{
|
3126
2829
|
type: Component,
|
@@ -3297,85 +3000,432 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
3297
3000
|
args: ['keydown.arrowUp', ['step']]
|
3298
3001
|
}] } });
|
3299
3002
|
|
3003
|
+
/* eslint-disable lodash/prefer-lodash-method */
|
3300
3004
|
/**
|
3301
|
-
*
|
3005
|
+
* Директива для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
3302
3006
|
*/
|
3303
|
-
class
|
3304
|
-
constructor() {
|
3305
|
-
/**
|
3306
|
-
* Массив изображений.
|
3307
|
-
*/
|
3308
|
-
this.images = [];
|
3309
|
-
/**
|
3310
|
-
* Признак что необходимо отобразить элементы управления.
|
3311
|
-
*/
|
3312
|
-
this.isShowActions = true;
|
3313
|
-
/**
|
3314
|
-
* {@link WritableSignal} для отслеживания текущего индекса изображения.
|
3315
|
-
*/
|
3316
|
-
this.currentIndex = signal(0);
|
3317
|
-
}
|
3007
|
+
class ScNextInputFocusDirective {
|
3318
3008
|
/**
|
3319
|
-
*
|
3009
|
+
* Слушатель нажатия на клавишу enter. Предотвращает событие submit, выполняет смену фокуса на следующее поле ввода TuiFocusableElementAccessor.
|
3320
3010
|
*
|
3321
|
-
* @param
|
3322
|
-
* @param target Объект {@link HTMLElement} в котором лежат изображения
|
3323
|
-
*/
|
3324
|
-
onHover(offsetX, target) {
|
3325
|
-
if (this.images.length <= 1 || offsetX < 0) {
|
3326
|
-
return;
|
3327
|
-
}
|
3328
|
-
// new Event().preventDefault
|
3329
|
-
const elementWidth = target.offsetWidth;
|
3330
|
-
const hoverPercentage = offsetX / elementWidth;
|
3331
|
-
const newIndex = Math.floor(hoverPercentage * this.images.length);
|
3332
|
-
this.currentIndex.set(newIndex);
|
3333
|
-
}
|
3334
|
-
/**
|
3335
|
-
* Обработчик события `mouseleave.silent`.
|
3011
|
+
* @param event Объект события нажатия на клавишу.
|
3336
3012
|
*/
|
3337
|
-
|
3338
|
-
if (
|
3013
|
+
onFormKeyDownEnter(event) {
|
3014
|
+
if (event.code !== 'Enter' && event.key !== 'Enter') {
|
3339
3015
|
return;
|
3340
3016
|
}
|
3341
|
-
|
3342
|
-
|
3343
|
-
|
3344
|
-
|
3345
|
-
|
3346
|
-
|
3347
|
-
|
3348
|
-
|
3349
|
-
onDotHovered(hovered, index) {
|
3350
|
-
if (hovered) {
|
3351
|
-
this.currentIndex.set(index);
|
3017
|
+
event.preventDefault();
|
3018
|
+
const elements = this.focusableElements.toArray();
|
3019
|
+
const focusedIndex = elements.findIndex((control) => control.focused);
|
3020
|
+
if (focusedIndex !== -1) {
|
3021
|
+
const nextElement = elements[focusedIndex + 1]?.nativeFocusableElement;
|
3022
|
+
if (nextElement) {
|
3023
|
+
nextElement.focus();
|
3024
|
+
}
|
3352
3025
|
}
|
3353
3026
|
}
|
3354
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
3355
|
-
static { this.ɵ
|
3027
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
3028
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScNextInputFocusDirective, selector: "form[ScNextInputFocus]", host: { listeners: { "keydown": "onFormKeyDownEnter($event)" } }, queries: [{ propertyName: "focusableElements", predicate: AbstractTuiControl, descendants: true }], ngImport: i0 }); }
|
3356
3029
|
}
|
3357
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
3358
|
-
type:
|
3359
|
-
args: [{
|
3360
|
-
|
3361
|
-
|
3362
|
-
|
3363
|
-
type:
|
3364
|
-
|
3365
|
-
|
3366
|
-
args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
|
3367
|
-
}], onLeave: [{
|
3030
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusDirective, decorators: [{
|
3031
|
+
type: Directive,
|
3032
|
+
args: [{
|
3033
|
+
selector: 'form[ScNextInputFocus]',
|
3034
|
+
}]
|
3035
|
+
}], propDecorators: { focusableElements: [{
|
3036
|
+
type: ContentChildren,
|
3037
|
+
args: [AbstractTuiControl, { descendants: true }]
|
3038
|
+
}], onFormKeyDownEnter: [{
|
3368
3039
|
type: HostListener,
|
3369
|
-
args: ['
|
3040
|
+
args: ['keydown', ['$event']]
|
3370
3041
|
}] } });
|
3371
3042
|
|
3372
3043
|
/**
|
3373
|
-
*
|
3044
|
+
* Модуль директивы для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
3374
3045
|
*/
|
3375
|
-
class
|
3046
|
+
class ScNextInputFocusModule {
|
3047
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
3048
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, declarations: [ScNextInputFocusDirective], exports: [ScNextInputFocusDirective] }); }
|
3049
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule }); }
|
3050
|
+
}
|
3051
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, decorators: [{
|
3052
|
+
type: NgModule,
|
3053
|
+
args: [{
|
3054
|
+
declarations: [ScNextInputFocusDirective],
|
3055
|
+
exports: [ScNextInputFocusDirective],
|
3056
|
+
}]
|
3057
|
+
}] });
|
3058
|
+
|
3059
|
+
/* eslint-disable no-underscore-dangle */
|
3060
|
+
/**
|
3061
|
+
* Директива абстрактной карточки товара.
|
3062
|
+
*/
|
3063
|
+
class AbstractScPriceCard {
|
3376
3064
|
constructor() {
|
3377
3065
|
/**
|
3378
|
-
*
|
3066
|
+
* Признак того, что этот компонент отображается на мобильном устройстве.
|
3067
|
+
*/
|
3068
|
+
this.isMobile = inject(TUI_IS_MOBILE);
|
3069
|
+
/**
|
3070
|
+
* {@link FormControl} поля ввода количества товара в корзине.
|
3071
|
+
*/
|
3072
|
+
this.quantityControl = new FormControl(3, { updateOn: 'blur' });
|
3073
|
+
/**
|
3074
|
+
* Признак, что необходимо отобразить лоадер для поля ввода количества товара.
|
3075
|
+
*/
|
3076
|
+
this.quantityShowLoader = false;
|
3077
|
+
/**
|
3078
|
+
* Признак, что необходимо отобразить лоадер для кнопки избранных товаров и категорий.
|
3079
|
+
*/
|
3080
|
+
this.favoriteShowLoader = false;
|
3081
|
+
/**
|
3082
|
+
* {@link Observable} изменения статуса авторизации.
|
3083
|
+
*/
|
3084
|
+
this.authStatus$ = inject(ScAuthService).getAuthChange();
|
3085
|
+
/**
|
3086
|
+
* {@link Observable} поиска терма.
|
3087
|
+
*/
|
3088
|
+
this.search$ = inject(SEARCH_TERM);
|
3089
|
+
/**
|
3090
|
+
* Признак, что необходимо отобразить поле ввода количества товара.
|
3091
|
+
*/
|
3092
|
+
this.showQuantityControl = false;
|
3093
|
+
/**
|
3094
|
+
* Событие нажатия на кнопку "В избранное".
|
3095
|
+
*/
|
3096
|
+
this.clickFavoriteEvent = new EventEmitter();
|
3097
|
+
/**
|
3098
|
+
* Событие нажатия на кнопку "В корзину".
|
3099
|
+
*/
|
3100
|
+
this.clickAddToCartEvent = new EventEmitter();
|
3101
|
+
/**
|
3102
|
+
* Событие нажатия на кнопку очистки количества товара.
|
3103
|
+
*/
|
3104
|
+
this.clickClearEvent = new EventEmitter();
|
3105
|
+
/**
|
3106
|
+
* Событие нажатия на карточку товара.
|
3107
|
+
*/
|
3108
|
+
this.clickCardEvent = new EventEmitter();
|
3109
|
+
/**
|
3110
|
+
* Событие нажатия на историю цен.
|
3111
|
+
*/
|
3112
|
+
this.clickPriceHistoryEvent = new EventEmitter();
|
3113
|
+
/**
|
3114
|
+
* {@link Observable} изменения количества товара в корзине.
|
3115
|
+
*/
|
3116
|
+
this.quantityValueChanges = this.quantityControl.valueChanges;
|
3117
|
+
/**
|
3118
|
+
* Экземпляр класса-помощника для работы со значениями единиц измерения товара.
|
3119
|
+
*/
|
3120
|
+
this.unitsHelper = inject(ScUnitsHelper);
|
3121
|
+
/**
|
3122
|
+
* Хелпер для работы с изображениями товара.
|
3123
|
+
*/
|
3124
|
+
this.imageHelper = inject(ScImageHelper);
|
3125
|
+
/**
|
3126
|
+
* Путь до изображения 'Товар не найден'.
|
3127
|
+
*/
|
3128
|
+
this.pathImageNotFound = inject(SC_PATH_IMAGE_NOT_FOUND);
|
3129
|
+
/**
|
3130
|
+
* Объект слежения за изменениями.
|
3131
|
+
*/
|
3132
|
+
this.cdr = inject(ChangeDetectorRef);
|
3133
|
+
}
|
3134
|
+
/**
|
3135
|
+
* Позиция товара в корзине.
|
3136
|
+
*
|
3137
|
+
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
3138
|
+
*/
|
3139
|
+
get cartItem() {
|
3140
|
+
return this._cartItem;
|
3141
|
+
}
|
3142
|
+
/**
|
3143
|
+
* Позиция товара в корзине
|
3144
|
+
*
|
3145
|
+
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
3146
|
+
*/
|
3147
|
+
set cartItem(value) {
|
3148
|
+
this._cartItem = value;
|
3149
|
+
this.quantityControl.patchValue(this._cartItem?.quantity ?? null, { emitEvent: false });
|
3150
|
+
this.quantityShowLoader = false;
|
3151
|
+
}
|
3152
|
+
/**
|
3153
|
+
* Объект товара.
|
3154
|
+
*/
|
3155
|
+
get product() {
|
3156
|
+
return this._product;
|
3157
|
+
}
|
3158
|
+
/**
|
3159
|
+
* Объект товара.
|
3160
|
+
*/
|
3161
|
+
set product(value) {
|
3162
|
+
this._product = value;
|
3163
|
+
}
|
3164
|
+
/**
|
3165
|
+
* Признак, что нужно показать скелетон.
|
3166
|
+
*/
|
3167
|
+
get skeletonVisible() {
|
3168
|
+
return !this.product;
|
3169
|
+
}
|
3170
|
+
/**
|
3171
|
+
* Возвращает ссылку на preview-изображение карточки товара.
|
3172
|
+
*/
|
3173
|
+
getCardImagePreview() {
|
3174
|
+
return this.product ? this.imageHelper.getImagePreview(this.product) : this.pathImageNotFound;
|
3175
|
+
}
|
3176
|
+
/**
|
3177
|
+
* Возвращает массив превью-изображений товара.
|
3178
|
+
*
|
3179
|
+
* @param product Объект товара.
|
3180
|
+
*/
|
3181
|
+
getCardImagePreviewList(product) {
|
3182
|
+
const images = this.imageHelper.getProductImagePreviewList(product);
|
3183
|
+
return images.length > 0 ? images : [this.pathImageNotFound];
|
3184
|
+
}
|
3185
|
+
/**
|
3186
|
+
* Устанавливает компонент в очередь на обновление.
|
3187
|
+
*/
|
3188
|
+
markForCheck() {
|
3189
|
+
this.cdr.markForCheck();
|
3190
|
+
}
|
3191
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AbstractScPriceCard, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
3192
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: AbstractScPriceCard, inputs: { cartItem: "cartItem", product: "product", showQuantityControl: "showQuantityControl", href: "href" }, outputs: { clickFavoriteEvent: "clickFavoriteEvent", clickAddToCartEvent: "clickAddToCartEvent", clickClearEvent: "clickClearEvent", clickCardEvent: "clickCardEvent", clickPriceHistoryEvent: "clickPriceHistoryEvent", quantityValueChanges: "quantityValueChanges" }, ngImport: i0 }); }
|
3193
|
+
}
|
3194
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AbstractScPriceCard, decorators: [{
|
3195
|
+
type: Directive
|
3196
|
+
}], propDecorators: { cartItem: [{
|
3197
|
+
type: Input
|
3198
|
+
}], product: [{
|
3199
|
+
type: Input
|
3200
|
+
}], showQuantityControl: [{
|
3201
|
+
type: Input
|
3202
|
+
}], href: [{
|
3203
|
+
type: Input
|
3204
|
+
}], clickFavoriteEvent: [{
|
3205
|
+
type: Output
|
3206
|
+
}], clickAddToCartEvent: [{
|
3207
|
+
type: Output
|
3208
|
+
}], clickClearEvent: [{
|
3209
|
+
type: Output
|
3210
|
+
}], clickCardEvent: [{
|
3211
|
+
type: Output
|
3212
|
+
}], clickPriceHistoryEvent: [{
|
3213
|
+
type: Output
|
3214
|
+
}], quantityValueChanges: [{
|
3215
|
+
type: Output
|
3216
|
+
}] } });
|
3217
|
+
|
3218
|
+
/**
|
3219
|
+
* Компонент QR кода.
|
3220
|
+
*/
|
3221
|
+
class ScQRCodeDialogComponent {
|
3222
|
+
/**
|
3223
|
+
* Инициализирует экземпляр класса {@link ScQRCodeDialogComponent}.
|
3224
|
+
*
|
3225
|
+
* @param vCardService Сервис для работы с vCard.
|
3226
|
+
* @param context Контекст диалогового окна, в котором открыт компонент.
|
3227
|
+
* @param terminal Провайдер данных о терминале.
|
3228
|
+
*/
|
3229
|
+
constructor(vCardService, context, terminal) {
|
3230
|
+
this.vCardService = vCardService;
|
3231
|
+
this.context = context;
|
3232
|
+
this.terminal = terminal;
|
3233
|
+
/**
|
3234
|
+
* Свойство, от которого зависит наличие атрибута `data-terminal-view` у `:host` компонента.
|
3235
|
+
*/
|
3236
|
+
this.terminalView = this.terminal.isRunningOnTerminal;
|
3237
|
+
}
|
3238
|
+
/**
|
3239
|
+
* Выполняет скачивание генерируемого vCard файла контакта.
|
3240
|
+
*/
|
3241
|
+
downloadVCard() {
|
3242
|
+
if (!this.terminal.isRunningOnTerminal && this.isVCardData()) {
|
3243
|
+
this.vCardService.downloadVCard(this.context.data.qrdata);
|
3244
|
+
}
|
3245
|
+
}
|
3246
|
+
/**
|
3247
|
+
* Проверяет что в диалоговое окно были переданы данные в формате `vCard`.
|
3248
|
+
*/
|
3249
|
+
isVCardData() {
|
3250
|
+
// eslint-disable-next-line unicorn/better-regex
|
3251
|
+
return /BEGIN:VCARD[\s\S]*END:VCARD/i.test(this.context.data.qrdata);
|
3252
|
+
}
|
3253
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, deps: [{ token: i1.ScVCardService }, { token: POLYMORPHEUS_CONTEXT }, { token: IS_RUNNING_ON_TERMINAL }], target: i0.ɵɵFactoryTarget.Component }); }
|
3254
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScQRCodeDialogComponent, selector: "sc-qrcode-dialog", host: { properties: { "attr.data-terminal-view": "this.terminalView" } }, ngImport: i0, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"], dependencies: [{ kind: "component", type: i2$4.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
3255
|
+
}
|
3256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, decorators: [{
|
3257
|
+
type: Component,
|
3258
|
+
args: [{ selector: 'sc-qrcode-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"] }]
|
3259
|
+
}], ctorParameters: () => [{ type: i1.ScVCardService }, { type: undefined, decorators: [{
|
3260
|
+
type: Inject,
|
3261
|
+
args: [POLYMORPHEUS_CONTEXT]
|
3262
|
+
}] }, { type: undefined, decorators: [{
|
3263
|
+
type: Inject,
|
3264
|
+
args: [IS_RUNNING_ON_TERMINAL]
|
3265
|
+
}] }], propDecorators: { terminalView: [{
|
3266
|
+
type: HostBinding,
|
3267
|
+
args: ['attr.data-terminal-view']
|
3268
|
+
}] } });
|
3269
|
+
|
3270
|
+
/**
|
3271
|
+
* Модуль QR кода.
|
3272
|
+
*/
|
3273
|
+
class ScQRCodeModule {
|
3274
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
3275
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, declarations: [ScQRCodeDialogComponent], imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewAction, i2$1.TuiPreviewZoom], exports: [ScQRCodeDialogComponent] }); }
|
3276
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, imports: [CommonModule, QRCodeModule, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewZoom] }); }
|
3277
|
+
}
|
3278
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, decorators: [{
|
3279
|
+
type: NgModule,
|
3280
|
+
args: [{
|
3281
|
+
declarations: [ScQRCodeDialogComponent],
|
3282
|
+
imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, ...TuiPreview],
|
3283
|
+
exports: [ScQRCodeDialogComponent],
|
3284
|
+
}]
|
3285
|
+
}] });
|
3286
|
+
|
3287
|
+
/* eslint-disable lodash/prefer-lodash-method */
|
3288
|
+
/**
|
3289
|
+
* Директива открытия диалогового окна с QRCode для ссылок `tel:` и `mailto:` на терминале.
|
3290
|
+
*/
|
3291
|
+
class ScTerminalLinkDirective {
|
3292
|
+
constructor() {
|
3293
|
+
/**
|
3294
|
+
* Ссылка на HTML элемент тега `<a>`.
|
3295
|
+
*/
|
3296
|
+
this.elementReference = inject(ElementRef);
|
3297
|
+
/**
|
3298
|
+
* Сервис для работы с диалоговыми окнами TuiDialog.
|
3299
|
+
*/
|
3300
|
+
this.dialog = inject(TuiDialogService);
|
3301
|
+
/**
|
3302
|
+
* Провайдер данных о терминале.
|
3303
|
+
*/
|
3304
|
+
this.terminal = inject(IS_RUNNING_ON_TERMINAL);
|
3305
|
+
}
|
3306
|
+
/**
|
3307
|
+
* Обработчик клика по ссылке.
|
3308
|
+
*
|
3309
|
+
* @param event Событие клика.
|
3310
|
+
*/
|
3311
|
+
onClick(event) {
|
3312
|
+
if (this.terminal.isRunningOnTerminal && this.isLinkTelOrMail()) {
|
3313
|
+
// Отключение базового события для терминала.
|
3314
|
+
event.preventDefault();
|
3315
|
+
this.openQRCodeDialog();
|
3316
|
+
}
|
3317
|
+
}
|
3318
|
+
/**
|
3319
|
+
* Открывает диалоговое окно с QR-кодом.
|
3320
|
+
*/
|
3321
|
+
openQRCodeDialog() {
|
3322
|
+
this.dialog
|
3323
|
+
.open(new PolymorpheusComponent(ScQRCodeDialogComponent), {
|
3324
|
+
size: 's',
|
3325
|
+
// Передаём ссылку формата `mailto:example@example.com` `tel:+70000000000` вместо vCard, так как для vCard данных недостаточно.
|
3326
|
+
data: { qrdata: this.elementReference.nativeElement.href },
|
3327
|
+
})
|
3328
|
+
.subscribe();
|
3329
|
+
}
|
3330
|
+
/**
|
3331
|
+
* Проверяет ведёт ли ссылка на телефон или адрес электронной почты.
|
3332
|
+
*/
|
3333
|
+
isLinkTelOrMail() {
|
3334
|
+
return this.elementReference.nativeElement.href.startsWith('tel:') || this.elementReference.nativeElement.href.startsWith('mailto:');
|
3335
|
+
}
|
3336
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
3337
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTerminalLinkDirective, isStandalone: true, selector: "a[href]", host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); }
|
3338
|
+
}
|
3339
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, decorators: [{
|
3340
|
+
type: Directive,
|
3341
|
+
args: [{
|
3342
|
+
standalone: true,
|
3343
|
+
selector: 'a[href]',
|
3344
|
+
}]
|
3345
|
+
}], propDecorators: { onClick: [{
|
3346
|
+
type: HostListener,
|
3347
|
+
args: ['click', ['$event']]
|
3348
|
+
}] } });
|
3349
|
+
|
3350
|
+
/**
|
3351
|
+
* Компонент просмотра изображений через событие наведения.
|
3352
|
+
*/
|
3353
|
+
class HoverImageCarouselComponent {
|
3354
|
+
constructor() {
|
3355
|
+
/**
|
3356
|
+
* Массив изображений.
|
3357
|
+
*/
|
3358
|
+
this.images = [];
|
3359
|
+
/**
|
3360
|
+
* Признак что необходимо отобразить элементы управления.
|
3361
|
+
*/
|
3362
|
+
this.isShowActions = true;
|
3363
|
+
/**
|
3364
|
+
* {@link WritableSignal} для отслеживания текущего индекса изображения.
|
3365
|
+
*/
|
3366
|
+
this.currentIndex = signal(0);
|
3367
|
+
}
|
3368
|
+
/**
|
3369
|
+
* Обработчик события `mousemove.silent`.
|
3370
|
+
*
|
3371
|
+
* @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
|
3372
|
+
* @param target Объект {@link HTMLElement} в котором лежат изображения
|
3373
|
+
*/
|
3374
|
+
onHover(offsetX, target) {
|
3375
|
+
if (this.images.length <= 1 || offsetX < 0) {
|
3376
|
+
return;
|
3377
|
+
}
|
3378
|
+
// new Event().preventDefault
|
3379
|
+
const elementWidth = target.offsetWidth;
|
3380
|
+
const hoverPercentage = offsetX / elementWidth;
|
3381
|
+
const newIndex = Math.floor(hoverPercentage * this.images.length);
|
3382
|
+
this.currentIndex.set(newIndex);
|
3383
|
+
}
|
3384
|
+
/**
|
3385
|
+
* Обработчик события `mouseleave.silent`.
|
3386
|
+
*/
|
3387
|
+
onLeave() {
|
3388
|
+
if (this.images.length <= 1) {
|
3389
|
+
return;
|
3390
|
+
}
|
3391
|
+
this.currentIndex.set(0);
|
3392
|
+
}
|
3393
|
+
/**
|
3394
|
+
* Обработчик события наведения указателя мыши на точку.
|
3395
|
+
*
|
3396
|
+
* @param hovered Признак что указатель мыши наведен на точку.
|
3397
|
+
* @param index Индекс изображения, который соответствует точке.
|
3398
|
+
*/
|
3399
|
+
onDotHovered(hovered, index) {
|
3400
|
+
if (hovered) {
|
3401
|
+
this.currentIndex.set(index);
|
3402
|
+
}
|
3403
|
+
}
|
3404
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
3405
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: HoverImageCarouselComponent, isStandalone: true, selector: "sc-hover-image-carousel", inputs: { images: "images", isShowActions: "isShowActions" }, host: { listeners: { "mousemove.silent": "onHover($event.offsetX,$event.target)", "mouseleave.silent": "onLeave()" } }, ngImport: i0, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"], dependencies: [{ kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
3406
|
+
}
|
3407
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HoverImageCarouselComponent, decorators: [{
|
3408
|
+
type: Component,
|
3409
|
+
args: [{ standalone: true, selector: 'sc-hover-image-carousel', imports: [TuiRepeatTimes, TuiButton, TuiHovered], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"] }]
|
3410
|
+
}], propDecorators: { images: [{
|
3411
|
+
type: Input
|
3412
|
+
}], isShowActions: [{
|
3413
|
+
type: Input
|
3414
|
+
}], onHover: [{
|
3415
|
+
type: HostListener,
|
3416
|
+
args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
|
3417
|
+
}], onLeave: [{
|
3418
|
+
type: HostListener,
|
3419
|
+
args: ['mouseleave.silent']
|
3420
|
+
}] } });
|
3421
|
+
|
3422
|
+
/**
|
3423
|
+
* Компонент центы товара с отображением скидки.
|
3424
|
+
*/
|
3425
|
+
class CostWithDiscountComponent {
|
3426
|
+
constructor() {
|
3427
|
+
/**
|
3428
|
+
* {@link Observable} изменения выбранного склада.
|
3379
3429
|
*/
|
3380
3430
|
this.warehouseSelect$ = inject(ScWarehouseService).getWarehouseSelectChange$();
|
3381
3431
|
/**
|
@@ -4360,6 +4410,135 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
4360
4410
|
args: [{ standalone: true, selector: 'sc-resource-preview', imports: [TuiNotification, TuiButton], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (src && isVideoResource()) {\n <video\n #video\n controls\n (canplay)=\"onCanPlay(video)\"\n class=\"size-full bg-black\"\n >\n <source\n [src]=\"src\"\n [type]=\"type\"\n />\n </video>\n} @else {\n <tui-notification\n appearance=\"warning\"\n size=\"l\"\n >\n <div\n tuiTitle\n [style.padding-inline-end.rem]=\"2\"\n class=\"flex flex-col\"\n >\n {{ !src || !type ? '\u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435, \u0440\u0435\u0441\u0443\u0440\u0441 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D.' : '\u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435, \u0434\u0430\u043D\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F.' }}\n <button\n tuiButton\n type=\"button\"\n size=\"m\"\n appearance=\"primary\"\n (click)=\"context?.$implicit?.complete()\"\n class=\"mt-4 self-center\"\n >\n \u0417\u0430\u043A\u0440\u044B\u0442\u044C\n </button>\n </div>\n </tui-notification>\n}\n", styles: [":host{display:flex;height:100lvh;width:100%;justify-content:center;align-items:center}\n"] }]
|
4361
4411
|
}] });
|
4362
4412
|
|
4413
|
+
/**
|
4414
|
+
* Токен обработчика смены ошибки.
|
4415
|
+
*/
|
4416
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
4417
|
+
const SC_ERROR_CHANGE_HANDLER = tuiCreateTokenFromFactory(() => () => noop);
|
4418
|
+
|
4419
|
+
/**
|
4420
|
+
* Компонент для управления кодом ошибки отображаемой на странице.
|
4421
|
+
*/
|
4422
|
+
class ScErrorHandlerComponent {
|
4423
|
+
/**
|
4424
|
+
* Инициирует экземпляр класса {@link ErrorHandlerComponent}.
|
4425
|
+
*/
|
4426
|
+
constructor() {
|
4427
|
+
/**
|
4428
|
+
* Сигнал для хранения кода ошибки.
|
4429
|
+
*/
|
4430
|
+
this.code = signal(null);
|
4431
|
+
/**
|
4432
|
+
* Сигнал дефолтного передаваемого из вне значения ошибки.
|
4433
|
+
*/
|
4434
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
4435
|
+
this.defaultCode = input(null, { alias: 'code' });
|
4436
|
+
/**
|
4437
|
+
* Сервис маршрутизации.
|
4438
|
+
*/
|
4439
|
+
this.router = inject(Router);
|
4440
|
+
/**
|
4441
|
+
* Обработчик изменения ошибки.
|
4442
|
+
*/
|
4443
|
+
this.errorChangeHandler = inject(SC_ERROR_CHANGE_HANDLER);
|
4444
|
+
this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
|
4445
|
+
// Сбрасываем ошибку при переходе на новый маршрут.
|
4446
|
+
this.code.set(this.defaultCode());
|
4447
|
+
});
|
4448
|
+
}
|
4449
|
+
/**
|
4450
|
+
* Возвращает текущий сигнал с кодом ошибки.
|
4451
|
+
*/
|
4452
|
+
getErrorCode() {
|
4453
|
+
return this.code;
|
4454
|
+
}
|
4455
|
+
/**
|
4456
|
+
* Устанавливает новый код ошибки.
|
4457
|
+
*
|
4458
|
+
* @param code Новый код ошибки.
|
4459
|
+
*/
|
4460
|
+
setErrorCode(code) {
|
4461
|
+
this.code.set(code);
|
4462
|
+
}
|
4463
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
4464
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScErrorHandlerComponent, isStandalone: true, selector: "sc-error-handler", inputs: { defaultCode: { classPropertyName: "defaultCode", publicName: "code", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (code() === null) {\n <ng-content />\n} @else {\n <sc-error-block-status (pageErrorChange)=\"errorChangeHandler($event)\"></sc-error-block-status>\n}\n", dependencies: [{ kind: "component", type: ScErrorBlockStatusComponent, selector: "sc-error-block-status", outputs: ["pageErrorChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
4465
|
+
}
|
4466
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, decorators: [{
|
4467
|
+
type: Component,
|
4468
|
+
args: [{ standalone: true, selector: 'sc-error-handler', imports: [ScErrorBlockStatusComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (code() === null) {\n <ng-content />\n} @else {\n <sc-error-block-status (pageErrorChange)=\"errorChangeHandler($event)\"></sc-error-block-status>\n}\n" }]
|
4469
|
+
}], ctorParameters: () => [] });
|
4470
|
+
|
4471
|
+
/**
|
4472
|
+
* Компонент представления данных об ошибке.
|
4473
|
+
*/
|
4474
|
+
class ScErrorBlockStatusComponent {
|
4475
|
+
/**
|
4476
|
+
* Инициализирует экземпляр класса {@link ErrorPageComponent}.
|
4477
|
+
*/
|
4478
|
+
constructor() {
|
4479
|
+
/**
|
4480
|
+
* Компонент управляющий кодом ошибки отображаемой на странице.
|
4481
|
+
*/
|
4482
|
+
this.errorHandlerComponent = inject(ScErrorHandlerComponent, { skipSelf: true });
|
4483
|
+
/**
|
4484
|
+
* Сигнал кода ошибки.
|
4485
|
+
*/
|
4486
|
+
this.code = this.errorHandlerComponent.getErrorCode();
|
4487
|
+
/**
|
4488
|
+
* Данные об ошибке.
|
4489
|
+
*/
|
4490
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
4491
|
+
this.error = computed(() => this.getErrorMessage(this.code()));
|
4492
|
+
/**
|
4493
|
+
* Создает сигнал изменения строкового представления об ошибке.
|
4494
|
+
*/
|
4495
|
+
this.pageErrorChange = output();
|
4496
|
+
// Если компонент отображён маршрутизацией из-за перехода по неизвестному маршруту, то устанавливаем код 404.
|
4497
|
+
if (inject(ActivatedRoute).snapshot.data['routes_key'] === 'error') {
|
4498
|
+
this.errorHandlerComponent.setErrorCode(404);
|
4499
|
+
}
|
4500
|
+
effect(() => {
|
4501
|
+
if (this.code() !== null) {
|
4502
|
+
this.pageErrorChange.emit(this.error());
|
4503
|
+
}
|
4504
|
+
});
|
4505
|
+
}
|
4506
|
+
/**
|
4507
|
+
* Возвращает описание ошибки.
|
4508
|
+
*
|
4509
|
+
* @param code Код ошибки.
|
4510
|
+
*/
|
4511
|
+
// eslint-disable-next-line class-methods-use-this
|
4512
|
+
getErrorMessage(code) {
|
4513
|
+
switch (code) {
|
4514
|
+
case 403:
|
4515
|
+
return {
|
4516
|
+
message: 'К сожалению, у вас нет доступа к этому ресурсу',
|
4517
|
+
description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
|
4518
|
+
code,
|
4519
|
+
};
|
4520
|
+
case 404:
|
4521
|
+
return {
|
4522
|
+
message: 'К сожалению, такой страницы нет',
|
4523
|
+
description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
|
4524
|
+
code,
|
4525
|
+
};
|
4526
|
+
default:
|
4527
|
+
return {
|
4528
|
+
message: 'Неизвестная ошибка',
|
4529
|
+
description: 'Пожалуйста обновите страницу или обратитесь к менеджеру',
|
4530
|
+
code: 0,
|
4531
|
+
};
|
4532
|
+
}
|
4533
|
+
}
|
4534
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
4535
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScErrorBlockStatusComponent, isStandalone: true, selector: "sc-error-block-status", outputs: { pageErrorChange: "pageErrorChange" }, ngImport: i0, template: "<div class=\"flex flex-col items-center gap-8\">\n <div class=\"border-20 border-solid border-tui-primary text-center sm:border-32\">\n <div class=\"text-8xl leading-1.15 text-black sm:text-44\">\n {{ error().code }}\n </div>\n <div class=\"text-6xl leading-1.15 text-tui-primary sm:text-8xl\">ERROR</div>\n </div>\n <div class=\"flex flex-col gap-2 text-center\">\n <div class=\"text-h5 sm:text-h4\">{{ error().message }}</div>\n <div class=\"text-body-m-bold sm:text-h6\">{{ error().description }}</div>\n </div>\n <button\n tuiButton\n appearance=\"primary\"\n routerLink=\"/\"\n >\n \u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u0443\u044E\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
4536
|
+
}
|
4537
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, decorators: [{
|
4538
|
+
type: Component,
|
4539
|
+
args: [{ standalone: true, selector: 'sc-error-block-status', imports: [TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TuiButton, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col items-center gap-8\">\n <div class=\"border-20 border-solid border-tui-primary text-center sm:border-32\">\n <div class=\"text-8xl leading-1.15 text-black sm:text-44\">\n {{ error().code }}\n </div>\n <div class=\"text-6xl leading-1.15 text-tui-primary sm:text-8xl\">ERROR</div>\n </div>\n <div class=\"flex flex-col gap-2 text-center\">\n <div class=\"text-h5 sm:text-h4\">{{ error().message }}</div>\n <div class=\"text-body-m-bold sm:text-h6\">{{ error().description }}</div>\n </div>\n <button\n tuiButton\n appearance=\"primary\"\n routerLink=\"/\"\n >\n \u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u0443\u044E\n </button>\n</div>\n" }]
|
4540
|
+
}], ctorParameters: () => [] });
|
4541
|
+
|
4363
4542
|
/* eslint-disable class-methods-use-this */
|
4364
4543
|
/**
|
4365
4544
|
* Сервис работающий с значками элементов дерева.
|
@@ -5454,11 +5633,11 @@ class ScUserManagersComponent {
|
|
5454
5633
|
this.qrClickEvent = new EventEmitter();
|
5455
5634
|
}
|
5456
5635
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserManagersComponent, deps: [{ token: i1.ScUserService }], target: i0.ɵɵFactoryTarget.Component }); }
|
5457
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScUserManagersComponent, selector: "sc-user-managers", outputs: { qrClickEvent: "qrClickEvent" }, ngImport: i0, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "[scTelLink]", inputs: ["scTelLink"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
5636
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScUserManagersComponent, selector: "sc-user-managers", outputs: { qrClickEvent: "qrClickEvent" }, ngImport: i0, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"user-managers\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n linkLocation=\"user-managers\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "a[scTelLink]", inputs: ["scTelLink", "linkLocation"] }, { kind: "directive", type: ScEmailLinkDirective, selector: "a[scEmailLink]", inputs: ["linkLocation"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
5458
5637
|
}
|
5459
5638
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserManagersComponent, decorators: [{
|
5460
5639
|
type: Component,
|
5461
|
-
args: [{ selector: 'sc-user-managers', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"] }]
|
5640
|
+
args: [{ selector: 'sc-user-managers', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"user-managers\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n linkLocation=\"user-managers\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"] }]
|
5462
5641
|
}], ctorParameters: () => [{ type: i1.ScUserService }], propDecorators: { qrClickEvent: [{
|
5463
5642
|
type: Output
|
5464
5643
|
}] } });
|
@@ -5570,9 +5749,7 @@ class ScUserModule {
|
|
5570
5749
|
TuiInputPhoneModule,
|
5571
5750
|
TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiDataListDirective, i1$1.TuiOption, i1$1.TuiOptGroup, TuiSelectModule,
|
5572
5751
|
TuiLink,
|
5573
|
-
ScTerminalLinkDirective,
|
5574
|
-
ScTelLinkModule,
|
5575
|
-
TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
|
5752
|
+
ScTerminalLinkDirective, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
|
5576
5753
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, imports: [CommonModule,
|
5577
5754
|
FormsModule,
|
5578
5755
|
ReactiveFormsModule,
|
@@ -5585,7 +5762,6 @@ class ScUserModule {
|
|
5585
5762
|
TuiInputModule,
|
5586
5763
|
TuiInputPhoneModule,
|
5587
5764
|
TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiOption, TuiSelectModule,
|
5588
|
-
ScTelLinkModule,
|
5589
5765
|
TuiButtonLoading] }); }
|
5590
5766
|
}
|
5591
5767
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, decorators: [{
|
@@ -5613,7 +5789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
5613
5789
|
TuiSelectModule,
|
5614
5790
|
TuiLink,
|
5615
5791
|
ScTerminalLinkDirective,
|
5616
|
-
|
5792
|
+
...ScLinks,
|
5617
5793
|
TuiButtonLoading,
|
5618
5794
|
],
|
5619
5795
|
exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent],
|
@@ -5737,14 +5913,14 @@ class ScProfileAccordionsContentComponent {
|
|
5737
5913
|
return this.locationsService.getUserCity$(cityId);
|
5738
5914
|
}
|
5739
5915
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileAccordionsContentComponent, deps: [{ token: SC_USER_INFO }, { token: i1.ScLocationsService }, { token: i1.ScUserService }, { token: i1.ScVerificationService }], target: i0.ɵɵFactoryTarget.Component }); }
|
5740
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScProfileAccordionsContentComponent, selector: "sc-profile-accordions-content", outputs: { editProfileClick: "editProfileClick", approvePhoneClick: "approvePhoneClick", addContragentClick: "addContragentClick", deleteContragentClick: "deleteContragentClick", addContragentBankAccountClick: "addContragentBankAccountClick", deleteContragentBankAccountClick: "deleteContragentBankAccountClick", addContragentContactClick: "addContragentContactClick", deleteContragentContactClick: "deleteContragentContactClick", addDeliveryAddressClick: "addDeliveryAddressClick", deleteDeliveryAddressClick: "deleteDeliveryAddressClick", addDeliveryAddressContactClick: "addDeliveryAddressContactClick", deleteDeliveryAddressContactClick: "deleteDeliveryAddressContactClick", addUserContactClick: "addUserContactClick", deleteUserContactClick: "deleteUserContactClick" }, providers: [SC_USER_PROVIDERS], ngImport: i0, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n >{{ user.contacts.phone.value | scFormatePhone }}</a\n >\n <span\n *ngIf=\"!user.contacts.phone.isApproved\"\n class=\"text-tui-text-03\"\n >\n (\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"approvePhoneClick.emit()\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C</button\n >)\n </span>\n </div>\n <div\n *tuiLet=\"!!(isSendApproveEmail$ | async) as isSendApproveEmail\"\n class=\"flex flex-wrap gap-x-2\"\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ user.contacts.email.value }}\"\n >\n {{ user.contacts.email.value }}\n </a>\n <span\n *ngIf=\"!isSendApproveEmail && !user.contacts.email.isApproved\"\n class=\"inline-flex flex-wrap gap-1 text-tui-text-03\"\n >\n E-mail \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <tui-loader\n [showLoader]=\"!!(approveEmailLoading$ | async)\"\n [overlay]=\"true\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"onSendApproveEmail.next(user.contacts.email.value)\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n </button>\n </tui-loader>\n </span>\n <span\n *ngIf=\"isSendApproveEmail\"\n class=\"text-tui-success-fill\"\n @tuiFadeIn\n >\n \u041F\u0438\u0441\u044C\u043C\u043E \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432 \u043F\u0438\u0441\u044C\u043C\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.\n </span>\n </div>\n <tui-loader\n [showLoader]=\"!!(getNewsLoading$ | async)\"\n [overlay]=\"true\"\n >\n <label tuiLabel>\n <input\n tuiCheckbox\n type=\"checkbox\"\n size=\"s\"\n class=\"w-full\"\n [formControl]=\"getNewsControl\"\n [ngModel]=\"user.getNews\"\n />\n \u042F \u0445\u043E\u0447\u0443 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0443 \u0421\u043D\u0430\u0431\u0446\u0435\u043D\u0442\u0440 \u043E \u0441\u043A\u0438\u0434\u043A\u0430\u0445 \u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u043F\u043E \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u0435.\n </label>\n </tui-loader>\n </div>\n\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.pencil\"\n appearance=\"flat\"\n (click)=\"editProfileClick.emit()\"\n ></button>\n </div>\n </tui-loader>\n </ng-template>\n </sc-accordion>\n <sc-contragents-accordion\n (addContragentClick)=\"addContragentClick.emit()\"\n (deleteContragentClick)=\"deleteContragentClick.emit($event)\"\n (addContragentBankAccountClick)=\"addContragentBankAccountClick.emit($event)\"\n (deleteContragentBankAccountClick)=\"deleteContragentBankAccountClick.emit($event)\"\n (addContragentContactClick)=\"addContragentContactClick.emit($event)\"\n (deleteContragentContactClick)=\"deleteContragentContactClick.emit($event)\"\n ></sc-contragents-accordion>\n <sc-delivery-address-accordion\n (addDeliveryAddressClick)=\"addDeliveryAddressClick.emit()\"\n (deleteDeliveryAddressClick)=\"deleteDeliveryAddressClick.emit($event)\"\n (addDeliveryAddressContactClick)=\"addDeliveryAddressContactClick.emit($event)\"\n (deleteDeliveryAddressContactClick)=\"deleteDeliveryAddressContactClick.emit($event)\"\n ></sc-delivery-address-accordion>\n <sc-contacts-accordion\n *ngIf=\"user\"\n [contacts$]=\"userContacts$\"\n (addContactClick)=\"addUserContactClick.emit(user.id)\"\n (deleteButtonClick)=\"deleteUserContactClick.emit($event)\"\n ></sc-contacts-accordion>\n <sc-accordion\n #passwordAccordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n >\n \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C\n <ng-template scAccordionContent>\n <sc-reset-user-password (successResetPassword)=\"passwordAccordion.close()\"></sc-reset-user-password>\n </ng-template>\n </sc-accordion>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScResetUserPasswordComponent, selector: "sc-reset-user-password", outputs: ["successResetPassword"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: ScContragentsAccordionComponent, selector: "sc-contragents-accordion", outputs: ["addContragentClick", "deleteContragentClick", "addContragentBankAccountClick", "deleteContragentBankAccountClick", "addContragentContactClick", "deleteContragentContactClick"] }, { kind: "component", type: ScDeliveryAddressAccordionComponent, selector: "sc-delivery-address-accordion", outputs: ["addDeliveryAddressClick", "deleteDeliveryAddressClick", "addDeliveryAddressContactClick", "deleteDeliveryAddressContactClick"] }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: i1$1.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i1$1.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: ["contacts$"], outputs: ["addContactClick", "deleteButtonClick"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "[scTelLink]", inputs: ["scTelLink"] }, { kind: "component", type: i2$1.TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], animations: [tuiFadeIn], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
5916
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScProfileAccordionsContentComponent, selector: "sc-profile-accordions-content", outputs: { editProfileClick: "editProfileClick", approvePhoneClick: "approvePhoneClick", addContragentClick: "addContragentClick", deleteContragentClick: "deleteContragentClick", addContragentBankAccountClick: "addContragentBankAccountClick", deleteContragentBankAccountClick: "deleteContragentBankAccountClick", addContragentContactClick: "addContragentContactClick", deleteContragentContactClick: "deleteContragentContactClick", addDeliveryAddressClick: "addDeliveryAddressClick", deleteDeliveryAddressClick: "deleteDeliveryAddressClick", addDeliveryAddressContactClick: "addDeliveryAddressContactClick", deleteDeliveryAddressContactClick: "deleteDeliveryAddressContactClick", addUserContactClick: "addUserContactClick", deleteUserContactClick: "deleteUserContactClick" }, providers: [SC_USER_PROVIDERS], ngImport: i0, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n linkLocation=\"profile\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n >\n {{ user.contacts.phone.value | scFormatePhone }}\n </a>\n <span\n *ngIf=\"!user.contacts.phone.isApproved\"\n class=\"text-tui-text-03\"\n >\n (\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"approvePhoneClick.emit()\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C</button\n >)\n </span>\n </div>\n <div\n *tuiLet=\"!!(isSendApproveEmail$ | async) as isSendApproveEmail\"\n class=\"flex flex-wrap gap-x-2\"\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"profile\"\n href=\"mailto:{{ user.contacts.email.value }}\"\n >\n {{ user.contacts.email.value }}\n </a>\n <span\n *ngIf=\"!isSendApproveEmail && !user.contacts.email.isApproved\"\n class=\"inline-flex flex-wrap gap-1 text-tui-text-03\"\n >\n E-mail \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <tui-loader\n [showLoader]=\"!!(approveEmailLoading$ | async)\"\n [overlay]=\"true\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"onSendApproveEmail.next(user.contacts.email.value)\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n </button>\n </tui-loader>\n </span>\n <span\n *ngIf=\"isSendApproveEmail\"\n class=\"text-tui-success-fill\"\n @tuiFadeIn\n >\n \u041F\u0438\u0441\u044C\u043C\u043E \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432 \u043F\u0438\u0441\u044C\u043C\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.\n </span>\n </div>\n <tui-loader\n [showLoader]=\"!!(getNewsLoading$ | async)\"\n [overlay]=\"true\"\n >\n <label tuiLabel>\n <input\n tuiCheckbox\n type=\"checkbox\"\n size=\"s\"\n class=\"w-full\"\n [formControl]=\"getNewsControl\"\n [ngModel]=\"user.getNews\"\n />\n \u042F \u0445\u043E\u0447\u0443 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0443 \u0421\u043D\u0430\u0431\u0446\u0435\u043D\u0442\u0440 \u043E \u0441\u043A\u0438\u0434\u043A\u0430\u0445 \u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u043F\u043E \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u0435.\n </label>\n </tui-loader>\n </div>\n\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.pencil\"\n appearance=\"flat\"\n (click)=\"editProfileClick.emit()\"\n ></button>\n </div>\n </tui-loader>\n </ng-template>\n </sc-accordion>\n <sc-contragents-accordion\n (addContragentClick)=\"addContragentClick.emit()\"\n (deleteContragentClick)=\"deleteContragentClick.emit($event)\"\n (addContragentBankAccountClick)=\"addContragentBankAccountClick.emit($event)\"\n (deleteContragentBankAccountClick)=\"deleteContragentBankAccountClick.emit($event)\"\n (addContragentContactClick)=\"addContragentContactClick.emit($event)\"\n (deleteContragentContactClick)=\"deleteContragentContactClick.emit($event)\"\n ></sc-contragents-accordion>\n <sc-delivery-address-accordion\n (addDeliveryAddressClick)=\"addDeliveryAddressClick.emit()\"\n (deleteDeliveryAddressClick)=\"deleteDeliveryAddressClick.emit($event)\"\n (addDeliveryAddressContactClick)=\"addDeliveryAddressContactClick.emit($event)\"\n (deleteDeliveryAddressContactClick)=\"deleteDeliveryAddressContactClick.emit($event)\"\n ></sc-delivery-address-accordion>\n <sc-contacts-accordion\n *ngIf=\"user\"\n [contacts$]=\"userContacts$\"\n (addContactClick)=\"addUserContactClick.emit(user.id)\"\n (deleteButtonClick)=\"deleteUserContactClick.emit($event)\"\n ></sc-contacts-accordion>\n <sc-accordion\n #passwordAccordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n >\n \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C\n <ng-template scAccordionContent>\n <sc-reset-user-password (successResetPassword)=\"passwordAccordion.close()\"></sc-reset-user-password>\n </ng-template>\n </sc-accordion>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScResetUserPasswordComponent, selector: "sc-reset-user-password", outputs: ["successResetPassword"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: ScContragentsAccordionComponent, selector: "sc-contragents-accordion", outputs: ["addContragentClick", "deleteContragentClick", "addContragentBankAccountClick", "deleteContragentBankAccountClick", "addContragentContactClick", "deleteContragentContactClick"] }, { kind: "component", type: ScDeliveryAddressAccordionComponent, selector: "sc-delivery-address-accordion", outputs: ["addDeliveryAddressClick", "deleteDeliveryAddressClick", "addDeliveryAddressContactClick", "deleteDeliveryAddressContactClick"] }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: i1$1.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i1$1.TuiIcon, selector: "tui-icon", inputs: ["icon", "background"] }, { kind: "directive", type: i3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: ["contacts$"], outputs: ["addContactClick", "deleteButtonClick"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "a[scTelLink]", inputs: ["scTelLink", "linkLocation"] }, { kind: "directive", type: ScEmailLinkDirective, selector: "a[scEmailLink]", inputs: ["linkLocation"] }, { kind: "component", type: i2$1.TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], animations: [tuiFadeIn], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
5741
5917
|
}
|
5742
5918
|
__decorate([
|
5743
5919
|
tuiPure // TODO: TASK[#7615] Удалить поле рефакторинга сервиса работы с пользователем.
|
5744
5920
|
], ScProfileAccordionsContentComponent.prototype, "getUserCity$", null);
|
5745
5921
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileAccordionsContentComponent, decorators: [{
|
5746
5922
|
type: Component,
|
5747
|
-
args: [{ selector: 'sc-profile-accordions-content', providers: [SC_USER_PROVIDERS], animations: [tuiFadeIn], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n
|
5923
|
+
args: [{ selector: 'sc-profile-accordions-content', providers: [SC_USER_PROVIDERS], animations: [tuiFadeIn], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n linkLocation=\"profile\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n >\n {{ user.contacts.phone.value | scFormatePhone }}\n </a>\n <span\n *ngIf=\"!user.contacts.phone.isApproved\"\n class=\"text-tui-text-03\"\n >\n (\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"approvePhoneClick.emit()\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C</button\n >)\n </span>\n </div>\n <div\n *tuiLet=\"!!(isSendApproveEmail$ | async) as isSendApproveEmail\"\n class=\"flex flex-wrap gap-x-2\"\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"profile\"\n href=\"mailto:{{ user.contacts.email.value }}\"\n >\n {{ user.contacts.email.value }}\n </a>\n <span\n *ngIf=\"!isSendApproveEmail && !user.contacts.email.isApproved\"\n class=\"inline-flex flex-wrap gap-1 text-tui-text-03\"\n >\n E-mail \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <tui-loader\n [showLoader]=\"!!(approveEmailLoading$ | async)\"\n [overlay]=\"true\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"onSendApproveEmail.next(user.contacts.email.value)\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n </button>\n </tui-loader>\n </span>\n <span\n *ngIf=\"isSendApproveEmail\"\n class=\"text-tui-success-fill\"\n @tuiFadeIn\n >\n \u041F\u0438\u0441\u044C\u043C\u043E \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432 \u043F\u0438\u0441\u044C\u043C\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.\n </span>\n </div>\n <tui-loader\n [showLoader]=\"!!(getNewsLoading$ | async)\"\n [overlay]=\"true\"\n >\n <label tuiLabel>\n <input\n tuiCheckbox\n type=\"checkbox\"\n size=\"s\"\n class=\"w-full\"\n [formControl]=\"getNewsControl\"\n [ngModel]=\"user.getNews\"\n />\n \u042F \u0445\u043E\u0447\u0443 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0443 \u0421\u043D\u0430\u0431\u0446\u0435\u043D\u0442\u0440 \u043E \u0441\u043A\u0438\u0434\u043A\u0430\u0445 \u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u043F\u043E \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u0435.\n </label>\n </tui-loader>\n </div>\n\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.pencil\"\n appearance=\"flat\"\n (click)=\"editProfileClick.emit()\"\n ></button>\n </div>\n </tui-loader>\n </ng-template>\n </sc-accordion>\n <sc-contragents-accordion\n (addContragentClick)=\"addContragentClick.emit()\"\n (deleteContragentClick)=\"deleteContragentClick.emit($event)\"\n (addContragentBankAccountClick)=\"addContragentBankAccountClick.emit($event)\"\n (deleteContragentBankAccountClick)=\"deleteContragentBankAccountClick.emit($event)\"\n (addContragentContactClick)=\"addContragentContactClick.emit($event)\"\n (deleteContragentContactClick)=\"deleteContragentContactClick.emit($event)\"\n ></sc-contragents-accordion>\n <sc-delivery-address-accordion\n (addDeliveryAddressClick)=\"addDeliveryAddressClick.emit()\"\n (deleteDeliveryAddressClick)=\"deleteDeliveryAddressClick.emit($event)\"\n (addDeliveryAddressContactClick)=\"addDeliveryAddressContactClick.emit($event)\"\n (deleteDeliveryAddressContactClick)=\"deleteDeliveryAddressContactClick.emit($event)\"\n ></sc-delivery-address-accordion>\n <sc-contacts-accordion\n *ngIf=\"user\"\n [contacts$]=\"userContacts$\"\n (addContactClick)=\"addUserContactClick.emit(user.id)\"\n (deleteButtonClick)=\"deleteUserContactClick.emit($event)\"\n ></sc-contacts-accordion>\n <sc-accordion\n #passwordAccordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n >\n \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C\n <ng-template scAccordionContent>\n <sc-reset-user-password (successResetPassword)=\"passwordAccordion.close()\"></sc-reset-user-password>\n </ng-template>\n </sc-accordion>\n</div>\n" }]
|
5748
5924
|
}], ctorParameters: () => [{ type: i6$1.Observable, decorators: [{
|
5749
5925
|
type: Inject,
|
5750
5926
|
args: [SC_USER_INFO]
|
@@ -5797,9 +5973,7 @@ class ScProfileModule {
|
|
5797
5973
|
ReactiveFormsModule,
|
5798
5974
|
TuiButton,
|
5799
5975
|
ScContactsModule,
|
5800
|
-
ScTerminalLinkDirective,
|
5801
|
-
ScTelLinkModule,
|
5802
|
-
TuiCheckbox], exports: [ScProfileAccordionsContentComponent] }); }
|
5976
|
+
ScTerminalLinkDirective, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiCheckbox], exports: [ScProfileAccordionsContentComponent] }); }
|
5803
5977
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileModule, imports: [CommonModule,
|
5804
5978
|
ScUserModule,
|
5805
5979
|
ScAccordionModule,
|
@@ -5810,7 +5984,6 @@ class ScProfileModule {
|
|
5810
5984
|
FormsModule,
|
5811
5985
|
ReactiveFormsModule,
|
5812
5986
|
ScContactsModule,
|
5813
|
-
ScTelLinkModule,
|
5814
5987
|
TuiCheckbox] }); }
|
5815
5988
|
}
|
5816
5989
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileModule, decorators: [{
|
@@ -5833,7 +6006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
5833
6006
|
TuiButton,
|
5834
6007
|
ScContactsModule,
|
5835
6008
|
ScTerminalLinkDirective,
|
5836
|
-
|
6009
|
+
...ScLinks,
|
5837
6010
|
TuiCheckbox,
|
5838
6011
|
],
|
5839
6012
|
exports: [ScProfileAccordionsContentComponent],
|
@@ -5848,5 +6021,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
5848
6021
|
* Generated bundle index. Do not edit.
|
5849
6022
|
*/
|
5850
6023
|
|
5851
|
-
export { AbstractScPriceCard, AuthMethod, FilesAndDocumentsComponent, FilesAndDocumentsModule, SC_QA_INFO, SC_USER_INFO, SC_USER_PROVIDERS, ScAccordionComponent, ScAccordionContentDirective, ScAccordionModule, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddressesSelectionFieldComponent, ScAskToSampleFormComponent, ScAuthModule, ScBannerComponent, ScBannerModule, ScBrandsListComponent, ScBrandsListModule, ScCartItemMobileComponent, ScCartModule, ScCatalogModule, ScCategoryCardComponent, ScContactsAccordionComponent, ScContactsModule, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScContragentsModule, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDeliveryAddressModule, ScFavoriteButtonComponent, ScFormFieldsModule, ScFormatePhonePipe, ScInputQuantityComponent, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNewsModule, ScNextInputFocusDirective, ScNextInputFocusModule, ScOrderItemMobileComponent, ScOrderModule, ScPaymentStatusComponent, ScPreviewSampleComponent, ScPreviewSampleModule, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScProfileAccordionsContentComponent, ScProfileModule, ScQRCodeDialogComponent, ScQRCodeModule, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective,
|
6024
|
+
export { AbstractScPriceCard, AuthMethod, FilesAndDocumentsComponent, FilesAndDocumentsModule, SC_ERROR_CHANGE_HANDLER, SC_QA_INFO, SC_USER_INFO, SC_USER_PROVIDERS, ScAccordionComponent, ScAccordionContentDirective, ScAccordionModule, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddressesSelectionFieldComponent, ScAskToSampleFormComponent, ScAuthModule, ScBannerComponent, ScBannerModule, ScBrandsListComponent, ScBrandsListModule, ScCartItemMobileComponent, ScCartModule, ScCatalogModule, ScCategoryCardComponent, ScContactsAccordionComponent, ScContactsModule, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScContragentsModule, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDeliveryAddressModule, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFormFieldsModule, ScFormatePhonePipe, ScInputQuantityComponent, ScLinks, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNewsModule, ScNextInputFocusDirective, ScNextInputFocusModule, ScOrderItemMobileComponent, ScOrderModule, ScPaymentStatusComponent, ScPreviewSampleComponent, ScPreviewSampleModule, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScProfileAccordionsContentComponent, ScProfileModule, ScQRCodeDialogComponent, ScQRCodeModule, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserModule, ScUserPhoneApproveDialogComponent, ScVerificationModule, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scPasswordConfirmMatchingValidator, scUserFactory, stepValidator };
|
5852
6025
|
//# sourceMappingURL=snabcentr-client-ui.mjs.map
|