Working on CMS

This commit is contained in:
Brian Buller 2017-08-29 14:33:09 -05:00
parent e7457819b5
commit 8d6c4add54
13 changed files with 363 additions and 1177 deletions

View File

@ -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"})

View File

@ -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" {

449
assets.go
View File

@ -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: `
H4sIAAAJbogA/9Qaa28ct/Hz+VfQqpDdjaWVEqAooGcd2U0C1I1bK6kFQwh4u7w7RnvLxZKnOzW+/94Z
vpb7uIcNo0Ff1h7JGc57hkPGk0WZKS7K+DAhvz97Njr5+utnI/I1+Z6VrKaKEVoSXuasVCwnBZeKiAn8
LR8kmdRiTigp6WNK3jBaKjIRNVlIRpZczUhFS1bESarR/bVmalGX5Pff/rlg9dOamL9EjH9jmdJrTp6N
DtNJmQK+v+M+l8TTZkgbPdJ6dKhmXMLcYYwfyTkMjw4pDuDvdAK0xhGNkiOcGMP4h/tzhD2kKaPZLO7i
HEKqYUeGaxh9Q9UsndNVfHpkd6loDVMyjgoeJWnByinwe0y+sZCzmk08RVSpOo5wyBI1UrSeMtVZYAaj
RBM7GqfVQs5ivTy6oCQiL/T3KMoKKuXlAWqA5KxSs2OYsxqCj+jAL41JrJ4qBuqyGz6/vCTRAlaCkFge
ka++amZIFCXkGvYxI5eIxs0arGd6SQ+35nUAsx33ePG3wapn+jijq4bJCwnGQyyrhrcum1cXJ7ioATLC
VGylYo/y4oReRfhpxLo2f6wpjtPfBC/jyMh8fR4Y/1s03WM+eULrZwWbw67WjkH1dE5+N3a7Rmuvb0Q5
4VPyM3ySTH9/ss1rXwktvsFr7fTkhPxDOFrkNTLFJ0TbqzNAUMJpohm3G2uRnFvoN4tC8apg23FcgRFb
xxihN8fgHoRfnp4TTi5IsBIGXrxIrOg1ig/8PjGMhNQbe+5TNFpbun6htUy3OuLhWORPejDCL+dGh0sw
B7HUE+bTOW7e8S2eOxijHieSG6csN4FwKVgQgyBihQDLXrGCPqWG1Ry/z8jpkZ/9gefMxDoiSh0ZwXB5
9mABZjD9U3mDI2dkQgvJNoEymdGKkQf2VNVMyhb8az23A4Fc8oq1wN7hSA/qX0yCV8usFkVBKiE5Whwi
QCALX+Oad3rJBniwjrkcgvobTvSA3iGpEC8eOVtWolZgS470JQc6aFUxWls8EhafkXJRFA2CWxOMrPXq
VHOgI8SBBTLR6sxovoG7wTVECfjfdFo4Sh+55OOC6UmIQvZnZCzziPQMGBC9XgG5OTkw+xwQcB2uIklK
oSALtnyb0KJmNLdGo33MREsbHoKwa+Ai60ntebTs1kjiLFcHqNRR9oapmcitxRjD/xW1EgYU9ghS866N
UC8Njag/iKrX5DvKCysdTfLz1tbpjEotLUdRKMHEku/8/LzZ5ceJjqG4O1lSSapaPAJp+RHJaJmB9rkK
N+2QORrpgRQ8Av++YhMKYSw2ab+ZlkpUb2tR0Sk1ud0RYKJM4yxuqzZrNZuLR7aZu4Cdt0KqYy1bqRaT
icNn4k8K1n/L50wsVL/O2OZ8Do2RgSUhcEEvXqdeA38rqvi04bXjm5uRag/t4TSlE4JCTdOvlfzqkV6t
EQWK8Nl1ZDzI7qfjpZtYe1/6BSIsOPCEr1hotgY8zUAP0fFcHoNW6kkhlsdSPYF3HhE9ShdKgAp4OT02
chjT2jmQhV2y8QNXAbxeBxCIQ4lFNosax9ZRVJRh2A4kFgTwRpWdYtOy3d5c0QosZTor4P/qOBOFqHH3
ejqmUEnq/yaRl1nA/ygFkUeaGgSg8M8mN9ZZk5j6N0yZ+B9XhdKBElSr0QcZOliDOjk814g+fjSFG1Z6
f4paP6PuJBRqeWNe7ZBgYrJxfVHzKS9pYcJDY687fH6n07dTY4M3CI1x121yXmPghjyBnDQwe3q2jfJW
pCCGX8cFLR+iwMscKlGxMsZNQudhkCz7SwuRad5Sq0v809DddTOQ+zdBOPD+uPYZDOV2Rm7R/sP4ZeSC
RqddQwIbaovR2Uobl0I4fA90GYU4deptzDyTH07voSicsvfnQ8B3+wHfOU6SZ0MEY/TeQi9qpkcz6Ajr
C7Pi48c+XXaBU2DbirFWzflk8t5Xmg3q473E4fwQsdz1sNzth+XOYcHq36IAE2X1DwyDTuy9XWFRbYUA
FgpZw6YQsxB26+aVJMx6LkLqCvM6SNetGKmrzW5sgjwB3ouViKkHne2OBZwXaY11/benzTAYssJo9ufT
xs5hVwUG6zbD4rDlehmVjEQFm6jorPEhv3FsRHxB/JZwPDVjVyQ+/gZOam4mSXAuNpq9IpqY0EvHUDE9
nHd3rlGEX3TrCztpCNhNAUTCzfu/H9j//bb97/ZnfSyUEvMvuvf+vOcmM5xtXLFu5TFDWcty+pEMXf58
w/zdhvleQnGnXW3yA+QERelbk+QIFCqKZ5AKfaUCyUuaUxJoF1IlMbIOi+W457QgvdPGxi5cPwAjHGQn
iZLXnapvtcRh4EIPvLADTvunyZcvwdfBScrkIcd7BrxTbg8JkvASPTw4H+o+43gxHqNYuhlLl0nExEU4
nTUJjGxPDdtJHyY4OG6D+CnJZrzI4XiTzUA9ioLKBC8V6g7KCA6s/PiKcGnqSpYPUq4LvA+mOWYrJ93e
ut+Sz7bqY4c2Puvgs/bnzu8EHmo3SgVShO7VaNZOoAC2POPggLY2KyZ0LDOzSSe3wam+s88fK1vTbvgE
2f7b1HxD0gW5vn53s+FoYnpDrhXnikwQwgN7gs9y2/HBH7lTWHwjsGUA+fgvvmod0oOZa/dSfV+v1UZ9
WVXFEzmoCpqxmShyVh8QPGnwMdQo4CzF0wRbP+AsomQY4uaiZv7w+okd1GaTgZsDNN1aLLFDW4LWHhnQ
JRcVNqIkCUBl0AYJ2jZxLrKFbgJnkGEUe22aUHHEy2oBB6aktf3zVjO83ZF1txbP/n86ug1n8ad1c0nv
rsasuWUrdaT/fQnS1KvD87SW6QeU/CV28++P8F8KK60oN9zjmC15ZzsrEJ4+0gKW6uOqq/kJCYa5PQMH
7Ea+rcWdP6Q0z41LR858j1sQfiEiHsbZnGX0QvTUcbGoQzfdkyeDvaRzFiXpnEKRHJ8ce7omnBX54Uky
fILpSeV/xesEXEn+sczuqeswO+4jgijqB/W3ALwUdb7Nyiu75v6TDdyPrvRoU5fG0UXOH6/C9kOKHXbY
madZAeE2TsI5w2ocDs3UvIjbazTr8Ykm+sBRfXDCsaemx9BTD6LNQA6mAUEIBzCocLy7sfeIFu2qmTki
rWWQ3DsWEW0xomGseq7Ba5duw7za11G0kawGbS+Foheq4JcTOLvHfHPo8kaaujOH/hl0j1Zp+zTizHkw
zuzdbXfzzta4vQKPk5Y5o7QudaW1S3z33S5jm83wkNbhVfMoZ2IZ0rXuNb1Gq5DxXtD5LM7R91Y7OF+1
A5Wz/575HJmrbxK1JNHVXhCORpbp5rdmKjxoJSHL7h7xs7j25LTjWthU9CFOF6qyCXBNqJeL8Zyr4Vi/
NeMPBcduGdCLk4Ot8YF08nkJBe2wFSGiLRY8nGDaRr1HdjkPlncVMWDyYZbV1zOfcc7pK0dCdZmpdhCD
/CIqRHs24bWEScP6ILzW5U7lbdFb0xxcBQLfT35uuWshmn7OUzXUQLTWetYZNpLc3GSyy5ydhit5qzKy
7apfaLFgTWlkGPviIXVDUB0FtHWjahhX/dC6+cQk00HRWx4EsADFLtllM5Y9jMWqL3uac9GWqBGChmBh
AdCT7o49deHR3c9b6ecocafAd5UJ563V24rqvWTbb4/uYGUTpvWG2L/17P8GnFP6kymc8U90Gw+7ejpm
+Ltvia9CYJjru4IKYg0cz4l9Ydd+dOW6AIce7Wv3EcPJ1kQqUSfYUcDg0IYeC1Gs8cIsNw9efoRt6wU7
0ktbpLqua0p+gq96yWV/1ZjqRpal3N9kuhs72TQnqprDtOL/ab3H8DwcNSQ1zxzxFRDBW8RfG+jIJ1zz
EKWRQuslin3VQXu9klZHowHuPUJppjAE+18+379TrAK2a7GYzrw8TPr3vzYEd/3EiwWhnRxWNrwfGo3j
HPOR0Nqb6ZSYwdY7FX2zZ8b7LZPOIVAjUVqN+bU2z+bpib7mhn1zqmgMog9ztXknZm2GS9PUb7+W8c9l
rBq9J3WuvgHV90yF/SYSL2ccEpN+AgUnACCKgkMsatNKRteo2YQBg5lujJHljJW6aeMfQpWM5dJZvDbL
xNN1WFl5Qp7v3HjfiEWRl5EimGwILZ8AaTm91g95ZWsHMCxvVP5C4ohIAZsFMrDKGNLDoCS0BhwT+nlW
hexabXoONPF4cL0VTtVJCw2tHzwakJ3WbwjudIq21nQvvU0gGblj8Lo5Tm02AAwaA/rfrX6nDW9lG8Xh
ggveIfRCC4kXEu8YtJU0ppSETIfHyYBt3Ojncr5LZKa0etUl0wht7Z/LrpPYBI7k/L8BAAD//3lkblNH
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==
`,
},

View File

@ -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%;

View File

@ -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('<div id="wrapper" />');
$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 = $('<div class="main-bg" id="' + $this.attr('id') + '-bg"></div>')
.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);

View File

@ -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(
'<a ' +
'class="link depth-' + indent + '"' +
( (typeof target !== 'undefined' && target != '') ? ' target="' + target + '"' : '') +
( (typeof href !== 'undefined' && href != '') ? ' href="' + href + '"' : '') +
'>' +
'<span class="indent-' + indent + '"></span>' +
$this.text() +
'</a>'
);
});
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 = $(
$('<div>')
.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);

44
main.go
View File

@ -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)))

View File

@ -0,0 +1,24 @@
<section class="admin">
<div class="container">
<form class="pure-form pure-form-aligned" action="/admin/users/new/save" method="POST">
<fieldset>
<div class="pure-control-group">
<label for="email">Email Address</label>
<input id="email" name="email" type="text" placeholder="Email Address" value="" autofocus>
</div>
<div class="pure-control-group">
<label for="password">Password</label>
<input id="password" name="password" type="password" placeholder="Password">
</div>
<div class="pure-control-group">
<label for="password_rpt">Repeat Password</label>
<input id="password_rpt" name="password_rpt" type="password" placeholder="Repeat Password">
</div>
<button type="submit" class="pure-button pure-button-primary">Add User</button>
</fieldset>
</form>
</div>
</section>

View File

@ -1,24 +1,29 @@
<div class="center">
<form class="gosscms-form gosscms-form-aligned" action="/admin/users/{{ .TemplateData }}/save" method="POST">
<fieldset>
<div class="gosscms-control-group">
<span>{{ .TemplateData }}</span>
</div>
<section class="admin">
<div class="main container">
<form class="gosscms-form gosscms-form-aligned" action="/admin/users/{{ .TemplateData }}/save" method="POST">
<fieldset>
<div class="gosscms-control-group">
<span>{{ .TemplateData }}</span>
</div>
<div class="gosscms-control-group">
<label class="control-label" for="password">Password</label>
<input id="password" name="password" type="password" placeholder="Password">
</div>
<div class="gosscms-control-group">
<label class="control-label" for="password">Password</label>
<input id="password" name="password" type="password" placeholder="Password">
</div>
<div class="gosscms-control-group">
<a href="/admin/users" class="pull-left space gosscms-button gosscms-button-plain">Cancel</a>
<button type="submit" class="pull-right space gosscms-button gosscms-button-primary">Update</button>
<button type="button" id="btnDeleteUser" class="pull-right space gosscms-button gosscms-button-error">Delete</button>
</div>
</fieldset>
</form>
</div>
<div class="gosscms-control-group">
<button id="btnCancel"href="/admin/users" class="pull-left space button">Cancel</a>
<button type="submit" class="pull-right space">Update</button>
<button type="button" id="btnDeleteUser" class="pull-right space">Delete</button>
</div>
</fieldset>
</form>
</div>
</section>
<script>
document.getElementById('btnCancel').onClick = function(e) {
window.location = "/admin/users";
}
document.getElementById('btnDeleteUser').onClick = function(e) {
console.log(e);
}

View File

@ -1,22 +1,24 @@
<div class="center">
<form class="gosscms-form gosscms-form-aligned" action="/admin/dologin" method="POST">
<fieldset>
<div class="gosscms-control-group">
<label for="email">Email Address</label>
<input id="email" name="email" type="text" placeholder="Email Address" autofocus>
</div>
<section class="admin">
<div class="container">
<form class="gosscms-form gosscms-form-aligned" action="/admin/dologin" method="POST">
<fieldset>
<div class="gosscms-control-group">
<label for="email">Email Address</label>
<input id="email" name="email" type="text" placeholder="Email Address" autofocus>
</div>
<div class="gosscms-control-group">
<label for="password">Password</label>
<input id="password" name="password" type="password" placeholder="Password">
</div>
<div class="gosscms-control-group">
<label for="password">Password</label>
<input id="password" name="password" type="password" placeholder="Password">
</div>
<div class="gosscms-controls">
<label for="remember" class="gosscms-checkbox">
<input id="remember" name="remember" type="checkbox"> Remember Me
</label>
<div class="gosscms-controls">
<label for="remember" class="gosscms-checkbox">
<input id="remember" name="remember" type="checkbox"> Remember Me
</label>
</div>
<button type="submit" class="gosscms-button gosscms-button-primary">Submit</button>
</fieldset>
</form>
</div>
<button type="submit" class="gosscms-button gosscms-button-primary">Submit</button>
</fieldset>
</form>
</div>
</section>

View File

@ -1,10 +1,12 @@
<div class="content">
<div>
<h3>Admin Sections</h3>
<button id="btnPhotos" class="gosscms-button">Photo Galleries</button>
<button id="btnNews" class="gosscms-button">News</button>
<section class="admin">
<div class="container">
<div>
<h3>Admin Sections</h3>
<a id="btnPhotos" class="button" href="/admin/photos">Photo Galleries</a>
<a id="btnNews" class="button" href="/admin/news">News</a>
</div>
</div>
</div>
</section>
<script>
document.getElementById('btnPhotos').onClick = function() {
console.log("Go to photo management");

View File

@ -1,22 +1,26 @@
<div class="bottom-space center">
<a id="btnAddUser" class="gosscms-button gosscms-button-success" href="/admin/users/new"><i class="fa fa-plus"></i> Add User</a>
</div>
<table id="users-table" class="sortable gosscms-table gosscms-table-bordered center">
<thead>
<tr>
<th>Email</th>
<th></th>
</tr>
</thead>
<tbody>
{{ range $i, $v := .TemplateData.Users }}
<tr>
<td>{{ $v }}</td>
<td>
<a href="/admin/users/{{ $v }}/edit" class="gosscms-button gosscms-button-plain"><i class="fa fa-pencil"></i></a>
<a href="/admin/users/{{ $v }}/delete" class="gosscms-button gosscms-button-plain"><i class="fa fa-trash"></i></a>
</td>
</tr>
{{ end }}
</tbody>
</table>
<section class="admin">
<div class="container">
<div class="bottom-space pull-right">
<a id="btnAddUser" class="button" href="/admin/users/new"><i class="fa fa-plus"></i> Add User</a>
</div>
<table id="users-table" class="sortable gosscms-table gosscms-table-bordered center">
<thead>
<tr>
<th>Email</th>
<th></th>
</tr>
</thead>
<tbody>
{{ range $i, $v := .TemplateData.Users }}
<tr>
<td>{{ $v }}</td>
<td>
<a href="/admin/users/{{ $v }}/edit" class="button"><i class="fa fa-pencil"></i></a>
<a href="/admin/users/{{ $v }}/delete" class="button"><i class="fa fa-trash"></i></a>
</td>
</tr>
{{ end }}
</tbody>
</table>
</div>
</section>

View File

@ -1,16 +1,25 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="">
<meta http-equiv="Cache-Control" content="No-Cache">
<meta name="author" content="{{ .Site.Title }} Administration">
<!-- [if lte IE 8 ]]> <script src="/assets/vendor/js/ie/html5shiv.js"></script><![endif] -->
<!--[if lte IE 8]><link rel="stylesheet" href="/assets/vendor/css/ie8.css" /><![endif]-->
<!--[if lte IE 8]><link rel="stylesheet" href="/assets/vendor/css/ie9.css" /><![endif]-->
<link rel="apple-touch-icon" href="/assets/images/favicon.png" type="image/png">
<link rel="shortcut icon" href="/assets/images/favicon.png" type="image/png">
<title>{{ .Site.Title }} - {{ .SubTitle }}</title>
<!--[if lt IE 9]>
<![endif]-->
{{ range $i, $v := .Stylesheets }}
<link rel="stylesheet" href="{{ $v }}">
{{ end }}
{{ range $i, $v := .HeaderScripts }}
<script src="{{ $v }}"></script>
{{ end }}
</head>
<body>
</body>