From 73ff4c79668e284a7114bb88158403897019c84a Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Sun, 9 Jan 2022 13:24:36 +0100 Subject: [PATCH 1/2] Use card id from component instead of global state - was a TODO in the comments --- client/components/cards/cardDetails.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b596b2e0e..6409fe2a4 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -801,9 +801,7 @@ Template.editCardAssignerForm.events({ Template.moveCardPopup.events({ 'click .js-done'() { - // XXX We should *not* get the currentCard from the global state, but - // instead from a “component” state. - const card = Utils.getCurrentCard(); + const card = Cards.findOne(this._id); const bSelect = $('.js-select-boards')[0]; let boardId; // if we are a worker, we won't have a board select so we just use the From e528474fc5aa83cb45bb14c5de2f3621ae3db1f4 Mon Sep 17 00:00:00 2001 From: Martin Filser Date: Mon, 10 Jan 2022 07:09:07 +0100 Subject: [PATCH 2/2] Move and Copy Card Popup remembers the last confirmed field values --- client/components/cards/cardDetails.jade | 6 +- client/components/cards/cardDetails.js | 77 ++++++++++++++++++++++-- models/users.js | 50 +++++++++++++++ 3 files changed, 125 insertions(+), 8 deletions(-) diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index c8e3515e5..598c2aeda 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -725,17 +725,17 @@ template(name="boardsAndLists") if $eq _id currentBoard._id option(value="{{_id}}" selected) {{_ 'current'}} else - option(value="{{_id}}") {{title}} + option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionBoardId _id}}selected{{/if}}") {{title}} label {{_ 'swimlanes'}}: select.js-select-swimlanes each swimlanes - option(value="{{_id}}") {{title}} + option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionSwimlaneId _id}}selected{{/if}}") {{title}} label {{_ 'lists'}}: select.js-select-lists each aBoardLists - option(value="{{_id}}") {{title}} + option(value="{{_id}}" selected="{{#if isMoveAndCopyDialogOptionListId _id}}selected{{/if}}") {{title}} .edit-controls.clearfix button.primary.confirm.js-done {{_ 'done'}} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 6409fe2a4..a7cbb9ac8 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -806,8 +806,11 @@ Template.moveCardPopup.events({ let boardId; // if we are a worker, we won't have a board select so we just use the // current boardId of the card. - if (bSelect) boardId = bSelect.options[bSelect.selectedIndex].value; - else boardId = card.boardId; + if (bSelect) { + boardId = bSelect.options[bSelect.selectedIndex].value; + } else { + boardId = card.boardId; + } const lSelect = $('.js-select-lists')[0]; const listId = lSelect.options[lSelect.selectedIndex].value; const slSelect = $('.js-select-swimlanes')[0]; @@ -824,8 +827,53 @@ Template.moveCardPopup.events({ }); BlazeComponent.extendComponent({ onCreated() { - subManager.subscribe('board', Session.get('currentBoard'), false); - this.selectedBoardId = new ReactiveVar(Session.get('currentBoard')); + const boardId = Utils.getCurrentBoardId(); + subManager.subscribe('board', boardId, false); + this.selectedBoardId = new ReactiveVar(boardId); + this.setMoveAndCopyDialogOption(boardId); + }, + + /** set the last confirmed dialog field values + * @param boardId the current board id + */ + setMoveAndCopyDialogOption(boardId) { + this.moveAndCopyDialogOption = { + 'boardId' : "", + 'swimlaneId' : "", + 'listId' : "", + } + + let currentOptions = Meteor.user().getMoveAndCopyDialogOptions(); + if (currentOptions && boardId && currentOptions[boardId]) { + this.moveAndCopyDialogOption = currentOptions[boardId]; + } + }, + + /** returns if the board id was the last confirmed one + * @param boardId check this board id + * @return if the board id was the last confirmed one + */ + isMoveAndCopyDialogOptionBoardId(boardId) { + let ret = this.moveAndCopyDialogOption.boardId == boardId; + return ret; + }, + + /** returns if the swimlane id was the last confirmed one + * @param swimlaneId check this swimlane id + * @return if the swimlane id was the last confirmed one + */ + isMoveAndCopyDialogOptionSwimlaneId(swimlaneId) { + let ret = this.moveAndCopyDialogOption.swimlaneId == swimlaneId; + return ret; + }, + + /** returns if the list id was the last confirmed one + * @param listId check this list id + * @return if the list id was the last confirmed one + */ + isMoveAndCopyDialogOptionListId(listId) { + let ret = this.moveAndCopyDialogOption.listId == listId; + return ret; }, boards() { @@ -854,8 +902,27 @@ BlazeComponent.extendComponent({ events() { return [ { + 'click .js-done'() { + const bSelect = this.$('.js-select-boards')[0]; + const boardId = bSelect.options[bSelect.selectedIndex].value; + + const lSelect = this.$('.js-select-lists')[0]; + const listId = lSelect.options[lSelect.selectedIndex].value; + + const slSelect = this.$('.js-select-swimlanes')[0]; + const swimlaneId = slSelect.options[slSelect.selectedIndex].value; + + const options = { + 'boardId' : boardId, + 'swimlaneId' : swimlaneId, + 'listId' : listId, + } + Meteor.user().setMoveAndCopyDialogOption(boardId, options); + }, 'change .js-select-boards'(event) { - this.selectedBoardId.set($(event.currentTarget).val()); + const boardId = $(event.currentTarget).val(); + this.selectedBoardId.set(boardId); + this.setMoveAndCopyDialogOption(boardId); subManager.subscribe('board', this.selectedBoardId.get(), false); }, }, diff --git a/models/users.js b/models/users.js index 9a12a5ce1..98f658412 100644 --- a/models/users.js +++ b/models/users.js @@ -226,6 +226,32 @@ Users.attachSchema( type: String, optional: true, }, + 'profile.moveAndCopyDialog' : { + /** + * move and copy card dialog + */ + type: Object, + optional: true, + blackbox: true, + }, + 'profile.moveAndCopyDialog.$.boardId': { + /** + * last selected board id + */ + type: String, + }, + 'profile.moveAndCopyDialog.$.swimlaneId': { + /** + * last selected swimlane id + */ + type: String, + }, + 'profile.moveAndCopyDialog.$.listId': { + /** + * last selected list id + */ + type: String, + }, 'profile.notifications': { /** * enabled notifications for the user @@ -616,6 +642,17 @@ Users.helpers({ return this._getListSortBy()[1]; }, + /** returns all confirmed move and copy dialog field values + *
  • the board, swimlane and list id is stored for each board + */ + getMoveAndCopyDialogOptions() { + let _ret = {} + if (this.profile && this.profile.moveAndCopyDialog) { + _ret = this.profile.moveAndCopyDialog; + } + return _ret; + }, + hasTag(tag) { const { tags = [] } = this.profile || {}; return _.contains(tags, tag); @@ -731,6 +768,19 @@ Users.helpers({ }); Users.mutations({ + /** set the confirmed board id/swimlane id/list id of a board + * @param boardId the current board id + * @param options an object with the confirmed field values + */ + setMoveAndCopyDialogOption(boardId, options) { + let currentOptions = this.getMoveAndCopyDialogOptions(); + currentOptions[boardId] = options; + return { + $set: { + 'profile.moveAndCopyDialog': currentOptions, + }, + }; + }, toggleBoardStar(boardId) { const queryKind = this.hasStarred(boardId) ? '$pull' : '$addToSet'; return {