Commit 198ddea0 by lijiabin

【需求 20331】feat: 完善prompt相关组件

parent e3e33645
...@@ -33,9 +33,9 @@ export interface CaseDetailDto { ...@@ -33,9 +33,9 @@ export interface CaseDetailDto {
depIdList: number[] depIdList: number[]
depNameList: string[] depNameList: string[]
isSync: BooleanFlag isSync: BooleanFlag
cultureKeywordMain: string cultureKeywordMain: { id: string; title: string }[]
cultureKeywordSub: string[] cultureKeywordSecond: { id: string; title: string }[]
sceneKeywordMain: string sceneKeywordMain: { id: string; title: string }[]
sceneKeywordSub: string[] sceneKeywordSecond: { id: string; title: string }[]
isAudit: AuditStatusEnum isAudit: AuditStatusEnum
} }
...@@ -9,25 +9,24 @@ ...@@ -9,25 +9,24 @@
</el-dropdown> </el-dropdown>
</template> </template>
<script setup lang="ts"> <script setup lang="tsx">
import { addComplaint } from '@/api' import { addComplaint } from '@/api'
import type { ArticleItemDto } from '@/api/article/types' import type { ArticleItemDto } from '@/api/article/types'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const { articleDetail } = defineProps<{ const { articleDetail } = defineProps<{
articleDetail: ArticleItemDto articleDetail: ArticleItemDto
}>() }>()
const handleMore = async (command: string) => { const handleMore = async (command: string) => {
if (command === '举报') { if (command === '举报') {
const { value } = await ElMessageBox.prompt('请输入举报原因', '提示', { const reason = await prompt({
confirmButtonText: '确定', title: '请输入要举报原因',
cancelButtonText: '取消', type: 'warning',
inputPattern: /^\S+$/,
inputPlaceholder: '请输入举报原因',
inputErrorMessage: '举报原因不能为空',
}) })
addComplaint({ articleId: articleDetail.id, reason: value }) addComplaint({ articleId: articleDetail.id, reason })
push.success('举报成功') push.success('举报成功')
} }
} }
......
<template> <template>
<div <div
ref="commentRef" ref="commentRef"
class="bg-white backdrop-blur-sm rounded-lg shadow-sm border border-white/50 overflow-hidden" class="bg-white rounded-lg shadow-sm border border-white/50 overflow-hidden"
> >
<!-- 评论筛选 --> <!-- 评论筛选 -->
<div class="p-4 border-b border-gray-100"> <div class="p-4 border-b border-gray-100">
......
import MessageBox from '@/components/common/MessageBox/index.vue' import MessageBox from '@/components/common/MessageBox/index.vue'
import type { MessageBoxProps } from '@/components/common/MessageBox/types' import type { MessageBoxProps } from '@/components/common/MessageBox/types'
import type { FormInstance } from 'element-plus'
import { render, effect } from 'vue' import { render, effect } from 'vue'
interface ConfirmProps extends MessageBoxProps { interface ConfirmProps extends MessageBoxProps {
useLoading?: boolean // 是否用到loading useLoading?: boolean // 是否用到loading
} }
interface PromptProps extends MessageBoxProps {
inputPattern?: RegExp // 输入框的正则
inputErrorMessage?: string // 输入框的错误信息
}
export const useMessageBox = () => { export const useMessageBox = () => {
const confirm = (props: ConfirmProps) => { const confirm = (props: ConfirmProps) => {
...@@ -53,5 +58,71 @@ export const useMessageBox = () => { ...@@ -53,5 +58,71 @@ export const useMessageBox = () => {
}) })
} }
return { confirm } const prompt = <T extends string | number = string>(props: PromptProps): Promise<T> => {
return new Promise((resolve, reject) => {
const visible = ref(false)
const loading = ref(false)
const rules = {
inputValue: [
{
required: true,
message: '内容不能为空',
trigger: 'blur',
},
{
pattern: props.inputPattern,
message: props.inputErrorMessage ?? '请输入正确的内容',
trigger: 'blur',
},
],
}
const validate = async () => {
await formRef.value?.validate()
return form.value.inputValue
}
const formRef = ref<FormInstance | null>(null)
const form = ref<{ inputValue: T }>({ inputValue: '' as T })
const messageFC = () => (
<div>
<el-form ref={formRef} rules={rules} model={form.value}>
<el-form-item prop="inputValue">
<el-input v-model={form.value.inputValue} />
</el-form-item>
</el-form>
</div>
)
const onConfirm = (val: T) => {
resolve(val)
}
const onCancel = () => {
reject(false)
}
const onClose = () => {
reject(false)
}
effect(() => {
render(
<MessageBox
{...props}
v-model={visible.value}
validate={validate}
message={messageFC}
loading={loading.value}
onConfirm={(res: string | number | undefined) => onConfirm(res as T)}
onCancel={onCancel}
onClose={onClose}
/>,
document.body,
)
})
visible.value = true
})
}
return { confirm, prompt }
} }
...@@ -32,6 +32,9 @@ import { getArticleDetail, auditArticle } from '@/api' ...@@ -32,6 +32,9 @@ import { getArticleDetail, auditArticle } from '@/api'
import { AuditStatusEnum } from '@/constants/enums' import { AuditStatusEnum } from '@/constants/enums'
import type { AuditArticleDto } from '@/api' import type { AuditArticleDto } from '@/api'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const route = useRoute() const route = useRoute()
const router = useRouter() const router = useRouter()
const id = route.params.id as string const id = route.params.id as string
...@@ -45,14 +48,12 @@ const handleAudit = async (auditStatus: AuditStatusEnum) => { ...@@ -45,14 +48,12 @@ const handleAudit = async (auditStatus: AuditStatusEnum) => {
auditResult: auditStatus, auditResult: auditStatus,
} }
if (auditStatus === AuditStatusEnum.REJECTED) { if (auditStatus === AuditStatusEnum.REJECTED) {
const { value } = await ElMessageBox.prompt('请输入拒绝理由', '提示', { const reason = await prompt({
confirmButtonText: '确定', type: 'warning',
cancelButtonText: '取消', title: '请输入拒绝理由',
inputPattern: /^\S+$/,
inputErrorMessage: '请输入拒绝理由',
}) })
auditData.auditRemark = value auditData.auditRemark = reason
} }
await auditArticle(auditData) await auditArticle(auditData)
push.success('审核成功') push.success('审核成功')
......
...@@ -9,6 +9,9 @@ import dayjs from 'dayjs' ...@@ -9,6 +9,9 @@ import dayjs from 'dayjs'
import { ArticleTypeEnum, BooleanFlag } from '@/constants' import { ArticleTypeEnum, BooleanFlag } from '@/constants'
import type { ArticleItemDto } from '@/api/article/types' import type { ArticleItemDto } from '@/api/article/types'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getArticleList, { usePageSearch(getArticleList, {
defaultParams: { defaultParams: {
...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) => ...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) =>
// 编辑排序 // 编辑排序
const handleEditSort = async (row: ArticleItemDto) => { const handleEditSort = async (row: ArticleItemDto) => {
const { value } = await ElMessageBox.prompt('请输入排序值', '提示', { const value = await prompt({
confirmButtonText: '确定', title: '请输入排序值',
cancelButtonText: '取消', type: 'primary',
// 数字
inputPattern: /^\d+$/, inputPattern: /^\d+$/,
inputErrorMessage: '请输入数字', inputErrorMessage: '请输入数字',
}) })
......
...@@ -9,6 +9,9 @@ import dayjs from 'dayjs' ...@@ -9,6 +9,9 @@ import dayjs from 'dayjs'
import { ArticleTypeEnum, BooleanFlag } from '@/constants' import { ArticleTypeEnum, BooleanFlag } from '@/constants'
import type { ArticleItemDto } from '@/api/article/types' import type { ArticleItemDto } from '@/api/article/types'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getArticleList, { usePageSearch(getArticleList, {
defaultParams: { defaultParams: {
...@@ -50,13 +53,13 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) => ...@@ -50,13 +53,13 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) =>
// 编辑排序 // 编辑排序
const handleEditSort = async (row: ArticleItemDto) => { const handleEditSort = async (row: ArticleItemDto) => {
const { value } = await ElMessageBox.prompt('请输入排序值', '提示', { const value = await prompt({
confirmButtonText: '确定', title: '请输入排序值',
cancelButtonText: '取消', type: 'primary',
// 数字
inputPattern: /^\d+$/, inputPattern: /^\d+$/,
inputErrorMessage: '请输入数字', inputErrorMessage: '请输入数字',
}) })
await updateArticleRecommendAndSort({ await updateArticleRecommendAndSort({
articleId: row.id, articleId: row.id,
recommendSort: Number(value), recommendSort: Number(value),
......
...@@ -9,6 +9,9 @@ import dayjs from 'dayjs' ...@@ -9,6 +9,9 @@ import dayjs from 'dayjs'
import { ArticleTypeEnum, BooleanFlag } from '@/constants' import { ArticleTypeEnum, BooleanFlag } from '@/constants'
import type { ArticleItemDto } from '@/api/article/types' import type { ArticleItemDto } from '@/api/article/types'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getArticleList, { usePageSearch(getArticleList, {
defaultParams: { defaultParams: {
...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) => ...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) =>
// 编辑排序 // 编辑排序
const handleEditSort = async (row: ArticleItemDto) => { const handleEditSort = async (row: ArticleItemDto) => {
const { value } = await ElMessageBox.prompt('请输入排序值', '提示', { const value = await prompt({
confirmButtonText: '确定', title: '请输入排序值',
cancelButtonText: '取消', type: 'primary',
// 数字
inputPattern: /^\d+$/, inputPattern: /^\d+$/,
inputErrorMessage: '请输入数字', inputErrorMessage: '请输入数字',
}) })
......
...@@ -9,6 +9,9 @@ import dayjs from 'dayjs' ...@@ -9,6 +9,9 @@ import dayjs from 'dayjs'
import { ArticleTypeEnum, BooleanFlag } from '@/constants' import { ArticleTypeEnum, BooleanFlag } from '@/constants'
import type { ArticleItemDto } from '@/api/article/types' import type { ArticleItemDto } from '@/api/article/types'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getArticleList, { usePageSearch(getArticleList, {
defaultParams: { defaultParams: {
...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) => ...@@ -50,10 +53,9 @@ const handleIsRecommendChange = async (val: BooleanFlag, row: ArticleItemDto) =>
// 编辑排序 // 编辑排序
const handleEditSort = async (row: ArticleItemDto) => { const handleEditSort = async (row: ArticleItemDto) => {
const { value } = await ElMessageBox.prompt('请输入排序值', '提示', { const value = await prompt({
confirmButtonText: '确定', title: '请输入排序值',
cancelButtonText: '取消', type: 'primary',
// 数字
inputPattern: /^\d+$/, inputPattern: /^\d+$/,
inputErrorMessage: '请输入数字', inputErrorMessage: '请输入数字',
}) })
......
...@@ -177,7 +177,7 @@ import type { ExportColumn } from '@/utils' ...@@ -177,7 +177,7 @@ import type { ExportColumn } from '@/utils'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks' import { useMessageBox } from '@/hooks'
const { confirm } = useMessageBox() const { confirm, prompt } = useMessageBox()
const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } = const { loading, list, total, reset, goToPage, changePageSize, refresh, searchParams, search } =
usePageSearch(getBackendExchangeList, { usePageSearch(getBackendExchangeList, {
defaultParams: {}, defaultParams: {},
...@@ -286,13 +286,13 @@ const handleCancelIssue = async (row: BackendColumnListItemDto) => { ...@@ -286,13 +286,13 @@ const handleCancelIssue = async (row: BackendColumnListItemDto) => {
// 发放 // 发放
const handleIssue = async (row: BackendColumnListItemDto) => { const handleIssue = async (row: BackendColumnListItemDto) => {
// 弹出message输入框 填写发放备注 // 弹出message输入框 填写发放备注
const memo = await ElMessageBox.prompt('请输入发放备注', '提示', { const memo = await prompt({
confirmButtonText: '确定', title: '请输入发放备注',
cancelButtonText: '取消', type: 'primary',
}) })
await issueProduct({ await issueProduct({
id: row.id, id: row.id,
memo: memo.value, memo,
status: 1, status: 1,
}) })
push.success('发放成功') push.success('发放成功')
......
...@@ -128,6 +128,9 @@ import type { AuditComplaintDto } from '@/api' ...@@ -128,6 +128,9 @@ import type { AuditComplaintDto } from '@/api'
import type { TabPaneName } from 'element-plus' import type { TabPaneName } from 'element-plus'
import { useNavigation } from '@/hooks' import { useNavigation } from '@/hooks'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const toggleTab = (key: TabPaneName) => { const toggleTab = (key: TabPaneName) => {
searchParams.value.status = key as AuditStatusEnum searchParams.value.status = key as AuditStatusEnum
refresh() refresh()
...@@ -145,14 +148,12 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize } ...@@ -145,14 +148,12 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize }
const { jumpToArticleDetailPage } = useNavigation() const { jumpToArticleDetailPage } = useNavigation()
const handleAudit = async (data: AuditComplaintDto) => { const handleAudit = async (data: AuditComplaintDto) => {
if (data.status === AuditStatusEnum.REJECTED) { if (data.status === AuditStatusEnum.REJECTED) {
const { value } = await ElMessageBox.prompt('请输入拒绝理由', '提示', { const reason = await prompt({
confirmButtonText: '确定', title: '请输入拒绝理由',
cancelButtonText: '取消', type: 'warning',
inputPattern: /^\S+$/,
inputErrorMessage: '请输入拒绝理由',
}) })
data.remark = value data.remark = reason
} }
await auditComplaint(data) await auditComplaint(data)
......
...@@ -139,7 +139,9 @@ import type { AuditArticleDto } from '@/api' ...@@ -139,7 +139,9 @@ import type { AuditArticleDto } from '@/api'
import type { TabPaneName } from 'element-plus' import type { TabPaneName } from 'element-plus'
import dayjs from 'dayjs' import dayjs from 'dayjs'
import { push } from 'notivue' import { push } from 'notivue'
import { useMessageBox } from '@/hooks'
const { prompt } = useMessageBox()
const router = useRouter() const router = useRouter()
const { jumpToArticleDetailPage } = useNavigation() const { jumpToArticleDetailPage } = useNavigation()
const toggleTab = (key: TabPaneName) => { const toggleTab = (key: TabPaneName) => {
...@@ -177,14 +179,14 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize } ...@@ -177,14 +179,14 @@ const { list, loading, searchParams, total, refresh, goToPage, changePageSize }
const handleAudit = async (data: AuditArticleDto) => { const handleAudit = async (data: AuditArticleDto) => {
if (data.auditResult === AuditStatusEnum.REJECTED) { if (data.auditResult === AuditStatusEnum.REJECTED) {
const { value } = await ElMessageBox.prompt('请输入拒绝理由', '提示', { const reason = await prompt({
confirmButtonText: '确定', title: '请输入拒绝理由',
cancelButtonText: '取消', type: 'warning',
inputPattern: /^\S+$/, inputPattern: /^\S+$/,
inputErrorMessage: '请输入拒绝理由', inputErrorMessage: '请输入拒绝理由',
}) })
data.auditRemark = value data.auditRemark = reason
} }
await auditArticle(data) await auditArticle(data)
......
...@@ -153,13 +153,12 @@ const showDelBtn = (item: SelfCaseItemDto) => { ...@@ -153,13 +153,12 @@ const showDelBtn = (item: SelfCaseItemDto) => {
const handleView = async (item: SelfCaseItemDto) => { const handleView = async (item: SelfCaseItemDto) => {
// 根据 id获取详情数据 // 根据 id获取详情数据
const { data } = await getCaseDetail(item.id) const { data } = await getCaseDetail(item.id)
console.log(data)
// 打开弹窗 查看详情 // 打开弹窗 查看详情
const formData = { const formData = {
title: data.title, title: data.title,
content: data.content, content: data.content,
keywords: [data.cultureKeywordMain, ...(data.cultureKeywordSub || [])].filter(Boolean), keywords: [...data.cultureKeywordMain, ...data.cultureKeywordSecond],
scenes: [data.sceneKeywordMain, ...(data.sceneKeywordSub || [])].filter(Boolean), scenes: [...data.sceneKeywordMain, ...data.sceneKeywordSecond],
departments: data.depNameList.filter(Boolean), departments: data.depNameList.filter(Boolean),
syncPublish: data.isSync ? '是' : '否', syncPublish: data.isSync ? '是' : '否',
} }
...@@ -195,9 +194,9 @@ const handleView = async (item: SelfCaseItemDto) => { ...@@ -195,9 +194,9 @@ const handleView = async (item: SelfCaseItemDto) => {
文化关键词 文化关键词
</div> </div>
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
{formData.keywords.map((keyword, index) => ( {formData.keywords.map((item, index) => (
<span key={index} class="px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px"> <span key={index} class="px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px">
{keyword} {item.title}
</span> </span>
))} ))}
</div> </div>
...@@ -208,9 +207,9 @@ const handleView = async (item: SelfCaseItemDto) => { ...@@ -208,9 +207,9 @@ const handleView = async (item: SelfCaseItemDto) => {
<div class="text-13px text-gray-500 mb-2">关联场景</div> <div class="text-13px text-gray-500 mb-2">关联场景</div>
{formData.scenes.length > 0 ? ( {formData.scenes.length > 0 ? (
<div class="flex flex-wrap gap-2"> <div class="flex flex-wrap gap-2">
{formData.scenes.map((scene, index) => ( {formData.scenes.map((item, index) => (
<span key={index} class="px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px"> <span key={index} class="px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px">
{scene} {item.title}
</span> </span>
))} ))}
</div> </div>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment