@snabcentr/client-ui 3.7.0 → 3.8.2
Sign up to get free protection for your applications and to get access to all the features.
- 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 +2 -6
- 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, computed, output, effect, input, 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, RouterLink, Router, NavigationEnd } 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 ScErrorBlockStatusComponent {
|
4423
|
+
/**
|
4424
|
+
* Инициализирует экземпляр класса {@link ErrorPageComponent}.
|
4425
|
+
*/
|
4426
|
+
constructor() {
|
4427
|
+
/**
|
4428
|
+
* Компонент управляющий кодом ошибки отображаемой на странице.
|
4429
|
+
*/
|
4430
|
+
this.errorHandlerComponent = inject(ScErrorHandlerComponent, { skipSelf: true });
|
4431
|
+
/**
|
4432
|
+
* Сигнал кода ошибки.
|
4433
|
+
*/
|
4434
|
+
this.code = this.errorHandlerComponent.getErrorCode();
|
4435
|
+
/**
|
4436
|
+
* Данные об ошибке.
|
4437
|
+
*/
|
4438
|
+
// eslint-disable-next-line unicorn/consistent-function-scoping
|
4439
|
+
this.error = computed(() => this.getErrorMessage(this.code()));
|
4440
|
+
/**
|
4441
|
+
* Создает сигнал изменения строкового представления об ошибке.
|
4442
|
+
*/
|
4443
|
+
this.pageErrorChange = output();
|
4444
|
+
// Если компонент отображён маршрутизацией из-за перехода по неизвестному маршруту, то устанавливаем код 404.
|
4445
|
+
if (inject(ActivatedRoute).snapshot.data['routes_key'] === 'error') {
|
4446
|
+
this.errorHandlerComponent.setErrorCode(404);
|
4447
|
+
}
|
4448
|
+
effect(() => {
|
4449
|
+
if (this.code() !== null) {
|
4450
|
+
this.pageErrorChange.emit(this.error());
|
4451
|
+
}
|
4452
|
+
});
|
4453
|
+
}
|
4454
|
+
/**
|
4455
|
+
* Возвращает описание ошибки.
|
4456
|
+
*
|
4457
|
+
* @param code Код ошибки.
|
4458
|
+
*/
|
4459
|
+
// eslint-disable-next-line class-methods-use-this
|
4460
|
+
getErrorMessage(code) {
|
4461
|
+
switch (code) {
|
4462
|
+
case 403:
|
4463
|
+
return {
|
4464
|
+
message: 'К сожалению, у вас нет доступа к этому ресурсу',
|
4465
|
+
description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
|
4466
|
+
code,
|
4467
|
+
};
|
4468
|
+
case 404:
|
4469
|
+
return {
|
4470
|
+
message: 'К сожалению, такой страницы нет',
|
4471
|
+
description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
|
4472
|
+
code,
|
4473
|
+
};
|
4474
|
+
default:
|
4475
|
+
return {
|
4476
|
+
message: 'Неизвестная ошибка',
|
4477
|
+
description: 'Пожалуйста обновите страницу или обратитесь к менеджеру',
|
4478
|
+
code: 0,
|
4479
|
+
};
|
4480
|
+
}
|
4481
|
+
}
|
4482
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
4483
|
+
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 }); }
|
4484
|
+
}
|
4485
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, decorators: [{
|
4486
|
+
type: Component,
|
4487
|
+
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" }]
|
4488
|
+
}], ctorParameters: () => [] });
|
4489
|
+
|
4490
|
+
/**
|
4491
|
+
* Компонент для управления кодом ошибки отображаемой на странице.
|
4492
|
+
*/
|
4493
|
+
class ScErrorHandlerComponent {
|
4494
|
+
/**
|
4495
|
+
* Инициирует экземпляр класса {@link ErrorHandlerComponent}.
|
4496
|
+
*/
|
4497
|
+
constructor() {
|
4498
|
+
/**
|
4499
|
+
* Сигнал для хранения кода ошибки.
|
4500
|
+
*/
|
4501
|
+
this.code = signal(null);
|
4502
|
+
/**
|
4503
|
+
* Сигнал дефолтного передаваемого из вне значения ошибки.
|
4504
|
+
*/
|
4505
|
+
// eslint-disable-next-line @angular-eslint/no-input-rename
|
4506
|
+
this.defaultCode = input(null, { alias: 'code' });
|
4507
|
+
/**
|
4508
|
+
* Сервис маршрутизации.
|
4509
|
+
*/
|
4510
|
+
this.router = inject(Router);
|
4511
|
+
/**
|
4512
|
+
* Обработчик изменения ошибки.
|
4513
|
+
*/
|
4514
|
+
this.errorChangeHandler = inject(SC_ERROR_CHANGE_HANDLER);
|
4515
|
+
this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
|
4516
|
+
// Сбрасываем ошибку при переходе на новый маршрут.
|
4517
|
+
this.code.set(this.defaultCode());
|
4518
|
+
});
|
4519
|
+
}
|
4520
|
+
/**
|
4521
|
+
* Возвращает текущий сигнал с кодом ошибки.
|
4522
|
+
*/
|
4523
|
+
getErrorCode() {
|
4524
|
+
return this.code;
|
4525
|
+
}
|
4526
|
+
/**
|
4527
|
+
* Устанавливает новый код ошибки.
|
4528
|
+
*
|
4529
|
+
* @param code Новый код ошибки.
|
4530
|
+
*/
|
4531
|
+
setErrorCode(code) {
|
4532
|
+
this.code.set(code);
|
4533
|
+
}
|
4534
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
4535
|
+
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 }); }
|
4536
|
+
}
|
4537
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, decorators: [{
|
4538
|
+
type: Component,
|
4539
|
+
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" }]
|
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
|