@snabcentr/client-ui 0.17.4 → 0.18.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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" }]