Add image request calls

This commit is contained in:
Brian Buller 2017-07-14 07:28:09 -05:00
parent e138d56c5e
commit 1c08032627
12 changed files with 251 additions and 178 deletions

View File

@ -1,8 +1,10 @@
package main package main
import ( import (
"fmt"
"io/ioutil" "io/ioutil"
"net/http" "net/http"
"strings"
"encoding/base64" "encoding/base64"
@ -52,11 +54,21 @@ func handleAdminGames(w http.ResponseWriter, req *http.Request, page *pageData)
} }
func saveScreenshots(teamId string, req *http.Request) error { func saveScreenshots(teamId string, req *http.Request) error {
file, _, err := req.FormFile("newssfile") var err error
file, hdr, err := req.FormFile("newssfile")
if err != nil { if err != nil {
return err return err
} }
data, err := ioutil.ReadAll(file) fmt.Println("File Received: " + hdr.Filename)
extIdx := strings.LastIndex(hdr.Filename, ".")
fltp := "png"
if len(hdr.Filename) > extIdx {
fltp = hdr.Filename[extIdx+1:]
}
data, _ := ioutil.ReadAll(file)
str := base64.StdEncoding.EncodeToString(data) str := base64.StdEncoding.EncodeToString(data)
return dbSaveTeamGameScreenshot(teamId, &Screenshot{Image: str}) return dbSaveTeamGameScreenshot(teamId, &Screenshot{
Image: str,
Filetype: fltp,
})
} }

257
assets.go
View File

@ -202,8 +202,8 @@ Y8Pj6dAeZ3gBzLZbhMnSW8r0f78+9y+zlDVuQ3ZNXD8zD+/mGzZjDfK53gEAAP//D/6XxHkAAAA=
"/assets/css/gjvote.css": { "/assets/css/gjvote.css": {
local: "assets/css/gjvote.css", local: "assets/css/gjvote.css",
size: 4044, size: 4090,
modtime: 1499645867, modtime: 1499955435,
compressed: ` compressed: `
H4sIAAAAAAAA/6xX7WrcOhP+n6sQLIUWXhk7zTZZB8oLaXIDvQLZ0tpDZMlI8u4mh9z7QR/2WracHg4H H4sIAAAAAAAA/6xX7WrcOhP+n6sQLIUWXhk7zTZZB8oLaXIDvQLZ0tpDZMlI8u4mh9z7QR/2WracHg4H
8iOWZkbPzDzzsa3pOPrrBqEOBG4ZNK0pUZHnXx5vPm5uKknf3G0tuVQl2t3f3z9uCRMnadjFYMpqqYgB 8iOWZkbPzDzzsa3pOPrrBqEOBG4ZNK0pUZHnXx5vPm5uKknf3G0tuVQl2t3f3z9uCRMnadjFYMpqqYgB
@ -222,9 +222,9 @@ CTMNrbiBeD6kRD6SD3RAaZjbi2EYdz5PXFxEj/nDdThSD3GydsTqf+5HSuLfIIoglRS0TS/dylGY9uPn
4XAInVBSwt1I5cTvTifQUAEH81aiFihlYrsDhwVs1oDD/xtjf/xOl8g7BkHZxYnl6d6mmop8zf+Hwl+2 4XAInVBSwt1I5cTvTifQUAEH81aiFihlYrsDhwVs1oDD/xtjf/xOl8g7BkHZxYnl6d6mmop8zf+Hwl+2
/5Zw4yeFU7waRWEOnTfUWzJajr/JrWlEFhNrnJ6rrXejYCmcdqyroGmYYPR3rRgTv9tQl+NK1UsYI7MF /5Zw4yeFU7waRWEOnTfUWzJajr/JrWlEFhNrnJ6rrXejYCmcdqyroGmYYPR3rRgTv9tQl+NK1UsYI7MF
MQyk48C5dkaWA+ZLIhl/Xh7itCZzNW9aUyTHBBZ5Xjhw/+8YBYK+2uU/oLjLWffNwbwuievdYe3EHPcR MQyk48C5dkaWA+ZLIhl/Xh7itCZzNW9aUyTHBBZ5Xjhw/+8YBYK+2uU/oLjLWffNwbwuievdYe3EHPcR
Lsytyh83k53V2pRYI1bi07RdKIAAA4Q/RtgCEGdktfykXEgAXsTWEskPu3Dgjc9+6Sx6w2TdCRI7jLMj Lsytyh83k53V2pRYI1bi07RdKIAAA4Q/RtgCEGdktfykXEgAXsTWEskPu3Dgjc9+6Sx6w2TdCbrcc6Lb
J7oNwrMBeXuXlsyuvfwP3Tzq56EkVtb0UNdM6217t7cHcjx8ai/65bjt8ZVQgexEUPS1I5fAre97u5B/ IDobj7d3n6KYZzvt4WQ7u/b+P3T/qP+HElrY0kNdM623rd3eHsjx8Km16Hfmdnyu9AulQQRFXztyCUz8
C5vTyfdHa1pJji2qHnFSMZ6NZ+4rPLpeDv7Jkz/u7IP+cMbxh/8ext8BAAD//w7sG7XMDwAA vrfr+7ewZ518N7WmleTYouoRJxXj2XjmvsKj61Xinzz5484+6A9nFfHw38P4OwAA///cV+Jj+g8AAA==
`, `,
}, },
@ -310,35 +310,36 @@ GwM5xLYdRhVY/PPdX2X8mMmnqO5/AdOTL+cjjP0hAAAAAElFTkSuQmCCAQAA//+FC1PpvxAAAA==
"/assets/js/admin.js": { "/assets/js/admin.js": {
local: "assets/js/admin.js", local: "assets/js/admin.js",
size: 34, size: 0,
modtime: 1494731526, modtime: 1499949720,
compressed: ` compressed: `
H4sIAAAAAAAA/0rOzyvOz0nVy8lP11DydA5RcE/MTfVKzFVwTMnNzFPStOYCBAAA//8imS6KIgAAAA== H4sIAAAAAAAA/wEAAP//AAAAAAAAAAA=
`, `,
}, },
"/assets/js/gjvote.js": { "/assets/js/gjvote.js": {
local: "assets/js/gjvote.js", local: "assets/js/gjvote.js",
size: 3469, size: 3561,
modtime: 1499644439, modtime: 1499955342,
compressed: ` compressed: `
H4sIAAAAAAAA/6xWT2/jthO9+1MMvAdJSCLIP+CHAlG1i3a7RQsk2wKbW9EDLY4kwhTpipSzQtbfvSD1 H4sIAAAAAAAA/6xXTW/jNhO++1fM6z1QQhJBeYGiQFztYrvdogWS3QLJLciBJkcyG5pURcpZIZv/XpD6
x5JM2UnbPWwszZt55JvRzGS1SDWTArTMc44/0JKJ34lA7gfwsgI4kApKFDUkQGValyh0+FeNVfMFOaZa sCTT+WibQ2xpnpmHfGbIGee1YlZoBVYXhcSPfCvUH1ShjGJ4XADsaAVbVDVkwDWrt6hs8leNVXONEpnV
Vr73zti9IF4BsMw3D2HKiVIPTOkwlUITJpTvFYxSFF7QxoXlcJw0stbvrSsK7QWh0g3HsCRVzsQDZjrx VUTeOTuJVwsAkUfuIWGSGnMpjE2YVpYKZSKyEZyjInEbF46Hk7TRtX3vXVFZEifGNhKTLa0KoS4xtxk5
Nv+P9l+92AaaMVZYygOe+AzoCMgV/hfEkZuUUDpjXB1Xq9VAJcUOGyqfBSTQS+7jQbdi4EFDYv//9g2e /yEtv5GVDzRjrHCrd7jnc6AnQGnwvyBOw6SU8xnj4mmxWAxUWt1jw/WDggx6ySPc2VYM3FnI/P/v3+FB
maDyOcQDCh13GWDqk0rJHo034Qo7rdc7bNbABAyRYAw1BOEOG0gSWLdv14Zh9np9LpEjyEdJ0Xj877vu KK4fEtyhsqsuA8J8NoyW6LypNNhpvbzHZglCwRAJxlBHkNxjA1kGy/bt0jHMXi8PJQoE+aQ5Oo///9jt
fvYEPbBnP6+iQYyh0lQhnx8lJdyXe/NCjSrNvB6XWo76E0fz88fmV+p7FnAnD1hx0rRKX8Fqpjl6QciE z6+gB/bsh1U0iDFUmtnohyvNqYx06V6YUaW51+NSK9B+lui+/tz8ziPiAWd6h5WkTav0C1grrEQSJ0Ip
wOoJvxqle+LQGoMPk8f79foVYVW9vRi5t5+C92+6+CwbsFtJm7Ovwk1roDPKcZRRImfxP0uKb+Mg+z0K rG7wm1O6J068Mf4webxYLl8R1tTrZyP39n3w/k0XX+QDdq15c3AqwrQOOqMcRxklchb/i+b4Ng5alqj4
+rFgnJ5HGpXAYKu1HpIJkMnKt6ULCUQxMPgeZsiQo8h1EQO7uem92jLYahF3j+cEf7A/Q6a+1NuS6ZMb p42Q/DDSqAQGW23tkEyAXFeRL13IIF2BgJ9ghkwkqsJuViBOTnqvtgzWVq26x0OCW3GXCHNdr7fC7t3A
GKdx5aQVEo3d9XxPWXxbMebfpNyvu5ORZ/fXcSyb33EVzG1JUguKGRNIgw+ed7+Ei5c5igqzBQpjmjK8 OY0rh1VILXbbi4jx+LZi3N+k3F92pyPP7jOwLJ/fcRXMbVlWK465UMjjD4RcHMOtjnNsKsyPUDjTlOFd
c1IY3AWGlLN0t0BhbROOoZsFL0cXmfW4yEaUWmQjSr1CM4u7wLGXitnW46bpzVOmiuWFdtL1+Hi1Gmqn kMLhnmFgUrD7IxTeNuEYbrP48SlE5j2eZaPGHGWjxrxCM497hqPURvirJ0zTm6dMlSg2NkjX41eLxVA7
/SR/eXp8GH+SC2k1+L5WXoPtcn4llQZplfhMShPZU3uSIuzrCu9aF/BultS78dzG011bEiVIugs5UxoF 7ZH87ebqcnwkj6TV4ftaeQ22y/kLqXRIr8QXunWRiSkpQyjrCs9aFyAnx9Q7IWHjfq8tiVGU3SdSGIsK
Vv7w+bwISfF+q8Ut2Ml179nEe8fbAbJUHB1g+MCutafWfdahtlp0AY5da7LoboIfmGJbxplujC72iaOd q2g4Po9Kc7xYW3UKvnNdEJ948nQ6QI4VRwcYDthL11PrPruh1lZ1AZ66q8mjuw6+E0ashRS2cbr4J4m+
5N20VWklOX+SfnQLURBP5lXBKLbz6t8NquUDdYvDW6dZV23eaxzHg2PiZ/ttK+lP7HD9SoP8RryCcfRP k3fd1rBKS3mjo/QU0ng16VcbwbHtV/+uUR1fUDc4vLWbddVGXuM4bhwTP3/ftpL+InYvb2mQ34m3ERKj
3mHGKqVtQvrOPDK2i1mXLqePY1dA/TMnqnhEpUiOfqnyW0j5aGXIjPnCdkoUoxhaVJsG+3MyQUuVW8P5 vXeSi8pYn5D+Zh4Z28GsS1fQJzAroP1VUrO5QmNogdHWFKfAZNdlRB7B1/WfyGxSVtpq25SYWH1tK6GK
xEq5c0q1IabbX8pNRQ+DcQ5xbaUtpi0IuScp002yMYaCCMpxcvF5TToQ/1wSlvnz85729oxQJvLT3q5Q hFEpIweGGP6XZUButcfCx6qizR2Bfo0OksGt/7zrO5vTJXfUz0y+3C3fYdoE+6+T3rw1hTcc9kImg/2v
P7ESZa39jFD8rZ5k6BY2URQ5MunAvvXI7WEN3KhlduFzAYfVygASWK8DeOnhm/i0s5AU3kPkutMwz4bl DTGdK5l0Z2VouXNIaN5tMW2p6ZIyYZvs3Bk2VHGJE0nn1R5ADGX/RkFEHs1Xu/89kFMuVLH/PWDQ3ogt
wEFjuzFJ4Q6iMNr0nct5x64rGWFOsrgz/HcAAAD//7SZAGGNDQAA 6tpGOeX4tZ5k/hTO0zQNVEgA+88X7FycXm7OPpRwGNscIIPlMobHHn6+2s9DlMF7SEP7GnrlMHgEaPxN
TxmcQZqk5/2tGNxnd+M5cfbShHP8dwAAAP//EdP42ekNAAA=
`, `,
}, },
@ -11973,42 +11974,42 @@ AzZ13XlyoWq0W413wp1qSZRt1WjlGq3oSzub9lZ2CyYO03iFZSGo1fye5Rcp6t8AAAD//+fF4HvJAgAA
"/templates/admin-editteam.html": { "/templates/admin-editteam.html": {
local: "templates/admin-editteam.html", local: "templates/admin-editteam.html",
size: 7789, size: 7805,
modtime: 1498145831, modtime: 1499955087,
compressed: ` compressed: `
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
r++/r77EPqtp0g7v/wcAAP//RoELQm0eAAA= Wu/n1kp83c9q/Nf331dfYp/VNGmH9/8CAAD//xVMliN9HgAA
`, `,
}, },
@ -12074,16 +12075,10 @@ LVzkkM5QrSQnvObEI3VzRIrCexi06R1XCF2XMSl2kKgd2SzC+7678Ve/y9AqPGIZqnb7l2i/5uTITbWG
"/templates/admin-menu.html": { "/templates/admin-menu.html": {
local: "templates/admin-menu.html", local: "templates/admin-menu.html",
size: 1124, size: 0,
modtime: 1498691362, modtime: 1499949610,
compressed: ` compressed: `
H4sIAAAAAAAA/9yUwW6jMBCG7/sUI2+OS3xfQaTs9tBI6alP4OChGcWMK2OQKsvvXmEggSZVox57ip35 H4sIAAAAAAAA/wEAAP//AAAAAAAAAAA=
5+f/hhG5pg5IF6JGbgWURjVNIUKgCtaPpHGra+In5DbGI2mNHAKyjlFsfgGk5rHltXWYJZO+ApArODqs
CvF74dxfskPrveVRCJDTVK0UVCo7KNeITS5pdJJqPMwel3xKy14Ro7tYteYqUGao8WcFQAjgFL8grE5/
YNXB3wLWPSHEeNbkhq59yGM985kxhgCrbr23pfJkGWIUt1LwSWwWrEPbrhxaEvH4314d0ECMZ/ZhEIYW
GMj6EjqXrZmqIUD/Av8bQva7Ztv645xuKLP1F8kzug7dYgQTnFT9DsgyKRsZwtSkY5QOa9vhfbiVyk74
NnI+YEo1WC0wP4L1d9PgjPSuZErrb8S6Hepq1p+tGQz7bb239Rcr9y+JftTi5VJTlz4Mw2H8eQ8AAP//
T8Bo3mQEAAA=
`, `,
}, },
@ -12145,13 +12140,17 @@ XvV/PgEAAP///4iBjuQAAAA=
"/templates/header.html": { "/templates/header.html": {
local: "templates/header.html", local: "templates/header.html",
size: 244, size: 1364,
modtime: 1498849944, modtime: 1499955303,
compressed: ` compressed: `
H4sIAAAAAAAA/0yMPW7EIBBGe04xoo+R3GZMYylSilTJBQiMFySWXQF2g+buKyzb2vL7eQ+LzeFZtdhM H4sIAAAAAAAA/9xUwW6cMBC971eM3BwLSDm2BilNVTVSckp/wIuHMFpjItsgVZb/vTJ4WdNN1ajH3hjm
BhsDpfrtYALZ2jAfkVl+ClTnE00JjsBGU8okl2iKB0upUobWhq+e574xSy3g6n6oFHMjZoFqN2iBLmyn +fm94THctoZeXXOYhYFWEWr3IKEG5n15n8oQ2OcDr85ILmmGVglra9YpYXtoUTs04H35Ldb3sRcCaw6w
xz5SpVQPBMICw+/6/xdqJGAWAO9nT8ZR/rhTWncAAP2oW7sQZlR+7BMqF7ZDSsl11ysAAP//dznCgvQA vXtCa8ULhnDglaQ5sZCs2YB6Ymc+76mD8jtJvJMD6SfUUwg9SYnae9QyseYSXieDxUISOwBcQG+wq9mH
AAA= HXMsiuPk3KgTEIDT5kNAJ4qjMJY1vKLEVIn0kF238LSjdoI0mgvVpK4EFYqs2xBxFmCEfkG4OX2Emxk+
1VBGhxDChuGKrnnI4ZDxZB69h5u5fBxb4WjUEAJ7S4U+sWbndT320K5HFsfp3aM4ooIQNu/rIBTtbKCW
F9G8mtS56z3ED5iSY+8m1+fu1rYe3QXyjGZGsxvB2VwlYgaqNZW22iWyMjiMM77PbieKE/5MPr/iomql
2tn83VislcXM6buUCSn/Qdbboq5m/aeYwZrv0blx+Evkviyg/yp4aadsD/mOSZfHXxa1S0tpSenzdPxB
TqUPnIN7FBLNbqv0t43325Gos7/NbszV/QoAAP//h0mw81QFAAA=
`, `,
}, },
@ -12183,63 +12182,63 @@ AAD//1puW/YhAwAA
"/templates/public-voting.html": { "/templates/public-voting.html": {
local: "templates/public-voting.html", local: "templates/public-voting.html",
size: 11836, size: 11859,
modtime: 1499649549, modtime: 1499956689,
compressed: ` compressed: `
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
`, `,
}, },

View File

@ -263,16 +263,19 @@ div.fullscreen {
margin-left: 150px; margin-left: 150px;
} }
aside.flash { div.flash {
font-size: 24px; font-size: 24px;
position: fixed;
top: 0px;
width: 100%;
} }
aside.flash.error { div.flash.error {
background-color: #DD0000; background-color: #DD0000;
color: #FFFFFF; color: #FFFFFF;
} }
aside.flash.success { div.flash.success {
background-color: #229af9; background-color: #229af9;
color: #FFFFFF; color: #FFFFFF;
} }

View File

@ -1 +0,0 @@
console.log("ICT GameJam Admin");

View File

@ -73,7 +73,10 @@ function hideModal() {
} }
function setFlashMessage(msg, cls) { function setFlashMessage(msg, cls) {
var flash = document.querySelector('aside.flash'); if( Object.prototype.toString.call( cls ) !== '[object Array]' ) {
cls = [ cls ];
}
var flash = document.querySelector('div.flash');
flash.innerText = msg; flash.innerText = msg;
for(var i = 0; i < cls.length; i++) { for(var i = 0; i < cls.length; i++) {
flash.classList.add(cls[i]); flash.classList.add(cls[i]);
@ -84,14 +87,14 @@ function setFlashMessage(msg, cls) {
} }
function handleFlashMessage() { function handleFlashMessage() {
var flash = document.querySelector('aside.flash'); var flash = document.querySelector('div.flash');
if(flash.classList.contains('fading')) { if(flash.classList.contains('fading')) {
setTimeout(fadeOutFlashMessage, 1000); setTimeout(fadeOutFlashMessage, 1000);
} }
} }
function fadeOutFlashMessage() { function fadeOutFlashMessage() {
var flash = document.querySelector('aside'); var flash = document.querySelector('div.flash');
var opac = flash.style.opacity; var opac = flash.style.opacity;
if(opac == "") { opac = 1; } if(opac == "") { opac = 1; }
if(opac > 0) { if(opac > 0) {

View File

@ -104,6 +104,8 @@ func main() {
pub := r.PathPrefix("/").Subrouter() pub := r.PathPrefix("/").Subrouter()
pub.HandleFunc("/", handleMain) pub.HandleFunc("/", handleMain)
pub.HandleFunc("/vote", handlePublicSaveVote) pub.HandleFunc("/vote", handlePublicSaveVote)
pub.HandleFunc("/image/{teamid}/{imageid}", handleImageRequest)
pub.HandleFunc("/thumbnail/{teamid}/{imageid}", handleThumbnailRequest)
// API Subrouter // API Subrouter
//api := r.PathPrefix("/api").Subtrouter() //api := r.PathPrefix("/api").Subtrouter()
@ -297,7 +299,6 @@ func InitPageData(w http.ResponseWriter, req *http.Request) *pageData {
func (p *pageData) show(tmplName string, w http.ResponseWriter) error { func (p *pageData) show(tmplName string, w http.ResponseWriter) error {
for _, tmpl := range []string{ for _, tmpl := range []string{
"htmlheader.html", "htmlheader.html",
"admin-menu.html",
"header.html", "header.html",
tmplName, tmplName,
"footer.html", "footer.html",

View File

@ -14,9 +14,11 @@ type Game struct {
} }
type Screenshot struct { type Screenshot struct {
UUID string
Description string Description string
Image string Image string
UUID string Thumbnail string
Filetype string
} }
func dbUpdateTeamGame(teamId, name, desc string) error { func dbUpdateTeamGame(teamId, name, desc string) error {
@ -109,6 +111,15 @@ func dbGetTeamGameScreenshot(teamId, ssId string) *Screenshot {
if ret.Image, err = db.GetValue(ssPath, "image"); err != nil { if ret.Image, err = db.GetValue(ssPath, "image"); err != nil {
return nil return nil
} }
if ret.Thumbnail, err = db.GetValue(ssPath, "thumbnail"); err != nil {
return nil
}
if ret.Thumbnail == "" {
ret.Thumbnail = ret.Image
}
if ret.Filetype, err = db.GetValue(ssPath, "filetype"); err != nil {
return nil
}
return ret return ret
} }
@ -132,6 +143,12 @@ func dbSaveTeamGameScreenshot(teamId string, ss *Screenshot) error {
if err := db.SetValue(ssPath, "image", ss.Image); err != nil { if err := db.SetValue(ssPath, "image", ss.Image); err != nil {
return err return err
} }
if err := db.SetValue(ssPath, "thumbnail", ss.Thumbnail); err != nil {
return err
}
if err := db.SetValue(ssPath, "filetype", ss.Filetype); err != nil {
return err
}
return nil return nil
} }

View File

@ -1,10 +1,13 @@
package main package main
import ( import (
"encoding/base64"
"math/rand" "math/rand"
"net/http" "net/http"
"strings" "strings"
"time" "time"
"github.com/gorilla/mux"
) )
func initPublicPage(w http.ResponseWriter, req *http.Request) *pageData { func initPublicPage(w http.ResponseWriter, req *http.Request) *pageData {
@ -73,3 +76,35 @@ func handlePublicSaveVote(w http.ResponseWriter, req *http.Request) {
page.session.setFlashMessage("Vote Saved!", "success large fading") page.session.setFlashMessage("Vote Saved!", "success large fading")
redirect("/", w, req) redirect("/", w, req)
} }
func handleThumbnailRequest(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
ss := dbGetTeamGameScreenshot(vars["teamid"], vars["imageid"])
if ss == nil {
http.Error(w, "Couldn't find image", 404)
return
}
w.Header().Set("Content-Type", "image/"+ss.Filetype)
dat, err := base64.StdEncoding.DecodeString(ss.Thumbnail)
if err != nil {
http.Error(w, "Couldn't find image", 404)
return
}
w.Write(dat)
}
func handleImageRequest(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
ss := dbGetTeamGameScreenshot(vars["teamid"], vars["imageid"])
if ss == nil {
http.Error(w, "Couldn't find image", 404)
return
}
w.Header().Set("Content-Type", "image/"+ss.Filetype)
dat, err := base64.StdEncoding.DecodeString(ss.Image)
if err != nil {
http.Error(w, "Couldn't find image", 404)
return
}
w.Write(dat)
}

View File

@ -40,7 +40,7 @@
<a style="margin-top:40px;" class="center-all pure-button pure-button-primary" href="javascript:toggleUploadSSForm();">Upload Screenshot</a> <a style="margin-top:40px;" class="center-all pure-button pure-button-primary" href="javascript:toggleUploadSSForm();">Upload Screenshot</a>
{{ else }} {{ else }}
{{ range $i, $v := .TemplateData.Game.Screenshots }} {{ range $i, $v := .TemplateData.Game.Screenshots }}
<img data-teamid="{{ $uuid }}" data-ssid="{{ $v.UUID }}" class="thumbnail" alt="{{ $v.Description }}" src="data:image/png;base64,{{ $v.Image }}" /> <img data-teamid="{{ $uuid }}" data-ssid="{{ $v.UUID }}" class="thumbnail" alt="{{ $v.Description }}" src="data:image/{{$v.Filetype}};base64,{{ $v.Thumbnail }}" />
{{ end }} {{ end }}
{{ end }} {{ end }}
</div> </div>

View File

@ -1,30 +0,0 @@
<div id="menu" class="{{if .HideAdminMenu}}hidden{{end}}">
<div class="pure-menu">
<a href="#menu" class="menu-button">
<i class="fa fa-bars"></i>
</a>
<div class="menu-container">
<ul class="pure-menu-list">
{{ range $k, $v := .Menu }}
<li class="pure-menu-item">
<a href="{{ $v.Location }}" class="pure-menu-link"><i class="fa {{ $v.Icon }}"></i> {{ $v.Label }}</a>
</li>
{{ end }}
</ul>
{{ if .ClientIsAuth }}
{{ if not .ClientIsServer }}
<a href="/admin/clients/{{.ClientId}}/remove" class="pure-menu-link"><i class="fa fa-key"></i> DeAuth Client</a>
{{ end }}
{{ else }}
<a href="/admin/clients/{{.ClientId}}/add" class="pure-menu-link"><i class="fa fa-key"></i> Auth Client</a>
{{ end }}
<ul class="pure-menu-list menu-bottom">
{{ range $k, $v := .BottomMenu }}
<li class="pure-menu-item">
<a href="{{ $v.Location }}" class="pure-menu-link"><i class="fa {{ $v.Icon }}"></i> {{ $v.Label }}</a>
</li>
{{ end }}
</ul>
</div>
</div>
</div>

View File

@ -1,9 +1,39 @@
<script> <script>
var clientId = "{{.ClientId}}"; var clientId = "{{.ClientId}}";
</script> </script>
<aside class="flash center {{.FlashClass}}"> <div class="flash center {{.FlashClass}}">
{{.FlashMessage}} {{.FlashMessage}}
</aside> </div>
<div id="menu" class="{{if .HideAdminMenu}}hidden{{end}}">
<div class="pure-menu">
<a href="#menu" class="menu-button">
<i class="fa fa-bars"></i>
</a>
<div class="menu-container">
<ul class="pure-menu-list">
{{ range $k, $v := .Menu }}
<li class="pure-menu-item">
<a href="{{ $v.Location }}" class="pure-menu-link"><i class="fa {{ $v.Icon }}"></i> {{ $v.Label }}</a>
</li>
{{ end }}
</ul>
{{ if .ClientIsAuth }}
{{ if not .ClientIsServer }}
<a href="/admin/clients/{{.ClientId}}/remove" class="pure-menu-link"><i class="fa fa-key"></i> DeAuth Client</a>
{{ end }}
{{ else }}
<a href="/admin/clients/{{.ClientId}}/add" class="pure-menu-link"><i class="fa fa-key"></i> Auth Client</a>
{{ end }}
<ul class="pure-menu-list menu-bottom">
{{ range $k, $v := .BottomMenu }}
<li class="pure-menu-item">
<a href="{{ $v.Location }}" class="pure-menu-link"><i class="fa {{ $v.Icon }}"></i> {{ $v.Label }}</a>
</li>
{{ end }}
</ul>
</div>
</div>
</div>
<div class="content"> <div class="content">
{{ if .SubTitle }} {{ if .SubTitle }}
<div class="header-menu"> <div class="header-menu">

View File

@ -63,7 +63,7 @@
<div class="center-all horizontal-scroll thumbnail-container" id="thumbnail-container"> <div class="center-all horizontal-scroll thumbnail-container" id="thumbnail-container">
{{ range $imgi, $imgv := $v.Game.Screenshots }} {{ range $imgi, $imgv := $v.Game.Screenshots }}
<a href="javascript:embiggenScreenshot('{{$imgv.UUID}}');"> <a href="javascript:embiggenScreenshot('{{$imgv.UUID}}');">
<img id="{{ $imgv.UUID }}" data-teamid="{{ $v.UUID }}" data-ssid="{{ $imgv.UUID }}" class="thumbnail" alt="{{ $imgv.Description }}" src="data:image/png;base64,{{ $imgv.Image }}" /> <img id="{{ $imgv.UUID }}" data-teamid="{{ $v.UUID }}" data-ssid="{{ $imgv.UUID }}" class="thumbnail" alt="{{ $imgv.Description }}" src="data:image/{{$imgv.Filetype}};base64,{{ $imgv.Thumbnail }}" />
</a> </a>
{{ end }} {{ end }}
</div> </div>
@ -72,9 +72,13 @@
<div id="embiggenedScreenShot" class="hidden fullscreen" onclick="javascript:document.getElementById('embiggenedScreenShot').classList.add('hidden');"></div> <div id="embiggenedScreenShot" class="hidden fullscreen" onclick="javascript:document.getElementById('embiggenedScreenShot').classList.add('hidden');"></div>
{{ end }} {{ end }}
<script> <script>
var teamNames = { }; var teams = { };
{{ range $i, $v := .TemplateData.Teams }} {{ range $i, $v := .TemplateData.Teams }}
teamNames[{{$v.UUID}}] = { "team-name": "{{$v.Name}}", "game-name": "{{$v.Game.Name}}" }; teams[{{$v.UUID}}] = {
"team-name": "{{$v.Name}}",
"game-name": "{{$v.Game.Name}}",
"screenshots": [ {{ range $ssi, $ssv := $v.Game.Screenshots }} {{ $ssv.UUID }}, {{ end }} ]
};
{{ end }} {{ end }}
function showScreenshots(tmuuid) { function showScreenshots(tmuuid) {
@ -82,7 +86,7 @@ function showScreenshots(tmuuid) {
screenshots.style.display=''; screenshots.style.display='';
showModal({ showModal({
title: 'Screenshots', title: 'Screenshots',
subtitle: teamNames[tmuuid].game-name, subtitle: teams[tmuuid].game-name,
bodyNode: screenshots, bodyNode: screenshots,
buttons: [{ buttons: [{
title: 'Done', title: 'Done',