From 85fa1688a714756de6fa9142e4b24dfe95ee1563 Mon Sep 17 00:00:00 2001 From: Jiahao Li Date: Wed, 20 Mar 2019 23:05:55 -0400 Subject: [PATCH 1/3] Skips auth in SMTP notifier if creds are blank --- notifiers/email.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/notifiers/email.go b/notifiers/email.go index f3544157..d66dee7b 100644 --- a/notifiers/email.go +++ b/notifiers/email.go @@ -230,10 +230,12 @@ func (u *email) OnTest() error { if err != nil { return err } - auth := smtp.PlainAuth("", u.Username, u.Password, host) - err = dial.Auth(auth) - if err != nil { - return err + if u.Username != "" || u.Password != "" { + auth := smtp.PlainAuth("", u.Username, u.Password, host) + err = dial.Auth(auth) + if err != nil { + return err + } } testService := &types.Service{ Id: 1, From bc50771d8a0efaab7b8a419fe2341054100ce9d1 Mon Sep 17 00:00:00 2001 From: hunterlong Date: Thu, 21 Mar 2019 22:34:52 -0700 Subject: [PATCH 2/3] group edit view and API --- handlers/groups.go | 33 +++ handlers/routes.go | 3 + source/css/base.css | 364 ++++++++++++++++++++++------------ source/tmpl/form_group.gohtml | 4 +- source/tmpl/group.gohtml | 17 ++ source/tmpl/services.gohtml | 1 + source/wiki.go | 2 +- version.txt | 2 +- 8 files changed, 296 insertions(+), 130 deletions(-) create mode 100644 source/tmpl/group.gohtml diff --git a/handlers/groups.go b/handlers/groups.go index f0cbdb01..736f7390 100644 --- a/handlers/groups.go +++ b/handlers/groups.go @@ -24,6 +24,21 @@ import ( "net/http" ) +func groupViewHandler(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + + var group *core.Group + id := vars["id"] + group = core.SelectGroup(utils.ToInt(id)) + + if group == nil { + w.WriteHeader(http.StatusNotFound) + return + } + + ExecuteResponse(w, r, "group.gohtml", group, nil) +} + // apiAllGroupHandler will show all the groups func apiAllGroupHandler(w http.ResponseWriter, r *http.Request) { auth := IsUser(r) @@ -42,6 +57,24 @@ func apiGroupHandler(w http.ResponseWriter, r *http.Request) { returnJson(group, w, r) } +// apiGroupUpdateHandler will update a group +func apiGroupUpdateHandler(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + group := core.SelectGroup(utils.ToInt(vars["id"])) + if group == nil { + sendErrorJson(errors.New("service not found"), w, r) + return + } + decoder := json.NewDecoder(r.Body) + decoder.Decode(&group) + _, err := group.Update() + if err != nil { + sendErrorJson(err, w, r) + return + } + sendJsonAction(group, "update", w, r) +} + // apiCreateGroupHandler accepts a POST method to create new groups func apiCreateGroupHandler(w http.ResponseWriter, r *http.Request) { var group *core.Group diff --git a/handlers/routes.go b/handlers/routes.go index 899fa952..509c9538 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -87,10 +87,13 @@ func Router() *mux.Router { r.Handle("/service/{id}/edit", authenticated(servicesViewHandler, true)).Methods("GET") r.Handle("/service/{id}/delete_failures", authenticated(servicesDeleteFailuresHandler, true)).Methods("GET") + r.Handle("/group/{id}", http.HandlerFunc(groupViewHandler)).Methods("GET") + // API GROUPS Routes r.Handle("/api/groups", readOnly(apiAllGroupHandler, false)).Methods("GET") r.Handle("/api/groups", authenticated(apiCreateGroupHandler, false)).Methods("POST") r.Handle("/api/groups/{id}", readOnly(apiGroupHandler, false)).Methods("GET") + r.Handle("/api/groups/{id}", authenticated(apiGroupUpdateHandler, false)).Methods("POST") r.Handle("/api/groups/{id}", authenticated(apiGroupDeleteHandler, false)).Methods("DELETE") r.Handle("/api/groups/reorder", authenticated(apiGroupReorderHandler, false)).Methods("POST") diff --git a/source/css/base.css b/source/css/base.css index b2e6ba55..4e523e1c 100644 --- a/source/css/base.css +++ b/source/css/base.css @@ -7,54 +7,66 @@ /* Mobile Service Container */ HTML, BODY { background-color: #fcfcfc; - padding-bottom: 10px; } + padding-bottom: 10px; +} .container { padding-top: 20px; padding-bottom: 25px; max-width: 860px; - box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; +} .header-title { - color: #464646; } + color: #464646; +} .header-desc { - color: #939393; } + color: #939393; +} .btn { - border-radius: 0.2rem; } + border-radius: 0.2rem; +} .online_list .badge { - margin-top: 0.2rem; } + margin-top: 0.2rem; +} .navbar { - margin-bottom: 30px; } + margin-bottom: 30px; +} .btn-sm { line-height: 1.3; - font-size: 0.75rem; } + font-size: 0.75rem; +} .view_service_btn { position: absolute; bottom: -40px; - right: 40px; } + right: 40px; +} .service_lower_info { position: absolute; bottom: -40px; left: 40px; color: #d1ffca; - font-size: 0.85rem; } + font-size: 0.85rem; +} .lg_number { font-size: 2.3rem; font-weight: bold; display: block; - color: #4f4f4f; } + color: #4f4f4f; +} .stats_area { text-align: center; - color: #a5a5a5; } + color: #a5a5a5; +} .lower_canvas { height: 3.4rem; @@ -62,118 +74,151 @@ HTML, BODY { background-color: #48d338; padding: 15px 10px; margin-left: 0px !important; - margin-right: 0px !important; } + margin-right: 0px !important; +} .lower_canvas SPAN { font-size: 1rem; - color: #fff; } + color: #fff; +} .footer { text-decoration: none; - margin-top: 20px; } + margin-top: 20px; +} .footer A { color: #8d8d8d; - text-decoration: none; } + text-decoration: none; +} .footer A:HOVER { - color: #6d6d6d; } + color: #6d6d6d; +} .badge { color: white; - border-radius: 0.2rem; } + border-radius: 0.2rem; +} .btn-group { - height: 25px; } - .btn-group A { - padding: 0.1rem .75rem; - font-size: 0.8rem; } + height: 25px; +} +.btn-group A { + padding: 0.1rem 0.75rem; + font-size: 0.8rem; +} .card-body .badge { - color: #fff; } + color: #fff; +} .nav-pills .nav-link { - border-radius: 0.2rem; } + border-radius: 0.2rem; +} .form-control { - border-radius: 0.2rem; } + border-radius: 0.2rem; +} .card { background-color: #ffffff; - border: 1px solid rgba(0, 0, 0, 0.125); } + border: 1px solid rgba(0, 0, 0, 0.125); +} .card-body { - overflow: hidden; } + overflow: hidden; +} .card-body H4 A { color: #444444; - text-decoration: none; } + text-decoration: none; +} .chart-container { position: relative; height: 170px; width: 100%; - overflow: hidden; } + overflow: hidden; +} .service-chart-container { position: relative; height: 400px; - width: 100%; } + width: 100%; +} .service-chart-heatmap { position: relative; height: 300px; - width: 100%; } + width: 100%; +} .btn-primary { background-color: #3e9bff; border-color: #006fe6; - color: white; } - .btn-primary.dyn-dark { - background-color: #32a825 !important; - border-color: #2c9320 !important; } - .btn-primary.dyn-light { - background-color: #75de69 !important; - border-color: #88e37e !important; } + color: white; +} +.btn-primary.dyn-dark { + background-color: #32a825 !important; + border-color: #2c9320 !important; +} +.btn-primary.dyn-light { + background-color: #75de69 !important; + border-color: #88e37e !important; +} .btn-success { - background-color: #47d337; } - .btn-success.dyn-dark { - background-color: #32a825 !important; - border-color: #2c9320 !important; } - .btn-success.dyn-light { - background-color: #75de69 !important; - border-color: #88e37e !important; } + background-color: #47d337; +} +.btn-success.dyn-dark { + background-color: #32a825 !important; + border-color: #2c9320 !important; +} +.btn-success.dyn-light { + background-color: #75de69 !important; + border-color: #88e37e !important; +} .btn-danger { - background-color: #dd3545; } - .btn-danger.dyn-dark { - background-color: #b61f2d !important; - border-color: #a01b28 !important; } - .btn-danger.dyn-light { - background-color: #e66975 !important; - border-color: #e97f89 !important; } + background-color: #dd3545; +} +.btn-danger.dyn-dark { + background-color: #b61f2d !important; + border-color: #a01b28 !important; +} +.btn-danger.dyn-light { + background-color: #e66975 !important; + border-color: #e97f89 !important; +} .bg-success { - background-color: #47d337 !important; } + background-color: #47d337 !important; +} .bg-danger { - background-color: #dd3545 !important; } + background-color: #dd3545 !important; +} .bg-success .dyn-dark { - background-color: #35b027 !important; } + background-color: #35b027 !important; +} .bg-danger .dyn-dark { - background-color: #bf202f !important; } + background-color: #bf202f !important; +} .nav-pills .nav-link.active, .nav-pills .show > .nav-link { - background-color: #13a00d; } + background-color: #13a00d; +} .nav-pills A { - color: #424242; } + color: #424242; +} .nav-pills I { - margin-right: 10px; } + margin-right: 10px; +} .CodeMirror { /* Bootstrap Settings */ @@ -193,23 +238,26 @@ HTML, BODY { border: 1px solid #ccc; border-radius: 4px; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; /* Code Mirror Settings */ font-family: monospace; position: relative; overflow: hidden; - height: 80vh; } + height: 80vh; +} .CodeMirror-focused { /* Bootstrap Settings */ border-color: #66afe9; outline: 0; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); - transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; } + transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; +} .switch { font-size: 1rem; - position: relative; } + position: relative; +} .switch input { position: absolute; @@ -220,7 +268,8 @@ HTML, BODY { clip: rect(0 0 0 0); clip-path: inset(50%); overflow: hidden; - padding: 0; } + padding: 0; +} .switch input + label { position: relative; @@ -233,23 +282,26 @@ HTML, BODY { outline: none; user-select: none; vertical-align: middle; - text-indent: calc(calc(calc(2.375rem * .8) * 2) + .5rem); } + text-indent: calc(calc(calc(2.375rem * .8) * 2) + .5rem); +} .switch input + label::before, .switch input + label::after { - content: ''; + content: ""; position: absolute; top: 0; left: 0; width: calc(calc(2.375rem * .8) * 2); bottom: 0; - display: block; } + display: block; +} .switch input + label::before { right: 0; background-color: #dee2e6; border-radius: calc(2.375rem * .8); - transition: 0.2s all; } + transition: 0.2s all; +} .switch input + label::after { top: 2px; @@ -258,120 +310,154 @@ HTML, BODY { height: calc(calc(2.375rem * .8) - calc(2px * 2)); border-radius: 50%; background-color: white; - transition: 0.2s all; } + transition: 0.2s all; +} .switch input:checked + label::before { - background-color: #08d; } + background-color: #08d; +} .switch input:checked + label::after { - margin-left: calc(2.375rem * .8); } + margin-left: calc(2.375rem * .8); +} .switch input:focus + label::before { outline: none; - box-shadow: 0 0 0 0.2rem rgba(0, 136, 221, 0.25); } + box-shadow: 0 0 0 0.2rem rgba(0, 136, 221, 0.25); +} .switch input:disabled + label { color: #868e96; - cursor: not-allowed; } + cursor: not-allowed; +} .switch input:disabled + label::before { - background-color: #e9ecef; } + background-color: #e9ecef; +} .switch.switch-sm { - font-size: 0.875rem; } + font-size: 0.875rem; +} .switch.switch-sm input + label { min-width: calc(calc(1.9375rem * .8) * 2); height: calc(1.9375rem * .8); line-height: calc(1.9375rem * .8); - text-indent: calc(calc(calc(1.9375rem * .8) * 2) + .5rem); } + text-indent: calc(calc(calc(1.9375rem * .8) * 2) + .5rem); +} .switch.switch-sm input + label::before { - width: calc(calc(1.9375rem * .8) * 2); } + width: calc(calc(1.9375rem * .8) * 2); +} .switch.switch-sm input + label::after { width: calc(calc(1.9375rem * .8) - calc(2px * 2)); - height: calc(calc(1.9375rem * .8) - calc(2px * 2)); } + height: calc(calc(1.9375rem * .8) - calc(2px * 2)); +} .switch.switch-sm input:checked + label::after { - margin-left: calc(1.9375rem * .8); } + margin-left: calc(1.9375rem * .8); +} .switch.switch-lg { - font-size: 1.25rem; } + font-size: 1.25rem; +} .switch.switch-lg input + label { min-width: calc(calc(3rem * .8) * 2); height: calc(3rem * .8); line-height: calc(3rem * .8); - text-indent: calc(calc(calc(3rem * .8) * 2) + .5rem); } + text-indent: calc(calc(calc(3rem * .8) * 2) + .5rem); +} .switch.switch-lg input + label::before { - width: calc(calc(3rem * .8) * 2); } + width: calc(calc(3rem * .8) * 2); +} .switch.switch-lg input + label::after { width: calc(calc(3rem * .8) - calc(2px * 2)); - height: calc(calc(3rem * .8) - calc(2px * 2)); } + height: calc(calc(3rem * .8) - calc(2px * 2)); +} .switch.switch-lg input:checked + label::after { - margin-left: calc(3rem * .8); } + margin-left: calc(3rem * .8); +} .switch + .switch { - margin-left: 1rem; } + margin-left: 1rem; +} @keyframes pulse_animation { 0% { - transform: scale(1); } + transform: scale(1); + } 30% { - transform: scale(1); } + transform: scale(1); + } 40% { - transform: scale(1.02); } + transform: scale(1.02); + } 50% { - transform: scale(1); } + transform: scale(1); + } 60% { - transform: scale(1); } + transform: scale(1); + } 70% { - transform: scale(1.05); } + transform: scale(1.05); + } 80% { - transform: scale(1); } + transform: scale(1); + } 100% { - transform: scale(1); } } + transform: scale(1); + } +} .pulse { animation-name: pulse_animation; animation-duration: 1500ms; transform-origin: 70% 70%; animation-iteration-count: infinite; - animation-timing-function: linear; } + animation-timing-function: linear; +} @keyframes glow-grow { 0% { opacity: 0; - transform: scale(1); } + transform: scale(1); + } 80% { - opacity: 1; } + opacity: 1; + } 100% { transform: scale(2); - opacity: 0; } } + opacity: 0; + } +} .pulse-glow { animation-name: glow-grown; animation-duration: 100ms; transform-origin: 70% 30%; animation-iteration-count: infinite; - animation-timing-function: linear; } + animation-timing-function: linear; +} .pulse-glow:before, .pulse-glow:after { position: absolute; - content: ''; + content: ""; height: 0.5rem; width: 1.75rem; top: 1.2rem; right: 2.15rem; border-radius: 0; box-shadow: 0 0 7px #47d337; - animation: glow-grow 2s ease-out infinite; } + animation: glow-grow 2s ease-out infinite; +} .sortable_drag { - background-color: #0000000f; } + background-color: #0000000f; +} .drag_icon { cursor: move; @@ -385,106 +471,132 @@ HTML, BODY { margin-right: 5px; margin-left: -10px; text-align: center; - color: #b1b1b1; } + color: #b1b1b1; +} /* (Optional) Apply a "closed-hand" cursor during drag operation. */ .drag_icon:active { cursor: grabbing; cursor: -moz-grabbing; - cursor: -webkit-grabbing; } + cursor: -webkit-grabbing; +} .switch_btn { float: right; margin: -1px 0px 0px 0px; - display: block; } + display: block; +} #start_container { position: absolute; z-index: 99999; - margin-top: 20px; } + margin-top: 20px; +} #end_container { position: absolute; z-index: 99999; margin-top: 20px; - right: 0; } + right: 0; +} .pointer { - cursor: pointer; } + cursor: pointer; +} .jumbotron { - background-color: white; } + background-color: white; +} @media (max-width: 767px) { HTML, BODY { - background-color: #fcfcfc; } + background-color: #fcfcfc; + } .sm-container { margin-top: 0px !important; - padding: 0 !important; } + padding: 0 !important; + } .list-group-item H5 { - font-size: 0.9rem; } + font-size: 0.9rem; + } .container { padding: 0px !important; - padding-top: 15px !important; } + padding-top: 15px !important; + } .group_header { - margin-left: 15px; } + margin-left: 15px; + } .navbar { margin-left: 0px; margin-top: 0px; width: 100%; - margin-bottom: 0; } + margin-bottom: 0; + } .btn-sm { line-height: 0.9rem; - font-size: 0.65rem; } + font-size: 0.65rem; + } .full-col-12 { padding-left: 0px; - padding-right: 0px; } + padding-right: 0px; + } .card { border: 0; border-radius: 0rem; padding: 0; - background-color: #ffffff; } + background-color: #ffffff; + } .card-body { font-size: 10pt; - padding: 0px 10px; } + padding: 0px 10px; + } .lg_number { - font-size: 7.8vw; } + font-size: 7.8vw; + } .stats_area { margin-top: 1.5rem !important; - margin-bottom: 1.5rem !important; } + margin-bottom: 1.5rem !important; + } .stats_area .col-4 { padding-left: 0; padding-right: 0; - font-size: 0.6rem; } + font-size: 0.6rem; + } .list-group-item { border-top: 1px solid #e4e4e4; - border: 0px; } + border: 0px; + } .list-group-item:first-child { border-top-left-radius: 0; - border-top-right-radius: 0; } + border-top-right-radius: 0; + } .list-group-item:last-child { border-bottom-right-radius: 0; - border-bottom-left-radius: 0; } + border-bottom-left-radius: 0; + } .list-group-item P { - font-size: 0.7rem; } + font-size: 0.7rem; + } .service-chart-container { - height: 200px; } } + height: 200px; + } +} /*# sourceMappingURL=base.css.map */ diff --git a/source/tmpl/form_group.gohtml b/source/tmpl/form_group.gohtml index af055e4e..84d9d01b 100644 --- a/source/tmpl/form_group.gohtml +++ b/source/tmpl/form_group.gohtml @@ -17,9 +17,9 @@
- + - +
diff --git a/source/tmpl/group.gohtml b/source/tmpl/group.gohtml new file mode 100644 index 00000000..0099251a --- /dev/null +++ b/source/tmpl/group.gohtml @@ -0,0 +1,17 @@ +{{define "title"}}{{.Name}} Status{{end}} +{{define "description"}}Group {{.Name}}{{end}} +{{ define "content" }} + +{{$isAdmin := Auth}} +
+ +{{if IsUser}} + {{template "nav"}} +{{end}} + +
+ {{template "form_group" .Group}} +
+
+ +{{end}} \ No newline at end of file diff --git a/source/tmpl/services.gohtml b/source/tmpl/services.gohtml index f41ca9c5..c17f193c 100644 --- a/source/tmpl/services.gohtml +++ b/source/tmpl/services.gohtml @@ -57,6 +57,7 @@ {{if .Public.Bool}}PUBLIC{{else}}PRIVATE{{end}}
+ Edit {{if Auth}}{{end}}
diff --git a/source/wiki.go b/source/wiki.go index 61ff58ab..7c432ed2 100644 --- a/source/wiki.go +++ b/source/wiki.go @@ -1,6 +1,6 @@ // Code generated by go generate; DO NOT EDIT. // This file was generated by robots at -// 2019-03-16 15:39:30.237389 -0700 PDT m=+0.779058438 +// 2019-03-21 22:32:21.288109 -0700 PDT m=+0.474439036 // // This contains the most recently Markdown source for the Statping Wiki. package source diff --git a/version.txt b/version.txt index 4f6bc981..4ebf5929 100644 --- a/version.txt +++ b/version.txt @@ -1 +1 @@ -0.80.52 +0.80.53 From 25471c75878e6b262e10dae09fe3ef77a726bcc9 Mon Sep 17 00:00:00 2001 From: hunterlong Date: Thu, 21 Mar 2019 22:41:18 -0700 Subject: [PATCH 3/3] group edit view and API --- handlers/groups.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/handlers/groups.go b/handlers/groups.go index 736f7390..f42593b9 100644 --- a/handlers/groups.go +++ b/handlers/groups.go @@ -62,7 +62,7 @@ func apiGroupUpdateHandler(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) group := core.SelectGroup(utils.ToInt(vars["id"])) if group == nil { - sendErrorJson(errors.New("service not found"), w, r) + sendErrorJson(errors.New("group not found"), w, r) return } decoder := json.NewDecoder(r.Body)