From 79bc86d4f354d2b45bb251fb144c35165eec4e6b Mon Sep 17 00:00:00 2001
From: ktx-vaidehi <134508096+ktx-vaidehi@users.noreply.github.com>
Date: Thu, 1 Oct 2026 09:16:15 +0000
Subject: [PATCH] fix(oncall): fit the on-call pages on phones and tablets
(#15033)
---
.../oncall/OnCallCoverageStrip.spec.ts | 33 ++++-
.../components/oncall/OnCallCoverageStrip.vue | 7 +-
.../components/oncall/OnCallMembers.spec.ts | 42 ++++++
web/src/components/oncall/OnCallMembers.vue | 41 +++++-
.../oncall/OnCallMyDeliveries.spec.ts | 12 ++
.../components/oncall/OnCallMyDeliveries.vue | 9 +-
.../oncall/OnCallOwnershipRules.spec.ts | 48 +++++++
.../oncall/OnCallOwnershipRules.vue | 34 +++++
.../components/oncall/OnCallPolicyEditor.vue | 2 +-
.../oncall/OnCallRecentPages.spec.ts | 34 ++++-
.../components/oncall/OnCallRecentPages.vue | 8 +-
.../components/oncall/OnCallRoutingList.vue | 67 +++++-----
.../oncall/OnCallSchedulePresets.vue | 5 +-
.../oncall/OnCallScheduleTimeline.spec.ts | 52 +++++++-
.../oncall/OnCallScheduleTimeline.vue | 52 +++++++-
.../oncall/OnCallSetupChecklist.vue | 7 +-
.../oncall/OnCallShiftRuleFields.vue | 7 +-
.../components/oncall/OnCallTeamAttention.vue | 7 +-
web/src/components/oncall/OnCallTeamForm.vue | 4 +-
.../oncall/OnCallUnroutedQueue.spec.ts | 43 +++++++
.../components/oncall/OnCallUnroutedQueue.vue | 45 ++++++-
.../OScheduleTimeline.spec.ts | 11 ++
.../ScheduleTimeline/OScheduleTimeline.vue | 10 +-
web/src/lib/navigation/Tabs/OTabs.spec.ts | 61 ++++++++-
web/src/lib/navigation/Tabs/OTabs.vue | 31 +++--
web/src/lib/overlay/Drawer/ODrawer.spec.ts | 14 ++
web/src/lib/overlay/Drawer/ODrawer.vue | 4 +-
.../views/OnCall/OnCallResponseDetail.spec.ts | 108 +++++++++++++++-
web/src/views/OnCall/OnCallResponseDetail.vue | 93 +++++++++++++-
web/src/views/OnCall/OnCallResponses.spec.ts | 78 +++++++++++
web/src/views/OnCall/OnCallResponses.vue | 121 ++++++++++++++++--
web/src/views/OnCall/OnCallRouting.vue | 6 +-
web/src/views/OnCall/OnCallTeams.spec.ts | 50 ++++++++
web/src/views/OnCall/OnCallTeams.vue | 47 ++++++-
34 files changed, 1095 insertions(+), 98 deletions(-)
diff --git a/web/src/components/oncall/OnCallCoverageStrip.spec.ts b/web/src/components/oncall/OnCallCoverageStrip.spec.ts
index 6477a00c06..9d227ffc6b 100644
--- a/web/src/components/oncall/OnCallCoverageStrip.spec.ts
+++ b/web/src/components/oncall/OnCallCoverageStrip.spec.ts
@@ -14,13 +14,28 @@
// along with this program. If not, see .
import { mount } from "@vue/test-utils";
-import { describe, expect, it } from "vitest";
+import { afterEach, describe, expect, it, vi } from "vitest";
import OnCallCoverageStrip from "@/components/oncall/OnCallCoverageStrip.vue";
import i18n from "@/locales";
import type { Rotation } from "@/ts/interfaces/oncall";
import { MICROS_PER_WEEK } from "@/ts/interfaces/oncall";
+// Mutable per case, so the phone tests can switch while every other test stays desktop.
+const mockViewport = vi.hoisted(() => ({ mdUp: true, lgUp: true }));
+vi.mock("@/composables/useBreakpoint", async () => {
+ const { computed } = await import("vue");
+ return {
+ default: () => ({
+ isMobile: computed(() => !mockViewport.mdUp),
+ isTablet: computed(() => mockViewport.mdUp && !mockViewport.lgUp),
+ isDesktop: computed(() => mockViewport.lgUp),
+ mdUp: computed(() => mockViewport.mdUp),
+ lgUp: computed(() => mockViewport.lgUp),
+ }),
+ };
+});
+
const stubs = {
OScheduleTimeline: {
name: "OScheduleTimeline",
@@ -65,6 +80,11 @@ function render(rotations: Rotation[]) {
}
describe("OnCallCoverageStrip", () => {
+ afterEach(() => {
+ mockViewport.mdUp = true;
+ mockViewport.lgUp = true;
+ });
+
/// A covered fortnight is ONE band, not 336 hourly slivers the browser has to
/// lay out.
it("merges an unbroken stretch of cover into a single band", () => {
@@ -153,6 +173,17 @@ describe("OnCallCoverageStrip", () => {
expect(first.offset).toBeGreaterThan(0);
expect(first.offset).toBeLessThan(dayShare);
});
+
+ /// A phone-width strip has room for about four date labels; the laptop's seven ran into each other.
+ it("thins the dates further on a phone", () => {
+ const laptop = axisOf(render([rotation(["ana@o2.ai"])]));
+ mockViewport.mdUp = false;
+ const phone = axisOf(render([rotation(["ana@o2.ai"])]));
+
+ expect(phone.length).toBeGreaterThan(1);
+ expect(phone.length).toBeLessThanOrEqual(4);
+ expect(phone.length).toBeLessThan(laptop.length);
+ });
});
/// E5: `Covered` is a binary that answers the wrong question. What somebody
diff --git a/web/src/components/oncall/OnCallCoverageStrip.vue b/web/src/components/oncall/OnCallCoverageStrip.vue
index 716affaa82..9caf23c1b1 100644
--- a/web/src/components/oncall/OnCallCoverageStrip.vue
+++ b/web/src/components/oncall/OnCallCoverageStrip.vue
@@ -114,6 +114,7 @@ along with this program. If not, see .