|
|
@@ -1,163 +1,180 @@ |
|
|
|
var sessToken = ""; |
|
|
|
(function() { |
|
|
|
|
|
|
|
window.apiLogin = apiLogin; |
|
|
|
window.api = api; |
|
|
|
window.elem = elem; |
|
|
|
window.uploadEl = uploadEl; |
|
|
|
window.async = async; |
|
|
|
window.debounce = debounce; |
|
|
|
window.error = error; |
|
|
|
window.$$ = $$; |
|
|
|
|
|
|
|
var sessToken = ""; |
|
|
|
|
|
|
|
function apiLogin(pass, cb) { |
|
|
|
var extraHeads = [ [ "Session-Pass", pass ] ]; |
|
|
|
|
|
|
|
api("login", {}, (err, token) => { |
|
|
|
if (token) { |
|
|
|
sessToken = token; |
|
|
|
cb(true); |
|
|
|
} else { |
|
|
|
cb(false); |
|
|
|
} |
|
|
|
}, extraHeads); |
|
|
|
} |
|
|
|
|
|
|
|
function argstr(args) { |
|
|
|
return "?" + Object.keys(args).map(function(key) { |
|
|
|
return encodeURIComponent(key)+"="+encodeURIComponent(args[key]); |
|
|
|
}).join("&"); |
|
|
|
} |
|
|
|
|
|
|
|
function apiLogin(pass, cb) { |
|
|
|
var extraHeads = [ [ "Session-Pass", pass ] ]; |
|
|
|
function api(method, args, cb, extraHeads) { |
|
|
|
var heads = new Headers(); |
|
|
|
heads.append("Session-Token", sessToken); |
|
|
|
if (extraHeads) |
|
|
|
extraHeads.forEach(h => heads.append(h[0], h[1])); |
|
|
|
|
|
|
|
var opts = { |
|
|
|
method: "POST", |
|
|
|
headers: heads |
|
|
|
}; |
|
|
|
fetch("/admin/api/"+method+argstr(args), opts) |
|
|
|
.then(response => response.json()) |
|
|
|
.then(res => { |
|
|
|
if (res.err && res.err === "EINVALTOKEN") |
|
|
|
setView("login"); |
|
|
|
else |
|
|
|
cb(res.err, res.obj) |
|
|
|
}); |
|
|
|
} |
|
|
|
|
|
|
|
api("login", {}, (err, token) => { |
|
|
|
if (token) { |
|
|
|
sessToken = token; |
|
|
|
cb(true); |
|
|
|
} else { |
|
|
|
cb(false); |
|
|
|
function elem(tag, props, children) { |
|
|
|
var e; |
|
|
|
if (tag instanceof HTMLElement) |
|
|
|
e = tag; |
|
|
|
else |
|
|
|
e = document.createElement(tag); |
|
|
|
|
|
|
|
if (props) { |
|
|
|
for (var i in props) { |
|
|
|
e[i] = props[i]; |
|
|
|
} |
|
|
|
} |
|
|
|
}, extraHeads); |
|
|
|
} |
|
|
|
|
|
|
|
function argstr(args) { |
|
|
|
return "?" + Object.keys(args).map(function(key) { |
|
|
|
return encodeURIComponent(key)+"="+encodeURIComponent(args[key]); |
|
|
|
}).join("&"); |
|
|
|
} |
|
|
|
|
|
|
|
function api(method, args, cb, extraHeads) { |
|
|
|
var heads = new Headers(); |
|
|
|
heads.append("Session-Token", sessToken); |
|
|
|
if (extraHeads) |
|
|
|
extraHeads.forEach(h => heads.append(h[0], h[1])); |
|
|
|
|
|
|
|
var opts = { |
|
|
|
method: "POST", |
|
|
|
headers: heads |
|
|
|
}; |
|
|
|
fetch("/admin/api/"+method+argstr(args), opts) |
|
|
|
.then(response => response.json()) |
|
|
|
.then(res => cb(res.err, res.obj)); |
|
|
|
} |
|
|
|
|
|
|
|
function elem(tag, props, children) { |
|
|
|
var e; |
|
|
|
if (tag instanceof HTMLElement) |
|
|
|
e = tag; |
|
|
|
else |
|
|
|
e = document.createElement(tag); |
|
|
|
|
|
|
|
if (props) { |
|
|
|
for (var i in props) { |
|
|
|
e[i] = props[i]; |
|
|
|
|
|
|
|
if (children) { |
|
|
|
for (var i in children) { |
|
|
|
e.appendChild(children[i]); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
if (children) { |
|
|
|
for (var i in children) { |
|
|
|
e.appendChild(children[i]); |
|
|
|
e.appendTo = function(p) { |
|
|
|
p.appendChild(e); |
|
|
|
return e; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
e.appendTo = function(p) { |
|
|
|
p.appendChild(e); |
|
|
|
return e; |
|
|
|
} |
|
|
|
e.on = function(name, fn) { |
|
|
|
e.addEventListener(name, function(evt) { |
|
|
|
fn.call(e, evt); |
|
|
|
}, false); |
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
e.on = function(name, fn) { |
|
|
|
e.addEventListener(name, function(evt) { |
|
|
|
fn.call(e, evt); |
|
|
|
}, false); |
|
|
|
return e; |
|
|
|
} |
|
|
|
e.addClass = function(name) { |
|
|
|
if (e.className.indexOf(name) !== -1) |
|
|
|
return e; |
|
|
|
|
|
|
|
e.addClass = function(name) { |
|
|
|
if (e.className.indexOf(name) !== -1) |
|
|
|
e.className += " "+name; |
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
e.className += " "+name; |
|
|
|
return e; |
|
|
|
} |
|
|
|
e.removeClass = function(name) { |
|
|
|
e.className = e.className |
|
|
|
.replace(name, "") |
|
|
|
.trim() |
|
|
|
.replace(/ +/, ""); |
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
e.clear = function() { |
|
|
|
var fc; |
|
|
|
while (fc = e.firstChild) |
|
|
|
e.removeChild(fc); |
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
e.removeClass = function(name) { |
|
|
|
e.className = e.className |
|
|
|
.replace(name, "") |
|
|
|
.trim() |
|
|
|
.replace(/ +/, ""); |
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
e.clear = function() { |
|
|
|
var fc; |
|
|
|
while (fc = e.firstChild) |
|
|
|
e.removeChild(fc); |
|
|
|
return e; |
|
|
|
var uploadElId = 0; |
|
|
|
function uploadEl(args, cb) { |
|
|
|
var id = uploadElId++; |
|
|
|
var frame; |
|
|
|
var form; |
|
|
|
var fileEl; |
|
|
|
return form = elem("form", { |
|
|
|
className: "uploader", |
|
|
|
action: "/admin/api/slide_file_upload"+argstr(args), |
|
|
|
method: "post", |
|
|
|
enctype: "multipart/form-data", |
|
|
|
target: "upload-form-"+id |
|
|
|
}, [ |
|
|
|
frame = elem("iframe", { |
|
|
|
style: "display: none", |
|
|
|
name: "upload-form-"+id |
|
|
|
}).on("load", cb), |
|
|
|
|
|
|
|
fileEl = elem("input", { |
|
|
|
type: "file", |
|
|
|
style: "display: none", |
|
|
|
name: "file" |
|
|
|
}).on("change", () => { |
|
|
|
form.submit(); |
|
|
|
}), |
|
|
|
|
|
|
|
elem("button", { |
|
|
|
innerHTML: "Upload", |
|
|
|
type: "button" |
|
|
|
}).on("click", () => { |
|
|
|
fileEl.click(); |
|
|
|
}) |
|
|
|
]); |
|
|
|
} |
|
|
|
|
|
|
|
return e; |
|
|
|
} |
|
|
|
|
|
|
|
var uploadElId = 0; |
|
|
|
function uploadEl(args, cb) { |
|
|
|
var id = uploadElId++; |
|
|
|
var frame; |
|
|
|
var form; |
|
|
|
var fileEl; |
|
|
|
return form = elem("form", { |
|
|
|
className: "uploader", |
|
|
|
action: "/admin/api/slide_file_upload"+argstr(args), |
|
|
|
method: "post", |
|
|
|
enctype: "multipart/form-data", |
|
|
|
target: "upload-form-"+id |
|
|
|
}, [ |
|
|
|
frame = elem("iframe", { |
|
|
|
style: "display: none", |
|
|
|
name: "upload-form-"+id |
|
|
|
}).on("load", cb), |
|
|
|
|
|
|
|
fileEl = elem("input", { |
|
|
|
type: "file", |
|
|
|
style: "display: none", |
|
|
|
name: "file" |
|
|
|
}).on("change", () => { |
|
|
|
form.submit(); |
|
|
|
}), |
|
|
|
|
|
|
|
elem("button", { |
|
|
|
innerHTML: "Upload", |
|
|
|
type: "button" |
|
|
|
}).on("click", () => { |
|
|
|
fileEl.click(); |
|
|
|
}) |
|
|
|
]); |
|
|
|
} |
|
|
|
|
|
|
|
function async(n, cb) { |
|
|
|
var args = []; |
|
|
|
return function(arg) { |
|
|
|
args.push(arg); |
|
|
|
|
|
|
|
n -= 1; |
|
|
|
if (n === 0) |
|
|
|
cb(args); |
|
|
|
function async(n, cb) { |
|
|
|
var args = []; |
|
|
|
return function(arg) { |
|
|
|
args.push(arg); |
|
|
|
|
|
|
|
n -= 1; |
|
|
|
if (n === 0) |
|
|
|
cb(args); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function debounce(fn, ms) { |
|
|
|
if (ms === undefined) |
|
|
|
ms = 300; |
|
|
|
function debounce(fn, ms) { |
|
|
|
if (ms === undefined) |
|
|
|
ms = 300; |
|
|
|
|
|
|
|
var timeout; |
|
|
|
return function() { |
|
|
|
var timeout; |
|
|
|
return function() { |
|
|
|
|
|
|
|
if (timeout) |
|
|
|
clearTimeout(timeout); |
|
|
|
if (timeout) |
|
|
|
clearTimeout(timeout); |
|
|
|
|
|
|
|
timeout = setTimeout(function() { |
|
|
|
fn(); |
|
|
|
timeout = null; |
|
|
|
}, ms); |
|
|
|
} |
|
|
|
} |
|
|
|
timeout = setTimeout(function() { |
|
|
|
fn(); |
|
|
|
timeout = null; |
|
|
|
}, ms); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
function error(msg) { |
|
|
|
alert(msg); |
|
|
|
} |
|
|
|
function error(msg) { |
|
|
|
alert(msg); |
|
|
|
} |
|
|
|
|
|
|
|
var $$ = function() { |
|
|
|
return elem(document.querySelector.apply(document, arguments)); |
|
|
|
} |
|
|
|
function $$() { |
|
|
|
return elem(document.querySelector.apply(document, arguments)); |
|
|
|
} |
|
|
|
})(); |