nicholas@2855: /* globals document, angular, window, Promise, XMLHttpRequest, Specification */ nicholas@2851: function get(url) { nicholas@2851: // Return a new promise. nicholas@2851: return new Promise(function (resolve, reject) { nicholas@2851: // Do the usual XHR stuff nicholas@2851: var req = new XMLHttpRequest(); nicholas@2851: req.open('GET', url); nickjillings@1370: nicholas@2851: req.onload = function () { nicholas@2851: // This is called even on 404 etc nicholas@2851: // so check the status nicholas@2851: if (req.status == 200) { nicholas@2851: // Resolve the promise with the response text nicholas@2851: resolve(req.response); nicholas@2851: } else { nicholas@2851: // Otherwise reject with the status text nicholas@2851: // which will hopefully be a meaningful error nicholas@2851: reject(Error(req.statusText)); nicholas@2851: } nicholas@2851: }; nicholas@2851: nicholas@2851: // Handle network errors nicholas@2851: req.onerror = function () { nicholas@2851: reject(Error("Network Error")); nicholas@2851: }; nicholas@2851: nicholas@2851: // Make the request nicholas@2851: req.send(); nicholas@2851: }); nickjillings@1370: } nickjillings@1370: nicholas@2851: var AngularInterface = angular.module("creator", []); nickjillings@1370: nicholas@2851: var specification = new Specification(); nickjillings@1370: nicholas@2535: window.onload = function () { nicholas@2851: // Get the test interface specifications nicholas@2535: nicholas@2851: }; nicholas@2535: nicholas@2851: AngularInterface.controller("view", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: $s.popupVisible = true; nickjillings@1370: nicholas@2851: $s.showPopup = function () { nicholas@2851: $s.popupVisible = true; nicholas@2851: }; nicholas@2851: $s.hidePopup = function () { nicholas@2851: $s.popupVisible = false; nicholas@2851: }; nicholas@2851: $s.globalSchema = undefined; nicholas@2851: get("xml/test-schema.xsd").then(function (text) { nicholas@2851: specification.processSchema(text); nicholas@2851: $s.globalSchema = specification.getSchema(); nicholas@2851: }); nicholas@2851: $s.specification = specification; nicholas@2851: }]); nickjillings@1370: nicholas@2851: AngularInterface.controller("introduction", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: $s.state = 0; nicholas@2851: $s.next = function () { nicholas@2851: $s.state++; nicholas@2851: if ($s.state > 1) { nicholas@2851: $s.hidePopup(); nicholas@2851: } nicholas@2851: }; nicholas@2851: $s.back = function () { nicholas@2851: $s.state--; nicholas@2851: }; nicholas@2851: $s.mouseover = function (name) { nicholas@2851: var obj = $s.interfaces.find(function (i) { nicholas@2851: return i.name == name; nicholas@2851: }); nicholas@2851: if (obj) { nicholas@2851: $s.description = obj.description.en; nicholas@2851: } nicholas@2851: }; nicholas@2851: $s.initialise = function (name) { nicholas@2851: var obj = $s.interfaces.find(function (i) { nicholas@2851: return i.name == name; nicholas@2851: }); nicholas@2851: specification.interface = obj.interface; nicholas@2851: }; nicholas@2851: // Get the test interface specifications nicholas@2851: $s.interfaces = {}; nicholas@2851: $s.description = ""; nicholas@2851: var interfaceCollection = new Promise(function (resolve, reject) { nicholas@2851: var xml = new XMLHttpRequest(); nicholas@2851: xml.open("GET", "test_create/interfaces/specifications.json"); nicholas@2851: xml.onload = function () { nicholas@2851: if (xml.status === 200) { nicholas@2851: resolve(xml.responseText); nicholas@2851: return; nicholas@2851: } nicholas@2851: reject(xml.status); nicholas@2851: }; nicholas@2851: xml.onerror = function () { nicholas@2851: reject(new Error("Network Error")); nicholas@2851: }; nicholas@2851: xml.send(); nicholas@2851: }).then(JSON.parse).then(function (data) { nicholas@2851: $s.interfaces = data.interfaces; nicholas@2851: $s.$apply(); nicholas@2851: }); nicholas@2851: }]); nickjillings@1370: nicholas@2851: AngularInterface.controller("setup", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2851: function initialise() { nicholas@2851: if ($s.globalSchema) { nicholas@2851: $s.schema = $s.globalSchema.querySelector("[name=setup]"); nickjillings@1385: } nickjillings@1370: } nicholas@2851: $s.schema = undefined; nicholas@2851: $s.attributes = []; nickjillings@1370: nicholas@2851: $s.$watch("globalSchema", initialise); nicholas@2853: $s.$watch("specification.metrics.enabled.length", function () { nicholas@2853: var metricsNode = document.getElementById("metricsNode"); nicholas@2853: if (!$s.specification.metrics) { nicholas@2853: return; nicholas@2853: } nicholas@2853: metricsNode.querySelectorAll("input").forEach(function (DOM) { nicholas@2853: DOM.checked = false; nicholas@2853: }); nicholas@2853: $s.specification.metrics.enabled.forEach(function (metric) { nicholas@2853: var DOM = metricsNode.querySelector("[value=" + metric + "]"); nicholas@2853: if (DOM) { nicholas@2853: DOM.checked = true; nicholas@2853: } nicholas@2853: }); nicholas@2855: }); nicholas@2853: nicholas@2853: $s.enableMetric = function ($event) { nicholas@2853: var metric = $event.currentTarget.value; nicholas@2853: var index = specification.metrics.enabled.findIndex(function (a) { nicholas@2853: return a == metric; nicholas@2853: }); nicholas@2853: if ($event.currentTarget.checked) { nicholas@2853: if (index == -1) { nicholas@2853: specification.metrics.enabled.push(metric); nicholas@2853: } nicholas@2853: } else { nicholas@2853: if (index >= 0) { nicholas@2853: specification.metrics.enabled.splice(index, 1); nicholas@2853: } nicholas@2853: } nicholas@2855: }; nicholas@2851: }]); nicholas@2853: nicholas@2853: AngularInterface.controller("surveyOption", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2853: nicholas@2853: $s.removeOption = function (option) { nicholas@2853: var index = $s.opt.options.findIndex(function (a) { nicholas@2853: return a == option; nicholas@2853: }); nicholas@2853: if (index === -1) { nicholas@2853: throw ("Invalid option"); nicholas@2853: } nicholas@2853: $s.opt.options.splice(index, 1); nicholas@2853: }; nicholas@2853: $s.addOption = function () { nicholas@2853: $s.opt.options.push({ nicholas@2853: name: "", nicholas@2853: text: "" nicholas@2853: }); nicholas@2855: }; nicholas@2855: }]); nicholas@2855: nicholas@2855: AngularInterface.controller("interfaceNode", ['$scope', '$element', '$window', function ($s, $e, $w) { nicholas@2855: $s.$watch("interface.options.length", function () { nicholas@2855: if (!$s.interface || !$s.interface.options) { nicholas@2855: return; nicholas@2855: } nicholas@2855: var options = $e[0].querySelector(".interfaceOptions").querySelectorAll(".attribute"); nicholas@2855: options.forEach(function (option) { nicholas@2855: var name = option.getAttribute("name"); nicholas@2855: var index = $s.interface.options.findIndex(function (io) { nicholas@2855: return io.name == name; nicholas@2855: }); nicholas@2855: option.querySelector("input").checked = (index >= 0); nicholas@2855: if (name == "scalerange" && index >= 0) { nicholas@2855: option.querySelector("[name=min]").value = $s.interface.options[index].min; nicholas@2855: option.querySelector("[name=max]").value = $s.interface.options[index].max; nicholas@2855: } nicholas@2855: }); nicholas@2855: }); nicholas@2855: $s.enableInterfaceOption = function ($event) { nicholas@2855: var name = $event.currentTarget.parentElement.getAttribute("name"); nicholas@2855: var type = $event.currentTarget.parentElement.getAttribute("type"); nicholas@2855: var index = $s.interface.options.findIndex(function (io) { nicholas@2855: return io.name == name; nicholas@2855: }); nicholas@2855: if (index == -1 && $event.currentTarget.checked) { nicholas@2855: var obj = $s.interface.options.push({ nicholas@2855: name: name, nicholas@2855: type: type nicholas@2855: }); nicholas@2855: if (name == "scalerange") { nicholas@2855: obj.min = $event.currentTarget.parentElement.querySelector("[name=min]").value; nicholas@2855: obj.max = $event.currentTarget.parentElement.querySelector("[name=max]").value; nicholas@2855: } nicholas@2855: } else if (index >= 0 && !$event.currentTarget.checked) { nicholas@2855: $s.interface.options.splice(index, 1); nicholas@2855: } nicholas@2853: } nicholas@2853: }]); nicholas@2856: AngularInterface.controller("page", ['$scope', '$element', '$window', function ($s, $e, $w) {}]);