Files
wecom_it_smart_desk/frontend-h5/src/components/assistant/ApprovalLinks.vue
T

112 lines
3.0 KiB
Vue

<!-- =============================================================================
// 企微IT智能服务台 — H5用户端审批流程链接组件
// =============================================================================
// 说明:展示所有审批流程链接,按分类分组
// 使用 Vant4 CellGroup + Cell 组件
// 点击链接在企微内置浏览器中打开
// ============================================================================= -->
<template>
<div class="approval-links">
<!-- 加载中提示 -->
<div v-if="loading" class="approval-links__loading">
<van-loading size="24px" vertical>加载中...</van-loading>
</div>
<!-- 无数据提示 -->
<div v-else-if="Object.keys(groupedLinks).length === 0" class="approval-links__empty">
<van-empty description="暂无审批流程" image="search" />
</div>
<!-- 按分类展示审批链接 -->
<template v-else>
<div
v-for="(links, category) in groupedLinks"
:key="category"
class="approval-links__group"
>
<!-- 分类标题 -->
<div class="approval-links__category">{{ category }}</div>
<!-- 该分类下的链接列表 -->
<van-cell-group inset>
<van-cell
v-for="link in links"
:key="link.id"
:title="link.title"
:icon="link.icon || 'link-o'"
is-link
@click="openLink(link.url)"
>
<!-- 右侧箭头 -->
<template #right-icon>
<van-icon name="arrow" />
</template>
</van-cell>
</van-cell-group>
</div>
</template>
</div>
</template>
<script setup lang="ts">
/**
* ApprovalLinks 审批流程链接组件
* 从 API 获取审批流程数据,按分类分组展示
* 点击链接在企微内置浏览器中打开
*/
import { computed } from 'vue'
import { useConversationStore } from '@/stores/conversation'
const store = useConversationStore()
/** 加载状态:当审批链接列表为空且未初始化时视为加载中 */
const loading = computed(() => {
return store.approvalLinks.length === 0 && !store.initialized
})
/** 审批链接按分类分组(从 store 计算属性获取) */
const groupedLinks = computed(() => store.approvalLinksByCategory)
/**
* 打开审批流程链接
* 在企微内置浏览器中打开目标链接
* @param url 审批流程链接地址
*/
function openLink(url: string): void {
// 在企微 WebView 中直接使用 window.open 即可在内置浏览器中打开
window.open(url, '_blank')
}
</script>
<style scoped>
/* 审批链接容器 */
.approval-links {
padding: 8px 0;
}
/* 加载中状态 */
.approval-links__loading {
display: flex;
justify-content: center;
padding: 40px 0;
}
/* 空数据状态 */
.approval-links__empty {
padding: 20px 0;
}
/* 分类分组容器 */
.approval-links__group {
margin-bottom: 12px;
}
/* 分类标题 */
.approval-links__category {
font-size: 13px;
color: var(--text-tertiary);
padding: 8px 16px 4px;
font-weight: 500;
}
</style>