main.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. ListComponent = BlazeComponent.extendComponent({
  2. template: function() {
  3. return 'list';
  4. },
  5. openForm: function(options) {
  6. options = options || {};
  7. options.position = options.position || 'top';
  8. var listComponent = this.componentChildren('listBody')[0];
  9. var forms = listComponent.componentChildren('inlinedForm');
  10. if (options.position === 'top') {
  11. forms[0].open();
  12. } else {
  13. forms[forms.length - 1].open();
  14. }
  15. },
  16. // XXX The jQuery UI sortable plugin is far from ideal here. First we include
  17. // all jQuery components but only use one. Second, it modifies the DOM itself,
  18. // resulting in Blaze abandoning reactive update of the nodes that have been
  19. // moved which result in bugs if multiple users use the board in real time.
  20. // I tried sortable:sortable but that was not better. Should we “simply” write
  21. // the drag&drop code ourselves?
  22. onRendered: function() {
  23. if (Meteor.user().isBoardMember()) {
  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. },
  36. stop: function(event, ui) {
  37. // To attribute the new index number, we need to get the dom element of
  38. // the previous and the following card -- if any.
  39. var cardDomElement = ui.item.get(0);
  40. var prevCardDomElement = ui.item.prev('.js-minicard').get(0);
  41. var nextCardDomElement = ui.item.next('.js-minicard').get(0);
  42. var sort = Utils.getSortIndex(prevCardDomElement, nextCardDomElement);
  43. var cardId = Blaze.getData(cardDomElement)._id;
  44. var listId = Blaze.getData(ui.item.parents('.list').get(0))._id;
  45. Cards.update(cardId, {
  46. $set: {
  47. listId: listId,
  48. sort: sort
  49. }
  50. });
  51. }
  52. }).disableSelection();
  53. Utils.liveEvent('mouseover', function($el) {
  54. $el.find('.js-member-droppable').droppable({
  55. hoverClass: "draggable-hover-card",
  56. accept: '.js-member',
  57. drop: function(event, ui) {
  58. var memberId = Blaze.getData(ui.draggable.get(0)).userId;
  59. var cardId = Blaze.getData(this)._id;
  60. Cards.update(cardId, {$addToSet: {members: memberId}});
  61. }
  62. });
  63. $el.find('.js-member-droppable').droppable({
  64. hoverClass: "draggable-hover-card",
  65. accept: '.js-label',
  66. drop: function(event, ui) {
  67. var labelId = Blaze.getData(ui.draggable.get(0))._id;
  68. var cardId = Blaze.getData(this)._id;
  69. Cards.update(cardId, {$addToSet: {labelIds: labelId}});
  70. }
  71. });
  72. });
  73. }
  74. }
  75. }).register('list');