|
@@ -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();
|