annotate test_create.html @ 2886:c70036f28226

Fixes for #76 and #97
author Nicholas Jillings <nicholas.jillings@mail.bcu.ac.uk>
date Tue, 27 Jun 2017 13:07:41 +0100
parents 596e83ffc73a
children cedaf7ee1b81
rev   line source
nicholas@2859 1 <html>
nicholas@2859 2
nicholas@2859 3 <head>
nicholas@2859 4 <meta http-equiv="content-type" content="text/html; charset=utf-8">
nicholas@2859 5 <!-- This defines the test creator tool for the Web Audio Evaluation Toolbox -->
nicholas@2859 6 <link rel="stylesheet" type="text/css" href="test_create/style.css" />
nicholas@2859 7 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
nicholas@2859 8 <script src="js/jquery-2.1.4.js"></script>
nicholas@2859 9 <script src="js/angular.min.js"></script>
nicholas@2859 10 <script type="text/javascript" src="js/specification.js"></script>
nicholas@2859 11 <script type="text/javascript" src="test_create/test_core.js"></script>
nicholas@2859 12 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js" integrity="sha384-Tc5IQib027qvyjSMfHjOMaLkfuWVxZxUPnCJA7l2mCWNIpG9mGCD8wGNIcPD7Txa" crossorigin="anonymous"></script>
nicholas@2859 13
nicholas@2859 14 <title>WAET 1.2.1 Test Creator</title>
nicholas@2859 15 </head>
nicholas@2859 16
nicholas@2859 17 <body>
nicholas@2859 18 <div ng-app="creator" ng-controller="view">
nicholas@2859 19 <div id="pageRoot">
nicholas@2859 20 <h1>Web Audio Evaluation Tool - Test Creator</h1>
nicholas@2859 21 </div>
nicholas@2860 22 <button type="button" class="btn btn-success" ng-click="exportXML()">Export XML</button>
nicholas@2859 23 <div id="setupNode" class="node" ng-controller="setup">
nicholas@2859 24 <h2>Setup</h2>
nicholas@2859 25 <div class="attributes">
nicholas@2859 26 <div class="attribute">
nicholas@2859 27 <span>Interface: </span>
nicholas@2877 28 <input type="text" ng-model="specification.interface" required/>
nicholas@2859 29 </div>
nicholas@2884 30 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="If you would like to save to a server other than your hosting server, you can place the full WAET URL here">
nicholas@2859 31 <span>Save URL: </span>
nicholas@2877 32 <input type="text" ng-model="specification.projectReturn" placeholder="save.php" />
nicholas@2859 33 </div>
nicholas@2884 34 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Once the test is completed and save confirmed, the browser will redirect to this page, if not defined.">
nicholas@2859 35 <span>Exit URL: </span>
nicholas@2859 36 <input type="text" ng-model="specification.returnURL" />
nicholas@2859 37 </div>
nicholas@2884 38 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Randomise the page order">
nicholas@2859 39 <span>Randomise Page Order: </span>
nicholas@2859 40 <input type="checkbox" ng-model="specification.randomiseOrder" />
nicholas@2859 41 </div>
nicholas@2884 42 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the number of pages to present to the user. This includes repeated pages. Set to '0' or blank to ignore. Randomise page order must be selected.">
nicholas@2859 43 <span>Page Pool Size: </span>
nicholas@2859 44 <input type="number" ng-model="specification.poolSize" min="0" />
nicholas@2859 45 </div>
nicholas@2884 46 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Automatically analyse and normalsie audio to this target LUFS. If unsure, use -25LUFS. 0 or blank disables normalisation">
nicholas@2859 47 <span>Loudness Normalisation (LUFS): </span>
nicholas@2859 48 <input type="number" ng-model="specification.loudness" max="0" />
nicholas@2859 49 </div>
nicholas@2884 50 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Only perform the test if the browser reported sampling rate matches this.">
nicholas@2859 51 <span>Fixed Sampling Rate: </span>
nicholas@2859 52 <input type="number" ng-model="specification.sampleRate" min="0" />
nicholas@2859 53 </div>
nicholas@2884 54 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Show a 'method of adjustment' audio calibration before testing.">
nicholas@2859 55 <span>Pre-Test audio calibration: </span>
nicholas@2859 56 <input type="checkbox" ng-model="specification.calibration" />
nicholas@2859 57 </div>
nicholas@2884 58 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default cross-fade time when switching between elements. Can be over-ridden on each page">
nicholas@2859 59 <span>Global Cross-fade time: </span>
nicholas@2859 60 <input type="number" ng-model="specification.crossFade" min="0" step="0.1" />
nicholas@2859 61 </div>
nicholas@2884 62 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default pre-play element silence. Can be over-ridden on each page and element">
nicholas@2859 63 <span>Global Fragment Pre-Silence: </span>
nicholas@2859 64 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" />
nicholas@2859 65 </div>
nicholas@2884 66 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Default post-play element silence. Can be over-ridden on each page and element">
nicholas@2859 67 <span>Global Fragment Post-Silence: </span>
nicholas@2859 68 <input type="number" ng-model="specification.preSilence" min="0" step="0.1" />
nicholas@2859 69 </div>
nicholas@2884 70 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio elements">
nicholas@2859 71 <span>Play audio one-at-a-time: </span>
nicholas@2859 72 <input type="checkbox" ng-model="specification.playOne" />
nicholas@2859 73 </div>
nicholas@2884 74 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Minimum number of times an audio fragment must be played">
nicholas@2874 75 <span>Minimum number of fragment plays</span>
nicholas@2874 76 <input type="number" ng-model="specification.minNumberPlays" min="0" max="{{specification.maxNumberPlays}}" />
nicholas@2874 77 </div>
nicholas@2884 78 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Maximum number of times an audio fragment can be played">
nicholas@2874 79 <span>Maximum number of fragment plays</span>
nicholas@2874 80 <input type="number" ng-model="specification.maxNumberPlays" min="{{specification.minNumberPlays || 0}}" />
nicholas@2874 81 </div>
nicholas@2859 82 </div>
nicholas@2859 83 <div class="node">
nicholas@2859 84 <h2>Test Completed Message</h2>
nicholas@2884 85 <textarea ng-model="specification.exitText" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Once the test is completed, you can show a message to the user. Markdown syntax is supported for formatting."></textarea>
nicholas@2859 86 </div>
nicholas@2859 87 <div id="metricsNode" class="node">
nicholas@2859 88 <h3>Session Metrics</h3>
nicholas@2859 89 <div class="attributes">
nicholas@2884 90 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Report the total test participation time">
nicholas@2859 91 <span>Collect Total Test Time: </span>
nicholas@2859 92 <input type="checkbox" value="testTimer" ng-click="enableMetric($event)" />
nicholas@2859 93 </div>
nicholas@2884 94 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Collect the accumulative listening time for each fragment">
nicholas@2859 95 <span>Collect Fragment Listen Time: </span>
nicholas@2859 96 <input type="checkbox" value="elementTimer" ng-click="enableMetric($event)" />
nicholas@2859 97 </div>
nicholas@2884 98 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store the initial position of the fragment">
nicholas@2859 99 <span>Collect Fragment Initial Position: </span>
nicholas@2859 100 <input type="checkbox" value="elementInitialPosition" ng-click="enableMetric($event)" />
nicholas@2859 101 </div>
nicholas@2884 102 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store each movement / value change of each fragment with page-relative timestamps.">
nicholas@2884 103 <span>Collect Fragment Movements: </span>
nicholas@2859 104 <input type="checkbox" value="elementTracker" ng-click="enableMetric($event)" />
nicholas@2859 105 </div>
nicholas@2884 106 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store boolean reporting if a fragment has been played">
nicholas@2859 107 <span>Collect Fragment Listened To Flag: </span>
nicholas@2859 108 <input type="checkbox" value="elementFlagListenedTo" ng-click="enableMetric($event)" />
nicholas@2859 109 </div>
nicholas@2884 110 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store boolean reporting if a fragment has been moved">
nicholas@2859 111 <span>Collect Fragment Moved Flag: </span>
nicholas@2859 112 <input type="checkbox" value="elementFlagMoved" ng-click="enableMetric($event)" />
nicholas@2859 113 </div>
nicholas@2884 114 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Store each time a fragment starts and stops playback with page relative timestamps. Also holds fragment relative timestamps.">
nicholas@2859 115 <span>Collect Fragment Listened Flag: </span>
nicholas@2859 116 <input type="checkbox" value="elementListenTracker" ng-click="enableMetric($event)" />
nicholas@2859 117 </div>
nicholas@2859 118 </div>
nicholas@2859 119 </div>
nicholas@2859 120 <div id="globalpresurvey" class="node" ng-controller="survey" ng-init="survey = specification.preTest">
nicholas@2859 121 <h2>Pre Test Survey</h2>
nicholas@2859 122 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
nicholas@2859 123 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 124 <h3>Survey Entry</h3>
nicholas@2859 125 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 126 <div class="attributes">
nicholas@2859 127 <div class="attribute">
nicholas@2859 128 <span>Survey Type: </span>
nicholas@2859 129 <select ng-model="opt.type">
nicholas@2859 130 <option value="question">Question</option>
nicholas@2859 131 <option value="radio">Radio</option>
nicholas@2859 132 <option value="checkbox">Checkbox</option>
nicholas@2859 133 <option value="statement">Statement</option>
nicholas@2859 134 <option value="number">Number</option>
nicholas@2859 135 <option value="slider">Slider</option>
nicholas@2859 136 <option value="video">Video</option>
nicholas@2859 137 <option value="youtube">YouTube</option>
nicholas@2859 138 </select>
nicholas@2859 139 </div>
nicholas@2859 140 <div class="attribute">
nicholas@2859 141 <span>Unique Survey Entry ID:</span>
nicholas@2877 142 <input type="text" ng-model="opt.id" required/>
nicholas@2859 143 </div>
nicholas@2859 144 <div class="attribute">
nicholas@2859 145 <span>Entry Name:</span>
nicholas@2859 146 <input type="text" ng-model="opt.name" />
nicholas@2859 147 </div>
nicholas@2859 148 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 149 <span>Mandatory:</span>
nicholas@2859 150 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 151 </div>
nicholas@2859 152 <div class="attribute">
nicholas@2859 153 <span>Minimum Wait Time (s):</span>
nicholas@2859 154 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 155 </div>
nicholas@2859 156 <div class="attribute" ng-show="opt.type == 'question'">
nicholas@2859 157 <span>Box Size:</span>
nicholas@2859 158 <select ng-model="opt.boxsize">
nicholas@2859 159 <option value="small">Small</option>
nicholas@2859 160 <option value="normal">Normal</option>
nicholas@2859 161 <option value="large">Large</option>
nicholas@2859 162 <option value="huge">Huge</option>
nicholas@2859 163 </select>
nicholas@2859 164 </div>
nicholas@2859 165 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 166 <span>Minimum Selected:</span>
nicholas@2859 167 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 168 </div>
nicholas@2859 169 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 170 <span>Maximum Selected:</span>
nicholas@2859 171 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 172 </div>
nicholas@2859 173 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 174 <span>Minimum Value:</span>
nicholas@2859 175 <input type="number" ng-model="opt.min" />
nicholas@2859 176 </div>
nicholas@2859 177 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 178 <span>Maximum Value:</span>
nicholas@2859 179 <input type="number" ng-model="opt.max" />
nicholas@2859 180 </div>
nicholas@2859 181 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0">
nicholas@2859 182 <span>Video URL:</span>
nicholas@2859 183 <input type="text" ng-model="opt.url" />
nicholas@2859 184 </div>
nicholas@2859 185 </div>
nicholas@2859 186 <div class="node">
nicholas@2859 187 <h4>Statement</h4>
nicholas@2859 188 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 189 </div>
nicholas@2859 190 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 191 <h4>Options</h4>
nicholas@2859 192 <div>
nicholas@2859 193 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 194 </div>
nicholas@2859 195 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 196 <div class="attributes">
nicholas@2859 197 <div class="attribute">
nicholas@2859 198 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 199 </div>
nicholas@2859 200 <div class="attribute">
nicholas@2859 201 <span>Name: </span>
nicholas@2877 202 <input type="text" ng-model="option.name" required/>
nicholas@2859 203 </div>
nicholas@2859 204 <div class="attribute">
nicholas@2859 205 <span>Displayed Text: </span>
nicholas@2877 206 <input type="text" ng-model="option.text" required/>
nicholas@2859 207 </div>
nicholas@2859 208 </div>
nicholas@2859 209 </div>
nicholas@2859 210 </div>
nicholas@2859 211 <div class="node">
nicholas@2859 212 <h4>Conditionals</h4>
nicholas@2859 213 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 214 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 215 <div class="attributes">
nicholas@2859 216 <div class="attribute">
nicholas@2859 217 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 218 </div>
nicholas@2859 219 <div class="attribute">
nicholas@2859 220 <span>Check Type:</span>
nicholas@2859 221 <select ng-model="condition.check">
nicholas@2859 222 <option value="equals">Equal To</option>
nicholas@2859 223 <option value="lessThan">Less Than</option>
nicholas@2859 224 <option value="greaterThan">Greater Than</option>
nicholas@2859 225 <option value="stringContains">String Contains</option>
nicholas@2859 226 </select>
nicholas@2859 227 </div>
nicholas@2859 228 <div class="attribute">
nicholas@2859 229 <span>Value: </span>
nicholas@2877 230 <input type="text" ng-model="condition.value" required/>
nicholas@2859 231 </div>
nicholas@2859 232 <div class="attribute">
nicholas@2859 233 <span>Jump To On Pass: </span>
nicholas@2859 234 <select ng-model="condition.jumpToOnPass">
nicholas@2859 235 <option value="">None</option>
nicholas@2859 236 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 237 </select>
nicholas@2859 238 </div>
nicholas@2859 239 <div class="attribute">
nicholas@2859 240 <span>Jump To On Fail: </span>
nicholas@2859 241 <select ng-model="condition.jumpToOnFail">
nicholas@2859 242 <option value="">None</option>
nicholas@2859 243 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 244 </select>
nicholas@2859 245 </div>
nicholas@2859 246 </div>
nicholas@2859 247 </div>
nicholas@2859 248 </div>
nicholas@2859 249 </div>
nicholas@2859 250 </div>
nicholas@2859 251 <div id="globalpostsurvey" class="node" ng-controller="survey" ng-init="survey = specification.postTest">
nicholas@2859 252 <h2>Post Test Survey</h2>
nicholas@2859 253 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
nicholas@2859 254 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 255 <h3>Survey Entry</h3>
nicholas@2859 256 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 257 <div class="attributes">
nicholas@2859 258 <div class="attribute">
nicholas@2859 259 <span>Survey Type: </span>
nicholas@2859 260 <select ng-model="opt.type">
nicholas@2859 261 <option value="question">Question</option>
nicholas@2859 262 <option value="radio">Radio</option>
nicholas@2859 263 <option value="checkbox">Checkbox</option>
nicholas@2859 264 <option value="statement">Statement</option>
nicholas@2859 265 <option value="number">Number</option>
nicholas@2859 266 <option value="slider">Slider</option>
nicholas@2859 267 <option value="video">Video</option>
nicholas@2859 268 <option value="youtube">YouTube</option>
nicholas@2859 269 </select>
nicholas@2859 270 </div>
nicholas@2859 271 <div class="attribute">
nicholas@2859 272 <span>Unique Survey Entry ID:</span>
nicholas@2877 273 <input type="text" ng-model="opt.id" required/>
nicholas@2859 274 </div>
nicholas@2859 275 <div class="attribute">
nicholas@2859 276 <span>Entry Name:</span>
nicholas@2859 277 <input type="text" ng-model="opt.name" />
nicholas@2859 278 </div>
nicholas@2859 279 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 280 <span>Mandatory:</span>
nicholas@2859 281 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 282 </div>
nicholas@2859 283 <div class="attribute">
nicholas@2859 284 <span>Minimum Wait Time (s):</span>
nicholas@2859 285 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 286 </div>
nicholas@2859 287 <div class="attribute" ng-show="opt.type == 'question'">
nicholas@2859 288 <span>Box Size:</span>
nicholas@2859 289 <select ng-model="opt.boxsize">
nicholas@2859 290 <option value="small">Small</option>
nicholas@2859 291 <option value="normal">Normal</option>
nicholas@2859 292 <option value="large">Large</option>
nicholas@2859 293 <option value="huge">Huge</option>
nicholas@2859 294 </select>
nicholas@2859 295 </div>
nicholas@2859 296 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 297 <span>Minimum Selected:</span>
nicholas@2859 298 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 299 </div>
nicholas@2859 300 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 301 <span>Maximum Selected:</span>
nicholas@2859 302 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 303 </div>
nicholas@2859 304 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 305 <span>Minimum Value:</span>
nicholas@2859 306 <input type="number" ng-model="opt.min" />
nicholas@2859 307 </div>
nicholas@2859 308 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 309 <span>Maximum Value:</span>
nicholas@2859 310 <input type="number" ng-model="opt.max" />
nicholas@2859 311 </div>
nicholas@2859 312 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0">
nicholas@2859 313 <span>Video URL:</span>
nicholas@2859 314 <input type="text" ng-model="opt.url" />
nicholas@2859 315 </div>
nicholas@2859 316 </div>
nicholas@2859 317 <div class="node">
nicholas@2859 318 <h4>Statement</h4>
nicholas@2859 319 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 320 </div>
nicholas@2859 321 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 322 <h4>Options</h4>
nicholas@2859 323 <div>
nicholas@2859 324 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 325 </div>
nicholas@2859 326 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 327 <div class="attributes">
nicholas@2859 328 <div class="attribute">
nicholas@2859 329 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 330 </div>
nicholas@2859 331 <div class="attribute">
nicholas@2859 332 <span>Name: </span>
nicholas@2877 333 <input type="text" ng-model="option.name" required/>
nicholas@2859 334 </div>
nicholas@2859 335 <div class="attribute">
nicholas@2859 336 <span>Displayed Text: </span>
nicholas@2877 337 <input type="text" ng-model="option.text" required/>
nicholas@2859 338 </div>
nicholas@2859 339 </div>
nicholas@2859 340 </div>
nicholas@2859 341 </div>
nicholas@2859 342 <div class="node">
nicholas@2859 343 <h4>Conditionals</h4>
nicholas@2859 344 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 345 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 346 <div class="attributes">
nicholas@2859 347 <div class="attribute">
nicholas@2859 348 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 349 </div>
nicholas@2859 350 <div class="attribute">
nicholas@2859 351 <span>Check Type:</span>
nicholas@2859 352 <select ng-model="condition.check">
nicholas@2859 353 <option value="equals">Equal To</option>
nicholas@2859 354 <option value="lessThan">Less Than</option>
nicholas@2859 355 <option value="greaterThan">Greater Than</option>
nicholas@2859 356 <option value="stringContains">String Contains</option>
nicholas@2859 357 </select>
nicholas@2859 358 </div>
nicholas@2859 359 <div class="attribute">
nicholas@2859 360 <span>Value: </span>
nicholas@2877 361 <input type="text" ng-model="condition.value" required/>
nicholas@2859 362 </div>
nicholas@2859 363 <div class="attribute">
nicholas@2859 364 <span>Jump To On Pass: </span>
nicholas@2859 365 <select ng-model="condition.jumpToOnPass">
nicholas@2859 366 <option value="">None</option>
nicholas@2859 367 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 368 </select>
nicholas@2859 369 </div>
nicholas@2859 370 <div class="attribute">
nicholas@2859 371 <span>Jump To On Fail: </span>
nicholas@2859 372 <select ng-model="condition.jumpToOnFail">
nicholas@2859 373 <option value="">None</option>
nicholas@2859 374 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 375 </select>
nicholas@2859 376 </div>
nicholas@2859 377 </div>
nicholas@2859 378 </div>
nicholas@2859 379 </div>
nicholas@2859 380 </div>
nicholas@2859 381 </div>
nicholas@2859 382 <div id="globalinterface" class="node" ng-controller="interfaceNode" ng-init="interface = specification.interfaces">
nicholas@2859 383 <h2>Interface (Globals)</h2>
nicholas@2859 384 <div class="node interfaceOptions">
nicholas@2859 385 <div class="attributes">
nicholas@2859 386 <div class="attribute" name="fragmentPlayed" type="check">
nicholas@2859 387 <span>Check all fragments played: </span>
nicholas@2859 388 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 389 </div>
nicholas@2859 390 <div class="attribute" name="fragmentFullPlayback" type="check">
nicholas@2859 391 <span>Check all fragments fully played: </span>
nicholas@2859 392 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 393 </div>
nicholas@2859 394 <div class="attribute" name="fragmentMoved" type="check">
nicholas@2859 395 <span>Check all fragments have been moved: </span>
nicholas@2859 396 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 397 </div>
nicholas@2859 398 <div class="attribute" name="fragmentComments" type="check">
nicholas@2859 399 <span>Check all fragments have comments: </span>
nicholas@2859 400 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 401 </div>
nicholas@2859 402 <div class="attribute" name="scalerange" type="check">
nicholas@2859 403 <span>Enforce a scale usage: </span>
nicholas@2859 404 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 405 <span>Minimum:</span>
nicholas@2859 406 <input type="number" min="0" max="100" name="min" />
nicholas@2859 407 <span>Maximum:</span>
nicholas@2859 408 <input type="number" min="0" max="100" name="max" />
nicholas@2859 409 </div>
nicholas@2859 410 <div class="attribute" name="volume" type="show">
nicholas@2859 411 <span>Show master volume control: </span>
nicholas@2859 412 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 413 </div>
nicholas@2859 414 <div class="attribute" name="playhead" type="show">
nicholas@2859 415 <span>Show playhead: </span>
nicholas@2859 416 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 417 </div>
nicholas@2859 418 <div class="attribute" name="page-count" type="show">
nicholas@2859 419 <span>Show Page Count: </span>
nicholas@2859 420 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 421 </div>
nicholas@2859 422 <div class="attribute" name="comments" type="show">
nicholas@2859 423 <span>Show Fragment Comments: </span>
nicholas@2859 424 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 425 </div>
nicholas@2859 426 </div>
nicholas@2859 427 </div>
nicholas@2859 428 </div>
nicholas@2859 429 </div>
nicholas@2859 430 <div style="text-align: center;">
nicholas@2859 431 <button type="button" class="btn btn-success" ng-click="addPage()">Add Page</button>
nicholas@2859 432 </div>
nicholas@2859 433 <div class="node pageNode" ng-controller="page" ng-repeat="page in specification.pages">
nicholas@2859 434 <h2>Page</h2>
nicholas@2862 435 <button type="button" class="btn btn-danger" ng-click="removePage(page)">Remove Page</button>
nicholas@2859 436 <div class="attributes">
nicholas@2859 437 <div class="attribute">
nicholas@2859 438 <span>Unique ID: </span>
nicholas@2877 439 <input type="text" ng-model="page.id" required/>
nicholas@2859 440 </div>
nicholas@2884 441 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Define the common root of each fragment URL. For example if every fragment URL starts with 'http://example.org/media/' then this can be placed here and the remainder for each fragment in their respective URL boxed.">
nicholas@2859 442 <span>Fragment common-root URL: </span>
nicholas@2859 443 <input type="text" ng-model="page.hostURL" />
nicholas@2859 444 </div>
nicholas@2859 445 <div class="attribute">
nicholas@2859 446 <span>Randomise Fragment Order: </span>
nicholas@2859 447 <input type="checkbox" ng-model="page.randomiseOrder" />
nicholas@2859 448 </div>
nicholas@2884 449 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Specify if this page should be repeated and how many times. Please note, that if page-pooling is also selected then it 'may' not repeat as many times.">
nicholas@2859 450 <span>Repeat Page N-times: </span>
nicholas@2877 451 <input type="number" ng-model="page.repeatCount" value="0" step="1" />
nicholas@2859 452 </div>
nicholas@2884 453 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Loop audio playback until manually stopped or the page submit button is pressed">
nicholas@2859 454 <span>Loop audio: </span>
nicholas@2859 455 <input type="checkbox" ng-model="page.loop" />
nicholas@2859 456 </div>
nicholas@2884 457 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Synchronise playback of each fragment in this page. If all fragments have the same audio (such as mix evaluations) then this can enable users to seemlessly transition. Otherwise audio will start from the beginning of each fragment">
nicholas@2859 458 <span>Synchronous audio playback: </span>
nicholas@2859 459 <input type="checkbox" ng-model="page.synchronous" />
nicholas@2859 460 </div>
nicholas@2884 461 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global loudness normalisation">
nicholas@2859 462 <span>Loudness (page): </span>
nicholas@2859 463 <input type="number" ng-model="page.loudness" max="0" />
nicholas@2859 464 </div>
nicholas@2884 465 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Label type to display on the fragments.">
nicholas@2859 466 <span>Label type: </span>
nicholas@2859 467 <select ng-model="page.label">
nicholas@2859 468 <option value="default">Default</option>
nicholas@2859 469 <option value="none">None</option>
nicholas@2859 470 <option value="number">[1, 2, 3...]</option>
nicholas@2859 471 <option value="letter">[a, b, c...]</option>
nicholas@2859 472 <option value="capital">[A, B, C...]</option>
nicholas@2859 473 <option value="samediff" ng-show="specification.interface == 'AB'">[Same, Different]</option>
nicholas@2859 474 </select>
nicholas@2859 475 </div>
nicholas@2859 476 <div class="attribute" ng-show="page.label != 'default' && page.label != 'none'">
nicholas@2859 477 <span>Label Start: </span>
nicholas@2859 478 <input type="text" ng-model="page.labelStart" />
nicholas@2859 479 </div>
nicholas@2884 480 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Select a subgroup of the given audio fragments to display. 0 or blank means all fragments will be displayed.">
nicholas@2859 481 <span>Fragment pool size: </span>
nicholas@2859 482 <input type="number" ng-model="page.poolSize" min="0" max="page.audioElements.length" />
nicholas@2859 483 </div>
nicholas@2884 484 <div class="attribute" ng-show="specification.poolSize > 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always display this page, even after sub-pooling of pages">
nicholas@2859 485 <span>Always include page: </span>
nicholas@2859 486 <input type="checkbox" ng-model="page.alwaysInclude" />
nicholas@2859 487 </div>
nicholas@2884 488 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always show this page in this position. Useful for training pages to ensure they are always positioned first.">
nicholas@2859 489 <span>Fixed Page Position: </span>
nicholas@2859 490 <input type="number" ng-model="page.position" min="0" max="{{specification.pages.length}}" />
nicholas@2859 491 </div>
nicholas@2884 492 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global pre-silence">
nicholas@2859 493 <span>Fragment pre-silence: </span>
nicholas@2859 494 <input type="number" ng-model="page.preSilence" min="0" step="0.1" />
nicholas@2859 495 </div>
nicholas@2884 496 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global post-silence">
nicholas@2859 497 <span>Fragment post-silence: </span>
nicholas@2859 498 <input type="number" ng-model="page.postSilence" min="0" step="0.1" />
nicholas@2859 499 </div>
nicholas@2884 500 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Disable switching of audio">
nicholas@2859 501 <span>Cannot interupt audio: </span>
nicholas@2859 502 <input type="checkbox" ng-model="page.playOne" />
nicholas@2859 503 </div>
nicholas@2884 504 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Only allow playing fragments' interface handle to be manipulated during playback.">
nicholas@2859 505 <span>Only move playing audio: </span>
nicholas@2859 506 <input type="checkbox" ng-model="page.restrictMovement" />
nicholas@2859 507 </div>
nicholas@2884 508 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global minimum number of fragment plays">
nicholas@2874 509 <span>Minimum number of fragment plays</span>
nicholas@2874 510 <input type="number" ng-model="page.minNumberPlays" min="0" max="{{page.maxNumberPlays || specification.maxNumberPlays}}" />
nicholas@2874 511 </div>
nicholas@2884 512 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global maximum number of fragment plays">
nicholas@2874 513 <span>Maximum number of fragment plays</span>
nicholas@2874 514 <input type="number" ng-model="page.maxNumberPlays" min="{{page.minNumberPlays || specification.minNumberPlays || 0}}" />
nicholas@2874 515 </div>
nicholas@2859 516 </div>
nicholas@2884 517 <div class="node" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the title of the page">
nicholas@2859 518 <h3>Page Title</h3>
nicholas@2859 519 <textarea ng-model="page.title"></textarea>
nicholas@2859 520 </div>
nicholas@2859 521 <div class="node">
nicholas@2859 522 <h3>Comment box text prefix</h3>
nicholas@2859 523 <textarea ng-model="page.commentboxprefix"></textarea>
nicholas@2859 524 <p>Example:
nicholas@2859 525 <span style="font-weight:600">{{page.commentboxprefix}} A</span>
nicholas@2859 526 </p>
nicholas@2859 527 </div>
nicholas@2859 528 <div class="node" ng-controller="survey" ng-init="survey = page.preTest">
nicholas@2859 529 <h2>Pre Page Survey</h2>
nicholas@2859 530 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
nicholas@2859 531 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 532 <h3>Survey Entry</h3>
nicholas@2859 533 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 534 <div class="attributes">
nicholas@2859 535 <div class="attribute">
nicholas@2859 536 <span>Survey Type: </span>
nicholas@2859 537 <select ng-model="opt.type">
nicholas@2859 538 <option value="question">Question</option>
nicholas@2859 539 <option value="radio">Radio</option>
nicholas@2859 540 <option value="checkbox">Checkbox</option>
nicholas@2859 541 <option value="statement">Statement</option>
nicholas@2859 542 <option value="number">Number</option>
nicholas@2859 543 <option value="slider">Slider</option>
nicholas@2859 544 <option value="video">Video</option>
nicholas@2859 545 <option value="youtube">YouTube</option>
nicholas@2859 546 </select>
nicholas@2859 547 </div>
nicholas@2859 548 <div class="attribute">
nicholas@2859 549 <span>Unique Survey Entry ID:</span>
nicholas@2877 550 <input type="text" ng-model="opt.id" required/>
nicholas@2859 551 </div>
nicholas@2859 552 <div class="attribute">
nicholas@2859 553 <span>Entry Name:</span>
nicholas@2859 554 <input type="text" ng-model="opt.name" />
nicholas@2859 555 </div>
nicholas@2859 556 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 557 <span>Mandatory:</span>
nicholas@2859 558 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 559 </div>
nicholas@2859 560 <div class="attribute">
nicholas@2859 561 <span>Minimum Wait Time (s):</span>
nicholas@2859 562 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 563 </div>
nicholas@2859 564 <div class="attribute" ng-show="opt.type == 'question'">
nicholas@2859 565 <span>Box Size:</span>
nicholas@2859 566 <select ng-model="opt.boxsize">
nicholas@2859 567 <option value="small">Small</option>
nicholas@2859 568 <option value="normal">Normal</option>
nicholas@2859 569 <option value="large">Large</option>
nicholas@2859 570 <option value="huge">Huge</option>
nicholas@2859 571 </select>
nicholas@2859 572 </div>
nicholas@2859 573 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 574 <span>Minimum Selected:</span>
nicholas@2859 575 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 576 </div>
nicholas@2859 577 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 578 <span>Maximum Selected:</span>
nicholas@2859 579 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 580 </div>
nicholas@2859 581 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 582 <span>Minimum Value:</span>
nicholas@2859 583 <input type="number" ng-model="opt.min" />
nicholas@2859 584 </div>
nicholas@2859 585 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 586 <span>Maximum Value:</span>
nicholas@2859 587 <input type="number" ng-model="opt.max" />
nicholas@2859 588 </div>
nicholas@2859 589 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0">
nicholas@2859 590 <span>Video URL:</span>
nicholas@2859 591 <input type="text" ng-model="opt.url" />
nicholas@2859 592 </div>
nicholas@2859 593 </div>
nicholas@2859 594 <div class="node">
nicholas@2859 595 <h4>Statement</h4>
nicholas@2859 596 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 597 </div>
nicholas@2859 598 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 599 <h4>Options</h4>
nicholas@2859 600 <div>
nicholas@2859 601 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 602 </div>
nicholas@2859 603 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 604 <div class="attributes">
nicholas@2859 605 <div class="attribute">
nicholas@2859 606 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 607 </div>
nicholas@2859 608 <div class="attribute">
nicholas@2859 609 <span>Name: </span>
nicholas@2877 610 <input type="text" ng-model="option.name" required/>
nicholas@2859 611 </div>
nicholas@2859 612 <div class="attribute">
nicholas@2859 613 <span>Displayed Text: </span>
nicholas@2877 614 <input type="text" ng-model="option.text" required/>
nicholas@2859 615 </div>
nicholas@2859 616 </div>
nicholas@2859 617 </div>
nicholas@2859 618 </div>
nicholas@2859 619 <div class="node">
nicholas@2859 620 <h4>Conditionals</h4>
nicholas@2859 621 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 622 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 623 <div class="attributes">
nicholas@2859 624 <div class="attribute">
nicholas@2859 625 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 626 </div>
nicholas@2859 627 <div class="attribute">
nicholas@2859 628 <span>Check Type:</span>
nicholas@2859 629 <select ng-model="condition.check">
nicholas@2859 630 <option value="equals">Equal To</option>
nicholas@2859 631 <option value="lessThan">Less Than</option>
nicholas@2859 632 <option value="greaterThan">Greater Than</option>
nicholas@2859 633 <option value="stringContains">String Contains</option>
nicholas@2859 634 </select>
nicholas@2859 635 </div>
nicholas@2859 636 <div class="attribute">
nicholas@2859 637 <span>Value: </span>
nicholas@2877 638 <input type="text" ng-model="condition.value" required/>
nicholas@2859 639 </div>
nicholas@2859 640 <div class="attribute">
nicholas@2859 641 <span>Jump To On Pass: </span>
nicholas@2859 642 <select ng-model="condition.jumpToOnPass">
nicholas@2859 643 <option value="">None</option>
nicholas@2859 644 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 645 </select>
nicholas@2859 646 </div>
nicholas@2859 647 <div class="attribute">
nicholas@2859 648 <span>Jump To On Fail: </span>
nicholas@2859 649 <select ng-model="condition.jumpToOnFail">
nicholas@2859 650 <option value="">None</option>
nicholas@2859 651 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 652 </select>
nicholas@2859 653 </div>
nicholas@2859 654 </div>
nicholas@2859 655 </div>
nicholas@2859 656 </div>
nicholas@2859 657 </div>
nicholas@2859 658 </div>
nicholas@2867 659 <div class="node" ng-controller="survey" ng-init="survey = page.postTest">
nicholas@2859 660 <h2>Post Page Survey</h2>
nicholas@2859 661 <button type="button" class="btn btn-success" ng-click="addSurveyEntry()">Add Entry</button>
nicholas@2859 662 <div class="node" ng-repeat="opt in survey.options" ng-controller="surveyOption">
nicholas@2859 663 <h3>Survey Entry</h3>
nicholas@2859 664 <button type="button" class="btn btn-danger" ng-click="removeSurveyEntry(opt);">Delete Entry</button>
nicholas@2859 665 <div class="attributes">
nicholas@2859 666 <div class="attribute">
nicholas@2859 667 <span>Survey Type: </span>
nicholas@2859 668 <select ng-model="opt.type">
nicholas@2859 669 <option value="question">Question</option>
nicholas@2859 670 <option value="radio">Radio</option>
nicholas@2859 671 <option value="checkbox">Checkbox</option>
nicholas@2859 672 <option value="statement">Statement</option>
nicholas@2859 673 <option value="number">Number</option>
nicholas@2859 674 <option value="slider">Slider</option>
nicholas@2859 675 <option value="video">Video</option>
nicholas@2859 676 <option value="youtube">YouTube</option>
nicholas@2859 677 </select>
nicholas@2859 678 </div>
nicholas@2859 679 <div class="attribute">
nicholas@2859 680 <span>Unique Survey Entry ID:</span>
nicholas@2877 681 <input type="text" ng-model="opt.id" required />
nicholas@2859 682 </div>
nicholas@2859 683 <div class="attribute">
nicholas@2859 684 <span>Entry Name:</span>
nicholas@2859 685 <input type="text" ng-model="opt.name" />
nicholas@2859 686 </div>
nicholas@2859 687 <div class="attribute" ng-show="['question', 'checkbox', 'radio', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 688 <span>Mandatory:</span>
nicholas@2859 689 <input type="checkbox" ng-model="opt.mandatory" />
nicholas@2859 690 </div>
nicholas@2859 691 <div class="attribute">
nicholas@2859 692 <span>Minimum Wait Time (s):</span>
nicholas@2859 693 <input type="number" ng-model="opt.minWait" min="0" />
nicholas@2859 694 </div>
nicholas@2859 695 <div class="attribute" ng-show="opt.type == 'question'">
nicholas@2859 696 <span>Box Size:</span>
nicholas@2859 697 <select ng-model="opt.boxsize">
nicholas@2859 698 <option value="small">Small</option>
nicholas@2859 699 <option value="normal">Normal</option>
nicholas@2859 700 <option value="large">Large</option>
nicholas@2859 701 <option value="huge">Huge</option>
nicholas@2859 702 </select>
nicholas@2859 703 </div>
nicholas@2859 704 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 705 <span>Minimum Selected:</span>
nicholas@2859 706 <input type="number" ng-model="opt.min" min="0" />
nicholas@2859 707 </div>
nicholas@2859 708 <div class="attribute" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 709 <span>Maximum Selected:</span>
nicholas@2859 710 <input type="number" ng-model="opt.max" max="{{opt.options.length}}" />
nicholas@2859 711 </div>
nicholas@2859 712 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 713 <span>Minimum Value:</span>
nicholas@2859 714 <input type="number" ng-model="opt.min" />
nicholas@2859 715 </div>
nicholas@2859 716 <div class="attribute" ng-show="['slider', 'number'].indexOf(opt.type) >= 0">
nicholas@2859 717 <span>Maximum Value:</span>
nicholas@2859 718 <input type="number" ng-model="opt.max" />
nicholas@2859 719 </div>
nicholas@2859 720 <div class="attribute" ng-show="['video', 'youtube'].indexOf(opt.type) >= 0">
nicholas@2859 721 <span>Video URL:</span>
nicholas@2859 722 <input type="text" ng-model="opt.url" />
nicholas@2859 723 </div>
nicholas@2859 724 </div>
nicholas@2859 725 <div class="node">
nicholas@2859 726 <h4>Statement</h4>
nicholas@2859 727 <textarea ng-model="opt.statement"></textarea>
nicholas@2859 728 </div>
nicholas@2859 729 <div class="node" ng-show="['checkbox', 'radio'].indexOf(opt.type) >= 0">
nicholas@2859 730 <h4>Options</h4>
nicholas@2859 731 <div>
nicholas@2859 732 <button type="button" class="btn btn-default" ng-click="addOption();">Add Option</button>
nicholas@2859 733 </div>
nicholas@2859 734 <div class="node" ng-repeat="option in opt.options">
nicholas@2859 735 <div class="attributes">
nicholas@2859 736 <div class="attribute">
nicholas@2859 737 <button type="button" class="btn btn-default" ng-click="removeOption(option);">Remove</button>
nicholas@2859 738 </div>
nicholas@2859 739 <div class="attribute">
nicholas@2859 740 <span>Name: </span>
nicholas@2877 741 <input type="text" ng-model="option.name" required/>
nicholas@2859 742 </div>
nicholas@2859 743 <div class="attribute">
nicholas@2859 744 <span>Displayed Text: </span>
nicholas@2877 745 <input type="text" ng-model="option.text" required/>
nicholas@2859 746 </div>
nicholas@2859 747 </div>
nicholas@2859 748 </div>
nicholas@2859 749 </div>
nicholas@2859 750 <div class="node">
nicholas@2859 751 <h4>Conditionals</h4>
nicholas@2859 752 <button type="button" class="btn btn-default" ng-click="addCondition()">Add Condition</button>
nicholas@2859 753 <div class="node" ng-repeat="condition in opt.conditions">
nicholas@2859 754 <div class="attributes">
nicholas@2859 755 <div class="attribute">
nicholas@2859 756 <button type="button" class="btn btn-danger" ng-click="removeCondition(condition)">Remove</button>
nicholas@2859 757 </div>
nicholas@2859 758 <div class="attribute">
nicholas@2859 759 <span>Check Type:</span>
nicholas@2859 760 <select ng-model="condition.check">
nicholas@2859 761 <option value="equals">Equal To</option>
nicholas@2859 762 <option value="lessThan">Less Than</option>
nicholas@2859 763 <option value="greaterThan">Greater Than</option>
nicholas@2859 764 <option value="stringContains">String Contains</option>
nicholas@2859 765 </select>
nicholas@2859 766 </div>
nicholas@2859 767 <div class="attribute">
nicholas@2859 768 <span>Value: </span>
nicholas@2877 769 <input type="text" ng-model="condition.value" required/>
nicholas@2859 770 </div>
nicholas@2859 771 <div class="attribute">
nicholas@2859 772 <span>Jump To On Pass: </span>
nicholas@2859 773 <select ng-model="condition.jumpToOnPass">
nicholas@2859 774 <option value="">None</option>
nicholas@2859 775 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 776 </select>
nicholas@2859 777 </div>
nicholas@2859 778 <div class="attribute">
nicholas@2859 779 <span>Jump To On Fail: </span>
nicholas@2859 780 <select ng-model="condition.jumpToOnFail">
nicholas@2859 781 <option value="">None</option>
nicholas@2859 782 <option ng-repeat="entry in survey.options" value="{{entry.id}}">{{entry.id}}</option>
nicholas@2859 783 </select>
nicholas@2859 784 </div>
nicholas@2859 785 </div>
nicholas@2859 786 </div>
nicholas@2859 787 </div>
nicholas@2859 788 </div>
nicholas@2859 789 </div>
nicholas@2859 790 <button type="button" class="btn btn-success" ng-show="specification.interface == 'APE' || page.interfaces.length == 0" ng-click="addInterface()">Add Interface/Axis</button>
nicholas@2859 791 <div class="node" ng-repeat="interface in page.interfaces" ng-controller="interfaceNode">
nicholas@2859 792 <h2>Interface</h2>
nicholas@2859 793 <button type="button" class="btn btn-danger" ng-click="removeInterface(interface)">Remove Interface/Axis</button>
nicholas@2859 794 <div class="node interfaceOptions">
nicholas@2859 795 <div class="attributes">
nicholas@2859 796 <div class="attribute" name="fragmentPlayed" type="check">
nicholas@2859 797 <span>Check all fragments played: </span>
nicholas@2859 798 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 799 </div>
nicholas@2859 800 <div class="attribute" name="fragmentFullPlayback" type="check">
nicholas@2859 801 <span>Check all fragments fully played: </span>
nicholas@2859 802 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 803 </div>
nicholas@2859 804 <div class="attribute" name="fragmentMoved" type="check">
nicholas@2859 805 <span>Check all fragments have been moved: </span>
nicholas@2859 806 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 807 </div>
nicholas@2859 808 <div class="attribute" name="fragmentComments" type="check">
nicholas@2859 809 <span>Check all fragments have comments: </span>
nicholas@2859 810 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 811 </div>
nicholas@2859 812 <div class="attribute" name="scalerange" type="check">
nicholas@2859 813 <span>Enforce a scale usage: </span>
nicholas@2859 814 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 815 <span>Minimum:</span>
nicholas@2859 816 <input type="number" min="0" max="100" name="min" />
nicholas@2859 817 <span>Maximum:</span>
nicholas@2859 818 <input type="number" min="0" max="100" name="max" />
nicholas@2859 819 </div>
nicholas@2859 820 <div class="attribute" name="volume" type="show">
nicholas@2859 821 <span>Show master volume control: </span>
nicholas@2859 822 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 823 </div>
nicholas@2859 824 <div class="attribute" name="playhead" type="show">
nicholas@2859 825 <span>Show playhead: </span>
nicholas@2859 826 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 827 </div>
nicholas@2859 828 <div class="attribute" name="page-count" type="show">
nicholas@2859 829 <span>Show Page Count: </span>
nicholas@2859 830 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 831 </div>
nicholas@2859 832 <div class="attribute" name="comments" type="show">
nicholas@2859 833 <span>Show Fragment Comments: </span>
nicholas@2859 834 <input type="checkbox" ng-click="enableInterfaceOption($event)" />
nicholas@2859 835 </div>
nicholas@2859 836 </div>
nicholas@2859 837 </div>
nicholas@2859 838 <div class="node">
nicholas@2859 839 <h3>Axis Title</h3>
nicholas@2859 840 <textarea ng-model="interface.title"></textarea>
nicholas@2859 841 <div class="attributes">
nicholas@2859 842 <div class="attribute">
nicholas@2859 843 <span>Axis name (in saves): </span>
nicholas@2859 844 <input type="text" ng-model="interface.name" />
nicholas@2859 845 </div>
nicholas@2859 846 </div>
nicholas@2859 847 </div>
nicholas@2859 848 <div class="node">
nicholas@2859 849 <h3>Axis Image</h3>
nicholas@2859 850 <textarea ng-model="interface.image"></textarea>
nicholas@2859 851 </div>
nicholas@2886 852 <div class="node" name="scale-selection">
nicholas@2859 853 <h3>Axis Scales</h3>
nicholas@2864 854 <button type="button" class="btn btn-success" ng-click="addScale();">Add</button>
nicholas@2864 855 <button type="button" class="btn btn-danger" ng-click="clearScales()" ng-show="interface.scales.length > 0">Clear Scales</button>
nicholas@2864 856 <div class="dropdown" style="display: inline-block;">
nicholas@2864 857 <button class="btn btn-default dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
nicholas@2886 858 Scales: {{selectedScale}}
nicholas@2864 859 <span class="caret"></span>
nicholas@2864 860 </button>
nicholas@2864 861 <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
nicholas@2886 862 <li ng-repeat="scale in scales" ng-click="useScales(scale)"><a href="#">{{scale.name}}</a></li>
nicholas@2864 863 </ul>
nicholas@2864 864 </div>
nicholas@2859 865 <div class="node" ng-repeat="scale in interface.scales">
nicholas@2859 866 <div class="attributes">
nicholas@2859 867 <div class="attribute">
nicholas@2859 868 <button type="button" class="btn btn-danger" ng-click="removeScale(scale);">Remove</button>
nicholas@2859 869 </div>
nicholas@2859 870 <div class="attribute">
nicholas@2859 871 <span>Position: </span>
nicholas@2877 872 <input type="number" min="0" max="100" ng-model="scale.position" required/>
nicholas@2859 873 </div>
nicholas@2859 874 <div class="attribute">
nicholas@2859 875 <span>Text: </span>
nicholas@2877 876 <input type="text" ng-model="scale.text" required/>
nicholas@2859 877 </div>
nicholas@2859 878 </div>
nicholas@2859 879 </div>
nicholas@2859 880 </div>
nicholas@2859 881 </div>
nicholas@2859 882 <div class="node">
nicholas@2859 883 <h3>Comment Questions</h3>
nicholas@2859 884 <button type="button" class="btn btn-success" ng-click="addCommentQuestion()">Add Comment Question</button>
nicholas@2859 885 <div class="node" ng-repeat="cq in page.commentQuestions">
nicholas@2859 886 <button type="button" class="btn btn-danger" ng-click="removeCommentQuestion(cq)">Remove Comment Question</button>
nicholas@2859 887 <div class="attributes">
nicholas@2859 888 <div class="attribute">
nicholas@2859 889 <span>Unique ID:</span>
nicholas@2877 890 <input type="text" ng-model="cq.id" required/>
nicholas@2859 891 </div>
nicholas@2859 892 <div class="attribute">
nicholas@2859 893 <span>Common Name:</span>
nicholas@2859 894 <input type="text" ng-model="cq.name" />
nicholas@2859 895 </div>
nicholas@2859 896 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 897 <span>Minimum:</span>
nicholas@2859 898 <input type="number" ng-model="cq.min" />
nicholas@2859 899 </div>
nicholas@2859 900 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 901 <span>Maximum:</span>
nicholas@2859 902 <input type="number" ng-model="cq.max" />
nicholas@2859 903 </div>
nicholas@2859 904 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 905 <span>Step size:</span>
nicholas@2859 906 <input type="number" ng-model="cq.step" />
nicholas@2859 907 </div>
nicholas@2859 908 <div class="attribute" ng-show="cq.type == 'slider'">
nicholas@2859 909 <span>Initial Value:</span>
nicholas@2859 910 <input type="number" ng-model="cq.value" />
nicholas@2859 911 </div>
nicholas@2859 912 </div>
nicholas@2859 913 <div class="node">
nicholas@2859 914 <h4>Question:</h4>
nicholas@2859 915 <textarea ng-model="cq.statement"></textarea>
nicholas@2859 916 </div>
nicholas@2859 917 <div class="node" ng-show="['radio', 'checkbox'].indexOf(cq.type) >= 0">
nicholas@2859 918 <h4>Options</h4>
nicholas@2859 919 <div class="node" ng-repeat="option in cq.options">
nicholas@2859 920 <div class="attributes">
nicholas@2859 921 <div class="attribute">
nicholas@2859 922 <button type="button" class="btn btn-danger" ng-click="removeCommentQuestionOption(cq,option)">Remove</button>
nicholas@2859 923 </div>
nicholas@2859 924 <div class="attribute">
nicholas@2859 925 <span>Name: </span>
nicholas@2877 926 <input type="text" ng-model="option.name" required/>
nicholas@2859 927 </div>
nicholas@2859 928 <div class="attribute">
nicholas@2859 929 <span>Display Text: </span>
nicholas@2877 930 <input type="text" ng-model="option.text" required/>
nicholas@2859 931 </div>
nicholas@2859 932 </div>
nicholas@2859 933 </div>
nicholas@2859 934 </div>
nicholas@2859 935 </div>
nicholas@2859 936 </div>
nicholas@2859 937 <button type="button" class="btn btn-success" ng-click="addAudioElement()">Add Fragment</button>
nicholas@2859 938 <div class="node" ng-repeat="fragment in page.audioElements">
nicholas@2859 939 <h3>Audio Fragment</h3>
nicholas@2859 940 <button type="button" class="btn btn-danger" ng-click="removeAudioElement(fragment)">Remove Fragment</button>
nicholas@2859 941 <div class="attributes">
nicholas@2859 942 <div class="attribute">
nicholas@2859 943 <span>Unique ID: </span>
nicholas@2877 944 <input type="text" ng-model="fragment.id" required/>
nicholas@2859 945 </div>
nicholas@2859 946 <div class="attribute">
nicholas@2859 947 <span>URL: </span>
nicholas@2877 948 <input type="text" ng-model="fragment.url" required/>
nicholas@2859 949 <span>Full URL: </span><span style="font-weight=600">{{page.hostURL}}{{fragment.url}}</span>
nicholas@2859 950 </div>
nicholas@2884 951 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Set the gain of this fragment. This is applied after any normalisation">
nicholas@2859 952 <span>Fragment Gain (dB): </span>
nicholas@2859 953 <input type="number" ng-model="fragment.gain" />
nicholas@2859 954 </div>
nicholas@2884 955 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Manually set the label">
nicholas@2859 956 <span>Fragment Label: </span>
nicholas@2859 957 <input type="text" ng-model="fragment.label" />
nicholas@2859 958 </div>
nicholas@2859 959 <div class="attribute">
nicholas@2859 960 <span>Fragment Common name: </span>
nicholas@2859 961 <input type="text" ng-model="fragment.name" />
nicholas@2859 962 </div>
nicholas@2859 963 <div class="attribute">
nicholas@2859 964 <span>Fragment Type: </span>
nicholas@2859 965 <select ng-model="fragment.type">
nicholas@2859 966 <option value="normal">Normal</option>
nicholas@2859 967 <option value="anchor">Hidden Anchor</option>
nicholas@2859 968 <option value="reference">Hidden Reference</option>
nicholas@2859 969 <option value="outside-reference">Outside Reference</option>
nicholas@2859 970 </select>
nicholas@2859 971 </div>
nicholas@2859 972 <div class="attribute" ng-show="fragment.type == 'anchor'">
nicholas@2859 973 <span>Anchor must be below: </span>
nicholas@2859 974 <input type="number" ng-model="fragment.marker" min="0" max="100" />
nicholas@2859 975 </div>
nicholas@2859 976 <div class="attribute" ng-show="fragment.type == 'reference'">
nicholas@2859 977 <span>Reference must be above: </span>
nicholas@2859 978 <input type="number" ng-model="fragment.marker" min="0" max="100" />
nicholas@2859 979 </div>
nicholas@2884 980 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global and page loudness">
nicholas@2859 981 <span>Loudness: </span>
nicholas@2859 982 <input type="number" ng-model="fragment.loudness" max="0" />
nicholas@2859 983 </div>
nicholas@2884 984 <div class="attribute" ng-show="page.poolSize > 0" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Always include this fragment after any sub-pooling">
nicholas@2859 985 <span>Always include fragment: </span>
nicholas@2859 986 <input type="checkbox" ng-model="fragment.alwaysInclude" max="0" />
nicholas@2859 987 </div>
nicholas@2884 988 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global / page pre-silence">
nicholas@2859 989 <span>Fragment Pre-Silence: </span>
nicholas@2859 990 <input type="number" ng-model="fragment.preSilence" max="0" step="0.1" />
nicholas@2859 991 </div>
nicholas@2884 992 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Over-ride global / page post-silence">
nicholas@2859 993 <span>Fragment Post-Silence: </span>
nicholas@2859 994 <input type="number" ng-model="fragment.postSilence" max="0" step="0.1" />
nicholas@2859 995 </div>
nicholas@2884 996 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="By default the fragment will start playback at the beginning.">
nicholas@2859 997 <span>Fragment playback start position (s): </span>
nicholas@2859 998 <input type="number" ng-model="fragment.startTime" min="0" max="{{fragment.stopTime}}" />
nicholas@2859 999 </div>
nicholas@2884 1000 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="By default the fragment will play until the end">
nicholas@2859 1001 <span>Fragment playback stop position (s): </span>
nicholas@2859 1002 <input type="number" ng-model="fragment.stopTime" min="{{fragment.startTime}}" />
nicholas@2859 1003 </div>
nicholas@2859 1004 <div class="attribute">
nicholas@2859 1005 <span>Fragment sampling rate: </span>
nicholas@2859 1006 <input type="number" ng-model="fragment.sampleRate" min="1" />
nicholas@2859 1007 </div>
nicholas@2884 1008 <div class="attribute" data-container="body" data-toggle="popover" data-placement="bottom" data-trigger="hover" data-content="Associate an image with this fragment">
nicholas@2859 1009 <span>Fragment Image (URL): </span>
nicholas@2859 1010 <input type="text" ng-model="fragment.image" />
nicholas@2859 1011 </div>
nicholas@2874 1012 <div class="attribute">
nicholas@2874 1013 <span>Minimum number of plays</span>
nicholas@2874 1014 <input type="number" ng-model="fragment.minNumberPlays" min="0" max="{{fragment.maxNumberPlays || page.maxNumberPlays || specification.maxNumberPlays}}" />
nicholas@2874 1015 </div>
nicholas@2874 1016 <div class="attribute">
nicholas@2874 1017 <span>Maximum number of plays</span>
nicholas@2874 1018 <input type="number" ng-model="fragment.maxNumberPlays" min="{{fragment.minNumberPlays || page.minNumberPlays || specification.minNumberPlays || 0}}" />
nicholas@2874 1019 </div>
nicholas@2859 1020 </div>
nicholas@2859 1021 </div>
nicholas@2859 1022 </div>
nicholas@2859 1023 <div id="popupHolder" ng-show="popupVisible">
nicholas@2859 1024 <div ng-controller="introduction" class="popup" ng-show="popupVisible">
nicholas@2859 1025 <div class="popupTitle" ng-switch="state">
nicholas@2859 1026 <span ng-switch-when="0">Test Creator</span>
nicholas@2859 1027 <span ng-switch-when="1">Create New Test</span>
nicholas@2859 1028 </div>
nicholas@2859 1029 <div class="popupContent container-fluid" ng-switch="state">
nicholas@2859 1030 <div ng-switch-when="0">
nicholas@2859 1031 <div>
nicholas@2859 1032 <span>Welcome to the WAET test creator tool. This will allow you to create a new test from scratch to suit your testing needs. If you wish to update a test file, please drag and drop the XML document into the area below for processing, otherwise press 'Next' to start a new test. This tool generates files for the WAET 1.2.1 version.</span>
nicholas@2859 1033 </div>
nicholas@2861 1034 <div>
nicholas@2861 1035 <input type="file" id="files" ng-model="files" onchange="handleFiles(event)" />
nicholas@2861 1036 </div>
nicholas@2859 1037 </div>
nicholas@2859 1038 <div ng-switch-when="1">
nicholas@2859 1039 <div>
nicholas@2859 1040 <span>Please select the interface you would like to use below. Selecting an interface will give a brief description of the interface type.</span>
nicholas@2859 1041 </div>
nicholas@2859 1042 <div class="row">
nicholas@2859 1043 <div class="col-md-6" style="overflow-y: scroll;height: 333px;">
nicholas@2864 1044 <div class="new-test" ng-repeat="i in testSpecifications.interfaces" ng-mouseover="mouseover(i.name)" ng-click="initialise(i.name)">
nicholas@2859 1045 <label style="cursor:pointer">
nicholas@2859 1046 <input type="radio" name="new-test" value="{{i.name}}" id="i.name" style="cursor:pointer" /> {{i.name}}
nicholas@2859 1047 </label>
nicholas@2859 1048 </div>
nicholas@2859 1049 </div>
nicholas@2859 1050 <div class="col-md-6">
nicholas@2859 1051 <span>{{description}}</span>
nicholas@2859 1052 </div>
nicholas@2859 1053 </div>
nicholas@2859 1054 </div>
nicholas@2859 1055 </div>
nicholas@2859 1056 <div class="popupButtons">
nicholas@2859 1057 <button id="popupBack" type="button" class="btn btn-default" ng-show="state>0" ng-click="back()">Back</button>
nicholas@2859 1058 <button id="popupNext" type="button" class="btn btn-default" ng-click="next()">Next</button>
nicholas@2859 1059 </div>
nicholas@2859 1060 </div>
nicholas@2859 1061 </div>
nicholas@2859 1062 <div id="screenblank" ng-show="popupVisible"></div>
nicholas@2859 1063 </div>
nicholas@2859 1064 </body>
nicholas@2859 1065
nicholas@2859 1066 </html>