@snabcentr/client-ui 0.17.3 → 0.18.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.

Potentially problematic release.


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

@@ -5,13 +5,13 @@ import { Subject, filter, map, switchMap, tap, catchError, of, finalize, startWi
5
5
  import * as i1 from '@snabcentr/client-core';
6
6
  import { ScUserMetrikaGoalsEnum, SC_URLS, SC_PATH_IMAGE_NOT_FOUND, SEARCH_TERM, SEARCH_TERM_PROVIDERS, ScCatalogService, ScCartService, ScAuthService, ScISuggestionType, ScOpfList, ScIconTypesEnum, ScUserService } from '@snabcentr/client-core';
7
7
  import * as i2 from '@angular/common';
8
- import { CommonModule, formatDate } from '@angular/common';
8
+ import { CommonModule } from '@angular/common';
9
9
  import * as i4 from '@taiga-ui/core';
10
- import { TuiTextfieldControllerModule, TuiLinkModule, TuiButtonModule, TuiLabelModule, TuiModeModule, TuiErrorModule, TuiLoaderModule, tuiFadeIn, tuiFormatNumber, TuiSvgModule, TuiHintModule, TuiFormatNumberPipeModule, TuiDataListModule, TuiNotificationModule, TuiFormatPhonePipeModule } from '@taiga-ui/core';
10
+ import { TuiTextfieldControllerModule, TuiLinkModule, TuiButtonModule, TuiLabelModule, TuiModeModule, TuiErrorModule, TuiLoaderModule, tuiFadeIn, TUI_MONTHS, TuiSvgModule, TuiHintModule, TuiFormatNumberPipeModule, TuiDataListModule, TuiNotificationModule, TuiFormatPhonePipeModule } from '@taiga-ui/core';
11
11
  import * as i3 from '@angular/forms';
12
12
  import { FormGroupDirective, FormGroup, FormControl, Validators, FormsModule, ReactiveFormsModule, NgControl, FormArray } from '@angular/forms';
13
13
  import * as i6 from '@taiga-ui/cdk';
14
- import { tuiControlValue, tuiIsFalsy, TuiLetModule, tuiCreateToken, AbstractTuiNullableControl, TUI_IS_MOBILE, tuiPure, tuiIsPresent, TuiDestroyService, TuiRepeatTimesModule, tuiMarkControlAsTouchedAndValidate, ALWAYS_TRUE_HANDLER } from '@taiga-ui/cdk';
14
+ import { tuiControlValue, tuiIsFalsy, TuiLetModule, tuiCreateToken, AbstractTuiNullableControl, TUI_IS_MOBILE, tuiPure, TuiDay, TuiDayRange, TuiMonth, tuiIsPresent, TuiDestroyService, TuiRepeatTimesModule, tuiMarkControlAsTouchedAndValidate, ALWAYS_TRUE_HANDLER } from '@taiga-ui/cdk';
15
15
  import * as i4$1 from '@taiga-ui/kit';
16
16
  import { TuiInputPasswordModule, TuiInputModule, TuiFieldErrorPipeModule, TuiInputPhoneModule, TuiAccordionItemComponent, TuiAccordionModule, TuiElasticContainerModule, TuiCarouselModule, TUI_NUMBER_VALUE_TRANSFORMER, TuiInputNumberComponent, TuiIslandModule, TuiInputNumberModule, TuiHighlightModule, TuiCarouselComponent, TuiComboBoxModule, TuiDataListWrapperModule, TuiFilterByInputPipeModule, TuiStringifyContentPipeModule, TuiSelectModule, TuiTreeService, TuiTreeItemContentComponent, TUI_TREE_START, TUI_TREE_CONTENT, TUI_TREE_LOADING, TUI_TREE_LOADER, TuiTreeModule, TuiCheckboxModule, TuiCheckboxLabeledModule } from '@taiga-ui/kit';
17
17
  import * as i6$1 from '@maskito/angular';
@@ -27,14 +27,10 @@ import * as i7$1 from '@taiga-ui/addon-preview';
27
27
  import { TuiPreviewDialogService, TuiPreviewModule } from '@taiga-ui/addon-preview';
28
28
  import * as i9 from '@taiga-ui/addon-commerce';
29
29
  import { TuiCurrencyPipeModule } from '@taiga-ui/addon-commerce';
30
- import * as i2$2 from 'ngx-echarts';
31
- import { NgxEchartsModule } from 'ngx-echarts';
32
- import { LineChart } from 'echarts/charts';
33
- import { TitleComponent, TooltipComponent, GridComponent } from 'echarts/components';
34
- import * as echarts from 'echarts/core';
35
- import { SVGRenderer } from 'echarts/renderers';
30
+ import * as i3$1 from '@taiga-ui/addon-charts';
31
+ import { TuiLineDaysChartModule, TuiAxesModule } from '@taiga-ui/addon-charts';
36
32
  import { HttpErrorResponse } from '@angular/common/http';
37
- import * as i3$1 from '@taiga-ui/layout';
33
+ import * as i3$2 from '@taiga-ui/layout';
38
34
  import { TuiBlockStatusModule } from '@taiga-ui/layout';
39
35
 
40
36
  /**
@@ -1755,185 +1751,107 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
1755
1751
  args: ['attr.data-size']
1756
1752
  }] } });
1757
1753
 
1758
- /**
1759
- * Настройки отрисовки графика.
1760
- *
1761
- * @see [Документация](https://echarts.apache.org/en/option.html#title)
1762
- */
1763
- const scChartOption = {
1764
- grid: {
1765
- top: 12,
1766
- left: 64,
1767
- right: 0,
1768
- bottom: 24
1769
- },
1770
- tooltip: {
1771
- trigger: 'axis',
1772
- formatter: (params) => {
1773
- const data = Array.isArray(params) ? params[0].data : params.data;
1774
- const date = new Date(data.value[0]);
1775
- const nextDate = new Date(data.value[2]);
1776
- return `
1777
- <div class="text-center text-black">
1778
- <span class="font-bold">${data.value[1]} ₽</span>
1779
- </br>
1780
- <span class="text-xs">${formatDate(date, 'dd.MM', 'en')} - ${formatDate(nextDate, 'dd.MM', 'en')}</span>
1781
- </div>
1782
- `;
1783
- },
1784
- axisPointer: {
1785
- animation: false,
1786
- type: 'cross'
1787
- },
1788
- textStyle: {
1789
- fontFamily: 'Roboto, "Helvetica Neue", sans-serif'
1790
- }
1791
- },
1792
- xAxis: {
1793
- type: 'time',
1794
- splitLine: {
1795
- show: false
1796
- },
1797
- axisLine: {
1798
- show: false
1799
- },
1800
- axisTick: {
1801
- show: false
1802
- },
1803
- axisLabel: {
1804
- hideOverlap: true
1805
- },
1806
- boundaryGap: ['3%', '3%']
1807
- },
1808
- yAxis: {
1809
- splitLine: {
1810
- show: false
1811
- },
1812
- axisLine: {
1813
- show: false
1814
- },
1815
- axisTick: {
1816
- show: false
1817
- },
1818
- axisLabel: {
1819
- formatter: (value) => tuiFormatNumber(value)
1820
- },
1821
- type: 'value',
1822
- boundaryGap: [0, '100%']
1823
- },
1824
- series: {
1825
- name: 'История цены',
1826
- type: 'line',
1827
- showSymbol: false,
1828
- symbolSize: 12,
1829
- itemStyle: {
1830
- color: '#ffcc40'
1831
- }
1832
- }
1833
- };
1834
-
1835
1754
  /**
1836
1755
  * График истории цен товара или услуги.
1837
- * TODO: TASK[#7482] Перепроверить возможность использования TuiLineDaysChart.
1838
1756
  */
1839
1757
  class ScPriceHistoryComponent {
1840
1758
  /**
1841
1759
  * Инициализирует экземпляр класса {@link ScPriceHistoryComponent}.
1842
1760
  *
1843
- * @param cdr Объект для работы с обнаружением изменений.
1761
+ * @param catalogService Сервис для работы с каталогом.
1762
+ * @param months$ Перечисление месяцев.
1763
+ * @param context Контекст диалогового окна, в котором открыт компонент.
1844
1764
  */
1845
- constructor(cdr) {
1846
- this.cdr = cdr;
1847
- /**
1848
- * Настройки графика.
1849
- */
1850
- this.initOption = { locale: 'RU' };
1765
+ constructor(catalogService, months$, context) {
1766
+ this.catalogService = catalogService;
1767
+ this.months$ = months$;
1768
+ this.context = context;
1851
1769
  /**
1852
- * Параметры отрисовки графика истории цены.
1770
+ * {@link Observable} функция для преобразования значения number в строку в подсказке по оси X.
1853
1771
  */
1854
- this.chartOption = scChartOption;
1772
+ this.xStringify$ = this.months$.pipe(map((months) => ({ month, day }) =>
1773
+ // eslint-disable-next-line security/detect-object-injection
1774
+ `${months[month]}, ${day}`));
1855
1775
  /**
1856
- * Данные об истории цены на товар или услугу.
1776
+ * Функция для преобразования значения number в строку в подсказке по оси Y.
1777
+ *
1778
+ * @param value Значение оси Y.
1857
1779
  */
1858
- this.data = [];
1780
+ this.yStringify = (value) => `${value.toLocaleString('ru-RU')} ₽`;
1781
+ if (context) {
1782
+ this.product = context.data.product;
1783
+ }
1859
1784
  }
1860
1785
  /** @inheritDoc */
1861
1786
  ngOnInit() {
1862
- if (this.chartOption.series && !Array.isArray(this.chartOption.series)) {
1863
- this.chartOption.series.data = [];
1864
- }
1865
- Object.keys(this.history)
1866
- .map((key) => {
1867
- // ? Можно избежать переведя даты в api в формат ECMAScript® 2023: https://tc39.es/ecma262/#sec-date-time-string-format
1868
- const dataString = key.split('.').reverse();
1869
- const data = new Date(+dataString[0], +dataString[1] - 1, +dataString[2]);
1870
- return { data: data, cost: this.history[String(key)].cost };
1871
- })
1872
- .sort((a, b) => +a.data - +b.data)
1873
- .forEach((item, index, array) => {
1874
- let nextDate;
1875
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1876
- if (array[index + 1]?.data) {
1877
- nextDate = new Date(array[index + 1]?.data);
1878
- nextDate.setDate(nextDate.getDate() - 1);
1879
- }
1880
- else {
1881
- nextDate = new Date();
1882
- }
1883
- this.pushDataItem(item.cost, item.data, nextDate);
1884
- });
1885
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
1886
- if (this.eChartsInstance) {
1887
- this.setChartData();
1888
- }
1787
+ this.history$ = this.catalogService.getPriceHistory$(this.product).pipe(map((history) => Object.keys(history)
1788
+ .map((item) => [TuiDay.normalizeParse(item, 'DMY'), history[String(item)].cost])
1789
+ .sort((a, b) => (a[0] > b[0] ? 1 : -1))), shareReplay({ bufferSize: 1, refCount: true }), filter((history) => history.length > 1));
1790
+ this.priceInfo$ = this.history$.pipe(map((history) => history.map((item) => item[1])), map((values) => ({
1791
+ min: Math.min(...values),
1792
+ max: Math.max(...values),
1793
+ })));
1794
+ this.range$ = this.history$.pipe(map((value) => ({ from: value.at(0)?.[0], to: value.at(-1)?.[0] })), filter((range) => !!range.from && !!range.to), map((range) => {
1795
+ return new TuiDayRange(range.from, range.to);
1796
+ }));
1889
1797
  }
1890
1798
  /**
1891
- * Перехватчик жизненного цикла {@link ECharts}, который вызывается при его инициализации.
1799
+ * Вычисляет подписи даты к оси X.
1892
1800
  *
1893
- * @param eChartsInstance Экземпляр {@link ECharts}.
1894
- */
1895
- // eslint-disable-next-line unicorn/prevent-abbreviations
1896
- onChartInit(eChartsInstance) {
1897
- this.eChartsInstance = eChartsInstance;
1898
- if (this.data.length > 0) {
1899
- this.setChartData();
1900
- }
1901
- }
1902
- /**
1903
- * Устанавливает новые данные {@link ScPriceHistoryComponent.eChartsInstance}.
1801
+ * @param param0 {@link TuiDayRange} Временной промежуток истории цен.
1802
+ * @param param0.from {@link TuiDay} Дата начала истории цен.
1803
+ * @param param0.to {@link TuiDay} Дата конца истории цен.
1904
1804
  */
1905
- setChartData() {
1906
- if (this.chartOption.series && !Array.isArray(this.chartOption.series)) {
1907
- this.maxPrice = Math.max(...this.data.map((item) => item.value[1]));
1908
- this.minPrice = Math.min(...this.data.map((item) => item.value[1]));
1909
- this.chartOption.series.data = this.data;
1910
- this.eChartsInstance.clear();
1911
- this.eChartsInstance.setOption(this.chartOption, true, true);
1912
- this.cdr.markForCheck();
1913
- }
1805
+ computeLabels$({ from, to }) {
1806
+ return this.months$.pipe(map((months) => Array.from({ length: TuiMonth.lengthBetween(from, to) + 1 }, (_, index) => months[from.append({ month: index }).month])));
1914
1807
  }
1915
1808
  /**
1916
- * Добавляет значение цены товара в массив истории цен.
1809
+ * Вычисляет данные для отображения на графике.
1917
1810
  *
1918
- * @param value Цена товара или услуги.
1919
- * @param date Дата установки цены.
1920
- * @param nextDate Следующая дата установки цены.
1811
+ * @param param0 {@link TuiDayRange} Временной промежуток истории цен.
1812
+ * @param param0.from {@link TuiDay} Дата начала истории цен.
1813
+ * @param param0.to {@link TuiDay} Дата конца истории цен.
1814
+ * @param history История цен.
1921
1815
  */
1922
- pushDataItem(value, date, nextDate) {
1923
- this.data.push({
1924
- name: date.toString(),
1925
- value: [date, value, nextDate],
1926
- });
1816
+ computeValue({ from, to }, history) {
1817
+ return (Array.from({ length: TuiDay.lengthBetween(from, to) + 1 })
1818
+ .fill(0)
1819
+ // eslint-disable-next-line unicorn/no-array-reduce
1820
+ .reduce((array, _, index) => {
1821
+ const data = from.append({ day: index });
1822
+ return [
1823
+ ...array,
1824
+ [
1825
+ data,
1826
+ (history.find((valueHistory, indexHistory, arrayHistory) => data.daySame(valueHistory[0]) || data.dayBefore(arrayHistory[indexHistory + 1][0])) ??
1827
+ history[0])[1],
1828
+ ],
1829
+ ];
1830
+ }, []));
1927
1831
  }
1928
1832
  }
1929
- ScPriceHistoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScPriceHistoryComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
1930
- ScPriceHistoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScPriceHistoryComponent, selector: "sc-price-history", inputs: { history: "history" }, ngImport: i0, template: "<div class=\"flex flex-col items-center\">\n <div *ngIf=\"maxPrice && minPrice\" class=\"w-full font-bold text-end text-lg mb-1\">\u043E\u0442 {{ minPrice.toLocaleString() }} \u20BD \u0434\u043E {{ maxPrice.toLocaleString() }} \u20BD</div>\n <div class=\"relative w-full h-56\">\n <div class=\"h-48 bg-tui-base-02 mt-2 absolute rounded right-0 left-16\"></div>\n <div echarts [initOpts]=\"initOption\" (chartInit)=\"onChartInit($event)\" [options]=\"chartOption\" class=\"w-full !h-full touch-none\"></div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2$2.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "loading", "initOpts", "merge", "autoResize", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartPieSelectChanged", "chartPieSelected", "chartPieUnselected", "chartMapSelectChanged", "chartMapSelected", "chartMapUnselected", "chartAxisAreaSelected", "chartFocusNodeAdjacency", "chartUnfocusNodeAdjacency", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartRendered", "chartFinished"], exportAs: ["echarts"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1833
+ ScPriceHistoryComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScPriceHistoryComponent, deps: [{ token: i1.ScCatalogService }, { token: TUI_MONTHS }, { token: POLYMORPHEUS_CONTEXT, optional: true }], target: i0.ɵɵFactoryTarget.Component });
1834
+ ScPriceHistoryComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScPriceHistoryComponent, selector: "sc-price-history", inputs: { product: "product" }, ngImport: i0, template: "<div class=\"flex flex-col items-center\">\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <tui-line-days-chart\n class=\"chart\"\n [height]=\"priceInfo.max\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (priceInfo.min * 1) / 4\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n ></tui-line-days-chart>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3$1.TuiLineDaysChartComponent, selector: "tui-line-days-chart", inputs: ["value", "y", "height", "smoothingFactor", "hintContent", "xStringify", "yStringify", "dots"] }, { kind: "component", type: i3$1.TuiAxesComponent, selector: "tui-axes", inputs: ["axisX", "axisXLabels", "axisY", "axisYInset", "axisYLabels", "axisYName", "axisYSecondaryInset", "axisYSecondaryLabels", "axisYSecondaryName", "horizontalLines", "horizontalLinesHandler", "verticalLines", "verticalLinesHandler"] }, { kind: "pipe", type: i2.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
1835
+ __decorate([
1836
+ tuiPure
1837
+ ], ScPriceHistoryComponent.prototype, "computeLabels$", null);
1838
+ __decorate([
1839
+ tuiPure
1840
+ ], ScPriceHistoryComponent.prototype, "computeValue", null);
1931
1841
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScPriceHistoryComponent, decorators: [{
1932
1842
  type: Component,
1933
- args: [{ selector: 'sc-price-history', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col items-center\">\n <div *ngIf=\"maxPrice && minPrice\" class=\"w-full font-bold text-end text-lg mb-1\">\u043E\u0442 {{ minPrice.toLocaleString() }} \u20BD \u0434\u043E {{ maxPrice.toLocaleString() }} \u20BD</div>\n <div class=\"relative w-full h-56\">\n <div class=\"h-48 bg-tui-base-02 mt-2 absolute rounded right-0 left-16\"></div>\n <div echarts [initOpts]=\"initOption\" (chartInit)=\"onChartInit($event)\" [options]=\"chartOption\" class=\"w-full !h-full touch-none\"></div>\n </div>\n</div>\n" }]
1934
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { history: [{
1843
+ args: [{ selector: 'sc-price-history', changeDetection: ChangeDetectionStrategy.OnPush, template: "<div class=\"flex flex-col items-center\">\n <ng-container *ngIf=\"priceInfo$ | async as priceInfo; else isNotExist\">\n <div class=\"w-174 mb-1 text-end text-lg font-bold\">\u043E\u0442 {{ priceInfo.min.toLocaleString() }} \u20BD \u0434\u043E {{ priceInfo.max.toLocaleString() }} \u20BD</div>\n\n <ng-container *ngIf=\"history$ | async as history\">\n <div\n *ngIf=\"range$ | async as range\"\n class=\"relative h-56 w-full p-5 text-tui-primary\"\n >\n <tui-axes\n *ngIf=\"computeLabels$(range) | async as labels\"\n class=\"h-full\"\n [axisXLabels]=\"labels\"\n [horizontalLines]=\"4\"\n [verticalLines]=\"labels.length\"\n >\n <tui-line-days-chart\n class=\"chart\"\n [height]=\"priceInfo.max\"\n [smoothingFactor]=\"10\"\n [y]=\"priceInfo.min - (priceInfo.min * 1) / 4\"\n [value]=\"computeValue(range, history)\"\n [xStringify]=\"xStringify$ | async\"\n [yStringify]=\"yStringify\"\n [hintContent]=\"hint\"\n ></tui-line-days-chart>\n </tui-axes>\n </div>\n </ng-container>\n </ng-container>\n <ng-template #isNotExist>\n <p class=\"text-base font-bold\">\u0426\u0435\u043D\u0430 \u043D\u0430 \u0442\u043E\u0432\u0430\u0440 \u043D\u0435 \u0438\u0437\u043C\u0435\u043D\u044F\u043B\u0430\u0441\u044C</p>\n </ng-template>\n <ng-template\n #hint\n let-data\n >\n <div class=\"font-bold\">{{ data[1].toLocaleString() }} \u20BD</div>\n <div>{{ data[0] }}</div>\n </ng-template>\n</div>\n" }]
1844
+ }], ctorParameters: function () { return [{ type: i1.ScCatalogService }, { type: i10.Observable, decorators: [{
1845
+ type: Inject,
1846
+ args: [TUI_MONTHS]
1847
+ }] }, { type: undefined, decorators: [{
1848
+ type: Optional
1849
+ }, {
1850
+ type: Inject,
1851
+ args: [POLYMORPHEUS_CONTEXT]
1852
+ }] }]; }, propDecorators: { product: [{
1935
1853
  type: Input
1936
- }] } });
1854
+ }], computeLabels$: [], computeValue: [] } });
1937
1855
 
1938
1856
  /**
1939
1857
  * Значения пагинации списка товаров категории по умолчанию.
@@ -2061,123 +1979,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2061
1979
  type: Input
2062
1980
  }] } });
2063
1981
 
2064
- /**
2065
- * Language: Russian.
2066
- */
2067
- var scLangRU = {
2068
- time: {
2069
- month: ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'],
2070
- monthAbbr: ['Янв', 'Фев', 'Мар', 'Апр', 'Май', 'Июн', 'Июл', 'Авг', 'Сен', 'Окт', 'Ноя', 'Дек'],
2071
- dayOfWeek: ['Воскресенье', 'Понедельник', 'Вторник', 'Среда', 'Четверг', 'Пятница', 'Суббота'],
2072
- dayOfWeekAbbr: ['вс', 'пн', 'вт', 'ср', 'чт', 'пт', 'сб'],
2073
- },
2074
- legend: {
2075
- selector: {
2076
- all: 'Всё',
2077
- inverse: 'Обратить',
2078
- },
2079
- },
2080
- toolbox: {
2081
- brush: {
2082
- title: {
2083
- rect: 'Выделить область',
2084
- polygon: 'Инструмент «Лассо»',
2085
- lineX: 'Горизонтальное выделение',
2086
- lineY: 'Вертикальное выделение',
2087
- keep: 'Оставить выбранное',
2088
- clear: 'Очистить выбранное',
2089
- },
2090
- },
2091
- dataView: {
2092
- title: 'Данные',
2093
- lang: ['Данные', 'Закрыть', 'Обновить'],
2094
- },
2095
- dataZoom: {
2096
- title: {
2097
- zoom: 'Увеличить',
2098
- back: 'Сбросить увеличение',
2099
- },
2100
- },
2101
- magicType: {
2102
- title: {
2103
- line: 'Переключиться на линейный график',
2104
- bar: 'Переключиться на столбчатую диаграмму',
2105
- stack: 'Стопка',
2106
- tiled: 'Плитка',
2107
- },
2108
- },
2109
- restore: {
2110
- title: 'Восстановить',
2111
- },
2112
- saveAsImage: {
2113
- title: 'Сохранить картинку',
2114
- lang: ['Правый клик, чтобы сохранить картинку'],
2115
- },
2116
- },
2117
- series: {
2118
- typeNames: {
2119
- pie: 'Круговая диаграмма',
2120
- bar: 'Столбчатая диаграмма',
2121
- line: 'Линейный график',
2122
- scatter: 'Точечная диаграмма',
2123
- effectScatter: 'Точечная диаграмма с волнами',
2124
- radar: 'Лепестковая диаграмма',
2125
- tree: 'Дерево',
2126
- treemap: 'Плоское дерево',
2127
- boxplot: 'Ящик с усами',
2128
- candlestick: 'Свечной график',
2129
- k: 'График К-линий',
2130
- heatmap: 'Тепловая карта',
2131
- map: 'Карта',
2132
- parallel: 'Диаграмма параллельных координат',
2133
- lines: 'Линейный граф',
2134
- graph: 'Граф отношений',
2135
- sankey: 'Диаграмма Санкей',
2136
- funnel: 'Воронкообразная диаграмма',
2137
- gauge: 'Шкала',
2138
- pictorialBar: 'Столбец-картинка',
2139
- themeRiver: 'Тематическая река',
2140
- sunburst: 'Солнечные лучи',
2141
- custom: '',
2142
- chart: '',
2143
- },
2144
- },
2145
- aria: {
2146
- general: {
2147
- withTitle: 'Это график, показывающий "{title}"',
2148
- withoutTitle: 'Это график',
2149
- },
2150
- series: {
2151
- single: {
2152
- prefix: '',
2153
- withName: ' с типом {seriesType} и именем {seriesName}.',
2154
- withoutName: ' с типом {seriesType}.',
2155
- },
2156
- multiple: {
2157
- prefix: '. Он состоит из {seriesCount} серий.',
2158
- withName: ' Серия {seriesId} имеет тип {seriesType} и показывает {seriesName}.',
2159
- withoutName: ' Серия {seriesId} имеет тип {seriesType}.',
2160
- separator: {
2161
- middle: '',
2162
- end: '',
2163
- },
2164
- },
2165
- },
2166
- data: {
2167
- allData: 'Данные таковы: ',
2168
- partialData: 'Первые {displayCnt} элементов: ',
2169
- withName: 'значение для {name} — {value}',
2170
- withoutName: '{value}',
2171
- separator: {
2172
- middle: ', ',
2173
- end: '. ',
2174
- },
2175
- },
2176
- },
2177
- };
2178
-
2179
- echarts.registerLocale('RU', scLangRU);
2180
- echarts.use([TitleComponent, TooltipComponent, GridComponent, LineChart, SVGRenderer]);
2181
1982
  /**
2182
1983
  * Модуль каталога.
2183
1984
  */
@@ -2206,9 +2007,12 @@ ScCatalogModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version
2206
2007
  TuiFieldErrorPipeModule,
2207
2008
  TuiLoaderModule,
2208
2009
  TuiLinkModule,
2209
- TuiElasticContainerModule, i2$2.NgxEchartsModule, TuiLetModule,
2010
+ TuiElasticContainerModule,
2011
+ TuiLetModule,
2210
2012
  TuiRepeatTimesModule,
2211
- TuiHighlightModule], exports: [ScPriceListPaginationComponent,
2013
+ TuiHighlightModule,
2014
+ TuiLineDaysChartModule,
2015
+ TuiAxesModule], exports: [ScPriceListPaginationComponent,
2212
2016
  ScCategoryCardComponent,
2213
2017
  ScFavoriteBtnComponent,
2214
2018
  ScInputQuantityComponent,
@@ -2232,10 +2036,11 @@ ScCatalogModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version
2232
2036
  TuiLoaderModule,
2233
2037
  TuiLinkModule,
2234
2038
  TuiElasticContainerModule,
2235
- NgxEchartsModule.forRoot({ echarts }),
2236
2039
  TuiLetModule,
2237
2040
  TuiRepeatTimesModule,
2238
- TuiHighlightModule] });
2041
+ TuiHighlightModule,
2042
+ TuiLineDaysChartModule,
2043
+ TuiAxesModule] });
2239
2044
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScCatalogModule, decorators: [{
2240
2045
  type: NgModule,
2241
2046
  args: [{
@@ -2276,10 +2081,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImpor
2276
2081
  TuiLoaderModule,
2277
2082
  TuiLinkModule,
2278
2083
  TuiElasticContainerModule,
2279
- NgxEchartsModule.forRoot({ echarts }),
2280
2084
  TuiLetModule,
2281
2085
  TuiRepeatTimesModule,
2282
2086
  TuiHighlightModule,
2087
+ TuiLineDaysChartModule,
2088
+ TuiAxesModule,
2283
2089
  ],
2284
2090
  }]
2285
2091
  }] });
@@ -4391,7 +4197,7 @@ class ScPaymentStatusComponent {
4391
4197
  }
4392
4198
  }
4393
4199
  ScPaymentStatusComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScPaymentStatusComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4394
- ScPaymentStatusComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScPaymentStatusComponent, selector: "sc-payment-status", inputs: { status: "status", orderId: "orderId" }, outputs: { backToOrdersClick: "backToOrdersClick", backToOrderClick: "backToOrderClick" }, ngImport: i0, template: "<ng-container *ngIf=\"status && orderId; else failed\">\n <ng-container [ngSwitch]=\"status\">\n <tui-block-status *ngSwitchCase=\"'success'\">\n <tui-svg src=\"tuiIconCheckCircleLarge\" tuiSlot=\"top\" class=\"scale-[3] !h-20 !text-green-500\"></tui-svg>\n <h4>\u0421\u043F\u0430\u0441\u0438\u0431\u043E!</h4>\n <br />\n <div class=\"font-bold\">\u0412\u0430\u0448 \u0437\u0430\u043A\u0430\u0437 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u043F\u043B\u0430\u0447\u0435\u043D. \u041C\u044B \u0441\u0432\u044F\u0436\u0435\u043C\u0441\u044F \u0441 \u0432\u0430\u043C\u0438 \u0432 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043C\u044F.</div>\n <br />\n <div class=\"font-bold\">\n \u041D\u043E\u043C\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043E \u0437\u0430\u043A\u0430\u0437\u0430: <a tuiLink [pseudo]=\"true\" (click)=\"backToOrderClick.emit()\">{{orderId}}</a>\n </div>\n\n <button tuiButton (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n <tui-block-status *ngSwitchCase=\"'error'\">\n <tui-svg src=\"tuiIconXCircleLarge\" class=\"scale-[3] !h-20 !text-red-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u041E\u043F\u043B\u0430\u0442\u0430 \u043D\u0435 \u043F\u0440\u043E\u0448\u043B\u0430!</h4>\n <br />\n <div class=\"font-bold\">\u041F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u043F\u043B\u0430\u0442\u0435\u0436\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430.</div>\n <button tuiButton tuiItem (click)=\"backToOrderClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0443</button>\n </tui-block-status>\n </ng-container>\n</ng-container>\n\n<ng-template #failed>\n <tui-block-status>\n <tui-svg src=\"tuiIconInfoLarge\" class=\"scale-[3] !h-20 !text-yellow-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u0427\u0442\u043E-\u0442\u043E \u043F\u043E\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A!</h4>\n <button tuiButton tuiItem (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.TuiLinkComponent, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo", "icon", "iconAlign", "iconRotated", "mode"], exportAs: ["tuiLink"] }, { kind: "component", type: i4.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }, { kind: "component", type: i4.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { kind: "component", type: i3$1.TuiBlockStatusComponent, selector: "tui-block-status", inputs: ["card"] }, { kind: "directive", type: i3$1.TuiBlockStatusDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4200
+ ScPaymentStatusComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ScPaymentStatusComponent, selector: "sc-payment-status", inputs: { status: "status", orderId: "orderId" }, outputs: { backToOrdersClick: "backToOrdersClick", backToOrderClick: "backToOrderClick" }, ngImport: i0, template: "<ng-container *ngIf=\"status && orderId; else failed\">\n <ng-container [ngSwitch]=\"status\">\n <tui-block-status *ngSwitchCase=\"'success'\">\n <tui-svg src=\"tuiIconCheckCircleLarge\" tuiSlot=\"top\" class=\"scale-[3] !h-20 !text-green-500\"></tui-svg>\n <h4>\u0421\u043F\u0430\u0441\u0438\u0431\u043E!</h4>\n <br />\n <div class=\"font-bold\">\u0412\u0430\u0448 \u0437\u0430\u043A\u0430\u0437 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u043F\u043B\u0430\u0447\u0435\u043D. \u041C\u044B \u0441\u0432\u044F\u0436\u0435\u043C\u0441\u044F \u0441 \u0432\u0430\u043C\u0438 \u0432 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043C\u044F.</div>\n <br />\n <div class=\"font-bold\">\n \u041D\u043E\u043C\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043E \u0437\u0430\u043A\u0430\u0437\u0430: <a tuiLink [pseudo]=\"true\" (click)=\"backToOrderClick.emit()\">{{orderId}}</a>\n </div>\n\n <button tuiButton (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n <tui-block-status *ngSwitchCase=\"'error'\">\n <tui-svg src=\"tuiIconXCircleLarge\" class=\"scale-[3] !h-20 !text-red-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u041E\u043F\u043B\u0430\u0442\u0430 \u043D\u0435 \u043F\u0440\u043E\u0448\u043B\u0430!</h4>\n <br />\n <div class=\"font-bold\">\u041F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u043F\u043B\u0430\u0442\u0435\u0436\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430.</div>\n <button tuiButton tuiItem (click)=\"backToOrderClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0443</button>\n </tui-block-status>\n </ng-container>\n</ng-container>\n\n<ng-template #failed>\n <tui-block-status>\n <tui-svg src=\"tuiIconInfoLarge\" class=\"scale-[3] !h-20 !text-yellow-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u0427\u0442\u043E-\u0442\u043E \u043F\u043E\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A!</h4>\n <button tuiButton tuiItem (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n</ng-template>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "component", type: i4.TuiLinkComponent, selector: "a[tuiLink], button[tuiLink]", inputs: ["pseudo", "icon", "iconAlign", "iconRotated", "mode"], exportAs: ["tuiLink"] }, { kind: "component", type: i4.TuiButtonComponent, selector: "button[tuiButton], button[tuiIconButton], a[tuiButton], a[tuiIconButton]", inputs: ["appearance", "disabled", "icon", "iconRight", "shape", "showLoader", "size"] }, { kind: "component", type: i4.TuiSvgComponent, selector: "tui-svg", inputs: ["src"] }, { kind: "component", type: i3$2.TuiBlockStatusComponent, selector: "tui-block-status", inputs: ["card"] }, { kind: "directive", type: i3$2.TuiBlockStatusDirective, selector: "[tuiSlot]", inputs: ["tuiSlot"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4395
4201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ScPaymentStatusComponent, decorators: [{
4396
4202
  type: Component,
4397
4203
  args: [{ selector: 'sc-payment-status', changeDetection: ChangeDetectionStrategy.OnPush, template: "<ng-container *ngIf=\"status && orderId; else failed\">\n <ng-container [ngSwitch]=\"status\">\n <tui-block-status *ngSwitchCase=\"'success'\">\n <tui-svg src=\"tuiIconCheckCircleLarge\" tuiSlot=\"top\" class=\"scale-[3] !h-20 !text-green-500\"></tui-svg>\n <h4>\u0421\u043F\u0430\u0441\u0438\u0431\u043E!</h4>\n <br />\n <div class=\"font-bold\">\u0412\u0430\u0448 \u0437\u0430\u043A\u0430\u0437 \u0443\u0441\u043F\u0435\u0448\u043D\u043E \u043E\u043F\u043B\u0430\u0447\u0435\u043D. \u041C\u044B \u0441\u0432\u044F\u0436\u0435\u043C\u0441\u044F \u0441 \u0432\u0430\u043C\u0438 \u0432 \u0431\u043B\u0438\u0436\u0430\u0439\u0448\u0435\u0435 \u0432\u0440\u0435\u043C\u044F.</div>\n <br />\n <div class=\"font-bold\">\n \u041D\u043E\u043C\u0435\u0440 \u0432\u0430\u0448\u0435\u0433\u043E \u0437\u0430\u043A\u0430\u0437\u0430: <a tuiLink [pseudo]=\"true\" (click)=\"backToOrderClick.emit()\">{{orderId}}</a>\n </div>\n\n <button tuiButton (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n <tui-block-status *ngSwitchCase=\"'error'\">\n <tui-svg src=\"tuiIconXCircleLarge\" class=\"scale-[3] !h-20 !text-red-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u041E\u043F\u043B\u0430\u0442\u0430 \u043D\u0435 \u043F\u0440\u043E\u0448\u043B\u0430!</h4>\n <br />\n <div class=\"font-bold\">\u041F\u0440\u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0435 \u043F\u043B\u0430\u0442\u0435\u0436\u0430 \u043F\u0440\u043E\u0438\u0437\u043E\u0448\u043B\u0430 \u043E\u0448\u0438\u0431\u043A\u0430.</div>\n <button tuiButton tuiItem (click)=\"backToOrderClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0443</button>\n </tui-block-status>\n </ng-container>\n</ng-container>\n\n<ng-template #failed>\n <tui-block-status>\n <tui-svg src=\"tuiIconInfoLarge\" class=\"scale-[3] !h-20 !text-yellow-500\" tuiSlot=\"top\"></tui-svg>\n <h4>\u0427\u0442\u043E-\u0442\u043E \u043F\u043E\u0448\u043B\u043E \u043D\u0435 \u0442\u0430\u043A!</h4>\n <button tuiButton tuiItem (click)=\"backToOrdersClick.emit()\">\u0412\u0435\u0440\u043D\u0443\u0442\u044C\u0441\u044F \u043A \u0437\u0430\u043A\u0430\u0437\u0430\u043C</button>\n </tui-block-status>\n</ng-template>\n" }]