Merge commit '580eedcab22dc7ead82134d351ef118578359935' as 'plugins/redmine_workload'

This commit is contained in:
2023-03-24 11:34:26 +01:00
108 changed files with 6493 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 170 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

View File

@@ -0,0 +1,64 @@
/**
Toggle along the hierarchie tree.
When opening, open level by level. When closing, close the item with all
lower levels at once.
*/
$(document).ready(function() {
$('.trigger').click(function() {
var OPENED = '▼'
var CLOSED = '▶'
$(this).toggleClass('closed opened');
identifier = $(this).attr('data-for');
identifierClasses = identifier.trim().replace(/\s/g, ".");
// topDownHierarchieChain shows current hierarchie level on the left and the css
// class of the next hierarchie level on the right hand side.
topDownHierarchieChain = new Map([
["group-description " + identifier, ".user-total-workload-in-" + identifierClasses],
["user-description " + identifier, ".project-total-workload." + identifierClasses],
["project-description " + identifier, ".issue-workloads." + identifierClasses]
]);
// bottomUpHierarchies shows current hierarchie level on the left and all
// lower hierarchie levels on the right hand side.
bottomUpHierarchieChain = new Map([
["group-description " + identifier, [".issue-workloads." + identifierClasses,
".project-total-workload." + identifierClasses,
".user-total-workload-in-" + identifierClasses]],
["user-description " + identifier, [".issue-workloads." + identifierClasses,
".project-total-workload." + identifierClasses]],
["project-description " + identifier, [".issue-workloads." + identifierClasses]]
]);
currentHierarchieLevel = $(this).parent().attr('class');
if ($(this).hasClass('opened')) {
$(this).show();
// Shows additional info
$(this).siblings().show();
// Reveals the next hierarchie level
nextHierarchieLevelClass = topDownHierarchieChain.get(currentHierarchieLevel);
$(nextHierarchieLevelClass).each(function(){
$(this).show(); // but keep its 'children' closed if any
$(this).siblings('.invisible-issues-summary.' + identifierClasses).show();
});
$(this).html(OPENED);
}
else {
lowerHierarchieLevelClasses = bottomUpHierarchieChain.get(currentHierarchieLevel);
// Collapses all lower levels of the currentHierarchieLevel at once
// as defined in bottomUpHierarchieChain.
lowerHierarchieLevelClasses.forEach(function(css){
$(css).hide();
$(css).siblings('.invisible-issues-summary.' + identifierClasses).hide();
currentHierarchieLevel = $(css).find('span.trigger.opened');
currentHierarchieLevel.html(CLOSED);
currentHierarchieLevel.siblings('dl').hide();
})
$(this).siblings().hide();
$(this).html(CLOSED);
}
});
});

View File

@@ -0,0 +1,336 @@
/*******************************************************************************
* Color scheme.
******************************************************************************/
:root {
--lightgray: #eee;
--mediumgray: #c0c0c0;
--anthracite: #333;
}
/*******************************************************************************
* Normalisation.
******************************************************************************/
.controller-workloads table th, table td {
padding: 0;
}
.controller-workloads table dt {
margin-top: 0;
}
.controller-workloads table dd {
margin-bottom: 0;
}
/*******************************************************************************
* Styles for the filter form.
******************************************************************************/
.controller-workloads .filters > div,
.controller-workloads .filters .apply {
margin-top: 8px;
}
.controller-workloads .filters .apply {
display: inline-block;
}
legend {
color: var(--anthracite);
}
.controller-workloads .wrapper {
margin-top: 30px;
}
.controller-workloads .users select,
.controller-workloads .groups select {
width: 300px;
height: 150px;
}
/*******************************************************************************
* Styles for the header of workload table.
******************************************************************************/
.controller-workloads .data .workload_hdr {
background-color: var(--lightgray);
border: 1px solid var(--mediumgray);
}
/* Column width if no data is displayed */
.controller-workloads .data .day-of-month,
.controller-workloads .data .day-of-week {
min-width: 25px;
font-size: 0.8em;
}
/* Month names */
.controller-workloads .data .month-name {
border-left: 1px solid var(--mediumgray);
border-top: 1px solid var(--mediumgray);
}
.controller-workloads .data .month-name:last-child {
border-right: 1px solid var(--mediumgray);
}
/* Num of week */
.controller-workloads .data .num-of-week.first-day-of-week {
border-left: 1px solid var(--mediumgray);
}
.controller-workloads .data .num-of-week.last-day-of-week {
border-right: 1px solid var(--mediumgray);
}
/* Day of month */
.controller-workloads .data .day-of-month.firstDayOfMonth,
.controller-workloads .data .day-of-month:first-child {
border-left: 1px solid var(--mediumgray);
}
.controller-workloads .data .day-of-month:last-child {
border-right: 1px solid var(--mediumgray);
}
/* Day of week */
.controller-workloads .data .day-of-week.firstDayOfWeek,
.controller-workloads .data .day-of-week:first-child {
border-left: 1px solid var(--mediumgray);
}
.controller-workloads .data .day-of-week:last-child {
border-right: 1px solid var(--mediumgray);
}
/*******************************************************************************
* Styles for the workload table.
******************************************************************************/
.controller-workloads .wrapper {
overflow-x: auto;
}
.controller-workloads .data {
table-layout: fixed;
border-spacing: 0 3px;
border-collapse: collapse;
margin-bottom: 10px;
}
.controller-workloads .data th {
font-weight: initial;
}
/*------------------------------------------------------------------------------
* Styles for the stuff that may be shown or hidden.
-----------------------------------------------------------------------------*/
.controller-workloads .data .additional-group-info,
.controller-workloads .data .additional-user-info,
.controller-workloads .data .additional-project-info,
.controller-workloads .data .invisible-issues-summary,
.controller-workloads .data tbody[class^="user-total-workload-in-group-"],
.controller-workloads .data .project-total-workload,
.controller-workloads .data .issue-workloads {
display: none;
}
.controller-workloads .data .trigger {
display: inline-block;
cursor: default;
text-align: center;
font-size: 0.9em;
margin-right: 4px;
}
.controller-workloads table dt.mt-5,
.controller-workloads table dd.mt-5 {
margin-top: 5px;
}
/*------------------------------------------------------------------------------
* Table heads on the left side.
-----------------------------------------------------------------------------*/
.controller-workloads .data .group-description,
.controller-workloads .data .user-description,
.controller-workloads .data .project-description,
.controller-workloads .data .issue-description,
.controller-workloads .data .invisible-workload-description {
text-align: left;
border-left: 1px solid var(--mediumgray);
border-right: 1px solid var(--mediumgray);
width: 300px;
min-width: 300px;
max-width: 300px;
}
.controller-workloads .data .group-description {
padding-left: 5px;
}
.controller-workloads .data .user-description {
padding-left: 10px;
}
.controller-workloads .data .project-description {
padding-left: 15px;
}
.controller-workloads .data .issue-description,
.controller-workloads .data .invisible-workload-description {
padding-left: 20px;
}
.controller-workloads .data .invisible-workload-description {
font-size: 1em;
}
.controller-workloads .data .additional-group-info,
.controller-workloads .data .additional-user-info,
.controller-workloads .data .additional-project-info {
font-size: 0.9em;
font-weight: normal;
margin-left: 30px;
}
.controller-workloads .data .additional-group-info dt,
.controller-workloads .data .additional-user-info dt,
.controller-workloads .data .additional-project-info dt {
float: left;
clear: left;
width: 210px;
}
.controller-workloads .data .additional-group-info dd,
.controller-workloads .data .additional-user-info dd,
.controller-workloads .data .additional-project-info dd {
margin-left: 210px;
}
/*------------------------------------------------------------------------------
* Real table data
-----------------------------------------------------------------------------*/
.controller-workloads .tooltip span.tip {
top: 20px;
}
.controller-workloads td.hours {
font-weight: normal;
}
.controller-workloads .data tr td:last-child {
border-right: 1px solid var(--mediumgray);
}
.controller-workloads .data tr:last-child td,
.controller-workloads .data tr:last-child th {
border-bottom: 1px solid var(--mediumgray);
}
.controller-workloads .data .user-total-workload {
background-color: #F6F7F8;
}
.controller-workloads .data .issue-workloads.odd {
background-color: #F6F7F8;
}
.controller-workloads .data .issue-workloads.odd.overdue {
background-color: #ecb4b4;
}
.controller-workloads .data .issue-workloads.even {
background-color: white;
}
.controller-workloads .data .issue-workloads.even.overdue {
background-color: #f8d0d0;
}
.controller-workloads .data .issue-workloads:hover,
.controller-workloads .data .group-total-workload:hover,
.controller-workloads .data .user-total-workload:hover,
.controller-workloads .data .project-total-workload:hover{
background-color: #D7D7D7!important;
}
.controller-workloads .data td {
padding: 0;
font-size: .8em;
line-height: 1;
text-align: center;
width: 25px;
min-width: 25px;
}
.controller-workloads .data .today {
border-right: 2px dashed red;
padding-left: 2px;
margin-left: 2px;
}
/* Styling of the spans in the table */
.controller-workloads .data .hours span {
display: block;
padding-top: .6em;
padding-bottom: .3em;
height: 1em;
color: white;
}
.controller-workloads .data .hours.none span {
color: var(--anthracite);
}
.controller-workloads .data .none span {
background: transparent;
}
.controller-workloads .data .active span {
background-color: rgba(200, 200, 200, 0.5);
}
.controller-workloads .data .low span {
background: green;
}
.controller-workloads .data .normal span {
background: yellow;
color: var(--anthracite);
}
.controller-workloads .data .high span {
background: red;
}
.controller-workloads .data .holiday {
background-color: var(--lightgray);
border-left: 1px solid var(--mediumgray);
border-right: 1px solid var(--mediumgray);
}
.controller-workloads .data .holiday.today {
background-color: var(--lightgray);
border-left: 2px solid red;
border-right: 1px solid var(--mediumgray);
}
.controller-workloads .data .holiday span {
display: none;
}
.controller-workloads .data .active.holiday span {
background-color: transparent;
}
/*******************************************************************************
* Styles for national holiday page.
******************************************************************************/
#year-nav {
padding-top: 2rem;
}