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($$); }