Merge branch 'develop' into origin/3258_Flowchart_nodeSpacing_Subgraph

This commit is contained in:
rowanfr 2024-03-22 19:50:26 -05:00 committed by GitHub
commit d0a008566e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 113 additions and 4 deletions

View File

@ -101,12 +101,12 @@ describe('Gantt diagram', () => {
title Adding GANTT diagram to mermaid
excludes weekdays 2014-01-10
todayMarker off
section team's critical event
deadline A :milestone, crit, deadlineA, 2024-02-01, 0
deadline B :milestone, crit, deadlineB, 2024-02-15, 0
boss on leave :bossaway, 2024-01-28, 2024-02-11
section new intern
onboarding :onboarding, 2024-01-02, 1w
literature review :litreview, 2024-01-02, 10d
@ -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', () => {
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.
### 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
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(dayjsAdvancedFormat);
const WEEKEND_START_DAY = { friday: 5, saturday: 6 };
let dateFormat = '';
let axisFormat = '';
let tickInterval = undefined;
@ -37,6 +38,7 @@ let funs = [];
let inclusiveEndDates = false;
let topAxis = false;
let weekday = 'sunday';
let weekend = 'saturday';
// The serial order of the task in the script
let lastOrder = 0;
@ -63,6 +65,7 @@ export const clear = function () {
links = {};
commonClear();
weekday = 'sunday';
weekend = 'saturday';
};
export const setAxisFormat = function (txt) {
@ -167,7 +170,11 @@ export const isInvalidDate = function (date, dateFormat, excludes, includes) {
if (includes.includes(date.format(dateFormat.trim()))) {
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;
}
if (excludes.includes(date.format('dddd').toLowerCase())) {
@ -184,6 +191,10 @@ export const getWeekday = function () {
return weekday;
};
export const setWeekend = function (startDay) {
weekend = startDay;
};
/**
* TODO: fully document what this function does and what types it accepts
*
@ -781,6 +792,7 @@ export default {
isInvalidDate,
setWeekday,
getWeekday,
setWeekend,
};
/**

View File

@ -267,6 +267,21 @@ describe('when using the ganttDb', function () {
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 () {
ganttDb.setAccTitle('Project Execution');
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+saturday return 'weekday_saturday'
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';
"title"\s[^\n]+ return 'title';
"accDescription"\s[^#\n;]+ return 'accDescription'
@ -128,6 +130,11 @@ weekday
| weekday_sunday { yy.setWeekday("sunday");}
;
weekend
: weekend_friday { yy.setWeekend("friday");}
| weekend_saturday { yy.setWeekend("saturday");}
;
statement
: dateFormat {yy.setDateFormat($1.substr(11));$$=$1.substr(11);}
| inclusiveEndDates {yy.enableInclusiveEndDates();$$=$1.substr(18);}
@ -138,6 +145,7 @@ statement
| includes {yy.setIncludes($1.substr(9));$$=$1.substr(9);}
| todayMarker {yy.setTodayMarker($1.substr(12));$$=$1.substr(12);}
| weekday
| weekend
| title {yy.setDiagramTitle($1.substr(6));$$=$1.substr(6);}
| acc_title acc_title_value { $$=$2.trim();yy.setAccTitle($$); }
| 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.
### 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
You can divide the chart into various sections, for example to separate different parts of a project like development and documentation.