Sub-issues
@@ -1758,37 +1826,41 @@ export function IssueDetail() {
Sub-issue
-
- {childIssues.map((child) => (
-
- rememberIssueDetailLocationState(
- child.identifier ?? child.id,
- resolvedIssueDetailState ?? location.state,
- location.search,
- )}
- className="flex items-center justify-between px-3 py-2 text-sm hover:bg-accent/20 transition-colors"
- >
-
-
-
-
- {child.identifier ?? child.id.slice(0, 8)}
-
-
{child.title}
-
- {child.assigneeAgentId && (() => {
- const name = agentMap.get(child.assigneeAgentId)?.name;
- return name
- ?
- :
{child.assigneeAgentId.slice(0, 8)};
- })()}
-
- ))}
-
+ {childIssuesLoading ? (
+
+ ) : (
+
+ {childIssues.map((child) => (
+
+ rememberIssueDetailLocationState(
+ child.identifier ?? child.id,
+ resolvedIssueDetailState ?? location.state,
+ location.search,
+ )}
+ className="flex items-center justify-between px-3 py-2 text-sm hover:bg-accent/20 transition-colors"
+ >
+
+
+
+
+ {child.identifier ?? child.id.slice(0, 8)}
+
+
{child.title}
+
+ {child.assigneeAgentId && (() => {
+ const name = agentMap.get(child.assigneeAgentId)?.name;
+ return name
+ ?
+ :
{child.assigneeAgentId.slice(0, 8)};
+ })()}
+
+ ))}
+
+ )}
)}
@@ -1827,7 +1899,9 @@ export function IssueDetail() {
}
/>
- {hasAttachments ? (
+ {attachmentsInitialLoading ? (
+ p.id === issue.projectId) ?? null}
+ project={resolvedProject}
onUpdate={(data) => updateIssue.mutate(data)}
/>
@@ -1990,100 +2064,110 @@ export function IssueDetail() {
- {
- await interruptQueuedComment.mutateAsync(runningIssueRun.id);
- }
- : undefined}
- onImageClick={handleChatImageClick}
- />
+ {issueChatInitialLoading ? (
+
+ ) : (
+ {
+ await interruptQueuedComment.mutateAsync(runningIssueRun.id);
+ }
+ : undefined}
+ onImageClick={handleChatImageClick}
+ />
+ )}
- {linkedApprovals && linkedApprovals.length > 0 && (
-
- {linkedApprovals.map((approval) => (
-
approvalDecision.mutate({ approvalId: approval.id, action: "approve" })}
- onReject={() => approvalDecision.mutate({ approvalId: approval.id, action: "reject" })}
- detailLink={`/approvals/${approval.id}`}
- isPending={pendingApprovalAction?.approvalId === approval.id}
- pendingAction={
- pendingApprovalAction?.approvalId === approval.id
- ? pendingApprovalAction.action
- : null
- }
- />
- ))}
-
- )}
- {linkedRuns && linkedRuns.length > 0 && (
-
-
Cost Summary
- {!issueCostSummary.hasCost && !issueCostSummary.hasTokens ? (
-
No cost data yet.
- ) : (
-
- {issueCostSummary.hasCost && (
-
- ${issueCostSummary.cost.toFixed(4)}
-
- )}
- {issueCostSummary.hasTokens && (
-
- Tokens {formatTokens(issueCostSummary.totalTokens)}
- {issueCostSummary.cached > 0
- ? ` (in ${formatTokens(issueCostSummary.input)}, out ${formatTokens(issueCostSummary.output)}, cached ${formatTokens(issueCostSummary.cached)})`
- : ` (in ${formatTokens(issueCostSummary.input)}, out ${formatTokens(issueCostSummary.output)})`}
-
+ {activityInitialLoading ? (
+
+ ) : (
+ <>
+ {linkedApprovals && linkedApprovals.length > 0 && (
+
+ {linkedApprovals.map((approval) => (
+
approvalDecision.mutate({ approvalId: approval.id, action: "approve" })}
+ onReject={() => approvalDecision.mutate({ approvalId: approval.id, action: "reject" })}
+ detailLink={`/approvals/${approval.id}`}
+ isPending={pendingApprovalAction?.approvalId === approval.id}
+ pendingAction={
+ pendingApprovalAction?.approvalId === approval.id
+ ? pendingApprovalAction.action
+ : null
+ }
+ />
+ ))}
+
+ )}
+ {linkedRuns && linkedRuns.length > 0 && (
+
+
Cost Summary
+ {!issueCostSummary.hasCost && !issueCostSummary.hasTokens ? (
+
No cost data yet.
+ ) : (
+
+ {issueCostSummary.hasCost && (
+
+ ${issueCostSummary.cost.toFixed(4)}
+
+ )}
+ {issueCostSummary.hasTokens && (
+
+ Tokens {formatTokens(issueCostSummary.totalTokens)}
+ {issueCostSummary.cached > 0
+ ? ` (in ${formatTokens(issueCostSummary.input)}, out ${formatTokens(issueCostSummary.output)}, cached ${formatTokens(issueCostSummary.cached)})`
+ : ` (in ${formatTokens(issueCostSummary.input)}, out ${formatTokens(issueCostSummary.output)})`}
+
+ )}
+
)}
)}
-
- )}
- {!activity || activity.length === 0 ? (
-
No activity yet.
- ) : (
-
- {activity.slice(0, 20).map((evt) => (
-
-
-
{formatAction(evt.action, evt.details)}
-
{relativeTime(evt.createdAt)}
+ {!activity || activity.length === 0 ? (
+
No activity yet.
+ ) : (
+
+ {activity.slice(0, 20).map((evt) => (
+
+
+
{formatAction(evt.action, evt.details)}
+
{relativeTime(evt.createdAt)}
+
+ ))}
- ))}
-
+ )}
+ >
)}