Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions ui/src/api/API_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ src/api/
│ │ ├── application/ # 智能体接口
│ │ ├── knowledge/ # 知识库接口
│ │ ├── model/ # 模型接口
│ │ ├── trigger/ # 触发器分页查询接口
│ │ ├── tool/ # 工具、工具工作流及工具商店接口
│ │ └── <resource>.ts # 工作空间公共资源接口
│ └── provider.ts # Workspace 与 System 共用的模型供应商接口
Expand Down
11 changes: 11 additions & 0 deletions ui/src/api/admin/workspace/trigger/trigger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { get } from '../../core/request'
import type { ParamsPage, ResponsePage } from '../../core/types'
import type { Dict, Trigger } from '@/api/types'
import { getWorkspaceId } from '@/utils/resource-context'

/** 获取当前工作空间的触发器分页列表。 */
const getTriggerPage = (page: ParamsPage, query: Dict<unknown> = {}) => {
return get<ResponsePage<Trigger>>(`/workspace/${getWorkspaceId()}/trigger/${page.currentPage}/${page.pageSize}`, query)
}

export default { getTriggerPage }
1 change: 1 addition & 0 deletions ui/src/api/enums/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,4 @@ export * from './model'
export * from './resource-authorization'
export * from './tool'
export * from './knowledge'
export * from './trigger'
5 changes: 5 additions & 0 deletions ui/src/api/enums/trigger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
/** 触发器类型。 */
export const TRIGGER_TYPE = {
SCHEDULED: 'SCHEDULED',
EVENT: 'EVENT',
} as const
1 change: 1 addition & 0 deletions ui/src/api/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,3 +16,4 @@ export type * from './resource-authorization'
export type * from './folder'
export type * from './tool'
export type * from './knowledge'
export type * from './trigger'
23 changes: 23 additions & 0 deletions ui/src/api/types/trigger.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import type { TRIGGER_TYPE } from '@/api/enums'

export type TriggerType = (typeof TRIGGER_TYPE)[keyof typeof TRIGGER_TYPE]

/** 触发器分页列表中的关联任务。 */
export interface TriggerTask {
type: string
name: string | null
icon: string | null
}

/** 触发器分页列表记录。 */
export interface Trigger {
id: string
name: string
desc: string
trigger_type: TriggerType
is_active: boolean
next_run_time: string | null
trigger_task: TriggerTask[]
create_user: string | null
create_time: string
}
2 changes: 1 addition & 1 deletion ui/src/components/COMPONENT_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -859,7 +859,7 @@ const roleSettings = defineModel<{ roleId: string; workspaceIds: string[] }[]>({

`addText` 设置添加按钮文案,`showAddButton` 默认为 `true`;添加入口由业务布局单独提供时传入
`:show-add-button="false"`。`firstRowHasLabel` 默认为 `true`:第一行删除按钮使用 `mt-8`,后续行
使用 `mt-0.5`;并列表单项没有 label 时传入 `:first-row-has-label="false"`。删除成功后通过
使用 `mt-0.5`;并列表单项没有 label 时传入 `:firstRowHasLabel="false"`。删除成功后通过
`remove(item, index)` 返回被删除的行数据和原索引,业务组件可处理关联状态,不需要再次修改列表。

### MkSearchList
Expand Down
12 changes: 7 additions & 5 deletions ui/src/components/business/model-select/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -163,11 +163,13 @@ function openModelParams() {
</slot>
</template>
</el-select>
<div v-if="canEditParams" class="absolute inset-y-px right-3 flex items-center gap-3">
<div v-if="canEditParams" class="absolute inset-y-px right-3 flex items-center gap-2">
<el-divider direction="vertical" />
<el-button link :disabled="disabled || !modelValue" title="模型参数设置" @click.stop="openModelParams">
<MkIcon name="icon_preferences_outlined" />
</el-button>
<el-tooltip content="模型参数设置" placement="top" :disabled="disabled || !modelValue">
<el-button text class="-mr-1" :disabled="disabled || !modelValue" @click.stop="openModelParams">
<MkIcon name="icon_preferences_outlined" />
</el-button>
</el-tooltip>
</div>
</div>
<ModelParamsDialog v-if="canEditParams" ref="modelParamsDialogRef" @submit="emit('update:modelParams', $event)" />
Expand All @@ -177,7 +179,7 @@ function openModelParams() {
/* 参数入口与选择器共用外边框,为原生下拉箭头和清空按钮预留空间。 */
.model-select--with-params {
:deep(.el-select__wrapper) {
padding-right: calc(var(--spacing) * 14);
padding-right: calc(var(--spacing) * 13);
}
}
</style>
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const getData = () => {
max: formValue.value.max,
step: formValue.value.step,
precision: formValue.value.precision,
'show-input-controls': false,
'show-input-controls': true,
'show-input': formValue.value.showInput,
},
props_info: { rules: [{ message: `请输入 ${formValue.value.label}`, trigger: 'blur', required: formValue.value.required }] },
Expand Down Expand Up @@ -114,7 +114,6 @@ onBeforeMount(() => {
<el-slider
v-model="formValue.default_value"
:show-input="formValue.showInput"
:show-input-controls="false"
:max="formValue.max"
:min="formValue.min"
:step="formValue.step === 0 ? 0.1 : formValue.step"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -114,8 +114,8 @@ defineExpose({ getData, render, validate })
<template>
<div class="w-full space-y-4">
<el-radio-group v-model="formData.action">
<el-radio value="show">满足条件时显示</el-radio>
<el-radio value="hide">满足条件时隐藏</el-radio>
<el-radio value="show">显示条件</el-radio>
<el-radio value="hide">隐藏条件</el-radio>
</el-radio-group>

<div class="flex align-center gap-2">
Expand All @@ -129,7 +129,7 @@ defineExpose({ getData, render, validate })

<el-scrollbar>
<div style="max-height: calc(100vh - 400px)">
<MkFormList v-model="conditionRows" :default-item="defaultCondition" :first-row-has-label="false">
<MkFormList v-model="conditionRows" :default-item="defaultCondition" :firstRowHasLabel="false">
<template #default="{ item: condition }">
<ConditionRow :model-value="condition" :left-options="leftOptions" />
</template>
Expand Down
2 changes: 1 addition & 1 deletion ui/src/components/mk-dynamics-form/items/slider/Slider.vue
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,5 @@ defineOptions({ name: 'DynamicFormSlider' })
</script>

<template>
<el-slider v-bind="$attrs" show-input :show-input-controls="false" />
<el-slider v-bind="$attrs" show-input :show-input-controls="true" />
</template>
2 changes: 1 addition & 1 deletion ui/src/components/mk-form-list/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ function removeRow(index: number) {
<template>
<div v-for="(item, index) in formRows" :key="index" class="flex w-full gap-2">
<slot :index="index" :item="item" />
<el-form-item class="shrink-0" :class="firstRowHasLabel ? (index === 0 ? 'mt-8' : 'mt-0.5') : '-mt-4'">
<el-form-item class="shrink-0" :class="firstRowHasLabel ? (index === 0 ? 'mt-8' : 'mt-0.5') : ''">
<el-button :disabled="formRows.length === 1" text @click="removeRow(index)">
<MkIcon name="icon_delete-trash_outlined" class="text-N600" />
</el-button>
Expand Down
2 changes: 2 additions & 0 deletions ui/src/router/ROUTE_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ Workspace 根地址为 `/admin/workspace/:workspaceId`。`workspaceId` 只以当
地址、登录成功和从 System 返回 Workspace 时统一进入 `/admin/workspace/default`。父路由的
`scope` 会合并到匹配的子路由 `meta` 中。

触发器列表地址为 `/admin/workspace/:workspaceId/trigger`,渲染 `views/trigger/TriggerView.vue`

每个业务模块在 `admin/workspace/modules` 中独立维护。模块的列表、创建、详情、编辑等页面应放在同一个路由文件中。

### System
Expand Down
2 changes: 1 addition & 1 deletion ui/src/router/admin/workspace/modules/trigger.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ export const triggerRoutes: RouteRecordRaw[] = [
{
path: 'trigger',
name: 'workspace-trigger',
component: () => import('@/views/home/HomeView.vue'),
component: () => import('@/views/trigger/TriggerView.vue'),
meta: { title: '触发器', icon: 'icon-laser', activeIcon: 'icon_laser_filled', order: 60 },
},
]
1 change: 1 addition & 0 deletions ui/src/views/VIEW_README.md
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,7 @@ Dialog。新增或重命名文件时,应同步更新所有导入和页面功
| `system/settings/email/EmailSettingsView.vue` | 系统邮件 SMTP 服务配置页面 |
| `system/operate-logs/OperateLogListView.vue` | 系统操作日志查询与清理页面 |
| `system/shared-resources/SharedModelview.vue` | System 共享模型查询与模型卡片页面 |
| `trigger/TriggerView.vue` | 工作空间触发器筛选与分页列表 |
| `tool/ToolView.vue` | 工作空间工具目录与工具卡片页面 |

## 备注要求
Expand Down
97 changes: 97 additions & 0 deletions ui/src/views/trigger/TriggerView.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import TriggerApi from '@/api/admin/workspace/trigger/trigger'
import { TRIGGER_TYPE } from '@/api/enums'
import type { Dict, OptionItem, Trigger, TriggerType } from '@/api/types'
import { datetimeFormat } from '@/utils/time'

/* 触发器筛选与分页查询 */
const loading = ref(false)
const triggers = ref<Trigger[]>([])
const paginationConfig = ref({ currentPage: 1, pageSize: 20, total: 0 })
const triggerQuery = ref<Dict<unknown>>({})
const triggerTypeLabels: Record<TriggerType, string> = {
[TRIGGER_TYPE.SCHEDULED]: '定时触发',
[TRIGGER_TYPE.EVENT]: '事件触发',
}
const searchFields: OptionItem<string>[] = [
{ label: '名称', value: 'name' },
{
label: '类型',
value: 'type',
options: Object.entries(triggerTypeLabels).map(([value, label]) => ({ value, label })),
},
{ label: '任务', value: 'task' },
{
label: '状态',
value: 'is_active',
options: [
{ label: '已启用', value: 'true' },
{ label: '已禁用', value: 'false' },
],
},
]

function loadTriggers() {
loading.value = true
return TriggerApi.getTriggerPage(paginationConfig.value, triggerQuery.value)
.then((page) => {
triggers.value = page.records
paginationConfig.value.total = page.total
})
.finally(() => {
loading.value = false
})
}

function handleSearchChange(query?: Dict<unknown>) {
triggerQuery.value = query ?? {}
paginationConfig.value.currentPage = 1
loadTriggers()
}

onMounted(loadTriggers)
</script>

<template>
<MkViewLayout :loading="loading">
<template #default="{ title, Header }">
<component :is="Header">
<h4>{{ title }}</h4>
<MkComplexSearch :fields="searchFields" @change="handleSearchChange" />
</component>
<MkTable
v-model:pagination-config="paginationConfig"
:data="triggers"
row-key="id"
:max-table-height="200"
@current-change="loadTriggers"
@size-change="loadTriggers"
>
<el-table-column prop="name" label="名称" min-width="220" show-overflow-tooltip />
<el-table-column prop="trigger_type" label="类型" width="120">
<template #default="{ row }">{{ triggerTypeLabels[row.trigger_type as TriggerType] || row.trigger_type }}</template>
</el-table-column>
<el-table-column prop="is_active" label="状态" width="120">
<template #default="{ row }"><MkStatusLabel :active="row.is_active" /></template>
</el-table-column>
<el-table-column prop="desc" label="描述" min-width="170" show-overflow-tooltip />
<el-table-column prop="next_run_time" label="下次执行时间" width="180">
<template #default="{ row }">{{ datetimeFormat(row.next_run_time) || '-' }}</template>
</el-table-column>
<el-table-column label="任务" min-width="180" show-overflow-tooltip>
<template #default="{ row }">{{
row.trigger_task
.map((task: Trigger['trigger_task'][number]) => task.name)
.filter(Boolean)
.join('、') || '-'
}}</template>
</el-table-column>
<el-table-column prop="create_user" label="创建者" width="130" show-overflow-tooltip />
<el-table-column prop="create_time" label="创建时间" width="180">
<template #default="{ row }">{{ datetimeFormat(row.create_time) }}</template>
</el-table-column>
</MkTable>
</template>
</MkViewLayout>
</template>
2 changes: 1 addition & 1 deletion ui/src/views/workflow/components/WorkflowViewLayout.vue
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ defineSlots<{
<span v-if="saveTime" class="shrink-0 text-sm text-N600"> 保存于 {{ datetimeFormat(saveTime) }} </span>
</div>

<div class="flex shrink-0 items-center gap-3">
<div class="flex shrink-0 items-center">
<slot name="actions" />
</div>
</header>
Expand Down
4 changes: 2 additions & 2 deletions ui/src/workflow-canvas/config/locale.ts
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@
// 'workflow.nodes.textToSpeechNode.text',
// 'workflow.nodes.textToSpeechNode.label',
// ],
// [toolNode, 'workflow.nodes.toolNode.text', 'workflow.nodes.toolNode.label'],
// [toolCustomNode, 'workflow.nodes.toolNode.text', 'workflow.nodes.toolNode.label'],
// [intentNode, 'workflow.nodes.intentNode.text', 'workflow.nodes.intentNode.label'],
// [loopNode, 'workflow.nodes.loopNode.text', 'workflow.nodes.loopNode.label'],
// [
Expand Down Expand Up @@ -272,7 +272,7 @@
// ],
// [speechToTextNode.properties.config.fields, ['common.result']],
// [textToSpeechNode.properties.config.fields, ['common.result']],
// [toolNode.properties.config.fields, ['common.result']],
// [toolCustomNode.properties.config.fields, ['common.result']],
// [intentNode.properties.config.fields, ['common.classify', 'common.reason']],
// [imageToVideoNode.properties.config.fields, ['common.fileUpload.video']],
// [textToVideoNode.properties.config.fields, ['common.fileUpload.video']],
Expand Down
Loading
Loading