From c24e0739420b933410d899b2dc3858cbf6c7cf81 Mon Sep 17 00:00:00 2001 From: Hunter Long Date: Thu, 23 Aug 2018 00:28:48 -0700 Subject: [PATCH] UI changes - sortable services --- Makefile | 2 +- cmd/cli.go | 3 + core/failures.go | 8 +-- handlers/index.go | 61 ++++++++++++++++++++ handlers/routes.go | 3 +- handlers/settings.go | 8 ++- source/css/base.css | 19 +++++-- source/js/main.js | 114 ++++++++++++++++++++++++------------- source/scss/base.scss | 19 +++++-- source/tmpl/dashboard.html | 2 +- source/tmpl/service.html | 7 ++- source/tmpl/services.html | 8 ++- source/tmpl/settings.html | 12 +++- source/tmpl/tray.html | 100 ++++++++++++++++++++++++++++++++ 14 files changed, 297 insertions(+), 69 deletions(-) create mode 100644 source/tmpl/tray.html diff --git a/Makefile b/Makefile index 4fffa559..858e58f4 100644 --- a/Makefile +++ b/Makefile @@ -1,4 +1,4 @@ -VERSION=0.5 +VERSION=0.51 BINARY_NAME=statup GOPATH:=$(GOPATH) GOCMD=go diff --git a/cmd/cli.go b/cmd/cli.go index 67b18a7d..45cb8105 100644 --- a/cmd/cli.go +++ b/cmd/cli.go @@ -20,6 +20,7 @@ import ( "errors" "fmt" "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/handlers" "github.com/hunterlong/statup/source" "github.com/hunterlong/statup/types" "github.com/hunterlong/statup/utils" @@ -44,6 +45,8 @@ func CatchCLI(args []string) error { LoadDotEnvs() switch args[1] { + case "app": + handlers.DesktopInit(ipAddress, port) case "version": if COMMIT != "" { fmt.Printf("Statup v%v (%v)\n", VERSION, COMMIT) diff --git a/core/failures.go b/core/failures.go index b8bc8cbb..b9b2e351 100644 --- a/core/failures.go +++ b/core/failures.go @@ -56,11 +56,9 @@ func (s *Service) AllFailures() []*types.Failure { } func (u *Service) DeleteFailures() { - var fails []*Failure - col := DbSession.Collection("failures") - col.Find("service", u.Id).All(&fails) - for _, fail := range fails { - fail.Delete() + _, err := DbSession.Exec(`DELETE FROM failures WHERE service = ?`, u.Id) + if err != nil { + utils.Log(3, fmt.Sprintf("failed to delete all failures: %v", err)) } u.Failures = nil } diff --git a/handlers/index.go b/handlers/index.go index 09dd0b30..7d332f79 100644 --- a/handlers/index.go +++ b/handlers/index.go @@ -16,7 +16,10 @@ package handlers import ( + "fmt" "github.com/hunterlong/statup/core" + "github.com/hunterlong/statup/types" + "github.com/hunterlong/statup/utils" "net/http" ) @@ -31,3 +34,61 @@ func IndexHandler(w http.ResponseWriter, r *http.Request) { } ExecuteResponse(w, r, "index.html", core.CoreApp) } + +func TrayHandler(w http.ResponseWriter, r *http.Request) { + ExecuteResponse(w, r, "tray.html", core.CoreApp) +} + +func DesktopInit(ip string, port int) { + config := &core.DbConfig{DbConfig: &types.DbConfig{ + DbConn: "sqlite", + Project: "Statup", + Description: "Statup running as an App!", + Domain: "http://localhost", + Username: "admin", + Password: "admin", + Email: "user@email.com", + Error: nil, + Location: utils.Directory, + }} + + fmt.Println(config) + + err := config.Save() + if err != nil { + utils.Log(4, err) + } + + if err != nil { + utils.Log(3, err) + return + } + + core.Configs, err = core.LoadConfig() + if err != nil { + utils.Log(3, err) + config.Error = err + return + } + + err = core.DbConnection(core.Configs.Connection, false, utils.Directory) + if err != nil { + utils.Log(3, err) + core.DeleteConfig() + config.Error = err + return + } + + admin := core.ReturnUser(&types.User{ + Username: config.Username, + Password: config.Password, + Email: config.Email, + Admin: true, + }) + admin.Create() + + core.LoadSampleData() + + core.InitApp() + RunHTTPServer(ip, port) +} diff --git a/handlers/routes.go b/handlers/routes.go index 4d8b2992..4fea8a9b 100644 --- a/handlers/routes.go +++ b/handlers/routes.go @@ -101,10 +101,11 @@ func Router() *mux.Router { r.Handle("/api/checkin/{api}", http.HandlerFunc(ApiCheckinHandler)) r.Handle("/metrics", http.HandlerFunc(PrometheusHandler)) r.NotFoundHandler = http.HandlerFunc(Error404Handler) + r.Handle("/tray", http.HandlerFunc(TrayHandler)) return r } -func resetRouter() { +func ResetRouter() { router = Router() httpServer.Handler = router } diff --git a/handlers/settings.go b/handlers/settings.go index c918bd21..1b88004d 100644 --- a/handlers/settings.go +++ b/handlers/settings.go @@ -73,10 +73,12 @@ func SaveSASSHandler(w http.ResponseWriter, r *http.Request) { r.ParseForm() theme := r.PostForm.Get("theme") variables := r.PostForm.Get("variables") + mobile := r.PostForm.Get("mobile") source.SaveAsset([]byte(theme), utils.Directory, "scss/base.scss") source.SaveAsset([]byte(variables), utils.Directory, "scss/variables.scss") + source.SaveAsset([]byte(mobile), utils.Directory, "scss/mobile.scss") source.CompileSASS(utils.Directory) - resetRouter() + ResetRouter() ExecuteResponse(w, r, "settings.html", core.CoreApp) } @@ -96,7 +98,7 @@ func SaveAssetsHandler(w http.ResponseWriter, r *http.Request) { source.CopyToPublic(source.CssBox, dir+"/assets/css", "base.css") utils.Log(2, "Default 'base.css' was insert because SASS did not work.") } - resetRouter() + ResetRouter() ExecuteResponse(w, r, "settings.html", core.CoreApp) } @@ -106,7 +108,7 @@ func DeleteAssetsHandler(w http.ResponseWriter, r *http.Request) { return } source.DeleteAllAssets(utils.Directory) - resetRouter() + ResetRouter() ExecuteResponse(w, r, "settings.html", core.CoreApp) } diff --git a/source/css/base.css b/source/css/base.css index e0a6b74a..95964b97 100644 --- a/source/css/base.css +++ b/source/css/base.css @@ -354,22 +354,29 @@ HTML, BODY { box-shadow: 0 0 7px #47d337; animation: glow-grow 2s ease-out infinite; } -.sortable { +.sortable_drag { + background-color: #0000000f; } + +.drag_icon { cursor: move; /* fallback if grab cursor is unsupported */ cursor: grab; cursor: -moz-grab; - cursor: -webkit-grab; } + cursor: -webkit-grab; + width: 25px; + height: 25px; + display: inline-block; + margin-right: 5px; + margin-left: -10px; + text-align: center; + color: #b1b1b1; } /* (Optional) Apply a "closed-hand" cursor during drag operation. */ -.sortable:active { +.drag_icon:active { cursor: grabbing; cursor: -moz-grabbing; cursor: -webkit-grabbing; } -.sortable_drag { - background-color: #0000000f; } - @media (max-width: 767px) { HTML, BODY { background-color: #fcfcfc; } diff --git a/source/js/main.js b/source/js/main.js index e83bd91b..55d1a627 100644 --- a/source/js/main.js +++ b/source/js/main.js @@ -15,61 +15,63 @@ * along with this program. If not, see . */ -$(".service_li").on('click', function() { + +$('.service_li').on('click', function() { var id = $(this).attr('data-id'); - var position = $("#service_id_"+id).offset(); - window.scroll(0,position.top-23); + var position = $('#service_id_' + id).offset(); + window.scroll(0, position.top - 23); return false; }); $('form').submit(function() { - $(this).find("button[type='submit']").prop('disabled',true); + console.log(this); + $(this).find('button[type=submit]').prop('disabled', true); }); $('select#service_type').on('change', function() { var selected = $('#service_type option:selected').val(); - if (selected === "tcp") { - $("#service_port").parent().parent().removeClass("d-none"); - $("#service_check_type").parent().parent().addClass("d-none"); - $("#service_url").attr("placeholder", "localhost"); + if (selected === 'tcp') { + $('#service_port').parent().parent().removeClass('d-none'); + $('#service_check_type').parent().parent().addClass('d-none'); + $('#service_url').attr('placeholder', 'localhost'); - $("#post_data").parent().parent().addClass("d-none"); - $("#service_response").parent().parent().addClass("d-none"); - $("#service_response_code").parent().parent().addClass("d-none"); + $('#post_data').parent().parent().addClass('d-none'); + $('#service_response').parent().parent().addClass('d-none'); + $('#service_response_code').parent().parent().addClass('d-none'); } else { - $("#post_data").parent().parent().removeClass("d-none"); - $("#service_response").parent().parent().removeClass("d-none"); - $("#service_response_code").parent().parent().removeClass("d-none"); - $("#service_check_type").parent().parent().removeClass("d-none"); - $("#service_url").attr("placeholder", "https://google.com"); + $('#post_data').parent().parent().removeClass('d-none'); + $('#service_response').parent().parent().removeClass('d-none'); + $('#service_response_code').parent().parent().removeClass('d-none'); + $('#service_check_type').parent().parent().removeClass('d-none'); + $('#service_url').attr('placeholder', 'https://google.com'); - $("#service_port").parent().parent().addClass("d-none"); + $('#service_port').parent().parent().addClass('d-none'); } }); $('select#service_check_type').on('change', function() { var selected = $('#service_check_type option:selected').val(); - if (selected === "POST") { - $("#post_data").parent().parent().removeClass("d-none"); + if (selected === 'POST') { + $('#post_data').parent().parent().removeClass('d-none'); } else { - $("#post_data").parent().parent().addClass("d-none"); + $('#post_data').parent().parent().addClass('d-none'); } }); $(function() { var pathname = window.location.pathname; - if (pathname==="/logs") { + if (pathname === '/logs') { var lastline; - var logArea = $("#live_logs"); + var logArea = $('#live_logs'); setInterval(function() { - $.get("/logs/line", function(data, status){ + $.get('/logs/line', function(data, status) { if (lastline !== data) { var curr = $.trim(logArea.text()); - var line = data.replace(/(\r\n|\n|\r)/gm, " "); - line = line + "\n"; + var line = data.replace(/(\r\n|\n|\r)/gm, ' '); + line = line + '\n'; logArea.text(line + curr); lastline = data; } @@ -79,9 +81,9 @@ $(function() { }); -$(".confirm-btn").on('click', function() { - var r = confirm("Are you sure you want to delete?"); - if (r == true) { +$('.confirm-btn').on('click', function() { + var r = confirm('Are you sure you want to delete?'); + if (r === true) { return true; } else { return false; @@ -89,30 +91,64 @@ $(".confirm-btn").on('click', function() { }); -$(".select-input").on("click", function () { +$('.select-input').on('click', function() { $(this).select(); }); +// $('input[name=password], input[name=password_confirm]').on('change keyup input paste', function() { +// var password = $('input[name=password]'), +// repassword = $('input[name=password_confirm]'), +// both = password.add(repassword).removeClass('is-valid is-invalid'); +// +// var btn = $(this).parents('form:first').find('button[type=submit]'); +// password.addClass( +// password.val().length > 0 ? 'is-valid' : 'is-invalid' +// ); +// repassword.addClass( +// password.val().length > 0 ? 'is-valid' : 'is-invalid' +// ); +// +// if (password.val() !== repassword.val()) { +// both.addClass('is-invalid'); +// btn.prop('disabled', true); +// } else { +// btn.prop('disabled', false); +// } +// }); + + var ranVar = false; var ranTheme = false; -$('a[data-toggle="pill"]').on('shown.bs.tab', function (e) { - var target = $(e.target).attr("href"); - if (target==="#v-pills-style" && !ranVar) { - var sass_vars = CodeMirror.fromTextArea(document.getElementById("sass_vars"), { +var ranMobile = false; +$('a[data-toggle=pill]').on('shown.bs.tab', function(e) { + var target = $(e.target).attr('href'); + if (target === '#v-pills-style' && !ranVar) { + var sass_vars = CodeMirror.fromTextArea(document.getElementById('sass_vars'), { lineNumbers: true, matchBrackets: true, - mode: "text/x-scss", - colorpicker : true + mode: 'text/x-scss', + colorpicker: true }); + sass_vars.setSize(null, 900); ranVar = true; - } else if (target==="#pills-theme" && !ranTheme) { - var theme_css = CodeMirror.fromTextArea(document.getElementById("theme_css"), { + } else if (target === '#pills-theme' && !ranTheme) { + var theme_css = CodeMirror.fromTextArea(document.getElementById('theme_css'), { lineNumbers: true, matchBrackets: true, - mode: "text/x-scss", - colorpicker : true + mode: 'text/x-scss', + colorpicker: true }); + theme_css.setSize(null, 900); ranTheme = true; + } else if (target === '#pills-mobile' && !ranMobile) { + var mobile_css = CodeMirror.fromTextArea(document.getElementById('mobile_css'), { + lineNumbers: true, + matchBrackets: true, + mode: 'text/x-scss', + colorpicker: true + }); + mobile_css.setSize(null, 900); + ranMobile = true; } }); \ No newline at end of file diff --git a/source/scss/base.scss b/source/scss/base.scss index ac0a07e5..2ba9f69d 100644 --- a/source/scss/base.scss +++ b/source/scss/base.scss @@ -410,22 +410,29 @@ HTML,BODY { animation: glow-grow 2s ease-out infinite; } -.sortable { +.sortable_drag { + background-color: #0000000f; +} + +.drag_icon { cursor: move; /* fallback if grab cursor is unsupported */ cursor: grab; cursor: -moz-grab; cursor: -webkit-grab; + width: 25px; + height: 25px; + display: inline-block; + margin-right: 5px; + margin-left: -10px; + text-align: center; + color: #b1b1b1; } /* (Optional) Apply a "closed-hand" cursor during drag operation. */ -.sortable:active { +.drag_icon:active { cursor: grabbing; cursor: -moz-grabbing; cursor: -webkit-grabbing; } -.sortable_drag { - background-color: #0000000f; -} - @import 'mobile'; \ No newline at end of file diff --git a/source/tmpl/dashboard.html b/source/tmpl/dashboard.html index a2d59945..a99c20ba 100644 --- a/source/tmpl/dashboard.html +++ b/source/tmpl/dashboard.html @@ -66,7 +66,7 @@
{{.ParseError}}
- Reported {{.Ago}} + {{.Ago}}

{{.Issue}}

diff --git a/source/tmpl/service.html b/source/tmpl/service.html index fb6d9947..1e403cfc 100644 --- a/source/tmpl/service.html +++ b/source/tmpl/service.html @@ -64,7 +64,7 @@
{{.ParseError}}
- Reported {{.Ago}} + {{.Ago}}

{{.Issue}}

@@ -109,10 +109,13 @@ -
+
diff --git a/source/tmpl/services.html b/source/tmpl/services.html index 228a4ebf..96a13500 100644 --- a/source/tmpl/services.html +++ b/source/tmpl/services.html @@ -34,7 +34,7 @@ {{range .}} - {{.Name}} + {{.Name}} {{if .Online}}ONLINE{{else}}OFFLINE{{end}}
@@ -77,6 +77,9 @@
@@ -152,7 +155,8 @@ + + + + + + + + \ No newline at end of file