diff --git a/client/src/components/Planner/DayPlanSidebar.test.tsx b/client/src/components/Planner/DayPlanSidebar.test.tsx
index 21a1a6207..f77ae7779 100644
--- a/client/src/components/Planner/DayPlanSidebar.test.tsx
+++ b/client/src/components/Planner/DayPlanSidebar.test.tsx
@@ -830,7 +830,8 @@ describe('DayPlanSidebar', () => {
render()
- // Find the Optimize button (contains 'optimize' text)
+ // Found by its accessible name — the button is icon-only since #1981, so
+ // the label lives on aria-label rather than in the button's text.
const optimizeBtn = screen.getByRole('button', { name: /optimize/i })
await user.click(optimizeBtn)
await waitFor(() => expect(onReorder).toHaveBeenCalledWith(10, expect.any(Array)))
@@ -4201,3 +4202,47 @@ describe('reordering the day plan with a finger (#1616)', () => {
}
})
})
+
+/**
+ * The day's route-tools row (#1981).
+ *
+ * Every button in it hands the day somewhere: show the route, open it in Google
+ * Maps, open it in CoMaps, reorder it. Two of those were already icon-only; the
+ * other two carried labels on `flex: 1` with `padding: '6px 0'`, which is no
+ * horizontal padding at all. That was survivable until CoMaps added a fifth
+ * button to the row, at which point the optimize label sat hard against both
+ * edges of its own button.
+ *
+ * It is icon-only now, which is also what keeps the row from crowding again the
+ * next time something is added to it.
+ */
+describe('the day route-tools row', () => {
+ const dayWithTwoStops = () => {
+ const places = [
+ buildPlace({ id: 1, name: 'A', lat: 48.85, lng: 2.35 }),
+ buildPlace({ id: 2, name: 'B', lat: 48.86, lng: 2.36 }),
+ ]
+ const day = buildDay({ id: 10, date: '2025-06-01', title: 'Day 1' })
+ return {
+ days: [day], places, selectedDayId: 10,
+ assignments: {
+ '10': [
+ buildAssignment({ id: 1, day_id: 10, order_index: 0, place: places[0] }),
+ buildAssignment({ id: 2, day_id: 10, order_index: 1, place: places[1] }),
+ ],
+ },
+ }
+ }
+
+ it('keeps the optimize action reachable by name without printing it', () => {
+ render()
+ const btn = screen.getByRole('button', { name: /optimize/i })
+ // The assertion that pins the change: named, but no visible label.
+ expect(btn).toBeInTheDocument()
+ expect(btn.textContent?.trim()).toBe('')
+ expect(btn.getAttribute('title')).toBeTruthy()
+ })
+
+ /* The click itself is already pinned by FE-PLANNER-DAYPLAN-038 above, which
+ finds the button the same way. */
+})
diff --git a/client/src/components/Planner/DayPlanSidebar.tsx b/client/src/components/Planner/DayPlanSidebar.tsx
index f01c78560..adf236ce3 100644
--- a/client/src/components/Planner/DayPlanSidebar.tsx
+++ b/client/src/components/Planner/DayPlanSidebar.tsx
@@ -2609,13 +2609,24 @@ const DayPlanSidebar = React.memo(function DayPlanSidebar(props: DayPlanSidebarP
>
-