Skip to content

Commit f99bc07

Browse files
fix(app): keep side panel tab close buttons in view and add a tab menu (#60244)
Co-authored-by: neriousy <34747899+neriousy@users.noreply.github.com>
1 parent 589c62d commit f99bc07

67 files changed

Lines changed: 180 additions & 1 deletion

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

‎packages/app/e2e/regression/side-panels.spec.ts‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,54 @@ test("closing the last New tab closes the side region, and only a New tab lists
212212
await expect(review).toBeVisible()
213213
})
214214

215+
test("tabs in a narrow side strip shrink to keep their close buttons, and a tab's menu closes the others", async ({
216+
page,
217+
}) => {
218+
await page.setViewportSize({ width: 1000, height: 700 })
219+
const directory = "C:/OpenCode/NarrowStrip"
220+
const key = `local\u0000${base64Encode(directory)}/ses_narrowstrip`
221+
const files = ["a.md", "a-file-name-long-enough-to-overflow-the-side-strip-by-itself.md", "b.md"]
222+
223+
await openSession(page, {
224+
name: "NarrowStrip",
225+
fileList: () => [],
226+
fileContent: (path) => ({ type: "text", content: `contents:${path}` }),
227+
seed: {
228+
panes: { ses_narrowstrip: { review: true, sessionWidth: 640 } },
229+
storage: {
230+
"opencode.global.dat:layout": {
231+
sessionTabs: { [key]: { all: files.map((file) => `file://${file}`), active: `file://${files[1]}` } },
232+
},
233+
},
234+
},
235+
})
236+
237+
const side = page.locator('[data-pane-content="side"]')
238+
const add = side.getByRole("button", { name: "Add tab", exact: true })
239+
await expect(side.getByRole("tab", { name: files[1], exact: true })).toHaveAttribute("aria-selected", "true")
240+
241+
// Every tab's close button stays left of "+", instead of the strip scrolling it away under its edge fade.
242+
const end = (await add.boundingBox())!.x
243+
const closes = side.locator('[data-pane-strip="side"] [data-slot="tabs-trigger-close-button"]')
244+
await expect(closes).toHaveCount(files.length)
245+
246+
for (const close of await closes.all()) {
247+
const box = (await close.boundingBox())!
248+
expect(box.x + box.width).toBeLessThanOrEqual(end)
249+
}
250+
251+
await side.getByRole("tab", { name: "b.md", exact: true }).click({ button: "right" })
252+
await page.getByRole("menuitem", { name: "Close other tabs", exact: true }).click()
253+
await expect(side.getByRole("tab")).toHaveCount(1)
254+
await expect(side.getByRole("tab", { name: "b.md", exact: true })).toHaveAttribute("aria-selected", "true")
255+
256+
// With nothing else to close, the menu offers only the tab itself.
257+
await side.getByRole("tab", { name: "b.md", exact: true }).click({ button: "right" })
258+
await expect(page.getByRole("menuitem", { name: "Close other tabs", exact: true })).toBeDisabled()
259+
await page.getByRole("menuitem", { name: "Close tab", exact: true }).click()
260+
await expect(side.getByRole("tab", { name: "b.md", exact: true })).toHaveCount(0)
261+
})
262+
215263
// A DOM mark survives only while the same node stays mounted.
216264
function mark(locator: Locator) {
217265
return locator.evaluate((element) => element.setAttribute("data-e2e-mounted", "original"))

‎packages/app/src/runtime/i18n/am.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -725,6 +725,7 @@ export const dict = {
725725
"toast.migration.progress.working.progress": "ውሂብ በማዛወር ላይ {{current}}/{{total}}",
726726
"home.workspaceTip": "ለውጦችን ለብለል ለማቆየት ቀጣዩን ክፍለ ጊዜ በአዲስ የስራ ቦታ ይጀምሩ",
727727
"session.tab.add": "ትር አክል",
728+
"session.tab.closeOthers": "ሌሎች ትሮችን ዝጋ",
728729
"session.queue.attachments.one": "ፕላስ {{count}} አባሪ",
729730
"session.queue.attachments.other": "ፕላስ {{count}} አባሪዎች",
730731
"settings.backToSettings": "ወደ ቅንብሮች ተመለስ",

‎packages/app/src/runtime/i18n/ar.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -777,6 +777,7 @@ export const dict = {
777777
"dialog.server.menu.remove": "إزالة",
778778
"home.workspaceTip": "ابدأ الجلسة التالية في شجرة عمل جديدة لإبقاء التغييرات معزولة",
779779
"session.tab.add": "إضافة علامة تبويب",
780+
"session.tab.closeOthers": "إغلاق علامات التبويب الأخرى",
780781
"session.queue.attachments.one": "بالإضافة إلى {{count}} مرفق",
781782
"session.queue.attachments.other": "بالإضافة إلى \u2068{{count}}\u2069 مرفقات",
782783
"settings.backToSettings": "العودة إلى الإعدادات",

‎packages/app/src/runtime/i18n/az.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,7 @@ export const dict = {
749749
"toast.migration.progress.working.progress": "Məlumatlar köçürülür {{current}}/{{total}}",
750750
"home.workspaceTip": "Dəyişiklikləri izolə etmək üçün növbəti sessiyanı yeni iş sahəsində başlayın",
751751
"session.tab.add": "Tab əlavə et",
752+
"session.tab.closeOthers": "Digər tabları bağla",
752753
"session.queue.attachments.one": "{{count}} əlavə əlavə et",
753754
"session.queue.attachments.other": "{{count}} əlavə əlavələr əlavə et",
754755
"settings.backToSettings": "Parametrlərə qayıt",

‎packages/app/src/runtime/i18n/bg.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,6 +748,7 @@ export const dict = {
748748
"toast.migration.progress.working.progress": "Мигриране на данни {{current}}/{{total}}",
749749
"home.workspaceTip": "Започнете следващата сесия в ново работно пространство, за да запазите промените изолирани",
750750
"session.tab.add": "Добавяне на раздел",
751+
"session.tab.closeOthers": "Затваряне на другите раздели",
751752
"session.queue.attachments.one": "Плюс {{count}} прикачен файл",
752753
"session.queue.attachments.other": "Плюс {{count}} прикачени файла",
753754
"settings.backToSettings": "Назад към настройките",

‎packages/app/src/runtime/i18n/bn.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -749,6 +749,7 @@ export const dict = {
749749
"toast.migration.progress.working.progress": "ডেটা স্থানান্তরিত হচ্ছে {{current}}/{{total}}",
750750
"home.workspaceTip": "পরিবর্তনগুলিকে বিচ্ছিন্ন রাখতে একটি নতুন কর্মক্ষেত্রে পরবর্তী সেশন শুরু করুন৷",
751751
"session.tab.add": "ট্যাব যোগ করুন",
752+
"session.tab.closeOthers": "অন্য ট্যাবগুলো বন্ধ করুন",
752753
"session.queue.attachments.one": "প্লাস {{count}} সংযুক্তি",
753754
"session.queue.attachments.other": "প্লাস {{count}}টি সংযুক্তি৷",
754755
"settings.backToSettings": "সেটিংসে ফিরে যান",

‎packages/app/src/runtime/i18n/br.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export const dict = {
3737
"dialog.server.menu.remove": "Remover",
3838
"home.workspaceTip": "Inicie a próxima sessão em um novo espaço de trabalho para manter as alterações isoladas",
3939
"session.tab.add": "Adicionar guia",
40+
"session.tab.closeOthers": "Fechar outras abas",
4041
"session.queue.attachments.one": "Mais acessório {{count}}",
4142
"session.queue.attachments.other": "Mais acessórios {{count}}",
4243
"settings.backToSettings": "Voltar às configurações",

‎packages/app/src/runtime/i18n/bs.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -813,6 +813,7 @@ export const dict = {
813813
"toast.migration.progress.working.progress": "Migracija podataka {{current}}/{{total}}",
814814
"home.workspaceTip": "Pokrenite sljedeću sesiju u novom radnom prostoru kako bi promjene ostale izolovane",
815815
"session.tab.add": "Dodaj karticu",
816+
"session.tab.closeOthers": "Zatvori ostale kartice",
816817
"session.queue.attachments.one": "Još {{count}} prilog",
817818
"session.queue.attachments.few": "Još {{count}} priloga",
818819
"session.queue.attachments.other": "Još {{count}} priloga",

‎packages/app/src/runtime/i18n/ca.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ export const dict = {
744744
"dialog.server.menu.remove": "Elimina",
745745
"home.workspaceTip": "Inicieu la propera sessió en un nou espai de treball per mantenir els canvis aïllats",
746746
"session.tab.add": "Afegeix una pestanya",
747+
"session.tab.closeOthers": "Tanca les altres pestanyes",
747748
"session.queue.attachments.one": "Més adjunt {{count}}",
748749
"session.queue.attachments.other": "Més fitxers adjunts {{count}}",
749750
"settings.backToSettings": "Tornar a la configuració",

‎packages/app/src/runtime/i18n/cs.ts‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -758,6 +758,7 @@ export const dict = {
758758
"toast.migration.progress.working.progress": "Migrace dat {{current}}/{{total}}",
759759
"home.workspaceTip": "Spusťte příští relaci v novém pracovním prostoru, aby změny zůstaly oddělené",
760760
"session.tab.add": "Přidat kartu",
761+
"session.tab.closeOthers": "Zavřít ostatní karty",
761762
"session.queue.attachments.one": "A {{count}} příloha",
762763
"session.queue.attachments.few": "A {{count}} přílohy",
763764
"session.queue.attachments.many": "A {{count}} přílohy",

0 commit comments

Comments
 (0)