diff options
Diffstat (limited to 'client')
65 files changed, 3822 insertions, 3143 deletions
diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index 0476897f..05149826 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -13,7 +13,7 @@ BlazeComponent.extendComponent({ let thisId, searchId; if (mode === 'linkedcard' || mode === 'linkedboard') { thisId = Session.get('currentCard'); - searchId = Cards.findOne({_id: thisId}).linkedId; + searchId = Cards.findOne({ _id: thisId }).linkedId; mode = mode.replace('linked', ''); } else { thisId = Session.get(`current${capitalizedMode}`); @@ -22,8 +22,7 @@ BlazeComponent.extendComponent({ const limit = this.page.get() * activitiesPerPage; const user = Meteor.user(); const hideSystem = user ? user.hasHiddenSystemMessages() : false; - if (searchId === null) - return; + if (searchId === null) return; this.subscribe('activities', mode, searchId, limit, hideSystem, () => { this.loadNextPageLocked = false; @@ -50,9 +49,9 @@ BlazeComponent.extendComponent({ } }, - checkItem(){ + checkItem() { const checkItemId = this.currentData().checklistItemId; - const checkItem = ChecklistItems.findOne({_id:checkItemId}); + const checkItem = ChecklistItems.findOne({ _id: checkItemId }); return checkItem.title; }, @@ -66,42 +65,58 @@ BlazeComponent.extendComponent({ cardLink() { const card = this.currentData().card(); - return card && Blaze.toHTML(HTML.A({ - href: card.absoluteUrl(), - 'class': 'action-card', - }, card.title)); + return ( + card && + Blaze.toHTML( + HTML.A( + { + href: card.absoluteUrl(), + class: 'action-card', + }, + card.title, + ), + ) + ); }, - lastLabel(){ + lastLabel() { const lastLabelId = this.currentData().labelId; - if (!lastLabelId) - return null; - const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById(lastLabelId); - if(lastLabel.name === undefined || lastLabel.name === ''){ + if (!lastLabelId) return null; + const lastLabel = Boards.findOne(Session.get('currentBoard')).getLabelById( + lastLabelId, + ); + if (lastLabel.name === undefined || lastLabel.name === '') { return lastLabel.color; - }else{ + } else { return lastLabel.name; } }, - lastCustomField(){ - const lastCustomField = CustomFields.findOne(this.currentData().customFieldId); - if (!lastCustomField) - return null; + lastCustomField() { + const lastCustomField = CustomFields.findOne( + this.currentData().customFieldId, + ); + if (!lastCustomField) return null; return lastCustomField.name; }, - lastCustomFieldValue(){ - const lastCustomField = CustomFields.findOne(this.currentData().customFieldId); - if (!lastCustomField) - return null; + lastCustomFieldValue() { + const lastCustomField = CustomFields.findOne( + this.currentData().customFieldId, + ); + if (!lastCustomField) return null; const value = this.currentData().value; - if (lastCustomField.settings.dropdownItems && lastCustomField.settings.dropdownItems.length > 0) { - const dropDownValue = _.find(lastCustomField.settings.dropdownItems, (item) => { - return item._id === value; - }); - if (dropDownValue) - return dropDownValue.name; + if ( + lastCustomField.settings.dropdownItems && + lastCustomField.settings.dropdownItems.length > 0 + ) { + const dropDownValue = _.find( + lastCustomField.settings.dropdownItems, + item => { + return item._id === value; + }, + ); + if (dropDownValue) return dropDownValue.name; } return value; }, @@ -112,11 +127,16 @@ BlazeComponent.extendComponent({ sourceLink() { const source = this.currentData().source; - if(source) { - if(source.url) { - return Blaze.toHTML(HTML.A({ - href: source.url, - }, source.system)); + if (source) { + if (source.url) { + return Blaze.toHTML( + HTML.A( + { + href: source.url, + }, + source.system, + ), + ); } else { return source.system; } @@ -133,38 +153,50 @@ BlazeComponent.extendComponent({ attachmentLink() { const attachment = this.currentData().attachment(); // trying to display url before file is stored generates js errors - return attachment && attachment.url({ download: true }) && Blaze.toHTML(HTML.A({ - href: attachment.url({ download: true }), - target: '_blank', - }, attachment.name())); + return ( + attachment && + attachment.url({ download: true }) && + Blaze.toHTML( + HTML.A( + { + href: attachment.url({ download: true }), + target: '_blank', + }, + attachment.name(), + ), + ) + ); }, customField() { const customField = this.currentData().customField(); - if (!customField) - return null; + if (!customField) return null; return customField.name; }, events() { - return [{ - // XXX We should use Popup.afterConfirmation here - 'click .js-delete-comment'() { - const commentId = this.currentData().commentId; - CardComments.remove(commentId); - }, - 'submit .js-edit-comment'(evt) { - evt.preventDefault(); - const commentText = this.currentComponent().getValue().trim(); - const commentId = Template.parentData().commentId; - if (commentText) { - CardComments.update(commentId, { - $set: { - text: commentText, - }, - }); - } + return [ + { + // XXX We should use Popup.afterConfirmation here + 'click .js-delete-comment'() { + const commentId = this.currentData().commentId; + CardComments.remove(commentId); + }, + 'submit .js-edit-comment'(evt) { + evt.preventDefault(); + const commentText = this.currentComponent() + .getValue() + .trim(); + const commentId = Template.parentData().commentId; + if (commentText) { + CardComments.update(commentId, { + $set: { + text: commentText, + }, + }); + } + }, }, - }]; + ]; }, }).register('activities'); diff --git a/client/components/activities/comments.js b/client/components/activities/comments.js index 34b6402c..3fc5770c 100644 --- a/client/components/activities/comments.js +++ b/client/components/activities/comments.js @@ -14,39 +14,41 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-new-comment:not(.focus)'() { - commentFormIsOpen.set(true); + return [ + { + 'click .js-new-comment:not(.focus)'() { + commentFormIsOpen.set(true); + }, + 'submit .js-new-comment-form'(evt) { + const input = this.getInput(); + const text = input.val().trim(); + const card = this.currentData(); + let boardId = card.boardId; + let cardId = card._id; + if (card.isLinkedCard()) { + boardId = Cards.findOne(card.linkedId).boardId; + cardId = card.linkedId; + } + if (text) { + CardComments.insert({ + text, + boardId, + cardId, + }); + resetCommentInput(input); + Tracker.flush(); + autosize.update(input); + } + evt.preventDefault(); + }, + // Pressing Ctrl+Enter should submit the form + 'keydown form textarea'(evt) { + if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) { + this.find('button[type=submit]').click(); + } + }, }, - 'submit .js-new-comment-form'(evt) { - const input = this.getInput(); - const text = input.val().trim(); - const card = this.currentData(); - let boardId = card.boardId; - let cardId = card._id; - if (card.isLinkedCard()) { - boardId = Cards.findOne(card.linkedId).boardId; - cardId = card.linkedId; - } - if (text) { - CardComments.insert({ - text, - boardId, - cardId, - }); - resetCommentInput(input); - Tracker.flush(); - autosize.update(input); - } - evt.preventDefault(); - }, - // Pressing Ctrl+Enter should submit the form - 'keydown form textarea'(evt) { - if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) { - this.find('button[type=submit]').click(); - } - }, - }]; + ]; }, }).register('commentForm'); @@ -69,7 +71,8 @@ Tracker.autorun(() => { }); }); -EscapeActions.register('inlinedForm', +EscapeActions.register( + 'inlinedForm', () => { const draftKey = { fieldName: 'cardComment', @@ -84,7 +87,10 @@ EscapeActions.register('inlinedForm', } resetCommentInput(commentInput); }, - () => { return commentFormIsOpen.get(); }, { + () => { + return commentFormIsOpen.get(); + }, + { noClickEscapeOn: '.js-new-comment', - } + }, ); diff --git a/client/components/boards/boardArchive.js b/client/components/boards/boardArchive.js index c8bbb341..d3e65bd8 100644 --- a/client/components/boards/boardArchive.js +++ b/client/components/boards/boardArchive.js @@ -4,36 +4,45 @@ BlazeComponent.extendComponent({ }, archivedBoards() { - return Boards.find({ archived: true }, { - sort: ['title'], - }); + return Boards.find( + { archived: true }, + { + sort: ['title'], + }, + ); }, events() { - return [{ - 'click .js-restore-board'() { - // TODO : Make isSandstorm variable global - const isSandstorm = Meteor.settings && Meteor.settings.public && - Meteor.settings.public.sandstorm; - if (isSandstorm && Session.get('currentBoard')) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - currentBoard.archive(); - } - const board = this.currentData(); - board.restore(); - Utils.goBoardId(board._id); + return [ + { + 'click .js-restore-board'() { + // TODO : Make isSandstorm variable global + const isSandstorm = + Meteor.settings && + Meteor.settings.public && + Meteor.settings.public.sandstorm; + if (isSandstorm && Session.get('currentBoard')) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + currentBoard.archive(); + } + const board = this.currentData(); + board.restore(); + Utils.goBoardId(board._id); + }, + 'click .js-delete-board': Popup.afterConfirm('boardDelete', function() { + Popup.close(); + const isSandstorm = + Meteor.settings && + Meteor.settings.public && + Meteor.settings.public.sandstorm; + if (isSandstorm && Session.get('currentBoard')) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + Boards.remove(currentBoard._id); + } + Boards.remove(this._id); + FlowRouter.go('home'); + }), }, - 'click .js-delete-board': Popup.afterConfirm('boardDelete', function() { - Popup.close(); - const isSandstorm = Meteor.settings && Meteor.settings.public && - Meteor.settings.public.sandstorm; - if (isSandstorm && Session.get('currentBoard')) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - Boards.remove(currentBoard._id); - } - Boards.remove(this._id); - FlowRouter.go('home'); - }), - }]; + ]; }, }).register('archivedBoards'); diff --git a/client/components/boards/boardBody.js b/client/components/boards/boardBody.js index e9b9f88a..81fa3d87 100644 --- a/client/components/boards/boardBody.js +++ b/client/components/boards/boardBody.js @@ -12,8 +12,7 @@ BlazeComponent.extendComponent({ // unfortunatly, Blaze doesn't have this notion. this.autorun(() => { const currentBoardId = Session.get('currentBoard'); - if (!currentBoardId) - return; + if (!currentBoardId) return; const handle = subManager.subscribe('board', currentBoardId, false); Tracker.nonreactive(() => { Tracker.autorun(() => { @@ -30,7 +29,6 @@ BlazeComponent.extendComponent({ goHome() { FlowRouter.go('home'); }, - }).register('board'); BlazeComponent.extendComponent({ @@ -47,7 +45,7 @@ BlazeComponent.extendComponent({ if (nullSortSwimlanes.count() > 0) { const swimlanes = currentBoardData.swimlanes(); let count = 0; - swimlanes.forEach((s) => { + swimlanes.forEach(s => { Swimlanes.update(s._id, { $set: { sort: count, @@ -62,7 +60,7 @@ BlazeComponent.extendComponent({ if (nullSortLists.count() > 0) { const lists = currentBoardData.lists(); let count = 0; - lists.forEach((l) => { + lists.forEach(l => { Lists.update(l._id, { $set: { sort: count, @@ -110,12 +108,15 @@ BlazeComponent.extendComponent({ // resize all swimlanes + headers to be a total of 150 px per row // this could be achieved by setIsDragging(true) but we want immediate // result - ui.item.siblings('.js-swimlane').css('height', `${swimlaneWhileSortingHeight - 26}px`); + ui.item + .siblings('.js-swimlane') + .css('height', `${swimlaneWhileSortingHeight - 26}px`); // set the new scroll height after the resize and insertion of // the placeholder. We want the element under the cursor to stay // at the same place on the screen - ui.item.parent().get(0).scrollTop = ui.placeholder.get(0).offsetTop + parentOffset.top - evt.pageY; + ui.item.parent().get(0).scrollTop = + ui.placeholder.get(0).offsetTop + parentOffset.top - evt.pageY; }, beforeStop(evt, ui) { const parentOffset = ui.item.parent().offset(); @@ -124,7 +125,8 @@ BlazeComponent.extendComponent({ // compute the new scroll height after the resize and removal of // the placeholder - const scrollTop = ui.placeholder.get(0).offsetTop + parentOffset.top - evt.pageY; + const scrollTop = + ui.placeholder.get(0).offsetTop + parentOffset.top - evt.pageY; // then reset the original view of the swimlane siblings.removeClass('moving-swimlane'); @@ -154,11 +156,14 @@ BlazeComponent.extendComponent({ sort(evt, ui) { // get the mouse position in the sortable const parentOffset = ui.item.parent().offset(); - const cursorY = evt.pageY - parentOffset.top + ui.item.parent().scrollTop(); + const cursorY = + evt.pageY - parentOffset.top + ui.item.parent().scrollTop(); // compute the intended index of the placeholder (we need to skip the // slots between the headers and the list of cards) - const newplaceholderIndex = Math.floor(cursorY / swimlaneWhileSortingHeight); + const newplaceholderIndex = Math.floor( + cursorY / swimlaneWhileSortingHeight, + ); let destPlaceholderIndex = (newplaceholderIndex + 1) * 2; // if we are scrolling far away from the bottom of the list @@ -169,9 +174,17 @@ BlazeComponent.extendComponent({ // update the placeholder position in the DOM tree if (destPlaceholderIndex !== ui.placeholder.index()) { if (destPlaceholderIndex < boardComponent.origPlaceholderIndex) { - ui.placeholder.insertBefore(ui.placeholder.siblings().slice(destPlaceholderIndex - 2, destPlaceholderIndex - 1)); + ui.placeholder.insertBefore( + ui.placeholder + .siblings() + .slice(destPlaceholderIndex - 2, destPlaceholderIndex - 1), + ); } else { - ui.placeholder.insertAfter(ui.placeholder.siblings().slice(destPlaceholderIndex - 1, destPlaceholderIndex)); + ui.placeholder.insertAfter( + ui.placeholder + .siblings() + .slice(destPlaceholderIndex - 1, destPlaceholderIndex), + ); } } }, @@ -181,7 +194,11 @@ BlazeComponent.extendComponent({ enableClickOnTouch('.js-swimlane:not(.placeholder)'); function userIsMember() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); } // If there is no data in the board (ie, no lists) we autofocus the list @@ -195,45 +212,49 @@ BlazeComponent.extendComponent({ isViewSwimlanes() { const currentUser = Meteor.user(); if (!currentUser) return false; - return ((currentUser.profile || {}).boardView === 'board-view-swimlanes'); + return (currentUser.profile || {}).boardView === 'board-view-swimlanes'; }, isViewLists() { const currentUser = Meteor.user(); if (!currentUser) return true; - return ((currentUser.profile || {}).boardView === 'board-view-lists'); + return (currentUser.profile || {}).boardView === 'board-view-lists'; }, isViewCalendar() { const currentUser = Meteor.user(); if (!currentUser) return false; - return ((currentUser.profile || {}).boardView === 'board-view-cal'); + return (currentUser.profile || {}).boardView === 'board-view-cal'; }, openNewListForm() { if (this.isViewSwimlanes()) { this.childComponents('swimlane')[0] - .childComponents('addListAndSwimlaneForm')[0].open(); + .childComponents('addListAndSwimlaneForm')[0] + .open(); } else if (this.isViewLists()) { this.childComponents('listsGroup')[0] - .childComponents('addListForm')[0].open(); + .childComponents('addListForm')[0] + .open(); } }, events() { - return [{ - // XXX The board-overlay div should probably be moved to the parent - // component. - 'mouseenter .board-overlay'() { - if (this.mouseHasEnterCardDetails) { - this.showOverlay.set(false); - } - }, - 'mouseup'() { - if (this._isDragging) { - this._isDragging = false; - } + return [ + { + // XXX The board-overlay div should probably be moved to the parent + // component. + 'mouseenter .board-overlay'() { + if (this.mouseHasEnterCardDetails) { + this.showOverlay.set(false); + } + }, + mouseup() { + if (this._isDragging) { + this._isDragging = false; + } + }, }, - }]; + ]; }, // XXX Flow components allow us to avoid creating these two setter methods by @@ -245,23 +266,24 @@ BlazeComponent.extendComponent({ scrollLeft(position = 0) { const swimlanes = this.$('.js-swimlanes'); - swimlanes && swimlanes.animate({ - scrollLeft: position, - }); + swimlanes && + swimlanes.animate({ + scrollLeft: position, + }); }, scrollTop(position = 0) { const swimlanes = this.$('.js-swimlanes'); - swimlanes && swimlanes.animate({ - scrollTop: position, - }); + swimlanes && + swimlanes.animate({ + scrollTop: position, + }); }, - }).register('boardBody'); BlazeComponent.extendComponent({ onRendered() { - this.autorun(function(){ + this.autorun(function() { $('#calendar-view').fullCalendar('refetchEvents'); }); }, @@ -273,7 +295,8 @@ BlazeComponent.extendComponent({ timezone: 'local', header: { left: 'title today prev,next', - center: 'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,timelineMonth timelineYear', + center: + 'agendaDay,listDay,timelineDay agendaWeek,listWeek,timelineWeek month,timelineMonth timelineYear', right: '', }, // height: 'parent', nope, doesn't work as the parent might be small @@ -283,7 +306,7 @@ BlazeComponent.extendComponent({ nowIndicator: true, businessHours: { // days of week. an array of zero-based day of week integers (0=Sunday) - dow: [ 1, 2, 3, 4, 5 ], // Monday - Friday + dow: [1, 2, 3, 4, 5], // Monday - Friday start: '8:00', end: '18:00', }, @@ -291,20 +314,25 @@ BlazeComponent.extendComponent({ events(start, end, timezone, callback) { const currentBoard = Boards.findOne(Session.get('currentBoard')); const events = []; - currentBoard.cardsInInterval(start.toDate(), end.toDate()).forEach(function(card){ - events.push({ - id: card._id, - title: card.title, - start: card.startAt, - end: card.endAt, - allDay: Math.abs(card.endAt.getTime() - card.startAt.getTime()) / 1000 === 24*3600, - url: FlowRouter.url('card', { - boardId: currentBoard._id, - slug: currentBoard.slug, - cardId: card._id, - }), + currentBoard + .cardsInInterval(start.toDate(), end.toDate()) + .forEach(function(card) { + events.push({ + id: card._id, + title: card.title, + start: card.startAt, + end: card.endAt, + allDay: + Math.abs(card.endAt.getTime() - card.startAt.getTime()) / + 1000 === + 24 * 3600, + url: FlowRouter.url('card', { + boardId: currentBoard._id, + slug: currentBoard.slug, + cardId: card._id, + }), + }); }); - }); callback(events); }, eventResize(event, delta, revertFunc) { @@ -339,6 +367,6 @@ BlazeComponent.extendComponent({ isViewCalendar() { const currentUser = Meteor.user(); if (!currentUser) return false; - return ((currentUser.profile || {}).boardView === 'board-view-cal'); + return (currentUser.profile || {}).boardView === 'board-view-cal'; }, }).register('calendarView'); diff --git a/client/components/boards/boardHeader.js b/client/components/boards/boardHeader.js index f2b5c4f5..cb84c233 100644 --- a/client/components/boards/boardHeader.js +++ b/client/components/boards/boardHeader.js @@ -45,15 +45,21 @@ Template.boardMenuPopup.helpers({ }); Template.boardChangeTitlePopup.events({ - submit(evt, tpl) { - const newTitle = tpl.$('.js-board-name').val().trim(); - const newDesc = tpl.$('.js-board-desc').val().trim(); + submit(event, templateInstance) { + const newTitle = templateInstance + .$('.js-board-name') + .val() + .trim(); + const newDesc = templateInstance + .$('.js-board-desc') + .val() + .trim(); if (newTitle) { this.rename(newTitle); this.setDescription(newDesc); Popup.close(); } - evt.preventDefault(); + event.preventDefault(); }, }); @@ -76,67 +82,79 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-edit-board-title': Popup.open('boardChangeTitle'), - 'click .js-star-board'() { - Meteor.user().toggleBoardStar(Session.get('currentBoard')); + return [ + { + 'click .js-edit-board-title': Popup.open('boardChangeTitle'), + 'click .js-star-board'() { + Meteor.user().toggleBoardStar(Session.get('currentBoard')); + }, + 'click .js-open-board-menu': Popup.open('boardMenu'), + 'click .js-change-visibility': Popup.open('boardChangeVisibility'), + 'click .js-watch-board': Popup.open('boardChangeWatch'), + 'click .js-open-archived-board'() { + Modal.open('archivedBoards'); + }, + 'click .js-toggle-board-view'() { + const currentUser = Meteor.user(); + if ( + (currentUser.profile || {}).boardView === 'board-view-swimlanes' + ) { + currentUser.setBoardView('board-view-cal'); + } else if ( + (currentUser.profile || {}).boardView === 'board-view-lists' + ) { + currentUser.setBoardView('board-view-swimlanes'); + } else if ( + (currentUser.profile || {}).boardView === 'board-view-cal' + ) { + currentUser.setBoardView('board-view-lists'); + } else { + currentUser.setBoardView('board-view-swimlanes'); + } + }, + 'click .js-toggle-sidebar'() { + Sidebar.toggle(); + }, + 'click .js-open-filter-view'() { + Sidebar.setView('filter'); + }, + 'click .js-filter-reset'(event) { + event.stopPropagation(); + Sidebar.setView(); + Filter.reset(); + }, + 'click .js-open-search-view'() { + Sidebar.setView('search'); + }, + 'click .js-open-rules-view'() { + Modal.openWide('rulesMain'); + }, + 'click .js-multiselection-activate'() { + const currentCard = Session.get('currentCard'); + MultiSelection.activate(); + if (currentCard) { + MultiSelection.add(currentCard); + } + }, + 'click .js-multiselection-reset'(event) { + event.stopPropagation(); + MultiSelection.disable(); + }, + 'click .js-log-in'() { + FlowRouter.go('atSignIn'); + }, }, - 'click .js-open-board-menu': Popup.open('boardMenu'), - 'click .js-change-visibility': Popup.open('boardChangeVisibility'), - 'click .js-watch-board': Popup.open('boardChangeWatch'), - 'click .js-open-archived-board'() { - Modal.open('archivedBoards'); - }, - 'click .js-toggle-board-view'() { - const currentUser = Meteor.user(); - if ((currentUser.profile || {}).boardView === 'board-view-swimlanes') { - currentUser.setBoardView('board-view-cal'); - } else if ((currentUser.profile || {}).boardView === 'board-view-lists') { - currentUser.setBoardView('board-view-swimlanes'); - } else if ((currentUser.profile || {}).boardView === 'board-view-cal') { - currentUser.setBoardView('board-view-lists'); - } else { - currentUser.setBoardView('board-view-swimlanes'); - } - }, - 'click .js-toggle-sidebar'() { - Sidebar.toggle(); - }, - 'click .js-open-filter-view'() { - Sidebar.setView('filter'); - }, - 'click .js-filter-reset'(evt) { - evt.stopPropagation(); - Sidebar.setView(); - Filter.reset(); - }, - 'click .js-open-search-view'() { - Sidebar.setView('search'); - }, - 'click .js-open-rules-view'() { - Modal.openWide('rulesMain'); - }, - 'click .js-multiselection-activate'() { - const currentCard = Session.get('currentCard'); - MultiSelection.activate(); - if (currentCard) { - MultiSelection.add(currentCard); - } - }, - 'click .js-multiselection-reset'(evt) { - evt.stopPropagation(); - MultiSelection.disable(); - }, - 'click .js-log-in'() { - FlowRouter.go('atSignIn'); - }, - }]; + ]; }, }).register('boardHeaderBar'); Template.boardHeaderBar.helpers({ canModifyBoard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); @@ -164,15 +182,17 @@ const CreateBoard = BlazeComponent.extendComponent({ this.visibilityMenuIsOpen.set(!this.visibilityMenuIsOpen.get()); }, - onSubmit(evt) { - evt.preventDefault(); + onSubmit(event) { + event.preventDefault(); const title = this.find('.js-new-board-title').value; const visibility = this.visibility.get(); - this.boardId.set(Boards.insert({ - title, - permission: visibility, - })); + this.boardId.set( + Boards.insert({ + title, + permission: visibility, + }), + ); Swimlanes.insert({ title: 'Default', @@ -183,26 +203,28 @@ const CreateBoard = BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-select-visibility'() { - this.setVisibility(this.currentData()); + return [ + { + 'click .js-select-visibility'() { + this.setVisibility(this.currentData()); + }, + 'click .js-change-visibility': this.toggleVisibilityMenu, + 'click .js-import': Popup.open('boardImportBoard'), + submit: this.onSubmit, + 'click .js-import-board': Popup.open('chooseBoardSource'), + 'click .js-board-template': Popup.open('searchElement'), }, - 'click .js-change-visibility': this.toggleVisibilityMenu, - 'click .js-import': Popup.open('boardImportBoard'), - submit: this.onSubmit, - 'click .js-import-board': Popup.open('chooseBoardSource'), - 'click .js-board-template': Popup.open('searchElement'), - }]; + ]; }, }).register('createBoardPopup'); (class HeaderBarCreateBoard extends CreateBoard { - onSubmit(evt) { - super.onSubmit(evt); + onSubmit(event) { + super.onSubmit(event); // Immediately star boards crated with the headerbar popup. Meteor.user().toggleBoardStar(this.boardId.get()); } -}).register('headerBarCreateBoardPopup'); +}.register('headerBarCreateBoardPopup')); BlazeComponent.extendComponent({ visibilityCheck() { @@ -218,9 +240,11 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-select-visibility': this.selectBoardVisibility, - }]; + return [ + { + 'click .js-select-visibility': this.selectBoardVisibility, + }, + ]; }, }).register('boardChangeVisibilityPopup'); @@ -235,13 +259,21 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-select-watch'() { - const level = this.currentData(); - Meteor.call('watch', 'board', Session.get('currentBoard'), level, (err, ret) => { - if (!err && ret) Popup.close(); - }); + return [ + { + 'click .js-select-watch'() { + const level = this.currentData(); + Meteor.call( + 'watch', + 'board', + Session.get('currentBoard'), + level, + (err, ret) => { + if (!err && ret) Popup.close(); + }, + ); + }, }, - }]; + ]; }, }).register('boardChangeWatchPopup'); diff --git a/client/components/boards/boardsList.js b/client/components/boards/boardsList.js index 0fb80230..cc586b1f 100644 --- a/client/components/boards/boardsList.js +++ b/client/components/boards/boardsList.js @@ -21,11 +21,14 @@ BlazeComponent.extendComponent({ }, boards() { - return Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - type: 'board', - }, { sort: ['title'] }); + return Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + type: 'board', + }, + { sort: ['title'] }, + ); }, isStarred() { const user = Meteor.user(); @@ -48,46 +51,49 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-add-board': Popup.open('createBoard'), - 'click .js-star-board'(evt) { - const boardId = this.currentData()._id; - Meteor.user().toggleBoardStar(boardId); - evt.preventDefault(); - }, - 'click .js-clone-board'(evt) { - Meteor.call('cloneBoard', - this.currentData()._id, - Session.get('fromBoard'), - (err, res) => { - if (err) { - this.setError(err.error); - } else { - Session.set('fromBoard', null); - Utils.goBoardId(res); + return [ + { + 'click .js-add-board': Popup.open('createBoard'), + 'click .js-star-board'(evt) { + const boardId = this.currentData()._id; + Meteor.user().toggleBoardStar(boardId); + evt.preventDefault(); + }, + 'click .js-clone-board'(evt) { + Meteor.call( + 'cloneBoard', + this.currentData()._id, + Session.get('fromBoard'), + (err, res) => { + if (err) { + this.setError(err.error); + } else { + Session.set('fromBoard', null); + Utils.goBoardId(res); + } + }, + ); + evt.preventDefault(); + }, + 'click .js-archive-board'(evt) { + const boardId = this.currentData()._id; + Meteor.call('archiveBoard', boardId); + evt.preventDefault(); + }, + 'click .js-accept-invite'() { + const boardId = this.currentData()._id; + Meteor.user().removeInvite(boardId); + }, + 'click .js-decline-invite'() { + const boardId = this.currentData()._id; + Meteor.call('quitBoard', boardId, (err, ret) => { + if (!err && ret) { + Meteor.user().removeInvite(boardId); + FlowRouter.go('home'); } - } - ); - evt.preventDefault(); - }, - 'click .js-archive-board'(evt) { - const boardId = this.currentData()._id; - Meteor.call('archiveBoard', boardId); - evt.preventDefault(); - }, - 'click .js-accept-invite'() { - const boardId = this.currentData()._id; - Meteor.user().removeInvite(boardId); - }, - 'click .js-decline-invite'() { - const boardId = this.currentData()._id; - Meteor.call('quitBoard', boardId, (err, ret) => { - if (!err && ret) { - Meteor.user().removeInvite(boardId); - FlowRouter.go('home'); - } - }); + }); + }, }, - }]; + ]; }, }).register('boardList'); diff --git a/client/components/cards/attachments.js b/client/components/cards/attachments.js index e3dc143a..6b3e38a5 100644 --- a/client/components/cards/attachments.js +++ b/client/components/cards/attachments.js @@ -1,10 +1,11 @@ Template.attachmentsGalery.events({ 'click .js-add-attachment': Popup.open('cardAttachments'), - 'click .js-confirm-delete': Popup.afterConfirm('attachmentDelete', + 'click .js-confirm-delete': Popup.afterConfirm( + 'attachmentDelete', function() { Attachments.remove(this._id); Popup.close(); - } + }, ), // If we let this event bubble, FlowRouter will handle it and empty the page // content, see #101. @@ -17,8 +18,8 @@ Template.attachmentsGalery.events({ 'click .js-remove-cover'() { Cards.findOne(this.cardId).unsetCover(); }, - 'click .js-preview-image'(evt) { - Popup.open('previewAttachedImage').call(this, evt); + 'click .js-preview-image'(event) { + Popup.open('previewAttachedImage').call(this, event); // when multiple thumbnails, if click one then another very fast, // we might get a wrong width from previous img. // when popup reused, onRendered() won't be called, so we cannot get there. @@ -31,31 +32,29 @@ Template.attachmentsGalery.events({ // if the image is too large, we resize & center the popup. if (w > 300) { $('div.pop-over').css({ - width: (w + 20), + width: w + 20, position: 'absolute', - left: (window.innerWidth - w)/2, - top: (window.innerHeight - h)/2, + left: (window.innerWidth - w) / 2, + top: (window.innerHeight - h) / 2, }); } }; - const url = $(evt.currentTarget).attr('src'); - if (img.src === url && img.complete) - rePosPopup(); - else - img.onload = rePosPopup; + const url = $(event.currentTarget).attr('src'); + if (img.src === url && img.complete) rePosPopup(); + else img.onload = rePosPopup; }, }); Template.previewAttachedImagePopup.events({ - 'click .js-large-image-clicked'(){ + 'click .js-large-image-clicked'() { Popup.close(); }, }); Template.cardAttachmentsPopup.events({ - 'change .js-attach-file'(evt) { + 'change .js-attach-file'(event) { const card = this; - FS.Utility.eachFile(evt, (f) => { + FS.Utility.eachFile(event, f => { const file = new FS.File(f); if (card.isLinkedCard()) { file.boardId = Cards.findOne(card.linkedId).boardId; @@ -77,9 +76,9 @@ Template.cardAttachmentsPopup.events({ Popup.close(); }); }, - 'click .js-computer-upload'(evt, tpl) { - tpl.find('.js-attach-file').click(); - evt.preventDefault(); + 'click .js-computer-upload'(event, templateInstance) { + templateInstance.find('.js-attach-file').click(); + event.preventDefault(); }, 'click .js-upload-clipboard-image': Popup.open('previewClipboardImage'), }); @@ -88,7 +87,7 @@ let pastedResults = null; Template.previewClipboardImagePopup.onRendered(() => { // we can paste image from clipboard - $(document.body).pasteImageReader((results) => { + $(document.body).pasteImageReader(results => { if (results.dataURL.startsWith('data:image/')) { $('img.preview-clipboard-image').attr('src', results.dataURL); pastedResults = results; @@ -96,7 +95,7 @@ Template.previewClipboardImagePopup.onRendered(() => { }); // we can also drag & drop image file to it - $(document.body).dropImageReader((results) => { + $(document.body).dropImageReader(results => { if (results.dataURL.startsWith('data:image/')) { $('img.preview-clipboard-image').attr('src', results.dataURL); pastedResults = results; diff --git a/client/components/cards/cardCustomFields.js b/client/components/cards/cardCustomFields.js index aa50caec..d0b9c72d 100644 --- a/client/components/cards/cardCustomFields.js +++ b/client/components/cards/cardCustomFields.js @@ -7,22 +7,21 @@ Template.cardCustomFieldsPopup.helpers({ }); Template.cardCustomFieldsPopup.events({ - 'click .js-select-field'(evt) { + 'click .js-select-field'(event) { const card = Cards.findOne(Session.get('currentCard')); const customFieldId = this._id; card.toggleCustomField(customFieldId); - evt.preventDefault(); + event.preventDefault(); }, - 'click .js-settings'(evt) { + 'click .js-settings'(event) { EscapeActions.executeUpTo('detailsPane'); Sidebar.setView('customFields'); - evt.preventDefault(); + event.preventDefault(); }, }); // cardCustomField const CardCustomField = BlazeComponent.extendComponent({ - getTemplate() { return `cardCustomField-${this.data().definition.type}`; }, @@ -34,52 +33,55 @@ const CardCustomField = BlazeComponent.extendComponent({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); CardCustomField.register('cardCustomField'); // cardCustomField-text (class extends CardCustomField { - onCreated() { super.onCreated(); } events() { - return [{ - 'submit .js-card-customfield-text'(evt) { - evt.preventDefault(); - const value = this.currentComponent().getValue(); - this.card.setCustomField(this.customFieldId, value); + return [ + { + 'submit .js-card-customfield-text'(event) { + event.preventDefault(); + const value = this.currentComponent().getValue(); + this.card.setCustomField(this.customFieldId, value); + }, }, - }]; + ]; } - -}).register('cardCustomField-text'); +}.register('cardCustomField-text')); // cardCustomField-number (class extends CardCustomField { - onCreated() { super.onCreated(); } events() { - return [{ - 'submit .js-card-customfield-number'(evt) { - evt.preventDefault(); - const value = parseInt(this.find('input').value, 10); - this.card.setCustomField(this.customFieldId, value); + return [ + { + 'submit .js-card-customfield-number'(event) { + event.preventDefault(); + const value = parseInt(this.find('input').value, 10); + this.card.setCustomField(this.customFieldId, value); + }, }, - }]; + ]; } - -}).register('cardCustomField-number'); +}.register('cardCustomField-number')); // cardCustomField-date (class extends CardCustomField { - onCreated() { super.onCreated(); const self = this; @@ -108,8 +110,10 @@ CardCustomField.register('cardCustomField'); } classes() { - if (this.date.get().isBefore(this.now.get(), 'minute') && - this.now.get().isBefore(this.data().value)) { + if ( + this.date.get().isBefore(this.now.get(), 'minute') && + this.now.get().isBefore(this.data().value) + ) { return 'current'; } return ''; @@ -120,12 +124,13 @@ CardCustomField.register('cardCustomField'); } events() { - return [{ - 'click .js-edit-date': Popup.open('cardCustomField-date'), - }]; + return [ + { + 'click .js-edit-date': Popup.open('cardCustomField-date'), + }, + ]; } - -}).register('cardCustomField-date'); +}.register('cardCustomField-date')); // cardCustomField-datePopup (class extends DatePicker { @@ -144,11 +149,10 @@ CardCustomField.register('cardCustomField'); _deleteDate() { this.card.setCustomField(this.customFieldId, ''); } -}).register('cardCustomField-datePopup'); +}.register('cardCustomField-datePopup')); // cardCustomField-dropdown (class extends CardCustomField { - onCreated() { super.onCreated(); this._items = this.data().definition.settings.dropdownItems; @@ -160,20 +164,23 @@ CardCustomField.register('cardCustomField'); } selectedItem() { - const selected = this._items.find((item) => { + const selected = this._items.find(item => { return item._id === this.data().value; }); - return (selected) ? selected.name : TAPi18n.__('custom-field-dropdown-unknown'); + return selected + ? selected.name + : TAPi18n.__('custom-field-dropdown-unknown'); } events() { - return [{ - 'submit .js-card-customfield-dropdown'(evt) { - evt.preventDefault(); - const value = this.find('select').value; - this.card.setCustomField(this.customFieldId, value); + return [ + { + 'submit .js-card-customfield-dropdown'(event) { + event.preventDefault(); + const value = this.find('select').value; + this.card.setCustomField(this.customFieldId, value); + }, }, - }]; + ]; } - -}).register('cardCustomField-dropdown'); +}.register('cardCustomField-dropdown')); diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 182705d5..91205f1c 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -11,15 +11,20 @@ BlazeComponent.extendComponent({ }, onRendered() { - const $picker = this.$('.js-datepicker').datepicker({ - todayHighlight: true, - todayBtn: 'linked', - language: TAPi18n.getLanguage(), - }).on('changeDate', function(evt) { - this.find('#date').value = moment(evt.date).format('L'); - this.error.set(''); - this.find('#time').focus(); - }.bind(this)); + const $picker = this.$('.js-datepicker') + .datepicker({ + todayHighlight: true, + todayBtn: 'linked', + language: TAPi18n.getLanguage(), + }) + .on( + 'changeDate', + function(evt) { + this.find('#date').value = moment(evt.date).format('L'); + this.error.set(''); + this.find('#time').focus(); + }.bind(this), + ); if (this.date.get().isValid()) { $picker.datepicker('update', this.date.get().toDate()); @@ -27,13 +32,11 @@ BlazeComponent.extendComponent({ }, showDate() { - if (this.date.get().isValid()) - return this.date.get().format('L'); + if (this.date.get().isValid()) return this.date.get().format('L'); return ''; }, showTime() { - if (this.date.get().isValid()) - return this.date.get().format('LT'); + if (this.date.get().isValid()) return this.date.get().format('LT'); return ''; }, dateFormat() { @@ -44,51 +47,58 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'keyup .js-date-field'() { - // parse for localized date format in strict mode - const dateMoment = moment(this.find('#date').value, 'L', true); - if (dateMoment.isValid()) { - this.error.set(''); - this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); - } - }, - 'keyup .js-time-field'() { - // parse for localized time format in strict mode - const dateMoment = moment(this.find('#time').value, 'LT', true); - if (dateMoment.isValid()) { - this.error.set(''); - } - }, - 'submit .edit-date'(evt) { - evt.preventDefault(); - - // if no time was given, init with 12:00 - const time = evt.target.time.value || moment(new Date().setHours(12, 0, 0)).format('LT'); - - const dateString = `${evt.target.date.value} ${time}`; - const newDate = moment(dateString, 'L LT', true); - if (newDate.isValid()) { - this._storeDate(newDate.toDate()); + return [ + { + 'keyup .js-date-field'() { + // parse for localized date format in strict mode + const dateMoment = moment(this.find('#date').value, 'L', true); + if (dateMoment.isValid()) { + this.error.set(''); + this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); + } + }, + 'keyup .js-time-field'() { + // parse for localized time format in strict mode + const dateMoment = moment(this.find('#time').value, 'LT', true); + if (dateMoment.isValid()) { + this.error.set(''); + } + }, + 'submit .edit-date'(evt) { + evt.preventDefault(); + + // if no time was given, init with 12:00 + const time = + evt.target.time.value || + moment(new Date().setHours(12, 0, 0)).format('LT'); + + const dateString = `${evt.target.date.value} ${time}`; + const newDate = moment(dateString, 'L LT', true); + if (newDate.isValid()) { + this._storeDate(newDate.toDate()); + Popup.close(); + } else { + this.error.set('invalid-date'); + evt.target.date.focus(); + } + }, + 'click .js-delete-date'(evt) { + evt.preventDefault(); + this._deleteDate(); Popup.close(); - } - else { - this.error.set('invalid-date'); - evt.target.date.focus(); - } - }, - 'click .js-delete-date'(evt) { - evt.preventDefault(); - this._deleteDate(); - Popup.close(); + }, }, - }]; + ]; }, }); Template.dateBadge.helpers({ canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); @@ -96,7 +106,8 @@ Template.dateBadge.helpers({ (class extends DatePicker { onCreated() { super.onCreated(); - this.data().getReceived() && this.date.set(moment(this.data().getReceived())); + this.data().getReceived() && + this.date.set(moment(this.data().getReceived())); } _storeDate(date) { @@ -106,8 +117,7 @@ Template.dateBadge.helpers({ _deleteDate() { this.card.setReceived(null); } -}).register('editCardReceivedDatePopup'); - +}.register('editCardReceivedDatePopup')); // editCardStartDatePopup (class extends DatePicker { @@ -119,7 +129,10 @@ Template.dateBadge.helpers({ onRendered() { super.onRendered(); if (moment.isDate(this.card.getReceived())) { - this.$('.js-datepicker').datepicker('setStartDate', this.card.getReceived()); + this.$('.js-datepicker').datepicker( + 'setStartDate', + this.card.getReceived(), + ); } } @@ -130,7 +143,7 @@ Template.dateBadge.helpers({ _deleteDate() { this.card.setStart(null); } -}).register('editCardStartDatePopup'); +}.register('editCardStartDatePopup')); // editCardDueDatePopup (class extends DatePicker { @@ -153,7 +166,7 @@ Template.dateBadge.helpers({ _deleteDate() { this.card.setDue(null); } -}).register('editCardDueDatePopup'); +}.register('editCardDueDatePopup')); // editCardEndDatePopup (class extends DatePicker { @@ -176,8 +189,7 @@ Template.dateBadge.helpers({ _deleteDate() { this.card.setEnd(null); } -}).register('editCardEndDatePopup'); - +}.register('editCardEndDatePopup')); // Display received, start, due & end dates const CardDate = BlazeComponent.extendComponent({ @@ -224,17 +236,20 @@ class CardReceivedDate extends CardDate { const startAt = this.data().getStart(); const theDate = this.date.get(); // if dueAt, endAt and startAt exist & are > receivedAt, receivedAt doesn't need to be flagged - if (((startAt) && (theDate.isAfter(dueAt))) || - ((endAt) && (theDate.isAfter(endAt))) || - ((dueAt) && (theDate.isAfter(dueAt)))) + if ( + (startAt && theDate.isAfter(dueAt)) || + (endAt && theDate.isAfter(endAt)) || + (dueAt && theDate.isAfter(dueAt)) + ) classes += 'long-overdue'; - else - classes += 'current'; + else classes += 'current'; return classes; } showTitle() { - return `${TAPi18n.__('card-received-on')} ${this.date.get().format('LLLL')}`; + return `${TAPi18n.__('card-received-on')} ${this.date + .get() + .format('LLLL')}`; } events() { @@ -261,13 +276,10 @@ class CardStartDate extends CardDate { const theDate = this.date.get(); const now = this.now.get(); // if dueAt or endAt exist & are > startAt, startAt doesn't need to be flagged - if (((endAt) && (theDate.isAfter(endAt))) || - ((dueAt) && (theDate.isAfter(dueAt)))) + if ((endAt && theDate.isAfter(endAt)) || (dueAt && theDate.isAfter(dueAt))) classes += 'long-overdue'; - else if (theDate.isBefore(now, 'minute')) - classes += 'almost-due'; - else - classes += 'current'; + else if (theDate.isBefore(now, 'minute')) classes += 'almost-due'; + else classes += 'current'; return classes; } @@ -298,17 +310,12 @@ class CardDueDate extends CardDate { const theDate = this.date.get(); const now = this.now.get(); // if the due date is after the end date, green - done early - if ((endAt) && (theDate.isAfter(endAt))) - classes += 'current'; + if (endAt && theDate.isAfter(endAt)) classes += 'current'; // if there is an end date, don't need to flag the due date - else if (endAt) - classes += ''; - else if (now.diff(theDate, 'days') >= 2) - classes += 'long-overdue'; - else if (now.diff(theDate, 'minute') >= 0) - classes += 'due'; - else if (now.diff(theDate, 'days') >= -1) - classes += 'almost-due'; + else if (endAt) classes += ''; + else if (now.diff(theDate, 'days') >= 2) classes += 'long-overdue'; + else if (now.diff(theDate, 'minute') >= 0) classes += 'due'; + else if (now.diff(theDate, 'days') >= -1) classes += 'almost-due'; return classes; } @@ -337,12 +344,9 @@ class CardEndDate extends CardDate { let classes = 'end-date' + ' '; const dueAt = this.data().getDue(); const theDate = this.date.get(); - if (theDate.diff(dueAt, 'days') >= 2) - classes += 'long-overdue'; - else if (theDate.diff(dueAt, 'days') >= 0) - classes += 'due'; - else if (theDate.diff(dueAt, 'days') >= -2) - classes += 'almost-due'; + if (theDate.diff(dueAt, 'days') >= 2) classes += 'long-overdue'; + else if (theDate.diff(dueAt, 'days') >= 0) classes += 'due'; + else if (theDate.diff(dueAt, 'days') >= -2) classes += 'almost-due'; return classes; } @@ -362,22 +366,22 @@ CardEndDate.register('cardEndDate'); showDate() { return this.date.get().format('l'); } -}).register('minicardReceivedDate'); +}.register('minicardReceivedDate')); (class extends CardStartDate { showDate() { return this.date.get().format('l'); } -}).register('minicardStartDate'); +}.register('minicardStartDate')); (class extends CardDueDate { showDate() { return this.date.get().format('l'); } -}).register('minicardDueDate'); +}.register('minicardDueDate')); (class extends CardEndDate { showDate() { return this.date.get().format('l'); } -}).register('minicardEndDate'); +}.register('minicardEndDate')); diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index 2d875ca2..781967ae 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -27,7 +27,7 @@ BlazeComponent.extendComponent({ onCreated() { this.currentBoard = Boards.findOne(Session.get('currentBoard')); this.isLoaded = new ReactiveVar(false); - const boardBody = this.parentComponent().parentComponent(); + const boardBody = this.parentComponent().parentComponent(); //in Miniview parent is Board, not BoardBody. if (boardBody !== null) { boardBody.showOverlay.set(true); @@ -48,7 +48,11 @@ BlazeComponent.extendComponent({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, scrollParentContainer() { @@ -80,18 +84,17 @@ BlazeComponent.extendComponent({ const cardContainerScrollTop = $cardContainer.scrollTop(); let topOffset = false; - if(cardViewStartTop !== 100){ + if (cardViewStartTop !== 100) { topOffset = cardViewStartTop - 100; } - if(topOffset !== false) { + if (topOffset !== false) { bodyBoardComponent.scrollTop(cardContainerScrollTop + topOffset); } - }, presentParentTask() { let result = this.currentBoard.presentParentTask; - if ((result === null) || (result === undefined)) { + if (result === null || result === undefined) { result = 'no-parent'; } return result; @@ -116,7 +119,13 @@ BlazeComponent.extendComponent({ onRendered() { if (!Utils.isMiniScreen()) { Meteor.setTimeout(() => { - $('.card-details').mCustomScrollbar({theme:'minimal-dark', setWidth: false, setLeft: 0, scrollbarPosition: 'outside', mouseWheel: true }); + $('.card-details').mCustomScrollbar({ + theme: 'minimal-dark', + setWidth: false, + setLeft: 0, + scrollbarPosition: 'outside', + mouseWheel: true, + }); this.scrollParentContainer(); }, 500); } @@ -212,7 +221,7 @@ BlazeComponent.extendComponent({ }, onDestroyed() { - const parentComponent = this.parentComponent().parentComponent(); + const parentComponent = this.parentComponent().parentComponent(); //on mobile view parent is Board, not board body. if (parentComponent === null) return; parentComponent.showOverlay.set(false); @@ -228,56 +237,64 @@ BlazeComponent.extendComponent({ }, }; - return [{ - ...events, - 'click .js-close-card-details' () { - Utils.goBoardId(this.data().boardId); - }, - 'click .js-open-card-details-menu': Popup.open('cardDetailsActions'), - 'submit .js-card-description' (evt) { - evt.preventDefault(); - const description = this.currentComponent().getValue(); - this.data().setDescription(description); - }, - 'submit .js-card-details-title' (evt) { - evt.preventDefault(); - const title = this.currentComponent().getValue().trim(); - if (title) { - this.data().setTitle(title); - } - }, - 'submit .js-card-details-assigner'(evt) { - evt.preventDefault(); - const assigner = this.currentComponent().getValue().trim(); - if (assigner) { - this.data().setAssignedBy(assigner); - } - }, - 'submit .js-card-details-requester'(evt) { - evt.preventDefault(); - const requester = this.currentComponent().getValue().trim(); - if (requester) { - this.data().setRequestedBy(requester); - } - }, - 'click .js-member': Popup.open('cardMember'), - 'click .js-add-members': Popup.open('cardMembers'), - 'click .js-add-labels': Popup.open('cardLabels'), - 'click .js-received-date': Popup.open('editCardReceivedDate'), - 'click .js-start-date': Popup.open('editCardStartDate'), - 'click .js-due-date': Popup.open('editCardDueDate'), - 'click .js-end-date': Popup.open('editCardEndDate'), - 'mouseenter .js-card-details' () { - const parentComponent = this.parentComponent().parentComponent(); - //on mobile view parent is Board, not BoardBody. - if (parentComponent === null) return; - parentComponent.showOverlay.set(true); - parentComponent.mouseHasEnterCardDetails = true; - }, - 'click #toggleButton'() { - Meteor.call('toggleSystemMessages'); + return [ + { + ...events, + 'click .js-close-card-details'() { + Utils.goBoardId(this.data().boardId); + }, + 'click .js-open-card-details-menu': Popup.open('cardDetailsActions'), + 'submit .js-card-description'(event) { + event.preventDefault(); + const description = this.currentComponent().getValue(); + this.data().setDescription(description); + }, + 'submit .js-card-details-title'(event) { + event.preventDefault(); + const title = this.currentComponent() + .getValue() + .trim(); + if (title) { + this.data().setTitle(title); + } + }, + 'submit .js-card-details-assigner'(event) { + event.preventDefault(); + const assigner = this.currentComponent() + .getValue() + .trim(); + if (assigner) { + this.data().setAssignedBy(assigner); + } + }, + 'submit .js-card-details-requester'(event) { + event.preventDefault(); + const requester = this.currentComponent() + .getValue() + .trim(); + if (requester) { + this.data().setRequestedBy(requester); + } + }, + 'click .js-member': Popup.open('cardMember'), + 'click .js-add-members': Popup.open('cardMembers'), + 'click .js-add-labels': Popup.open('cardLabels'), + 'click .js-received-date': Popup.open('editCardReceivedDate'), + 'click .js-start-date': Popup.open('editCardStartDate'), + 'click .js-due-date': Popup.open('editCardDueDate'), + 'click .js-end-date': Popup.open('editCardEndDate'), + 'mouseenter .js-card-details'() { + const parentComponent = this.parentComponent().parentComponent(); + //on mobile view parent is Board, not BoardBody. + if (parentComponent === null) return; + parentComponent.showOverlay.set(true); + parentComponent.mouseHasEnterCardDetails = true; + }, + 'click #toggleButton'() { + Meteor.call('toggleSystemMessages'); + }, }, - }]; + ]; }, }).register('cardDetails'); @@ -297,7 +314,9 @@ BlazeComponent.extendComponent({ close(isReset = false) { if (this.isOpen.get() && !isReset) { const draft = this.getValue().trim(); - if (draft !== Cards.findOne(Session.get('currentCard')).getDescription()) { + if ( + draft !== Cards.findOne(Session.get('currentCard')).getDescription() + ) { UnsavedEdits.set(this._getUnsavedEditKey(), this.getValue()); } } @@ -311,12 +330,14 @@ BlazeComponent.extendComponent({ events() { const parentEvents = InlinedForm.prototype.events()[0]; - return [{ - ...parentEvents, - 'click .js-close-inlined-form': this.reset, - }]; + return [ + { + ...parentEvents, + 'click .js-close-inlined-form': this.reset, + }, + ]; } -}).register('inlinedCardDescription'); +}.register('inlinedCardDescription')); Template.cardDetailsActionsPopup.helpers({ isWatching() { @@ -324,7 +345,11 @@ Template.cardDetailsActionsPopup.helpers({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); @@ -342,23 +367,31 @@ Template.cardDetailsActionsPopup.events({ 'click .js-copy-card': Popup.open('copyCard'), 'click .js-copy-checklist-cards': Popup.open('copyChecklistToManyCards'), 'click .js-set-card-color': Popup.open('setCardColor'), - 'click .js-move-card-to-top' (evt) { - evt.preventDefault(); - const minOrder = _.min(this.list().cards(this.swimlaneId).map((c) => c.sort)); + 'click .js-move-card-to-top'(event) { + event.preventDefault(); + const minOrder = _.min( + this.list() + .cards(this.swimlaneId) + .map(c => c.sort), + ); this.move(this.boardId, this.swimlaneId, this.listId, minOrder - 1); }, - 'click .js-move-card-to-bottom' (evt) { - evt.preventDefault(); - const maxOrder = _.max(this.list().cards(this.swimlaneId).map((c) => c.sort)); + 'click .js-move-card-to-bottom'(event) { + event.preventDefault(); + const maxOrder = _.max( + this.list() + .cards(this.swimlaneId) + .map(c => c.sort), + ); this.move(this.boardId, this.swimlaneId, this.listId, maxOrder + 1); }, - 'click .js-archive' (evt) { - evt.preventDefault(); + 'click .js-archive'(event) { + event.preventDefault(); this.archive(); Popup.close(); }, 'click .js-more': Popup.open('cardMore'), - 'click .js-toggle-watch-card' () { + 'click .js-toggle-watch-card'() { const currentCard = this; const level = currentCard.findWatcher(Meteor.userId()) ? null : 'watching'; Meteor.call('watch', 'card', currentCard._id, level, (err, ret) => { @@ -367,15 +400,15 @@ Template.cardDetailsActionsPopup.events({ }, }); -Template.editCardTitleForm.onRendered(function () { +Template.editCardTitleForm.onRendered(function() { autosize(this.$('.js-edit-card-title')); }); Template.editCardTitleForm.events({ - 'keydown .js-edit-card-title' (evt) { + 'keydown .js-edit-card-title'(event) { // If enter key was pressed, submit the data // Unless the shift key is also being pressed - if (evt.keyCode === 13 && !evt.shiftKey) { + if (event.keyCode === 13 && !event.shiftKey) { $('.js-submit-edit-card-title-form').click(); } }, @@ -386,9 +419,9 @@ Template.editCardRequesterForm.onRendered(function() { }); Template.editCardRequesterForm.events({ - 'keydown .js-edit-card-requester'(evt) { + 'keydown .js-edit-card-requester'(event) { // If enter key was pressed, submit the data - if (evt.keyCode === 13) { + if (event.keyCode === 13) { $('.js-submit-edit-card-requester-form').click(); } }, @@ -399,16 +432,16 @@ Template.editCardAssignerForm.onRendered(function() { }); Template.editCardAssignerForm.events({ - 'keydown .js-edit-card-assigner'(evt) { + 'keydown .js-edit-card-assigner'(event) { // If enter key was pressed, submit the data - if (evt.keyCode === 13) { + if (event.keyCode === 13) { $('.js-submit-edit-card-assigner-form').click(); } }, }); Template.moveCardPopup.events({ - 'click .js-done' () { + 'click .js-done'() { // XXX We should *not* get the currentCard from the global state, but // instead from a “component” state. const card = Cards.findOne(Session.get('currentCard')); @@ -429,13 +462,16 @@ BlazeComponent.extendComponent({ }, boards() { - const boards = Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - _id: {$ne: Meteor.user().getTemplatesBoardId()}, - }, { - sort: ['title'], - }); + const boards = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { $ne: Meteor.user().getTemplatesBoardId() }, + }, + { + sort: ['title'], + }, + ); return boards; }, @@ -450,12 +486,14 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'change .js-select-boards'(evt) { - this.selectedBoardId.set($(evt.currentTarget).val()); - subManager.subscribe('board', this.selectedBoardId.get(), false); + return [ + { + 'change .js-select-boards'(event) { + this.selectedBoardId.set($(event.currentTarget).val()); + subManager.subscribe('board', this.selectedBoardId.get(), false); + }, }, - }]; + ]; }, }).register('boardsAndLists'); @@ -471,7 +509,9 @@ Template.copyCardPopup.events({ const textarea = $('#copy-card-title'); const title = textarea.val().trim(); // insert new card to the bottom of new list - card.sort = Lists.findOne(card.listId).cards().count(); + card.sort = Lists.findOne(card.listId) + .cards() + .count(); if (title) { card.title = title; @@ -489,7 +529,7 @@ Template.copyCardPopup.events({ }); Template.copyChecklistToManyCardsPopup.events({ - 'click .js-done' () { + 'click .js-done'() { const card = Cards.findOne(Session.get('currentCard')); const oldId = card._id; card._id = null; @@ -502,11 +542,13 @@ Template.copyChecklistToManyCardsPopup.events({ const textarea = $('#copy-card-title'); const titleEntry = textarea.val().trim(); // insert new card to the bottom of new list - card.sort = Lists.findOne(card.listId).cards().count(); + card.sort = Lists.findOne(card.listId) + .cards() + .count(); if (titleEntry) { const titleList = JSON.parse(titleEntry); - for (let i = 0; i < titleList.length; i++){ + for (let i = 0; i < titleList.length; i++) { const obj = titleList[i]; card.title = obj.title; card.description = obj.description; @@ -519,12 +561,12 @@ Template.copyChecklistToManyCardsPopup.events({ Filter.addException(_id); // copy checklists - Checklists.find({cardId: oldId}).forEach((ch) => { + Checklists.find({ cardId: oldId }).forEach(ch => { ch.copy(_id); }); // copy subtasks - cursor = Cards.find({parentId: oldId}); + cursor = Cards.find({ parentId: oldId }); cursor.forEach(function() { 'use strict'; const subtask = arguments[0]; @@ -534,7 +576,7 @@ Template.copyChecklistToManyCardsPopup.events({ }); // copy card comments - CardComments.find({cardId: oldId}).forEach((cmt) => { + CardComments.find({ cardId: oldId }).forEach(cmt => { cmt.copy(_id); }); } @@ -550,7 +592,7 @@ BlazeComponent.extendComponent({ }, colors() { - return cardColors.map((color) => ({ color, name: '' })); + return cardColors.map(color => ({ color, name: '' })); }, isSelected(color) { @@ -561,19 +603,21 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-palette-color'() { - this.currentColor.set(this.currentData().color); - }, - 'click .js-submit' () { - this.currentCard.setColor(this.currentColor.get()); - Popup.close(); + return [ + { + 'click .js-palette-color'() { + this.currentColor.set(this.currentData().color); + }, + 'click .js-submit'() { + this.currentCard.setColor(this.currentColor.get()); + Popup.close(); + }, + 'click .js-remove-color'() { + this.currentCard.setColor(null); + Popup.close(); + }, }, - 'click .js-remove-color'() { - this.currentCard.setColor(null); - Popup.close(); - }, - }]; + ]; }, }).register('setCardColorPopup'); @@ -592,15 +636,18 @@ BlazeComponent.extendComponent({ }, boards() { - const boards = Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - _id: { - $ne: Meteor.user().getTemplatesBoardId(), + const boards = Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + _id: { + $ne: Meteor.user().getTemplatesBoardId(), + }, }, - }, { - sort: ['title'], - }); + { + sort: ['title'], + }, + ); return boards; }, @@ -609,7 +656,7 @@ BlazeComponent.extendComponent({ if (this.parentBoard.get()) { return Cards.find({ boardId: this.parentBoard.get(), - _id: {$ne: currentId}, + _id: { $ne: currentId }, }); } else { return []; @@ -642,63 +689,69 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-copy-card-link-to-clipboard' () { - // Clipboard code from: - // https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser - const StringToCopyElement = document.getElementById('cardURL'); - StringToCopyElement.select(); - if (document.execCommand('copy')) { - StringToCopyElement.blur(); - } else { - document.getElementById('cardURL').selectionStart = 0; - document.getElementById('cardURL').selectionEnd = 999; - document.execCommand('copy'); - if (window.getSelection) { - if (window.getSelection().empty) { // Chrome - window.getSelection().empty(); - } else if (window.getSelection().removeAllRanges) { // Firefox - window.getSelection().removeAllRanges(); + return [ + { + 'click .js-copy-card-link-to-clipboard'() { + // Clipboard code from: + // https://stackoverflow.com/questions/6300213/copy-selected-text-to-the-clipboard-without-using-flash-must-be-cross-browser + const StringToCopyElement = document.getElementById('cardURL'); + StringToCopyElement.select(); + if (document.execCommand('copy')) { + StringToCopyElement.blur(); + } else { + document.getElementById('cardURL').selectionStart = 0; + document.getElementById('cardURL').selectionEnd = 999; + document.execCommand('copy'); + if (window.getSelection) { + if (window.getSelection().empty) { + // Chrome + window.getSelection().empty(); + } else if (window.getSelection().removeAllRanges) { + // Firefox + window.getSelection().removeAllRanges(); + } + } else if (document.selection) { + // IE? + document.selection.empty(); } - } else if (document.selection) { // IE? - document.selection.empty(); } - } - }, - 'click .js-delete': Popup.afterConfirm('cardDelete', function () { - Popup.close(); - Cards.remove(this._id); - Utils.goBoardId(this.boardId); - }), - 'change .js-field-parent-board'(evt) { - const selection = $(evt.currentTarget).val(); - const list = $('.js-field-parent-card'); - if (selection === 'none') { - this.parentBoard.set(null); - } else { - subManager.subscribe('board', $(evt.currentTarget).val(), false); - this.parentBoard.set(selection); - list.prop('disabled', false); - } - this.setParentCardId(null); - }, - 'change .js-field-parent-card'(evt) { - const selection = $(evt.currentTarget).val(); - this.setParentCardId(selection); + }, + 'click .js-delete': Popup.afterConfirm('cardDelete', function() { + Popup.close(); + Cards.remove(this._id); + Utils.goBoardId(this.boardId); + }), + 'change .js-field-parent-board'(event) { + const selection = $(event.currentTarget).val(); + const list = $('.js-field-parent-card'); + if (selection === 'none') { + this.parentBoard.set(null); + } else { + subManager.subscribe('board', $(event.currentTarget).val(), false); + this.parentBoard.set(selection); + list.prop('disabled', false); + } + this.setParentCardId(null); + }, + 'change .js-field-parent-card'(event) { + const selection = $(event.currentTarget).val(); + this.setParentCardId(selection); + }, }, - }]; + ]; }, }).register('cardMorePopup'); - // Close the card details pane by pressing escape -EscapeActions.register('detailsPane', +EscapeActions.register( + 'detailsPane', () => { Utils.goBoardId(Session.get('currentBoard')); }, () => { return !Session.equals('currentCard', null); - }, { + }, + { noClickEscapeOn: '.js-card-details,.board-sidebar,#header', - } + }, ); diff --git a/client/components/cards/cardTime.js b/client/components/cards/cardTime.js index 80b7fc84..d8a41aaa 100644 --- a/client/components/cards/cardTime.js +++ b/client/components/cards/cardTime.js @@ -20,29 +20,31 @@ BlazeComponent.extendComponent({ this.card.setSpentTime(null); }, events() { - return [{ - //TODO : need checking this portion - 'submit .edit-time'(evt) { - evt.preventDefault(); + return [ + { + //TODO : need checking this portion + 'submit .edit-time'(evt) { + evt.preventDefault(); - const spentTime = parseFloat(evt.target.time.value); - const isOvertime = this.card.getIsOvertime(); + const spentTime = parseFloat(evt.target.time.value); + const isOvertime = this.card.getIsOvertime(); - if (spentTime >= 0) { - this.storeTime(spentTime, isOvertime); + if (spentTime >= 0) { + this.storeTime(spentTime, isOvertime); + Popup.close(); + } else { + this.error.set('invalid-time'); + evt.target.time.focus(); + } + }, + 'click .js-delete-time'(evt) { + evt.preventDefault(); + this.deleteTime(); Popup.close(); - } else { - this.error.set('invalid-time'); - evt.target.time.focus(); - } + }, + 'click a.js-toggle-overtime': this.toggleOvertime, }, - 'click .js-delete-time'(evt) { - evt.preventDefault(); - this.deleteTime(); - Popup.close(); - }, - 'click a.js-toggle-overtime': this.toggleOvertime, - }]; + ]; }, }).register('editCardSpentTimePopup'); @@ -56,23 +58,33 @@ BlazeComponent.extendComponent({ }, showTitle() { if (this.data().getIsOvertime()) { - return `${TAPi18n.__('overtime')} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`; + return `${TAPi18n.__( + 'overtime', + )} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`; } else { - return `${TAPi18n.__('card-spent')} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`; + return `${TAPi18n.__( + 'card-spent', + )} ${this.data().getSpentTime()} ${TAPi18n.__('hours')}`; } }, showTime() { return this.data().getSpentTime(); }, events() { - return [{ - 'click .js-edit-time': Popup.open('editCardSpentTime'), - }]; + return [ + { + 'click .js-edit-time': Popup.open('editCardSpentTime'), + }, + ]; }, }).register('cardSpentTime'); Template.timeBadge.helpers({ canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); diff --git a/client/components/cards/checklists.js b/client/components/cards/checklists.js index 5d789351..57939eb8 100644 --- a/client/components/cards/checklists.js +++ b/client/components/cards/checklists.js @@ -64,20 +64,22 @@ BlazeComponent.extendComponent({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }).register('checklistDetail'); BlazeComponent.extendComponent({ - addChecklist(event) { event.preventDefault(); const textarea = this.find('textarea.js-add-checklist-item'); const title = textarea.value.trim(); let cardId = this.currentData().cardId; const card = Cards.findOne(cardId); - if (card.isLinked()) - cardId = card.linkedId; + if (card.isLinked()) cardId = card.linkedId; if (title) { Checklists.insert({ @@ -86,7 +88,9 @@ BlazeComponent.extendComponent({ sort: card.checklists().count(), }); setTimeout(() => { - this.$('.add-checklist-item').last().click(); + this.$('.add-checklist-item') + .last() + .click(); }, 100); } textarea.value = ''; @@ -113,7 +117,11 @@ BlazeComponent.extendComponent({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, deleteChecklist() { @@ -167,37 +175,43 @@ BlazeComponent.extendComponent({ events() { const events = { 'click .toggle-delete-checklist-dialog'(event) { - if($(event.target).hasClass('js-delete-checklist')){ + if ($(event.target).hasClass('js-delete-checklist')) { this.checklistToDelete = this.currentData().checklist; //Store data context } this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get()); }, }; - return [{ - ...events, - 'submit .js-add-checklist': this.addChecklist, - 'submit .js-edit-checklist-title': this.editChecklist, - 'submit .js-add-checklist-item': this.addChecklistItem, - 'submit .js-edit-checklist-item': this.editChecklistItem, - 'click .js-delete-checklist-item': this.deleteItem, - 'click .confirm-checklist-delete': this.deleteChecklist, - keydown: this.pressKey, - }]; + return [ + { + ...events, + 'submit .js-add-checklist': this.addChecklist, + 'submit .js-edit-checklist-title': this.editChecklist, + 'submit .js-add-checklist-item': this.addChecklistItem, + 'submit .js-edit-checklist-item': this.editChecklistItem, + 'click .js-delete-checklist-item': this.deleteItem, + 'click .confirm-checklist-delete': this.deleteChecklist, + keydown: this.pressKey, + }, + ]; }, }).register('checklists'); Template.checklistDeleteDialog.onCreated(() => { const $cardDetails = this.$('.card-details'); - this.scrollState = { position: $cardDetails.scrollTop(), //save current scroll position + this.scrollState = { + position: $cardDetails.scrollTop(), //save current scroll position top: false, //required for smooth scroll animation }; //Callback's purpose is to only prevent scrolling after animation is complete - $cardDetails.animate({ scrollTop: 0 }, 500, () => { this.scrollState.top = true; }); + $cardDetails.animate({ scrollTop: 0 }, 500, () => { + this.scrollState.top = true; + }); //Prevent scrolling while dialog is open $cardDetails.on('scroll', () => { - if(this.scrollState.top) { //If it's already in position, keep it there. Otherwise let animation scroll + if (this.scrollState.top) { + //If it's already in position, keep it there. Otherwise let animation scroll $cardDetails.scrollTop(0); } }); @@ -206,12 +220,16 @@ Template.checklistDeleteDialog.onCreated(() => { Template.checklistDeleteDialog.onDestroyed(() => { const $cardDetails = this.$('.card-details'); $cardDetails.off('scroll'); //Reactivate scrolling - $cardDetails.animate( { scrollTop: this.scrollState.position }); + $cardDetails.animate({ scrollTop: this.scrollState.position }); }); Template.checklistItemDetail.helpers({ canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); @@ -224,8 +242,10 @@ BlazeComponent.extendComponent({ } }, events() { - return [{ - 'click .js-checklist-item .check-box': this.toggleItem, - }]; + return [ + { + 'click .js-checklist-item .check-box': this.toggleItem, + }, + ]; }, }).register('checklistItemDetail'); diff --git a/client/components/cards/labels.js b/client/components/cards/labels.js index cdd5a700..1e156f54 100644 --- a/client/components/cards/labels.js +++ b/client/components/cards/labels.js @@ -9,7 +9,7 @@ BlazeComponent.extendComponent({ }, labels() { - return labelColors.map((color) => ({ color, name: '' })); + return labelColors.map(color => ({ color, name: '' })); }, isSelected(color) { @@ -17,11 +17,13 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-palette-color'() { - this.currentColor.set(this.currentData().color); + return [ + { + 'click .js-palette-color'() { + this.currentColor.set(this.currentData().color); + }, }, - }]; + ]; }, }).register('formLabel'); @@ -38,19 +40,19 @@ Template.createLabelPopup.helpers({ }); Template.cardLabelsPopup.events({ - 'click .js-select-label'(evt) { + 'click .js-select-label'(event) { const card = Cards.findOne(Session.get('currentCard')); const labelId = this._id; card.toggleLabel(labelId); - evt.preventDefault(); + event.preventDefault(); }, 'click .js-edit-label': Popup.open('editLabel'), 'click .js-add-label': Popup.open('createLabel'), }); Template.formLabel.events({ - 'click .js-palette-color'(evt) { - const $this = $(evt.currentTarget); + 'click .js-palette-color'(event) { + const $this = $(event.currentTarget); // hide selected ll colors $('.js-palette-select').addClass('hide'); @@ -62,11 +64,14 @@ Template.formLabel.events({ Template.createLabelPopup.events({ // Create the new label - 'submit .create-label'(evt, tpl) { - evt.preventDefault(); + 'submit .create-label'(event, templateInstance) { + event.preventDefault(); const board = Boards.findOne(Session.get('currentBoard')); - const name = tpl.$('#labelName').val().trim(); - const color = Blaze.getData(tpl.find('.fa-check')).color; + const name = templateInstance + .$('#labelName') + .val() + .trim(); + const color = Blaze.getData(templateInstance.find('.fa-check')).color; board.addLabel(name, color); Popup.back(); }, @@ -78,11 +83,14 @@ Template.editLabelPopup.events({ board.removeLabel(this._id); Popup.back(2); }), - 'submit .edit-label'(evt, tpl) { - evt.preventDefault(); + 'submit .edit-label'(event, templateInstance) { + event.preventDefault(); const board = Boards.findOne(Session.get('currentBoard')); - const name = tpl.$('#labelName').val().trim(); - const color = Blaze.getData(tpl.find('.fa-check')).color; + const name = templateInstance + .$('#labelName') + .val() + .trim(); + const color = Blaze.getData(templateInstance.find('.fa-check')).color; board.editLabel(this._id, name, color); Popup.back(); }, diff --git a/client/components/cards/minicard.js b/client/components/cards/minicard.js index da7f9e01..0718c629 100644 --- a/client/components/cards/minicard.js +++ b/client/components/cards/minicard.js @@ -8,13 +8,14 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-linked-link' () { - if (this.data().isLinkedCard()) - Utils.goCardId(this.data().linkedId); - else if (this.data().isLinkedBoard()) - Utils.goBoardId(this.data().linkedId); + return [ + { + 'click .js-linked-link'() { + if (this.data().isLinkedCard()) Utils.goCardId(this.data().linkedId); + else if (this.data().isLinkedBoard()) + Utils.goBoardId(this.data().linkedId); + }, }, - }]; + ]; }, }).register('minicard'); diff --git a/client/components/cards/subtasks.js b/client/components/cards/subtasks.js index 1651d449..fab860bb 100644 --- a/client/components/cards/subtasks.js +++ b/client/components/cards/subtasks.js @@ -1,11 +1,14 @@ BlazeComponent.extendComponent({ canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }).register('subtaskDetail'); BlazeComponent.extendComponent({ - addSubtask(event) { event.preventDefault(); const textarea = this.find('textarea.js-add-subtask-item'); @@ -38,9 +41,10 @@ BlazeComponent.extendComponent({ // See https://github.com/wekan/wekan/issues/80 Filter.addException(_id); - setTimeout(() => { - this.$('.add-subtask-item').last().click(); + this.$('.add-subtask-item') + .last() + .click(); }, 100); } textarea.value = ''; @@ -48,7 +52,11 @@ BlazeComponent.extendComponent({ }, canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, deleteSubtask() { @@ -85,13 +93,13 @@ BlazeComponent.extendComponent({ events() { const events = { 'click .toggle-delete-subtask-dialog'(event) { - if($(event.target).hasClass('js-delete-subtask')){ + if ($(event.target).hasClass('js-delete-subtask')) { this.subtaskToDelete = this.currentData().subtask; //Store data context } this.toggleDeleteDialog.set(!this.toggleDeleteDialog.get()); }, 'click .js-view-subtask'(event) { - if($(event.target).hasClass('js-view-subtask')){ + if ($(event.target).hasClass('js-view-subtask')) { const subtask = this.currentData().subtask; const board = subtask.board(); FlowRouter.go('card', { @@ -103,27 +111,33 @@ BlazeComponent.extendComponent({ }, }; - return [{ - ...events, - 'submit .js-add-subtask': this.addSubtask, - 'submit .js-edit-subtask-title': this.editSubtask, - 'click .confirm-subtask-delete': this.deleteSubtask, - keydown: this.pressKey, - }]; + return [ + { + ...events, + 'submit .js-add-subtask': this.addSubtask, + 'submit .js-edit-subtask-title': this.editSubtask, + 'click .confirm-subtask-delete': this.deleteSubtask, + keydown: this.pressKey, + }, + ]; }, }).register('subtasks'); Template.subtaskDeleteDialog.onCreated(() => { const $cardDetails = this.$('.card-details'); - this.scrollState = { position: $cardDetails.scrollTop(), //save current scroll position + this.scrollState = { + position: $cardDetails.scrollTop(), //save current scroll position top: false, //required for smooth scroll animation }; //Callback's purpose is to only prevent scrolling after animation is complete - $cardDetails.animate({ scrollTop: 0 }, 500, () => { this.scrollState.top = true; }); + $cardDetails.animate({ scrollTop: 0 }, 500, () => { + this.scrollState.top = true; + }); //Prevent scrolling while dialog is open $cardDetails.on('scroll', () => { - if(this.scrollState.top) { //If it's already in position, keep it there. Otherwise let animation scroll + if (this.scrollState.top) { + //If it's already in position, keep it there. Otherwise let animation scroll $cardDetails.scrollTop(0); } }); @@ -132,12 +146,16 @@ Template.subtaskDeleteDialog.onCreated(() => { Template.subtaskDeleteDialog.onDestroyed(() => { const $cardDetails = this.$('.card-details'); $cardDetails.off('scroll'); //Reactivate scrolling - $cardDetails.animate( { scrollTop: this.scrollState.position }); + $cardDetails.animate({ scrollTop: this.scrollState.position }); }); Template.subtaskItemDetail.helpers({ canModifyCard() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); diff --git a/client/components/import/import.js b/client/components/import/import.js index 64170c1d..62c7e525 100644 --- a/client/components/import/import.js +++ b/client/components/import/import.js @@ -56,7 +56,7 @@ BlazeComponent.extendComponent({ const membersMapping = this.membersToMap.get(); if (membersMapping) { const mappingById = {}; - membersMapping.forEach((member) => { + membersMapping.forEach(member => { if (member.wekanId) { mappingById[member.id] = member.wekanId; } @@ -64,7 +64,8 @@ BlazeComponent.extendComponent({ additionalData.membersMapping = mappingById; } this.membersToMap.set([]); - Meteor.call('importBoard', + Meteor.call( + 'importBoard', this.importedData.get(), additionalData, this.importSource, @@ -76,7 +77,7 @@ BlazeComponent.extendComponent({ Session.set('fromBoard', null); Utils.goBoardId(res); } - } + }, ); }, @@ -84,12 +85,12 @@ BlazeComponent.extendComponent({ const importSource = Session.get('importSource'); let membersToMap; switch (importSource) { - case 'trello': - membersToMap = trelloMembersMapper.getMembersToMap(dataObject); - break; - case 'wekan': - membersToMap = wekanMembersMapper.getMembersToMap(dataObject); - break; + case 'trello': + membersToMap = trelloMembersMapper.getMembersToMap(dataObject); + break; + case 'wekan': + membersToMap = wekanMembersMapper.getMembersToMap(dataObject); + break; } return membersToMap; }, @@ -109,22 +110,26 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - submit(evt) { - return this.parentComponent().importData(evt); + return [ + { + submit(evt) { + return this.parentComponent().importData(evt); + }, }, - }]; + ]; }, }).register('importTextarea'); BlazeComponent.extendComponent({ onCreated() { this.autorun(() => { - this.parentComponent().membersToMap.get().forEach(({ wekanId }) => { - if (wekanId) { - this.subscribe('user-miniprofile', wekanId); - } - }); + this.parentComponent() + .membersToMap.get() + .forEach(({ wekanId }) => { + if (wekanId) { + this.subscribe('user-miniprofile', wekanId); + } + }); }); }, @@ -149,23 +154,23 @@ BlazeComponent.extendComponent({ _setPropertyForMember(property, value, memberId, unset = false) { const listOfMembers = this.members(); let finder = null; - if(memberId) { - finder = (member) => member.id === memberId; + if (memberId) { + finder = member => member.id === memberId; } else { - finder = (member) => member.selected; + finder = member => member.selected; } - listOfMembers.forEach((member) => { - if(finder(member)) { - if(value !== null) { + listOfMembers.forEach(member => { + if (finder(member)) { + if (value !== null) { member[property] = value; } else { delete member[property]; } - if(!unset) { + if (!unset) { // we shortcut if we don't care about unsetting the others return false; } - } else if(unset) { + } else if (unset) { delete member[property]; } return true; @@ -186,9 +191,9 @@ BlazeComponent.extendComponent({ const allMembers = this.members(); let finder = null; if (memberId) { - finder = (user) => user.id === memberId; + finder = user => user.id === memberId; } else { - finder = (user) => user.selected; + finder = user => user.selected; } return allMembers.find(finder); }, @@ -197,7 +202,7 @@ BlazeComponent.extendComponent({ return this._setPropertyForMember('wekanId', wekanId, null); }, - unmapMember(memberId){ + unmapMember(memberId) { return this._setPropertyForMember('wekanId', null, memberId); }, @@ -208,7 +213,7 @@ BlazeComponent.extendComponent({ onMapMember(evt) { const memberToMap = this.currentData(); - if(memberToMap.wekan) { + if (memberToMap.wekan) { // todo xxx ask for confirmation? this.unmapMember(memberToMap.id); } else { @@ -218,10 +223,12 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'submit': this.onSubmit, - 'click .js-select-member': this.onMapMember, - }]; + return [ + { + submit: this.onSubmit, + 'click .js-select-member': this.onMapMember, + }, + ]; }, }).register('importMapMembers'); @@ -230,14 +237,16 @@ BlazeComponent.extendComponent({ this.find('.js-map-member input').focus(); }, - onSelectUser(){ + onSelectUser() { Popup.getOpenerComponent().mapSelectedMember(this.currentData()._id); Popup.back(); }, events() { - return [{ - 'click .js-select-import': this.onSelectUser, - }]; + return [ + { + 'click .js-select-import': this.onSelectUser, + }, + ]; }, }).register('importMapMembersAddPopup'); diff --git a/client/components/import/trelloMembersMapper.js b/client/components/import/trelloMembersMapper.js index 0f353bf1..b5d59d93 100644 --- a/client/components/import/trelloMembersMapper.js +++ b/client/components/import/trelloMembersMapper.js @@ -4,7 +4,7 @@ export function getMembersToMap(data) { // imported member const membersToMap = data.members; // auto-map based on username - membersToMap.forEach((importedMember) => { + membersToMap.forEach(importedMember => { const wekanUser = Users.findOne({ username: importedMember.username }); if (wekanUser) { importedMember.wekanId = wekanUser._id; diff --git a/client/components/import/wekanMembersMapper.js b/client/components/import/wekanMembersMapper.js index f4c110f7..8db3aacd 100644 --- a/client/components/import/wekanMembersMapper.js +++ b/client/components/import/wekanMembersMapper.js @@ -5,10 +5,10 @@ export function getMembersToMap(data) { const membersToMap = data.members; const users = data.users; // auto-map based on username - membersToMap.forEach((importedMember) => { + membersToMap.forEach(importedMember => { importedMember.id = importedMember.userId; delete importedMember.userId; - const user = users.filter((user) => { + const user = users.filter(user => { return user._id === importedMember.id; })[0]; if (user.profile && user.profile.fullname) { diff --git a/client/components/lists/list.js b/client/components/lists/list.js index ea0068eb..c2b39be9 100644 --- a/client/components/lists/list.js +++ b/client/components/lists/list.js @@ -21,14 +21,18 @@ BlazeComponent.extendComponent({ const boardComponent = this.parentComponent().parentComponent(); function userIsMember() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); } const itemsSelector = '.js-minicard:not(.placeholder, .js-card-composer)'; const $cards = this.$('.js-minicards'); - if(window.matchMedia('(max-width: 1199px)').matches) { - $( '.js-minicards' ).sortable({ + if (window.matchMedia('(max-width: 1199px)').matches) { + $('.js-minicards').sortable({ handle: '.handle', }); } @@ -42,10 +46,16 @@ BlazeComponent.extendComponent({ if (MultiSelection.isActive()) { const andNOthers = $cards.find('.js-minicard.is-checked').length - 1; if (andNOthers > 0) { - helper.append($(Blaze.toHTML(HTML.DIV( - { 'class': 'and-n-other' }, - TAPi18n.__('and-n-other-card', { count: andNOthers }) - )))); + helper.append( + $( + Blaze.toHTML( + HTML.DIV( + { class: 'and-n-other' }, + TAPi18n.__('and-n-other-card', { count: andNOthers }), + ), + ), + ), + ); } } return helper; @@ -70,9 +80,16 @@ BlazeComponent.extendComponent({ const currentBoard = Boards.findOne(Session.get('currentBoard')); let swimlaneId = ''; const boardView = (Meteor.user().profile || {}).boardView; - if (boardView === 'board-view-swimlanes' || currentBoard.isTemplatesBoard()) + if ( + boardView === 'board-view-swimlanes' || + currentBoard.isTemplatesBoard() + ) swimlaneId = Blaze.getData(ui.item.parents('.swimlane').get(0))._id; - else if ((boardView === 'board-view-lists') || (boardView === 'board-view-cal') || !boardView) + else if ( + boardView === 'board-view-lists' || + boardView === 'board-view-cal' || + !boardView + ) swimlaneId = currentBoard.getDefaultSwimline()._id; // Normally the jquery-ui sortable library moves the dragged DOM element @@ -86,7 +103,12 @@ BlazeComponent.extendComponent({ if (MultiSelection.isActive()) { Cards.find(MultiSelection.getMongoSelector()).forEach((card, i) => { - card.move(currentBoard._id, swimlaneId, listId, sortIndex.base + i * sortIndex.increment); + card.move( + currentBoard._id, + swimlaneId, + listId, + sortIndex.base + i * sortIndex.increment, + ); }); } else { const cardDomElement = ui.item.get(0); 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'); diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index 923d6063..e8a82499 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -6,12 +6,18 @@ Meteor.startup(() => { BlazeComponent.extendComponent({ canSeeAddCard() { const list = Template.currentData(); - return !list.getWipLimit('enabled') || list.getWipLimit('soft') || !this.reachedWipLimit(); - }, - - editTitle(evt) { - evt.preventDefault(); - const newTitle = this.childComponents('inlinedForm')[0].getValue().trim(); + return ( + !list.getWipLimit('enabled') || + list.getWipLimit('soft') || + !this.reachedWipLimit() + ); + }, + + editTitle(event) { + event.preventDefault(); + const newTitle = this.childComponents('inlinedForm')[0] + .getValue() + .trim(); const list = this.currentData(); if (newTitle) { list.rename(newTitle.trim()); @@ -32,14 +38,19 @@ BlazeComponent.extendComponent({ let swimlaneId = ''; const boardView = (Meteor.user().profile || {}).boardView; if (boardView === 'board-view-swimlanes') - swimlaneId = this.parentComponent().parentComponent().data()._id; + swimlaneId = this.parentComponent() + .parentComponent() + .data()._id; return list.cards(swimlaneId).count(); }, reachedWipLimit() { const list = Template.currentData(); - return list.getWipLimit('enabled') && list.getWipLimit('value') <= list.cards().count(); + return ( + list.getWipLimit('enabled') && + list.getWipLimit('value') <= list.cards().count() + ); }, showCardsCountForList(count) { @@ -48,20 +59,24 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-open-list-menu': Popup.open('listAction'), - 'click .js-add-card' (evt) { - const listDom = $(evt.target).parents(`#js-list-${this.currentData()._id}`)[0]; - const listComponent = BlazeComponent.getComponentForElement(listDom); - listComponent.openForm({ - position: 'top', - }); + return [ + { + 'click .js-open-list-menu': Popup.open('listAction'), + 'click .js-add-card'(event) { + const listDom = $(event.target).parents( + `#js-list-${this.currentData()._id}`, + )[0]; + const listComponent = BlazeComponent.getComponentForElement(listDom); + listComponent.openForm({ + position: 'top', + }); + }, + 'click .js-unselect-list'() { + Session.set('currentList', null); + }, + submit: this.editTitle, }, - 'click .js-unselect-list'() { - Session.set('currentList', null); - }, - submit: this.editTitle, - }]; + ]; }, }).register('listHeader'); @@ -76,22 +91,22 @@ Template.listActionPopup.helpers({ }); Template.listActionPopup.events({ - 'click .js-list-subscribe' () {}, + 'click .js-list-subscribe'() {}, 'click .js-set-color-list': Popup.open('setListColor'), - 'click .js-select-cards' () { - const cardIds = this.allCards().map((card) => card._id); + 'click .js-select-cards'() { + const cardIds = this.allCards().map(card => card._id); MultiSelection.add(cardIds); Popup.close(); }, - 'click .js-toggle-watch-list' () { + 'click .js-toggle-watch-list'() { const currentList = this; const level = currentList.findWatcher(Meteor.userId()) ? null : 'watching'; Meteor.call('watch', 'list', currentList._id, level, (err, ret) => { if (!err && ret) Popup.close(); }); }, - 'click .js-close-list' (evt) { - evt.preventDefault(); + 'click .js-close-list'(event) { + event.preventDefault(); this.archive(); Popup.close(); }, @@ -102,10 +117,17 @@ Template.listActionPopup.events({ BlazeComponent.extendComponent({ applyWipLimit() { const list = Template.currentData(); - const limit = parseInt(Template.instance().$('.wip-limit-value').val(), 10); - - if(limit < list.cards().count() && !list.getWipLimit('soft')){ - Template.instance().$('.wip-limit-error').click(); + const limit = parseInt( + Template.instance() + .$('.wip-limit-value') + .val(), + 10, + ); + + if (limit < list.cards().count() && !list.getWipLimit('soft')) { + Template.instance() + .$('.wip-limit-error') + .click(); } else { Meteor.call('applyWipLimit', list._id, limit); Popup.back(); @@ -115,7 +137,10 @@ BlazeComponent.extendComponent({ enableSoftLimit() { const list = Template.currentData(); - if(list.getWipLimit('soft') && list.getWipLimit('value') < list.cards().count()){ + if ( + list.getWipLimit('soft') && + list.getWipLimit('value') < list.cards().count() + ) { list.setWipLimit(list.cards().count()); } Meteor.call('enableSoftLimit', Template.currentData()._id); @@ -124,7 +149,10 @@ BlazeComponent.extendComponent({ enableWipLimit() { const list = Template.currentData(); // Prevent user from using previously stored wipLimit.value if it is less than the current number of cards in the list - if(!list.getWipLimit('enabled') && list.getWipLimit('value') < list.cards().count()){ + if ( + !list.getWipLimit('enabled') && + list.getWipLimit('value') < list.cards().count() + ) { list.setWipLimit(list.cards().count()); } Meteor.call('enableWipLimit', list._id); @@ -138,24 +166,26 @@ BlazeComponent.extendComponent({ return Template.currentData().getWipLimit('enabled'); }, - wipLimitValue(){ + wipLimitValue() { return Template.currentData().getWipLimit('value'); }, events() { - return [{ - 'click .js-enable-wip-limit': this.enableWipLimit, - 'click .wip-limit-apply': this.applyWipLimit, - 'click .wip-limit-error': Popup.open('wipLimitError'), - 'click .materialCheckBox': this.enableSoftLimit, - }]; + return [ + { + 'click .js-enable-wip-limit': this.enableWipLimit, + 'click .wip-limit-apply': this.applyWipLimit, + 'click .wip-limit-error': Popup.open('wipLimitError'), + 'click .materialCheckBox': this.enableSoftLimit, + }, + ]; }, }).register('setWipLimitPopup'); Template.listMorePopup.events({ - 'click .js-delete': Popup.afterConfirm('listDelete', function () { + 'click .js-delete': Popup.afterConfirm('listDelete', function() { Popup.close(); - this.allCards().map((card) => Cards.remove(card._id)); + this.allCards().map(card => Cards.remove(card._id)); Lists.remove(this._id); Utils.goBoardId(this.boardId); }), @@ -168,7 +198,7 @@ BlazeComponent.extendComponent({ }, colors() { - return listsColors.map((color) => ({ color, name: '' })); + return listsColors.map(color => ({ color, name: '' })); }, isSelected(color) { @@ -176,18 +206,20 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-palette-color'() { - this.currentColor.set(this.currentData().color); - }, - 'click .js-submit' () { - this.currentList.setColor(this.currentColor.get()); - Popup.close(); - }, - 'click .js-remove-color'() { - this.currentList.setColor(null); - Popup.close(); + return [ + { + 'click .js-palette-color'() { + this.currentColor.set(this.currentData().color); + }, + 'click .js-submit'() { + this.currentList.setColor(this.currentColor.get()); + Popup.close(); + }, + 'click .js-remove-color'() { + this.currentList.setColor(null); + Popup.close(); + }, }, - }]; + ]; }, }).register('setListColorPopup'); diff --git a/client/components/main/editor.js b/client/components/main/editor.js index 88d8abf0..2824723d 100755 --- a/client/components/main/editor.js +++ b/client/components/main/editor.js @@ -9,10 +9,15 @@ Template.editor.onRendered(() => { match: /\B@([\w.]*)$/, search(term, callback) { const currentBoard = Boards.findOne(Session.get('currentBoard')); - callback(currentBoard.activeMembers().map((member) => { - const username = Users.findOne(member.userId).username; - return username.includes(term) ? username : null; - }).filter(Boolean)); + callback( + currentBoard + .activeMembers() + .map(member => { + const username = Users.findOne(member.userId).username; + return username.includes(term) ? username : null; + }) + .filter(Boolean), + ); }, template(value) { return value; @@ -33,69 +38,73 @@ import sanitizeXss from 'xss'; // compiled version to most users -- who don't need to edit. // In the meantime, all the transformation are done on the client using the // Blaze API. -const at = HTML.CharRef({html: '@', str: '@'}); -Blaze.Template.registerHelper('mentions', new Template('mentions', function() { - const view = this; - let content = Blaze.toHTML(view.templateContentBlock); - const currentBoard = Boards.findOne(Session.get('currentBoard')); - if (!currentBoard) - return HTML.Raw(sanitizeXss(content)); - const knowedUsers = currentBoard.members.map((member) => { - const u = Users.findOne(member.userId); - if(u){ - member.username = u.username; - } - return member; - }); - const mentionRegex = /\B@([\w.]*)/gi; +const at = HTML.CharRef({ html: '@', str: '@' }); +Blaze.Template.registerHelper( + 'mentions', + new Template('mentions', function() { + const view = this; + let content = Blaze.toHTML(view.templateContentBlock); + const currentBoard = Boards.findOne(Session.get('currentBoard')); + if (!currentBoard) return HTML.Raw(sanitizeXss(content)); + const knowedUsers = currentBoard.members.map(member => { + const u = Users.findOne(member.userId); + if (u) { + member.username = u.username; + } + return member; + }); + const mentionRegex = /\B@([\w.]*)/gi; - let currentMention; - while ((currentMention = mentionRegex.exec(content)) !== null) { - const [fullMention, username] = currentMention; - const knowedUser = _.findWhere(knowedUsers, { username }); - if (!knowedUser) { - continue; - } + let currentMention; + while ((currentMention = mentionRegex.exec(content)) !== null) { + const [fullMention, username] = currentMention; + const knowedUser = _.findWhere(knowedUsers, { username }); + if (!knowedUser) { + continue; + } - const linkValue = [' ', at, knowedUser.username]; - let linkClass = 'atMention js-open-member'; - if (knowedUser.userId === Meteor.userId()) { - linkClass += ' me'; - } - const link = HTML.A({ - 'class': linkClass, - // XXX Hack. Since we stringify this render function result below with - // `Blaze.toHTML` we can't rely on blaze data contexts to pass the - // `userId` to the popup as usual, and we need to store it in the DOM - // using a data attribute. - 'data-userId': knowedUser.userId, - }, linkValue); + const linkValue = [' ', at, knowedUser.username]; + let linkClass = 'atMention js-open-member'; + if (knowedUser.userId === Meteor.userId()) { + linkClass += ' me'; + } + const link = HTML.A( + { + class: linkClass, + // XXX Hack. Since we stringify this render function result below with + // `Blaze.toHTML` we can't rely on blaze data contexts to pass the + // `userId` to the popup as usual, and we need to store it in the DOM + // using a data attribute. + 'data-userId': knowedUser.userId, + }, + linkValue, + ); - content = content.replace(fullMention, Blaze.toHTML(link)); - } + content = content.replace(fullMention, Blaze.toHTML(link)); + } - return HTML.Raw(sanitizeXss(content)); -})); + return HTML.Raw(sanitizeXss(content)); + }), +); Template.viewer.events({ // Viewer sometimes have click-able wrapper around them (for instance to edit // the corresponding text). Clicking a link shouldn't fire these actions, stop // we stop these event at the viewer component level. - 'click a'(evt, tpl) { - evt.stopPropagation(); + 'click a'(event, templateInstance) { + event.stopPropagation(); // XXX We hijack the build-in browser action because we currently don't have // `_blank` attributes in viewer links, and the transformer function is // handled by a third party package that we can't configure easily. Fix that // by using directly `_blank` attribute in the rendered HTML. - evt.preventDefault(); + event.preventDefault(); - const userId = evt.currentTarget.dataset.userid; + const userId = event.currentTarget.dataset.userid; if (userId) { - Popup.open('member').call({ userId }, evt, tpl); - } - else { - const href = evt.currentTarget.href; + Popup.open('member').call({ userId }, event, templateInstance); + } else { + const href = event.currentTarget.href; if (href) { window.open(href, '_blank'); } diff --git a/client/components/main/header.js b/client/components/main/header.js index c05b1c3c..957a1285 100644 --- a/client/components/main/header.js +++ b/client/components/main/header.js @@ -20,13 +20,13 @@ Template.header.helpers({ }, hasAnnouncement() { - const announcements = Announcements.findOne(); + const announcements = Announcements.findOne(); return announcements && announcements.enabled; }, announcement() { $('.announcement').show(); - const announcements = Announcements.findOne(); + const announcements = Announcements.findOne(); return announcements && announcements.body; }, }); diff --git a/client/components/main/layouts.js b/client/components/main/layouts.js index fe51a7d6..ec4a35cc 100644 --- a/client/components/main/layouts.js +++ b/client/components/main/layouts.js @@ -1,6 +1,6 @@ BlazeLayout.setRoot('body'); -const i18nTagToT9n = (i18nTag) => { +const i18nTagToT9n = i18nTag => { // t9n/i18n tags are same now, see: https://github.com/softwarerero/meteor-accounts-t9n/pull/129 // but we keep this conversion function here, to be aware that that they are different system. return i18nTag; @@ -21,20 +21,23 @@ const validator = { }; Template.userFormsLayout.onCreated(function() { - const instance = this; - instance.currentSetting = new ReactiveVar(); - instance.isLoading = new ReactiveVar(false); + const templateInstance = this; + templateInstance.currentSetting = new ReactiveVar(); + templateInstance.isLoading = new ReactiveVar(false); Meteor.subscribe('setting', { onReady() { - instance.currentSetting.set(Settings.findOne()); + templateInstance.currentSetting.set(Settings.findOne()); return this.stop(); }, }); }); Template.userFormsLayout.onRendered(() => { - AccountsTemplates.state.form.keys = new Proxy(AccountsTemplates.state.form.keys, validator); + AccountsTemplates.state.form.keys = new Proxy( + AccountsTemplates.state.form.keys, + validator, + ); const i18nTag = navigator.language; if (i18nTag) { @@ -89,18 +92,17 @@ Template.userFormsLayout.helpers({ }); Template.userFormsLayout.events({ - 'change .js-userform-set-language'(evt) { - const i18nTag = $(evt.currentTarget).val(); + 'change .js-userform-set-language'(event) { + const i18nTag = $(event.currentTarget).val(); T9n.setLanguage(i18nTagToT9n(i18nTag)); - evt.preventDefault(); + event.preventDefault(); }, - 'click #at-btn'(event, instance) { + 'click #at-btn'(event, templateInstance) { if (FlowRouter.getRouteName() === 'atSignIn') { - instance.isLoading.set(true); - authentication(event, instance) - .then(() => { - instance.isLoading.set(false); - }); + templateInstance.isLoading.set(true); + authentication(event, templateInstance).then(() => { + templateInstance.isLoading.set(false); + }); } }, }); @@ -111,13 +113,16 @@ Template.defaultLayout.events({ }, }); -async function authentication(event, instance) { +async function authentication(event, templateInstance) { const match = $('#at-field-username_and_email').val(); const password = $('#at-field-password').val(); if (!match || !password) return undefined; - const result = await getAuthenticationMethod(instance.currentSetting.get(), match); + const result = await getAuthenticationMethod( + templateInstance.currentSetting.get(), + match, + ); if (result === 'password') return undefined; @@ -126,26 +131,29 @@ async function authentication(event, instance) { event.stopImmediatePropagation(); switch (result) { - case 'ldap': - return new Promise((resolve) => { - Meteor.loginWithLDAP(match, password, function() { - resolve(FlowRouter.go('/')); + case 'ldap': + return new Promise(resolve => { + Meteor.loginWithLDAP(match, password, function() { + resolve(FlowRouter.go('/')); + }); }); - }); - case 'cas': - return new Promise((resolve) => { - Meteor.loginWithCas(match, password, function() { - resolve(FlowRouter.go('/')); + case 'cas': + return new Promise(resolve => { + Meteor.loginWithCas(match, password, function() { + resolve(FlowRouter.go('/')); + }); }); - }); - default: - return undefined; + default: + return undefined; } } -function getAuthenticationMethod({displayAuthenticationMethod, defaultAuthenticationMethod}, match) { +function getAuthenticationMethod( + { displayAuthenticationMethod, defaultAuthenticationMethod }, + match, +) { if (displayAuthenticationMethod) { return $('.select-authentication').val(); } @@ -153,7 +161,7 @@ function getAuthenticationMethod({displayAuthenticationMethod, defaultAuthentica } function getUserAuthenticationMethod(defaultAuthenticationMethod, match) { - return new Promise((resolve) => { + return new Promise(resolve => { try { Meteor.subscribe('user-authenticationMethod', match, { onReady() { @@ -166,7 +174,7 @@ function getUserAuthenticationMethod(defaultAuthenticationMethod, match) { resolve(authenticationMethod); }, }); - } catch(error) { + } catch (error) { resolve(defaultAuthenticationMethod); } }); diff --git a/client/components/mixins/infiniteScrolling.js b/client/components/mixins/infiniteScrolling.js index eb02b76f..722774c4 100644 --- a/client/components/mixins/infiniteScrolling.js +++ b/client/components/mixins/infiniteScrolling.js @@ -18,15 +18,17 @@ Mixins.InfiniteScrolling = BlazeComponent.extendComponent({ }, events() { - return [{ - scroll(evt) { - const domElement = evt.currentTarget; - let altitude = domElement.scrollTop + domElement.offsetHeight; - altitude += peakAnticipation; - if (altitude >= this.callFirstWith(null, 'getNextPeak')) { - this.mixinParent().callFirstWith(null, 'reachNextPeak'); - } + return [ + { + scroll(evt) { + const domElement = evt.currentTarget; + let altitude = domElement.scrollTop + domElement.offsetHeight; + altitude += peakAnticipation; + if (altitude >= this.callFirstWith(null, 'getNextPeak')) { + this.mixinParent().callFirstWith(null, 'reachNextPeak'); + } + }, }, - }]; + ]; }, }); diff --git a/client/components/rules/actions/boardActions.js b/client/components/rules/actions/boardActions.js index e0b8edc9..8568d2bf 100644 --- a/client/components/rules/actions/boardActions.js +++ b/client/components/rules/actions/boardActions.js @@ -1,68 +1,23 @@ BlazeComponent.extendComponent({ - onCreated() { - - }, + onCreated() {}, events() { - return [{ - 'click .js-create-card-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const cardName = this.find('#card-name').value; - const listName = this.find('#list-name').value; - const swimlaneName = this.find('#swimlane-name2').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'createCard', - swimlaneName, - cardName, - listName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - - }, - 'click .js-add-swimlane-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const swimlaneName = this.find('#swimlane-name').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'addSwimlane', - swimlaneName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - - }, - 'click .js-add-spec-move-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#move-spec-action').value; - const listTitle = this.find('#listName').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'top') { + return [ + { + 'click .js-create-card-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const cardName = this.find('#card-name').value; + const listName = this.find('#list-name').value; + const swimlaneName = this.find('#swimlane-name2').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); const triggerId = Triggers.insert(trigger); const actionId = Actions.insert({ - actionType: 'moveCardToTop', - listTitle, + actionType: 'createCard', + swimlaneName, + cardName, + listName, boardId, desc, }); @@ -72,12 +27,17 @@ BlazeComponent.extendComponent({ actionId, boardId, }); - } - if (actionSelected === 'bottom') { + }, + 'click .js-add-swimlane-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const swimlaneName = this.find('#swimlane-name').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); const triggerId = Triggers.insert(trigger); const actionId = Actions.insert({ - actionType: 'moveCardToBottom', - listTitle, + actionType: 'addSwimlane', + swimlaneName, boardId, desc, }); @@ -87,82 +47,119 @@ BlazeComponent.extendComponent({ actionId, boardId, }); - } + }, + 'click .js-add-spec-move-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#move-spec-action').value; + const listTitle = this.find('#listName').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'top') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'moveCardToTop', + listTitle, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'bottom') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'moveCardToBottom', + listTitle, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-gen-move-action'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const boardId = Session.get('currentBoard'); + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#move-gen-action').value; + if (actionSelected === 'top') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'moveCardToTop', + listTitle: '*', + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'bottom') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'moveCardToBottom', + listTitle: '*', + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-arch-action'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const boardId = Session.get('currentBoard'); + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#arch-action').value; + if (actionSelected === 'archive') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'archive', + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'unarchive') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'unarchive', + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, }, - 'click .js-add-gen-move-action' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const boardId = Session.get('currentBoard'); - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#move-gen-action').value; - if (actionSelected === 'top') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'moveCardToTop', - 'listTitle': '*', - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - if (actionSelected === 'bottom') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'moveCardToBottom', - 'listTitle': '*', - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - }, - 'click .js-add-arch-action' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const boardId = Session.get('currentBoard'); - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#arch-action').value; - if (actionSelected === 'archive') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'archive', - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - if (actionSelected === 'unarchive') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'unarchive', - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - }, - }]; + ]; }, - }).register('boardActions'); /* eslint-no-undef */ diff --git a/client/components/rules/actions/cardActions.js b/client/components/rules/actions/cardActions.js index d6e11eea..7dc6c2b5 100644 --- a/client/components/rules/actions/cardActions.js +++ b/client/components/rules/actions/cardActions.js @@ -14,7 +14,7 @@ BlazeComponent.extendComponent({ }, cardColorButtonText() { - return `color-${ this.cardColorButtonValue.get() }`; + return `color-${this.cardColorButtonValue.get()}`; }, labels() { @@ -28,106 +28,143 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-set-date-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const triggerId = Triggers.insert(trigger); - const actionSelected = this.find('#setdate-action').value; - const dateFieldSelected = this.find('#setdate-datefield').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - - const actionId = Actions.insert({ - actionType: actionSelected, - dateField: dateFieldSelected, - boardId, - desc, - }); - - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - desc, - }); - }, - - 'click .js-remove-datevalue-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const triggerId = Triggers.insert(trigger); - const dateFieldSelected = this.find('#setdate-removedatefieldvalue').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - - const actionId = Actions.insert({ - actionType: 'removeDate', - dateField: dateFieldSelected, - boardId, - desc, - }); - - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - desc, - }); - }, - 'click .js-add-label-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#label-action').value; - const labelId = this.find('#label-id').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'add') { + return [ + { + 'click .js-set-date-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); const triggerId = Triggers.insert(trigger); + const actionSelected = this.find('#setdate-action').value; + const dateFieldSelected = this.find('#setdate-datefield').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + const actionId = Actions.insert({ - actionType: 'addLabel', - labelId, + actionType: actionSelected, + dateField: dateFieldSelected, boardId, desc, }); + Rules.insert({ title: ruleName, triggerId, actionId, boardId, + desc, }); - } - if (actionSelected === 'remove') { + }, + + 'click .js-remove-datevalue-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); const triggerId = Triggers.insert(trigger); + const dateFieldSelected = this.find('#setdate-removedatefieldvalue') + .value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + const actionId = Actions.insert({ - actionType: 'removeLabel', - labelId, + actionType: 'removeDate', + dateField: dateFieldSelected, boardId, desc, }); + Rules.insert({ title: ruleName, triggerId, actionId, boardId, + desc, }); - } - - }, - 'click .js-add-member-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#member-action').value; - const username = this.find('#member-name').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'add') { + }, + 'click .js-add-label-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#label-action').value; + const labelId = this.find('#label-id').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'add') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'addLabel', + labelId, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'remove') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'removeLabel', + labelId, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-member-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#member-action').value; + const username = this.find('#member-name').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'add') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'addMember', + username, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + desc, + }); + } + if (actionSelected === 'remove') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'removeMember', + username, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-removeall-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); const triggerId = Triggers.insert(trigger); + const desc = Utils.getTriggerActionDesc(event, this); + const boardId = Session.get('currentBoard'); const actionId = Actions.insert({ - actionType: 'addMember', - username, + actionType: 'removeMember', + username: '*', boardId, desc, }); @@ -136,14 +173,26 @@ BlazeComponent.extendComponent({ triggerId, actionId, boardId, - desc, }); - } - if (actionSelected === 'remove') { + }, + 'click .js-show-color-palette'(event) { + const funct = Popup.open('setCardActionsColor'); + const colorButton = this.find('#color-action'); + if (colorButton.value === '') { + colorButton.value = 'green'; + } + funct.call(this, event); + }, + 'click .js-set-color-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const selectedColor = this.cardColorButtonValue.get(); + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); const triggerId = Triggers.insert(trigger); const actionId = Actions.insert({ - actionType: 'removeMember', - username, + actionType: 'setColor', + selectedColor, boardId, desc, }); @@ -153,58 +202,10 @@ BlazeComponent.extendComponent({ actionId, boardId, }); - } - }, - 'click .js-add-removeall-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const triggerId = Triggers.insert(trigger); - const desc = Utils.getTriggerActionDesc(event, this); - const boardId = Session.get('currentBoard'); - const actionId = Actions.insert({ - actionType: 'removeMember', - 'username': '*', - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - }, - 'click .js-show-color-palette'(event){ - const funct = Popup.open('setCardActionsColor'); - const colorButton = this.find('#color-action'); - if (colorButton.value === '') { - colorButton.value = 'green'; - } - funct.call(this, event); + }, }, - 'click .js-set-color-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const selectedColor = this.cardColorButtonValue.get(); - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'setColor', - selectedColor, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - }, - }]; + ]; }, - }).register('cardActions'); BlazeComponent.extendComponent({ @@ -215,7 +216,7 @@ BlazeComponent.extendComponent({ }, colors() { - return cardColors.map((color) => ({ color, name: '' })); + return cardColors.map(color => ({ color, name: '' })); }, isSelected(color) { @@ -223,14 +224,16 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-palette-color'() { - this.currentColor.set(this.currentData().color); - }, - 'click .js-submit' () { - this.colorButtonValue.set(this.currentColor.get()); - Popup.close(); + return [ + { + 'click .js-palette-color'() { + this.currentColor.set(this.currentData().color); + }, + 'click .js-submit'() { + this.colorButtonValue.set(this.currentColor.get()); + Popup.close(); + }, }, - }]; + ]; }, }).register('setCardActionsColorPopup'); diff --git a/client/components/rules/actions/checklistActions.js b/client/components/rules/actions/checklistActions.js index 3e79b075..64908ab1 100644 --- a/client/components/rules/actions/checklistActions.js +++ b/client/components/rules/actions/checklistActions.js @@ -3,137 +3,20 @@ BlazeComponent.extendComponent({ this.subscribe('allRules'); }, events() { - return [{ - 'click .js-add-checklist-items-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const checklistName = this.find('#checklist-name-3').value; - const checklistItems = this.find('#checklist-items').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'addChecklistWithItems', - checklistName, - checklistItems, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - - }, - 'click .js-add-checklist-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#check-action').value; - const checklistName = this.find('#checklist-name').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'add') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'addChecklist', - checklistName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - if (actionSelected === 'remove') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'removeChecklist', - checklistName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - - }, - 'click .js-add-checkall-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const actionSelected = this.find('#checkall-action').value; - const checklistName = this.find('#checklist-name2').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'check') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'checkAll', - checklistName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - if (actionSelected === 'uncheck') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'uncheckAll', - checklistName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - }, - 'click .js-add-check-item-action' (event) { - const ruleName = this.data().ruleName.get(); - const trigger = this.data().triggerVar.get(); - const checkItemName = this.find('#checkitem-name'); - const checklistName = this.find('#checklist-name3'); - const actionSelected = this.find('#check-item-action').value; - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - if (actionSelected === 'check') { - const triggerId = Triggers.insert(trigger); - const actionId = Actions.insert({ - actionType: 'checkItem', - checklistName, - checkItemName, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); - } - if (actionSelected === 'uncheck') { + return [ + { + 'click .js-add-checklist-items-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const checklistName = this.find('#checklist-name-3').value; + const checklistItems = this.find('#checklist-items').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); const triggerId = Triggers.insert(trigger); const actionId = Actions.insert({ - actionType: 'uncheckItem', + actionType: 'addChecklistWithItems', checklistName, - checkItemName, + checklistItems, boardId, desc, }); @@ -143,9 +26,125 @@ BlazeComponent.extendComponent({ actionId, boardId, }); - } + }, + 'click .js-add-checklist-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#check-action').value; + const checklistName = this.find('#checklist-name').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'add') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'addChecklist', + checklistName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'remove') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'removeChecklist', + checklistName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-checkall-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const actionSelected = this.find('#checkall-action').value; + const checklistName = this.find('#checklist-name2').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'check') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'checkAll', + checklistName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'uncheck') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'uncheckAll', + checklistName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, + 'click .js-add-check-item-action'(event) { + const ruleName = this.data().ruleName.get(); + const trigger = this.data().triggerVar.get(); + const checkItemName = this.find('#checkitem-name'); + const checklistName = this.find('#checklist-name3'); + const actionSelected = this.find('#check-item-action').value; + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + if (actionSelected === 'check') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'checkItem', + checklistName, + checkItemName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + if (actionSelected === 'uncheck') { + const triggerId = Triggers.insert(trigger); + const actionId = Actions.insert({ + actionType: 'uncheckItem', + checklistName, + checkItemName, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + } + }, }, - }]; + ]; }, - }).register('checklistActions'); diff --git a/client/components/rules/actions/mailActions.js b/client/components/rules/actions/mailActions.js index 40cbc280..87cb925c 100644 --- a/client/components/rules/actions/mailActions.js +++ b/client/components/rules/actions/mailActions.js @@ -1,35 +1,34 @@ BlazeComponent.extendComponent({ - onCreated() { - - }, + onCreated() {}, events() { - return [{ - 'click .js-mail-action' (event) { - const emailTo = this.find('#email-to').value; - const emailSubject = this.find('#email-subject').value; - const emailMsg = this.find('#email-msg').value; - const trigger = this.data().triggerVar.get(); - const ruleName = this.data().ruleName.get(); - const triggerId = Triggers.insert(trigger); - const boardId = Session.get('currentBoard'); - const desc = Utils.getTriggerActionDesc(event, this); - const actionId = Actions.insert({ - actionType: 'sendEmail', - emailTo, - emailSubject, - emailMsg, - boardId, - desc, - }); - Rules.insert({ - title: ruleName, - triggerId, - actionId, - boardId, - }); + return [ + { + 'click .js-mail-action'(event) { + const emailTo = this.find('#email-to').value; + const emailSubject = this.find('#email-subject').value; + const emailMsg = this.find('#email-msg').value; + const trigger = this.data().triggerVar.get(); + const ruleName = this.data().ruleName.get(); + const triggerId = Triggers.insert(trigger); + const boardId = Session.get('currentBoard'); + const desc = Utils.getTriggerActionDesc(event, this); + const actionId = Actions.insert({ + actionType: 'sendEmail', + emailTo, + emailSubject, + emailMsg, + boardId, + desc, + }); + Rules.insert({ + title: ruleName, + triggerId, + actionId, + boardId, + }); + }, }, - }]; + ]; }, - }).register('mailActions'); diff --git a/client/components/rules/ruleDetails.js b/client/components/rules/ruleDetails.js index 17c86dc3..f0e13de3 100644 --- a/client/components/rules/ruleDetails.js +++ b/client/components/rules/ruleDetails.js @@ -3,7 +3,6 @@ BlazeComponent.extendComponent({ this.subscribe('allRules'); this.subscribe('allTriggers'); this.subscribe('allActions'); - }, trigger() { @@ -34,5 +33,4 @@ BlazeComponent.extendComponent({ events() { return [{}]; }, - }).register('ruleDetails'); diff --git a/client/components/rules/rulesActions.js b/client/components/rules/rulesActions.js index 64a5c70e..9b4f3a71 100644 --- a/client/components/rules/rulesActions.js +++ b/client/components/rules/rulesActions.js @@ -40,19 +40,21 @@ BlazeComponent.extendComponent({ // console.log(this.data()); }, events() { - return [{ - 'click .js-set-board-actions'(){ - this.setBoardActions(); + return [ + { + 'click .js-set-board-actions'() { + this.setBoardActions(); + }, + 'click .js-set-card-actions'() { + this.setCardActions(); + }, + 'click .js-set-mail-actions'() { + this.setMailActions(); + }, + 'click .js-set-checklist-actions'() { + this.setChecklistActions(); + }, }, - 'click .js-set-card-actions'() { - this.setCardActions(); - }, - 'click .js-set-mail-actions'() { - this.setMailActions(); - }, - 'click .js-set-checklist-actions'() { - this.setChecklistActions(); - }, - }]; + ]; }, }).register('rulesActions'); diff --git a/client/components/rules/rulesMain.js b/client/components/rules/rulesMain.js index d4af38f4..99091490 100644 --- a/client/components/rules/rulesMain.js +++ b/client/components/rules/rulesMain.js @@ -9,12 +9,12 @@ BlazeComponent.extendComponent({ setTrigger() { this.rulesCurrentTab.set('trigger'); }, - sanitizeObject(obj){ - Object.keys(obj).forEach((key) => { - if(obj[key] === '' || obj[key] === undefined){ + sanitizeObject(obj) { + Object.keys(obj).forEach(key => { + if (obj[key] === '' || obj[key] === undefined) { obj[key] = '*'; - }} - ); + } + }); }, setRulesList() { this.rulesCurrentTab.set('rulesList'); @@ -29,69 +29,73 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-delete-rule' () { - const rule = this.currentData(); - Rules.remove(rule._id); - Actions.remove(rule.actionId); - Triggers.remove(rule.triggerId); - - }, - 'click .js-goto-trigger' (event) { - event.preventDefault(); - const ruleTitle = this.find('#ruleTitle').value; - if(ruleTitle !== undefined && ruleTitle !== ''){ - this.find('#ruleTitle').value = ''; - this.ruleName.set(ruleTitle); - this.setTrigger(); - } - }, - 'click .js-goto-action' (event) { - event.preventDefault(); - // Add user to the trigger - const username = $(event.currentTarget.offsetParent).find('.user-name').val(); - let trigger = this.triggerVar.get(); - trigger.userId = '*'; - if(username !== undefined ){ - const userFound = Users.findOne({username}); - if(userFound !== undefined){ - trigger.userId = userFound._id; - this.triggerVar.set(trigger); + return [ + { + 'click .js-delete-rule'() { + const rule = this.currentData(); + Rules.remove(rule._id); + Actions.remove(rule.actionId); + Triggers.remove(rule.triggerId); + }, + 'click .js-goto-trigger'(event) { + event.preventDefault(); + const ruleTitle = this.find('#ruleTitle').value; + if (ruleTitle !== undefined && ruleTitle !== '') { + this.find('#ruleTitle').value = ''; + this.ruleName.set(ruleTitle); + this.setTrigger(); } - } - // Sanitize trigger - trigger = this.triggerVar.get(); - this.sanitizeObject(trigger); - this.triggerVar.set(trigger); - this.setAction(); - }, - 'click .js-show-user-field' (event) { - event.preventDefault(); - $(event.currentTarget.offsetParent).find('.user-details').removeClass('hide-element'); - }, - 'click .js-goto-rules' (event) { - event.preventDefault(); - this.setRulesList(); - }, - 'click .js-goback' (event) { - event.preventDefault(); - if(this.rulesCurrentTab.get() === 'trigger' || this.rulesCurrentTab.get() === 'ruleDetails' ){ + }, + 'click .js-goto-action'(event) { + event.preventDefault(); + // Add user to the trigger + const username = $(event.currentTarget.offsetParent) + .find('.user-name') + .val(); + let trigger = this.triggerVar.get(); + trigger.userId = '*'; + if (username !== undefined) { + const userFound = Users.findOne({ username }); + if (userFound !== undefined) { + trigger.userId = userFound._id; + this.triggerVar.set(trigger); + } + } + // Sanitize trigger + trigger = this.triggerVar.get(); + this.sanitizeObject(trigger); + this.triggerVar.set(trigger); + this.setAction(); + }, + 'click .js-show-user-field'(event) { + event.preventDefault(); + $(event.currentTarget.offsetParent) + .find('.user-details') + .removeClass('hide-element'); + }, + 'click .js-goto-rules'(event) { + event.preventDefault(); this.setRulesList(); - } - if(this.rulesCurrentTab.get() === 'action'){ - this.setTrigger(); - } - }, - 'click .js-goto-details' (event) { - event.preventDefault(); - const rule = this.currentData(); - this.ruleId.set(rule._id); - this.setRuleDetails(); + }, + 'click .js-goback'(event) { + event.preventDefault(); + if ( + this.rulesCurrentTab.get() === 'trigger' || + this.rulesCurrentTab.get() === 'ruleDetails' + ) { + this.setRulesList(); + } + if (this.rulesCurrentTab.get() === 'action') { + this.setTrigger(); + } + }, + 'click .js-goto-details'(event) { + event.preventDefault(); + const rule = this.currentData(); + this.ruleId.set(rule._id); + this.setRuleDetails(); + }, }, - - }]; + ]; }, - }).register('rulesMain'); - - diff --git a/client/components/rules/rulesTriggers.js b/client/components/rules/rulesTriggers.js index e3c16221..a502fd37 100644 --- a/client/components/rules/rulesTriggers.js +++ b/client/components/rules/rulesTriggers.js @@ -38,16 +38,18 @@ BlazeComponent.extendComponent({ // console.log(this.data()); }, events() { - return [{ - 'click .js-set-board-triggers' () { - this.setBoardTriggers(); + return [ + { + 'click .js-set-board-triggers'() { + this.setBoardTriggers(); + }, + 'click .js-set-card-triggers'() { + this.setCardTriggers(); + }, + 'click .js-set-checklist-triggers'() { + this.setChecklistTriggers(); + }, }, - 'click .js-set-card-triggers' () { - this.setCardTriggers(); - }, - 'click .js-set-checklist-triggers' () { - this.setChecklistTriggers(); - }, - }]; + ]; }, }).register('rulesTriggers'); diff --git a/client/components/rules/triggers/boardTriggers.js b/client/components/rules/triggers/boardTriggers.js index 1dc5c437..66ee337a 100644 --- a/client/components/rules/triggers/boardTriggers.js +++ b/client/components/rules/triggers/boardTriggers.js @@ -4,116 +4,118 @@ BlazeComponent.extendComponent({ this.currentPopupTriggerId = 'def'; this.cardTitleFilters = {}; }, - setNameFilter(name){ - this.cardTitleFilters[this.currentPopupTriggerId] = name; + setNameFilter(name) { + this.cardTitleFilters[this.currentPopupTriggerId] = name; }, events() { - return [{ - 'click .js-open-card-title-popup'(event){ - const funct = Popup.open('boardCardTitle'); - const divId = $(event.currentTarget.parentNode.parentNode).attr('id'); - //console.log('current popup'); - //console.log(this.currentPopupTriggerId); - this.currentPopupTriggerId = divId; - funct.call(this, event); - }, - 'click .js-add-create-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const listName = this.find('#create-list-name').value; - const swimlaneName = this.find('#create-swimlane-name').value; - const boardId = Session.get('currentBoard'); - const divId = $(event.currentTarget.parentNode).attr('id'); - const cardTitle = this.cardTitleFilters[divId]; - // move to generic funciont - datas.triggerVar.set({ - activityType: 'createCard', - boardId, - cardTitle, - swimlaneName, - listName, - desc, - }); - }, - 'click .js-add-moved-trigger' (event) { - const datas = this.data(); - const desc = Utils.getTriggerActionDesc(event, this); - const swimlaneName = this.find('#create-swimlane-name-2').value; - const actionSelected = this.find('#move-action').value; - const listName = this.find('#move-list-name').value; - const boardId = Session.get('currentBoard'); - const divId = $(event.currentTarget.parentNode).attr('id'); - const cardTitle = this.cardTitleFilters[divId]; - if (actionSelected === 'moved-to') { + return [ + { + 'click .js-open-card-title-popup'(event) { + const funct = Popup.open('boardCardTitle'); + const divId = $(event.currentTarget.parentNode.parentNode).attr('id'); + //console.log('current popup'); + //console.log(this.currentPopupTriggerId); + this.currentPopupTriggerId = divId; + funct.call(this, event); + }, + 'click .js-add-create-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const listName = this.find('#create-list-name').value; + const swimlaneName = this.find('#create-swimlane-name').value; + const boardId = Session.get('currentBoard'); + const divId = $(event.currentTarget.parentNode).attr('id'); + const cardTitle = this.cardTitleFilters[divId]; + // move to generic funciont datas.triggerVar.set({ - activityType: 'moveCard', - boardId, - listName, - cardTitle, - swimlaneName, - 'oldListName': '*', - desc, - }); - } - if (actionSelected === 'moved-from') { - datas.triggerVar.set({ - activityType: 'moveCard', + activityType: 'createCard', boardId, cardTitle, swimlaneName, - 'listName': '*', - 'oldListName': listName, + listName, desc, }); - } - }, - 'click .js-add-gen-moved-trigger' (event){ - const datas = this.data(); - const desc = Utils.getTriggerActionDesc(event, this); - const boardId = Session.get('currentBoard'); + }, + 'click .js-add-moved-trigger'(event) { + const datas = this.data(); + const desc = Utils.getTriggerActionDesc(event, this); + const swimlaneName = this.find('#create-swimlane-name-2').value; + const actionSelected = this.find('#move-action').value; + const listName = this.find('#move-list-name').value; + const boardId = Session.get('currentBoard'); + const divId = $(event.currentTarget.parentNode).attr('id'); + const cardTitle = this.cardTitleFilters[divId]; + if (actionSelected === 'moved-to') { + datas.triggerVar.set({ + activityType: 'moveCard', + boardId, + listName, + cardTitle, + swimlaneName, + oldListName: '*', + desc, + }); + } + if (actionSelected === 'moved-from') { + datas.triggerVar.set({ + activityType: 'moveCard', + boardId, + cardTitle, + swimlaneName, + listName: '*', + oldListName: listName, + desc, + }); + } + }, + 'click .js-add-gen-moved-trigger'(event) { + const datas = this.data(); + const desc = Utils.getTriggerActionDesc(event, this); + const boardId = Session.get('currentBoard'); - datas.triggerVar.set({ - 'activityType': 'moveCard', - boardId, - 'swimlaneName': '*', - 'listName':'*', - 'oldListName': '*', - desc, - }); - }, - 'click .js-add-arc-trigger' (event) { - const datas = this.data(); - const desc = Utils.getTriggerActionDesc(event, this); - const actionSelected = this.find('#arch-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'archived') { datas.triggerVar.set({ - activityType: 'archivedCard', - boardId, - desc, - }); - } - if (actionSelected === 'unarchived') { - datas.triggerVar.set({ - activityType: 'restoredCard', + activityType: 'moveCard', boardId, + swimlaneName: '*', + listName: '*', + oldListName: '*', desc, }); - } + }, + 'click .js-add-arc-trigger'(event) { + const datas = this.data(); + const desc = Utils.getTriggerActionDesc(event, this); + const actionSelected = this.find('#arch-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'archived') { + datas.triggerVar.set({ + activityType: 'archivedCard', + boardId, + desc, + }); + } + if (actionSelected === 'unarchived') { + datas.triggerVar.set({ + activityType: 'restoredCard', + boardId, + desc, + }); + } + }, }, - - }]; + ]; }, - }).register('boardTriggers'); - Template.boardCardTitlePopup.events({ - submit(evt, tpl) { - const title = tpl.$('.js-card-filter-name').val().trim(); + submit(event, templateInstance) { + const title = templateInstance + .$('.js-card-filter-name') + .val() + .trim(); Popup.getOpenerComponent().setNameFilter(title); - evt.preventDefault(); + event.preventDefault(); Popup.close(); }, }); diff --git a/client/components/rules/triggers/cardTriggers.js b/client/components/rules/triggers/cardTriggers.js index 82b21d61..8d4ec52e 100644 --- a/client/components/rules/triggers/cardTriggers.js +++ b/client/components/rules/triggers/cardTriggers.js @@ -7,7 +7,7 @@ BlazeComponent.extendComponent({ for (let i = 0; i < labels.length; i++) { if (labels[i].name === '' || labels[i].name === undefined) { labels[i].name = labels[i].color; - labels[i].translatedname = `${TAPi18n.__(`color-${ labels[i].color}`)}`; + labels[i].translatedname = `${TAPi18n.__(`color-${labels[i].color}`)}`; } else { labels[i].translatedname = labels[i].name; } @@ -15,117 +15,119 @@ BlazeComponent.extendComponent({ return labels; }, events() { - return [{ - 'click .js-add-gen-label-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#label-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'added') { - datas.triggerVar.set({ - activityType: 'addedLabel', - boardId, - 'labelId': '*', - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'removedLabel', - boardId, - 'labelId': '*', - desc, - }); - } + return [ + { + 'click .js-add-gen-label-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#label-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'added') { + datas.triggerVar.set({ + activityType: 'addedLabel', + boardId, + labelId: '*', + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'removedLabel', + boardId, + labelId: '*', + desc, + }); + } + }, + 'click .js-add-spec-label-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#spec-label-action').value; + const labelId = this.find('#spec-label').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'added') { + datas.triggerVar.set({ + activityType: 'addedLabel', + boardId, + labelId, + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'removedLabel', + boardId, + labelId, + desc, + }); + } + }, + 'click .js-add-gen-member-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#gen-member-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'added') { + datas.triggerVar.set({ + activityType: 'joinMember', + boardId, + username: '*', + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'unjoinMember', + boardId, + username: '*', + desc, + }); + } + }, + 'click .js-add-spec-member-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#spec-member-action').value; + const username = this.find('#spec-member').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'added') { + datas.triggerVar.set({ + activityType: 'joinMember', + boardId, + username, + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'unjoinMember', + boardId, + username, + desc, + }); + } + }, + 'click .js-add-attachment-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#attach-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'added') { + datas.triggerVar.set({ + activityType: 'addAttachment', + boardId, + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'deleteAttachment', + boardId, + desc, + }); + } + }, }, - 'click .js-add-spec-label-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#spec-label-action').value; - const labelId = this.find('#spec-label').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'added') { - datas.triggerVar.set({ - activityType: 'addedLabel', - boardId, - labelId, - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'removedLabel', - boardId, - labelId, - desc, - }); - } - }, - 'click .js-add-gen-member-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#gen-member-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'added') { - datas.triggerVar.set({ - activityType: 'joinMember', - boardId, - 'username': '*', - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'unjoinMember', - boardId, - 'username': '*', - desc, - }); - } - }, - 'click .js-add-spec-member-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#spec-member-action').value; - const username = this.find('#spec-member').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'added') { - datas.triggerVar.set({ - activityType: 'joinMember', - boardId, - username, - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'unjoinMember', - boardId, - username, - desc, - }); - } - }, - 'click .js-add-attachment-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#attach-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'added') { - datas.triggerVar.set({ - activityType: 'addAttachment', - boardId, - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'deleteAttachment', - boardId, - desc, - }); - } - }, - }]; + ]; }, }).register('cardTriggers'); diff --git a/client/components/rules/triggers/checklistTriggers.js b/client/components/rules/triggers/checklistTriggers.js index 2272be29..9b2cd99c 100644 --- a/client/components/rules/triggers/checklistTriggers.js +++ b/client/components/rules/triggers/checklistTriggers.js @@ -3,144 +3,145 @@ BlazeComponent.extendComponent({ this.subscribe('allRules'); }, events() { - return [{ - 'click .js-add-gen-check-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#gen-check-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'created') { - datas.triggerVar.set({ - activityType: 'addChecklist', - boardId, - 'checklistName': '*', - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'removeChecklist', - boardId, - 'checklistName': '*', - desc, - }); - } - }, - 'click .js-add-spec-check-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#spec-check-action').value; - const checklistId = this.find('#check-name').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'created') { - datas.triggerVar.set({ - activityType: 'addChecklist', - boardId, - 'checklistName': checklistId, - desc, - }); - } - if (actionSelected === 'removed') { - datas.triggerVar.set({ - activityType: 'removeChecklist', - boardId, - 'checklistName': checklistId, - desc, - }); - } - }, - 'click .js-add-gen-comp-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); + return [ + { + 'click .js-add-gen-check-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#gen-check-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'created') { + datas.triggerVar.set({ + activityType: 'addChecklist', + boardId, + checklistName: '*', + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'removeChecklist', + boardId, + checklistName: '*', + desc, + }); + } + }, + 'click .js-add-spec-check-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#spec-check-action').value; + const checklistId = this.find('#check-name').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'created') { + datas.triggerVar.set({ + activityType: 'addChecklist', + boardId, + checklistName: checklistId, + desc, + }); + } + if (actionSelected === 'removed') { + datas.triggerVar.set({ + activityType: 'removeChecklist', + boardId, + checklistName: checklistId, + desc, + }); + } + }, + 'click .js-add-gen-comp-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#gen-comp-check-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'completed') { - datas.triggerVar.set({ - activityType: 'completeChecklist', - boardId, - 'checklistName': '*', - desc, - }); - } - if (actionSelected === 'uncompleted') { - datas.triggerVar.set({ - activityType: 'uncompleteChecklist', - boardId, - 'checklistName': '*', - desc, - }); - } - }, - 'click .js-add-spec-comp-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#spec-comp-check-action').value; - const checklistId = this.find('#spec-comp-check-name').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'completed') { - datas.triggerVar.set({ - activityType: 'completeChecklist', - boardId, - 'checklistName': checklistId, - desc, - }); - } - if (actionSelected === 'uncompleted') { - datas.triggerVar.set({ - activityType: 'uncompleteChecklist', - boardId, - 'checklistName': checklistId, - desc, - }); - } + const datas = this.data(); + const actionSelected = this.find('#gen-comp-check-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'completed') { + datas.triggerVar.set({ + activityType: 'completeChecklist', + boardId, + checklistName: '*', + desc, + }); + } + if (actionSelected === 'uncompleted') { + datas.triggerVar.set({ + activityType: 'uncompleteChecklist', + boardId, + checklistName: '*', + desc, + }); + } + }, + 'click .js-add-spec-comp-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#spec-comp-check-action').value; + const checklistId = this.find('#spec-comp-check-name').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'completed') { + datas.triggerVar.set({ + activityType: 'completeChecklist', + boardId, + checklistName: checklistId, + desc, + }); + } + if (actionSelected === 'uncompleted') { + datas.triggerVar.set({ + activityType: 'uncompleteChecklist', + boardId, + checklistName: checklistId, + desc, + }); + } + }, + 'click .js-add-gen-check-item-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#check-item-gen-action').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'checked') { + datas.triggerVar.set({ + activityType: 'checkedItem', + boardId, + checklistItemName: '*', + desc, + }); + } + if (actionSelected === 'unchecked') { + datas.triggerVar.set({ + activityType: 'uncheckedItem', + boardId, + checklistItemName: '*', + desc, + }); + } + }, + 'click .js-add-spec-check-item-trigger'(event) { + const desc = Utils.getTriggerActionDesc(event, this); + const datas = this.data(); + const actionSelected = this.find('#check-item-spec-action').value; + const checklistItemId = this.find('#check-item-name').value; + const boardId = Session.get('currentBoard'); + if (actionSelected === 'checked') { + datas.triggerVar.set({ + activityType: 'checkedItem', + boardId, + checklistItemName: checklistItemId, + desc, + }); + } + if (actionSelected === 'unchecked') { + datas.triggerVar.set({ + activityType: 'uncheckedItem', + boardId, + checklistItemName: checklistItemId, + desc, + }); + } + }, }, - 'click .js-add-gen-check-item-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#check-item-gen-action').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'checked') { - datas.triggerVar.set({ - activityType: 'checkedItem', - boardId, - 'checklistItemName': '*', - desc, - }); - } - if (actionSelected === 'unchecked') { - datas.triggerVar.set({ - activityType: 'uncheckedItem', - boardId, - 'checklistItemName': '*', - desc, - }); - } - }, - 'click .js-add-spec-check-item-trigger' (event) { - const desc = Utils.getTriggerActionDesc(event, this); - const datas = this.data(); - const actionSelected = this.find('#check-item-spec-action').value; - const checklistItemId = this.find('#check-item-name').value; - const boardId = Session.get('currentBoard'); - if (actionSelected === 'checked') { - datas.triggerVar.set({ - activityType: 'checkedItem', - boardId, - 'checklistItemName': checklistItemId, - desc, - }); - } - if (actionSelected === 'unchecked') { - datas.triggerVar.set({ - activityType: 'uncheckedItem', - boardId, - 'checklistItemName': checklistItemId, - desc, - }); - } - }, - }]; + ]; }, - }).register('checklistTriggers'); diff --git a/client/components/settings/connectionMethod.js b/client/components/settings/connectionMethod.js index db9da25f..6abfd743 100644 --- a/client/components/settings/connectionMethod.js +++ b/client/components/settings/connectionMethod.js @@ -6,9 +6,11 @@ Template.connectionMethod.onCreated(function() { // TODO : add a management of different languages // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')}) this.authenticationMethods.set([ - {value: 'password'}, + { value: 'password' }, // Gets only the authentication methods availables - ...Object.entries(result).filter((e) => e[1]).map((e) => ({value: e[0]})), + ...Object.entries(result) + .filter(e => e[1]) + .map(e => ({ value: e[0] })), ]); } @@ -24,7 +26,9 @@ Template.connectionMethod.onCreated(function() { Template.connectionMethod.onRendered(() => { // Moves the select boxe in the first place of the at-pwd-form div - $('.at-form-authentication').detach().prependTo('.at-pwd-form'); + $('.at-form-authentication') + .detach() + .prependTo('.at-pwd-form'); }); Template.connectionMethod.helpers({ diff --git a/client/components/settings/peopleBody.js b/client/components/settings/peopleBody.js index 83cf14fa..b09f6599 100644 --- a/client/components/settings/peopleBody.js +++ b/client/components/settings/peopleBody.js @@ -29,19 +29,23 @@ BlazeComponent.extendComponent({ }); }, events() { - return [{ - 'click #searchButton'() { - this.filterPeople(); - }, - 'keydown #searchInput'(event) { - if (event.keyCode === 13 && !event.shiftKey) { + return [ + { + 'click #searchButton'() { this.filterPeople(); - } + }, + 'keydown #searchInput'(event) { + if (event.keyCode === 13 && !event.shiftKey) { + this.filterPeople(); + } + }, }, - }]; + ]; }, filterPeople() { - const value = $('#searchInput').first().val(); + const value = $('#searchInput') + .first() + .val(); if (value === '') { this.findUsersOptions.set({}); } else { @@ -79,7 +83,7 @@ BlazeComponent.extendComponent({ }, peopleList() { const users = Users.find(this.findUsersOptions.get(), { - fields: {_id: true}, + fields: { _id: true }, }); this.number.set(users.count()); return users; @@ -105,9 +109,11 @@ Template.editUserPopup.onCreated(function() { // TODO : add a management of different languages // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')}) this.authenticationMethods.set([ - {value: 'password'}, + { value: 'password' }, // Gets only the authentication methods availables - ...Object.entries(result).filter((e) => e[1]).map((e) => ({value: e[0]})), + ...Object.entries(result) + .filter(e => e[1]) + .map(e => ({ value: e[0] })), ]); } }); @@ -136,69 +142,79 @@ Template.editUserPopup.helpers({ }); BlazeComponent.extendComponent({ - onCreated() { - }, + onCreated() {}, user() { return Users.findOne(this.userId); }, events() { - return [{ - 'click a.edit-user': Popup.open('editUser'), - }]; + return [ + { + 'click a.edit-user': Popup.open('editUser'), + }, + ]; }, }).register('peopleRow'); Template.editUserPopup.events({ - submit(evt, tpl) { - evt.preventDefault(); + submit(event, templateInstance) { + event.preventDefault(); const user = Users.findOne(this.userId); - const fullname = tpl.find('.js-profile-fullname').value.trim(); - const username = tpl.find('.js-profile-username').value.trim(); - const password = tpl.find('.js-profile-password').value; - const isAdmin = tpl.find('.js-profile-isadmin').value.trim(); - const isActive = tpl.find('.js-profile-isactive').value.trim(); - const email = tpl.find('.js-profile-email').value.trim(); - const authentication = tpl.find('.js-authenticationMethod').value.trim(); + const fullname = templateInstance.find('.js-profile-fullname').value.trim(); + const username = templateInstance.find('.js-profile-username').value.trim(); + const password = templateInstance.find('.js-profile-password').value; + const isAdmin = templateInstance.find('.js-profile-isadmin').value.trim(); + const isActive = templateInstance.find('.js-profile-isactive').value.trim(); + const email = templateInstance.find('.js-profile-email').value.trim(); + const authentication = templateInstance + .find('.js-authenticationMethod') + .value.trim(); const isChangePassword = password.length > 0; const isChangeUserName = username !== user.username; - const isChangeEmail = email.toLowerCase() !== user.emails[0].address.toLowerCase(); + const isChangeEmail = + email.toLowerCase() !== user.emails[0].address.toLowerCase(); Users.update(this.userId, { $set: { 'profile.fullname': fullname, - 'isAdmin': isAdmin === 'true', - 'loginDisabled': isActive === 'true', - 'authenticationMethod': authentication, + isAdmin: isAdmin === 'true', + loginDisabled: isActive === 'true', + authenticationMethod: authentication, }, }); - if(isChangePassword){ + if (isChangePassword) { Meteor.call('setPassword', password, this.userId); } if (isChangeUserName && isChangeEmail) { - Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), this.userId, function (error) { - const usernameMessageElement = tpl.$('.username-taken'); - const emailMessageElement = tpl.$('.email-taken'); - if (error) { - const errorElement = error.error; - if (errorElement === 'username-already-taken') { - usernameMessageElement.show(); - emailMessageElement.hide(); - } else if (errorElement === 'email-already-taken') { + Meteor.call( + 'setUsernameAndEmail', + username, + email.toLowerCase(), + this.userId, + function(error) { + const usernameMessageElement = templateInstance.$('.username-taken'); + const emailMessageElement = templateInstance.$('.email-taken'); + if (error) { + const errorElement = error.error; + if (errorElement === 'username-already-taken') { + usernameMessageElement.show(); + emailMessageElement.hide(); + } else if (errorElement === 'email-already-taken') { + usernameMessageElement.hide(); + emailMessageElement.show(); + } + } else { usernameMessageElement.hide(); - emailMessageElement.show(); + emailMessageElement.hide(); + Popup.close(); } - } else { - usernameMessageElement.hide(); - emailMessageElement.hide(); - Popup.close(); - } - }); + }, + ); } else if (isChangeUserName) { - Meteor.call('setUsername', username, this.userId, function (error) { - const usernameMessageElement = tpl.$('.username-taken'); + Meteor.call('setUsername', username, this.userId, function(error) { + const usernameMessageElement = templateInstance.$('.username-taken'); if (error) { const errorElement = error.error; if (errorElement === 'username-already-taken') { @@ -210,8 +226,10 @@ Template.editUserPopup.events({ } }); } else if (isChangeEmail) { - Meteor.call('setEmail', email.toLowerCase(), this.userId, function (error) { - const emailMessageElement = tpl.$('.email-taken'); + Meteor.call('setEmail', email.toLowerCase(), this.userId, function( + error, + ) { + const emailMessageElement = templateInstance.$('.email-taken'); if (error) { const errorElement = error.error; if (errorElement === 'email-already-taken') { diff --git a/client/components/settings/settingBody.js b/client/components/settings/settingBody.js index 8279a092..4ec0c759 100644 --- a/client/components/settings/settingBody.js +++ b/client/components/settings/settingBody.js @@ -25,7 +25,9 @@ BlazeComponent.extendComponent({ checkField(selector) { const value = $(selector).val(); if (!value || value.trim() === '') { - $(selector).parents('li.smtp-form').addClass('has-error'); + $(selector) + .parents('li.smtp-form') + .addClass('has-error'); throw Error('blank field'); } else { return value; @@ -37,18 +39,23 @@ BlazeComponent.extendComponent({ }, boards() { - return Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - 'members.isAdmin': true, - }, { - sort: ['title'], - }); + return Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + 'members.isAdmin': true, + }, + { + sort: ['title'], + }, + ); }, toggleRegistration() { this.setLoading(true); const registrationClosed = this.currentSetting().disableRegistration; - Settings.update(Settings.findOne()._id, {$set: {disableRegistration: !registrationClosed}}); + Settings.update(Settings.findOne()._id, { + $set: { disableRegistration: !registrationClosed }, + }); this.setLoading(false); if (registrationClosed) { $('.invite-people').slideUp(); @@ -90,13 +97,19 @@ BlazeComponent.extendComponent({ }, inviteThroughEmail() { - const emails = $('#email-to-invite').val().toLowerCase().trim().split('\n').join(',').split(','); + const emails = $('#email-to-invite') + .val() + .toLowerCase() + .trim() + .split('\n') + .join(',') + .split(','); const boardsToInvite = []; - $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function () { + $('.js-toggle-board-choose .materialCheckBox.is-checked').each(function() { boardsToInvite.push($(this).data('id')); }); const validEmails = []; - emails.forEach((email) => { + emails.forEach(email => { if (email && SimpleSchema.RegEx.Email.test(email.trim())) { validEmails.push(email.trim()); } @@ -119,14 +132,22 @@ BlazeComponent.extendComponent({ try { const host = this.checkField('#mail-server-host'); const port = this.checkField('#mail-server-port'); - const username = $('#mail-server-username').val().trim(); - const password = $('#mail-server-password').val().trim(); + const username = $('#mail-server-username') + .val() + .trim(); + const password = $('#mail-server-password') + .val() + .trim(); const from = this.checkField('#mail-server-from'); const tls = $('#mail-server-tls.is-checked').length > 0; Settings.update(Settings.findOne()._id, { $set: { - 'mailServer.host': host, 'mailServer.port': port, 'mailServer.username': username, - 'mailServer.password': password, 'mailServer.enableTLS': tls, 'mailServer.from': from, + 'mailServer.host': host, + 'mailServer.port': port, + 'mailServer.username': username, + 'mailServer.password': password, + 'mailServer.enableTLS': tls, + 'mailServer.from': from, }, }); } catch (e) { @@ -134,19 +155,25 @@ BlazeComponent.extendComponent({ } finally { this.setLoading(false); } - }, saveLayout() { this.setLoading(true); $('li').removeClass('has-error'); - const productName = $('#product-name').val().trim(); - const hideLogoChange = ($('input[name=hideLogo]:checked').val() === 'true'); - const displayAuthenticationMethod = ($('input[name=displayAuthenticationMethod]:checked').val() === 'true'); + const productName = $('#product-name') + .val() + .trim(); + const hideLogoChange = $('input[name=hideLogo]:checked').val() === 'true'; + const displayAuthenticationMethod = + $('input[name=displayAuthenticationMethod]:checked').val() === 'true'; const defaultAuthenticationMethod = $('#defaultAuthenticationMethod').val(); - const customHTMLafterBodyStart = $('#customHTMLafterBodyStart').val().trim(); - const customHTMLbeforeBodyEnd = $('#customHTMLbeforeBodyEnd').val().trim(); + const customHTMLafterBodyStart = $('#customHTMLafterBodyStart') + .val() + .trim(); + const customHTMLbeforeBodyEnd = $('#customHTMLbeforeBodyEnd') + .val() + .trim(); try { Settings.update(Settings.findOne()._id, { @@ -166,7 +193,6 @@ BlazeComponent.extendComponent({ } DocHead.setTitle(productName); - }, sendSMTPTestEmail() { @@ -183,31 +209,35 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click a.js-toggle-registration': this.toggleRegistration, - 'click a.js-toggle-tls': this.toggleTLS, - 'click a.js-setting-menu': this.switchMenu, - 'click a.js-toggle-board-choose': this.checkBoard, - 'click button.js-email-invite': this.inviteThroughEmail, - 'click button.js-save': this.saveMailServerInfo, - 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail, - 'click a.js-toggle-hide-logo': this.toggleHideLogo, - 'click button.js-save-layout': this.saveLayout, - 'click a.js-toggle-display-authentication-method': this.toggleDisplayAuthenticationMethod, - }]; + return [ + { + 'click a.js-toggle-registration': this.toggleRegistration, + 'click a.js-toggle-tls': this.toggleTLS, + 'click a.js-setting-menu': this.switchMenu, + 'click a.js-toggle-board-choose': this.checkBoard, + 'click button.js-email-invite': this.inviteThroughEmail, + 'click button.js-save': this.saveMailServerInfo, + 'click button.js-send-smtp-test-email': this.sendSMTPTestEmail, + 'click a.js-toggle-hide-logo': this.toggleHideLogo, + 'click button.js-save-layout': this.saveLayout, + 'click a.js-toggle-display-authentication-method': this + .toggleDisplayAuthenticationMethod, + }, + ]; }, }).register('setting'); BlazeComponent.extendComponent({ - saveAccountsChange() { - const allowEmailChange = ($('input[name=allowEmailChange]:checked').val() === 'true'); - const allowUserNameChange = ($('input[name=allowUserNameChange]:checked').val() === 'true'); + const allowEmailChange = + $('input[name=allowEmailChange]:checked').val() === 'true'; + const allowUserNameChange = + $('input[name=allowUserNameChange]:checked').val() === 'true'; AccountSettings.update('accounts-allowEmailChange', { - $set: {'booleanValue': allowEmailChange}, + $set: { booleanValue: allowEmailChange }, }); AccountSettings.update('accounts-allowUserNameChange', { - $set: {'booleanValue': allowUserNameChange}, + $set: { booleanValue: allowUserNameChange }, }); }, @@ -219,9 +249,11 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click button.js-accounts-save': this.saveAccountsChange, - }]; + return [ + { + 'click button.js-accounts-save': this.saveAccountsChange, + }, + ]; }, }).register('accountSettings'); @@ -239,9 +271,11 @@ BlazeComponent.extendComponent({ }, saveMessage() { - const message = $('#admin-announcement').val().trim(); + const message = $('#admin-announcement') + .val() + .trim(); Announcements.update(Announcements.findOne()._id, { - $set: {'body': message}, + $set: { body: message }, }); }, @@ -249,7 +283,7 @@ BlazeComponent.extendComponent({ this.setLoading(true); const isActive = this.currentSetting().enabled; Announcements.update(Announcements.findOne()._id, { - $set: {'enabled': !isActive}, + $set: { enabled: !isActive }, }); this.setLoading(false); if (isActive) { @@ -260,14 +294,15 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click a.js-toggle-activemessage': this.toggleActive, - 'click button.js-announcement-save': this.saveMessage, - }]; + return [ + { + 'click a.js-toggle-activemessage': this.toggleActive, + 'click button.js-announcement-save': this.saveMessage, + }, + ]; }, }).register('announcementSettings'); - Template.selectAuthenticationMethod.onCreated(function() { this.authenticationMethods = new ReactiveVar([]); @@ -276,9 +311,11 @@ Template.selectAuthenticationMethod.onCreated(function() { // TODO : add a management of different languages // (ex {value: ldap, text: TAPi18n.__('ldap', {}, T9n.getLanguage() || 'en')}) this.authenticationMethods.set([ - {value: 'password'}, + { value: 'password' }, // Gets only the authentication methods availables - ...Object.entries(result).filter((e) => e[1]).map((e) => ({value: e[0]})), + ...Object.entries(result) + .filter(e => e[1]) + .map(e => ({ value: e[0] })), ]); } }); diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index e8de3c96..8468595a 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -91,29 +91,34 @@ BlazeComponent.extendComponent({ }, showTongueTitle() { - if (this.isOpen()) - return `${TAPi18n.__('sidebar-close')}`; - else - return `${TAPi18n.__('sidebar-open')}`; + if (this.isOpen()) return `${TAPi18n.__('sidebar-close')}`; + else return `${TAPi18n.__('sidebar-open')}`; }, events() { - return [{ - 'click .js-hide-sidebar': this.hide, - 'click .js-toggle-sidebar': this.toggle, - 'click .js-back-home': this.setView, - 'click .js-shortcuts'() { - FlowRouter.go('shortcuts'); + return [ + { + 'click .js-hide-sidebar': this.hide, + 'click .js-toggle-sidebar': this.toggle, + 'click .js-back-home': this.setView, + 'click .js-shortcuts'() { + FlowRouter.go('shortcuts'); + }, }, - }]; + ]; }, }).register('sidebar'); Blaze.registerHelper('Sidebar', () => Sidebar); -EscapeActions.register('sidebarView', - () => { Sidebar.setView(defaultView); }, - () => { return Sidebar && Sidebar.getView() !== defaultView; } +EscapeActions.register( + 'sidebarView', + () => { + Sidebar.setView(defaultView); + }, + () => { + return Sidebar && Sidebar.getView() !== defaultView; + }, ); Template.memberPopup.helpers({ @@ -122,13 +127,13 @@ Template.memberPopup.helpers({ }, memberType() { const type = Users.findOne(this.userId).isBoardAdmin() ? 'admin' : 'normal'; - if(type === 'normal'){ + if (type === 'normal') { const currentBoard = Boards.findOne(Session.get('currentBoard')); const commentOnly = currentBoard.hasCommentOnly(this.userId); const noComments = currentBoard.hasNoComments(this.userId); - if(commentOnly){ + if (commentOnly) { return TAPi18n.__('comment-only').toLowerCase(); - } else if(noComments) { + } else if (noComments) { return TAPi18n.__('no-comments').toLowerCase(); } else { return TAPi18n.__(type).toLowerCase(); @@ -197,7 +202,7 @@ Template.memberPopup.events({ 'click .js-remove-member': Popup.afterConfirm('removeMember', function() { const boardId = Session.get('currentBoard'); const memberId = this.userId; - Cards.find({ boardId, members: memberId }).forEach((card) => { + Cards.find({ boardId, members: memberId }).forEach(card => { card.unassignMember(memberId); }); Boards.findOne(boardId).removeMember(memberId); @@ -274,38 +279,40 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'submit'(evt) { - evt.preventDefault(); - const url = evt.target.url.value; - const boardId = Session.get('currentBoard'); - let id = null; - let integration = null; - if (evt.target.id) { - id = evt.target.id.value; - integration = this.integration(id); - if (url) { - Integrations.update(integration._id, { - $set: { - url: `${url}`, - }, + return [ + { + submit(evt) { + evt.preventDefault(); + const url = evt.target.url.value; + const boardId = Session.get('currentBoard'); + let id = null; + let integration = null; + if (evt.target.id) { + id = evt.target.id.value; + integration = this.integration(id); + if (url) { + Integrations.update(integration._id, { + $set: { + url: `${url}`, + }, + }); + } else { + Integrations.remove(integration._id); + } + } else if (url) { + Integrations.insert({ + userId: Meteor.userId(), + enabled: true, + type: 'outgoing-webhooks', + url: `${url}`, + boardId: `${boardId}`, + activities: ['all'], }); - } else { - Integrations.remove(integration._id); } - } else if (url) { - Integrations.insert({ - userId: Meteor.userId(), - enabled: true, - type: 'outgoing-webhooks', - url: `${url}`, - boardId: `${boardId}`, - activities: ['all'], - }); - } - Popup.close(); + Popup.close(); + }, }, - }]; + ]; }, }).register('outgoingWebhooksPopup'); @@ -375,14 +382,16 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-select-background'(evt) { - const currentBoard = Boards.findOne(Session.get('currentBoard')); - const newColor = this.currentData().toString(); - currentBoard.setColor(newColor); - evt.preventDefault(); + return [ + { + 'click .js-select-background'(evt) { + const currentBoard = Boards.findOne(Session.get('currentBoard')); + const newColor = this.currentData().toString(); + currentBoard.setColor(newColor); + evt.preventDefault(); + }, }, - }]; + ]; }, }).register('boardChangeColorPopup'); @@ -400,25 +409,34 @@ BlazeComponent.extendComponent({ }, isNullBoardSelected() { - return (this.currentBoard.subtasksDefaultBoardId === null) || (this.currentBoard.subtasksDefaultBoardId === undefined); + return ( + this.currentBoard.subtasksDefaultBoardId === null || + this.currentBoard.subtasksDefaultBoardId === undefined + ); }, boards() { - return Boards.find({ - archived: false, - 'members.userId': Meteor.userId(), - }, { - sort: ['title'], - }); + return Boards.find( + { + archived: false, + 'members.userId': Meteor.userId(), + }, + { + sort: ['title'], + }, + ); }, lists() { - return Lists.find({ - boardId: this.currentBoard._id, - archived: false, - }, { - sort: ['title'], - }); + return Lists.find( + { + boardId: this.currentBoard._id, + archived: false, + }, + { + sort: ['title'], + }, + ); }, hasLists() { @@ -431,54 +449,74 @@ BlazeComponent.extendComponent({ presentParentTask() { let result = this.currentBoard.presentParentTask; - if ((result === null) || (result === undefined)) { + if (result === null || result === undefined) { result = 'no-parent'; } return result; }, events() { - return [{ - 'click .js-field-has-subtasks'(evt) { - evt.preventDefault(); - this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks; - this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks); - $('.js-field-has-subtasks .materialCheckBox').toggleClass('is-checked', this.currentBoard.allowsSubtasks); - $('.js-field-has-subtasks').toggleClass('is-checked', this.currentBoard.allowsSubtasks); - $('.js-field-deposit-board').prop('disabled', !this.currentBoard.allowsSubtasks); - }, - 'change .js-field-deposit-board'(evt) { - let value = evt.target.value; - if (value === 'null') { - value = null; - } - this.currentBoard.setSubtasksDefaultBoardId(value); - evt.preventDefault(); - }, - 'change .js-field-deposit-list'(evt) { - this.currentBoard.setSubtasksDefaultListId(evt.target.value); - evt.preventDefault(); - }, - 'click .js-field-show-parent-in-minicard'(evt) { - const value = evt.target.id || $(evt.target).parent()[0].id || $(evt.target).parent()[0].parent()[0].id; - const options = [ - 'prefix-with-full-path', - 'prefix-with-parent', - 'subtext-with-full-path', - 'subtext-with-parent', - 'no-parent']; - options.forEach(function(element) { - if (element !== value) { - $(`#${element} .materialCheckBox`).toggleClass('is-checked', false); - $(`#${element}`).toggleClass('is-checked', false); + return [ + { + 'click .js-field-has-subtasks'(evt) { + evt.preventDefault(); + this.currentBoard.allowsSubtasks = !this.currentBoard.allowsSubtasks; + this.currentBoard.setAllowsSubtasks(this.currentBoard.allowsSubtasks); + $('.js-field-has-subtasks .materialCheckBox').toggleClass( + 'is-checked', + this.currentBoard.allowsSubtasks, + ); + $('.js-field-has-subtasks').toggleClass( + 'is-checked', + this.currentBoard.allowsSubtasks, + ); + $('.js-field-deposit-board').prop( + 'disabled', + !this.currentBoard.allowsSubtasks, + ); + }, + 'change .js-field-deposit-board'(evt) { + let value = evt.target.value; + if (value === 'null') { + value = null; } - }); - $(`#${value} .materialCheckBox`).toggleClass('is-checked', true); - $(`#${value}`).toggleClass('is-checked', true); - this.currentBoard.setPresentParentTask(value); - evt.preventDefault(); + this.currentBoard.setSubtasksDefaultBoardId(value); + evt.preventDefault(); + }, + 'change .js-field-deposit-list'(evt) { + this.currentBoard.setSubtasksDefaultListId(evt.target.value); + evt.preventDefault(); + }, + 'click .js-field-show-parent-in-minicard'(evt) { + const value = + evt.target.id || + $(evt.target).parent()[0].id || + $(evt.target) + .parent()[0] + .parent()[0].id; + const options = [ + 'prefix-with-full-path', + 'prefix-with-parent', + 'subtext-with-full-path', + 'subtext-with-parent', + 'no-parent', + ]; + options.forEach(function(element) { + if (element !== value) { + $(`#${element} .materialCheckBox`).toggleClass( + 'is-checked', + false, + ); + $(`#${element}`).toggleClass('is-checked', false); + } + }); + $(`#${value} .materialCheckBox`).toggleClass('is-checked', true); + $(`#${value}`).toggleClass('is-checked', true); + this.currentBoard.setPresentParentTask(value); + evt.preventDefault(); + }, }, - }]; + ]; }, }).register('boardSubtaskSettingsPopup'); @@ -528,35 +566,46 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'keyup input'() { - this.setError(''); - }, - 'click .js-select-member'() { - const userId = this.currentData()._id; - const currentBoard = Boards.findOne(Session.get('currentBoard')); - if (!currentBoard.hasMember(userId)) { - this.inviteUser(userId); - } - }, - 'click .js-email-invite'() { - const idNameEmail = $('.js-search-member input').val(); - if (idNameEmail.indexOf('@')<0 || this.isValidEmail(idNameEmail)) { - this.inviteUser(idNameEmail); - } else this.setError('email-invalid'); + return [ + { + 'keyup input'() { + this.setError(''); + }, + 'click .js-select-member'() { + const userId = this.currentData()._id; + const currentBoard = Boards.findOne(Session.get('currentBoard')); + if (!currentBoard.hasMember(userId)) { + this.inviteUser(userId); + } + }, + 'click .js-email-invite'() { + const idNameEmail = $('.js-search-member input').val(); + if (idNameEmail.indexOf('@') < 0 || this.isValidEmail(idNameEmail)) { + this.inviteUser(idNameEmail); + } else this.setError('email-invalid'); + }, }, - }]; + ]; }, }).register('addMemberPopup'); Template.changePermissionsPopup.events({ - 'click .js-set-admin, click .js-set-normal, click .js-set-no-comments, click .js-set-comment-only'(event) { + 'click .js-set-admin, click .js-set-normal, click .js-set-no-comments, click .js-set-comment-only'( + event, + ) { const currentBoard = Boards.findOne(Session.get('currentBoard')); const memberId = this.userId; const isAdmin = $(event.currentTarget).hasClass('js-set-admin'); - const isCommentOnly = $(event.currentTarget).hasClass('js-set-comment-only'); + const isCommentOnly = $(event.currentTarget).hasClass( + 'js-set-comment-only', + ); const isNoComments = $(event.currentTarget).hasClass('js-set-no-comments'); - currentBoard.setMemberPermission(memberId, isAdmin, isNoComments, isCommentOnly); + currentBoard.setMemberPermission( + memberId, + isAdmin, + isNoComments, + isCommentOnly, + ); Popup.back(1); }, }); @@ -569,21 +618,33 @@ Template.changePermissionsPopup.helpers({ isNormal() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - return !currentBoard.hasAdmin(this.userId) && !currentBoard.hasNoComments(this.userId) && !currentBoard.hasCommentOnly(this.userId); + return ( + !currentBoard.hasAdmin(this.userId) && + !currentBoard.hasNoComments(this.userId) && + !currentBoard.hasCommentOnly(this.userId) + ); }, isNoComments() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - return !currentBoard.hasAdmin(this.userId) && currentBoard.hasNoComments(this.userId); + return ( + !currentBoard.hasAdmin(this.userId) && + currentBoard.hasNoComments(this.userId) + ); }, isCommentOnly() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - return !currentBoard.hasAdmin(this.userId) && currentBoard.hasCommentOnly(this.userId); + return ( + !currentBoard.hasAdmin(this.userId) && + currentBoard.hasCommentOnly(this.userId) + ); }, isLastAdmin() { const currentBoard = Boards.findOne(Session.get('currentBoard')); - return currentBoard.hasAdmin(this.userId) && (currentBoard.activeAdmins() === 1); + return ( + currentBoard.hasAdmin(this.userId) && currentBoard.activeAdmins() === 1 + ); }, }); diff --git a/client/components/sidebar/sidebarArchives.js b/client/components/sidebar/sidebarArchives.js index 546d7e1a..53fc29b9 100644 --- a/client/components/sidebar/sidebarArchives.js +++ b/client/components/sidebar/sidebarArchives.js @@ -10,12 +10,11 @@ BlazeComponent.extendComponent({ // unfortunatly, Blaze doesn't have this notion. this.autorun(() => { const currentBoardId = Session.get('currentBoard'); - if (!currentBoardId) - return; + if (!currentBoardId) return; const handle = subManager.subscribe('board', currentBoardId, true); Tracker.nonreactive(() => { Tracker.autorun(() => { - this.isArchiveReady.set( handle.ready() ); + this.isArchiveReady.set(handle.ready()); }); }); }); @@ -59,74 +58,82 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-restore-card'() { - const card = this.currentData(); - if(card.canBeRestored()){ - card.restore(); - } - }, - 'click .js-restore-all-cards'() { - this.archivedCards().forEach((card) => { - if(card.canBeRestored()){ + return [ + { + 'click .js-restore-card'() { + const card = this.currentData(); + if (card.canBeRestored()) { card.restore(); } - }); - }, + }, + 'click .js-restore-all-cards'() { + this.archivedCards().forEach(card => { + if (card.canBeRestored()) { + card.restore(); + } + }); + }, - 'click .js-delete-card': Popup.afterConfirm('cardDelete', function() { - const cardId = this._id; - Cards.remove(cardId); - Popup.close(); - }), - 'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => { - this.archivedCards().forEach((card) => { - Cards.remove(card._id); - }); - Popup.close(); - }), + 'click .js-delete-card': Popup.afterConfirm('cardDelete', function() { + const cardId = this._id; + Cards.remove(cardId); + Popup.close(); + }), + 'click .js-delete-all-cards': Popup.afterConfirm('cardDelete', () => { + this.archivedCards().forEach(card => { + Cards.remove(card._id); + }); + Popup.close(); + }), - 'click .js-restore-list'() { - const list = this.currentData(); - list.restore(); - }, - 'click .js-restore-all-lists'() { - this.archivedLists().forEach((list) => { + 'click .js-restore-list'() { + const list = this.currentData(); list.restore(); - }); - }, + }, + 'click .js-restore-all-lists'() { + this.archivedLists().forEach(list => { + list.restore(); + }); + }, - 'click .js-delete-list': Popup.afterConfirm('listDelete', function() { - this.remove(); - Popup.close(); - }), - 'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => { - this.archivedLists().forEach((list) => { - list.remove(); - }); - Popup.close(); - }), + 'click .js-delete-list': Popup.afterConfirm('listDelete', function() { + this.remove(); + Popup.close(); + }), + 'click .js-delete-all-lists': Popup.afterConfirm('listDelete', () => { + this.archivedLists().forEach(list => { + list.remove(); + }); + Popup.close(); + }), - 'click .js-restore-swimlane'() { - const swimlane = this.currentData(); - swimlane.restore(); - }, - 'click .js-restore-all-swimlanes'() { - this.archivedSwimlanes().forEach((swimlane) => { + 'click .js-restore-swimlane'() { + const swimlane = this.currentData(); swimlane.restore(); - }); - }, + }, + 'click .js-restore-all-swimlanes'() { + this.archivedSwimlanes().forEach(swimlane => { + swimlane.restore(); + }); + }, - 'click .js-delete-swimlane': Popup.afterConfirm('swimlaneDelete', function() { - this.remove(); - Popup.close(); - }), - 'click .js-delete-all-swimlanes': Popup.afterConfirm('swimlaneDelete', () => { - this.archivedSwimlanes().forEach((swimlane) => { - swimlane.remove(); - }); - Popup.close(); - }), - }]; + 'click .js-delete-swimlane': Popup.afterConfirm( + 'swimlaneDelete', + function() { + this.remove(); + Popup.close(); + }, + ), + 'click .js-delete-all-swimlanes': Popup.afterConfirm( + 'swimlaneDelete', + () => { + this.archivedSwimlanes().forEach(swimlane => { + swimlane.remove(); + }); + Popup.close(); + }, + ), + }, + ]; }, }).register('archivesSidebar'); diff --git a/client/components/sidebar/sidebarCustomFields.js b/client/components/sidebar/sidebarCustomFields.js index 28af973b..92e93641 100644 --- a/client/components/sidebar/sidebarCustomFields.js +++ b/client/components/sidebar/sidebarCustomFields.js @@ -1,37 +1,43 @@ BlazeComponent.extendComponent({ - customFields() { return CustomFields.find({ - boardIds: {$in: [Session.get('currentBoard')]}, + boardIds: { $in: [Session.get('currentBoard')] }, }); }, events() { - return [{ - 'click .js-open-create-custom-field': Popup.open('createCustomField'), - 'click .js-edit-custom-field': Popup.open('editCustomField'), - }]; + return [ + { + 'click .js-open-create-custom-field': Popup.open('createCustomField'), + 'click .js-edit-custom-field': Popup.open('editCustomField'), + }, + ]; }, - }).register('customFieldsSidebar'); const CreateCustomFieldPopup = BlazeComponent.extendComponent({ - _types: ['text', 'number', 'date', 'dropdown'], onCreated() { - this.type = new ReactiveVar((this.data().type) ? this.data().type : this._types[0]); - this.dropdownItems = new ReactiveVar((this.data().settings && this.data().settings.dropdownItems) ? this.data().settings.dropdownItems : []); + this.type = new ReactiveVar( + this.data().type ? this.data().type : this._types[0], + ); + this.dropdownItems = new ReactiveVar( + this.data().settings && this.data().settings.dropdownItems + ? this.data().settings.dropdownItems + : [], + ); }, types() { const currentType = this.data().type; - return this._types. - map((type) => {return { + return this._types.map(type => { + return { value: type, name: TAPi18n.__(`custom-field-${type}`), selected: type === currentType, - };}); + }; + }); }, isTypeNotSelected(type) { @@ -40,113 +46,122 @@ const CreateCustomFieldPopup = BlazeComponent.extendComponent({ getDropdownItems() { const items = this.dropdownItems.get(); - Array.from(this.findAll('.js-field-settings-dropdown input')).forEach((el, index) => { - //console.log('each item!', index, el.value); - if (!items[index]) items[index] = { - _id: Random.id(6), - }; - items[index].name = el.value.trim(); - }); + Array.from(this.findAll('.js-field-settings-dropdown input')).forEach( + (el, index) => { + //console.log('each item!', index, el.value); + if (!items[index]) + items[index] = { + _id: Random.id(6), + }; + items[index].name = el.value.trim(); + }, + ); return items; }, getSettings() { const settings = {}; switch (this.type.get()) { - case 'dropdown': { - const dropdownItems = this.getDropdownItems().filter((item) => !!item.name.trim()); - settings.dropdownItems = dropdownItems; - break; - } + case 'dropdown': { + const dropdownItems = this.getDropdownItems().filter( + item => !!item.name.trim(), + ); + settings.dropdownItems = dropdownItems; + break; + } } return settings; }, events() { - return [{ - 'change .js-field-type'(evt) { - const value = evt.target.value; - this.type.set(value); - }, - 'keydown .js-dropdown-item.last'(evt) { - if (evt.target.value.trim() && evt.keyCode === 13) { - const items = this.getDropdownItems(); - this.dropdownItems.set(items); - evt.target.value = ''; - } + return [ + { + 'change .js-field-type'(evt) { + const value = evt.target.value; + this.type.set(value); + }, + 'keydown .js-dropdown-item.last'(evt) { + if (evt.target.value.trim() && evt.keyCode === 13) { + const items = this.getDropdownItems(); + this.dropdownItems.set(items); + evt.target.value = ''; + } + }, + 'click .js-field-show-on-card'(evt) { + let $target = $(evt.target); + if (!$target.hasClass('js-field-show-on-card')) { + $target = $target.parent(); + } + $target.find('.materialCheckBox').toggleClass('is-checked'); + $target.toggleClass('is-checked'); + }, + 'click .js-field-automatically-on-card'(evt) { + let $target = $(evt.target); + if (!$target.hasClass('js-field-automatically-on-card')) { + $target = $target.parent(); + } + $target.find('.materialCheckBox').toggleClass('is-checked'); + $target.toggleClass('is-checked'); + }, + 'click .js-field-showLabel-on-card'(evt) { + let $target = $(evt.target); + if (!$target.hasClass('js-field-showLabel-on-card')) { + $target = $target.parent(); + } + $target.find('.materialCheckBox').toggleClass('is-checked'); + $target.toggleClass('is-checked'); + }, + 'click .primary'(evt) { + evt.preventDefault(); + + const data = { + name: this.find('.js-field-name').value.trim(), + type: this.type.get(), + settings: this.getSettings(), + showOnCard: this.find('.js-field-show-on-card.is-checked') !== null, + showLabelOnMiniCard: + this.find('.js-field-showLabel-on-card.is-checked') !== null, + automaticallyOnCard: + this.find('.js-field-automatically-on-card.is-checked') !== null, + }; + + // insert or update + if (!this.data()._id) { + data.boardIds = [Session.get('currentBoard')]; + CustomFields.insert(data); + } else { + CustomFields.update(this.data()._id, { $set: data }); + } + + Popup.back(); + }, + 'click .js-delete-custom-field': Popup.afterConfirm( + 'deleteCustomField', + function() { + const customField = CustomFields.findOne(this._id); + if (customField.boardIds.length > 1) { + CustomFields.update(customField._id, { + $pull: { + boardIds: Session.get('currentBoard'), + }, + }); + } else { + CustomFields.remove(customField._id); + } + Popup.close(); + }, + ), }, - 'click .js-field-show-on-card'(evt) { - let $target = $(evt.target); - if(!$target.hasClass('js-field-show-on-card')){ - $target = $target.parent(); - } - $target.find('.materialCheckBox').toggleClass('is-checked'); - $target.toggleClass('is-checked'); - }, - 'click .js-field-automatically-on-card'(evt) { - let $target = $(evt.target); - if(!$target.hasClass('js-field-automatically-on-card')){ - $target = $target.parent(); - } - $target.find('.materialCheckBox').toggleClass('is-checked'); - $target.toggleClass('is-checked'); - }, - 'click .js-field-showLabel-on-card'(evt) { - let $target = $(evt.target); - if(!$target.hasClass('js-field-showLabel-on-card')){ - $target = $target.parent(); - } - $target.find('.materialCheckBox').toggleClass('is-checked'); - $target.toggleClass('is-checked'); - }, - 'click .primary'(evt) { - evt.preventDefault(); - - const data = { - name: this.find('.js-field-name').value.trim(), - type: this.type.get(), - settings: this.getSettings(), - showOnCard: this.find('.js-field-show-on-card.is-checked') !== null, - showLabelOnMiniCard: this.find('.js-field-showLabel-on-card.is-checked') !== null, - automaticallyOnCard: this.find('.js-field-automatically-on-card.is-checked') !== null, - }; - - // insert or update - if (!this.data()._id) { - data.boardIds = [Session.get('currentBoard')]; - CustomFields.insert(data); - } else { - CustomFields.update(this.data()._id, {$set: data}); - } - - Popup.back(); - }, - 'click .js-delete-custom-field': Popup.afterConfirm('deleteCustomField', function() { - const customField = CustomFields.findOne(this._id); - if (customField.boardIds.length > 1) { - CustomFields.update(customField._id, { - $pull: { - boardIds: Session.get('currentBoard'), - }, - }); - } else { - CustomFields.remove(customField._id); - } - Popup.close(); - }), - }]; + ]; }, - }); CreateCustomFieldPopup.register('createCustomFieldPopup'); (class extends CreateCustomFieldPopup { - template() { return 'createCustomFieldPopup'; } - -}).register('editCustomFieldPopup'); +}.register('editCustomFieldPopup')); /*Template.deleteCustomFieldPopup.events({ 'submit'(evt) { diff --git a/client/components/sidebar/sidebarFilters.js b/client/components/sidebar/sidebarFilters.js index fd8229e4..88438a7a 100644 --- a/client/components/sidebar/sidebarFilters.js +++ b/client/components/sidebar/sidebarFilters.js @@ -1,106 +1,108 @@ BlazeComponent.extendComponent({ events() { - return [{ - 'click .js-toggle-label-filter'(evt) { - evt.preventDefault(); - Filter.labelIds.toggle(this.currentData()._id); - Filter.resetExceptions(); + return [ + { + 'click .js-toggle-label-filter'(evt) { + evt.preventDefault(); + Filter.labelIds.toggle(this.currentData()._id); + Filter.resetExceptions(); + }, + 'click .js-toggle-member-filter'(evt) { + evt.preventDefault(); + Filter.members.toggle(this.currentData()._id); + Filter.resetExceptions(); + }, + 'click .js-toggle-custom-fields-filter'(evt) { + evt.preventDefault(); + Filter.customFields.toggle(this.currentData()._id); + Filter.resetExceptions(); + }, + 'change .js-field-advanced-filter'(evt) { + evt.preventDefault(); + Filter.advanced.set( + this.find('.js-field-advanced-filter').value.trim(), + ); + Filter.resetExceptions(); + }, + 'click .js-clear-all'(evt) { + evt.preventDefault(); + Filter.reset(); + }, + 'click .js-filter-to-selection'(evt) { + evt.preventDefault(); + const selectedCards = Cards.find(Filter.mongoSelector()).map(c => { + return c._id; + }); + MultiSelection.add(selectedCards); + }, }, - 'click .js-toggle-member-filter'(evt) { - evt.preventDefault(); - Filter.members.toggle(this.currentData()._id); - Filter.resetExceptions(); - }, - 'click .js-toggle-custom-fields-filter'(evt) { - evt.preventDefault(); - Filter.customFields.toggle(this.currentData()._id); - Filter.resetExceptions(); - }, - 'change .js-field-advanced-filter'(evt) { - evt.preventDefault(); - Filter.advanced.set(this.find('.js-field-advanced-filter').value.trim()); - Filter.resetExceptions(); - }, - 'click .js-clear-all'(evt) { - evt.preventDefault(); - Filter.reset(); - }, - 'click .js-filter-to-selection'(evt) { - evt.preventDefault(); - const selectedCards = Cards.find(Filter.mongoSelector()).map((c) => { - return c._id; - }); - MultiSelection.add(selectedCards); - }, - }]; + ]; }, }).register('filterSidebar'); function mutateSelectedCards(mutationName, ...args) { - Cards.find(MultiSelection.getMongoSelector()).forEach((card) => { + Cards.find(MultiSelection.getMongoSelector()).forEach(card => { card[mutationName](...args); }); } BlazeComponent.extendComponent({ mapSelection(kind, _id) { - return Cards.find(MultiSelection.getMongoSelector()).map((card) => { + return Cards.find(MultiSelection.getMongoSelector()).map(card => { const methodName = kind === 'label' ? 'hasLabel' : 'isAssigned'; return card[methodName](_id); }); }, allSelectedElementHave(kind, _id) { - if (MultiSelection.isEmpty()) - return false; - else - return _.every(this.mapSelection(kind, _id)); + if (MultiSelection.isEmpty()) return false; + else return _.every(this.mapSelection(kind, _id)); }, someSelectedElementHave(kind, _id) { - if (MultiSelection.isEmpty()) - return false; - else - return _.some(this.mapSelection(kind, _id)); + if (MultiSelection.isEmpty()) return false; + else return _.some(this.mapSelection(kind, _id)); }, events() { - return [{ - 'click .js-toggle-label-multiselection'(evt) { - const labelId = this.currentData()._id; - const mappedSelection = this.mapSelection('label', labelId); + return [ + { + 'click .js-toggle-label-multiselection'(evt) { + const labelId = this.currentData()._id; + const mappedSelection = this.mapSelection('label', labelId); - if (_.every(mappedSelection)) { - mutateSelectedCards('removeLabel', labelId); - } else if (_.every(mappedSelection, (bool) => !bool)) { - mutateSelectedCards('addLabel', labelId); - } else { - const popup = Popup.open('disambiguateMultiLabel'); - // XXX We need to have a better integration between the popup and the - // UI components systems. - popup.call(this.currentData(), evt); - } - }, - 'click .js-toggle-member-multiselection'(evt) { - const memberId = this.currentData()._id; - const mappedSelection = this.mapSelection('member', memberId); - if (_.every(mappedSelection)) { - mutateSelectedCards('unassignMember', memberId); - } else if (_.every(mappedSelection, (bool) => !bool)) { - mutateSelectedCards('assignMember', memberId); - } else { - const popup = Popup.open('disambiguateMultiMember'); - // XXX We need to have a better integration between the popup and the - // UI components systems. - popup.call(this.currentData(), evt); - } - }, - 'click .js-move-selection': Popup.open('moveSelection'), - 'click .js-archive-selection'() { - mutateSelectedCards('archive'); - EscapeActions.executeUpTo('multiselection'); + if (_.every(mappedSelection)) { + mutateSelectedCards('removeLabel', labelId); + } else if (_.every(mappedSelection, bool => !bool)) { + mutateSelectedCards('addLabel', labelId); + } else { + const popup = Popup.open('disambiguateMultiLabel'); + // XXX We need to have a better integration between the popup and the + // UI components systems. + popup.call(this.currentData(), evt); + } + }, + 'click .js-toggle-member-multiselection'(evt) { + const memberId = this.currentData()._id; + const mappedSelection = this.mapSelection('member', memberId); + if (_.every(mappedSelection)) { + mutateSelectedCards('unassignMember', memberId); + } else if (_.every(mappedSelection, bool => !bool)) { + mutateSelectedCards('assignMember', memberId); + } else { + const popup = Popup.open('disambiguateMultiMember'); + // XXX We need to have a better integration between the popup and the + // UI components systems. + popup.call(this.currentData(), evt); + } + }, + 'click .js-move-selection': Popup.open('moveSelection'), + 'click .js-archive-selection'() { + mutateSelectedCards('archive'); + EscapeActions.executeUpTo('multiselection'); + }, }, - }]; + ]; }, }).register('multiselectionSidebar'); diff --git a/client/components/sidebar/sidebarSearches.js b/client/components/sidebar/sidebarSearches.js index 111a86b8..8944c04e 100644 --- a/client/components/sidebar/sidebarSearches.js +++ b/client/components/sidebar/sidebarSearches.js @@ -9,11 +9,13 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'submit .js-search-term-form'(evt) { - evt.preventDefault(); - this.term.set(evt.target.searchTerm.value); + return [ + { + 'submit .js-search-term-form'(evt) { + evt.preventDefault(); + this.term.set(evt.target.searchTerm.value); + }, }, - }]; + ]; }, }).register('searchSidebar'); diff --git a/client/components/swimlanes/swimlaneHeader.js b/client/components/swimlanes/swimlaneHeader.js index e7f3cc76..ee21d100 100644 --- a/client/components/swimlanes/swimlaneHeader.js +++ b/client/components/swimlanes/swimlaneHeader.js @@ -6,9 +6,11 @@ Meteor.startup(() => { }); BlazeComponent.extendComponent({ - editTitle(evt) { - evt.preventDefault(); - const newTitle = this.childComponents('inlinedForm')[0].getValue().trim(); + editTitle(event) { + event.preventDefault(); + const newTitle = this.childComponents('inlinedForm')[0] + .getValue() + .trim(); const swimlane = this.currentData(); if (newTitle) { swimlane.rename(newTitle.trim()); @@ -16,18 +18,20 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-open-swimlane-menu': Popup.open('swimlaneAction'), - 'click .js-open-add-swimlane-menu': Popup.open('swimlaneAdd'), - submit: this.editTitle, - }]; + return [ + { + 'click .js-open-swimlane-menu': Popup.open('swimlaneAction'), + 'click .js-open-add-swimlane-menu': Popup.open('swimlaneAdd'), + submit: this.editTitle, + }, + ]; }, }).register('swimlaneHeader'); Template.swimlaneActionPopup.events({ 'click .js-set-swimlane-color': Popup.open('setSwimlaneColor'), - 'click .js-close-swimlane' (evt) { - evt.preventDefault(); + 'click .js-close-swimlane'(event) { + event.preventDefault(); this.archive(); Popup.close(); }, @@ -39,34 +43,42 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - submit(evt) { - evt.preventDefault(); - const currentBoard = Boards.findOne(Session.get('currentBoard')); - const nextSwimlane = currentBoard.nextSwimlane(this.currentSwimlane); - const titleInput = this.find('.swimlane-name-input'); - const title = titleInput.value.trim(); - const sortValue = calculateIndexData(this.currentSwimlane, nextSwimlane, 1); - const swimlaneType = (currentBoard.isTemplatesBoard())?'template-swimlane':'swimlane'; + return [ + { + submit(event) { + event.preventDefault(); + const currentBoard = Boards.findOne(Session.get('currentBoard')); + const nextSwimlane = currentBoard.nextSwimlane(this.currentSwimlane); + const titleInput = this.find('.swimlane-name-input'); + const title = titleInput.value.trim(); + const sortValue = calculateIndexData( + this.currentSwimlane, + nextSwimlane, + 1, + ); + const swimlaneType = currentBoard.isTemplatesBoard() + ? 'template-swimlane' + : 'swimlane'; - if (title) { - Swimlanes.insert({ - title, - boardId: Session.get('currentBoard'), - sort: sortValue.base, - type: swimlaneType, - }); + if (title) { + Swimlanes.insert({ + title, + boardId: Session.get('currentBoard'), + sort: sortValue.base, + type: swimlaneType, + }); - titleInput.value = ''; - titleInput.focus(); - } - // XXX ideally, we should move the popup to the newly - // created swimlane so a user can add more than one swimlane - // with a minimum of interactions - Popup.close(); + titleInput.value = ''; + titleInput.focus(); + } + // XXX ideally, we should move the popup to the newly + // created swimlane so a user can add more than one swimlane + // with a minimum of interactions + Popup.close(); + }, + 'click .js-swimlane-template': Popup.open('searchElement'), }, - 'click .js-swimlane-template': Popup.open('searchElement'), - }]; + ]; }, }).register('swimlaneAddPopup'); @@ -77,7 +89,7 @@ BlazeComponent.extendComponent({ }, colors() { - return swimlaneColors.map((color) => ({ color, name: '' })); + return swimlaneColors.map(color => ({ color, name: '' })); }, isSelected(color) { @@ -85,18 +97,20 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-palette-color'() { - this.currentColor.set(this.currentData().color); - }, - 'click .js-submit' () { - this.currentSwimlane.setColor(this.currentColor.get()); - Popup.close(); - }, - 'click .js-remove-color'() { - this.currentSwimlane.setColor(null); - Popup.close(); + return [ + { + 'click .js-palette-color'() { + this.currentColor.set(this.currentData().color); + }, + 'click .js-submit'() { + this.currentSwimlane.setColor(this.currentColor.get()); + Popup.close(); + }, + 'click .js-remove-color'() { + this.currentSwimlane.setColor(null); + Popup.close(); + }, }, - }]; + ]; }, }).register('setSwimlaneColorPopup'); diff --git a/client/components/swimlanes/swimlanes.js b/client/components/swimlanes/swimlanes.js index d0ec3f4a..568c0bbe 100644 --- a/client/components/swimlanes/swimlanes.js +++ b/client/components/swimlanes/swimlanes.js @@ -2,16 +2,27 @@ const { calculateIndex, enableClickOnTouch } = Utils; function currentListIsInThisSwimlane(swimlaneId) { const currentList = Lists.findOne(Session.get('currentList')); - return currentList && (currentList.swimlaneId === swimlaneId || currentList.swimlaneId === ''); + return ( + currentList && + (currentList.swimlaneId === swimlaneId || currentList.swimlaneId === '') + ); } function currentCardIsInThisList(listId, swimlaneId) { const currentCard = Cards.findOne(Session.get('currentCard')); const currentUser = Meteor.user(); - if (currentUser && currentUser.profile && currentUser.profile.boardView === 'board-view-swimlanes') - return currentCard && currentCard.listId === listId && currentCard.swimlaneId === swimlaneId; - else // Default view: board-view-lists - return currentCard && currentCard.listId === listId; + if ( + currentUser && + currentUser.profile && + currentUser.profile.boardView === 'board-view-swimlanes' + ) + return ( + currentCard && + currentCard.listId === listId && + currentCard.swimlaneId === swimlaneId + ); + // Default view: board-view-lists + else return currentCard && currentCard.listId === listId; // https://github.com/wekan/wekan/issues/1623 // https://github.com/ChronikEwok/wekan/commit/cad9b20451bb6149bfb527a99b5001873b06c3de // TODO: In public board, if you would like to switch between List/Swimlane view, you could @@ -79,7 +90,11 @@ function initSortable(boardComponent, $listsDom) { enableClickOnTouch('.js-list:not(.js-list-composer)'); function userIsMember() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); } // Disable drag-dropping while in multi-selection mode, or if the current user @@ -87,8 +102,11 @@ function initSortable(boardComponent, $listsDom) { boardComponent.autorun(() => { const $listDom = $listsDom; if ($listDom.data('sortable')) { - $listsDom.sortable('option', 'disabled', - MultiSelection.isActive() || !userIsMember()); + $listsDom.sortable( + 'option', + 'disabled', + MultiSelection.isActive() || !userIsMember(), + ); } }); } @@ -124,47 +142,60 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - // Click-and-drag action - 'mousedown .board-canvas'(evt) { - // Translating the board canvas using the click-and-drag action can - // conflict with the build-in browser mechanism to select text. We - // define a list of elements in which we disable the dragging because - // the user will legitimately expect to be able to select some text with - // his mouse. - const noDragInside = ['a', 'input', 'textarea', 'p', '.js-list-header']; - if ($(evt.target).closest(noDragInside.join(',')).length === 0 && this.$('.swimlane').prop('clientHeight') > evt.offsetY) { - this._isDragging = true; - this._lastDragPositionX = evt.clientX; - } - }, - 'mouseup'() { - if (this._isDragging) { - this._isDragging = false; - } - }, - 'mousemove'(evt) { - if (this._isDragging) { - // Update the canvas position - this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX; - this._lastDragPositionX = evt.clientX; - // Disable browser text selection while dragging - evt.stopPropagation(); - evt.preventDefault(); - // Don't close opened card or inlined form at the end of the - // click-and-drag. - EscapeActions.executeUpTo('popup-close'); - EscapeActions.preventNextClick(); - } + return [ + { + // Click-and-drag action + 'mousedown .board-canvas'(evt) { + // Translating the board canvas using the click-and-drag action can + // conflict with the build-in browser mechanism to select text. We + // define a list of elements in which we disable the dragging because + // the user will legitimately expect to be able to select some text with + // his mouse. + const noDragInside = [ + 'a', + 'input', + 'textarea', + 'p', + '.js-list-header', + ]; + if ( + $(evt.target).closest(noDragInside.join(',')).length === 0 && + this.$('.swimlane').prop('clientHeight') > evt.offsetY + ) { + this._isDragging = true; + this._lastDragPositionX = evt.clientX; + } + }, + mouseup() { + if (this._isDragging) { + this._isDragging = false; + } + }, + mousemove(evt) { + if (this._isDragging) { + // Update the canvas position + this.listsDom.scrollLeft -= evt.clientX - this._lastDragPositionX; + this._lastDragPositionX = evt.clientX; + // Disable browser text selection while dragging + evt.stopPropagation(); + evt.preventDefault(); + // Don't close opened card or inlined form at the end of the + // click-and-drag. + EscapeActions.executeUpTo('popup-close'); + EscapeActions.preventNextClick(); + } + }, }, - }]; + ]; }, }).register('swimlane'); BlazeComponent.extendComponent({ onCreated() { this.currentBoard = Boards.findOne(Session.get('currentBoard')); - this.isListTemplatesSwimlane = this.currentBoard.isTemplatesBoard() && this.currentData().isListTemplatesSwimlane(); + this.isListTemplatesSwimlane = + this.currentBoard.isTemplatesBoard() && + this.currentData().isListTemplatesSwimlane(); this.currentSwimlane = this.currentData(); }, @@ -174,32 +205,40 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - submit(evt) { - evt.preventDefault(); - const titleInput = this.find('.list-name-input'); - const title = titleInput.value.trim(); - if (title) { - Lists.insert({ - title, - boardId: Session.get('currentBoard'), - sort: $('.list').length, - type: (this.isListTemplatesSwimlane)?'template-list':'list', - swimlaneId: (this.currentBoard.isTemplatesBoard())?this.currentSwimlane._id:'', - }); - - titleInput.value = ''; - titleInput.focus(); - } + return [ + { + submit(evt) { + evt.preventDefault(); + const titleInput = this.find('.list-name-input'); + const title = titleInput.value.trim(); + if (title) { + Lists.insert({ + title, + boardId: Session.get('currentBoard'), + sort: $('.list').length, + type: this.isListTemplatesSwimlane ? 'template-list' : 'list', + swimlaneId: this.currentBoard.isTemplatesBoard() + ? this.currentSwimlane._id + : '', + }); + + titleInput.value = ''; + titleInput.focus(); + } + }, + 'click .js-list-template': Popup.open('searchElement'), }, - 'click .js-list-template': Popup.open('searchElement'), - }]; + ]; }, }).register('addListForm'); Template.swimlane.helpers({ canSeeAddList() { - return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly(); + return ( + Meteor.user() && + Meteor.user().isBoardMember() && + !Meteor.user().isCommentOnly() + ); }, }); diff --git a/client/components/users/userAvatar.js b/client/components/users/userAvatar.js index 91cad237..262a63af 100644 --- a/client/components/users/userAvatar.js +++ b/client/components/users/userAvatar.js @@ -22,14 +22,11 @@ Template.userAvatar.helpers({ presenceStatusClassName() { const user = Users.findOne(this.userId); const userPresence = presences.findOne({ userId: this.userId }); - if (user && user.isInvitedTo(Session.get('currentBoard'))) - return 'pending'; - else if (!userPresence) - return 'disconnected'; + if (user && user.isInvitedTo(Session.get('currentBoard'))) return 'pending'; + else if (!userPresence) return 'disconnected'; else if (Session.equals('currentBoard', userPresence.state.currentBoardId)) return 'active'; - else - return 'idle'; + else return 'idle'; }, }); @@ -45,7 +42,7 @@ Template.userAvatarInitials.helpers({ viewPortWidth() { const user = Users.findOne(this.userId); - return (user && user.getInitials().length || 1) * 12; + return ((user && user.getInitials().length) || 1) * 12; }, }); @@ -64,7 +61,7 @@ BlazeComponent.extendComponent({ }, uploadedAvatars() { - return Avatars.find({userId: Meteor.userId()}); + return Avatars.find({ userId: Meteor.userId() }); }, isSelected() { @@ -89,46 +86,48 @@ BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-upload-avatar'() { - this.$('.js-upload-avatar-input').click(); - }, - 'change .js-upload-avatar-input'(evt) { - let file, fileUrl; - - FS.Utility.eachFile(evt, (f) => { - try { - file = Avatars.insert(new FS.File(f)); - fileUrl = file.url(this.avatarUrlOptions()); - } catch (e) { - this.setError('avatar-too-big'); + return [ + { + 'click .js-upload-avatar'() { + this.$('.js-upload-avatar-input').click(); + }, + 'change .js-upload-avatar-input'(event) { + let file, fileUrl; + + FS.Utility.eachFile(event, f => { + try { + file = Avatars.insert(new FS.File(f)); + fileUrl = file.url(this.avatarUrlOptions()); + } catch (e) { + this.setError('avatar-too-big'); + } + }); + + if (fileUrl) { + this.setError(''); + const fetchAvatarInterval = window.setInterval(() => { + $.ajax({ + url: fileUrl, + success: () => { + this.setAvatar(file.url(this.avatarUrlOptions())); + window.clearInterval(fetchAvatarInterval); + }, + }); + }, 100); } - }); - - if (fileUrl) { - this.setError(''); - const fetchAvatarInterval = window.setInterval(() => { - $.ajax({ - url: fileUrl, - success: () => { - this.setAvatar(file.url(this.avatarUrlOptions())); - window.clearInterval(fetchAvatarInterval); - }, - }); - }, 100); - } - }, - 'click .js-select-avatar'() { - const avatarUrl = this.currentData().url(this.avatarUrlOptions()); - this.setAvatar(avatarUrl); - }, - 'click .js-select-initials'() { - this.setAvatar(''); - }, - 'click .js-delete-avatar'() { - Avatars.remove(this.currentData()._id); + }, + 'click .js-select-avatar'() { + const avatarUrl = this.currentData().url(this.avatarUrlOptions()); + this.setAvatar(avatarUrl); + }, + 'click .js-select-initials'() { + this.setAvatar(''); + }, + 'click .js-delete-avatar'() { + Avatars.remove(this.currentData()._id); + }, }, - }]; + ]; }, }).register('changeAvatarPopup'); @@ -146,11 +145,11 @@ Template.cardMembersPopup.helpers({ }); Template.cardMembersPopup.events({ - 'click .js-select-member'(evt) { + 'click .js-select-member'(event) { const card = Cards.findOne(Session.get('currentCard')); const memberId = this.userId; card.toggleMember(memberId); - evt.preventDefault(); + event.preventDefault(); }, }); diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index d5353152..0434f647 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -18,8 +18,8 @@ Template.memberMenuPopup.events({ 'click .js-change-avatar': Popup.open('changeAvatar'), 'click .js-change-password': Popup.open('changePassword'), 'click .js-change-language': Popup.open('changeLanguage'), - 'click .js-logout'(evt) { - evt.preventDefault(); + 'click .js-logout'(event) { + event.preventDefault(); AccountsTemplates.logout(); }, @@ -38,12 +38,12 @@ Template.editProfilePopup.helpers({ }); Template.editProfilePopup.events({ - submit(evt, tpl) { - evt.preventDefault(); - const fullname = tpl.find('.js-profile-fullname').value.trim(); - const username = tpl.find('.js-profile-username').value.trim(); - const initials = tpl.find('.js-profile-initials').value.trim(); - const email = tpl.find('.js-profile-email').value.trim(); + submit(event, templateInstance) { + event.preventDefault(); + const fullname = templateInstance.find('.js-profile-fullname').value.trim(); + const username = templateInstance.find('.js-profile-username').value.trim(); + const initials = templateInstance.find('.js-profile-initials').value.trim(); + const email = templateInstance.find('.js-profile-email').value.trim(); let isChangeUserName = false; let isChangeEmail = false; Users.update(Meteor.userId(), { @@ -53,29 +53,36 @@ Template.editProfilePopup.events({ }, }); isChangeUserName = username !== Meteor.user().username; - isChangeEmail = email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase(); + isChangeEmail = + email.toLowerCase() !== Meteor.user().emails[0].address.toLowerCase(); if (isChangeUserName && isChangeEmail) { - Meteor.call('setUsernameAndEmail', username, email.toLowerCase(), Meteor.userId(), function (error) { - const usernameMessageElement = tpl.$('.username-taken'); - const emailMessageElement = tpl.$('.email-taken'); - if (error) { - const errorElement = error.error; - if (errorElement === 'username-already-taken') { - usernameMessageElement.show(); - emailMessageElement.hide(); - } else if (errorElement === 'email-already-taken') { + Meteor.call( + 'setUsernameAndEmail', + username, + email.toLowerCase(), + Meteor.userId(), + function(error) { + const usernameMessageElement = templateInstance.$('.username-taken'); + const emailMessageElement = templateInstance.$('.email-taken'); + if (error) { + const errorElement = error.error; + if (errorElement === 'username-already-taken') { + usernameMessageElement.show(); + emailMessageElement.hide(); + } else if (errorElement === 'email-already-taken') { + usernameMessageElement.hide(); + emailMessageElement.show(); + } + } else { usernameMessageElement.hide(); - emailMessageElement.show(); + emailMessageElement.hide(); + Popup.back(); } - } else { - usernameMessageElement.hide(); - emailMessageElement.hide(); - Popup.back(); - } - }); + }, + ); } else if (isChangeUserName) { - Meteor.call('setUsername', username, Meteor.userId(), function (error) { - const messageElement = tpl.$('.username-taken'); + Meteor.call('setUsername', username, Meteor.userId(), function(error) { + const messageElement = templateInstance.$('.username-taken'); if (error) { messageElement.show(); } else { @@ -84,8 +91,10 @@ Template.editProfilePopup.events({ } }); } else if (isChangeEmail) { - Meteor.call('setEmail', email.toLowerCase(), Meteor.userId(), function (error) { - const messageElement = tpl.$('.email-taken'); + Meteor.call('setEmail', email.toLowerCase(), Meteor.userId(), function( + error, + ) { + const messageElement = templateInstance.$('.email-taken'); if (error) { messageElement.show(); } else { @@ -104,7 +113,7 @@ Template.editProfilePopup.events({ // XXX For some reason the useraccounts autofocus isnt working in this case. // See https://github.com/meteor-useraccounts/core/issues/384 -Template.changePasswordPopup.onRendered(function () { +Template.changePasswordPopup.onRendered(function() { this.find('#at-field-current_password').focus(); }); @@ -123,7 +132,7 @@ Template.changeLanguagePopup.helpers({ name = 'Occitan'; } return { tag, name }; - }).sort(function (a, b) { + }).sort(function(a, b) { if (a.name === b.name) { return 0; } else { @@ -138,13 +147,13 @@ Template.changeLanguagePopup.helpers({ }); Template.changeLanguagePopup.events({ - 'click .js-set-language'(evt) { + 'click .js-set-language'(event) { Users.update(Meteor.userId(), { $set: { 'profile.language': this.tag, }, }); - evt.preventDefault(); + event.preventDefault(); }, }); @@ -161,9 +170,12 @@ Template.changeSettingsPopup.events({ 'click .js-toggle-system-messages'() { Meteor.call('toggleSystemMessages'); }, - 'click .js-apply-show-cards-at'(evt, tpl) { - evt.preventDefault(); - const minLimit = parseInt(tpl.$('#show-cards-count-at').val(), 10); + 'click .js-apply-show-cards-at'(event, templateInstance) { + event.preventDefault(); + const minLimit = parseInt( + templateInstance.$('#show-cards-count-at').val(), + 10, + ); if (!isNaN(minLimit)) { Meteor.call('changeLimitToShowCardsCount', minLimit); Popup.back(); diff --git a/client/config/blazeHelpers.js b/client/config/blazeHelpers.js index e058d722..3a857314 100644 --- a/client/config/blazeHelpers.js +++ b/client/config/blazeHelpers.js @@ -25,7 +25,7 @@ Blaze.registerHelper('currentList', () => { } }); -Blaze.registerHelper('getUser', (userId) => Users.findOne(userId)); +Blaze.registerHelper('getUser', userId => Users.findOne(userId)); Blaze.registerHelper('concat', (...args) => args.slice(0, -1).join('')); diff --git a/client/lib/accessibility.js b/client/lib/accessibility.js index 52b771d4..3776e937 100644 --- a/client/lib/accessibility.js +++ b/client/lib/accessibility.js @@ -27,10 +27,7 @@ function copyTitleInAriaLabel(attributes) { // which is a little bit hacky -- but still reasonable with our ES6 usage. If we // end up switching to React we will probably create lower level small // components to handle that without overwriting any build-in function. -const { - A: superA, - I: superI, -} = HTML; +const { A: superA, I: superI } = HTML; HTML.A = (attributes, ...others) => { return superA(copyTitleInAriaLabel(enforceHref(attributes)), ...others); diff --git a/client/lib/cssEvents.js b/client/lib/cssEvents.js index 04f5707e..1cf6b8e8 100644 --- a/client/lib/cssEvents.js +++ b/client/lib/cssEvents.js @@ -3,11 +3,11 @@ function whichTransitionEvent() { const el = document.createElement('fakeelement'); const transitions = { - transition:'transitionend', - OTransition:'oTransitionEnd', - MSTransition:'msTransitionEnd', - MozTransition:'transitionend', - WebkitTransition:'webkitTransitionEnd', + transition: 'transitionend', + OTransition: 'oTransitionEnd', + MSTransition: 'msTransitionEnd', + MozTransition: 'transitionend', + WebkitTransition: 'webkitTransitionEnd', }; for (const t in transitions) { @@ -21,11 +21,11 @@ function whichTransitionEvent() { function whichAnimationEvent() { const el = document.createElement('fakeelement'); const transitions = { - animation:'animationend', - OAnimation:'oAnimationEnd', - MSTransition:'msAnimationEnd', - MozAnimation:'animationend', - WebkitAnimation:'webkitAnimationEnd', + animation: 'animationend', + OAnimation: 'oAnimationEnd', + MSTransition: 'msAnimationEnd', + MozAnimation: 'animationend', + WebkitAnimation: 'webkitAnimationEnd', }; for (const t in transitions) { diff --git a/client/lib/datepicker.js b/client/lib/datepicker.js index ab2da0bd..eb5b60b8 100644 --- a/client/lib/datepicker.js +++ b/client/lib/datepicker.js @@ -10,15 +10,20 @@ DatePicker = BlazeComponent.extendComponent({ }, onRendered() { - const $picker = this.$('.js-datepicker').datepicker({ - todayHighlight: true, - todayBtn: 'linked', - language: TAPi18n.getLanguage(), - }).on('changeDate', function(evt) { - this.find('#date').value = moment(evt.date).format('L'); - this.error.set(''); - this.find('#time').focus(); - }.bind(this)); + const $picker = this.$('.js-datepicker') + .datepicker({ + todayHighlight: true, + todayBtn: 'linked', + language: TAPi18n.getLanguage(), + }) + .on( + 'changeDate', + function(evt) { + this.find('#date').value = moment(evt.date).format('L'); + this.error.set(''); + this.find('#time').focus(); + }.bind(this), + ); if (this.date.get().isValid()) { $picker.datepicker('update', this.date.get().toDate()); @@ -26,13 +31,11 @@ DatePicker = BlazeComponent.extendComponent({ }, showDate() { - if (this.date.get().isValid()) - return this.date.get().format('L'); + if (this.date.get().isValid()) return this.date.get().format('L'); return ''; }, showTime() { - if (this.date.get().isValid()) - return this.date.get().format('LT'); + if (this.date.get().isValid()) return this.date.get().format('LT'); return ''; }, dateFormat() { @@ -43,44 +46,47 @@ DatePicker = BlazeComponent.extendComponent({ }, events() { - return [{ - 'keyup .js-date-field'() { - // parse for localized date format in strict mode - const dateMoment = moment(this.find('#date').value, 'L', true); - if (dateMoment.isValid()) { - this.error.set(''); - this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); - } - }, - 'keyup .js-time-field'() { - // parse for localized time format in strict mode - const dateMoment = moment(this.find('#time').value, 'LT', true); - if (dateMoment.isValid()) { - this.error.set(''); - } - }, - 'submit .edit-date'(evt) { - evt.preventDefault(); + return [ + { + 'keyup .js-date-field'() { + // parse for localized date format in strict mode + const dateMoment = moment(this.find('#date').value, 'L', true); + if (dateMoment.isValid()) { + this.error.set(''); + this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); + } + }, + 'keyup .js-time-field'() { + // parse for localized time format in strict mode + const dateMoment = moment(this.find('#time').value, 'LT', true); + if (dateMoment.isValid()) { + this.error.set(''); + } + }, + 'submit .edit-date'(evt) { + evt.preventDefault(); - // if no time was given, init with 12:00 - const time = evt.target.time.value || moment(new Date().setHours(12, 0, 0)).format('LT'); + // if no time was given, init with 12:00 + const time = + evt.target.time.value || + moment(new Date().setHours(12, 0, 0)).format('LT'); - const dateString = `${evt.target.date.value} ${time}`; - const newDate = moment(dateString, 'L LT', true); - if (newDate.isValid()) { - this._storeDate(newDate.toDate()); + const dateString = `${evt.target.date.value} ${time}`; + const newDate = moment(dateString, 'L LT', true); + if (newDate.isValid()) { + this._storeDate(newDate.toDate()); + Popup.close(); + } else { + this.error.set('invalid-date'); + evt.target.date.focus(); + } + }, + 'click .js-delete-date'(evt) { + evt.preventDefault(); + this._deleteDate(); Popup.close(); - } - else { - this.error.set('invalid-date'); - evt.target.date.focus(); - } - }, - 'click .js-delete-date'(evt) { - evt.preventDefault(); - this._deleteDate(); - Popup.close(); + }, }, - }]; + ]; }, }); diff --git a/client/lib/dropImage.js b/client/lib/dropImage.js index 592d5c8f..f4e1d8ab 100644 --- a/client/lib/dropImage.js +++ b/client/lib/dropImage.js @@ -11,7 +11,10 @@ $.event.fix = (function(originalFix) { return function(event) { event = originalFix.apply(this, arguments); - if (event.type.indexOf('drag') === 0 || event.type.indexOf('drop') === 0) { + if ( + event.type.indexOf('drag') === 0 || + event.type.indexOf('drop') === 0 + ) { event.dataTransfer = event.originalEvent.dataTransfer; } return event; @@ -23,7 +26,7 @@ matchType: /image.*/, }; - return $.fn.dropImageReader = function(options) { + return ($.fn.dropImageReader = function(options) { if (typeof options === 'function') { options = { callback: options, @@ -40,9 +43,9 @@ return $(element).bind('drop', function(event) { stopFn(event); const files = event.dataTransfer.files; - for(let i=0; i<files.length; i++) { + for (let i = 0; i < files.length; i++) { const f = files[i]; - if(f.type.match(options.matchType)) { + if (f.type.match(options.matchType)) { const reader = new FileReader(); reader.onload = function(evt) { return options.callback.call(element, { @@ -58,5 +61,5 @@ } }); }); - }; + }); })(jQuery); diff --git a/client/lib/escapeActions.js b/client/lib/escapeActions.js index 0757ae46..1bf32a7d 100644 --- a/client/lib/escapeActions.js +++ b/client/lib/escapeActions.js @@ -33,13 +33,19 @@ EscapeActions = { const noClickEscapeOn = options.noClickEscapeOn; - this._actions = _.sortBy([...this._actions, { - priority, - condition, - action, - noClickEscapeOn, - enabledOnClick, - }], (action) => action.priority); + this._actions = _.sortBy( + [ + ...this._actions, + { + priority, + condition, + action, + noClickEscapeOn, + enabledOnClick, + }, + ], + action => action.priority, + ); }, executeLowest() { @@ -80,10 +86,8 @@ EscapeActions = { }, _stopClick(action, clickTarget) { - if (!_.isString(action.noClickEscapeOn)) - return false; - else - return $(clickTarget).closest(action.noClickEscapeOn).length > 0; + if (!_.isString(action.noClickEscapeOn)) return false; + else return $(clickTarget).closest(action.noClickEscapeOn).length > 0; }, _execute(options) { @@ -95,14 +99,11 @@ EscapeActions = { let executedAtLeastOne = false; let maxPriority; - if (!maxLabel) - maxPriority = Infinity; - else - maxPriority = this.hierarchy.indexOf(maxLabel); + if (!maxLabel) maxPriority = Infinity; + else maxPriority = this.hierarchy.indexOf(maxLabel); for (const currentAction of this._actions) { - if (currentAction.priority > maxPriority) - return executedAtLeastOne; + if (currentAction.priority > maxPriority) return executedAtLeastOne; if (isClick && this._stopClick(currentAction, clickTarget)) return executedAtLeastOne; @@ -111,8 +112,7 @@ EscapeActions = { if (isEnabled && currentAction.condition()) { currentAction.action(); executedAtLeastOne = true; - if (!multipleActions) - return executedAtLeastOne; + if (!multipleActions) return executedAtLeastOne; } } return executedAtLeastOne; @@ -128,13 +128,15 @@ Mousetrap.bindGlobal('esc', () => { // On a left click on the document, we try to exectute one escape action (eg, // close the popup). We don't execute any action if the user has clicked on a // link or a button. -$(document).on('click', (evt) => { - if (evt.button === 0 && - $(evt.target).closest('a,button,.is-editable').length === 0) { +$(document).on('click', evt => { + if ( + evt.button === 0 && + $(evt.target).closest('a,button,.is-editable').length === 0 + ) { EscapeActions.clickExecute(evt.target, 'multiselection'); } }); -$(document).on('click', 'a[href=\\#]', (evt) => { +$(document).on('click', 'a[href=\\#]', evt => { evt.preventDefault(); }); diff --git a/client/lib/filter.js b/client/lib/filter.js index c3c1b070..f19dc617 100644 --- a/client/lib/filter.js +++ b/client/lib/filter.js @@ -71,18 +71,19 @@ class SetFilter { _getEmptySelector() { this._dep.depend(); let includeEmpty = false; - this._selectedElements.forEach((el) => { + this._selectedElements.forEach(el => { if (el === undefined) { includeEmpty = true; } }); - return includeEmpty ? { - $eq: [], - } : null; + return includeEmpty + ? { + $eq: [], + } + : null; } } - // Advanced filter forms a MongoSelector from a users String. // Build by: Ignatz 19.05.2018 (github feuerball11) class AdvancedFilter { @@ -128,7 +129,8 @@ class AdvancedFilter { current += char; continue; } - if (char === '\'') { + // eslint-disable-next-line quotes + if (char === "'") { string = !string; if (string) wasString = true; continue; @@ -139,8 +141,8 @@ class AdvancedFilter { } if (char === ' ' && !string) { commands.push({ - 'cmd': current, - 'string': wasString, + cmd: current, + string: wasString, regex, }); wasString = false; @@ -151,8 +153,8 @@ class AdvancedFilter { } if (current !== '') { commands.push({ - 'cmd': current, - 'string': wasString, + cmd: current, + string: wasString, regex, }); } @@ -161,16 +163,19 @@ class AdvancedFilter { _fieldNameToId(field) { const found = CustomFields.findOne({ - 'name': field, + name: field, }); return found._id; } _fieldValueToId(field, value) { const found = CustomFields.findOne({ - 'name': field, + name: field, }); - if (found.settings.dropdownItems && found.settings.dropdownItems.length > 0) { + if ( + found.settings.dropdownItems && + found.settings.dropdownItems.length > 0 + ) { for (let i = 0; i < found.settings.dropdownItems.length; i++) { if (found.settings.dropdownItems[i].name === value) { return found.settings.dropdownItems[i]._id; @@ -202,37 +207,32 @@ class AdvancedFilter { for (let i = 0; i < commands.length; i++) { if (commands[i].cmd) { switch (commands[i].cmd) { - case '(': - { - level++; - if (start === -1) start = i; - continue; - } - case ')': - { - level--; - commands.splice(i, 1); - i--; - continue; - } - default: - { - if (level > 0) { - subcommands.push(commands[i]); + case '(': { + level++; + if (start === -1) start = i; + continue; + } + case ')': { + level--; commands.splice(i, 1); i--; continue; } - } + default: { + if (level > 0) { + subcommands.push(commands[i]); + commands.splice(i, 1); + i--; + continue; + } + } } } } if (start !== -1) { this._processSubCommands(subcommands); - if (subcommands.length === 1) - commands.splice(start, 0, subcommands[0]); - else - commands.splice(start, 0, subcommands); + if (subcommands.length === 1) commands.splice(start, 0, subcommands[0]); + else commands.splice(start, 0, subcommands); } this._processConditions(commands); this._processLogicalOperators(commands); @@ -242,149 +242,139 @@ class AdvancedFilter { for (let i = 0; i < commands.length; i++) { if (!commands[i].string && commands[i].cmd) { switch (commands[i].cmd) { - case '=': - case '==': - case '===': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - if (commands[i + 1].regex) { - const match = str.match(new RegExp('^/(.*?)/([gimy]*)$')); - let regex = null; - if (match.length > 2) - regex = new RegExp(match[1], match[2]); - else - regex = new RegExp(match[1]); + case '=': + case '==': + case '===': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; + if (commands[i + 1].regex) { + const match = str.match(new RegExp('^/(.*?)/([gimy]*)$')); + let regex = null; + if (match.length > 2) regex = new RegExp(match[1], match[2]); + else regex = new RegExp(match[1]); + commands[i] = { + 'customFields._id': this._fieldNameToId(field), + 'customFields.value': regex, + }; + } else { + commands[i] = { + 'customFields._id': this._fieldNameToId(field), + 'customFields.value': { + $in: [this._fieldValueToId(field, str), parseInt(str, 10)], + }, + }; + } + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case '!=': + case '!==': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; + if (commands[i + 1].regex) { + const match = str.match(new RegExp('^/(.*?)/([gimy]*)$')); + let regex = null; + if (match.length > 2) regex = new RegExp(match[1], match[2]); + else regex = new RegExp(match[1]); + commands[i] = { + 'customFields._id': this._fieldNameToId(field), + 'customFields.value': { + $not: regex, + }, + }; + } else { + commands[i] = { + 'customFields._id': this._fieldNameToId(field), + 'customFields.value': { + $not: { + $in: [this._fieldValueToId(field, str), parseInt(str, 10)], + }, + }, + }; + } + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case '>': + case 'gt': + case 'Gt': + case 'GT': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; commands[i] = { 'customFields._id': this._fieldNameToId(field), - 'customFields.value': regex, + 'customFields.value': { + $gt: parseInt(str, 10), + }, }; - } else { + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case '>=': + case '>==': + case 'gte': + case 'Gte': + case 'GTE': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { - $in: [this._fieldValueToId(field, str), parseInt(str, 10)], + $gte: parseInt(str, 10), }, }; + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; } - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case '!=': - case '!==': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - if (commands[i + 1].regex) { - const match = str.match(new RegExp('^/(.*?)/([gimy]*)$')); - let regex = null; - if (match.length > 2) - regex = new RegExp(match[1], match[2]); - else - regex = new RegExp(match[1]); + case '<': + case 'lt': + case 'Lt': + case 'LT': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { - $not: regex, + $lt: parseInt(str, 10), }, }; - } else { + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case '<=': + case '<==': + case 'lte': + case 'Lte': + case 'LTE': { + const field = commands[i - 1].cmd; + const str = commands[i + 1].cmd; commands[i] = { 'customFields._id': this._fieldNameToId(field), 'customFields.value': { - $not: { - $in: [this._fieldValueToId(field, str), parseInt(str, 10)], - }, + $lte: parseInt(str, 10), }, }; + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; } - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case '>': - case 'gt': - case 'Gt': - case 'GT': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - commands[i] = { - 'customFields._id': this._fieldNameToId(field), - 'customFields.value': { - $gt: parseInt(str, 10), - }, - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case '>=': - case '>==': - case 'gte': - case 'Gte': - case 'GTE': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - commands[i] = { - 'customFields._id': this._fieldNameToId(field), - 'customFields.value': { - $gte: parseInt(str, 10), - }, - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case '<': - case 'lt': - case 'Lt': - case 'LT': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - commands[i] = { - 'customFields._id': this._fieldNameToId(field), - 'customFields.value': { - $lt: parseInt(str, 10), - }, - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case '<=': - case '<==': - case 'lte': - case 'Lte': - case 'LTE': - { - const field = commands[i - 1].cmd; - const str = commands[i + 1].cmd; - commands[i] = { - 'customFields._id': this._fieldNameToId(field), - 'customFields.value': { - $lte: parseInt(str, 10), - }, - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } } } } @@ -394,54 +384,51 @@ class AdvancedFilter { for (let i = 0; i < commands.length; i++) { if (!commands[i].string && commands[i].cmd) { switch (commands[i].cmd) { - case 'or': - case 'Or': - case 'OR': - case '|': - case '||': - { - const op1 = commands[i - 1]; - const op2 = commands[i + 1]; - commands[i] = { - $or: [op1, op2], - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case 'and': - case 'And': - case 'AND': - case '&': - case '&&': - { - const op1 = commands[i - 1]; - const op2 = commands[i + 1]; - commands[i] = { - $and: [op1, op2], - }; - commands.splice(i - 1, 1); - commands.splice(i, 1); - //changed = true; - i--; - break; - } - case 'not': - case 'Not': - case 'NOT': - case '!': - { - const op1 = commands[i + 1]; - commands[i] = { - $not: op1, - }; - commands.splice(i + 1, 1); - //changed = true; - i--; - break; - } + case 'or': + case 'Or': + case 'OR': + case '|': + case '||': { + const op1 = commands[i - 1]; + const op2 = commands[i + 1]; + commands[i] = { + $or: [op1, op2], + }; + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case 'and': + case 'And': + case 'AND': + case '&': + case '&&': { + const op1 = commands[i - 1]; + const op2 = commands[i + 1]; + commands[i] = { + $and: [op1, op2], + }; + commands.splice(i - 1, 1); + commands.splice(i, 1); + //changed = true; + i--; + break; + } + case 'not': + case 'Not': + case 'NOT': + case '!': { + const op1 = commands[i + 1]; + commands[i] = { + $not: op1, + }; + commands.splice(i + 1, 1); + //changed = true; + i--; + break; + } } } } @@ -452,7 +439,6 @@ class AdvancedFilter { const commands = this._filterToCommands(); return this._arrayToSelector(commands); } - } // The global Filter object. @@ -477,23 +463,26 @@ Filter = { _exceptionsDep: new Tracker.Dependency(), isActive() { - return _.any(this._fields, (fieldName) => { - return this[fieldName]._isActive(); - }) || this.advanced._isActive(); + return ( + _.any(this._fields, fieldName => { + return this[fieldName]._isActive(); + }) || this.advanced._isActive() + ); }, _getMongoSelector() { - if (!this.isActive()) - return {}; + if (!this.isActive()) return {}; const filterSelector = {}; const emptySelector = {}; let includeEmptySelectors = false; - this._fields.forEach((fieldName) => { + this._fields.forEach(fieldName => { const filter = this[fieldName]; if (filter._isActive()) { if (filter.subField !== '') { - filterSelector[`${fieldName}.${filter.subField}`] = filter._getMongoSelector(); + filterSelector[ + `${fieldName}.${filter.subField}` + ] = filter._getMongoSelector(); } else { filterSelector[fieldName] = filter._getMongoSelector(); } @@ -513,11 +502,15 @@ Filter = { const selectors = [exceptionsSelector]; - if (_.any(this._fields, (fieldName) => { - return this[fieldName]._isActive(); - })) selectors.push(filterSelector); + if ( + _.any(this._fields, fieldName => { + return this[fieldName]._isActive(); + }) + ) + selectors.push(filterSelector); if (includeEmptySelectors) selectors.push(emptySelector); - if (this.advanced._isActive()) selectors.push(this.advanced._getMongoSelector()); + if (this.advanced._isActive()) + selectors.push(this.advanced._getMongoSelector()); return { $or: selectors, @@ -526,8 +519,7 @@ Filter = { mongoSelector(additionalSelector) { const filterSelector = this._getMongoSelector(); - if (_.isUndefined(additionalSelector)) - return filterSelector; + if (_.isUndefined(additionalSelector)) return filterSelector; else return { $and: [filterSelector, additionalSelector], @@ -535,7 +527,7 @@ Filter = { }, reset() { - this._fields.forEach((fieldName) => { + this._fields.forEach(fieldName => { const filter = this[fieldName]; filter.reset(); }); diff --git a/client/lib/i18n.js b/client/lib/i18n.js index 97a91375..b4a95eae 100644 --- a/client/lib/i18n.js +++ b/client/lib/i18n.js @@ -12,7 +12,7 @@ Meteor.startup(() => { } if (!language) { - if(navigator.languages) { + if (navigator.languages) { language = navigator.languages[0]; } else { language = navigator.language || navigator.userLanguage; diff --git a/client/lib/inlinedform.js b/client/lib/inlinedform.js index d33786ae..f2ebe31e 100644 --- a/client/lib/inlinedform.js +++ b/client/lib/inlinedform.js @@ -48,35 +48,43 @@ InlinedForm = BlazeComponent.extendComponent({ }, events() { - return [{ - 'click .js-close-inlined-form': this.close, - 'click .js-open-inlined-form': this.open, + return [ + { + 'click .js-close-inlined-form': this.close, + 'click .js-open-inlined-form': this.open, - // Pressing Ctrl+Enter should submit the form - 'keydown form textarea'(evt) { - if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) { - this.find('button[type=submit]').click(); - } - }, + // Pressing Ctrl+Enter should submit the form + 'keydown form textarea'(evt) { + if (evt.keyCode === 13 && (evt.metaKey || evt.ctrlKey)) { + this.find('button[type=submit]').click(); + } + }, - // Close the inlined form when after its submission - submit() { - if (this.currentData().autoclose !== false) { - Tracker.afterFlush(() => { - this.close(); - }); - } + // Close the inlined form when after its submission + submit() { + if (this.currentData().autoclose !== false) { + Tracker.afterFlush(() => { + this.close(); + }); + } + }, }, - }]; + ]; }, }).register('inlinedForm'); // Press escape to close the currently opened inlinedForm -EscapeActions.register('inlinedForm', - () => { currentlyOpenedForm.get().close(); }, - () => { return currentlyOpenedForm.get() !== null; }, { +EscapeActions.register( + 'inlinedForm', + () => { + currentlyOpenedForm.get().close(); + }, + () => { + return currentlyOpenedForm.get() !== null; + }, + { enabledOnClick: false, - } + }, ); // submit on click outside diff --git a/client/lib/keyboard.js b/client/lib/keyboard.js index 7abfa88d..d3f974be 100755 --- a/client/lib/keyboard.js +++ b/client/lib/keyboard.js @@ -40,8 +40,10 @@ Mousetrap.bind(['down', 'up'], (evt, key) => { return; } - const nextFunc = (key === 'down' ? 'next' : 'prev'); - const nextCard = $('.js-minicard.is-selected')[nextFunc]('.js-minicard').get(0); + const nextFunc = key === 'down' ? 'next' : 'prev'; + const nextCard = $('.js-minicard.is-selected') + [nextFunc]('.js-minicard') + .get(0); if (nextCard) { const nextCardId = Blaze.getData(nextCard)._id; Utils.goCardId(nextCardId); @@ -49,7 +51,7 @@ Mousetrap.bind(['down', 'up'], (evt, key) => { }); // XXX This shortcut should also work when hovering over a card in board view -Mousetrap.bind('space', (evt) => { +Mousetrap.bind('space', evt => { if (!Session.get('currentCard')) { return; } @@ -69,29 +71,38 @@ Mousetrap.bind('space', (evt) => { }); Template.keyboardShortcuts.helpers({ - mapping: [{ - keys: ['W'], - action: 'shortcut-toggle-sidebar', - }, { - keys: ['Q'], - action: 'shortcut-filter-my-cards', - }, { - keys: ['F'], - action: 'shortcut-toggle-filterbar', - }, { - keys: ['X'], - action: 'shortcut-clear-filters', - }, { - keys: ['?'], - action: 'shortcut-show-shortcuts', - }, { - keys: ['ESC'], - action: 'shortcut-close-dialog', - }, { - keys: ['@'], - action: 'shortcut-autocomplete-members', - }, { - keys: ['SPACE'], - action: 'shortcut-assign-self', - }], + mapping: [ + { + keys: ['W'], + action: 'shortcut-toggle-sidebar', + }, + { + keys: ['Q'], + action: 'shortcut-filter-my-cards', + }, + { + keys: ['F'], + action: 'shortcut-toggle-filterbar', + }, + { + keys: ['X'], + action: 'shortcut-clear-filters', + }, + { + keys: ['?'], + action: 'shortcut-show-shortcuts', + }, + { + keys: ['ESC'], + action: 'shortcut-close-dialog', + }, + { + keys: ['@'], + action: 'shortcut-autocomplete-members', + }, + { + keys: ['SPACE'], + action: 'shortcut-assign-self', + }, + ], }); diff --git a/client/lib/modal.js b/client/lib/modal.js index 3c27a179..1086734e 100644 --- a/client/lib/modal.js +++ b/client/lib/modal.js @@ -1,6 +1,6 @@ const closedValue = null; -window.Modal = new class { +window.Modal = new (class { constructor() { this._currentModal = new ReactiveVar(closedValue); this._onCloseGoTo = ''; @@ -21,7 +21,7 @@ window.Modal = new class { return this.getTemplateName() !== closedValue; } - isWide(){ + isWide() { return this._isWideModal; } @@ -32,23 +32,23 @@ window.Modal = new class { } } - openWide(modalName, { header = '', onCloseGoTo = ''} = {}) { + openWide(modalName, { header = '', onCloseGoTo = '' } = {}) { this._currentModal.set({ header, modalName }); this._onCloseGoTo = onCloseGoTo; this._isWideModal = true; } - open(modalName, { header = '', onCloseGoTo = ''} = {}) { + open(modalName, { header = '', onCloseGoTo = '' } = {}) { this._currentModal.set({ header, modalName }); this._onCloseGoTo = onCloseGoTo; - } -}(); +})(); Blaze.registerHelper('Modal', Modal); -EscapeActions.register('modalWindow', +EscapeActions.register( + 'modalWindow', () => Modal.close(), () => Modal.isOpen(), - { noClickEscapeOn: '.modal-container' } + { noClickEscapeOn: '.modal-container' }, ); diff --git a/client/lib/multiSelection.js b/client/lib/multiSelection.js index 30577fd4..ab6a046f 100644 --- a/client/lib/multiSelection.js +++ b/client/lib/multiSelection.js @@ -1,6 +1,4 @@ - function getCardsBetween(idA, idB) { - function pluckId(doc) { return doc._id; } @@ -15,7 +13,7 @@ function getCardsBetween(idA, idB) { }).map(pluckId); } - const cards = _.sortBy([Cards.findOne(idA), Cards.findOne(idB)], (c) => { + const cards = _.sortBy([Cards.findOne(idA), Cards.findOne(idB)], c => { return c.sort; }); @@ -31,17 +29,21 @@ function getCardsBetween(idA, idB) { }; } else { selector = { - $or: [{ - listId: cards[0].listId, - sort: { $lte: cards[0].sort }, - }, { - listId: { - $in: getListsStrictlyBetween(cards[0].listId, cards[1].listId), + $or: [ + { + listId: cards[0].listId, + sort: { $lte: cards[0].sort }, + }, + { + listId: { + $in: getListsStrictlyBetween(cards[0].listId, cards[1].listId), + }, }, - }, { - listId: cards[1].listId, - sort: { $gte: cards[1].sort }, - }], + { + listId: cards[1].listId, + sort: { $gte: cards[1].sort }, + }, + ], archived: false, }; } @@ -133,14 +135,12 @@ MultiSelection = { const selectedCards = this._selectedCards.get(); - cardIds.forEach((cardId) => { + cardIds.forEach(cardId => { const indexOfCard = selectedCards.indexOf(cardId); if (options.remove && indexOfCard > -1) selectedCards.splice(indexOfCard, 1); - - else if (options.add) - selectedCards.push(cardId); + else if (options.add) selectedCards.push(cardId); }); this._selectedCards.set(selectedCards); @@ -153,9 +153,15 @@ MultiSelection = { Blaze.registerHelper('MultiSelection', MultiSelection); -EscapeActions.register('multiselection', - () => { MultiSelection.disable(); }, - () => { return MultiSelection.isActive(); }, { +EscapeActions.register( + 'multiselection', + () => { + MultiSelection.disable(); + }, + () => { + return MultiSelection.isActive(); + }, + { noClickEscapeOn: '.js-minicard,.js-board-sidebar-content', - } + }, ); diff --git a/client/lib/pasteImage.js b/client/lib/pasteImage.js index 264d77ac..e6f8c6c2 100644 --- a/client/lib/pasteImage.js +++ b/client/lib/pasteImage.js @@ -11,7 +11,10 @@ $.event.fix = (function(originalFix) { return function(event) { event = originalFix.apply(this, arguments); - if (event.type.indexOf('copy') === 0 || event.type.indexOf('paste') === 0) { + if ( + event.type.indexOf('copy') === 0 || + event.type.indexOf('paste') === 0 + ) { event.clipboardData = event.originalEvent.clipboardData; } return event; @@ -23,7 +26,7 @@ matchType: /image.*/, }; - return $.fn.pasteImageReader = function(options) { + return ($.fn.pasteImageReader = function(options) { if (typeof options === 'function') { options = { callback: options, @@ -35,8 +38,11 @@ return $(element).bind('paste', function(event) { const types = event.clipboardData.types; const items = event.clipboardData.items; - for(let i=0; i<types.length; i++) { - if(types[i].match(options.matchType) || items[i].type.match(options.matchType)) { + for (let i = 0; i < types.length; i++) { + if ( + types[i].match(options.matchType) || + items[i].type.match(options.matchType) + ) { const f = items[i].getAsFile(); const reader = new FileReader(); reader.onload = function(evt) { @@ -53,5 +59,5 @@ } }); }); - }; + }); })(jQuery); diff --git a/client/lib/popup.js b/client/lib/popup.js index 9abe48aa..6c294d32 100644 --- a/client/lib/popup.js +++ b/client/lib/popup.js @@ -1,4 +1,4 @@ -window.Popup = new class { +window.Popup = new (class { constructor() { // The template we use to render popups this.template = Template.popup; @@ -67,7 +67,7 @@ window.Popup = new class { title: self._getTitle(popupName), depth: self._stack.length, offset: self._getOffset(openerElement), - dataContext: this.currentData && this.currentData() || this, + dataContext: (this.currentData && this.currentData()) || this, }); // If there are no popup currently opened we use the Blaze API to render @@ -80,11 +80,14 @@ window.Popup = new class { // our internal dependency, and since we just changed the top element of // our internal stack, the popup will be updated with the new data. if (!self.isOpen()) { - self.current = Blaze.renderWithData(self.template, () => { - self._dep.depend(); - return { ...self._getTopStack(), stack: self._stack }; - }, document.body); - + self.current = Blaze.renderWithData( + self.template, + () => { + self._dep.depend(); + return { ...self._getTopStack(), stack: self._stack }; + }, + document.body, + ); } else { self._dep.changed(); } @@ -101,7 +104,7 @@ window.Popup = new class { const self = this; return function(evt, tpl) { - const context = this.currentData && this.currentData() || this; + const context = (this.currentData && this.currentData()) || this; context.__afterConfirmAction = action; self.open(name).call(context, evt, tpl); }; @@ -136,7 +139,6 @@ window.Popup = new class { const openerElement = this._getTopStack().openerElement; $(openerElement).removeClass('is-active'); - this._stack = []; } } @@ -159,7 +161,7 @@ window.Popup = new class { return () => { Utils.windowResizeDep.depend(); - if(Utils.isMiniScreen()) return { left:0, top:0 }; + if (Utils.isMiniScreen()) return { left: 0, top: 0 }; const offset = $element.offset(); const popupWidth = 300 + 15; @@ -188,18 +190,19 @@ window.Popup = new class { return title !== translationKey ? title : defaultTitle; }; } -}(); +})(); // We close a potential opened popup on any left click on the document, or go // one step back by pressing escape. const escapeActions = ['back', 'close']; -escapeActions.forEach((actionName) => { - EscapeActions.register(`popup-${actionName}`, +escapeActions.forEach(actionName => { + EscapeActions.register( + `popup-${actionName}`, () => Popup[actionName](), () => Popup.isOpen(), { noClickEscapeOn: '.js-pop-over,.js-open-card-title-popup', enabledOnClick: actionName === 'close', - } + }, ); }); diff --git a/client/lib/textComplete.js b/client/lib/textComplete.js index 69820514..0261d7f6 100644 --- a/client/lib/textComplete.js +++ b/client/lib/textComplete.js @@ -47,9 +47,6 @@ $.fn.escapeableTextComplete = function(strategies, options, ...otherArgs) { }); }; -EscapeActions.register('textcomplete', - () => {}, - () => dropdownMenuIsOpened, { - noClickEscapeOn: '.textcomplete-dropdown', - } -); +EscapeActions.register('textcomplete', () => {}, () => dropdownMenuIsOpened, { + noClickEscapeOn: '.textcomplete-dropdown', +}); diff --git a/client/lib/unsavedEdits.js b/client/lib/unsavedEdits.js index 9c02eb84..a67d0eef 100644 --- a/client/lib/unsavedEdits.js +++ b/client/lib/unsavedEdits.js @@ -34,13 +34,13 @@ UnsavedEdits = { }, has({ fieldName, docId }) { - return Boolean(this.get({fieldName, docId})); + return Boolean(this.get({ fieldName, docId })); }, set({ fieldName, docId }, value) { const currentDoc = this._getCollectionDocument(fieldName, docId); if (currentDoc) { - UnsavedEditCollection.update(currentDoc._id, { $set: { value }}); + UnsavedEditCollection.update(currentDoc._id, { $set: { value } }); } else { UnsavedEditCollection.insert({ fieldName, @@ -58,7 +58,7 @@ UnsavedEdits = { }, _getCollectionDocument(fieldName, docId) { - return UnsavedEditCollection.findOne({fieldName, docId}); + return UnsavedEditCollection.findOne({ fieldName, docId }); }, }; diff --git a/client/lib/utils.js b/client/lib/utils.js index e2339763..5681273e 100644 --- a/client/lib/utils.js +++ b/client/lib/utils.js @@ -2,20 +2,26 @@ Utils = { // XXX We should remove these two methods goBoardId(_id) { const board = Boards.findOne(_id); - return board && FlowRouter.go('board', { - id: board._id, - slug: board.slug, - }); + return ( + board && + FlowRouter.go('board', { + id: board._id, + slug: board.slug, + }) + ); }, goCardId(_id) { const card = Cards.findOne(_id); const board = Boards.findOne(card.boardId); - return board && FlowRouter.go('card', { - cardId: card._id, - boardId: board._id, - slug: board.slug, - }); + return ( + board && + FlowRouter.go('card', { + cardId: card._id, + boardId: board._id, + slug: board.slug, + }) + ); }, capitalize(string) { @@ -104,13 +110,21 @@ Utils = { return window.matchMedia(query).matches; }; - if (('ontouchstart' in window) || window.DocumentTouch && document instanceof window.DocumentTouch) { + if ( + 'ontouchstart' in window || + (window.DocumentTouch && document instanceof window.DocumentTouch) + ) { return true; } // include the 'heartz' as a way to have a non matching MQ to help terminate the join // https://git.io/vznFH - const query = ['(', prefixes.join('touch-enabled),('), 'heartz', ')'].join(''); + const query = [ + '(', + prefixes.join('touch-enabled),('), + 'heartz', + ')', + ].join(''); return mq(query); })(); Utils.isTouchDevice = () => isTouchable; @@ -120,7 +134,7 @@ Utils = { calculateTouchDistance(touchA, touchB) { return Math.sqrt( Math.pow(touchA.screenX - touchB.screenX, 2) + - Math.pow(touchA.screenY - touchB.screenY, 2) + Math.pow(touchA.screenY - touchB.screenY, 2), ); }, @@ -136,7 +150,11 @@ Utils = { lastTouch = touches[touches.length - 1]; }); $(document).on('touchend', selector, function(e) { - if (touchStart && lastTouch && Utils.calculateTouchDistance(touchStart, lastTouch) <= 20) { + if ( + touchStart && + lastTouch && + Utils.calculateTouchDistance(touchStart, lastTouch) <= 20 + ) { e.preventDefault(); const clickEvent = document.createEvent('MouseEvents'); clickEvent.initEvent('click', true, true); @@ -145,30 +163,30 @@ Utils = { }); }, - manageCustomUI(){ + manageCustomUI() { Meteor.call('getCustomUI', (err, data) => { - if (err && err.error[0] === 'var-not-exist'){ + if (err && err.error[0] === 'var-not-exist') { Session.set('customUI', false); // siteId || address server not defined } - if (!err){ + if (!err) { Utils.setCustomUI(data); } }); }, - setCustomUI(data){ + setCustomUI(data) { const currentBoard = Boards.findOne(Session.get('currentBoard')); if (currentBoard) { - DocHead.setTitle(`${currentBoard.title } - ${ data.productName}`); + DocHead.setTitle(`${currentBoard.title} - ${data.productName}`); } else { DocHead.setTitle(`${data.productName}`); } }, - setMatomo(data){ + setMatomo(data) { window._paq = window._paq || []; window._paq.push(['setDoNotTrack', data.doNotTrack]); - if (data.withUserName){ + if (data.withUserName) { window._paq.push(['setUserId', Meteor.user().username]); } window._paq.push(['trackPageView']); @@ -196,12 +214,12 @@ Utils = { manageMatomo() { const matomo = Session.get('matomo'); - if (matomo === undefined){ + if (matomo === undefined) { Meteor.call('getMatomoConf', (err, data) => { - if (err && err.error[0] === 'var-not-exist'){ + if (err && err.error[0] === 'var-not-exist') { Session.set('matomo', false); // siteId || address server not defined } - if (!err){ + if (!err) { Utils.setMatomo(data); } }); @@ -220,15 +238,21 @@ Utils = { finalString += element.text().toLowerCase(); } else if (element.hasClass('user-details')) { let username = element.find('input').val(); - if(username === undefined || username === ''){ + if (username === undefined || username === '') { username = '*'; } - finalString += `${element.find('.trigger-text').text().toLowerCase() } ${ username}`; + finalString += `${element + .find('.trigger-text') + .text() + .toLowerCase()} ${username}`; } else if (element.find('select').length > 0) { - finalString += element.find('select option:selected').text().toLowerCase(); + finalString += element + .find('select option:selected') + .text() + .toLowerCase(); } else if (element.find('input').length > 0) { let inputvalue = element.find('input').val(); - if(inputvalue === undefined || inputvalue === ''){ + if (inputvalue === undefined || inputvalue === '') { inputvalue = '*'; } finalString += inputvalue; |