You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

246 lines
5.4 KiB

<template>
<v-card>
<v-card-text v-if="isReady">
<v-form
ref="form"
v-model="valid"
>
<v-row>
<v-col
cols="12"
sm="6"
>
<h3>Name</h3>
<v-text-field
v-model="project.name"
label="Add project name"
:rules="projectNameRules($t('rules.projectNameRules'))"
:disabled="!edit.name"
single-line
/>
</v-col>
<v-col
cols="12"
sm="6"
>
<v-btn
v-if="!edit.name"
outlined
color="grey"
class="text-capitalize"
@click="editProject('name')"
>
Edit
</v-btn>
<v-btn
v-if="edit.name"
outlined
color="primary"
class="text-capitalize"
@click="doneEdit()"
>
Save
</v-btn>
<v-btn
v-if="edit.name"
outlined
color="grey"
class="text-capitalize"
@click="cancelEdit()"
>
Cancel
</v-btn>
</v-col>
</v-row>
<v-row>
<v-col
cols="12"
sm="6"
>
<h3>Description</h3>
<v-text-field
v-model="project.description"
label="Add description"
:rules="descriptionRules($t('rules.descriptionRules'))"
:disabled="!edit.desc"
single-line
/>
</v-col>
<v-col
cols="12"
sm="6"
>
<v-btn
v-if="!edit.desc"
outlined
color="grey"
class="text-capitalize"
@click="editProject('desc')"
>
Edit
</v-btn>
<v-btn
v-if="edit.desc"
outlined
color="primary"
class="text-capitalize"
@click="doneEdit()"
>
Save
</v-btn>
<v-btn
v-if="edit.desc"
outlined
color="grey"
class="text-capitalize"
@click="cancelEdit()"
>
Cancel
</v-btn>
</v-col>
</v-row>
<v-row>
<v-col
cols="12"
sm="6"
>
<h3>Tags</h3>
<v-chip
v-for="tag in tags"
:key="tag.id"
close
outlined
@click:close="removeTag(tag.id)">{{tag.text}}
</v-chip>
<v-text-field
v-model="tagInput"
clearable
prepend-icon="add_circle"
@keyup.enter="addTag()"
@click:prepend="addTag()">
</v-text-field>
</v-col>
</v-row>
<v-row>
<v-col
cols="12"
sm="6"
>
<h3>Shuffle</h3>
<v-checkbox
v-model="project.enableRandomizeDocOrder"
:label="$t('overview.randomizeDocOrder')"
/>
</v-col>
</v-row>
<v-row>
<v-col
cols="12"
sm="6"
>
<h3>Collaboration</h3>
<v-checkbox
v-model="project.enableShareAnnotation"
:label="$t('overview.shareAnnotations')"
/>
</v-col>
</v-row>
</v-form>
</v-card-text>
</v-card>
</template>
<script>
import { projectNameRules, descriptionRules } from '@/rules/index'
export default {
async fetch() {
this.project = await this.$services.project.findById(this.projectId)
this.getTags()
},
data() {
return {
project: {},
tags: {},
beforeEditCache: {},
tagInput: '',
edit: {
name: false,
desc: false
},
projectNameRules,
descriptionRules,
valid: false
}
},
computed: {
isReady() {
return !!this.project
},
projectId() {
return this.$route.params.id
}
},
watch: {
'project.enableRandomizeDocOrder'() {
this.doneEdit()
},
'project.enableShareAnnotation'() {
this.doneEdit()
}
},
methods: {
initEdit() {
Object.keys(this.edit).forEach((v) => { this.edit[v] = false })
},
editProject(name) {
this.cancelEdit()
this.edit[name] = true
Object.assign(this.beforeEditCache, this.project)
},
cancelEdit() {
this.initEdit()
Object.assign(this.project, this.beforeEditCache)
},
async doneEdit() {
if (!this.validate()) {
this.cancelEdit()
return
}
try {
await this.$services.project.update(this.project)
this.beforeEditCache = {}
this.$fetch()
} finally {
this.initEdit()
}
},
validate() {
return this.$refs.form.validate()
},
async getTags(){
this.tags = await this.$services.tag.list(this.projectId)
},
addTag(){
this.$services.tag.create(this.projectId, this.tagInput)
this.tagInput = ''
this.getTags()
},
removeTag(id){
this.$services.tag.delete(this.projectId, id)
this.tags = this.tags.filter(tag => tag.id !== id)
}
}
}
</script>