2021-04-28 21:31:39 -08:00
|
|
|
<template>
|
|
|
|
|
<div>
|
|
|
|
|
<h2 class="mb-4">{{ $t("recipe.instructions") }}</h2>
|
|
|
|
|
<div>
|
|
|
|
|
<div v-for="(step, index) in value" :key="index">
|
2021-05-01 20:46:02 -08:00
|
|
|
<v-app-bar v-if="showTitleEditor[index]" class="primary mx-1 mt-6" dark dense rounded>
|
2021-04-28 21:31:39 -08:00
|
|
|
<v-toolbar-title class="headline" v-if="!edit">
|
|
|
|
|
<v-app-bar-title v-text="step.title"> </v-app-bar-title>
|
|
|
|
|
</v-toolbar-title>
|
|
|
|
|
<v-text-field
|
|
|
|
|
v-if="edit"
|
|
|
|
|
class="headline pa-0 mt-5"
|
|
|
|
|
v-model="step.title"
|
|
|
|
|
dense
|
|
|
|
|
solo
|
|
|
|
|
flat
|
|
|
|
|
placeholder="Section Title"
|
|
|
|
|
background-color="primary"
|
|
|
|
|
>
|
|
|
|
|
</v-text-field>
|
|
|
|
|
</v-app-bar>
|
|
|
|
|
<v-hover v-slot="{ hover }">
|
|
|
|
|
<v-card
|
|
|
|
|
class="ma-1"
|
|
|
|
|
:class="[{ 'on-hover': hover }, isDisabled(index)]"
|
|
|
|
|
:elevation="hover ? 12 : 2"
|
|
|
|
|
:ripple="!edit"
|
|
|
|
|
@click="toggleDisabled(index)"
|
|
|
|
|
>
|
|
|
|
|
<v-card-title>
|
|
|
|
|
<v-btn
|
|
|
|
|
v-if="edit"
|
|
|
|
|
fab
|
|
|
|
|
x-small
|
|
|
|
|
color="white"
|
|
|
|
|
class="mr-2"
|
|
|
|
|
elevation="0"
|
|
|
|
|
@click="removeByIndex(value, index)"
|
|
|
|
|
>
|
|
|
|
|
<v-icon size="24" color="error">mdi-delete</v-icon>
|
|
|
|
|
</v-btn>
|
|
|
|
|
{{ $t("recipe.step-index", { step: index + 1 }) }}
|
2021-05-01 20:46:02 -08:00
|
|
|
<v-btn v-if="edit" text color="primary" class="ml-auto" @click="toggleShowTitle(index)">
|
|
|
|
|
{{ !showTitleEditor[index] ? "Insert Section" : "Remove Section" }}
|
2021-04-28 21:31:39 -08:00
|
|
|
</v-btn>
|
|
|
|
|
</v-card-title>
|
|
|
|
|
<v-card-text v-if="edit">
|
|
|
|
|
<v-textarea
|
|
|
|
|
auto-grow
|
|
|
|
|
dense
|
|
|
|
|
v-model="value[index]['text']"
|
|
|
|
|
:key="generateKey('instructions', index)"
|
|
|
|
|
rows="4"
|
|
|
|
|
>
|
|
|
|
|
</v-textarea>
|
|
|
|
|
</v-card-text>
|
|
|
|
|
<v-card-text v-else>
|
|
|
|
|
<vue-markdown :source="step.text"> </vue-markdown>
|
|
|
|
|
</v-card-text>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-hover>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
import VueMarkdown from "@adapttive/vue-markdown";
|
|
|
|
|
import utils from "@/utils";
|
|
|
|
|
export default {
|
|
|
|
|
components: {
|
|
|
|
|
VueMarkdown,
|
|
|
|
|
},
|
|
|
|
|
props: {
|
|
|
|
|
value: {
|
|
|
|
|
type: Array,
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
edit: {
|
|
|
|
|
type: Boolean,
|
|
|
|
|
default: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
disabledSteps: [],
|
|
|
|
|
showTitleEditor: [],
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
mounted() {
|
|
|
|
|
this.showTitleEditor = this.value.map(x => this.validateTitle(x.title));
|
|
|
|
|
},
|
|
|
|
|
methods: {
|
|
|
|
|
generateKey(item, index) {
|
|
|
|
|
return utils.generateUniqueKey(item, index);
|
|
|
|
|
},
|
|
|
|
|
removeByIndex(list, index) {
|
|
|
|
|
list.splice(index, 1);
|
|
|
|
|
},
|
|
|
|
|
validateTitle(title) {
|
|
|
|
|
return !(title === null || title === "");
|
|
|
|
|
},
|
|
|
|
|
toggleDisabled(stepIndex) {
|
|
|
|
|
if (this.edit) return;
|
|
|
|
|
if (this.disabledSteps.includes(stepIndex)) {
|
|
|
|
|
let index = this.disabledSteps.indexOf(stepIndex);
|
|
|
|
|
if (index !== -1) {
|
|
|
|
|
this.disabledSteps.splice(index, 1);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
this.disabledSteps.push(stepIndex);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
isDisabled(stepIndex) {
|
|
|
|
|
if (this.disabledSteps.includes(stepIndex) && !this.edit) {
|
|
|
|
|
return "disabled-card";
|
|
|
|
|
} else {
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
toggleShowTitle(index) {
|
|
|
|
|
const newVal = !this.showTitleEditor[index];
|
|
|
|
|
if (!newVal) {
|
|
|
|
|
this.value[index].title = "";
|
|
|
|
|
}
|
|
|
|
|
this.$set(this.showTitleEditor, index, newVal);
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
</script>
|
|
|
|
|
|
2021-05-01 20:46:02 -08:00
|
|
|
<style scoped></style>
|