From c688651242eb4969f1ca4ba87790cfa335779bcf Mon Sep 17 00:00:00 2001 From: ktx-abhay Date: Wed, 4 Nov 2026 14:32:42 +0530 Subject: [PATCH] fix(oncall): round 3 fixes for My on-call, page detail, Pages and Telephony --- .../pages/oncallPages/oncallPagesListPage.js | 1 - web/src/components/oncall/OnCallAboutPage.vue | 8 +-- .../oncall/OnCallMyDeliveries.spec.ts | 52 ++++++++++++++++++ .../components/oncall/OnCallMyDeliveries.vue | 55 ++++++++++++++++--- .../oncall/OnCallSetupChecklist.spec.ts | 5 +- web/src/components/oncall/OnCallWhatFired.vue | 2 +- .../components/oncall/OnCallWhoIsOn.spec.ts | 41 +++++++++++++- web/src/components/oncall/OnCallWhoIsOn.vue | 44 ++++++++++----- web/src/lib/core/EmptyState/presets.ts | 2 - .../DescriptionList/ODescriptionItem.vue | 18 ++++-- .../DescriptionList/ODescriptionList.spec.ts | 12 ++++ .../DescriptionList/ODescriptionList.types.ts | 9 +++ .../DescriptionList/ODescriptionList.vue | 14 ++++- web/src/locales/languages/ar-SA.json | 4 +- web/src/locales/languages/de-DE.json | 4 +- web/src/locales/languages/en-US.json | 4 +- web/src/locales/languages/es-ES.json | 4 +- web/src/locales/languages/fr-FR.json | 4 +- web/src/locales/languages/it-IT.json | 4 +- web/src/locales/languages/ja-JP.json | 2 +- web/src/locales/languages/ko-KR.json | 2 +- web/src/locales/languages/nl-NL.json | 4 +- web/src/locales/languages/pl-PL.json | 4 +- web/src/locales/languages/pt-PT.json | 4 +- web/src/locales/languages/ru-RU.json | 4 +- web/src/locales/languages/th-TH.json | 4 +- web/src/locales/languages/tr-TR.json | 4 +- web/src/locales/languages/vi-VN.json | 4 +- web/src/locales/languages/zh-CN.json | 4 +- web/src/locales/languages/zh-TW.json | 2 +- web/src/views/OnCall/OnCallMine.spec.ts | 26 +++++++-- web/src/views/OnCall/OnCallMine.vue | 47 ++++++++++------ .../views/OnCall/OnCallResponseDetail.spec.ts | 30 +++++++++- web/src/views/OnCall/OnCallResponseDetail.vue | 17 +++++- web/src/views/OnCall/OnCallResponses.spec.ts | 7 +-- web/src/views/OnCall/OnCallResponses.vue | 15 ++--- 36 files changed, 357 insertions(+), 110 deletions(-) diff --git a/tests/ui-testing/pages/oncallPages/oncallPagesListPage.js b/tests/ui-testing/pages/oncallPages/oncallPagesListPage.js index b53d14bd50..a3905ebd96 100644 --- a/tests/ui-testing/pages/oncallPages/oncallPagesListPage.js +++ b/tests/ui-testing/pages/oncallPages/oncallPagesListPage.js @@ -70,7 +70,6 @@ export class OnCallPagesListPage { error: '[data-test="oncall-responses-error"]', unavailable: '[data-test="oncall-responses-unavailable"]', truncated: '[data-test="oncall-responses-truncated"]', - escalationCapped: '[data-test="oncall-escalation-capped"]', responderNobody: '[data-test="oncall-responder-nobody"]', onCallNowGap: '[data-test="oncall-oncallnow-gap"]', diff --git a/web/src/components/oncall/OnCallAboutPage.vue b/web/src/components/oncall/OnCallAboutPage.vue index 26e26cd02f..d6b7eaf053 100644 --- a/web/src/components/oncall/OnCallAboutPage.vue +++ b/web/src/components/oncall/OnCallAboutPage.vue @@ -30,15 +30,15 @@ along with this program. If not, see . - + - - + + . {{ raw(note) }} diff --git a/web/src/components/oncall/OnCallMyDeliveries.spec.ts b/web/src/components/oncall/OnCallMyDeliveries.spec.ts index 80f2420724..fda73f9b86 100644 --- a/web/src/components/oncall/OnCallMyDeliveries.spec.ts +++ b/web/src/components/oncall/OnCallMyDeliveries.spec.ts @@ -117,6 +117,7 @@ describe("OnCallMyDeliveries", () => { vi.clearAllMocks(); queryClient.clear(); resetListViewState(); + window.localStorage.clear(); answer([]); service.markDeliveriesRead.mockResolvedValue({ data: { updated: 1, unread: 0 } } as any); service.acknowledgeResponse.mockResolvedValue({ data: {} } as any); @@ -275,6 +276,57 @@ describe("OnCallMyDeliveries", () => { await flushPromises(); expect(wrapper.find('[data-test="oncall-my-needs-you"]').exists()).toBe(false); }); + + const NEEDS_YOU_KEY = "oncall-my-needs-you:default:example@gmail.com"; + + /// The card holds its place through the first read when the last visit had open pages. + it("reserves its card while loading when the last visit had open pages", async () => { + window.localStorage.setItem(NEEDS_YOU_KEY, "flat"); + service.myDeliveries.mockReturnValue(new Promise(() => {})); + const wrapper = render(); + await flushPromises(); + + expect(wrapper.find('[data-test="oncall-my-needs-you"]').exists()).toBe(true); + expect( + wrapper.findAll('[data-test="oncall-my-needs-you-table"] [data-test="row"]'), + ).toHaveLength(0); + }); + + it("drops the reservation once a load has nothing open", async () => { + window.localStorage.setItem(NEEDS_YOU_KEY, "paged"); + answer([delivery({ response_state: "resolved" })]); + const wrapper = render(); + await flushPromises(); + + expect(wrapper.find('[data-test="oncall-my-needs-you"]').exists()).toBe(false); + expect(window.localStorage.getItem(NEEDS_YOU_KEY)).toBe(null); + }); + + it("remembers open pages for the next visit's skeleton", async () => { + answer([delivery({ response_state: "triggered" })]); + render(); + await flushPromises(); + expect(window.localStorage.getItem(NEEDS_YOU_KEY)).toBe("flat"); + }); + + /// A pinned column draws a divider; a table with nothing to scroll past keeps its actions unpinned. + it("does not pin the actions column", async () => { + answer([delivery({ response_state: "triggered" })]); + const { OTable: _table, ...realTable } = stubs; + const wrapper = mount(OnCallMyDeliveries, { + global: { plugins: [i18n, store], stubs: realTable }, + }); + await flushPromises(); + await new Promise((resolve) => setTimeout(resolve, 60)); + await flushPromises(); + + const card = wrapper.find('[data-test="oncall-my-needs-you"]'); + expect(card.find('[data-test="oncall-my-needs-you-ack-resp_1"]').exists()).toBe(true); + const sticky = card + .findAll("td, th") + .filter((cell) => (cell.attributes("style") ?? "").includes("sticky")); + expect(sticky).toHaveLength(0); + }); }); describe("the unread badge", () => { diff --git a/web/src/components/oncall/OnCallMyDeliveries.vue b/web/src/components/oncall/OnCallMyDeliveries.vue index 9e54907730..205f7a3008 100644 --- a/web/src/components/oncall/OnCallMyDeliveries.vue +++ b/web/src/components/oncall/OnCallMyDeliveries.vue @@ -29,8 +29,9 @@ along with this program. If not, see . /> -