annotate test_create.html @ 2925:21d548eb40f1

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