Make the workspace right pane a first-class tab host (#3287)
* feat(app): add persistent workspace side panes Keep the common review and file-browsing workflow beside the active agent without tearing down pane contents. Workspace tabs now share one compact chip language, assistant file links route into the retained right pane, and diff/file trees share stable geometry. * fix(app): localize pull request empty state * test(app): update explorer pane coverage * fix(app): preserve explorer pane workflows * test(app): make explorer tab selection idempotent * fix(app): persist workspace review pins * fix(app): preserve sidebar scrim drag hook * fix(app): restore companion pane interactions * test(app): follow selected sidebar surface
This commit is contained in:
@@ -129,6 +129,15 @@ describe("translation resources", () => {
|
||||
expect(countMatchingEnglishStrings(zhCN)).toBeLessThan(maxFallbackStrings);
|
||||
});
|
||||
|
||||
it("localizes the pull request empty state in every supported language", () => {
|
||||
for (const resource of [ar, es, fr, ja, ko, ptBR, ru, zhCN]) {
|
||||
expect(resource.panels.pullRequest.emptyTitle).not.toBe(en.panels.pullRequest.emptyTitle);
|
||||
expect(resource.panels.pullRequest.emptyDescription).not.toBe(
|
||||
en.panels.pullRequest.emptyDescription,
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
it("preserves interpolation placeholders in every language", () => {
|
||||
expect(findInterpolationMismatches(ar)).toEqual([]);
|
||||
expect(findInterpolationMismatches(es)).toEqual([]);
|
||||
|
||||
@@ -587,6 +587,7 @@ export const ar: TranslationResources = {
|
||||
renameAgent: "إعادة تسمية الوكيل",
|
||||
},
|
||||
actions: {
|
||||
newTab: "علامة تبويب جديدة",
|
||||
newAgent: "وكيل جديد",
|
||||
newTerminal: "محطة جديدة",
|
||||
preparingTerminal: "إعداد علامة التبويب المحطة الطرفية",
|
||||
@@ -595,6 +596,9 @@ export const ar: TranslationResources = {
|
||||
exitFocusMode: "إنهاء وضع التركيز",
|
||||
splitRight: "تقسيم الجزء الأيمن",
|
||||
splitDown: "تقسيم الجزء لأسفل",
|
||||
changes: "التغييرات",
|
||||
files: "الملفات",
|
||||
pullRequest: "طلب السحب",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "تثبيت",
|
||||
@@ -1658,6 +1662,17 @@ export const ar: TranslationResources = {
|
||||
reloadMessage: "ستفقد تغييراتك المحلية.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "الملفات",
|
||||
subtitle: "ملفات مساحة العمل",
|
||||
tooltip: "تصفح ملفات مساحة العمل",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "طلب السحب",
|
||||
subtitle: "تفاصيل طلب السحب",
|
||||
emptyTitle: "لا يوجد طلب سحب بعد",
|
||||
emptyDescription: "أنشئ طلب سحب لنسخة العمل هذه لعرض تفاصيله هنا.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "التغييرات",
|
||||
changesSubtitle: "فروقات شجرة العمل",
|
||||
|
||||
@@ -585,6 +585,7 @@ export const en = {
|
||||
renameAgent: "Rename agent",
|
||||
},
|
||||
actions: {
|
||||
newTab: "New tab",
|
||||
newAgent: "New agent",
|
||||
newTerminal: "New terminal",
|
||||
preparingTerminal: "Preparing terminal tab",
|
||||
@@ -593,6 +594,9 @@ export const en = {
|
||||
exitFocusMode: "Exit focus mode",
|
||||
splitRight: "Split pane right",
|
||||
splitDown: "Split pane down",
|
||||
changes: "Changes",
|
||||
files: "Files",
|
||||
pullRequest: "Pull request",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "Pin",
|
||||
@@ -1668,6 +1672,17 @@ export const en = {
|
||||
reloadMessage: "Your local changes will be lost.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "Files",
|
||||
subtitle: "Workspace files",
|
||||
tooltip: "Browse workspace files",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "Pull request",
|
||||
subtitle: "Pull request details",
|
||||
emptyTitle: "No pull request yet",
|
||||
emptyDescription: "Create a pull request for this checkout to see its details here.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "Changes",
|
||||
changesSubtitle: "Working tree diff",
|
||||
|
||||
@@ -592,6 +592,7 @@ export const es: TranslationResources = {
|
||||
renameAgent: "Cambiar nombre del agente",
|
||||
},
|
||||
actions: {
|
||||
newTab: "Nueva pestaña",
|
||||
newAgent: "Nuevo agente",
|
||||
newTerminal: "Nueva terminal",
|
||||
preparingTerminal: "Preparando la pestaña del terminal",
|
||||
@@ -600,6 +601,9 @@ export const es: TranslationResources = {
|
||||
exitFocusMode: "Salir del modo de concentración",
|
||||
splitRight: "Panel dividido a la derecha",
|
||||
splitDown: "Dividir panel hacia abajo",
|
||||
changes: "Cambios",
|
||||
files: "Archivos",
|
||||
pullRequest: "Solicitud de extracción",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "Fijar",
|
||||
@@ -1701,6 +1705,17 @@ export const es: TranslationResources = {
|
||||
reloadMessage: "Se perderán tus cambios locales.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "Archivos",
|
||||
subtitle: "Archivos del espacio de trabajo",
|
||||
tooltip: "Explorar archivos del espacio de trabajo",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "Solicitud de extracción",
|
||||
subtitle: "Detalles de la solicitud de extracción",
|
||||
emptyTitle: "Aún no hay ninguna solicitud de extracción",
|
||||
emptyDescription: "Crea una solicitud para este checkout y consulta aquí sus detalles.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "Cambios",
|
||||
changesSubtitle: "Diferencias del árbol de trabajo",
|
||||
|
||||
@@ -592,6 +592,7 @@ export const fr: TranslationResources = {
|
||||
renameAgent: "Renommer l'agent",
|
||||
},
|
||||
actions: {
|
||||
newTab: "Nouvel onglet",
|
||||
newAgent: "Nouvel agent",
|
||||
newTerminal: "Nouveau terminal",
|
||||
preparingTerminal: "Préparation de l'onglet du terminal",
|
||||
@@ -600,6 +601,9 @@ export const fr: TranslationResources = {
|
||||
exitFocusMode: "Quitter le mode concentration",
|
||||
splitRight: "Volet divisé à droite",
|
||||
splitDown: "Diviser le volet vers le bas",
|
||||
changes: "Modifications",
|
||||
files: "Fichiers",
|
||||
pullRequest: "Demande de fusion",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "Épingler",
|
||||
@@ -1705,6 +1709,18 @@ export const fr: TranslationResources = {
|
||||
reloadMessage: "Vos modifications locales seront perdues.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "Fichiers",
|
||||
subtitle: "Fichiers de l’espace de travail",
|
||||
tooltip: "Parcourir les fichiers de l’espace de travail",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "Demande de fusion",
|
||||
subtitle: "Détails de la demande de fusion",
|
||||
emptyTitle: "Aucune demande de fusion pour le moment",
|
||||
emptyDescription:
|
||||
"Créez une demande de fusion pour cette copie de travail afin d’afficher ses détails ici.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "Modifications",
|
||||
changesSubtitle: "Différences de l'arbre de travail",
|
||||
|
||||
@@ -592,6 +592,7 @@ export const ja: TranslationResources = {
|
||||
renameAgent: "エージェントの名前を変更",
|
||||
},
|
||||
actions: {
|
||||
newTab: "新しいタブ",
|
||||
newAgent: "新しいエージェント",
|
||||
newTerminal: "新しいターミナル",
|
||||
preparingTerminal: "ターミナルタブを準備中",
|
||||
@@ -600,6 +601,9 @@ export const ja: TranslationResources = {
|
||||
exitFocusMode: "フォーカスモードを終了",
|
||||
splitRight: "右にペインを分割",
|
||||
splitDown: "下にペインを分割",
|
||||
changes: "変更",
|
||||
files: "ファイル",
|
||||
pullRequest: "プルリクエスト",
|
||||
terminalProfilesMenu: "ターミナルプロファイル",
|
||||
editTerminalProfiles: "プロファイルを編集…",
|
||||
pinTarget: "ピン留め",
|
||||
@@ -1674,6 +1678,18 @@ export const ja: TranslationResources = {
|
||||
reloadMessage: "ローカルの変更は失われます。",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "ファイル",
|
||||
subtitle: "ワークスペースのファイル",
|
||||
tooltip: "ワークスペースのファイルを参照",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "プルリクエスト",
|
||||
subtitle: "プルリクエストの詳細",
|
||||
emptyTitle: "プルリクエストはまだありません",
|
||||
emptyDescription:
|
||||
"このチェックアウトのプルリクエストを作成すると、ここに詳細が表示されます。",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "変更",
|
||||
changesSubtitle: "作業ツリーの差分",
|
||||
|
||||
@@ -589,6 +589,7 @@ export const ko: TranslationResources = {
|
||||
renameAgent: "에이전트 이름 변경",
|
||||
},
|
||||
actions: {
|
||||
newTab: "새 탭",
|
||||
newAgent: "새 에이전트",
|
||||
newTerminal: "새 터미널",
|
||||
preparingTerminal: "터미널 탭 준비 중",
|
||||
@@ -597,6 +598,9 @@ export const ko: TranslationResources = {
|
||||
exitFocusMode: "집중 모드 종료",
|
||||
splitRight: "창을 오른쪽으로 분할",
|
||||
splitDown: "창을 아래로 분할",
|
||||
changes: "변경 사항",
|
||||
files: "파일",
|
||||
pullRequest: "풀 리퀘스트",
|
||||
terminalProfilesMenu: "터미널 프로필",
|
||||
editTerminalProfiles: "프로필 편집…",
|
||||
pinTarget: "고정",
|
||||
@@ -1668,6 +1672,17 @@ export const ko: TranslationResources = {
|
||||
reloadMessage: "로컬 변경사항이 손실됩니다.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "파일",
|
||||
subtitle: "워크스페이스 파일",
|
||||
tooltip: "워크스페이스 파일 탐색",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "풀 리퀘스트",
|
||||
subtitle: "풀 리퀘스트 세부 정보",
|
||||
emptyTitle: "아직 풀 리퀘스트가 없습니다",
|
||||
emptyDescription: "이 체크아웃에 풀 리퀘스트를 만들면 세부 정보가 여기에 표시됩니다.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "변경 사항",
|
||||
changesSubtitle: "작업 트리 diff",
|
||||
|
||||
@@ -591,6 +591,7 @@ export const ptBR: TranslationResources = {
|
||||
renameAgent: "Renomear agente",
|
||||
},
|
||||
actions: {
|
||||
newTab: "Nova aba",
|
||||
newAgent: "Novo agente",
|
||||
newTerminal: "Novo terminal",
|
||||
preparingTerminal: "Preparando aba de terminal",
|
||||
@@ -599,6 +600,9 @@ export const ptBR: TranslationResources = {
|
||||
exitFocusMode: "Sair do modo de foco",
|
||||
splitRight: "Dividir painel à direita",
|
||||
splitDown: "Dividir painel abaixo",
|
||||
changes: "Alterações",
|
||||
files: "Arquivos",
|
||||
pullRequest: "Pull request",
|
||||
terminalProfilesMenu: "Perfis de terminal",
|
||||
editTerminalProfiles: "Editar perfis…",
|
||||
pinTarget: "Fixar",
|
||||
@@ -1687,6 +1691,17 @@ export const ptBR: TranslationResources = {
|
||||
reloadMessage: "Suas alterações locais serão perdidas.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "Arquivos",
|
||||
subtitle: "Arquivos do espaço de trabalho",
|
||||
tooltip: "Explorar arquivos do espaço de trabalho",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "Pull request",
|
||||
subtitle: "Detalhes do pull request",
|
||||
emptyTitle: "Ainda não há pull request",
|
||||
emptyDescription: "Crie um pull request para este checkout para ver os detalhes aqui.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "Alterações",
|
||||
changesSubtitle: "Diff da árvore de trabalho",
|
||||
|
||||
@@ -591,6 +591,7 @@ export const ru: TranslationResources = {
|
||||
renameAgent: "Переименовать агента",
|
||||
},
|
||||
actions: {
|
||||
newTab: "Новая вкладка",
|
||||
newAgent: "Новый агент",
|
||||
newTerminal: "Новый терминал",
|
||||
preparingTerminal: "Подготовка вкладки терминала",
|
||||
@@ -599,6 +600,9 @@ export const ru: TranslationResources = {
|
||||
exitFocusMode: "Выйти из режима фокусировки",
|
||||
splitRight: "Разделить панель справа",
|
||||
splitDown: "Разделить панель вниз",
|
||||
changes: "Изменения",
|
||||
files: "Файлы",
|
||||
pullRequest: "Запрос на слияние",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "Закрепить",
|
||||
@@ -1692,6 +1696,18 @@ export const ru: TranslationResources = {
|
||||
reloadMessage: "Локальные изменения будут потеряны.",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "Файлы",
|
||||
subtitle: "Файлы рабочего пространства",
|
||||
tooltip: "Просмотр файлов рабочего пространства",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "Запрос на слияние",
|
||||
subtitle: "Сведения о запросе на слияние",
|
||||
emptyTitle: "Запроса на слияние пока нет",
|
||||
emptyDescription:
|
||||
"Создайте запрос на слияние для этой рабочей копии, чтобы увидеть здесь его сведения.",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "Изменения",
|
||||
changesSubtitle: "Различия рабочего дерева",
|
||||
|
||||
@@ -587,6 +587,7 @@ export const zhCN: TranslationResources = {
|
||||
renameAgent: "重命名 Agent",
|
||||
},
|
||||
actions: {
|
||||
newTab: "新建标签页",
|
||||
newAgent: "新建 Agent",
|
||||
newTerminal: "新建 Terminal",
|
||||
preparingTerminal: "正在准备 Terminal 标签",
|
||||
@@ -595,6 +596,9 @@ export const zhCN: TranslationResources = {
|
||||
exitFocusMode: "退出专注模式",
|
||||
splitRight: "向右拆分窗格",
|
||||
splitDown: "向下拆分窗格",
|
||||
changes: "更改",
|
||||
files: "文件",
|
||||
pullRequest: "拉取请求",
|
||||
terminalProfilesMenu: "Terminal profiles",
|
||||
editTerminalProfiles: "Edit profiles…",
|
||||
pinTarget: "固定",
|
||||
@@ -1638,6 +1642,17 @@ export const zhCN: TranslationResources = {
|
||||
reloadMessage: "本地更改将丢失。",
|
||||
},
|
||||
},
|
||||
files: {
|
||||
label: "文件",
|
||||
subtitle: "工作区文件",
|
||||
tooltip: "浏览工作区文件",
|
||||
},
|
||||
pullRequest: {
|
||||
label: "拉取请求",
|
||||
subtitle: "拉取请求详情",
|
||||
emptyTitle: "尚无拉取请求",
|
||||
emptyDescription: "为此检出创建拉取请求后,可在此处查看其详情。",
|
||||
},
|
||||
diff: {
|
||||
changesLabel: "更改",
|
||||
changesSubtitle: "工作区差异",
|
||||
|
||||
Reference in New Issue
Block a user