2019-03-07 20:48:40 +01:00
|
|
|
<template>
|
2021-06-03 22:23:04 +02:00
|
|
|
<div :class="{ 'is-loading': loading}" class="loader-container">
|
2021-01-17 18:57:57 +01:00
|
|
|
<x-button
|
|
|
|
:to="{name:'labels.create'}"
|
|
|
|
class="is-pulled-right"
|
|
|
|
icon="plus"
|
|
|
|
>
|
2020-12-30 18:55:54 +01:00
|
|
|
New label
|
2021-01-17 18:57:57 +01:00
|
|
|
</x-button>
|
|
|
|
|
|
|
|
<div class="content">
|
|
|
|
<h1>Manage labels</h1>
|
2021-01-17 20:21:33 +01:00
|
|
|
<p v-if="labels.length > 0">
|
2021-01-17 18:57:57 +01:00
|
|
|
Click on a label to edit it.
|
|
|
|
You can edit all labels you created, you can use all labels which are associated with a task to whose
|
2021-01-17 20:21:33 +01:00
|
|
|
list you have access.
|
|
|
|
</p>
|
2021-01-21 18:14:22 +01:00
|
|
|
<p v-else class="has-text-centered has-text-grey is-italic">
|
2021-01-17 20:21:33 +01:00
|
|
|
You currently do not have any labels.
|
|
|
|
<router-link :to="{name:'labels.create'}">Create a new label.</router-link>
|
2021-01-17 18:57:57 +01:00
|
|
|
</p>
|
|
|
|
</div>
|
|
|
|
|
2019-03-07 20:48:40 +01:00
|
|
|
<div class="columns">
|
|
|
|
<div class="labels-list column">
|
2019-10-26 14:39:27 +02:00
|
|
|
<span
|
2020-09-05 22:35:52 +02:00
|
|
|
:class="{'disabled': userInfo.id !== l.createdBy.id}" :key="l.id"
|
|
|
|
:style="{'background': l.hexColor, 'color': l.textColor}"
|
|
|
|
class="tag"
|
|
|
|
v-for="l in labels"
|
2019-03-07 20:48:40 +01:00
|
|
|
>
|
|
|
|
<span
|
2020-09-05 22:35:52 +02:00
|
|
|
v-if="userInfo.id !== l.createdBy.id"
|
|
|
|
v-tooltip.bottom="'You are not allowed to edit this label because you dont own it.'">
|
2019-03-07 20:48:40 +01:00
|
|
|
{{ l.title }}
|
|
|
|
</span>
|
2019-10-26 14:39:27 +02:00
|
|
|
<a
|
2020-09-05 22:35:52 +02:00
|
|
|
:style="{'color': l.textColor}"
|
|
|
|
@click="editLabel(l)"
|
|
|
|
v-else>
|
2019-10-26 14:39:27 +02:00
|
|
|
{{ l.title }}
|
|
|
|
</a>
|
2020-09-05 22:35:52 +02:00
|
|
|
<a @click="deleteLabel(l)" class="delete is-small" v-if="userInfo.id === l.createdBy.id"></a>
|
2019-10-26 14:39:27 +02:00
|
|
|
</span>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
|
|
|
<div class="column is-4" v-if="isLabelEdit">
|
2021-01-17 18:57:57 +01:00
|
|
|
<card title="Edit Label" :has-close="true" @close="() => isLabelEdit = false">
|
|
|
|
<form @submit.prevent="editLabelSubmit()">
|
|
|
|
<div class="field">
|
|
|
|
<label class="label">Title</label>
|
|
|
|
<div class="control">
|
|
|
|
<input
|
|
|
|
class="input"
|
|
|
|
placeholder="Label title"
|
|
|
|
type="text"
|
|
|
|
v-model="labelEditLabel.title"/>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<div class="field">
|
|
|
|
<label class="label">Description</label>
|
|
|
|
<div class="control">
|
|
|
|
<editor
|
|
|
|
:preview-is-default="false"
|
|
|
|
placeholder="Label description"
|
|
|
|
v-if="editorActive"
|
|
|
|
v-model="labelEditLabel.description"
|
|
|
|
/>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
2021-01-17 18:57:57 +01:00
|
|
|
</div>
|
|
|
|
<div class="field">
|
|
|
|
<label class="label">Color</label>
|
|
|
|
<div class="control">
|
|
|
|
<color-picker v-model="labelEditLabel.hexColor"/>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
2021-01-17 18:57:57 +01:00
|
|
|
</div>
|
|
|
|
<div class="field has-addons">
|
|
|
|
<div class="control is-expanded">
|
|
|
|
<x-button
|
2021-06-03 22:23:04 +02:00
|
|
|
:loading="loading"
|
2021-01-17 18:57:57 +01:00
|
|
|
class="is-fullwidth"
|
|
|
|
@click="editLabelSubmit()"
|
|
|
|
>
|
|
|
|
Save
|
|
|
|
</x-button>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
2021-01-17 18:57:57 +01:00
|
|
|
<div class="control">
|
|
|
|
<x-button
|
|
|
|
@click="() => {deleteLabel(labelEditLabel);isLabelEdit = false}"
|
|
|
|
icon="trash-alt"
|
|
|
|
class="is-danger"
|
|
|
|
/>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
2021-01-17 18:57:57 +01:00
|
|
|
</div>
|
|
|
|
</form>
|
|
|
|
</card>
|
2019-03-07 20:48:40 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</template>
|
|
|
|
|
|
|
|
<script>
|
2020-09-05 22:35:52 +02:00
|
|
|
import {mapState} from 'vuex'
|
2019-03-07 20:48:40 +01:00
|
|
|
|
2020-09-05 22:35:52 +02:00
|
|
|
import LabelModel from '../../models/label'
|
|
|
|
import ColorPicker from '../../components/input/colorPicker'
|
|
|
|
import LoadingComponent from '../../components/misc/loading'
|
|
|
|
import ErrorComponent from '../../components/misc/error'
|
2021-06-03 22:23:04 +02:00
|
|
|
import {LOADING, LOADING_MODULE} from '@/store/mutation-types'
|
2019-03-07 20:48:40 +01:00
|
|
|
|
2020-09-05 22:35:52 +02:00
|
|
|
export default {
|
|
|
|
name: 'ListLabels',
|
|
|
|
components: {
|
|
|
|
ColorPicker,
|
|
|
|
editor: () => ({
|
2020-11-02 21:47:31 +01:00
|
|
|
component: import(/* webpackChunkName: "editor" */ '../../components/input/editor'),
|
2020-09-05 22:35:52 +02:00
|
|
|
loading: LoadingComponent,
|
|
|
|
error: ErrorComponent,
|
|
|
|
timeout: 60000,
|
2020-05-08 20:43:51 +02:00
|
|
|
}),
|
2020-09-05 22:35:52 +02:00
|
|
|
},
|
|
|
|
data() {
|
|
|
|
return {
|
|
|
|
labelEditLabel: LabelModel,
|
|
|
|
isLabelEdit: false,
|
|
|
|
editorActive: false,
|
|
|
|
}
|
|
|
|
},
|
|
|
|
created() {
|
|
|
|
this.labelEditLabel = new LabelModel()
|
|
|
|
this.loadLabels()
|
|
|
|
},
|
|
|
|
mounted() {
|
|
|
|
this.setTitle('Labels')
|
|
|
|
},
|
|
|
|
computed: mapState({
|
|
|
|
userInfo: state => state.auth.info,
|
2021-06-03 22:23:04 +02:00
|
|
|
labels: state => state.labels.labels,
|
|
|
|
loading: state => state[LOADING] && state[LOADING_MODULE] === 'labels',
|
2020-09-05 22:35:52 +02:00
|
|
|
}),
|
|
|
|
methods: {
|
|
|
|
loadLabels() {
|
2021-06-03 22:23:04 +02:00
|
|
|
this.$store.dispatch('labels/loadAllLabels')
|
2020-09-05 22:35:52 +02:00
|
|
|
.catch(e => {
|
|
|
|
this.error(e, this)
|
|
|
|
})
|
|
|
|
},
|
|
|
|
deleteLabel(label) {
|
2021-06-03 22:23:04 +02:00
|
|
|
this.$store.dispatch('labels/deleteLabel', label)
|
2020-09-05 22:35:52 +02:00
|
|
|
.then(() => {
|
|
|
|
this.success({message: 'The label was successfully deleted.'}, this)
|
|
|
|
})
|
|
|
|
.catch(e => {
|
|
|
|
this.error(e, this)
|
|
|
|
})
|
|
|
|
},
|
|
|
|
editLabelSubmit() {
|
2021-06-03 22:23:04 +02:00
|
|
|
this.$store.dispatch('labels/updateLabel', this.labelEditLabel)
|
|
|
|
.then(() => {
|
2020-09-05 22:35:52 +02:00
|
|
|
this.success({message: 'The label was successfully updated.'}, this)
|
|
|
|
})
|
|
|
|
.catch(e => {
|
|
|
|
this.error(e, this)
|
|
|
|
})
|
|
|
|
},
|
|
|
|
editLabel(label) {
|
|
|
|
if (label.createdBy.id !== this.userInfo.id) {
|
|
|
|
return
|
2019-03-07 20:48:40 +01:00
|
|
|
}
|
2020-09-05 22:35:52 +02:00
|
|
|
this.labelEditLabel = label
|
|
|
|
this.isLabelEdit = true
|
|
|
|
|
|
|
|
// This makes the editor trigger its mounted function again which makes it forget every input
|
|
|
|
// it currently has in its textarea. This is a counter-hack to a hack inside of vue-easymde
|
|
|
|
// which made it impossible to detect change from the outside. Therefore the component would
|
|
|
|
// not update if new content from the outside was made available.
|
|
|
|
// See https://github.com/NikulinIlya/vue-easymde/issues/3
|
|
|
|
this.editorActive = false
|
|
|
|
this.$nextTick(() => this.editorActive = true)
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
2020-02-18 07:49:20 +01:00
|
|
|
</script>
|