Mercurial > templog
view web/views/set.tpl @ 185:adbf70d1449f
working
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 06 Feb 2014 22:45:16 +0800 |
parents | cbe14244a372 |
children | ae5efca89001 |
line wrap: on
line source
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=8,minimum-scale=0.1"> <script src="jquery-2.1.0.min.js"></script> <script> %include riot.min.js </script> <style type="text/css"> span.no_selection { -webkit-user-select: none; // webkit (safari, chrome) browsers -moz-user-select: none; // mozilla browsers -khtml-user-select: none; // webkit (konqueror) browsers } body { font-family: "sans-serif"; } input { border: 2px solid transparent; border-radius: 4px; background-color: white; border-color: black; padding: 0; font-size: 80%; } input[type="button"] { width: 4em; height: 4em; margin-left: 0.5em; } input[type="submit"] { width: 10em; height: 4em; margin-top: 1em; align: center; } input[type="text"] { height: 4em; text-align: center; } #savebox { align: center; width: 100%; } .onbutton { background-color: #cdf; } .modified { color: #d00; font-weight: bold; } .existing { margin-top: 1em; font-size: 70%; } </style> <title>Set templog</title> </head> <script type="html/num_input"> <div id="{id}"> <span class="existing">{title} <span id="oldvalue">{oldvaluetext}{unit}</span></span> <br/> <input type="text" class="input" name="input_{name}" /> <input type="button" class="button_down" value="-"/> <input type="button" class="button_up" value="+"/> </div> </script> <script type="html/yesno_button"> <div id="{id}"> <span class="existing">{title} <span id="oldvalue">{oldvaluetext}</span></span> <br/> <input type="button" class="button_no" value="No"/> <input type="button" class="button_yes" value="Yes"/> </div> </script> <script> function Setter(params, csrf_blob) { var self = $.observable(this); self.params = params; self.csrf_blob = csrf_blob $.each(self.params, function(idx, param) { param.id = "param_id_" + idx; param.oldvalue = param.value if (typeof(param.oldvalue) == "boolean") { param.oldvaluetext = param.oldvalue ? "Yes" : "No"; } else { param.oldvaluetext = param.oldvalue; } }); self.edit = function(param, newvalue) { param.value = newvalue; params[param.name] = param; self.trigger("edit", param); } self.adjust = function(param, updown) { // XXX increment param.value += (param.amount*updown); self.trigger("edit", param); } self.save = function() { self.trigger("status", "Saving...") var post_json = {}; post_json.csrf_blob = self.csrf_blob; post_json.params = self.params.map(function(v, idx, array) { return { name: v.name, value: v.value }; }); var post_data = {data: JSON.stringify(post_json)}; var req = $.ajax({type: "POST", url: "setparams", data: post_data}); req.done(function(data, status, hdr) { self.trigger("status", "Saved") }); req.fail(function(data, status, hdr) { self.trigger("status", "Failed: " + status + "\n" + hdr.responseText) }); } } (function() { 'use strict'; var params = {{!inline_data}}; var csrf_blob = "{{!csrf_blob}}"; window.setter = new Setter(params, csrf_blob); var number_template = $("[type='html/num_input']").html(); var button_template = $("[type='html/yesno_button']").html(); setter.on("add", add); setter.on("edit", function(param) { var el = $("#" + param.id); if (param.kind === "number") { set_text_state(el, param); } else if (param.kind === "yesno") { set_button_state(el, param.value); } var same; switch (typeof(param.oldvalue)) { case "boolean": same = ((!param.value) == (!param.oldvalue)); break; case "number": same = Math.abs(param.value - param.oldvalue) < 1e-3 * param.amount; break; default: same = (param.value === param.oldvalue); } $("#oldvalue", el).toggleClass("modified", !same); }); setter.on("status", function(status) { $('#status').text(status) }) var root; window.onload = function() { // clear list and add new ones root = $("#paramlist"); root.empty() && $.each(setter.params, function (idx, p) { add(p); }) $("#savebutton").click(function() { setter.save(); }) } function set_text_state(el, param) { var input = $(".input", el); var s = Number(param.value).toFixed(param.digits) input.text(s).val(s) } function set_button_state(el, value) { $(".button_yes", el).toggleClass("onbutton", value); $(".button_no", el).toggleClass("onbutton", !value); } function add(param) { if (param.kind === "number") { var el = $($.render(number_template, param)).appendTo(root); var input = $(".input", el); input.keyup(function(e) { if (e.which == 13) { setter.edit(param, Number(this.value)); } }); input.blur(function(e) { setter.edit(param, Number(this.value)); }); $(".button_up", el).click(function() { setter.adjust(param, 1); this.blur() }); $(".button_down", el).click(function() { setter.adjust(param, -1); this.blur() }); set_text_state(el, param); } else if (param.kind === "yesno") { var el = $($.render(button_template, param)).appendTo(root); var button_yes = $(".button_yes", el); var button_no = $(".button_no", el); button_yes.click(function() { setter.edit(param, true); this.blur() }) button_no.click(function() { setter.edit(param, false); this.blur() }) set_button_state(el, param.value); } } })() </script> <body> <section id="paramlist"> </section> <div id="savebox"> <input type="button" id="savebutton" value="Save"/> <div id="status"> </div> </div> </body> </html>