diff --git a/packages/ui/src/components/views/GitView.tsx b/packages/ui/src/components/views/GitView.tsx index a6155f36..989f9066 100644 --- a/packages/ui/src/components/views/GitView.tsx +++ b/packages/ui/src/components/views/GitView.tsx @@ -2019,14 +2019,14 @@ export const GitView: React.FC = ({ isActive }) => { } }, [currentDirectory, git, conflictOperation, refreshStatusAndBranches, refreshLog, clearConflictState, t]); - // Check if there are unresolved conflicts (files with 'U' status) - const hasUnresolvedConflicts = React.useMemo(() => { - if (!status?.files) return false; - return status.files.some((f) => + // Count unresolved conflicts (files with 'U' status) + const conflictCount = React.useMemo(() => { + if (!status?.files) return 0; + return status.files.filter((f) => (f.index === 'U' || f.working_dir === 'U') || (f.index === 'A' && f.working_dir === 'A') || (f.index === 'D' && f.working_dir === 'D') - ); + ).length; }, [status?.files]); const handleContinueOperation = React.useCallback(async () => { @@ -2350,7 +2350,7 @@ export const GitView: React.FC = ({ isActive }) => { onContinue={handleContinueOperation} onAbort={handleAbortOperation} onResolveWithAI={handleResolveWithAIFromBanner} - hasUnresolvedConflicts={hasUnresolvedConflicts} + conflictCount={conflictCount} isLoading={isLoading} /> )} diff --git a/packages/ui/src/components/views/git/InProgressOperationBanner.tsx b/packages/ui/src/components/views/git/InProgressOperationBanner.tsx index 64d461ab..d364e919 100644 --- a/packages/ui/src/components/views/git/InProgressOperationBanner.tsx +++ b/packages/ui/src/components/views/git/InProgressOperationBanner.tsx @@ -10,7 +10,7 @@ interface InProgressOperationBannerProps { onContinue: () => Promise; onAbort: () => Promise; onResolveWithAI?: () => void; - hasUnresolvedConflicts?: boolean; + conflictCount?: number; isLoading?: boolean; } @@ -20,7 +20,7 @@ export const InProgressOperationBanner: React.FC onContinue, onAbort, onResolveWithAI, - hasUnresolvedConflicts = false, + conflictCount = 0, isLoading = false, }) => { const { t } = useI18n(); @@ -30,7 +30,7 @@ export const InProgressOperationBanner: React.FC const hasMergeInProgress = mergeInProgress && mergeInProgress.head; const hasRebaseInProgress = rebaseInProgress && (rebaseInProgress.headName || rebaseInProgress.onto); const operation = hasMergeInProgress ? 'merge' : hasRebaseInProgress ? 'rebase' : null; - + if (!operation) { return null; } @@ -54,54 +54,52 @@ export const InProgressOperationBanner: React.FC }; const isProcessing = processingAction !== null; + const hasUnresolvedConflicts = conflictCount > 0; const operationLabel = operation === 'merge' ? t('gitView.operation.merge') : t('gitView.operation.rebase'); - const operationIconName = operation === 'merge' ? 'git-merge' : 'git-branch'; // Build description let description = ''; if (mergeInProgress) { - description = mergeInProgress.message + description = mergeInProgress.message ? t('gitView.operation.mergingMessage', { message: mergeInProgress.message }) : t('gitView.operation.mergeInProgressWithHead', { head: mergeInProgress.head }); } else if (rebaseInProgress) { - description = rebaseInProgress.headName + description = rebaseInProgress.headName ? t('gitView.operation.rebasingOnto', { headName: rebaseInProgress.headName, onto: rebaseInProgress.onto || '' }) : t('gitView.operation.rebaseInProgress'); } + const title = !hasUnresolvedConflicts + ? t('gitView.operation.inProgressTitle', { operation: operationLabel }) + : conflictCount === 1 + ? t('gitView.operation.inProgressTitleOneConflict', { operation: operationLabel, count: conflictCount }) + : t('gitView.operation.inProgressTitleManyConflicts', { operation: operationLabel, count: conflictCount }); + + const hint = hasUnresolvedConflicts + ? t('gitView.operation.resolveConflictsHint') + : t('gitView.operation.readyToContinueHint'); + return ( -
-
-
- -
-

- {t('gitView.operation.inProgressTitle', { operation: operationLabel })} +

+
+
+

+ {title} +

+ {description && ( +

+ {description}

- {description && ( -

- {description} -

- )} -
+ )}
-
- {hasUnresolvedConflicts && onResolveWithAI && ( - - )} +
+

+ {hint} +

- {processingAction !== 'continue' && ( +
- )} - {!hasUnresolvedConflicts && ( - + ) + : ( + )} - {t('gitView.operation.continue')} - - )} +
- - {hasUnresolvedConflicts && ( -

- {t('gitView.operation.resolveConflictsHint')} -

- )}
); diff --git a/packages/ui/src/lib/i18n/messages/en.ts b/packages/ui/src/lib/i18n/messages/en.ts index 8a977fb3..e2827daf 100644 --- a/packages/ui/src/lib/i18n/messages/en.ts +++ b/packages/ui/src/lib/i18n/messages/en.ts @@ -833,12 +833,15 @@ export const dict = { 'gitView.operation.abort': 'Abort', 'gitView.operation.continue': 'Continue', 'gitView.operation.inProgressTitle': '{operation} in progress', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} in progress: {count} conflicts', + 'gitView.operation.inProgressTitleOneConflict': '{operation} in progress: {count} conflict', 'gitView.operation.merge': 'Merge', 'gitView.operation.mergeInProgressWithHead': 'Merging {head}', 'gitView.operation.mergingMessage': 'Merging: {message}', 'gitView.operation.rebase': 'Rebase', 'gitView.operation.rebaseInProgress': 'Rebase in progress', 'gitView.operation.rebasingOnto': 'Rebasing {headName} onto {onto}', + 'gitView.operation.readyToContinueHint': 'All conflicts resolved. Continue to finish the operation.', 'gitView.operation.resolveConflictsHint': 'Resolve conflicts, then continue the operation.', 'gitView.operation.resolveWithAi': 'Resolve with AI', 'gitView.stash.confirmButton': '{operation}', diff --git a/packages/ui/src/lib/i18n/messages/es.ts b/packages/ui/src/lib/i18n/messages/es.ts index f4e82a04..6d9ac6ff 100644 --- a/packages/ui/src/lib/i18n/messages/es.ts +++ b/packages/ui/src/lib/i18n/messages/es.ts @@ -834,12 +834,15 @@ export const dict: Record = { "gitView.operation.abort": "Abortar", "gitView.operation.continue": "Continuar", "gitView.operation.inProgressTitle": "{operation} en progreso", + "gitView.operation.inProgressTitleManyConflicts": "{operation} en curso: {count} conflictos", + "gitView.operation.inProgressTitleOneConflict": "{operation} en curso: {count} conflicto", "gitView.operation.merge": "Merge", "gitView.operation.mergeInProgressWithHead": "Haciendo merge de {head}", "gitView.operation.mergingMessage": "Haciendo merge: {message}", "gitView.operation.rebase": "Rebase", "gitView.operation.rebaseInProgress": "Rebase en progreso", "gitView.operation.rebasingOnto": "Haciendo rebase de {headName} sobre {onto}", + "gitView.operation.readyToContinueHint": "Todos los conflictos están resueltos. Continúa para finalizar la operación.", "gitView.operation.resolveConflictsHint": "Resuelve los conflictos y luego continúa la operación.", "gitView.operation.resolveWithAi": "Resolver con IA", "gitView.stash.confirmButton": "Guardar cambios y continuar", diff --git a/packages/ui/src/lib/i18n/messages/fr.ts b/packages/ui/src/lib/i18n/messages/fr.ts index cdf7c8c5..cf7deb19 100644 --- a/packages/ui/src/lib/i18n/messages/fr.ts +++ b/packages/ui/src/lib/i18n/messages/fr.ts @@ -661,12 +661,15 @@ export const dict = { 'gitView.operation.abort': 'Avorter', 'gitView.operation.continue': 'Continuer', 'gitView.operation.inProgressTitle': '{operation} en cours', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} en cours : {count} conflits', + 'gitView.operation.inProgressTitleOneConflict': '{operation} en cours : {count} conflit', 'gitView.operation.merge': 'Fusionner', 'gitView.operation.mergeInProgressWithHead': 'Fusion de {head}', 'gitView.operation.mergingMessage': 'Fusion : {message}', 'gitView.operation.rebase': 'Rebase', 'gitView.operation.rebaseInProgress': 'Rebase en cours', 'gitView.operation.rebasingOnto': 'Rebaser {headName} sur {onto}', + 'gitView.operation.readyToContinueHint': 'Tous les conflits sont résolus. Poursuivez pour terminer l’opération.', 'gitView.operation.resolveConflictsHint': 'Résolvez les conflits, puis poursuivez l\'opération.', 'gitView.operation.resolveWithAi': 'Résoudre avec l\'IA', 'gitView.stash.confirmButton': 'Confirmer', diff --git a/packages/ui/src/lib/i18n/messages/ja.ts b/packages/ui/src/lib/i18n/messages/ja.ts index 7c0f76eb..52ea80ff 100644 --- a/packages/ui/src/lib/i18n/messages/ja.ts +++ b/packages/ui/src/lib/i18n/messages/ja.ts @@ -830,12 +830,15 @@ export const dict: Record = { 'gitView.operation.abort': '中止', 'gitView.operation.continue': '続行', 'gitView.operation.inProgressTitle': '{operation}進行中', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} 進行中: 競合 {count} 件', + 'gitView.operation.inProgressTitleOneConflict': '{operation} 進行中: 競合 {count} 件', 'gitView.operation.merge': 'マージ', 'gitView.operation.mergeInProgressWithHead': '{head}をマージ中', 'gitView.operation.mergingMessage': 'マージ中: {message}', 'gitView.operation.rebase': 'リベース', 'gitView.operation.rebaseInProgress': 'リベース進行中', 'gitView.operation.rebasingOnto': '{headName}を{onto}にリベース中', + 'gitView.operation.readyToContinueHint': 'すべての競合が解決されました。続行して操作を完了してください。', 'gitView.operation.resolveConflictsHint': '競合を解決してから操作を続行してください。', 'gitView.operation.resolveWithAi': 'AIで解決', 'gitView.stash.confirmButton': '{operation}', diff --git a/packages/ui/src/lib/i18n/messages/ko.ts b/packages/ui/src/lib/i18n/messages/ko.ts index 0bce6f37..a56fb91d 100644 --- a/packages/ui/src/lib/i18n/messages/ko.ts +++ b/packages/ui/src/lib/i18n/messages/ko.ts @@ -834,12 +834,15 @@ export const dict: Record = { 'gitView.operation.abort': '중단', 'gitView.operation.continue': '계속', 'gitView.operation.inProgressTitle': '{operation} 진행 중', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} 진행 중: 충돌 {count}개', + 'gitView.operation.inProgressTitleOneConflict': '{operation} 진행 중: 충돌 {count}개', 'gitView.operation.merge': '병합', 'gitView.operation.mergeInProgressWithHead': '{head} 병합 진행 중', 'gitView.operation.mergingMessage': '병합 중: {message}', 'gitView.operation.rebase': '리베이스', 'gitView.operation.rebaseInProgress': '리베이스 진행 중', 'gitView.operation.rebasingOnto': '{headName}을(를) {onto} 위로 리베이스 중', + 'gitView.operation.readyToContinueHint': '모든 충돌이 해결되었습니다. 계속하여 작업을 완료하세요.', 'gitView.operation.resolveConflictsHint': '충돌을 해결한 뒤 작업을 계속하세요.', 'gitView.operation.resolveWithAi': 'AI로 해결', 'gitView.stash.confirmButton': '확인', diff --git a/packages/ui/src/lib/i18n/messages/pl.ts b/packages/ui/src/lib/i18n/messages/pl.ts index 1a78ae00..3e46db2a 100644 --- a/packages/ui/src/lib/i18n/messages/pl.ts +++ b/packages/ui/src/lib/i18n/messages/pl.ts @@ -2023,12 +2023,15 @@ export const dict: Record = { 'gitView.operation.abort': 'Przerwij', 'gitView.operation.continue': 'Kontynuuj', 'gitView.operation.inProgressTitle': 'Operacja w toku', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} w toku: {count} konfliktów', + 'gitView.operation.inProgressTitleOneConflict': '{operation} w toku: {count} konflikt', 'gitView.operation.merge': 'Scal', 'gitView.operation.mergeInProgressWithHead': 'Trwa scalanie z HEAD', 'gitView.operation.mergingMessage': 'Trwa scalanie', 'gitView.operation.rebase': 'Rebase', 'gitView.operation.rebaseInProgress': 'Trwa rebase', 'gitView.operation.rebasingOnto': 'Wykonywanie rebase na', + 'gitView.operation.readyToContinueHint': 'Wszystkie konflikty rozwiązane. Kontynuuj, aby zakończyć operację.', 'gitView.operation.resolveConflictsHint': 'Rozwiąż konflikty, aby kontynuować.', 'gitView.operation.resolveWithAi': 'Rozwiąż za pomocą AI', 'gitView.pr.actions.add': 'Dodaj', diff --git a/packages/ui/src/lib/i18n/messages/pt-BR.ts b/packages/ui/src/lib/i18n/messages/pt-BR.ts index d1c8e309..15b2ae73 100644 --- a/packages/ui/src/lib/i18n/messages/pt-BR.ts +++ b/packages/ui/src/lib/i18n/messages/pt-BR.ts @@ -834,12 +834,15 @@ export const dict: Record = { "gitView.operation.abort": "Abortar", "gitView.operation.continue": "Continuar", "gitView.operation.inProgressTitle": "{operation} em andamento", + "gitView.operation.inProgressTitleManyConflicts": "{operation} em andamento: {count} conflitos", + "gitView.operation.inProgressTitleOneConflict": "{operation} em andamento: {count} conflito", "gitView.operation.merge": "Merge", "gitView.operation.mergeInProgressWithHead": "Fazendo merge de {head}", "gitView.operation.mergingMessage": "Fazendo merge: {message}", "gitView.operation.rebase": "Rebase", "gitView.operation.rebaseInProgress": "Rebase em andamento", "gitView.operation.rebasingOnto": "Fazendo rebase de {headName} sobre {onto}", + "gitView.operation.readyToContinueHint": "Todos os conflitos foram resolvidos. Continue para finalizar a operação.", "gitView.operation.resolveConflictsHint": "Resolva os conflitos e depois continue a operação.", "gitView.operation.resolveWithAi": "Resolver com IA", "gitView.stash.confirmButton": "Salvar alterações e continuar", diff --git a/packages/ui/src/lib/i18n/messages/uk.ts b/packages/ui/src/lib/i18n/messages/uk.ts index 2f8f2de8..71d6b0f1 100644 --- a/packages/ui/src/lib/i18n/messages/uk.ts +++ b/packages/ui/src/lib/i18n/messages/uk.ts @@ -834,12 +834,15 @@ export const dict: Record = { "gitView.operation.abort": "Перервати", "gitView.operation.continue": "Продовжити", "gitView.operation.inProgressTitle": "Виконується {operation}", + "gitView.operation.inProgressTitleManyConflicts": "{operation} у процесі: {count} конфліктів", + "gitView.operation.inProgressTitleOneConflict": "{operation} у процесі: {count} конфлікт", "gitView.operation.merge": "Злити", "gitView.operation.mergeInProgressWithHead": "Виконується злиття з {head}", "gitView.operation.mergingMessage": "Виконується злиття: {message}", "gitView.operation.rebase": "Перебазувати", "gitView.operation.rebaseInProgress": "Виконується перебазування", "gitView.operation.rebasingOnto": "Перебазування {headName} на {onto}", + "gitView.operation.readyToContinueHint": "Усі конфлікти вирішено. Продовжте, щоб завершити операцію.", "gitView.operation.resolveConflictsHint": "Вирішіть конфлікти, потім продовжіть операцію.", "gitView.operation.resolveWithAi": "Вирішити за допомогою ШІ", "gitView.stash.confirmButton": "Підтвердити", diff --git a/packages/ui/src/lib/i18n/messages/zh-CN.ts b/packages/ui/src/lib/i18n/messages/zh-CN.ts index 2b0c835c..d06958c5 100644 --- a/packages/ui/src/lib/i18n/messages/zh-CN.ts +++ b/packages/ui/src/lib/i18n/messages/zh-CN.ts @@ -834,12 +834,15 @@ export const dict: Record = { 'gitView.operation.abort': '中止', 'gitView.operation.continue': '继续', 'gitView.operation.inProgressTitle': '{operation} 进行中', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} 进行中:{count} 个冲突', + 'gitView.operation.inProgressTitleOneConflict': '{operation} 进行中:{count} 个冲突', 'gitView.operation.merge': '合并', 'gitView.operation.mergeInProgressWithHead': '合并进行中({head})', 'gitView.operation.mergingMessage': '正在合并:{message}', 'gitView.operation.rebase': '变基', 'gitView.operation.rebaseInProgress': '变基进行中', 'gitView.operation.rebasingOnto': '正在将 {headName} 变基到 {onto}', + 'gitView.operation.readyToContinueHint': '所有冲突已解决。继续以完成操作。', 'gitView.operation.resolveConflictsHint': '解决冲突,然后继续操作。', 'gitView.operation.resolveWithAi': '使用 AI 解决', 'gitView.stash.confirmButton': '储藏并{operation}', diff --git a/packages/ui/src/lib/i18n/messages/zh-TW.ts b/packages/ui/src/lib/i18n/messages/zh-TW.ts index 598dc9ec..b2f79bcf 100644 --- a/packages/ui/src/lib/i18n/messages/zh-TW.ts +++ b/packages/ui/src/lib/i18n/messages/zh-TW.ts @@ -846,12 +846,15 @@ export const dict: Record = { 'gitView.operation.abort': '中止', 'gitView.operation.continue': '繼續', 'gitView.operation.inProgressTitle': '{operation} 進行中', + 'gitView.operation.inProgressTitleManyConflicts': '{operation} 進行中:{count} 個衝突', + 'gitView.operation.inProgressTitleOneConflict': '{operation} 進行中:{count} 個衝突', 'gitView.operation.merge': '合併', 'gitView.operation.mergeInProgressWithHead': '合併進行中({head})', 'gitView.operation.mergingMessage': '正在合併:{message}', 'gitView.operation.rebase': 'Rebase', 'gitView.operation.rebaseInProgress': 'Rebase 進行中', 'gitView.operation.rebasingOnto': '正在將 {headName} Rebase 到 {onto}', + 'gitView.operation.readyToContinueHint': '所有衝突已解決。繼續以完成操作。', 'gitView.operation.resolveConflictsHint': '解決衝突,然後繼續操作。', 'gitView.operation.resolveWithAi': '使用 AI 解決', 'gitView.stash.confirmButton': 'Stash 並 {operation}',