Skip to content

[fix]タブ推移問題の修正#1986

Merged
batcho0428 merged 7 commits intogm3/developfrom
fix/riririn/1973-Tab-transition
Apr 26, 2026
Merged

[fix]タブ推移問題の修正#1986
batcho0428 merged 7 commits intogm3/developfrom
fix/riririn/1973-Tab-transition

Conversation

@riririn180904
Copy link
Copy Markdown
Collaborator

@riririn180904 riririn180904 commented Dec 15, 2025

対応 Issue

resolve #1973

前提

この PR は、ユーザー画面の各種申請フォームで「画面遷移・タブ移動・アコーディオンの開閉・再取得」のタイミングで入力内容が消える問題を直すための修正です。

対象は user/src/pages/home/index.tsx に表示される申請群です。特定のフォームだけではなく、複数の申請で同じような実装パターンがあり、同じ種類の入力リセットが起きる可能性がありました。

今回 gm3/develop を取り込んだことで、火器使用申請のユーザー画面もこの PR の対象に含めています。

何が起きていたか

主な原因は、フォームの表示状態やデータ再取得により React コンポーネントが再生成・再初期化されることでした。

  • フォームを条件描画で切り替えると、非表示になった瞬間にフォームコンポーネントが unmount され、入力途中の state が消える
  • API の再取得や SWR の revalidate によって loading 表示に戻ると、フォームが一度消えて初期値から作り直される
  • 既存データから作るフォーム初期値が毎回再生成されると、編集中の入力より API 由来の値が優先される
  • 未登録/登録済みの判定が非同期取得後に決まるため、初期表示時の edit/view 判定が不安定になりやすい

対応方針

「フォームを必要以上に壊さない」ことを優先して修正しています。

  • 初回ロード中と edit/view 判定前を区別するため、isEditingboolean | null として扱う
  • isRegistered を受け取り、登録済みかどうかに応じた edit/view の初期化を一度だけ行う
  • 一度ロード済みになった後の再取得では、フォーム全体を loading 表示へ戻しにくくする
  • フォーム初期値は useMemo やコピーを使い、参照や再生成によるリセットを避ける
  • 表示/非表示の切り替えが入力保持に関わるフォームは、条件描画ではなく CSS 表示切り替えで DOM を維持する
  • submit 成功時だけ view mode に戻るようにし、失敗時に入力内容が消えないようにする
  • groupId が未確定または 0 のときに不要な API fetch をしないようにする

主な変更点

  • 申請フォーム共通の edit/view 初期化を安定化しました。
  • Group / FoodProduct / PublicRelations / StageOptions / ViceRepresentative / CookingProcessOrder で、未登録時は初回のみ編集モードへ入るようにしました。
  • Power と FireEquipment は、申請有無の切り替えでフォームを unmount しないようにしました。
  • Stage / VenueApplication / VenueMap などで、再取得時に入力途中のフォームを壊しにくくしました。
  • Group / StageOptions は、submit 成功時のみ toEdit で表示モードへ戻るようにしました。
  • home/index.tsx ではカテゴリ別の申請表示を整理し、火器使用申請も該当カテゴリの流れに含めました。
  • Loading... の直書きは、既存の i18n 文言に寄せました。

火器使用申請について

火器使用申請は、gm3/develop 側で追加済みの機能をこの PR に取り込んだうえで確認しました。

確認した問題:

  • 「火器を使用する/使用しない」の切り替えで、火器使用フォームが条件描画されていた
  • そのため、入力途中に切り替え操作をするとフォームが unmount され、入力内容が消える可能性があった

対応:

  • FireEquipmentFormView の使用/不使用切り替えを CSS 表示切り替えに変更
  • 入力フォームを DOM 上に残すことで、切り替え時の入力保持を優先
  • home 画面の該当カテゴリに FireEquipment を表示

レビュー観点

1. まず表示順と対象申請を確認

  • 団体申請が未登録のとき、団体申請のみ操作できる
  • 団体申請が登録済みのとき、副代表申請とカテゴリ別申請が表示される
  • 食品販売カテゴリで、販売品・購入品・調理工程・火器使用申請が表示される
  • 物品販売カテゴリで、火器使用申請が表示される
  • 研究室公開カテゴリで、火器使用申請が表示される
  • 展示・体験カテゴリで、火器使用申請が表示される
  • ステージカテゴリや実行委員会カテゴリに不要な火器使用申請が表示されない

2. 未登録フォームの初期表示を確認

  • 未登録の必須申請は、初回表示時に入力フォームが表示される
  • 登録済みの申請は、初回表示時に確認画面が表示される
  • データ取得中に一瞬だけ view/form が切り替わるようなちらつきがない
  • groupId 未確定時に /group/0 のような不要 API fetch が発生しない

3. 入力保持を確認

各フォームで、入力途中に別申請を開く・閉じる・戻る操作をしてください。

  • Group 申請で入力途中の内容が消えない
  • FoodProduct 申請で入力途中の内容が消えない
  • PublicRelations 申請で入力途中の内容が消えない
  • StageOptions 申請で入力途中の内容が消えない
  • ViceRepresentative 申請で入力途中の内容が消えない
  • CookingProcessOrder 申請で入力途中の内容が消えない
  • VenueApplication / VenueMap 申請で再取得後に入力途中の内容が不自然に戻らない
  • Power 申請で「使用する/使用しない」を切り替えても、使用する側の入力内容が保持される
  • FireEquipment 申請で「使用する/使用しない」を切り替えても、使用する側の入力内容が保持される

4. コピペ操作を確認

今回の Issue で特に見たい観点です。

  • 入力欄に文字を貼り付けても、フォームが閉じたり入力内容がリセットされたりしない
  • 貼り付け後に別申請へ移動して戻っても、入力内容が保持される
  • 複数項目のあるフォームで、1項目目への入力が他項目の再生成で消えない

5. submit 成功/失敗時の挙動を確認

  • 登録成功後は確認画面に戻る
  • 更新成功後は確認画面に戻る
  • バリデーションエラー時は入力フォームが維持される
  • API エラー時に、入力内容が消えない
  • 登録状態のステータス表示が更新される

6. 火器使用申請を重点確認

  • 未登録時に火器使用申請フォームが表示される
  • 「使用する」を選択して入力した内容が、切り替え操作後も保持される
  • 「使用しない」で登録できる
  • 「使用しない」登録済み状態から編集できる
  • 「使用する」登録済み状態から編集できる
  • 既存データがある場合に、編集フォームへ既存値が入る

ローカル確認結果

  • docker compose run --rm user pnpm run type-check
  • docker compose run --rm user pnpm run lint
  • CodeRabbit の Minor 指摘 5 件を確認し、必要なものを修正
  • PR 競合を解消し、gm3/develop を取り込み済み

補足

docker compose run --rm api rails test は実行しましたが、api/test/fixtures/assign_rental_items.yml が現在の schema に存在しない旧カラム rental_order_id / rentable_item_id を使っているため、fixture 読み込み時点で失敗します。

この fixture 不整合は今回のフォーム状態管理の変更とは別件で、gm3/develop 側にもある既存のテスト環境問題です。

@hikahana
Copy link
Copy Markdown
Contributor

今回のは調査からなので
問題、調査した事、そこからの仮定としての解決方法
PRの修正点
みたいな感じでこれのここが問題かもーーってなのを書けたら書いて欲しいです!!!!!!、!

@batcho0428
Copy link
Copy Markdown
Collaborator

@riririn180904
私の環境でテストしたところ同じ症状出ちゃってる感じでした。
ただ、私の環境だと電力申請以外でも同じ現象出ちゃってるので具体的な解決策がちょっとわからない状況です。
他に思い当たる部分あればテストしてもらえればと思います。
引き続きよろしくお願いします!

Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

このPRは、電力申請フォームでタブ切り替え時に入力内容がリセットされてしまう問題(#1973)を修正するものだよ〜✨

コピー&ペースト作業中にタブを切り替えると、フォームが再マウントされて入力中のデータが消えちゃうっていうユーザビリティ的にエグい問題があったんだよね😫 これを条件描画からCSS制御に変更することで、フォームのマウント状態を維持したまま表示/非表示を切り替えられるようにしたよ💪

Changes:

  • フォームの表示制御を条件描画({showForm && ...})からCSS制御(display: none)に変更して、タブ切り替え時のアンマウントを防止
  • フォーム初期値の生成をuseMemoでラップして、不要な再生成を抑制

Reviewed changes

Copilot reviewed 2 out of 2 changed files in this pull request and generated no comments.

File Description
user/src/components/Applications/Power/hooks/usePowerApplication.ts フォーム初期値の生成をuseMemoでメモ化し、hasExistingとdevicesが変更された時のみ再生成するように最適化
user/src/components/Applications/Power/components/PowerFormView.tsx 条件描画からstyleプロパティでのdisplay制御に変更し、フォームのアンマウントを防止

@YosukeIida YosukeIida force-pushed the fix/riririn/1973-Tab-transition branch from f1219ca to 00228f0 Compare March 10, 2026 12:35
@YosukeIida YosukeIida requested a review from hikahana April 7, 2026 13:07
@batcho0428 batcho0428 requested review from KokiWakatsuki and removed request for batcho0428 and hikahana April 22, 2026 06:52
…73-Tab-transition

# Conflicts:
#	user/src/components/Applications/CookingProcessOrder/CookingProcessOrder.tsx
#	user/src/components/Applications/CookingProcessOrder/hooks.ts
#	user/src/components/Applications/FoodProduct/FoodProduct.tsx
#	user/src/components/Applications/FoodProduct/hooks.ts
#	user/src/components/Applications/Group/Group.tsx
#	user/src/components/Applications/Group/GroupForm/hooks.ts
#	user/src/components/Applications/Group/hooks.ts
#	user/src/components/Applications/PublicRelations/PublicRelations.tsx
#	user/src/components/Applications/PublicRelations/PublicRelationsForm/PublicRelationsForm.tsx
#	user/src/components/Applications/PublicRelations/hooks.ts
#	user/src/components/Applications/StageOptions/StageOptionForm/hooks.ts
#	user/src/components/Applications/StageOptions/StageOptions.tsx
#	user/src/components/Applications/StageOptions/hooks.ts
#	user/src/components/Applications/VenueMap/VenueMapForm/VenueMapForm.tsx
#	user/src/components/Applications/VenueMap/hooks.ts
#	user/src/components/Applications/ViceRepresentative/ViceRepresentative.tsx
#	user/src/components/Applications/ViceRepresentative/hook.ts
#	user/src/pages/home/index.tsx
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 23, 2026

📝 Walkthrough

Walkthrough

This PR refactors form state management across multiple application components to prevent unintended form resets during tab transitions. Key changes include: (1) conditional API endpoint construction when groupId is undefined, (2) tri-state isEditing (boolean | null) to distinguish loading from edit/view mode, (3) one-time initialization of edit mode based on an optional isRegistered flag, (4) gating loading indicators after first load completion, and (5) switching some components from conditional mounting to CSS-based visibility toggling to preserve form state.

Changes

Cohort / File(s) Summary
API Endpoint Guards
user/src/api/cookingProcessOrderApi.ts, user/src/api/foodProductApi.ts, user/src/api/publicRelationsApi.ts
Conditional endpoint construction: pass null to useAuthenticatedGet when groupId is undefined/falsy instead of interpolating into the URL path.
SWR Default Configuration
user/src/hooks/useApi.ts
useAuthenticatedGet now merges incoming options with default SWR settings (disable focus/network refetch, retain data during revalidation, increase deduplication time).
Tri-State Edit Mode Initialization
user/src/components/Applications/CookingProcessOrder/hooks.ts, user/src/components/Applications/FoodProduct/hooks.ts, user/src/components/Applications/Group/hooks.ts, user/src/components/Applications/PublicRelations/hooks.ts, user/src/components/Applications/Stage/hooks/useStageFormViewHooks.ts, user/src/components/Applications/StageOptions/hooks.ts, user/src/components/Applications/ViceRepresentative/hook.ts
Accept optional isRegistered parameter and initialize isEditing as boolean | null (using useRef guards for one-time initialization), gate returned isLoading with hasLoadedOnce flag to prevent flickering after initial data load.
Component UI for Tri-State Loading
user/src/components/Applications/CookingProcessOrder/CookingProcessOrder.tsx, user/src/components/Applications/FoodProduct/FoodProduct.tsx, user/src/components/Applications/Group/Group.tsx, user/src/components/Applications/PublicRelations/PublicRelations.tsx, user/src/components/Applications/Stage/StageForm/StageForm.tsx, user/src/components/Applications/StageOptions/StageOptions.tsx, user/src/components/Applications/ViceRepresentative/ViceRepresentative.tsx
Update Content components to handle isEditing: null as a loading state, rendering "Loading..." placeholder before error/deadline/form rendering logic.
Form Visibility via CSS Toggle
user/src/components/Applications/FireEquipment/components/FireEquipmentFormView.tsx, user/src/components/Applications/Power/components/PowerFormView.tsx
Change from conditional rendering (showForm && <Form />) to always-mounted <div> with display: block | none style toggling to preserve form state during visibility changes.
Mutation-Aware Form Submission
user/src/components/Applications/Group/GroupForm/GroupForm.tsx, user/src/components/Applications/Group/GroupForm/hooks.ts, user/src/components/Applications/StageOptions/StageOptionForm/StageOptionForm.tsx, user/src/components/Applications/StageOptions/StageOptionForm/hooks.ts
Form submission handlers now await mutations, return boolean success status, and conditionally trigger toEdit?.() callback only on successful submission; reset() called only after successful create operations.
Form Dirty State Management
user/src/components/Applications/Stage/hooks/useStageForm.ts
Check formState.isDirty from react-hook-form; only call reset(values) when form is not dirty to avoid overwriting user changes.
Power Form Data Cloning
user/src/components/Applications/Power/hooks/usePowerApplication.ts
Compute default form values with useMemo, cloning device array entries ({ ...d }) to decouple form initial values from source data.
VenueApplication & VenueMap Loading Gates
user/src/components/Applications/VenueApplication/hooks.ts, user/src/components/Applications/VenueMap/hooks.ts
Introduce hasLoadedOnce flag set when initial fetch completes; return isLoading && !hasLoadedOnce to suppress subsequent loading states.
FoodProduct Form Sync Removal
user/src/components/Applications/FoodProduct/FoodProductForm/hooks.ts
Remove useEffect synchronization that recomputed products via createDefaultProducts and reset form values, leaving only initial defaultValues from hook initialization.
Home Page Refactoring
user/src/pages/home/index.tsx
Extract new GroupCategoryContent component for category-specific rendering with isDeadline and isRegistered mappings; pass isGroupResolved (computed from useGetGroupByUserId loading state) into Group component; consolidate FireEquipment rendering within category logic.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • 火器使用申請のUI作成 #1925 — Introduced FireEquipmentFormView component and its form/view logic; this PR's CSS-toggle refactoring of that component directly extends that work to fix state preservation during visibility changes.

Suggested reviewers

  • KokiWakatsuki

Poem

🐰✨ Hoppy hops through form state tails,
No more resets on tab-swipes' sails!
Tri-state editing, wisely told,
Forms preserved, copy-paste bold!
Data lives on, forms stay whole,
A rabbit's fix, for each user's goal! 🍀

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Out of Scope Changes check ❓ Inconclusive Multiple changes extend beyond the Power application to other form components (FireEquipment, Stage, StageOptions, ViceRepresentative, etc.), applying similar patterns for consistent behavior across the codebase. Clarify whether the broad refactoring across multiple application forms was intentionally part of resolving issue #1973 or represents scope creep requiring separate issue tracking.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title '[fix]タブ推移問題の修正' describes a bug fix for tab transition issues, which aligns with the PR's main objective of fixing the tab-switch problem.
Linked Issues check ✅ Passed The code changes comprehensively address issue #1973's requirement to fix tab transition/input reset problems by refactoring form display (conditional rendering → CSS toggle) and form initialization (useMemo), preventing unnecessary re-renders and state loss.
Description check ✅ Passed The PR description comprehensively addresses the issue: it explains the problem (form state loss during navigation), the solution approach (avoiding unnecessary re-renders and using stable state management), and provides clear testing checklist items.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/riririn/1973-Tab-transition

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (3)
user/src/components/Applications/Stage/hooks/useStageForm.ts (1)

80-103: ⚠️ Potential issue | 🟠 Major

Add shouldDirty: true and shouldTouch: true to setValue call to prevent reset effect from overwriting user edits.

The isDirty guard in the useEffect (line 92) cannot prevent the reset when setValue is called without the shouldDirty option. According to react-hook-form documentation, setValue does not update formState.isDirty by default. Without shouldDirty: true, user edits made via updateField remain invisible to the guard, allowing the reset effect to overwrite them when external data changes.

Proposed fix
  const updateField = (field: FormField, value: string) => {
-   setValue(field, value, { shouldValidate: true });
+   setValue(field, value, {
+     shouldValidate: true,
+     shouldDirty: true,
+     shouldTouch: true,
+   });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/Stage/hooks/useStageForm.ts` around lines 80
- 103, The reset effect in useStageForm can overwrite user edits because
updateField calls setValue without updating formState.isDirty/isTouched; modify
the updateField function so its setValue call includes shouldDirty: true and
shouldTouch: true (in addition to shouldValidate: true) to ensure user edits
flip isDirty/isTouched and prevent the useEffect reset from running over
in-progress edits (look for updateField, setValue, and the useEffect that calls
reset).
user/src/components/Applications/FoodProduct/FoodProduct.tsx (1)

49-65: ⚠️ Potential issue | 🟡 Minor

Use i18n for the "Loading..." label and consider consolidating the two loading branches.

Line 62 hardcodes the English string Loading..., which bypasses next-i18next and won't be translated. The sibling branch at L49-56 already uses foodProductViewTexts.loading — reuse it here. Additionally, rendering two near-identical loading UIs in sequence (once for isLoading, then again for isEditing === null) can cause a brief UI flicker; merging them would be cleaner.

🌐 Proposed fix
-  if (isLoading) {
+  if (isLoading || isEditing === null) {
     return (
       <div className="flex items-center justify-center py-8">
         <div className="size-8 animate-spin rounded-full border-b-2 border-blue-500"></div>
         <span className="ml-2">{foodProductViewTexts.loading}</span>
       </div>
     );
   }
-
-  if (isEditing === null) {
-    return (
-      <div className="flex items-center justify-center py-8">
-        <div className="size-8 animate-spin rounded-full border-b-2 border-blue-500"></div>
-        <span className="ml-2">Loading...</span>
-      </div>
-    );
-  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/FoodProduct/FoodProduct.tsx` around lines 49
- 65, The component renders two nearly identical loading UIs and hardcodes
"Loading..." in the isEditing === null branch; update FoodProduct.tsx to
consolidate the checks (use a single early return when isLoading || isEditing
=== null) and replace the hardcoded string with the i18n value
foodProductViewTexts.loading so both cases show the same translated
spinner/text; ensure you remove the duplicate branch and keep the existing
spinner markup from the isLoading block.
user/src/components/Applications/StageOptions/StageOptions.tsx (1)

38-44: ⚠️ Potential issue | 🟡 Minor

Use i18n for the "Loading..." label and consider merging with the isLoading branch.

Line 43 hardcodes Loading... while the immediately preceding branch uses stageOptionTexts.general.loading. This breaks localization and produces a flicker when transitioning from isLoadingisEditing === null.

🌐 Proposed fix
-  if (isLoading) {
+  if (isLoading || isEditing === null) {
     return <div>{stageOptionTexts.general.loading}</div>;
   }
-
-  if (isEditing === null) {
-    return <div>Loading...</div>;
-  }
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/StageOptions/StageOptions.tsx` around lines
38 - 44, The component StageOptions currently returns a hardcoded "Loading..."
when isEditing === null which breaks i18n and can flicker relative to the
earlier isLoading branch; update the second branch to use the same localized
string (stageOptionTexts.general.loading) or merge the conditions so both
isLoading and isEditing === null render the same localized loading state; locate
the conditional checks for isLoading and isEditing in the StageOptions component
and replace the hardcoded text with stageOptionTexts.general.loading (or combine
into a single if (isLoading || isEditing === null) return ...).
🧹 Nitpick comments (12)
user/src/components/Applications/Power/components/PowerFormView.tsx (1)

37-37: Tailwind クラスでの表示切替を推奨。

style={{ display: showForm ? 'block' : 'none' }} の代わりに、Tailwind の条件付きクラスを利用するとコーディングガイドラインに沿います。

♻️ Proposed change
-      <div style={{ display: showForm ? 'block' : 'none' }}>
+      <div className={showForm ? 'block' : 'hidden'}>

As per coding guidelines: 「React コンポーネントのスタイルは Tailwind CSS を使用する」.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/Power/components/PowerFormView.tsx` at line
37, Replace the inline style display toggle in the PowerFormView component with
Tailwind conditional classes: locate the div that currently uses style={{
display: showForm ? 'block' : 'none' }} and change it to use a className
expression that applies Tailwind's "hidden" when showForm is false and "block"
(or the appropriate layout class) when true, keeping any existing classes intact
so styling follows the project's Tailwind-based convention.
user/src/components/Applications/FireEquipment/components/FireEquipmentFormView.tsx (1)

60-60: Tailwind クラスでの表示切替を推奨。

インラインの style={{ display: ... }} ではなく Tailwind の hidden/block を条件付きクラスで切り替える方がコーディングガイドラインに沿います。動作は等価です。

♻️ Proposed change
-      <div style={{ display: isRegister ? 'none' : 'block' }}>
+      <div className={isRegister ? 'hidden' : 'block'}>
...
-      <div style={{ display: isRegister ? 'block' : 'none' }}>
+      <div className={isRegister ? 'block' : 'hidden'}>

As per coding guidelines: 「React コンポーネントのスタイルは Tailwind CSS を使用する」.

Also applies to: 71-71

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In
`@user/src/components/Applications/FireEquipment/components/FireEquipmentFormView.tsx`
at line 60, Replace the inline style display toggles in the
FireEquipmentFormView component (the divs currently using style={{ display:
isRegister ? 'none' : 'block' }} and the similar occurrence) with conditional
Tailwind classes — e.g. compute className to use 'hidden' when isRegister is
true and 'block' when false (use your project's classNames utility or a template
literal) so the visibility follows the coding guideline of using Tailwind
instead of inline style.
user/src/components/Applications/Stage/StageForm/StageForm.tsx (1)

98-101: 既存のローディング文言を再利用してください。

Line 100 は同じファイル内で既に使っている stageFormTexts.loading に寄せると、表示文言の二重管理を避けられます。

♻️ Proposed refactor
       {isFormMode === null ? (
         <div className="w-[400px] py-4 text-center">
-          <p>データを読み込み中です...</p>
+          <p>{stageFormTexts.loading}</p>
         </div>

この UI 差分に対応する Storybook / before-after スクリーンショットの更新も確認してください。As per coding guidelines, Update Storybook when making UI changes in frontend components. Based on learnings, UI 変更時は before/after のスクリーンショットを添付し、該当面のレビュアーをアサインする.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/Stage/StageForm/StageForm.tsx` around lines
98 - 101, The hardcoded loading message inside the isFormMode null branch should
be replaced with the existing localized constant stageFormTexts.loading to avoid
duplicate strings; update the JSX branch that renders the loading placeholder
(the block using isFormMode === null) to render stageFormTexts.loading instead
of the literal "データを読み込み中です...", keep the same container markup and CSS classes,
and after changing the text update the Storybook stories and before/after
screenshots for this StageForm variant and assign the relevant UI reviewer per
guidelines.
user/src/components/Applications/Group/GroupForm/hooks.ts (1)

19-21: Tighten the mutator prop types now that they're awaited.

Lines 131, 142-144 now await these callbacks, but the parameter types (() => void) don't reflect that they return Promises. Callers presumably pass SWR's mutate (which returns a Promise) — update the types so await is meaningful and TS can catch non-async mistakes.

♻️ Proposed change
-  mutateGroups: () => void,
-  mutateCheckAllRegisteredGroups: () => void,
-  mutateGroupByUserId: () => void
+  mutateGroups: () => Promise<unknown>,
+  mutateCheckAllRegisteredGroups: () => Promise<unknown>,
+  mutateGroupByUserId: () => Promise<unknown>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/Group/GroupForm/hooks.ts` around lines 19 -
21, The mutator props mutateGroups, mutateCheckAllRegisteredGroups, and
mutateGroupByUserId are declared as () => void but are awaited in callers (so
they should return Promises); update their types to reflect async behavior
(e.g., () => Promise<void> or () => Promise<unknown>) in the hook/props/type
definition that declares these three symbols so TypeScript will require
Promise-returning mutators (matching SWR's mutate).
user/src/api/publicRelationsApi.ts (1)

48-52: Parameter type doesn't match the nullable-guard pattern used elsewhere.

groupId is still typed as number, but the new guard treats 0/undefined/NaN as "skip fetch". Sibling hooks were updated to widen the parameter type (number | null in useGetFoodProducts, number | undefined in useGetCookingProcessOrder). For consistency and to let TS callers actually pass the skip value, widen this one too.

♻️ Proposed change
-export const usePublicRelationData = (groupId: number) => {
+export const usePublicRelationData = (groupId: number | undefined) => {
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/api/publicRelationsApi.ts` around lines 48 - 52, The parameter type
for usePublicRelationData should be widened so callers can pass the "skip"
sentinel used in the guard; change the signature of usePublicRelationData from
(groupId: number) to (groupId: number | null) (or number | undefined if your
codebase prefers undefined) and keep the existing endpoint null-check logic;
update any direct callers if they currently pass null/undefined so TypeScript
matches the intended nullable-guard behavior, referencing usePublicRelationData
and the endpoint variable to locate the change.
user/src/components/Applications/VenueMap/hooks.ts (1)

17-57: hasLoadedOnce permanently suppresses loading state after first completion.

Once hasLoadedOnce flips to true, isLoading returned from this hook is always false — even if the SWR key later changes (e.g., different groupId) and a fresh fetch begins. For this PR's tab-switch-preservation goal that is the intent, but if this hook is ever reused across group navigations, consumers will briefly render against the previous venueMap. Consider resetting hasLoadedOnce when groupId changes if that scenario matters.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/VenueMap/hooks.ts` around lines 17 - 57, The
current hasLoadedOnce flag is never reset so isLoading stays false after the
first successful fetch; add a reset when the active group changes by introducing
a new effect that calls setHasLoadedOnce(false) whenever groupId changes (e.g.,
useEffect(() => { setHasLoadedOnce(false); }, [groupId])); keep the existing
effect that sets hasLoadedOnce true when isFetching becomes false so the
combined behavior preserves the tab-switch intent but also re-enables loading
for a new group.
user/src/hooks/useApi.ts (1)

109-117: Global SWR defaults risk stale data across conditional endpoints — most callers only check isLoading, not isValidating.

Setting keepPreviousData: true globally means callers with conditional endpoints (e.g., groupId-dependent URLs) will momentarily render the previous key's cached data while fetching new data. Inspection of call sites shows this pattern is widespread:

  • useGetStageOrders, useGetVenueMap, useGetFoodProducts all use conditional endpoints based on parameter changes and only check isLoading, not isValidating
  • Since SWR's isLoading reflects only the initial mount, these callers will display stale data (old group's data, etc.) until the new request completes

This is intentional for tab-switch stability but requires all callers to adopt defensive checks (e.g., isValidating or request/response tracking) to avoid rendering wrong data during navigation. Either require this in documentation/patterns, or reconsider global defaults in favor of opt-in per hook.

dedupingInterval: 10000 is also a sizeable window; ensure call sites don't assume automatic re-fetch within ~10s (explicit mutate() bypasses this and works as expected).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/hooks/useApi.ts` around lines 109 - 117, The global SWR defaults in
useApi.ts are causing stale data for conditional endpoints; change the
swrOptions (used in the return useSWR<T, ApiError>(key, authenticatedGetFetcher,
swrOptions)) to remove or set keepPreviousData to false by default and reduce or
remove the large dedupingInterval (10000) so callers relying only on isLoading
won't render previous-key data; instead make keepPreviousData and
dedupingInterval opt-in via the options spread (i.e., preserve ...options to
allow callers to enable them explicitly) and document that callers needing
previous-data behavior must pass those options into the useApi hook.
user/src/components/Applications/Group/hooks.ts (1)

65-95: Consider extracting the shared hasLoadedOnce + one-time isEditing initialization into a reusable hook.

This exact pattern (tri-state isEditing, hasInitializedEditing ref, hasLoadedOnce gate, and functional toEdit) is now duplicated across Group/hooks.ts, FoodProduct/hooks.ts, ViceRepresentative/hook.ts, StageOptions/hooks.ts, and siblings. Centralizing it would:

  • Prevent subtle drift (e.g., Group/hooks.ts gates on isGroupResolved but the other hooks don't — easy to miss when evolving behavior).
  • Simplify future changes such as adding i18n loading labels or handling the "isRegistered never resolves" edge case in one place.
♻️ Example extraction sketch
// user/src/hooks/useEditingMode.ts
export const useEditingMode = (
  isLoading: boolean,
  isRegistered?: boolean,
  isResolved = true
) => {
  const [isEditing, setIsEditing] = useState<boolean | null>(null);
  const [hasLoadedOnce, setHasLoadedOnce] = useState(false);
  const initialized = useRef(false);

  useEffect(() => {
    if (!isLoading) setHasLoadedOnce(true);
  }, [isLoading]);

  useEffect(() => {
    if (initialized.current || !isResolved || isRegistered === undefined) return;
    setIsEditing(!isRegistered);
    initialized.current = true;
  }, [isRegistered, isResolved]);

  const toEdit = () => setIsEditing((prev) => !prev);
  return { isEditing, toEdit, isLoading: isLoading && !hasLoadedOnce };
};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/Group/hooks.ts` around lines 65 - 95,
Extract the duplicated editing/loading logic into a reusable hook (e.g.,
useEditingMode) and replace the inline state/refs in Group hooks: move isEditing
state, hasInitializedEditing ref, hasLoadedOnce state, the two useEffects and
toEdit into the new hook signature like useEditingMode(isLoading, isRegistered,
isGroupResolved) returning { isEditing, toEdit, isLoading: isLoading &&
!hasLoadedOnce }; update the Group component to call useEditingMode and use its
returned symbols instead of local isEditing, setIsEditing,
hasInitializedEditing, hasLoadedOnce and the two effects so all files
(Group/hooks.ts, FoodProduct/hooks.ts, ViceRepresentative/hook.ts,
StageOptions/hooks.ts, etc.) can reuse the same logic and behavior.
user/src/components/Applications/PublicRelations/hooks.ts (1)

71-88: Consider aligning init-guard with sibling hook for consistency.

Nit: user/src/components/Applications/CookingProcessOrder/hooks.ts gates the one-time isEditing initialization on !isDataLoading as well as isRegistered !== undefined, while this hook only checks isRegistered. The current behavior is still correct (Content shows the isLoading branch before data arrives), but mirroring the same pattern across hooks reduces cognitive load and future drift.

Also note toEdit relying on (prev) => !prev yields true when prev === null; safe today because the edit button isn't rendered while isEditing === null, but a more defensive form would be setIsEditing((prev) => prev === null ? prev : !prev).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/PublicRelations/hooks.ts` around lines 71 -
88, The one-time init guard in the useEffect that sets isEditing should mirror
the sibling hook by also checking prIsLoading: inside the effect that references
hasInitializedEditing.current and isRegistered, add a condition to return early
when prIsLoading is true so initialization only runs after data finishes
loading; also make the toEdit toggle defensive by changing its updater to avoid
flipping when isEditing is null (use setIsEditing(prev => prev === null ? prev :
!prev)). Ensure you update the references to hasInitializedEditing,
isRegistered, prIsLoading, setIsEditing, and toEdit in this file.
user/src/components/Applications/CookingProcessOrder/hooks.ts (1)

170-186: Initialization effect looks correct; one small robustness note.

The one-time init pattern (hasInitializedEditing ref + !isDataLoading gate) is sound. Minor: handleEditClick uses (prev) => !prev, which flips null to true. Today the edit button is not rendered while isEditing === null, so this is unreachable — but making it explicit (prev === null ? prev : !prev) would harden it against future UI changes where the button could render during loading.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/components/Applications/CookingProcessOrder/hooks.ts` around lines
170 - 186, The init effect is fine but harden handleEditClick to avoid flipping
a null isEditing: update the toggle handler (handleEditClick) to check for null
and return prev as-is when prev === null (e.g. return prev === null ? prev :
!prev) so clicking the edit button during loading/unknown state cannot flip null
to true; reference hasInitializedEditing, isEditing, setIsEditing and
handleEditClick when making this change.
user/src/pages/home/index.tsx (2)

72-308: Heavy duplication across category branches — consider a config-driven renderer.

All six groupCategoryId branches repeat the same per-app components (VenueApplications, RentItems, Power, PublicRelations, VenueMap, FireEquipment, …) with identical prop wiring. Each addition/rename of an app-level prop must be repeated up to 6 times, which increases maintenance risk.

Consider extracting small render helpers (e.g. renderVenue(), renderRentItems(), …) or a Record<groupCategoryId, AppKey[]> config that maps each category to the apps it should render. That would cut this block by hundreds of lines and eliminate the risk of missing one branch on future changes.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/pages/home/index.tsx` around lines 72 - 308, The JSX for different
groupCategoryId branches duplicates the same app components (VenueApplications,
RentItems, Power, PublicRelations, VenueMap, FireEquipment, FoodProduct, Stage,
etc.) with identical prop wiring; replace the if/else branches with a
config-driven renderer: create a mapping (e.g. Record<GROUP_CATEGORY, AppKey[]>)
that lists which components to show per category and implement a small
factory/renderer (e.g. renderVenue(), renderRentItems(), renderComponentByKey())
that returns each component with the shared props (groupId, groupCategoryId,
isDeadline derived from userPageSettings, isRegistered from
checkAllRegisteredGroups, mutateCheckAllRegisteredGroups when needed); then use
that mapping keyed by groupCategoryId to produce the JSX, removing the
repetitive conditional blocks and centralizing prop wiring for maintainability.

24-55: Import these types from the API modules instead of duplicating them.

UserPageSettings is exported from @/api/userPageSettingAPI (line 7) but redefined locally. Similarly, CheckAllRegisteredGroups matches the exported RegistrationStatus from @/api/checkAllRegisteredApi (line 4). Importing these types instead prevents silent drift when API shapes change.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@user/src/pages/home/index.tsx` around lines 24 - 55, The local type aliases
UserPageSettings and CheckAllRegisteredGroups duplicate exported types from the
API modules and risk drifting; remove the local definitions and import
UserPageSettings from "@/api/userPageSettingAPI" and RegistrationStatus (the
matching type) from "@/api/checkAllRegisteredApi" (or rename the imported
RegistrationStatus to CheckAllRegisteredGroups where used) and update any
references in this file (e.g., usages in components, props, or function
signatures) to use the imported types instead of the redefined ones.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@user/src/api/foodProductApi.ts`:
- Around line 26-30: The current guard in useGetFoodProducts lets groupId === 0
produce a fetch to `${API_ENDPOINTS.FOOD_PRODUCTS_GROUP}/0`; update the guard so
falsy/invalid ids don't trigger a request — e.g., change the endpoint expression
in useGetFoodProducts to use a truthy check (groupId ?
`${API_ENDPOINTS.FOOD_PRODUCTS_GROUP}/${groupId}` : null) or only allow positive
ids (groupId > 0 ? ... : null); alternatively fix the caller
(useFoodProductHooks) to pass groupId ?? null instead of groupId || 0 so
useGetFoodProducts receives null for missing ids. Ensure you reference
useGetFoodProducts and API_ENDPOINTS.FOOD_PRODUCTS_GROUP when making the change.

In
`@user/src/components/Applications/CookingProcessOrder/CookingProcessOrder.tsx`:
- Around line 42-43: Replace the hardcoded "Loading..." placeholder with the
i18n label already provided by the hook: use
cookingProcessOrderTexts.general.loading (or t('general.loading')) where the
conditional renders when isLoading || isEditing === null; also apply the same
Tailwind loading placeholder classes used elsewhere in this component (match the
surrounding skeleton/placeholder styles) so the loading UI is consistent with
other components.

In `@user/src/components/Applications/Group/Group.tsx`:
- Around line 55-57: The null check branch currently returns a hardcoded
"Loading..." string; change it to reuse the existing i18n text by returning the
same localized label used elsewhere (groupTexts.loading) so both branches show
consistent localized text; locate the null branch in the Group component (the
isEditing === null check) and replace the raw string with groupTexts.loading.

In `@user/src/components/Applications/PublicRelations/PublicRelations.tsx`:
- Around line 44-46: The branch that returns a hardcoded <div>Loading...</div>
when isEditing === null should use the existing i18n string instead; replace
that hardcoded text with the localized string used elsewhere
(publicRelationsTexts.loading or t('general.loading')) inside the
PublicRelations component so the loading label is consistent with the rest of
the UI (locate the isEditing === null check in PublicRelations.tsx and return
the same localized value rather than the hardcoded English string).

In `@user/src/components/Applications/ViceRepresentative/ViceRepresentative.tsx`:
- Around line 49-51: The null-loading branch in the ViceRepresentative component
returns a hardcoded "Loading..." string; replace that with the i18n value used
elsewhere by returning viceRepresentativeTexts.general.loading instead. Locate
the isEditing === null check in ViceRepresentative.tsx and change the JSX
returned there to use the existing viceRepresentativeTexts.general.loading
identifier so the component consistently reuses the same localized loading text.

---

Outside diff comments:
In `@user/src/components/Applications/FoodProduct/FoodProduct.tsx`:
- Around line 49-65: The component renders two nearly identical loading UIs and
hardcodes "Loading..." in the isEditing === null branch; update FoodProduct.tsx
to consolidate the checks (use a single early return when isLoading || isEditing
=== null) and replace the hardcoded string with the i18n value
foodProductViewTexts.loading so both cases show the same translated
spinner/text; ensure you remove the duplicate branch and keep the existing
spinner markup from the isLoading block.

In `@user/src/components/Applications/Stage/hooks/useStageForm.ts`:
- Around line 80-103: The reset effect in useStageForm can overwrite user edits
because updateField calls setValue without updating formState.isDirty/isTouched;
modify the updateField function so its setValue call includes shouldDirty: true
and shouldTouch: true (in addition to shouldValidate: true) to ensure user edits
flip isDirty/isTouched and prevent the useEffect reset from running over
in-progress edits (look for updateField, setValue, and the useEffect that calls
reset).

In `@user/src/components/Applications/StageOptions/StageOptions.tsx`:
- Around line 38-44: The component StageOptions currently returns a hardcoded
"Loading..." when isEditing === null which breaks i18n and can flicker relative
to the earlier isLoading branch; update the second branch to use the same
localized string (stageOptionTexts.general.loading) or merge the conditions so
both isLoading and isEditing === null render the same localized loading state;
locate the conditional checks for isLoading and isEditing in the StageOptions
component and replace the hardcoded text with stageOptionTexts.general.loading
(or combine into a single if (isLoading || isEditing === null) return ...).

---

Nitpick comments:
In `@user/src/api/publicRelationsApi.ts`:
- Around line 48-52: The parameter type for usePublicRelationData should be
widened so callers can pass the "skip" sentinel used in the guard; change the
signature of usePublicRelationData from (groupId: number) to (groupId: number |
null) (or number | undefined if your codebase prefers undefined) and keep the
existing endpoint null-check logic; update any direct callers if they currently
pass null/undefined so TypeScript matches the intended nullable-guard behavior,
referencing usePublicRelationData and the endpoint variable to locate the
change.

In `@user/src/components/Applications/CookingProcessOrder/hooks.ts`:
- Around line 170-186: The init effect is fine but harden handleEditClick to
avoid flipping a null isEditing: update the toggle handler (handleEditClick) to
check for null and return prev as-is when prev === null (e.g. return prev ===
null ? prev : !prev) so clicking the edit button during loading/unknown state
cannot flip null to true; reference hasInitializedEditing, isEditing,
setIsEditing and handleEditClick when making this change.

In
`@user/src/components/Applications/FireEquipment/components/FireEquipmentFormView.tsx`:
- Line 60: Replace the inline style display toggles in the FireEquipmentFormView
component (the divs currently using style={{ display: isRegister ? 'none' :
'block' }} and the similar occurrence) with conditional Tailwind classes — e.g.
compute className to use 'hidden' when isRegister is true and 'block' when false
(use your project's classNames utility or a template literal) so the visibility
follows the coding guideline of using Tailwind instead of inline style.

In `@user/src/components/Applications/Group/GroupForm/hooks.ts`:
- Around line 19-21: The mutator props mutateGroups,
mutateCheckAllRegisteredGroups, and mutateGroupByUserId are declared as () =>
void but are awaited in callers (so they should return Promises); update their
types to reflect async behavior (e.g., () => Promise<void> or () =>
Promise<unknown>) in the hook/props/type definition that declares these three
symbols so TypeScript will require Promise-returning mutators (matching SWR's
mutate).

In `@user/src/components/Applications/Group/hooks.ts`:
- Around line 65-95: Extract the duplicated editing/loading logic into a
reusable hook (e.g., useEditingMode) and replace the inline state/refs in Group
hooks: move isEditing state, hasInitializedEditing ref, hasLoadedOnce state, the
two useEffects and toEdit into the new hook signature like
useEditingMode(isLoading, isRegistered, isGroupResolved) returning { isEditing,
toEdit, isLoading: isLoading && !hasLoadedOnce }; update the Group component to
call useEditingMode and use its returned symbols instead of local isEditing,
setIsEditing, hasInitializedEditing, hasLoadedOnce and the two effects so all
files (Group/hooks.ts, FoodProduct/hooks.ts, ViceRepresentative/hook.ts,
StageOptions/hooks.ts, etc.) can reuse the same logic and behavior.

In `@user/src/components/Applications/Power/components/PowerFormView.tsx`:
- Line 37: Replace the inline style display toggle in the PowerFormView
component with Tailwind conditional classes: locate the div that currently uses
style={{ display: showForm ? 'block' : 'none' }} and change it to use a
className expression that applies Tailwind's "hidden" when showForm is false and
"block" (or the appropriate layout class) when true, keeping any existing
classes intact so styling follows the project's Tailwind-based convention.

In `@user/src/components/Applications/PublicRelations/hooks.ts`:
- Around line 71-88: The one-time init guard in the useEffect that sets
isEditing should mirror the sibling hook by also checking prIsLoading: inside
the effect that references hasInitializedEditing.current and isRegistered, add a
condition to return early when prIsLoading is true so initialization only runs
after data finishes loading; also make the toEdit toggle defensive by changing
its updater to avoid flipping when isEditing is null (use setIsEditing(prev =>
prev === null ? prev : !prev)). Ensure you update the references to
hasInitializedEditing, isRegistered, prIsLoading, setIsEditing, and toEdit in
this file.

In `@user/src/components/Applications/Stage/StageForm/StageForm.tsx`:
- Around line 98-101: The hardcoded loading message inside the isFormMode null
branch should be replaced with the existing localized constant
stageFormTexts.loading to avoid duplicate strings; update the JSX branch that
renders the loading placeholder (the block using isFormMode === null) to render
stageFormTexts.loading instead of the literal "データを読み込み中です...", keep the same
container markup and CSS classes, and after changing the text update the
Storybook stories and before/after screenshots for this StageForm variant and
assign the relevant UI reviewer per guidelines.

In `@user/src/components/Applications/VenueMap/hooks.ts`:
- Around line 17-57: The current hasLoadedOnce flag is never reset so isLoading
stays false after the first successful fetch; add a reset when the active group
changes by introducing a new effect that calls setHasLoadedOnce(false) whenever
groupId changes (e.g., useEffect(() => { setHasLoadedOnce(false); },
[groupId])); keep the existing effect that sets hasLoadedOnce true when
isFetching becomes false so the combined behavior preserves the tab-switch
intent but also re-enables loading for a new group.

In `@user/src/hooks/useApi.ts`:
- Around line 109-117: The global SWR defaults in useApi.ts are causing stale
data for conditional endpoints; change the swrOptions (used in the return
useSWR<T, ApiError>(key, authenticatedGetFetcher, swrOptions)) to remove or set
keepPreviousData to false by default and reduce or remove the large
dedupingInterval (10000) so callers relying only on isLoading won't render
previous-key data; instead make keepPreviousData and dedupingInterval opt-in via
the options spread (i.e., preserve ...options to allow callers to enable them
explicitly) and document that callers needing previous-data behavior must pass
those options into the useApi hook.

In `@user/src/pages/home/index.tsx`:
- Around line 72-308: The JSX for different groupCategoryId branches duplicates
the same app components (VenueApplications, RentItems, Power, PublicRelations,
VenueMap, FireEquipment, FoodProduct, Stage, etc.) with identical prop wiring;
replace the if/else branches with a config-driven renderer: create a mapping
(e.g. Record<GROUP_CATEGORY, AppKey[]>) that lists which components to show per
category and implement a small factory/renderer (e.g. renderVenue(),
renderRentItems(), renderComponentByKey()) that returns each component with the
shared props (groupId, groupCategoryId, isDeadline derived from
userPageSettings, isRegistered from checkAllRegisteredGroups,
mutateCheckAllRegisteredGroups when needed); then use that mapping keyed by
groupCategoryId to produce the JSX, removing the repetitive conditional blocks
and centralizing prop wiring for maintainability.
- Around line 24-55: The local type aliases UserPageSettings and
CheckAllRegisteredGroups duplicate exported types from the API modules and risk
drifting; remove the local definitions and import UserPageSettings from
"@/api/userPageSettingAPI" and RegistrationStatus (the matching type) from
"@/api/checkAllRegisteredApi" (or rename the imported RegistrationStatus to
CheckAllRegisteredGroups where used) and update any references in this file
(e.g., usages in components, props, or function signatures) to use the imported
types instead of the redefined ones.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 90c27d79-ec2c-4198-bade-9bf60234530f

📥 Commits

Reviewing files that changed from the base of the PR and between 71a7a51 and f1dec71.

📒 Files selected for processing (30)
  • user/src/api/cookingProcessOrderApi.ts
  • user/src/api/foodProductApi.ts
  • user/src/api/publicRelationsApi.ts
  • user/src/components/Applications/CookingProcessOrder/CookingProcessOrder.tsx
  • user/src/components/Applications/CookingProcessOrder/hooks.ts
  • user/src/components/Applications/FireEquipment/components/FireEquipmentFormView.tsx
  • user/src/components/Applications/FoodProduct/FoodProduct.tsx
  • user/src/components/Applications/FoodProduct/FoodProductForm/hooks.ts
  • user/src/components/Applications/FoodProduct/hooks.ts
  • user/src/components/Applications/Group/Group.tsx
  • user/src/components/Applications/Group/GroupForm/GroupForm.tsx
  • user/src/components/Applications/Group/GroupForm/hooks.ts
  • user/src/components/Applications/Group/hooks.ts
  • user/src/components/Applications/Power/components/PowerFormView.tsx
  • user/src/components/Applications/Power/hooks/usePowerApplication.ts
  • user/src/components/Applications/PublicRelations/PublicRelations.tsx
  • user/src/components/Applications/PublicRelations/hooks.ts
  • user/src/components/Applications/Stage/StageForm/StageForm.tsx
  • user/src/components/Applications/Stage/hooks/useStageForm.ts
  • user/src/components/Applications/Stage/hooks/useStageFormViewHooks.ts
  • user/src/components/Applications/StageOptions/StageOptionForm/StageOptionForm.tsx
  • user/src/components/Applications/StageOptions/StageOptionForm/hooks.ts
  • user/src/components/Applications/StageOptions/StageOptions.tsx
  • user/src/components/Applications/StageOptions/hooks.ts
  • user/src/components/Applications/VenueApplication/hooks.ts
  • user/src/components/Applications/VenueMap/hooks.ts
  • user/src/components/Applications/ViceRepresentative/ViceRepresentative.tsx
  • user/src/components/Applications/ViceRepresentative/hook.ts
  • user/src/hooks/useApi.ts
  • user/src/pages/home/index.tsx
💤 Files with no reviewable changes (1)
  • user/src/components/Applications/FoodProduct/FoodProductForm/hooks.ts

Comment thread user/src/api/foodProductApi.ts
Comment thread user/src/components/Applications/CookingProcessOrder/CookingProcessOrder.tsx Outdated
Comment thread user/src/components/Applications/Group/Group.tsx
@batcho0428 batcho0428 merged commit 3163876 into gm3/develop Apr 26, 2026
4 of 6 checks passed
@batcho0428 batcho0428 deleted the fix/riririn/1973-Tab-transition branch April 26, 2026 16:15
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

電力申請でタブ推移問題の解決

7 participants