|
|
|
@ -1,18 +1,12 @@
|
|
|
|
|
<template> |
|
|
|
|
<page-view :title="sheetToStage.title ? sheetToStage.title : '新页面'" affix> |
|
|
|
|
<page-view |
|
|
|
|
:sub-title="sheetToStage.inProgress ? '当前内容已保存,但还未发布。' : ''" |
|
|
|
|
:title="sheetToStage.title ? sheetToStage.title : '新页面'" |
|
|
|
|
affix |
|
|
|
|
> |
|
|
|
|
<template slot="extra"> |
|
|
|
|
<a-space> |
|
|
|
|
<ReactiveButton |
|
|
|
|
:errored="draftSaveErrored" |
|
|
|
|
:loading="draftSaving" |
|
|
|
|
erroredText="保存失败" |
|
|
|
|
loadedText="保存成功" |
|
|
|
|
text="保存草稿" |
|
|
|
|
type="danger" |
|
|
|
|
@callback="draftSaveErrored = false" |
|
|
|
|
@click="handleSaveDraft(false)" |
|
|
|
|
></ReactiveButton> |
|
|
|
|
<a-button :loading="previewSaving" @click="handlePreview">预览</a-button> |
|
|
|
|
<a-button :loading="previewSaving" @click="handlePreviewClick">预览</a-button> |
|
|
|
|
<a-button type="primary" @click="sheetSettingVisible = true">发布</a-button> |
|
|
|
|
</a-space> |
|
|
|
|
</template> |
|
|
|
@ -26,7 +20,7 @@
|
|
|
|
|
<MarkdownEditor |
|
|
|
|
:originalContent="sheetToStage.originalContent" |
|
|
|
|
@onContentChange="onContentChange" |
|
|
|
|
@onSaveDraft="handleSaveDraft(true)" |
|
|
|
|
@onSaveDraft="handleSaveDraft()" |
|
|
|
|
/> |
|
|
|
|
</div> |
|
|
|
|
</a-col> |
|
|
|
@ -42,12 +36,16 @@
|
|
|
|
|
</template> |
|
|
|
|
|
|
|
|
|
<script> |
|
|
|
|
import { mixin, mixinDevice, mixinPostEdit } from '@/mixins/mixin.js' |
|
|
|
|
import { datetimeFormat } from '@/utils/datetime' |
|
|
|
|
// components |
|
|
|
|
import { PageView } from '@/layouts' |
|
|
|
|
import SheetSettingModal from './components/SheetSettingModal' |
|
|
|
|
import MarkdownEditor from '@/components/Editor/MarkdownEditor' |
|
|
|
|
|
|
|
|
|
// libs |
|
|
|
|
import { mixin, mixinDevice, mixinPostEdit } from '@/mixins/mixin.js' |
|
|
|
|
import { datetimeFormat } from '@/utils/datetime' |
|
|
|
|
import apiClient from '@/utils/api-client' |
|
|
|
|
import debounce from 'lodash.debounce' |
|
|
|
|
|
|
|
|
|
export default { |
|
|
|
|
components: { |
|
|
|
@ -61,8 +59,6 @@ export default {
|
|
|
|
|
sheetSettingVisible: false, |
|
|
|
|
sheetToStage: {}, |
|
|
|
|
contentChanges: 0, |
|
|
|
|
draftSaving: false, |
|
|
|
|
draftSaveErrored: false, |
|
|
|
|
previewSaving: false |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
@ -70,11 +66,10 @@ export default {
|
|
|
|
|
// Get sheetId id from query |
|
|
|
|
const sheetId = to.query.sheetId |
|
|
|
|
|
|
|
|
|
next(vm => { |
|
|
|
|
next(async vm => { |
|
|
|
|
if (sheetId) { |
|
|
|
|
apiClient.sheet.get(sheetId).then(response => { |
|
|
|
|
vm.sheetToStage = response.data |
|
|
|
|
}) |
|
|
|
|
const { data } = await apiClient.sheet.get(Number(sheetId)) |
|
|
|
|
vm.sheetToStage = data |
|
|
|
|
} |
|
|
|
|
}) |
|
|
|
|
}, |
|
|
|
@ -109,100 +104,74 @@ export default {
|
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
methods: { |
|
|
|
|
handleSaveDraft(draftOnly = false) { |
|
|
|
|
this.$log.debug('Draft only: ' + draftOnly) |
|
|
|
|
this.sheetToStage.status = 'DRAFT' |
|
|
|
|
if (!this.sheetToStage.title) { |
|
|
|
|
this.sheetToStage.title = datetimeFormat(new Date(), 'YYYY-MM-DD-HH-mm-ss') |
|
|
|
|
} |
|
|
|
|
this.draftSaving = true |
|
|
|
|
handleSaveDraft: debounce(async function () { |
|
|
|
|
if (this.sheetToStage.id) { |
|
|
|
|
if (draftOnly) { |
|
|
|
|
apiClient.sheet |
|
|
|
|
.updateDraftById(this.sheetToStage.id, this.sheetToStage.originalContent) |
|
|
|
|
.then(() => { |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
}) |
|
|
|
|
.catch(() => { |
|
|
|
|
this.draftSaveErrored = true |
|
|
|
|
}) |
|
|
|
|
.finally(() => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.draftSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
}) |
|
|
|
|
} else { |
|
|
|
|
apiClient.sheet |
|
|
|
|
.update(this.sheetToStage.id, this.sheetToStage) |
|
|
|
|
.then(response => { |
|
|
|
|
this.sheetToStage = response.data |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
}) |
|
|
|
|
.catch(() => { |
|
|
|
|
this.draftSaveErrored = true |
|
|
|
|
}) |
|
|
|
|
.finally(() => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.draftSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
}) |
|
|
|
|
try { |
|
|
|
|
const { data } = await apiClient.sheet.updateDraftById( |
|
|
|
|
this.sheetToStage.id, |
|
|
|
|
this.sheetToStage.originalContent |
|
|
|
|
) |
|
|
|
|
this.sheetToStage.inProgress = data.inProgress |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
this.$message.success({ |
|
|
|
|
content: '内容已保存', |
|
|
|
|
duration: 0.5 |
|
|
|
|
}) |
|
|
|
|
} catch (e) { |
|
|
|
|
this.$log.error('Failed to update sheet content', e) |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
apiClient.sheet |
|
|
|
|
.create(this.sheetToStage) |
|
|
|
|
.then(response => { |
|
|
|
|
this.sheetToStage = response.data |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
}) |
|
|
|
|
.catch(() => { |
|
|
|
|
this.draftSaveErrored = true |
|
|
|
|
}) |
|
|
|
|
.finally(() => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.draftSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
}) |
|
|
|
|
await this.handleCreateSheet() |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
handlePreview() { |
|
|
|
|
this.sheetToStage.status = 'DRAFT' |
|
|
|
|
}, 300), |
|
|
|
|
|
|
|
|
|
async handleCreateSheet() { |
|
|
|
|
if (!this.sheetToStage.title) { |
|
|
|
|
this.sheetToStage.title = datetimeFormat(new Date(), 'YYYY-MM-DD-HH-mm-ss') |
|
|
|
|
} |
|
|
|
|
try { |
|
|
|
|
const { data } = await apiClient.sheet.create(this.sheetToStage) |
|
|
|
|
this.sheetToStage = data |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
|
|
|
|
|
// add params to url |
|
|
|
|
const path = this.$router.history.current.path |
|
|
|
|
this.$router.replace({ path, query: { sheetId: this.sheetToStage.id } }).catch(err => err) |
|
|
|
|
this.$message.success({ |
|
|
|
|
content: '页面已创建', |
|
|
|
|
duration: 0.5 |
|
|
|
|
}) |
|
|
|
|
} catch (e) { |
|
|
|
|
this.$log.error('Failed to create sheet', e) |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
async handlePreviewClick() { |
|
|
|
|
this.previewSaving = true |
|
|
|
|
if (this.sheetToStage.id) { |
|
|
|
|
apiClient.sheet.update(this.sheetToStage.id, this.sheetToStage).then(response => { |
|
|
|
|
this.$log.debug('Updated sheet', response.data) |
|
|
|
|
apiClient.sheet |
|
|
|
|
.getPreviewLinkById(this.sheetToStage.id) |
|
|
|
|
.then(response => { |
|
|
|
|
window.open(response, '_blank') |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
}) |
|
|
|
|
.finally(() => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.previewSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
// Update the sheet content |
|
|
|
|
const { data } = await apiClient.sheet.updateDraftById(this.sheetToStage.id, this.sheetToStage.originalContent) |
|
|
|
|
this.sheetToStage.inProgress = data.inProgress |
|
|
|
|
} else { |
|
|
|
|
apiClient.sheet.create(this.sheetToStage).then(response => { |
|
|
|
|
this.$log.debug('Created sheet', response.data) |
|
|
|
|
this.sheetToStage = response.data |
|
|
|
|
apiClient.sheet |
|
|
|
|
.getPreviewLinkById(this.sheetToStage.id) |
|
|
|
|
.then(response => { |
|
|
|
|
window.open(response, '_blank') |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
}) |
|
|
|
|
.finally(() => { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.previewSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
}) |
|
|
|
|
}) |
|
|
|
|
await this.handleCreateSheet() |
|
|
|
|
} |
|
|
|
|
await this.handleOpenPreview() |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
async handleOpenPreview() { |
|
|
|
|
try { |
|
|
|
|
const response = await apiClient.sheet.getPreviewLinkById(this.sheetToStage.id) |
|
|
|
|
window.open(response, '_blank') |
|
|
|
|
this.handleRestoreSavedStatus() |
|
|
|
|
} catch (e) { |
|
|
|
|
this.$log.error('Failed to get preview link', e) |
|
|
|
|
} finally { |
|
|
|
|
setTimeout(() => { |
|
|
|
|
this.previewSaving = false |
|
|
|
|
}, 400) |
|
|
|
|
} |
|
|
|
|
}, |
|
|
|
|
|
|
|
|
|
handleRestoreSavedStatus() { |
|
|
|
|
this.contentChanges = 0 |
|
|
|
|
}, |
|
|
|
|