diff options
Diffstat (limited to 'client/components/lists/listBody.js')
-rw-r--r-- | client/components/lists/listBody.js | 546 |
1 files changed, 317 insertions, 229 deletions
diff --git a/client/components/lists/listBody.js b/client/components/lists/listBody.js index bce350dd..7d9e358b 100644 --- a/client/components/lists/listBody.js +++ b/client/components/lists/listBody.js @@ -16,7 +16,7 @@ BlazeComponent.extendComponent({ options.position = options.position || 'top'; const forms = this.childComponents('inlinedForm'); - let form = forms.find((component) => { + let form = forms.find(component => { return component.data().position === options.position; }); if (!form && forms.length > 0) { @@ -52,11 +52,12 @@ BlazeComponent.extendComponent({ let cardType = 'cardType-card'; if (title) { if (board.isTemplatesBoard()) { - swimlaneId = this.parentComponent().parentComponent().data()._id; // Always swimlanes view + swimlaneId = this.parentComponent() + .parentComponent() + .data()._id; // Always swimlanes view const swimlane = Swimlanes.findOne(swimlaneId); // If this is the card templates swimlane, insert a card template - if (swimlane.isCardTemplatesSwimlane()) - cardType = 'template-card'; + if (swimlane.isCardTemplatesSwimlane()) cardType = 'template-card'; // If this is the board templates swimlane, insert a board template and a linked card else if (swimlane.isBoardTemplatesSwimlane()) { linkedId = Boards.insert({ @@ -71,8 +72,14 @@ BlazeComponent.extendComponent({ cardType = 'cardType-linkedBoard'; } } else if (boardView === 'board-view-swimlanes') - swimlaneId = this.parentComponent().parentComponent().data()._id; - else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal') || !boardView) + swimlaneId = this.parentComponent() + .parentComponent() + .data()._id; + else if ( + boardView === 'board-view-lists' || + boardView === 'board-view-cal' || + !boardView + ) swimlaneId = board.getDefaultSwimline()._id; const _id = Cards.insert({ @@ -91,7 +98,9 @@ BlazeComponent.extendComponent({ // if the displayed card count is less than the total cards in the list, // we need to increment the displayed card count to prevent the spinner // to appear - const cardCount = this.data().cards(this.idOrNull(swimlaneId)).count(); + const cardCount = this.data() + .cards(this.idOrNull(swimlaneId)) + .count(); if (this.cardlimit.get() < cardCount) { this.cardlimit.set(this.cardlimit.get() + InfiniteScrollIter); } @@ -149,8 +158,12 @@ BlazeComponent.extendComponent({ idOrNull(swimlaneId) { const currentUser = Meteor.user(); - if ((currentUser.profile || {}).boardView === 'board-view-swimlanes' || - this.data().board().isTemplatesBoard()) + if ( + (currentUser.profile || {}).boardView === 'board-view-swimlanes' || + this.data() + .board() + .isTemplatesBoard() + ) return swimlaneId; return undefined; }, @@ -161,8 +174,7 @@ BlazeComponent.extendComponent({ listId: this.currentData()._id, archived: false, }; - if (swimlaneId) - selector.swimlaneId = swimlaneId; + if (swimlaneId) selector.swimlaneId = swimlaneId; return Cards.find(Filter.mongoSelector(selector), { sort: ['sort'], limit, @@ -175,21 +187,32 @@ BlazeComponent.extendComponent({ }, canSeeAddCard() { - return !this.reachedWipLimit() && Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + !this.reachedWipLimit() && + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, reachedWipLimit() { const list = Template.currentData(); - return !list.getWipLimit('soft') && list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count(); + return ( + !list.getWipLimit('soft') && + list.getWipLimit('enabled') && + list.getWipLimit('value') <= list.cards().count() + ); }, events() { - return [{ - 'click .js-minicard': this.clickOnMiniCard, - 'click .js-toggle-multi-selection': this.toggleMultiSelection, - 'click .open-minicard-composer': this.scrollToBottom, - submit: this.addCard, - }]; + return [ + { + 'click .js-minicard': this.clickOnMiniCard, + 'click .js-toggle-multi-selection': this.toggleMultiSelection, + 'click .open-minicard-composer': this.scrollToBottom, + submit: this.addCard, + }, + ]; }, }).register('listBody'); @@ -212,10 +235,15 @@ BlazeComponent.extendComponent({ const currentBoardId = Session.get('currentBoard'); arr = []; - _.forEach(Boards.findOne(currentBoardId).customFields().fetch(), function(field){ - if(field.automaticallyOnCard) - arr.push({_id: field._id, value: null}); - }); + _.forEach( + Boards.findOne(currentBoardId) + .customFields() + .fetch(), + function(field) { + if (field.automaticallyOnCard) + arr.push({ _id: field._id, value: null }); + }, + ); this.customFields.set(arr); }, @@ -227,7 +255,7 @@ BlazeComponent.extendComponent({ getLabels() { const currentBoardId = Session.get('currentBoard'); - return Boards.findOne(currentBoardId).labels.filter((label) => { + return Boards.findOne(currentBoardId).labels.filter(label => { return this.labels.get().indexOf(label._id) > -1; }); }, @@ -257,18 +285,20 @@ BlazeComponent.extendComponent({ } BlazeComponent.getComponentForElement(nextList).openForm({ - position:this.data().position, + position: this.data().position, }); } }, events() { - return [{ - keydown: this.pressKey, - 'click .js-link': Popup.open('linkCard'), - 'click .js-search': Popup.open('searchElement'), - 'click .js-card-template': Popup.open('searchElement'), - }]; + return [ + { + keydown: this.pressKey, + 'click .js-link': Popup.open('linkCard'), + 'click .js-search': Popup.open('searchElement'), + 'click .js-card-template': Popup.open('searchElement'), + }, + ]; }, onRendered() { @@ -277,66 +307,75 @@ BlazeComponent.extendComponent({ autosize($textarea); - $textarea.escapeableTextComplete([ - // User mentions - { - match: /\B@([\w.]*)$/, - search(term, callback) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback($.map(currentBoard.activeMembers(), (member) => { - const user = Users.findOne(member.userId); - return user.username.indexOf(term) === 0 ? user : null; - })); - }, - template(user) { - return user.username; - }, - replace(user) { - toggleValueInReactiveArray(editor.members, user._id); - return ''; + $textarea.escapeableTextComplete( + [ + // User mentions + { + match: /\B@([\w.]*)$/, + search(term, callback) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + callback( + $.map(currentBoard.activeMembers(), member => { + const user = Users.findOne(member.userId); + return user.username.indexOf(term) === 0 ? user : null; + }), + ); + }, + template(user) { + return user.username; + }, + replace(user) { + toggleValueInReactiveArray(editor.members, user._id); + return ''; + }, + index: 1, }, - index: 1, - }, - // Labels - { - match: /\B#(\w*)$/, - search(term, callback) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback($.map(currentBoard.labels, (label) => { - if (label.name.indexOf(term) > -1 || - label.color.indexOf(term) > -1) { - return label; - } - return null; - })); - }, - template(label) { - return Blaze.toHTMLWithData(Template.autocompleteLabelLine, { - hasNoName: !label.name, - colorName: label.color, - labelName: label.name || label.color, - }); + // Labels + { + match: /\B#(\w*)$/, + search(term, callback) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + callback( + $.map(currentBoard.labels, label => { + if ( + label.name.indexOf(term) > -1 || + label.color.indexOf(term) > -1 + ) { + return label; + } + return null; + }), + ); + }, + template(label) { + return Blaze.toHTMLWithData(Template.autocompleteLabelLine, { + hasNoName: !label.name, + colorName: label.color, + labelName: label.name || label.color, + }); + }, + replace(label) { + toggleValueInReactiveArray(editor.labels, label._id); + return ''; + }, + index: 1, }, - replace(label) { - toggleValueInReactiveArray(editor.labels, label._id); - return ''; + ], + { + // When the autocomplete menu is shown we want both a press of both `Tab` + // or `Enter` to validation the auto-completion. We also need to stop the + // event propagation to prevent the card from submitting (on `Enter`) or + // going on the next column (on `Tab`). + onKeydown(evt, commands) { + if (evt.keyCode === 9 || evt.keyCode === 13) { + evt.stopPropagation(); + return commands.KEY_ENTER; + } + return null; }, - index: 1, }, - ], { - // When the autocomplete menu is shown we want both a press of both `Tab` - // or `Enter` to validation the auto-completion. We also need to stop the - // event propagation to prevent the card from submitting (on `Enter`) or - // going on the next column (on `Tab`). - onKeydown(evt, commands) { - if (evt.keyCode === 9 || evt.keyCode === 13) { - evt.stopPropagation(); - return commands.KEY_ENTER; - } - return null; - }, - }); + ); }, }).register('addCardForm'); @@ -354,24 +393,29 @@ BlazeComponent.extendComponent({ const list = $(Popup._getTopStack().openerElement).closest('.js-list'); this.listId = Blaze.getData(list[0])._id; // Swimlane where to insert card - const swimlane = $(Popup._getTopStack().openerElement).closest('.js-swimlane'); + const swimlane = $(Popup._getTopStack().openerElement).closest( + '.js-swimlane', + ); this.swimlaneId = ''; const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') this.swimlaneId = Blaze.getData(swimlane[0])._id; else if (boardView === 'board-view-lists' || !boardView) - this.swimlaneId = Swimlanes.findOne({boardId: this.boardId})._id; + this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id; }, boards() { - const boards = Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - _id: {$ne: Session.get('currentBoard')}, - type: 'board', - }, { - sort: ['title'], - }); + const boards = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Session.get('currentBoard') }, + type: 'board', + }, + { + sort: ['title'], + }, + ); return boards; }, @@ -379,7 +423,7 @@ BlazeComponent.extendComponent({ if (!this.selectedBoardId.get()) { return []; } - const swimlanes = Swimlanes.find({boardId: this.selectedBoardId.get()}); + const swimlanes = Swimlanes.find({ boardId: this.selectedBoardId.get() }); if (swimlanes.count()) this.selectedSwimlaneId.set(swimlanes.fetch()[0]._id); return swimlanes; @@ -389,9 +433,8 @@ BlazeComponent.extendComponent({ if (!this.selectedBoardId.get()) { return []; } - const lists = Lists.find({boardId: this.selectedBoardId.get()}); - if (lists.count()) - this.selectedListId.set(lists.fetch()[0]._id); + const lists = Lists.find({ boardId: this.selectedBoardId.get() }); + if (lists.count()) this.selectedListId.set(lists.fetch()[0]._id); return lists; }, @@ -399,73 +442,84 @@ BlazeComponent.extendComponent({ if (!this.board) { return []; } - const ownCardsIds = this.board.cards().map((card) => { return card.linkedId || card._id; }); + const ownCardsIds = this.board.cards().map(card => { + return card.linkedId || card._id; + }); return Cards.find({ boardId: this.selectedBoardId.get(), swimlaneId: this.selectedSwimlaneId.get(), listId: this.selectedListId.get(), archived: false, - linkedId: {$nin: ownCardsIds}, - _id: {$nin: ownCardsIds}, - type: {$nin: ['template-card']}, + linkedId: { $nin: ownCardsIds }, + _id: { $nin: ownCardsIds }, + type: { $nin: ['template-card'] }, }); }, events() { - return [{ - 'change .js-select-boards'(evt) { - subManager.subscribe('board', $(evt.currentTarget).val(), false); - this.selectedBoardId.set($(evt.currentTarget).val()); - }, - 'change .js-select-swimlanes'(evt) { - this.selectedSwimlaneId.set($(evt.currentTarget).val()); - }, - 'change .js-select-lists'(evt) { - this.selectedListId.set($(evt.currentTarget).val()); - }, - 'click .js-done' (evt) { - // LINK CARD - evt.stopPropagation(); - evt.preventDefault(); - const linkedId = $('.js-select-cards option:selected').val(); - if (!linkedId) { + return [ + { + 'change .js-select-boards'(evt) { + subManager.subscribe('board', $(evt.currentTarget).val(), false); + this.selectedBoardId.set($(evt.currentTarget).val()); + }, + 'change .js-select-swimlanes'(evt) { + this.selectedSwimlaneId.set($(evt.currentTarget).val()); + }, + 'change .js-select-lists'(evt) { + this.selectedListId.set($(evt.currentTarget).val()); + }, + 'click .js-done'(evt) { + // LINK CARD + evt.stopPropagation(); + evt.preventDefault(); + const linkedId = $('.js-select-cards option:selected').val(); + if (!linkedId) { + Popup.close(); + return; + } + const _id = Cards.insert({ + title: $('.js-select-cards option:selected').text(), //dummy + listId: this.listId, + swimlaneId: this.swimlaneId, + boardId: this.boardId, + sort: Lists.findOne(this.listId) + .cards() + .count(), + type: 'cardType-linkedCard', + linkedId, + }); + Filter.addException(_id); Popup.close(); - return; - } - const _id = Cards.insert({ - title: $('.js-select-cards option:selected').text(), //dummy - listId: this.listId, - swimlaneId: this.swimlaneId, - boardId: this.boardId, - sort: Lists.findOne(this.listId).cards().count(), - type: 'cardType-linkedCard', - linkedId, - }); - Filter.addException(_id); - Popup.close(); - }, - 'click .js-link-board' (evt) { - //LINK BOARD - evt.stopPropagation(); - evt.preventDefault(); - const impBoardId = $('.js-select-boards option:selected').val(); - if (!impBoardId || Cards.findOne({linkedId: impBoardId, archived: false})) { + }, + 'click .js-link-board'(evt) { + //LINK BOARD + evt.stopPropagation(); + evt.preventDefault(); + const impBoardId = $('.js-select-boards option:selected').val(); + if ( + !impBoardId || + Cards.findOne({ linkedId: impBoardId, archived: false }) + ) { + Popup.close(); + return; + } + const _id = Cards.insert({ + title: $('.js-select-boards option:selected').text(), //dummy + listId: this.listId, + swimlaneId: this.swimlaneId, + boardId: this.boardId, + sort: Lists.findOne(this.listId) + .cards() + .count(), + type: 'cardType-linkedBoard', + linkedId: impBoardId, + }); + Filter.addException(_id); Popup.close(); - return; - } - const _id = Cards.insert({ - title: $('.js-select-boards option:selected').text(), //dummy - listId: this.listId, - swimlaneId: this.swimlaneId, - boardId: this.boardId, - sort: Lists.findOne(this.listId).cards().count(), - type: 'cardType-linkedBoard', - linkedId: impBoardId, - }); - Filter.addException(_id); - Popup.close(); + }, }, - }]; + ]; }, }).register('linkCardPopup'); @@ -475,11 +529,20 @@ BlazeComponent.extendComponent({ }, onCreated() { - this.isCardTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-card-template'); - this.isListTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-list-template'); - this.isSwimlaneTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-open-add-swimlane-menu'); - this.isBoardTemplateSearch = $(Popup._getTopStack().openerElement).hasClass('js-add-board'); - this.isTemplateSearch = this.isCardTemplateSearch || + this.isCardTemplateSearch = $(Popup._getTopStack().openerElement).hasClass( + 'js-card-template', + ); + this.isListTemplateSearch = $(Popup._getTopStack().openerElement).hasClass( + 'js-list-template', + ); + this.isSwimlaneTemplateSearch = $( + Popup._getTopStack().openerElement, + ).hasClass('js-open-add-swimlane-menu'); + this.isBoardTemplateSearch = $(Popup._getTopStack().openerElement).hasClass( + 'js-add-board', + ); + this.isTemplateSearch = + this.isCardTemplateSearch || this.isListTemplateSearch || this.isSwimlaneTemplateSearch || this.isBoardTemplateSearch; @@ -491,7 +554,12 @@ BlazeComponent.extendComponent({ board = Boards.findOne({ archived: false, 'members.userId': Meteor.userId(), - _id: {$nin: [Session.get('currentBoard'), (Meteor.user().profile || {}).templatesBoardId]}, + _id: { + $nin: [ + Session.get('currentBoard'), + (Meteor.user().profile || {}).templatesBoardId, + ], + }, }); } if (!board) { @@ -509,11 +577,12 @@ BlazeComponent.extendComponent({ subManager.subscribe('board', this.boardId, false); this.swimlaneId = ''; // Swimlane where to insert card - const swimlane = $(Popup._getTopStack().openerElement).parents('.js-swimlane'); + const swimlane = $(Popup._getTopStack().openerElement).parents( + '.js-swimlane', + ); if ((Meteor.user().profile || {}).boardView === 'board-view-swimlanes') this.swimlaneId = Blaze.getData(swimlane[0])._id; - else - this.swimlaneId = Swimlanes.findOne({boardId: this.boardId})._id; + else this.swimlaneId = Swimlanes.findOne({ boardId: this.boardId })._id; // List where to insert card const list = $(Popup._getTopStack().openerElement).closest('.js-list'); this.listId = Blaze.getData(list[0])._id; @@ -522,14 +591,17 @@ BlazeComponent.extendComponent({ }, boards() { - const boards = Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - _id: {$ne: Session.get('currentBoard')}, - type: 'board', - }, { - sort: ['title'], - }); + const boards = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Session.get('currentBoard') }, + type: 'board', + }, + { + sort: ['title'], + }, + ); return boards; }, @@ -546,7 +618,7 @@ BlazeComponent.extendComponent({ return board.searchSwimlanes(this.term.get()); } else if (this.isBoardTemplateSearch) { const boards = board.searchBoards(this.term.get()); - boards.forEach((board) => { + boards.forEach(board => { subManager.subscribe('board', board.linkedId, false); }); return boards; @@ -556,60 +628,69 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'change .js-select-boards'(evt) { - subManager.subscribe('board', $(evt.currentTarget).val(), false); - this.selectedBoardId.set($(evt.currentTarget).val()); - }, - 'submit .js-search-term-form'(evt) { - evt.preventDefault(); - this.term.set(evt.target.searchTerm.value); - }, - 'click .js-minicard'(evt) { - // 0. Common - const title = $('.js-element-title').val().trim(); - if (!title) - return; - const element = Blaze.getData(evt.currentTarget); - element.title = title; - let _id = ''; - if (!this.isTemplateSearch || this.isCardTemplateSearch) { - // Card insertion - // 1. Common - element.sort = Lists.findOne(this.listId).cards().count(); - // 1.A From template - if (this.isTemplateSearch) { - element.type = 'cardType-card'; - element.linkedId = ''; - _id = element.copy(this.boardId, this.swimlaneId, this.listId); - // 1.B Linked card - } else { - delete element._id; - element.type = 'cardType-linkedCard'; - element.linkedId = element.linkedId || element._id; - _id = Cards.insert(element); + return [ + { + 'change .js-select-boards'(evt) { + subManager.subscribe('board', $(evt.currentTarget).val(), false); + this.selectedBoardId.set($(evt.currentTarget).val()); + }, + 'submit .js-search-term-form'(evt) { + evt.preventDefault(); + this.term.set(evt.target.searchTerm.value); + }, + 'click .js-minicard'(evt) { + // 0. Common + const title = $('.js-element-title') + .val() + .trim(); + if (!title) return; + const element = Blaze.getData(evt.currentTarget); + element.title = title; + let _id = ''; + if (!this.isTemplateSearch || this.isCardTemplateSearch) { + // Card insertion + // 1. Common + element.sort = Lists.findOne(this.listId) + .cards() + .count(); + // 1.A From template + if (this.isTemplateSearch) { + element.type = 'cardType-card'; + element.linkedId = ''; + _id = element.copy(this.boardId, this.swimlaneId, this.listId); + // 1.B Linked card + } else { + delete element._id; + element.type = 'cardType-linkedCard'; + element.linkedId = element.linkedId || element._id; + _id = Cards.insert(element); + } + Filter.addException(_id); + // List insertion + } else if (this.isListTemplateSearch) { + element.sort = Swimlanes.findOne(this.swimlaneId) + .lists() + .count(); + element.type = 'list'; + _id = element.copy(this.boardId, this.swimlaneId); + } else if (this.isSwimlaneTemplateSearch) { + element.sort = Boards.findOne(this.boardId) + .swimlanes() + .count(); + element.type = 'swimlalne'; + _id = element.copy(this.boardId); + } else if (this.isBoardTemplateSearch) { + board = Boards.findOne(element.linkedId); + board.sort = Boards.find({ archived: false }).count(); + board.type = 'board'; + board.title = element.title; + delete board.slug; + _id = board.copy(); } - Filter.addException(_id); - // List insertion - } else if (this.isListTemplateSearch) { - element.sort = Swimlanes.findOne(this.swimlaneId).lists().count(); - element.type = 'list'; - _id = element.copy(this.boardId, this.swimlaneId); - } else if (this.isSwimlaneTemplateSearch) { - element.sort = Boards.findOne(this.boardId).swimlanes().count(); - element.type = 'swimlalne'; - _id = element.copy(this.boardId); - } else if (this.isBoardTemplateSearch) { - board = Boards.findOne(element.linkedId); - board.sort = Boards.find({archived: false}).count(); - board.type = 'board'; - board.title = element.title; - delete board.slug; - _id = board.copy(); - } - Popup.close(); + Popup.close(); + }, }, - }]; + ]; }, }).register('searchElementPopup'); @@ -622,15 +703,23 @@ BlazeComponent.extendComponent({ const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') - this.swimlaneId = this.parentComponent().parentComponent().parentComponent().data()._id; + this.swimlaneId = this.parentComponent() + .parentComponent() + .parentComponent() + .data()._id; }, onRendered() { this.spinner = this.find('.sk-spinner-list'); this.container = this.$(this.spinner).parents('.js-perfect-scrollbar')[0]; - $(this.container).on(`scroll.spinner_${this.swimlaneId}_${this.listId}`, () => this.updateList()); - $(window).on(`resize.spinner_${this.swimlaneId}_${this.listId}`, () => this.updateList()); + $(this.container).on( + `scroll.spinner_${this.swimlaneId}_${this.listId}`, + () => this.updateList(), + ); + $(window).on(`resize.spinner_${this.swimlaneId}_${this.listId}`, () => + this.updateList(), + ); this.updateList(); }, @@ -660,5 +749,4 @@ BlazeComponent.extendComponent({ return bottomViewPosition > threshold; }, - }).register('spinnerList'); |