mirror of https://github.com/sunface/rust-course
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.
231 lines
8.3 KiB
231 lines
8.3 KiB
<template>
|
|
<div class="home markdown article-edit">
|
|
<el-row>
|
|
<el-col :span="24" :offset="0">
|
|
<div class="tags no-border">
|
|
<el-input size="small" v-model="tempArticle.title" class="inline-input width-200" placeholder="Title" @blur="setTitle"></el-input>
|
|
<el-select class="margin-left-10 width-300" size="small" v-model="tempArticle.tags" multiple filterable remote placeholder="Tags" @change="setTags" :remote-method="queryTags" :loading="tagsLoading" allow-create default-first-option>
|
|
<el-option v-for="item in tags" :key="item" :label="item" :value="item"></el-option>
|
|
</el-select>
|
|
|
|
<el-select
|
|
v-model="tempArticle.lang"
|
|
placeholder="lang for article"
|
|
size="small"
|
|
class="width-150"
|
|
>
|
|
<el-option v-for="o in langOptions" :key="o.label" :label="o.label" :value="o.value"></el-option>
|
|
</el-select>
|
|
<span>
|
|
<el-button size="medium" type="info" class="border-radius-100" @click="preview">PREVIEW</el-button>
|
|
<el-button size="medium" type="info" class="border-radius-100" @click="saveNew(1)" v-show="tempArticle.status == 1 || mode=='new'">SAVE DRAFT</el-button>
|
|
<el-button size="medium" type="info" class="border-radius-100" @click="saveChanges" v-show="tempArticle.status == 2">SAVE CHANGES</el-button>
|
|
<el-button size="medium" type="primary" class="border-radius-100" @click="saveNew(2)" v-show="tempArticle.status != 2">PUBLISH</el-button>
|
|
</span>
|
|
|
|
<span class="float-right margin-top-5 margin-right-10 font-size-18">
|
|
<el-tooltip content="Revert to the previous save" class="margin-right-15" v-show="mode=='edit'"><i class="el-icon-back cursor-pointer" @click="clearChanges" ></i></el-tooltip>
|
|
<el-tooltip content="Delete this post" v-show="mode=='edit'"><i class="el-icon-delete cursor-pointer"></i></el-tooltip>
|
|
</span>
|
|
</div>
|
|
</el-col>
|
|
<el-col :span="12">
|
|
<editor :editorHeight="editorHeight" class="margin-top-5" parent="article" :md="tempArticle.md" @articleSetMD="articleSetMD"></editor>
|
|
</el-col>
|
|
<el-col :span="12" v-if="previewReset" class="margin-top-5 render">
|
|
<render id ="render-content" :content="tempArticle.render" :style="{'height':editorHeight}" class="padding-10 overflow-y-auto"></render>
|
|
</el-col>
|
|
</el-row>
|
|
|
|
|
|
</div>
|
|
</template>
|
|
|
|
<script>
|
|
import request from "@/utils/request";
|
|
import render from "../components/render"
|
|
import editor from "../components/editor"
|
|
import langOptions from "@/utils/data"
|
|
export default {
|
|
components: {render,editor},
|
|
data () {
|
|
return {
|
|
tagsLoading: false,
|
|
tags: [],
|
|
allTags: ['go','golang','rust','java','javascript'], // query tags from remote server
|
|
tempArticle: {
|
|
title: '',
|
|
tags: [],
|
|
md :'',
|
|
render: '',
|
|
lang: this.$store.state.misc.lang
|
|
},
|
|
tempRender :'',
|
|
previewReset: false,
|
|
editorHeight: 'calc(100vh - 125px)',
|
|
localStoreID : window.location.origin + window.location.pathname,
|
|
|
|
// for edit only
|
|
mode: 'new',
|
|
arID: '',
|
|
|
|
langOptions: langOptions,
|
|
previewed : false
|
|
}
|
|
},
|
|
watch: {
|
|
"$store.state.user.id"() {
|
|
if (this.$store.state.user.id != '') {
|
|
this.init()
|
|
}
|
|
},
|
|
},
|
|
computed: {
|
|
},
|
|
methods: {
|
|
clearChanges() {
|
|
request({
|
|
url: "/web/article/beforeEdit",
|
|
method: "GET",
|
|
params: {
|
|
article_id: this.arID
|
|
}
|
|
}).then(res => {
|
|
this.tempArticle = res.data.data
|
|
localStorage.removeItem(this.localStoreID)
|
|
});
|
|
},
|
|
articleSetMD(md,render) {
|
|
this.tempArticle.md = md
|
|
// console.log(render)
|
|
this.tempRender = render
|
|
localStorage.setItem(this.localStoreID, JSON.stringify(this.tempArticle))
|
|
},
|
|
preview() {
|
|
request({
|
|
url: "/web/post/preview",
|
|
method: "POST",
|
|
params: {
|
|
render: this.tempRender
|
|
}
|
|
}).then(res => {
|
|
this.tempArticle.render = res.data.data
|
|
this.previewReset = true
|
|
// make the render area scroll to bottom
|
|
if (this.previewed) {
|
|
setTimeout(function() {
|
|
var r = document.getElementById('render-content')
|
|
r.scrollTop = r.scrollHeight
|
|
} ,300)
|
|
} else {
|
|
this.previewed = true
|
|
}
|
|
});
|
|
},
|
|
saveChanges() {
|
|
if (this.tempArticle.title == '') {
|
|
this.$message.error('Title cant be blank')
|
|
return
|
|
}
|
|
|
|
this.tempArticle.render = this.tempRender
|
|
request({
|
|
url: "/web/article/saveChanges",
|
|
method: "POST",
|
|
params: {
|
|
content: JSON.stringify(this.tempArticle)
|
|
}
|
|
}).then(res => {
|
|
localStorage.removeItem(this.localStoreID)
|
|
this.$router.push('/' + res.data.data)
|
|
});
|
|
},
|
|
saveNew(opType) {
|
|
if (this.tempArticle.title == '') {
|
|
this.$message.error('Title cant be blank')
|
|
return
|
|
}
|
|
|
|
this.tempArticle.render = this.tempRender
|
|
this.tempArticle.cover_image = 'https://res.cloudinary.com/practicaldev/image/fetch/s--irWUM2_k--/c_imagga_scale,f_auto,fl_progressive,h_420,q_auto,w_1000/https://res.cloudinary.com/practicaldev/image/fetch/s--5kGvHb_---/c_imagga_scale%2Cf_auto%2Cfl_progressive%2Ch_420%2Cq_auto%2Cw_1000/https://thepracticaldev.s3.amazonaws.com/i/adfopvch5w18u9lqpev9.jpg'
|
|
request({
|
|
url: "/web/article/saveNew",
|
|
method: "POST",
|
|
params: {
|
|
type: opType,
|
|
content: JSON.stringify(this.tempArticle)
|
|
}
|
|
}).then(res => {
|
|
localStorage.removeItem(this.localStoreID)
|
|
this.$router.push('/' + res.data.data)
|
|
});
|
|
},
|
|
setTags(val) {
|
|
if (this.tempArticle.tags.length!=0) {
|
|
var last = this.tempArticle.tags[this.tempArticle.tags.length-1]
|
|
if (last.trim() == '') {
|
|
this.$message.warning("tag cant be blank")
|
|
this.tempArticle.tags.pop()
|
|
return
|
|
}
|
|
}
|
|
if (this.tempArticle.tags.length > 3) {
|
|
this.$message.warning("tags length is limited to 3")
|
|
this.tempArticle.tags.pop()
|
|
return
|
|
}
|
|
localStorage.setItem(this.localStoreID, JSON.stringify(this.tempArticle))
|
|
},
|
|
setTitle() {
|
|
localStorage.setItem(this.localStoreID, JSON.stringify(this.tempArticle))
|
|
},
|
|
queryTags(q) {
|
|
if (q !== '') {
|
|
this.tagsLoading = true;
|
|
setTimeout(() => {
|
|
this.tagsLoading = false;
|
|
this.tags = this.allTags.filter(item => {
|
|
return item.toLowerCase()
|
|
.indexOf(q.toLowerCase()) > -1;
|
|
});
|
|
}, 200);
|
|
} else {
|
|
this.tags = [];
|
|
}
|
|
},
|
|
init() {
|
|
this.arID = this.$route.params.arID;
|
|
if (this.arID != undefined) {
|
|
this.mode = 'edit'
|
|
// check ar already in cache
|
|
var ar = localStorage.getItem(this.localStoreID)
|
|
if (ar != null) {
|
|
this.tempArticle = JSON.parse(ar)
|
|
} else {
|
|
request({
|
|
url: "/web/article/beforeEdit",
|
|
method: "GET",
|
|
params: {
|
|
article_id: this.arID
|
|
}
|
|
}).then(res => {
|
|
this.tempArticle = res.data.data
|
|
});
|
|
}
|
|
}
|
|
}
|
|
},
|
|
mounted() {
|
|
if (this.mode == 'new') {
|
|
var ar = localStorage.getItem(this.localStoreID)
|
|
if (ar != null) {
|
|
this.tempArticle = JSON.parse(ar)
|
|
}
|
|
}
|
|
},
|
|
created() {
|
|
this.init()
|
|
},
|
|
}
|
|
</script>
|