mirror of
https://github.com/mermaid-js/mermaid.git
synced 2025-09-16 22:09:57 +02:00
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:
@@ -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(
|
||||||
`
|
`
|
||||||
|
@@ -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.
|
||||||
|
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -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');
|
||||||
|
@@ -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($$); }
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user