Layout

The GanttSheet chart area layout can be configured with link line mode, taskbar height, date text format and taskbars rounded to whole days.

Description
app.js
index.html
styles.css
Copy to CodeMine

There are 3 modes (GC.Spread.Sheets.GanttSheet.TaskBarLinkMode):

  • toEnd
  • toTop
  • noLinks
ganttSheet.project.layout.linkLineMode = "toEnd";

Taskbar Height

You can change the taskbar height with a specific number:

var barHeight = 16;
ganttSheet.project.layout.barHeight = barHeight;

Date Format

If you add text to the taskbar, you can change its display formats.

Available formatters:

  • "yyyy-mm-dd"
  • "yy/m/dd hh:mm"
  • "yy/m/dd"
  • "yyyy/m/dd"
  • "yyyy mmmm dd hh:mm"
  • "yyyy mmmm dd"
  • "mmm dd hh:mm"
  • "'yy mm dd"
  • "mmmm dd"
  • "mmm dd"
  • "ddd yy/m/dd hh:mm"
  • "ddd yy/m/dd"
  • "ddd yy mm dd"
  • "ddd hh:mm"
  • "ddd mm dd"
  • "ddd m/dd"
  • "ddd dd"
  • "m/dd"
  • "dd"
  • "hh:mm"
var barTextDateFormat = "yyyy-mm-dd";
ganttSheet.project.layout.barTextDateFormat = barTextDateFormat;

Round Bars To Whole Days

The actual task duration is not always whole days, so there is an option that will round these bars to whole days:

ganttSheet.project.layout.roundBarsToWholeDays = true;
Link Line Mode There are 3 modes (GC.Spread.Sheets.GanttSheet.TaskBarLinkMode): toEnd toTop noLinks Taskbar Height You can change the taskbar height with a specific number: Date Format If you add text to the taskbar, you can change its display formats. Available formatters: "yyyy-mm-dd" "yy/m/dd hh:mm" "yy/m/dd" "yyyy/m/dd" "yyyy mmmm dd hh:mm" "yyyy mmmm dd" "mmm dd hh:mm" "'yy mm dd" "mmmm dd" "mmm dd" "ddd yy/m/dd hh:mm" "ddd yy/m/dd" "ddd yy mm dd" "ddd hh:mm" "ddd mm dd" "ddd m/dd" "ddd dd" "m/dd" "dd" "hh:mm" Round Bars To Whole Days The actual task duration is not always whole days, so there is an option that will round these bars to whole days:
/*REPLACE_MARKER*/ /*DO NOT DELETE THESE COMMENTS*/ var myTable; var ganttSheet; var roundBarsToWholeDays = true; window.onload = function() { var spread = new GC.Spread.Sheets.Workbook(document.getElementById("ss"), { sheetCount: 0 }); initSpread(spread); initSplitView(spread); }; function initSpread(spread) { spread.suspendPaint(); initDataSource(spread); initGanttSheet(spread); spread.resumePaint(); } function initDataSource(spread) { var tableName = "Gantt_Id"; var baseApiUrl = getBaseApiUrl(); var apiUrl = baseApiUrl + "/" + tableName; var dataManager = spread.dataManager(); myTable = dataManager.addTable("myTable", { batch: true, remote: { read: { url: apiUrl } }, schema: { hierarchy: { type: "Parent", column: "parentId" }, columns: { id: { isPrimaryKey: true }, taskNumber: { dataType: "rowOrder" } } } }); } function initGanttSheet(spread) { ganttSheet = spread.addSheetTab(0, "GanttSheet", GC.Spread.Sheets.SheetType.ganttSheet); var view = myTable.addView("ganttView", [ { value: "taskNumber", caption: "NO.", width: 60 }, { value: "name", caption: "Task Name", width: 200 }, { value: "duration", caption: "Duration", width: 90 }, { value: "predecessors", caption: "Predecessors", width: 120, visible: false } ]); view.fetch().then(function() { ganttSheet.bindGanttView(view); ganttSheet.suspendPaint(); var summaryStyleRule = ganttSheet.project.taskStyleRules.getRule("summary"); var summaryStyle = summaryStyleRule.style.taskbarStyle; summaryStyle.leftText = "start"; summaryStyle.rightText = "finish"; summaryStyleRule.style.taskbarStyle = summaryStyle; var layout = ganttSheet.project.layout; layout.linkLineMode = "noLinks"; layout.barHeight = 18; ganttSheet.resumePaint(); }); initSidePanel(ganttSheet); } function initSidePanel(ganttSheet) { var roundBarItem = document.getElementById("round-bar"); var linkTypeItem = document.getElementById("link-type"); var barHeightItem = document.getElementById("bar-height"); var dateFormatItem = document.getElementById("date-format"); var setLayoutItem = document.getElementById("set-layout"); roundBarItem.addEventListener("click", function() { if (roundBarItem.classList.contains("active")) { roundBarItem.classList.remove("active"); roundBarsToWholeDays = false; } else { roundBarItem.classList.add("active"); roundBarsToWholeDays = true; } }); setLayoutItem.addEventListener("click", function() { var layout = ganttSheet.project.layout; ganttSheet.suspendPaint(); layout.linkLineMode = linkTypeItem.value; layout.barHeight = Number(barHeightItem.value); layout.barTextDateFormat = dateFormatItem.value; layout.roundBarsToWholeDays = roundBarsToWholeDays; ganttSheet.resumePaint(); }); } function getBaseApiUrl() { return window.location.href.match(/http.+spreadjs\/demos\//)[0] + 'server/api'; } function initSplitView(spread) { var host = document.getElementById("split-view"); var content = host.getElementsByClassName("split-content")[0]; var panel = host.getElementsByClassName("split-panel")[0]; new SplitView({ host: host, content: content, panel: panel, refreshContent: function() { spread.refresh(); } }); }
<!doctype html> <html style="height:100%;font-size:14px;"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/styles/gc.spread.sheets.excel2013white.css"> <link rel="stylesheet" type="text/css" href="$DEMOROOT$/spread/source/splitView/splitView.css"> <!-- Promise Polyfill for IE, https://www.npmjs.com/package/promise-polyfill --> <script src="https://cdn.jsdelivr.net/npm/promise-polyfill@8/dist/polyfill.min.js"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets/dist/gc.spread.sheets.all.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-tablesheet/dist/gc.spread.sheets.tablesheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/en/purejs/node_modules/@mescius/spread-sheets-ganttsheet/dist/gc.spread.sheets.ganttsheet.min.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/splitView/splitView.js" type="text/javascript"></script> <script src="$DEMOROOT$/spread/source/js/license.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> <link rel="stylesheet" type="text/css" href="styles.css"> </head> <body> <div id="split-view" class="sample-tutorial"> <div id="ss" class="sample-spreadsheets split-content"></div> <div class="options-container split-panel"> <div class="option-row option-title"> Config the gantt chart layout. </div> <div class="option-block"> <div class="option-row selection-box"> <label for="link-type">Link Mode</label> <select id="link-type"> <option value="noLinks">noLinks</option> <option value="toEnd">toEnd</option> <option value="toTop" selected>toTop</option> </select> </div> </div> <div class="option-block"> <div class="option-row selection-box"> <label for="bar-height">Bar Height</label> <select id="bar-height"> <option value="6">6</option> <option value="8">8</option> <option value="10">10</option> <option value="12" selected>12</option> <option value="14">14</option> <option value="18">18</option> <option value="24">24</option> </select> </div> <div class="option-row selection-box"> <label for="date-format">Date Format</label> <select id="date-format"> <option value="yyyy-mm-dd" selected>Default</option> <option value="yy/m/dd hh:mm">09/1/28 12:33</option> <option value="yy/m/dd">09/1/28</option> <option value="yyyy/m/dd">2009/1/28</option> <option value="yyyy mmmm dd hh:mm">2009 January 28 12:33</option> <option value="yyyy mmmm dd">2009 January 28</option> <option value="mmm dd hh:mm">Jan 28 12:33</option> <option value="'yy mm dd">'09 Jan 28</option> <option value="mmmm dd">January 28</option> <option value="mmm dd">Jan 28</option> <option value="ddd yy/m/dd hh:mm">Wed 09/1/28 12:33</option> <option value="ddd yy/m/dd">Wed 09/1/28</option> <option value="ddd yy mm dd">Wed 09 Jan 28</option> <option value="ddd hh:mm">Wed 12:33</option> <option value="ddd mm dd">Wed Jan 28</option> <option value="ddd m/dd">Wed 1/28</option> <option value="ddd dd">Wed 28</option> <option value="m/dd">1/28</option> <option value="dd">28</option> <option value="hh:mm">12:33</option> </select> </div> </div> <div class="option-block"> <div class="option-row"> <label class="option-checkbox active" id="round-bar">Round Bars To Whole Days</label> <div class="option-info">* checkbox toggle whether round bars to whole days.</div> </div> </div> <div class="option-row"> <input type="button" id="set-layout" class="option-button" value="Set Layout" /> </div> </div> </div> </html>
.options-container { float: right; width: 280px; padding: 12px; height: 100%; box-sizing: border-box; background: #fbfbfb; overflow: auto; box-shadow: inset 0px 0 4px 0 rgba(0,0,0,0.4); } .option-block { background: #fff; padding: 8px; margin: 12px 0; border-radius: 4px; border: 1px dashed #82bc00; box-shadow: 0px 0 6px 0 rgba(0,0,0,0.1); } .option-block.toggle { border: 1px dotted #f7a711; } .option-row { font-size: 14px; box-sizing: border-box; padding: 4px 0; } .option-title { font-weight: bold; color: #656565; } .option-info { font-size: 12px; color: #919191; margin-top: 6px; font-weight: normal; } .option-info.valid { color: #82bc00; } .option-info.toggle { color: #f7a711; } .option-button { width: 100%; padding: 0; line-height: 20px; background: #82bc00; color: #fff; transition: 0.3s; cursor: pointer; outline: none; border-radius: 4px; box-sizing: border-box; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); border: none; } .option-button:hover { background: #82bc00; color: #fff; box-shadow: 0 3px 8px 0 rgba(0,0,0,0.4); } .option-checkbox { background: #fff; border: 1px dashed #f7a711; color: #f7a711; padding: 2px 4px; transition: 0.3s; box-sizing: border-box; cursor: pointer; } .option-checkbox.active { color: #fff; background: #f7a711; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); border-radius: 4px; } .selection-box { position: relative; } .selection-box > select { text-align: left; width: 100%; height: 20px; padding: 0; line-height: 20px; background: transparent; border: none; border-bottom: 2px solid #656565; color: #656565; transition: 0.3s; cursor: pointer; outline: none; box-sizing: border-box; } .selection-box > select > option { background: white; } .selection-box > select:focus { border-bottom: 2px solid #82bc00; color: #82bc00; box-shadow: 0 2px 6px 0 rgba(0,0,0,0.3); } .selection-box > label { position: absolute; cursor: pointer; font-size: 12px; color: #fff; background: #656565; padding: 0 4px; right: 0; top: 6px; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); } .input-box { position: relative; } .input-box > input[type=text] { width: 100%; background: transparent; border: none; color: #656565; border-bottom: 2px solid #656565; outline: none; box-sizing: border-box; transition: 0.3s; } .input-box > input[type=text]:focus { color: #82bc00; border-bottom: 2px solid #82bc00; } .input-box > label { cursor: pointer; position: absolute; right: 0; top: 5px; font-size: 12px; color: #fff; background: #656565; padding: 0 4px; box-shadow: 0 1px 4px 0 rgba(0,0,0,0.3); }