@snabcentr/client-ui 3.7.0 → 3.8.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. package/contacts/sc-contacts.module.d.ts +4 -4
  2. package/directives/index.d.ts +1 -2
  3. package/directives/links/index.d.ts +4 -0
  4. package/directives/links/sc-email-link.directive.d.ts +25 -0
  5. package/directives/links/sc-link-location.d.ts +5 -0
  6. package/directives/links/sc-links.d.ts +7 -0
  7. package/directives/{tel-link → links}/sc-tel-link.directive.d.ts +15 -2
  8. package/error-handler/consts/error-change-handler.providers.d.ts +5 -0
  9. package/error-handler/error-block-status/error-block-status.component.d.ts +37 -0
  10. package/error-handler/index.d.ts +4 -0
  11. package/error-handler/interfaces/i-block-error.d.ts +17 -0
  12. package/error-handler/sc-error-handler.component.d.ts +40 -0
  13. package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +5 -5
  14. package/esm2022/contacts/sc-contacts.module.mjs +7 -11
  15. package/esm2022/directives/index.mjs +2 -3
  16. package/esm2022/directives/links/index.mjs +5 -0
  17. package/esm2022/directives/links/sc-email-link.directive.mjs +49 -0
  18. package/esm2022/directives/links/sc-link-location.mjs +2 -0
  19. package/esm2022/directives/links/sc-links.mjs +8 -0
  20. package/esm2022/directives/links/sc-tel-link.directive.mjs +79 -0
  21. package/esm2022/error-handler/consts/error-change-handler.providers.mjs +8 -0
  22. package/esm2022/error-handler/error-block-status/error-block-status.component.mjs +76 -0
  23. package/esm2022/error-handler/index.mjs +5 -0
  24. package/esm2022/error-handler/interfaces/i-block-error.mjs +2 -0
  25. package/esm2022/error-handler/sc-error-handler.component.mjs +58 -0
  26. package/esm2022/pipes/sc-formatted-phone.mjs +2 -2
  27. package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +9 -8
  28. package/esm2022/profile/sc-profile.module.mjs +7 -8
  29. package/esm2022/public-api.mjs +2 -1
  30. package/esm2022/user/sc-user.module.mjs +7 -7
  31. package/esm2022/user/user-managers/sc-user-managers.component.mjs +6 -5
  32. package/fesm2022/snabcentr-client-ui.mjs +648 -475
  33. package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
  34. package/package.json +1 -1
  35. package/profile/sc-profile.module.d.ts +5 -3
  36. package/public-api.d.ts +1 -0
  37. package/release_notes.tmp +5 -5
  38. package/styles/taiga/snabcentr-tailwind-preset.js +10 -0
  39. package/styles/tailwind/tailwind.scss +62 -0
  40. package/user/sc-user.module.d.ts +4 -2
  41. package/directives/tel-link/sc-tel-link.module.d.ts +0 -11
  42. package/esm2022/directives/tel-link/sc-tel-link.directive.mjs +0 -58
  43. 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, ContentChildren, HostListener, ChangeDetectorRef, Renderer2, ElementRef, Pipe, Optional, Injectable, signal, forwardRef, InjectionToken } from '@angular/core';
2
+ import { EventEmitter, Component, ChangeDetectionStrategy, Inject, Input, Output, inject, DestroyRef, SkipSelf, Directive, HostBinding, ContentChild, ViewChild, NgModule, Pipe, ElementRef, HostListener, Renderer2, Optional, Injectable, ContentChildren, ChangeDetectorRef, signal, input, computed, output, effect, forwardRef, InjectionToken } from '@angular/core';
3
3
  import * as i1 from '@snabcentr/client-core';
4
- import { ScUserMetrikaGoalsEnum, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScOpfList, ScAuthService, SEARCH_TERM, ScUnitsHelper, ScImageHelper, SC_PATH_IMAGE_NOT_FOUND, ScPhoneService, IS_RUNNING_ON_TERMINAL, SC_URLS, ScWarehouseService, SEARCH_TERM_PROVIDERS, ScPaginationService, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PRODUCT_PAGINATION_OPTIONS, ScIconTypesEnum, ScDocumentInfoTypesEnum, ScSamplesService, ScUserService } from '@snabcentr/client-core';
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, TuiDialog, TuiDialogService, TuiLabel, TuiError, TuiLoader, TuiDataList, TuiNotification, TuiLink, TuiHint, TUI_MONTHS, TuiIcon, TuiFormatNumberPipe, tuiFadeIn } from '@taiga-ui/core';
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, TUI_IS_MOBILE, TuiLet, TuiRepeatTimes, TuiHovered, TuiDay, TuiDayRange, TuiMonth, tuiPure, tuiCreateToken, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
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 { AbstractTuiControl, TuiInputModule, TuiTextfieldControllerModule, TuiComboBoxModule, TuiInputPhoneModule, TuiSelectModule, TuiInputPasswordModule, AbstractTuiNullableControl, TuiInputNumberComponent, TuiIslandDirective, TuiInputNumberModule } from '@taiga-ui/legacy';
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, TuiPreview, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiCarousel, TuiCheckbox, TuiStepper, TuiBadge, TuiHighlight, TuiAvatar, TuiLineClamp, TuiPreviewDialogService, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree } from '@taiga-ui/kit';
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$4 from '@angular/router';
33
- import { RouterModule, ActivatedRoute } from '@angular/router';
30
+ import * as i2$3 from '@angular/router';
31
+ import { RouterModule, ActivatedRoute, Router, NavigationEnd, RouterLink } from '@angular/router';
34
32
  import * as i9 from '@taiga-ui/addon-commerce';
35
33
  import { TuiCurrencyPipe } from '@taiga-ui/addon-commerce';
34
+ import * as i2$4 from 'angularx-qrcode';
35
+ import { QRCodeModule } from 'angularx-qrcode';
36
36
  import { __decorate } from 'tslib';
37
37
  import * as i5$1 from '@taiga-ui/addon-charts';
38
38
  import { TuiLineDaysChart, TuiLineDaysChartHint, TuiAxes } from '@taiga-ui/addon-charts';
@@ -1499,219 +1499,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
1499
1499
  }]
1500
1500
  }] });
1501
1501
 
1502
- /* eslint-disable lodash/prefer-lodash-method */
1502
+ /* eslint-disable class-methods-use-this */
1503
1503
  /**
1504
- * Директива для перехода по нажатию клавиши enter на следующее поле ввода формы.
1504
+ * Пайп для форматирования номера телефона.
1505
+ *
1506
+ * Если переданный номер телефона валиден, он будет отформатирован с использованием метода `formatPhoneNumber` сервиса `ScPhoneService`.
1507
+ * Если номер невалиден, возвращается исходное значение.
1505
1508
  */
1506
- class ScNextInputFocusDirective {
1509
+ class ScFormatePhonePipe {
1507
1510
  /**
1508
- * Слушатель нажатия на клавишу enter. Предотвращает событие submit, выполняет смену фокуса на следующее поле ввода TuiFocusableElementAccessor.
1511
+ * Преобразует строковое значение номера телефона.
1509
1512
  *
1510
- * @param event Объект события нажатия на клавишу.
1513
+ * @param value Строка, содержащая номер телефона.
1514
+ * @returns Отформатированный номер телефона, если он валиден, или исходное значение, если он невалиден.
1511
1515
  */
1512
- onFormKeyDownEnter(event) {
1513
- if (event.code !== 'Enter' && event.key !== 'Enter') {
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: ScNextInputFocusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1527
- 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 }); }
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: ScNextInputFocusModule, decorators: [{
1551
- type: NgModule,
1525
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, decorators: [{
1526
+ type: Pipe,
1552
1527
  args: [{
1553
- declarations: [ScNextInputFocusDirective],
1554
- exports: [ScNextInputFocusDirective],
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 AbstractScPriceCard {
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.pathImageNotFound = inject(SC_PATH_IMAGE_NOT_FOUND);
1541
+ this.elementReference = inject(ElementRef);
1628
1542
  /**
1629
- * Объект слежения за изменениями.
1543
+ * Сервис для сбора метрик о действиях пользователей.
1630
1544
  */
1631
- this.cdr = inject(ChangeDetectorRef);
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
- markForCheck() {
1688
- this.cdr.markForCheck();
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: AbstractScPriceCard, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
1691
- 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 }); }
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: AbstractScPriceCard, decorators: [{
1694
- type: Directive
1695
- }], propDecorators: { cartItem: [{
1696
- type: Input
1697
- }], product: [{
1698
- type: Input
1699
- }], showQuantityControl: [{
1700
- type: Input
1701
- }], href: [{
1702
- type: Input
1703
- }], clickFavoriteEvent: [{
1704
- type: Output
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.scTelLink = '';
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['scTelLink']) {
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.scTelLink)) {
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.scTelLink)}`);
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: { scTelLink: "scTelLink" }, usesOnChanges: true, ngImport: i0 }); }
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: { scTelLink: [{
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
- class ScFormatePhonePipe {
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: 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 }); }
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
- ScTerminalLinkDirective,
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$4.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 }); }
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 HoverImageCarouselComponent {
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
- * Обработчик события `mousemove.silent`.
3009
+ * Слушатель нажатия на клавишу enter. Предотвращает событие submit, выполняет смену фокуса на следующее поле ввода TuiFocusableElementAccessor.
3320
3010
  *
3321
- * @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
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
- onLeave() {
3338
- if (this.images.length <= 1) {
3013
+ onFormKeyDownEnter(event) {
3014
+ if (event.code !== 'Enter' && event.key !== 'Enter') {
3339
3015
  return;
3340
3016
  }
3341
- this.currentIndex.set(0);
3342
- }
3343
- /**
3344
- * Обработчик события наведения указателя мыши на точку.
3345
- *
3346
- * @param hovered Признак что указатель мыши наведен на точку.
3347
- * @param index Индекс изображения, который соответствует точке.
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: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3355
- 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 }); }
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: HoverImageCarouselComponent, decorators: [{
3358
- type: Component,
3359
- 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"] }]
3360
- }], propDecorators: { images: [{
3361
- type: Input
3362
- }], isShowActions: [{
3363
- type: Input
3364
- }], onHover: [{
3365
- type: HostListener,
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: ['mouseleave.silent']
3040
+ args: ['keydown', ['$event']]
3370
3041
  }] } });
3371
3042
 
3372
3043
  /**
3373
- * Компонент центы товара с отображением скидки.
3044
+ * Модуль директивы для перехода по нажатию клавиши enter на следующее поле ввода формы.
3374
3045
  */
3375
- class CostWithDiscountComponent {
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
- * {@link Observable} изменения выбранного склада.
3066
+ * Признак того, что этот компонент отображается на мобильном устройстве.
3067
+ */
3068
+ this.isMobile = inject(TUI_IS_MOBILE);
3069
+ /**
3070
+ * {@link FormControl} поля ввода количества товара в корзине.
3071
+ */
3072
+ this.quantityControl = new FormControl(3, { updateOn: 'blur' });
3073
+ /**
3074
+ * Признак, что необходимо отобразить лоадер для поля ввода количества товара.
3075
+ */
3076
+ this.quantityShowLoader = false;
3077
+ /**
3078
+ * Признак, что необходимо отобразить лоадер для кнопки избранных товаров и категорий.
3079
+ */
3080
+ this.favoriteShowLoader = false;
3081
+ /**
3082
+ * {@link Observable} изменения статуса авторизации.
3083
+ */
3084
+ this.authStatus$ = inject(ScAuthService).getAuthChange();
3085
+ /**
3086
+ * {@link Observable} поиска терма.
3087
+ */
3088
+ this.search$ = inject(SEARCH_TERM);
3089
+ /**
3090
+ * Признак, что необходимо отобразить поле ввода количества товара.
3091
+ */
3092
+ this.showQuantityControl = false;
3093
+ /**
3094
+ * Событие нажатия на кнопку "В избранное".
3095
+ */
3096
+ this.clickFavoriteEvent = new EventEmitter();
3097
+ /**
3098
+ * Событие нажатия на кнопку "В корзину".
3099
+ */
3100
+ this.clickAddToCartEvent = new EventEmitter();
3101
+ /**
3102
+ * Событие нажатия на кнопку очистки количества товара.
3103
+ */
3104
+ this.clickClearEvent = new EventEmitter();
3105
+ /**
3106
+ * Событие нажатия на карточку товара.
3107
+ */
3108
+ this.clickCardEvent = new EventEmitter();
3109
+ /**
3110
+ * Событие нажатия на историю цен.
3111
+ */
3112
+ this.clickPriceHistoryEvent = new EventEmitter();
3113
+ /**
3114
+ * {@link Observable} изменения количества товара в корзине.
3115
+ */
3116
+ this.quantityValueChanges = this.quantityControl.valueChanges;
3117
+ /**
3118
+ * Экземпляр класса-помощника для работы со значениями единиц измерения товара.
3119
+ */
3120
+ this.unitsHelper = inject(ScUnitsHelper);
3121
+ /**
3122
+ * Хелпер для работы с изображениями товара.
3123
+ */
3124
+ this.imageHelper = inject(ScImageHelper);
3125
+ /**
3126
+ * Путь до изображения 'Товар не найден'.
3127
+ */
3128
+ this.pathImageNotFound = inject(SC_PATH_IMAGE_NOT_FOUND);
3129
+ /**
3130
+ * Объект слежения за изменениями.
3131
+ */
3132
+ this.cdr = inject(ChangeDetectorRef);
3133
+ }
3134
+ /**
3135
+ * Позиция товара в корзине.
3136
+ *
3137
+ * TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
3138
+ */
3139
+ get cartItem() {
3140
+ return this._cartItem;
3141
+ }
3142
+ /**
3143
+ * Позиция товара в корзине
3144
+ *
3145
+ * TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
3146
+ */
3147
+ set cartItem(value) {
3148
+ this._cartItem = value;
3149
+ this.quantityControl.patchValue(this._cartItem?.quantity ?? null, { emitEvent: false });
3150
+ this.quantityShowLoader = false;
3151
+ }
3152
+ /**
3153
+ * Объект товара.
3154
+ */
3155
+ get product() {
3156
+ return this._product;
3157
+ }
3158
+ /**
3159
+ * Объект товара.
3160
+ */
3161
+ set product(value) {
3162
+ this._product = value;
3163
+ }
3164
+ /**
3165
+ * Признак, что нужно показать скелетон.
3166
+ */
3167
+ get skeletonVisible() {
3168
+ return !this.product;
3169
+ }
3170
+ /**
3171
+ * Возвращает ссылку на preview-изображение карточки товара.
3172
+ */
3173
+ getCardImagePreview() {
3174
+ return this.product ? this.imageHelper.getImagePreview(this.product) : this.pathImageNotFound;
3175
+ }
3176
+ /**
3177
+ * Возвращает массив превью-изображений товара.
3178
+ *
3179
+ * @param product Объект товара.
3180
+ */
3181
+ getCardImagePreviewList(product) {
3182
+ const images = this.imageHelper.getProductImagePreviewList(product);
3183
+ return images.length > 0 ? images : [this.pathImageNotFound];
3184
+ }
3185
+ /**
3186
+ * Устанавливает компонент в очередь на обновление.
3187
+ */
3188
+ markForCheck() {
3189
+ this.cdr.markForCheck();
3190
+ }
3191
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AbstractScPriceCard, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3192
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: AbstractScPriceCard, inputs: { cartItem: "cartItem", product: "product", showQuantityControl: "showQuantityControl", href: "href" }, outputs: { clickFavoriteEvent: "clickFavoriteEvent", clickAddToCartEvent: "clickAddToCartEvent", clickClearEvent: "clickClearEvent", clickCardEvent: "clickCardEvent", clickPriceHistoryEvent: "clickPriceHistoryEvent", quantityValueChanges: "quantityValueChanges" }, ngImport: i0 }); }
3193
+ }
3194
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: AbstractScPriceCard, decorators: [{
3195
+ type: Directive
3196
+ }], propDecorators: { cartItem: [{
3197
+ type: Input
3198
+ }], product: [{
3199
+ type: Input
3200
+ }], showQuantityControl: [{
3201
+ type: Input
3202
+ }], href: [{
3203
+ type: Input
3204
+ }], clickFavoriteEvent: [{
3205
+ type: Output
3206
+ }], clickAddToCartEvent: [{
3207
+ type: Output
3208
+ }], clickClearEvent: [{
3209
+ type: Output
3210
+ }], clickCardEvent: [{
3211
+ type: Output
3212
+ }], clickPriceHistoryEvent: [{
3213
+ type: Output
3214
+ }], quantityValueChanges: [{
3215
+ type: Output
3216
+ }] } });
3217
+
3218
+ /**
3219
+ * Компонент QR кода.
3220
+ */
3221
+ class ScQRCodeDialogComponent {
3222
+ /**
3223
+ * Инициализирует экземпляр класса {@link ScQRCodeDialogComponent}.
3224
+ *
3225
+ * @param vCardService Сервис для работы с vCard.
3226
+ * @param context Контекст диалогового окна, в котором открыт компонент.
3227
+ * @param terminal Провайдер данных о терминале.
3228
+ */
3229
+ constructor(vCardService, context, terminal) {
3230
+ this.vCardService = vCardService;
3231
+ this.context = context;
3232
+ this.terminal = terminal;
3233
+ /**
3234
+ * Свойство, от которого зависит наличие атрибута `data-terminal-view` у `:host` компонента.
3235
+ */
3236
+ this.terminalView = this.terminal.isRunningOnTerminal;
3237
+ }
3238
+ /**
3239
+ * Выполняет скачивание генерируемого vCard файла контакта.
3240
+ */
3241
+ downloadVCard() {
3242
+ if (!this.terminal.isRunningOnTerminal && this.isVCardData()) {
3243
+ this.vCardService.downloadVCard(this.context.data.qrdata);
3244
+ }
3245
+ }
3246
+ /**
3247
+ * Проверяет что в диалоговое окно были переданы данные в формате `vCard`.
3248
+ */
3249
+ isVCardData() {
3250
+ // eslint-disable-next-line unicorn/better-regex
3251
+ return /BEGIN:VCARD[\s\S]*END:VCARD/i.test(this.context.data.qrdata);
3252
+ }
3253
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, deps: [{ token: i1.ScVCardService }, { token: POLYMORPHEUS_CONTEXT }, { token: IS_RUNNING_ON_TERMINAL }], target: i0.ɵɵFactoryTarget.Component }); }
3254
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScQRCodeDialogComponent, selector: "sc-qrcode-dialog", host: { properties: { "attr.data-terminal-view": "this.terminalView" } }, ngImport: i0, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"], dependencies: [{ kind: "component", type: i2$4.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3255
+ }
3256
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, decorators: [{
3257
+ type: Component,
3258
+ args: [{ selector: 'sc-qrcode-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"] }]
3259
+ }], ctorParameters: () => [{ type: i1.ScVCardService }, { type: undefined, decorators: [{
3260
+ type: Inject,
3261
+ args: [POLYMORPHEUS_CONTEXT]
3262
+ }] }, { type: undefined, decorators: [{
3263
+ type: Inject,
3264
+ args: [IS_RUNNING_ON_TERMINAL]
3265
+ }] }], propDecorators: { terminalView: [{
3266
+ type: HostBinding,
3267
+ args: ['attr.data-terminal-view']
3268
+ }] } });
3269
+
3270
+ /**
3271
+ * Модуль QR кода.
3272
+ */
3273
+ class ScQRCodeModule {
3274
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
3275
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, declarations: [ScQRCodeDialogComponent], imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewAction, i2$1.TuiPreviewZoom], exports: [ScQRCodeDialogComponent] }); }
3276
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, imports: [CommonModule, QRCodeModule, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewZoom] }); }
3277
+ }
3278
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, decorators: [{
3279
+ type: NgModule,
3280
+ args: [{
3281
+ declarations: [ScQRCodeDialogComponent],
3282
+ imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, ...TuiPreview],
3283
+ exports: [ScQRCodeDialogComponent],
3284
+ }]
3285
+ }] });
3286
+
3287
+ /* eslint-disable lodash/prefer-lodash-method */
3288
+ /**
3289
+ * Директива открытия диалогового окна с QRCode для ссылок `tel:` и `mailto:` на терминале.
3290
+ */
3291
+ class ScTerminalLinkDirective {
3292
+ constructor() {
3293
+ /**
3294
+ * Ссылка на HTML элемент тега `<a>`.
3295
+ */
3296
+ this.elementReference = inject(ElementRef);
3297
+ /**
3298
+ * Сервис для работы с диалоговыми окнами TuiDialog.
3299
+ */
3300
+ this.dialog = inject(TuiDialogService);
3301
+ /**
3302
+ * Провайдер данных о терминале.
3303
+ */
3304
+ this.terminal = inject(IS_RUNNING_ON_TERMINAL);
3305
+ }
3306
+ /**
3307
+ * Обработчик клика по ссылке.
3308
+ *
3309
+ * @param event Событие клика.
3310
+ */
3311
+ onClick(event) {
3312
+ if (this.terminal.isRunningOnTerminal && this.isLinkTelOrMail()) {
3313
+ // Отключение базового события для терминала.
3314
+ event.preventDefault();
3315
+ this.openQRCodeDialog();
3316
+ }
3317
+ }
3318
+ /**
3319
+ * Открывает диалоговое окно с QR-кодом.
3320
+ */
3321
+ openQRCodeDialog() {
3322
+ this.dialog
3323
+ .open(new PolymorpheusComponent(ScQRCodeDialogComponent), {
3324
+ size: 's',
3325
+ // Передаём ссылку формата `mailto:example@example.com` `tel:+70000000000` вместо vCard, так как для vCard данных недостаточно.
3326
+ data: { qrdata: this.elementReference.nativeElement.href },
3327
+ })
3328
+ .subscribe();
3329
+ }
3330
+ /**
3331
+ * Проверяет ведёт ли ссылка на телефон или адрес электронной почты.
3332
+ */
3333
+ isLinkTelOrMail() {
3334
+ return this.elementReference.nativeElement.href.startsWith('tel:') || this.elementReference.nativeElement.href.startsWith('mailto:');
3335
+ }
3336
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
3337
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTerminalLinkDirective, isStandalone: true, selector: "a[href]", host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); }
3338
+ }
3339
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, decorators: [{
3340
+ type: Directive,
3341
+ args: [{
3342
+ standalone: true,
3343
+ selector: 'a[href]',
3344
+ }]
3345
+ }], propDecorators: { onClick: [{
3346
+ type: HostListener,
3347
+ args: ['click', ['$event']]
3348
+ }] } });
3349
+
3350
+ /**
3351
+ * Компонент просмотра изображений через событие наведения.
3352
+ */
3353
+ class HoverImageCarouselComponent {
3354
+ constructor() {
3355
+ /**
3356
+ * Массив изображений.
3357
+ */
3358
+ this.images = [];
3359
+ /**
3360
+ * Признак что необходимо отобразить элементы управления.
3361
+ */
3362
+ this.isShowActions = true;
3363
+ /**
3364
+ * {@link WritableSignal} для отслеживания текущего индекса изображения.
3365
+ */
3366
+ this.currentIndex = signal(0);
3367
+ }
3368
+ /**
3369
+ * Обработчик события `mousemove.silent`.
3370
+ *
3371
+ * @param offsetX Отступ курсора мыши по оси X от края {@link HTMLElement}.
3372
+ * @param target Объект {@link HTMLElement} в котором лежат изображения
3373
+ */
3374
+ onHover(offsetX, target) {
3375
+ if (this.images.length <= 1 || offsetX < 0) {
3376
+ return;
3377
+ }
3378
+ // new Event().preventDefault
3379
+ const elementWidth = target.offsetWidth;
3380
+ const hoverPercentage = offsetX / elementWidth;
3381
+ const newIndex = Math.floor(hoverPercentage * this.images.length);
3382
+ this.currentIndex.set(newIndex);
3383
+ }
3384
+ /**
3385
+ * Обработчик события `mouseleave.silent`.
3386
+ */
3387
+ onLeave() {
3388
+ if (this.images.length <= 1) {
3389
+ return;
3390
+ }
3391
+ this.currentIndex.set(0);
3392
+ }
3393
+ /**
3394
+ * Обработчик события наведения указателя мыши на точку.
3395
+ *
3396
+ * @param hovered Признак что указатель мыши наведен на точку.
3397
+ * @param index Индекс изображения, который соответствует точке.
3398
+ */
3399
+ onDotHovered(hovered, index) {
3400
+ if (hovered) {
3401
+ this.currentIndex.set(index);
3402
+ }
3403
+ }
3404
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HoverImageCarouselComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
3405
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: HoverImageCarouselComponent, isStandalone: true, selector: "sc-hover-image-carousel", inputs: { images: "images", isShowActions: "isShowActions" }, host: { listeners: { "mousemove.silent": "onHover($event.offsetX,$event.target)", "mouseleave.silent": "onLeave()" } }, ngImport: i0, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"], dependencies: [{ kind: "directive", type: TuiRepeatTimes, selector: "[tuiRepeatTimes][tuiRepeatTimesOf]", inputs: ["tuiRepeatTimesOf"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3406
+ }
3407
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: HoverImageCarouselComponent, decorators: [{
3408
+ type: Component,
3409
+ args: [{ standalone: true, selector: 'sc-hover-image-carousel', imports: [TuiRepeatTimes, TuiButton, TuiHovered], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"overflow-hidden rounded-xl\"\n [class.mb-2]=\"images.length <= 1 && isShowActions\"\n [style.aspect-ratio]=\"'20/19'\"\n>\n <img\n [src]=\"images[currentIndex()]\"\n class=\"size-full rounded-xl object-contain\"\n />\n</div>\n\n@if (images.length > 1 && isShowActions) {\n <div\n (mousemove.silent)=\"$event.stopPropagation()\"\n class=\"flex justify-center\"\n >\n <button\n *tuiRepeatTimes=\"let indexItem of images.length\"\n #element\n tuiButton\n type=\"button\"\n class=\"button button_small\"\n [appearance]=\"indexItem === currentIndex() ? 'primary' : 'secondary'\"\n (tuiHoveredChange)=\"onDotHovered($event, indexItem)\"\n ></button>\n </div>\n}\n", styles: [".button{flex-shrink:0}.button:first-child{margin-inline-start:0}.button:last-child{margin-inline-end:0}.button_small{inline-size:.5rem;block-size:.5rem;font-size:0;padding:0;margin:0}.button_small:not(:first-child){margin-left:.5rem}\n"] }]
3410
+ }], propDecorators: { images: [{
3411
+ type: Input
3412
+ }], isShowActions: [{
3413
+ type: Input
3414
+ }], onHover: [{
3415
+ type: HostListener,
3416
+ args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
3417
+ }], onLeave: [{
3418
+ type: HostListener,
3419
+ args: ['mouseleave.silent']
3420
+ }] } });
3421
+
3422
+ /**
3423
+ * Компонент центы товара с отображением скидки.
3424
+ */
3425
+ class CostWithDiscountComponent {
3426
+ constructor() {
3427
+ /**
3428
+ * {@link Observable} изменения выбранного склада.
3379
3429
  */
3380
3430
  this.warehouseSelect$ = inject(ScWarehouseService).getWarehouseSelectChange$();
3381
3431
  /**
@@ -4360,6 +4410,135 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
4360
4410
  args: [{ standalone: true, selector: 'sc-resource-preview', imports: [TuiNotification, TuiButton], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (src && isVideoResource()) {\n <video\n #video\n controls\n (canplay)=\"onCanPlay(video)\"\n class=\"size-full bg-black\"\n >\n <source\n [src]=\"src\"\n [type]=\"type\"\n />\n </video>\n} @else {\n <tui-notification\n appearance=\"warning\"\n size=\"l\"\n >\n <div\n tuiTitle\n [style.padding-inline-end.rem]=\"2\"\n class=\"flex flex-col\"\n >\n {{ !src || !type ? '\u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435, \u0440\u0435\u0441\u0443\u0440\u0441 \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D.' : '\u0418\u0437\u0432\u0438\u043D\u0438\u0442\u0435, \u0434\u0430\u043D\u043D\u044B\u0439 \u0444\u043E\u0440\u043C\u0430\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u0430 \u043D\u0435 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044F.' }}\n <button\n tuiButton\n type=\"button\"\n size=\"m\"\n appearance=\"primary\"\n (click)=\"context?.$implicit?.complete()\"\n class=\"mt-4 self-center\"\n >\n \u0417\u0430\u043A\u0440\u044B\u0442\u044C\n </button>\n </div>\n </tui-notification>\n}\n", styles: [":host{display:flex;height:100lvh;width:100%;justify-content:center;align-items:center}\n"] }]
4361
4411
  }] });
4362
4412
 
4413
+ /**
4414
+ * Токен обработчика смены ошибки.
4415
+ */
4416
+ // eslint-disable-next-line unicorn/consistent-function-scoping
4417
+ const SC_ERROR_CHANGE_HANDLER = tuiCreateTokenFromFactory(() => () => noop);
4418
+
4419
+ /**
4420
+ * Компонент для управления кодом ошибки отображаемой на странице.
4421
+ */
4422
+ class ScErrorHandlerComponent {
4423
+ /**
4424
+ * Инициирует экземпляр класса {@link ErrorHandlerComponent}.
4425
+ */
4426
+ constructor() {
4427
+ /**
4428
+ * Сигнал для хранения кода ошибки.
4429
+ */
4430
+ this.code = signal(null);
4431
+ /**
4432
+ * Сигнал дефолтного передаваемого из вне значения ошибки.
4433
+ */
4434
+ // eslint-disable-next-line @angular-eslint/no-input-rename
4435
+ this.defaultCode = input(null, { alias: 'code' });
4436
+ /**
4437
+ * Сервис маршрутизации.
4438
+ */
4439
+ this.router = inject(Router);
4440
+ /**
4441
+ * Обработчик изменения ошибки.
4442
+ */
4443
+ this.errorChangeHandler = inject(SC_ERROR_CHANGE_HANDLER);
4444
+ this.router.events.pipe(filter((event) => event instanceof NavigationEnd)).subscribe(() => {
4445
+ // Сбрасываем ошибку при переходе на новый маршрут.
4446
+ this.code.set(this.defaultCode());
4447
+ });
4448
+ }
4449
+ /**
4450
+ * Возвращает текущий сигнал с кодом ошибки.
4451
+ */
4452
+ getErrorCode() {
4453
+ return this.code;
4454
+ }
4455
+ /**
4456
+ * Устанавливает новый код ошибки.
4457
+ *
4458
+ * @param code Новый код ошибки.
4459
+ */
4460
+ setErrorCode(code) {
4461
+ this.code.set(code);
4462
+ }
4463
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4464
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScErrorHandlerComponent, isStandalone: true, selector: "sc-error-handler", inputs: { defaultCode: { classPropertyName: "defaultCode", publicName: "code", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (code() === null) {\n <ng-content />\n} @else {\n <sc-error-block-status (pageErrorChange)=\"errorChangeHandler($event)\"></sc-error-block-status>\n}\n", dependencies: [{ kind: "component", type: ScErrorBlockStatusComponent, selector: "sc-error-block-status", outputs: ["pageErrorChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4465
+ }
4466
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorHandlerComponent, decorators: [{
4467
+ type: Component,
4468
+ args: [{ standalone: true, selector: 'sc-error-handler', imports: [ScErrorBlockStatusComponent], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (code() === null) {\n <ng-content />\n} @else {\n <sc-error-block-status (pageErrorChange)=\"errorChangeHandler($event)\"></sc-error-block-status>\n}\n" }]
4469
+ }], ctorParameters: () => [] });
4470
+
4471
+ /**
4472
+ * Компонент представления данных об ошибке.
4473
+ */
4474
+ class ScErrorBlockStatusComponent {
4475
+ /**
4476
+ * Инициализирует экземпляр класса {@link ErrorPageComponent}.
4477
+ */
4478
+ constructor() {
4479
+ /**
4480
+ * Компонент управляющий кодом ошибки отображаемой на странице.
4481
+ */
4482
+ this.errorHandlerComponent = inject(ScErrorHandlerComponent, { skipSelf: true });
4483
+ /**
4484
+ * Сигнал кода ошибки.
4485
+ */
4486
+ this.code = this.errorHandlerComponent.getErrorCode();
4487
+ /**
4488
+ * Данные об ошибке.
4489
+ */
4490
+ // eslint-disable-next-line unicorn/consistent-function-scoping
4491
+ this.error = computed(() => this.getErrorMessage(this.code()));
4492
+ /**
4493
+ * Создает сигнал изменения строкового представления об ошибке.
4494
+ */
4495
+ this.pageErrorChange = output();
4496
+ // Если компонент отображён маршрутизацией из-за перехода по неизвестному маршруту, то устанавливаем код 404.
4497
+ if (inject(ActivatedRoute).snapshot.data['routes_key'] === 'error') {
4498
+ this.errorHandlerComponent.setErrorCode(404);
4499
+ }
4500
+ effect(() => {
4501
+ if (this.code() !== null) {
4502
+ this.pageErrorChange.emit(this.error());
4503
+ }
4504
+ });
4505
+ }
4506
+ /**
4507
+ * Возвращает описание ошибки.
4508
+ *
4509
+ * @param code Код ошибки.
4510
+ */
4511
+ // eslint-disable-next-line class-methods-use-this
4512
+ getErrorMessage(code) {
4513
+ switch (code) {
4514
+ case 403:
4515
+ return {
4516
+ message: 'К сожалению, у вас нет доступа к этому ресурсу',
4517
+ description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
4518
+ code,
4519
+ };
4520
+ case 404:
4521
+ return {
4522
+ message: 'К сожалению, такой страницы нет',
4523
+ description: 'Воспользуйтесь навигацией в шапке или подвале сайта, чтобы перейти в интересующий вас раздел',
4524
+ code,
4525
+ };
4526
+ default:
4527
+ return {
4528
+ message: 'Неизвестная ошибка',
4529
+ description: 'Пожалуйста обновите страницу или обратитесь к менеджеру',
4530
+ code: 0,
4531
+ };
4532
+ }
4533
+ }
4534
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
4535
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScErrorBlockStatusComponent, isStandalone: true, selector: "sc-error-block-status", outputs: { pageErrorChange: "pageErrorChange" }, ngImport: i0, template: "<div class=\"flex flex-col items-center gap-8\">\n <div class=\"border-20 border-solid border-tui-primary text-center sm:border-32\">\n <div class=\"text-8xl leading-1.15 text-black sm:text-44\">\n {{ error().code }}\n </div>\n <div class=\"text-6xl leading-1.15 text-tui-primary sm:text-8xl\">ERROR</div>\n </div>\n <div class=\"flex flex-col gap-2 text-center\">\n <div class=\"text-h5 sm:text-h4\">{{ error().message }}</div>\n <div class=\"text-body-m-bold sm:text-h6\">{{ error().description }}</div>\n </div>\n <button\n tuiButton\n appearance=\"primary\"\n routerLink=\"/\"\n >\n \u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u0443\u044E\n </button>\n</div>\n", dependencies: [{ kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
4536
+ }
4537
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScErrorBlockStatusComponent, decorators: [{
4538
+ type: Component,
4539
+ args: [{ standalone: true, selector: 'sc-error-block-status', imports: [TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TuiButton, RouterLink], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col items-center gap-8\">\n <div class=\"border-20 border-solid border-tui-primary text-center sm:border-32\">\n <div class=\"text-8xl leading-1.15 text-black sm:text-44\">\n {{ error().code }}\n </div>\n <div class=\"text-6xl leading-1.15 text-tui-primary sm:text-8xl\">ERROR</div>\n </div>\n <div class=\"flex flex-col gap-2 text-center\">\n <div class=\"text-h5 sm:text-h4\">{{ error().message }}</div>\n <div class=\"text-body-m-bold sm:text-h6\">{{ error().description }}</div>\n </div>\n <button\n tuiButton\n appearance=\"primary\"\n routerLink=\"/\"\n >\n \u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043D\u0430 \u0433\u043B\u0430\u0432\u043D\u0443\u044E\n </button>\n</div>\n" }]
4540
+ }], ctorParameters: () => [] });
4541
+
4363
4542
  /* eslint-disable class-methods-use-this */
4364
4543
  /**
4365
4544
  * Сервис работающий с значками элементов дерева.
@@ -5454,11 +5633,11 @@ class ScUserManagersComponent {
5454
5633
  this.qrClickEvent = new EventEmitter();
5455
5634
  }
5456
5635
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserManagersComponent, deps: [{ token: i1.ScUserService }], target: i0.ɵɵFactoryTarget.Component }); }
5457
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScUserManagersComponent, selector: "sc-user-managers", outputs: { qrClickEvent: "qrClickEvent" }, ngImport: i0, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "[scTelLink]", inputs: ["scTelLink"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5636
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScUserManagersComponent, selector: "sc-user-managers", outputs: { qrClickEvent: "qrClickEvent" }, ngImport: i0, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"user-managers\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n linkLocation=\"user-managers\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"], dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1$1.TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTerminalLinkDirective, selector: "a[href]" }, { kind: "directive", type: ScTelLinkDirective, selector: "a[scTelLink]", inputs: ["scTelLink", "linkLocation"] }, { kind: "directive", type: ScEmailLinkDirective, selector: "a[scEmailLink]", inputs: ["linkLocation"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
5458
5637
  }
5459
5638
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserManagersComponent, decorators: [{
5460
5639
  type: Component,
5461
- args: [{ selector: 'sc-user-managers', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"] }]
5640
+ args: [{ selector: 'sc-user-managers', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"mb-2 font-extrabold\">\u0412\u0430\u0448\u0438 \u043F\u0435\u0440\u0441\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0435 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440\u044B:</p>\n<ng-container *ngFor=\"let manager of managers$ | async; let last = last\">\n <div class=\"flex justify-between\">\n <div class=\"flex flex-col gap-1 !font-medium text-tui-text-02\">\n {{ manager.name }}\n <a\n tuiLink\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"user-managers\"\n href=\"mailto:{{ manager.contacts.email }}\"\n iconStart=\"@tui.mail\"\n >\n {{ manager.contacts.email }}\n </a>\n <a\n tuiLink\n [scTelLink]=\"manager.contacts.phone\"\n [pseudo]=\"true\"\n linkLocation=\"user-managers\"\n href=\"tel:{{ manager.contacts.phone | scFormatePhone }}\"\n iconStart=\"@tui.phone\"\n >\n {{ manager.contacts.phone | scFormatePhone }}\n </a>\n </div>\n <button\n tuiIconButton\n size=\"m\"\n appearance=\"secondary\"\n iconStart=\"@tui.scan-qr-code\"\n (click)=\"qrClickEvent.emit(manager)\"\n ></button>\n </div>\n <hr\n *ngIf=\"!last\"\n class=\"my-2 h-px border-0 bg-tui-base-04\"\n />\n</ng-container>\n", styles: ["a[tuiLink][data-mode=onLight]._pseudo{color:var(--tui-text-secondary)}a[tuiLink][data-mode=onLight]._pseudo:hover{color:var(--tui-text-tertiary)}\n"] }]
5462
5641
  }], ctorParameters: () => [{ type: i1.ScUserService }], propDecorators: { qrClickEvent: [{
5463
5642
  type: Output
5464
5643
  }] } });
@@ -5570,9 +5749,7 @@ class ScUserModule {
5570
5749
  TuiInputPhoneModule,
5571
5750
  TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiDataListDirective, i1$1.TuiOption, i1$1.TuiOptGroup, TuiSelectModule,
5572
5751
  TuiLink,
5573
- ScTerminalLinkDirective,
5574
- ScTelLinkModule,
5575
- TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
5752
+ ScTerminalLinkDirective, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
5576
5753
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, imports: [CommonModule,
5577
5754
  FormsModule,
5578
5755
  ReactiveFormsModule,
@@ -5585,7 +5762,6 @@ class ScUserModule {
5585
5762
  TuiInputModule,
5586
5763
  TuiInputPhoneModule,
5587
5764
  TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiOption, TuiSelectModule,
5588
- ScTelLinkModule,
5589
5765
  TuiButtonLoading] }); }
5590
5766
  }
5591
5767
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, decorators: [{
@@ -5613,7 +5789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
5613
5789
  TuiSelectModule,
5614
5790
  TuiLink,
5615
5791
  ScTerminalLinkDirective,
5616
- ScTelLinkModule,
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 >{{ 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" }]
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
- ScTelLinkModule,
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, ScTelLinkModule, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserModule, ScUserPhoneApproveDialogComponent, ScVerificationModule, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scPasswordConfirmMatchingValidator, scUserFactory, stepValidator };
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