diff --git a/src/food-market.web/src/pages/ProductEditPage.tsx b/src/food-market.web/src/pages/ProductEditPage.tsx index 0990c9a..f65a0b9 100644 --- a/src/food-market.web/src/pages/ProductEditPage.tsx +++ b/src/food-market.web/src/pages/ProductEditPage.tsx @@ -423,57 +423,56 @@ export function ProductEditPage() { } > -

Закупка

- - {org.data?.showReferencePriceOnProduct && ( - - setForm({ ...form, referencePrice: n == null ? '' : String(n) })} - currencyCode={currencies.data?.find((c) => c.id === form.purchaseCurrencyId)?.code ?? org.data?.defaultCurrencyCode ?? undefined} - currencySymbol={currencies.data?.find((c) => c.id === form.purchaseCurrencyId)?.symbol ?? org.data?.defaultCurrencySymbol ?? undefined} - /> -

не обязательное поле

-
- )} - - {}} - disabled - currencyCode={org.data?.defaultCurrencyCode ?? undefined} - currencySymbol={org.data?.defaultCurrencySymbol ?? undefined} - /> -

расчётная (скользящее среднее)

-
- {org.data?.multiCurrencyEnabled && ( - - - - )} -
+
+
+

Закупка

+
+ {org.data?.showReferencePriceOnProduct && ( + + setForm({ ...form, referencePrice: n == null ? '' : String(n) })} + currencyCode={currencies.data?.find((c) => c.id === form.purchaseCurrencyId)?.code ?? org.data?.defaultCurrencyCode ?? undefined} + currencySymbol={currencies.data?.find((c) => c.id === form.purchaseCurrencyId)?.symbol ?? org.data?.defaultCurrencySymbol ?? undefined} + /> +

не обязательное поле

+
+ )} + + {}} + disabled + currencyCode={org.data?.defaultCurrencyCode ?? undefined} + currencySymbol={org.data?.defaultCurrencySymbol ?? undefined} + /> +

расчётная (скользящее среднее)

+
+ {org.data?.multiCurrencyEnabled && ( + + + + )} +
+
-
-

Цены продажи

- {/* Список цен рендерится по справочнику PriceType: одно поле на каждый - * тип, без выпадашки выбора. Значение хранится в form.prices, - * key = priceTypeId. Для отсутствующих записей при наборе создаётся - * новая, при стирании — null Amount (UI пустое). Обязательные (IsRequired) - * помечаются звёздочкой. */} -
- {priceTypes.data?.slice().sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name)).map((pt) => { - const idx = form.prices.findIndex(p => p.priceTypeId === pt.id) - const row = idx >= 0 ? form.prices[idx] : null - const required = pt.isRequired - return ( -
- -
+
+

Цены продажи

+ {/* Список цен рендерится по справочнику PriceType: одно поле на каждый + * тип, без выпадашки выбора. Значение хранится в form.prices, + * key = priceTypeId. Для отсутствующих записей при наборе создаётся + * новая, при стирании — null Amount (UI пустое). Обязательные (IsRequired) + * помечаются звёздочкой. */} +
+ {priceTypes.data?.slice().sort((a, b) => a.sortOrder - b.sortOrder || a.name.localeCompare(b.name)).map((pt) => { + const idx = form.prices.findIndex(p => p.priceTypeId === pt.id) + const row = idx >= 0 ? form.prices[idx] : null + const required = pt.isRequired + return ( + { @@ -491,20 +490,20 @@ export function ProductEditPage() { currencyCode={currencies.data?.find((c) => c.id === row?.currencyId)?.code ?? org.data?.defaultCurrencyCode ?? undefined} currencySymbol={currencies.data?.find((c) => c.id === row?.currencyId)?.symbol ?? org.data?.defaultCurrencySymbol ?? undefined} /> -
-
- ) - })} + + ) + })} {priceTypes.data?.length === 0 && (
Нет ни одного типа цен. Создай в «Настройки → Типы цен».
)} - {missingRequiredPrices.length > 0 && ( -
- Заполни обязательные цены: {missingRequiredPrices.map((pt) => `«${pt.name}»`).join(', ')} (значение должно быть больше 0). -
- )} +
+ {missingRequiredPrices.length > 0 && ( +
+ Заполни обязательные цены: {missingRequiredPrices.map((pt) => `«${pt.name}»`).join(', ')} (значение должно быть больше 0). +
+ )} {org.data?.showMinMaxStock && (