refactor(selection): split selectedAgentId into focus vs edit-modal states; improve Edit modal title

Before this commit one piece of state (`selectedAgentId`) did three
jobs: roster highlight, navigation destination, and Edit-modal open
flag. The three jobs had incompatible lifecycles — highlight should
persist across modal close, navigation should land on a screen
without opening a modal, and the modal itself only wants to open on
explicit intent. The conflation was the root cause of the "Edit: CEO
auto-opens on first Team view" bug (commit 41132e2 patched the most
visible symptom by not pre-selecting the lead agent, but the coupling
remained).

Split into two slice fields:

- `selectedAgentId` — which agent is currently highlighted in the
  roster / OrgChart. Survives modal close. Set by: row click, card
  click, navigation from Inbox / Hiring (all of which pass through
  `openAgentEditor` which sets both so the highlight follows the last
  interaction).
- `editingAgentId` — which agent's Edit modal is open, or
  NEW_ENTITY_ID for the "Request new hire" modal. Only set by
  explicit user action; cleared on modal close. Never set by
  navigation or onboarding — the pre-select pathway cannot
  accidentally open a modal again.

Plumbing:

- `selection.ts`: new `editingAgentId` + `setEditingAgentId`, plus
  clear on `clearCompanyScopedSelections`.
- `useCompanyData.ts`: derive `editingAgent` record from the id.
- `useCompanyController.ts`: forward `editingAgent` on the section
  context.
- `OrganizationSections.tsx`: `agents` section modals read
  `editingAgentId` / `editingAgent`. "Request new hire" button uses
  `setEditingAgentId(NEW_ENTITY_ID)`. Single-click handlers go
  through `openAgentEditor(id)` which updates both states.

Also improved Edit modal title (was "Edit: CEO", a machined English
prefix on a Chinese UI with zero context about the role):

- zh: "编辑 {name}({role})"
- en: "Edit {name} ({role})"

Renders as "编辑 CEO(首席执行官)" in the screenshot example.

Covers J9 / S2.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-17 19:54:16 -04:00
1 parent 9981ee342b
commit dc33131553
6 files changed
+50 -12

No files matched your search

+14
View File
@@ -6,7 +6,14 @@ export interface SelectionSlice {
selectedConnectorId: string | null;
selectedApprovalId: string | null;
selectedRunId: string | null;
/** Highlighted agent (roster row / orgchart card). Navigation target.
* Does NOT control the Edit modal — see editingAgentId. */
selectedAgentId: string | null;
/** Agent whose Edit modal is currently open, or NEW_ENTITY_ID for the
* new-hire request modal. Only set by explicit user action (row click,
* card click, "Request new hire" button); never by navigation or
* onboarding defaults. Cleared on modal close. */
editingAgentId: string | null;
selectedGoalId: string | null;
selectedProjectId: string | null;
selectedWorkspaceId: string | null;
@@ -16,6 +23,7 @@ export interface SelectionSlice {
setSelectedApprovalId: (id: string | null) => void;
setSelectedRunId: (id: string | null) => void;
setSelectedAgentId: (id: string | null) => void;
setEditingAgentId: (id: string | null) => void;
setSelectedGoalId: (id: string | null) => void;
setSelectedProjectId: (id: string | null) => void;
setSelectedWorkspaceId: (id: string | null) => void;
@@ -34,6 +42,7 @@ export const createSelectionSlice: StateCreator<
selectedApprovalId: null,
selectedRunId: null,
selectedAgentId: null,
editingAgentId: null,
selectedGoalId: null,
selectedProjectId: null,
selectedWorkspaceId: null,
@@ -58,6 +67,10 @@ export const createSelectionSlice: StateCreator<
set((state) => {
state.selectedAgentId = id;
}),
setEditingAgentId: (id) =>
set((state) => {
state.editingAgentId = id;
}),
setSelectedGoalId: (id) =>
set((state) => {
state.selectedGoalId = id;
@@ -80,6 +93,7 @@ export const createSelectionSlice: StateCreator<
state.selectedApprovalId = null;
state.selectedRunId = null;
state.selectedAgentId = null;
state.editingAgentId = null;
state.selectedGoalId = null;
state.selectedProjectId = null;
state.selectedWorkspaceId = null;