feat(plugin-schedule): support group dropdown selector for whitelist and single target

This commit is contained in:
liuwei
2026-04-16 15:34:32 +08:00
parent 014985ac4a
commit 184999b175

View File

@@ -87,10 +87,34 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="editForm.target_scope === 'group_whitelist'" label="群ID列表"> <el-form-item v-if="editForm.target_scope === 'group_whitelist'" label="群ID列表">
<el-input v-model="editForm.group_ids_text" placeholder="群ID逗号分隔"></el-input> <el-select
v-model="editForm.selected_group_ids"
multiple
filterable
collapse-tags
placeholder="请选择群(可多选)"
style="width: 100%;">
<el-option
v-for="group in groupOptions"
:key="group.wxid"
:label="group.name"
:value="group.wxid">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item v-if="editForm.target_scope === 'single_group'" label="群ID"> <el-form-item v-if="editForm.target_scope === 'single_group'" label="群ID">
<el-input v-model="editForm.single_group_id"></el-input> <el-select
v-model="editForm.selected_single_group_id"
filterable
placeholder="请选择群"
style="width: 100%;">
<el-option
v-for="group in groupOptions"
:key="group.wxid"
:label="group.name"
:value="group.wxid">
</el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="Payload(JSON)"> <el-form-item label="Payload(JSON)">
<el-input type="textarea" :rows="4" v-model="editForm.payload_text"></el-input> <el-input type="textarea" :rows="4" v-model="editForm.payload_text"></el-input>
@@ -126,6 +150,7 @@ new Vue({
return { return {
loading: false, loading: false,
schedules: [], schedules: [],
groupOptions: [],
editDialogVisible: false, editDialogVisible: false,
logsDialogVisible: false, logsDialogVisible: false,
logs: [], logs: [],
@@ -142,11 +167,14 @@ new Vue({
target_scope: 'all_enabled_groups', target_scope: 'all_enabled_groups',
group_ids_text: '', group_ids_text: '',
single_group_id: '', single_group_id: '',
selected_group_ids: [],
selected_single_group_id: '',
payload_text: '{}' payload_text: '{}'
} }
} }
}, },
mounted() { mounted() {
this.loadGroupOptions()
this.loadSchedules() this.loadSchedules()
}, },
methods: { methods: {
@@ -165,6 +193,20 @@ new Vue({
this.loading = false this.loading = false
} }
}, },
async loadGroupOptions() {
try {
const resp = await axios.get('/contacts/api/groups')
if (resp.data && resp.data.success) {
const groups = (resp.data.data && resp.data.data.groups) || {}
this.groupOptions = Object.entries(groups).map(([wxid, name]) => ({
wxid: String(wxid),
name: String(name || wxid)
}))
}
} catch (e) {
this.groupOptions = []
}
},
openEdit(row) { openEdit(row) {
this.currentId = row.id this.currentId = row.id
const trigger = row.trigger_config || {} const trigger = row.trigger_config || {}
@@ -180,6 +222,8 @@ new Vue({
this.editForm.target_scope = row.target_scope || 'all_enabled_groups' this.editForm.target_scope = row.target_scope || 'all_enabled_groups'
this.editForm.group_ids_text = (target.group_ids || []).join(',') this.editForm.group_ids_text = (target.group_ids || []).join(',')
this.editForm.single_group_id = target.group_id || '' this.editForm.single_group_id = target.group_id || ''
this.editForm.selected_group_ids = Array.isArray(target.group_ids) ? target.group_ids.map(x => String(x)) : []
this.editForm.selected_single_group_id = target.group_id ? String(target.group_id) : ''
this.editForm.payload_text = JSON.stringify(row.payload || {}, null, 2) this.editForm.payload_text = JSON.stringify(row.payload || {}, null, 2)
this.editDialogVisible = true this.editDialogVisible = true
}, },
@@ -199,9 +243,14 @@ new Vue({
}, },
buildTargetConfig() { buildTargetConfig() {
if (this.editForm.target_scope === 'single_group') { if (this.editForm.target_scope === 'single_group') {
return { group_id: String(this.editForm.single_group_id || '').trim() } const groupId = String(this.editForm.selected_single_group_id || this.editForm.single_group_id || '').trim()
return { group_id: groupId }
} }
if (this.editForm.target_scope === 'group_whitelist') { if (this.editForm.target_scope === 'group_whitelist') {
const ids = (this.editForm.selected_group_ids || []).map(x => String(x).trim()).filter(Boolean)
if (ids.length > 0) {
return { group_ids: ids }
}
return { return {
group_ids: String(this.editForm.group_ids_text || '').split(',').map(x => x.trim()).filter(Boolean) group_ids: String(this.editForm.group_ids_text || '').split(',').map(x => x.trim()).filter(Boolean)
} }