@snabcentr/client-ui 3.7.0 → 3.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of @snabcentr/client-ui might be problematic. Click here for more details.

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