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