diff --git a/admin_endpoints.go b/admin_endpoints.go index 9657510..4455112 100644 --- a/admin_endpoints.go +++ b/admin_endpoints.go @@ -4,25 +4,23 @@ import ( "fmt" "net/http" + "github.com/gorilla/mux" "github.com/gorilla/sessions" ) func initAdminRequest(w http.ResponseWriter, req *http.Request) *pageData { p := InitPageData(w, req) - return p } // Main admin handler, routes the request based on the category -func AdminHandler(w http.ResponseWriter, req *http.Request) { - fmt.Println("Admin Handler") +func handleAdmin(w http.ResponseWriter, req *http.Request) { page := initAdminRequest(w, req) - //vars := mux.Vars(req) - vars := make(map[string]string) if !page.LoggedIn { page.SubTitle = "Admin Login" page.show("admin-login.html", w) } else { + vars := mux.Vars(req) adminCategory := vars["category"] switch adminCategory { case "users": @@ -78,10 +76,6 @@ func InitPageData(w http.ResponseWriter, req *http.Request) *pageData { // Build the menu if p.LoggedIn { p.Menu = append(p.Menu, menuItem{"Admin", "/admin", "fa-key"}) - p.Menu = append(p.Menu, menuItem{"Teams", "/admin/teams", "fa-users"}) - p.Menu = append(p.Menu, menuItem{"Games", "/admin/games", "fa-gamepad"}) - p.Menu = append(p.Menu, menuItem{"Votes", "/admin/votes", "fa-sticky-note"}) - p.Menu = append(p.Menu, menuItem{"Clients", "/admin/clients", "fa-desktop"}) p.BottomMenu = append(p.BottomMenu, menuItem{"Users", "/admin/users", "fa-user"}) p.BottomMenu = append(p.BottomMenu, menuItem{"Logout", "/admin/dologout", "fa-sign-out"}) diff --git a/admin_users.go b/admin_users.go index c6f0020..713fe4f 100644 --- a/admin_users.go +++ b/admin_users.go @@ -4,6 +4,8 @@ import ( "errors" "net/http" "strings" + + "github.com/gorilla/mux" ) // handleAdminDoLogin @@ -44,8 +46,7 @@ func handleAdminDoLogout(w http.ResponseWriter, req *http.Request) { // handleAdminUsers func handleAdminUsers(w http.ResponseWriter, req *http.Request, page *pageData) { - //vars := mux.Vars(req) - vars := make(map[string]string) + vars := mux.Vars(req) page.SubTitle = "Admin Users" email := vars["id"] if email == "new" { diff --git a/assets.go b/assets.go index a4f8391..64c779f 100644 --- a/assets.go +++ b/assets.go @@ -190,236 +190,156 @@ var _escData = map[string]*_escFile{ "/assets/css/main.css": { local: "assets/css/main.css", - size: 52020, - modtime: 1503876786, + size: 52173, + modtime: 1504035117, compressed: ` -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 -ywAA +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 +4zVew9ZrCIMprM+AtXriIizsLFDKKy1SyGvI9lmyIRy2wD5jVuCQE+KqIkWK76a30LIFyfgyljXnupMu +oJIiVNIQFdcAHkUvQeglIXqubTyCHrMRTHLcbPBRE2bzCBIrl8QqSMK1qEdQu3Gp3QSpucb2CGpLl9oy +TG10D1y4JBZBEq6JPoLa3KU2D1JzrfcR1GYutVmQ2nR075u6JKZBEq7NP2r4IqM3OHifUXuItuO29xWu +pGCmo1F0pjv+dZ47cHWeO8x0njsodJ7bm3We2/d0nttTdJ7bxFB4JI83iumiyIqmTorTfl6HRZdKekpB +90WVuu0pZOyaUHcmDA5dG1XopqcQdHRUoWVfocQAX/SAz7Eqm/cUmmE1NuspNDVrbNoDnmI11tcB7Aob +uaP74kC9OFAePl8cqBcH6qs6UFRLHXeuB6XSL+RC2XTSIJ1LOFE2xSRI8QJulElQ2VE4vXMdKZPIKkzk +Aq6USe8mTO8CzpRJb9lD70x3yiSyCBO5gENl0puH6V3ApTLpzcL0znWqTCLTMJELuFX2eA4P54s4Vho3 +5lnhua6aQXwrLBMZy4h3hWUiowTxr7BMpCsiHhaWibQ34mMZmQOcLKsxh3pZoWJ+NytUCvOzQvB+RytU +yu9pBUshrlYI3u9rhUr5na1QKczbCsH73a1gm472t4zA0KC/NdTbGuFrSU9roJ8FvazxPtZ0tI/llBji +Y02l7zHWx5pCr2O8j4X6nT0ult/FDRIc4iN7/asB3nKvd3WGc3Web6VdjfGelelmnONXYZ5nn1sVcngD +XtVUSzoAgy3q1JR1intU7LSe61DJ5Av5UxaVNETlEt6URS8J0buAL2WQU2YTSu1cT8ogsQqSuIAfZVC7 +CVK7gBdlUFuGqZ3pQxkkFkESF/CgDGrzILUL+E8GtVmQ2rnek0FiGiRxAd/JGr3BwXsRz0mhxhwnNNPR +KIjbhOS5AxdxmpA8d1AgLhOS5/Y9xGFC8twmRtwlmDfAWzLbb6izFCjl95UChTBXKQDu95QChfyOUqgQ +4icFwP1uUqCQ30sKFMKcpAC430cKNeVoF2k+eEvqxUV6cZFeXKQXF+lsF+nk8ZFOF3aSbDppkM4l3CSb +YhKkeAFH6YR7Sji9c12lE+4r4UQu4CydcG8Jp3cBd+mE+0seemc6TCfcY8KJXMBlOuE+E07vAk7TCfea +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 +/4QynrDNywAA `, }, "/assets/js/main.js": { local: "assets/js/main.js", - size: 4426, - modtime: 1490366569, + size: 0, + modtime: 1504030875, compressed: ` -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 +H4sIAAAJbogA/wEAAP//AAAAAAAAAAA= `, }, "/assets/js/util.js": { local: "assets/js/util.js", - size: 11847, - modtime: 1490366569, + size: 1, + modtime: 1504030883, compressed: ` -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 -LgAA +H4sIAAAJbogA/+ICBAAA//+TBtcyAQAAAA== `, }, @@ -12460,58 +12380,74 @@ lY3tMICOnnX8Awz2vM6lVuNVnm2WLCqmCXaoUGbgP44xzSS2SeTwR1ZE2IejL/4/AAD//2qGqimCIwAA `, }, + "/templates/admin-adduser.html": { + local: "templates/admin-adduser.html", + size: 918, + modtime: 1504035138, + compressed: ` +H4sIAAAJbogA/7STyWozMQzH73kKo/vgF5gZ+A7fuaHLuThjJTF4w5aT5u2reJZkcgiU0pOt7S/9QGoz +DmSCF4NVOXegtDMe+o0QrTan2TsET8p4TDXCsX1Ibg7GkrCpjuXXKGsOHjUIVdU7kFVYlowpS49nmdUJ +QTikY9AdbF/e3iftq7pBqzPS7FgPU7tcJ0rBNocUSoRbIqdatUMreIwO0Cljof9/fcQ/rRPm3MqasCox +PhYSRs8VwiuHi0GXyAbhF4GIVg14DFYjy690QZyULZzI0IXCPgwl3wFIJug3vwWKXHAOSUO/nX7PcZb8 +iehmj1A3ewW2Xdr8FcBnigT9K0ZUJH7GUksfeEbfU6aHXs/QdoWIT2KUy2XnDIvfs04Jd/8mJuNUukDP +6yA+eM1bOUaWrZbrtWabL6Ve2ti/ldMt9pvvAAAA//9Vt8D7lgMAAA== +`, + }, + "/templates/admin-edituser.html": { local: "templates/admin-edituser.html", - size: 984, - modtime: 1503931050, + size: 1078, + modtime: 1504035141, compressed: ` -H4sIAAAJbogA/6STS27cMAyG93MKQZski7EOUNuLJl101QGaHECWaFuoXpCoFIPB3L2MHwM7aIEi2ekn -aX58mLU2r0xZmXPDFXiExNsDY3UfklvtQ8hZuXycbFtxlNYMHjRnUqEJvuFCame8KBlSFpcLq57BRSsR -niRKdr2KLF+BMwc4Bt3w04+fzxPvjWjA6gw4SzJsKluhKnhMwR6HFErkayTF5ih9+xdeLSbPmlJQzvbw -EYCVHdjboJaoycgZjaLhkTy/Q9K8PS2vWkz+TRLjY0Fm9Caaeelgq/Ecd5q6UTAGq4Egpxvk8x1JNibo -9yvj69exWGoPemQ0PwW3rXcFMfh38kg1Gs/bR+kV2FrIDWX5YO4ql84Z3EOSGcb/pCTjZDrz9iVq2nAt -Zvu/YLPg07g79E9gAeGFuvwoH1IKdB1zovf0ZRHzc/srk6JLaQ9LQJ1VMpE8Oqji6OCqAfCbhbfn1/N3 -fX+3q/XuoQr+0Rr1izWsL346s3t4YBdKTavNwUJlw0CmL4crQdb0fwIAAP//Ct4Th9gDAAA= +H4sIAAAJbogA/6xTzW7bMAy+5ykEXdoeEj3AbB/W7rDTAqx9AEViHGH6g0Q3KIK8+2jZamIsy2HYySL5 +6fv40VSTQaEJnikrc2651M543q0Ya7R5r1knDSGCR/pCKmUC7ENyFdGHnJXL65K7DtbSmt6D5kwWoZaL +oiGGDCmL04ltXsFFKxFeJEp2Poss34EzB3gIuuXbHz9fZ8VR04DVGbAmln1W4bHVFOy6T2GI/IIldI7S +dzdUG1EqF1pBvN3qX2Ws3IGt+IorSc5oLC2PVDmGpHm3nU+NKPUFjfFxQGb0FZ556eA6xo+4iMmVgkOw +Gkhm+ynzv5ztBkTal7GnHfpn6RV5OiTYL/8sr5RxsOQc9showArYdJ93081GyFvsk6c87JzBJVMy/WGm +4t1b1PQHGzHd+jvRrFmbfgELCG/U5h3uCfQn9zy+GiwXkmLa+fJ8Jhit1fTA6JhVMpGAOqjBgcdND/jN +wnj8+vFdPz58zvPhaRP8szXqF2vZfvCF4RGe2ImYj8brcNzYoGR5uS1bDv7L6nxX4uL+rgytQA4WSKen +1EhKXmYHvwMAAP//al2wqTYEAAA= `, }, "/templates/admin-login.html": { local: "templates/admin-login.html", - size: 830, - modtime: 1503933436, + size: 996, + modtime: 1504035122, compressed: ` -H4sIAAAJbogA/6RSy26DMBC85yusvSN+AJB66LFq1PQHjL0hVm0vspc2+fs6YF6KWqnqCWaZmZ1BW2nz -KZSVMdag0DMGaA5CVGcKbp53FKNysRhnW1BIazqPGoRUbMjXUErtjC81WeqMB+GQL6RrOL6e3kfju7VB -qyPyBNNgE2F2V+Q5kC26QEMPMzNxrWzRirS8BnTSWGie7w/xpHXAGKtyJGwExvcDC6NnvvDS4QL41ifA -eGUQvZUKL2Q1JvOda+o3MJ1JDXEJXabUzeGfFfqk+KKgoTnmt98KLOzcYcVTjRXvqhyXJX/NHn+IHdCh -a9OpPOguqD5aum50uwarcGqw4qnBqhdv+ZN4wTXD/ufkHhm0AzP5bBSH1hl+yJc5e1j0wTgZbtCcRlVV -TvN8ruX2XhNKd98c8urvAAAA//9n3CmxPgMAAA== +H4sIAAAJbogA/6yTTW7zIBCG9zkFYm9xAdvSt/iWVaOmF8AwcVCBsQC3ye078T9x1S5aNsn8vPPOE2UY +vTKCSgY9U1bGWHGpnfG8PrDhldq8zxWFPknjISxVqp8xuLmhxRiVi8WQ2waFtKb1oDmTg1fFxWAjNFps +yY45SBfUFT8+n1434+8GBqyOkLbJfK/Z6b5fQFu0AfuO5/2ksLIBy2idioOTxvL6//2D/dM6QIylGBp2 +MuO7PjGjZxXz0sESpFtHQYJr4qyzUsEFrQayyGYTd5/wjKqPDxiCOOrDH6J1pPvAoHl9nL79DLZoJrY1 +HvHWOEM8Lla/YYrf4gRw4Br6y+3UF1BvDV536oxslY9kazySrVPYy1RiT/C4z1c/4ESZpZo+JTqkcXTs +G2fSbu+pJw+LLhgnw43Xp0FVijGfHYLYXwLl6LqWW11XKsV01fXhMwAA///j14z35AMAAA== `, }, "/templates/admin-main.html": { local: "templates/admin-main.html", - size: 433, - modtime: 1503934405, + size: 488, + modtime: 1504035131, compressed: ` -H4sIAAAJbogA/5SQz0rEQAzG732KMJdtD7YHj7YFFVm8iOATdGfG7uA0WZpUEfHdzUypCP4BTwn5Jr98 -37QuPIONA3NnLKF4FNMXAGmeqnbH8/7STQHhwVsJhNw2Olq1wyJCCMF15iB4fyQhNhtvJGY78dn6yPRZ -hv0Qo5+DV8wq/Ii68y+/g5L4dbttstutsJ3DSfrCkV0mDVSPXm6iT+3V660rd59Wd1VNeB2DfYIOHhfM -+coK3hSqv8EUfR1pLM2eQK2fcoBpwGHMNFNdFO9/nklO/3kEdeXbjbbZQn0EAAD//79zcTmxAQAA +H4sIAAAJbogA/5SQQUvEMBCF7/srhly2vbQHj6YBFVm8iOAvyCazbTCdWZpUEfG/m6TtXhYUb4+Zl+/N +iwxoomMC43UIndB2dCTUDkBa975NDVPUjnAqm2W3qKSHG3WXX8HrggqyTaNtq8HZThwjvQwcOYgNeZxj +ZBIwTHjqRFty2/PiUcULB+09Tg4TUF/znvHjDxplh8q+C0C26+WrkO3aP8lgJneOamfZzCNSbHqMjx6z +vP98stX+UmJfN0wP3pk36OA0UyFUNXwlcPqqwB4bz30lDgypR2kFoybdF5qob3ffv8bkm/8ZksteZaR6 +a6mfAAAA///M9xBo6AEAAA== `, }, "/templates/admin-users.html": { local: "templates/admin-users.html", - size: 736, - modtime: 1503930325, + size: 809, + modtime: 1504035147, compressed: ` -H4sIAAAJbogA/6RRwY7qMAy88xVWxfGV3J9KpCe9/YPdD3BjA5HSFMUpqxXqv6+b0gUEB6Q9ZTyJPc5M -Q/4ELqDItmr7nPuuliM6Bscxc6rsCqBB8KTXOf4j+hBll459L+I6qdtBOyPcl7UMzrFIBYfEu21lkDof -zaADxET+rGzjl0E7hB3WxzCIssZbUCWYpBqDdtUY3VKPjG3gsksZUpf6Zxnp0/xgWeNJVbd9Ik5Md//L -B0aa0ITTDApt3zr0oTGKbshrrag8n5jLiCa3PX3N1+czJIx7hrX/A+sT/N3C5p27Y8DM/zHjZvqhwDg+ -SpPVZm0ZR51Nt/wFllieGLu0GSafXwxKF/LxSRwcnQ9zICWHF5WJA2f+nXZOKIcH6asXi/PFZI40m6js -7L6CKW67+g4AAP//VmB35uACAAA= +H4sIAAAJbogA/4xT226rMBB8z1esUB4P8fsRQTrS6R+0H7DgTbBkbGQvqaqIf+/icAlpqvaN8czOmB0o +ItVsvIPaYozHDHVrXFbuAAptLvNp7R2jcRQSs+Uqz+zbPHZYE3S9tXkw54YnpWgRjBYZu39av0XxWCZ7 +mXQZNIFOx0ylaNWLIipH71lZmFl5Qjhh3tk+yqkyJYgVjF6FwulGSq40PTJWllJoMssTXlKjDzfB2cdY +txO9RXnlg6ZAGmpyvLz26N0Q6hmNOKwg0eVLi8YWSp4eiO2ZoGV0ZO5sC668/lil1ysEdGeCvfkD+wv8 +PcLhldrOItN/ZDyMm4gwDN9fS5diIqPDIFn6kbuDqa8nhczjirThxwa/NkWuNvbW1VLRLwM0WWL6MYID +xuZpwvYN7/ecVklOr6sSdt21gLH89PHfPqdCTb9HufsMAAD//yHvDFMpAwAA `, }, @@ -12551,14 +12487,17 @@ pn8AAAA= "/templates/htmlheader.html": { local: "templates/htmlheader.html", - size: 515, - modtime: 1503934576, + size: 1021, + modtime: 1504026676, compressed: ` -H4sIAAAJbogA/5xRvW7zMAzc8xSM5k/2160FrCxphi5tgWYpggyKTEdEZUm1aAdBkHevfxDARTt10vHu -eCLBYvn4st6+v27Acu1Wi2J6AAqLuhxAD2tkDcbqJiEr0XIl78Vc8rpGJTrCUwwNCzDBM/reeqKSrSqx -I4NyLP4BeWLSTiajHaq77P8vUSUm01BkCn6W9s1omaPEz5Y6JdbaWJTr3tcEN2t4DnKUbo2O/Ac06JTQ -MTqUHFpjJZnhF9tgpUSuU79jyqnWR0x5pbtBzaI/CuBz7EcblXwgfoQm229vWoa/J06RTOxwdblA9kaM -2XYo4XoFCSPXHm5MkU/WRbGUckcVOIanDTzsB2aHvqRqL+V4zvx2z+IQyvNETegrAAD//+z3Cy4DAgAA +H4sIAAAJbogA/6yTT2vcMBDF7/kUE5FjZNFDYVtsQ0gXmlMLSaEl7EErj1eTyn8qjR2WsN+9sp3sunFz +KT3Z1sz7PfmNlJ5/+nJ99+PrGixXLj9LpwdAalEXw0t8rZA1GKt9QM5Ex6VcCVDzomVuJf7qqM/Ed/nt +Sl43VauZtg4FmKZmrKPyZp1hsUMxV9a6wkz0hI9t43nW/EgF26zAngzK8eMSqCYm7WQw2mH27tUmJlSB +wXhqmZp6RvuLp+7YNn7W8/QEyS0xJnfEDuFwgKuiipaBvR5xz4xzKeGeSnCMcLOGFWw2OaSTKwRvMqF0 +iFEF1WNdNF49BEWohmTfB0t98hBEnqpJkKfn97GLyg1IeTKY8zd56qj+CR5dJgLvHQaLGLOyHsuFmQmD +2yqJzyGfI/5/0j+8TT+xdNs6lNx0xkoywzT+JFKldxhUqfuhmrT1TgDv2ziZsaKGhQU0xJGx6Rj+nTgh +eZhxvhy5hHGt276spGpqnXSx6HW9Q7igS7jo4WMWm4+hhdi/2PEi0siIysPh+e/iZ8xwUL7p8DneRfS3 +44E5ecxP3Il5PFiv4FGgXu50um2KfX72OwAA//9qqXRZ/QMAAA== `, }, diff --git a/assets/css/main.css b/assets/css/main.css index af00218..ad8868a 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -1,12 +1,6 @@ -@import url("font-awesome.min.css"); +@import url("../vendor/font-awesome/css/font-awesome.min.css"); @import url("https://fonts.googleapis.com/css?family=Raleway:400,400italic,700,800"); -/* - Highlights by HTML5 UP - html5up.net | @n33co - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - /* Reset */ html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, b, u, i, center, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td, article, aside, canvas, details, embed, figure, figcaption, footer, header, hgroup, menu, nav, output, ruby, section, summary, time, mark, audio, video { @@ -52,6 +46,29 @@ margin-left: 0.5em; } +/* Menu */ +#menu { + width: 8em; + position: absolute; + top: 0; + bottom: 0; + left: 0; + background-color: #000; +} + + #menu .menu-bottom { + position: absolute; + bottom: 0; + } + + #menu ul { + list-style: none; + } + +section.admin { + margin-top: 5em; +} + /* Box Model */ *, *:before, *:after { @@ -63,6 +80,9 @@ /* Containers */ .container { + background: rgba(255, 255, 255, 0.95); + margin-left: -17.5em; + padding: 2.5em; margin-left: auto; margin-right: auto; } @@ -1316,7 +1336,6 @@ html { background-color: #313a3d; background-attachment: fixed, fixed; - background-image: url("images/overlay.png"), url("images/bg.jpg"); background-position: top left, center center; background-repeat: repeat, none; background-size: auto, cover; @@ -1966,6 +1985,7 @@ padding: 0 1em; text-decoration: none; width: 100%; + margin-bottom: 1em; } input[type="text"]:invalid, @@ -2179,7 +2199,6 @@ } .image:before { - background: url("images/overlay.png"); content: ''; display: block; height: 100%; diff --git a/assets/js/main.js b/assets/js/main.js index fe65eb8..e69de29 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,219 +0,0 @@ -/* - Highlights by HTML5 UP - html5up.net | @n33co - Free for personal and commercial use under the CCA 3.0 license (html5up.net/license) -*/ - -(function($) { - - skel.breakpoints({ - large: '(max-width: 1680px)', - medium: '(max-width: 980px)', - small: '(max-width: 736px)', - xsmall: '(max-width: 480px)' - }); - - $(function() { - - var $window = $(window), - $body = $('body'), - $html = $('html'); - - // Disable animations/transitions until the page has loaded. - $html.addClass('is-loading'); - - $window.on('load', function() { - window.setTimeout(function() { - $html.removeClass('is-loading'); - }, 0); - }); - - // Touch mode. - if (skel.vars.mobile) { - - var $wrapper; - - // Create wrapper. - $body.wrapInner('
'); - $wrapper = $('#wrapper'); - - // Hack: iOS vh bug. - if (skel.vars.os == 'ios') - $wrapper - .css('margin-top', -25) - .css('padding-bottom', 25); - - // Pass scroll event to window. - $wrapper.on('scroll', function() { - $window.trigger('scroll'); - }); - - // Scrolly. - $window.on('load.hl_scrolly', function() { - - $('.scrolly').scrolly({ - speed: 1500, - parent: $wrapper, - pollOnce: true - }); - - $window.off('load.hl_scrolly'); - - }); - - // Enable touch mode. - $html.addClass('is-touch'); - - } - else { - - // Scrolly. - $('.scrolly').scrolly({ - speed: 1500 - }); - - } - - // Fix: Placeholder polyfill. - $('form').placeholder(); - - // Prioritize "important" elements on medium. - skel.on('+medium -medium', function() { - $.prioritize( - '.important\\28 medium\\29', - skel.breakpoint('medium').active - ); - }); - - // Header. - var $header = $('#header'), - $headerTitle = $header.find('header'), - $headerContainer = $header.find('.container'); - - // Make title fixed. - if (!skel.vars.mobile) { - - $window.on('load.hl_headerTitle', function() { - - skel.on('-medium !medium', function() { - - $headerTitle - .css('position', 'fixed') - .css('height', 'auto') - .css('top', '50%') - .css('left', '0') - .css('width', '100%') - .css('margin-top', ($headerTitle.outerHeight() / -2)); - - }); - - skel.on('+medium', function() { - - $headerTitle - .css('position', '') - .css('height', '') - .css('top', '') - .css('left', '') - .css('width', '') - .css('margin-top', ''); - - }); - - $window.off('load.hl_headerTitle'); - - }); - - } - - // Scrollex. - skel.on('-small !small', function() { - $header.scrollex({ - terminate: function() { - - $headerTitle.css('opacity', ''); - - }, - scroll: function(progress) { - - // Fade out title as user scrolls down. - if (progress > 0.5) - x = 1 - progress; - else - x = progress; - - $headerTitle.css('opacity', Math.max(0, Math.min(1, x * 2))); - - } - }); - }); - - skel.on('+small', function() { - - $header.unscrollex(); - - }); - - // Main sections. - $('.main').each(function() { - - var $this = $(this), - $primaryImg = $this.find('.image.primary > img'), - $bg, - options; - - // No primary image? Bail. - if ($primaryImg.length == 0) - return; - - // Hack: IE8 fallback. - if (skel.vars.IEVersion < 9) { - - $this - .css('background-image', 'url("' + $primaryImg.attr('src') + '")') - .css('-ms-behavior', 'url("css/ie/backgroundsize.min.htc")'); - - return; - - } - - // Create bg and append it to body. - $bg = $('
') - .css('background-image', ( - 'url("css/images/overlay.png"), url("' + $primaryImg.attr('src') + '")' - )) - .appendTo($body); - - // Scrollex. - options = { - mode: 'middle', - delay: 200, - top: '-10vh', - bottom: '-10vh' - }; - - if (skel.canUse('transition')) { - - options.init = function() { $bg.removeClass('active'); }; - options.enter = function() { $bg.addClass('active'); }; - options.leave = function() { $bg.removeClass('active'); }; - - } - else { - - $bg - .css('opacity', 1) - .hide(); - - options.init = function() { $bg.fadeOut(0); }; - options.enter = function() { $bg.fadeIn(400); }; - options.leave = function() { $bg.fadeOut(400); }; - - } - - $this.scrollex(options); - - }); - - }); - -})(jQuery); \ No newline at end of file diff --git a/assets/js/util.js b/assets/js/util.js index ecf7b37..8b13789 100644 --- a/assets/js/util.js +++ b/assets/js/util.js @@ -1,587 +1 @@ -(function($) { - /** - * Generate an indented list of links from a nav. Meant for use with panel(). - * @return {jQuery} jQuery object. - */ - $.fn.navList = function() { - - var $this = $(this); - $a = $this.find('a'), - b = []; - - $a.each(function() { - - var $this = $(this), - indent = Math.max(0, $this.parents('li').length - 1), - href = $this.attr('href'), - target = $this.attr('target'); - - b.push( - '' + - '' + - $this.text() + - '' - ); - - }); - - return b.join(''); - - }; - - /** - * Panel-ify an element. - * @param {object} userConfig User config. - * @return {jQuery} jQuery object. - */ - $.fn.panel = function(userConfig) { - - // No elements? - if (this.length == 0) - return $this; - - // Multiple elements? - if (this.length > 1) { - - for (var i=0; i < this.length; i++) - $(this[i]).panel(userConfig); - - return $this; - - } - - // Vars. - var $this = $(this), - $body = $('body'), - $window = $(window), - id = $this.attr('id'), - config; - - // Config. - config = $.extend({ - - // Delay. - delay: 0, - - // Hide panel on link click. - hideOnClick: false, - - // Hide panel on escape keypress. - hideOnEscape: false, - - // Hide panel on swipe. - hideOnSwipe: false, - - // Reset scroll position on hide. - resetScroll: false, - - // Reset forms on hide. - resetForms: false, - - // Side of viewport the panel will appear. - side: null, - - // Target element for "class". - target: $this, - - // Class to toggle. - visibleClass: 'visible' - - }, userConfig); - - // Expand "target" if it's not a jQuery object already. - if (typeof config.target != 'jQuery') - config.target = $(config.target); - - // Panel. - - // Methods. - $this._hide = function(event) { - - // Already hidden? Bail. - if (!config.target.hasClass(config.visibleClass)) - return; - - // If an event was provided, cancel it. - if (event) { - - event.preventDefault(); - event.stopPropagation(); - - } - - // Hide. - config.target.removeClass(config.visibleClass); - - // Post-hide stuff. - window.setTimeout(function() { - - // Reset scroll position. - if (config.resetScroll) - $this.scrollTop(0); - - // Reset forms. - if (config.resetForms) - $this.find('form').each(function() { - this.reset(); - }); - - }, config.delay); - - }; - - // Vendor fixes. - $this - .css('-ms-overflow-style', '-ms-autohiding-scrollbar') - .css('-webkit-overflow-scrolling', 'touch'); - - // Hide on click. - if (config.hideOnClick) { - - $this.find('a') - .css('-webkit-tap-highlight-color', 'rgba(0,0,0,0)'); - - $this - .on('click', 'a', function(event) { - - var $a = $(this), - href = $a.attr('href'), - target = $a.attr('target'); - - if (!href || href == '#' || href == '' || href == '#' + id) - return; - - // Cancel original event. - event.preventDefault(); - event.stopPropagation(); - - // Hide panel. - $this._hide(); - - // Redirect to href. - window.setTimeout(function() { - - if (target == '_blank') - window.open(href); - else - window.location.href = href; - - }, config.delay + 10); - - }); - - } - - // Event: Touch stuff. - $this.on('touchstart', function(event) { - - $this.touchPosX = event.originalEvent.touches[0].pageX; - $this.touchPosY = event.originalEvent.touches[0].pageY; - - }) - - $this.on('touchmove', function(event) { - - if ($this.touchPosX === null - || $this.touchPosY === null) - return; - - var diffX = $this.touchPosX - event.originalEvent.touches[0].pageX, - diffY = $this.touchPosY - event.originalEvent.touches[0].pageY, - th = $this.outerHeight(), - ts = ($this.get(0).scrollHeight - $this.scrollTop()); - - // Hide on swipe? - if (config.hideOnSwipe) { - - var result = false, - boundary = 20, - delta = 50; - - switch (config.side) { - - case 'left': - result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX > delta); - break; - - case 'right': - result = (diffY < boundary && diffY > (-1 * boundary)) && (diffX < (-1 * delta)); - break; - - case 'top': - result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY > delta); - break; - - case 'bottom': - result = (diffX < boundary && diffX > (-1 * boundary)) && (diffY < (-1 * delta)); - break; - - default: - break; - - } - - if (result) { - - $this.touchPosX = null; - $this.touchPosY = null; - $this._hide(); - - return false; - - } - - } - - // Prevent vertical scrolling past the top or bottom. - if (($this.scrollTop() < 0 && diffY < 0) - || (ts > (th - 2) && ts < (th + 2) && diffY > 0)) { - - event.preventDefault(); - event.stopPropagation(); - - } - - }); - - // Event: Prevent certain events inside the panel from bubbling. - $this.on('click touchend touchstart touchmove', function(event) { - event.stopPropagation(); - }); - - // Event: Hide panel if a child anchor tag pointing to its ID is clicked. - $this.on('click', 'a[href="#' + id + '"]', function(event) { - - event.preventDefault(); - event.stopPropagation(); - - config.target.removeClass(config.visibleClass); - - }); - - // Body. - - // Event: Hide panel on body click/tap. - $body.on('click touchend', function(event) { - $this._hide(event); - }); - - // Event: Toggle. - $body.on('click', 'a[href="#' + id + '"]', function(event) { - - event.preventDefault(); - event.stopPropagation(); - - config.target.toggleClass(config.visibleClass); - - }); - - // Window. - - // Event: Hide on ESC. - if (config.hideOnEscape) - $window.on('keydown', function(event) { - - if (event.keyCode == 27) - $this._hide(event); - - }); - - return $this; - - }; - - /** - * Apply "placeholder" attribute polyfill to one or more forms. - * @return {jQuery} jQuery object. - */ - $.fn.placeholder = function() { - - // Browser natively supports placeholders? Bail. - if (typeof (document.createElement('input')).placeholder != 'undefined') - return $(this); - - // No elements? - if (this.length == 0) - return $this; - - // Multiple elements? - if (this.length > 1) { - - for (var i=0; i < this.length; i++) - $(this[i]).placeholder(); - - return $this; - - } - - // Vars. - var $this = $(this); - - // Text, TextArea. - $this.find('input[type=text],textarea') - .each(function() { - - var i = $(this); - - if (i.val() == '' - || i.val() == i.attr('placeholder')) - i - .addClass('polyfill-placeholder') - .val(i.attr('placeholder')); - - }) - .on('blur', function() { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - return; - - if (i.val() == '') - i - .addClass('polyfill-placeholder') - .val(i.attr('placeholder')); - - }) - .on('focus', function() { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - return; - - if (i.val() == i.attr('placeholder')) - i - .removeClass('polyfill-placeholder') - .val(''); - - }); - - // Password. - $this.find('input[type=password]') - .each(function() { - - var i = $(this); - var x = $( - $('
') - .append(i.clone()) - .remove() - .html() - .replace(/type="password"/i, 'type="text"') - .replace(/type=password/i, 'type=text') - ); - - if (i.attr('id') != '') - x.attr('id', i.attr('id') + '-polyfill-field'); - - if (i.attr('name') != '') - x.attr('name', i.attr('name') + '-polyfill-field'); - - x.addClass('polyfill-placeholder') - .val(x.attr('placeholder')).insertAfter(i); - - if (i.val() == '') - i.hide(); - else - x.hide(); - - i - .on('blur', function(event) { - - event.preventDefault(); - - var x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); - - if (i.val() == '') { - - i.hide(); - x.show(); - - } - - }); - - x - .on('focus', function(event) { - - event.preventDefault(); - - var i = x.parent().find('input[name=' + x.attr('name').replace('-polyfill-field', '') + ']'); - - x.hide(); - - i - .show() - .focus(); - - }) - .on('keypress', function(event) { - - event.preventDefault(); - x.val(''); - - }); - - }); - - // Events. - $this - .on('submit', function() { - - $this.find('input[type=text],input[type=password],textarea') - .each(function(event) { - - var i = $(this); - - if (i.attr('name').match(/-polyfill-field$/)) - i.attr('name', ''); - - if (i.val() == i.attr('placeholder')) { - - i.removeClass('polyfill-placeholder'); - i.val(''); - - } - - }); - - }) - .on('reset', function(event) { - - event.preventDefault(); - - $this.find('select') - .val($('option:first').val()); - - $this.find('input,textarea') - .each(function() { - - var i = $(this), - x; - - i.removeClass('polyfill-placeholder'); - - switch (this.type) { - - case 'submit': - case 'reset': - break; - - case 'password': - i.val(i.attr('defaultValue')); - - x = i.parent().find('input[name=' + i.attr('name') + '-polyfill-field]'); - - if (i.val() == '') { - i.hide(); - x.show(); - } - else { - i.show(); - x.hide(); - } - - break; - - case 'checkbox': - case 'radio': - i.attr('checked', i.attr('defaultValue')); - break; - - case 'text': - case 'textarea': - i.val(i.attr('defaultValue')); - - if (i.val() == '') { - i.addClass('polyfill-placeholder'); - i.val(i.attr('placeholder')); - } - - break; - - default: - i.val(i.attr('defaultValue')); - break; - - } - }); - - }); - - return $this; - - }; - - /** - * Moves elements to/from the first positions of their respective parents. - * @param {jQuery} $elements Elements (or selector) to move. - * @param {bool} condition If true, moves elements to the top. Otherwise, moves elements back to their original locations. - */ - $.prioritize = function($elements, condition) { - - var key = '__prioritize'; - - // Expand $elements if it's not already a jQuery object. - if (typeof $elements != 'jQuery') - $elements = $($elements); - - // Step through elements. - $elements.each(function() { - - var $e = $(this), $p, - $parent = $e.parent(); - - // No parent? Bail. - if ($parent.length == 0) - return; - - // Not moved? Move it. - if (!$e.data(key)) { - - // Condition is false? Bail. - if (!condition) - return; - - // Get placeholder (which will serve as our point of reference for when this element needs to move back). - $p = $e.prev(); - - // Couldn't find anything? Means this element's already at the top, so bail. - if ($p.length == 0) - return; - - // Move element to top of parent. - $e.prependTo($parent); - - // Mark element as moved. - $e.data(key, $p); - - } - - // Moved already? - else { - - // Condition is true? Bail. - if (condition) - return; - - $p = $e.data(key); - - // Move element back to its original location (using our placeholder). - $e.insertAfter($p); - - // Unmark element as moved. - $e.removeData(key); - - } - - }); - - }; - -})(jQuery); \ No newline at end of file diff --git a/main.go b/main.go index de06344..2176280 100644 --- a/main.go +++ b/main.go @@ -15,7 +15,9 @@ import ( "golang.org/x/crypto/ssh/terminal" "github.com/gorilla/handlers" + "github.com/gorilla/mux" "github.com/gorilla/sessions" + "github.com/justinas/alice" ) const AppName = "gosscms" @@ -57,6 +59,7 @@ type Routes map[string]http.HandlerFunc var sessionSecret = "JCOP5e8ohkTcOzcSMe74" var sessionStore = sessions.NewCookieStore([]byte(sessionSecret)) var site *siteData +var r *mux.Router func main() { loadConfig() @@ -67,36 +70,26 @@ func main() { fmt.Println("Operating in Development Mode") } - routes := Routes{ - "/": PublicHandler, - "/admin": AdminHandler, - "/admin/assets": AdminAssetHandler, - } - mux := http.DefaultServeMux - loggingHandler := NewApacheLoggingHandler(mux, os.Stderr) - for route, fn := range routes { - mux.Handle(route, fn) - } + r = mux.NewRouter() + r.StrictSlash(true) - // Admin Subrouter - /* - admin := r.PathPrefix("/admin").Subrouter() - admin.Handle("/assets", http.FileServer(FS(site.DevMode))) - admin.HandleFunc("/", handleAdmin) - admin.HandleFunc("/dologin", handleAdminDoLogin) - admin.HandleFunc("/dologout", handleAdminDoLogout) - admin.HandleFunc("/{category}", handleAdmin) - admin.HandleFunc("/{category}/{id}", handleAdmin) - admin.HandleFunc("/{category}/{id}/{function}", handleAdmin) - admin.HandleFunc("/{category}/{id}/{function}/{subid}", handleAdmin) + r.PathPrefix("/admin/assets").Handler(http.StripPrefix("/admin/", http.FileServer(FS(site.DevMode)))) + admin := r.PathPrefix("/admin").Subrouter() + admin.HandleFunc("/", handleAdmin) + admin.HandleFunc("/dologin", handleAdminDoLogin) + admin.HandleFunc("/dologout", handleAdminDoLogout) + admin.HandleFunc("/{category}", handleAdmin) + admin.HandleFunc("/{category}/{id}", handleAdmin) + admin.HandleFunc("/{category}/{id}/{function}", handleAdmin) - http.Handle("/", r) + r.PathPrefix("/").Handler(http.FileServer(http.Dir("public"))) - */ - server := &http.Server{Addr: "127.0.0.1:" + strconv.Itoa(site.Port), Handler: loggingHandler} + http.Handle("/", r) + + chain := alice.New(loggingHandler).Then(r) fmt.Printf("Listening on port %d\n", site.Port) - log.Fatal(server.ListenAndServe()) + log.Fatal(http.ListenAndServe("127.0.0.1:"+strconv.Itoa(site.Port), chain)) } func PublicHandler(w http.ResponseWriter, r *http.Request) { @@ -240,7 +233,6 @@ func redirect(url string, w http.ResponseWriter, req *http.Request) { // outputTemplate // Spit out a template func outputTemplate(tmplName string, tmplData interface{}, w http.ResponseWriter) error { - fmt.Println(tmplName) n := "/templates/" + tmplName l := template.Must(template.New("layout").Parse(FSMustString(site.DevMode, n))) t := template.Must(l.Parse(FSMustString(site.DevMode, n))) diff --git a/templates/admin-adduser.html b/templates/admin-adduser.html new file mode 100644 index 0000000..7b996f2 --- /dev/null +++ b/templates/admin-adduser.html @@ -0,0 +1,24 @@ +
+
+
+
+
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+
+
diff --git a/templates/admin-edituser.html b/templates/admin-edituser.html index 13fcdd1..edc66cb 100644 --- a/templates/admin-edituser.html +++ b/templates/admin-edituser.html @@ -1,24 +1,29 @@ -
-
-
-
- {{ .TemplateData }} -
+
+
+ +
+
+ {{ .TemplateData }} +
-
- - -
+
+ + +
-
- Cancel - - -
-
- -
+
+ + +
+
+ +
+ + {{ end }} -