From 7f827ec088a9f8441b3c357ae8ee671908fe3887 Mon Sep 17 00:00:00 2001 From: Benjamin Date: Sun, 28 Jun 2026 19:43:25 +0200 Subject: [PATCH 1/2] feat: revamp the project board header toolbar (compact, agenda-style, mobile search) Replace the bespoke project board toolbar (inline v-tabs view switcher, always-on keyword field and a separate Filter button, with a fixed 30/70 flex split and custom mobile CSS that simply hid the search) with a compact, responsive header modelled on the Agenda/Documents toolbars: - the breadcrumb (back link + project name) stays on the left; the favorite/AI board-header extension point moves to the right with the other actions; - the Board/List/Plan view selector becomes a compact icon + dropdown menu (new TasksViewSwitcher, agenda AgendaSwitchView style), kept visible on mobile; - the keyword search collapses behind a filter icon and expands full width with a back arrow (Esc closes it), so search finally works on small screens; - the advanced filter keeps its own icon (with applied-filter count) opening the existing Sort & Filter drawer; - right-hand action order: favorite/AI, view selector, search, advanced filter; all icons are 36x36 / 20px with the lighter text-light-color, evenly spaced; - the back arrow aligns with the first column content (board padding). The view-switcher dropdown is relocated into the Vuetify app root so it renders above the kanban board with the correct (opaque) theme background. Removes the now-dead toolbar CSS (flex split, view-tab styling, mobile overrides). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../portlet/taskManagement_en.properties | 1 + webapps/src/main/webapp/skin/css/tasks.less | 90 ++++---- .../ProjectTasks/TasksViewDashboard.vue | 53 ++--- .../ProjectTasks/TasksViewSwitcher.vue | 142 +++++++++++++ .../ProjectTasks/TasksViewToolbar.vue | 192 +++++++++--------- .../tasks-management/initComponents.js | 2 + 6 files changed, 295 insertions(+), 185 deletions(-) create mode 100644 webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewSwitcher.vue diff --git a/webapps/src/main/resources/locale/portlet/taskManagement_en.properties b/webapps/src/main/resources/locale/portlet/taskManagement_en.properties index d02b54c87..db8a77a62 100644 --- a/webapps/src/main/resources/locale/portlet/taskManagement_en.properties +++ b/webapps/src/main/resources/locale/portlet/taskManagement_en.properties @@ -220,6 +220,7 @@ label.permalink=Permalink label.listView=List label.boardView=Board label.ganttView=Plan +label.viewOptions=View options label.cardsView=Cards label.start.adding.tasks=Add Tasks diff --git a/webapps/src/main/webapp/skin/css/tasks.less b/webapps/src/main/webapp/skin/css/tasks.less index a68a9c145..797985dde 100644 --- a/webapps/src/main/webapp/skin/css/tasks.less +++ b/webapps/src/main/webapp/skin/css/tasks.less @@ -1125,11 +1125,47 @@ } .projectTasksDashboard { min-height: calc(~"100vh - 117px")!important; - .projectTasksTabFilter { - flex: 0 1 70%; + .projectBoardToolbar { + /* Match the agenda header height/spacing (its application-toolbar is a + default v-toolbar) while staying a plain flex row, so the view-switcher + menu is not trapped in a v-toolbar stacking context. */ + min-height: 64px; + margin-bottom: 4px; + /* Match the board columns' horizontal padding (px-3 = 12px) so the back + arrow lines up with the first column content and the right-hand icons + line up with the last column content. */ + padding-inline: 12px; + /* Normalise the favorite/AI extension icons + their hover area to the + same size as the view / search / advanced-filter icons (36x36). */ + .boardHeaderExtensions { + .v-icon { + font-size: 20px !important; + } + .v-btn { + width: 36px !important; + height: 36px !important; + /* Drop the components' own horizontal margins (e.g. the AI button's + me-2) so all the header icons are evenly spaced. */ + margin-inline-start: 0 !important; + margin-inline-end: 0 !important; + } + } + .tasksViewSwitcher { + position: relative; + } + .tasksViewSwitcherMenu { + position: absolute; + top: calc(100% + 4px); + inset-inline-end: 0; + z-index: 1000; + min-width: 160px; + /* The kanban cards use 3D transforms (rotateY/backface) which put them + on compositing layers; promote the menu to its own layer too so it + composites above the board instead of being painted behind it. */ + transform: translateZ(0); + } } .taskViewBreadcrumb { - flex: 0 1 30%; a { i { color: @greyColorLighten1; @@ -1142,43 +1178,6 @@ } } } - .tasksToolbar { - height: auto!important; - .v-toolbar__content { - height: auto!important; - padding: 0!important; - .taskDisplay { - .projectTasksViewTabs { - .v-tabs-bar { - height: auto!important; - .taskTabBoard { - border: 1px solid @borderColor; - border-radius: 5px 0 0 5px; - height: 38px; - min-height: 38px; - .uiIconBoard { - .far(); - .fa-clipboard(); - } - } - .taskTabList { - border-radius: 0; - } - .taskTabGantt { - border: 1px solid @borderColor; - border-radius: 0 5px 5px 0; - height: 38px; - min-height: 38px; - .uiIconGantt { - .fas(); - .fa-stream(); - } - } - } - } - } - } - } .tasksView { .projectTaskItem { position: relative; @@ -2536,17 +2535,6 @@ } } } -@media (max-width: 599px) { - .projectTasksDashboard { - .taskViewBreadcrumb { - flex: 0 1 80% !important; - } - .projectTasksTabFilter{ - flex: 0 1 20% !important; - } - } -} - @media (max-width: 399px) { .taskDrawer { .drawerTitle .taskProjectName .projectName { diff --git a/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewDashboard.vue b/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewDashboard.vue index ba6e7b189..3270575fc 100644 --- a/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewDashboard.vue +++ b/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewDashboard.vue @@ -26,39 +26,26 @@ :ok-label="$t('label.ok')" :cancel-label="$t('popup.cancel')" @ok="deleteConfirm()" /> - + + +
+ + + diff --git a/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewToolbar.vue b/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewToolbar.vue index d09f6d862..491cf8a7a 100644 --- a/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewToolbar.vue +++ b/webapps/src/main/webapp/vue-app/tasks-management/components/ProjectTasks/TasksViewToolbar.vue @@ -16,58 +16,80 @@ -->