Skip to content

Commit ca3ef91

Browse files
committed
feat: Trigger ui
1 parent 3f23ceb commit ca3ef91

4 files changed

Lines changed: 207 additions & 25 deletions

File tree

apps/trigger/serializers/trigger.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,7 +332,7 @@ def insert(self, instance, with_valid=True):
332332
id=trigger_id,
333333
name=instance.get('name'),
334334
workspace_id=self.data.get('workspace_id'),
335-
desc=instance.get('desc'),
335+
desc=instance.get('desc') or '',
336336
trigger_type=instance.get('trigger_type'),
337337
trigger_setting=instance.get('trigger_setting'),
338338
meta=instance.get('meta', {}),
@@ -497,7 +497,7 @@ def get_query_set(self):
497497
if self.data.get("name"):
498498
trigger_query_set = trigger_query_set.filter(name__contains=self.data.get("name"))
499499
if self.data.get("type"):
500-
trigger_query_set = trigger_query_set.filter(type=self.data.get("type"))
500+
trigger_query_set = trigger_query_set.filter(trigger_type=self.data.get("type"))
501501
if self.data.get("is_active") is not None:
502502
trigger_query_set = trigger_query_set.filter(is_active=self.data.get("is_active"))
503503
if self.data.get("task"):

ui/src/api/trigger/trigger.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import type { User, ResetPasswordRequest, CheckCodeRequest } from '@/api/type/us
44
import type { Ref } from 'vue'
55
import type { KeyValue, pageRequest } from '@/api/type/common'
66
import useStore from '@/stores'
7-
import type { triggerData } from '../type/trigger'
7+
import type { TriggerData } from '../type/trigger'
88
const prefix: any = { _value: '/workspace/' }
99
Object.defineProperty(prefix, 'value', {
1010
get: function () {
@@ -46,7 +46,7 @@ const getTriggerDetail: (
4646
* @param loading
4747
* @returns
4848
*/
49-
const postTrigger: (data: triggerData, loading?: Ref<boolean>) => Promise<Result<any>> = (
49+
const postTrigger: (data: TriggerData, loading?: Ref<boolean>) => Promise<Result<any>> = (
5050
data, loading
5151
) => {
5252
return post(`${prefix.value}`, data, undefined,loading)
@@ -59,10 +59,10 @@ const postTrigger: (data: triggerData, loading?: Ref<boolean>) => Promise<Result
5959
* @param loading
6060
* @returns
6161
*/
62-
const putTrigger: (trigger_id: string, data: triggerData, loading?: Ref<boolean>) => Promise<Result<any>> = (
62+
const putTrigger: (trigger_id: string, data: TriggerData, loading?: Ref<boolean>) => Promise<Result<any>> = (
6363
trigger_id,data,loading
6464
) => {
65-
return post(`${prefix.value}/${trigger_id}`, data, undefined,loading)
65+
return put(`${prefix.value}/${trigger_id}`, data, undefined,loading)
6666
}
6767

6868
/**
@@ -74,7 +74,7 @@ const putTrigger: (trigger_id: string, data: triggerData, loading?: Ref<boolean>
7474
const deleteTrigger: (trigger_id: string, loading?: Ref<boolean>) => Promise<Result<any>> = (
7575
trigger_id,loading
7676
) => {
77-
return post(`${prefix.value}/${trigger_id}`, undefined, {},loading)
77+
return del(`${prefix.value}/${trigger_id}`, undefined, {},loading)
7878
}
7979

8080
/**

ui/src/api/type/trigger.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
interface triggerData {
1+
interface TriggerData {
22
id?: string
33
name?: string
44
desc?: string
@@ -8,4 +8,4 @@ interface triggerData {
88
is_active?: boolean
99
}
1010

11-
export type { triggerData }
11+
export type { TriggerData }

ui/src/views/trigger/index.vue

Lines changed: 198 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,81 @@
1616
"
1717
>{{ $t('common.create') }}
1818
</el-button>
19+
<el-button @click="batchChangeState(true)" :disabled="multipleSelection.length === 0"
20+
>{{ $t('view.trigger.activate', '启用') }}
21+
</el-button>
22+
<el-button @click="batchChangeState(false)" :disabled="multipleSelection.length === 0"
23+
>{{ $t('view.trigger.ban', '禁用') }}
24+
</el-button>
25+
<el-button @click="batchDelete" :disabled="multipleSelection.length === 0"
26+
>{{ $t('common.delete') }}
27+
</el-button>
28+
</div>
29+
<div class="flex-between complex-search">
30+
<el-select
31+
class="complex-search__left"
32+
v-model="search_type"
33+
style="width: 120px"
34+
@change="search_type_change"
35+
>
36+
<el-option :label="$t('common.name', '名称')" value="name" />
37+
<el-option :label="$t('view.trigger.type', '类型')" value="type" />
38+
<el-option :label="$t('view.trigger.task', '任务')" value="task" />
39+
<el-option :label="$t('view.trigger.status', '状态')" value="status" />
40+
<el-option :label="$t('view.trigger.createUser', '创建者')" value="create_user" />
41+
</el-select>
42+
<el-input
43+
v-if="search_type === 'name'"
44+
v-model="search_form.name"
45+
@change="searchHandle"
46+
:placeholder="$t('common.searchBar.placeholder')"
47+
style="width: 220px"
48+
clearable
49+
/>
50+
<el-select
51+
v-else-if="search_type === 'type'"
52+
v-model="search_form.type"
53+
@change="searchHandle"
54+
filterable
55+
clearable
56+
style="width: 220px"
57+
>
58+
<el-option :label="$t('view.trigger.scheduled')" value="SCHEDULED" />
59+
<el-option :label="$t('view.trigger.event')" value="unpublished" />
60+
</el-select>
61+
<el-select
62+
v-else-if="search_type === 'create_user'"
63+
v-model="search_form.create_user"
64+
@change="searchHandle"
65+
filterable
66+
clearable
67+
style="width: 220px"
68+
>
69+
<el-option
70+
v-for="u in user_options"
71+
:key="u.id"
72+
:value="u.id"
73+
:label="u.nick_name"
74+
/>
75+
</el-select>
76+
<el-input
77+
v-if="search_type === 'task'"
78+
v-model="search_form.task"
79+
@change="searchHandle"
80+
:placeholder="$t('views.document.tag.requiredMessage3')"
81+
style="width: 220px"
82+
clearable
83+
/>
1984
</div>
2085
</div>
2186
<app-table
2287
ref="multipleTableRef"
23-
class="mt-16 document-table"
88+
class="mt-16"
2489
:data="triggerData"
2590
:pagination-config="paginationConfig"
2691
@sizeChange="handleSizeChange"
2792
@changePage="getList"
93+
@selection-change="handleSelectionChange"
2894
v-loading="loading"
2995
:row-key="(row: any) => row.id"
3096
:maxTableHeight="300"
@@ -33,29 +99,27 @@
3399
<el-table-column
34100
prop="name"
35101
:label="$t('views.trigger.table.name', '名称')"
36-
min-width="280"
102+
min-width="100"
37103
>
38104
</el-table-column>
39105
<el-table-column
40-
prop="desc"
41-
:label="$t('views.trigger.table.desc', '描述')"
42-
min-width="280"
106+
prop="trigger_type"
107+
:label="$t('views.trigger.table.type', '类型')"
108+
min-width="80"
43109
>
44110
</el-table-column>
45111
<el-table-column
46112
prop="is_active"
47113
:label="$t('views.trigger.table.status', '状态')"
48-
min-width="280"
114+
min-width="80"
49115
>
50116
</el-table-column>
51117
<el-table-column
52-
prop="trigger_type"
53-
:label="$t('views.trigger.table.type', '类型')"
54-
align="right"
55-
min-width="90"
118+
prop="desc"
119+
:label="$t('views.trigger.table.desc', '描述')"
120+
min-width="150"
56121
>
57122
</el-table-column>
58-
59123
<el-table-column
60124
prop="update_time"
61125
:label="$t('views.document.table.updateTime')"
@@ -69,7 +133,12 @@
69133
<el-table-column align="left" width="160" fixed="right" :label="$t('common.operation')">
70134
<template #default="{ row }">
71135
<span @click.stop>
72-
<el-switch :loading="loading" size="small" v-model="row.is_active" />
136+
<el-switch
137+
:before-change="() => changeState(row)"
138+
:loading="loading"
139+
size="small"
140+
v-model="row.is_active"
141+
/>
73142
</span>
74143
<el-divider direction="vertical" />
75144
<el-tooltip effect="dark" :content="$t('common.edit')" placement="top">
@@ -81,7 +150,7 @@
81150
</el-tooltip>
82151
<el-tooltip effect="dark" :content="$t('common.delete')" placement="top">
83152
<span class="mr-4">
84-
<el-button type="primary" text>
153+
<el-button type="primary" text @click="deleteTrigger(row)">
85154
<AppIcon iconName="app-delete" class="color-secondary"></AppIcon>
86155
</el-button>
87156
</span>
@@ -98,30 +167,140 @@
98167
import { ref, onMounted, onBeforeUnmount, computed } from 'vue'
99168
import { useRouter, useRoute, onBeforeRouteLeave, onBeforeRouteUpdate } from 'vue-router'
100169
import type { ElTable } from 'element-plus'
101-
import ImportDocumentDialog from './component/ImportDocumentDialog.vue'
102-
import SelectKnowledgeDialog from './component/SelectKnowledgeDialog.vue'
103170
import { MsgSuccess, MsgConfirm, MsgError } from '@/utils/message'
104171
import useStore from '@/stores'
105172
import triggerAPI from '@/api/trigger/trigger'
106173
import { TaskType, State } from '@/utils/status'
107174
import { t } from '@/locales'
108175
import permissionMap from '@/permission'
109176
import { datetimeFormat } from '@/utils/time'
177+
import WorkspaceApi from '@/api/workspace/workspace'
178+
110179
import { loadSharedApi } from '@/utils/dynamics-api/shared-api'
180+
import type { TriggerData } from '@/api/type/trigger'
111181
const route = useRoute()
112182
const router = useRouter()
113183
const {
114184
params: { id, folderId, type }, // id为knowledgeID
115185
} = route as any
116-
const { common } = useStore()
186+
const { user } = useStore()
117187
const loading = ref(false)
118188
const paginationConfig = ref({
119189
current_page: 1,
120190
page_size: 10,
121191
total: 0,
122192
})
123193
194+
const user_options = ref<any[]>([])
195+
const search_type = ref('name')
196+
const search_form = ref<any>({
197+
name: '',
198+
type: '',
199+
task: '',
200+
is_active: '',
201+
create_user: '',
202+
})
203+
204+
const search_type_change = () => {
205+
search_form.value = {
206+
name: '',
207+
type: '',
208+
task: '',
209+
is_active: '',
210+
create_user: '',
211+
}
212+
}
213+
214+
function searchHandle() {
215+
paginationConfig.value.current_page = 1
216+
triggerData.value = []
217+
getList()
218+
}
219+
220+
function deleteTrigger(row: any) {
221+
MsgConfirm(`${t('views.document.delete.confirmTitle3', '是否删除触发器')} ${row.name} ?`, ``, {
222+
confirmButtonText: t('common.confirm'),
223+
confirmButtonClass: 'danger',
224+
}).then(() => {
225+
triggerAPI.deleteTrigger(row.id, loading).then(() => {
226+
MsgSuccess(t('common.deleteSuccess'))
227+
getList()
228+
})
229+
})
230+
}
231+
232+
const handleSelectionChange = (val: any[]) => {
233+
multipleSelection.value = val
234+
}
235+
236+
function batchChangeState(is_active: boolean) {
237+
const idList: string[] = []
238+
multipleSelection.value.map((v) => {
239+
if (v) {
240+
idList.push(v.id)
241+
}
242+
})
243+
triggerAPI.activateMulTrigger({ id_list: idList, is_active: is_active }, loading).then(() => {
244+
const msg: string = is_active
245+
? t('views.trigger.delete.successMessage', '批量启用成功')
246+
: t('views.trigger.delete.successMessage', '批量禁用成功')
247+
MsgSuccess(msg)
248+
multipleTableRef.value?.clearSelection()
249+
getList()
250+
})
251+
}
252+
253+
function batchDelete() {
254+
MsgConfirm(
255+
`${t('views.document.delete.confirmTitle1')} ${multipleSelection.value.length} ${t('views.trigger.delete.confirmTitle2', '个触发器?')}`,
256+
'',
257+
{
258+
confirmButtonText: t('common.confirm'),
259+
confirmButtonClass: 'danger',
260+
},
261+
).then(() => {
262+
const arr: string[] = []
263+
multipleSelection.value.map((v) => {
264+
if (v) {
265+
arr.push(v.id)
266+
}
267+
})
268+
triggerAPI.delMulTrigger(arr, loading).then(() => {
269+
MsgSuccess(t('views.document.delete.successMessage'))
270+
multipleTableRef.value?.clearSelection()
271+
getList()
272+
})
273+
})
274+
}
275+
276+
async function changeState(row: any) {
277+
const obj = {
278+
is_active: !row.is_active,
279+
}
280+
const str = !row.is_active ? t('common.status.enableSuccess') : t('common.status.disableSuccess')
281+
await updateData(row.id, obj, str)
282+
}
283+
284+
/**
285+
* 更新状态/数据
286+
*/
287+
function updateData(triggerId: string, data: TriggerData, msg: string) {
288+
triggerAPI
289+
.putTrigger(triggerId, data, loading)
290+
.then((res: any) => {
291+
const index = triggerData.value.findIndex((v) => v.id === triggerId)
292+
triggerData.value.splice(index, 1, res.data)
293+
MsgSuccess(msg)
294+
return true
295+
})
296+
.catch(() => {
297+
return false
298+
})
299+
}
300+
124301
const multipleSelection = ref<any[]>([])
302+
const multipleTableRef = ref<InstanceType<typeof ElTable>>()
303+
125304
const triggerData = ref<any[]>([])
126305
const elUploadRef = ref()
127306
@@ -142,6 +321,9 @@ function getList(bool?: boolean) {
142321
143322
onMounted(() => {
144323
getList()
324+
WorkspaceApi.getAllMemberList(user.getWorkspaceId(), loading).then((res) => {
325+
user_options.value = res.data
326+
})
145327
})
146328
</script>
147329
<style lang="scss" scoped>

0 commit comments

Comments
 (0)