98ebb12fa1
- Updated RecentArticle interface to include generation_mode. - Modified workspace_service to map generation_mode from database. - Adjusted domain model for RecentArticle to accommodate generation_mode. - Enhanced SQL queries to retrieve generation_mode from generation_tasks. - Created ArticleActionGroup component for article action buttons. - Implemented ArticleGenerateStatus component to display generation status. - Developed ArticlePublishStatus component to show publish status and related platforms. - Introduced ArticleSourceMeta component to display article source information. - Added utility functions for article actions and clipboard content generation.
206 lines
4.4 KiB
Vue
206 lines
4.4 KiB
Vue
<script setup lang="ts">
|
|
import {
|
|
CopyOutlined,
|
|
DeleteOutlined,
|
|
EditOutlined,
|
|
EyeOutlined,
|
|
SendOutlined,
|
|
} from "@ant-design/icons-vue";
|
|
import { useI18n } from "vue-i18n";
|
|
|
|
const props = withDefaults(defineProps<{
|
|
showPublish?: boolean;
|
|
canPublish?: boolean;
|
|
publishDisabledTitle?: string;
|
|
showEdit?: boolean;
|
|
canEdit?: boolean;
|
|
editDisabledTitle?: string;
|
|
showPreview?: boolean;
|
|
canPreview?: boolean;
|
|
previewDisabledTitle?: string;
|
|
showCopy?: boolean;
|
|
canCopy?: boolean;
|
|
copyDisabledTitle?: string;
|
|
showDelete?: boolean;
|
|
canDelete?: boolean;
|
|
deleteDisabledTitle?: string;
|
|
deleteConfirmTitle?: string;
|
|
deleteLoading?: boolean;
|
|
}>(), {
|
|
showPublish: false,
|
|
canPublish: true,
|
|
publishDisabledTitle: "",
|
|
showEdit: false,
|
|
canEdit: true,
|
|
editDisabledTitle: "",
|
|
showPreview: false,
|
|
canPreview: true,
|
|
previewDisabledTitle: "",
|
|
showCopy: false,
|
|
canCopy: true,
|
|
copyDisabledTitle: "",
|
|
showDelete: true,
|
|
canDelete: true,
|
|
deleteDisabledTitle: "",
|
|
deleteConfirmTitle: "",
|
|
deleteLoading: false,
|
|
});
|
|
|
|
const emit = defineEmits<{
|
|
publish: [];
|
|
edit: [];
|
|
preview: [];
|
|
copy: [];
|
|
delete: [];
|
|
}>();
|
|
|
|
const { t } = useI18n();
|
|
|
|
function resolveTitle(enabled: boolean, enabledTitle: string, disabledTitle?: string): string {
|
|
if (enabled) {
|
|
return enabledTitle;
|
|
}
|
|
return disabledTitle || enabledTitle;
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<div class="table-actions-row">
|
|
<a-tooltip
|
|
v-if="showPublish"
|
|
:title="resolveTitle(canPublish, t('media.publish.title'), publishDisabledTitle)"
|
|
>
|
|
<span>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-publish"
|
|
:disabled="!canPublish"
|
|
@click="emit('publish')"
|
|
>
|
|
<SendOutlined />
|
|
</a-button>
|
|
</span>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip
|
|
v-if="showEdit"
|
|
:title="resolveTitle(canEdit, t('common.edit'), editDisabledTitle)"
|
|
>
|
|
<span>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-edit"
|
|
:disabled="!canEdit"
|
|
@click="emit('edit')"
|
|
>
|
|
<EditOutlined />
|
|
</a-button>
|
|
</span>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip
|
|
v-if="showPreview"
|
|
:title="resolveTitle(canPreview, t('common.preview'), previewDisabledTitle)"
|
|
>
|
|
<span>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-eye"
|
|
:disabled="!canPreview"
|
|
@click="emit('preview')"
|
|
>
|
|
<EyeOutlined />
|
|
</a-button>
|
|
</span>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip
|
|
v-if="showCopy"
|
|
:title="resolveTitle(canCopy, t('common.copy'), copyDisabledTitle)"
|
|
>
|
|
<span>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-copy"
|
|
:disabled="!canCopy"
|
|
@click="emit('copy')"
|
|
>
|
|
<CopyOutlined />
|
|
</a-button>
|
|
</span>
|
|
</a-tooltip>
|
|
|
|
<a-tooltip
|
|
v-if="showDelete && !deleteConfirmTitle"
|
|
:title="resolveTitle(canDelete, t('common.delete'), deleteDisabledTitle)"
|
|
>
|
|
<span>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-delete"
|
|
:disabled="!canDelete"
|
|
:loading="deleteLoading"
|
|
@click="emit('delete')"
|
|
>
|
|
<DeleteOutlined />
|
|
</a-button>
|
|
</span>
|
|
</a-tooltip>
|
|
|
|
<a-popconfirm
|
|
v-else-if="showDelete"
|
|
:title="deleteConfirmTitle"
|
|
:disabled="!canDelete"
|
|
@confirm="emit('delete')"
|
|
>
|
|
<a-button
|
|
type="text"
|
|
shape="circle"
|
|
size="small"
|
|
class="action-btn action-delete"
|
|
:disabled="!canDelete"
|
|
:loading="deleteLoading"
|
|
>
|
|
<DeleteOutlined />
|
|
</a-button>
|
|
</a-popconfirm>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.action-publish.ant-btn:hover:not(:disabled) {
|
|
color: #1677ff;
|
|
background: #e6f4ff;
|
|
}
|
|
|
|
.action-edit.ant-btn:hover:not(:disabled) {
|
|
color: #52c41a;
|
|
background: #f6ffed;
|
|
}
|
|
|
|
.action-eye.ant-btn:hover:not(:disabled) {
|
|
color: #13c2c2;
|
|
background: #e6fffb;
|
|
}
|
|
|
|
.action-copy.ant-btn:hover:not(:disabled) {
|
|
color: #1677ff;
|
|
background: #e6f4ff;
|
|
}
|
|
|
|
.action-delete.ant-btn:hover:not(:disabled) {
|
|
color: #ff4d4f;
|
|
background: #fff2f0;
|
|
}
|
|
</style>
|