@snabcentr/client-ui 3.6.2 → 3.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of @snabcentr/client-ui might be problematic. Click here for more details.
- package/catalog/hover-image-carousel/hover-image-carousel.component.d.ts +7 -0
- package/contacts/sc-contacts.module.d.ts +4 -4
- package/dialogs/index.d.ts +1 -0
- package/dialogs/sc-resource-preview/sc-resource-preview.component.d.ts +42 -0
- package/directives/index.d.ts +1 -2
- package/directives/links/index.d.ts +4 -0
- package/directives/links/sc-email-link.directive.d.ts +25 -0
- package/directives/links/sc-link-location.d.ts +5 -0
- package/directives/links/sc-links.d.ts +7 -0
- package/directives/{tel-link → links}/sc-tel-link.directive.d.ts +15 -2
- package/error-handler/consts/error-change-handler.providers.d.ts +5 -0
- package/error-handler/error-block-status/error-block-status.component.d.ts +37 -0
- package/error-handler/index.d.ts +4 -0
- package/error-handler/interfaces/i-block-error.d.ts +17 -0
- package/error-handler/sc-error-handler.component.d.ts +40 -0
- package/esm2022/catalog/hover-image-carousel/hover-image-carousel.component.mjs +16 -4
- package/esm2022/catalog/sc-catalog.module.mjs +1 -2
- package/esm2022/contacts/contacts-accordion/sc-contacts-accordion.component.mjs +5 -5
- package/esm2022/contacts/sc-contacts.module.mjs +7 -11
- package/esm2022/dialogs/index.mjs +2 -0
- package/esm2022/dialogs/sc-resource-preview/sc-resource-preview.component.mjs +68 -0
- package/esm2022/directives/index.mjs +2 -3
- package/esm2022/directives/links/index.mjs +5 -0
- package/esm2022/directives/links/sc-email-link.directive.mjs +49 -0
- package/esm2022/directives/links/sc-link-location.mjs +2 -0
- package/esm2022/directives/links/sc-links.mjs +8 -0
- package/esm2022/directives/links/sc-tel-link.directive.mjs +79 -0
- package/esm2022/error-handler/consts/error-change-handler.providers.mjs +8 -0
- package/esm2022/error-handler/error-block-status/error-block-status.component.mjs +76 -0
- package/esm2022/error-handler/index.mjs +5 -0
- package/esm2022/error-handler/interfaces/i-block-error.mjs +2 -0
- package/esm2022/error-handler/sc-error-handler.component.mjs +58 -0
- package/esm2022/pipes/sc-formatted-phone.mjs +2 -2
- package/esm2022/profile/sc-profile-accordions-content/sc-profile-accordions-content.component.mjs +9 -8
- package/esm2022/profile/sc-profile.module.mjs +7 -8
- package/esm2022/public-api.mjs +3 -1
- package/esm2022/user/sc-user.module.mjs +7 -7
- package/esm2022/user/user-managers/sc-user-managers.component.mjs +6 -5
- package/fesm2022/snabcentr-client-ui.mjs +721 -476
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +2 -2
- package/profile/sc-profile.module.d.ts +5 -3
- package/public-api.d.ts +2 -0
- package/release_notes.tmp +6 -2
- package/styles/taiga/snabcentr-tailwind-preset.js +10 -0
- package/styles/tailwind/tailwind.scss +72 -1
- package/user/sc-user.module.d.ts +4 -2
- package/directives/tel-link/sc-tel-link.module.d.ts +0 -11
- package/esm2022/directives/tel-link/sc-tel-link.directive.mjs +0 -58
- package/esm2022/directives/tel-link/sc-tel-link.module.mjs +0 -20
|
@@ -1,38 +1,38 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { EventEmitter, Component, ChangeDetectionStrategy, Inject, Input, Output, inject, DestroyRef, SkipSelf, Directive, HostBinding, ContentChild, ViewChild, NgModule,
|
|
2
|
+
import { EventEmitter, Component, ChangeDetectionStrategy, Inject, Input, Output, inject, DestroyRef, SkipSelf, Directive, HostBinding, ContentChild, ViewChild, NgModule, Pipe, ElementRef, HostListener, Renderer2, Optional, Injectable, ContentChildren, ChangeDetectorRef, signal, input, computed, output, effect, forwardRef, InjectionToken } from '@angular/core';
|
|
3
3
|
import * as i1 from '@snabcentr/client-core';
|
|
4
|
-
import { ScUserMetrikaGoalsEnum, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScOpfList,
|
|
4
|
+
import { ScUserMetrikaGoalsEnum, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScOpfList, ScPhoneService, ScUserMetrikaService, ScAuthService, SC_URLS, SC_PATH_IMAGE_NOT_FOUND, SEARCH_TERM, ScUnitsHelper, ScImageHelper, IS_RUNNING_ON_TERMINAL, ScWarehouseService, SEARCH_TERM_PROVIDERS, ScPaginationService, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PRODUCT_PAGINATION_OPTIONS, ScIconTypesEnum, ScDocumentInfoTypesEnum, ScSamplesService, ScUserService } from '@snabcentr/client-core';
|
|
5
5
|
import * as i6$1 from 'rxjs';
|
|
6
|
-
import { Subject, map, filter, switchMap, tap, catchError, of, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, combineLatest, debounceTime, throwError, shareReplay, skip, interval } from 'rxjs';
|
|
6
|
+
import { Subject, map, filter, switchMap, tap, catchError, of, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, combineLatest, debounceTime, throwError, shareReplay, skip, noop, interval } from 'rxjs';
|
|
7
7
|
import * as i2 from '@angular/common';
|
|
8
8
|
import { CommonModule } from '@angular/common';
|
|
9
9
|
import * as i1$1 from '@taiga-ui/core';
|
|
10
|
-
import { TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiButton,
|
|
10
|
+
import { TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiButton, TuiLabel, TuiError, TuiLoader, TuiDataList, TuiNotification, TuiLink, TuiDialog, TuiDialogService, TuiHint, TUI_MONTHS, TuiIcon, TuiFormatNumberPipe, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, tuiFadeIn } from '@taiga-ui/core';
|
|
11
11
|
import { HttpErrorResponse } from '@angular/common/http';
|
|
12
12
|
import * as i3 from '@angular/forms';
|
|
13
13
|
import { FormGroupDirective, FormGroup, FormControl, Validators, NgControl, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
14
14
|
import * as i6 from '@taiga-ui/cdk';
|
|
15
|
-
import { tuiControlValue, tuiIsFalsy, tuiIsPresent, tuiMarkControlAsTouchedAndValidate,
|
|
15
|
+
import { tuiControlValue, tuiIsFalsy, tuiIsPresent, tuiMarkControlAsTouchedAndValidate, TuiLet, TuiRepeatTimes, TUI_IS_MOBILE, TuiHovered, TuiDay, TuiDayRange, TuiMonth, tuiPure, tuiCreateTokenFromFactory, tuiCreateToken, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
16
16
|
import * as i4 from '@taiga-ui/legacy/components/primitive-textfield';
|
|
17
17
|
import * as i5 from '@taiga-ui/legacy';
|
|
18
|
-
import {
|
|
18
|
+
import { TuiInputModule, TuiTextfieldControllerModule, TuiComboBoxModule, TuiInputPhoneModule, TuiSelectModule, TuiInputPasswordModule, AbstractTuiNullableControl, TuiInputNumberComponent, AbstractTuiControl, TuiIslandDirective, TuiInputNumberModule } from '@taiga-ui/legacy';
|
|
19
19
|
import * as i8 from '@maskito/angular';
|
|
20
20
|
import { MaskitoDirective } from '@maskito/angular';
|
|
21
21
|
import * as i2$1 from '@taiga-ui/kit';
|
|
22
|
-
import { TuiAccordionItem, TuiElasticContainer, TuiAccordion,
|
|
22
|
+
import { TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiCarousel, TuiCheckbox, TuiStepper, TuiPreview, TuiBadge, TuiHighlight, TuiAvatar, TuiLineClamp, TuiPreviewDialogService, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree } from '@taiga-ui/kit';
|
|
23
23
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
24
24
|
import * as i3$1 from '@taiga-ui/core/components/data-list';
|
|
25
25
|
import * as i2$2 from '@taiga-ui/polymorpheus';
|
|
26
|
-
import { PolymorpheusTemplate, PolymorpheusOutlet, POLYMORPHEUS_CONTEXT, PolymorpheusComponent } from '@taiga-ui/polymorpheus';
|
|
27
|
-
import * as i2$3 from 'angularx-qrcode';
|
|
28
|
-
import { QRCodeModule } from 'angularx-qrcode';
|
|
26
|
+
import { PolymorpheusTemplate, PolymorpheusOutlet, POLYMORPHEUS_CONTEXT, PolymorpheusComponent, injectContext } from '@taiga-ui/polymorpheus';
|
|
29
27
|
import * as i1$2 from '@taiga-ui/cdk/directives/item';
|
|
30
28
|
import * as i3$2 from '@ng-web-apis/intersection-observer';
|
|
31
29
|
import { IntersectionObserverService, WaIntersectionObserver } from '@ng-web-apis/intersection-observer';
|
|
32
|
-
import * as i2$
|
|
33
|
-
import { RouterModule } from '@angular/router';
|
|
30
|
+
import * as i2$3 from '@angular/router';
|
|
31
|
+
import { RouterModule, ActivatedRoute, Router, NavigationEnd, RouterLink } from '@angular/router';
|
|
34
32
|
import * as i9 from '@taiga-ui/addon-commerce';
|
|
35
33
|
import { TuiCurrencyPipe } from '@taiga-ui/addon-commerce';
|
|
34
|
+
import * as i2$4 from 'angularx-qrcode';
|
|
35
|
+
import { QRCodeModule } from 'angularx-qrcode';
|
|
36
36
|
import { __decorate } from 'tslib';
|
|
37
37
|
import * as i5$1 from '@taiga-ui/addon-charts';
|
|
38
38
|
import { TuiLineDaysChart, TuiLineDaysChartHint, TuiAxes } from '@taiga-ui/addon-charts';
|
|
@@ -1499,219 +1499,81 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
1499
1499
|
}]
|
|
1500
1500
|
}] });
|
|
1501
1501
|
|
|
1502
|
-
/* eslint-disable
|
|
1502
|
+
/* eslint-disable class-methods-use-this */
|
|
1503
1503
|
/**
|
|
1504
|
-
*
|
|
1504
|
+
* Пайп для форматирования номера телефона.
|
|
1505
|
+
*
|
|
1506
|
+
* Если переданный номер телефона валиден, он будет отформатирован с использованием метода `formatPhoneNumber` сервиса `ScPhoneService`.
|
|
1507
|
+
* Если номер невалиден, возвращается исходное значение.
|
|
1505
1508
|
*/
|
|
1506
|
-
class
|
|
1509
|
+
class ScFormatePhonePipe {
|
|
1507
1510
|
/**
|
|
1508
|
-
*
|
|
1511
|
+
* Преобразует строковое значение номера телефона.
|
|
1509
1512
|
*
|
|
1510
|
-
* @param
|
|
1513
|
+
* @param value Строка, содержащая номер телефона.
|
|
1514
|
+
* @returns Отформатированный номер телефона, если он валиден, или исходное значение, если он невалиден.
|
|
1511
1515
|
*/
|
|
1512
|
-
|
|
1513
|
-
if (
|
|
1514
|
-
return;
|
|
1515
|
-
}
|
|
1516
|
-
event.preventDefault();
|
|
1517
|
-
const elements = this.focusableElements.toArray();
|
|
1518
|
-
const focusedIndex = elements.findIndex((control) => control.focused);
|
|
1519
|
-
if (focusedIndex !== -1) {
|
|
1520
|
-
const nextElement = elements[focusedIndex + 1]?.nativeFocusableElement;
|
|
1521
|
-
if (nextElement) {
|
|
1522
|
-
nextElement.focus();
|
|
1523
|
-
}
|
|
1516
|
+
transform(value) {
|
|
1517
|
+
if (ScPhoneService.isValidPhoneNumber(value)) {
|
|
1518
|
+
return ScPhoneService.formatPhoneNumber(value);
|
|
1524
1519
|
}
|
|
1520
|
+
return value; // Возвращаем оригинальный номер, если он невалиден.
|
|
1525
1521
|
}
|
|
1526
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
1527
|
-
static { this.ɵ
|
|
1528
|
-
}
|
|
1529
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusDirective, decorators: [{
|
|
1530
|
-
type: Directive,
|
|
1531
|
-
args: [{
|
|
1532
|
-
selector: 'form[ScNextInputFocus]',
|
|
1533
|
-
}]
|
|
1534
|
-
}], propDecorators: { focusableElements: [{
|
|
1535
|
-
type: ContentChildren,
|
|
1536
|
-
args: [AbstractTuiControl, { descendants: true }]
|
|
1537
|
-
}], onFormKeyDownEnter: [{
|
|
1538
|
-
type: HostListener,
|
|
1539
|
-
args: ['keydown', ['$event']]
|
|
1540
|
-
}] } });
|
|
1541
|
-
|
|
1542
|
-
/**
|
|
1543
|
-
* Модуль директивы для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
|
1544
|
-
*/
|
|
1545
|
-
class ScNextInputFocusModule {
|
|
1546
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1547
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, declarations: [ScNextInputFocusDirective], exports: [ScNextInputFocusDirective] }); }
|
|
1548
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule }); }
|
|
1522
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1523
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, isStandalone: true, name: "scFormatePhone" }); }
|
|
1549
1524
|
}
|
|
1550
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
1551
|
-
type:
|
|
1525
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, decorators: [{
|
|
1526
|
+
type: Pipe,
|
|
1552
1527
|
args: [{
|
|
1553
|
-
|
|
1554
|
-
|
|
1528
|
+
standalone: true,
|
|
1529
|
+
name: 'scFormatePhone',
|
|
1555
1530
|
}]
|
|
1556
1531
|
}] });
|
|
1557
1532
|
|
|
1558
|
-
/* eslint-disable no-underscore-dangle */
|
|
1559
1533
|
/**
|
|
1560
|
-
*
|
|
1534
|
+
* Директива, которая управляет свойствами ссылки адреса электронной почты.
|
|
1561
1535
|
*/
|
|
1562
|
-
class
|
|
1536
|
+
class ScEmailLinkDirective {
|
|
1563
1537
|
constructor() {
|
|
1564
1538
|
/**
|
|
1565
|
-
*
|
|
1566
|
-
*/
|
|
1567
|
-
this.isMobile = inject(TUI_IS_MOBILE);
|
|
1568
|
-
/**
|
|
1569
|
-
* {@link FormControl} поля ввода количества товара в корзине.
|
|
1570
|
-
*/
|
|
1571
|
-
this.quantityControl = new FormControl(3, { updateOn: 'blur' });
|
|
1572
|
-
/**
|
|
1573
|
-
* Признак, что необходимо отобразить лоадер для поля ввода количества товара.
|
|
1574
|
-
*/
|
|
1575
|
-
this.quantityShowLoader = false;
|
|
1576
|
-
/**
|
|
1577
|
-
* Признак, что необходимо отобразить лоадер для кнопки избранных товаров и категорий.
|
|
1578
|
-
*/
|
|
1579
|
-
this.favoriteShowLoader = false;
|
|
1580
|
-
/**
|
|
1581
|
-
* {@link Observable} изменения статуса авторизации.
|
|
1582
|
-
*/
|
|
1583
|
-
this.authStatus$ = inject(ScAuthService).getAuthChange();
|
|
1584
|
-
/**
|
|
1585
|
-
* {@link Observable} поиска терма.
|
|
1586
|
-
*/
|
|
1587
|
-
this.search$ = inject(SEARCH_TERM);
|
|
1588
|
-
/**
|
|
1589
|
-
* Признак, что необходимо отобразить поле ввода количества товара.
|
|
1590
|
-
*/
|
|
1591
|
-
this.showQuantityControl = false;
|
|
1592
|
-
/**
|
|
1593
|
-
* Событие нажатия на кнопку "В избранное".
|
|
1594
|
-
*/
|
|
1595
|
-
this.clickFavoriteEvent = new EventEmitter();
|
|
1596
|
-
/**
|
|
1597
|
-
* Событие нажатия на кнопку "В корзину".
|
|
1598
|
-
*/
|
|
1599
|
-
this.clickAddToCartEvent = new EventEmitter();
|
|
1600
|
-
/**
|
|
1601
|
-
* Событие нажатия на кнопку очистки количества товара.
|
|
1602
|
-
*/
|
|
1603
|
-
this.clickClearEvent = new EventEmitter();
|
|
1604
|
-
/**
|
|
1605
|
-
* Событие нажатия на карточку товара.
|
|
1606
|
-
*/
|
|
1607
|
-
this.clickCardEvent = new EventEmitter();
|
|
1608
|
-
/**
|
|
1609
|
-
* Событие нажатия на историю цен.
|
|
1610
|
-
*/
|
|
1611
|
-
this.clickPriceHistoryEvent = new EventEmitter();
|
|
1612
|
-
/**
|
|
1613
|
-
* {@link Observable} изменения количества товара в корзине.
|
|
1614
|
-
*/
|
|
1615
|
-
this.quantityValueChanges = this.quantityControl.valueChanges;
|
|
1616
|
-
/**
|
|
1617
|
-
* Экземпляр класса-помощника для работы со значениями единиц измерения товара.
|
|
1618
|
-
*/
|
|
1619
|
-
this.unitsHelper = inject(ScUnitsHelper);
|
|
1620
|
-
/**
|
|
1621
|
-
* Хелпер для работы с изображениями товара.
|
|
1622
|
-
*/
|
|
1623
|
-
this.imageHelper = inject(ScImageHelper);
|
|
1624
|
-
/**
|
|
1625
|
-
* Путь до изображения 'Товар не найден'.
|
|
1539
|
+
* Ссылка на HTML элемент тега `<a>`.
|
|
1626
1540
|
*/
|
|
1627
|
-
this.
|
|
1541
|
+
this.elementReference = inject(ElementRef);
|
|
1628
1542
|
/**
|
|
1629
|
-
*
|
|
1543
|
+
* Сервис для сбора метрик о действиях пользователей.
|
|
1630
1544
|
*/
|
|
1631
|
-
this.
|
|
1632
|
-
}
|
|
1633
|
-
/**
|
|
1634
|
-
* Позиция товара в корзине.
|
|
1635
|
-
*
|
|
1636
|
-
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
|
1637
|
-
*/
|
|
1638
|
-
get cartItem() {
|
|
1639
|
-
return this._cartItem;
|
|
1640
|
-
}
|
|
1641
|
-
/**
|
|
1642
|
-
* Позиция товара в корзине
|
|
1643
|
-
*
|
|
1644
|
-
* TODO: Сделать товар в корзине наблюдаемой переменной после реализации TASK:[#7144].
|
|
1645
|
-
*/
|
|
1646
|
-
set cartItem(value) {
|
|
1647
|
-
this._cartItem = value;
|
|
1648
|
-
this.quantityControl.patchValue(this._cartItem?.quantity ?? null, { emitEvent: false });
|
|
1649
|
-
this.quantityShowLoader = false;
|
|
1650
|
-
}
|
|
1651
|
-
/**
|
|
1652
|
-
* Объект товара.
|
|
1653
|
-
*/
|
|
1654
|
-
get product() {
|
|
1655
|
-
return this._product;
|
|
1656
|
-
}
|
|
1657
|
-
/**
|
|
1658
|
-
* Объект товара.
|
|
1659
|
-
*/
|
|
1660
|
-
set product(value) {
|
|
1661
|
-
this._product = value;
|
|
1662
|
-
}
|
|
1663
|
-
/**
|
|
1664
|
-
* Признак, что нужно показать скелетон.
|
|
1665
|
-
*/
|
|
1666
|
-
get skeletonVisible() {
|
|
1667
|
-
return !this.product;
|
|
1668
|
-
}
|
|
1669
|
-
/**
|
|
1670
|
-
* Возвращает ссылку на preview-изображение карточки товара.
|
|
1671
|
-
*/
|
|
1672
|
-
getCardImagePreview() {
|
|
1673
|
-
return this.product ? this.imageHelper.getImagePreview(this.product) : this.pathImageNotFound;
|
|
1674
|
-
}
|
|
1675
|
-
/**
|
|
1676
|
-
* Возвращает массив превью-изображений товара.
|
|
1677
|
-
*
|
|
1678
|
-
* @param product Объект товара.
|
|
1679
|
-
*/
|
|
1680
|
-
getCardImagePreviewList(product) {
|
|
1681
|
-
const images = this.imageHelper.getProductImagePreviewList(product);
|
|
1682
|
-
return images.length > 0 ? images : [this.pathImageNotFound];
|
|
1545
|
+
this.userMetrikaService = inject(ScUserMetrikaService);
|
|
1683
1546
|
}
|
|
1684
1547
|
/**
|
|
1685
|
-
*
|
|
1548
|
+
* Обработчик клика по ссылке.
|
|
1686
1549
|
*/
|
|
1687
|
-
|
|
1688
|
-
this.
|
|
1550
|
+
click() {
|
|
1551
|
+
const email = /mailto:([^?]+)/.exec(this.elementReference.nativeElement.href)?.at(1);
|
|
1552
|
+
if (email) {
|
|
1553
|
+
this.userMetrikaService.emitUserMetrikaEvent({
|
|
1554
|
+
target: ScUserMetrikaGoalsEnum.emailClick,
|
|
1555
|
+
params: {
|
|
1556
|
+
emailLocation: this.linkLocation,
|
|
1557
|
+
email: email,
|
|
1558
|
+
},
|
|
1559
|
+
});
|
|
1560
|
+
}
|
|
1689
1561
|
}
|
|
1690
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
1691
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type:
|
|
1562
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScEmailLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1563
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScEmailLinkDirective, isStandalone: true, selector: "a[scEmailLink]", inputs: { linkLocation: "linkLocation" }, host: { listeners: { "click": "click()" } }, ngImport: i0 }); }
|
|
1692
1564
|
}
|
|
1693
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
1694
|
-
type: Directive
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
|
|
1698
|
-
|
|
1699
|
-
|
|
1700
|
-
type: Input
|
|
1701
|
-
|
|
1702
|
-
|
|
1703
|
-
|
|
1704
|
-
|
|
1705
|
-
}], clickAddToCartEvent: [{
|
|
1706
|
-
type: Output
|
|
1707
|
-
}], clickClearEvent: [{
|
|
1708
|
-
type: Output
|
|
1709
|
-
}], clickCardEvent: [{
|
|
1710
|
-
type: Output
|
|
1711
|
-
}], clickPriceHistoryEvent: [{
|
|
1712
|
-
type: Output
|
|
1713
|
-
}], quantityValueChanges: [{
|
|
1714
|
-
type: Output
|
|
1565
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScEmailLinkDirective, decorators: [{
|
|
1566
|
+
type: Directive,
|
|
1567
|
+
args: [{
|
|
1568
|
+
standalone: true,
|
|
1569
|
+
selector: 'a[scEmailLink]',
|
|
1570
|
+
}]
|
|
1571
|
+
}], propDecorators: { linkLocation: [{
|
|
1572
|
+
type: Input,
|
|
1573
|
+
args: [{ required: true }]
|
|
1574
|
+
}], click: [{
|
|
1575
|
+
type: HostListener,
|
|
1576
|
+
args: ['click']
|
|
1715
1577
|
}] } });
|
|
1716
1578
|
|
|
1717
1579
|
/**
|
|
@@ -1728,225 +1590,72 @@ class ScTelLinkDirective {
|
|
|
1728
1590
|
*/
|
|
1729
1591
|
this.elementReference = inject(ElementRef);
|
|
1730
1592
|
/**
|
|
1731
|
-
*
|
|
1593
|
+
* Сервис для сбора метрик о действиях пользователей.
|
|
1732
1594
|
*/
|
|
1733
|
-
this.
|
|
1595
|
+
this.userMetrikaService = inject(ScUserMetrikaService);
|
|
1734
1596
|
}
|
|
1735
1597
|
/** @inheritDoc */
|
|
1736
1598
|
ngOnChanges(changes) {
|
|
1737
1599
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
1738
|
-
if (changes['
|
|
1600
|
+
if (changes['tel']) {
|
|
1739
1601
|
this.updateLinkState();
|
|
1740
1602
|
}
|
|
1741
1603
|
}
|
|
1604
|
+
/**
|
|
1605
|
+
* Обработчик клика по ссылке.
|
|
1606
|
+
*/
|
|
1607
|
+
click() {
|
|
1608
|
+
if (ScPhoneService.isValidPhoneNumber(this.tel)) {
|
|
1609
|
+
this.userMetrikaService.emitUserMetrikaEvent({
|
|
1610
|
+
target: ScUserMetrikaGoalsEnum.phoneClick,
|
|
1611
|
+
params: {
|
|
1612
|
+
phoneLocation: this.linkLocation,
|
|
1613
|
+
phone: this.tel,
|
|
1614
|
+
},
|
|
1615
|
+
});
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1742
1618
|
/**
|
|
1743
1619
|
* Обновляет состояние ссылки на основе валидности номера телефона.
|
|
1744
1620
|
*/
|
|
1745
1621
|
updateLinkState() {
|
|
1746
|
-
if (ScPhoneService.isValidPhoneNumber(this.
|
|
1747
|
-
// Если номер валиден, активируем
|
|
1622
|
+
if (ScPhoneService.isValidPhoneNumber(this.tel)) {
|
|
1623
|
+
// Если номер валиден, активируем ссылку.
|
|
1748
1624
|
this.renderer.removeAttribute(this.elementReference.nativeElement, 'aria-disabled');
|
|
1749
1625
|
this.renderer.removeClass(this.elementReference.nativeElement, 'disabled');
|
|
1750
|
-
this.renderer.setAttribute(this.elementReference.nativeElement, 'href', `tel:${ScPhoneService.formatPhoneNumber(this.
|
|
1626
|
+
this.renderer.setAttribute(this.elementReference.nativeElement, 'href', `tel:${ScPhoneService.formatPhoneNumber(this.tel)}`);
|
|
1751
1627
|
}
|
|
1752
1628
|
else {
|
|
1753
|
-
// Если номер невалиден, отключаем
|
|
1629
|
+
// Если номер невалиден, отключаем ссылку.
|
|
1754
1630
|
this.renderer.setAttribute(this.elementReference.nativeElement, 'aria-disabled', 'true');
|
|
1755
1631
|
this.renderer.addClass(this.elementReference.nativeElement, 'disabled');
|
|
1756
1632
|
this.renderer.removeAttribute(this.elementReference.nativeElement, 'href');
|
|
1757
1633
|
}
|
|
1758
1634
|
}
|
|
1759
1635
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1760
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTelLinkDirective, isStandalone: true, selector: "[scTelLink]", inputs: {
|
|
1636
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTelLinkDirective, isStandalone: true, selector: "a[scTelLink]", inputs: { tel: ["scTelLink", "tel"], linkLocation: "linkLocation" }, host: { listeners: { "click": "click()" } }, usesOnChanges: true, ngImport: i0 }); }
|
|
1761
1637
|
}
|
|
1762
1638
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkDirective, decorators: [{
|
|
1763
1639
|
type: Directive,
|
|
1764
1640
|
args: [{
|
|
1765
1641
|
standalone: true,
|
|
1766
|
-
selector: '[scTelLink]',
|
|
1642
|
+
selector: 'a[scTelLink]',
|
|
1767
1643
|
}]
|
|
1768
|
-
}], propDecorators: {
|
|
1769
|
-
type: Input
|
|
1644
|
+
}], propDecorators: { tel: [{
|
|
1645
|
+
type: Input,
|
|
1646
|
+
args: [{ alias: 'scTelLink', required: true }]
|
|
1647
|
+
}], linkLocation: [{
|
|
1648
|
+
type: Input,
|
|
1649
|
+
args: [{ required: true }]
|
|
1650
|
+
}], click: [{
|
|
1651
|
+
type: HostListener,
|
|
1652
|
+
args: ['click']
|
|
1770
1653
|
}] } });
|
|
1771
1654
|
|
|
1772
|
-
/* eslint-disable class-methods-use-this */
|
|
1773
1655
|
/**
|
|
1774
|
-
*
|
|
1775
|
-
*
|
|
1776
|
-
* Если переданный номер телефона валиден, он будет отформатирован с использованием метода `formatPhoneNumber` сервиса `ScPhoneService`.
|
|
1777
|
-
* Если номер невалиден, возвращается исходное значение.
|
|
1656
|
+
* Список директив ссылок.
|
|
1778
1657
|
*/
|
|
1779
|
-
|
|
1780
|
-
/**
|
|
1781
|
-
* Преобразует строковое значение номера телефона.
|
|
1782
|
-
*
|
|
1783
|
-
* @param value Строка, содержащая номер телефона.
|
|
1784
|
-
* @returns Отформатированный номер телефона, если он валиден, или исходное значение, если он невалиден.
|
|
1785
|
-
*/
|
|
1786
|
-
transform(value) {
|
|
1787
|
-
if (ScPhoneService.isValidPhoneNumber(value)) {
|
|
1788
|
-
return ScPhoneService.formatPhoneNumber(value);
|
|
1789
|
-
}
|
|
1790
|
-
return value; // Возвращаем оригинальный номер, если он невалиден
|
|
1791
|
-
}
|
|
1792
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
1793
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, isStandalone: true, name: "scFormatePhone" }); }
|
|
1794
|
-
}
|
|
1795
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScFormatePhonePipe, decorators: [{
|
|
1796
|
-
type: Pipe,
|
|
1797
|
-
args: [{
|
|
1798
|
-
standalone: true,
|
|
1799
|
-
name: 'scFormatePhone',
|
|
1800
|
-
}]
|
|
1801
|
-
}] });
|
|
1802
|
-
|
|
1803
|
-
/**
|
|
1804
|
-
* Модуль валидации значения номера телефона.
|
|
1805
|
-
*/
|
|
1806
|
-
class ScTelLinkModule {
|
|
1807
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1808
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, imports: [ScFormatePhonePipe, ScTelLinkDirective], exports: [ScFormatePhonePipe, ScTelLinkDirective] }); }
|
|
1809
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule }); }
|
|
1810
|
-
}
|
|
1811
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTelLinkModule, decorators: [{
|
|
1812
|
-
type: NgModule,
|
|
1813
|
-
args: [{
|
|
1814
|
-
imports: [ScFormatePhonePipe, ScTelLinkDirective],
|
|
1815
|
-
exports: [ScFormatePhonePipe, ScTelLinkDirective],
|
|
1816
|
-
}]
|
|
1817
|
-
}] });
|
|
1818
|
-
|
|
1819
|
-
/**
|
|
1820
|
-
* Компонент QR кода.
|
|
1821
|
-
*/
|
|
1822
|
-
class ScQRCodeDialogComponent {
|
|
1823
|
-
/**
|
|
1824
|
-
* Инициализирует экземпляр класса {@link ScQRCodeDialogComponent}.
|
|
1825
|
-
*
|
|
1826
|
-
* @param vCardService Сервис для работы с vCard.
|
|
1827
|
-
* @param context Контекст диалогового окна, в котором открыт компонент.
|
|
1828
|
-
* @param terminal Провайдер данных о терминале.
|
|
1829
|
-
*/
|
|
1830
|
-
constructor(vCardService, context, terminal) {
|
|
1831
|
-
this.vCardService = vCardService;
|
|
1832
|
-
this.context = context;
|
|
1833
|
-
this.terminal = terminal;
|
|
1834
|
-
/**
|
|
1835
|
-
* Свойство, от которого зависит наличие атрибута `data-terminal-view` у `:host` компонента.
|
|
1836
|
-
*/
|
|
1837
|
-
this.terminalView = this.terminal.isRunningOnTerminal;
|
|
1838
|
-
}
|
|
1839
|
-
/**
|
|
1840
|
-
* Выполняет скачивание генерируемого vCard файла контакта.
|
|
1841
|
-
*/
|
|
1842
|
-
downloadVCard() {
|
|
1843
|
-
if (!this.terminal.isRunningOnTerminal && this.isVCardData()) {
|
|
1844
|
-
this.vCardService.downloadVCard(this.context.data.qrdata);
|
|
1845
|
-
}
|
|
1846
|
-
}
|
|
1847
|
-
/**
|
|
1848
|
-
* Проверяет что в диалоговое окно были переданы данные в формате `vCard`.
|
|
1849
|
-
*/
|
|
1850
|
-
isVCardData() {
|
|
1851
|
-
// eslint-disable-next-line unicorn/better-regex
|
|
1852
|
-
return /BEGIN:VCARD[\s\S]*END:VCARD/i.test(this.context.data.qrdata);
|
|
1853
|
-
}
|
|
1854
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, deps: [{ token: i1.ScVCardService }, { token: POLYMORPHEUS_CONTEXT }, { token: IS_RUNNING_ON_TERMINAL }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
1855
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScQRCodeDialogComponent, selector: "sc-qrcode-dialog", host: { properties: { "attr.data-terminal-view": "this.terminalView" } }, ngImport: i0, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"], dependencies: [{ kind: "component", type: i2$3.QRCodeComponent, selector: "qrcode", inputs: ["allowEmptyString", "colorDark", "colorLight", "cssClass", "elementType", "errorCorrectionLevel", "imageSrc", "imageHeight", "imageWidth", "margin", "qrdata", "scale", "version", "width", "alt", "ariaLabel", "title"], outputs: ["qrCodeURL"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
1856
|
-
}
|
|
1857
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeDialogComponent, decorators: [{
|
|
1858
|
-
type: Component,
|
|
1859
|
-
args: [{ selector: 'sc-qrcode-dialog', changeDetection: ChangeDetectionStrategy.OnPush, template: "<p class=\"-mt-2 mb-3 text-tui-text-02\">{{ !terminal.isRunningOnTerminal && this.isVCardData() ? '\u041D\u0430\u0436\u043C\u0438\u0442\u0435 \u0438\u043B\u0438 \u043E' : '\u041E' }}\u0442\u0441\u043A\u0430\u043D\u0438\u0440\u0443\u0439\u0442\u0435 QR-\u043A\u043E\u0434 \u0432\u0430\u0448\u0438\u043C \u043C\u043E\u0431\u0438\u043B\u044C\u043D\u044B\u043C \u0443\u0441\u0442\u0440\u043E\u0439\u0441\u0442\u0432\u043E\u043C.</p>\n<qrcode\n (click)=\"downloadVCard()\"\n [margin]=\"0\"\n [qrdata]=\"this.context.data.qrdata\"\n [width]=\"800\"\n elementType=\"img\"\n class=\"cursor-pointer\"\n></qrcode>\n", styles: ["::ng-deep tui-dialog:has([data-terminal-view=true]){width:21rem!important}::ng-deep tui-dialog:has([data-terminal-view=true]) .t-heading{margin-bottom:.5rem!important;font:var(--tui-font-heading-6)!important}\n"] }]
|
|
1860
|
-
}], ctorParameters: () => [{ type: i1.ScVCardService }, { type: undefined, decorators: [{
|
|
1861
|
-
type: Inject,
|
|
1862
|
-
args: [POLYMORPHEUS_CONTEXT]
|
|
1863
|
-
}] }, { type: undefined, decorators: [{
|
|
1864
|
-
type: Inject,
|
|
1865
|
-
args: [IS_RUNNING_ON_TERMINAL]
|
|
1866
|
-
}] }], propDecorators: { terminalView: [{
|
|
1867
|
-
type: HostBinding,
|
|
1868
|
-
args: ['attr.data-terminal-view']
|
|
1869
|
-
}] } });
|
|
1870
|
-
|
|
1871
|
-
/**
|
|
1872
|
-
* Модуль QR кода.
|
|
1873
|
-
*/
|
|
1874
|
-
class ScQRCodeModule {
|
|
1875
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
1876
|
-
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, declarations: [ScQRCodeDialogComponent], imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewAction, i2$1.TuiPreviewZoom], exports: [ScQRCodeDialogComponent] }); }
|
|
1877
|
-
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, imports: [CommonModule, QRCodeModule, i2$1.TuiPreviewComponent, i2$1.TuiPreviewTitle, i2$1.TuiPreviewPagination, i2$1.TuiPreviewZoom] }); }
|
|
1878
|
-
}
|
|
1879
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScQRCodeModule, decorators: [{
|
|
1880
|
-
type: NgModule,
|
|
1881
|
-
args: [{
|
|
1882
|
-
declarations: [ScQRCodeDialogComponent],
|
|
1883
|
-
imports: [CommonModule, QRCodeModule, TuiButton, TuiDialog, ...TuiPreview],
|
|
1884
|
-
exports: [ScQRCodeDialogComponent],
|
|
1885
|
-
}]
|
|
1886
|
-
}] });
|
|
1887
|
-
|
|
1888
|
-
/* eslint-disable lodash/prefer-lodash-method */
|
|
1889
|
-
/**
|
|
1890
|
-
* Директива открытия диалогового окна с QRCode для ссылок `tel:` и `mailto:` на терминале.
|
|
1891
|
-
*/
|
|
1892
|
-
class ScTerminalLinkDirective {
|
|
1893
|
-
constructor() {
|
|
1894
|
-
/**
|
|
1895
|
-
* Ссылка на HTML элемент тега `<a>`.
|
|
1896
|
-
*/
|
|
1897
|
-
this.elementReference = inject(ElementRef);
|
|
1898
|
-
/**
|
|
1899
|
-
* Сервис для работы с диалоговыми окнами TuiDialog.
|
|
1900
|
-
*/
|
|
1901
|
-
this.dialog = inject(TuiDialogService);
|
|
1902
|
-
/**
|
|
1903
|
-
* Провайдер данных о терминале.
|
|
1904
|
-
*/
|
|
1905
|
-
this.terminal = inject(IS_RUNNING_ON_TERMINAL);
|
|
1906
|
-
}
|
|
1907
|
-
/**
|
|
1908
|
-
* Обработчик клика по ссылке.
|
|
1909
|
-
*
|
|
1910
|
-
* @param event Событие клика.
|
|
1911
|
-
*/
|
|
1912
|
-
onClick(event) {
|
|
1913
|
-
if (this.terminal.isRunningOnTerminal && this.isLinkTelOrMail()) {
|
|
1914
|
-
// Отключение базового события для терминала.
|
|
1915
|
-
event.preventDefault();
|
|
1916
|
-
this.openQRCodeDialog();
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
/**
|
|
1920
|
-
* Открывает диалоговое окно с QR-кодом.
|
|
1921
|
-
*/
|
|
1922
|
-
openQRCodeDialog() {
|
|
1923
|
-
this.dialog
|
|
1924
|
-
.open(new PolymorpheusComponent(ScQRCodeDialogComponent), {
|
|
1925
|
-
size: 's',
|
|
1926
|
-
// Передаём ссылку формата `mailto:example@example.com` `tel:+70000000000` вместо vCard, так как для vCard данных недостаточно.
|
|
1927
|
-
data: { qrdata: this.elementReference.nativeElement.href },
|
|
1928
|
-
})
|
|
1929
|
-
.subscribe();
|
|
1930
|
-
}
|
|
1931
|
-
/**
|
|
1932
|
-
* Проверяет ведёт ли ссылка на телефон или адрес электронной почты.
|
|
1933
|
-
*/
|
|
1934
|
-
isLinkTelOrMail() {
|
|
1935
|
-
return this.elementReference.nativeElement.href.startsWith('tel:') || this.elementReference.nativeElement.href.startsWith('mailto:');
|
|
1936
|
-
}
|
|
1937
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1938
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScTerminalLinkDirective, isStandalone: true, selector: "a[href]", host: { listeners: { "click": "onClick($event)" } }, ngImport: i0 }); }
|
|
1939
|
-
}
|
|
1940
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScTerminalLinkDirective, decorators: [{
|
|
1941
|
-
type: Directive,
|
|
1942
|
-
args: [{
|
|
1943
|
-
standalone: true,
|
|
1944
|
-
selector: 'a[href]',
|
|
1945
|
-
}]
|
|
1946
|
-
}], propDecorators: { onClick: [{
|
|
1947
|
-
type: HostListener,
|
|
1948
|
-
args: ['click', ['$event']]
|
|
1949
|
-
}] } });
|
|
1658
|
+
const ScLinks = [ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe];
|
|
1950
1659
|
|
|
1951
1660
|
/**
|
|
1952
1661
|
* Модуль полей ввода.
|
|
@@ -2094,11 +1803,11 @@ class ScContactsAccordionComponent {
|
|
|
2094
1803
|
this.deleteButtonClick = new EventEmitter();
|
|
2095
1804
|
}
|
|
2096
1805
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsAccordionComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2097
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type:
|
|
1806
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.12", type: ScContactsAccordionComponent, selector: "sc-contacts-accordion", inputs: { contacts$: "contacts$" }, outputs: { addContactClick: "addContactClick", deleteButtonClick: "deleteButtonClick" }, ngImport: i0, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n linkLocation=\"contact\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n scEmailLink\n linkLocation=\"contact\"\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ScAccordionComponent, selector: "sc-accordion", inputs: ["showAddButton", "showDeleteButton", "showArrow", "open", "size"], outputs: ["addButtonClick", "deleteButtonClick"] }, { kind: "directive", type: ScAccordionContentDirective, selector: "ng-template[scAccordionContent]" }, { kind: "component", type: i1$1.TuiLoader, selector: "tui-loader", inputs: ["size", "inheritColor", "overlay", "textContent", "showLoader"] }, { kind: "directive", type: i6.TuiLet, selector: "[tuiLet]", inputs: ["tuiLet"] }, { kind: "directive", type: i1$1.TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: i1$1.TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "directive", type: ScTelLinkDirective, selector: "a[scTelLink]", inputs: ["scTelLink", "linkLocation"] }, { kind: "directive", type: ScEmailLinkDirective, selector: "a[scEmailLink]", inputs: ["linkLocation"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "pipe", type: ScFormatePhonePipe, name: "scFormatePhone" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
2098
1807
|
}
|
|
2099
1808
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsAccordionComponent, decorators: [{
|
|
2100
1809
|
type: Component,
|
|
2101
|
-
args: [{ selector: 'sc-contacts-accordion', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n" }]
|
|
1810
|
+
args: [{ selector: 'sc-contacts-accordion', changeDetection: ChangeDetectionStrategy.OnPush, template: "<sc-accordion (addButtonClick)=\"addContactClick.emit()\">\n \u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B\n <ng-template scAccordionContent>\n <tui-loader\n *tuiLet=\"contacts$ | async as contacts\"\n [overlay]=\"true\"\n [showLoader]=\"contacts === null\"\n >\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"!contacts || contacts.length; else contactsNotExist\">\n <div\n *ngFor=\"let contact of contacts\"\n class=\"flex gap-2 border-b border-tui-base-03\"\n >\n <div class=\"flex grow flex-col gap-2\">\n {{ contact.name }}\n <a\n *ngIf=\"contact.phone\"\n tuiLink\n [scTelLink]=\"contact.phone\"\n linkLocation=\"contact\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ contact.phone | scFormatePhone }}\"\n >\n {{ contact.phone | scFormatePhone }}\n </a>\n <a\n *ngIf=\"contact.email\"\n tuiLink\n scEmailLink\n linkLocation=\"contact\"\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n href=\"mailto:{{ contact.email }}\"\n >\n {{ contact.email }}\n </a>\n </div>\n <!-- \u0424\u0443\u043D\u043A\u0446\u0438\u043E\u043D\u0430\u043B \u0443\u0434\u0430\u043B\u0435\u043D\u0438\u044F \u0432\u0440\u0435\u043C\u0435\u043D\u043D\u043E \u043D\u0435 \u0434\u043E\u0441\u0442\u0443\u043F\u0435\u043D \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044E. -->\n <!-- <div class=\"flex flex-col md:flex-row gap-1\">\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n icon=\"@tui.trash-2\"\n appearance=\"flat\"\n (click)=\"$event.stopPropagation(); deleteButtonClick.emit(contact)\"\n ></button>\n </div> -->\n </div>\n </ng-container>\n\n <ng-template #contactsNotExist>\n <tui-notification size=\"l\">\n <div>\n <div class=\"flex flex-wrap gap-2 font-medium\">\u041A\u043E\u043D\u0442\u0430\u043A\u0442\u044B \u043D\u0435 \u0443\u043A\u0430\u0437\u0430\u043D\u044B.</div>\n </div>\n </tui-notification>\n </ng-template>\n </div>\n </tui-loader>\n </ng-template>\n</sc-accordion>\n" }]
|
|
2102
1811
|
}], propDecorators: { contacts$: [{
|
|
2103
1812
|
type: Input
|
|
2104
1813
|
}], addContactClick: [{
|
|
@@ -2127,11 +1836,7 @@ class ScContactsModule {
|
|
|
2127
1836
|
TuiSelectModule, i1$1.TuiDataListComponent, i1$1.TuiDataListDirective, i1$1.TuiOption, i1$1.TuiOptGroup, i2$1.TuiDataListWrapperComponent, i2$1.TuiDataListGroupWrapperComponent, i3$1.TuiDataListDirective, TuiLabel,
|
|
2128
1837
|
TuiInputModule,
|
|
2129
1838
|
TuiInputPhoneModule,
|
|
2130
|
-
TuiError,
|
|
2131
|
-
ScTerminalLinkDirective,
|
|
2132
|
-
ScFormatePhonePipe,
|
|
2133
|
-
ScTelLinkDirective,
|
|
2134
|
-
TuiButtonLoading], exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent] }); }
|
|
1839
|
+
TuiError, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiButtonLoading], exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent] }); }
|
|
2135
1840
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScContactsModule, imports: [CommonModule,
|
|
2136
1841
|
FormsModule,
|
|
2137
1842
|
ReactiveFormsModule,
|
|
@@ -2167,9 +1872,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
2167
1872
|
TuiInputModule,
|
|
2168
1873
|
TuiInputPhoneModule,
|
|
2169
1874
|
TuiError,
|
|
2170
|
-
|
|
2171
|
-
ScFormatePhonePipe,
|
|
2172
|
-
ScTelLinkDirective,
|
|
1875
|
+
...ScLinks,
|
|
2173
1876
|
TuiButtonLoading,
|
|
2174
1877
|
],
|
|
2175
1878
|
exports: [ScContactsAccordionComponent, ScNewContactFormComponent, ScAddContactDialogComponent],
|
|
@@ -3120,7 +2823,7 @@ class ScCategoryCardComponent {
|
|
|
3120
2823
|
this.cdr.markForCheck();
|
|
3121
2824
|
}
|
|
3122
2825
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScCategoryCardComponent, deps: [{ token: SC_URLS }, { token: SC_PATH_IMAGE_NOT_FOUND }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3123
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScCategoryCardComponent, selector: "sc-category-card", inputs: { category: "category", size: "size", enableHover: "enableHover", href: "href" }, outputs: { clickOnFavoriteEvent: "clickOnFavoriteEvent" }, host: { properties: { "attr.data-size": "this.size" } }, ngImport: i0, template: "<div class=\"relative\">\n <a\n (tuiHoveredChange)=\"onHovered($event)\"\n [routerLink]=\"href ?? null\"\n class=\"category-button flex flex-col overflow-hidden rounded-tui-radius-m border border-tui-base-04 text-center\"\n >\n <div class=\"img-wrapper w-full grow overflow-hidden\">\n <img\n *ngIf=\"category && category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full object-cover\"\n />\n\n <div\n *ngIf=\"!category\"\n class=\"img-wrapper size-full bg-tui-base-02\"\n ></div>\n\n <img\n *ngIf=\"category && !category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full rounded-xl object-contain p-2\"\n />\n </div>\n\n <div class=\"name flex w-full items-center justify-center\">\n @if (category) {\n @if (enableHover && !isMobile) {\n <tui-line-clamp\n [content]=\"category.name\"\n class=\"pointer-events-none\"\n [lineHeight]=\"size === 'm' ? 26 : 24\"\n [linesLimit]=\"isHover ? 4 : 2\"\n />\n } @else {\n {{ category.name }}\n }\n } @else {\n <div class=\"skeleton-name rounded-tui-radius-s bg-tui-base-02\"></div>\n }\n </div>\n </a>\n <sc-favorite-button\n *ngIf=\"category && (authStatus$ | async)\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"category.isFavorite\"\n (clickEvent)=\"clickOnFavoriteEvent.emit()\"\n class=\"absolute left-1 top-1\"\n ></sc-favorite-button>\n</div>\n", styles: [":host{--tui-duration: .15s}:host[data-size=m] a.category-button{width:100%;height:12.5rem}:host[data-size=m] a.category-button .img-wrapper{max-height:8.75rem}:host[data-size=m] a.category-button .name{padding:.25rem 1rem;margin-block:auto;font-size:.9375rem;line-height:1.5rem;font-weight:800}:host[data-size=m] a.category-button .name .skeleton-name{width:10rem;height:1rem}:host[data-size=s] a.category-button{width:100%;height:10rem}:host[data-size=s] a.category-button .img-wrapper{max-height:7rem}:host[data-size=s] a.category-button .name{padding:.25rem .5rem;margin-block:auto;font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=s] a.category-button .name .skeleton-name{width:7rem;height:.75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$
|
|
2826
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScCategoryCardComponent, selector: "sc-category-card", inputs: { category: "category", size: "size", enableHover: "enableHover", href: "href" }, outputs: { clickOnFavoriteEvent: "clickOnFavoriteEvent" }, host: { properties: { "attr.data-size": "this.size" } }, ngImport: i0, template: "<div class=\"relative\">\n <a\n (tuiHoveredChange)=\"onHovered($event)\"\n [routerLink]=\"href ?? null\"\n class=\"category-button flex flex-col overflow-hidden rounded-tui-radius-m border border-tui-base-04 text-center\"\n >\n <div class=\"img-wrapper w-full grow overflow-hidden\">\n <img\n *ngIf=\"category && category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full object-cover\"\n />\n\n <div\n *ngIf=\"!category\"\n class=\"img-wrapper size-full bg-tui-base-02\"\n ></div>\n\n <img\n *ngIf=\"category && !category.properties?.image\"\n [src]=\"getCategoryImgURL(category)\"\n [alt]=\"category.name\"\n class=\"size-full rounded-xl object-contain p-2\"\n />\n </div>\n\n <div class=\"name flex w-full items-center justify-center\">\n @if (category) {\n @if (enableHover && !isMobile) {\n <tui-line-clamp\n [content]=\"category.name\"\n class=\"pointer-events-none\"\n [lineHeight]=\"size === 'm' ? 26 : 24\"\n [linesLimit]=\"isHover ? 4 : 2\"\n />\n } @else {\n {{ category.name }}\n }\n } @else {\n <div class=\"skeleton-name rounded-tui-radius-s bg-tui-base-02\"></div>\n }\n </div>\n </a>\n <sc-favorite-button\n *ngIf=\"category && (authStatus$ | async)\"\n [showLoader]=\"favoriteShowLoader\"\n [isFavorite]=\"category.isFavorite\"\n (clickEvent)=\"clickOnFavoriteEvent.emit()\"\n class=\"absolute left-1 top-1\"\n ></sc-favorite-button>\n</div>\n", styles: [":host{--tui-duration: .15s}:host[data-size=m] a.category-button{width:100%;height:12.5rem}:host[data-size=m] a.category-button .img-wrapper{max-height:8.75rem}:host[data-size=m] a.category-button .name{padding:.25rem 1rem;margin-block:auto;font-size:.9375rem;line-height:1.5rem;font-weight:800}:host[data-size=m] a.category-button .name .skeleton-name{width:10rem;height:1rem}:host[data-size=s] a.category-button{width:100%;height:10rem}:host[data-size=s] a.category-button .img-wrapper{max-height:7rem}:host[data-size=s] a.category-button .name{padding:.25rem .5rem;margin-block:auto;font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=s] a.category-button .name .skeleton-name{width:7rem;height:.75rem}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$3.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i2$1.TuiLineClamp, selector: "tui-line-clamp", inputs: ["lineHeight", "content", "linesLimit"], outputs: ["overflownChange"] }, { kind: "directive", type: i6.TuiHovered, selector: "[tuiHoveredChange]", outputs: ["tuiHoveredChange"] }, { kind: "component", type: ScFavoriteButtonComponent, selector: "sc-favorite-button", inputs: ["isFavorite", "showLoader", "disabled"], outputs: ["clickEvent"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3124
2827
|
}
|
|
3125
2828
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScCategoryCardComponent, decorators: [{
|
|
3126
2829
|
type: Component,
|
|
@@ -3297,87 +3000,445 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
3297
3000
|
args: ['keydown.arrowUp', ['step']]
|
|
3298
3001
|
}] } });
|
|
3299
3002
|
|
|
3003
|
+
/* eslint-disable lodash/prefer-lodash-method */
|
|
3300
3004
|
/**
|
|
3301
|
-
*
|
|
3005
|
+
* Директива для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
|
3302
3006
|
*/
|
|
3303
|
-
class
|
|
3304
|
-
constructor() {
|
|
3305
|
-
/**
|
|
3306
|
-
* Массив изображений.
|
|
3307
|
-
*/
|
|
3308
|
-
this.images = [];
|
|
3309
|
-
/**
|
|
3310
|
-
* Признак что необходимо отобразить элементы управления.
|
|
3311
|
-
*/
|
|
3312
|
-
this.isShowActions = true;
|
|
3313
|
-
/**
|
|
3314
|
-
* {@link WritableSignal} для отслеживания текущего индекса изображения.
|
|
3315
|
-
*/
|
|
3316
|
-
this.currentIndex = signal(0);
|
|
3317
|
-
}
|
|
3007
|
+
class ScNextInputFocusDirective {
|
|
3318
3008
|
/**
|
|
3319
|
-
*
|
|
3009
|
+
* Слушатель нажатия на клавишу enter. Предотвращает событие submit, выполняет смену фокуса на следующее поле ввода TuiFocusableElementAccessor.
|
|
3320
3010
|
*
|
|
3321
|
-
* @param
|
|
3322
|
-
* @param target Объект {@link HTMLElement} в котором лежат изображения
|
|
3011
|
+
* @param event Объект события нажатия на клавишу.
|
|
3323
3012
|
*/
|
|
3324
|
-
|
|
3325
|
-
if (
|
|
3013
|
+
onFormKeyDownEnter(event) {
|
|
3014
|
+
if (event.code !== 'Enter' && event.key !== 'Enter') {
|
|
3326
3015
|
return;
|
|
3327
3016
|
}
|
|
3328
|
-
|
|
3329
|
-
const
|
|
3330
|
-
const
|
|
3331
|
-
|
|
3332
|
-
|
|
3333
|
-
|
|
3334
|
-
|
|
3335
|
-
|
|
3336
|
-
*/
|
|
3337
|
-
onLeave() {
|
|
3338
|
-
if (this.images.length <= 1) {
|
|
3339
|
-
return;
|
|
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
|
+
}
|
|
3340
3025
|
}
|
|
3341
|
-
this.currentIndex.set(0);
|
|
3342
3026
|
}
|
|
3343
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
3344
|
-
static { this.ɵ
|
|
3027
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
3028
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.12", type: ScNextInputFocusDirective, selector: "form[ScNextInputFocus]", host: { listeners: { "keydown": "onFormKeyDownEnter($event)" } }, queries: [{ propertyName: "focusableElements", predicate: AbstractTuiControl, descendants: true }], ngImport: i0 }); }
|
|
3345
3029
|
}
|
|
3346
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type:
|
|
3347
|
-
type:
|
|
3348
|
-
args: [{
|
|
3349
|
-
|
|
3350
|
-
|
|
3351
|
-
|
|
3352
|
-
type:
|
|
3353
|
-
|
|
3354
|
-
|
|
3355
|
-
args: ['mousemove.silent', ['$event.offsetX', '$event.target']]
|
|
3356
|
-
}], 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: [{
|
|
3357
3039
|
type: HostListener,
|
|
3358
|
-
args: ['
|
|
3040
|
+
args: ['keydown', ['$event']]
|
|
3359
3041
|
}] } });
|
|
3360
3042
|
|
|
3361
3043
|
/**
|
|
3362
|
-
*
|
|
3044
|
+
* Модуль директивы для перехода по нажатию клавиши enter на следующее поле ввода формы.
|
|
3363
3045
|
*/
|
|
3364
|
-
class
|
|
3046
|
+
class ScNextInputFocusModule {
|
|
3047
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
|
|
3048
|
+
static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, declarations: [ScNextInputFocusDirective], exports: [ScNextInputFocusDirective] }); }
|
|
3049
|
+
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule }); }
|
|
3050
|
+
}
|
|
3051
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScNextInputFocusModule, decorators: [{
|
|
3052
|
+
type: NgModule,
|
|
3053
|
+
args: [{
|
|
3054
|
+
declarations: [ScNextInputFocusDirective],
|
|
3055
|
+
exports: [ScNextInputFocusDirective],
|
|
3056
|
+
}]
|
|
3057
|
+
}] });
|
|
3058
|
+
|
|
3059
|
+
/* eslint-disable no-underscore-dangle */
|
|
3060
|
+
/**
|
|
3061
|
+
* Директива абстрактной карточки товара.
|
|
3062
|
+
*/
|
|
3063
|
+
class AbstractScPriceCard {
|
|
3365
3064
|
constructor() {
|
|
3366
3065
|
/**
|
|
3367
|
-
*
|
|
3066
|
+
* Признак того, что этот компонент отображается на мобильном устройстве.
|
|
3368
3067
|
*/
|
|
3369
|
-
this.
|
|
3068
|
+
this.isMobile = inject(TUI_IS_MOBILE);
|
|
3370
3069
|
/**
|
|
3371
|
-
*
|
|
3070
|
+
* {@link FormControl} поля ввода количества товара в корзине.
|
|
3372
3071
|
*/
|
|
3373
|
-
this.
|
|
3374
|
-
|
|
3375
|
-
|
|
3376
|
-
|
|
3377
|
-
|
|
3378
|
-
|
|
3379
|
-
|
|
3380
|
-
|
|
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} изменения выбранного склада.
|
|
3429
|
+
*/
|
|
3430
|
+
this.warehouseSelect$ = inject(ScWarehouseService).getWarehouseSelectChange$();
|
|
3431
|
+
/**
|
|
3432
|
+
* Размер компонента.
|
|
3433
|
+
*/
|
|
3434
|
+
this.size = 'm';
|
|
3435
|
+
}
|
|
3436
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CostWithDiscountComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3437
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: CostWithDiscountComponent, isStandalone: true, selector: "sc-cost-with-discount", inputs: { product: "product", size: "size" }, host: { properties: { "attr.data-size": "this.size" } }, ngImport: i0, template: "@if (product) {\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-wrap items-center gap-x-2 gap-y-1\"\n >\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost\"\n >{{ product.costRubString }}</span\n >\n <tui-badge\n *ngIf=\"product.discount as discount\"\n size=\"m\"\n [style.background]=\"'var(--tui-status-positive)'\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"text-body-xs\"\n >\n <tui-badge\n *ngIf=\"product.discount as discount\"\n size=\"s\"\n [style.background]=\"'var(--tui-background-base)'\"\n class=\"text-body-xs-bold text-tui-text-02\"\n >\n {{ discount.percent }}%\n </tui-badge>\n <span class=\"line-through\">{{ product.discountCostString }}</span>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </tui-badge>\n </div>\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"font-extrabold text-tui-text-02\"\n >{{ product.costString }}</span\n >\n </div>\n}\n", styles: [":host tui-badge{--t-padding: .25rem !important}:host[data-size=s]{font-size:.6875rem;line-height:1rem;font-weight:500}:host[data-size=s] .cost{font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=m],:host[data-size=l]{font-size:.8125rem;line-height:1.25rem;font-weight:500}:host[data-size=m] .cost,:host[data-size=l] .cost{font-size:.9375rem;line-height:1.5rem;font-weight:800}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }, { kind: "directive", type: TuiBadge, selector: "tui-badge,[tuiBadge]", inputs: ["size"] }, { kind: "directive", type: i1$1.TuiHintDirective, selector: "[tuiHint]:not(ng-container):not(ng-template)", inputs: ["tuiHintContext", "tuiHintAppearance", "tuiHint"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3438
|
+
}
|
|
3439
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: CostWithDiscountComponent, decorators: [{
|
|
3440
|
+
type: Component,
|
|
3441
|
+
args: [{ standalone: true, selector: 'sc-cost-with-discount', imports: [CommonModule, TuiBadge, ...TuiHint], changeDetection: ChangeDetectionStrategy.OnPush, template: "@if (product) {\n <div\n *ngIf=\"warehouseSelect$ | async as warehouseSelect\"\n class=\"flex flex-wrap items-center gap-x-2 gap-y-1\"\n >\n <div class=\"flex flex-wrap items-center gap-x-2 gap-y-1\">\n <span\n [class.text-tui-text-02]=\"!product.isWarehouseStockExist(warehouseSelect.id)\"\n class=\"cost\"\n >{{ product.costRubString }}</span\n >\n <tui-badge\n *ngIf=\"product.discount as discount\"\n size=\"m\"\n [style.background]=\"'var(--tui-status-positive)'\"\n [tuiHint]=\"discountHint\"\n [tuiHintShowDelay]=\"100\"\n tuiHintDirection=\"top\"\n class=\"text-body-xs\"\n >\n <tui-badge\n *ngIf=\"product.discount as discount\"\n size=\"s\"\n [style.background]=\"'var(--tui-background-base)'\"\n class=\"text-body-xs-bold text-tui-text-02\"\n >\n {{ discount.percent }}%\n </tui-badge>\n <span class=\"line-through\">{{ product.discountCostString }}</span>\n <ng-template #discountHint>\n <div class=\"font-bold\">{{ product.discount.name }}</div>\n <div *ngIf=\"product.discount.expiredAt as expiredAt\">\u0414\u0430\u0442\u0430 \u043E\u043A\u043E\u043D\u0447\u0430\u043D\u0438\u044F: {{ expiredAt }}</div>\n </ng-template>\n </tui-badge>\n </div>\n <span\n *ngIf=\"!product.priceInRub\"\n class=\"font-extrabold text-tui-text-02\"\n >{{ product.costString }}</span\n >\n </div>\n}\n", styles: [":host tui-badge{--t-padding: .25rem !important}:host[data-size=s]{font-size:.6875rem;line-height:1rem;font-weight:500}:host[data-size=s] .cost{font-size:.8125rem;line-height:1.25rem;font-weight:800}:host[data-size=m],:host[data-size=l]{font-size:.8125rem;line-height:1.25rem;font-weight:500}:host[data-size=m] .cost,:host[data-size=l] .cost{font-size:.9375rem;line-height:1.5rem;font-weight:800}\n"] }]
|
|
3381
3442
|
}], propDecorators: { product: [{
|
|
3382
3443
|
type: Input
|
|
3383
3444
|
}], size: [{
|
|
@@ -3703,7 +3764,6 @@ class ScCatalogModule {
|
|
|
3703
3764
|
TuiAxes,
|
|
3704
3765
|
TuiButtonLoading,
|
|
3705
3766
|
TuiAvatar,
|
|
3706
|
-
HoverImageCarouselComponent,
|
|
3707
3767
|
TuiLineClamp,
|
|
3708
3768
|
CostWithDiscountComponent] }); }
|
|
3709
3769
|
}
|
|
@@ -4288,6 +4348,197 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
4288
4348
|
}]
|
|
4289
4349
|
}] });
|
|
4290
4350
|
|
|
4351
|
+
/* eslint-disable @typescript-eslint/no-unsafe-argument */
|
|
4352
|
+
/**
|
|
4353
|
+
* Компонент представления ресурсов.
|
|
4354
|
+
*/
|
|
4355
|
+
class ScResourcePreviewComponent {
|
|
4356
|
+
constructor() {
|
|
4357
|
+
/**
|
|
4358
|
+
* Название файла из URL.
|
|
4359
|
+
*/
|
|
4360
|
+
this.name = inject(ActivatedRoute).snapshot.url.join('/');
|
|
4361
|
+
/**
|
|
4362
|
+
* Путь к ресурсу.
|
|
4363
|
+
*/
|
|
4364
|
+
this.src = inject(SC_URLS).res?.[this.name]?.src ?? '';
|
|
4365
|
+
/**
|
|
4366
|
+
* MIME type файла {@link HTMLSourceElement}.
|
|
4367
|
+
*/
|
|
4368
|
+
this.type = inject(SC_URLS).res?.[this.name]?.type ?? '';
|
|
4369
|
+
/**
|
|
4370
|
+
* Контекст диалогового окна, в котором открыт компонент.
|
|
4371
|
+
*/
|
|
4372
|
+
this.context = injectContext({ optional: true });
|
|
4373
|
+
/**
|
|
4374
|
+
* Проверяет что MIME type ресурса подходит для `<video>`.
|
|
4375
|
+
*/
|
|
4376
|
+
this.isVideoResource = () => this.type?.startsWith('video');
|
|
4377
|
+
}
|
|
4378
|
+
/**
|
|
4379
|
+
* Обработчик события готовности видео к запуску.
|
|
4380
|
+
*
|
|
4381
|
+
* @param videoElement HTML элемент видео.
|
|
4382
|
+
*/
|
|
4383
|
+
onCanPlay(videoElement) {
|
|
4384
|
+
this.playAttempt = setInterval(() => {
|
|
4385
|
+
videoElement
|
|
4386
|
+
.play()
|
|
4387
|
+
.then(() => {
|
|
4388
|
+
if (this.playAttempt) {
|
|
4389
|
+
clearInterval(this.playAttempt);
|
|
4390
|
+
}
|
|
4391
|
+
})
|
|
4392
|
+
// eslint-disable-next-line lodash/prefer-noop
|
|
4393
|
+
.catch(() => {
|
|
4394
|
+
// Do nothing.
|
|
4395
|
+
});
|
|
4396
|
+
}, 2000); // Каждые 2 секунды пытается запустить видео.
|
|
4397
|
+
}
|
|
4398
|
+
/** @inheritDoc */
|
|
4399
|
+
ngOnDestroy() {
|
|
4400
|
+
// Исправляет ошибку фонового воспроизведения после закрытия диалога.
|
|
4401
|
+
if (this.playAttempt) {
|
|
4402
|
+
clearInterval(this.playAttempt);
|
|
4403
|
+
}
|
|
4404
|
+
}
|
|
4405
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScResourcePreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
4406
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.12", type: ScResourcePreviewComponent, isStandalone: true, selector: "sc-resource-preview", ngImport: i0, 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"], dependencies: [{ kind: "directive", type: TuiNotification, selector: "tui-notification,a[tuiNotification],button[tuiNotification]", inputs: ["appearance", "icon", "size"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
4407
|
+
}
|
|
4408
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScResourcePreviewComponent, decorators: [{
|
|
4409
|
+
type: Component,
|
|
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"] }]
|
|
4411
|
+
}] });
|
|
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
|
+
|
|
4291
4542
|
/* eslint-disable class-methods-use-this */
|
|
4292
4543
|
/**
|
|
4293
4544
|
* Сервис работающий с значками элементов дерева.
|
|
@@ -5382,11 +5633,11 @@ class ScUserManagersComponent {
|
|
|
5382
5633
|
this.qrClickEvent = new EventEmitter();
|
|
5383
5634
|
}
|
|
5384
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 }); }
|
|
5385
|
-
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 }); }
|
|
5386
5637
|
}
|
|
5387
5638
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserManagersComponent, decorators: [{
|
|
5388
5639
|
type: Component,
|
|
5389
|
-
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"] }]
|
|
5390
5641
|
}], ctorParameters: () => [{ type: i1.ScUserService }], propDecorators: { qrClickEvent: [{
|
|
5391
5642
|
type: Output
|
|
5392
5643
|
}] } });
|
|
@@ -5498,9 +5749,7 @@ class ScUserModule {
|
|
|
5498
5749
|
TuiInputPhoneModule,
|
|
5499
5750
|
TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiDataListDirective, i1$1.TuiOption, i1$1.TuiOptGroup, TuiSelectModule,
|
|
5500
5751
|
TuiLink,
|
|
5501
|
-
ScTerminalLinkDirective,
|
|
5502
|
-
ScTelLinkModule,
|
|
5503
|
-
TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
|
|
5752
|
+
ScTerminalLinkDirective, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiButtonLoading], exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent] }); }
|
|
5504
5753
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, imports: [CommonModule,
|
|
5505
5754
|
FormsModule,
|
|
5506
5755
|
ReactiveFormsModule,
|
|
@@ -5513,7 +5762,6 @@ class ScUserModule {
|
|
|
5513
5762
|
TuiInputModule,
|
|
5514
5763
|
TuiInputPhoneModule,
|
|
5515
5764
|
TuiCheckbox, i1$1.TuiDataListComponent, i1$1.TuiOption, TuiSelectModule,
|
|
5516
|
-
ScTelLinkModule,
|
|
5517
5765
|
TuiButtonLoading] }); }
|
|
5518
5766
|
}
|
|
5519
5767
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScUserModule, decorators: [{
|
|
@@ -5541,7 +5789,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
5541
5789
|
TuiSelectModule,
|
|
5542
5790
|
TuiLink,
|
|
5543
5791
|
ScTerminalLinkDirective,
|
|
5544
|
-
|
|
5792
|
+
...ScLinks,
|
|
5545
5793
|
TuiButtonLoading,
|
|
5546
5794
|
],
|
|
5547
5795
|
exports: [ScResetUserPasswordComponent, ScUpdateUserInfoDialogComponent, ScUserPhoneApproveDialogComponent, ScUserManagersComponent],
|
|
@@ -5665,14 +5913,14 @@ class ScProfileAccordionsContentComponent {
|
|
|
5665
5913
|
return this.locationsService.getUserCity$(cityId);
|
|
5666
5914
|
}
|
|
5667
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 }); }
|
|
5668
|
-
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 }); }
|
|
5669
5917
|
}
|
|
5670
5918
|
__decorate([
|
|
5671
5919
|
tuiPure // TODO: TASK[#7615] Удалить поле рефакторинга сервиса работы с пользователем.
|
|
5672
5920
|
], ScProfileAccordionsContentComponent.prototype, "getUserCity$", null);
|
|
5673
5921
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileAccordionsContentComponent, decorators: [{
|
|
5674
5922
|
type: Component,
|
|
5675
|
-
args: [{ selector: 'sc-profile-accordions-content', providers: [SC_USER_PROVIDERS], animations: [tuiFadeIn], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n
|
|
5923
|
+
args: [{ selector: 'sc-profile-accordions-content', providers: [SC_USER_PROVIDERS], animations: [tuiFadeIn], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n *tuiLet=\"user$ | async as user\"\n class=\"flex flex-col gap-4\"\n>\n <sc-accordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n [open]=\"true\"\n >\n \u041E\u0431\u0449\u0438\u0435 \u0434\u0430\u043D\u043D\u044B\u0435\n <ng-template scAccordionContent>\n <tui-loader\n [overlay]=\"true\"\n [showLoader]=\"user === null\"\n >\n <div class=\"flex gap-2 pl-4\">\n <div\n *ngIf=\"user\"\n class=\"flex grow flex-col gap-2\"\n >\n <span class=\"font-medium\">{{ user.name }}</span>\n <div\n *ngIf=\"user.city && (getUserCity$(user.city) | async) as city\"\n class=\"flex items-center gap-1\"\n >\n <tui-icon icon=\"@tui.map-pin\"></tui-icon>\n <div class=\"flex flex-wrap\">\n <span>\u0433. {{ city.name }}, </span>\n <span *ngIf=\"city.region\">{{ city.region.name }}</span>\n </div>\n </div>\n <div class=\"flex flex-wrap gap-2\">\n <a\n tuiLink\n [scTelLink]=\"user.contacts.phone.value\"\n iconStart=\"@tui.phone\"\n [pseudo]=\"true\"\n linkLocation=\"profile\"\n href=\"tel:{{ user.contacts.phone.value | scFormatePhone }}\"\n >\n {{ user.contacts.phone.value | scFormatePhone }}\n </a>\n <span\n *ngIf=\"!user.contacts.phone.isApproved\"\n class=\"text-tui-text-03\"\n >\n (\u0422\u0435\u043B\u0435\u0444\u043E\u043D \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"approvePhoneClick.emit()\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C</button\n >)\n </span>\n </div>\n <div\n *tuiLet=\"!!(isSendApproveEmail$ | async) as isSendApproveEmail\"\n class=\"flex flex-wrap gap-x-2\"\n >\n <a\n tuiLink\n iconStart=\"@tui.mail\"\n [pseudo]=\"true\"\n scEmailLink\n linkLocation=\"profile\"\n href=\"mailto:{{ user.contacts.email.value }}\"\n >\n {{ user.contacts.email.value }}\n </a>\n <span\n *ngIf=\"!isSendApproveEmail && !user.contacts.email.isApproved\"\n class=\"inline-flex flex-wrap gap-1 text-tui-text-03\"\n >\n E-mail \u043D\u0435 \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D.\n <tui-loader\n [showLoader]=\"!!(approveEmailLoading$ | async)\"\n [overlay]=\"true\"\n >\n <button\n tuiLink\n [pseudo]=\"true\"\n (click)=\"onSendApproveEmail.next(user.contacts.email.value)\"\n >\n \u041F\u043E\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044C\n </button>\n </tui-loader>\n </span>\n <span\n *ngIf=\"isSendApproveEmail\"\n class=\"text-tui-success-fill\"\n @tuiFadeIn\n >\n \u041F\u0438\u0441\u044C\u043C\u043E \u0434\u043B\u044F \u043F\u043E\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043D\u0438\u044F \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u0442\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u043E. \u041F\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043F\u043E \u0441\u0441\u044B\u043B\u043A\u0435 \u0432 \u043F\u0438\u0441\u044C\u043C\u0435 \u0438 \u043E\u0431\u043D\u043E\u0432\u0438\u0442\u0435 \u044D\u0442\u0443 \u0441\u0442\u0440\u0430\u043D\u0438\u0446\u0443.\n </span>\n </div>\n <tui-loader\n [showLoader]=\"!!(getNewsLoading$ | async)\"\n [overlay]=\"true\"\n >\n <label tuiLabel>\n <input\n tuiCheckbox\n type=\"checkbox\"\n size=\"s\"\n class=\"w-full\"\n [formControl]=\"getNewsControl\"\n [ngModel]=\"user.getNews\"\n />\n \u042F \u0445\u043E\u0447\u0443 \u043F\u043E\u043B\u0443\u0447\u0430\u0442\u044C \u0440\u0430\u0441\u0441\u044B\u043B\u043A\u0443 \u0421\u043D\u0430\u0431\u0446\u0435\u043D\u0442\u0440 \u043E \u0441\u043A\u0438\u0434\u043A\u0430\u0445 \u0438 \u043D\u043E\u0432\u043E\u0441\u0442\u044F\u0445 \u043F\u043E \u044D\u043B\u0435\u043A\u0442\u0440\u043E\u043D\u043D\u043E\u0439 \u043F\u043E\u0447\u0442\u0435.\n </label>\n </tui-loader>\n </div>\n\n <button\n tuiIconButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.pencil\"\n appearance=\"flat\"\n (click)=\"editProfileClick.emit()\"\n ></button>\n </div>\n </tui-loader>\n </ng-template>\n </sc-accordion>\n <sc-contragents-accordion\n (addContragentClick)=\"addContragentClick.emit()\"\n (deleteContragentClick)=\"deleteContragentClick.emit($event)\"\n (addContragentBankAccountClick)=\"addContragentBankAccountClick.emit($event)\"\n (deleteContragentBankAccountClick)=\"deleteContragentBankAccountClick.emit($event)\"\n (addContragentContactClick)=\"addContragentContactClick.emit($event)\"\n (deleteContragentContactClick)=\"deleteContragentContactClick.emit($event)\"\n ></sc-contragents-accordion>\n <sc-delivery-address-accordion\n (addDeliveryAddressClick)=\"addDeliveryAddressClick.emit()\"\n (deleteDeliveryAddressClick)=\"deleteDeliveryAddressClick.emit($event)\"\n (addDeliveryAddressContactClick)=\"addDeliveryAddressContactClick.emit($event)\"\n (deleteDeliveryAddressContactClick)=\"deleteDeliveryAddressContactClick.emit($event)\"\n ></sc-delivery-address-accordion>\n <sc-contacts-accordion\n *ngIf=\"user\"\n [contacts$]=\"userContacts$\"\n (addContactClick)=\"addUserContactClick.emit(user.id)\"\n (deleteButtonClick)=\"deleteUserContactClick.emit($event)\"\n ></sc-contacts-accordion>\n <sc-accordion\n #passwordAccordion\n [showArrow]=\"false\"\n [showAddButton]=\"false\"\n >\n \u0418\u0437\u043C\u0435\u043D\u0438\u0442\u044C \u043F\u0430\u0440\u043E\u043B\u044C\n <ng-template scAccordionContent>\n <sc-reset-user-password (successResetPassword)=\"passwordAccordion.close()\"></sc-reset-user-password>\n </ng-template>\n </sc-accordion>\n</div>\n" }]
|
|
5676
5924
|
}], ctorParameters: () => [{ type: i6$1.Observable, decorators: [{
|
|
5677
5925
|
type: Inject,
|
|
5678
5926
|
args: [SC_USER_INFO]
|
|
@@ -5725,9 +5973,7 @@ class ScProfileModule {
|
|
|
5725
5973
|
ReactiveFormsModule,
|
|
5726
5974
|
TuiButton,
|
|
5727
5975
|
ScContactsModule,
|
|
5728
|
-
ScTerminalLinkDirective,
|
|
5729
|
-
ScTelLinkModule,
|
|
5730
|
-
TuiCheckbox], exports: [ScProfileAccordionsContentComponent] }); }
|
|
5976
|
+
ScTerminalLinkDirective, ScTelLinkDirective, ScEmailLinkDirective, ScFormatePhonePipe, TuiCheckbox], exports: [ScProfileAccordionsContentComponent] }); }
|
|
5731
5977
|
static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileModule, imports: [CommonModule,
|
|
5732
5978
|
ScUserModule,
|
|
5733
5979
|
ScAccordionModule,
|
|
@@ -5738,7 +5984,6 @@ class ScProfileModule {
|
|
|
5738
5984
|
FormsModule,
|
|
5739
5985
|
ReactiveFormsModule,
|
|
5740
5986
|
ScContactsModule,
|
|
5741
|
-
ScTelLinkModule,
|
|
5742
5987
|
TuiCheckbox] }); }
|
|
5743
5988
|
}
|
|
5744
5989
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScProfileModule, decorators: [{
|
|
@@ -5761,7 +6006,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
5761
6006
|
TuiButton,
|
|
5762
6007
|
ScContactsModule,
|
|
5763
6008
|
ScTerminalLinkDirective,
|
|
5764
|
-
|
|
6009
|
+
...ScLinks,
|
|
5765
6010
|
TuiCheckbox,
|
|
5766
6011
|
],
|
|
5767
6012
|
exports: [ScProfileAccordionsContentComponent],
|
|
@@ -5776,5 +6021,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
5776
6021
|
* Generated bundle index. Do not edit.
|
|
5777
6022
|
*/
|
|
5778
6023
|
|
|
5779
|
-
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, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective,
|
|
6024
|
+
export { AbstractScPriceCard, AuthMethod, FilesAndDocumentsComponent, FilesAndDocumentsModule, SC_ERROR_CHANGE_HANDLER, SC_QA_INFO, SC_USER_INFO, SC_USER_PROVIDERS, ScAccordionComponent, ScAccordionContentDirective, ScAccordionModule, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddressesSelectionFieldComponent, ScAskToSampleFormComponent, ScAuthModule, ScBannerComponent, ScBannerModule, ScBrandsListComponent, ScBrandsListModule, ScCartItemMobileComponent, ScCartModule, ScCatalogModule, ScCategoryCardComponent, ScContactsAccordionComponent, ScContactsModule, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScContragentsModule, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDeliveryAddressModule, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFormFieldsModule, ScFormatePhonePipe, ScInputQuantityComponent, ScLinks, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNewsModule, ScNextInputFocusDirective, ScNextInputFocusModule, ScOrderItemMobileComponent, ScOrderModule, ScPaymentStatusComponent, ScPreviewSampleComponent, ScPreviewSampleModule, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScProfileAccordionsContentComponent, ScProfileModule, ScQRCodeDialogComponent, ScQRCodeModule, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserModule, ScUserPhoneApproveDialogComponent, ScVerificationModule, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scPasswordConfirmMatchingValidator, scUserFactory, stepValidator };
|
|
5780
6025
|
//# sourceMappingURL=snabcentr-client-ui.mjs.map
|