|
|
@@ -1,29 +1,100 @@
|
|
|
<template>
|
|
|
- <n-space class="go-mt-0">
|
|
|
- <n-button v-for="item in btnList" :key="item.title" ghost @click="item.event">
|
|
|
+ <n-space>
|
|
|
+ <n-button
|
|
|
+ v-for="item in btnList"
|
|
|
+ :key="item.key"
|
|
|
+ :type="item.type()"
|
|
|
+ ghost
|
|
|
+ @click="item.event"
|
|
|
+ >
|
|
|
<template #icon>
|
|
|
<component :is="item.icon"></component>
|
|
|
</template>
|
|
|
- <span>{{ item.title }}</span>
|
|
|
+ <span>{{ item.title() }}</span>
|
|
|
</n-button>
|
|
|
</n-space>
|
|
|
+
|
|
|
+ <!-- 发布管理弹窗 -->
|
|
|
+ <n-modal v-model:show="modelShow" @afterLeave="closeHandle">
|
|
|
+ <n-list bordered class="go-system-setting">
|
|
|
+ <template #header>
|
|
|
+ <n-space justify="space-between">
|
|
|
+ <n-h3 class="go-mb-0">发布管理</n-h3>
|
|
|
+ <n-icon size="20" class="go-cursor-pointer" @click="closeHandle">
|
|
|
+ <close-icon></close-icon>
|
|
|
+ </n-icon>
|
|
|
+ </n-space>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <n-list-item>
|
|
|
+ <n-space :size="10">
|
|
|
+ <n-alert :show-icon="false" title="预览地址:" type="success">
|
|
|
+ {{ previewPath() }}
|
|
|
+ </n-alert>
|
|
|
+ <n-button tertiary type="primary" @click="copyPath()">
|
|
|
+ 复制地址
|
|
|
+ </n-button>
|
|
|
+ </n-space>
|
|
|
+ </n-list-item>
|
|
|
+
|
|
|
+ <n-list-item>
|
|
|
+ <n-space :size="10">
|
|
|
+ <n-button @click="modelShowHandle">取消</n-button>
|
|
|
+ <n-button type="primary" @click="sendHandle">
|
|
|
+ {{ release ? '取消发布' : '发布' }}
|
|
|
+ </n-button>
|
|
|
+ </n-space>
|
|
|
+ </n-list-item>
|
|
|
+ </n-list>
|
|
|
+ </n-modal>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts">
|
|
|
-import { shallowReactive } from 'vue'
|
|
|
-import { renderIcon, fetchPathByName, routerTurnByPath, setSessionStorage, getLocalStorage } from '@/utils'
|
|
|
+import { ref, shallowReactive, watchEffect } from 'vue'
|
|
|
+import { useRoute } from 'vue-router'
|
|
|
import { PreviewEnum } from '@/enums/pageEnum'
|
|
|
import { StorageEnum } from '@/enums/storageEnum'
|
|
|
-import { useRoute } from 'vue-router'
|
|
|
+import { ResultEnum } from '@/enums/httpEnum'
|
|
|
import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
|
|
|
-import { EditCanvasTypeEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
|
|
+import { ProjectInfoEnum } from '@/store/modules/chartEditStore/chartEditStore.d'
|
|
|
+import { updateProjectApi } from '@/api/path'
|
|
|
+import {
|
|
|
+ goDialog,
|
|
|
+ renderIcon,
|
|
|
+ fetchPathByName,
|
|
|
+ routerTurnByPath,
|
|
|
+ setSessionStorage,
|
|
|
+ getLocalStorage,
|
|
|
+ httpErrorHandle,
|
|
|
+ fetchRouteParamsLocation,
|
|
|
+} from '@/utils'
|
|
|
import { icon } from '@/plugins'
|
|
|
|
|
|
-const { BrowsersOutlineIcon, SendIcon } = icon.ionicons5
|
|
|
+const { BrowsersOutlineIcon, SendIcon, CloseIcon } = icon.ionicons5
|
|
|
const chartEditStore = useChartEditStore()
|
|
|
|
|
|
const routerParamsInfo = useRoute()
|
|
|
|
|
|
+const modelShow = ref<boolean>(false)
|
|
|
+const release = ref<boolean>(false)
|
|
|
+
|
|
|
+watchEffect(() => {
|
|
|
+ release.value = chartEditStore.getProjectInfo.release || false
|
|
|
+})
|
|
|
+
|
|
|
+// 关闭弹窗
|
|
|
+const closeHandle = () => {
|
|
|
+ modelShow.value = false
|
|
|
+}
|
|
|
+
|
|
|
+// 预览地址
|
|
|
+const previewPath = () => {
|
|
|
+ const { origin, pathname } = document.location
|
|
|
+ const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
|
|
|
+ const previewPath = `${origin}${pathname}${path}/${fetchRouteParamsLocation()}`
|
|
|
+ return previewPath
|
|
|
+}
|
|
|
+
|
|
|
// 预览
|
|
|
const previewHandle = () => {
|
|
|
const path = fetchPathByName(PreviewEnum.CHART_PREVIEW_NAME, 'href')
|
|
|
@@ -32,50 +103,102 @@ const previewHandle = () => {
|
|
|
// id 标识
|
|
|
const previewId = typeof id === 'string' ? id : id[0]
|
|
|
const storageInfo = chartEditStore.getStorageInfo
|
|
|
- const sessionStorageInfo = getLocalStorage(StorageEnum.GO_CHART_STORAGE_LIST) || []
|
|
|
+ const sessionStorageInfo =
|
|
|
+ getLocalStorage(StorageEnum.GO_CHART_STORAGE_LIST) || []
|
|
|
|
|
|
if (sessionStorageInfo?.length) {
|
|
|
- const repeateIndex = sessionStorageInfo.findIndex((e: { id: string }) => e.id === previewId)
|
|
|
+ const repeateIndex = sessionStorageInfo.findIndex(
|
|
|
+ (e: { id: string }) => e.id === previewId
|
|
|
+ )
|
|
|
// 重复替换
|
|
|
if (repeateIndex !== -1) {
|
|
|
- sessionStorageInfo.splice(repeateIndex, 1, { id: previewId, ...storageInfo })
|
|
|
+ sessionStorageInfo.splice(repeateIndex, 1, {
|
|
|
+ id: previewId,
|
|
|
+ ...storageInfo,
|
|
|
+ })
|
|
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
|
|
} else {
|
|
|
sessionStorageInfo.push({
|
|
|
- id: previewId, ...storageInfo
|
|
|
+ id: previewId,
|
|
|
+ ...storageInfo,
|
|
|
})
|
|
|
setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, sessionStorageInfo)
|
|
|
}
|
|
|
} else {
|
|
|
- setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [{ id: previewId, ...storageInfo }])
|
|
|
+ setSessionStorage(StorageEnum.GO_CHART_STORAGE_LIST, [
|
|
|
+ { id: previewId, ...storageInfo },
|
|
|
+ ])
|
|
|
}
|
|
|
// 跳转
|
|
|
routerTurnByPath(path, [previewId], undefined, true)
|
|
|
}
|
|
|
|
|
|
+// 模态弹窗
|
|
|
+const modelShowHandle = () => {
|
|
|
+ modelShow.value = !modelShow.value
|
|
|
+}
|
|
|
+
|
|
|
+// 复制预览地址
|
|
|
+const copyPath = (successText?: string, failure?: string) => {
|
|
|
+ navigator.clipboard
|
|
|
+ .writeText(previewPath())
|
|
|
+ .then(() => {
|
|
|
+ window['$message'].success(successText || '复制成功!')
|
|
|
+ })
|
|
|
+ .catch(() => {
|
|
|
+ window['$message'].success(failure || '复制失败!')
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
// 发布
|
|
|
-const sendHandle = () => {
|
|
|
- window['$message'].warning('该功能暂未实现(因为压根没有后台)')
|
|
|
+const sendHandle = async () => {
|
|
|
+ const res = (await updateProjectApi({
|
|
|
+ id: fetchRouteParamsLocation(),
|
|
|
+ // 反过来
|
|
|
+ state: release.value ? -1 : 1,
|
|
|
+ })) as unknown as MyResponseType
|
|
|
+
|
|
|
+ if (res.code === ResultEnum.SUCCESS) {
|
|
|
+ modelShowHandle()
|
|
|
+ if (!release.value) {
|
|
|
+ copyPath('发布成功!已复制地址到剪贴板~')
|
|
|
+ } else {
|
|
|
+ window['$message'].success(`已取消发布`)
|
|
|
+ }
|
|
|
+ chartEditStore.setProjectInfo(ProjectInfoEnum.RELEASE, !release.value)
|
|
|
+ } else {
|
|
|
+ httpErrorHandle()
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
const btnList = shallowReactive([
|
|
|
{
|
|
|
- select: true,
|
|
|
- title: '预览',
|
|
|
+ key: 'preview',
|
|
|
+ title: () => '预览',
|
|
|
+ type: () => 'default',
|
|
|
icon: renderIcon(BrowsersOutlineIcon),
|
|
|
- event: previewHandle
|
|
|
+ event: previewHandle,
|
|
|
},
|
|
|
{
|
|
|
- select: true,
|
|
|
- title: '发布',
|
|
|
+ key: 'release',
|
|
|
+ title: () => (release.value ? '已发布' : '发布'),
|
|
|
icon: renderIcon(SendIcon),
|
|
|
- event: sendHandle
|
|
|
- }
|
|
|
+ type: () => (release.value ? 'primary' : 'default'),
|
|
|
+ event: modelShowHandle,
|
|
|
+ },
|
|
|
])
|
|
|
-
|
|
|
</script>
|
|
|
+
|
|
|
<style lang="scss" scoped>
|
|
|
-.align-center {
|
|
|
- margin-top: -4px;
|
|
|
+@include go('system-setting') {
|
|
|
+ @extend .go-background-filter;
|
|
|
+ min-width: 100px;
|
|
|
+ max-width: 60vw;
|
|
|
+ padding-bottom: 20px;
|
|
|
+ @include deep() {
|
|
|
+ .n-list-item:not(:last-child) {
|
|
|
+ border-bottom: 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
</style>
|