@snabcentr/client-core 2.63.0 → 2.64.0
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/esm2022/catalog/tokens/sc-count-first-discounted-products.mjs +5 -3
- package/esm2022/guards/catalog-seo.guard.mjs +71 -0
- package/esm2022/guards/index.mjs +2 -1
- package/esm2022/guards/sc-id-or-slug.guard.mjs +3 -3
- package/esm2022/httpInterceptors/tokens/sc-guest-endpoints.mjs +5 -3
- package/esm2022/httpInterceptors/tokens/sc-guest-parameter-name.mjs +5 -3
- package/esm2022/pagination/services/sc-pagination.service.mjs +3 -3
- package/esm2022/pipes/sc-id-or-slug.pipe.mjs +2 -2
- package/esm2022/providers/index.mjs +2 -4
- package/esm2022/providers/sc-category.providers.mjs +40 -0
- package/esm2022/providers/ssr.providers.mjs +7 -4
- package/esm2022/services/sc-seo.service.mjs +28 -2
- package/esm2022/tokens/index.mjs +7 -3
- package/esm2022/tokens/notification-options.mjs +5 -3
- package/esm2022/tokens/sc-api-keys.mjs +1 -1
- package/esm2022/tokens/sc-cache-lifetime.mjs +1 -1
- package/esm2022/tokens/sc-company-info.mjs +6 -0
- package/esm2022/tokens/sc-configurator-components.mjs +1 -1
- package/esm2022/tokens/sc-configurator-settings.mjs +1 -1
- package/esm2022/tokens/sc-date-format.mjs +3 -3
- package/esm2022/tokens/sc-default-page-meta.mjs +7 -3
- package/esm2022/tokens/sc-error-handler.mjs +6 -0
- package/esm2022/tokens/sc-feedback-api.mjs +3 -3
- package/esm2022/tokens/sc-id-or-slug-in-route.mjs +8 -0
- package/esm2022/tokens/sc-linear-values-token.mjs +5 -3
- package/esm2022/tokens/sc-product-pagination-options.mjs +22 -0
- package/esm2022/tokens/sc-release.mjs +1 -1
- package/esm2022/tokens/sc-update-interval.mjs +1 -1
- package/esm2022/tokens/sc-urls.mjs +1 -1
- package/esm2022/user/tokens/sc-user-providers.mjs +7 -6
- package/esm2022/warehouse/services/sc-warehouse.service.mjs +2 -2
- package/fesm2022/snabcentr-client-core.mjs +543 -394
- package/fesm2022/snabcentr-client-core.mjs.map +1 -1
- package/guards/catalog-seo.guard.d.ts +14 -0
- package/guards/index.d.ts +1 -0
- package/httpInterceptors/tokens/sc-guest-endpoints.d.ts +2 -1
- package/httpInterceptors/tokens/sc-guest-parameter-name.d.ts +2 -1
- package/package.json +1 -1
- package/pagination/services/sc-pagination.service.d.ts +4 -2
- package/providers/index.d.ts +1 -3
- package/providers/sc-category.providers.d.ts +11 -0
- package/services/sc-seo.service.d.ts +14 -0
- package/tokens/index.d.ts +6 -2
- package/tokens/notification-options.d.ts +2 -1
- package/tokens/sc-api-keys.d.ts +1 -1
- package/tokens/sc-cache-lifetime.d.ts +1 -1
- package/tokens/sc-configurator-components.d.ts +2 -1
- package/tokens/sc-configurator-settings.d.ts +1 -1
- package/tokens/sc-default-page-meta.d.ts +7 -2
- package/tokens/sc-error-handler.d.ts +11 -0
- package/{providers → tokens}/sc-id-or-slug-in-route.d.ts +1 -1
- package/tokens/sc-linear-values-token.d.ts +2 -1
- package/tokens/sc-release.d.ts +1 -1
- package/tokens/sc-update-interval.d.ts +1 -1
- package/tokens/sc-urls.d.ts +1 -1
- package/esm2022/providers/sc-company-info.mjs +0 -6
- package/esm2022/providers/sc-id-or-slug-in-route.mjs +0 -6
- package/esm2022/providers/sc-product-pagination-options.mjs +0 -19
- /package/{providers → tokens}/sc-company-info.d.ts +0 -0
- /package/{providers → tokens}/sc-product-pagination-options.d.ts +0 -0
|
@@ -1,23 +1,24 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { InjectionToken, inject, PLATFORM_ID, Injectable, Inject, Optional, LOCALE_ID, Pipe,
|
|
2
|
+
import { InjectionToken, inject, PLATFORM_ID, Injectable, Inject, Optional, EventEmitter, LOCALE_ID, Pipe, RendererFactory2, Component, ChangeDetectionStrategy, HostBinding, Input, NgModule } from '@angular/core';
|
|
3
3
|
import { WA_LOCAL_STORAGE, WA_USER_AGENT, WA_WINDOW } from '@ng-web-apis/common';
|
|
4
4
|
import { filterByKey, toValue, WA_STORAGE_EVENT, StorageService } from '@ng-web-apis/storage';
|
|
5
5
|
import * as i1 from 'rxjs';
|
|
6
|
-
import { startWith, Subject, ReplaySubject, partition, combineLatest, map, debounceTime, switchMap, of, tap, filter, shareReplay, distinctUntilChanged, distinctUntilKeyChanged, skip, first, BehaviorSubject, materialize, dematerialize, expand, takeWhile, toArray, catchError, throwError, concatMap, finalize, takeUntil, interval, share, scan } from 'rxjs';
|
|
6
|
+
import { startWith, Subject, ReplaySubject, partition, combineLatest, map, debounceTime, switchMap, of, tap, filter, shareReplay, distinctUntilChanged, distinctUntilKeyChanged, skip, first, BehaviorSubject, materialize, dematerialize, expand, takeWhile, toArray, catchError, EMPTY, throwError, concatMap, finalize, takeUntil, interval, share, scan } from 'rxjs';
|
|
7
7
|
import { isPlatformBrowser, isPlatformServer, DOCUMENT, formatDate } from '@angular/common';
|
|
8
|
-
import { tuiCreateTokenFromFactory, tuiCreateToken, tuiIsPresent, TuiDay, tuiPure, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
9
8
|
import * as i1$1 from '@angular/common/http';
|
|
10
|
-
import { HttpContextToken, HttpContext, HttpHeaders, HttpClient, HttpParams,
|
|
9
|
+
import { HttpContextToken, HttpContext, HttpHeaders, HttpClient, HttpParams, HttpErrorResponse, HttpResponse } from '@angular/common/http';
|
|
11
10
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
11
|
+
import { tuiIsPresent, TuiDay, tuiPure, TUI_TRUE_HANDLER } from '@taiga-ui/cdk';
|
|
12
12
|
import { tuiCleanObject } from '@taiga-ui/addon-doc/utils';
|
|
13
13
|
import { __decorate } from 'tslib';
|
|
14
14
|
import * as i2 from '@angular/router';
|
|
15
15
|
import { ActivatedRoute, Router, NavigationEnd } from '@angular/router';
|
|
16
16
|
import { isString, isMatch, isArray } from 'lodash-es';
|
|
17
|
-
import {
|
|
18
|
-
import { parse, isValid, format } from 'date-fns';
|
|
17
|
+
import { filter as filter$1, tap as tap$1, map as map$1, catchError as catchError$1 } from 'rxjs/operators';
|
|
19
18
|
import * as i1$2 from '@angular/platform-browser';
|
|
20
19
|
import { Meta, Title } from '@angular/platform-browser';
|
|
20
|
+
import { objectToSnake, objectToCamel, toSnake } from 'ts-case-convert';
|
|
21
|
+
import { parse, isValid, format } from 'date-fns';
|
|
21
22
|
|
|
22
23
|
/**
|
|
23
24
|
* Базовый класс для изображений.
|
|
@@ -64,11 +65,15 @@ const SC_REFRESH_AUTH_TOKEN_STORAGE_KEY = new InjectionToken('refreshAuthTokenSt
|
|
|
64
65
|
/**
|
|
65
66
|
* Токен для получения признака, что скрипт выполняется в браузере.
|
|
66
67
|
*/
|
|
67
|
-
const IS_BROWSER =
|
|
68
|
+
const IS_BROWSER = new InjectionToken('IS_BROWSER', {
|
|
69
|
+
factory: () => isPlatformBrowser(inject(PLATFORM_ID)),
|
|
70
|
+
});
|
|
68
71
|
/**
|
|
69
72
|
* Токен для получения признака, что скрипт выполняется на сервере.
|
|
70
73
|
*/
|
|
71
|
-
const IS_SERVER =
|
|
74
|
+
const IS_SERVER = new InjectionToken('IS_SERVER', {
|
|
75
|
+
factory: () => isPlatformServer(inject(PLATFORM_ID)),
|
|
76
|
+
});
|
|
72
77
|
/**
|
|
73
78
|
* Токен для получения данных об ответе на запрос.
|
|
74
79
|
*/
|
|
@@ -251,13 +256,20 @@ const SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS = {
|
|
|
251
256
|
/**
|
|
252
257
|
* Параметры авторизации под клиентом.
|
|
253
258
|
*/
|
|
254
|
-
const SC_AUTH_AS_CLIENT_OPTIONS =
|
|
259
|
+
const SC_AUTH_AS_CLIENT_OPTIONS = new InjectionToken('SC_AUTH_AS_CLIENT_OPTIONS', {
|
|
260
|
+
factory: () => SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS,
|
|
261
|
+
});
|
|
255
262
|
|
|
256
263
|
/**
|
|
257
264
|
* Токен внедрения времени жизни данных.
|
|
258
265
|
*/
|
|
259
266
|
const SC_CACHE_LIFETIME = new InjectionToken('ICacheLifetime');
|
|
260
267
|
|
|
268
|
+
/**
|
|
269
|
+
* Токен для получения полной информации о компании.
|
|
270
|
+
*/
|
|
271
|
+
const SC_COMPANY_INFO = new InjectionToken('SC_COMPANY_INFO');
|
|
272
|
+
|
|
261
273
|
/**
|
|
262
274
|
* Токен внедрения названия компании.
|
|
263
275
|
*/
|
|
@@ -268,15 +280,36 @@ const SC_COMPANY_NAME = new InjectionToken('COMPANY_NAME');
|
|
|
268
280
|
*/
|
|
269
281
|
const SC_CONFIGURATOR_COMPONENTS = new InjectionToken('SC_CONFIGURATOR_COMPONENTS');
|
|
270
282
|
|
|
283
|
+
/**
|
|
284
|
+
* Токен внедрения формата дат.
|
|
285
|
+
*/
|
|
286
|
+
const SC_DATE_FORMAT = new InjectionToken('SC_DATE_FORMAT');
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Токен внедрения мета-данных страницы по умолчанию.
|
|
290
|
+
*/
|
|
291
|
+
const SC_DEFAULT_PAGE_META = new InjectionToken('SC_DEFAULT_PAGE_META');
|
|
292
|
+
/**
|
|
293
|
+
* Токен внедрения мета-данных страницы каталога.
|
|
294
|
+
*/
|
|
295
|
+
const SC_CATALOG_PAGE_META = new InjectionToken('SC_CATALOG_PAGE_META');
|
|
296
|
+
|
|
297
|
+
/**
|
|
298
|
+
* Токен внедрения обработчика ошибок.
|
|
299
|
+
*/
|
|
300
|
+
const ERROR_HANDLER = new InjectionToken('ERROR_HANDLER');
|
|
301
|
+
|
|
271
302
|
/**
|
|
272
303
|
* Токен внедрения моделей настроек конфигураторов по их названию.
|
|
273
304
|
*/
|
|
274
305
|
const SC_CONFIGURATOR_SETTINGS = new InjectionToken('SC_CONFIGURATOR_SETTINGS');
|
|
275
306
|
|
|
276
307
|
/**
|
|
277
|
-
* Токен
|
|
308
|
+
* Токен определяющий, идентификатор или символьное обозначение (slug) используется для роутинга и маршрутизации.
|
|
278
309
|
*/
|
|
279
|
-
const
|
|
310
|
+
const SC_ID_OR_SLUG_IN_ROUTE = new InjectionToken('SC_ID_OR_SLUG_IN_ROUTE', {
|
|
311
|
+
factory: () => 'id',
|
|
312
|
+
});
|
|
280
313
|
|
|
281
314
|
/**
|
|
282
315
|
* Токен контекста запроса, указывающий на необходимость скрыть уведомление об ошибке.
|
|
@@ -294,13 +327,36 @@ const SC_LINEAR_VALUES = ['пог.м.', 'м.', 'м2'];
|
|
|
294
327
|
/**
|
|
295
328
|
* Токен единиц измерения линейной величины по умолчанию.
|
|
296
329
|
*/
|
|
297
|
-
const SC_LINEAR_VALUES_TOKEN =
|
|
330
|
+
const SC_LINEAR_VALUES_TOKEN = new InjectionToken('SC_LINEAR_VALUES_TOKEN', {
|
|
331
|
+
factory: () => SC_LINEAR_VALUES,
|
|
332
|
+
});
|
|
298
333
|
|
|
299
334
|
/**
|
|
300
335
|
* Токен внедрения пути до изображения 'Товар не найден'.
|
|
301
336
|
*/
|
|
302
337
|
const SC_PATH_IMAGE_NOT_FOUND = new InjectionToken('PATH_IMAGE_NOT_FOUND');
|
|
303
338
|
|
|
339
|
+
/**
|
|
340
|
+
* Значения пагинации списка товаров категории по умолчанию.
|
|
341
|
+
*/
|
|
342
|
+
const SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS = {
|
|
343
|
+
perPage: 20,
|
|
344
|
+
paginate: true,
|
|
345
|
+
page: 0,
|
|
346
|
+
};
|
|
347
|
+
/**
|
|
348
|
+
* Токен значений пагинации списка товаров в каталоге по умолчанию.
|
|
349
|
+
*/
|
|
350
|
+
const SC_PRODUCT_PAGINATION_OPTIONS = new InjectionToken('SC_PRODUCT_PAGINATION_OPTIONS', {
|
|
351
|
+
factory: () => SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS,
|
|
352
|
+
});
|
|
353
|
+
/**
|
|
354
|
+
* Токен {@link EventEmitter} событие нажатия на кнопку "Показать следующие позиции категории".
|
|
355
|
+
*/
|
|
356
|
+
const SC_NEXT_PAGE_PAGINATION_CLICK = new InjectionToken('SC_NEXT_PAGE_PAGINATION_CLICK', {
|
|
357
|
+
factory: () => new EventEmitter(),
|
|
358
|
+
});
|
|
359
|
+
|
|
304
360
|
/**
|
|
305
361
|
* Токен внедрения информации о релизе.
|
|
306
362
|
*/
|
|
@@ -319,12 +375,7 @@ const SC_URLS = new InjectionToken('IUrls');
|
|
|
319
375
|
/**
|
|
320
376
|
* Токен внедрения данных API обратной связи.
|
|
321
377
|
*/
|
|
322
|
-
const SC_FEEDBACK_API =
|
|
323
|
-
|
|
324
|
-
/**
|
|
325
|
-
* Токен внедрения формата дат.
|
|
326
|
-
*/
|
|
327
|
-
const SC_DATE_FORMAT = tuiCreateToken();
|
|
378
|
+
const SC_FEEDBACK_API = new InjectionToken('SC_FEEDBACK_API');
|
|
328
379
|
|
|
329
380
|
/**
|
|
330
381
|
* Перечисление названий целей метрики используемых для отслеживания действий пользователей.
|
|
@@ -1147,9 +1198,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
1147
1198
|
/**
|
|
1148
1199
|
* Токен потока данных о текущем пользователе.
|
|
1149
1200
|
*/
|
|
1150
|
-
const SC_USER_INFO =
|
|
1151
|
-
|
|
1152
|
-
|
|
1201
|
+
const SC_USER_INFO = new InjectionToken('SC_USER_INFO', {
|
|
1202
|
+
factory: () => inject(ScUserService)
|
|
1203
|
+
.getUserChange$()
|
|
1204
|
+
.pipe(distinctUntilChanged((previous, current) => !current.isGuest && previous.id === current.id), takeUntilDestroyed()),
|
|
1205
|
+
});
|
|
1153
1206
|
|
|
1154
1207
|
/**
|
|
1155
1208
|
* Сервис для работы с баннерами.
|
|
@@ -2438,7 +2491,7 @@ class ScWarehouseService {
|
|
|
2438
2491
|
*/
|
|
2439
2492
|
setWarehouseIdSelectChange(warehouseId) {
|
|
2440
2493
|
this.warehouseIdSelectSubject.next(warehouseId);
|
|
2441
|
-
// this.uiService.setSelectedWarehouseId(warehouseId);
|
|
2494
|
+
// TODO: Доработать this.uiService.setSelectedWarehouseId(warehouseId);
|
|
2442
2495
|
}
|
|
2443
2496
|
/**
|
|
2444
2497
|
* Возвращает {@link Observable} выбранного склада.
|
|
@@ -2829,7 +2882,9 @@ class ScVirtualCategory extends ScSeoResource {
|
|
|
2829
2882
|
/**
|
|
2830
2883
|
* Токен, указывающий число первых записей товаров со скидкой.
|
|
2831
2884
|
*/
|
|
2832
|
-
const SC_COUNT_FIRST_DISCOUNTED_PRODUCTS =
|
|
2885
|
+
const SC_COUNT_FIRST_DISCOUNTED_PRODUCTS = new InjectionToken('SC_COUNT_FIRST_DISCOUNTED_PRODUCTS', {
|
|
2886
|
+
factory: () => 10,
|
|
2887
|
+
});
|
|
2833
2888
|
|
|
2834
2889
|
/**
|
|
2835
2890
|
* Сервис для работы с фильтрами каталога.
|
|
@@ -2871,11 +2926,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
2871
2926
|
}]
|
|
2872
2927
|
}] });
|
|
2873
2928
|
|
|
2874
|
-
/**
|
|
2875
|
-
* Токен определяющий, идентификатор или символьное обозначение (slug) используется для роутинга и маршрутизации.
|
|
2876
|
-
*/
|
|
2877
|
-
const SC_ID_OR_SLUG_IN_ROUTE = tuiCreateToken('id');
|
|
2878
|
-
|
|
2879
2929
|
/**
|
|
2880
2930
|
* Пайп, возвращающий идентификатор или символьное обозначение (slug) исходя из настроек окружения
|
|
2881
2931
|
*/
|
|
@@ -3755,21 +3805,36 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
3755
3805
|
const SC_IS_HEADER_REQUIRED = new HttpContextToken(() => true);
|
|
3756
3806
|
|
|
3757
3807
|
/**
|
|
3758
|
-
*
|
|
3808
|
+
* Токен потока данных о категории.
|
|
3759
3809
|
*/
|
|
3760
|
-
const
|
|
3761
|
-
perPage: 20,
|
|
3762
|
-
paginate: true,
|
|
3763
|
-
page: 0,
|
|
3764
|
-
};
|
|
3810
|
+
const CATEGORY_INFO = new InjectionToken('A stream with current category information');
|
|
3765
3811
|
/**
|
|
3766
|
-
*
|
|
3812
|
+
* Фабрика создания потока данных о категории.
|
|
3813
|
+
*
|
|
3814
|
+
* @param paramMap Параметры.
|
|
3815
|
+
* @param paramMap.paramMap Параметры.
|
|
3816
|
+
* @param catalogService Сервис для работы с каталогом.
|
|
3817
|
+
* @param catalogService.paramMap Параметры.
|
|
3818
|
+
* @param errorHandlerComponent Компонент для управления кодом ошибки отображаемой на странице.
|
|
3767
3819
|
*/
|
|
3768
|
-
|
|
3820
|
+
function categoryFactory({ paramMap }, catalogService, errorHandlerComponent) {
|
|
3821
|
+
return paramMap.pipe(map((parameters) => parameters.get('categoryIdOrSlug')), filter(tuiIsPresent), switchMap((categoryId) => catalogService.getCategoryCached$(categoryId).pipe(catchError((error) => {
|
|
3822
|
+
if (error instanceof HttpErrorResponse) {
|
|
3823
|
+
errorHandlerComponent(error.status);
|
|
3824
|
+
}
|
|
3825
|
+
return EMPTY;
|
|
3826
|
+
}), shareReplay())), takeUntilDestroyed());
|
|
3827
|
+
}
|
|
3769
3828
|
/**
|
|
3770
|
-
*
|
|
3829
|
+
* Провайдеры потока данных о категории.
|
|
3771
3830
|
*/
|
|
3772
|
-
const
|
|
3831
|
+
const CATEGORY_PROVIDERS = [
|
|
3832
|
+
{
|
|
3833
|
+
provide: CATEGORY_INFO,
|
|
3834
|
+
deps: [ActivatedRoute, ScCatalogService, ERROR_HANDLER],
|
|
3835
|
+
useFactory: categoryFactory,
|
|
3836
|
+
},
|
|
3837
|
+
];
|
|
3773
3838
|
|
|
3774
3839
|
/**
|
|
3775
3840
|
* Сервис поиска по каталогу.
|
|
@@ -3947,11 +4012,6 @@ const SC_VIRTUAL_CATEGORY_PROVIDERS = [
|
|
|
3947
4012
|
},
|
|
3948
4013
|
];
|
|
3949
4014
|
|
|
3950
|
-
/**
|
|
3951
|
-
* Токен для получения полной информации о компании.
|
|
3952
|
-
*/
|
|
3953
|
-
const SC_COMPANY_INFO = new InjectionToken('SC_COMPANY_INFO');
|
|
3954
|
-
|
|
3955
4015
|
/**
|
|
3956
4016
|
* Сервис для работы с UTM-меткой страницы.
|
|
3957
4017
|
*/
|
|
@@ -4759,85 +4819,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
4759
4819
|
args: [SC_URLS]
|
|
4760
4820
|
}] }] });
|
|
4761
4821
|
|
|
4762
|
-
/**
|
|
4763
|
-
* Сервис аутентификации пользователя на основе ключей, переданных в параметрах запроса.
|
|
4764
|
-
*/
|
|
4765
|
-
class ScAuthAsClientGuard {
|
|
4766
|
-
/**
|
|
4767
|
-
* Инициализирует экземпляр класса {@link AuthAsClientGuard}.
|
|
4768
|
-
*
|
|
4769
|
-
* @param authService Сервис аутентификации.
|
|
4770
|
-
* @param router Сервис маршрутизации.
|
|
4771
|
-
* @param options Параметры авторизации под клиентом.
|
|
4772
|
-
*/
|
|
4773
|
-
constructor(authService, router, options) {
|
|
4774
|
-
this.authService = authService;
|
|
4775
|
-
this.router = router;
|
|
4776
|
-
this.options = options;
|
|
4777
|
-
}
|
|
4778
|
-
/**
|
|
4779
|
-
* Разрешает/запрещает доступ к маршруту.
|
|
4780
|
-
*
|
|
4781
|
-
* @param route Данные о текущем маршруте.
|
|
4782
|
-
*/
|
|
4783
|
-
// eslint-disable-next-line sonarjs/function-return-type
|
|
4784
|
-
canActivate(route) {
|
|
4785
|
-
const expiredAt = new Date();
|
|
4786
|
-
expiredAt.setMinutes(new Date().getMinutes() + this.options.expiredAtMinute);
|
|
4787
|
-
return this.authService.getAuthChange().pipe(first(),
|
|
4788
|
-
// Если пользователь авторизирован, то завершаем сеанс.
|
|
4789
|
-
concatMap((state) => (state ? this.authService.getSignOut$(false) : of(null))),
|
|
4790
|
-
// Обновляем полученные ключи, чтобы они перестали действовать. getRefreshTokenObservable() запишет новые ключи в систему, после чего проложение само запросит нового пользователя.
|
|
4791
|
-
concatMap(() => this.authService.getRefreshToken$({
|
|
4792
|
-
access: {
|
|
4793
|
-
token: route.paramMap.get('atoken') ?? '',
|
|
4794
|
-
expiredAt: expiredAt,
|
|
4795
|
-
},
|
|
4796
|
-
refresh: {
|
|
4797
|
-
token: route.paramMap.get('rtoken') ?? '',
|
|
4798
|
-
expiredAt: expiredAt,
|
|
4799
|
-
},
|
|
4800
|
-
})), first(), map(() => this.router.createUrlTree(this.options.urlTree)));
|
|
4801
|
-
}
|
|
4802
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard, deps: [{ token: ScAuthService }, { token: i2.Router }, { token: SC_AUTH_AS_CLIENT_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
4803
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard }); }
|
|
4804
|
-
}
|
|
4805
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard, decorators: [{
|
|
4806
|
-
type: Injectable
|
|
4807
|
-
}], ctorParameters: () => [{ type: ScAuthService }, { type: i2.Router }, { type: undefined, decorators: [{
|
|
4808
|
-
type: Inject,
|
|
4809
|
-
args: [SC_AUTH_AS_CLIENT_OPTIONS]
|
|
4810
|
-
}] }] });
|
|
4811
|
-
|
|
4812
|
-
/**
|
|
4813
|
-
* Страж выполняющий проверку маршрута товара и категории, и редиректа в зависимости от настроек окружения.
|
|
4814
|
-
*
|
|
4815
|
-
* @param route Сервис предоставляющий доступ к данным о маршруте.
|
|
4816
|
-
*/
|
|
4817
|
-
// eslint-disable-next-line sonarjs/function-return-type
|
|
4818
|
-
const ScIdOrSlugGuard = (route) => {
|
|
4819
|
-
const { paramMap } = route;
|
|
4820
|
-
const categoryIdOrSlug = paramMap.get('categoryIdOrSlug');
|
|
4821
|
-
const productIdOrSlug = paramMap.get('productIdOrSlug');
|
|
4822
|
-
const idOrSlug = inject(SC_ID_OR_SLUG_IN_ROUTE);
|
|
4823
|
-
const router = inject(Router);
|
|
4824
|
-
if (categoryIdOrSlug && /^\d+$/.test(categoryIdOrSlug) !== (idOrSlug === 'id')) {
|
|
4825
|
-
return inject(ScCatalogService)
|
|
4826
|
-
.getCategoryCached$(categoryIdOrSlug)
|
|
4827
|
-
.pipe(filter(tuiIsPresent),
|
|
4828
|
-
// eslint-disable-next-line security/detect-object-injection
|
|
4829
|
-
map((category) => router.createUrlTree(['/catalog', category[idOrSlug]])), catchError(() => of(TUI_TRUE_HANDLER())));
|
|
4830
|
-
}
|
|
4831
|
-
if (productIdOrSlug && /^\d+$/.test(productIdOrSlug) !== (idOrSlug === 'id')) {
|
|
4832
|
-
return inject(ScCatalogService)
|
|
4833
|
-
.getProductData$(productIdOrSlug)
|
|
4834
|
-
.pipe(filter(tuiIsPresent),
|
|
4835
|
-
// eslint-disable-next-line security/detect-object-injection
|
|
4836
|
-
map((product) => router.createUrlTree(['/catalog', 'product', product[idOrSlug]])), catchError(() => of(TUI_TRUE_HANDLER())));
|
|
4837
|
-
}
|
|
4838
|
-
return true;
|
|
4839
|
-
};
|
|
4840
|
-
|
|
4841
4822
|
/**
|
|
4842
4823
|
* Пайп для формирования полного URI изображения на media сервере.
|
|
4843
4824
|
*/
|
|
@@ -4870,50 +4851,451 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
4870
4851
|
}] });
|
|
4871
4852
|
|
|
4872
4853
|
/**
|
|
4873
|
-
*
|
|
4854
|
+
* Сервис управления SEO-параметрами.
|
|
4874
4855
|
*/
|
|
4875
|
-
class
|
|
4856
|
+
class ScSeoService {
|
|
4857
|
+
/**
|
|
4858
|
+
* Инициализирует экземпляр класса {@link ScSeoService}.
|
|
4859
|
+
*/
|
|
4876
4860
|
constructor() {
|
|
4877
4861
|
/**
|
|
4878
|
-
*
|
|
4862
|
+
* Событие установки meta-тегов страницы.
|
|
4879
4863
|
*/
|
|
4880
|
-
this.
|
|
4864
|
+
this.isSetMetaTagsEventEmitter = new EventEmitter();
|
|
4865
|
+
/**
|
|
4866
|
+
* Данные о мета-данных страницы по умолчанию.
|
|
4867
|
+
*/
|
|
4868
|
+
this.defaultSeo = inject(SC_DEFAULT_PAGE_META);
|
|
4869
|
+
/**
|
|
4870
|
+
* Сервис маршрутизации.
|
|
4871
|
+
*/
|
|
4872
|
+
this.router = inject(Router);
|
|
4873
|
+
/**
|
|
4874
|
+
* Список ссылок приложения.
|
|
4875
|
+
*/
|
|
4876
|
+
this.urls = inject(SC_URLS);
|
|
4877
|
+
/**
|
|
4878
|
+
* Сервис установки метаданных страницы.
|
|
4879
|
+
*/
|
|
4880
|
+
this.metaService = inject(Meta);
|
|
4881
|
+
/**
|
|
4882
|
+
* Сервис управления заголовком страницы.
|
|
4883
|
+
*/
|
|
4884
|
+
this.titleService = inject(Title);
|
|
4885
|
+
/**
|
|
4886
|
+
* Селектор группы для устанавливаемых метатегов.
|
|
4887
|
+
*/
|
|
4888
|
+
this.dataGroupSelector = 'seo-tags';
|
|
4889
|
+
/**
|
|
4890
|
+
* Объект {@link Document}, предоставляющий доступ к DOM страницы.
|
|
4891
|
+
*/
|
|
4892
|
+
this.document = inject(DOCUMENT);
|
|
4893
|
+
/**
|
|
4894
|
+
* Фабрика для создания экземпляров {@link Renderer2}.
|
|
4895
|
+
*/
|
|
4896
|
+
this.rendererFactory = inject(RendererFactory2);
|
|
4897
|
+
/**
|
|
4898
|
+
* Экземпляр {@link Renderer2} для безопасной работы с DOM.
|
|
4899
|
+
*/
|
|
4900
|
+
this.renderer = this.rendererFactory.createRenderer(null, null);
|
|
4901
|
+
/**
|
|
4902
|
+
* Название компании.
|
|
4903
|
+
*/
|
|
4904
|
+
this.companyName = inject(SC_COMPANY_NAME);
|
|
4905
|
+
this.setShareType('website');
|
|
4881
4906
|
}
|
|
4882
4907
|
/**
|
|
4883
|
-
*
|
|
4908
|
+
* Устанавливает meta-теги.
|
|
4884
4909
|
*
|
|
4885
|
-
* @param
|
|
4886
|
-
* @param
|
|
4887
|
-
* @
|
|
4910
|
+
* @param title Заголовок страницы.
|
|
4911
|
+
* @param description Описание страницы.
|
|
4912
|
+
* @param keywords Ключевые слова страницы.
|
|
4913
|
+
* @param emitEventAfterSet Признак того, необходимо ли генерировать событие, после установки тегов. По умолчанию {@link true}.
|
|
4914
|
+
* @param robots Список robots тегов для страницы.
|
|
4888
4915
|
*/
|
|
4889
|
-
|
|
4890
|
-
|
|
4891
|
-
|
|
4892
|
-
|
|
4893
|
-
|
|
4894
|
-
|
|
4916
|
+
setPageMetaTags(title = this.defaultSeo.title, description = this.defaultSeo.description, keywords = this.defaultSeo.keywords, emitEventAfterSet = true, robots = ['index', 'follow']) {
|
|
4917
|
+
this.setPageTitle(title);
|
|
4918
|
+
this.setPageMetaDescription(description);
|
|
4919
|
+
this.setPageMetaKeywords(keywords);
|
|
4920
|
+
this.setPageMetaRobots(robots);
|
|
4921
|
+
if (emitEventAfterSet) {
|
|
4922
|
+
this.isSetMetaTagsEventEmitter.emit();
|
|
4923
|
+
}
|
|
4895
4924
|
}
|
|
4896
4925
|
/**
|
|
4897
|
-
*
|
|
4926
|
+
* Устанавливает Open Graph meta-теги.
|
|
4898
4927
|
*
|
|
4899
|
-
* @param
|
|
4900
|
-
* @param
|
|
4901
|
-
* @
|
|
4928
|
+
* @param ogTitle Open Graph заголовок.
|
|
4929
|
+
* @param ogDescription Open Graph описание.
|
|
4930
|
+
* @param ogImg Open Graph изображение.
|
|
4931
|
+
* @param emitEventAfterSet Признак того, необходимо ли генерировать событие, после установки тегов. По умолчанию {@link true}.
|
|
4902
4932
|
*/
|
|
4903
|
-
|
|
4904
|
-
|
|
4905
|
-
|
|
4906
|
-
|
|
4907
|
-
|
|
4908
|
-
|
|
4909
|
-
|
|
4910
|
-
|
|
4911
|
-
|
|
4912
|
-
|
|
4913
|
-
|
|
4914
|
-
|
|
4915
|
-
|
|
4916
|
-
|
|
4933
|
+
setPageOpenGraphMetaTags(ogTitle = this.defaultSeo.title, ogDescription = this.defaultSeo.description, ogImg = this.urls.logoUrl, emitEventAfterSet = true) {
|
|
4934
|
+
this.setOpenGraphMetaTags(ogTitle, ogDescription, `${this.urls.siteUrl}${this.router.url}`, ogImg);
|
|
4935
|
+
if (emitEventAfterSet) {
|
|
4936
|
+
this.isSetMetaTagsEventEmitter.emit();
|
|
4937
|
+
}
|
|
4938
|
+
}
|
|
4939
|
+
/**
|
|
4940
|
+
* Устанавливает все meta-теги из пришедшего источника. Если какого-то тега нет, будет установлено значение по умолчанию.
|
|
4941
|
+
*
|
|
4942
|
+
* @param resource Источник meta - тегов.
|
|
4943
|
+
* @param img Изображение. Если не пришло, то будет установлено значение по умолчанию.
|
|
4944
|
+
* @param robots Список robots тегов для страницы.
|
|
4945
|
+
*/
|
|
4946
|
+
setMetaTagsFromResource(resource, img = this.urls.logoUrl, robots = ['index', 'follow']) {
|
|
4947
|
+
this.setAllPageMetaTags(resource?.title, resource?.description, resource?.keywords, img, resource?.meta, robots);
|
|
4948
|
+
}
|
|
4949
|
+
/**
|
|
4950
|
+
* Устанавливает все meta-теги страницы со значением по умолчанию, внедряя туда заголовок, если он передан.
|
|
4951
|
+
*
|
|
4952
|
+
* @param title Заголовок страницы.
|
|
4953
|
+
* @param robots Список robots тегов для страницы.
|
|
4954
|
+
*/
|
|
4955
|
+
setDefaultAllPageMetaTags(title = this.defaultSeo.title, robots = ['index', 'follow']) {
|
|
4956
|
+
this.setAllPageMetaTags(`${title} - ${this.companyName}`, `${title}, ${this.defaultSeo.description}`, undefined, undefined, [], robots);
|
|
4957
|
+
}
|
|
4958
|
+
/**
|
|
4959
|
+
* Устанавливает все meta-теги страницы со значением по умолчанию, внедряя туда заголовок, если он передан. Устанавливает значение "не индексировать" для поисковых роботов.
|
|
4960
|
+
*
|
|
4961
|
+
* @param title Заголовок страницы.
|
|
4962
|
+
*/
|
|
4963
|
+
setNoIndexDefaultAllPageMetaTags(title = this.defaultSeo.title) {
|
|
4964
|
+
this.setAllPageMetaTags(`${title} - ${this.companyName}`, `${title}, ${this.defaultSeo.description}`, undefined, undefined, [], ['noindex', 'nofollow', 'noarchive']);
|
|
4965
|
+
}
|
|
4966
|
+
/**
|
|
4967
|
+
* Устанавливает все meta-теги страницы. Если какой-либо из параметров не указан, для него устанавливается значение по умолчанию.
|
|
4968
|
+
*
|
|
4969
|
+
* @param title Заголовок страницы.
|
|
4970
|
+
* @param description Описание страницы.
|
|
4971
|
+
* @param keywords Ключевые слова страницы.
|
|
4972
|
+
* @param img Изображение.
|
|
4973
|
+
* @param meta Массив дополнительных значений метатегов.
|
|
4974
|
+
* @param robots Список robots тегов для страницы.
|
|
4975
|
+
*/
|
|
4976
|
+
setAllPageMetaTags(title = this.defaultSeo.title, description = this.defaultSeo.description, keywords = this.defaultSeo.keywords, img = this.urls.logoUrl, meta = [], robots = ['index', 'follow']) {
|
|
4977
|
+
this.removeMetaTags();
|
|
4978
|
+
this.setPageTitle(title);
|
|
4979
|
+
this.setPageMetaDescription(description);
|
|
4980
|
+
this.setPageMetaKeywords(keywords);
|
|
4981
|
+
this.setOpenGraphMetaTags(title, description, `${this.urls.siteUrl}${this.router.url}`, img);
|
|
4982
|
+
meta.forEach((tag) => {
|
|
4983
|
+
this.setPageMetaByName(tag.name, tag.content);
|
|
4984
|
+
});
|
|
4985
|
+
this.setPageMetaRobots(robots);
|
|
4986
|
+
this.isSetMetaTagsEventEmitter.emit();
|
|
4987
|
+
}
|
|
4988
|
+
/**
|
|
4989
|
+
* Устанавливает meta-тег robots для страницы.
|
|
4990
|
+
*
|
|
4991
|
+
* @param robots Список robots тегов для страницы.
|
|
4992
|
+
*/
|
|
4993
|
+
setPageMetaRobots(robots) {
|
|
4994
|
+
this.setPageMetaByName('robots', robots.join(', '));
|
|
4995
|
+
}
|
|
4996
|
+
/**
|
|
4997
|
+
* Удаляет все установленные meta-теги.
|
|
4998
|
+
*/
|
|
4999
|
+
removeMetaTags() {
|
|
5000
|
+
const tags = this.document.querySelectorAll(`meta[data-group="${this.dataGroupSelector}"]`);
|
|
5001
|
+
tags.forEach((tag) => {
|
|
5002
|
+
this.metaService.removeTagElement(tag);
|
|
5003
|
+
});
|
|
5004
|
+
}
|
|
5005
|
+
/**
|
|
5006
|
+
* Возвращает сгенерированный SEO-resource с указанными параметрами.
|
|
5007
|
+
*
|
|
5008
|
+
* @param seo Данные SEO ресурса.
|
|
5009
|
+
* @param defaultTitle Заголовок страницы используемый в случае отсутствия заголовка в SEO-ресурсе.
|
|
5010
|
+
* @param defaultDescription Описание страницы используемое в случае отсутствия описания в SEO-ресурсе.
|
|
5011
|
+
* @param defaultKeyWords Ключевые слова страницы используемые в случае отсутствия ключевых слов в SEO-ресурсе.
|
|
5012
|
+
*/
|
|
5013
|
+
getGenerateSeoResource(seo, defaultTitle, defaultDescription = this.defaultSeo.description, defaultKeyWords = this.defaultSeo.keywords) {
|
|
5014
|
+
return {
|
|
5015
|
+
title: seo?.title ?? defaultTitle,
|
|
5016
|
+
description: seo?.description ?? defaultDescription,
|
|
5017
|
+
keywords: seo?.keywords ?? defaultKeyWords,
|
|
5018
|
+
meta: seo?.meta,
|
|
5019
|
+
};
|
|
5020
|
+
}
|
|
5021
|
+
/**
|
|
5022
|
+
* Устанавливает тег канонической страницы <link rel="canonical" href="..." />.
|
|
5023
|
+
*
|
|
5024
|
+
* @param url URL который необходимо использовать в качестве ссылки.
|
|
5025
|
+
*/
|
|
5026
|
+
setCanonicalLink(url) {
|
|
5027
|
+
// Удаляем существующий link canonical.
|
|
5028
|
+
const existingLink = this.document.querySelector('link[rel="canonical"]');
|
|
5029
|
+
if (existingLink?.parentNode) {
|
|
5030
|
+
this.renderer.removeChild(existingLink.parentNode, existingLink);
|
|
5031
|
+
}
|
|
5032
|
+
// Создаём и устанавливаем новый тег.
|
|
5033
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
5034
|
+
const link = this.renderer.createElement('link');
|
|
5035
|
+
this.renderer.setAttribute(link, 'rel', 'canonical');
|
|
5036
|
+
this.renderer.setAttribute(link, 'href', url);
|
|
5037
|
+
this.renderer.appendChild(this.document.head, link);
|
|
5038
|
+
}
|
|
5039
|
+
/**
|
|
5040
|
+
* Устанавливает title-заголовок страницы.
|
|
5041
|
+
*
|
|
5042
|
+
* @param title Заголовок страницы.
|
|
5043
|
+
* @param appendDefaultTitle Флаг необходимости добавить заголовок по умолчанию в конец заголовка страницы.
|
|
5044
|
+
*/
|
|
5045
|
+
setPageTitle(title, appendDefaultTitle = false) {
|
|
5046
|
+
this.titleService.setTitle(title + (appendDefaultTitle ? ` - ${this.defaultSeo.title}` : ''));
|
|
5047
|
+
}
|
|
5048
|
+
/**
|
|
5049
|
+
* Устанавливает meta-описание страницы.
|
|
5050
|
+
*
|
|
5051
|
+
* @param description Meta-описание страницы.
|
|
5052
|
+
*/
|
|
5053
|
+
setPageMetaDescription(description) {
|
|
5054
|
+
this.setPageMetaByName('description', description);
|
|
5055
|
+
}
|
|
5056
|
+
/**
|
|
5057
|
+
* Устанавливает meta-ключевые слова страницы.
|
|
5058
|
+
*
|
|
5059
|
+
* @param keywords Meta-ключевые слова страницы.
|
|
5060
|
+
*/
|
|
5061
|
+
setPageMetaKeywords(keywords) {
|
|
5062
|
+
this.setPageMetaByName('keywords', keywords);
|
|
5063
|
+
}
|
|
5064
|
+
/**
|
|
5065
|
+
* Устанавливает Open Graph meta-теги страницы для социальных сетей.
|
|
5066
|
+
*
|
|
5067
|
+
* @param title Заголовок страницы.
|
|
5068
|
+
* @param description Описание страницы.
|
|
5069
|
+
* @param url Ссылка на страницу.
|
|
5070
|
+
* @param img Изображение.
|
|
5071
|
+
*/
|
|
5072
|
+
setOpenGraphMetaTags(title, description, url, img) {
|
|
5073
|
+
this.setOpenGraphMetaByProperty('og:title', title);
|
|
5074
|
+
this.setOpenGraphMetaByProperty('og:url', url);
|
|
5075
|
+
this.setOpenGraphMetaByProperty('og:image', img);
|
|
5076
|
+
this.setOpenGraphMetaByProperty('og:description', description);
|
|
5077
|
+
this.setOpenGraphMetaByProperty('og:type', 'website');
|
|
5078
|
+
}
|
|
5079
|
+
/**
|
|
5080
|
+
* Устанавливает meta-тег страницы с указанным именем.
|
|
5081
|
+
* Будет создан или обновлён заголовок вида `<meta name="{name}" content="{content}" />`
|
|
5082
|
+
*
|
|
5083
|
+
* @param name Название заголовка.
|
|
5084
|
+
* @param content Содержимое заголовка.
|
|
5085
|
+
*/
|
|
5086
|
+
setPageMetaByName(name, content) {
|
|
5087
|
+
this.metaService.updateTag({ name: name, content: content, 'data-group': this.dataGroupSelector });
|
|
5088
|
+
}
|
|
5089
|
+
/**
|
|
5090
|
+
* Устанавливает Open Graph meta-тег по свойству атрибута property.
|
|
5091
|
+
*
|
|
5092
|
+
* @param property Свойство атрибута.
|
|
5093
|
+
* @param content Содержимое тега.
|
|
5094
|
+
*/
|
|
5095
|
+
setOpenGraphMetaByProperty(property, content) {
|
|
5096
|
+
this.metaService.updateTag({ property: property, content: content, 'data-group': this.dataGroupSelector });
|
|
5097
|
+
}
|
|
5098
|
+
/**
|
|
5099
|
+
* Устанавливает Open Graph мета-тег типа объекта.
|
|
5100
|
+
*
|
|
5101
|
+
* @param type Тип объекта.
|
|
5102
|
+
*/
|
|
5103
|
+
setShareType(type) {
|
|
5104
|
+
this.setOpenGraphMetaByProperty('og:type', type);
|
|
5105
|
+
}
|
|
5106
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5107
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, providedIn: 'root' }); }
|
|
5108
|
+
}
|
|
5109
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, decorators: [{
|
|
5110
|
+
type: Injectable,
|
|
5111
|
+
args: [{
|
|
5112
|
+
providedIn: 'root',
|
|
5113
|
+
}]
|
|
5114
|
+
}], ctorParameters: () => [] });
|
|
5115
|
+
|
|
5116
|
+
/**
|
|
5117
|
+
* Устанавливает SEO-теги для страниц каталога.
|
|
5118
|
+
*
|
|
5119
|
+
* @param seoService Сервис для работы с SEO.
|
|
5120
|
+
* @param name Название страницы.
|
|
5121
|
+
* @param seo SEO-теги.
|
|
5122
|
+
* @param image Ссылка на основное изображение.
|
|
5123
|
+
*/
|
|
5124
|
+
const setSeoTags = (seoService, name, seo, image) => {
|
|
5125
|
+
const companyInfo = inject(SC_COMPANY_INFO);
|
|
5126
|
+
const catalogMeta = inject(SC_CATALOG_PAGE_META);
|
|
5127
|
+
const seoResource = seoService.getGenerateSeoResource(seo, `${name} - Купить в ${companyInfo.name}`, `${name} - Купить по выгодным ценам в ${companyInfo.name}`, `${name}, ${catalogMeta.keywords}`);
|
|
5128
|
+
seoService.setMetaTagsFromResource(seoResource, image);
|
|
5129
|
+
};
|
|
5130
|
+
/**
|
|
5131
|
+
* Создает SEO-guard для указанного сервиса и метода получения данных.
|
|
5132
|
+
*
|
|
5133
|
+
* @param getDataFunction Функция для получения данных из сервиса.
|
|
5134
|
+
* @param setCanonical Признак необходимости установить на странице каноническую ссылку.
|
|
5135
|
+
* @returns Функция-guard.
|
|
5136
|
+
*/
|
|
5137
|
+
const createSeoGuard = (getDataFunction, setCanonical = false) => {
|
|
5138
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
5139
|
+
return ({ paramMap }, state) => {
|
|
5140
|
+
const seoService = inject(ScSeoService);
|
|
5141
|
+
const mediaImageTransformerPipe = inject(ScMediaImageTransformerPipe);
|
|
5142
|
+
const recId = paramMap.get('productIdOrSlug') ?? paramMap.get('categoryIdOrSlug') ?? paramMap.get('categorySlug');
|
|
5143
|
+
if (!recId) {
|
|
5144
|
+
return false;
|
|
5145
|
+
}
|
|
5146
|
+
return getDataFunction(recId).pipe(filter$1(tuiIsPresent), tap$1(({ id, name, seo, image, slug }) => {
|
|
5147
|
+
setSeoTags(seoService, name, seo, mediaImageTransformerPipe.transform(image, true));
|
|
5148
|
+
const idOrSlugInRoute = inject(SC_ID_OR_SLUG_IN_ROUTE);
|
|
5149
|
+
// В том случае, если используется slug для формирования ссылок, то необходимо сформировать кононическую ссылку
|
|
5150
|
+
// на страницу в которой используется slug (а не id).
|
|
5151
|
+
if (setCanonical && idOrSlugInRoute === 'slug' && id && slug) {
|
|
5152
|
+
const canonicalPath = state.url
|
|
5153
|
+
.split('/')
|
|
5154
|
+
.map((segment) => (segment === id.toString() ? slug : segment))
|
|
5155
|
+
.join('/');
|
|
5156
|
+
const { siteUrl } = inject(SC_URLS);
|
|
5157
|
+
seoService.setCanonicalLink(`${siteUrl}${canonicalPath}`);
|
|
5158
|
+
}
|
|
5159
|
+
}), map$1(TUI_TRUE_HANDLER), catchError$1(() => of(true)), takeUntilDestroyed());
|
|
5160
|
+
};
|
|
5161
|
+
};
|
|
5162
|
+
/**
|
|
5163
|
+
* Устанавливает SEO-теги для страницы продукта.
|
|
5164
|
+
*/
|
|
5165
|
+
const productSeoGuard = createSeoGuard((recId) => inject(ScCatalogService).getProductDataCached$(recId), true);
|
|
5166
|
+
/**
|
|
5167
|
+
* Устанавливает SEO-теги для страницы виртуальной категории.
|
|
5168
|
+
*/
|
|
5169
|
+
const virtualCategorySeoGuard = createSeoGuard((recId) => inject(ScCatalogService).getVirtualCategoryCached$(recId));
|
|
5170
|
+
/**
|
|
5171
|
+
* Устанавливает SEO-теги для страницы категории.
|
|
5172
|
+
*/
|
|
5173
|
+
const categorySeoGuard = createSeoGuard((recId) => inject(ScCatalogService).getCategoryCached$(recId), true);
|
|
5174
|
+
|
|
5175
|
+
/**
|
|
5176
|
+
* Сервис аутентификации пользователя на основе ключей, переданных в параметрах запроса.
|
|
5177
|
+
*/
|
|
5178
|
+
class ScAuthAsClientGuard {
|
|
5179
|
+
/**
|
|
5180
|
+
* Инициализирует экземпляр класса {@link AuthAsClientGuard}.
|
|
5181
|
+
*
|
|
5182
|
+
* @param authService Сервис аутентификации.
|
|
5183
|
+
* @param router Сервис маршрутизации.
|
|
5184
|
+
* @param options Параметры авторизации под клиентом.
|
|
5185
|
+
*/
|
|
5186
|
+
constructor(authService, router, options) {
|
|
5187
|
+
this.authService = authService;
|
|
5188
|
+
this.router = router;
|
|
5189
|
+
this.options = options;
|
|
5190
|
+
}
|
|
5191
|
+
/**
|
|
5192
|
+
* Разрешает/запрещает доступ к маршруту.
|
|
5193
|
+
*
|
|
5194
|
+
* @param route Данные о текущем маршруте.
|
|
5195
|
+
*/
|
|
5196
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
5197
|
+
canActivate(route) {
|
|
5198
|
+
const expiredAt = new Date();
|
|
5199
|
+
expiredAt.setMinutes(new Date().getMinutes() + this.options.expiredAtMinute);
|
|
5200
|
+
return this.authService.getAuthChange().pipe(first(),
|
|
5201
|
+
// Если пользователь авторизирован, то завершаем сеанс.
|
|
5202
|
+
concatMap((state) => (state ? this.authService.getSignOut$(false) : of(null))),
|
|
5203
|
+
// Обновляем полученные ключи, чтобы они перестали действовать. getRefreshTokenObservable() запишет новые ключи в систему, после чего проложение само запросит нового пользователя.
|
|
5204
|
+
concatMap(() => this.authService.getRefreshToken$({
|
|
5205
|
+
access: {
|
|
5206
|
+
token: route.paramMap.get('atoken') ?? '',
|
|
5207
|
+
expiredAt: expiredAt,
|
|
5208
|
+
},
|
|
5209
|
+
refresh: {
|
|
5210
|
+
token: route.paramMap.get('rtoken') ?? '',
|
|
5211
|
+
expiredAt: expiredAt,
|
|
5212
|
+
},
|
|
5213
|
+
})), first(), map(() => this.router.createUrlTree(this.options.urlTree)));
|
|
5214
|
+
}
|
|
5215
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard, deps: [{ token: ScAuthService }, { token: i2.Router }, { token: SC_AUTH_AS_CLIENT_OPTIONS }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
5216
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard }); }
|
|
5217
|
+
}
|
|
5218
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScAuthAsClientGuard, decorators: [{
|
|
5219
|
+
type: Injectable
|
|
5220
|
+
}], ctorParameters: () => [{ type: ScAuthService }, { type: i2.Router }, { type: undefined, decorators: [{
|
|
5221
|
+
type: Inject,
|
|
5222
|
+
args: [SC_AUTH_AS_CLIENT_OPTIONS]
|
|
5223
|
+
}] }] });
|
|
5224
|
+
|
|
5225
|
+
/**
|
|
5226
|
+
* Страж выполняющий проверку маршрута товара и категории, и редиректа в зависимости от настроек окружения.
|
|
5227
|
+
*
|
|
5228
|
+
* @param route Сервис предоставляющий доступ к данным о маршруте.
|
|
5229
|
+
*/
|
|
5230
|
+
// eslint-disable-next-line sonarjs/function-return-type
|
|
5231
|
+
const ScIdOrSlugGuard = (route) => {
|
|
5232
|
+
const { paramMap } = route;
|
|
5233
|
+
const categoryIdOrSlug = paramMap.get('categoryIdOrSlug');
|
|
5234
|
+
const productIdOrSlug = paramMap.get('productIdOrSlug');
|
|
5235
|
+
const idOrSlug = inject(SC_ID_OR_SLUG_IN_ROUTE);
|
|
5236
|
+
const router = inject(Router);
|
|
5237
|
+
if (categoryIdOrSlug && /^\d+$/.test(categoryIdOrSlug) !== (idOrSlug === 'id')) {
|
|
5238
|
+
return inject(ScCatalogService)
|
|
5239
|
+
.getCategoryCached$(categoryIdOrSlug)
|
|
5240
|
+
.pipe(filter(tuiIsPresent),
|
|
5241
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
5242
|
+
map((category) => router.createUrlTree(['/catalog', category[idOrSlug]])), catchError(() => of(TUI_TRUE_HANDLER())));
|
|
5243
|
+
}
|
|
5244
|
+
if (productIdOrSlug && /^\d+$/.test(productIdOrSlug) !== (idOrSlug === 'id')) {
|
|
5245
|
+
return inject(ScCatalogService)
|
|
5246
|
+
.getProductData$(productIdOrSlug)
|
|
5247
|
+
.pipe(filter(tuiIsPresent),
|
|
5248
|
+
// eslint-disable-next-line security/detect-object-injection
|
|
5249
|
+
map((product) => router.createUrlTree(['/catalog', 'product', product[idOrSlug]])), catchError(() => of(TUI_TRUE_HANDLER())));
|
|
5250
|
+
}
|
|
5251
|
+
return true;
|
|
5252
|
+
};
|
|
5253
|
+
|
|
5254
|
+
/**
|
|
5255
|
+
* Класс с вспомогательными методами для работы с изображениями.
|
|
5256
|
+
*/
|
|
5257
|
+
class ScImageHelper {
|
|
5258
|
+
constructor() {
|
|
5259
|
+
/**
|
|
5260
|
+
* Список ссылок на разделы backend'a.
|
|
5261
|
+
*/
|
|
5262
|
+
this.mediaImageTransformerPipe = inject(ScMediaImageTransformerPipe);
|
|
5263
|
+
}
|
|
5264
|
+
/**
|
|
5265
|
+
* Возвращает изображение товара по индексу.
|
|
5266
|
+
*
|
|
5267
|
+
* @param product Позиция товара/услуги.
|
|
5268
|
+
* @param imgIndex Индекс изображения в массиве.
|
|
5269
|
+
* @returns Возвращает изображение товара по индексу. Возвращает пути до изображения 'Товар не найден' {@link pathImageNotFound} если изображения по индексу не найдено.
|
|
5270
|
+
*/
|
|
5271
|
+
getImage(product, imgIndex = 0) {
|
|
5272
|
+
return {
|
|
5273
|
+
image: this.mediaImageTransformerPipe.transform(product.getImage(imgIndex), true),
|
|
5274
|
+
alt: `${product.name} (${imgIndex + 1})`,
|
|
5275
|
+
imageWebp: this.mediaImageTransformerPipe.transform(product.getImageWebp(imgIndex), false),
|
|
5276
|
+
};
|
|
5277
|
+
}
|
|
5278
|
+
/**
|
|
5279
|
+
* Возвращает превью-изображение товара по индексу.
|
|
5280
|
+
*
|
|
5281
|
+
* @param product Позиция товара/услуги.
|
|
5282
|
+
* @param previewIndex Индекс превью-изображения в массиве.
|
|
5283
|
+
* @returns Возвращает превью-изображение товара по индексу. Возвращает основное изображение если превью-изображения по индексу не найдено.
|
|
5284
|
+
*/
|
|
5285
|
+
getImagePreview(product, previewIndex = 0) {
|
|
5286
|
+
return {
|
|
5287
|
+
image: this.mediaImageTransformerPipe.transform(product.getImagePreview(previewIndex) ?? product.getImage(previewIndex), true),
|
|
5288
|
+
alt: `${product.name} (${previewIndex + 1})`,
|
|
5289
|
+
imageWebp: this.mediaImageTransformerPipe.transform(product.getImagePreviewWebp(previewIndex) ?? product.getImageWebp(previewIndex), false),
|
|
5290
|
+
};
|
|
5291
|
+
}
|
|
5292
|
+
getProductImageList(product, useDefaultImage) {
|
|
5293
|
+
const images = product.images?.filter((image) => image.image).map((_, index) => this.getImage(product, index));
|
|
5294
|
+
if (images?.length) {
|
|
5295
|
+
return images;
|
|
5296
|
+
}
|
|
5297
|
+
if (useDefaultImage) {
|
|
5298
|
+
return [new ScImage(this.mediaImageTransformerPipe.transform(undefined, true), product.name)];
|
|
4917
5299
|
}
|
|
4918
5300
|
return undefined;
|
|
4919
5301
|
}
|
|
@@ -5019,12 +5401,16 @@ const SC_CACHE_SETTINGS = new HttpContextToken(() => new ScCacheSettings(false,
|
|
|
5019
5401
|
/**
|
|
5020
5402
|
* Токен списка URL, которые нужно кешировать для гостя.
|
|
5021
5403
|
*/
|
|
5022
|
-
const SC_GUEST_ENDPOINTS_TOKEN =
|
|
5404
|
+
const SC_GUEST_ENDPOINTS_TOKEN = new InjectionToken('SC_GUEST_ENDPOINTS_TOKEN', {
|
|
5405
|
+
factory: () => [],
|
|
5406
|
+
});
|
|
5023
5407
|
|
|
5024
5408
|
/**
|
|
5025
5409
|
* Токен имени параметра, при котором кешируются запросы у гостя.
|
|
5026
5410
|
*/
|
|
5027
|
-
const SC_GUEST_PARAMETER_NAME_TOKEN =
|
|
5411
|
+
const SC_GUEST_PARAMETER_NAME_TOKEN = new InjectionToken('SC_GUEST_PARAMETER_NAME_TOKEN', {
|
|
5412
|
+
factory: () => '',
|
|
5413
|
+
});
|
|
5028
5414
|
|
|
5029
5415
|
/**
|
|
5030
5416
|
* Перехватчик запросов для реализации аутентификации.
|
|
@@ -6853,243 +7239,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
6853
7239
|
args: [SC_URLS]
|
|
6854
7240
|
}] }] });
|
|
6855
7241
|
|
|
6856
|
-
/**
|
|
6857
|
-
* Сервис управления SEO-параметрами.
|
|
6858
|
-
*/
|
|
6859
|
-
class ScSeoService {
|
|
6860
|
-
/**
|
|
6861
|
-
* Инициализирует экземпляр класса {@link ScSeoService}.
|
|
6862
|
-
*/
|
|
6863
|
-
constructor() {
|
|
6864
|
-
/**
|
|
6865
|
-
* Событие установки meta-тегов страницы.
|
|
6866
|
-
*/
|
|
6867
|
-
this.isSetMetaTagsEventEmitter = new EventEmitter();
|
|
6868
|
-
/**
|
|
6869
|
-
* Данные о мета-данных страницы по умолчанию.
|
|
6870
|
-
*/
|
|
6871
|
-
this.defaultSeo = inject(SC_DEFAULT_PAGE_META);
|
|
6872
|
-
/**
|
|
6873
|
-
* Сервис маршрутизации.
|
|
6874
|
-
*/
|
|
6875
|
-
this.router = inject(Router);
|
|
6876
|
-
/**
|
|
6877
|
-
* Список ссылок приложения.
|
|
6878
|
-
*/
|
|
6879
|
-
this.urls = inject(SC_URLS);
|
|
6880
|
-
/**
|
|
6881
|
-
* Сервис установки метаданных страницы.
|
|
6882
|
-
*/
|
|
6883
|
-
this.metaService = inject(Meta);
|
|
6884
|
-
/**
|
|
6885
|
-
* Сервис управления заголовком страницы.
|
|
6886
|
-
*/
|
|
6887
|
-
this.titleService = inject(Title);
|
|
6888
|
-
/**
|
|
6889
|
-
* Селектор группы для устанавливаемых метатегов.
|
|
6890
|
-
*/
|
|
6891
|
-
this.dataGroupSelector = 'seo-tags';
|
|
6892
|
-
/**
|
|
6893
|
-
* Объект {@link Document}, предоставляющий доступ к DOM страницы.
|
|
6894
|
-
*/
|
|
6895
|
-
this.document = inject(DOCUMENT);
|
|
6896
|
-
/**
|
|
6897
|
-
* Название компании.
|
|
6898
|
-
*/
|
|
6899
|
-
this.companyName = inject(SC_COMPANY_NAME);
|
|
6900
|
-
this.setShareType('website');
|
|
6901
|
-
}
|
|
6902
|
-
/**
|
|
6903
|
-
* Устанавливает meta-теги.
|
|
6904
|
-
*
|
|
6905
|
-
* @param title Заголовок страницы.
|
|
6906
|
-
* @param description Описание страницы.
|
|
6907
|
-
* @param keywords Ключевые слова страницы.
|
|
6908
|
-
* @param emitEventAfterSet Признак того, необходимо ли генерировать событие, после установки тегов. По умолчанию {@link true}.
|
|
6909
|
-
* @param robots Список robots тегов для страницы.
|
|
6910
|
-
*/
|
|
6911
|
-
setPageMetaTags(title = this.defaultSeo.title, description = this.defaultSeo.description, keywords = this.defaultSeo.keywords, emitEventAfterSet = true, robots = ['index', 'follow']) {
|
|
6912
|
-
this.setPageTitle(title);
|
|
6913
|
-
this.setPageMetaDescription(description);
|
|
6914
|
-
this.setPageMetaKeywords(keywords);
|
|
6915
|
-
this.setPageMetaRobots(robots);
|
|
6916
|
-
if (emitEventAfterSet) {
|
|
6917
|
-
this.isSetMetaTagsEventEmitter.emit();
|
|
6918
|
-
}
|
|
6919
|
-
}
|
|
6920
|
-
/**
|
|
6921
|
-
* Устанавливает Open Graph meta-теги.
|
|
6922
|
-
*
|
|
6923
|
-
* @param ogTitle Open Graph заголовок.
|
|
6924
|
-
* @param ogDescription Open Graph описание.
|
|
6925
|
-
* @param ogImg Open Graph изображение.
|
|
6926
|
-
* @param emitEventAfterSet Признак того, необходимо ли генерировать событие, после установки тегов. По умолчанию {@link true}.
|
|
6927
|
-
*/
|
|
6928
|
-
setPageOpenGraphMetaTags(ogTitle = this.defaultSeo.title, ogDescription = this.defaultSeo.description, ogImg = this.urls.logoUrl, emitEventAfterSet = true) {
|
|
6929
|
-
this.setOpenGraphMetaTags(ogTitle, ogDescription, `${this.urls.siteUrl}${this.router.url}`, ogImg);
|
|
6930
|
-
if (emitEventAfterSet) {
|
|
6931
|
-
this.isSetMetaTagsEventEmitter.emit();
|
|
6932
|
-
}
|
|
6933
|
-
}
|
|
6934
|
-
/**
|
|
6935
|
-
* Устанавливает все meta-теги из пришедшего источника. Если какого-то тега нет, будет установлено значение по умолчанию.
|
|
6936
|
-
*
|
|
6937
|
-
* @param resource Источник meta - тегов.
|
|
6938
|
-
* @param img Изображение. Если не пришло, то будет установлено значение по умолчанию.
|
|
6939
|
-
* @param robots Список robots тегов для страницы.
|
|
6940
|
-
*/
|
|
6941
|
-
setMetaTagsFromResource(resource, img = this.urls.logoUrl, robots = ['index', 'follow']) {
|
|
6942
|
-
this.setAllPageMetaTags(resource?.title, resource?.description, resource?.keywords, img, resource?.meta, robots);
|
|
6943
|
-
}
|
|
6944
|
-
/**
|
|
6945
|
-
* Устанавливает все meta-теги страницы со значением по умолчанию, внедряя туда заголовок, если он передан.
|
|
6946
|
-
*
|
|
6947
|
-
* @param title Заголовок страницы.
|
|
6948
|
-
* @param robots Список robots тегов для страницы.
|
|
6949
|
-
*/
|
|
6950
|
-
setDefaultAllPageMetaTags(title = this.defaultSeo.title, robots = ['index', 'follow']) {
|
|
6951
|
-
this.setAllPageMetaTags(`${title} - ${this.companyName}`, `${title}, ${this.defaultSeo.description}`, undefined, undefined, [], robots);
|
|
6952
|
-
}
|
|
6953
|
-
/**
|
|
6954
|
-
* Устанавливает все meta-теги страницы со значением по умолчанию, внедряя туда заголовок, если он передан. Устанавливает значение "не индексировать" для поисковых роботов.
|
|
6955
|
-
*
|
|
6956
|
-
* @param title Заголовок страницы.
|
|
6957
|
-
*/
|
|
6958
|
-
setNoIndexDefaultAllPageMetaTags(title = this.defaultSeo.title) {
|
|
6959
|
-
this.setAllPageMetaTags(`${title} - ${this.companyName}`, `${title}, ${this.defaultSeo.description}`, undefined, undefined, [], ['noindex', 'nofollow', 'noarchive']);
|
|
6960
|
-
}
|
|
6961
|
-
/**
|
|
6962
|
-
* Устанавливает все meta-теги страницы. Если какой-либо из параметров не указан, для него устанавливается значение по умолчанию.
|
|
6963
|
-
*
|
|
6964
|
-
* @param title Заголовок страницы.
|
|
6965
|
-
* @param description Описание страницы.
|
|
6966
|
-
* @param keywords Ключевые слова страницы.
|
|
6967
|
-
* @param img Изображение.
|
|
6968
|
-
* @param meta Массив дополнительных значений метатегов.
|
|
6969
|
-
* @param robots Список robots тегов для страницы.
|
|
6970
|
-
*/
|
|
6971
|
-
setAllPageMetaTags(title = this.defaultSeo.title, description = this.defaultSeo.description, keywords = this.defaultSeo.keywords, img = this.urls.logoUrl, meta = [], robots = ['index', 'follow']) {
|
|
6972
|
-
this.removeMetaTags();
|
|
6973
|
-
this.setPageTitle(title);
|
|
6974
|
-
this.setPageMetaDescription(description);
|
|
6975
|
-
this.setPageMetaKeywords(keywords);
|
|
6976
|
-
this.setOpenGraphMetaTags(title, description, `${this.urls.siteUrl}${this.router.url}`, img);
|
|
6977
|
-
meta.forEach((tag) => {
|
|
6978
|
-
this.setPageMetaByName(tag.name, tag.content);
|
|
6979
|
-
});
|
|
6980
|
-
this.setPageMetaRobots(robots);
|
|
6981
|
-
this.isSetMetaTagsEventEmitter.emit();
|
|
6982
|
-
}
|
|
6983
|
-
/**
|
|
6984
|
-
* Устанавливает meta-тег robots для страницы.
|
|
6985
|
-
*
|
|
6986
|
-
* @param robots Список robots тегов для страницы.
|
|
6987
|
-
*/
|
|
6988
|
-
setPageMetaRobots(robots) {
|
|
6989
|
-
this.setPageMetaByName('robots', robots.join(', '));
|
|
6990
|
-
}
|
|
6991
|
-
/**
|
|
6992
|
-
* Удаляет все установленные meta-теги.
|
|
6993
|
-
*/
|
|
6994
|
-
removeMetaTags() {
|
|
6995
|
-
const tags = this.document.querySelectorAll(`meta[data-group="${this.dataGroupSelector}"]`);
|
|
6996
|
-
tags.forEach((tag) => {
|
|
6997
|
-
this.metaService.removeTagElement(tag);
|
|
6998
|
-
});
|
|
6999
|
-
}
|
|
7000
|
-
/**
|
|
7001
|
-
* Возвращает сгенерированный SEO-resource с указанными параметрами.
|
|
7002
|
-
*
|
|
7003
|
-
* @param seo Данные SEO ресурса.
|
|
7004
|
-
* @param defaultTitle Заголовок страницы используемый в случае отсутствия заголовка в SEO-ресурсе.
|
|
7005
|
-
* @param defaultDescription Описание страницы используемое в случае отсутствия описания в SEO-ресурсе.
|
|
7006
|
-
* @param defaultKeyWords Ключевые слова страницы используемые в случае отсутствия ключевых слов в SEO-ресурсе.
|
|
7007
|
-
*/
|
|
7008
|
-
getGenerateSeoResource(seo, defaultTitle, defaultDescription = this.defaultSeo.description, defaultKeyWords = this.defaultSeo.keywords) {
|
|
7009
|
-
return {
|
|
7010
|
-
title: seo?.title ?? defaultTitle,
|
|
7011
|
-
description: seo?.description ?? defaultDescription,
|
|
7012
|
-
keywords: seo?.keywords ?? defaultKeyWords,
|
|
7013
|
-
meta: seo?.meta,
|
|
7014
|
-
};
|
|
7015
|
-
}
|
|
7016
|
-
/**
|
|
7017
|
-
* Устанавливает title-заголовок страницы.
|
|
7018
|
-
*
|
|
7019
|
-
* @param title Заголовок страницы.
|
|
7020
|
-
* @param appendDefaultTitle Флаг необходимости добавить заголовок по умолчанию в конец заголовка страницы.
|
|
7021
|
-
*/
|
|
7022
|
-
setPageTitle(title, appendDefaultTitle = false) {
|
|
7023
|
-
this.titleService.setTitle(title + (appendDefaultTitle ? ` - ${this.defaultSeo.title}` : ''));
|
|
7024
|
-
}
|
|
7025
|
-
/**
|
|
7026
|
-
* Устанавливает meta-описание страницы.
|
|
7027
|
-
*
|
|
7028
|
-
* @param description Meta-описание страницы.
|
|
7029
|
-
*/
|
|
7030
|
-
setPageMetaDescription(description) {
|
|
7031
|
-
this.setPageMetaByName('description', description);
|
|
7032
|
-
}
|
|
7033
|
-
/**
|
|
7034
|
-
* Устанавливает meta-ключевые слова страницы.
|
|
7035
|
-
*
|
|
7036
|
-
* @param keywords Meta-ключевые слова страницы.
|
|
7037
|
-
*/
|
|
7038
|
-
setPageMetaKeywords(keywords) {
|
|
7039
|
-
this.setPageMetaByName('keywords', keywords);
|
|
7040
|
-
}
|
|
7041
|
-
/**
|
|
7042
|
-
* Устанавливает Open Graph meta-теги страницы для социальных сетей.
|
|
7043
|
-
*
|
|
7044
|
-
* @param title Заголовок страницы.
|
|
7045
|
-
* @param description Описание страницы.
|
|
7046
|
-
* @param url Ссылка на страницу.
|
|
7047
|
-
* @param img Изображение.
|
|
7048
|
-
*/
|
|
7049
|
-
setOpenGraphMetaTags(title, description, url, img) {
|
|
7050
|
-
this.setOpenGraphMetaByProperty('og:title', title);
|
|
7051
|
-
this.setOpenGraphMetaByProperty('og:url', url);
|
|
7052
|
-
this.setOpenGraphMetaByProperty('og:image', img);
|
|
7053
|
-
this.setOpenGraphMetaByProperty('og:description', description);
|
|
7054
|
-
this.setOpenGraphMetaByProperty('og:type', 'website');
|
|
7055
|
-
}
|
|
7056
|
-
/**
|
|
7057
|
-
* Устанавливает meta-тег страницы с указанным именем.
|
|
7058
|
-
* Будет создан или обновлён заголовок вида `<meta name="{name}" content="{content}" />`
|
|
7059
|
-
*
|
|
7060
|
-
* @param name Название заголовка.
|
|
7061
|
-
* @param content Содержимое заголовка.
|
|
7062
|
-
*/
|
|
7063
|
-
setPageMetaByName(name, content) {
|
|
7064
|
-
this.metaService.updateTag({ name: name, content: content, 'data-group': this.dataGroupSelector });
|
|
7065
|
-
}
|
|
7066
|
-
/**
|
|
7067
|
-
* Устанавливает Open Graph meta-тег по свойству атрибута property.
|
|
7068
|
-
*
|
|
7069
|
-
* @param property Свойство атрибута.
|
|
7070
|
-
* @param content Содержимое тега.
|
|
7071
|
-
*/
|
|
7072
|
-
setOpenGraphMetaByProperty(property, content) {
|
|
7073
|
-
this.metaService.updateTag({ property: property, content: content, 'data-group': this.dataGroupSelector });
|
|
7074
|
-
}
|
|
7075
|
-
/**
|
|
7076
|
-
* Устанавливает Open Graph мета-тег типа объекта.
|
|
7077
|
-
*
|
|
7078
|
-
* @param type Тип объекта.
|
|
7079
|
-
*/
|
|
7080
|
-
setShareType(type) {
|
|
7081
|
-
this.setOpenGraphMetaByProperty('og:type', type);
|
|
7082
|
-
}
|
|
7083
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
7084
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, providedIn: 'root' }); }
|
|
7085
|
-
}
|
|
7086
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImport: i0, type: ScSeoService, decorators: [{
|
|
7087
|
-
type: Injectable,
|
|
7088
|
-
args: [{
|
|
7089
|
-
providedIn: 'root',
|
|
7090
|
-
}]
|
|
7091
|
-
}], ctorParameters: () => [] });
|
|
7092
|
-
|
|
7093
7242
|
/**
|
|
7094
7243
|
* Сервис, содержащий вспомогательные методы для работы с телефонными номерами.
|
|
7095
7244
|
*/
|
|
@@ -7408,5 +7557,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.12", ngImpo
|
|
|
7408
7557
|
* Generated bundle index. Do not edit.
|
|
7409
7558
|
*/
|
|
7410
7559
|
|
|
7411
|
-
export { EMPTY_CART, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartItem, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogService, ScCategory, ScClientType, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScISalesDirectionCart, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScImage, ScImageHelper, ScJsonLdComponent, ScJsonLdModule, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScReferenceName, ScReferencesService, ScRequisitesService, ScRouteKeys, ScSearchService, ScSeoResource, ScSeoService, ScSocialType, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, filterChangedByKey, runningOnTerminalFactory, searchTermFactory };
|
|
7560
|
+
export { CATEGORY_INFO, CATEGORY_PROVIDERS, EMPTY_CART, ERROR_HANDLER, IS_BROWSER, IS_RUNNING_ON_TERMINAL, IS_SERVER, RESPONSE, SC_ACCESS_AUTH_TOKEN_STORAGE_KEY, SC_API_KEYS, SC_AUTH_ADD_HEADER_REQUIRED, SC_AUTH_AS_CLIENT_DEFAULT_OPTIONS, SC_AUTH_AS_CLIENT_OPTIONS, SC_CACHE_LIFETIME, SC_CACHE_SETTINGS, SC_CATALOG_PAGE_META, SC_COMPANY_INFO, SC_COMPANY_NAME, SC_CONFIGURATOR_COMPONENTS, SC_CONFIGURATOR_SETTINGS, SC_COUNT_FIRST_DISCOUNTED_PRODUCTS, SC_COUNT_LAST_NEWS, SC_DATE_FORMAT, SC_DEFAULT_PAGE_META, SC_FEEDBACK_API, SC_GUEST_ENDPOINTS_TOKEN, SC_GUEST_PARAMETER_NAME_TOKEN, SC_GUEST_TOKEN_STORAGE_KEY, SC_ID_OR_SLUG_IN_ROUTE, SC_IS_HEADER_REQUIRED, SC_IS_HIDDEN_ERROR_ALERT, SC_IS_HIDDEN_ERROR_ALERT_HTTP_CONTEXT, SC_IS_LOGOUT_REQUEST, SC_IS_REFRESH_REQUIRED, SC_LINEAR_VALUES, SC_LINEAR_VALUES_TOKEN, SC_MAX_LENGTH_SEARCH_TERM, SC_MIN_LENGTH_SEARCH_TERM, SC_NEXT_PAGE_PAGINATION_CLICK, SC_PATH_IMAGE_NOT_FOUND, SC_PRODUCT_PAGINATION_DEFAULT_OPTIONS, SC_PRODUCT_PAGINATION_OPTIONS, SC_REFRESH_AUTH_TOKEN_STORAGE_KEY, SC_RELEASE, SC_UPDATE_INTERVAL, SC_URLS, SC_USER_INFO, SC_VACANCIES_DATA_SOURCE, SC_VIRTUAL_CATEGORY_INFO, SC_VIRTUAL_CATEGORY_PROVIDERS, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScAuthAsClientGuard, ScAuthInterceptor, ScAuthService, ScBanner, ScBannerService, ScCacheInterceptor, ScCacheSettings, ScCachedData, ScCachedItem, ScCart, ScCartItem, ScCartService, ScCatalogFilterService, ScCatalogFormat, ScCatalogService, ScCategory, ScClientType, ScConfiguratorService, ScContactsService, ScContragentService, ScConvertInterceptor, ScConvertersService, ScDateFormatInterceptor, ScDeliveryAddressService, ScDeliveryCost, ScDeliveryType, ScDocumentInfoNode, ScDocumentInfoTypesEnum, ScErrorsInterceptor, ScFavoriteService, ScFeedbackForms, ScFeedbackService, ScFilesService, ScFrequentlyAskedQuestionsService, ScGuestInterceptor, ScISalesDirectionCart, ScISuggestionType, ScIconTypesEnum, ScIdOrSlugGuard, ScIdOrSlugPipe, ScImage, ScImageHelper, ScJsonLdComponent, ScJsonLdModule, ScLocationsService, ScMediaImageTransformerPipe, ScMimeTypes, ScNews, ScNewsService, ScNotificationActionTypes, ScNotificationLevelNames, ScNotificationsService, ScOpfList, ScOptionsInterceptor, ScOrder, ScOrderShort, ScOrderStateStatus, ScOrdersService, ScPaginationService, ScPaymentStatus, ScPaymentType, ScPhoneService, ScProduct, ScProductTileType, ScQuestionnaireService, ScQuestionnaireStatusEnum, ScReclamationService, ScReclamationStatus, ScRecommendationService, ScReferenceName, ScReferencesService, ScRequisitesService, ScRouteKeys, ScSearchService, ScSeoResource, ScSeoService, ScSocialType, ScSuggestionService, ScSum, ScTokenService, ScUIService, ScUTMService, ScUnitsHelper, ScUploadedFile, ScUser, ScUserMetadata, ScUserMetrikaGoalsEnum, ScUserMetrikaService, ScUserService, ScUserType, ScVCardService, ScVacanciesList, ScVacanciesService, ScVacancy, ScVerificationService, ScVirtualCategory, ScWarehouseService, TERMINAL_PROVIDERS, USER_AGENT_TERMINAL, categorySeoGuard, filterChangedByKey, productSeoGuard, runningOnTerminalFactory, searchTermFactory, virtualCategorySeoGuard };
|
|
7412
7561
|
//# sourceMappingURL=snabcentr-client-core.mjs.map
|