From f3b9e53375368b1389df5af730a4020c2dc5f228 Mon Sep 17 00:00:00 2001 From: farukvukovic <104840615+farukvukovic@users.noreply.github.com> Date: Fri, 12 Dec 2025 17:30:35 +0100 Subject: [PATCH 01/19] #5170 Fix UI on dark themes --- .github/workflows/deploy.yml | 9 ++-- public/theme/default/css/dark.css | 68 +++++++++++++++++++++++++++++-- public/theme/minimal/css/dark.css | 66 ++++++++++++++++++++++++++++-- 3 files changed, 132 insertions(+), 11 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 4467968111..82cb02f3e5 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -3,9 +3,9 @@ name: Deploy Leantime on: push: branches: - - develop - - master - workflow_dispatch: + - develop + - master + workflow_dispatch: jobs: deploy: @@ -56,7 +56,6 @@ jobs: composer install --no-dev --optimize-autoloader --no-interaction echo "Installing NPM dependencies..." - npm ci echo "Building frontend assets..." npx mix --production @@ -141,7 +140,7 @@ jobs: composer install --no-dev --optimize-autoloader --no-interaction echo "Installing NPM dependencies..." - npm ci + npm ci echo "Building frontend assets..." npx mix --production diff --git a/public/theme/default/css/dark.css b/public/theme/default/css/dark.css index 269ea10b31..87218d2f54 100644 --- a/public/theme/default/css/dark.css +++ b/public/theme/default/css/dark.css @@ -2,7 +2,7 @@ --accent1: hsla(198, 100%, 32%, 1); --accent1-hsl: 199, 100%, 20%; - --accent1-hover: #555; + --accent1-hover: hsla(198, 100%, 45%, 1); --accent1-color: #fff; --accent2: hsla(168, 100%, 33%, 1); @@ -159,8 +159,8 @@ --brown: #4C212A; --brown-text-color: #fff; - --grey: #b0b0b0; - --grey-text-color:#000; + --grey: #707070; + --grey-text-color:#fff; --dark-grey: #707070; --dark-grey-text-color: #fff; @@ -172,6 +172,68 @@ } +/* Fix New button to match No Milestone button style on dark theme */ +.maincontentinner .btn-group .btn-primary.dropdown-toggle { + background: var(--grey); + color: var(--grey-text-color); + border-color: var(--grey); +} + +.maincontentinner .btn-group .btn-primary.dropdown-toggle:hover, +.maincontentinner .btn-group .btn-primary.dropdown-toggle:active, +.maincontentinner .btn-group .btn-primary.dropdown-toggle:focus { + background: var(--dark-grey); + color: #fff; + border-color: var(--dark-grey); +} + +.maincontentinner .btn-group .btn-primary.dropdown-toggle .caret { + border-top-color: var(--grey-text-color); +} + +/* Fix Save button and other submit buttons to have dark grey background on dark theme */ +.maincontentinner input[type='submit'], +.maincontentinner button[type='submit'], +.maincontentinner .btn-primary, +.nyroModalCont input[type='submit'], +.nyroModalCont button[type='submit'], +.nyroModalCont .btn-primary, +input[type='submit'].saveTicketBtn, +button[type='submit'].saveTicketBtn { + background: var(--grey); + color: var(--grey-text-color); + border-color: var(--grey); +} + +.maincontentinner input[type='submit']:hover, +.maincontentinner button[type='submit']:hover, +.maincontentinner .btn-primary:hover, +.maincontentinner input[type='submit']:active, +.maincontentinner button[type='submit']:active, +.maincontentinner .btn-primary:active, +.maincontentinner input[type='submit']:focus, +.maincontentinner button[type='submit']:focus, +.maincontentinner .btn-primary:focus, +.nyroModalCont input[type='submit']:hover, +.nyroModalCont button[type='submit']:hover, +.nyroModalCont .btn-primary:hover, +.nyroModalCont input[type='submit']:active, +.nyroModalCont button[type='submit']:active, +.nyroModalCont .btn-primary:active, +.nyroModalCont input[type='submit']:focus, +.nyroModalCont button[type='submit']:focus, +.nyroModalCont .btn-primary:focus, +input[type='submit'].saveTicketBtn:hover, +button[type='submit'].saveTicketBtn:hover, +input[type='submit'].saveTicketBtn:active, +button[type='submit'].saveTicketBtn:active, +input[type='submit'].saveTicketBtn:focus, +button[type='submit'].saveTicketBtn:focus { + background: var(--dark-grey); + color: #fff; + border-color: var(--dark-grey); +} + .rightpanel::before { opacity:0.9; } diff --git a/public/theme/minimal/css/dark.css b/public/theme/minimal/css/dark.css index 38e4836787..ef998ef0ad 100644 --- a/public/theme/minimal/css/dark.css +++ b/public/theme/minimal/css/dark.css @@ -2,7 +2,7 @@ --accent1: hsla(198, 100%, 32%, 1); --accent1-hsl: 199, 100%, 20%; - --accent1-hover: #404040; + --accent1-hover: hsla(198, 100%, 33%, 1); --accent1-color: #fff; --accent2: hsla(168, 100%, 33%, 1); @@ -158,8 +158,8 @@ --brown: #4C212A; --brown-text-color: #fff; - --grey: #b0b0b0; - --grey-text-color:#000; + --grey: #707070; + --grey-text-color:#fff; --dark-grey: #707070; --dark-grey-text-color: #fff; @@ -183,6 +183,66 @@ } +.maincontentinner .btn-group .btn-primary.dropdown-toggle { + background: var(--grey); + color: var(--grey-text-color); + border-color: var(--grey); +} + +.maincontentinner .btn-group .btn-primary.dropdown-toggle:hover, +.maincontentinner .btn-group .btn-primary.dropdown-toggle:active, +.maincontentinner .btn-group .btn-primary.dropdown-toggle:focus { + background: var(--dark-grey); + color: #fff; + border-color: var(--dark-grey); +} + +.maincontentinner .btn-group .btn-primary.dropdown-toggle .caret { + border-top-color: var(--grey-text-color); +} + +.maincontentinner input[type='submit'], +.maincontentinner button[type='submit'], +.maincontentinner .btn-primary, +.nyroModalCont input[type='submit'], +.nyroModalCont button[type='submit'], +.nyroModalCont .btn-primary, +input[type='submit'].saveTicketBtn, +button[type='submit'].saveTicketBtn { + background: var(--grey); + color: var(--grey-text-color); + border-color: var(--grey); +} + +.maincontentinner input[type='submit']:hover, +.maincontentinner button[type='submit']:hover, +.maincontentinner .btn-primary:hover, +.maincontentinner input[type='submit']:active, +.maincontentinner button[type='submit']:active, +.maincontentinner .btn-primary:active, +.maincontentinner input[type='submit']:focus, +.maincontentinner button[type='submit']:focus, +.maincontentinner .btn-primary:focus, +.nyroModalCont input[type='submit']:hover, +.nyroModalCont button[type='submit']:hover, +.nyroModalCont .btn-primary:hover, +.nyroModalCont input[type='submit']:active, +.nyroModalCont button[type='submit']:active, +.nyroModalCont .btn-primary:active, +.nyroModalCont input[type='submit']:focus, +.nyroModalCont button[type='submit']:focus, +.nyroModalCont .btn-primary:focus, +input[type='submit'].saveTicketBtn:hover, +button[type='submit'].saveTicketBtn:hover, +input[type='submit'].saveTicketBtn:active, +button[type='submit'].saveTicketBtn:active, +input[type='submit'].saveTicketBtn:focus, +button[type='submit'].saveTicketBtn:focus { + background: var(--dark-grey); + color: #fff; + border-color: var(--dark-grey); +} + .mainwrapper .header { background-color:var(--header-bg-color); background-image: linear-gradient(rgba(0, 0, 0, 0.6), rgba(0, 0, 0, 0.6)); From 6a821efb77b4456013ff376b841eabb249c19d44 Mon Sep 17 00:00:00 2001 From: farukvukovic <104840615+farukvukovic@users.noreply.github.com> Date: Thu, 18 Dec 2025 14:45:11 +0100 Subject: [PATCH 02/19] #5255 Fix hours display on timesheet --- .../Timesheets/Js/timesheetsController.js | 62 +++++++++++++++++++ .../Timesheets/Templates/showMy.tpl.php | 16 ++--- 2 files changed, 71 insertions(+), 7 deletions(-) diff --git a/app/Domain/Timesheets/Js/timesheetsController.js b/app/Domain/Timesheets/Js/timesheetsController.js index 8ac87a742d..1527583784 100644 --- a/app/Domain/Timesheets/Js/timesheetsController.js +++ b/app/Domain/Timesheets/Js/timesheetsController.js @@ -139,9 +139,71 @@ leantime.timesheetsController = (function () { jQuery(".editTimeModal").nyroModal(canvasoptions); }; + /** + * Format hours according to user preference + */ + var formatHours = function (hours) { + var hoursFormat = jQuery('.timesheetTable').data('hours-format') || + jQuery('#allTimesheetsTable').data('hours-format') || + 'decimal'; + + hours = parseFloat(hours) || 0; + + if (hoursFormat === 'decimal') { + return hours.toFixed(2); + } + + return formatHoursHuman(hours); + }; + + /** + * Convert decimal hours to human-readable format + */ + var formatHoursHuman = function (hours) { + var totalMinutes = Math.round(hours * 60); + + if (totalMinutes === 0) { + return '0m'; + } + + var minutesInWeek = 40 * 60; + var minutesInDay = 8 * 60; + + var weeks = Math.floor(totalMinutes / minutesInWeek); + totalMinutes = totalMinutes % minutesInWeek; + + var days = Math.floor(totalMinutes / minutesInDay); + totalMinutes = totalMinutes % minutesInDay; + + var wholeHours = Math.floor(totalMinutes / 60); + var minutes = totalMinutes % 60; + + var parts = []; + + if (weeks > 0) { + parts.push(weeks + 'w'); + } + + if (days > 0) { + parts.push(days + 'd'); + } + + if (wholeHours > 0) { + parts.push(wholeHours + 'h'); + } + + if (minutes > 0) { + parts.push(minutes + 'm'); + } + + return parts.join(' '); + }; + + // Make public what you want to have public, everything else is private return { initTimesheetsTable:initTimesheetsTable, initEditTimeModal:initEditTimeModal, + formatHours:formatHours, }; })(); diff --git a/app/Domain/Timesheets/Templates/showMy.tpl.php b/app/Domain/Timesheets/Templates/showMy.tpl.php index d6f5e4cc82..e24df082d7 100644 --- a/app/Domain/Timesheets/Templates/showMy.tpl.php +++ b/app/Domain/Timesheets/Templates/showMy.tpl.php @@ -6,6 +6,7 @@ /** @var \Carbon\Carbon $currentDate */ $dateFrom = $tpl->get('dateFrom'); +$hoursFormat = session('usersettings.hours_format', 'decimal'); ?> + +