SelectionManager.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. //BUG: unselect needs to be triggered when events are dragged+dropped
  2. function SelectionManager() {
  3. var t = this;
  4. // exports
  5. t.select = select;
  6. t.unselect = unselect;
  7. t.reportSelection = reportSelection;
  8. t.daySelectionMousedown = daySelectionMousedown;
  9. // imports
  10. var opt = t.opt;
  11. var trigger = t.trigger;
  12. var defaultSelectionEnd = t.defaultSelectionEnd;
  13. var renderSelection = t.renderSelection;
  14. var clearSelection = t.clearSelection;
  15. // locals
  16. var selected = false;
  17. // unselectAuto
  18. if (opt('selectable') && opt('unselectAuto')) {
  19. $(document).mousedown(function(ev) {
  20. var ignore = opt('unselectCancel');
  21. if (ignore) {
  22. if ($(ev.target).parents(ignore).length) { // could be optimized to stop after first match
  23. return;
  24. }
  25. }
  26. unselect(ev);
  27. });
  28. }
  29. function select(startDate, endDate, allDay) {
  30. unselect();
  31. if (!endDate) {
  32. endDate = defaultSelectionEnd(startDate, allDay);
  33. }
  34. renderSelection(startDate, endDate, allDay);
  35. reportSelection(startDate, endDate, allDay);
  36. }
  37. function unselect(ev) {
  38. if (selected) {
  39. selected = false;
  40. clearSelection();
  41. trigger('unselect', null, ev);
  42. }
  43. }
  44. function reportSelection(startDate, endDate, allDay, ev) {
  45. selected = true;
  46. trigger('select', null, startDate, endDate, allDay, ev);
  47. }
  48. function daySelectionMousedown(ev) { // not really a generic manager method, oh well
  49. var cellDate = t.cellDate;
  50. var cellIsAllDay = t.cellIsAllDay;
  51. var hoverListener = t.getHoverListener();
  52. if (ev.which == 1 && opt('selectable')) { // which==1 means left mouse button
  53. unselect(ev);
  54. var _mousedownElement = this;
  55. var dates;
  56. hoverListener.start(function(cell, origCell) { // TODO: maybe put cellDate/cellIsAllDay info in cell
  57. clearSelection();
  58. if (cell && cellIsAllDay(cell)) {
  59. dates = [ cellDate(origCell), cellDate(cell) ].sort(cmp);
  60. renderSelection(dates[0], dates[1], true);
  61. }else{
  62. dates = null;
  63. }
  64. }, ev);
  65. $(document).one('mouseup', function(ev) {
  66. hoverListener.stop();
  67. if (dates) {
  68. if (+dates[0] == +dates[1]) {
  69. trigger('dayClick', _mousedownElement, dates[0], true, ev);
  70. // BUG: _mousedownElement will sometimes be the overlay
  71. }
  72. reportSelection(dates[0], dates[1], true, ev);
  73. }
  74. });
  75. }
  76. }
  77. }