From 70265deb4720d658754ed1c46e375c8a46a86435 Mon Sep 17 00:00:00 2001 From: helioguardabaxo Date: Thu, 22 Jul 2021 22:44:40 -0300 Subject: [PATCH] Add Convert checklist item to card feature --- client/components/cards/cardDetails.js | 29 ++++++++++++++++ client/components/cards/checklists.jade | 32 +++++++++++++++++ client/components/cards/checklists.js | 46 +++++++++++++++++++++++++ client/components/cards/checklists.styl | 1 + i18n/en.i18n.json | 1 + 5 files changed, 109 insertions(+) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index ecc72f7c4..5396aa675 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -627,6 +627,7 @@ Template.cardDetailsActionsPopup.events({ 'click .js-spent-time': Popup.open('editCardSpentTime'), 'click .js-move-card': Popup.open('moveCard'), 'click .js-copy-card': Popup.open('copyCard'), + 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), 'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'), 'click .js-set-card-color': Popup.open('setCardColor'), 'click .js-move-card-to-top'(event) { @@ -791,6 +792,34 @@ Template.copyCardPopup.events({ }, }); +Template.convertChecklistItemToCardPopup.events({ + 'click .js-done'() { + const card = Cards.findOne(Session.get('currentCard')); + const lSelect = $('.js-select-lists')[0]; + const listId = lSelect.options[lSelect.selectedIndex].value; + const slSelect = $('.js-select-swimlanes')[0]; + const swimlaneId = slSelect.options[slSelect.selectedIndex].value; + const bSelect = $('.js-select-boards')[0]; + const boardId = bSelect.options[bSelect.selectedIndex].value; + const textarea = $('#copy-card-title'); + const title = textarea.val().trim(); + + if (title) { + const _id = Cards.insert({ + title: title, + listId: listId, + boardId: boardId, + swimlaneId: swimlaneId, + sort: 0, + }); + Filter.addException(_id); + + Popup.close(); + + } + }, +}); + Template.copyChecklistToManyCardsPopup.events({ 'click .js-done'() { const card = Cards.findOne(Session.get('currentCard')); diff --git a/client/components/cards/checklists.jade b/client/components/cards/checklists.jade index 2614b5c1d..6c7b517c7 100644 --- a/client/components/cards/checklists.jade +++ b/client/components/cards/checklists.jade @@ -80,6 +80,9 @@ template(name="editChecklistItemForm") span(title=createdAt) {{ moment createdAt }} if canModifyCard a.js-delete-checklist-item {{_ "delete"}}... + a.js-convert-checklist-item-to-card + i.fa.fa-copy + | {{_ 'convertChecklistItemToCardPopup-title'}} template(name="checklistItems") .checklist-items.js-checklist-items @@ -110,3 +113,32 @@ template(name='checklistItemDetail') .item-title(class="{{#if item.isFinished }}is-checked{{/if}}") +viewer = item.title + +template(name="convertChecklistItemToCardPopup") + label(for='convert-checklist-item-to-card-title') {{_ 'title'}}: + textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus) + = item.title + +boardsSwimlanesAndLists + +template(name="boardsSwimlanesAndLists") + unless currentUser.isWorker + label {{_ 'boards'}}: + select.js-select-boards(autofocus) + each boards + if $eq _id currentBoard._id + option(value="{{_id}}" selected) {{_ 'current'}} + else + option(value="{{_id}}") {{title}} + + label {{_ 'swimlanes'}}: + select.js-select-swimlanes + each swimlanes + option(value="{{_id}}") {{title}} + + label {{_ 'lists'}}: + select.js-select-lists + each aBoardLists + option(value="{{_id}}") {{title}} + + .edit-controls.clearfix + button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 86f8c75f8..0141f8ed5 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -1,3 +1,7 @@ +import Cards from '/models/cards'; +import Boards from '/models/boards'; + +const subManager = new SubsManager(); const { calculateIndexData, capitalize } = Utils; function initSorting(items) { @@ -206,6 +210,7 @@ BlazeComponent.extendComponent({ 'submit .js-edit-checklist-title': this.editChecklist, 'submit .js-add-checklist-item': this.addChecklistItem, 'submit .js-edit-checklist-item': this.editChecklistItem, + 'click .js-convert-checklist-item-to-card': Popup.open('convertChecklistItemToCard'), 'click .js-delete-checklist-item': this.deleteItem, 'click .confirm-checklist-delete': this.deleteChecklist, 'focus .js-add-checklist-item': this.focusChecklistItem, @@ -215,6 +220,47 @@ BlazeComponent.extendComponent({ }, }).register('checklists'); +BlazeComponent.extendComponent({ + onCreated() { + subManager.subscribe('board', Session.get('currentBoard'), false); + this.selectedBoardId = new ReactiveVar(Session.get('currentBoard')); + }, + + boards() { + return Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Meteor.user().getTemplatesBoardId() }, + }, + { + sort: { sort: 1 /* boards default sorting */ }, + }, + ); + }, + + swimlanes() { + const board = Boards.findOne(this.selectedBoardId.get()); + return board.swimlanes(); + }, + + aBoardLists() { + const board = Boards.findOne(this.selectedBoardId.get()); + return board.lists(); + }, + + events() { + return [ + { + 'change .js-select-boards'(event) { + this.selectedBoardId.set($(event.currentTarget).val()); + subManager.subscribe('board', this.selectedBoardId.get(), false); + }, + }, + ]; + }, +}).register('boardsSwimlanesAndLists'); + Template.checklists.helpers({ hideCheckedItems() { const currentUser = Meteor.user(); diff --git a/client/components/cards/checklists.styl b/client/components/cards/checklists.styl index a356e3bd2..0e2b058b7 100644 --- a/client/components/cards/checklists.styl +++ b/client/components/cards/checklists.styl @@ -160,6 +160,7 @@ textarea.js-add-checklist-item, textarea.js-edit-checklist-item padding-right: 10px; .js-delete-checklist-item +.js-convert-checklist-item-to-card margin: 0 0 0.5em 1.33em @extends .delete-text padding: 12px 0 0 0 diff --git a/i18n/en.i18n.json b/i18n/en.i18n.json index c1ae6f911..456ca5410 100644 --- a/i18n/en.i18n.json +++ b/i18n/en.i18n.json @@ -89,6 +89,7 @@ "add-subtask": "Add Subtask", "add-checklist": "Add Checklist", "add-checklist-item": "Add an item to checklist", + "convertChecklistItemToCardPopup-title": "Convert to Card", "add-cover": "Add Cover", "add-label": "Add Label", "add-list": "Add List",