@snabcentr/client-ui 4.6.6 → 4.7.1

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/order/index.d.ts CHANGED
@@ -1,5 +1,9 @@
1
1
  export * from './directives';
2
+ export * from './models/i-new-order-form';
2
3
  export * from './models/sc-i-cart-items-by-direction';
4
+ export * from './order-direction-items/sc-order-direction-items.component';
5
+ export * from './order-form/sc-order-form.config';
6
+ export * from './order-form/sc-order-form.component';
3
7
  export * from './order-item/sc-order-item.component';
4
8
  export * from './order-items-list/sc-order-items-list.component';
5
9
  export * from './order-items-list-by-directions/sc-order-items-list-by-directions.component';
@@ -0,0 +1,39 @@
1
+ import { FormControl } from '@angular/forms';
2
+ import { ScDeliveryType, ScPaymentType, ScUploadedFile } from '@snabcentr/client-core';
3
+ /**
4
+ * Модель данных формы нового заказа.
5
+ */
6
+ export interface INewOrderForm {
7
+ /**
8
+ * Тип оплаты заказа.
9
+ */
10
+ paymentType: FormControl<ScPaymentType | null>;
11
+ /**
12
+ * Идентификатор контрагента.
13
+ */
14
+ contragentId?: FormControl<number | null>;
15
+ /**
16
+ * Тип доставки заказа.
17
+ */
18
+ deliveryType: FormControl<ScDeliveryType | null>;
19
+ /**
20
+ * Дата доставки.
21
+ */
22
+ deliveryDate: FormControl<string | null>;
23
+ /**
24
+ * Идентификатор адреса доставки контрагента.
25
+ */
26
+ addressId: FormControl<number | null>;
27
+ /**
28
+ * Идентификатор склада.
29
+ */
30
+ warehouseId: FormControl<number | null>;
31
+ /**
32
+ * Комментарий к заказу.
33
+ */
34
+ comment?: FormControl<string | null>;
35
+ /**
36
+ * Файл, прикрепленный пользователем к заказу.
37
+ */
38
+ image?: FormControl<ScUploadedFile | null>;
39
+ }
@@ -0,0 +1,29 @@
1
+ import { ScOrderItem } from '@snabcentr/client-core';
2
+ import * as i0 from "@angular/core";
3
+ /**
4
+ * Список товаров заказа по направлению продаж с выбором позиций для оформления.
5
+ */
6
+ export declare class ScOrderDirectionItemsComponent {
7
+ /**
8
+ * Товары направления.
9
+ */
10
+ readonly items: import("@angular/core").InputSignal<ScOrderItem[]>;
11
+ /**
12
+ * Разрешить редактирование позиций (количество, удаление).
13
+ */
14
+ readonly editable: import("@angular/core").InputSignal<boolean>;
15
+ /**
16
+ * Включить выбор позиций чекбоксами.
17
+ */
18
+ readonly selectable: import("@angular/core").InputSignal<boolean>;
19
+ /**
20
+ * Время обработки и принятия заказов (из настроек окружения приложения).
21
+ */
22
+ readonly orderProcessingAcceptanceTime: import("@angular/core").InputSignal<string>;
23
+ /**
24
+ * Изменение выбора позиций для оформления.
25
+ */
26
+ readonly selectedItemsIdsChange: import("@angular/core").OutputEmitterRef<string[]>;
27
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScOrderDirectionItemsComponent, never>;
28
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderDirectionItemsComponent, "sc-order-direction-items", never, { "items": { "alias": "items"; "required": true; "isSignal": true; }; "editable": { "alias": "editable"; "required": false; "isSignal": true; }; "selectable": { "alias": "selectable"; "required": false; "isSignal": true; }; "orderProcessingAcceptanceTime": { "alias": "orderProcessingAcceptanceTime"; "required": false; "isSignal": true; }; }, { "selectedItemsIdsChange": "selectedItemsIdsChange"; }, never, ["[footerActions]"], true, never>;
29
+ }
@@ -0,0 +1,264 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { ElementRef, OnInit, Signal } from '@angular/core';
3
+ import { FormControl, FormGroup } from '@angular/forms';
4
+ import { ScContragent, ScDeliveryType, ScIDeliveryAddress, ScINewOrder, ScIReferencesTypes, ScITerminalProvider, ScIWarehouse, ScPaymentType, ScUser, ScWarehouseService } from '@snabcentr/client-core';
5
+ import { TuiContext, TuiDay, TuiStringHandler } from '@taiga-ui/cdk';
6
+ import { Observable } from 'rxjs';
7
+ import { INewOrderForm } from '../models/i-new-order-form';
8
+ import * as i0 from "@angular/core";
9
+ /**
10
+ * Типы, которые возможно преобразовать в значение, отображаемое в поле ввода.
11
+ */
12
+ type SelectType = ScIReferencesTypes<ScPaymentType, typeof ScPaymentType> | ScContragent | ScIReferencesTypes<ScDeliveryType, typeof ScDeliveryType> | ScIWarehouse | ScIDeliveryAddress;
13
+ /**
14
+ * Форма оформления заказа.
15
+ */
16
+ export declare class ScOrderFormComponent implements OnInit {
17
+ /**
18
+ * Идентификатор направления продаж заказа.
19
+ */
20
+ readonly directionId: import("@angular/core").InputSignal<number>;
21
+ /**
22
+ * Требовать подтверждённые контактные данные для оформления. Для черновика — `false`.
23
+ */
24
+ readonly enforceApprovedContacts: import("@angular/core").InputSignal<boolean>;
25
+ /**
26
+ * Сохранять и восстанавливать черновые данные формы по направлению (метаданные). Для черновика — `false`.
27
+ * Работает только если предоставлен токен {@link SC_ORDER_FORM_CONFIG}.
28
+ */
29
+ readonly persistMetadata: import("@angular/core").InputSignal<boolean>;
30
+ /**
31
+ * Событие отправки валидной формы оформления. Полезная нагрузка — сырые значения формы.
32
+ */
33
+ readonly orderSubmit: import("@angular/core").OutputEmitterRef<ScINewOrder>;
34
+ /**
35
+ * Сервис справочников.
36
+ */
37
+ private readonly referencesService;
38
+ /**
39
+ * Сервис работы с контрагентами.
40
+ */
41
+ private readonly contragentService;
42
+ /**
43
+ * Сервис работы с адресами доставки.
44
+ */
45
+ private readonly deliveryAddressService;
46
+ /**
47
+ * Сервис для работы со складами.
48
+ */
49
+ readonly warehouseService: ScWarehouseService;
50
+ /**
51
+ * Сервис для работы с заказами (загрузка дат доставки/самовывоза).
52
+ */
53
+ private readonly ordersService;
54
+ /**
55
+ * Сервис для работы с UI.
56
+ */
57
+ private readonly uiService;
58
+ /**
59
+ * Сервис конвертации данных.
60
+ */
61
+ private readonly convertersService;
62
+ /**
63
+ * Сервис работы с диалоговым окном.
64
+ */
65
+ private readonly dialog;
66
+ /**
67
+ * Провайдер данных о терминале.
68
+ */
69
+ readonly terminal: ScITerminalProvider;
70
+ /**
71
+ * Поток данных о текущем пользователе.
72
+ */
73
+ readonly user$: Observable<ScUser>;
74
+ /**
75
+ * Настройки формы оформления заказа. Если не предоставлены, метаданные формы не сохраняются.
76
+ */
77
+ private readonly config;
78
+ /**
79
+ * Признак выполнения скрипта на сервере.
80
+ */
81
+ private readonly isServer;
82
+ /**
83
+ * Ссылка для автоматического управления уничтожением зависимостей.
84
+ */
85
+ private readonly destroyRef;
86
+ /**
87
+ * Задержка считывания сигналов формы, для избежания лишних обработок при смене значений.
88
+ */
89
+ private readonly debounceTimeFormChange;
90
+ /**
91
+ * Форма создания заказа.
92
+ */
93
+ protected readonly form: FormGroup<INewOrderForm>;
94
+ /**
95
+ * Поле файла.
96
+ */
97
+ protected readonly controlFile: FormControl<File | null>;
98
+ /**
99
+ * {@link Observable} списка подтверждённых файлов.
100
+ */
101
+ protected readonly accepted$: Observable<File[]>;
102
+ /**
103
+ * Признак, что включён режим анимации предупреждения о неподтверждённых данных.
104
+ */
105
+ protected readonly warningShake: import("@angular/core").WritableSignal<boolean>;
106
+ /**
107
+ * Признак, что контрагент является физическим лицом.
108
+ */
109
+ protected readonly isIndividual: import("@angular/core").WritableSignal<boolean>;
110
+ /**
111
+ * Список возможных дат самовывоза со склада.
112
+ */
113
+ private readonly warehouseDeliveryDates;
114
+ /**
115
+ * Список возможных дат доставки.
116
+ */
117
+ private readonly addressDeliveryDates;
118
+ /**
119
+ * {@link Observable} списка контрагентов пользователя.
120
+ */
121
+ protected readonly contragents$: Observable<ScContragent[] | null>;
122
+ /**
123
+ * {@link Observable} списка адресов контрагента.
124
+ */
125
+ protected readonly addresses$: Observable<ScIDeliveryAddress[] | null>;
126
+ /**
127
+ * {@link Observable} списка складов.
128
+ */
129
+ protected readonly warehouses$: Observable<ScIWarehouse[]>;
130
+ /**
131
+ * {@link Observable} ОПФ выбранного контрагента.
132
+ */
133
+ private readonly opf$;
134
+ /**
135
+ * {@link Observable} типов оплаты заказа.
136
+ */
137
+ protected readonly paymentTypes$: Observable<Array<ScIReferencesTypes<ScPaymentType, typeof ScPaymentType>>>;
138
+ /**
139
+ * {@link Observable} типов доставки заказа.
140
+ */
141
+ protected readonly deliveryTypes$: Observable<Array<ScIReferencesTypes<ScDeliveryType, typeof ScDeliveryType>>>;
142
+ /**
143
+ * Признак, что выбран тип оплаты наличными.
144
+ */
145
+ protected readonly isCashPaymentSelected: Signal<boolean>;
146
+ /**
147
+ * Признак, что номер телефона подтверждён.
148
+ */
149
+ protected readonly isPhoneApproved: Signal<boolean>;
150
+ /**
151
+ * Признак, что адрес электронной почты подтверждён пользователем.
152
+ */
153
+ private readonly isEmailApprovedUser;
154
+ /**
155
+ * Признак, что адрес электронной почты подтверждён или контрагент является физическим лицом.
156
+ */
157
+ protected readonly isEmailApproved: Signal<boolean>;
158
+ /**
159
+ * Значение выбранного типа доставки.
160
+ */
161
+ private readonly deliveryTypeValue;
162
+ /**
163
+ * Признак, что выбран тип доставки "Доставка".
164
+ */
165
+ protected readonly isDelivery: Signal<boolean>;
166
+ /**
167
+ * Набор доступных дат в зависимости от типа доставки.
168
+ */
169
+ protected readonly deliveryDates: Signal<string[]>;
170
+ /**
171
+ * Ссылка на элемент с предупреждением о неподтверждённых данных.
172
+ */
173
+ protected readonly unconfirmedDataWarning: Signal<ElementRef<HTMLElement> | undefined>;
174
+ /**
175
+ * Возвращает признак, что указанная дата недоступна для выбора.
176
+ *
177
+ * @param date Дата.
178
+ */
179
+ protected readonly deliveryDateFilter: (date: TuiDay) => boolean;
180
+ /**
181
+ * Инициализирует экземпляр класса {@link ScOrderFormComponent}.
182
+ */
183
+ constructor();
184
+ /** @inheritdoc */
185
+ ngOnInit(): void;
186
+ /**
187
+ * Преобразует объекты в значения, отображаемое в поле ввода.
188
+ *
189
+ * @param items Выбранные объекты выпадающего списка.
190
+ */
191
+ stringify(items: readonly SelectType[]): TuiStringHandler<TuiContext<number>>;
192
+ /**
193
+ * Обрабатывает отправку формы: валидирует и эмитит данные заказа родителю.
194
+ */
195
+ submit(): void;
196
+ /**
197
+ * Применяет к полям формы ошибки, пришедшие от сервера.
198
+ *
199
+ * @param error Ответ сервера с ошибками.
200
+ */
201
+ applyServerErrors(error: HttpErrorResponse): void;
202
+ /**
203
+ * Удаляет файл из формы заказа.
204
+ */
205
+ protected removeFile(): void;
206
+ /**
207
+ * Открывает диалоговое окно добавления адреса доставки.
208
+ */
209
+ protected addDeliveryAddress(): void;
210
+ /**
211
+ * Открывает диалоговое окно добавления контрагента.
212
+ */
213
+ protected addContragent(): void;
214
+ /**
215
+ * Запускает анимацию предупреждения о неподтверждённых данных и прокручивает к нему.
216
+ */
217
+ private triggerUnconfirmedWarning;
218
+ /**
219
+ * Восстанавливает черновые данные формы из метаданных и инициализирует их сохранение.
220
+ */
221
+ private initMetadata;
222
+ /**
223
+ * Инициализирует подписки на изменения полей формы.
224
+ */
225
+ private initFormChanges;
226
+ /**
227
+ * Инициализирует подписку на изменение поля прикрепления файла.
228
+ */
229
+ private initFileChange;
230
+ /**
231
+ * Инициализирует подписку на изменение выбранного склада.
232
+ */
233
+ private initWarehouseChange;
234
+ /**
235
+ * Инициализирует подписку на изменение адреса доставки и выбранного склада для получения списка доступных дат доставки.
236
+ */
237
+ private initDeliveryDatesChange;
238
+ /**
239
+ * Инициализирует подписку на изменение полей формы для блокирования/активации поля выбора даты.
240
+ */
241
+ private initDateFieldActivationChange;
242
+ /**
243
+ * Запрашивает даты доставки по адресу.
244
+ *
245
+ * @param addressId Идентификатор адреса доставки.
246
+ */
247
+ private deliveriesByAddress;
248
+ /**
249
+ * Запрашивает даты самовывоза по складу.
250
+ *
251
+ * @param warehouseId Идентификатор склада.
252
+ */
253
+ private deliveriesByWarehouse;
254
+ /**
255
+ * Загружает файл в форму.
256
+ *
257
+ * @param file Файл.
258
+ * @param filesControl Поле файла заказа.
259
+ */
260
+ private onUploadFile;
261
+ static ɵfac: i0.ɵɵFactoryDeclaration<ScOrderFormComponent, never>;
262
+ static ɵcmp: i0.ɵɵComponentDeclaration<ScOrderFormComponent, "sc-order-form", never, { "directionId": { "alias": "directionId"; "required": true; "isSignal": true; }; "enforceApprovedContacts": { "alias": "enforceApprovedContacts"; "required": false; "isSignal": true; }; "persistMetadata": { "alias": "persistMetadata"; "required": false; "isSignal": true; }; }, { "orderSubmit": "orderSubmit"; }, never, never, true, never>;
263
+ }
264
+ export {};
@@ -0,0 +1,20 @@
1
+ import { InjectionToken } from '@angular/core';
2
+ import { ScIDateFormat } from '@snabcentr/client-core';
3
+ /**
4
+ * Настройки компонента формы оформления заказа {@link ScOrderFormComponent}.
5
+ */
6
+ export interface ScIOrderFormConfig {
7
+ /**
8
+ * Форматы дат приложения (используются при восстановлении метаданных формы).
9
+ */
10
+ readonly dateFormats: ScIDateFormat;
11
+ /**
12
+ * Задержка сохранения метаданных формы, мс.
13
+ */
14
+ readonly debounceTime: number;
15
+ }
16
+ /**
17
+ * Токен настроек {@link ScOrderFormComponent}.
18
+ * Если не предоставлен, сохранение и восстановление метаданных формы отключены.
19
+ */
20
+ export declare const SC_ORDER_FORM_CONFIG: InjectionToken<ScIOrderFormConfig>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@snabcentr/client-ui",
3
- "version": "4.6.6",
3
+ "version": "4.7.1",
4
4
  "author": "Snabcentr Ltd.",
5
5
  "repository": "https://gitlab.snabcentr.met/web/angular/snabcentr-client-ui-lib",
6
6
  "license": "Commercial",
@@ -32,6 +32,7 @@
32
32
  "@tailwindcss/container-queries": "^0.1.1",
33
33
  "ng-recaptcha-2": "^14.0.0",
34
34
  "angular8-yandex-maps": "^18.2.0",
35
+ "date-fns": "^4.1.0",
35
36
  "libphonenumber-js": "^1.12.7",
36
37
  "angularx-qrcode": "^18.0.2",
37
38
  "lodash-es": "^4.17.21",
package/release_notes.tmp CHANGED
@@ -1,16 +1,6 @@
1
- ## 4.6.6 (2026-06-05)
1
+ ## 4.7.1 (2026-07-08)
2
2
 
3
- ### fixed (3 changes)
3
+ ### fixed (1 change)
4
4
 
5
- - [#13405: Исправлены ошибки высвобождения ресурсов](web_soft/libs/angular/snabcentr-client-ui-lib@aebe1305aeaf99edc6985f3072d45fb1a665e000) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!414))
6
- - [#13405: Исправлена ошибка высвобождения ресурсов для капчи](web_soft/libs/angular/snabcentr-client-ui-lib@94f7585dd0de0d5f7eaba63b49d0fce728e89731) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!413))
7
- - [#13078: Исправлены ошибки определения логики товара на метраж. Исправлена...](web_soft/libs/angular/snabcentr-client-ui-lib@716fdfebe386ee91e8cc04039f7d433140c03cb1) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!412))
8
-
9
- ### added (1 change)
10
-
11
- - [#13137: Добавлена сортировка фильтров, удалён отладочный код](web_soft/libs/angular/snabcentr-client-ui-lib@532407e6678113309d8ac9e4a449516689b25e9a) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!411))
12
-
13
- ### changed (1 change)
14
-
15
- - [#13137: Доработан компонент фильтров каталога](web_soft/libs/angular/snabcentr-client-ui-lib@e317a8dd99654a7d15fcd887558920b9e37f009b) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!410))
5
+ - [#13019: Исправлена ошибка выделения текста в текстовых полях ввода в Safari](web_soft/libs/angular/snabcentr-client-ui-lib@e290fa5305e3d6fec05fe2afca573facc8b308b7) ([merge request](web_soft/libs/angular/snabcentr-client-ui-lib!423))
16
6
 
@@ -1652,6 +1652,11 @@ video {
1652
1652
  line-height: 1.75rem;
1653
1653
  }
1654
1654
 
1655
+ .text-xs {
1656
+ font-size: 0.75rem;
1657
+ line-height: 1rem;
1658
+ }
1659
+
1655
1660
  .\!font-bold {
1656
1661
  font-weight: 700 !important;
1657
1662
  }
@@ -1740,6 +1745,10 @@ video {
1740
1745
  color: var(--tui-text-tertiary);
1741
1746
  }
1742
1747
 
1748
+ .text-tui-text-negative {
1749
+ color: var(--tui-text-negative);
1750
+ }
1751
+
1743
1752
  .text-tui-text-primary {
1744
1753
  color: var(--tui-text-primary);
1745
1754
  }