blob: 4c5a188a86def329800ff80c967299f14fad3eac [file] [log] [blame]
Patrick Williamsc124f4f2015-09-15 14:41:29 -05001{% extends "baseprojectpage.html" %}
2{% load projecttags %}
3{% load humanize %}
4
5
6{% block projectinfomain %}
7
8<h2>Bitbake variables</h2>
9
10 <div style="padding-left:19px;">
11
12 <dl class="dl-vertical">
13 {% if distro_defined %}
14 <dt>
15 <span class="js-config-var-name js-config-var-managed-name">DISTRO</span>
16 <i class="icon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used. <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-DISTRO' target='_blank'>Read more in the manual</a>"></i>
17 </dt>
18 <dd class="lead">
19 <span id="distro">{{distro}}</span>
20 <i class="icon-pencil" id="change-distro-icon"></i>
21 <form id="change-distro-form" style="display:none;">
22 <div class="input-append">
23 <span id="edit-distro-name-div" class="control-group">
24 <input type="text" id="new-distro" value="{{distro}}">
25 <button id="apply-change-distro" class="btn" type="button">Save</button>
26 <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button>
27 </span>
28 <span class="help-block error" id="distro-error-message"></span>
29 </div>
30 </form>
31 </dd>
32 {% endif %}
33
34 {% if fstypes_defined %}
35 <dt>
36 <span class="js-config-var-name js-config-var-managed-name">IMAGE_FSTYPES</span>
37 <i class="icon-question-sign get-help" title="Formats of root file system images that you want to have created <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_FSTYPES' target='_blank'>Read more in the manual</a>"></i>
38 </dt>
39 <dd class="lead">
40 <span id="image_fstypes">{{fstypes}}</span>
41 <i class="icon-pencil" id="change-image_fstypes-icon"></i>
42 <form id="change-image_fstypes-form" style="display:none;">
43 <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="span4">
44 <div id="all-image_fstypes" class="scrolling">
45 </div>
46 <button id="apply-change-image_fstypes" type="button" class="btn">Save</button>
47 <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button>
48 </form>
49 </dd>
50 {% endif %}
51
52 {% if image_install_append_defined %}
53 <dt>
54 <span class="js-config-var-name js-config-var-managed-name">IMAGE_INSTALL_append</span>
55 <i class="icon-question-sign get-help" title="Specifies additional packages to install into an image. If your build creates more than one image, the packages will be installed in <strong>all of them</strong> <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-IMAGE_INSTALL' target='_blank'>Read more in the manual</a>"></i>
56 </dt>
57 <dd class="lead">
58 <span id="image_install"{% if image_install_append %}{%else%} class="muted"{%endif%}>{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span>
59 <i class="icon-pencil" id="change-image_install-icon"></i>
60 <i class="icon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></i>
61 <form id="change-image_install-form" style="display:none;">
62 <div class="row-fluid">
63 <span class="help-block span4">To set IMAGE_INSTALL_append to more than one package, type the package names separated by a space.</span>
64 </div>
65 <div class="input-append">
66 <input type="text" class="input-xlarge" id="new-image_install" placeholder="Type one or more package names">
67 <button id="apply-change-image_install" class="btn" type="button">Save</button>
68 <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button>
69 </div>
70 </form>
71 </dd>
72 {% endif %}
73
74 {% if package_classes_defined %}
75 <dt>
76 <span class="js-config-var-name js-config-var-managed-name">PACKAGE_CLASSES</span>
77 <i class="icon-question-sign get-help" title="Specifies the package manager to use when packaging data <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PACKAGE_CLASSES' target='_blank'>Read more in the manual</a>"></i>
78 </dt>
79 <dd class="lead">
80 <span id="package_classes">{{package_classes}}</span>
81 <i id="change-package_classes-icon" class="icon-pencil"></i>
82 <form id="change-package_classes-form" style="display:none;">
83 <label>
84 Root file system package format
85 <i class="icon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>dev</code>, <code>ipk</code> and <code>rpm</code>"></i>
86 </label>
87 <select id="package_classes-select">
88 <option>package_deb</option>
89 <option>package_ipk</option>
90 <option>package_rpm</option>
91 </select>
92 <label>
93 Additional package formats
94 <i class="icon-question-sign get-help" title="Extra package formats to build"></i>
95 </label>
96 <label class="checkbox" id="package_class_1">
97 <input type="checkbox" id="package_class_1_input"> package_deb
98 </label>
99 <label class="checkbox" id="package_class_2">
100 <input type="checkbox" id="package_class_2_input"> package_ipk
101 </label>
102 <div style="padding-top:10px;">
103 <button id="apply-change-package_classes" type="button" class="btn">Save</button>
104 <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button>
105 </div>
106 </form>
107 </dd>
108 {% endif %}
109
110 {% if sdk_machine_defined %}
111 <dt>
112 <span class="js-config-var-name js-config-var-managed-name">SDKMACHINE</span>
113 <i class="icon-question-sign get-help" title="Specifies the architecture (i.e. i686 or x86_64) for which to build SDK and ADT items <br /><a href='http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SDKMACHINE' target='_blank'>Read more in the manual</a>"></i>
114 </dt>
115 <dd class="lead">
116 <span id="sdkmachine">{{sdk_machine}}</span>
117 <i id="change-sdkmachine-icon" class="icon-pencil"></i>
118 <form id="change-sdkmachine-form" style="display:none;">
119 <label class="radio">
120 <input type="radio" name="sdkmachine" value="i686">
121 i686
122 </label>
123 <label class="radio">
124 <input type="radio" name="sdkmachine" value="x86_64">
125 x86_64
126 </label>
127 <div style="padding-top:10px;">
128 <button id="apply-change-sdkmachine" type="button" class="btn">Save</button>
129 <button id="cancel-change-sdkmachine" type="button" class="btn btn-link">Cancel</button>
130 </div>
131 </form>
132 </dd>
133 {% endif %}
134
135 </dl>
136
137 <!-- <ul class="unstyled configuration-list" id="configvar-list"> -->
138 <dl id="configvar-list">
139 <!-- the added configuration variables are inserted here -->
140 </dl>
141
142 <!-- pass the fstypes list, black list, and externally managed variables here -->
143 {% for fstype in vars_fstypes %}
144 <input type="hidden" class="js-checkbox-fstypes-list" value="{{fstype}}">
145 {% endfor %}
146 {% for b in vars_blacklist %}
147 <input type="hidden" class="js-config-blacklist-name" value="{{b}}">
148 {% endfor %}
149 {% for b in vars_managed %}
150 <input type="hidden" class="js-config-managed-name" value="{{b}}">
151 {% endfor %}
152
153 <div class="row-fluid">
154 <form id="variable-form">
155 <fieldset style="padding-left:0px;">
156 <legend>Add variable</legend>
157 <div class="span3" style="margin-left:0px;">
158 <span id="add-configvar-name-div" class="control-group">
159 <label>
160 Variable
161 <i title="" class="icon-question-sign get-help"
162 data-original-title="Variable names are case sensitive,
163 cannot have spaces, and can only include letters, numbers, underscores
164 and dashes"></i>
165 </label>
166 <input type="text" placeholder="Type variable name" id="variable">
167 <span class="help-block error" id="new-variable-error-message"></span>
168 </span>
169 <label>Value</label>
170 <input id="value" type="text" placeholder="Type variable value"><p>
171 <div>
172 <button id="add-configvar-button" class="btn save" type="button" disabled>Add variable</button>
173 </div>
174 </div>
175 <div class="span5 help-block">
176 <h5>Some variables are reserved from Toaster</h5>
177 <p>Toaster cannot set any variables that impact 1) the configuration of the build servers,
178 or 2) where artifacts produced by the build are stored. Such variables include: </p>
179 <p>
180 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code>
181 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code>
182 <code>CVS_PROXY_HOST</code>
183 <code>CVS_PROXY_PORT</code>
184 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-DL_DIR" target="_blank">DL_DIR</a></code>
185 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code>
186 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_DIR" target="_blank">SSTATE_DIR</a></code>
187 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-SSTATE_MIRRORS" target="_blank">SSTATE_MIRRORS</a></code>
188 <code><a href="http://www.yoctoproject.org/docs/1.6.1/ref-manual/ref-manual.html#var-TMPDIR" target="_blank">TMPDIR</a></code></p>
189 <p>Plus the following standard shell environment variables:</p>
190 <p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p>
191 </div>
192 </fieldset>
193 </form>
194 </div>
195
196 </div>
197
198 <script>
199
200 // global variables
201 var do_reload=false;
202
203 // validate new variable name
204 function validate_new_variable() {
205 var variable = $("input#variable").val();
206 var value = $("input#value").val();
207
208 // presumed innocence
209 $('#new-variable-error-message').text("");
210 var error_msg = "";
211
212 var existing_configvars = document.getElementsByClassName('js-config-var-name');
213 for (var i = 0, length = existing_configvars.length; i < length; i++) {
214 if (existing_configvars[i].innerHTML.toUpperCase() == variable.toUpperCase()) {
215 error_msg = "This variable is already set in this page, edit its value instead";
216 }
217 }
218
219 var blacklist_configvars = document.getElementsByClassName('js-config-blacklist-name');
220 for (var i = 0, length = blacklist_configvars.length; i < length; i++) {
221 if (blacklist_configvars[i].value.toUpperCase() == variable.toUpperCase()) {
222 error_msg = "You cannot edit this variable in Toaster because it is set by the build servers";
223 }
224 }
225
226 var managed_configvars = document.getElementsByClassName('js-config-managed-name');
227 for (var i = 0, length = managed_configvars.length; i < length; i++) {
228 if (managed_configvars[i].value.toUpperCase() == variable.toUpperCase()) {
229 error_msg = "You cannot set this variable here. Please set it in the <a href=\"{% url 'project' project.id %}\">project main page</a>";
230 }
231 }
232
233 var bad_chars = /[^a-zA-Z0-9\-_]/.test(variable);
234 var has_spaces = (0 <= variable.indexOf(" "));
235 var only_spaces = (0 < variable.length) && (0 == variable.trim().length);
236
237 if (only_spaces) {
238 error_msg = "A valid variable name cannot include spaces";
239 } else if (bad_chars && has_spaces) {
240 error_msg = "A valid variable name can only include letters, numbers, underscores, dashes, and cannot include spaces";
241 } else if (bad_chars) {
242 error_msg = "A valid variable name can only include letters, numbers, underscores, and dashes";
243 }
244
245 if ("" != error_msg) {
246 $('#new-variable-error-message').html(error_msg);
247 $(".save").attr("disabled","disabled");
248
249 // add one (and only one) error class append
250 var d = document.getElementById("add-configvar-name-div");
251 d.className = d.className.replace(" error","");
252 d.className = d.className + " error";
253
254 return false;
255 } else if (0 == variable.length) {
256 $(".save").attr("disabled","disabled");
257 return false;
258 }
259
260 var d = document.getElementById("add-configvar-name-div");
261 d.className = d.className.replace(" error","");
262
263 // now set the "Save" enablement if 'value' also passes
264 if (value.trim().length > 0) {
265 $(".save").removeAttr("disabled");
266 } else {
267 $(".save").attr("disabled","disabled");
268 }
269
270 return true;
271 }
272
273 // validate distro name
274 function validate_distro_name() {
275 var value = $("input#new-distro").val();
276
277 // presumed innocence
278 $('#distro-error-message').text("");
279 var error_msg = "";
280
281 var has_spaces = (0 <= value.indexOf(" "));
282
283 if (has_spaces) {
284 error_msg = "A valid distro name cannot include spaces";
285 } else if (0 == value.length) {
286 error_msg = " ";
287 }
288
289 if ("" != error_msg) {
290 $('#distro-error-message').text(error_msg);
291 $("#apply-change-distro").attr("disabled","disabled");
292
293 // add one (and only one) error class append
294 var d = document.getElementById("edit-distro-name-div");
295 d.className = d.className.replace(" error","");
296 d.className = d.className + " error";
297
298 return false;
299 }
300
301 var d = document.getElementById("edit-distro-name-div");
302 d.className = d.className.replace(" error","");
303 $("#apply-change-distro").removeAttr("disabled");
304 return true;
305 }
306
307 // Test to insure at least one FS Type is checked
308 function enableFsTypesSave() {
309 var any_checked = 0;
310 $(".fs-checkbox-fstypes:checked").each(function(){
311 any_checked = 1;
312 });
313 if ( 0 == any_checked ) {
314 $("#apply-change-image_fstypes").attr("disabled","disabled");
315 }
316 else {
317 $("#apply-change-image_fstypes").removeAttr("disabled");
318 }
319 }
320
321 // Preset or reset the Package Class checkbox labels
322 function updatePackageClassCheckboxes() {
323 $('#package_class_1, #package_class_2').hide();
324 if ($('select').val() == 'package_deb') {
325 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_ipk');
326 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm');
327 }
328 if ($('select').val() == 'package_ipk') {
329 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb');
330 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm');
331 }
332 if ($('select').val() == 'package_rpm') {
333 $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb');
334 $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_ipk');
335 }
336 $('#package_class_1, #package_class_2').fadeIn(1500);
337 }
338
339 // Re-assert handlers when the page is served and/or refreshed via Ajax
340 function setEventHandlersForDynamicElements() {
341
342 // change variable value
343 $('.js-icon-pencil-config_var').click(function (evt) {
344 var pk = evt.target.attributes["x-data"].value;
345 var current_val = $("span#config_var_value_"+pk).text();
346 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).hide();
347 $("#change-config_var-form_"+pk).slideDown();
348 $("input#new-config_var_"+pk).val(current_val);
349 });
350
351 $('.js-cancel-change-config_var').click(function (evt) {
352 var pk = evt.target.attributes["x-data"].value;
353 $("#change-config_var-form_"+pk).slideUp(function() {
354 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show();
355 });
356 });
357
358 $(".js-new-config_var").on('input', function(){
359 if ($(this).val().length == 0) {
360 $(".js-apply-change-config_var").attr("disabled","disabled");
361 }
362 else {
363 $(".js-apply-change-config_var").removeAttr("disabled");
364 }
365 });
366
367 $('.js-apply-change-config_var').click(function (evt) {
368 var xdata = evt.target.attributes["x-data"].value.split(":");
369 var pk = xdata[0];
370 var variable = xdata[1];
371 var val = $('#new-config_var_'+pk).val();
372 postEditAjaxRequest({"configvarChange" : variable+':'+val});
373 $('#config_var_value_'+pk).parent().removeClass('muted');
374 $("#change-config_var-form_"+pk).slideUp(function() {
375 $('.js-icon-pencil-config_var, .js-icon-trash-config_var, #config_var_value_'+pk).show();
376 });
377 });
378
379 // delete variable
380 $(".js-icon-trash-config_var").click(function (evt) {
381 var xdata = evt.target.attributes["x-data"].value.split(":");
382 var pk = xdata[0];
383
384 // hide the dangling trash tooltip
385 $('#config_var_trash_'+pk).hide();
386
387 // fade out the variable+value div, then refresh the variable list
388 $('#config_var_entry_'+pk).parent().parent().fadeOut(1000, function(){
389 postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value});
390 });
391
392 });
393
394 }
395
396 function onEditPageUpdate(data) {
397 // update targets
398 var i; var orightml = "";
399
400 var configvars_sorted = data.configvars.sort(function(a, b){return a[0] > b[0]});
401
402 var managed_configvars = document.getElementsByClassName('js-config-var-managed-name');
403
404 for (i = 0; i < configvars_sorted.length; i++) {
405 // skip if the variable name has a special context (not user defined)
406 var var_context=undefined;
407 for (var j = 0, length = managed_configvars.length; j < length; j++) {
408 if ((managed_configvars[j].innerHTML == configvars_sorted[i][0]) ||
409 (managed_configvars[j].value == configvars_sorted[i][0]) ) {
410 var_context='m';
411 }
412 }
413 if (var_context == undefined) {
414 orightml += '<div> <dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><i class="icon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></i> </dt>'
415 orightml += '<dd class="lead">'
416 orightml += ' <span id="config_var_value_'+configvars_sorted[i][2]+'"></span>'
417 orightml += ' <i class="icon-pencil js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></i>'
418 orightml += ' <form id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">'
419 orightml += ' <div class="input-append">'
420 orightml += ' <input type="text" class="input-xlarge js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value="">'
421 orightml += ' <button class="btn js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>'
422 orightml += ' <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>'
423 orightml += ' </div>'
424 orightml += ' </form>'
425 orightml += '</dd> </div>'
426 }
427 }
428
429 // update configvars list HTML framework
430 $("dl#configvar-list").html(orightml);
431
432 // insert the name/value pairs safely as non-HTML
433 for (i = 0; i < configvars_sorted.length; i++) {
434 $('#config_var_entry_'+configvars_sorted[i][2]).text(configvars_sorted[i][0]);
435 $('#config_var_value_'+configvars_sorted[i][2]).text(configvars_sorted[i][1]);
436 }
437
438 // Add the tooltips
439 $(".js-icon-trash-config_var").each( function(){ setDeleteTooltip($(this)); });
440 $(".js-icon-pencil-config_var").each(function(){ setChangeTooltip($(this)); });
441
442 // re-assert these event handlers
443 setEventHandlersForDynamicElements();
444 }
445
446 function onEditAjaxSuccess(data, textstatus) {
447 // console.log("XHR returned:", data, "(" + textstatus + ")");
448 if (data.error != "ok") {
449 alert("error on request:\n" + data.error);
450 return;
451 }
452
453 // delayed page reload?
454 if (do_reload) {
455 do_reload=false;
456 location.reload(true);
457 } else {
458 onEditPageUpdate(data);
459 }
460 }
461
462 function onEditAjaxError(jqXHR, textstatus, error) {
463 alert("XHR errored:\n" + error + "\n(" + textstatus + ")");
464 // re-assert the event handlers
465 }
466
467 /* ensure cookie exists {% csrf_token %} */
468 function postEditAjaxRequest(reqdata) {
469 var ajax = $.ajax({
470 type:"POST",
471 data: $.param(reqdata),
472 url:"{% url 'xhr_configvaredit' project.id%}",
473 headers: { 'X-CSRFToken': $.cookie("csrftoken")},
474 success: onEditAjaxSuccess,
475 error: onEditAjaxError,
476 })
477 }
478
479 function setDeleteTooltip(object) {
480 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Delete" });
481 }
482 function setChangeTooltip(object) {
483 object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" });
484 }
485
486 $(document).ready(function() {
487
488 //
489 // Register handlers for static elements
490 //
491
492 {% if distro_defined %}
493 // change distro variable
494 $('#change-distro-icon').click(function() {
495 $('#change-distro-icon, #distro').hide();
496 $("#change-distro-form").slideDown();
497 $("#new-distro").val( $('#distro').text() );
498 });
499
500 $('#cancel-change-distro').click(function(){
501 $("#change-distro-form").slideUp(function() {
502 $('#distro, #change-distro-icon').show();
503
504 // reset any dangling error state
505 $('#distro-error-message').text("");
506 var d = document.getElementById("edit-distro-name-div");
507 d.className = d.className.replace(" error","");
508 });
509 });
510
511 // validate new distro name
512 $("input#new-distro").on('input', function (evt) {
513 validate_distro_name();
514 });
515
516 $('#apply-change-distro').click(function(){
517 //$('#repo').parent().removeClass('highlight-go');
518 var name = $('#new-distro').val();
519 postEditAjaxRequest({"configvarChange" : 'DISTRO:'+name});
520 $('#distro').text(name);
521 $("#change-distro-form").slideUp(function () {
522 $('#distro, #change-distro-icon').show();
523 });
524 });
525 {% endif %}
526
527
528 {% if fstypes_defined %}
529 // change IMAGE_FSTYPES variable
530
531 $('#change-image_fstypes-icon').click(function() {
532 $('#change-image_fstypes-icon, #image_fstypes').hide();
533 $("#change-image_fstypes-form").slideDown();
534 // avoid false substring matches by including space separators
535 var html = "";
536 var fstypes = " " + document.getElementById("image_fstypes").innerHTML + " ";
537 var fstypes_list = document.getElementsByClassName('js-checkbox-fstypes-list');
538 // Add the checked boxes first
539 if (" " != fstypes) {
540 for (var i = 0, length = fstypes_list.length; i < length; i++) {
541 if (0 <= fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
542 html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label>\n';
543 }
544 }
545 }
546 // Add the un-checked boxes second
547 for (var i = 0, length = fstypes_list.length; i < length; i++) {
548 if (0 > fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
549 html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label>\n';
550 }
551 }
552 document.getElementById("all-image_fstypes").innerHTML = html;
553
554 // Watch elements to disable Save when none are checked
555 $(".fs-checkbox-fstypes").each(function(){
556 $(this).click(function() {
557 enableFsTypesSave();
558 });
559 });
560
561 // clear the previous filter values
562 $("input#filter-image_fstypes").val("");
563 });
564
565 $('#cancel-change-image_fstypes').click(function(){
566 $("#change-image_fstypes-form").slideUp(function() {
567 $('#image_fstypes, #change-image_fstypes-icon').show();
568 });
569 });
570
571 $('#filter-image_fstypes').on('input', function(){
572 var valThis = $(this).val().toLowerCase();
573 $('#all-image_fstypes label').each(function(){
574 var text = $(this).text().toLowerCase();
575 var match = text.indexOf(valThis);
576 if (match >= 0) {
577 $(this).show();
578 }
579 else {
580 $(this).hide();
581 }
582 });
583 });
584
585 $('#apply-change-image_fstypes').click(function(){
586 // extract the selected fstypes and sort them
587 var fstypes_array = [];
588 var checkboxes = document.getElementsByClassName('fs-checkbox-fstypes');
589 $(".fs-checkbox-fstypes:checked").each(function(){
590 fstypes_array.push($(this).val());
591 });
592 fstypes_array.sort();
593
594 // now make a string of them
595 var fstypes = '';
596 for (var i = 0, length = fstypes_array.length; i < length; i++) {
597 fstypes += fstypes_array[i] + ' ';
598 }
599 fstypes = fstypes.trim();
600
601 postEditAjaxRequest({"configvarChange" : 'IMAGE_FSTYPES:'+fstypes});
602 $('#image_fstypes').text(fstypes);
603 $('#image_fstypes').parent().removeClass('muted');
604
605 $("#change-image_fstypes-form").slideUp(function() {
606 $('#image_fstypes, #change-image_fstypes-icon').show();
607 });
608 });
609 {% endif %}
610
611
612 {% if image_install_append_defined %}
613
614 // init IMAGE_INSTALL_append trash icon
615 setDeleteTooltip($('#delete-image_install-icon'));
616
617 // change IMAGE_INSTALL_append variable
618 $('#change-image_install-icon').click(function() {
619 // preset the edit value
620 var current_val = $("span#image_install").text().trim();
621 if (current_val == "Not set") {
622 current_val="";
623 $("#apply-change-image_install").attr("disabled","disabled");
624 } else {
625 // insure these non-empty values have single space prefix
626 current_val=" " + current_val;
627 }
628 $("input#new-image_install").val(current_val);
629
630 $('#change-image_install-icon, #delete-image_install-icon, #image_install').hide();
631 $("#change-image_install-form").slideDown();
632 });
633
634 $('#cancel-change-image_install').click(function(){
635 $("#change-image_install-form").slideUp(function() {
636 $('#image_install, #change-image_install-icon').show();
637 if ($("span#image_install").text() != "Not set") {
638 $('#delete-image_install-icon').show();
639 setDeleteTooltip($('#delete-image_install-icon'));
640 }
641 });
642 });
643
644 $("#new-image_install").on('input', function(){
645 if ($(this).val().trim().length == 0) {
646 $("#apply-change-image_install").attr("disabled","disabled");
647 }
648 else {
649 $("#apply-change-image_install").removeAttr("disabled");
650 }
651 });
652
653 $('#apply-change-image_install').click(function(){
654 // insure these non-empty values have single space prefix
655 var value = " " + $('#new-image_install').val().trim();
656 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+value});
657 $('#image_install').text(value);
658 $('#image_install').removeClass('muted');
659 $("#change-image_install-form").slideUp(function () {
660 $('#image_install, #change-image_install-icon').show();
661 if (value.length > -1) {
662 $('#delete-image_install-icon').show();
663 setDeleteTooltip($('#delete-image_install-icon'));
664 }
665 });
666 });
667
668 // delete IMAGE_INSTALL_append variable value
669 $('#delete-image_install-icon').click(function(){
670 $(this).tooltip('hide');
671 postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL_append:'+''});
672 $('#image_install').parent().fadeOut(1000, function(){
673 $('#image_install').addClass('muted');
674 $('#image_install').text('Not set');
675 $('#delete-image_install-icon').hide();
676 $('#image_install').parent().fadeIn(1000);
677 });
678 });
679 {% endif %}
680
681
682 {% if package_classes_defined %}
683 // change PACKAGE_CLASSES variable
684 $('#change-package_classes-icon').click(function() {
685 $('#change-package_classes-icon, #package_classes').hide();
686 $("#change-package_classes-form").slideDown();
687
688 // initialize the pulldown and checkboxes
689 var value = $("#package_classes").text();
690 if ( value.indexOf("package_deb") == 0 ) {
691 $("#package_classes-select").prop('selectedIndex', 0);
692 updatePackageClassCheckboxes();
693 if ( value.indexOf("_ipk") > 0 ) {
694 $("#package_class_1_input").attr("checked",true);
695 }
696 if ( value.indexOf("_rpm") > 0 ) {
697 $("#package_class_2_input").attr("checked",true);
698 }
699 }
700
701 if ( value.indexOf("package_ipk") == 0 ) {
702 $("#package_classes-select").prop('selectedIndex', 1);
703 updatePackageClassCheckboxes();
704 if ( value.indexOf("_deb") > 0 ) {
705 $("#package_class_1_input").attr("checked",true);
706 }
707 if ( value.indexOf("_rpm") > 0 ) {
708 $("#package_class_2_input").attr("checked",true);
709 }
710 }
711
712 if ( value.indexOf("package_rpm") == 0 ) {
713 $("#package_classes-select").prop('selectedIndex', 2);
714 updatePackageClassCheckboxes();
715 if ( value.indexOf("_deb") > 0 ) {
716 $("#package_class_1_input").attr("checked",true);
717 }
718 if ( value.indexOf("_ipk") > 0 ) {
719 $("#package_class_2_input").attr("checked",true);
720 }
721 }
722 });
723
724 $('#cancel-change-package_classes').click(function(){
725 $("#change-package_classes-form").slideUp(function() {
726 $('#package_classes, #change-package_classes-icon').show();
727 });
728 });
729
730 $('select').change(function() {
731 updatePackageClassCheckboxes();
732 });
733
734 $('#apply-change-package_classes').click(function(){
735 var e = document.getElementById("package_classes-select");
736 var val = e.options[e.selectedIndex].text;
737
738 pc1_checked = document.getElementById("package_class_1_input").checked;
739 pc2_checked = document.getElementById("package_class_2_input").checked;
740 if (val == "package_deb") {
741 if (pc1_checked) val = val + " package_ipk";
742 if (pc2_checked) val = val + " package_rpm";
743 }
744 if (val == "package_ipk") {
745 if (pc1_checked) val = val + " package_deb";
746 if (pc2_checked) val = val + " package_rpm";
747 }
748 if (val == "package_rpm") {
749 if (pc1_checked) val = val + " package_deb";
750 if (pc2_checked) val = val + " package_ipk";
751 }
752
753 $('#package_classes').text(val);
754 //$('#package_classes').parent().removeClass('muted');
755 postEditAjaxRequest({"configvarChange" : 'PACKAGE_CLASSES:'+val});
756 $("#change-package_classes-form").slideUp(function() {
757 $('#package_classes, #change-package_classes-icon').show();
758 });
759 });
760 {% endif %}
761
762
763 {% if sdk_machine_defined %}
764 // change SDKMACHINE variable
765 $('#change-sdkmachine-icon').click(function() {
766 var current_value = document.getElementById("sdkmachine").innerHTML;
767 var radios = document.getElementsByName('sdkmachine');
768 for (var i = 0, length = radios.length; i < length; i++) {
769 radios[i].checked = false;
770 if (radios[i].value == current_value) {
771 radios[i].checked = true;
772 }
773 }
774 $('#change-sdkmachine-icon, #sdkmachine').hide();
775 $("#change-sdkmachine-form").slideDown();
776 });
777
778 $('#cancel-change-sdkmachine').click(function(){
779 $("#change-sdkmachine-form").slideUp(function() {
780 $('#sdkmachine, #change-sdkmachine-icon').show();
781 });
782 });
783
784 $('#apply-change-sdkmachine').click(function(){
785 var value="";
786 var radios = document.getElementsByName('sdkmachine');
787 for (var i = 0, length = radios.length; i < length; i++) {
788 if (radios[i].checked) {
789 // do whatever you want with the checked radio
790 value=radios[i].value;
791 break;
792 }
793 }
794 postEditAjaxRequest({"configvarChange" : 'SDKMACHINE:'+value});
795 $('#sdkmachine').text(value);
796 $("#change-sdkmachine-form").slideUp(function() {
797 $('#sdkmachine, #change-sdkmachine-icon').show();
798 });
799
800 });
801 {% endif %}
802
803
804 // add new variable
805 $("button#add-configvar-button").click( function (evt) {
806 var variable = $("input#variable").val();
807 var value = $("input#value").val();
808
809 postEditAjaxRequest({"configvarAdd" : variable+':'+value});
810
811 // clear the previous values
812 $("input#variable").val("");
813 $("input#value").val("");
814 // Disable add button
815 $(".save").attr("disabled","disabled");
816
817 // Reload page if admin-removed core managed value is manually added back in
818 if (0 <= " DISTRO IMAGE_FSTYPES IMAGE_INSTALL_append PACKAGE_CLASSES SDKMACHINE ".indexOf( " "+variable+" " )) {
819 // delayed reload to avoid race condition with postEditAjaxRequest
820 do_reload=true;
821 }
822 });
823
824 // validate new variable name and value
825 $("#variable, #value").on('input', function() {
826 validate_new_variable();
827 });
828
829 //
830 // draw and register the dynamic configuration variables and handlers
831 //
832
833 var data = {
834 configvars : []
835 };
836 {% for c in configvars %}
837 data.configvars.push([ "{{c.name}}","{{c.value}}","{{c.pk}}" ]);
838 {% if '' != vars_context|get_dict_value:c.name %}
839 data.vars_context[ "{{c.name}}" ] = "{{vars_context|get_dict_value:c.name }}";
840 {% endif %}
841 {% endfor %}
842
843 // draw these elements and assert their event handlers
844 onEditPageUpdate(data);
845 });
846
847 </script>
848
849{% endblock %}