annotate test_create/test_core.js @ 2884:596e83ffc73a

#76. Added popups to certain attributes in the test_creator.
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Mon, 26 Jun 2017 12:47:57 +0100
parents 88dff8b9247c
children 98209bb0fe87
rev   line source
nicholas@2862 1 /* globals document, angular, window, Promise, XMLHttpRequest, Specification, XMLSerializer, Blob, DOMParser, FileReader*/
nicholas@2851 2 function get(url) {
nicholas@2851 3 // Return a new promise.
nicholas@2851 4 return new Promise(function (resolve, reject) {
nicholas@2851 5 // Do the usual XHR stuff
nicholas@2851 6 var req = new XMLHttpRequest();
nicholas@2851 7 req.open('GET', url);
nickjillings@1370 8
nicholas@2851 9 req.onload = function () {
nicholas@2851 10 // This is called even on 404 etc
nicholas@2851 11 // so check the status
nicholas@2851 12 if (req.status == 200) {
nicholas@2851 13 // Resolve the promise with the response text
nicholas@2851 14 resolve(req.response);
nicholas@2851 15 } else {
nicholas@2851 16 // Otherwise reject with the status text
nicholas@2851 17 // which will hopefully be a meaningful error
nicholas@2851 18 reject(Error(req.statusText));
nicholas@2851 19 }
nicholas@2851 20 };
nicholas@2851 21
nicholas@2851 22 // Handle network errors
nicholas@2851 23 req.onerror = function () {
nicholas@2851 24 reject(Error("Network Error"));
nicholas@2851 25 };
nicholas@2851 26
nicholas@2851 27 // Make the request
nicholas@2851 28 req.send();
nicholas@2851 29 });
nickjillings@1370 30 }
nickjillings@1370 31
nicholas@2851 32 var AngularInterface = angular.module("creator", []);
nickjillings@1370 33
nicholas@2851 34 var specification = new Specification();
nickjillings@1370 35
nicholas@2535 36 window.onload = function () {
nicholas@2851 37 // Get the test interface specifications
nicholas@2884 38 $(function () {
nicholas@2884 39 $('[data-toggle="popover"]').popover();
nicholas@2884 40 });
nicholas@2851 41 };
nicholas@2535 42
nicholas@2861 43 function handleFiles(event) {
nicholas@2861 44 var s = angular.element(event.currentTarget).scope();
nicholas@2861 45 s.handleFiles(event);
nicholas@2861 46 s.$apply();
nicholas@2861 47 }
nicholas@2861 48
nicholas@2851 49 AngularInterface.controller("view", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2851 50 $s.popupVisible = true;
nicholas@2864 51 $s.testSpecifications = {};
nicholas@2864 52
nicholas@2864 53 (function () {
nicholas@2864 54 new Promise(function (resolve, reject) {
nicholas@2864 55 var xml = new XMLHttpRequest();
nicholas@2864 56 xml.open("GET", "test_create/interfaces/specifications.json");
nicholas@2864 57 xml.onload = function () {
nicholas@2864 58 if (xml.status === 200) {
nicholas@2864 59 resolve(xml.responseText);
nicholas@2864 60 return;
nicholas@2864 61 }
nicholas@2864 62 reject(xml.status);
nicholas@2864 63 };
nicholas@2864 64 xml.onerror = function () {
nicholas@2864 65 reject(new Error("Network Error"));
nicholas@2864 66 };
nicholas@2864 67 xml.send();
nicholas@2864 68 }).then(JSON.parse).then(function (data) {
nicholas@2864 69 $s.testSpecifications = data;
nicholas@2864 70 $s.$apply();
nicholas@2865 71 });
nicholas@2864 72 })();
nickjillings@1370 73
nicholas@2851 74 $s.showPopup = function () {
nicholas@2851 75 $s.popupVisible = true;
nicholas@2851 76 };
nicholas@2851 77 $s.hidePopup = function () {
nicholas@2851 78 $s.popupVisible = false;
nicholas@2851 79 };
nicholas@2851 80 $s.globalSchema = undefined;
nicholas@2851 81 get("xml/test-schema.xsd").then(function (text) {
nicholas@2851 82 specification.processSchema(text);
nicholas@2851 83 $s.globalSchema = specification.getSchema();
nicholas@2851 84 });
nicholas@2851 85 $s.specification = specification;
nicholas@2857 86
nicholas@2857 87 $s.addPage = function () {
nicholas@2857 88 $s.specification.createNewPage();
nicholas@2859 89 };
nicholas@2860 90
nicholas@2862 91 $s.removePage = function (page) {
nicholas@2862 92 var index = $s.specification.pages.findIndex(function (a) {
nicholas@2862 93 return a == page;
nicholas@2862 94 });
nicholas@2862 95 if (index === -1) {
nicholas@2862 96 throw ("Invalid Page");
nicholas@2862 97 }
nicholas@2862 98 $s.specification.pages.splice(index, 1);
nicholas@2862 99 };
nicholas@2862 100
nicholas@2860 101 $s.exportXML = function () {
nicholas@2860 102 var s = new XMLSerializer();
nicholas@2860 103 var doc = specification.encode();
nicholas@2860 104 var bb = new Blob([s.serializeToString(doc)], {
nicholas@2860 105 type: 'application/xml'
nicholas@2860 106 });
nicholas@2860 107 var dnlk = window.URL.createObjectURL(bb);
nicholas@2875 108 $w.open(dnlk, "_blank");
nicholas@2861 109 };
nicholas@2851 110 }]);
nickjillings@1370 111
nicholas@2851 112 AngularInterface.controller("introduction", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2851 113 $s.state = 0;
nicholas@2851 114 $s.next = function () {
nicholas@2851 115 $s.state++;
nicholas@2861 116 if ($s.state > 1 || $s.file) {
nicholas@2851 117 $s.hidePopup();
nicholas@2851 118 }
nicholas@2851 119 };
nicholas@2851 120 $s.back = function () {
nicholas@2851 121 $s.state--;
nicholas@2851 122 };
nicholas@2851 123 $s.mouseover = function (name) {
nicholas@2864 124 var obj = $s.testSpecifications.interfaces.find(function (i) {
nicholas@2851 125 return i.name == name;
nicholas@2851 126 });
nicholas@2851 127 if (obj) {
nicholas@2851 128 $s.description = obj.description.en;
nicholas@2851 129 }
nicholas@2851 130 };
nicholas@2851 131 $s.initialise = function (name) {
nicholas@2851 132 var obj = $s.interfaces.find(function (i) {
nicholas@2851 133 return i.name == name;
nicholas@2851 134 });
nicholas@2851 135 specification.interface = obj.interface;
nicholas@2851 136 };
nicholas@2851 137 // Get the test interface specifications
nicholas@2861 138 $s.file = undefined;
nicholas@2851 139 $s.description = "";
nicholas@2861 140
nicholas@2861 141 $s.handleFiles = function ($event) {
nicholas@2861 142 $s.file = $event.currentTarget.files[0];
nicholas@2861 143 var r = new FileReader();
nicholas@2861 144 r.onload = function () {
nicholas@2861 145 var p = new DOMParser();
nicholas@2861 146 specification.decode(p.parseFromString(r.result, "text/xml"));
nicholas@2861 147 $s.$apply();
nicholas@2862 148 };
nicholas@2861 149 r.readAsText($s.file);
nicholas@2861 150 };
nicholas@2851 151 }]);
nickjillings@1370 152
nicholas@2851 153 AngularInterface.controller("setup", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2851 154 function initialise() {
nicholas@2851 155 if ($s.globalSchema) {
nicholas@2851 156 $s.schema = $s.globalSchema.querySelector("[name=setup]");
nickjillings@1385 157 }
nickjillings@1370 158 }
nicholas@2851 159 $s.schema = undefined;
nicholas@2851 160 $s.attributes = [];
nickjillings@1370 161
nicholas@2851 162 $s.$watch("globalSchema", initialise);
nicholas@2853 163 $s.$watch("specification.metrics.enabled.length", function () {
nicholas@2853 164 var metricsNode = document.getElementById("metricsNode");
nicholas@2853 165 if (!$s.specification.metrics) {
nicholas@2853 166 return;
nicholas@2853 167 }
nicholas@2853 168 metricsNode.querySelectorAll("input").forEach(function (DOM) {
nicholas@2853 169 DOM.checked = false;
nicholas@2853 170 });
nicholas@2853 171 $s.specification.metrics.enabled.forEach(function (metric) {
nicholas@2853 172 var DOM = metricsNode.querySelector("[value=" + metric + "]");
nicholas@2853 173 if (DOM) {
nicholas@2853 174 DOM.checked = true;
nicholas@2853 175 }
nicholas@2853 176 });
nicholas@2855 177 });
nicholas@2853 178
nicholas@2853 179 $s.enableMetric = function ($event) {
nicholas@2853 180 var metric = $event.currentTarget.value;
nicholas@2853 181 var index = specification.metrics.enabled.findIndex(function (a) {
nicholas@2853 182 return a == metric;
nicholas@2853 183 });
nicholas@2853 184 if ($event.currentTarget.checked) {
nicholas@2853 185 if (index == -1) {
nicholas@2853 186 specification.metrics.enabled.push(metric);
nicholas@2853 187 }
nicholas@2853 188 } else {
nicholas@2853 189 if (index >= 0) {
nicholas@2853 190 specification.metrics.enabled.splice(index, 1);
nicholas@2853 191 }
nicholas@2853 192 }
nicholas@2855 193 };
nicholas@2851 194 }]);
nicholas@2853 195
nicholas@2858 196 AngularInterface.controller("survey", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2858 197 $s.addSurveyEntry = function () {
nicholas@2858 198 $s.survey.addOption();
nicholas@2858 199 };
nicholas@2858 200 $s.removeSurveyEntry = function (entry) {
nicholas@2858 201 var index = $s.survey.options.findIndex(function (a) {
nicholas@2858 202 return a == entry;
nicholas@2858 203 });
nicholas@2858 204 if (index === -1) {
nicholas@2858 205 throw ("Invalid Entry");
nicholas@2858 206 }
nicholas@2858 207 $s.survey.options.splice(index, 1);
nicholas@2858 208 };
nicholas@2858 209 }]);
nicholas@2858 210
nicholas@2853 211 AngularInterface.controller("surveyOption", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2853 212
nicholas@2853 213 $s.removeOption = function (option) {
nicholas@2853 214 var index = $s.opt.options.findIndex(function (a) {
nicholas@2853 215 return a == option;
nicholas@2853 216 });
nicholas@2853 217 if (index === -1) {
nicholas@2853 218 throw ("Invalid option");
nicholas@2853 219 }
nicholas@2853 220 $s.opt.options.splice(index, 1);
nicholas@2853 221 };
nicholas@2853 222 $s.addOption = function () {
nicholas@2853 223 $s.opt.options.push({
nicholas@2853 224 name: "",
nicholas@2853 225 text: ""
nicholas@2853 226 });
nicholas@2855 227 };
nicholas@2857 228
nicholas@2857 229 $s.addCondition = function () {
nicholas@2857 230 $s.opt.conditions.push({
nicholas@2857 231 check: "equals",
nicholas@2857 232 value: "",
nicholas@2857 233 jumpToOnPass: undefined,
nicholas@2857 234 jumpToOnFail: undefined
nicholas@2857 235 });
nicholas@2857 236 };
nicholas@2857 237
nicholas@2857 238 $s.removeCondition = function (condition) {
nicholas@2857 239 var index = $s.opt.conditions.findIndex(function (c) {
nicholas@2857 240 return c == condition;
nicholas@2857 241 });
nicholas@2857 242 if (index === -1) {
nicholas@2857 243 throw ("Invalid Condition");
nicholas@2857 244 }
nicholas@2857 245 $s.opt.conditions.splice(index, 1);
nicholas@2857 246 };
nicholas@2855 247 }]);
nicholas@2855 248
nicholas@2855 249 AngularInterface.controller("interfaceNode", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2855 250 $s.$watch("interface.options.length", function () {
nicholas@2855 251 if (!$s.interface || !$s.interface.options) {
nicholas@2855 252 return;
nicholas@2855 253 }
nicholas@2855 254 var options = $e[0].querySelector(".interfaceOptions").querySelectorAll(".attribute");
nicholas@2855 255 options.forEach(function (option) {
nicholas@2855 256 var name = option.getAttribute("name");
nicholas@2855 257 var index = $s.interface.options.findIndex(function (io) {
nicholas@2855 258 return io.name == name;
nicholas@2855 259 });
nicholas@2855 260 option.querySelector("input").checked = (index >= 0);
nicholas@2855 261 if (name == "scalerange" && index >= 0) {
nicholas@2855 262 option.querySelector("[name=min]").value = $s.interface.options[index].min;
nicholas@2855 263 option.querySelector("[name=max]").value = $s.interface.options[index].max;
nicholas@2855 264 }
nicholas@2855 265 });
nicholas@2855 266 });
nicholas@2855 267 $s.enableInterfaceOption = function ($event) {
nicholas@2855 268 var name = $event.currentTarget.parentElement.getAttribute("name");
nicholas@2855 269 var type = $event.currentTarget.parentElement.getAttribute("type");
nicholas@2855 270 var index = $s.interface.options.findIndex(function (io) {
nicholas@2855 271 return io.name == name;
nicholas@2855 272 });
nicholas@2855 273 if (index == -1 && $event.currentTarget.checked) {
nicholas@2855 274 var obj = $s.interface.options.push({
nicholas@2855 275 name: name,
nicholas@2855 276 type: type
nicholas@2855 277 });
nicholas@2855 278 if (name == "scalerange") {
nicholas@2855 279 obj.min = $event.currentTarget.parentElement.querySelector("[name=min]").value;
nicholas@2855 280 obj.max = $event.currentTarget.parentElement.querySelector("[name=max]").value;
nicholas@2855 281 }
nicholas@2855 282 } else if (index >= 0 && !$event.currentTarget.checked) {
nicholas@2855 283 $s.interface.options.splice(index, 1);
nicholas@2855 284 }
nicholas@2857 285 };
nicholas@2857 286 $s.removeScale = function (scale) {
nicholas@2857 287 var index = $s.interface.scales.findIndex(function (s) {
nicholas@2857 288 return s == scale;
nicholas@2857 289 });
nicholas@2857 290 if (index >= 0) {
nicholas@2857 291 $s.interface.scales.splice(index, 1);
nicholas@2857 292 }
nicholas@2857 293 };
nicholas@2857 294 $s.addScale = function () {
nicholas@2857 295 $s.interface.scales.push({
nicholas@2857 296 position: undefined,
nicholas@2857 297 text: undefined
nicholas@2857 298 });
nicholas@2857 299 };
nicholas@2864 300 $s.clearScales = function () {
nicholas@2864 301 $s.interface.scales = [];
nicholas@2864 302 };
nicholas@2876 303 $s.useScales = function (scale) {
nicholas@2864 304 $s.clearScales();
nicholas@2876 305 scale.scales.forEach(function (s) {
nicholas@2864 306 $s.interface.scales.push(s);
nicholas@2864 307 });
nicholas@2876 308 $s.selectedScale = "Scale: " + scale.name
nicholas@2864 309 };
nicholas@2876 310 $s.selectedScale = "Scale: Custom";
nicholas@2853 311 }]);
nicholas@2859 312 AngularInterface.controller("page", ['$scope', '$element', '$window', function ($s, $e, $w) {
nicholas@2859 313 $s.addInterface = function () {
nicholas@2859 314 $s.page.addInterface();
nicholas@2859 315 };
nicholas@2859 316 $s.removeInterface = function (node) {
nicholas@2859 317 var index = $s.page.interfaces.findIndex(function (a) {
nicholas@2859 318 return a == node;
nicholas@2859 319 });
nicholas@2859 320 if (index === -1) {
nicholas@2859 321 throw ("Invalid node");
nicholas@2859 322 }
nicholas@2859 323 $s.page.interfaces.splice(index, 1);
nicholas@2859 324 };
nicholas@2859 325
nicholas@2859 326 $s.addCommentQuestion = function () {
nicholas@2859 327 $s.page.addCommentQuestion();
nicholas@2859 328 };
nicholas@2859 329 $s.removeCommentQuestion = function (node) {
nicholas@2859 330 var index = $s.page.commentQuestions.findIndex(function (a) {
nicholas@2859 331 return a == node;
nicholas@2859 332 });
nicholas@2859 333 if (index === -1) {
nicholas@2859 334 throw ("Invalid node");
nicholas@2859 335 }
nicholas@2859 336 $s.page.commentQuestions.splice(index, 1);
nicholas@2859 337 };
nicholas@2859 338 $s.addAudioElement = function () {
nicholas@2859 339 $s.page.addAudioElement();
nicholas@2859 340 };
nicholas@2859 341 $s.removeAudioElement = function (element) {
nicholas@2859 342 var index = $s.page.audioElements.findIndex(function (a) {
nicholas@2859 343 return a == element;
nicholas@2859 344 });
nicholas@2859 345 if (index === -1) {
nicholas@2859 346 throw ("Invalid node");
nicholas@2859 347 }
nicholas@2859 348 $s.page.audioElements.splice(index, 1);
nicholas@2859 349 };
nicholas@2859 350 }]);