diff --git a/css/style.css b/css/style.css
index 0756dfe..fcf3f34 100644
--- a/css/style.css
+++ b/css/style.css
@@ -323,7 +323,7 @@
width: 20px;
height: 20px;
font-size: 0px;
- background: #595959 url(../img/icon_sprite.png) !important;
+ background: #595959 url(../img/icon_sprite.png);
border: 1px solid #454546;
cursor: pointer;
vertical-align: top;
@@ -343,6 +343,16 @@
box-shadow: 0 1px 1px rgba(0,0,0,0.25) inset, 0 1px 0 #FFF;
}
+.fn-gantt .nav-link:disabled {
+ border: 1px solid #C4C4C4;
+ background-color: #dddddd;
+ -webkit-box-shadow: 0 0px 0px rgba(0,0,0,0);
+ -moz-box-shadow: 0 0px 0px rgba(0,0,0,0);
+ box-shadow: 0 0px 0px rgba(0,0,0,0);
+
+ cursor: not-allowed;
+}
+
.fn-gantt .navigate .nav-page-back {
background-position: 1px 0 !important;
margin: 0;
diff --git a/index.html b/index.html
index dd193db..610fabb 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")
|
@@ -487,16 +487,16 @@
name: "Sprint 0",
desc: "Analysis",
values: [{
- from: "/Date(1320192000000)/",
- to: "/Date(1322401600000)/",
+ from: "/Date(1446336000000)/",
+ to: "/Date(1448545600000)/",
label: "Requirement Gathering",
customClass: "ganttRed"
}]
},{
desc: "Scoping",
values: [{
- from: "/Date(1322611200000)/",
- to: "/Date(1323302400000)/",
+ from: "/Date(1448755200000)/",
+ to: "/Date(1449446400000)/",
label: "Scoping",
customClass: "ganttRed"
}]
@@ -504,8 +504,8 @@
name: "Sprint 1",
desc: "Development",
values: [{
- from: "/Date(1323802400000)/",
- to: "/Date(1325685200000)/",
+ from: "/Date(1449946400000)/",
+ to: "/Date(1451829200000)/",
label: "Development",
customClass: "ganttGreen"
}]
@@ -513,8 +513,8 @@
name: " ",
desc: "Showcasing",
values: [{
- from: "/Date(1325685200000)/",
- to: "/Date(1325695200000)/",
+ from: "/Date(1451829200000)/",
+ to: "/Date(1451839200000)/",
label: "Showcasing",
customClass: "ganttBlue"
}]
@@ -522,16 +522,16 @@
name: "Sprint 2",
desc: "Development",
values: [{
- from: "/Date(1326785200000)/",
- to: "/Date(1325785200000)/",
+ from: "/Date(1452929200000)/",
+ to: "/Date(1451929200000)/",
label: "Development",
customClass: "ganttGreen"
}]
},{
desc: "Showcasing",
values: [{
- from: "/Date(1328785200000)/",
- to: "/Date(1328905200000)/",
+ from: "/Date(1454929200000)/",
+ to: "/Date(1455049200000)/",
label: "Showcasing",
customClass: "ganttBlue"
}]
@@ -539,24 +539,24 @@
name: "Release Stage",
desc: "Training",
values: [{
- from: "/Date(1330011200000)/",
- to: "/Date(1336611200000)/",
+ from: "/Date(1456155200000)/",
+ to: "/Date(1462755200000)/",
label: "Training",
customClass: "ganttOrange"
}]
},{
desc: "Deployment",
values: [{
- from: "/Date(1336611200000)/",
- to: "/Date(1338711200000)/",
+ from: "/Date(1462755200000)/",
+ to: "/Date(1464855200000)/",
label: "Deployment",
customClass: "ganttOrange"
}]
},{
desc: "Warranty Period",
values: [{
- from: "/Date(1336611200000)/",
- to: "/Date(1349711200000)/",
+ from: "/Date(1462755200000)/",
+ to: "/Date(1475855200000)/",
label: "Warranty Period",
customClass: "ganttOrange"
}]
diff --git a/js/jquery.fn.gantt.js b/js/jquery.fn.gantt.js
index 564f419..e06088a 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);
@@ -276,9 +300,7 @@
$(element).empty().append(element.gantt);
- element.scrollNavigation.panelMargin = parseInt($dataPanel.css("margin-left").replace("px", ""), 10);
- element.scrollNavigation.panelMaxPos = ($dataPanel.width() - $rightPanel.width());
-
+ element.scrollNavigation.panelMaxPos = ($dataPanel.width() - $rightPanel.width()) * -1;
element.scrollNavigation.canScroll = ($dataPanel.width() > $rightPanel.width());
core.markNow(element);
@@ -306,11 +328,13 @@
element.scaleOldWidth = null;
}
$dataPanel.css({ "margin-left": element.hPosition });
- element.scrollNavigation.panelMargin = element.hPosition;
}
core.repositionLabel(element);
}
+ core.switchScrollButton(element);
+
+
$dataPanel.css({ height: $leftPanel.height() });
core.waitToggle(element);
settings.onRender();
@@ -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
@@ -803,6 +816,7 @@
.append($('')
.append($('')
.append($('')
+ .prop("disabled", element.pageNum === 0)
.html('<')
.click(function () {
core.navigatePage(element, -1);
@@ -811,6 +825,7 @@
.append($('')
.html(element.pageNum + 1 + ' / ' + element.pageCount)))
.append($('')
+ .prop("disabled", element.pageNum + 1 === element.pageCount)
.html('>')
.click(function () {
core.navigatePage(element, 1);
@@ -823,28 +838,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,35 +865,21 @@
.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($('')
+ .prop("disabled", settings.scale == settings.minScale)
.html('+')
.click(function () {
core.zoomInOut(element, -1);
}))
.append($('')
+ .prop("disabled", settings.scale == settings.maxScale)
.html('-')
.click(function () {
core.zoomInOut(element, 1);
@@ -908,6 +893,7 @@
} else {
ganttNavigate = $('')
.append($('')
+ .prop("disabled", element.pageNum === 0)
.html('<')
.click(function () {
core.navigatePage(element, -1);
@@ -916,6 +902,7 @@
.append($('')
.html(element.pageNum + 1 + ' / ' + element.pageCount)))
.append($('')
+ .prop("disabled", element.pageNum + 1 === element.pageCount)
.html('>')
.click(function () {
core.navigatePage(element, 1);
@@ -956,11 +943,13 @@
core.navigateTo(element, 'end');
}))
.append($('')
+ .prop("disabled", settings.scale == settings.minScale)
.html('+')
.click(function () {
core.zoomInOut(element, -1);
}))
.append($('')
+ .prop("disabled", settings.scale == settings.maxScale)
.html('-')
.click(function () {
core.zoomInOut(element, 1);
@@ -1011,7 +1000,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;
@@ -1025,6 +1015,10 @@
default:
$(element).find(':findday("' + cd + '")').removeClass('wd').addClass('today');
}
+
+ var $dataPanel = $(element).find(".fn-gantt .rightPanel .dataPanel");
+ $(element).find(".fn-gantt .bottom .navigate button.nav-now").prop("disabled", !element.scrollNavigation.canScroll || !$dataPanel.find(".today").length);
+
},
// **Fill the Chart**
@@ -1052,25 +1046,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 +1073,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 +1098,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 +1109,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) {
@@ -1158,51 +1132,48 @@
}
});
},
+
// **Navigation**
navigateTo: function (element, val) {
- var $rightPanel = $(element).find(".fn-gantt .rightPanel");
- var $dataPanel = $rightPanel.find(".dataPanel");
- var rightPanelWidth = $rightPanel.width();
- var dataPanelWidth = $dataPanel.width();
+ if (!element.scrollNavigation.canScroll) {
+ return;
+ }
+ var $dataPanel = $(element).find(".fn-gantt .rightPanel .dataPanel");
var shift = function () {
- core.repositionLabel(element);
+ core.switchScrollButton(element);
+ core.repositionLabel(element);
};
- var maxLeft, curMarg;
+ var panelMargin;
switch (val) {
case "begin":
- $dataPanel.animate({ "margin-left": "0px" }, "fast", shift);
- element.scrollNavigation.panelMargin = 0;
+ panelMargin = 0;
break;
case "end":
- var mLeft = dataPanelWidth - rightPanelWidth;
- element.scrollNavigation.panelMargin = mLeft * -1;
- $dataPanel.animate({ "margin-left": "-" + mLeft }, "fast", shift);
+ panelMargin = element.scrollNavigation.panelMaxPos;
break;
case "now":
- if (!element.scrollNavigation.canScroll || !$dataPanel.find(".today").length) {
+ if (!$dataPanel.find(".today").length) {
return false;
}
- maxLeft = (dataPanelWidth - rightPanelWidth) * -1;
- curMarg = $dataPanel.css("margin-left").replace("px", "");
- val = $dataPanel.find(".today").offset().left - $dataPanel.offset().left;
- val *= -1;
- if (val > 0) {
- val = 0;
- } else if (val < maxLeft) {
- val = maxLeft;
- }
- $dataPanel.animate({ "margin-left": val }, "fast", shift);
- element.scrollNavigation.panelMargin = val;
+
+ panelMargin = $dataPanel.find(".today").offset().left - $dataPanel.offset().left;
+ panelMargin *= -1;
+
+ panelMargin = (panelMargin < 0 ? panelMargin : 0);
+ panelMargin = (panelMargin > element.scrollNavigation.panelMaxPos ? panelMargin : element.scrollNavigation.panelMaxPos);
+
break;
default:
- maxLeft = (dataPanelWidth - rightPanelWidth) * -1;
- curMarg = $dataPanel.css("margin-left").replace("px", "");
- val = parseInt(curMarg, 10) + val;
- if (val <= 0 && val >= maxLeft) {
- $dataPanel.animate({ "margin-left": val }, "fast", shift);
- }
- element.scrollNavigation.panelMargin = val;
+ panelMargin = parseInt($dataPanel.css("margin-left").replace("px", ""), 10);
+ panelMargin += val;
+
+ panelMargin = (panelMargin < 0 ? panelMargin : 0);
+ panelMargin = (panelMargin > element.scrollNavigation.panelMaxPos ? panelMargin : element.scrollNavigation.panelMaxPos);
+
}
+
+ $dataPanel.animate({ "margin-left": panelMargin }, "fast", shift);
+
core.synchronizeScroller(element);
},
@@ -1225,46 +1196,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", "");
@@ -1318,36 +1262,24 @@
sliderScroll: function (element, e) {
var $sliderBar = $(element).find(".nav-slider-bar");
var $sliderBarBtn = $sliderBar.find(".nav-slider-button");
- var $rightPanel = $(element).find(".fn-gantt .rightPanel");
- var $dataPanel = $rightPanel.find(".dataPanel");
+ var $dataPanel = $(element).find(".fn-gantt .rightPanel .dataPanel");
var bPos = $sliderBar.offset();
var bWidth = $sliderBar.width();
var wButton = $sliderBarBtn.width();
- var pos, mLeft;
+ var pos = e.pageX - bPos.left;
+ pos = pos < 0 ? 0 : pos;
+ pos = pos > bWidth ? bWidth : pos;
+ $sliderBarBtn.css("left", pos - wButton / 2);
- if ((e.pageX >= bPos.left) && (e.pageX <= bPos.left + bWidth)) {
- pos = e.pageX - bPos.left;
- pos = pos - wButton / 2;
- $sliderBarBtn.css("left", pos);
+ var panelMargin = pos * element.scrollNavigation.panelMaxPos / bWidth;
- mLeft = $dataPanel.width() - $rightPanel.width();
+ $dataPanel.css("margin-left", panelMargin);
- var pPos = pos * mLeft / bWidth * -1;
- if (pPos >= 0) {
- $dataPanel.css("margin-left", "0px");
- element.scrollNavigation.panelMargin = 0;
- } else if (pos >= bWidth - (wButton * 1)) {
- $dataPanel.css("margin-left", mLeft * -1);
- element.scrollNavigation.panelMargin = mLeft * -1;
- } else {
- $dataPanel.css("margin-left", pPos);
- element.scrollNavigation.panelMargin = pPos;
- }
- clearTimeout(element.scrollNavigation.repositionDelay);
- element.scrollNavigation.repositionDelay = setTimeout(core.repositionLabel, 5, element);
- }
+ core.switchScrollButton(element);
+ clearTimeout(element.scrollNavigation.repositionDelay);
+ element.scrollNavigation.repositionDelay = setTimeout(core.repositionLabel, 5, element);
},
// Update scroll panel margins
@@ -1355,39 +1287,35 @@
if (!element.scrollNavigation.canScroll) {
return false;
}
- var _panelMargin = parseInt(element.scrollNavigation.panelMargin, 10) + delta;
- if (_panelMargin > 0) {
- element.scrollNavigation.panelMargin = 0;
- $(element).find(".fn-gantt .dataPanel").css("margin-left", element.scrollNavigation.panelMargin);
- } else if (_panelMargin < element.scrollNavigation.panelMaxPos * -1) {
- element.scrollNavigation.panelMargin = element.scrollNavigation.panelMaxPos * -1;
- $(element).find(".fn-gantt .dataPanel").css("margin-left", element.scrollNavigation.panelMargin);
- } else {
- element.scrollNavigation.panelMargin = _panelMargin;
- $(element).find(".fn-gantt .dataPanel").css("margin-left", element.scrollNavigation.panelMargin);
- }
+ var $dataPanel = $(element).find(".fn-gantt .dataPanel");
+ var panelMargin = parseInt($dataPanel.css("margin-left").replace("px", ""), 10);
+ panelMargin += delta;
+
+ panelMargin = (panelMargin <= 0 ? panelMargin : 0);
+ panelMargin = (panelMargin >= element.scrollNavigation.panelMaxPos ? panelMargin : element.scrollNavigation.panelMaxPos);
+
+ $dataPanel.css("margin-left", panelMargin);
+
+ core.switchScrollButton(element);
core.synchronizeScroller(element);
},
// Synchronize scroller
synchronizeScroller: function (element) {
if (settings.navigate !== "scroll") { return; }
- var $rightPanel = $(element).find(".fn-gantt .rightPanel");
- var $dataPanel = $rightPanel.find(".dataPanel");
+ var $dataPanel = $(element).find(".fn-gantt .rightPanel .dataPanel");
var $sliderBar = $(element).find(".nav-slider-bar");
var $sliderBtn = $sliderBar.find(".nav-slider-button");
var bWidth = $sliderBar.width();
var wButton = $sliderBtn.width();
- var mLeft = $dataPanel.width() - $rightPanel.width();
var hPos = $dataPanel.css("margin-left") || 0;
if (hPos) {
hPos = hPos.replace("px", "");
}
- var pos = hPos * bWidth / mLeft - $sliderBtn.width() * 0.25;
- pos = pos > 0 ? 0 : (pos * -1 >= bWidth - (wButton * 0.75)) ? (bWidth - (wButton * 1.25)) * -1 : pos;
- $sliderBtn.css("left", pos * -1);
+ var pos = hPos * bWidth / element.scrollNavigation.panelMaxPos;
+ $sliderBtn.css("left", pos - wButton/2);
},
// Reposition data labels
@@ -1404,26 +1332,43 @@
if (settings.useCookie) {
$.cookie(settings.cookieKey + "ScrollPos", $dataPanel.css("margin-left").replace("px", ""));
}
- }, 500);
+ }, 200);
+ },
+
+ switchScrollButton: function(element) {
+ // enable all scroll button
+ // navigation
+ var $navigate = $(element).find(".fn-gantt .bottom .navigate");
+ $navigate.find('button.nav-begin, button.nav-prev-week, button.nav-prev-day, button.nav-next-day, button.nav-next-week, button.nav-end')
+ .prop("disabled", false);
+
+ // Margin
+ var $dataPanel = $(element).find(".fn-gantt .rightPanel .dataPanel");
+ var panelMargin = parseInt($dataPanel.css("margin-left").replace("px", ""), 10);
+
+ // prevButton
+ $navigate.find('button.nav-begin, button.nav-prev-week, button.nav-prev-day').prop("disabled", !element.scrollNavigation.canScroll || panelMargin >= 0);
+
+ // nextButton
+ $navigate.find('button.nav-end, button.nav-next-week, button.nav-next-day').prop("disabled", !element.scrollNavigation.canScroll || panelMargin <= element.scrollNavigation.panelMaxPos);
+
+
},
// 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 +1387,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 +1424,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 +1469,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 +1478,6 @@
end.setHours(0);
end.setTime(end.getTime() + UTC_DAY_IN_MS);
}
- // GR: Fix end
var ret = [];
var i = 0;
@@ -1556,9 +1501,7 @@
}
*/
- // GR Fix Begin
current = ktkGetNextDate(dayStartTime, scaleStep);
- // GR Fix End
i++;
}
@@ -1612,7 +1555,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 +1655,6 @@
this.dateEnd = null;
this.scrollClicked = false;
this.scaleOldWidth = null;
- this.headerRows = null;
// Update cookie with current scale
if (settings.useCookie) {
@@ -1722,35 +1666,12 @@
}
}
- 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,
scrollerMouseDown: false,
mouseX: null,
- panelMargin: 0,
repositionDelay: 0,
panelMaxPos: 0,
canScroll: true