diff web/views/set.tpl @ 486:bb713e6d0e48

merge
author Matt Johnston <matt@ucc.asn.au>
date Fri, 07 Feb 2014 08:00:10 +0800
parents d68af9e84485
children ae5efca89001
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/views/set.tpl	Fri Feb 07 08:00:10 2014 +0800
@@ -0,0 +1,293 @@
+<!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>