main.js 3.0 KB

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