|
152 | 152 | return new Date( this.getFullYear(), this.getMonth(), this.getDate() + diff ); |
153 | 153 | }; |
154 | 154 |
|
155 | | - // fixes https://github.com/taitems/jQuery.Gantt/issues/62 |
156 | | - function ktkGetNextDate(currentDate, scaleStep) { |
157 | | - for(var minIncrements = 1;; minIncrements++) { |
158 | | - var nextDate = new Date(currentDate); |
159 | | - nextDate.setHours(currentDate.getHours() + scaleStep * minIncrements); |
160 | | - |
161 | | - if (nextDate.getTime() !== currentDate.getTime()) { |
162 | | - return nextDate; |
163 | | - } |
164 | | - |
165 | | - // If code reaches here, it's because current didn't really increment (invalid local time) because of daylight-saving adjustments |
166 | | - // => retry adding 2, 3, 4 hours, and so on (until nextDate > current) |
167 | | - } |
168 | | - } |
169 | | - |
170 | 155 | $.fn.gantt = function (options) { |
171 | 156 |
|
172 | 157 | var scales = ["hours", "days", "weeks", "months"]; |
|
706 | 691 | default: |
707 | 692 | range = tools.parseDateRange(element.dateStart, element.dateEnd); |
708 | 693 | dataPanelWidth = range.length * tools.getCellSize(); |
709 | | - |
710 | | - var dateBefore = ktkGetNextDate(range[0], -1); |
711 | | - year = dateBefore.getFullYear(); |
712 | | - month = dateBefore.getMonth(); |
713 | | - //day = dateBefore; // <- never used? |
| 694 | + |
| 695 | + year = range[0].getFullYear(); |
| 696 | + month = range[0].getMonth(); |
714 | 697 |
|
715 | 698 | for (i = 0, len = range.length; i < len; i++) { |
716 | 699 | rday = range[i]; |
|
1236 | 1219 | core.waitToggle(element, function () { |
1237 | 1220 |
|
1238 | 1221 | var zoomIn = (val < 0); |
1239 | | - |
1240 | 1222 | var scaleSt = element.scaleStep + val * 3; |
1241 | | - scaleSt = scaleSt <= 1 ? 1 : scaleSt === 4 ? 3 : scaleSt; |
| 1223 | + // adjust hour scale to desired factors of 24 |
| 1224 | + scaleSt = {4:3, 5:6, 9:8, 11:12}[scaleSt] || (scaleSt < 1 ? 1 : scaleSt); |
1242 | 1225 | var scale = settings.scale; |
1243 | 1226 | var headerRows = element.headerRows; |
1244 | 1227 | if (settings.scale === "hours" && scaleSt >= 13) { |
|
1518 | 1501 |
|
1519 | 1502 | // Return an array of Date objects between `from` and `to` |
1520 | 1503 | parseDateRange: function (from, to) { |
1521 | | - var current = new Date(from.getTime()); |
1522 | | - var ret = []; |
1523 | | - var i = 0; |
| 1504 | + var year = from.getFullYear(); |
| 1505 | + var month = from.getMonth(); |
| 1506 | + var date = from.getDate(); |
| 1507 | + var range = [], i = 0; |
1524 | 1508 | do { |
1525 | | - ret[i++] = new Date(current.getTime()); |
1526 | | - current.setDate(current.getDate() + 1); |
1527 | | - } while (current <= to); |
1528 | | - return ret; |
| 1509 | + range[i] = new Date(year, month, date + i); |
| 1510 | + } while (range[i++] < to); |
| 1511 | + return range; |
1529 | 1512 | }, |
1530 | 1513 |
|
1531 | 1514 | // Return an array of Date objects between `from` and `to`, |
1532 | 1515 | // scaled hourly |
1533 | 1516 | parseTimeRange: function (from, to, scaleStep) { |
1534 | | - var current = new Date(from); |
1535 | | - var end = new Date(to); |
1536 | | - |
1537 | | - // GR: Fix begin |
1538 | | - current.setHours(0, 0, 0, 0); |
1539 | | - |
1540 | | - end.setMilliseconds(0); |
1541 | | - end.setSeconds(0); |
1542 | | - if (end.getMinutes() > 0 || end.getHours() > 0) { |
1543 | | - end.setMinutes(0); |
1544 | | - end.setHours(0); |
1545 | | - end.setTime(end.getTime() + UTC_DAY_IN_MS); |
1546 | | - } |
1547 | | - // GR: Fix end |
1548 | | - |
1549 | | - var ret = []; |
1550 | | - var i = 0; |
1551 | | - for(;;) { |
1552 | | - var dayStartTime = new Date(current); |
1553 | | - dayStartTime.setHours(Math.floor((current.getHours()) / scaleStep) * scaleStep); |
1554 | | - |
1555 | | - if (ret[i] && dayStartTime.getDay() !== ret[i].getDay()) { |
1556 | | - // If mark-cursor jumped to next day, make sure it starts at 0 hours |
1557 | | - dayStartTime.setHours(0); |
1558 | | - } |
1559 | | - ret[i] = dayStartTime; |
1560 | | - |
1561 | | - // Note that we use ">" because we want to include the end-time point. |
1562 | | - if (current > to) { break; } |
1563 | | - |
1564 | | - /* BUG-2: current is moved backwards producing a dead-lock! (crashes chrome/IE/firefox) |
1565 | | - * SEE: https://github.com/taitems/jQuery.Gantt/issues/62 |
1566 | | - if (current.getDay() !== ret[i].getDay()) { |
1567 | | - current.setHours(0); |
| 1517 | + var year = from.getFullYear(); |
| 1518 | + var month = from.getMonth(); |
| 1519 | + var date = from.getDate(); |
| 1520 | + var hour = from.getHours(); |
| 1521 | + hour -= hour % scaleStep; |
| 1522 | + var range = [], h = 0, i = 0; |
| 1523 | + do { |
| 1524 | + range[i] = new Date(year, month, date, hour + h++ * scaleStep); |
| 1525 | + // overwrite any hours repeated due to DST changes |
| 1526 | + if (i > 0 && range[i].getHours() === range[i-1].getHours()) { |
| 1527 | + i--; |
1568 | 1528 | } |
1569 | | - */ |
1570 | | - |
1571 | | - // GR Fix Begin |
1572 | | - current = ktkGetNextDate(dayStartTime, scaleStep); |
1573 | | - // GR Fix End |
1574 | | - |
1575 | | - i++; |
1576 | | - } |
1577 | | - |
1578 | | - return ret; |
| 1529 | + } while (range[i++] < to); |
| 1530 | + return range; |
1579 | 1531 | }, |
1580 | 1532 |
|
1581 | 1533 | // Return an array of Date objects between a range of weeks |
|
0 commit comments