From 1442fd637ab74496fc43624cf8d9f6b1fe1d3c7a Mon Sep 17 00:00:00 2001 From: Jim Martens Date: Tue, 12 Sep 2017 10:38:03 +0200 Subject: Implemented checklist item sorting across checklists --- client/components/cards/checklists.js | 67 +++++++++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'client/components') diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 24a78035..bd9d275a 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -1,14 +1,81 @@ +function initSorting(items) { + items.sortable({ + tolerance: 'pointer', + helper: 'clone', + items: '.js-checklist-item:not(.placeholder)', + axis: 'y', + distance: 7, + placeholder: 'placeholder', + scroll: false, + start(evt, ui) { + ui.placeholder.height(ui.helper.height()); + EscapeActions.executeUpTo('popup-close'); + }, + stop(evt, ui) { + const parent = ui.item.parents('.js-checklist-items'); + const orderedItems = []; + parent.find('.js-checklist-item').each(function(i, item) { + const checklistItem = Blaze.getData(item).item; + orderedItems.push(checklistItem._id); + }); + items.sortable('cancel'); + const formerParent = ui.item.parents('.js-checklist-items'); + let checklist = Blaze.getData(parent.get(0)).checklist; + const oldChecklist = Blaze.getData(formerParent.get(0)).checklist; + if (oldChecklist._id !== checklist._id) { + const currentItem = Blaze.getData(ui.item.get(0)).item; + for (let i = 0; i < orderedItems.length; i++) { + let itemId = orderedItems[i]; + if (itemId !== currentItem._id) continue; + checklist.addItem(currentItem.title); + checklist = Checklists.findOne({_id: checklist._id}); + itemId = checklist._id + (checklist.newItemIndex - 1); + if (currentItem.finished) { + checklist.finishItem(itemId); + } + orderedItems[i] = itemId; + oldChecklist.removeItem(currentItem._id); + } + } + checklist.sortItems(orderedItems); + }, + }); +} + +Template.checklists.onRendered(function () { + const self = BlazeComponent.getComponentForElement(this.firstNode); + self.itemsDom = this.$('.card-checklist-items'); + initSorting(self.itemsDom); + self.itemsDom.mousedown(function(evt) { + evt.stopPropagation(); + }); + + function userIsMember() { + return Meteor.user() && Meteor.user().isBoardMember(); + } + + // Disable sorting if the current user is not a board member + self.autorun(() => { + const $itemsDom = $(self.itemsDom); + if ($itemsDom.data('sortable')) { + $(self.itemsDom).sortable('option', 'disabled', !userIsMember()); + } + }); +}); + BlazeComponent.extendComponent({ addChecklist(event) { event.preventDefault(); const textarea = this.find('textarea.js-add-checklist-item'); const title = textarea.value.trim(); const cardId = this.currentData().cardId; + const card = Cards.findOne(cardId); if (title) { Checklists.insert({ cardId, title, + sort: card.checklists().count(), }); setTimeout(() => { this.$('.add-checklist-item').last().click(); -- cgit v1.2.3-1-g7c22