summaryrefslogtreecommitdiffstats
path: root/client/components/cards
diff options
context:
space:
mode:
authorLauri Ojansivu <x@xet7.org>2017-11-21 12:42:08 +0200
committerLauri Ojansivu <x@xet7.org>2017-11-21 12:42:08 +0200
commitdc9ac5b58a0b41f3a424b267308eb925f01d6f48 (patch)
tree4bb8ab549e39cbd8218ed714b07fc265600ae600 /client/components/cards
parentee69eb03d4a72e8c67c377d8da3b169660cac67b (diff)
parentf31d007177d5ab52e2a5ffaae70fdb73159dd695 (diff)
downloadwekan-dc9ac5b58a0b41f3a424b267308eb925f01d6f48.tar.gz
wekan-dc9ac5b58a0b41f3a424b267308eb925f01d6f48.tar.bz2
wekan-dc9ac5b58a0b41f3a424b267308eb925f01d6f48.zip
Merge branch 'devel'
Diffstat (limited to 'client/components/cards')
-rw-r--r--client/components/cards/cardDetails.jade35
-rw-r--r--client/components/cards/cardDetails.js36
-rw-r--r--client/components/cards/cardTime.jade22
-rw-r--r--client/components/cards/cardTime.js81
-rw-r--r--client/components/cards/cardTime.styl17
-rw-r--r--client/components/cards/minicard.jade12
-rw-r--r--client/components/cards/minicard.styl3
7 files changed, 199 insertions, 7 deletions
diff --git a/client/components/cards/cardDetails.jade b/client/components/cards/cardDetails.jade
index b6572251..4c68c2f7 100644
--- a/client/components/cards/cardDetails.jade
+++ b/client/components/cards/cardDetails.jade
@@ -46,6 +46,14 @@ template(name="cardDetails")
h3.card-details-item-title {{_ 'card-due'}}
+cardDueDate
+ .card-details-items
+ if spentTime
+ .card-details-item.card-details-item-spent
+ if isOvertime
+ h3.card-details-item-title {{_ 'overtime-hours'}}
+ else
+ h3.card-details-item-title {{_ 'spent-time-hours'}}
+ +cardSpentTime
//- XXX We should use "editable" to avoid repetiting ourselves
if canModifyCard
@@ -119,6 +127,7 @@ template(name="cardDetailsActionsPopup")
li: a.js-attachments {{_ 'card-edit-attachments'}}
li: a.js-start-date {{_ 'editCardStartDatePopup-title'}}
li: a.js-due-date {{_ 'editCardDueDatePopup-title'}}
+ li: a.js-spent-time {{_ 'editCardSpentTimePopup-title'}}
hr
ul.pop-over-list
li: a.js-move-card-to-top {{_ 'moveCardToTop-title'}}
@@ -132,14 +141,36 @@ template(name="cardDetailsActionsPopup")
li: a.js-more {{_ 'cardMorePopup-title'}}
template(name="moveCardPopup")
- +boardLists
+ if isSandstorm
+ +boardLists
+ else
+ +boardsAndLists
template(name="copyCardPopup")
label(for='copy-card-title') {{_ 'title'}}:
textarea#copy-card-title.minicard-composer-textarea.js-card-title(autofocus)
= title
+ if isSandstorm
+ +boardLists
+ else
+ +boardsAndLists
+
+template(name="boardsAndLists")
+ select.js-select-boards
+ each boards
+ if $eq _id currentBoard._id
+ option(value="{{_id}}" selected) {{_ 'current'}}
+ else
+ option(value="{{_id}}") {{title}}
+
label {{_ 'lists'}}:
- +boardLists
+ ul.pop-over-list
+ each aBoardLists
+ li
+ if $eq ../_id _id
+ a.disabled {{title}} ({{_ 'current'}})
+ else
+ a.js-select-list= title
template(name="cardMembersPopup")
ul.pop-over-list.js-card-member-list
diff --git a/client/components/cards/cardDetails.js b/client/components/cards/cardDetails.js
index 3825bda8..b62f31d4 100644
--- a/client/components/cards/cardDetails.js
+++ b/client/components/cards/cardDetails.js
@@ -1,3 +1,5 @@
+const subManager = new SubsManager();
+
BlazeComponent.extendComponent({
mixins() {
return [Mixins.InfiniteScrolling, Mixins.PerfectScrollbar];
@@ -163,6 +165,7 @@ Template.cardDetailsActionsPopup.events({
'click .js-attachments': Popup.open('cardAttachments'),
'click .js-start-date': Popup.open('editCardStartDate'),
'click .js-due-date': Popup.open('editCardDueDate'),
+ 'click .js-spent-time': Popup.open('editCardSpentTime'),
'click .js-move-card': Popup.open('moveCard'),
'click .js-copy-card': Popup.open('copyCard'),
'click .js-move-card-to-top' (evt) {
@@ -198,7 +201,7 @@ Template.editCardTitleForm.events({
'keydown .js-edit-card-title' (evt) {
// If enter key was pressed, submit the data
// Unless the shift key is also being pressed
- if (evt.keyCode === 13 && !event.shiftKey) {
+ if (evt.keyCode === 13 && !evt.shiftKey) {
$('.js-submit-edit-card-title-form').click();
}
},
@@ -215,12 +218,43 @@ Template.moveCardPopup.events({
},
});
+BlazeComponent.extendComponent({
+ onCreated() {
+ this.selectedBoard = new ReactiveVar(Session.get('currentBoard'));
+ },
+
+ boards() {
+ const boards = Boards.find({
+ archived: false,
+ 'members.userId': Meteor.userId(),
+ }, {
+ sort: ['title'],
+ });
+ return boards;
+ },
+
+ aBoardLists() {
+ subManager.subscribe('board', this.selectedBoard.get());
+ const board = Boards.findOne(this.selectedBoard.get());
+ return board.lists();
+ },
+ events() {
+ return [{
+ 'change .js-select-boards'(evt) {
+ this.selectedBoard.set($(evt.currentTarget).val());
+ },
+ }];
+ },
+}).register('boardsAndLists');
+
Template.copyCardPopup.events({
'click .js-select-list' (evt) {
const card = Cards.findOne(Session.get('currentCard'));
const oldId = card._id;
card._id = null;
card.listId = this._id;
+ const list = Lists.findOne(card.listId);
+ card.boardId = list.boardId;
const textarea = $(evt.currentTarget).parents('.content').find('textarea');
const title = textarea.val().trim();
// insert new card to the bottom of new list
diff --git a/client/components/cards/cardTime.jade b/client/components/cards/cardTime.jade
new file mode 100644
index 00000000..dcfc92f0
--- /dev/null
+++ b/client/components/cards/cardTime.jade
@@ -0,0 +1,22 @@
+template(name="editCardSpentTime")
+ .edit-card-time
+ form.edit-time
+ .fields
+ label(for="time") {{_ 'time'}}
+ input.js-time-field#time(type="number" step="0.01" name="time" value="{{card.spentTime}}" placeholder=timeFormat autofocus)
+ label(for="overtime") {{_ 'overtime'}}
+ a.js-toggle-overtime
+ .materialCheckBox#overtime(class="{{#if card.isOvertime}}is-checked{{/if}}" name="overtime")
+
+ if error.get
+ .warning {{_ error.get}}
+ button.primary.wide.left.js-submit-time(type="submit") {{_ 'save'}}
+ button.js-delete-time.negate.wide.right {{_ 'delete'}}
+
+template(name="timeBadge")
+ if canModifyCard
+ a.js-edit-time.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
+ | {{showTime}}
+ else
+ a.card-time(title="{{showTitle}}" class="{{#if isOvertime}}card-label-red{{else}}card-label-green{{/if}}")
+ | {{showTime}}
diff --git a/client/components/cards/cardTime.js b/client/components/cards/cardTime.js
new file mode 100644
index 00000000..eadcc88e
--- /dev/null
+++ b/client/components/cards/cardTime.js
@@ -0,0 +1,81 @@
+BlazeComponent.extendComponent({
+ template() {
+ return 'editCardSpentTime';
+ },
+ onCreated() {
+ this.error = new ReactiveVar('');
+ this.card = this.data();
+ },
+ toggleOvertime() {
+ this.card.isOvertime = !this.card.isOvertime;
+ $('#overtime .materialCheckBox').toggleClass('is-checked');
+
+ $('#overtime').toggleClass('is-checked');
+ },
+ storeTime(spentTime, isOvertime) {
+ this.card.setSpentTime(spentTime);
+ this.card.setOvertime(isOvertime);
+ },
+ deleteTime() {
+ this.card.unsetSpentTime();
+ },
+ events() {
+ return [{
+ //TODO : need checking this portion
+ 'submit .edit-time'(evt) {
+ evt.preventDefault();
+
+ const spentTime = parseFloat(evt.target.time.value);
+ const isOvertime = this.card.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();
+ },
+ 'click a.js-toggle-overtime': this.toggleOvertime,
+ }];
+ },
+}).register('editCardSpentTimePopup');
+
+BlazeComponent.extendComponent({
+ template() {
+ return 'timeBadge';
+ },
+ onCreated() {
+ const self = this;
+ self.time = ReactiveVar();
+ },
+ showTitle() {
+ if (this.data().isOvertime) {
+ return `${TAPi18n.__('overtime')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
+ } else {
+ return `${TAPi18n.__('card-spent')} ${this.data().spentTime} ${TAPi18n.__('hours')}`;
+ }
+ },
+ showTime() {
+ return this.data().spentTime;
+ },
+ isOvertime() {
+ return this.data().isOvertime;
+ },
+ events() {
+ return [{
+ 'click .js-edit-time': Popup.open('editCardSpentTime'),
+ }];
+ },
+}).register('cardSpentTime');
+
+Template.timeBadge.helpers({
+ canModifyCard() {
+ return Meteor.user() && Meteor.user().isBoardMember() && !Meteor.user().isCommentOnly();
+ },
+});
diff --git a/client/components/cards/cardTime.styl b/client/components/cards/cardTime.styl
new file mode 100644
index 00000000..3c4b43ae
--- /dev/null
+++ b/client/components/cards/cardTime.styl
@@ -0,0 +1,17 @@
+.card-time
+ display: block
+ border-radius: 4px
+ padding: 1px 3px
+ color: #fff
+
+ background-color: #dbdbdb
+ &:hover, &.is-active
+ background-color: #b3b3b3
+
+ time
+ &::before
+ font: normal normal normal 14px/1 FontAwesome
+ font-size: inherit
+ -webkit-font-smoothing: antialiased
+ content: "\f017" // clock symbol
+ margin-right: 0.3em
diff --git a/client/components/cards/minicard.jade b/client/components/cards/minicard.jade
index 3e582b6f..9fa4dd57 100644
--- a/client/components/cards/minicard.jade
+++ b/client/components/cards/minicard.jade
@@ -11,11 +11,15 @@ template(name="minicard")
= title
.dates
if startAt
- .date
- +minicardStartDate
+ .date
+ +minicardStartDate
if dueAt
- .date
- +minicardDueDate
+ .date
+ +minicardDueDate
+ if spentTime
+ .date
+ +cardSpentTime
+
if members
.minicard-members.js-minicard-members
each members
diff --git a/client/components/cards/minicard.styl b/client/components/cards/minicard.styl
index a6aad896..d59f1f63 100644
--- a/client/components/cards/minicard.styl
+++ b/client/components/cards/minicard.styl
@@ -77,6 +77,9 @@
height: @width
border-radius: 2px
margin-left: 3px
+ .minicard-title
+ p:last-child
+ margin-bottom: 0
.dates
display: flex;
flex-direction: row;