annotate test_create.html @ 2911:bcb741f60298

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