施肥計画編集: ページ開時に自動計算・≈を入力値にも適用

- 編集画面を開いた際、保存済みcalc_settingsで自動計算しcalcMatrixを生成
  → 計算ボタンを押さなくてもラベルが表示されるようになる
- roundColumn(≈)がcalcMatrixにない場合はadjusted値を丸めるよう修正
  → 計算ボタンを押さなくても≈で整数丸めが効くようになる

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Akira
2026-03-02 11:34:59 +09:00
parent ff67a6bf26
commit 0e809ebb99

View File

@@ -103,13 +103,41 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
const fields = fieldsRes.data.filter((f: Field) => fieldIds.includes(f.id));
setSelectedFields(fields);
// 保存済みの値は adjusted に復元calc値はなし
// 保存済みの値は adjusted に復元
const newAdjusted: Matrix = {};
plan.entries.forEach((e) => {
if (!newAdjusted[e.field]) newAdjusted[e.field] = {};
newAdjusted[e.field][e.fertilizer] = String(e.bags);
});
setAdjusted(newAdjusted);
// 保存済み calc_settings でページ開時に自動計算してラベル用 calcMatrix を生成
const validSettings = plan.calc_settings?.filter((s) => s.param) ?? [];
if (validSettings.length > 0 && fieldIds.length > 0) {
try {
const calcResults = await Promise.all(
validSettings.map((s) =>
api.post('/fertilizer/calculate/', {
method: s.method,
param: parseFloat(s.param),
fertilizer_id: s.fertilizer_id,
field_ids: fieldIds,
})
)
);
const newCalcMatrix: Matrix = {};
validSettings.forEach((s, i) => {
const results: { field_id: number; bags: number }[] = calcResults[i].data;
results.forEach(({ field_id, bags }) => {
if (!newCalcMatrix[field_id]) newCalcMatrix[field_id] = {};
newCalcMatrix[field_id][s.fertilizer_id] = String(bags);
});
});
setCalcMatrix(newCalcMatrix);
} catch {
// 自動計算失敗はサイレントに無視(ラベルなしで表示継続)
}
}
}
} catch (e: unknown) {
const err = e as { response?: { status?: number; data?: unknown } };
@@ -255,13 +283,13 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
});
setRoundedColumns((prev) => { const next = new Set(prev); next.delete(fertId); return next; });
} else {
// 四捨五入: calc値を整数に丸めて adjusted に書き込む
// 四捨五入: calc値(なければ現在の入力値)を整数に丸めて adjusted に書き込む
setAdjusted((prev) => {
const next = { ...prev };
selectedFields.forEach((field) => {
const calc = calcMatrix[field.id]?.[fertId];
if (calc !== undefined && calc !== '') {
const v = parseFloat(calc);
const raw = calcMatrix[field.id]?.[fertId] ?? prev[field.id]?.[fertId];
if (raw !== undefined && raw !== '') {
const v = parseFloat(raw);
if (!isNaN(v)) {
if (!next[field.id]) next[field.id] = {};
next[field.id][fertId] = String(Math.round(v));
@@ -596,8 +624,8 @@ export default function FertilizerEditPage({ planId }: { planId?: number }) {
{planFertilizers.map((fert) => {
const calcVal = calcMatrix[field.id]?.[fert.id];
const adjVal = adjusted[field.id]?.[fert.id];
// adjusted が設定されているときだけ灰色参照を表示(丸め後
const showRef = adjVal !== undefined && calcVal !== undefined;
// 計算結果があればラベルを表示adjusted が上書きされた場合は参照値として
const showRef = calcVal !== undefined;
// 入力欄: adjusted → calc値 → 空
const inputValue = adjVal !== undefined ? adjVal : (calcVal ?? '');
return (