From 1ad44de8c6774a7caee43eeecdafe1893234e890 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Mon, 26 Sep 2016 11:40:43 -0400 Subject: powerbox identity requests --- client/components/sidebar/sidebar.jade | 10 ++++++---- client/components/sidebar/sidebar.js | 3 +++ 2 files changed, 9 insertions(+), 4 deletions(-) (limited to 'client/components') diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 4f5586cb..51600acf 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -30,10 +30,12 @@ template(name="membersWidget") .board-widget-content each currentBoard.activeMembers +userAvatar(userId=this.userId showStatus=true) - unless isSandstorm - if currentUser.isBoardAdmin - a.member.add-member.js-manage-board-members - i.fa.fa-plus + if isSandstorm + a.member.add-member.sandstorm-powerbox-request-identity + i.fa.fa-plus + else if currentUser.isBoardAdmin + a.member.add-member.js-manage-board-members + i.fa.fa-plus .clearfix if isInvited hr diff --git a/client/components/sidebar/sidebar.js b/client/components/sidebar/sidebar.js index 0af32f8f..f32a27c5 100644 --- a/client/components/sidebar/sidebar.js +++ b/client/components/sidebar/sidebar.js @@ -163,6 +163,9 @@ Template.membersWidget.helpers({ Template.membersWidget.events({ 'click .js-member': Popup.open('member'), 'click .js-manage-board-members': Popup.open('addMember'), + 'click .sandstorm-powerbox-request-identity'() { + window.sandstormRequestIdentity(); + }, 'click .js-member-invite-accept'() { const boardId = Session.get('currentBoard'); Meteor.user().removeInvite(boardId); -- cgit v1.2.3-1-g7c22 From 95680ef43abafd8d6cce9d879519bc8ba5091c8a Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Tue, 27 Sep 2016 10:49:02 -0400 Subject: only show 'add member' button to users who can edit the board --- client/components/sidebar/sidebar.jade | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'client/components') diff --git a/client/components/sidebar/sidebar.jade b/client/components/sidebar/sidebar.jade index 51600acf..f3fdd1bc 100644 --- a/client/components/sidebar/sidebar.jade +++ b/client/components/sidebar/sidebar.jade @@ -31,8 +31,9 @@ template(name="membersWidget") each currentBoard.activeMembers +userAvatar(userId=this.userId showStatus=true) if isSandstorm - a.member.add-member.sandstorm-powerbox-request-identity - i.fa.fa-plus + if currentUser.isBoardMember + a.member.add-member.sandstorm-powerbox-request-identity + i.fa.fa-plus else if currentUser.isBoardAdmin a.member.add-member.js-manage-board-members i.fa.fa-plus -- cgit v1.2.3-1-g7c22 From 300b40ed87fd3603a00888f83f19c588d2868273 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 17:23:49 +0100 Subject: UI: Fixed background on hover for labels in filter sidebar --- client/components/sidebar/sidebar.styl | 1 + 1 file changed, 1 insertion(+) (limited to 'client/components') diff --git a/client/components/sidebar/sidebar.styl b/client/components/sidebar/sidebar.styl index 9007af59..24abe990 100644 --- a/client/components/sidebar/sidebar.styl +++ b/client/components/sidebar/sidebar.styl @@ -51,6 +51,7 @@ .member, .card-label margin-right: 7px + margin-top: 5px .sidebar-list-item-description flex: 1 -- cgit v1.2.3-1-g7c22 From 5968792ad2d94291721fd0f95df6d66541150442 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:48:24 +0100 Subject: added buttons to support filtering by empty labels and members --- client/components/sidebar/sidebarFilters.jade | 12 ++++++++++++ 1 file changed, 12 insertions(+) (limited to 'client/components') diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 2b326493..0a7fbfb0 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -5,6 +5,12 @@ template(name="filterSidebar") ul.sidebar-list + li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}") + a.name.js-toggle-label-filter + span.sidebar-list-item-description + {{_ 'filter-no-label'}} + if Filter.labelIds.isSelected undefined + i.fa.fa-check each currentBoard.labels li a.name.js-toggle-label-filter @@ -18,6 +24,12 @@ template(name="filterSidebar") i.fa.fa-check hr ul.sidebar-list + li(class="{{#if Filter.members.isSelected undefined}}active{{/if}}") + a.name.js-toggle-member-filter + span.sidebar-list-item-description + {{_ 'filter-no-member'}} + if Filter.members.isSelected undefined + i.fa.fa-check each currentBoard.activeMembers with getUser userId li(class="{{#if Filter.members.isSelected _id}}active{{/if}}") -- cgit v1.2.3-1-g7c22 From 4dc0ec07b8560d0814ed5cb72b2cac93722bb93c Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sun, 13 Nov 2016 20:57:23 +0100 Subject: removed unused html span element --- client/components/sidebar/sidebarFilters.jade | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'client/components') diff --git a/client/components/sidebar/sidebarFilters.jade b/client/components/sidebar/sidebarFilters.jade index 0a7fbfb0..deefde82 100644 --- a/client/components/sidebar/sidebarFilters.jade +++ b/client/components/sidebar/sidebarFilters.jade @@ -8,7 +8,7 @@ template(name="filterSidebar") li(class="{{#if Filter.labelIds.isSelected undefined}}active{{/if}}") a.name.js-toggle-label-filter span.sidebar-list-item-description - {{_ 'filter-no-label'}} + {{_ 'filter-no-label'}} if Filter.labelIds.isSelected undefined i.fa.fa-check each currentBoard.labels @@ -27,7 +27,7 @@ template(name="filterSidebar") li(class="{{#if Filter.members.isSelected undefined}}active{{/if}}") a.name.js-toggle-member-filter span.sidebar-list-item-description - {{_ 'filter-no-member'}} + {{_ 'filter-no-member'}} if Filter.members.isSelected undefined i.fa.fa-check each currentBoard.activeMembers -- cgit v1.2.3-1-g7c22 From 69fbd31abc5772f7d092caf501e536e88cdc0e2d Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:18:16 +0100 Subject: Display message when user wants to choose existing username (Fixes: #16) --- client/components/users/userHeader.jade | 2 ++ client/components/users/userHeader.js | 15 +++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) (limited to 'client/components') diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index a71e7fc7..ce8cf1af 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -27,6 +27,8 @@ template(name="editProfilePopup") input.js-profile-fullname(type="text" value=profile.fullname autofocus) label | {{_ 'username'}} + span.error.hide.username-taken + | {{_ 'error-username-taken'}} input.js-profile-username(type="text" value=username) label | {{_ 'initials'}} diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 10fdf699..e060c13a 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -26,11 +26,18 @@ Template.editProfilePopup.events({ 'profile.fullname': fullname, 'profile.initials': initials, }}); - // XXX We should report the error to the user. + if (username !== Meteor.user().username) { - Meteor.call('setUsername', username); - } - Popup.back(); + Meteor.call('setUsername', username, function(error) { + const messageElement = tpl.$('.username-taken'); + if (error) { + messageElement.show(); + } else { + messageElement.hide(); + Popup.back(); + } + }); + } else Popup.back(); }, }); -- cgit v1.2.3-1-g7c22 From 828d34b70eeb4a86d9a18564e703a28001b4601e Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 18 Nov 2016 23:23:13 +0100 Subject: fixed indentation --- client/components/users/userHeader.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'client/components') diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index e060c13a..17d9eb5f 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -31,7 +31,7 @@ Template.editProfilePopup.events({ Meteor.call('setUsername', username, function(error) { const messageElement = tpl.$('.username-taken'); if (error) { - messageElement.show(); + messageElement.show(); } else { messageElement.hide(); Popup.back(); -- cgit v1.2.3-1-g7c22 From 8290dcb249fa9044a6d491c618dbe9c727d41214 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:02:33 +0100 Subject: New change settings option and possibility to hide system messagaes --- client/components/activities/activities.js | 4 +++- client/components/users/userHeader.jade | 17 +++++++++++++---- client/components/users/userHeader.js | 13 +++++++++++++ 3 files changed, 29 insertions(+), 5 deletions(-) (limited to 'client/components') diff --git a/client/components/activities/activities.js b/client/components/activities/activities.js index 0bd6a272..6600849c 100644 --- a/client/components/activities/activities.js +++ b/client/components/activities/activities.js @@ -12,10 +12,12 @@ BlazeComponent.extendComponent({ const capitalizedMode = Utils.capitalize(mode); const id = Session.get(`current${capitalizedMode}`); const limit = this.page.get() * activitiesPerPage; + const user = Meteor.user(); + const hideSystem = user ? user.hasHiddenSystemMessages() : false; if (id === null) return; - this.subscribe('activities', mode, id, limit, () => { + this.subscribe('activities', mode, id, limit, hideSystem, () => { this.loadNextPageLocked = false; // If the sibear peak hasn't increased, that mean that there are no more diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index a71e7fc7..21c3c382 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -12,10 +12,11 @@ template(name="memberMenuPopup") ul.pop-over-list with currentUser li: a.js-edit-profile {{_ 'edit-profile'}} - li: a.js-change-avatar {{_ 'edit-avatar'}} - li: a.js-change-password {{_ 'changePasswordPopup-title'}} - li: a.js-change-language {{_ 'changeLanguagePopup-title'}} - li: a.js-edit-notification {{_ 'editNotificationPopup-title'}} + li: a.js-change-settings {{_ 'change-settings'}} + li: a.js-change-avatar {{_ 'edit-avatar'}} + li: a.js-change-password {{_ 'changePasswordPopup-title'}} + li: a.js-change-language {{_ 'changeLanguagePopup-title'}} + li: a.js-edit-notification {{_ 'editNotificationPopup-title'}} hr ul.pop-over-list li: a.js-logout {{_ 'log-out'}} @@ -61,3 +62,11 @@ template(name="changeLanguagePopup") = name if isCurrentLanguage i.fa.fa-check + +template(name="changeSettingsPopup") + ul.pop-over-list + li + a.js-toggle-system-messages + | {{_ 'hide-system-messages'}} + if hiddenSystemMessages + i.fa.fa-check diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 10fdf699..a2682a5f 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -5,6 +5,7 @@ Template.headerUserBar.events({ Template.memberMenuPopup.events({ 'click .js-edit-profile': Popup.open('editProfile'), + 'click .js-change-settings': Popup.open('changeSettings'), 'click .js-change-avatar': Popup.open('changeAvatar'), 'click .js-change-password': Popup.open('changePassword'), 'click .js-change-language': Popup.open('changeLanguage'), @@ -82,3 +83,15 @@ Template.changeLanguagePopup.events({ evt.preventDefault(); }, }); + +Template.changeSettingsPopup.helpers({ + hiddenSystemMessages() { + return Meteor.user().hasHiddenSystemMessages(); + } +}); + +Template.changeSettingsPopup.events({ + 'click .js-toggle-system-messages'(evt) { + Meteor.call('toggleSystemMessages'); + }, +}); -- cgit v1.2.3-1-g7c22 From 4359f66ecee8003f0fa625fd5e293ba38cc133e3 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Sat, 19 Nov 2016 19:19:24 +0100 Subject: Fixed build --- client/components/users/userHeader.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'client/components') diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index a2682a5f..1f2f1d9b 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -87,11 +87,11 @@ Template.changeLanguagePopup.events({ Template.changeSettingsPopup.helpers({ hiddenSystemMessages() { return Meteor.user().hasHiddenSystemMessages(); - } + }, }); Template.changeSettingsPopup.events({ - 'click .js-toggle-system-messages'(evt) { + 'click .js-toggle-system-messages'() { Meteor.call('toggleSystemMessages'); }, }); -- cgit v1.2.3-1-g7c22 From d4497d7aeb968dbb9f8c4b84fbcc0f7cc3668167 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 20:23:09 +0100 Subject: Add basic start and due dates for cards. --- client/components/cards/cardDate.jade | 20 ++++ client/components/cards/cardDate.js | 193 +++++++++++++++++++++++++++++++ client/components/cards/cardDate.styl | 50 ++++++++ client/components/cards/cardDetails.jade | 13 +++ client/components/cards/cardDetails.js | 2 + client/components/cards/cardDetails.styl | 7 +- 6 files changed, 284 insertions(+), 1 deletion(-) create mode 100644 client/components/cards/cardDate.jade create mode 100644 client/components/cards/cardDate.js create mode 100644 client/components/cards/cardDate.styl (limited to 'client/components') diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade new file mode 100644 index 00000000..ca074879 --- /dev/null +++ b/client/components/cards/cardDate.jade @@ -0,0 +1,20 @@ +template(name="editCardDate") + .edit-card-date + form.edit-date + .fields + .left + label(for="date") {{_ 'date'}} + input.js-date-field#date(type="text" name="date" value=showDate placeholder=dateFormat autofocus) + .right + label(for="time") {{_ 'time'}} + input.js-time-field#time(type="text" name="time" value=showTime placeholder=timeFormat) + .js-datepicker + if error.get + .warning {{_ error.get}} + button.primary.wide.left.js-submit-date(type="submit") {{_ 'save'}} + button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}} + +template(name="dateBadge") + a.js-edit-date.card-date(title="{{showTitle}}") + time(datetime="{{showISODate}}") + | {{showDate}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js new file mode 100644 index 00000000..4a24941d --- /dev/null +++ b/client/components/cards/cardDate.js @@ -0,0 +1,193 @@ +// Edit start & due dates +const EditCardDate = BlazeComponent.extendComponent({ + template() { + return 'editCardDate'; + }, + + onCreated() { + this.error = new ReactiveVar(''); + this.card = this.data(); + this.date = new ReactiveVar(moment.invalid()); + }, + + onRendered() { + let $picker = this.$('.js-datepicker').datepicker({ + todayHighlight: true, + todayBtn: 'linked', + language: TAPi18n.getLanguage() + }).on('changeDate', function(e) { + const localDate = moment(e.date).format('L'); + date.value = localDate; + this.error.set(''); + time.focus(); + }.bind(this)); + + if (this.date.get().isValid()) { + $picker.datepicker('update', this.date.get().toDate()); + } + }, + + showDate() { + if (this.date.get().isValid()) + return this.date.get().format('L'); + }, + showTime() { + if (this.date.get().isValid()) + return this.date.get().format('LT'); + }, + dateFormat() { + return moment.localeData().longDateFormat('L'); + }, + timeFormat() { + return moment.localeData().longDateFormat('LT'); + }, + + events() { + return [{ + 'keyup .js-date-field'(evt) { + // parse for localized date format in strict mode + const dateMoment = moment(date.value, 'L', true); + if (dateMoment.isValid()) { + this.error.set(''); + this.$('.js-datepicker').datepicker('update', dateMoment.toDate()); + } + }, + 'keyup .js-time-field'(evt) { + // parse for localized time format in strict mode + const dateMoment = moment(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 + var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); + + const dateString = evt.target.date.value + ' ' + time; + const newDate = moment.utc(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(); + }, + }]; + }, +}); + +// editCardStartDatePopup +(class extends EditCardDate { + onCreated() { + super(); + if (this.data().startAt) { + this.date.set(moment.utc(this.data().startAt)); + } + } + + _storeDate(date) { + this.card.setStart(date); + } + + _deleteDate() { + this.card.unsetStart(); + } +}).register('editCardStartDatePopup'); + +// editCardDueDatePopup +(class extends EditCardDate { + onCreated() { + super(); + if (this.data().dueAt !== undefined) { + this.date.set(moment.utc(this.data().dueAt)); + } + } + + onRendered() { + super(); + if (moment.isDate(this.card.startAt)) { + this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); + } + } + + _storeDate(date) { + this.card.setDue(date); + } + + _deleteDate() { + this.card.unsetDue(); + } +}).register('editCardDueDatePopup'); + + + +// Display start & due dates +const CardDate = BlazeComponent.extendComponent({ + template() { + return 'dateBadge'; + }, + + onCreated() { + this.date = ReactiveVar(); + }, + + showDate() { + // this will start working once mquandalle:moment + // is updated to at least moment.js 2.10.5 + // until then, the date is displayed in the "L" format + return this.date.get().calendar(null, { + sameElse: 'llll' + }); + }, + + showTitle() { + return this.date.get().format('LLLL'); + }, + + showISODate() { + return this.date.get().toISOString(); + }, +}); + +// cardStartDate +(class extends CardDate { + onCreated() { + super(); + let self = this; + this.autorun(() => { + self.date.set(moment.utc(this.data().startAt)); + }); + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardStartDate'), + }); + } +}).register('cardStartDate'); + +// cardDueDate +(class extends CardDate { + onCreated() { + super(); + let self = this; + this.autorun(() => { + self.date.set(moment.utc(this.data().dueAt)); + }); + } + + events() { + return super.events().concat({ + 'click .js-edit-date': Popup.open('editCardDueDate'), + }); + } +}).register('cardDueDate'); diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl new file mode 100644 index 00000000..e9d56f79 --- /dev/null +++ b/client/components/cards/cardDate.styl @@ -0,0 +1,50 @@ +.edit-card-date + .fields + .left + width: 56% + .right + width: 38% + .datepicker + width: 100% + table + width: 100% + border: none + border-spacing: 0 + border-collapse: collapse + thead + background: none + td, th + box-sizing: border-box + + +.card-date + display: block + border-radius: 4px + padding: 1px 3px; + + background-color: #dbdbdb + &:hover, &.is-active + background-color: #b3b3b3 + + &.current + background-color: #42ca00 + &:hover, &.is-active + background-color: darken(#42ca00, 15) + + &.almost-due + background-color: #fad900 + &:hover, &.is-active + background-color: darken(#fad900, 15) + + &.due + background-color: #fa3f00 + &:hover, &.is-active + background-color: darken(#fa3f00, 15) + + time + &::before + font: normal normal normal 14px/1 FontAwesome + font-size: inherit + -webkit-font-smoothing: antialiased + content: "\f017" // clock symbol + margin-right: 0.3em \ No newline at end of file diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 734fc7e3..69725d76 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -35,6 +35,17 @@ template(name="cardDetails") a.card-label.add-label.js-add-labels(title="{{_ 'card-labels-title'}}") i.fa.fa-plus + if startAt + .card-details-item.card-details-item-start + h3.card-details-item-title {{_ 'start-at'}} + +cardStartDate + + if dueAt + .card-details-item.card-details-item-due + h3.card-details-item-title {{_ 'due-at'}} + +cardDueDate + + //- XXX We should use "editable" to avoid repetiting ourselves if currentUser.isBoardMember h3.card-details-item-title {{_ 'description'}} @@ -91,6 +102,8 @@ template(name="cardDetailsActionsPopup") li: a.js-members {{_ 'card-edit-members'}} li: a.js-labels {{_ 'card-edit-labels'}} li: a.js-attachments {{_ 'card-edit-attachments'}} + li: a.js-start-date {{_ 'editCardStartDatePopup-title'}} + li: a.js-due-date {{_ 'editCardDueDatePopup-title'}} hr ul.pop-over-list li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}} diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b6f17c23..32980926 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -143,6 +143,8 @@ Template.cardDetailsActionsPopup.events({ 'click .js-members': Popup.open('cardMembers'), 'click .js-labels': Popup.open('cardLabels'), 'click .js-attachments': Popup.open('cardAttachments'), + 'click .js-start-date': Popup.open('editCardStartDate'), + 'click .js-due-date': Popup.open('editCardDueDate'), 'click .js-move-card': Popup.open('moveCard'), 'click .js-move-card-to-top'(evt) { evt.preventDefault(); diff --git a/client/components/cards/cardDetails.styl b/client/components/cards/cardDetails.styl index d7d29551..f209862c 100644 --- a/client/components/cards/cardDetails.styl +++ b/client/components/cards/cardDetails.styl @@ -73,8 +73,13 @@ margin: 15px 0 .card-details-item + margin-right: 0.5em + &:last-child + margin-right: 0 &.card-details-item-labels, - &.card-details-item-members + &.card-details-item-members, + &.card-details-item-start, + &.card-details-item-due width: 50% flex-shrink: 1 -- cgit v1.2.3-1-g7c22 From 80b93ce7117326464b55a76a9efbeeff36f28248 Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 21:01:43 +0100 Subject: Display start and due dates in minicards. --- client/components/cards/cardDate.js | 24 ++++++++++++++++++------ client/components/cards/minicard.jade | 6 ++++++ client/components/cards/minicard.styl | 5 ++++- 3 files changed, 28 insertions(+), 7 deletions(-) (limited to 'client/components') diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 4a24941d..4152d618 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -158,8 +158,7 @@ const CardDate = BlazeComponent.extendComponent({ }, }); -// cardStartDate -(class extends CardDate { +class CardStartDate extends CardDate { onCreated() { super(); let self = this; @@ -173,10 +172,10 @@ const CardDate = BlazeComponent.extendComponent({ 'click .js-edit-date': Popup.open('editCardStartDate'), }); } -}).register('cardStartDate'); +} +CardStartDate.register('cardStartDate'); -// cardDueDate -(class extends CardDate { +class CardDueDate extends CardDate { onCreated() { super(); let self = this; @@ -190,4 +189,17 @@ const CardDate = BlazeComponent.extendComponent({ 'click .js-edit-date': Popup.open('editCardDueDate'), }); } -}).register('cardDueDate'); +} +CardDueDate.register('cardDueDate'); + +(class extends CardStartDate { + showDate() { + return this.date.get().format('l'); + } +}).register('minicardStartDate'); + +(class extends CardDueDate { + showDate() { + return this.date.get().format('l'); + } +}).register('minicardDueDate'); diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade index 1dfd2f8e..edc7d2d3 100644 --- a/client/components/cards/minicard.jade +++ b/client/components/cards/minicard.jade @@ -23,3 +23,9 @@ template(name="minicard") .badge span.badge-icon.fa.fa-paperclip span.badge-text= attachments.count + if startAt + .badge + +minicardStartDate + if dueAt + .badge + +minicardDueDate diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl index 0f6f8ad2..a61f6067 100644 --- a/client/components/cards/minicard.styl +++ b/client/components/cards/minicard.styl @@ -91,10 +91,13 @@ margin-right: 11px margin-bottom: 3px font-size: 0.9em + + &:last-of-type + margin-right: 0 .badge-icon, .badge-text - vertical-align: top + vertical-align: middle .badge-text font-size: 0.9em -- cgit v1.2.3-1-g7c22 From 5dd554b99960ebd3ac599fa5afc52838c8b7155f Mon Sep 17 00:00:00 2001 From: shoetten Date: Fri, 5 Feb 2016 22:35:56 +0100 Subject: Color highlight start and due dates with correct timezone handling. --- client/components/cards/cardDate.jade | 2 +- client/components/cards/cardDate.js | 41 ++++++++++++++++++++++++----------- client/components/cards/cardDate.styl | 12 ++++++++-- 3 files changed, 39 insertions(+), 16 deletions(-) (limited to 'client/components') diff --git a/client/components/cards/cardDate.jade b/client/components/cards/cardDate.jade index ca074879..a2a28bbd 100644 --- a/client/components/cards/cardDate.jade +++ b/client/components/cards/cardDate.jade @@ -15,6 +15,6 @@ template(name="editCardDate") button.js-delete-date.negate.wide.right.js-delete-date {{_ 'delete'}} template(name="dateBadge") - a.js-edit-date.card-date(title="{{showTitle}}") + a.js-edit-date.card-date(title="{{showTitle}}" class="{{classes}}") time(datetime="{{showISODate}}") | {{showDate}} diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 4152d618..6bdfaa1b 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -16,8 +16,7 @@ const EditCardDate = BlazeComponent.extendComponent({ todayBtn: 'linked', language: TAPi18n.getLanguage() }).on('changeDate', function(e) { - const localDate = moment(e.date).format('L'); - date.value = localDate; + date.value = moment(e.date).format('L'); this.error.set(''); time.focus(); }.bind(this)); @@ -66,7 +65,7 @@ const EditCardDate = BlazeComponent.extendComponent({ var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); const dateString = evt.target.date.value + ' ' + time; - const newDate = moment.utc(dateString, 'L LT', true); + const newDate = moment(dateString, 'L LT', true); if (newDate.isValid()) { this._storeDate(newDate.toDate()); Popup.close(); @@ -89,9 +88,7 @@ const EditCardDate = BlazeComponent.extendComponent({ (class extends EditCardDate { onCreated() { super(); - if (this.data().startAt) { - this.date.set(moment.utc(this.data().startAt)); - } + this.data().startAt && this.date.set(moment(this.data().startAt)); } _storeDate(date) { @@ -107,9 +104,7 @@ const EditCardDate = BlazeComponent.extendComponent({ (class extends EditCardDate { onCreated() { super(); - if (this.data().dueAt !== undefined) { - this.date.set(moment.utc(this.data().dueAt)); - } + this.data().dueAt && this.date.set(moment(this.data().dueAt)); } onRendered() { @@ -129,7 +124,6 @@ const EditCardDate = BlazeComponent.extendComponent({ }).register('editCardDueDatePopup'); - // Display start & due dates const CardDate = BlazeComponent.extendComponent({ template() { @@ -137,7 +131,12 @@ const CardDate = BlazeComponent.extendComponent({ }, onCreated() { - this.date = ReactiveVar(); + let self = this; + self.date = ReactiveVar(); + self.now = ReactiveVar(moment()); + Meteor.setInterval(() => { + self.now.set(moment()); + }, 60000); }, showDate() { @@ -163,10 +162,17 @@ class CardStartDate extends CardDate { super(); let self = this; this.autorun(() => { - self.date.set(moment.utc(this.data().startAt)); + self.date.set(moment(this.data().startAt)); }); } + classes() { + if (this.date.get().isBefore(this.now.get(), 'minute') && + this.now.get().isBefore(this.data().dueAt)) { + return 'current'; + } + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardStartDate'), @@ -180,10 +186,19 @@ class CardDueDate extends CardDate { super(); let self = this; this.autorun(() => { - self.date.set(moment.utc(this.data().dueAt)); + self.date.set(moment(this.data().dueAt)); }); } + classes() { + if (this.now.get().diff(this.date.get(), 'days') >= 2) + return 'long-overdue'; + else if (this.now.get().diff(this.date.get(), 'minute') >= 0) + return 'due'; + else if (this.now.get().diff(this.date.get(), 'days') >= -1) + return 'almost-due'; + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardDueDate'), diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index e9d56f79..ab182207 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -26,20 +26,28 @@ &:hover, &.is-active background-color: #b3b3b3 + &.current, &.almost-due, &.due, &.long-overdue + color: #fff + &.current background-color: #42ca00 &:hover, &.is-active background-color: darken(#42ca00, 15) &.almost-due - background-color: #fad900 + background-color: #edc909 &:hover, &.is-active - background-color: darken(#fad900, 15) + background-color: darken(#edc909, 10) &.due background-color: #fa3f00 &:hover, &.is-active background-color: darken(#fa3f00, 15) + + &.long-overdue + background-color: #fd5d47 + &:hover, &.is-active + background-color: darken(#fd5d47, 7) time &::before -- cgit v1.2.3-1-g7c22 From aa5ed6e48466b2ed3dc83696a6e18d7997b1c01e Mon Sep 17 00:00:00 2001 From: shoetten Date: Wed, 10 Feb 2016 15:51:55 +0100 Subject: Update translations and title of date badges. --- client/components/cards/cardDate.js | 12 ++++++++---- client/components/cards/cardDate.styl | 6 +++--- client/components/cards/cardDetails.jade | 4 ++-- 3 files changed, 13 insertions(+), 9 deletions(-) (limited to 'client/components') diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 6bdfaa1b..10bc54ff 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -148,10 +148,6 @@ const CardDate = BlazeComponent.extendComponent({ }); }, - showTitle() { - return this.date.get().format('LLLL'); - }, - showISODate() { return this.date.get().toISOString(); }, @@ -173,6 +169,10 @@ class CardStartDate extends CardDate { } } + showTitle() { + return TAPi18n.__('card-start-on') + ' ' + this.date.get().format('LLLL'); + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardStartDate'), @@ -199,6 +199,10 @@ class CardDueDate extends CardDate { return 'almost-due'; } + showTitle() { + return TAPi18n.__('card-due-on') + ' ' + this.date.get().format('LLLL'); + } + events() { return super.events().concat({ 'click .js-edit-date': Popup.open('editCardDueDate'), diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index ab182207..51acdaab 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -30,9 +30,9 @@ color: #fff &.current - background-color: #42ca00 + background-color: #5ba639 &:hover, &.is-active - background-color: darken(#42ca00, 15) + background-color: darken(#5ba639, 10) &.almost-due background-color: #edc909 @@ -42,7 +42,7 @@ &.due background-color: #fa3f00 &:hover, &.is-active - background-color: darken(#fa3f00, 15) + background-color: darken(#fa3f00, 10) &.long-overdue background-color: #fd5d47 diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade index 69725d76..f4212d83 100644 --- a/client/components/cards/cardDetails.jade +++ b/client/components/cards/cardDetails.jade @@ -37,12 +37,12 @@ template(name="cardDetails") if startAt .card-details-item.card-details-item-start - h3.card-details-item-title {{_ 'start-at'}} + h3.card-details-item-title {{_ 'card-start'}} +cardStartDate if dueAt .card-details-item.card-details-item-due - h3.card-details-item-title {{_ 'due-at'}} + h3.card-details-item-title {{_ 'card-due'}} +cardDueDate -- cgit v1.2.3-1-g7c22 From 6064393ad339333f02ce90fa1814ea47c18e78c2 Mon Sep 17 00:00:00 2001 From: shoetten Date: Thu, 11 Feb 2016 15:02:26 +0100 Subject: Refactor code based on eslint guidelines. --- client/components/cards/cardDate.js | 58 +++++++++++++++++++---------------- client/components/cards/cardDate.styl | 2 +- 2 files changed, 32 insertions(+), 28 deletions(-) (limited to 'client/components') diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index 10bc54ff..f7cd502f 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -11,14 +11,14 @@ const EditCardDate = BlazeComponent.extendComponent({ }, onRendered() { - let $picker = this.$('.js-datepicker').datepicker({ + const $picker = this.$('.js-datepicker').datepicker({ todayHighlight: true, todayBtn: 'linked', - language: TAPi18n.getLanguage() - }).on('changeDate', function(e) { - date.value = moment(e.date).format('L'); + language: TAPi18n.getLanguage(), + }).on('changeDate', function(evt) { + this.find('#date').value = moment(evt.date).format('L'); this.error.set(''); - time.focus(); + this.find('#time').focus(); }.bind(this)); if (this.date.get().isValid()) { @@ -29,10 +29,12 @@ const EditCardDate = BlazeComponent.extendComponent({ showDate() { if (this.date.get().isValid()) return this.date.get().format('L'); + return ''; }, showTime() { if (this.date.get().isValid()) return this.date.get().format('LT'); + return ''; }, dateFormat() { return moment.localeData().longDateFormat('L'); @@ -43,17 +45,17 @@ const EditCardDate = BlazeComponent.extendComponent({ events() { return [{ - 'keyup .js-date-field'(evt) { + 'keyup .js-date-field'() { // parse for localized date format in strict mode - const dateMoment = moment(date.value, 'L', true); + 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'(evt) { + 'keyup .js-time-field'() { // parse for localized time format in strict mode - const dateMoment = moment(time.value, 'LT', true); + const dateMoment = moment(this.find('#time').value, 'LT', true); if (dateMoment.isValid()) { this.error.set(''); } @@ -62,9 +64,9 @@ const EditCardDate = BlazeComponent.extendComponent({ evt.preventDefault(); // if no time was given, init with 12:00 - var time = evt.target.time.value || moment(new Date().setHours(12,0,0)).format('LT'); - - const dateString = evt.target.date.value + ' ' + time; + 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()); @@ -87,7 +89,7 @@ const EditCardDate = BlazeComponent.extendComponent({ // editCardStartDatePopup (class extends EditCardDate { onCreated() { - super(); + super.onCreated(); this.data().startAt && this.date.set(moment(this.data().startAt)); } @@ -103,12 +105,12 @@ const EditCardDate = BlazeComponent.extendComponent({ // editCardDueDatePopup (class extends EditCardDate { onCreated() { - super(); + super.onCreated(); this.data().dueAt && this.date.set(moment(this.data().dueAt)); } onRendered() { - super(); + super.onRendered(); if (moment.isDate(this.card.startAt)) { this.$('.js-datepicker').datepicker('setStartDate', this.card.startAt); } @@ -131,7 +133,7 @@ const CardDate = BlazeComponent.extendComponent({ }, onCreated() { - let self = this; + const self = this; self.date = ReactiveVar(); self.now = ReactiveVar(moment()); Meteor.setInterval(() => { @@ -144,7 +146,7 @@ const CardDate = BlazeComponent.extendComponent({ // is updated to at least moment.js 2.10.5 // until then, the date is displayed in the "L" format return this.date.get().calendar(null, { - sameElse: 'llll' + sameElse: 'llll', }); }, @@ -155,10 +157,10 @@ const CardDate = BlazeComponent.extendComponent({ class CardStartDate extends CardDate { onCreated() { - super(); - let self = this; - this.autorun(() => { - self.date.set(moment(this.data().startAt)); + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.data().startAt)); }); } @@ -167,10 +169,11 @@ class CardStartDate extends CardDate { this.now.get().isBefore(this.data().dueAt)) { return 'current'; } + return ''; } showTitle() { - return TAPi18n.__('card-start-on') + ' ' + this.date.get().format('LLLL'); + return `${TAPi18n.__('card-start-on')} ${this.date.get().format('LLLL')}`; } events() { @@ -183,10 +186,10 @@ CardStartDate.register('cardStartDate'); class CardDueDate extends CardDate { onCreated() { - super(); - let self = this; - this.autorun(() => { - self.date.set(moment(this.data().dueAt)); + super.onCreated(); + const self = this; + self.autorun(() => { + self.date.set(moment(self.data().dueAt)); }); } @@ -197,10 +200,11 @@ class CardDueDate extends CardDate { return 'due'; else if (this.now.get().diff(this.date.get(), 'days') >= -1) return 'almost-due'; + return ''; } showTitle() { - return TAPi18n.__('card-due-on') + ' ' + this.date.get().format('LLLL'); + return `${TAPi18n.__('card-due-on')} ${this.date.get().format('LLLL')}`; } events() { diff --git a/client/components/cards/cardDate.styl b/client/components/cards/cardDate.styl index 51acdaab..1631baa5 100644 --- a/client/components/cards/cardDate.styl +++ b/client/components/cards/cardDate.styl @@ -20,7 +20,7 @@ .card-date display: block border-radius: 4px - padding: 1px 3px; + padding: 1px 3px background-color: #dbdbdb &:hover, &.is-active -- cgit v1.2.3-1-g7c22 From 33b74a465e142c7a2b5d435dd35b7cea56a2d18b Mon Sep 17 00:00:00 2001 From: shoetten Date: Tue, 23 Feb 2016 15:21:36 +0100 Subject: Fix "can't set timers inside simulations error" when moving cards with start/due dates. --- client/components/cards/cardDate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'client/components') diff --git a/client/components/cards/cardDate.js b/client/components/cards/cardDate.js index f7cd502f..4d129e8e 100644 --- a/client/components/cards/cardDate.js +++ b/client/components/cards/cardDate.js @@ -136,7 +136,7 @@ const CardDate = BlazeComponent.extendComponent({ const self = this; self.date = ReactiveVar(); self.now = ReactiveVar(moment()); - Meteor.setInterval(() => { + window.setInterval(() => { self.now.set(moment()); }, 60000); }, -- cgit v1.2.3-1-g7c22 From 6090ede8c98d98ba5d3664169cae4f2696ccd557 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Wed, 23 Nov 2016 20:57:33 -0500 Subject: set isLoaded to true on both transitionend and animationend --- client/components/cards/cardDetails.js | 3 +++ 1 file changed, 3 insertions(+) (limited to 'client/components') diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js index b6f17c23..303f1632 100644 --- a/client/components/cards/cardDetails.js +++ b/client/components/cards/cardDetails.js @@ -65,6 +65,9 @@ BlazeComponent.extendComponent({ [`${CSSEvents.transitionend} .js-card-details`]() { this.isLoaded.set(true); }, + [`${CSSEvents.animationend} .js-card-details`]() { + this.isLoaded.set(true); + }, }; return [{ -- cgit v1.2.3-1-g7c22 From 606dbbbbf2e5ef4bccaadc4584d05c67d7148fc8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:45:11 +0100 Subject: New option to set up minimum limit to show cards count for each list in board --- client/components/lists/listHeader.jade | 4 ++++ client/components/lists/listHeader.js | 8 ++++++++ client/components/main/layouts.styl | 6 ++++++ client/components/users/userHeader.jade | 5 +++++ client/components/users/userHeader.js | 11 +++++++++++ 5 files changed, 34 insertions(+) (limited to 'client/components') diff --git a/client/components/lists/listHeader.jade b/client/components/lists/listHeader.jade index f9fe065f..4171f824 100644 --- a/client/components/lists/listHeader.jade +++ b/client/components/lists/listHeader.jade @@ -6,6 +6,10 @@ template(name="listHeader") h2.list-header-name( class="{{#if currentUser.isBoardMember}}js-open-inlined-form is-editable{{/if}}") = title + if showCardsCountForList cards.count + = cards.count + span.lowercase + | {{_ 'cards'}} if currentUser.isBoardMember if isWatching i.list-header-watch-icon.fa.fa-eye diff --git a/client/components/lists/listHeader.js b/client/components/lists/listHeader.js index c7ae8e62..4d468f21 100644 --- a/client/components/lists/listHeader.js +++ b/client/components/lists/listHeader.js @@ -13,6 +13,14 @@ BlazeComponent.extendComponent({ return list.findWatcher(Meteor.userId()); }, + limitToShowCardsCount() { + return Meteor.user().getLimitToShowCardsCount(); + }, + + showCardsCountForList(count) { + return count > this.limitToShowCardsCount(); + }, + events() { return [{ 'click .js-open-list-menu': Popup.open('listAction'), diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 83d4d693..13834644 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -1,3 +1,4 @@ + @import 'nib' global-reset() @@ -374,3 +375,8 @@ a .wrapper height: 100% margin: 0px + +.inline-input + height: 37px + margin: 8px 10px 0 0 + width: 50px diff --git a/client/components/users/userHeader.jade b/client/components/users/userHeader.jade index f7f6222a..ad41e8aa 100644 --- a/client/components/users/userHeader.jade +++ b/client/components/users/userHeader.jade @@ -72,3 +72,8 @@ template(name="changeSettingsPopup") | {{_ 'hide-system-messages'}} if hiddenSystemMessages i.fa.fa-check + li + label.bold + | {{_ 'show-cards-minimum-count'}} + input#show-cards-count-at.inline-input.left(type="number" value="#{showCardsCountAt}" min="1" max="99" onkeydown="return false") + input.js-apply-show-cards-at.left(type="submit" value="{{_ 'apply'}}") diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 1c390395..65b7e8c3 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -95,10 +95,21 @@ Template.changeSettingsPopup.helpers({ hiddenSystemMessages() { return Meteor.user().hasHiddenSystemMessages(); }, + showCardsCountAt() { + return Meteor.user().getLimitToShowCardsCount(); + }, }); 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()); + if (!isNaN(minLimit)) { + Meteor.call('changeLimitToShowCardsCount', minLimit); + Popup.back(); + } + }, }); -- cgit v1.2.3-1-g7c22 From 35778d26737c5ca1702c6c1f3ca1be0a90a9e8b8 Mon Sep 17 00:00:00 2001 From: Mario Orlicky Date: Fri, 25 Nov 2016 21:53:18 +0100 Subject: fixed few overseights --- client/components/main/layouts.styl | 1 - client/components/users/userHeader.js | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) (limited to 'client/components') diff --git a/client/components/main/layouts.styl b/client/components/main/layouts.styl index 13834644..38fd83ec 100644 --- a/client/components/main/layouts.styl +++ b/client/components/main/layouts.styl @@ -1,4 +1,3 @@ - @import 'nib' global-reset() diff --git a/client/components/users/userHeader.js b/client/components/users/userHeader.js index 65b7e8c3..98053ed1 100644 --- a/client/components/users/userHeader.js +++ b/client/components/users/userHeader.js @@ -106,7 +106,7 @@ Template.changeSettingsPopup.events({ }, 'click .js-apply-show-cards-at'(evt, tpl) { evt.preventDefault(); - const minLimit = parseInt(tpl.$('#show-cards-count-at').val()); + const minLimit = parseInt(tpl.$('#show-cards-count-at').val(), 10); if (!isNaN(minLimit)) { Meteor.call('changeLimitToShowCardsCount', minLimit); Popup.back(); -- cgit v1.2.3-1-g7c22