From 93e1d58bcb69aad1c7dee99c12b75a7e9a3cb0d3 Mon Sep 17 00:00:00 2001 From: Akkia Date: Wed, 14 Sep 2022 11:32:15 +0800 Subject: [PATCH] =?UTF-8?q?=E5=89=8D=E7=AB=AF=E6=9B=B4=E6=96=B0:=20?= =?UTF-8?q?=E6=94=AF=E6=8C=81=E6=8A=A5=E8=AD=A6=E8=A7=84=E5=88=99=E7=BB=91?= =?UTF-8?q?=E5=AE=9A=E8=A7=A6=E5=8F=91=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/dashboard/controller/member_api.go | 22 +++++++ resource/l10n/zh-CN.toml | 21 +++++++ resource/static/main.js | 63 +++++++++++++++++++ resource/template/component/cron.html | 8 +++ resource/template/component/rule.html | 19 ++++++ resource/template/dashboard-default/cron.html | 4 +- .../dashboard-default/notification.html | 4 ++ 7 files changed, 140 insertions(+), 1 deletion(-) 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 @@ +
+ + +
@@ -21,6 +28,7 @@
diff --git a/resource/template/component/rule.html b/resource/template/component/rule.html index c0f79d8..918931e 100644 --- a/resource/template/component/rule.html +++ b/resource/template/component/rule.html @@ -23,6 +23,25 @@
+
+ + +
+
+ + +
+
diff --git a/resource/template/dashboard-default/cron.html b/resource/template/dashboard-default/cron.html index 67619d5..d136e76 100644 --- a/resource/template/dashboard-default/cron.html +++ b/resource/template/dashboard-default/cron.html @@ -15,6 +15,7 @@ ID {{tr "Name"}} + {{tr "TaskType"}} {{tr "Scheduler"}} {{tr "Command"}} {{tr "NotificationMethodGroup"}} @@ -31,11 +32,12 @@ {{$cron.ID}} {{$cron.Name}} + {{if eq $cron.TaskType 0}}{{tr "CronTask"}}{{else}}{{tr "TriggerTask"}}{{end}} {{$cron.Scheduler}} {{$cron.Command}} {{$cron.NotificationTag}} {{$cron.PushSuccessful}} - {{if eq $cron.Cover 0}}{{tr "IgnoreAll"}}{{else}}{{tr "CoverAll"}}{{end}} + {{if eq $cron.Cover 0}}{{tr "IgnoreAll"}}{{else if eq $cron.Cover 1}}{{tr "CoverAll"}}{{else}}{{tr "ByTrigger"}}{{end}} {{$cron.ServersRaw}} {{$cron.LastExecutedAt|tf}} {{$cron.LastResult}} diff --git a/resource/template/dashboard-default/notification.html b/resource/template/dashboard-default/notification.html index 9c331a2..133aa8e 100644 --- a/resource/template/dashboard-default/notification.html +++ b/resource/template/dashboard-default/notification.html @@ -60,6 +60,8 @@ {{tr "NotificationMethodGroup"}} {{tr "NotificationTriggerMode"}} {{tr "Rules"}} + {{tr "FailTriggerTasks"}} + {{tr "RecoverTriggerTasks"}} {{tr "Enable"}} {{tr "Administration"}} @@ -72,6 +74,8 @@ {{$rule.NotificationTag}} {{if eq $rule.TriggerMode 0}}{{tr "ModeAlwaysTrigger"}}{{else}}{{tr "ModeOnetimeTrigger"}}{{end}} {{$rule.RulesRaw}} + {{$rule.FailTriggerTasksRaw}} + {{$rule.RecoverTriggerTasksRaw}} {{$rule.Enable}}