Merge pull request #5358 from Ronid1/feature/4661_gantt_customize_days_of_weekend

Feature/4661 gantt customize days of weekend
This commit is contained in:
Sidharth Vinod
2024-03-22 10:19:46 +00:00
committed by GitHub
6 changed files with 113 additions and 4 deletions

View File

@@ -573,7 +573,28 @@ describe('Gantt diagram', () => {
` `
); );
}); });
it('should render a gantt diagram exculding friday and saturday', () => {
imgSnapshotTest(
`gantt
title A Gantt Diagram
dateFormat YYYY-MM-DD
excludes weekends
weekend friday
section Section1
A task :a1, 2024-02-28, 10d`
);
});
it('should render a gantt diagram exculding saturday and sunday', () => {
imgSnapshotTest(
`gantt
title A Gantt Diagram
dateFormat YYYY-MM-DD
excludes weekends
weekend saturday
section Section1
A task :a1, 2024-02-28, 10d`
);
});
it('should render when compact is true', () => { it('should render when compact is true', () => {
imgSnapshotTest( imgSnapshotTest(
` `

View File

@@ -167,6 +167,38 @@ gantt
The `title` is an _optional_ string to be displayed at the top of the Gantt chart to describe the chart as a whole. The `title` is an _optional_ string to be displayed at the top of the Gantt chart to describe the chart as a whole.
### Excludes
The `excludes` is an _optional_ attribute that accepts specific dates in YYYY-MM-DD format, days of the week ("sunday") or "weekends", but not the word "weekdays".
These date will be marked on the graph, and be excluded from the duration calculation of tasks. Meaning that if there are excluded dates during a task interval, the number of 'skipped' days will be added to the end of the task to ensure the duration is as specified in the code.
#### Weekend (v\<MERMAID_RELEASE_VERSION>+)
When excluding weekends, it is possible to configure the weekends to be either Friday and Saturday or Saturday and Sunday. By default weekends are Saturday and Sunday.
To define the weekend start day, there is an _optional_ attribute `weekend` that can be added in a new line followed by either `friday` or `saturday`.
```mermaid-example
gantt
title A Gantt Diagram Excluding Fri - Sat weekends
dateFormat YYYY-MM-DD
excludes weekends
weekend friday
section Section
A task :a1, 2024-01-01, 30d
Another task :after a1, 20d
```
```mermaid
gantt
title A Gantt Diagram Excluding Fri - Sat weekends
dateFormat YYYY-MM-DD
excludes weekends
weekend friday
section Section
A task :a1, 2024-01-01, 30d
Another task :after a1, 20d
```
### Section statements ### Section statements
You can divide the chart into various sections, for example to separate different parts of a project like development and documentation. You can divide the chart into various sections, for example to separate different parts of a project like development and documentation.

View File

@@ -21,6 +21,7 @@ dayjs.extend(dayjsIsoWeek);
dayjs.extend(dayjsCustomParseFormat); dayjs.extend(dayjsCustomParseFormat);
dayjs.extend(dayjsAdvancedFormat); dayjs.extend(dayjsAdvancedFormat);
const WEEKEND_START_DAY = { friday: 5, saturday: 6 };
let dateFormat = ''; let dateFormat = '';
let axisFormat = ''; let axisFormat = '';
let tickInterval = undefined; let tickInterval = undefined;
@@ -37,6 +38,7 @@ let funs = [];
let inclusiveEndDates = false; let inclusiveEndDates = false;
let topAxis = false; let topAxis = false;
let weekday = 'sunday'; let weekday = 'sunday';
let weekend = 'saturday';
// The serial order of the task in the script // The serial order of the task in the script
let lastOrder = 0; let lastOrder = 0;
@@ -63,6 +65,7 @@ export const clear = function () {
links = {}; links = {};
commonClear(); commonClear();
weekday = 'sunday'; weekday = 'sunday';
weekend = 'saturday';
}; };
export const setAxisFormat = function (txt) { export const setAxisFormat = function (txt) {
@@ -167,7 +170,11 @@ export const isInvalidDate = function (date, dateFormat, excludes, includes) {
if (includes.includes(date.format(dateFormat.trim()))) { if (includes.includes(date.format(dateFormat.trim()))) {
return false; return false;
} }
if (date.isoWeekday() >= 6 && excludes.includes('weekends')) { if (
excludes.includes('weekends') &&
(date.isoWeekday() === WEEKEND_START_DAY[weekend] ||
date.isoWeekday() === WEEKEND_START_DAY[weekend] + 1)
) {
return true; return true;
} }
if (excludes.includes(date.format('dddd').toLowerCase())) { if (excludes.includes(date.format('dddd').toLowerCase())) {
@@ -184,6 +191,10 @@ export const getWeekday = function () {
return weekday; return weekday;
}; };
export const setWeekend = function (startDay) {
weekend = startDay;
};
/** /**
* TODO: fully document what this function does and what types it accepts * TODO: fully document what this function does and what types it accepts
* *
@@ -781,6 +792,7 @@ export default {
isInvalidDate, isInvalidDate,
setWeekday, setWeekday,
getWeekday, getWeekday,
setWeekend,
}; };
/** /**

View File

@@ -267,6 +267,21 @@ describe('when using the ganttDb', function () {
expect(tasks[6].task).toEqual('test7'); expect(tasks[6].task).toEqual('test7');
}); });
it('should ignore weekends starting on friday', function () {
ganttDb.setDateFormat('YYYY-MM-DD');
ganttDb.setExcludes('weekends');
ganttDb.setWeekend('friday');
ganttDb.addSection('friday-saturday weekends skip test');
ganttDb.addTask('test1', 'id1,2024-02-28, 3d');
const tasks = ganttDb.getTasks();
expect(tasks[0].startTime).toEqual(dayjs('2024-02-28', 'YYYY-MM-DD').toDate());
expect(tasks[0].endTime).toEqual(dayjs('2024-03-04', 'YYYY-MM-DD').toDate());
expect(tasks[0].id).toEqual('id1');
expect(tasks[0].task).toEqual('test1');
});
it('should maintain the order in which tasks are created', function () { it('should maintain the order in which tasks are created', function () {
ganttDb.setAccTitle('Project Execution'); ganttDb.setAccTitle('Project Execution');
ganttDb.setDateFormat('YYYY-MM-DD'); ganttDb.setDateFormat('YYYY-MM-DD');

View File

@@ -84,6 +84,8 @@ weekday\s+thursday return 'weekday_thursday'
weekday\s+friday return 'weekday_friday' weekday\s+friday return 'weekday_friday'
weekday\s+saturday return 'weekday_saturday' weekday\s+saturday return 'weekday_saturday'
weekday\s+sunday return 'weekday_sunday' weekday\s+sunday return 'weekday_sunday'
weekend\s+friday return 'weekend_friday'
weekend\s+saturday return 'weekend_saturday'
\d\d\d\d"-"\d\d"-"\d\d return 'date'; \d\d\d\d"-"\d\d"-"\d\d return 'date';
"title"\s[^\n]+ return 'title'; "title"\s[^\n]+ return 'title';
"accDescription"\s[^#\n;]+ return 'accDescription' "accDescription"\s[^#\n;]+ return 'accDescription'
@@ -128,6 +130,11 @@ weekday
| weekday_sunday { yy.setWeekday("sunday");} | weekday_sunday { yy.setWeekday("sunday");}
; ;
weekend
: weekend_friday { yy.setWeekend("friday");}
| weekend_saturday { yy.setWeekend("saturday");}
;
statement statement
: dateFormat {yy.setDateFormat($1.substr(11));$$=$1.substr(11);} : dateFormat {yy.setDateFormat($1.substr(11));$$=$1.substr(11);}
| inclusiveEndDates {yy.enableInclusiveEndDates();$$=$1.substr(18);} | inclusiveEndDates {yy.enableInclusiveEndDates();$$=$1.substr(18);}
@@ -138,6 +145,7 @@ statement
| includes {yy.setIncludes($1.substr(9));$$=$1.substr(9);} | includes {yy.setIncludes($1.substr(9));$$=$1.substr(9);}
| todayMarker {yy.setTodayMarker($1.substr(12));$$=$1.substr(12);} | todayMarker {yy.setTodayMarker($1.substr(12));$$=$1.substr(12);}
| weekday | weekday
| weekend
| title {yy.setDiagramTitle($1.substr(6));$$=$1.substr(6);} | title {yy.setDiagramTitle($1.substr(6));$$=$1.substr(6);}
| acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); } | acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); }
| acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); } | acc_descr acc_descr_value { $$=$2.trim();yy.setAccDescription($$); }

View File

@@ -109,6 +109,27 @@ gantt
The `title` is an _optional_ string to be displayed at the top of the Gantt chart to describe the chart as a whole. The `title` is an _optional_ string to be displayed at the top of the Gantt chart to describe the chart as a whole.
### Excludes
The `excludes` is an _optional_ attribute that accepts specific dates in YYYY-MM-DD format, days of the week ("sunday") or "weekends", but not the word "weekdays".
These date will be marked on the graph, and be excluded from the duration calculation of tasks. Meaning that if there are excluded dates during a task interval, the number of 'skipped' days will be added to the end of the task to ensure the duration is as specified in the code.
#### Weekend (v\<MERMAID_RELEASE_VERSION>+)
When excluding weekends, it is possible to configure the weekends to be either Friday and Saturday or Saturday and Sunday. By default weekends are Saturday and Sunday.
To define the weekend start day, there is an _optional_ attribute `weekend` that can be added in a new line followed by either `friday` or `saturday`.
```mermaid-example
gantt
title A Gantt Diagram Excluding Fri - Sat weekends
dateFormat YYYY-MM-DD
excludes weekends
weekend friday
section Section
A task :a1, 2024-01-01, 30d
Another task :after a1, 20d
```
### Section statements ### Section statements
You can divide the chart into various sections, for example to separate different parts of a project like development and documentation. You can divide the chart into various sections, for example to separate different parts of a project like development and documentation.