diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 8acb20550..8a26e4b5b 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -10,6 +10,7 @@ import Lists from '/models/lists'; import CardComments from '/models/cardComments'; import { ALLOWED_COLORS } from '/config/const'; import { UserAvatar } from '../users/userAvatar'; +import { DialogWithBoardSwimlaneList } from '/client/lib/dialogWithBoardSwimlaneList'; const subManager = new SubsManager(); const { calculateIndexData } = Utils; @@ -826,186 +827,6 @@ Template.editCardAssignerForm.events({ }, }); -class DialogWithBoardSwimlaneList extends BlazeComponent { - /** returns the card dialog options - * @return Object with properties { boardId, swimlaneId, listId } - */ - getCardDialogOptions() { - } - - /** list is done - * @param listId the selected list id - * @param options the selected options (Object with properties { boardId, swimlaneId, listId }) - */ - setDone(listId, options) { - } - - onCreated() { - this.currentBoardId = Utils.getCurrentBoardId(); - this.selectedBoardId = new ReactiveVar(this.currentBoardId); - this.selectedSwimlaneId = new ReactiveVar(''); - this.selectedListId = new ReactiveVar(''); - this.setCardDialogOption(this.currentBoardId); - } - - /** set the last confirmed dialog field values - * @param boardId the current board id - */ - setCardDialogOption(boardId) { - this.cardDialogOption = { - 'boardId' : "", - 'swimlaneId' : "", - 'listId' : "", - } - - let currentOptions = this.getCardDialogOptions(); - if (currentOptions && boardId && currentOptions[boardId]) { - this.cardDialogOption = currentOptions[boardId]; - if (this.cardDialogOption.boardId && - this.cardDialogOption.swimlaneId && - this.cardDialogOption.listId - ) - { - this.selectedBoardId.set(this.cardDialogOption.boardId) - this.selectedSwimlaneId.set(this.cardDialogOption.swimlaneId); - this.selectedListId.set(this.cardDialogOption.listId); - } - } - this.getBoardData(this.selectedBoardId.get()); - if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) { - this.setFirstSwimlaneId(); - } - if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) { - this.setFirstListId(); - } - } - /** sets the first swimlane id */ - setFirstSwimlaneId() { - try { - const board = Boards.findOne(this.selectedBoardId.get()); - const swimlaneId = board.swimlanes().fetch()[0]._id; - this.selectedSwimlaneId.set(swimlaneId); - } catch (e) {} - } - /** sets the first list id */ - setFirstListId() { - try { - const board = Boards.findOne(this.selectedBoardId.get()); - const listId = board.lists().fetch()[0]._id; - this.selectedListId.set(listId); - } catch (e) {} - } - - /** 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 - */ - isCardDialogOptionBoardId(boardId) { - let ret = this.cardDialogOption.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 - */ - isCardDialogOptionSwimlaneId(swimlaneId) { - let ret = this.cardDialogOption.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 - */ - isCardDialogOptionListId(listId) { - let ret = this.cardDialogOption.listId == listId; - return ret; - } - - /** returns all available board */ - boards() { - const ret = Boards.find( - { - archived: false, - 'members.userId': Meteor.userId(), - _id: { $ne: Meteor.user().getTemplatesBoardId() }, - }, - { - sort: { sort: 1 }, - }, - ); - return ret; - } - - /** returns all available swimlanes of the current board */ - swimlanes() { - const board = Boards.findOne(this.selectedBoardId.get()); - const ret = board.swimlanes(); - return ret; - } - - /** returns all available lists of the current board */ - lists() { - const board = Boards.findOne(this.selectedBoardId.get()); - const ret = board.lists(); - return ret; - } - - /** get the board data from the server - * @param boardId get the board data of this board id - */ - getBoardData(boardId) { - const self = this; - Meteor.subscribe('board', boardId, false, { - onReady() { - const sameBoardId = self.selectedBoardId.get() == boardId; - self.selectedBoardId.set(boardId); - - if (!sameBoardId) { - // reset swimlane id (for selection in cards()) - self.setFirstSwimlaneId(); - - // reset list id (for selection in cards()) - self.setFirstListId(); - } - }, - }); - } - - events() { - return [ - { - 'click .js-done'() { - const boardSelect = this.$('.js-select-boards')[0]; - const boardId = boardSelect.options[boardSelect.selectedIndex].value; - - const listSelect = this.$('.js-select-lists')[0]; - const listId = listSelect.options[listSelect.selectedIndex].value; - - const swimlaneSelect = this.$('.js-select-swimlanes')[0]; - const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value; - - const options = { - 'boardId' : boardId, - 'swimlaneId' : swimlaneId, - 'listId' : listId, - } - this.setDone(boardId, swimlaneId, listId, options); - Popup.back(2); - }, - 'change .js-select-boards'(event) { - const boardId = $(event.currentTarget).val(); - this.getBoardData(boardId); - }, - 'change .js-select-swimlanes'(event) { - this.selectedSwimlaneId.set($(event.currentTarget).val()); - }, - }, - ]; - } -} - /** Move Card Dialog */ (class extends DialogWithBoardSwimlaneList { getCardDialogOptions() { diff --git a/client/lib/dialogWithBoardSwimlaneList.js b/client/lib/dialogWithBoardSwimlaneList.js new file mode 100644 index 000000000..3d68625d4 --- /dev/null +++ b/client/lib/dialogWithBoardSwimlaneList.js @@ -0,0 +1,180 @@ +export class DialogWithBoardSwimlaneList extends BlazeComponent { + /** returns the card dialog options + * @return Object with properties { boardId, swimlaneId, listId } + */ + getCardDialogOptions() { + } + + /** list is done + * @param listId the selected list id + * @param options the selected options (Object with properties { boardId, swimlaneId, listId }) + */ + setDone(listId, options) { + } + + onCreated() { + this.currentBoardId = Utils.getCurrentBoardId(); + this.selectedBoardId = new ReactiveVar(this.currentBoardId); + this.selectedSwimlaneId = new ReactiveVar(''); + this.selectedListId = new ReactiveVar(''); + this.setCardDialogOption(this.currentBoardId); + } + + /** set the last confirmed dialog field values + * @param boardId the current board id + */ + setCardDialogOption(boardId) { + this.cardDialogOption = { + 'boardId' : "", + 'swimlaneId' : "", + 'listId' : "", + } + + let currentOptions = this.getCardDialogOptions(); + if (currentOptions && boardId && currentOptions[boardId]) { + this.cardDialogOption = currentOptions[boardId]; + if (this.cardDialogOption.boardId && + this.cardDialogOption.swimlaneId && + this.cardDialogOption.listId + ) + { + this.selectedBoardId.set(this.cardDialogOption.boardId) + this.selectedSwimlaneId.set(this.cardDialogOption.swimlaneId); + this.selectedListId.set(this.cardDialogOption.listId); + } + } + this.getBoardData(this.selectedBoardId.get()); + if (!this.selectedSwimlaneId.get() || !Swimlanes.findOne({_id: this.selectedSwimlaneId.get(), boardId: this.selectedBoardId.get()})) { + this.setFirstSwimlaneId(); + } + if (!this.selectedListId.get() || !Lists.findOne({_id: this.selectedListId.get(), boardId: this.selectedBoardId.get()})) { + this.setFirstListId(); + } + } + /** sets the first swimlane id */ + setFirstSwimlaneId() { + try { + const board = Boards.findOne(this.selectedBoardId.get()); + const swimlaneId = board.swimlanes().fetch()[0]._id; + this.selectedSwimlaneId.set(swimlaneId); + } catch (e) {} + } + /** sets the first list id */ + setFirstListId() { + try { + const board = Boards.findOne(this.selectedBoardId.get()); + const listId = board.lists().fetch()[0]._id; + this.selectedListId.set(listId); + } catch (e) {} + } + + /** 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 + */ + isCardDialogOptionBoardId(boardId) { + let ret = this.cardDialogOption.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 + */ + isCardDialogOptionSwimlaneId(swimlaneId) { + let ret = this.cardDialogOption.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 + */ + isCardDialogOptionListId(listId) { + let ret = this.cardDialogOption.listId == listId; + return ret; + } + + /** returns all available board */ + boards() { + const ret = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Meteor.user().getTemplatesBoardId() }, + }, + { + sort: { sort: 1 }, + }, + ); + return ret; + } + + /** returns all available swimlanes of the current board */ + swimlanes() { + const board = Boards.findOne(this.selectedBoardId.get()); + const ret = board.swimlanes(); + return ret; + } + + /** returns all available lists of the current board */ + lists() { + const board = Boards.findOne(this.selectedBoardId.get()); + const ret = board.lists(); + return ret; + } + + /** get the board data from the server + * @param boardId get the board data of this board id + */ + getBoardData(boardId) { + const self = this; + Meteor.subscribe('board', boardId, false, { + onReady() { + const sameBoardId = self.selectedBoardId.get() == boardId; + self.selectedBoardId.set(boardId); + + if (!sameBoardId) { + // reset swimlane id (for selection in cards()) + self.setFirstSwimlaneId(); + + // reset list id (for selection in cards()) + self.setFirstListId(); + } + }, + }); + } + + events() { + return [ + { + 'click .js-done'() { + const boardSelect = this.$('.js-select-boards')[0]; + const boardId = boardSelect.options[boardSelect.selectedIndex].value; + + const listSelect = this.$('.js-select-lists')[0]; + const listId = listSelect.options[listSelect.selectedIndex].value; + + const swimlaneSelect = this.$('.js-select-swimlanes')[0]; + const swimlaneId = swimlaneSelect.options[swimlaneSelect.selectedIndex].value; + + const options = { + 'boardId' : boardId, + 'swimlaneId' : swimlaneId, + 'listId' : listId, + } + this.setDone(boardId, swimlaneId, listId, options); + Popup.back(2); + }, + 'change .js-select-boards'(event) { + const boardId = $(event.currentTarget).val(); + this.getBoardData(boardId); + }, + 'change .js-select-swimlanes'(event) { + this.selectedSwimlaneId.set($(event.currentTarget).val()); + }, + }, + ]; + } +} +