You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

113 lines
3.2 KiB

  1. "use strict";
  2. var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
  3. var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
  4. exports.__esModule = true;
  5. exports.endOfRange = endOfRange;
  6. exports.eventSegments = eventSegments;
  7. exports.eventLevels = eventLevels;
  8. exports.inRange = inRange;
  9. exports.segsOverlap = segsOverlap;
  10. exports.sortEvents = sortEvents;
  11. var _findIndex = _interopRequireDefault(require("lodash/findIndex"));
  12. var dates = _interopRequireWildcard(require("./dates"));
  13. function endOfRange(dateRange, unit) {
  14. if (unit === void 0) {
  15. unit = 'day';
  16. }
  17. return {
  18. first: dateRange[0],
  19. last: dates.add(dateRange[dateRange.length - 1], 1, unit)
  20. };
  21. }
  22. function eventSegments(event, range, accessors) {
  23. var _endOfRange = endOfRange(range),
  24. first = _endOfRange.first,
  25. last = _endOfRange.last;
  26. var slots = dates.diff(first, last, 'day');
  27. var start = dates.max(dates.startOf(accessors.start(event), 'day'), first);
  28. var end = dates.min(dates.ceil(accessors.end(event), 'day'), last);
  29. var padding = (0, _findIndex.default)(range, function (x) {
  30. return dates.eq(x, start, 'day');
  31. });
  32. var span = dates.diff(start, end, 'day');
  33. span = Math.min(span, slots);
  34. span = Math.max(span, 1);
  35. return {
  36. event: event,
  37. span: span,
  38. left: padding + 1,
  39. right: Math.max(padding + span, 1)
  40. };
  41. }
  42. function eventLevels(rowSegments, limit) {
  43. if (limit === void 0) {
  44. limit = Infinity;
  45. }
  46. var i,
  47. j,
  48. seg,
  49. levels = [],
  50. extra = [];
  51. for (i = 0; i < rowSegments.length; i++) {
  52. seg = rowSegments[i];
  53. for (j = 0; j < levels.length; j++) {
  54. if (!segsOverlap(seg, levels[j])) break;
  55. }
  56. if (j >= limit) {
  57. extra.push(seg);
  58. } else {
  59. ;
  60. (levels[j] || (levels[j] = [])).push(seg);
  61. }
  62. }
  63. for (i = 0; i < levels.length; i++) {
  64. levels[i].sort(function (a, b) {
  65. return a.left - b.left;
  66. }); //eslint-disable-line
  67. }
  68. return {
  69. levels: levels,
  70. extra: extra
  71. };
  72. }
  73. function inRange(e, start, end, accessors) {
  74. var eStart = dates.startOf(accessors.start(e), 'day');
  75. var eEnd = accessors.end(e);
  76. var startsBeforeEnd = dates.lte(eStart, end, 'day'); // when the event is zero duration we need to handle a bit differently
  77. var endsAfterStart = !dates.eq(eStart, eEnd, 'minutes') ? dates.gt(eEnd, start, 'minutes') : dates.gte(eEnd, start, 'minutes');
  78. return startsBeforeEnd && endsAfterStart;
  79. }
  80. function segsOverlap(seg, otherSegs) {
  81. return otherSegs.some(function (otherSeg) {
  82. return otherSeg.left <= seg.right && otherSeg.right >= seg.left;
  83. });
  84. }
  85. function sortEvents(evtA, evtB, accessors) {
  86. var startSort = +dates.startOf(accessors.start(evtA), 'day') - +dates.startOf(accessors.start(evtB), 'day');
  87. var durA = dates.diff(accessors.start(evtA), dates.ceil(accessors.end(evtA), 'day'), 'day');
  88. var durB = dates.diff(accessors.start(evtB), dates.ceil(accessors.end(evtB), 'day'), 'day');
  89. return startSort || // sort by start Day first
  90. Math.max(durB, 1) - Math.max(durA, 1) || // events spanning multiple days go first
  91. !!accessors.allDay(evtB) - !!accessors.allDay(evtA) || // then allDay single day events
  92. +accessors.start(evtA) - +accessors.start(evtB); // then sort by start time
  93. }