main.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. BlazeComponent.extendComponent({
  2. template: function() {
  3. return 'list';
  4. },
  5. // Proxy
  6. openForm: function(options) {
  7. this.componentChildren('listBody')[0].openForm(options);
  8. },
  9. // XXX The jQuery UI sortable plugin is far from ideal here. First we include
  10. // all jQuery components but only use one. Second, it modifies the DOM itself,
  11. // resulting in Blaze abandoning reactive update of the nodes that have been
  12. // moved which result in bugs if multiple users use the board in real time.
  13. // I tried sortable:sortable but that was not better. Should we “simply” write
  14. // the drag&drop code ourselves?
  15. onRendered: function() {
  16. if (Meteor.user().isBoardMember()) {
  17. var $cards = this.$('.js-minicards');
  18. $cards.sortable({
  19. connectWith: '.js-minicards',
  20. tolerance: 'pointer',
  21. appendTo: '.js-lists',
  22. helper: 'clone',
  23. items: '.js-minicard:not(.placeholder, .hide, .js-composer)',
  24. placeholder: 'minicard placeholder',
  25. start: function(event, ui) {
  26. $('.minicard.placeholder').height(ui.item.height());
  27. Popup.close();
  28. },
  29. stop: function(event, ui) {
  30. // To attribute the new index number, we need to get the dom element
  31. // of the previous and the following card -- if any.
  32. var cardDomElement = ui.item.get(0);
  33. var prevCardDomElement = ui.item.prev('.js-minicard').get(0);
  34. var nextCardDomElement = ui.item.next('.js-minicard').get(0);
  35. var sort = Utils.getSortIndex(prevCardDomElement, nextCardDomElement);
  36. var cardId = Blaze.getData(cardDomElement)._id;
  37. var listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
  38. Cards.update(cardId, {
  39. $set: {
  40. listId: listId,
  41. sort: sort
  42. }
  43. });
  44. }
  45. }).disableSelection();
  46. Utils.liveEvent('mouseover', function($el) {
  47. $el.find('.js-member-droppable').droppable({
  48. hoverClass: 'draggable-hover-card',
  49. accept: '.js-member',
  50. drop: function(event, ui) {
  51. var memberId = Blaze.getData(ui.draggable.get(0)).userId;
  52. var cardId = Blaze.getData(this)._id;
  53. Cards.update(cardId, {$addToSet: {members: memberId}});
  54. }
  55. });
  56. $el.find('.js-member-droppable').droppable({
  57. hoverClass: 'draggable-hover-card',
  58. accept: '.js-label',
  59. drop: function(event, ui) {
  60. var labelId = Blaze.getData(ui.draggable.get(0))._id;
  61. var cardId = Blaze.getData(this)._id;
  62. Cards.update(cardId, {$addToSet: {labelIds: labelId}});
  63. }
  64. });
  65. });
  66. }
  67. }
  68. }).register('list');