From b67dee1eed84e3f236a40f17a7b95abd600e7004 Mon Sep 17 00:00:00 2001 From: Ronid1 Date: Mon, 4 Mar 2024 11:53:47 -0800 Subject: [PATCH 1/5] configure weekends start day --- packages/mermaid/src/config.type.ts | 5 +++++ .../mermaid/src/diagrams/gantt/ganttDb.js | 19 ++++++++++++++++++- .../src/diagrams/gantt/parser/gantt.jison | 8 ++++++++ 3 files changed, 31 insertions(+), 1 deletion(-) diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index 0ba317868..2914a4606 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -1281,6 +1281,11 @@ export interface GanttDiagramConfig extends BaseDiagramConfig { * */ weekday?: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday'; + /** + * On which day a weekend interval should start + * + */ + weekend?: 'friday' | 'saturday'; } /** * The object containing configurations specific for sequence diagrams diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js index b0058ff8d..6d0c21b54 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.js +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js @@ -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,14 @@ export const getWeekday = function () { return weekday; }; +export const setWeekend = function (startDay) { + weekend = startDay; +}; + +export const getWeekend = function () { + return weekend; +}; + /** * TODO: fully document what this function does and what types it accepts * @@ -781,6 +796,8 @@ export default { isInvalidDate, setWeekday, getWeekday, + setWeekend, + getWeekend, }; /** diff --git a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison index d6027fee9..f2333ff84 100644 --- a/packages/mermaid/src/diagrams/gantt/parser/gantt.jison +++ b/packages/mermaid/src/diagrams/gantt/parser/gantt.jison @@ -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($$); } From 19e049642b16d3a95bf9b6c60885ff543fc85d47 Mon Sep 17 00:00:00 2001 From: Ronid1 Date: Tue, 5 Mar 2024 11:18:49 -0800 Subject: [PATCH 2/5] add unit and integration tests --- cypress/integration/rendering/gantt.spec.js | 27 ++++++++++++++++--- .../src/diagrams/gantt/ganttDb.spec.ts | 15 +++++++++++ 2 files changed, 39 insertions(+), 3 deletions(-) diff --git a/cypress/integration/rendering/gantt.spec.js b/cypress/integration/rendering/gantt.spec.js index 756611008..a0c2dbcb9 100644 --- a/cypress/integration/rendering/gantt.spec.js +++ b/cypress/integration/rendering/gantt.spec.js @@ -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( ` diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts index 96aae0b89..a59297cdb 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.spec.ts @@ -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'); From 60054799187ad265c192f59d010d516d3459bc62 Mon Sep 17 00:00:00 2001 From: Ronid1 Date: Tue, 5 Mar 2024 11:53:50 -0800 Subject: [PATCH 3/5] update docs --- docs/syntax/gantt.md | 32 +++++++++++++++++++++++ packages/mermaid/src/docs/syntax/gantt.md | 21 +++++++++++++++ 2 files changed, 53 insertions(+) diff --git a/docs/syntax/gantt.md b/docs/syntax/gantt.md index d1a13c6fa..19dfeac34 100644 --- a/docs/syntax/gantt.md +++ b/docs/syntax/gantt.md @@ -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\+) + +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. diff --git a/packages/mermaid/src/docs/syntax/gantt.md b/packages/mermaid/src/docs/syntax/gantt.md index a1139d378..e165ddbbe 100644 --- a/packages/mermaid/src/docs/syntax/gantt.md +++ b/packages/mermaid/src/docs/syntax/gantt.md @@ -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\+) + +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. From 3ddcc2d4ea3e45c2985587ea16ab8c37408641d4 Mon Sep 17 00:00:00 2001 From: Ronid1 Date: Tue, 5 Mar 2024 12:00:14 -0800 Subject: [PATCH 4/5] fix lint inssue --- packages/mermaid/src/config.type.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/packages/mermaid/src/config.type.ts b/packages/mermaid/src/config.type.ts index 2914a4606..0ba317868 100644 --- a/packages/mermaid/src/config.type.ts +++ b/packages/mermaid/src/config.type.ts @@ -1281,11 +1281,6 @@ export interface GanttDiagramConfig extends BaseDiagramConfig { * */ weekday?: 'monday' | 'tuesday' | 'wednesday' | 'thursday' | 'friday' | 'saturday' | 'sunday'; - /** - * On which day a weekend interval should start - * - */ - weekend?: 'friday' | 'saturday'; } /** * The object containing configurations specific for sequence diagrams From b7c889bb70d1e983a6207ae2f84f37caf6a0b1c4 Mon Sep 17 00:00:00 2001 From: Ronid1 Date: Wed, 6 Mar 2024 09:08:19 -0800 Subject: [PATCH 5/5] fix review commets --- packages/mermaid/src/diagrams/gantt/ganttDb.js | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/mermaid/src/diagrams/gantt/ganttDb.js b/packages/mermaid/src/diagrams/gantt/ganttDb.js index 6d0c21b54..27d622eeb 100644 --- a/packages/mermaid/src/diagrams/gantt/ganttDb.js +++ b/packages/mermaid/src/diagrams/gantt/ganttDb.js @@ -172,8 +172,8 @@ export const isInvalidDate = function (date, dateFormat, excludes, includes) { } if ( excludes.includes('weekends') && - (date.isoWeekday() == WEEKEND_START_DAY[weekend] || - date.isoWeekday() == WEEKEND_START_DAY[weekend] + 1) + (date.isoWeekday() === WEEKEND_START_DAY[weekend] || + date.isoWeekday() === WEEKEND_START_DAY[weekend] + 1) ) { return true; } @@ -195,10 +195,6 @@ export const setWeekend = function (startDay) { weekend = startDay; }; -export const getWeekend = function () { - return weekend; -}; - /** * TODO: fully document what this function does and what types it accepts * @@ -797,7 +793,6 @@ export default { setWeekday, getWeekday, setWeekend, - getWeekend, }; /**