Files
deck/src/components/card/CardSidebar.vue
Jakob 4e67c3172b new functions
Signed-off-by: Jakob <jakob.roehrl@web.de>
2019-08-11 12:02:57 +02:00

224 lines
5.7 KiB
Vue

<!--
- @copyright Copyright (c) 2018 Julius Härtl <jus@bitgrid.net>
-
- @author Julius Härtl <jus@bitgrid.net>
-
- @license GNU AGPL version 3 or any later version
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as
- published by the Free Software Foundation, either version 3 of the
- License, or (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-->
<template>
<app-sidebar v-if="currentCard != null"
:actions="toolbarActions"
:title="currentCard.title"
@close="closeSidebar">
<template #action />
<AppSidebarTab name="Details" icon="icon-home">
<p>Tags</p>
<multiselect v-model="allLabels" :multiple="true" :options="currentBoard.labels"
:taggable="true" label="title"
track-by="id" @select="addLabelToCard" @remove="removeLabelFromCard">
<template #option="scope">
<span>{{ scope.option.title }}</span>
</template>
</multiselect>
<p>Assign to user</p>
{{ unallocatedSharees }}
<hr>
{{ addAclToCard }}
<multiselect v-model="addAclToCard" :multiple="true" :options="unallocatedSharees"
label="participant"
track-by="shareWith"
@select="assignUserToCard" @remove="removeUserFromCard" @search-change="asyncFind">
<template #option="scope">
{{ scope.option.label }}
</template>
</multiselect>
<p>Due to</p>
<DatetimePicker v-model="copiedCard.duedate" type="datetime" lang="en"
format="YYYY-MM-DD HH:mm" confirm @change="setDue()" />
<hr>
<p>{{ subtitle }}</p>
</AppSidebarTab>
<AppSidebarTab name="Description" icon="icon-description">
<textarea v-model="copiedCard.description" type="text" autofocus />
<input type="button" class="icon-confirm" @click="saveDesc()">
<markdown-editor ref="markdownEditor" v-model="desc" :configs="{autosave: {enabled: true, uniqueId: 'unique'}}" />
</AppSidebarTab>
<AppSidebarTab name="Attachments" icon="icon-files-dark">
{{ currentCard.attachments }}
</AppSidebarTab>
<AppSidebarTab name="Timeline" icon="icon-activity">
this is the activity tab
</AppSidebarTab>
</app-sidebar>
</template>
<script>
import { AppSidebar, AppSidebarTab, Multiselect, DatetimePicker } from 'nextcloud-vue'
import { mapState } from 'vuex'
import markdownEditor from 'vue-easymde/src/markdown-editor'
export default {
name: 'CardSidebar',
components: {
AppSidebar,
AppSidebarTab,
Multiselect,
DatetimePicker,
markdownEditor
},
data() {
return {
addAclToCard: null,
addedLabelToCard: null,
isLoading: false,
copiedCard: null,
allLabels: null,
desc: null
}
},
computed: {
...mapState({
currentCard: state => state.currentCard,
currentBoard: state => state.currentBoard,
sharees: 'sharees'
}),
subtitle() {
let lastModified = this.currentCard.lastModified
let createdAt = this.currentCard.createdAt
return t('deck', 'Modified') + ': ' + lastModified + ' ' + t('deck', 'Created') + ': ' + createdAt
},
unallocatedSharees() {
return this.sharees
/* return this.sharees.filter((sharee) => {
return Object.values(this.board.acl).findIndex((acl) => {
return acl.participant.uid === sharee.value.shareWith
})
}) */
},
toolbarActions() {
return [
{
action: () => {
},
icon: 'icon-archive-dark',
text: t('deck', 'Assign to me')
},
{
action: () => {
},
icon: 'icon-archive',
text: t('deck', (this.showArchived ? 'Unarchive card' : 'Archive card'))
}
]
}
},
watch: {
currentCard() {
this.copiedCard = JSON.parse(JSON.stringify(this.currentCard))
this.allLabels = this.currentCard.labels
this.addAclToCard = this.currentCard.assignedUsers
this.desc = this.currentCard.description
},
desc() {
this.$store.dispatch('updateCardDesc', this.desc)
}
},
created() {
},
methods: {
setDue() {
this.$store.dispatch('updateCardDue', this.copiedCard)
},
saveDesc() {
this.$store.dispatch('updateCardDesc', this.copiedCard)
},
asyncFind(query) {
this.isLoading = true
this.$store.dispatch('loadSharees').then(response => {
this.isLoading = false
})
},
closeSidebar() {
this.$router.push({ name: 'board' })
},
assignUserToCard(user) {
// this.copiedCard.assignedUsers.push(user)
this.copiedCard.newUserUid = user.value.shareWith
this.$store.dispatch('assignCardToUser', this.copiedCard)
/* this.addAclForAPI = {
type: 0,
participant: this.addAcl.value.shareWith,
permissionEdit: false,
permissionShare: false,
permissionManage: false
}
this.$store.dispatch('addAclToCurrentBoard', this.addAclForAPI) */
},
removeUserFromCard(user) {
},
addLabelToCard(newLabel) {
this.copiedCard.labels.push(newLabel)
let data = {
card: this.copiedCard,
labelId: newLabel.id
}
this.$store.dispatch('addLabel', data)
},
removeLabelFromCard(removedLabel) {
let removeIndex = this.copiedCard.labels.findIndex((label) => {
return label.id === removedLabel.id
})
if (removeIndex !== -1) {
this.copiedCard.labels.splice(removeIndex, 1)
}
let data = {
card: this.copiedCard,
labelId: removedLabel.id
}
this.$store.dispatch('removeLabel', data)
}
}
}
</script>
<style>
@import "~easymde/dist/easymde.min.css";
</style>