@@ -69,6 +69,7 @@ export const GanttChart = function (pDiv, pFormat) {
6969 5 : true ,
7070 6 : true ,
7171 } ;
72+ this . vFirstDayOfWeek = 1 ; // 0=Sunday, 1=Monday (default), …, 6=Saturday
7273
7374 this . vEventClickCollapse = null ;
7475 this . vEventClickRow = null ;
@@ -381,9 +382,17 @@ export const GanttChart = function (pDiv, pFormat) {
381382
382383 vTmpDate . setDate ( vTmpDate . getDate ( ) + 1 ) ;
383384 } else if ( this . vFormat == "week" ) {
384- const vTmpCell = newNode ( vTmpRow , "td" , null , vHeaderCellClass , null , vColWidth ) ;
385- newNode ( vTmpCell , "div" , null , null , formatDateStr ( vTmpDate , this . vWeekMajorDateDisplayFormat , this . vLangs [ this . vLang ] ) , vColWidth ) ;
386- vTmpDate . setDate ( vTmpDate . getDate ( ) + 7 ) ;
385+ // Group weeks by year: span all weeks whose start date falls in the same year
386+ const thisYear = vTmpDate . getFullYear ( ) ;
387+ let countDate = new Date ( vTmpDate ) ;
388+ vColSpan = 0 ;
389+ while ( countDate . getTime ( ) <= vMaxDate . getTime ( ) && countDate . getFullYear ( ) === thisYear ) {
390+ vColSpan ++ ;
391+ countDate . setDate ( countDate . getDate ( ) + 7 ) ;
392+ }
393+ const vTmpCell = newNode ( vTmpRow , "td" , null , vHeaderCellClass , null , null , null , null , vColSpan ) ;
394+ newNode ( vTmpCell , "div" , null , null , formatDateStr ( vTmpDate , this . vWeekMajorDateDisplayFormat , this . vLangs [ this . vLang ] ) , vColWidth * vColSpan ) ;
395+ vTmpDate . setDate ( vTmpDate . getDate ( ) + vColSpan * 7 ) ;
387396 } else if ( this . vFormat == "month" ) {
388397 vColSpan = 12 - vTmpDate . getMonth ( ) ;
389398 if ( vTmpDate . getFullYear ( ) == vMaxDate . getFullYear ( ) ) vColSpan -= 11 - vMaxDate . getMonth ( ) ;
@@ -417,7 +426,9 @@ export const GanttChart = function (pDiv, pFormat) {
417426 let vMinorHeaderCellClass = "gminorheading" ;
418427
419428 if ( this . vFormat == "day" ) {
420- if ( vTmpDate . getDay ( ) % 6 == 0 ) {
429+ const vWkLastDay = ( this . vFirstDayOfWeek + 6 ) % 7 ;
430+ const vWkPenultDay = ( this . vFirstDayOfWeek + 5 ) % 7 ;
431+ if ( vTmpDate . getDay ( ) === vWkLastDay || vTmpDate . getDay ( ) === vWkPenultDay ) {
421432 if ( ! this . vShowWeekends ) {
422433 vTmpDate . setDate ( vTmpDate . getDate ( ) + 1 ) ;
423434 continue ;
@@ -528,8 +539,8 @@ export const GanttChart = function (pDiv, pFormat) {
528539 let curTaskStart = this . vTaskList [ i ] . getStart ( ) ? this . vTaskList [ i ] . getStart ( ) : this . vTaskList [ i ] . getPlanStart ( ) ;
529540 let curTaskEnd = this . vTaskList [ i ] . getEnd ( ) ? this . vTaskList [ i ] . getEnd ( ) : this . vTaskList [ i ] . getPlanEnd ( ) ;
530541
531- const vTaskLeftPx = getOffset ( vMinDate , curTaskStart , vColWidth , this . vFormat , this . vShowWeekends ) ;
532- const vTaskRightPx = getOffset ( curTaskStart , curTaskEnd , vColWidth , this . vFormat , this . vShowWeekends ) ;
542+ const vTaskLeftPx = getOffset ( vMinDate , curTaskStart , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
543+ const vTaskRightPx = getOffset ( curTaskStart , curTaskEnd , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
533544
534545 let curTaskPlanStart , curTaskPlanEnd ;
535546
@@ -538,8 +549,8 @@ export const GanttChart = function (pDiv, pFormat) {
538549 let vTaskPlanLeftPx = 0 ;
539550 let vTaskPlanRightPx = 0 ;
540551 if ( curTaskPlanStart && curTaskPlanEnd ) {
541- vTaskPlanLeftPx = getOffset ( vMinDate , curTaskPlanStart , vColWidth , this . vFormat , this . vShowWeekends ) ;
542- vTaskPlanRightPx = getOffset ( curTaskPlanStart , curTaskPlanEnd , vColWidth , this . vFormat , this . vShowWeekends ) ;
552+ vTaskPlanLeftPx = getOffset ( vMinDate , curTaskPlanStart , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
553+ vTaskPlanRightPx = getOffset ( curTaskPlanStart , curTaskPlanEnd , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
543554 }
544555
545556 const vID = this . vTaskList [ i ] . getID ( ) ;
@@ -782,8 +793,8 @@ export const GanttChart = function (pDiv, pFormat) {
782793 this . vProcessNeeded = false ;
783794
784795 // get overall min/max dates plus padding
785- vMinDate = getMinDate ( this . vTaskList , this . vFormat , this . getMinDate ( ) && coerceDate ( this . getMinDate ( ) ) ) ;
786- vMaxDate = getMaxDate ( this . vTaskList , this . vFormat , this . getMaxDate ( ) && coerceDate ( this . getMaxDate ( ) ) ) ;
796+ vMinDate = getMinDate ( this . vTaskList , this . vFormat , this . getMinDate ( ) && coerceDate ( this . getMinDate ( ) ) , this . vFirstDayOfWeek ) ;
797+ vMaxDate = getMaxDate ( this . vTaskList , this . vFormat , this . getMaxDate ( ) && coerceDate ( this . getMaxDate ( ) ) , this . vFirstDayOfWeek ) ;
787798
788799 // Calculate chart width variables.
789800 if ( this . vFormat == "day" ) vColWidth = this . vDayColWidth ;
@@ -872,13 +883,13 @@ export const GanttChart = function (pDiv, pFormat) {
872883
873884 if ( this . vFormat == "hour" ) vScrollDate . setMinutes ( 0 , 0 , 0 ) ;
874885 else vScrollDate . setHours ( 0 , 0 , 0 , 0 ) ;
875- vScrollPx = getOffset ( vMinDate , vScrollDate , vColWidth , this . vFormat , this . vShowWeekends ) - 30 ;
886+ vScrollPx = getOffset ( vMinDate , vScrollDate , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) - 30 ;
876887 }
877888 this . getChartBody ( ) . scrollLeft = vScrollPx ;
878889 }
879890
880891 if ( vMinDate . getTime ( ) <= new Date ( ) . getTime ( ) && vMaxDate . getTime ( ) >= new Date ( ) . getTime ( ) ) {
881- this . vTodayPx = getOffset ( vMinDate , new Date ( ) , vColWidth , this . vFormat , this . vShowWeekends ) ;
892+ this . vTodayPx = getOffset ( vMinDate , new Date ( ) , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
882893 } else this . vTodayPx = - 1 ;
883894
884895 // DEPENDENCIES: Draw lines of Dependencies
@@ -916,7 +927,7 @@ export const GanttChart = function (pDiv, pFormat) {
916927
917928 updateGridHeaderWidth ( this ) ;
918929 this . chartRowDateToX = function ( date ) {
919- return getOffset ( vMinDate , date , vColWidth , this . vFormat , this . vShowWeekends ) ;
930+ return getOffset ( vMinDate , date , vColWidth , this . vFormat , this . vShowWeekends , this . vFirstDayOfWeek ) ;
920931 } ;
921932
922933 if ( this . vEvents && this . vEvents . afterDraw ) {
0 commit comments