diff --git a/cmd/dashboard/controller/member_api.go b/cmd/dashboard/controller/member_api.go index 2d6a24f..fedf50f 100644 --- a/cmd/dashboard/controller/member_api.go +++ b/cmd/dashboard/controller/member_api.go @@ -33,6 +33,7 @@ func (ma *memberAPI) serve() { })) mr.GET("/search-server", ma.searchServer) + mr.GET("/search-tasks", ma.searchTask) mr.POST("/server", ma.addOrEditServer) mr.POST("/monitor", ma.addOrEditMonitor) mr.POST("/cron", ma.addOrEditCron) @@ -275,6 +276,27 @@ func (ma *memberAPI) searchServer(c *gin.Context) { }) } +func (ma *memberAPI) searchTask(c *gin.Context) { + var tasks []model.Cron + likeWord := "%" + c.Query("word") + "%" + singleton.DB.Select("id,name").Where("id = ? OR name LIKE ?", + c.Query("word"), likeWord).Find(&tasks) + + var resp []searchResult + for i := 0; i < len(tasks); i++ { + resp = append(resp, searchResult{ + Value: tasks[i].ID, + Name: tasks[i].Name, + Text: tasks[i].Name, + }) + } + + c.JSON(http.StatusOK, map[string]interface{}{ + "success": true, + "results": resp, + }) +} + type serverForm struct { ID uint64 Name string `binding:"required"` diff --git a/resource/l10n/zh-CN.toml b/resource/l10n/zh-CN.toml index ce842f0..4da8ff1 100644 --- a/resource/l10n/zh-CN.toml +++ b/resource/l10n/zh-CN.toml @@ -70,6 +70,9 @@ other = "忽略所有,仅通过特定服务器执行" [AllIncludedOnlySpecificServersAreNotExecuted] other = "覆盖所有,仅特定服务器不执行" +[ExecuteByTriggerServer] +other = "由触发的服务器执行" + [SpecificServers] other = "特定服务器" @@ -82,6 +85,15 @@ other = "通知方式组" [PushSuccessMessages] other = "推送成功的消息" +[TaskType] +other = "任务类型" + +[CronTask] +other = "计划任务" + +[TriggerTask] +other = "触发任务" + [TheFormaOfTheScheduleIs] other = "计划的格式为:" @@ -157,6 +169,12 @@ other = "始终触发" [ModeOnetimeTrigger] other = "单次触发" +[FailTriggerTasks] +other = "故障时触发任务" + +[RecoverTriggerTasks] +other = "恢复时触发任务" + [Enable] other = "启用" @@ -205,6 +223,9 @@ other = "覆盖所有" [IgnoreAll] other = "忽略所有" +[ByTrigger] +other = "触发执行" + [DeleteScheduledTask] other = "删除计划任务" diff --git a/resource/static/main.js b/resource/static/main.js index 557866c..bc15d25 100644 --- a/resource/static/main.js +++ b/resource/static/main.js @@ -70,6 +70,7 @@ function showFormModal(modelSelector, formID, URL, getData) { item.name === "RequestType" || item.name === "RequestMethod" || item.name === "TriggerMode" || + item.name === "TaskType" || item.name === "DisplayIndex" || item.name === "Type" || item.name === "Cover" || @@ -90,6 +91,16 @@ function showFormModal(modelSelector, formID, URL, getData) { } } + if (item.name.endsWith("TasksRaw")) { + if (item.value.length > 2) { + obj[item.name] = JSON.stringify( + [...item.value.matchAll(/\d+/gm)].map((k) => + parseInt(k[0]) + ) + ); + } + } + return obj; }, {}); $.post(URL, JSON.stringify(data)) @@ -138,6 +149,44 @@ function addOrEditAlertRule(rule) { } else { modal.find(".ui.rule-enable.checkbox").checkbox("set unchecked"); } + modal.find("a.ui.label.visible").each((i, el) => { + el.remove(); + }); + var failTriggerTasks; + var recoverTriggerTasks; + if (rule) { + failTriggerTasks = rule.FailTriggerTasksRaw; + recoverTriggerTasks = rule.RecoverTriggerTasksRaw; + const failTriggerTasksList = JSON.parse(failTriggerTasks || "[]"); + const recoverTriggerTasksList = JSON.parse(recoverTriggerTasks || "[]"); + const node1 = modal.find("i.dropdown.icon.1"); + const node2 = modal.find("i.dropdown.icon.2"); + for (let i = 0; i < failTriggerTasksList.length; i++) { + node1.after( + 'ID:' + + failTriggerTasksList[i] + + '' + ); + } + for (let i = 0; i < recoverTriggerTasksList.length; i++) { + node2.after( + 'ID:' + + recoverTriggerTasksList[i] + + '' + ); + } + } + modal + .find("input[name=FailTriggerTasksRaw]") + .val(rule ? "[]," + failTriggerTasks.substr(1, failTriggerTasks.length - 2) : "[]"); + modal + .find("input[name=RecoverTriggerTasksRaw]") + .val(rule ? "[]," + recoverTriggerTasks.substr(1, recoverTriggerTasks.length - 2) : "[]"); + showFormModal(".rule.modal", "#ruleForm", "/api/alert-rule"); } @@ -298,6 +347,8 @@ function addOrEditCron(cron) { ); modal.find("input[name=ID]").val(cron ? cron.ID : null); modal.find("input[name=Name]").val(cron ? cron.Name : null); + modal.find("select[name=TaskType]").val(cron ? cron.TaskType : 0); + modal.find("select[name=Cover]").val(cron ? cron.Cover : 0); modal.find("input[name=NotificationTag]").val(cron ? cron.NotificationTag : null); modal.find("input[name=Scheduler]").val(cron ? cron.Scheduler : null); modal.find("a.ui.label.visible").each((i, el) => { @@ -435,3 +486,15 @@ $(document).ready(() => { }); } catch (error) { } }); + +$(document).ready(() => { + try { + $(".ui.tasks.search.dropdown").dropdown({ + clearable: true, + apiSettings: { + url: "/api/search-tasks?word={query}", + cache: false, + }, + }); + } catch (error) { } +}); diff --git a/resource/template/component/cron.html b/resource/template/component/cron.html index 79cd0c6..1ac3463 100644 --- a/resource/template/component/cron.html +++ b/resource/template/component/cron.html @@ -8,6 +8,13 @@ +