diff --git a/index.html b/index.html
index dd193db..75f41b9 100644
--- a/index.html
+++ b/index.html
@@ -1,4 +1,4 @@
-
+
jQuery.Gantt
@@ -185,7 +185,7 @@
"days"
- string ("months", "weeks", "days", "hours")
+ string ("months", "weeks", "days", "hours12", "hours6", "hours3", "hours")
|
@@ -196,7 +196,7 @@
"months"
- string ("months", "weeks", "days", "hours")
+ string ("months", "weeks", "days", "hours12", "hours6", "hours3", "hours")
|
@@ -207,7 +207,7 @@
"hours"
- string ("months", "weeks", "days", "hours")
+ string ("months", "weeks", "days", "hours12", "hours6", "hours3", "hours")
|
diff --git a/js/jquery.fn.gantt.js b/js/jquery.fn.gantt.js
index 564f419..54f630d 100644
--- a/js/jquery.fn.gantt.js
+++ b/js/jquery.fn.gantt.js
@@ -100,14 +100,14 @@
// `getRepDate` returns the milliseconds since the epoch for a given date
// depending on the active scale
- Date.prototype.getRepDate = function (scale) {
- switch (scale) {
- case "hours":
- return this.getTime();
+ Date.prototype.getRepDate = function (scaleGroup) {
+ switch (scaleGroup) {
case "weeks":
return this.getDayForWeek().getTime();
case "months":
return new Date(this.getFullYear(), this.getMonth(), 1).getTime();
+ case "hours":
+ /* falls through */
case "days":
/* falls through */
default:
@@ -169,7 +169,24 @@
$.fn.gantt = function (options) {
- var scales = ["hours", "days", "weeks", "months"];
+ var scales = ["hours", "hours3", "hours6", "hours12", "days", "weeks", "months"];
+ var scaleSettings = {
+ "hours": {scaleGroup: "hours", scaleStep: 1},
+ "hours3": {scaleGroup: "hours", scaleStep: 3},
+ "hours6": {scaleGroup: "hours", scaleStep: 6},
+ "hours12": {scaleGroup: "hours", scaleStep: 12},
+ "days": {scaleGroup: "days"},
+ "weeks": {scaleGroup: "weeks"},
+ "months": {scaleGroup: "months"},
+ };
+
+ var scaleGroupSttings = {
+ "hours": {headerRows: 5},
+ "days": {headerRows: 4},
+ "weeks": {headerRows: 3},
+ "months": {headerRows: 2},
+ };
+
//Default settings
var settings = {
source: [],
@@ -199,6 +216,13 @@
// read options
$.extend(settings, options);
+ settings.scale = ($.inArray(settings.scale, scales) >= 0) ? settings.scale : "days";
+ settings.maxScale = ($.inArray(settings.maxScale, scales) >= 0) ? settings.maxScale : scales[scales.length - 1];
+ settings.minScale = ($.inArray(settings.minScale, scales) >= 0) ? settings.minScale : scales[0];
+
+ settings.maxScale = ($.inArray(settings.scale, scales) <= $.inArray(settings.maxScale, scales) ? settings.maxScale : settings.scale);
+ settings.minScale = ($.inArray(settings.scale, scales) >= $.inArray(settings.minScale, scales) ? settings.minScale : settings.scale);
+
// can't use cookie if don't have `$.cookie`
settings.useCookie = settings.useCookie && $.isFunction($.cookie);
@@ -319,9 +343,10 @@
// Create and return the left panel with labels
leftPanel: function (element) {
/* Left panel */
+ var headerRows = scaleGroupSttings[element.scaleGroup].headerRows;
var ganttLeftPanel = $('')
.append($('')
- .css("height", tools.getCellSize() * element.headerRows)
+ .css("height", tools.getCellSize() * headerRows)
.css("width", "100%"));
var entries = [];
@@ -373,21 +398,8 @@
var corrX/* <- never used? */, corrY;
var leftpanel = $(element).find(".fn-gantt .leftPanel");
var datapanel = $(element).find(".fn-gantt .dataPanel");
- switch (settings.scale) {
- case "months":
- corrY = tools.getCellSize();
- break;
- case "hours":
- corrY = tools.getCellSize() * 4;
- break;
- case "days":
- corrY = tools.getCellSize() * 3;
- break;
- case "weeks":
- /* falls through */
- default:
- corrY = tools.getCellSize() * 2;
- }
+
+ corrY = tools.getCellSize() * (scaleGroupSttings[element.scaleGroup].headerRows -1);
/* Adjust, so get middle of elm
corrY -= Math.floor(tools.getCellSize() / 2);
@@ -451,11 +463,12 @@
var rday, dayClass;
var dataPanel;
- // Setup the headings based on the chosen `settings.scale`
- switch (settings.scale) {
+ // Setup the headings based on scaleGroup
+ switch (element.scaleGroup) {
// **Hours**
case "hours":
- range = tools.parseTimeRange(element.dateStart, element.dateEnd, element.scaleStep);
+ var scaleStep = scaleSettings[settings.scale].scaleStep;
+ range = tools.parseTimeRange(element.dateStart, element.dateEnd, scaleStep);
year = range[0].getFullYear();
month = range[0].getMonth();
@@ -526,7 +539,7 @@
'" id="dh-' +
rday.getTime() +
'" data-offset="' + i * tools.getCellSize() +
- '" data-repdate="' + rday.getRepDate(settings.scale) +
+ '" data-repdate="' + rday.getRepDate(element.scaleGroup) +
'">' +
rday.getHours() +
'
');
@@ -626,7 +639,7 @@
'' +
+ '" data-repdate="' + rday.getRepDate(element.scaleGroup) + '">' +
'
' + week + '
');
}
@@ -679,7 +692,7 @@
monthArr.push(
'' +
+ '" data-repdate="' + rday.getRepDate(element.scaleGroup) + '">' +
(1 + rday.getMonth()) + '
');
}
@@ -756,12 +769,12 @@
'');
dowArr.push(
'');
} //for
@@ -823,28 +836,12 @@
.append($('')
.html('<<')
.click(function () {
- if (settings.scale === 'hours') {
- core.navigateTo(element, tools.getCellSize() * 8);
- } else if (settings.scale === 'days') {
- core.navigateTo(element, tools.getCellSize() * 30);
- } else if (settings.scale === 'weeks') {
- core.navigateTo(element, tools.getCellSize() * 12);
- } else if (settings.scale === 'months') {
- core.navigateTo(element, tools.getCellSize() * 6);
- }
+ core.navigateTo(element, tools.getCellSize() * 7);
}))
.append($('')
.html('<')
.click(function () {
- if (settings.scale === 'hours') {
- core.navigateTo(element, tools.getCellSize() * 4);
- } else if (settings.scale === 'days') {
- core.navigateTo(element, tools.getCellSize() * 7);
- } else if (settings.scale === 'weeks') {
- core.navigateTo(element, tools.getCellSize() * 4);
- } else if (settings.scale === 'months') {
- core.navigateTo(element, tools.getCellSize() * 3);
- }
+ core.navigateTo(element, tools.getCellSize());
})))
.append($('')
.append($('')
@@ -866,28 +863,12 @@
.append($('')
.html('>')
.click(function () {
- if (settings.scale === 'hours') {
- core.navigateTo(element, tools.getCellSize() * -4);
- } else if (settings.scale === 'days') {
- core.navigateTo(element, tools.getCellSize() * -7);
- } else if (settings.scale === 'weeks') {
- core.navigateTo(element, tools.getCellSize() * -4);
- } else if (settings.scale === 'months') {
- core.navigateTo(element, tools.getCellSize() * -3);
- }
+ core.navigateTo(element, tools.getCellSize() * -1);
}))
.append($('')
.html('>>')
.click(function () {
- if (settings.scale === 'hours') {
- core.navigateTo(element, tools.getCellSize() * -8);
- } else if (settings.scale === 'days') {
- core.navigateTo(element, tools.getCellSize() * -30);
- } else if (settings.scale === 'weeks') {
- core.navigateTo(element, tools.getCellSize() * -12);
- } else if (settings.scale === 'months') {
- core.navigateTo(element, tools.getCellSize() * -6);
- }
+ core.navigateTo(element, tools.getCellSize() * -7);
}))
.append($('')
.html('+')
@@ -1011,7 +992,8 @@
// current day/week/month (depending on the current scale)
markNow: function (element) {
var cd = new Date().setHours(0, 0, 0, 0);
- switch (settings.scale) {
+
+ switch (element.scaleGroup) {
case "weeks":
$(element).find(':findweek("' + cd + '")').removeClass('wd').addClass('today');
break;
@@ -1052,25 +1034,20 @@
var _bar;
var from, to, cFrom, cTo, dFrom, dTo, dl;
var topEl, top;
- switch (settings.scale) {
+ var headerRows = scaleGroupSttings[element.scaleGroup].headerRows;
+
+ switch (element.scaleGroup) {
// **Hourly data**
case "hours":
- dFrom = tools.genId(tools.dateDeserialize(day.from), element.scaleStep);
+ var scaleStep = scaleSettings[settings.scale].scaleStep;
+ dFrom = tools.genId(tools.dateDeserialize(day.from), scaleStep);
from = $(element).find('#dh-' + dFrom);
- dTo = tools.genId(tools.dateDeserialize(day.to), element.scaleStep);
+ dTo = tools.genId(tools.dateDeserialize(day.to), scaleStep);
to = $(element).find('#dh-' + dTo);
cFrom = from.data("offset");
cTo = to.data("offset");
dl = Math.floor((cTo - cFrom) / tools.getCellSize()) + 1;
- _bar = core.createProgressBar(dl, day.label, day.desc, day.customClass, day.dataObj);
-
- // find row
- topEl = $(element).find("#rowheader" + i);
- top = tools.getCellSize() * 5 + 2 + topEl.data("offset");
- _bar.css({ 'top': top, 'left': Math.floor(cFrom) });
-
- datapanel.append(_bar);
break;
// **Weekly data**
@@ -1084,14 +1061,6 @@
cTo = to.data("offset");
dl = Math.round((cTo - cFrom) / tools.getCellSize()) + 1;
- _bar = core.createProgressBar(dl, day.label, day.desc, day.customClass, day.dataObj);
-
- // find row
- topEl = $(element).find("#rowheader" + i);
- top = tools.getCellSize() * 3 + 2 + topEl.data("offset");
- _bar.css({ 'top': top, 'left': Math.floor(cFrom) });
-
- datapanel.append(_bar);
break;
// **Monthly data**
@@ -1117,14 +1086,6 @@
cTo = to.data("offset");
dl = Math.round((cTo - cFrom) / tools.getCellSize()) + 1;
- _bar = core.createProgressBar(dl, day.label, day.desc, day.customClass, day.dataObj);
-
- // find row
- topEl = $(element).find("#rowheader" + i);
- top = tools.getCellSize() * 2 + 2 + topEl.data("offset");
- _bar.css({ 'top': top, 'left': Math.floor(cFrom) });
-
- datapanel.append(_bar);
break;
// **Days**
@@ -1136,15 +1097,16 @@
from = $(element).find("#dh-" + dFrom);
cFrom = from.data("offset");
dl = Math.floor((dTo - dFrom) / UTC_DAY_IN_MS) + 1;
- _bar = core.createProgressBar(dl, day.label, day.desc, day.customClass, day.dataObj);
+ }
- // find row
- topEl = $(element).find("#rowheader" + i);
- top = tools.getCellSize() * 4 + 2 + topEl.data("offset");
- _bar.css({ 'top': top, 'left': Math.floor(cFrom) });
+ _bar = core.createProgressBar(dl, day.label, day.desc, day.customClass, day.dataObj);
- datapanel.append(_bar);
- }
+ // find row
+ topEl = $(element).find("#rowheader" + i);
+ top = tools.getCellSize() * headerRows + 2 + topEl.data("offset");
+ _bar.css({ 'top': top, 'left': Math.floor(cFrom) });
+
+ datapanel.append(_bar);
var $l = _bar.find(".fn-label");
if ($l && _bar.length) {
@@ -1225,46 +1187,19 @@
var zoomIn = (val < 0);
- var scaleSt = element.scaleStep + val * 3;
- scaleSt = scaleSt <= 1 ? 1 : scaleSt === 4 ? 3 : scaleSt;
- var scale = settings.scale;
- var headerRows = element.headerRows;
- if (settings.scale === "hours" && scaleSt >= 13) {
- scale = "days";
- headerRows = 4;
- scaleSt = 13;
- } else if (settings.scale === "days" && zoomIn) {
- scale = "hours";
- headerRows = 5;
- scaleSt = 12;
- } else if (settings.scale === "days" && !zoomIn) {
- scale = "weeks";
- headerRows = 3;
- scaleSt = 13;
- } else if (settings.scale === "weeks" && !zoomIn) {
- scale = "months";
- headerRows = 2;
- scaleSt = 14;
- } else if (settings.scale === "weeks" && zoomIn) {
- scale = "days";
- headerRows = 4;
- scaleSt = 13;
- } else if (settings.scale === "months" && zoomIn) {
- scale = "weeks";
- headerRows = 3;
- scaleSt = 13;
- }
-
- // do nothing if attempting to zoom past max/min
- if ((zoomIn && $.inArray(scale, scales) < $.inArray(settings.minScale, scales)) ||
- (!zoomIn && $.inArray(scale, scales) > $.inArray(settings.maxScale, scales))) {
- core.init(element);
+ var index = $.inArray(settings.scale, scales);
+ if ((zoomIn && index <= $.inArray(settings.minScale, scales)) ||
+ (!zoomIn && index >= $.inArray(settings.maxScale, scales))) {
+ // do nothing if attempting to zoom past max/min
+ core.waitToggle(element);
return;
}
- element.scaleStep = scaleSt;
- settings.scale = scale;
- element.headerRows = headerRows;
+ index = zoomIn ? index - 1 : index + 1;
+
+ settings.scale = scales[index];
+ element.scaleGroup = scaleSettings[settings.scale].scaleGroup;
+
var $rightPanel = $(element).find(".fn-gantt .rightPanel");
var $dataPanel = $rightPanel.find(".dataPanel");
element.hPosition = $dataPanel.css("margin-left").replace("px", "");
@@ -1404,26 +1339,23 @@
if (settings.useCookie) {
$.cookie(settings.cookieKey + "ScrollPos", $dataPanel.css("margin-left").replace("px", ""));
}
- }, 500);
+ }, 200);
},
// waitToggle
waitToggle: function (element, showCallback) {
if ( $.isFunction(showCallback) ) {
var $elt = $(element);
- var eo = $elt.offset();
- var ew = $elt.outerWidth();
- var eh = $elt.outerHeight();
if (!element.loader) {
element.loader = $('' +
'
' + settings.waitText + '
');
}
$elt.append(element.loader);
- setTimeout(showCallback, 500);
+ setTimeout(showCallback, 200);
} else if (element.loader) {
- element.loader.detach();
+ element.loader.detach();
}
}
};
@@ -1442,10 +1374,11 @@
});
maxDate = maxDate || new Date();
var bd;
- switch (settings.scale) {
+ switch (element.scaleGroup) {
case "hours":
- maxDate.setHours(Math.ceil((maxDate.getHours()) / element.scaleStep) * element.scaleStep);
- maxDate.setHours(maxDate.getHours() + element.scaleStep * 3);
+ var scaleStep = scaleSettings[settings.scale].scaleStep;
+ maxDate.setHours(Math.ceil((maxDate.getHours()) / scaleStep) * scaleStep);
+ maxDate.setHours(maxDate.getHours() + scaleStep * 3);
break;
case "weeks":
// wtf is happening here?
@@ -1478,10 +1411,11 @@
});
});
minDate = minDate || new Date();
- switch (settings.scale) {
+ switch (element.scaleGroup) {
case "hours":
- minDate.setHours(Math.floor((minDate.getHours()) / element.scaleStep) * element.scaleStep);
- minDate.setHours(minDate.getHours() - element.scaleStep * 3);
+ var scaleStep = scaleSettings[settings.scale].scaleStep;
+ minDate.setHours(Math.floor((minDate.getHours()) / scaleStep) * scaleStep);
+ minDate.setHours(minDate.getHours() - scaleStep * 3);
break;
case "weeks":
// wtf is happening here?
@@ -1522,7 +1456,6 @@
var current = new Date(from);
var end = new Date(to);
- // GR: Fix begin
current.setHours(0, 0, 0, 0);
end.setMilliseconds(0);
@@ -1532,7 +1465,6 @@
end.setHours(0);
end.setTime(end.getTime() + UTC_DAY_IN_MS);
}
- // GR: Fix end
var ret = [];
var i = 0;
@@ -1556,9 +1488,7 @@
}
*/
- // GR Fix Begin
current = ktkGetNextDate(dayStartTime, scaleStep);
- // GR Fix End
i++;
}
@@ -1612,7 +1542,9 @@
if ( $.isNumeric(t) ) {
t = new Date(t);
}
- switch (settings.scale) {
+
+ var scaleGroup = scaleSettings[settings.scale].scaleGroup;
+ switch (scaleGroup) {
case "hours":
var hour = t.getHours();
if (arguments.length >= 2) {
@@ -1710,7 +1642,6 @@
this.dateEnd = null;
this.scrollClicked = false;
this.scaleOldWidth = null;
- this.headerRows = null;
// Update cookie with current scale
if (settings.useCookie) {
@@ -1722,29 +1653,7 @@
}
}
- switch (settings.scale) {
- //case "hours":
- // this.headerRows = 5;
- // this.scaleStep = 8;
- // break;
- case "hours":
- this.headerRows = 5;
- this.scaleStep = 1;
- break;
- case "weeks":
- this.headerRows = 3;
- this.scaleStep = 13;
- break;
- case "months":
- this.headerRows = 2;
- this.scaleStep = 14;
- break;
- case "days":
- /* falls through */
- default:
- this.headerRows = 4;
- this.scaleStep = 13;
- }
+ this.scaleGroup = scaleSettings[settings.scale].scaleGroup;
this.scrollNavigation = {
panelMouseDown: false,