@snabcentr/client-ui 5.6.2 → 5.7.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.
|
@@ -4,14 +4,14 @@ import { ScContactsService, ScUserService, ScLocationsService, ScSuggestionServi
|
|
|
4
4
|
import { EMPTY, BehaviorSubject, switchMap, of, shareReplay, filter, map, debounceTime, startWith, catchError, throwError, share, Subject, tap, finalize, timer, scan, takeWhile, endWith, distinctUntilChanged, combineLatest, Observable, pairwise, Subscription, merge, skip, from, concatMap, noop as noop$1, first, retry } from 'rxjs';
|
|
5
5
|
import { WA_WINDOW, WA_NAVIGATOR } from '@ng-web-apis/common';
|
|
6
6
|
import { takeUntilDestroyed, toSignal, outputFromObservable, toObservable } from '@angular/core/rxjs-interop';
|
|
7
|
-
import { tuiIsPresent, TuiDay, TuiTime, TuiValueTransformer, tuiControlValue, tuiMarkControlAsTouchedAndValidate, TuiAutoFocus, TuiHovered, TuiDayRange, TuiMonth, tuiProvide, TuiValidationError, TUI_WINDOW_SIZE, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
7
|
+
import { tuiIsPresent, TuiDay, TuiTime, TuiValueTransformer, tuiControlValue, tuiMarkControlAsTouchedAndValidate, TuiAutoFocus, TuiHovered, TuiDayRange, TuiMonth, tuiProvide, TuiValidationError, tuiClamp, TUI_WINDOW_SIZE, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
8
8
|
import * as i1$1 from '@taiga-ui/kit';
|
|
9
|
-
import { tuiInputDateOptionsProvider, TuiAvatar, TuiInitialsPipe, TuiButtonLoading, TuiSortCountriesPipe, TuiPush, TuiInputPhoneInternational, TuiSelect, TuiDataListWrapperComponent, TuiStringifyContentPipe, TuiComboBox, TuiStepper, TuiAccordionDirective, TuiAccordion, TuiFiles, TuiChip, TuiInputNumber, TuiLineClamp, TuiBadge, TuiInputNumberDirective, TuiTooltip, TuiHighlight, TuiFade, TuiRange, TuiChevron, tuiInputNumberOptionsProvider, TuiInputSlider, TuiPushComponent, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TuiTreeComponent, TuiTreeChildren, TuiTreeControllerDirective, TUI_TREE_LOADER, TuiPreviewDialogService, TuiPreview, tuiFilesAccepted, TuiInputDate, TuiTextarea, TUI_CONFIRM, TuiDataListWrapper,
|
|
9
|
+
import { tuiInputDateOptionsProvider, TuiAvatar, TuiInitialsPipe, TuiButtonLoading, TuiSortCountriesPipe, TuiPush, TuiInputPhoneInternational, TuiSelect, TuiDataListWrapperComponent, TuiStringifyContentPipe, TuiComboBox, TuiStepper, TuiAccordionDirective, TuiAccordion, TuiFiles, TuiChip, TuiInputNumber, TuiLineClamp, TuiBadge, TuiInputNumberDirective, TuiTooltip, TuiHighlight, TuiFade, TuiRange, TuiChevron, tuiInputNumberOptionsProvider, TuiInputSlider, TuiPushComponent, TuiTreeService, TuiTreeItemContent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TuiTreeComponent, TuiTreeChildren, TuiTreeControllerDirective, TUI_TREE_LOADER, TuiPreviewDialogService, TuiPreview, tuiFilesAccepted, TuiInputDate, TuiTextarea, TUI_CONFIRM, TuiDataListWrapper, TUI_PAGINATION_TEXTS, TuiInputPhone, TuiPassword } from '@taiga-ui/kit';
|
|
10
10
|
import { HttpErrorResponse, HttpClient } from '@angular/common/http';
|
|
11
11
|
import * as i1 from '@angular/forms';
|
|
12
12
|
import { NgControl, FormControl, FormGroupDirective, ReactiveFormsModule, FormGroup, Validators, FormsModule, FormArray, NG_VALUE_ACCESSOR } from '@angular/forms';
|
|
13
13
|
import * as i2 from '@taiga-ui/core';
|
|
14
|
-
import { TUI_DATA_LIST_HOST, TuiLoader, TuiDataList, TuiDialogService, TuiLink, TuiButton, TuiIcon, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TuiLabel, TuiTextfield, TuiInput, TuiError, TuiCheckbox, tuiDropdownOptionsProvider, TuiOption, TuiFilterByInputPipe, TuiCarouselComponent, TuiCarousel, TuiNumberFormat, TuiHint, TuiHintDirective, TuiHintDriver, TuiHintHover, TuiHintPosition, TUI_MONTHS, TuiScrollbar, tuiNumberFormatProvider, tuiItemsHandlersProvider, TuiNotification, TuiFormatNumberPipe, tuiTextfieldOptionsProvider, tuiHintOptionsProvider, TUI_BUTTON_DEFAULT_OPTIONS, TUI_BUTTON_OPTIONS, TuiTitle } from '@taiga-ui/core';
|
|
14
|
+
import { TUI_DATA_LIST_HOST, TuiLoader, TuiDataList, TuiDialogService, TuiLink, TuiButton, TuiIcon, TuiAppearance, TuiWithAppearance, TuiIcons, TuiWithIcons, TuiLabel, TuiTextfield, TuiInput, TuiError, TuiCheckbox, tuiDropdownOptionsProvider, TuiOption, TuiFilterByInputPipe, TuiCarouselComponent, TuiCarousel, TuiNumberFormat, TuiHint, TuiHintDirective, TuiHintDriver, TuiHintHover, TuiHintPosition, TUI_MONTHS, TuiScrollbar, tuiNumberFormatProvider, tuiItemsHandlersProvider, TuiNotification, TuiFormatNumberPipe, tuiTextfieldOptionsProvider, tuiHintOptionsProvider, TUI_BUTTON_DEFAULT_OPTIONS, TUI_BUTTON_OPTIONS, TUI_COMMON_ICONS, TuiTitle } from '@taiga-ui/core';
|
|
15
15
|
import * as i1$2 from '@angular/common';
|
|
16
16
|
import { AsyncPipe, DOCUMENT, NgTemplateOutlet, NgClass, CommonModule, DecimalPipe } from '@angular/common';
|
|
17
17
|
import { isValidPhoneNumber } from 'libphonenumber-js/max';
|
|
@@ -7635,11 +7635,11 @@ class ScBrandsListComponent {
|
|
|
7635
7635
|
return Array.from({ length: Math.max(0, count) });
|
|
7636
7636
|
}
|
|
7637
7637
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScBrandsListComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
7638
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScBrandsListComponent, isStandalone: true, selector: "sc-brands-list", inputs: { items: "items" }, ngImport: i0, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\">\n @for (_ of getRange(items.length - (items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index + (items.length - (items.length % 2)) / 2];\n <img\n
|
|
7638
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScBrandsListComponent, isStandalone: true, selector: "sc-brands-list", inputs: { items: "items" }, ngImport: i0, template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\">\n @for (_ of getRange(items.length - (items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index + (items.length - (items.length % 2)) / 2];\n <picture>\n @if (brandItem.webp) {\n <source\n type=\"image/webp\"\n [srcset]=\"brandItem.webp\"\n />\n }\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </picture>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow flex shrink-0 items-center gap-16\">\n @for (_ of getRange((items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index];\n <picture>\n @if (brandItem.webp) {\n <source\n type=\"image/webp\"\n [srcset]=\"brandItem.webp\"\n />\n }\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </picture>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n</div>\n", styles: [".scroll-slow-revert{animation-direction:reverse!important;animation-delay:-15s!important}@keyframes scroll-slow{0%{transform:translate(0)}to{transform:translate(calc(-100% - 3rem))}}.animate-scroll-slow{animation:scroll-slow 30s linear infinite}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
7639
7639
|
}
|
|
7640
7640
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScBrandsListComponent, decorators: [{
|
|
7641
7641
|
type: Component,
|
|
7642
|
-
args: [{ selector: 'sc-brands-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [], template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\">\n @for (_ of getRange(items.length - (items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index + (items.length - (items.length % 2)) / 2];\n <img\n
|
|
7642
|
+
args: [{ selector: 'sc-brands-list', changeDetection: ChangeDetectionStrategy.OnPush, imports: [], template: "<!-- TODO: TASK:[#9893] \u0414\u043E\u0431\u0430\u0432\u0438\u0442\u044C \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435 \u043D\u0430 \u043D\u0435\u0441\u043A\u043E\u043B\u044C\u043A\u043E \u0441\u0442\u0440\u043E\u043A \u0438\u0437\u043E\u0431\u0440\u0430\u0436\u0435\u043D\u0438\u0439, \u043F\u0440\u0438 \u0443\u0432\u0435\u043B\u0438\u0447\u0435\u043D\u0438\u0438 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0431\u0440\u0435\u043D\u0434\u043E\u0432. -->\n<div class=\"flex flex-col gap-4\">\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow scroll-slow-revert flex shrink-0 items-center gap-16\">\n @for (_ of getRange(items.length - (items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index + (items.length - (items.length % 2)) / 2];\n <picture>\n @if (brandItem.webp) {\n <source\n type=\"image/webp\"\n [srcset]=\"brandItem.webp\"\n />\n }\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </picture>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n <div class=\"relative\">\n <div class=\"absolute -left-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-tui-base-01 to-transparent\"></div>\n <div class=\"flex select-none items-center justify-center gap-12 overflow-hidden contrast-150 saturate-0\">\n @for (_ of [].constructor(3); track _) {\n <div class=\"animate-scroll-slow flex shrink-0 items-center gap-16\">\n @for (_ of getRange((items.length - (items.length % 2)) / 2); track $index) {\n <div class=\"flex items-center justify-center\">\n @let brandItem = items[$index];\n <picture>\n @if (brandItem.webp) {\n <source\n type=\"image/webp\"\n [srcset]=\"brandItem.webp\"\n />\n }\n <img\n [src]=\"brandItem.src\"\n [alt]=\"brandItem.alt\"\n [attr.width]=\"brandItem.width\"\n [attr.height]=\"brandItem.height\"\n />\n </picture>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"absolute -right-1 top-0 z-10 block h-full w-12 bg-gradient-to-r from-transparent to-tui-base-01\"></div>\n </div>\n</div>\n", styles: [".scroll-slow-revert{animation-direction:reverse!important;animation-delay:-15s!important}@keyframes scroll-slow{0%{transform:translate(0)}to{transform:translate(calc(-100% - 3rem))}}.animate-scroll-slow{animation:scroll-slow 30s linear infinite}\n"] }]
|
|
7643
7643
|
}], propDecorators: { items: [{
|
|
7644
7644
|
type: Input
|
|
7645
7645
|
}] } });
|
|
@@ -8880,6 +8880,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8880
8880
|
type: Output
|
|
8881
8881
|
}] } });
|
|
8882
8882
|
|
|
8883
|
+
/**
|
|
8884
|
+
* Наименование query-параметра идентификатора группы часто задаваемых вопросов.
|
|
8885
|
+
*/
|
|
8886
|
+
const SC_FAQ_GROUP_QUERY_PARAM = 'group';
|
|
8887
|
+
/**
|
|
8888
|
+
* Наименование query-параметра номера страницы пагинации часто задаваемых вопросов.
|
|
8889
|
+
*/
|
|
8890
|
+
const SC_FAQ_PAGE_QUERY_PARAM = 'page';
|
|
8891
|
+
|
|
8883
8892
|
/**
|
|
8884
8893
|
* Компонент часто задаваемых вопросов.
|
|
8885
8894
|
*/
|
|
@@ -8922,49 +8931,177 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
8922
8931
|
], host: { ngSkipHydration: 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "<tui-loader\n [loading]=\"showLoading()\"\n [overlay]=\"true\"\n>\n <tui-accordion\n class=\"accordion\"\n [closeOthers]=\"false\"\n >\n @for (item of items(); track item.id) {\n <button\n [tuiAccordion]=\"isServer\"\n class=\"!whitespace-normal !text-body-m-bold\"\n >\n {{ item.question }}\n </button>\n <tui-expand>\n <div [innerHTML]=\"item.answer\"></div>\n </tui-expand>\n }\n </tui-accordion>\n</tui-loader>\n", styles: [".accordion{border-radius:0}.accordion,.accordion[data-size=s],.accordion[data-size=m],.accordion[data-size=l],.accordion .tui-list{font:inherit}.accordion [tuiAccordion]{border-block:1px solid var(--tui-border-normal);border-block-end-color:#fff!important;font-weight:400;border-color:var(--tui-border-normal);-webkit-mask:none;mask:none;block-size:auto;padding-block:.5rem;min-block-size:var(--t-size)}.accordion [tuiAccordion]._open{border-block-end-color:var(--tui-border-normal)!important}.accordion tui-expand,.accordion [tuiAccordion]{box-shadow:none;white-space:normal}\n"] }]
|
|
8923
8932
|
}], propDecorators: { items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: true }] }], showLoading: [{ type: i0.Input, args: [{ isSignal: true, alias: "showLoading", required: false }] }] } });
|
|
8924
8933
|
|
|
8934
|
+
/**
|
|
8935
|
+
* Возвращает query-параметры ссылки на группу часто задаваемых вопросов.
|
|
8936
|
+
*
|
|
8937
|
+
* При смене группы пагинация сбрасывается на первую страницу.
|
|
8938
|
+
*
|
|
8939
|
+
* @param group Группа вопросов.
|
|
8940
|
+
*/
|
|
8941
|
+
const scGetFaqGroupQueryParams = (group) => ({
|
|
8942
|
+
[SC_FAQ_GROUP_QUERY_PARAM]: group.id ?? null,
|
|
8943
|
+
[SC_FAQ_PAGE_QUERY_PARAM]: null,
|
|
8944
|
+
});
|
|
8945
|
+
|
|
8925
8946
|
/**
|
|
8926
8947
|
* Компонент выбора группы часто задаваемых вопросов.
|
|
8927
8948
|
*/
|
|
8928
8949
|
class ScFrequentlyAskedQuestionsGroupSelectorComponent {
|
|
8950
|
+
/**
|
|
8951
|
+
* Инициализирует экземпляр класса {@link ScFrequentlyAskedQuestionsGroupSelectorComponent}.
|
|
8952
|
+
*/
|
|
8929
8953
|
constructor() {
|
|
8954
|
+
/**
|
|
8955
|
+
* Сервис маршрутизации.
|
|
8956
|
+
*/
|
|
8957
|
+
this.router = inject(Router);
|
|
8958
|
+
/**
|
|
8959
|
+
* Активный маршрут.
|
|
8960
|
+
*/
|
|
8961
|
+
this.route = inject(ActivatedRoute);
|
|
8930
8962
|
/**
|
|
8931
8963
|
* {@link Observable} списка группы часто задаваемых вопросов.
|
|
8932
8964
|
*/
|
|
8933
|
-
this.groups$ = inject(ScFrequentlyAskedQuestionsService).groups
|
|
8934
|
-
if (groups.length > 0) {
|
|
8935
|
-
this.groupControl.setValue(groups[0]);
|
|
8936
|
-
}
|
|
8937
|
-
}));
|
|
8965
|
+
this.groups$ = inject(ScFrequentlyAskedQuestionsService).groups$;
|
|
8938
8966
|
/**
|
|
8939
8967
|
* {@link FormControl} выбранной группы.
|
|
8940
8968
|
*/
|
|
8941
8969
|
this.groupControl = new FormControl(null);
|
|
8942
8970
|
/**
|
|
8943
|
-
* {@link
|
|
8971
|
+
* {@link InputSignal} идентификатора выбранной группы.
|
|
8944
8972
|
*/
|
|
8945
|
-
this.
|
|
8946
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
8947
|
-
map((group) => group.id)));
|
|
8973
|
+
this.selectedGroupId = input(null, ...(ngDevMode ? [{ debugName: "selectedGroupId" }] : /* istanbul ignore next */ []));
|
|
8948
8974
|
/**
|
|
8949
8975
|
* Формат отображения. 'list' - в виде списка, 'select' в виде выпадающего списка.
|
|
8950
8976
|
*/
|
|
8951
8977
|
this.viewMode = input('list', ...(ngDevMode ? [{ debugName: "viewMode" }] : /* istanbul ignore next */ []));
|
|
8978
|
+
/**
|
|
8979
|
+
* Возвращает query-параметры ссылки на группу вопросов.
|
|
8980
|
+
*/
|
|
8981
|
+
this.getGroupQueryParams = scGetFaqGroupQueryParams;
|
|
8982
|
+
// Синхронизирует значение выпадающего списка с выбранной группой.
|
|
8983
|
+
combineLatest([this.groups$, toObservable(this.selectedGroupId)])
|
|
8984
|
+
.pipe(takeUntilDestroyed())
|
|
8985
|
+
.subscribe(([groups, selectedGroupId]) => {
|
|
8986
|
+
this.groupControl.setValue(groups.find((group) => (group.id ?? null) === selectedGroupId) ?? null, { emitEvent: false });
|
|
8987
|
+
});
|
|
8988
|
+
// Выбор группы в выпадающем списке переводит на адрес этой группы.
|
|
8989
|
+
this.groupControl.valueChanges.pipe(filter(tuiIsPresent), takeUntilDestroyed()).subscribe((group) => {
|
|
8990
|
+
this.router
|
|
8991
|
+
.navigate([], {
|
|
8992
|
+
relativeTo: this.route,
|
|
8993
|
+
queryParams: this.getGroupQueryParams(group),
|
|
8994
|
+
queryParamsHandling: 'merge',
|
|
8995
|
+
})
|
|
8996
|
+
.catch(noop$1);
|
|
8997
|
+
});
|
|
8952
8998
|
}
|
|
8953
8999
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScFrequentlyAskedQuestionsGroupSelectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
8954
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScFrequentlyAskedQuestionsGroupSelectorComponent, isStandalone: true, selector: "sc-frequently-asked-questions-group-selector", inputs: {
|
|
9000
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScFrequentlyAskedQuestionsGroupSelectorComponent, isStandalone: true, selector: "sc-frequently-asked-questions-group-selector", inputs: { selectedGroupId: { classPropertyName: "selectedGroupId", publicName: "selectedGroupId", isSignal: true, isRequired: false, transformFunction: null }, viewMode: { classPropertyName: "viewMode", publicName: "viewMode", isSignal: true, isRequired: false, transformFunction: null } }, providers: [
|
|
8955
9001
|
tuiItemsHandlersProvider({
|
|
8956
9002
|
stringify: signal((item) => item.name),
|
|
8957
9003
|
}),
|
|
8958
|
-
], ngImport: i0, template: "@let groups = groups$ | async;\n\n@if (groups && groups.length) {\n @switch (viewMode()) {\n @case ('list') {\n <div class=\"flex flex-col items-center gap-3 rounded-xl p-4 shadow-sc\">\n <div class=\"flex w-full flex-col gap-2\">\n @for (item of groups; track $index) {\n <
|
|
9004
|
+
], ngImport: i0, template: "@let groups = groups$ | async;\n\n@if (groups && groups.length) {\n @switch (viewMode()) {\n @case ('list') {\n <div class=\"flex flex-col items-center gap-3 rounded-xl p-4 shadow-sc\">\n <div class=\"flex w-full flex-col gap-2\">\n @for (item of groups; track $index) {\n @let isSelected = item.id === selectedGroupId();\n\n <a\n tuiButton\n size=\"xs\"\n [tuiAppearanceState]=\"isSelected ? 'hover' : null\"\n [attr.aria-current]=\"isSelected ? 'page' : null\"\n [class.pointer-events-none]=\"isSelected\"\n [routerLink]=\"[]\"\n [queryParams]=\"getGroupQueryParams(item)\"\n queryParamsHandling=\"merge\"\n appearance=\"flat-grayscale\"\n class=\"!justify-start !text-body-s-bold\"\n >\n {{ item.name }}\n </a>\n }\n </div>\n </div>\n }\n\n @case ('select') {\n <form>\n <tui-textfield tuiChevron>\n <input\n tuiSelect\n [formControl]=\"groupControl\"\n placeholder=\"\u0413\u0440\u0443\u043F\u043F\u0430 \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432\"\n />\n <tui-data-list-wrapper\n *tuiDropdown\n [items]=\"groups\"\n />\n </tui-textfield>\n </form>\n }\n }\n}\n", dependencies: [{ kind: "directive", type: i1$1.TuiSelectDirective, selector: "input[tuiSelect]" }, { kind: "component", type: i3$1.TuiTextfieldComponent, selector: "tui-textfield:not([multi])", inputs: ["content", "filler"] }, { kind: "directive", type: i3.TuiDropdownContent, selector: "ng-template[tuiDropdown]" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.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.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],[formArray],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "component", type: i1$1.TuiDataListWrapperComponent, selector: "tui-data-list-wrapper:not([labels])", inputs: ["items", "emptyContent", "size", "itemContent"], outputs: ["itemClick"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgForm, selector: "form:not([ngNoForm]):not([formGroup]):not([formArray]),ng-form,[ngForm]", inputs: ["ngFormOptions"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
8959
9005
|
}
|
|
8960
9006
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScFrequentlyAskedQuestionsGroupSelectorComponent, decorators: [{
|
|
8961
9007
|
type: Component,
|
|
8962
|
-
args: [{ selector: 'sc-frequently-asked-questions-group-selector', imports: [AsyncPipe, TuiSelect, ReactiveFormsModule, TuiDataList, TuiDataListWrapper, TuiButton, FormsModule], providers: [
|
|
9008
|
+
args: [{ selector: 'sc-frequently-asked-questions-group-selector', imports: [AsyncPipe, TuiSelect, ReactiveFormsModule, TuiDataList, TuiDataListWrapper, TuiButton, FormsModule, RouterLink], providers: [
|
|
8963
9009
|
tuiItemsHandlersProvider({
|
|
8964
9010
|
stringify: signal((item) => item.name),
|
|
8965
9011
|
}),
|
|
8966
|
-
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let groups = groups$ | async;\n\n@if (groups && groups.length) {\n @switch (viewMode()) {\n @case ('list') {\n <div class=\"flex flex-col items-center gap-3 rounded-xl p-4 shadow-sc\">\n <div class=\"flex w-full flex-col gap-2\">\n @for (item of groups; track $index) {\n <
|
|
8967
|
-
}], propDecorators: {
|
|
9012
|
+
], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let groups = groups$ | async;\n\n@if (groups && groups.length) {\n @switch (viewMode()) {\n @case ('list') {\n <div class=\"flex flex-col items-center gap-3 rounded-xl p-4 shadow-sc\">\n <div class=\"flex w-full flex-col gap-2\">\n @for (item of groups; track $index) {\n @let isSelected = item.id === selectedGroupId();\n\n <a\n tuiButton\n size=\"xs\"\n [tuiAppearanceState]=\"isSelected ? 'hover' : null\"\n [attr.aria-current]=\"isSelected ? 'page' : null\"\n [class.pointer-events-none]=\"isSelected\"\n [routerLink]=\"[]\"\n [queryParams]=\"getGroupQueryParams(item)\"\n queryParamsHandling=\"merge\"\n appearance=\"flat-grayscale\"\n class=\"!justify-start !text-body-s-bold\"\n >\n {{ item.name }}\n </a>\n }\n </div>\n </div>\n }\n\n @case ('select') {\n <form>\n <tui-textfield tuiChevron>\n <input\n tuiSelect\n [formControl]=\"groupControl\"\n placeholder=\"\u0413\u0440\u0443\u043F\u043F\u0430 \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432\"\n />\n <tui-data-list-wrapper\n *tuiDropdown\n [items]=\"groups\"\n />\n </tui-textfield>\n </form>\n }\n }\n}\n" }]
|
|
9013
|
+
}], ctorParameters: () => [], propDecorators: { selectedGroupId: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectedGroupId", required: false }] }], viewMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "viewMode", required: false }] }] } });
|
|
9014
|
+
|
|
9015
|
+
/**
|
|
9016
|
+
* Компонент пагинации, в котором страницы являются ссылками с номером страницы в query-параметрах.
|
|
9017
|
+
*
|
|
9018
|
+
* Ссылки позволяют переходить между страницами при отключенном JavaScript и корректно работают при SSR.
|
|
9019
|
+
* Внешний вид повторяет tui-pagination из @taiga-ui/kit.
|
|
9020
|
+
*
|
|
9021
|
+
* TODO: [TAIGA:5]: Проверить, появилась ли в tui-pagination поддержка ссылок, и заменить компонент на неё.
|
|
9022
|
+
*/
|
|
9023
|
+
class ScPaginationLinksComponent {
|
|
9024
|
+
constructor() {
|
|
9025
|
+
/**
|
|
9026
|
+
* Иконки стрелок переключения страниц.
|
|
9027
|
+
*/
|
|
9028
|
+
this.icons = inject(TUI_COMMON_ICONS);
|
|
9029
|
+
/**
|
|
9030
|
+
* Подписи стрелок переключения страниц.
|
|
9031
|
+
*/
|
|
9032
|
+
this.texts = inject(TUI_PAGINATION_TEXTS);
|
|
9033
|
+
/**
|
|
9034
|
+
* {@link InputSignal} общего количества страниц.
|
|
9035
|
+
*/
|
|
9036
|
+
this.length = input.required(...(ngDevMode ? [{ debugName: "length" }] : /* istanbul ignore next */ []));
|
|
9037
|
+
/**
|
|
9038
|
+
* {@link InputSignal} номера текущей страницы, начиная с единицы.
|
|
9039
|
+
*/
|
|
9040
|
+
this.index = input.required(...(ngDevMode ? [{ debugName: "index" }] : /* istanbul ignore next */ []));
|
|
9041
|
+
/**
|
|
9042
|
+
* {@link InputSignal} наименования query-параметра, в котором хранится номер страницы.
|
|
9043
|
+
*/
|
|
9044
|
+
this.queryParam = input('page', ...(ngDevMode ? [{ debugName: "queryParam" }] : /* istanbul ignore next */ []));
|
|
9045
|
+
/**
|
|
9046
|
+
* {@link InputSignal} количества страниц, отображаемых по обе стороны от текущей.
|
|
9047
|
+
*/
|
|
9048
|
+
this.activePadding = input(1, ...(ngDevMode ? [{ debugName: "activePadding" }] : /* istanbul ignore next */ []));
|
|
9049
|
+
/**
|
|
9050
|
+
* {@link InputSignal} количества страниц, отображаемых по краям.
|
|
9051
|
+
*/
|
|
9052
|
+
this.sidePadding = input(1, ...(ngDevMode ? [{ debugName: "sidePadding" }] : /* istanbul ignore next */ []));
|
|
9053
|
+
/**
|
|
9054
|
+
* {@link Signal} номеров отображаемых страниц, где `null` - разделитель пропущенных страниц.
|
|
9055
|
+
*
|
|
9056
|
+
* Состав страниц рассчитывается так же, как в tui-pagination: количество отображаемых элементов постоянно,
|
|
9057
|
+
* а окно вокруг текущей страницы расширяется у краёв списка.
|
|
9058
|
+
*/
|
|
9059
|
+
this.pages = computed(() => {
|
|
9060
|
+
const length = this.length();
|
|
9061
|
+
const sidePadding = this.sidePadding();
|
|
9062
|
+
// Половина элементов: страницы у края, разделитель и страницы вокруг текущей.
|
|
9063
|
+
const maxHalfLength = sidePadding + 1 + this.activePadding();
|
|
9064
|
+
const maxElementsLength = maxHalfLength * 2 + 1;
|
|
9065
|
+
const elementsLength = Math.min(length, maxElementsLength);
|
|
9066
|
+
const lastIndex = length - 1;
|
|
9067
|
+
const index = this.index() - 1;
|
|
9068
|
+
const reverseIndex = lastIndex - index;
|
|
9069
|
+
const hasCollapsedItems = (value) => length > maxElementsLength && value > maxHalfLength;
|
|
9070
|
+
return Array.from({ length: elementsLength }, (_, elementIndex) => {
|
|
9071
|
+
const reverseElementIndex = elementsLength - 1 - elementIndex;
|
|
9072
|
+
if (elementIndex < sidePadding) {
|
|
9073
|
+
return elementIndex + 1;
|
|
9074
|
+
}
|
|
9075
|
+
if (elementIndex === sidePadding && hasCollapsedItems(index)) {
|
|
9076
|
+
return null;
|
|
9077
|
+
}
|
|
9078
|
+
if (reverseElementIndex < sidePadding) {
|
|
9079
|
+
return lastIndex - reverseElementIndex + 1;
|
|
9080
|
+
}
|
|
9081
|
+
if (reverseElementIndex === sidePadding && hasCollapsedItems(reverseIndex)) {
|
|
9082
|
+
return null;
|
|
9083
|
+
}
|
|
9084
|
+
return tuiClamp(index - maxHalfLength + elementIndex, elementIndex, lastIndex - reverseElementIndex) + 1;
|
|
9085
|
+
});
|
|
9086
|
+
}, ...(ngDevMode ? [{ debugName: "pages" }] : /* istanbul ignore next */ []));
|
|
9087
|
+
}
|
|
9088
|
+
/**
|
|
9089
|
+
* Возвращает query-параметры ссылки на страницу.
|
|
9090
|
+
*
|
|
9091
|
+
* Для первой страницы параметр удаляется, чтобы её адрес совпадал с адресом страницы без пагинации.
|
|
9092
|
+
*
|
|
9093
|
+
* @param page Номер страницы.
|
|
9094
|
+
*/
|
|
9095
|
+
getPageQueryParams(page) {
|
|
9096
|
+
return { [this.queryParam()]: page > 1 ? page : null };
|
|
9097
|
+
}
|
|
9098
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScPaginationLinksComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9099
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScPaginationLinksComponent, isStandalone: true, selector: "sc-pagination-links", inputs: { length: { classPropertyName: "length", publicName: "length", isSignal: true, isRequired: true, transformFunction: null }, index: { classPropertyName: "index", publicName: "index", isSignal: true, isRequired: true, transformFunction: null }, queryParam: { classPropertyName: "queryParam", publicName: "queryParam", isSignal: true, isRequired: false, transformFunction: null }, activePadding: { classPropertyName: "activePadding", publicName: "activePadding", isSignal: true, isRequired: false, transformFunction: null }, sidePadding: { classPropertyName: "sidePadding", publicName: "sidePadding", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "@let paginationTexts = texts();\n\n<div class=\"t-content\">\n @if (index() > 1) {\n <a\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.decrement\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(index() - 1)\"\n queryParamsHandling=\"merge\"\n >\n {{ paginationTexts[0] }}\n </a>\n } @else {\n <button\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n type=\"button\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.decrement\"\n [disabled]=\"true\"\n >\n {{ paginationTexts[0] }}\n </button>\n }\n\n @for (page of pages(); track $index) {\n @if (page) {\n <a\n automation-id=\"sc-pagination-links__element\"\n tuiButton\n size=\"s\"\n class=\"t-button\"\n [appearance]=\"page === index() ? 'primary' : 'flat'\"\n [attr.aria-current]=\"page === index() ? 'page' : null\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(page)\"\n queryParamsHandling=\"merge\"\n >\n {{ page }}\n </a>\n } @else {\n <div class=\"t-dots\"></div>\n }\n }\n\n @if (index() < length()) {\n <a\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.increment\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(index() + 1)\"\n queryParamsHandling=\"merge\"\n >\n {{ paginationTexts[1] }}\n </a>\n } @else {\n <button\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n type=\"button\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.increment\"\n [disabled]=\"true\"\n >\n {{ paginationTexts[1] }}\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font:var(--tui-typography-body-s);color:var(--tui-text-primary);text-align:center}.t-content{display:flex;justify-content:center}.t-button{flex-shrink:0;margin:0 .125rem}.t-button[tuiButton]{min-inline-size:var(--tui-height-s);padding:0 .5rem}.t-button:first-child{margin-inline-start:0}.t-button:last-child{margin-inline-end:0}.t-dots{flex-shrink:0;inline-size:var(--tui-height-s);block-size:var(--tui-height-s);line-height:var(--tui-height-s);margin:0 .125rem;color:var(--tui-text-action);text-align:center;cursor:default}.t-dots:before{content:\"\\2026\"}\n"], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9100
|
+
}
|
|
9101
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScPaginationLinksComponent, decorators: [{
|
|
9102
|
+
type: Component,
|
|
9103
|
+
args: [{ selector: 'sc-pagination-links', imports: [RouterLink, TuiButton], changeDetection: ChangeDetectionStrategy.OnPush, template: "@let paginationTexts = texts();\n\n<div class=\"t-content\">\n @if (index() > 1) {\n <a\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.decrement\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(index() - 1)\"\n queryParamsHandling=\"merge\"\n >\n {{ paginationTexts[0] }}\n </a>\n } @else {\n <button\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n type=\"button\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.decrement\"\n [disabled]=\"true\"\n >\n {{ paginationTexts[0] }}\n </button>\n }\n\n @for (page of pages(); track $index) {\n @if (page) {\n <a\n automation-id=\"sc-pagination-links__element\"\n tuiButton\n size=\"s\"\n class=\"t-button\"\n [appearance]=\"page === index() ? 'primary' : 'flat'\"\n [attr.aria-current]=\"page === index() ? 'page' : null\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(page)\"\n queryParamsHandling=\"merge\"\n >\n {{ page }}\n </a>\n } @else {\n <div class=\"t-dots\"></div>\n }\n }\n\n @if (index() < length()) {\n <a\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.increment\"\n [routerLink]=\"[]\"\n [queryParams]=\"getPageQueryParams(index() + 1)\"\n queryParamsHandling=\"merge\"\n >\n {{ paginationTexts[1] }}\n </a>\n } @else {\n <button\n tuiIconButton\n size=\"s\"\n appearance=\"flat\"\n type=\"button\"\n tabIndex=\"-1\"\n class=\"t-button\"\n [iconStart]=\"icons.increment\"\n [disabled]=\"true\"\n >\n {{ paginationTexts[1] }}\n </button>\n }\n</div>\n", styles: ["@charset \"UTF-8\";:host{display:block;font:var(--tui-typography-body-s);color:var(--tui-text-primary);text-align:center}.t-content{display:flex;justify-content:center}.t-button{flex-shrink:0;margin:0 .125rem}.t-button[tuiButton]{min-inline-size:var(--tui-height-s);padding:0 .5rem}.t-button:first-child{margin-inline-start:0}.t-button:last-child{margin-inline-end:0}.t-dots{flex-shrink:0;inline-size:var(--tui-height-s);block-size:var(--tui-height-s);line-height:var(--tui-height-s);margin:0 .125rem;color:var(--tui-text-action);text-align:center;cursor:default}.t-dots:before{content:\"\\2026\"}\n"] }]
|
|
9104
|
+
}], propDecorators: { length: [{ type: i0.Input, args: [{ isSignal: true, alias: "length", required: true }] }], index: [{ type: i0.Input, args: [{ isSignal: true, alias: "index", required: true }] }], queryParam: [{ type: i0.Input, args: [{ isSignal: true, alias: "queryParam", required: false }] }], activePadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "activePadding", required: false }] }], sidePadding: [{ type: i0.Input, args: [{ isSignal: true, alias: "sidePadding", required: false }] }] } });
|
|
8968
9105
|
|
|
8969
9106
|
/**
|
|
8970
9107
|
* Токен перечисления размеров страниц пагинации.
|
|
@@ -8998,6 +9135,14 @@ class ScFrequentlyAskedQuestionsWithGroupsComponent {
|
|
|
8998
9135
|
* Сервис маршрутизации.
|
|
8999
9136
|
*/
|
|
9000
9137
|
this.router = inject(Router);
|
|
9138
|
+
/**
|
|
9139
|
+
* Активный маршрут.
|
|
9140
|
+
*/
|
|
9141
|
+
this.route = inject(ActivatedRoute);
|
|
9142
|
+
/**
|
|
9143
|
+
* Признак, что приложение запущено на сервере.
|
|
9144
|
+
*/
|
|
9145
|
+
this.isServer = inject(IS_SERVER);
|
|
9001
9146
|
/**
|
|
9002
9147
|
* Индекс первой страницы.
|
|
9003
9148
|
*/
|
|
@@ -9011,13 +9156,15 @@ class ScFrequentlyAskedQuestionsWithGroupsComponent {
|
|
|
9011
9156
|
*/
|
|
9012
9157
|
this.perPage$ = new BehaviorSubject(this.pageSizeOptions[0]);
|
|
9013
9158
|
/**
|
|
9014
|
-
* {@link
|
|
9159
|
+
* {@link Observable} изменения номера страницы пагинации из query-параметров.
|
|
9015
9160
|
*/
|
|
9016
|
-
this.page$ =
|
|
9161
|
+
this.page$ = this.route.queryParamMap.pipe(map((params) => Number(params.get(SC_FAQ_PAGE_QUERY_PARAM)) || this.firstPageIndex), distinctUntilChanged());
|
|
9017
9162
|
/**
|
|
9018
|
-
* {@link
|
|
9163
|
+
* {@link Observable} изменения идентификатора выбранной группы.
|
|
9164
|
+
*
|
|
9165
|
+
* Идентификатор берётся из query-параметров, а если параметр не задан - используется первая группа списка.
|
|
9019
9166
|
*/
|
|
9020
|
-
this.groupId$ =
|
|
9167
|
+
this.groupId$ = combineLatest([this.route.queryParamMap, this.frequentlyAskedQuestionsService.groups$]).pipe(map(([params, groups]) => Number(params.get(SC_FAQ_GROUP_QUERY_PARAM)) || (groups[0]?.id ?? null)), distinctUntilChanged(), shareReplay({ refCount: true, bufferSize: 1 }));
|
|
9021
9168
|
/**
|
|
9022
9169
|
* Сигнал нажатия на кнопку "Задать вопрос".
|
|
9023
9170
|
*/
|
|
@@ -9028,7 +9175,7 @@ class ScFrequentlyAskedQuestionsWithGroupsComponent {
|
|
|
9028
9175
|
this.request$ = combineLatest({
|
|
9029
9176
|
page: this.page$,
|
|
9030
9177
|
perPage: this.perPage$,
|
|
9031
|
-
group: this.groupId
|
|
9178
|
+
group: this.groupId$.pipe(filter(tuiIsPresent)),
|
|
9032
9179
|
paginate: of(true),
|
|
9033
9180
|
}).pipe(
|
|
9034
9181
|
// Нулевой debounceTime для случая, когда меняются направление и поле сортировки одновременно.
|
|
@@ -9047,7 +9194,7 @@ class ScFrequentlyAskedQuestionsWithGroupsComponent {
|
|
|
9047
9194
|
/**
|
|
9048
9195
|
* {@link Observable} изменения номера страницы пагинации из данных пагинации запроса.
|
|
9049
9196
|
*/
|
|
9050
|
-
this.currentPage$ = this.request$.pipe(filter(tuiIsPresent), map(({ meta }) => meta.currentPage
|
|
9197
|
+
this.currentPage$ = this.request$.pipe(filter(tuiIsPresent), map(({ meta }) => meta.currentPage));
|
|
9051
9198
|
/**
|
|
9052
9199
|
* {@link Observable} изменения состояния загрузки данных.
|
|
9053
9200
|
*/
|
|
@@ -9059,31 +9206,20 @@ class ScFrequentlyAskedQuestionsWithGroupsComponent {
|
|
|
9059
9206
|
/**
|
|
9060
9207
|
* {@link Observable} изменения формата отображения фильтра групп.
|
|
9061
9208
|
*/
|
|
9062
|
-
this.viewMode$ =
|
|
9063
|
-
|
|
9064
|
-
|
|
9065
|
-
|
|
9066
|
-
|
|
9067
|
-
|
|
9068
|
-
|
|
9069
|
-
paginationChange(pageIndex) {
|
|
9070
|
-
this.page$.next(pageIndex + 1);
|
|
9071
|
-
}
|
|
9072
|
-
/**
|
|
9073
|
-
* Устанавливает идентификатор группы.
|
|
9074
|
-
*
|
|
9075
|
-
* @param id Идентификатор группы.
|
|
9076
|
-
*/
|
|
9077
|
-
groupIdChange(id) {
|
|
9078
|
-
this.groupId$.next(id);
|
|
9079
|
-
this.paginationChange(0);
|
|
9209
|
+
this.viewMode$ = this.isServer
|
|
9210
|
+
? of('list')
|
|
9211
|
+
: inject(TUI_WINDOW_SIZE).pipe(map((rect) => (rect.width > 768 ? 'list' : 'select')));
|
|
9212
|
+
/**
|
|
9213
|
+
* Наименование query-параметра номера страницы пагинации.
|
|
9214
|
+
*/
|
|
9215
|
+
this.pageQueryParam = SC_FAQ_PAGE_QUERY_PARAM;
|
|
9080
9216
|
}
|
|
9081
9217
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScFrequentlyAskedQuestionsWithGroupsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
9082
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScFrequentlyAskedQuestionsWithGroupsComponent, isStandalone: true, selector: "sc-frequently-asked-questions-with-groups", outputs: { clickSendQuestion: "clickSendQuestion" }, ngImport: i0, template: "@let items = data$ | async;\n@let pageCount = pageCount$ | async;\n@let viewMode = viewMode$ | async;\n\n@if (viewMode) {\n <div\n class=\"flex gap-6\"\n [class.flex-col]=\"viewMode === 'select'\"\n >\n <div class=\"flex flex-col gap-7\">\n <sc-frequently-asked-questions-group-selector\n
|
|
9218
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.16", type: ScFrequentlyAskedQuestionsWithGroupsComponent, isStandalone: true, selector: "sc-frequently-asked-questions-with-groups", outputs: { clickSendQuestion: "clickSendQuestion" }, host: { attributes: { "ngSkipHydration": "true" } }, ngImport: i0, template: "@let items = data$ | async;\n@let pageCount = pageCount$ | async;\n@let viewMode = viewMode$ | async;\n\n@if (viewMode) {\n <div\n class=\"flex gap-6\"\n [class.flex-col]=\"viewMode === 'select'\"\n >\n <div class=\"flex flex-col gap-7\">\n <sc-frequently-asked-questions-group-selector\n [selectedGroupId]=\"groupId$ | async\"\n [viewMode]=\"viewMode\"\n class=\"shrink-0\"\n [class.w-64]=\"viewMode !== 'select'\"\n />\n @if (viewMode === 'list') {\n <button\n tuiButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.circle-help\"\n appearance=\"secondary\"\n (click)=\"clickSendQuestion.emit()\"\n class=\"self-center\"\n >\n \u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441\n </button>\n }\n </div>\n <div class=\"grow\">\n @if (items && items.length) {\n <sc-frequently-asked-questions\n [items]=\"items\"\n [showLoading]=\"isLoading()\"\n />\n @if (pageCount && pageCount > 1) {\n <sc-pagination-links\n [length]=\"pageCount\"\n [index]=\"(currentPage$ | async) ?? 1\"\n [queryParam]=\"pageQueryParam\"\n class=\"mt-4\"\n />\n }\n } @else {\n <p class=\"text-body-s-bold\">\u0421\u043F\u0438\u0441\u043E\u043A \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u043F\u0443\u0441\u0442</p>\n }\n </div>\n </div>\n}\n", dependencies: [{ kind: "component", type: ScFrequentlyAskedQuestionsGroupSelectorComponent, selector: "sc-frequently-asked-questions-group-selector", inputs: ["selectedGroupId", "viewMode"] }, { kind: "directive", type: TuiButton, selector: "a[tuiButton],button[tuiButton],a[tuiIconButton],button[tuiIconButton]", inputs: ["size"] }, { kind: "component", type: ScFrequentlyAskedQuestionsComponent, selector: "sc-frequently-asked-questions", inputs: ["items", "showLoading"] }, { kind: "component", type: ScPaginationLinksComponent, selector: "sc-pagination-links", inputs: ["length", "index", "queryParam", "activePadding", "sidePadding"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
9083
9219
|
}
|
|
9084
9220
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImport: i0, type: ScFrequentlyAskedQuestionsWithGroupsComponent, decorators: [{
|
|
9085
9221
|
type: Component,
|
|
9086
|
-
args: [{ selector: 'sc-frequently-asked-questions-with-groups', imports: [AsyncPipe, ScFrequentlyAskedQuestionsGroupSelectorComponent, TuiButton, ScFrequentlyAskedQuestionsComponent,
|
|
9222
|
+
args: [{ selector: 'sc-frequently-asked-questions-with-groups', imports: [AsyncPipe, ScFrequentlyAskedQuestionsGroupSelectorComponent, TuiButton, ScFrequentlyAskedQuestionsComponent, ScPaginationLinksComponent], host: { ngSkipHydration: 'true' }, changeDetection: ChangeDetectionStrategy.OnPush, template: "@let items = data$ | async;\n@let pageCount = pageCount$ | async;\n@let viewMode = viewMode$ | async;\n\n@if (viewMode) {\n <div\n class=\"flex gap-6\"\n [class.flex-col]=\"viewMode === 'select'\"\n >\n <div class=\"flex flex-col gap-7\">\n <sc-frequently-asked-questions-group-selector\n [selectedGroupId]=\"groupId$ | async\"\n [viewMode]=\"viewMode\"\n class=\"shrink-0\"\n [class.w-64]=\"viewMode !== 'select'\"\n />\n @if (viewMode === 'list') {\n <button\n tuiButton\n size=\"m\"\n type=\"button\"\n iconStart=\"@tui.circle-help\"\n appearance=\"secondary\"\n (click)=\"clickSendQuestion.emit()\"\n class=\"self-center\"\n >\n \u0417\u0430\u0434\u0430\u0442\u044C \u0432\u043E\u043F\u0440\u043E\u0441\n </button>\n }\n </div>\n <div class=\"grow\">\n @if (items && items.length) {\n <sc-frequently-asked-questions\n [items]=\"items\"\n [showLoading]=\"isLoading()\"\n />\n @if (pageCount && pageCount > 1) {\n <sc-pagination-links\n [length]=\"pageCount\"\n [index]=\"(currentPage$ | async) ?? 1\"\n [queryParam]=\"pageQueryParam\"\n class=\"mt-4\"\n />\n }\n } @else {\n <p class=\"text-body-s-bold\">\u0421\u043F\u0438\u0441\u043E\u043A \u0432\u043E\u043F\u0440\u043E\u0441\u043E\u0432 \u043F\u0443\u0441\u0442</p>\n }\n </div>\n </div>\n}\n" }]
|
|
9087
9223
|
}], propDecorators: { clickSendQuestion: [{ type: i0.Output, args: ["clickSendQuestion"] }] } });
|
|
9088
9224
|
|
|
9089
9225
|
/**
|
|
@@ -10120,5 +10256,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.16", ngImpo
|
|
|
10120
10256
|
* Generated bundle index. Do not edit.
|
|
10121
10257
|
*/
|
|
10122
10258
|
|
|
10123
|
-
export { AbstractScPriceCard, AuthMethod, CURRENT_COUNTRY_ID, CostWithDiscountComponent, FilesAndDocumentsComponent, 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_FORM_CONFIG, 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, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddOrEditingCartItemDialogComponent, ScAddOrEditingCartItemFormComponent, ScAddressesSelectionFieldComponent, ScBannerComponent, ScBrandsListComponent, ScCartAddProductsFromCsvDialogComponent, ScCatalogFilterCollapsibleComponent, ScCatalogFiltersComponent, ScCategoryCardComponent, ScContactsAccordionComponent, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDownloadPriceListComponent, ScDraftComponent, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFeedbackFormComponent, ScFocusFirstInvalidFieldDirective, ScFormatDatePipe, ScFrequentlyAskedQuestionsComponent, ScFrequentlyAskedQuestionsGroupSelectorComponent, ScFrequentlyAskedQuestionsWithGroupsComponent, ScGratitudeComponent, ScHelpNotificationService, ScHoverImageCarouselComponent, ScInputQuantityComponent, ScLinks, ScManagerCardComponent, ScManagerCardPushComponent, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNextInputFocusDirective, ScNoindexDirective, ScNoindexWrapperComponent, ScNotifyWhenInStockDialogComponent, ScOrderAccessorDirective, ScOrderDirectionItemsComponent, ScOrderFormComponent, ScOrderItemComponent, ScOrderItemsByDirection, ScOrderItemsListByDirectionsComponent, ScOrderItemsListByStockComponent, ScOrderItemsListComponent, ScPaymentStatusComponent, ScPersonalDataProcessingPolicyComponent, ScPhoneFormatPipe, ScPreviewSampleComponent, ScPreviewSamplesMosquitoComponent, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScPrintDirective, ScPrintService, ScPrivacyPolicyComponent, ScProductInAllWarehousesPipe, ScProfileAccordionsContentComponent, ScPublicOfferComponent, ScQRCodeDialogComponent, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScSandwichComponent, ScSandwichM2Component, ScSandwichM2SkeletonComponent, ScSandwichSkeletonComponent, ScSelectOnFocusinDirective, ScSeoTagsComponent, ScShareButtonComponent, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSimpleSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserPhoneApproveDialogComponent, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, cleanupRecaptchaArtifacts, phoneValidator, scAtLeastOneRequiredValidator, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scGetCurrentRoute, scPasswordConfirmMatchingValidator, stepValidator, tuiDateValueTransformerDefaultProvider };
|
|
10259
|
+
export { AbstractScPriceCard, AuthMethod, CURRENT_COUNTRY_ID, CostWithDiscountComponent, FilesAndDocumentsComponent, 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_FAQ_GROUP_QUERY_PARAM, SC_FAQ_PAGE_QUERY_PARAM, 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_FORM_CONFIG, 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, ScAddContactDialogComponent, ScAddContragentBankAccountsDialogComponent, ScAddContragentDialogComponent, ScAddDeliveryAddressDialogComponent, ScAddOrEditingCartItemDialogComponent, ScAddOrEditingCartItemFormComponent, ScAddressesSelectionFieldComponent, ScBannerComponent, ScBrandsListComponent, ScCartAddProductsFromCsvDialogComponent, ScCatalogFilterCollapsibleComponent, ScCatalogFiltersComponent, ScCategoryCardComponent, ScContactsAccordionComponent, ScContragentsAccordionComponent, ScContragentsAccordionItemComponent, ScDeliveryAddressAccordionComponent, ScDeliveryAddressAccordionItemComponent, ScDownloadPriceListComponent, ScDraftComponent, ScEmailLinkDirective, ScErrorBlockStatusComponent, ScErrorHandlerComponent, ScFavoriteButtonComponent, ScFeedbackFormComponent, ScFocusFirstInvalidFieldDirective, ScFormatDatePipe, ScFrequentlyAskedQuestionsComponent, ScFrequentlyAskedQuestionsGroupSelectorComponent, ScFrequentlyAskedQuestionsWithGroupsComponent, ScGratitudeComponent, ScHelpNotificationService, ScHoverImageCarouselComponent, ScInputQuantityComponent, ScLinks, ScManagerCardComponent, ScManagerCardPushComponent, ScNewContactFormComponent, ScNewContragentBankAccountsFormComponent, ScNewContragentFormComponent, ScNewsCardComponent, ScNewsCardSkeletonComponent, ScNextInputFocusDirective, ScNoindexDirective, ScNoindexWrapperComponent, ScNotifyWhenInStockDialogComponent, ScOrderAccessorDirective, ScOrderDirectionItemsComponent, ScOrderFormComponent, ScOrderItemComponent, ScOrderItemsByDirection, ScOrderItemsListByDirectionsComponent, ScOrderItemsListByStockComponent, ScOrderItemsListComponent, ScPaginationLinksComponent, ScPaymentStatusComponent, ScPersonalDataProcessingPolicyComponent, ScPhoneFormatPipe, ScPreviewSampleComponent, ScPreviewSamplesMosquitoComponent, ScPriceCardComponent, ScPriceCardInlineComponent, ScPriceHistoryComponent, ScPriceListPaginationComponent, ScPriceWarehouseStockComponent, ScPrintDirective, ScPrintService, ScPrivacyPolicyComponent, ScProductInAllWarehousesPipe, ScProfileAccordionsContentComponent, ScPublicOfferComponent, ScQRCodeDialogComponent, ScResetUserPasswordComponent, ScResourcePreviewComponent, ScSandwichComponent, ScSandwichM2Component, ScSandwichM2SkeletonComponent, ScSandwichSkeletonComponent, ScSelectOnFocusinDirective, ScSeoTagsComponent, ScShareButtonComponent, ScSignInFormByEmailComponent, ScSignInFormByPhoneComponent, ScSignInFormComponent, ScSignUpFormComponent, ScSimpleSignUpFormComponent, ScSuggestionFieldComponent, ScTelLinkDirective, ScTerminalLinkDirective, ScUpdateUserInfoDialogComponent, ScUserManagersComponent, ScUserPhoneApproveDialogComponent, ScVerificationPhoneCheckFormComponent, TreeDirective, TreeIconService, TreeLoaderService, TreeTopDirective, cleanupRecaptchaArtifacts, phoneValidator, scAtLeastOneRequiredValidator, scBicValidator, scClientUiIconsName, scCorrespondentAccountValidator, scGetCurrentRoute, scGetFaqGroupQueryParams, scPasswordConfirmMatchingValidator, stepValidator, tuiDateValueTransformerDefaultProvider };
|
|
10124
10260
|
//# sourceMappingURL=snabcentr-client-ui.mjs.map
|