Yield generated for 8c7d5c7c-0e3e-4d8b-9131-fbc12e487b0d
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.
 
 
 

150 lines
4.2 KiB

<template>
<div class="editor-page">
<div class="container page">
<div class="row">
<div class="col-md-10 offset-md-1 col-xs-12">
<RwvListErrors :errors="errors" />
<form @submit.prevent="onPublish(article.slug)">
<fieldset :disabled="inProgress">
<fieldset class="form-group">
<input
type="text"
class="form-control form-control-lg"
v-model="article.title"
placeholder="Article Title"
/>
</fieldset>
<fieldset class="form-group">
<input
type="text"
class="form-control"
v-model="article.description"
placeholder="What's this article about?"
/>
</fieldset>
<fieldset class="form-group">
<textarea
class="form-control"
rows="8"
v-model="article.body"
placeholder="Write your article (in markdown)"
>
</textarea>
</fieldset>
<fieldset class="form-group">
<input
type="text"
class="form-control"
placeholder="Enter tags"
v-model="tagInput"
@keypress.enter.prevent="addTag(tagInput)"
/>
<div class="tag-list">
<span
class="tag-default tag-pill"
v-for="(tag, index) of article.tagList"
:key="tag + index"
>
<i class="ion-close-round" @click="removeTag(tag)"> </i>
{{ tag }}
</span>
</div>
</fieldset>
</fieldset>
<button
:disabled="inProgress"
class="btn btn-lg pull-xs-right btn-primary"
type="submit"
>
Publish Article
</button>
</form>
</div>
</div>
</div>
</div>
</template>
<script>
import { mapGetters } from "vuex";
import store from "@/store";
import RwvListErrors from "@/components/ListErrors";
import {
ARTICLE_PUBLISH,
ARTICLE_EDIT,
FETCH_ARTICLE,
ARTICLE_EDIT_ADD_TAG,
ARTICLE_EDIT_REMOVE_TAG,
ARTICLE_RESET_STATE
} from "@/store/actions.type";
export default {
name: "RwvArticleEdit",
components: { RwvListErrors },
props: {
previousArticle: {
type: Object,
required: false
}
},
async beforeRouteUpdate(to, from, next) {
// Reset state if user goes from /editor/:id to /editor
// The component is not recreated so we use to hook to reset the state.
await store.dispatch(ARTICLE_RESET_STATE);
return next();
},
async beforeRouteEnter(to, from, next) {
// SO: https://github.com/vuejs/vue-router/issues/1034
// If we arrive directly to this url, we need to fetch the article
await store.dispatch(ARTICLE_RESET_STATE);
if (to.params.slug !== undefined) {
await store.dispatch(
FETCH_ARTICLE,
to.params.slug,
to.params.previousArticle
);
}
return next();
},
async beforeRouteLeave(to, from, next) {
await store.dispatch(ARTICLE_RESET_STATE);
next();
},
data() {
return {
tagInput: null,
inProgress: false,
errors: {}
};
},
computed: {
...mapGetters(["article"])
},
methods: {
onPublish(slug) {
let action = slug ? ARTICLE_EDIT : ARTICLE_PUBLISH;
this.inProgress = true;
this.$store
.dispatch(action)
.then(({ data }) => {
this.inProgress = false;
this.$router.push({
name: "article",
params: { slug: data.article.slug }
});
})
.catch(({ response }) => {
this.inProgress = false;
this.errors = response.data.errors;
});
},
removeTag(tag) {
this.$store.dispatch(ARTICLE_EDIT_REMOVE_TAG, tag);
},
addTag(tag) {
this.$store.dispatch(ARTICLE_EDIT_ADD_TAG, tag);
this.tagInput = null;
}
}
};
</script>