@snabcentr/client-ui 3.52.1 → 3.52.2
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.
- package/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.d.ts +47 -0
- package/catalog/catalog-filters/index.d.ts +1 -0
- package/catalog/catalog-filters/sc-catalog-filters.component.d.ts +87 -19
- package/esm2022/catalog/catalog-filters/collapsible/sc-catalog-filter-collapsible.component.mjs +59 -0
- package/esm2022/catalog/catalog-filters/index.mjs +2 -1
- package/esm2022/catalog/catalog-filters/sc-catalog-filters.component.mjs +246 -58
- package/fesm2022/snabcentr-client-ui.mjs +296 -55
- package/fesm2022/snabcentr-client-ui.mjs.map +1 -1
- package/package.json +2 -2
- package/release_notes.tmp +2 -2
- package/styles/tailwind/tailwind.scss +17 -4
|
@@ -1,20 +1,20 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, Injectable, NgZone, signal, EventEmitter, ChangeDetectorRef, Directive, Input, Output, Pipe, ElementRef, HostListener, Renderer2, ContentChildren, NgModule, input, computed, Component, ChangeDetectionStrategy, Inject, HostBinding, model, output, SkipSelf, DestroyRef, effect, ContentChild, ViewChild, viewChild, Optional, forwardRef } from '@angular/core';
|
|
2
|
+
import { InjectionToken, inject, Injectable, NgZone, signal, EventEmitter, ChangeDetectorRef, Directive, Input, Output, Pipe, ElementRef, HostListener, Renderer2, ContentChildren, NgModule, input, computed, Component, ChangeDetectionStrategy, Inject, HostBinding, model, output, SkipSelf, DestroyRef, effect, ContentChild, ViewChild, viewChild, Optional, contentChild, TemplateRef, forwardRef } from '@angular/core';
|
|
3
3
|
import * as i1 from '@snabcentr/client-core';
|
|
4
4
|
import { ScContactsService, ScUserService, ScLocationsService, ScAuthService, SEARCH_TERM, ScUnitsHelper, ScImageHelper, SC_PATH_IMAGE_NOT_FOUND, ScImage, ScPhoneService, ScUserMetrikaService, ScUserMetrikaGoalsEnum, IS_RUNNING_ON_TERMINAL, ScVCardService, ScVerificationService, ScISuggestionType, SC_MIN_LENGTH_SEARCH_TERM, ScConvertersService, ScOpfList, ScReferencesService, ScContragentService, ScBannerService, ScMediaImageTransformerPipe, ScCartService, ScUploadedFile, SC_ORDER_LOADER, ScMimeTypes, ScCatalogService, SC_URLS, IS_SERVER, ScWarehouseService, SEARCH_TERM_PROVIDERS, ScPaginationService, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PRODUCT_PAGINATION_OPTIONS, ScCatalogFilterService, ScIdOrSlugPipe, SC_CATEGORY_INFO, ScConfiguratorService, RESPONSE, ScIconTypesEnum, ScDocumentInfoTypesEnum, ScOrderDraftsService, ScRouteKeys, ScSeoService, scOrderIsLoaded, ScFrequentlyAskedQuestionsService, SC_COMPANY_INFO, ScFeedbackService } from '@snabcentr/client-core';
|
|
5
5
|
import * as i5$1 from 'rxjs';
|
|
6
|
-
import { EMPTY, BehaviorSubject, switchMap, of, shareReplay, map, Subject, filter, tap, catchError, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, debounceTime, throwError, combineLatest, Observable, pairwise, merge, skip, from, concatMap, noop, first } from 'rxjs';
|
|
6
|
+
import { EMPTY, BehaviorSubject, switchMap, of, shareReplay, map, Subject, filter, tap, catchError, finalize, startWith, share, timer, scan, takeWhile, endWith, distinctUntilChanged, debounceTime, throwError, combineLatest, Observable, pairwise, Subscription, merge, skip, from, concatMap, noop, first } from 'rxjs';
|
|
7
7
|
import { WA_WINDOW } from '@ng-web-apis/common';
|
|
8
8
|
import { takeUntilDestroyed, toSignal, outputFromObservable, toObservable } from '@angular/core/rxjs-interop';
|
|
9
9
|
import * as i4$1 from '@taiga-ui/cdk';
|
|
10
10
|
import { TuiDay, TuiTime, TuiValueTransformer, TUI_IS_MOBILE, tuiControlValue, tuiIsPresent, tuiMarkControlAsTouchedAndValidate, tuiIsFalsy, TuiAutoFocus, TuiRepeatTimes, TuiHovered, TuiDayRange, TuiMonth, tuiPure, tuiProvide, TUI_WINDOW_SIZE, TuiValidationError, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
11
11
|
import * as i2$1 from '@taiga-ui/kit';
|
|
12
|
-
import { TUI_DATE_VALUE_TRANSFORMER, TuiPreview, TuiAvatar, TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiSortCountriesPipe, TuiStepper, TuiCarousel, TuiPush, TuiCheckbox, TuiFiles, TuiChip, TuiInputNumber, TuiBadge, TuiTooltip, TuiHighlight, TuiLineClamp,
|
|
12
|
+
import { TUI_DATE_VALUE_TRANSFORMER, TuiPreview, TuiAvatar, TuiAccordionItem, TuiElasticContainer, TuiAccordion, TuiFieldErrorPipe, TuiFilterByInputPipe, TuiStringifyContentPipe, TuiDataListWrapper, TuiButtonLoading, TuiSortCountriesPipe, TuiStepper, TuiCarousel, TuiPush, TuiCheckbox, TuiFiles, TuiChip, TuiInputNumber, TuiBadge, TuiTooltip, TuiHighlight, TuiLineClamp, TuiFade, TuiRange, tuiInputNumberOptionsProvider, TuiDataListWrapperComponent, TuiChevron, TuiSelect, TuiInputSlider, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTree, TuiPreviewDialogService, TUI_CONFIRM, tuiItemsHandlersProvider as tuiItemsHandlersProvider$1, TuiPagination, TuiAccordionDirective, TuiAccordionItemContent, tuiFilesAccepted } from '@taiga-ui/kit';
|
|
13
13
|
import { HttpClient, HttpErrorResponse } from '@angular/common/http';
|
|
14
14
|
import * as i1$1 from '@angular/forms';
|
|
15
15
|
import { FormControl, FormGroupDirective, NgControl, FormGroup, Validators, FormArray, FormsModule, ReactiveFormsModule } from '@angular/forms';
|
|
16
16
|
import * as i1$2 from '@taiga-ui/core';
|
|
17
|
-
import { TuiButton, TuiDialog, TuiDialogService, TuiLink, TuiFallbackSrcPipe, TuiInitialsPipe, TuiIcon, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiLabel, TuiError, TuiLoader, TuiDataList, TuiNotification, TuiTextfield, TuiTitle, TuiNumberFormat, TuiHint, TUI_MONTHS, tuiNumberFormatProvider, tuiItemsHandlersProvider, tuiTextfieldOptionsProvider, tuiHintOptionsProvider, TuiFormatNumberPipe, TuiHintDriver, TuiHintHover, TuiHintPosition, TuiHintDirective, TUI_BUTTON_OPTIONS, TUI_BUTTON_DEFAULT_OPTIONS,
|
|
17
|
+
import { TuiButton, TuiDialog, TuiDialogService, TuiLink, TuiFallbackSrcPipe, TuiInitialsPipe, TuiIcon, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TUI_DATA_LIST_HOST, tuiDropdownOptionsProvider, TuiLabel, TuiError, TuiLoader, TuiDataList, TuiNotification, TuiTextfield, TuiTitle, TuiNumberFormat, TuiHint, TUI_MONTHS, TuiScrollbar, tuiNumberFormatProvider, tuiItemsHandlersProvider, tuiTextfieldOptionsProvider, tuiHintOptionsProvider, TuiFormatNumberPipe, TuiHintDriver, TuiHintHover, TuiHintPosition, TuiHintDirective, TUI_BUTTON_OPTIONS, TUI_BUTTON_DEFAULT_OPTIONS, TuiSurface, tuiFadeIn } from '@taiga-ui/core';
|
|
18
18
|
import { isValidPhoneNumber } from 'libphonenumber-js/max';
|
|
19
19
|
import * as i4 from '@taiga-ui/legacy/components/primitive-textfield';
|
|
20
20
|
import * as i3 from '@taiga-ui/legacy';
|
|
@@ -25,7 +25,7 @@ import * as i5 from '@taiga-ui/core/components/label';
|
|
|
25
25
|
import * as i8 from '@maskito/angular';
|
|
26
26
|
import { MaskitoDirective } from '@maskito/angular';
|
|
27
27
|
import * as i2$2 from '@angular/common';
|
|
28
|
-
import { DOCUMENT, CommonModule, NgIf, AsyncPipe, DecimalPipe, NgFor, NgClass } from '@angular/common';
|
|
28
|
+
import { DOCUMENT, CommonModule, NgIf, AsyncPipe, NgTemplateOutlet, DecimalPipe, NgFor, NgClass } from '@angular/common';
|
|
29
29
|
import * as i2$3 from '@taiga-ui/polymorpheus';
|
|
30
30
|
import { POLYMORPHEUS_CONTEXT, PolymorpheusComponent, PolymorpheusTemplate, PolymorpheusOutlet, injectContext } from '@taiga-ui/polymorpheus';
|
|
31
31
|
import * as i2 from 'angularx-qrcode';
|
|
@@ -46,10 +46,10 @@ import { TuiCardLarge, TuiBlockStatus, TuiHeader } from '@taiga-ui/layout';
|
|
|
46
46
|
import { __decorate } from 'tslib';
|
|
47
47
|
import * as i4$2 from '@taiga-ui/addon-charts';
|
|
48
48
|
import { TuiLineDaysChart, TuiLineDaysChartHint, TuiAxes } from '@taiga-ui/addon-charts';
|
|
49
|
-
import * as i2$5 from '@taiga-ui/experimental/components/expand';
|
|
50
49
|
import * as i5$2 from '@taiga-ui/kit/components/slider';
|
|
51
50
|
import * as i9 from 'angular8-yandex-maps';
|
|
52
51
|
import { AngularYandexMapsModule } from 'angular8-yandex-maps';
|
|
52
|
+
import * as i2$5 from '@taiga-ui/experimental/components/expand';
|
|
53
53
|
import * as i3$3 from '@taiga-ui/kit/components/data-list-wrapper';
|
|
54
54
|
import { TuiGroup } from '@taiga-ui/core/directives/group';
|
|
55
55
|
import * as i4$3 from 'ng-recaptcha-2';
|
|
@@ -5627,6 +5627,60 @@ const SC_CATALOG_PRODUCTS_FILTERS = new InjectionToken('SC_CATALOG_PRODUCTS_FILT
|
|
|
5627
5627
|
*/
|
|
5628
5628
|
const SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY = new InjectionToken('SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY');
|
|
5629
5629
|
|
|
5630
|
+
/**
|
|
5631
|
+
* Контейнер сворачивания для длинного списка вариантов фильтра.
|
|
5632
|
+
*
|
|
5633
|
+
* Когда число элементов превышает порог: свёрнут — fade с обрезкой, развёрнут — scrollbar.
|
|
5634
|
+
* Иначе рендерит контент без обёртки и кнопки переключения.
|
|
5635
|
+
*
|
|
5636
|
+
* Контент проецируется как `<ng-template>` — это сохраняет инжектор `ControlContainer`
|
|
5637
|
+
* родителя для `formControlName`/`formGroupName` внутри проецируемого фрагмента.
|
|
5638
|
+
*/
|
|
5639
|
+
class ScCatalogFilterCollapsibleComponent {
|
|
5640
|
+
constructor() {
|
|
5641
|
+
/**
|
|
5642
|
+
* Число элементов содержимого, по которому решается необходимость сворачивания.
|
|
5643
|
+
*/
|
|
5644
|
+
this.itemsCount = input.required();
|
|
5645
|
+
/**
|
|
5646
|
+
* Показывать ли кнопку сброса значений группы.
|
|
5647
|
+
*/
|
|
5648
|
+
this.showReset = input(false);
|
|
5649
|
+
/**
|
|
5650
|
+
* Событие нажатия на кнопку сброса группы.
|
|
5651
|
+
*/
|
|
5652
|
+
this.resetGroup = output();
|
|
5653
|
+
/**
|
|
5654
|
+
* Проецируемое содержимое (объявляется в шаблоне родителя как `<ng-template>`).
|
|
5655
|
+
*/
|
|
5656
|
+
this.contentTpl = contentChild.required(TemplateRef);
|
|
5657
|
+
/**
|
|
5658
|
+
* Развёрнут ли список.
|
|
5659
|
+
*/
|
|
5660
|
+
this.isExpanded = signal(false);
|
|
5661
|
+
/**
|
|
5662
|
+
* Нужно ли сворачивание для текущего числа элементов.
|
|
5663
|
+
*/
|
|
5664
|
+
this.isCollapsible = computed(() => this.itemsCount() > ScCatalogFilterCollapsibleComponent.COLLAPSE_THRESHOLD);
|
|
5665
|
+
}
|
|
5666
|
+
/**
|
|
5667
|
+
* Порог числа вариантов, после которого включается сворачивание с {@link TuiFade}.
|
|
5668
|
+
*/
|
|
5669
|
+
static { this.COLLAPSE_THRESHOLD = 5; }
|
|
5670
|
+
/**
|
|
5671
|
+
* Переключает развёрнутость списка.
|
|
5672
|
+
*/
|
|
5673
|
+
toggle() {
|
|
5674
|
+
this.isExpanded.update((value) => !value);
|
|
5675
|
+
}
|
|
5676
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFilterCollapsibleComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5677
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFilterCollapsibleComponent, isStandalone: true, selector: "sc-catalog-filter-collapsible", inputs: { itemsCount: { classPropertyName: "itemsCount", publicName: "itemsCount", isSignal: true, isRequired: true, transformFunction: null }, showReset: { classPropertyName: "showReset", publicName: "showReset", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetGroup: "resetGroup" }, queries: [{ propertyName: "contentTpl", first: true, predicate: TemplateRef, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"flex flex-col gap-2\">\n @if (isCollapsible()) {\n @if (isExpanded()) {\n <tui-scrollbar [style.max-block-size]=\"'11rem'\">\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n </tui-scrollbar>\n } @else {\n <div\n class=\"filter-group-fade\"\n tuiFade=\"vertical\"\n tuiFadeHeight=\"0.25rem\"\n tuiFadeOffset=\"0.25rem\"\n >\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n </div>\n }\n\n <div class=\"flex items-center justify-between\">\n <button\n tuiLink\n type=\"button\"\n class=\"text-start !text-body-s\"\n [style.text-decoration-line]=\"'underline'\"\n (click)=\"toggle()\"\n >\n @if (isExpanded()) {\n \u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C\n } @else {\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451\n }\n </button>\n @if (showReset()) {\n <button\n tuiLink\n appearance=\"\"\n [style.color]=\"'var(--tui-status-negative)'\"\n [style.text-decoration-line]=\"'underline'\"\n type=\"button\"\n class=\"!text-body-s\"\n (click)=\"resetGroup.emit()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\n </button>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n @if (showReset()) {\n <button\n tuiLink\n type=\"button\"\n class=\"text-start !text-body-s\"\n (click)=\"resetGroup.emit()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\n </button>\n }\n }\n</div>\n", styles: [".filter-group-fade{box-sizing:border-box;max-block-size:9rem;overflow:hidden!important;transition:none!important}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: TuiFade, selector: "[tuiFade]", inputs: ["tuiFadeHeight", "tuiFadeSize", "tuiFadeOffset", "tuiFade"] }, { kind: "directive", type: TuiLink, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo"] }, { kind: "component", type: TuiScrollbar, selector: "tui-scrollbar", inputs: ["hidden"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5678
|
+
}
|
|
5679
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFilterCollapsibleComponent, decorators: [{
|
|
5680
|
+
type: Component,
|
|
5681
|
+
args: [{ standalone: true, selector: 'sc-catalog-filter-collapsible', changeDetection: ChangeDetectionStrategy.OnPush, imports: [NgTemplateOutlet, TuiFade, TuiLink, TuiScrollbar], template: "<div class=\"flex flex-col gap-2\">\n @if (isCollapsible()) {\n @if (isExpanded()) {\n <tui-scrollbar [style.max-block-size]=\"'11rem'\">\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n </tui-scrollbar>\n } @else {\n <div\n class=\"filter-group-fade\"\n tuiFade=\"vertical\"\n tuiFadeHeight=\"0.25rem\"\n tuiFadeOffset=\"0.25rem\"\n >\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n </div>\n }\n\n <div class=\"flex items-center justify-between\">\n <button\n tuiLink\n type=\"button\"\n class=\"text-start !text-body-s\"\n [style.text-decoration-line]=\"'underline'\"\n (click)=\"toggle()\"\n >\n @if (isExpanded()) {\n \u0421\u0432\u0435\u0440\u043D\u0443\u0442\u044C\n } @else {\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0435\u0449\u0451\n }\n </button>\n @if (showReset()) {\n <button\n tuiLink\n appearance=\"\"\n [style.color]=\"'var(--tui-status-negative)'\"\n [style.text-decoration-line]=\"'underline'\"\n type=\"button\"\n class=\"!text-body-s\"\n (click)=\"resetGroup.emit()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\n </button>\n }\n </div>\n } @else {\n <ng-container *ngTemplateOutlet=\"contentTpl()\" />\n @if (showReset()) {\n <button\n tuiLink\n type=\"button\"\n class=\"text-start !text-body-s\"\n (click)=\"resetGroup.emit()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C\n </button>\n }\n }\n</div>\n", styles: [".filter-group-fade{box-sizing:border-box;max-block-size:9rem;overflow:hidden!important;transition:none!important}\n"] }]
|
|
5682
|
+
}] });
|
|
5683
|
+
|
|
5630
5684
|
/* eslint-disable class-methods-use-this */
|
|
5631
5685
|
/**
|
|
5632
5686
|
* Компонент вывода фильтров каталога.
|
|
@@ -5637,9 +5691,9 @@ class ScCatalogFiltersComponent {
|
|
|
5637
5691
|
*/
|
|
5638
5692
|
constructor() {
|
|
5639
5693
|
/**
|
|
5640
|
-
*
|
|
5694
|
+
* Подписки синхронизации контролов формы (range slider, single-select checkbox).
|
|
5641
5695
|
*/
|
|
5642
|
-
this.
|
|
5696
|
+
this.formSyncs = new Subscription();
|
|
5643
5697
|
/**
|
|
5644
5698
|
* Сервис для работы с фильтрами каталога.
|
|
5645
5699
|
*/
|
|
@@ -5657,16 +5711,31 @@ class ScCatalogFiltersComponent {
|
|
|
5657
5711
|
*/
|
|
5658
5712
|
this.isRecursively = inject(SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY);
|
|
5659
5713
|
/**
|
|
5660
|
-
*
|
|
5714
|
+
* Показывать ли кнопку «Показать результаты».
|
|
5661
5715
|
*/
|
|
5662
|
-
this.
|
|
5663
|
-
|
|
5664
|
-
|
|
5716
|
+
this.showResultsButton = input(false);
|
|
5717
|
+
/**
|
|
5718
|
+
* Событие нажатия на кнопку сброса всех фильтров.
|
|
5719
|
+
*/
|
|
5720
|
+
this.resetFilters = output();
|
|
5721
|
+
/**
|
|
5722
|
+
* Событие нажатия на кнопку показа результатов.
|
|
5723
|
+
*/
|
|
5724
|
+
this.showResults = output();
|
|
5665
5725
|
/**
|
|
5666
5726
|
* FormGroup для фильтров.
|
|
5667
5727
|
*/
|
|
5668
5728
|
this.form = new FormGroup({});
|
|
5669
|
-
|
|
5729
|
+
/**
|
|
5730
|
+
* {@link Observable} фильтров категории.
|
|
5731
|
+
*/
|
|
5732
|
+
this.filters = toSignal(inject(SC_CATEGORY_INFO).pipe(catchError(() => EMPTY), filter(tuiIsPresent), switchMap((category) => this.catalogFilterService.getFilters$(this.idOrSlugPipe.transform(category), this.isRecursively)), filter(tuiIsPresent), map((filters) => filters.filter((item) => item.type !== 'range' || item.min !== item.max)), tap((filters) => {
|
|
5733
|
+
this.updateFormControls(filters);
|
|
5734
|
+
}), share()));
|
|
5735
|
+
inject(DestroyRef).onDestroy(() => {
|
|
5736
|
+
this.formSyncs.unsubscribe();
|
|
5737
|
+
});
|
|
5738
|
+
this.form.valueChanges.pipe(debounceTime(0), takeUntilDestroyed()).subscribe((filters) => {
|
|
5670
5739
|
this.catalogProductsFilters$.next(this.buildPropertyFilters(filters));
|
|
5671
5740
|
});
|
|
5672
5741
|
}
|
|
@@ -5676,17 +5745,28 @@ class ScCatalogFiltersComponent {
|
|
|
5676
5745
|
* @param filters Массив фильтров для создания контролов.
|
|
5677
5746
|
*/
|
|
5678
5747
|
updateFormControls(filters) {
|
|
5748
|
+
this.formSyncs.unsubscribe();
|
|
5749
|
+
this.formSyncs = new Subscription();
|
|
5679
5750
|
Object.keys(this.form.controls).forEach((key) => {
|
|
5680
5751
|
this.form.removeControl(key, { emitEvent: false });
|
|
5681
5752
|
});
|
|
5682
5753
|
filters.forEach((item) => {
|
|
5683
5754
|
switch (item.type) {
|
|
5684
|
-
case 'checkbox':
|
|
5685
|
-
|
|
5755
|
+
case 'checkbox': {
|
|
5756
|
+
const checkboxControl = this.createCheckboxFormControl(item);
|
|
5757
|
+
this.form.addControl(item.id, checkboxControl, { emitEvent: false });
|
|
5758
|
+
// Single-select для !isMultiple: при выборе одного остальные снимаются.
|
|
5759
|
+
if (!item.isMultiple && item.values.length > 1) {
|
|
5760
|
+
this.formSyncs.add(this.syncSingleSelectCheckbox(checkboxControl));
|
|
5761
|
+
}
|
|
5686
5762
|
break;
|
|
5687
|
-
|
|
5688
|
-
|
|
5763
|
+
}
|
|
5764
|
+
case 'range': {
|
|
5765
|
+
const rangeControl = this.createRangeFormControl(item);
|
|
5766
|
+
this.form.addControl(item.id, rangeControl, { emitEvent: false });
|
|
5767
|
+
this.formSyncs.add(this.syncRangeFromToAndSlider(rangeControl));
|
|
5689
5768
|
break;
|
|
5769
|
+
}
|
|
5690
5770
|
case 'toggle':
|
|
5691
5771
|
this.form.addControl(item.id, this.createToggleFormControl(item), { emitEvent: false });
|
|
5692
5772
|
break;
|
|
@@ -5710,7 +5790,7 @@ class ScCatalogFiltersComponent {
|
|
|
5710
5790
|
}
|
|
5711
5791
|
switch (filterItem.type) {
|
|
5712
5792
|
case 'checkbox':
|
|
5713
|
-
this.processCheckboxFilter(result, filterItem
|
|
5793
|
+
this.processCheckboxFilter(result, filterItem, controlValue);
|
|
5714
5794
|
break;
|
|
5715
5795
|
case 'range':
|
|
5716
5796
|
this.processRangeFilter(result, filterItem.id, controlValue);
|
|
@@ -5722,34 +5802,111 @@ class ScCatalogFiltersComponent {
|
|
|
5722
5802
|
break;
|
|
5723
5803
|
}
|
|
5724
5804
|
});
|
|
5805
|
+
console.log(result);
|
|
5725
5806
|
return result;
|
|
5726
5807
|
}
|
|
5727
5808
|
/**
|
|
5728
|
-
*
|
|
5809
|
+
* Создаёт FormGroup для checkbox: на каждый {@code value.id} — булевый контрол.
|
|
5729
5810
|
*
|
|
5730
|
-
*
|
|
5731
|
-
*
|
|
5811
|
+
* Единый формат и для одного, и для множества значений: шаблон рендерит их одинаково.
|
|
5812
|
+
* Различие в API-выводе для одиночного значения (boolean вместо массива) обрабатывается в {@link processCheckboxFilter}.
|
|
5732
5813
|
*
|
|
5733
5814
|
* @param checkboxFilter Фильтр типа checkbox.
|
|
5734
5815
|
*/
|
|
5735
5816
|
createCheckboxFormControl(checkboxFilter) {
|
|
5736
|
-
|
|
5737
|
-
return new FormControl(null);
|
|
5738
|
-
}
|
|
5817
|
+
const isSelected = (id) => checkboxFilter.selectedValues?.includes(id) ?? false;
|
|
5739
5818
|
const controls = {};
|
|
5740
5819
|
checkboxFilter.values.forEach((value) => {
|
|
5741
|
-
controls[value.id] = new FormControl(
|
|
5820
|
+
controls[value.id] = new FormControl(isSelected(value.id), { nonNullable: true });
|
|
5742
5821
|
});
|
|
5743
5822
|
return new FormGroup(controls);
|
|
5744
5823
|
}
|
|
5745
5824
|
/**
|
|
5746
|
-
*
|
|
5825
|
+
* Создаёт {@link FormGroup} для range: {@code from}, {@code to}, {@code slider} (кортеж для {@link TuiRange}).
|
|
5747
5826
|
*
|
|
5748
5827
|
* @param rangeFilter Фильтр типа range.
|
|
5749
5828
|
*/
|
|
5750
5829
|
createRangeFormControl(rangeFilter) {
|
|
5751
|
-
|
|
5752
|
-
|
|
5830
|
+
const fromValue = Number(rangeFilter.selectedMin ?? rangeFilter.min);
|
|
5831
|
+
const toValue = Number(rangeFilter.selectedMax ?? rangeFilter.max);
|
|
5832
|
+
return new FormGroup({
|
|
5833
|
+
from: new FormControl(fromValue, { nonNullable: true }),
|
|
5834
|
+
to: new FormControl(toValue, { nonNullable: true }),
|
|
5835
|
+
slider: new FormControl([fromValue, toValue], { nonNullable: true }),
|
|
5836
|
+
});
|
|
5837
|
+
}
|
|
5838
|
+
/**
|
|
5839
|
+
* Реализует single-select поведение для FormGroup с булевыми контролами:
|
|
5840
|
+
* при появлении нового true остальные контролы группы сбрасываются в false.
|
|
5841
|
+
*
|
|
5842
|
+
* Сохраняет последнее «стабильное» состояние и сравнивает следующее значение с ним —
|
|
5843
|
+
* новый true (отсутствовал в prev) считается выбранным, остальные сбрасываются через setValue.
|
|
5844
|
+
*
|
|
5845
|
+
* @param group FormGroup checkbox-фильтра (id → boolean).
|
|
5846
|
+
*/
|
|
5847
|
+
syncSingleSelectCheckbox(group) {
|
|
5848
|
+
let previousState = group.getRawValue();
|
|
5849
|
+
return group.valueChanges.subscribe((value) => {
|
|
5850
|
+
const current = value;
|
|
5851
|
+
const newlyChecked = Object.entries(current).find(([id, isChecked]) => {
|
|
5852
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
5853
|
+
return isChecked && !previousState[id];
|
|
5854
|
+
})?.[0];
|
|
5855
|
+
if (!newlyChecked) {
|
|
5856
|
+
previousState = { ...current };
|
|
5857
|
+
return;
|
|
5858
|
+
}
|
|
5859
|
+
const next = {};
|
|
5860
|
+
Object.keys(group.controls).forEach((id) => {
|
|
5861
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
5862
|
+
next[id] = id === newlyChecked;
|
|
5863
|
+
});
|
|
5864
|
+
previousState = next;
|
|
5865
|
+
group.setValue(next);
|
|
5866
|
+
});
|
|
5867
|
+
}
|
|
5868
|
+
/**
|
|
5869
|
+
* Связывает поля «от»/«до» с контролом слайдера.
|
|
5870
|
+
*
|
|
5871
|
+
* @param group FormGroup range-фильтра.
|
|
5872
|
+
*/
|
|
5873
|
+
syncRangeFromToAndSlider(group) {
|
|
5874
|
+
const from = group.get('from');
|
|
5875
|
+
const to = group.get('to');
|
|
5876
|
+
const slider = group.get('slider');
|
|
5877
|
+
if (!from || !to || !slider) {
|
|
5878
|
+
return new Subscription();
|
|
5879
|
+
}
|
|
5880
|
+
const sub = new Subscription();
|
|
5881
|
+
// Инпуты → слайдер; если «от» > «до», поднимаем «до» до «от».
|
|
5882
|
+
const applySliderFromInputs = () => {
|
|
5883
|
+
const low = Number(from.value);
|
|
5884
|
+
let high = Number(to.value);
|
|
5885
|
+
if (low > high) {
|
|
5886
|
+
high = low;
|
|
5887
|
+
to.setValue(high, { emitEvent: false });
|
|
5888
|
+
}
|
|
5889
|
+
const currentPair = slider.value;
|
|
5890
|
+
if (currentPair[0] !== low || currentPair[1] !== high) {
|
|
5891
|
+
slider.setValue([low, high], { emitEvent: false });
|
|
5892
|
+
slider.markAsDirty();
|
|
5893
|
+
}
|
|
5894
|
+
};
|
|
5895
|
+
sub.add(merge(from.valueChanges, to.valueChanges).subscribe(applySliderFromInputs));
|
|
5896
|
+
sub.add(slider.valueChanges.subscribe((value) => {
|
|
5897
|
+
const [low, high] = value;
|
|
5898
|
+
if (from.value !== low) {
|
|
5899
|
+
from.setValue(low, { emitEvent: false });
|
|
5900
|
+
from.markAsDirty();
|
|
5901
|
+
}
|
|
5902
|
+
if (to.value !== high) {
|
|
5903
|
+
to.setValue(high, { emitEvent: false });
|
|
5904
|
+
to.markAsDirty();
|
|
5905
|
+
}
|
|
5906
|
+
}));
|
|
5907
|
+
// Совпасть с полями при первом показе (уже совпадает при создании, но на всякий случай).
|
|
5908
|
+
applySliderFromInputs();
|
|
5909
|
+
return sub;
|
|
5753
5910
|
}
|
|
5754
5911
|
/**
|
|
5755
5912
|
* Создает FormControl для toggle.
|
|
@@ -5760,45 +5917,36 @@ class ScCatalogFiltersComponent {
|
|
|
5760
5917
|
return new FormControl(toggleFilter.selectedValue ?? false, { nonNullable: true });
|
|
5761
5918
|
}
|
|
5762
5919
|
/**
|
|
5763
|
-
* Обрабатывает checkbox
|
|
5920
|
+
* Обрабатывает checkbox: FormGroup → string[] выбранных id; для единственного значения — boolean (как toggle).
|
|
5764
5921
|
*
|
|
5765
5922
|
* @param result Объект результата для заполнения.
|
|
5766
|
-
* @param
|
|
5767
|
-
* @param controlValue Значение контрола
|
|
5923
|
+
* @param checkboxFilter Метафильтр checkbox.
|
|
5924
|
+
* @param controlValue Значение контрола формы (запись id → boolean).
|
|
5768
5925
|
*/
|
|
5769
|
-
processCheckboxFilter(result,
|
|
5770
|
-
// Для isMultiple === false: FormControl<string | null> -> string[] из одного выбранного ID.
|
|
5771
|
-
if (typeof controlValue === 'string') {
|
|
5772
|
-
if (controlValue) {
|
|
5773
|
-
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
5774
|
-
result[filterId] = [controlValue];
|
|
5775
|
-
}
|
|
5776
|
-
return;
|
|
5777
|
-
}
|
|
5778
|
-
// Для checkbox: FormGroup с FormControl<boolean> -> string[] (массив ID выбранных значений).
|
|
5926
|
+
processCheckboxFilter(result, checkboxFilter, controlValue) {
|
|
5779
5927
|
const selectedIds = Object.entries(controlValue)
|
|
5780
5928
|
.filter(([, isSelected]) => isSelected)
|
|
5781
5929
|
.map(([id]) => id);
|
|
5782
|
-
if (selectedIds.length
|
|
5783
|
-
|
|
5784
|
-
result[filterId] = selectedIds;
|
|
5930
|
+
if (selectedIds.length === 0) {
|
|
5931
|
+
return;
|
|
5785
5932
|
}
|
|
5933
|
+
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
5934
|
+
result[checkboxFilter.id] = selectedIds;
|
|
5786
5935
|
}
|
|
5787
5936
|
/**
|
|
5788
5937
|
* Обрабатывает range фильтр.
|
|
5789
5938
|
*
|
|
5790
5939
|
* @param result Объект результата для заполнения.
|
|
5791
5940
|
* @param filterId Идентификатор фильтра.
|
|
5792
|
-
* @param
|
|
5793
|
-
* @param
|
|
5794
|
-
* @param
|
|
5941
|
+
* @param range Значение контрола формы (объект с границами).
|
|
5942
|
+
* @param range.from Начальное значение диапазона.
|
|
5943
|
+
* @param range.to Конечное значение диапазона.
|
|
5795
5944
|
*/
|
|
5796
|
-
processRangeFilter(result, filterId,
|
|
5797
|
-
// Для range: FormControl<[number, number]> -> { from?: string; to?: string; }
|
|
5945
|
+
processRangeFilter(result, filterId, range) {
|
|
5798
5946
|
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
5799
5947
|
result[filterId] = {
|
|
5800
|
-
from: String(from),
|
|
5801
|
-
to: String(to),
|
|
5948
|
+
from: String(range.from),
|
|
5949
|
+
to: String(range.to),
|
|
5802
5950
|
};
|
|
5803
5951
|
}
|
|
5804
5952
|
/**
|
|
@@ -5809,18 +5957,111 @@ class ScCatalogFiltersComponent {
|
|
|
5809
5957
|
* @param controlValue Значение контрола формы.
|
|
5810
5958
|
*/
|
|
5811
5959
|
processToggleFilter(result, filterId, controlValue) {
|
|
5812
|
-
// Для toggle: FormControl<boolean> -> boolean
|
|
5813
5960
|
if (controlValue) {
|
|
5814
5961
|
// eslint-disable-next-line security/detect-object-injection, no-param-reassign
|
|
5815
5962
|
result[filterId] = controlValue;
|
|
5816
5963
|
}
|
|
5817
5964
|
}
|
|
5965
|
+
/**
|
|
5966
|
+
* Сбрасывает поле «от» диапазона к минимальному значению фильтра.
|
|
5967
|
+
*
|
|
5968
|
+
* @param filterId Идентификатор фильтра.
|
|
5969
|
+
* @param min Минимальное значение диапазона.
|
|
5970
|
+
*/
|
|
5971
|
+
resetRangeFrom(filterId, min) {
|
|
5972
|
+
this.form.get(filterId)?.get('from')?.reset(+min);
|
|
5973
|
+
}
|
|
5974
|
+
/**
|
|
5975
|
+
* Сбрасывает поле «до» диапазона к максимальному значению фильтра.
|
|
5976
|
+
*
|
|
5977
|
+
* @param filterId Идентификатор фильтра.
|
|
5978
|
+
* @param max Максимальное значение диапазона.
|
|
5979
|
+
*/
|
|
5980
|
+
resetRangeTo(filterId, max) {
|
|
5981
|
+
this.form.get(filterId)?.get('to')?.reset(+max);
|
|
5982
|
+
}
|
|
5983
|
+
/**
|
|
5984
|
+
* Сбрасывает все чекбоксы группы в `false`.
|
|
5985
|
+
*
|
|
5986
|
+
* @param filterId Идентификатор фильтра (ключ FormGroup в форме).
|
|
5987
|
+
*/
|
|
5988
|
+
resetCheckboxGroup(filterId) {
|
|
5989
|
+
const group = this.form.get(filterId);
|
|
5990
|
+
if (!group) {
|
|
5991
|
+
return;
|
|
5992
|
+
}
|
|
5993
|
+
const resetValue = {};
|
|
5994
|
+
Object.keys(group.controls).forEach((id) => {
|
|
5995
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
5996
|
+
resetValue[id] = false;
|
|
5997
|
+
});
|
|
5998
|
+
group.reset(resetValue);
|
|
5999
|
+
}
|
|
6000
|
+
/**
|
|
6001
|
+
* Сбрасывает все фильтры и оповещает родителя о нажатии кнопки сброса.
|
|
6002
|
+
*/
|
|
6003
|
+
onResetFiltersClick() {
|
|
6004
|
+
this.resetAllFilters();
|
|
6005
|
+
this.resetFilters.emit();
|
|
6006
|
+
}
|
|
6007
|
+
/**
|
|
6008
|
+
* Оповещает родителя о нажатии кнопки показа результатов.
|
|
6009
|
+
*/
|
|
6010
|
+
onShowResultsClick() {
|
|
6011
|
+
this.showResults.emit();
|
|
6012
|
+
}
|
|
6013
|
+
/**
|
|
6014
|
+
* Сбрасывает все фильтры к исходным значениям.
|
|
6015
|
+
*/
|
|
6016
|
+
resetAllFilters() {
|
|
6017
|
+
this.filters()?.forEach((filterItem) => {
|
|
6018
|
+
const control = this.form.get(filterItem.id);
|
|
6019
|
+
if (!control) {
|
|
6020
|
+
return;
|
|
6021
|
+
}
|
|
6022
|
+
switch (filterItem.type) {
|
|
6023
|
+
case 'checkbox': {
|
|
6024
|
+
const group = control;
|
|
6025
|
+
const resetValue = {};
|
|
6026
|
+
Object.keys(group.controls).forEach((id) => {
|
|
6027
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
6028
|
+
resetValue[id] = false;
|
|
6029
|
+
});
|
|
6030
|
+
group.reset(resetValue);
|
|
6031
|
+
break;
|
|
6032
|
+
}
|
|
6033
|
+
case 'toggle':
|
|
6034
|
+
control.reset(false);
|
|
6035
|
+
break;
|
|
6036
|
+
case 'range': {
|
|
6037
|
+
const group = control;
|
|
6038
|
+
const min = +filterItem.min;
|
|
6039
|
+
const max = +filterItem.max;
|
|
6040
|
+
group.reset({ from: min, to: max, slider: [min, max] });
|
|
6041
|
+
break;
|
|
6042
|
+
}
|
|
6043
|
+
default:
|
|
6044
|
+
break;
|
|
6045
|
+
}
|
|
6046
|
+
});
|
|
6047
|
+
}
|
|
5818
6048
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5819
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { isOpenAccordion: { classPropertyName: "isOpenAccordion", publicName: "isOpenAccordion", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@if (filters()?.length) {\n <div class=\"bg-tui-base-01 shadow-sc flex flex-col items-center gap-3 rounded-xl\">\n <tui-accordion class=\"accordion\">\n <button\n [tuiAccordion]=\"isOpenAccordion()\"\n appearance=\"primary\"\n >\n \u0424\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n <tui-expand>\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col gap-4 pb-1\"\n >\n @for (filter of filters(); track filter.id) {\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-body-s font-medium\">{{ filter.label }}</label>\n\n @if (filter.type === 'checkbox') {\n @if (filter.isMultiple === false) {\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n @let formControl = form.get(filter.id);\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n [value]=\"value.id\"\n tuiRadio\n (click)=\"formControl?.setValue(formControl?.value === value.id ? null : value.id)\"\n type=\"radio\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n } @else {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-2\"\n >\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n }\n }\n\n @if (filter.type === 'range') {\n <tui-input-range\n [formControlName]=\"filter.id\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n />\n }\n\n @if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">\u0414\u0430</span>\n </label>\n }\n </div>\n }\n </form>\n </tui-expand>\n </tui-accordion>\n </div>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.RadioControlValueAccessor, selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]", inputs: ["name", "formControlName", "value"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "component", type: i2$1.TuiRadioComponent, selector: "input[type=\"radio\"][tuiRadio]", inputs: ["size"] }, { kind: "component", type: i2$1.TuiInputRangeComponent, selector: "tui-input-range", inputs: ["min", "max", "step", "segments", "keySteps", "prefix", "postfix", "quantum", "content"] }, { kind: "component", type: i1$3.TuiAccordionComponent, selector: "tui-accordion", inputs: ["closeOthers", "size"] }, { kind: "directive", type: i1$3.TuiAccordionDirective, selector: "button[tuiAccordion]", inputs: ["tuiAccordion"], outputs: ["tuiAccordionChange"] }, { kind: "component", type: i2$5.TuiExpand, selector: "tui-expand", inputs: ["expanded"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
6049
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.14", type: ScCatalogFiltersComponent, isStandalone: true, selector: "sc-catalog-filters", inputs: { showResultsButton: { classPropertyName: "showResultsButton", publicName: "showResultsButton", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { resetFilters: "resetFilters", showResults: "showResults" }, ngImport: i0, template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"], dependencies: [{ kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1$1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1$1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1$1.FormGroupName, selector: "[formGroupName]", inputs: ["formGroupName"] }, { kind: "directive", type: i5.TuiLabel, selector: "label[tuiLabel]" }, { kind: "component", type: i1$2.TuiTextfieldComponent, selector: "tui-textfield:not([multi])" }, { kind: "directive", type: i1$2.TuiTextfieldOptionsDirective, selector: "[tuiTextfieldAppearance],[tuiTextfieldSize],[tuiTextfieldCleaner]", inputs: ["tuiTextfieldAppearance", "tuiTextfieldSize", "tuiTextfieldCleaner"] }, { kind: "directive", type: ScSelectOnFocusinDirective, selector: "tui-input-number, tui-input, tui-input-phone, tui-input-date, tui-input-password, input[tuiInputNumber], input[tuiTextfield], input[tuiInputSlider]" }, { kind: "component", type: ScCatalogFilterCollapsibleComponent, selector: "sc-catalog-filter-collapsible", inputs: ["itemsCount", "showReset"], outputs: ["resetGroup"] }, { kind: "directive", type: TuiNumberFormat, selector: "[tuiNumberFormat]", inputs: ["tuiNumberFormat"] }, { kind: "component", type: TuiCheckbox, selector: "input[type=\"checkbox\"][tuiCheckbox]", inputs: ["size"] }, { kind: "directive", type: i2$1.TuiInputNumberDirective, selector: "input[tuiInputNumber]", inputs: ["min", "max", "prefix", "postfix"] }, { kind: "component", type: TuiRange, selector: "tui-range", inputs: ["min", "max", "step", "size", "segments", "keySteps", "focusable", "margin", "limit"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
5820
6050
|
}
|
|
5821
6051
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScCatalogFiltersComponent, decorators: [{
|
|
5822
6052
|
type: Component,
|
|
5823
|
-
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
6053
|
+
args: [{ standalone: true, selector: 'sc-catalog-filters', changeDetection: ChangeDetectionStrategy.OnPush, imports: [
|
|
6054
|
+
ReactiveFormsModule,
|
|
6055
|
+
TuiTextfield,
|
|
6056
|
+
ScSelectOnFocusinDirective,
|
|
6057
|
+
ScCatalogFilterCollapsibleComponent,
|
|
6058
|
+
TuiLabel,
|
|
6059
|
+
TuiNumberFormat,
|
|
6060
|
+
TuiCheckbox,
|
|
6061
|
+
TuiInputNumber,
|
|
6062
|
+
TuiRange,
|
|
6063
|
+
TuiButton,
|
|
6064
|
+
], template: "@if (filters()?.length) {\n <form\n [formGroup]=\"form\"\n class=\"flex flex-col pb-1\"\n >\n @for (filter of filters(); track filter.id; let isFirst = $first) {\n @if (!isFirst) {\n <hr class=\"my-3 w-full h-px\" />\n }\n\n <div class=\"flex flex-col gap-2\">\n <!-- \u0417\u0430\u0433\u043E\u043B\u043E\u0432\u043E\u043A \u0433\u0440\u0443\u043F\u043F\u044B. \u0414\u043B\u044F toggle \u043F\u043E\u0434\u043F\u0438\u0441\u0438 \u043D\u0435\u0442: \u043C\u0435\u0442\u043A\u0430 \u0438\u0434\u0451\u0442 \u043F\u0440\u044F\u043C\u043E \u0440\u044F\u0434\u043E\u043C \u0441 \u0441\u0430\u043C\u0438\u043C checkbox. -->\n @if (filter.type !== 'toggle') {\n <label class=\"text-body-s-bold\">{{ filter.label }}</label>\n }\n\n <!-- Checkbox: FormGroup(value.id \u2192 boolean) \u0434\u043B\u044F \u043B\u044E\u0431\u043E\u0433\u043E \u0447\u0438\u0441\u043B\u0430 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439.\n \u0420\u0430\u0437\u0432\u0438\u043B\u043A\u0430 \u043E\u0434\u043D\u043E/\u043C\u043D\u043E\u0433\u043E \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0439 \u0432\u044B\u043D\u0435\u0441\u0435\u043D\u0430 \u0432 TS (\u0441\u043C. processCheckboxFilter).\n ng-template \u0432\u043D\u0443\u0442\u0440\u0438 formGroupName: \u0438\u043D\u0430\u0447\u0435 reactive forms \u043D\u0435 \u043D\u0430\u0439\u0434\u0451\u0442 ControlContainer \u043F\u0440\u0438 \u043F\u0440\u043E\u0435\u043A\u0446\u0438\u0438 \u0432 \u0434\u043E\u0447\u0435\u0440\u043D\u0438\u0439 \u043A\u043E\u043C\u043F\u043E\u043D\u0435\u043D\u0442. -->\n @if (filter.type === 'checkbox') {\n <div\n class=\"flex flex-col gap-2\"\n [formGroupName]=\"filter.id\"\n >\n <sc-catalog-filter-collapsible\n [itemsCount]=\"filter.values.length\"\n [showReset]=\"form.get(filter.id)?.dirty ?? false\"\n (resetGroup)=\"resetCheckboxGroup(filter.id)\"\n >\n <ng-template>\n <div class=\"flex flex-col gap-2\">\n @for (value of filter.values; track value.id) {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"value.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s\">{{ value.label }}</span>\n </label>\n }\n </div>\n </ng-template>\n </sc-catalog-filter-collapsible>\n </div>\n\n <!-- Toggle: \u043E\u0434\u0438\u043D boolean \u043D\u0430 \u043A\u043E\u0440\u043D\u0435 \u0444\u043E\u0440\u043C\u044B, \u043F\u043E\u0434\u043F\u0438\u0441\u044C = filter.label -->\n } @else if (filter.type === 'toggle') {\n <label class=\"flex items-center gap-2\">\n <input\n [formControlName]=\"filter.id\"\n tuiCheckbox\n type=\"checkbox\"\n />\n <span class=\"text-body-s-bold\">{{ filter.label }}</span>\n </label>\n\n <!-- Range: FormGroup(from, to, slider) \u0441 \u0434\u0432\u0443\u0441\u0442\u043E\u0440\u043E\u043D\u043D\u0435\u0439 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u0438\u0437\u0430\u0446\u0438\u0435\u0439 -->\n } @else if (filter.type === 'range') {\n <div\n [formGroupName]=\"filter.id\"\n class=\"flex flex-col gap-3\"\n >\n <div class=\"flex gap-3 px-1\">\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u041E\u0442\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"from\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('from')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeFrom(filter.id, filter.min)\"\n ></button>\n }\n </tui-textfield>\n </label>\n <label\n tuiLabel\n class=\"min-w-0 flex-1\"\n >\n \u0414\u043E\n <tui-textfield [tuiTextfieldCleaner]=\"false\">\n <input\n scSelectOnFocusin\n tuiInputNumber\n formControlName=\"to\"\n [tuiNumberFormat]=\"{ precision: 0 }\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n autocomplete=\"off\"\n />\n @if (form.get(filter.id)?.get('to')?.dirty) {\n <button\n tuiIconButton\n type=\"button\"\n size=\"xs\"\n appearance=\"icon\"\n iconStart=\"@tui.x\"\n (click)=\"resetRangeTo(filter.id, filter.max)\"\n ></button>\n }\n </tui-textfield>\n </label>\n </div>\n\n <tui-range\n size=\"m\"\n formControlName=\"slider\"\n [min]=\"+filter.min\"\n [max]=\"+filter.max\"\n [style.--tui-thickness.rem]=\"0.25\"\n />\n </div>\n }\n </div>\n }\n <button\n tuiButton\n appearance=\"secondary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onResetFiltersClick()\"\n >\n \u0421\u0431\u0440\u043E\u0441\u0438\u0442\u044C \u0444\u0438\u043B\u044C\u0442\u0440\u044B\n </button>\n @if (showResultsButton()) {\n <button\n tuiButton\n appearance=\"primary\"\n type=\"button\"\n class=\"mt-2\"\n (click)=\"onShowResultsClick()\"\n >\n \u041F\u043E\u043A\u0430\u0437\u0430\u0442\u044C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u044B\n </button>\n }\n </form>\n}\n", styles: [".accordion [tuiAccordion]{border:none;mask:none}.accordion tui-expand{box-shadow:none}\n"] }]
|
|
5824
6065
|
}], ctorParameters: () => [] });
|
|
5825
6066
|
|
|
5826
6067
|
/* eslint-disable @typescript-eslint/unbound-method */
|
|
@@ -9929,5 +10170,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
|
|
|
9929
10170
|
* Generated bundle index. Do not edit.
|
|
9930
10171
|
*/
|
|
9931
10172
|
|
|
9932
|
-
export { AbstractScPriceCard, AuthMethod, CURRENT_COUNTRY_ID, CostWithDiscountComponent, FilesAndDocumentsComponent, FilesAndDocumentsModule, FinishDateTimeTransformerDirective, IDLE_ITEM_STATE, IS_DEFAULT_COUNTRY, MAX_FILES_IN_FORM_INPUT, SC_ALLOW_SELECT_TERMINATED, SC_BANNER_DURATION, SC_CATALOG_PRODUCTS_FILTERS, SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY, SC_DATE_FORMATTER, SC_DEBOUNCE_TIME_DEFAULT, SC_DIALOG_SERVICE_TOKEN, SC_ERROR_CHANGE_HANDLER, SC_HELP_NOTIFICATION_CLOSE, SC_HELP_NOTIFICATION_LIMIT, SC_HIDDEN_PRINT_ELEMENTS, SC_MANAGER_QR_HANDLER, SC_NOTIFY_WHEN_IN_STOCK_REQUIRED_FIELDS, SC_ORDER_OPTIONS, SC_PAGE_SIZE_OPTIONS$1 as SC_PAGE_SIZE_OPTIONS, SC_SHOW_HELP_NOTIFICATION_IN_PHONE_INPUT, SC_USER_CITY_INFO, SC_USER_INFO, SC_USER_PROVIDERS, SC_VERIFICATION_CODE_TIMEOUT, ScAccordionComponent, ScAccordionContentDirective, ScAccordionModule, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddOrEditingCartItemDialogComponent, ScAddOrEditingCartItemFormComponent, ScAddressesSelectionFieldComponent, ScAuthModule, ScBannerComponent, ScBannerModule, ScBrandsListComponent, ScBrandsListModule, ScCartAddProductsFromCsvDialogComponent, ScCatalogFiltersComponent, ScCatalogModule, ScCategoryCardComponent, ScContactsAccordionComponent, ScContactsModule, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScContragentsModule, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDeliveryAddressModule, ScDownloadPriceListComponent, ScDraftComponent, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFeedbackFormComponent, ScFocusFirstInvalidFieldDirective, ScFormFieldsModule, ScFormatDatePipe, ScFrequentlyAskedQuestionsComponent, ScFrequentlyAskedQuestionsGroupSelectorComponent, ScFrequentlyAskedQuestionsWithGroupsComponent, ScGratitudeComponent, ScHelpNotificationService, ScHoverImageCarouselComponent, ScInputQuantityComponent, ScLinks, ScManagerCardComponent, ScManagerCardPushComponent, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNewsModule, ScNextInputFocusDirective, ScNextInputFocusModule, ScNoindexDirective, ScNoindexWrapperComponent, ScNotifyWhenInStockDialogComponent, ScOrderAccessorDirective, ScOrderItemComponent, ScOrderItemsByDirection, ScOrderItemsListByDirectionsComponent, ScOrderItemsListByStockComponent, ScOrderItemsListComponent, ScOrderModule, ScPaymentStatusComponent, ScPersonalDataProcessingPolicyComponent, ScPhoneFormatPipe, ScPreviewSampleComponent, ScPreviewSampleModule, ScPreviewSamplesMosquitoComponent, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScPrintDirective, ScPrintService, ScPrivacyPolicyComponent, ScProductInAllWarehousesPipe, ScProfileAccordionsContentComponent, ScProfileModule, ScPublicOfferComponent, ScQRCodeDialogComponent, ScQRCodeModule, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScSandwichComponent, ScSandwichM2Component, ScSandwichM2SkeletonComponent, ScSandwichSkeletonComponent, ScSelectOnFocusinDirective, ScSeoTagsComponent, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSimpleSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserModule, ScUserPhoneApproveDialogComponent, ScVerificationModule, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, phoneValidator, scAtLeastOneRequiredValidator, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scGetCurrentRoute, scPasswordConfirmMatchingValidator, stepValidator, tuiDateValueTransformerDefaultProvider };
|
|
10173
|
+
export { AbstractScPriceCard, AuthMethod, CURRENT_COUNTRY_ID, CostWithDiscountComponent, FilesAndDocumentsComponent, FilesAndDocumentsModule, FinishDateTimeTransformerDirective, IDLE_ITEM_STATE, IS_DEFAULT_COUNTRY, MAX_FILES_IN_FORM_INPUT, SC_ALLOW_SELECT_TERMINATED, SC_BANNER_DURATION, SC_CATALOG_PRODUCTS_FILTERS, SC_CATALOG_SHOW_PRODUCTS_RECURSIVELY, SC_DATE_FORMATTER, SC_DEBOUNCE_TIME_DEFAULT, SC_DIALOG_SERVICE_TOKEN, SC_ERROR_CHANGE_HANDLER, SC_HELP_NOTIFICATION_CLOSE, SC_HELP_NOTIFICATION_LIMIT, SC_HIDDEN_PRINT_ELEMENTS, SC_MANAGER_QR_HANDLER, SC_NOTIFY_WHEN_IN_STOCK_REQUIRED_FIELDS, SC_ORDER_OPTIONS, SC_PAGE_SIZE_OPTIONS$1 as SC_PAGE_SIZE_OPTIONS, SC_SHOW_HELP_NOTIFICATION_IN_PHONE_INPUT, SC_USER_CITY_INFO, SC_USER_INFO, SC_USER_PROVIDERS, SC_VERIFICATION_CODE_TIMEOUT, ScAccordionComponent, ScAccordionContentDirective, ScAccordionModule, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddOrEditingCartItemDialogComponent, ScAddOrEditingCartItemFormComponent, ScAddressesSelectionFieldComponent, ScAuthModule, ScBannerComponent, ScBannerModule, ScBrandsListComponent, ScBrandsListModule, ScCartAddProductsFromCsvDialogComponent, ScCatalogFilterCollapsibleComponent, ScCatalogFiltersComponent, ScCatalogModule, ScCategoryCardComponent, ScContactsAccordionComponent, ScContactsModule, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScContragentsModule, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDeliveryAddressModule, ScDownloadPriceListComponent, ScDraftComponent, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFeedbackFormComponent, ScFocusFirstInvalidFieldDirective, ScFormFieldsModule, ScFormatDatePipe, ScFrequentlyAskedQuestionsComponent, ScFrequentlyAskedQuestionsGroupSelectorComponent, ScFrequentlyAskedQuestionsWithGroupsComponent, ScGratitudeComponent, ScHelpNotificationService, ScHoverImageCarouselComponent, ScInputQuantityComponent, ScLinks, ScManagerCardComponent, ScManagerCardPushComponent, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNewsModule, ScNextInputFocusDirective, ScNextInputFocusModule, ScNoindexDirective, ScNoindexWrapperComponent, ScNotifyWhenInStockDialogComponent, ScOrderAccessorDirective, ScOrderItemComponent, ScOrderItemsByDirection, ScOrderItemsListByDirectionsComponent, ScOrderItemsListByStockComponent, ScOrderItemsListComponent, ScOrderModule, ScPaymentStatusComponent, ScPersonalDataProcessingPolicyComponent, ScPhoneFormatPipe, ScPreviewSampleComponent, ScPreviewSampleModule, ScPreviewSamplesMosquitoComponent, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScPrintDirective, ScPrintService, ScPrivacyPolicyComponent, ScProductInAllWarehousesPipe, ScProfileAccordionsContentComponent, ScProfileModule, ScPublicOfferComponent, ScQRCodeDialogComponent, ScQRCodeModule, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScSandwichComponent, ScSandwichM2Component, ScSandwichM2SkeletonComponent, ScSandwichSkeletonComponent, ScSelectOnFocusinDirective, ScSeoTagsComponent, ScShareButtonComponent, ScShareButtonModule, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSimpleSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserModule, ScUserPhoneApproveDialogComponent, ScVerificationModule, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, phoneValidator, scAtLeastOneRequiredValidator, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scGetCurrentRoute, scPasswordConfirmMatchingValidator, stepValidator, tuiDateValueTransformerDefaultProvider };
|
|
9933
10174
|
//# sourceMappingURL=snabcentr-client-ui.mjs.map
|