import type { TableColumnType } from 'antdv-next'; import type { MessageSubscriptionModalExposed } from './components/MessageSubscriptionModal'; import type { QqbotMessagePushApi } from '#/api/qqbot/message-push'; import type { KtTableApi, KtTableButton, KtTableContext, KtTableRowAction, } from '#/components/ktTable'; import { defineComponent, onMounted, ref } from 'vue'; import { useAccess } from '@vben/access'; import { Page } from '@vben/common-ui'; import { Plus } from '@vben/icons'; import { Tag } from 'antdv-next'; import { deleteMessageSubscription, getMessagePushSources, getMessageSubscriptionList, getStunMappingPortChangedOptions, setMessageSubscriptionEnabled, } from '#/api/qqbot/message-push'; import { KtTable, useKtTable } from '#/components/ktTable'; import MessageSubscriptionModal from './components/MessageSubscriptionModal'; const AKtTable = KtTable as any; export default defineComponent({ name: 'QqBotMessageSubscriptionList', setup() { const { hasAccessByCodes } = useAccess(); const canList = hasAccessByCodes(['QqBot:MessageSubscription:List']); const modalRef = ref(); const sources = ref( [], ); const stunOptions = ref(); const columns: Array< TableColumnType > = [ { dataIndex: 'name', key: 'name', title: '订阅名称', width: 180, }, { key: 'source', title: '消息源', width: 260, }, { dataIndex: 'sourceSummary', key: 'sourceSummary', title: '来源摘要', width: 260, }, { dataIndex: 'enabled', key: 'enabled', title: '状态', width: 90, }, { dataIndex: 'remark', key: 'remark', title: '备注', width: 220, }, { dataIndex: 'updateTime', key: 'updateTime', title: '更新时间', width: 180, }, ]; const api: KtTableApi = { list: async (params) => await getMessageSubscriptionList(params), }; const buttons: Array< KtTableButton > = [ { icon: , key: 'create', label: '新建订阅', onClick: openCreate, permissionCodes: ['QqBot:MessageSubscription:Create'], type: 'primary', }, ]; const rowActions: Array< KtTableRowAction > = [ { key: 'edit', label: '编辑', onClick: openEdit, permissionCodes: ['QqBot:MessageSubscription:Update'], }, { key: 'toggle', label: '启停', onClick: handleToggle, permissionCodes: ['QqBot:MessageSubscription:Toggle'], }, { confirm: getDeleteConfirm, danger: true, key: 'delete', label: '删除', onClick: handleDelete, permissionCodes: ['QqBot:MessageSubscription:Delete'], }, ]; const [registerTable, tableApi] = useKtTable({ api, buttons, columns, formOptions: { schema: [ { component: 'Input', componentProps: { allowClear: true }, fieldName: 'name', label: '订阅名称', }, { component: 'Select', componentProps: () => ({ allowClear: true, options: sources.value.map((source) => ({ label: source.displayName, value: source.sourceKey, })), }), fieldName: 'sourceKey', label: '消息源', }, { component: 'Select', componentProps: { allowClear: true, options: [ { label: '启用', value: true }, { label: '停用', value: false }, ], }, fieldName: 'enabled', label: '启用状态', }, ], }, immediate: false, rowActions, rowActionVisibleCount: 3, rowKey: 'id', tableTitle: '消息订阅', }); function openCreate() { modalRef.value?.openCreate(); } function openEdit(row: QqbotMessagePushApi.MessageSubscriptionView) { modalRef.value?.openEdit(row); } function getDeleteConfirm( row: QqbotMessagePushApi.MessageSubscriptionView, ) { return `确认删除消息订阅「${row.name}」吗?`; } async function handleToggle( row: QqbotMessagePushApi.MessageSubscriptionView, context: KtTableContext, ) { await setMessageSubscriptionEnabled(row.id, !row.enabled); await context.reload(); } async function handleDelete( row: QqbotMessagePushApi.MessageSubscriptionView, context: KtTableContext, ) { await deleteMessageSubscription(row.id); await context.reload(); } async function handleModalSaved() { await tableApi.reload(); } async function loadMetadata() { const [nextSources, nextStunOptions] = await Promise.all([ getMessagePushSources(), getStunMappingPortChangedOptions(), ]); sources.value = nextSources; stunOptions.value = nextStunOptions; } async function activatePage() { if (!canList) return; await Promise.all([tableApi.reload(), loadMetadata()]); } function renderBodyCell(slot: { column: TableColumnType; record: QqbotMessagePushApi.MessageSubscriptionView; }) { const { column, record } = slot; if (column.key === 'source') { return `${record.sourceName} · ${record.sourceKey}`; } if (column.key === 'enabled') { return ( {record.enabled ? '启用' : '停用'} ); } if (column.key === 'remark') { return record.remark || '-'; } return undefined; } onMounted(activatePage); return () => ( {canList ? ( <> ) : null} ); }, });