mirror of https://github.com/halo-dev/halo
288 lines
8.1 KiB
Vue
288 lines
8.1 KiB
Vue
<template>
|
||
<div>
|
||
<a-row :gutter="12">
|
||
<a-col :span="24">
|
||
<div style="margin-bottom: 16px">
|
||
<a-input
|
||
v-model="postToStage.title"
|
||
size="large"
|
||
placeholder="请输入文章标题"
|
||
/>
|
||
</div>
|
||
|
||
<div id="editor">
|
||
<MarkdownEditor
|
||
:originalContent="postToStage.originalContent"
|
||
@onSaveDraft="handleSaveDraft(true)"
|
||
@onContentChange="onContentChange"
|
||
/>
|
||
|
||
<!-- <RichTextEditor
|
||
v-else
|
||
:originalContent="postToStage.originalContent"
|
||
@onContentChange="onContentChange"
|
||
/> -->
|
||
</div>
|
||
</a-col>
|
||
</a-row>
|
||
|
||
<PostSettingDrawer
|
||
:post="postToStage"
|
||
:tagIds="selectedTagIds"
|
||
:categoryIds="selectedCategoryIds"
|
||
:metas="selectedMetas"
|
||
:visible="postSettingVisible"
|
||
@close="onPostSettingsClose"
|
||
@onRefreshPost="onRefreshPostFromSetting"
|
||
@onRefreshTagIds="onRefreshTagIdsFromSetting"
|
||
@onRefreshCategoryIds="onRefreshCategoryIdsFromSetting"
|
||
@onRefreshPostMetas="onRefreshPostMetasFromSetting"
|
||
@onSaved="onSaved"
|
||
/>
|
||
|
||
<AttachmentDrawer v-model="attachmentDrawerVisible" />
|
||
|
||
<footer-tool-bar :style="{ width: isSideMenu() && isDesktop() ? `calc(100% - ${sidebarOpened ? 256 : 80}px)` : '100%'}">
|
||
<a-button
|
||
type="danger"
|
||
@click="handleSaveDraft(false)"
|
||
:loading="draftSaving"
|
||
>保存草稿</a-button>
|
||
<a-button
|
||
@click="handlePreview"
|
||
style="margin-left: 8px;"
|
||
:loading="previewSaving"
|
||
>预览</a-button>
|
||
<a-button
|
||
type="primary"
|
||
@click="handleShowPostSetting"
|
||
style="margin-left: 8px;"
|
||
>发布</a-button>
|
||
<a-button
|
||
type="dashed"
|
||
@click="attachmentDrawerVisible = true"
|
||
style="margin-left: 8px;"
|
||
>附件库</a-button>
|
||
</footer-tool-bar>
|
||
</div>
|
||
</template>
|
||
|
||
<script>
|
||
import { mixin, mixinDevice } from '@/utils/mixin.js'
|
||
// import { mapGetters } from 'vuex'
|
||
import moment from 'moment'
|
||
import PostSettingDrawer from './components/PostSettingDrawer'
|
||
import AttachmentDrawer from '../attachment/components/AttachmentDrawer'
|
||
import FooterToolBar from '@/components/FooterToolbar'
|
||
import MarkdownEditor from '@/components/Editor/MarkdownEditor'
|
||
// import RichTextEditor from '@/components/editor/RichTextEditor'
|
||
|
||
import postApi from '@/api/post'
|
||
export default {
|
||
mixins: [mixin, mixinDevice],
|
||
components: {
|
||
PostSettingDrawer,
|
||
FooterToolBar,
|
||
AttachmentDrawer,
|
||
MarkdownEditor
|
||
// RichTextEditor
|
||
},
|
||
data() {
|
||
return {
|
||
attachmentDrawerVisible: false,
|
||
postSettingVisible: false,
|
||
postToStage: {},
|
||
selectedTagIds: [],
|
||
selectedCategoryIds: [],
|
||
selectedMetas: [],
|
||
isSaved: false,
|
||
contentChanges: 0,
|
||
draftSaving: false,
|
||
previewSaving: false
|
||
}
|
||
},
|
||
beforeRouteEnter(to, from, next) {
|
||
// Get post id from query
|
||
const postId = to.query.postId
|
||
next(vm => {
|
||
if (postId) {
|
||
postApi.get(postId).then(response => {
|
||
const post = response.data.data
|
||
vm.postToStage = post
|
||
vm.selectedTagIds = post.tagIds
|
||
vm.selectedCategoryIds = post.categoryIds
|
||
vm.selectedMetas = post.metas
|
||
})
|
||
}
|
||
})
|
||
},
|
||
destroyed: function() {
|
||
if (this.postSettingVisible) {
|
||
this.postSettingVisible = false
|
||
}
|
||
if (this.attachmentDrawerVisible) {
|
||
this.attachmentDrawerVisible = false
|
||
}
|
||
if (window.onbeforeunload) {
|
||
window.onbeforeunload = null
|
||
}
|
||
},
|
||
beforeRouteLeave(to, from, next) {
|
||
if (this.postSettingVisible) {
|
||
this.postSettingVisible = false
|
||
}
|
||
if (this.attachmentDrawerVisible) {
|
||
this.attachmentDrawerVisible = false
|
||
}
|
||
|
||
if (this.contentChanges <= 1) {
|
||
next()
|
||
} else if (this.isSaved) {
|
||
next()
|
||
} else {
|
||
this.$confirm({
|
||
title: '当前页面数据未保存,确定要离开吗?',
|
||
content: h => <div style="color:red;">如果离开当面页面,你的数据很可能会丢失!</div>,
|
||
onOk() {
|
||
next()
|
||
},
|
||
onCancel() {
|
||
next(false)
|
||
}
|
||
})
|
||
}
|
||
},
|
||
mounted() {
|
||
window.onbeforeunload = function(e) {
|
||
e = e || window.event
|
||
if (e) {
|
||
e.returnValue = '当前页面数据未保存,确定要离开吗?'
|
||
}
|
||
return '当前页面数据未保存,确定要离开吗?'
|
||
}
|
||
// if (!this.postToStage.editorType) {
|
||
// this.postToStage.editorType = this.options.default_editor
|
||
// }
|
||
},
|
||
watch: {
|
||
temporaryContent: function(newValue, oldValue) {
|
||
if (newValue) {
|
||
this.contentChanges++
|
||
}
|
||
}
|
||
},
|
||
computed: {
|
||
temporaryContent() {
|
||
return this.postToStage.originalContent
|
||
}
|
||
// ...mapGetters(['options'])
|
||
},
|
||
methods: {
|
||
handleSaveDraft(draftOnly = false) {
|
||
this.$log.debug('Draft only: ' + draftOnly)
|
||
this.postToStage.status = 'DRAFT'
|
||
if (!this.postToStage.title) {
|
||
this.postToStage.title = moment(new Date()).format('YYYY-MM-DD-HH-mm-ss')
|
||
}
|
||
this.draftSaving = true
|
||
if (this.postToStage.id) {
|
||
// Update the post
|
||
if (draftOnly) {
|
||
postApi
|
||
.updateDraft(this.postToStage.id, this.postToStage.originalContent)
|
||
.then(response => {
|
||
this.$message.success('保存草稿成功!')
|
||
})
|
||
.finally(() => {
|
||
this.draftSaving = false
|
||
})
|
||
} else {
|
||
postApi
|
||
.update(this.postToStage.id, this.postToStage, false)
|
||
.then(response => {
|
||
this.$log.debug('Updated post', response.data.data)
|
||
this.$message.success('保存草稿成功!')
|
||
this.postToStage = response.data.data
|
||
})
|
||
.finally(() => {
|
||
this.draftSaving = false
|
||
})
|
||
}
|
||
} else {
|
||
// Create the post
|
||
postApi
|
||
.create(this.postToStage, false)
|
||
.then(response => {
|
||
this.$log.debug('Created post', response.data.data)
|
||
this.$message.success('保存草稿成功!')
|
||
this.postToStage = response.data.data
|
||
})
|
||
.finally(() => {
|
||
this.draftSaving = false
|
||
})
|
||
}
|
||
},
|
||
handleShowPostSetting() {
|
||
this.postSettingVisible = true
|
||
},
|
||
handlePreview() {
|
||
this.postToStage.status = 'DRAFT'
|
||
if (!this.postToStage.title) {
|
||
this.postToStage.title = moment(new Date()).format('YYYY-MM-DD-HH-mm-ss')
|
||
}
|
||
this.previewSaving = true
|
||
if (this.postToStage.id) {
|
||
// Update the post
|
||
postApi.update(this.postToStage.id, this.postToStage, false).then(response => {
|
||
this.$log.debug('Updated post', response.data.data)
|
||
postApi
|
||
.preview(this.postToStage.id)
|
||
.then(response => {
|
||
window.open(response.data, '_blank')
|
||
})
|
||
.finally(() => {
|
||
this.previewSaving = false
|
||
})
|
||
})
|
||
} else {
|
||
// Create the post
|
||
postApi.create(this.postToStage, false).then(response => {
|
||
this.$log.debug('Created post', response.data.data)
|
||
this.postToStage = response.data.data
|
||
postApi
|
||
.preview(this.postToStage.id)
|
||
.then(response => {
|
||
window.open(response.data, '_blank')
|
||
})
|
||
.finally(() => {
|
||
this.previewSaving = false
|
||
})
|
||
})
|
||
}
|
||
},
|
||
onContentChange(val) {
|
||
this.postToStage.originalContent = val
|
||
},
|
||
// 关闭文章设置抽屉
|
||
onPostSettingsClose() {
|
||
this.postSettingVisible = false
|
||
},
|
||
onRefreshPostFromSetting(post) {
|
||
this.postToStage = post
|
||
},
|
||
onRefreshTagIdsFromSetting(tagIds) {
|
||
this.selectedTagIds = tagIds
|
||
},
|
||
onRefreshCategoryIdsFromSetting(categoryIds) {
|
||
this.selectedCategoryIds = categoryIds
|
||
},
|
||
onRefreshPostMetasFromSetting(metas) {
|
||
this.selectedMetas = metas
|
||
},
|
||
onSaved(isSaved) {
|
||
this.isSaved = isSaved
|
||
}
|
||
}
|
||
}
|
||
</script>
|