dnd-resize-utils.js 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. // this function has been mangled to work with external jqui draggables as well
  2. function testEventDrag(options, dropDate, expectSuccess, callback, eventClassName) {
  3. var eventsRendered = false;
  4. options.editable = true;
  5. options.eventAfterAllRender = function() {
  6. var calendar = $('#cal').fullCalendar('getCalendar');
  7. var isDraggingExternal = false;
  8. var dayEl;
  9. var eventEl;
  10. var dragEl;
  11. var slatIndex;
  12. var slatEl;
  13. var dx, dy;
  14. var allowed;
  15. if (eventsRendered) { return; }
  16. eventsRendered = true;
  17. dropDate = calendar.moment(dropDate);
  18. eventEl = $('.' + (eventClassName || 'fc-event') + ':first');
  19. expect(eventEl.length).toBe(1);
  20. if (dropDate.hasTime()) {
  21. dragEl = eventEl.find('.fc-time');
  22. dayEl = $('.fc-time-grid .fc-day[data-date="' + dropDate.format('YYYY-MM-DD') + '"]');
  23. slatIndex = dropDate.hours() * 2 + (dropDate.minutes() / 30); // assumes slotDuration:'30:00'
  24. slatEl = $('.fc-slats tr:eq(' + slatIndex + ')');
  25. expect(slatEl.length).toBe(1);
  26. dy = slatEl.offset().top - eventEl.offset().top;
  27. }
  28. else {
  29. dragEl = eventEl.find('.fc-title');
  30. dayEl = $('.fc-day-grid .fc-day[data-date="' + dropDate.format('YYYY-MM-DD') + '"]');
  31. dy = dayEl.offset().top - eventEl.offset().top;
  32. }
  33. if (!dragEl.length) {
  34. isDraggingExternal = true;
  35. dragEl = eventEl; // well, not really an "event" element anymore
  36. }
  37. expect(dragEl.length).toBe(1);
  38. expect(dayEl.length).toBe(1);
  39. dx = dayEl.offset().left - eventEl.offset().left;
  40. dragEl.simulate('drag', {
  41. dx: dx,
  42. dy: dy,
  43. onBeforeRelease: function() {
  44. allowed = !$('body').hasClass('fc-not-allowed');
  45. expect(allowed).toBe(expectSuccess);
  46. },
  47. onRelease: function() {
  48. var eventObj;
  49. var successfulDrop;
  50. if (!isDraggingExternal) { // if dragging an event within the calendar, check dates
  51. if (eventClassName) {
  52. eventObj = calendar.clientEvents(function(o) {
  53. return o.className.join(' ') === eventClassName;
  54. })[0];
  55. }
  56. else {
  57. eventObj = calendar.clientEvents()[0];
  58. }
  59. if (dropDate.hasTime()) { // dropped on a slot
  60. successfulDrop = eventObj.start.format() == dropDate.format(); // compare exact times
  61. }
  62. else { // dropped on a whole day
  63. // only compare days
  64. successfulDrop = eventObj.start.format('YYYY-MM-DD') == dropDate.format('YYYY-MM-DD');
  65. }
  66. expect(successfulDrop).toBe(allowed);
  67. expect(successfulDrop).toBe(expectSuccess);
  68. }
  69. callback();
  70. }
  71. });
  72. };
  73. $('#cal').fullCalendar(options);
  74. }
  75. function testEventResize(options, resizeDate, expectSuccess, callback, eventClassName) {
  76. var eventsRendered = false;
  77. options.editable = true;
  78. options.eventAfterAllRender = function() {
  79. var calendar = $('#cal').fullCalendar('getCalendar');
  80. var lastDayEl;
  81. var lastSlatIndex;
  82. var lastSlatEl;
  83. var eventEl;
  84. var dragEl;
  85. var dx, dy;
  86. var allowed;
  87. if (eventsRendered) { return; }
  88. eventsRendered = true;
  89. resizeDate = calendar.moment(resizeDate);
  90. eventEl = $('.' + (eventClassName || 'fc-event') + ':last');
  91. dragEl = eventEl.find('.fc-resizer');
  92. if (resizeDate.hasTime()) {
  93. lastDayEl = $('.fc-time-grid .fc-day[data-date="' + resizeDate.clone().format('YYYY-MM-DD') + '"]');
  94. lastSlatIndex = resizeDate.hours() * 2 + (resizeDate.minutes() / 30); // assumes slotDuration:'30:00'
  95. lastSlatEl = $('.fc-slats tr:eq(' + (lastSlatIndex - 1) + ')');
  96. expect(lastSlatEl.length).toBe(1);
  97. dy = lastSlatEl.offset().top + lastSlatEl.outerHeight() - (eventEl.offset().top + eventEl.outerHeight());
  98. }
  99. else {
  100. lastDayEl = $('.fc-day-grid .fc-day[data-date="' + resizeDate.clone().add(-1, 'day').format('YYYY-MM-DD') + '"]');
  101. dy = lastDayEl.offset().top - eventEl.offset().top;
  102. }
  103. expect(lastDayEl.length).toBe(1);
  104. expect(eventEl.length).toBe(1);
  105. expect(dragEl.length).toBe(1);
  106. dx = lastDayEl.offset().left + lastDayEl.outerWidth() - 2 - (eventEl.offset().left + eventEl.outerWidth());
  107. dragEl.simulate('mouseover'); // resizer only shows up on mouseover
  108. dragEl.simulate('drag', {
  109. dx: dx,
  110. dy: dy,
  111. onBeforeRelease: function() {
  112. allowed = !$('body').hasClass('fc-not-allowed');
  113. },
  114. onRelease: function() {
  115. var eventObj = calendar.clientEvents()[0];
  116. var successfulDrop = eventObj.end && eventObj.end.format() === resizeDate.format();
  117. expect(allowed).toBe(successfulDrop);
  118. expect(allowed).toBe(expectSuccess);
  119. expect(successfulDrop).toBe(expectSuccess);
  120. callback();
  121. }
  122. });
  123. };
  124. $('#cal').fullCalendar(options);
  125. }
  126. // always starts at 2014-11-12
  127. function testSelection(options, startTime, end, expectSuccess, callback) {
  128. var successfulSelection = false;
  129. var calendar;
  130. var firstDayEl, lastDayEl;
  131. var firstSlatIndex, lastSlatIndex;
  132. var firstSlatEl, lastSlatEl;
  133. var dx, dy;
  134. var dragEl;
  135. var allowed;
  136. options.selectable = true;
  137. options.select = function(selectionStart, selectionEnd) {
  138. successfulSelection =
  139. selectionStart.format() === start.format() &&
  140. selectionEnd.format() === end.format();
  141. };
  142. spyOn(options, 'select').and.callThrough();
  143. $('#cal').fullCalendar(options);
  144. calendar = $('#cal').fullCalendar('getCalendar');
  145. start = calendar.moment('2014-11-12');
  146. end = calendar.moment(end);
  147. if (startTime) {
  148. start.time(startTime);
  149. firstDayEl = $('.fc-time-grid .fc-day[data-date="' + start.format('YYYY-MM-DD') + '"]');
  150. lastDayEl = $('.fc-time-grid .fc-day[data-date="' + end.format('YYYY-MM-DD') + '"]');
  151. firstSlatIndex = start.hours() * 2 + (start.minutes() / 30); // assumes slotDuration:'30:00'
  152. lastSlatIndex = end.hours() * 2 + (end.minutes() / 30) - 1; // assumes slotDuration:'30:00'
  153. firstSlatEl = $('.fc-slats tr:eq(' + firstSlatIndex + ')');
  154. lastSlatEl = $('.fc-slats tr:eq(' + lastSlatIndex + ')');
  155. expect(firstSlatEl.length).toBe(1);
  156. expect(lastSlatEl.length).toBe(1);
  157. dy = lastSlatEl.offset().top - firstSlatEl.offset().top;
  158. dragEl = firstSlatEl;
  159. }
  160. else {
  161. end.stripTime();
  162. firstDayEl = $('.fc-day-grid .fc-day[data-date="' + start.format('YYYY-MM-DD') + '"]');
  163. lastDayEl = $('.fc-day-grid .fc-day[data-date="' + end.clone().add(-1, 'day').format('YYYY-MM-DD') + '"]');
  164. dy = lastDayEl.offset().top - firstDayEl.offset().top;
  165. dragEl = firstDayEl;
  166. }
  167. expect(firstDayEl.length).toBe(1);
  168. expect(lastDayEl.length).toBe(1);
  169. dx = lastDayEl.offset().left - firstDayEl.offset().left;
  170. dragEl.simulate('drag', {
  171. dx: dx,
  172. dy: dy,
  173. onBeforeRelease: function() {
  174. allowed = !$('body').hasClass('fc-not-allowed');
  175. },
  176. onRelease: function() {
  177. if (expectSuccess) {
  178. expect(options.select).toHaveBeenCalled();
  179. }
  180. expect(expectSuccess).toBe(allowed);
  181. expect(expectSuccess).toBe(successfulSelection);
  182. expect(allowed).toBe(successfulSelection);
  183. callback();
  184. }
  185. });
  186. }