1*4882a593Smuzhiyun{% extends project_specific|yesno:"baseprojectspecificpage.html,baseprojectpage.html" %} 2*4882a593Smuzhiyun{% load projecttags %} 3*4882a593Smuzhiyun{% load humanize %} 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun{% block title %} BitBake variables - {{project.name}} - Toaster {% endblock %} 6*4882a593Smuzhiyun{% block projectinfomain %} 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun<h2>Bitbake variables</h2> 9*4882a593Smuzhiyun<div> 10*4882a593Smuzhiyun <dl> 11*4882a593Smuzhiyun {% if distro_defined %} 12*4882a593Smuzhiyun <dt> 13*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">DISTRO</span> 14*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="The short name of the distribution. If the variable is blank, meta/conf/distro/defaultsetup.conf will be used"></span> 15*4882a593Smuzhiyun </dt> 16*4882a593Smuzhiyun <dd class="variable-list"> 17*4882a593Smuzhiyun <span class="lead" id="distro">{{distro}}</span> 18*4882a593Smuzhiyun <span class="glyphicon glyphicon-edit" id="change-distro-icon"></span> 19*4882a593Smuzhiyun <form id="change-distro-form" class="form-inline" style="display:none;"> 20*4882a593Smuzhiyun <div id="edit-distro-name-div" class="form-group"> 21*4882a593Smuzhiyun <input type="text" class="form-control" id="new-distro" value="{{distro}}"> 22*4882a593Smuzhiyun </div> 23*4882a593Smuzhiyun <button id="apply-change-distro" class="btn btn-default" type="button">Save</button> 24*4882a593Smuzhiyun <button id="cancel-change-distro" type="button" class="btn btn-link">Cancel</button> 25*4882a593Smuzhiyun <span class="help-block" id="distro-error-message"></span> 26*4882a593Smuzhiyun </form> 27*4882a593Smuzhiyun </dd> 28*4882a593Smuzhiyun {% endif %} 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun {% if dl_dir_defined %} 31*4882a593Smuzhiyun <dt> 32*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">DL_DIR</span> 33*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store downloads required for your builds. By default, Toaster projects share the same downloads directory"></span> 34*4882a593Smuzhiyun </dt> 35*4882a593Smuzhiyun <dd class="variable-list"> 36*4882a593Smuzhiyun <span id="dl_dir" class="lead {% if not dl_dir %} text-muted {% endif %}">{% if dl_dir %}{{dl_dir}}{%else%}Not set{%endif%}</span> 37*4882a593Smuzhiyun <span class="glyphicon glyphicon-edit" id="change-dl_dir-icon"></span> 38*4882a593Smuzhiyun <form id="change-dl_dir-form" class="form-inline" style="display:none;"> 39*4882a593Smuzhiyun <div class="form-group" id="validate-dl_dir"> 40*4882a593Smuzhiyun <input type="text" class="form-control" id="new-dl_dir" placeholder="Type an absolute path"> 41*4882a593Smuzhiyun </div> 42*4882a593Smuzhiyun <button id="apply-change-dl_dir" class="btn btn-default" type="button">Save</button> 43*4882a593Smuzhiyun <button id="cancel-change-dl_dir" type="button" class="btn btn-link">Cancel</button> 44*4882a593Smuzhiyun <p class="help-block" id="hintError-dl_dir" style="display:none;">The directory path cannot include spaces or any of these characters: \ ? % * : | " " < ></p> 45*4882a593Smuzhiyun <p class="help-block" id="hintError-initialChar-dl_dir" style="display:none;">The directory path should either start with a /, e.g. /home/toaster/downloads; or with a variable, e.g. ${TOPDIR}/downloads.</p> 46*4882a593Smuzhiyun </form> 47*4882a593Smuzhiyun </dd> 48*4882a593Smuzhiyun {% endif %} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun {% if fstypes_defined %} 51*4882a593Smuzhiyun <dt> 52*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">IMAGE_FSTYPES</span> 53*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Formats of root file system images that you want to create"></span> 54*4882a593Smuzhiyun </dt> 55*4882a593Smuzhiyun <dd class="variable-list"> 56*4882a593Smuzhiyun <span class="lead" id="image_fstypes">{{fstypes}}</span> 57*4882a593Smuzhiyun <span class="glyphicon glyphicon-edit" id="change-image_fstypes-icon"></span> 58*4882a593Smuzhiyun <form id="change-image_fstypes-form" style="display:none;"> 59*4882a593Smuzhiyun <label>Type the image types you want to build:</label> 60*4882a593Smuzhiyun <div class="form-group form-inline" id="validate-image_fstypes"> 61*4882a593Smuzhiyun <input type="text" class="form-control "id="new-imagefs_types"> 62*4882a593Smuzhiyun <button id="apply-change-image_fstypes" type="button" class="btn btn-default">Save</button> 63*4882a593Smuzhiyun <button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button> 64*4882a593Smuzhiyun </div> 65*4882a593Smuzhiyun <p class="help-block text-danger" style="display:none;" id="hintError-image-fs_type">A valid image type cannot include underscores</p> 66*4882a593Smuzhiyun <p class="help-block text-danger" style="display:none;" id="fstypes-error-message">You must select at least one image type</p> 67*4882a593Smuzhiyun <label>Or choose from known image types:</label> 68*4882a593Smuzhiyun <input id="filter-image_fstypes" type="text" placeholder="Search image types" class="form-control"> 69*4882a593Smuzhiyun <div id="all-image_fstypes" class="scrolling"></div> 70*4882a593Smuzhiyun </form> 71*4882a593Smuzhiyun </dd> 72*4882a593Smuzhiyun {% endif %} 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun {% if image_install_append_defined %} 75*4882a593Smuzhiyun <dt> 76*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">IMAGE_INSTALL:append</span> 77*4882a593Smuzhiyun <span class="glyphicon glyphicon-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 all of them"></span> 78*4882a593Smuzhiyun </dt> 79*4882a593Smuzhiyun <dd class="variable-list"> 80*4882a593Smuzhiyun <span id="image_install" class="lead {% if not image_install_append %} text-muted {%endif%}">{% if image_install_append %}{{image_install_append}}{%else%}Not set{%endif%}</span> 81*4882a593Smuzhiyun <span class="glyphicon glyphicon-edit" id="change-image_install-icon"></span> 82*4882a593Smuzhiyun <span class="glyphicon glyphicon-trash" id="delete-image_install-icon" {% if image_install_append %}{%else%}style="display:none;"{%endif%}></span> 83*4882a593Smuzhiyun <form id="change-image_install-form" class="form-inline" style="display:none;"> 84*4882a593Smuzhiyun <div class="row"> 85*4882a593Smuzhiyun <div class="col-md-4"> 86*4882a593Smuzhiyun <span class="help-block">To set IMAGE_INSTALL:append to more than one package, type the package names separated by a space.</span> 87*4882a593Smuzhiyun </div> 88*4882a593Smuzhiyun </div> 89*4882a593Smuzhiyun <div class="form-group"> 90*4882a593Smuzhiyun <input type="text" class="form-control" id="new-image_install" placeholder="Type one or more package names"> 91*4882a593Smuzhiyun </div> 92*4882a593Smuzhiyun <button id="apply-change-image_install" class="btn btn-default" type="button">Save</button> 93*4882a593Smuzhiyun <button id="cancel-change-image_install" type="button" class="btn btn-link">Cancel</button> 94*4882a593Smuzhiyun </form> 95*4882a593Smuzhiyun </dd> 96*4882a593Smuzhiyun {% endif %} 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun {% if package_classes_defined %} 99*4882a593Smuzhiyun <dt> 100*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">PACKAGE_CLASSES</span> 101*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Specifies the package manager to use when packaging data"></span> 102*4882a593Smuzhiyun </dt> 103*4882a593Smuzhiyun <dd class="variable-list"> 104*4882a593Smuzhiyun <span class="lead" id="package_classes">{{package_classes}}</span> 105*4882a593Smuzhiyun <span id="change-package_classes-icon" class="glyphicon glyphicon-edit"></span> 106*4882a593Smuzhiyun <form id="change-package_classes-form" style="display:none;"> 107*4882a593Smuzhiyun <div class="form-group"> 108*4882a593Smuzhiyun <label class="control-label"> 109*4882a593Smuzhiyun Root file system package format 110*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="The package format used to generate the root file system. Options are <code>deb</code>, <code>ipk</code> and <code>rpm</code>"></i> 111*4882a593Smuzhiyun </label> 112*4882a593Smuzhiyun <select id="package_classes-select" class="form-control"> 113*4882a593Smuzhiyun <option>package_deb</option> 114*4882a593Smuzhiyun <option>package_ipk</option> 115*4882a593Smuzhiyun <option>package_rpm</option> 116*4882a593Smuzhiyun </select> 117*4882a593Smuzhiyun </div> 118*4882a593Smuzhiyun <div class="form-group"> 119*4882a593Smuzhiyun <label class="control-label"> 120*4882a593Smuzhiyun Additional package formats 121*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Extra package formats to build"></span> 122*4882a593Smuzhiyun </label> 123*4882a593Smuzhiyun <div class="checkbox"> 124*4882a593Smuzhiyun <label id="package_class_1"> 125*4882a593Smuzhiyun <input type="checkbox" id="package_class_1_input"> package_deb 126*4882a593Smuzhiyun </label> 127*4882a593Smuzhiyun </div> 128*4882a593Smuzhiyun <div class="checkbox"> 129*4882a593Smuzhiyun <label id="package_class_2"> 130*4882a593Smuzhiyun <input type="checkbox" id="package_class_2_input"> package_ipk 131*4882a593Smuzhiyun </label> 132*4882a593Smuzhiyun </div> 133*4882a593Smuzhiyun </div> 134*4882a593Smuzhiyun <button id="apply-change-package_classes" type="button" class="btn btn-default">Save</button> 135*4882a593Smuzhiyun <button id="cancel-change-package_classes" type="button" class="btn btn-link">Cancel</button> 136*4882a593Smuzhiyun </form> 137*4882a593Smuzhiyun </dd> 138*4882a593Smuzhiyun {% endif %} 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun {% if sstate_dir_defined %} 141*4882a593Smuzhiyun <dt> 142*4882a593Smuzhiyun <span class="js-config-var-name js-config-var-managed-name">SSTATE_DIR</span> 143*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" title="Absolute path to the directory used to store shared state cache files. These files are reused across the builds, which makes the builds faster. By default, Toaster projects share the same cache directory"></span> 144*4882a593Smuzhiyun </dt> 145*4882a593Smuzhiyun <dd class="variable-list"> 146*4882a593Smuzhiyun <span id="sstate_dir" class="lead {% if not sstate_dir %} text-muted {% endif %}">{% if sstate_dir %}{{sstate_dir}}{%else%}Not set{%endif%}</span> 147*4882a593Smuzhiyun <span class="glyphicon glyphicon-edit" id="change-sstate_dir-icon"></span> 148*4882a593Smuzhiyun <form class="form-inline" id="change-sstate_dir-form" style="display:none;"> 149*4882a593Smuzhiyun <div class="form-group" id="validate-sstate_dir"> 150*4882a593Smuzhiyun <input type="text" class="form-control" id="new-sstate_dir" placeholder="Type an absolute path"> 151*4882a593Smuzhiyun </div> 152*4882a593Smuzhiyun <button id="apply-change-sstate_dir" class="btn btn-default" type="button">Save</button> 153*4882a593Smuzhiyun <button id="cancel-change-sstate_dir" type="button" class="btn btn-link">Cancel</button> 154*4882a593Smuzhiyun <p class="help-block" id="hintError-sstate_dir" style="display:none;">The directory path cannot include spaces or any of these characters: \ ? % * : | " " < ></p> 155*4882a593Smuzhiyun <p class="help-block" id="hintError-initialChar-sstate_dir" style="display:none;">The directory path should either start with a /, e.g. /home/toaster/sstate-cache; or with a variable, e.g. ${TOPDIR}/sstate-cache.</p> 156*4882a593Smuzhiyun </form> 157*4882a593Smuzhiyun </dd> 158*4882a593Smuzhiyun {% endif %} 159*4882a593Smuzhiyun </dl> 160*4882a593Smuzhiyun 161*4882a593Smuzhiyun <!-- <ul class="list-unstyled configuration-list" id="configvar-list"> --> 162*4882a593Smuzhiyun <dl id="configvar-list"> 163*4882a593Smuzhiyun <!-- the added configuration variables are inserted here --> 164*4882a593Smuzhiyun </dl> 165*4882a593Smuzhiyun 166*4882a593Smuzhiyun <!-- pass the fstypes list, black list, and externally managed variables here --> 167*4882a593Smuzhiyun {% for fstype in vars_fstypes %} 168*4882a593Smuzhiyun <input type="hidden" class="js-checkbox-fstypes-list" value="{{fstype}}"> 169*4882a593Smuzhiyun {% endfor %} 170*4882a593Smuzhiyun {% for b in vars_disallowed %} 171*4882a593Smuzhiyun <input type="hidden" class="js-config-disallowed-name" value="{{b}}"> 172*4882a593Smuzhiyun {% endfor %} 173*4882a593Smuzhiyun {% for b in vars_managed %} 174*4882a593Smuzhiyun <input type="hidden" class="js-config-managed-name" value="{{b}}"> 175*4882a593Smuzhiyun {% endfor %} 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun <form id="variable-form"> 178*4882a593Smuzhiyun <fieldset> 179*4882a593Smuzhiyun <legend>Add variable</legend> 180*4882a593Smuzhiyun <div class="row"> 181*4882a593Smuzhiyun <div class="col-md-3"> 182*4882a593Smuzhiyun <div id="add-configvar-name-div" class="form-group"> 183*4882a593Smuzhiyun <label class="control-label"> 184*4882a593Smuzhiyun Variable 185*4882a593Smuzhiyun <span class="glyphicon glyphicon-question-sign get-help" 186*4882a593Smuzhiyun title="Variable names are case sensitive, 187*4882a593Smuzhiyun cannot have spaces, and can only include letters, numbers, underscores 188*4882a593Smuzhiyun and dashes"></span> 189*4882a593Smuzhiyun </label> 190*4882a593Smuzhiyun <input type="text" class="form-control" placeholder="Type the variable name" id="variable"> 191*4882a593Smuzhiyun </div> 192*4882a593Smuzhiyun <p class="help-block" id="new-variable-error-message"></p> 193*4882a593Smuzhiyun <div class="form-group"> 194*4882a593Smuzhiyun <label clas="control-label">Value</label> 195*4882a593Smuzhiyun <input id="value" type="text" class="form-control" placeholder="Type the variable value"> 196*4882a593Smuzhiyun </div> 197*4882a593Smuzhiyun <button id="add-configvar-button" class="btn btn-default save" type="button" disabled>Add variable</button> 198*4882a593Smuzhiyun </div> 199*4882a593Smuzhiyun <div class="col-md-5 help-block"> 200*4882a593Smuzhiyun <h5>Some variables cannot be set from Toaster</h5> 201*4882a593Smuzhiyun <p>Toaster cannot set any variables that impact 1) the configuration of the build servers, 202*4882a593Smuzhiyun or 2) where artifacts produced by the build are stored. Such variables include: </p> 203*4882a593Smuzhiyun <p> 204*4882a593Smuzhiyun <code><a href="http://docs.yoctoproject.org/ref-manual/variables.html#term-BB_DISKMON_DIRS" target="_blank">BB_DISKMON_DIRS</a></code> 205*4882a593Smuzhiyun <code><a href="http://docs.yoctoproject.org/ref-manual/variables.html#term-BB_NUMBER_THREADS" target="_blank">BB_NUMBER_THREADS</a></code> 206*4882a593Smuzhiyun <code>CVS_PROXY_HOST</code> 207*4882a593Smuzhiyun <code>CVS_PROXY_PORT</code> 208*4882a593Smuzhiyun <code><a href="http://docs.yoctoproject.org/ref-manual/variables.html#term-PARALLEL_MAKE" target="_blank">PARALLEL_MAKE</a></code> 209*4882a593Smuzhiyun <code><a href="http://docs.yoctoproject.org/ref-manual/variables.html#term-TMPDIR" target="_blank">TMPDIR</a></code></p> 210*4882a593Smuzhiyun <p>Plus the following standard shell environment variables:</p> 211*4882a593Smuzhiyun <p><code>http_proxy</code> <code>ftp_proxy</code> <code>https_proxy</code> <code>all_proxy</code></p> 212*4882a593Smuzhiyun </div> 213*4882a593Smuzhiyun </div> 214*4882a593Smuzhiyun </fieldset> 215*4882a593Smuzhiyun </form> 216*4882a593Smuzhiyun</div> 217*4882a593Smuzhiyun 218*4882a593Smuzhiyun</div> 219*4882a593Smuzhiyun 220*4882a593Smuzhiyun<script> 221*4882a593Smuzhiyun 222*4882a593Smuzhiyun// global variables 223*4882a593Smuzhiyunvar do_reload=false; 224*4882a593Smuzhiyun 225*4882a593Smuzhiyun// validate new variable name 226*4882a593Smuzhiyunfunction validate_new_variable() { 227*4882a593Smuzhiyun var variable = $("input#variable").val(); 228*4882a593Smuzhiyun var value = $("input#value").val(); 229*4882a593Smuzhiyun 230*4882a593Smuzhiyun // presumed innocence 231*4882a593Smuzhiyun $('#new-variable-error-message').text(""); 232*4882a593Smuzhiyun var error_msg = ""; 233*4882a593Smuzhiyun 234*4882a593Smuzhiyun var existing_configvars = document.getElementsByClassName('js-config-var-name'); 235*4882a593Smuzhiyun for (var i = 0, length = existing_configvars.length; i < length; i++) { 236*4882a593Smuzhiyun if (existing_configvars[i].innerHTML.toUpperCase() == variable.toUpperCase()) { 237*4882a593Smuzhiyun error_msg = "This variable is already set in this page. Edit its value instead"; 238*4882a593Smuzhiyun } 239*4882a593Smuzhiyun } 240*4882a593Smuzhiyun 241*4882a593Smuzhiyun var disallowed_configvars = document.getElementsByClassName('js-config-disallowed-name'); 242*4882a593Smuzhiyun for (var i = 0, length = disallowed_configvars.length; i < length; i++) { 243*4882a593Smuzhiyun if (disallowed_configvars[i].value.toUpperCase() == variable.toUpperCase()) { 244*4882a593Smuzhiyun error_msg = "You cannot edit this variable in Toaster because it is set by the build servers"; 245*4882a593Smuzhiyun } 246*4882a593Smuzhiyun } 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun var managed_configvars = document.getElementsByClassName('js-config-managed-name'); 249*4882a593Smuzhiyun for (var i = 0, length = managed_configvars.length; i < length; i++) { 250*4882a593Smuzhiyun if (managed_configvars[i].value.toUpperCase() == variable.toUpperCase()) { 251*4882a593Smuzhiyun error_msg = "You cannot set this variable here. Please set it in the <a href=\"{% url 'project' project.id %}\">project main page</a>"; 252*4882a593Smuzhiyun } 253*4882a593Smuzhiyun } 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun var bad_chars = /[^a-zA-Z0-9\-_/]/.test(variable); 256*4882a593Smuzhiyun var has_spaces = (0 <= variable.indexOf(" ")); 257*4882a593Smuzhiyun var only_spaces = (0 < variable.length) && (0 == variable.trim().length); 258*4882a593Smuzhiyun 259*4882a593Smuzhiyun if (only_spaces) { 260*4882a593Smuzhiyun error_msg = "A valid variable name cannot include spaces"; 261*4882a593Smuzhiyun } else if (bad_chars && has_spaces) { 262*4882a593Smuzhiyun error_msg = "A valid variable name can only include letters, numbers and the special characters <code> _ - /</code>. Variable names cannot include spaces"; 263*4882a593Smuzhiyun } else if (bad_chars) { 264*4882a593Smuzhiyun error_msg = "A valid variable name can only include letters, numbers and the special characters <code>_ - /</code>"; 265*4882a593Smuzhiyun } 266*4882a593Smuzhiyun 267*4882a593Smuzhiyun if ("" != error_msg) { 268*4882a593Smuzhiyun $('#new-variable-error-message').html(error_msg); 269*4882a593Smuzhiyun $(".save").attr("disabled","disabled"); 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun // add one (and only one) error class append 272*4882a593Smuzhiyun $("#add-configvar-name-div").addClass("has-error"); 273*4882a593Smuzhiyun $("#new-variable-error-message").addClass("text-danger"); 274*4882a593Smuzhiyun 275*4882a593Smuzhiyun return false; 276*4882a593Smuzhiyun } else if (0 == variable.length) { 277*4882a593Smuzhiyun $(".save").attr("disabled","disabled"); 278*4882a593Smuzhiyun return false; 279*4882a593Smuzhiyun } 280*4882a593Smuzhiyun 281*4882a593Smuzhiyun $("#add-configvar-name-div").removeClass("has-error"); 282*4882a593Smuzhiyun 283*4882a593Smuzhiyun // now set the "Save" enablement if 'value' also passes 284*4882a593Smuzhiyun if (value.trim().length > 0) { 285*4882a593Smuzhiyun $(".save").removeAttr("disabled"); 286*4882a593Smuzhiyun } else { 287*4882a593Smuzhiyun $(".save").attr("disabled","disabled"); 288*4882a593Smuzhiyun } 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun return true; 291*4882a593Smuzhiyun} 292*4882a593Smuzhiyun 293*4882a593Smuzhiyun// validate distro name 294*4882a593Smuzhiyunfunction validate_distro_name() { 295*4882a593Smuzhiyun var value = $("input#new-distro").val(); 296*4882a593Smuzhiyun 297*4882a593Smuzhiyun // presumed innocence 298*4882a593Smuzhiyun $('#distro-error-message').text(""); 299*4882a593Smuzhiyun var error_msg = ""; 300*4882a593Smuzhiyun 301*4882a593Smuzhiyun var has_spaces = (0 <= value.indexOf(" ")); 302*4882a593Smuzhiyun 303*4882a593Smuzhiyun if (has_spaces) { 304*4882a593Smuzhiyun error_msg = "A valid distro name cannot include spaces"; 305*4882a593Smuzhiyun } else if (0 == value.length) { 306*4882a593Smuzhiyun error_msg = " "; 307*4882a593Smuzhiyun } 308*4882a593Smuzhiyun 309*4882a593Smuzhiyun if ("" != error_msg) { 310*4882a593Smuzhiyun $('#distro-error-message').text(error_msg); 311*4882a593Smuzhiyun $("#apply-change-distro").attr("disabled","disabled"); 312*4882a593Smuzhiyun 313*4882a593Smuzhiyun // add one (and only one) error class append 314*4882a593Smuzhiyun $("#change-distro-form").addClass("has-error"); 315*4882a593Smuzhiyun 316*4882a593Smuzhiyun return false; 317*4882a593Smuzhiyun } 318*4882a593Smuzhiyun 319*4882a593Smuzhiyun $("#change-distro-form").removeClass("has-error"); 320*4882a593Smuzhiyun $("#apply-change-distro").removeAttr("disabled"); 321*4882a593Smuzhiyun return true; 322*4882a593Smuzhiyun} 323*4882a593Smuzhiyun 324*4882a593Smuzhiyun// Test to insure at least one FS Type is checked 325*4882a593Smuzhiyunfunction enableFsTypesSave() { 326*4882a593Smuzhiyun var any_checked = 0; 327*4882a593Smuzhiyun $(".fs-checkbox-fstypes:checked").each(function(){ 328*4882a593Smuzhiyun any_checked = 1; 329*4882a593Smuzhiyun }); 330*4882a593Smuzhiyun if ( 0 == any_checked ) { 331*4882a593Smuzhiyun $("#apply-change-image_fstypes").attr("disabled","disabled"); 332*4882a593Smuzhiyun $('.scrolling').addClass('has-error'); 333*4882a593Smuzhiyun $('#fstypes-error-message').show(); 334*4882a593Smuzhiyun } 335*4882a593Smuzhiyun else { 336*4882a593Smuzhiyun $("#apply-change-image_fstypes").removeAttr("disabled"); 337*4882a593Smuzhiyun $('.scrolling').removeClass('has-error'); 338*4882a593Smuzhiyun $('#fstypes-error-message').hide(); 339*4882a593Smuzhiyun } 340*4882a593Smuzhiyun} 341*4882a593Smuzhiyun 342*4882a593Smuzhiyun// Preset or reset the Package Class checkbox labels 343*4882a593Smuzhiyunfunction updatePackageClassCheckboxes() { 344*4882a593Smuzhiyun $('#package_class_1, #package_class_2').hide(); 345*4882a593Smuzhiyun if ($('select').val() == 'package_deb') { 346*4882a593Smuzhiyun $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_ipk'); 347*4882a593Smuzhiyun $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm'); 348*4882a593Smuzhiyun } 349*4882a593Smuzhiyun if ($('select').val() == 'package_ipk') { 350*4882a593Smuzhiyun $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb'); 351*4882a593Smuzhiyun $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_rpm'); 352*4882a593Smuzhiyun } 353*4882a593Smuzhiyun if ($('select').val() == 'package_rpm') { 354*4882a593Smuzhiyun $('#package_class_1').html('<input type="checkbox" id="package_class_1_input"> package_deb'); 355*4882a593Smuzhiyun $('#package_class_2').html('<input type="checkbox" id="package_class_2_input"> package_ipk'); 356*4882a593Smuzhiyun } 357*4882a593Smuzhiyun $('#package_class_1, #package_class_2').fadeIn(1500); 358*4882a593Smuzhiyun} 359*4882a593Smuzhiyun 360*4882a593Smuzhiyun// Re-assert handlers when the page is served and/or refreshed via Ajax 361*4882a593Smuzhiyunfunction setEventHandlersForDynamicElements() { 362*4882a593Smuzhiyun 363*4882a593Smuzhiyun // change variable value 364*4882a593Smuzhiyun $('.js-icon-pencil-config_var').click(function (evt) { 365*4882a593Smuzhiyun var pk = $(this).attr("x-data"); 366*4882a593Smuzhiyun var current_val = $("#config_var_value_"+pk).text(); 367*4882a593Smuzhiyun $("#config_var_value_"+pk).hide(); 368*4882a593Smuzhiyun $("#config_var_trash_"+pk).hide(); 369*4882a593Smuzhiyun $(".js-icon-pencil-config_var[x-data="+pk+"]").hide(); 370*4882a593Smuzhiyun $("#change-config_var-form_"+pk).slideDown(); 371*4882a593Smuzhiyun $("#new-config_var_"+pk).val(current_val); 372*4882a593Smuzhiyun if ( $("#new-config_var_"+pk).val().length ) { 373*4882a593Smuzhiyun $("#apply-change-config_var_"+pk).removeAttr("disabled"); 374*4882a593Smuzhiyun } 375*4882a593Smuzhiyun else { 376*4882a593Smuzhiyun $("#apply-change-config_var_"+pk).attr("disabled"); 377*4882a593Smuzhiyun } 378*4882a593Smuzhiyun }); 379*4882a593Smuzhiyun 380*4882a593Smuzhiyun $('.js-cancel-change-config_var').click(function (evt) { 381*4882a593Smuzhiyun var pk = evt.target.attributes["x-data"].value; 382*4882a593Smuzhiyun $("#change-config_var-form_"+pk).slideUp(function() { 383*4882a593Smuzhiyun $("#config_var_trash_"+pk).show(); 384*4882a593Smuzhiyun $('#config_var_value_'+pk).show(); 385*4882a593Smuzhiyun $(".js-icon-pencil-config_var[x-data="+pk+"]").show(); 386*4882a593Smuzhiyun }); 387*4882a593Smuzhiyun }); 388*4882a593Smuzhiyun 389*4882a593Smuzhiyun $(".js-new-config_var").on('input', function(){ 390*4882a593Smuzhiyun if ($(this).val().length == 0) { 391*4882a593Smuzhiyun $(this).parent("div").next(".btn-default").attr("disabled","disabled"); 392*4882a593Smuzhiyun } 393*4882a593Smuzhiyun else { 394*4882a593Smuzhiyun $(this).parent("div").next(".btn-default").removeAttr("disabled"); 395*4882a593Smuzhiyun } 396*4882a593Smuzhiyun }); 397*4882a593Smuzhiyun 398*4882a593Smuzhiyun $('.js-apply-change-config_var').click(function (evt) { 399*4882a593Smuzhiyun var xdata = evt.target.attributes["x-data"].value.split(":"); 400*4882a593Smuzhiyun var pk = xdata[0]; 401*4882a593Smuzhiyun var variable = xdata[1]; 402*4882a593Smuzhiyun var val = $('#new-config_var_'+pk).val(); 403*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : variable+':'+val}); 404*4882a593Smuzhiyun $("#change-config_var-form_"+pk).slideUp(); 405*4882a593Smuzhiyun $("#config_var_trash_"+pk).fadeIn(); 406*4882a593Smuzhiyun $('#config_var_value_'+pk).fadeIn(); 407*4882a593Smuzhiyun $(".js-icon-pencil-config_var[x-data="+pk+"]").fadeIn(); 408*4882a593Smuzhiyun }); 409*4882a593Smuzhiyun 410*4882a593Smuzhiyun // delete variable 411*4882a593Smuzhiyun $(".js-icon-trash-config_var").click(function (evt) { 412*4882a593Smuzhiyun var pk = $(this).attr("x-data"); 413*4882a593Smuzhiyun 414*4882a593Smuzhiyun // fade out the variable+value div, then refresh the variable list 415*4882a593Smuzhiyun $(this).fadeOut(); 416*4882a593Smuzhiyun $(this).tooltip("hide"); 417*4882a593Smuzhiyun $("config_var_entry_"+pk).fadeOut(); 418*4882a593Smuzhiyun $('#config_var_value_'+pk).parent("dd").fadeOut(); 419*4882a593Smuzhiyun postEditAjaxRequest({"configvarDel": evt.target.attributes["x-data"].value}); 420*4882a593Smuzhiyun }); 421*4882a593Smuzhiyun 422*4882a593Smuzhiyun} 423*4882a593Smuzhiyun 424*4882a593Smuzhiyunfunction onEditPageUpdate(data) { 425*4882a593Smuzhiyun // update targets 426*4882a593Smuzhiyun var i; var orightml = ""; 427*4882a593Smuzhiyun 428*4882a593Smuzhiyun var configvars_sorted = data.configvars.sort(function(a, b){return a[0] > b[0]}); 429*4882a593Smuzhiyun 430*4882a593Smuzhiyun var managed_configvars = document.getElementsByClassName('js-config-var-managed-name'); 431*4882a593Smuzhiyun 432*4882a593Smuzhiyun for (i = 0; i < configvars_sorted.length; i++) { 433*4882a593Smuzhiyun // skip if the variable name has a special context (not user defined) 434*4882a593Smuzhiyun var var_context=undefined; 435*4882a593Smuzhiyun for (var j = 0, length = managed_configvars.length; j < length; j++) { 436*4882a593Smuzhiyun if ((managed_configvars[j].innerHTML == configvars_sorted[i][0]) || 437*4882a593Smuzhiyun (managed_configvars[j].value == configvars_sorted[i][0]) ) { 438*4882a593Smuzhiyun var_context='m'; 439*4882a593Smuzhiyun } 440*4882a593Smuzhiyun } 441*4882a593Smuzhiyun if (configvars_sorted[i][0].startsWith("INTERNAL_")) { 442*4882a593Smuzhiyun var_context='m'; 443*4882a593Smuzhiyun } 444*4882a593Smuzhiyun if (var_context == undefined) { 445*4882a593Smuzhiyun orightml += '<dt><span id="config_var_entry_'+configvars_sorted[i][2]+'" class="js-config-var-name"></span><span class="glyphicon glyphicon-trash js-icon-trash-config_var" id="config_var_trash_'+configvars_sorted[i][2]+'" x-data="'+configvars_sorted[i][2]+'"></span> </dt>' 446*4882a593Smuzhiyun orightml += '<dd class="variable-list">' 447*4882a593Smuzhiyun orightml += ' <span class="lead" id="config_var_value_'+configvars_sorted[i][2]+'"></span>' 448*4882a593Smuzhiyun orightml += ' <span class="glyphicon glyphicon-edit js-icon-pencil-config_var" x-data="'+configvars_sorted[i][2]+'"></span>' 449*4882a593Smuzhiyun orightml += ' <form class="form-inline" id="change-config_var-form_'+configvars_sorted[i][2]+'" style="display:none;">' 450*4882a593Smuzhiyun orightml += ' <div class="form-group">' 451*4882a593Smuzhiyun orightml += ' <input type="text" class="form-control js-new-config_var" id="new-config_var_'+configvars_sorted[i][2]+'" value=""></div>' 452*4882a593Smuzhiyun orightml += ' <button id="apply-change-config_var_'+configvars_sorted[i][2]+'" class="btn btn-default js-apply-change-config_var" type="button" x-data="'+configvars_sorted[i][2]+':'+configvars_sorted[i][0]+'" disabled>Save</button>' 453*4882a593Smuzhiyun orightml += ' <button type="button" class="btn btn-link js-cancel-change-config_var" x-data="'+configvars_sorted[i][2]+'">Cancel</button>' 454*4882a593Smuzhiyun orightml += ' </form>' 455*4882a593Smuzhiyun orightml += '</dd>' 456*4882a593Smuzhiyun } 457*4882a593Smuzhiyun } 458*4882a593Smuzhiyun 459*4882a593Smuzhiyun // update configvars list HTML framework 460*4882a593Smuzhiyun $("dl#configvar-list").html(orightml); 461*4882a593Smuzhiyun 462*4882a593Smuzhiyun // insert the name/value pairs safely as non-HTML 463*4882a593Smuzhiyun for (i = 0; i < configvars_sorted.length; i++) { 464*4882a593Smuzhiyun $('#config_var_entry_'+configvars_sorted[i][2]).text(configvars_sorted[i][0]); 465*4882a593Smuzhiyun $('#config_var_value_'+configvars_sorted[i][2]).text(configvars_sorted[i][1]); 466*4882a593Smuzhiyun } 467*4882a593Smuzhiyun 468*4882a593Smuzhiyun // Add the tooltips 469*4882a593Smuzhiyun $(".js-icon-trash-config_var").each( function(){ setDeleteTooltip($(this)); }); 470*4882a593Smuzhiyun $(".js-icon-pencil-config_var").each(function(){ setChangeTooltip($(this)); }); 471*4882a593Smuzhiyun 472*4882a593Smuzhiyun // re-assert these event handlers 473*4882a593Smuzhiyun setEventHandlersForDynamicElements(); 474*4882a593Smuzhiyun} 475*4882a593Smuzhiyun 476*4882a593Smuzhiyunfunction onEditAjaxSuccess(data, textstatus) { 477*4882a593Smuzhiyun console.log("XHR returned:", data, "(" + textstatus + ")"); 478*4882a593Smuzhiyun if (data.error != "ok") { 479*4882a593Smuzhiyun alert("error on request:\n" + data.error); 480*4882a593Smuzhiyun return; 481*4882a593Smuzhiyun } 482*4882a593Smuzhiyun 483*4882a593Smuzhiyun // delayed page reload? 484*4882a593Smuzhiyun if (do_reload) { 485*4882a593Smuzhiyun do_reload=false; 486*4882a593Smuzhiyun location.reload(true); 487*4882a593Smuzhiyun } else { 488*4882a593Smuzhiyun onEditPageUpdate(data); 489*4882a593Smuzhiyun } 490*4882a593Smuzhiyun} 491*4882a593Smuzhiyun 492*4882a593Smuzhiyunfunction onEditAjaxError(jqXHR, textstatus, error) { 493*4882a593Smuzhiyun alert("XHR errored:\n" + error + "\n(" + textstatus + ")"); 494*4882a593Smuzhiyun // re-assert the event handlers 495*4882a593Smuzhiyun} 496*4882a593Smuzhiyun 497*4882a593Smuzhiyun/* ensure cookie exists {% csrf_token %} */ 498*4882a593Smuzhiyunfunction postEditAjaxRequest(reqdata) { 499*4882a593Smuzhiyun var ajax = $.ajax({ 500*4882a593Smuzhiyun type:"POST", 501*4882a593Smuzhiyun data: $.param(reqdata), 502*4882a593Smuzhiyun url:"{% url 'xhr_configvaredit' project.id%}", 503*4882a593Smuzhiyun headers: { 'X-CSRFToken': $.cookie("csrftoken")}, 504*4882a593Smuzhiyun success: onEditAjaxSuccess, 505*4882a593Smuzhiyun error: onEditAjaxError, 506*4882a593Smuzhiyun }) 507*4882a593Smuzhiyun} 508*4882a593Smuzhiyun 509*4882a593Smuzhiyunfunction setDeleteTooltip(object) { 510*4882a593Smuzhiyun object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Delete" }); 511*4882a593Smuzhiyun} 512*4882a593Smuzhiyunfunction setChangeTooltip(object) { 513*4882a593Smuzhiyun object.tooltip({ container: 'body', html: true, delay: {show: 400}, title: "Change" }); 514*4882a593Smuzhiyun} 515*4882a593Smuzhiyun 516*4882a593Smuzhiyun$(document).ready(function() { 517*4882a593Smuzhiyun 518*4882a593Smuzhiyun // 519*4882a593Smuzhiyun // Register handlers for static elements 520*4882a593Smuzhiyun // 521*4882a593Smuzhiyun 522*4882a593Smuzhiyun {% if distro_defined %} 523*4882a593Smuzhiyun // change distro variable 524*4882a593Smuzhiyun $('#change-distro-icon').click(function() { 525*4882a593Smuzhiyun $('#change-distro-icon, #distro').hide(); 526*4882a593Smuzhiyun $("#change-distro-form").slideDown(); 527*4882a593Smuzhiyun $("#new-distro").val( $('#distro').text() ); 528*4882a593Smuzhiyun $("#apply-change-distro").removeAttr("disabled"); 529*4882a593Smuzhiyun }); 530*4882a593Smuzhiyun 531*4882a593Smuzhiyun $('#cancel-change-distro').click(function(){ 532*4882a593Smuzhiyun $("#change-distro-form").slideUp(function() { 533*4882a593Smuzhiyun $('#distro, #change-distro-icon').show(); 534*4882a593Smuzhiyun 535*4882a593Smuzhiyun // reset any dangling error state 536*4882a593Smuzhiyun $('#distro-error-message').text(""); 537*4882a593Smuzhiyun $("#change-distro-form").removeClass("has-error"); 538*4882a593Smuzhiyun }); 539*4882a593Smuzhiyun }); 540*4882a593Smuzhiyun 541*4882a593Smuzhiyun // validate new distro name 542*4882a593Smuzhiyun $("input#new-distro").on('input', function (evt) { 543*4882a593Smuzhiyun validate_distro_name(); 544*4882a593Smuzhiyun }); 545*4882a593Smuzhiyun 546*4882a593Smuzhiyun $('#apply-change-distro').click(function(){ 547*4882a593Smuzhiyun //$('#repo').parent().removeClass('highlight-go'); 548*4882a593Smuzhiyun var name = $('#new-distro').val(); 549*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'DISTRO:'+name}); 550*4882a593Smuzhiyun $('#distro').text(name); 551*4882a593Smuzhiyun $("#change-distro-form").slideUp(function () { 552*4882a593Smuzhiyun $('#distro, #change-distro-icon').show(); 553*4882a593Smuzhiyun }); 554*4882a593Smuzhiyun }); 555*4882a593Smuzhiyun {% endif %} 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun {% if dl_dir_defined %} 558*4882a593Smuzhiyun 559*4882a593Smuzhiyun // change DL_DIR variable 560*4882a593Smuzhiyun $('#change-dl_dir-icon').click(function() { 561*4882a593Smuzhiyun $('#change-dl_dir-form').removeClass('has-error'); 562*4882a593Smuzhiyun // preset the edit value 563*4882a593Smuzhiyun var current_val = $("#dl_dir").text().trim(); 564*4882a593Smuzhiyun if (current_val == "Not set") { 565*4882a593Smuzhiyun current_val=""; 566*4882a593Smuzhiyun $("#apply-change-dl_dir").attr("disabled","disabled"); 567*4882a593Smuzhiyun } 568*4882a593Smuzhiyun $("input#new-dl_dir").val(current_val); 569*4882a593Smuzhiyun // enable / disable the save button based on the input value 570*4882a593Smuzhiyun if ( current_val.length ) { 571*4882a593Smuzhiyun $("#apply-change-dl_dir").removeAttr("disabled"); 572*4882a593Smuzhiyun } 573*4882a593Smuzhiyun else { 574*4882a593Smuzhiyun $("#apply-change-dl_dir").attr("disabled","disabled"); 575*4882a593Smuzhiyun } 576*4882a593Smuzhiyun 577*4882a593Smuzhiyun $('#change-dl_dir-icon, #dl_dir').hide(); 578*4882a593Smuzhiyun $("#change-dl_dir-form").slideDown(); 579*4882a593Smuzhiyun }); 580*4882a593Smuzhiyun 581*4882a593Smuzhiyun $('#cancel-change-dl_dir').click(function(){ 582*4882a593Smuzhiyun $("#hintError-dl_dir").hide(); 583*4882a593Smuzhiyun $("#hintError-initialChar-dl_dir").hide(); 584*4882a593Smuzhiyun $("#change-dl_dir-form").slideUp(function() { 585*4882a593Smuzhiyun $('#dl_dir, #change-dl_dir-icon').show(); 586*4882a593Smuzhiyun }); 587*4882a593Smuzhiyun }); 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun $("#new-dl_dir").on('input', function(){ 590*4882a593Smuzhiyun if ($(this).val().trim().length == 0) { 591*4882a593Smuzhiyun $("#apply-change-dl_dir").attr("disabled","disabled"); 592*4882a593Smuzhiyun $('#change-dl_dir-form').addClass('has-error'); 593*4882a593Smuzhiyun $('#hintError-dl_dir').hide(); 594*4882a593Smuzhiyun $('#hintError-initialChar-dl_dir').hide(); 595*4882a593Smuzhiyun } 596*4882a593Smuzhiyun else { 597*4882a593Smuzhiyun var input = $(this); 598*4882a593Smuzhiyun var reBeginWithSlash = /^\//; 599*4882a593Smuzhiyun var reCheckVariable = /^\$/; 600*4882a593Smuzhiyun var re = /([ <>\\|":%\?\*]+)/; 601*4882a593Smuzhiyun var invalidDir = re.test(input.val()); 602*4882a593Smuzhiyun var invalidSlash = reBeginWithSlash.test(input.val()); 603*4882a593Smuzhiyun var invalidVar = reCheckVariable.test(input.val()); 604*4882a593Smuzhiyun if (!invalidSlash && !invalidVar) { 605*4882a593Smuzhiyun $('#change-dl_dir-form').addClass('has-error'); 606*4882a593Smuzhiyun $("#apply-change-dl_dir").attr("disabled","disabled"); 607*4882a593Smuzhiyun $('#hintError-initialChar-dl_dir').show(); 608*4882a593Smuzhiyun } else if (invalidDir) { 609*4882a593Smuzhiyun $('#change-dl_dir-form').addClass('has-error'); 610*4882a593Smuzhiyun $("#apply-change-dl_dir").attr("disabled","disabled"); 611*4882a593Smuzhiyun $('#hintError-dl_dir').show(); 612*4882a593Smuzhiyun } else { 613*4882a593Smuzhiyun $('#change-dl_dir-form').removeClass('has-error'); 614*4882a593Smuzhiyun $("#apply-change-dl_dir").removeAttr("disabled"); 615*4882a593Smuzhiyun $('#hintError-dl_dir').hide(); 616*4882a593Smuzhiyun $('#hintError-initialChar-dl_dir').hide(); 617*4882a593Smuzhiyun } 618*4882a593Smuzhiyun } 619*4882a593Smuzhiyun }); 620*4882a593Smuzhiyun 621*4882a593Smuzhiyun $('#apply-change-dl_dir').click(function(){ 622*4882a593Smuzhiyun var value = $('#new-dl_dir').val().trim(); 623*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'DL_DIR:'+value}); 624*4882a593Smuzhiyun $('#dl_dir').text(value); 625*4882a593Smuzhiyun $('#dl_dir').removeClass('muted'); 626*4882a593Smuzhiyun $("#change-dl_dir-form").slideUp(function () { 627*4882a593Smuzhiyun $('#dl_dir, #change-dl_dir-icon').show(); 628*4882a593Smuzhiyun }); 629*4882a593Smuzhiyun }); 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun {% endif %} 632*4882a593Smuzhiyun 633*4882a593Smuzhiyun {% if fstypes_defined %} 634*4882a593Smuzhiyun // change IMAGE_FSTYPES variable 635*4882a593Smuzhiyun 636*4882a593Smuzhiyun // get value of fstypes and add to the textbox 637*4882a593Smuzhiyun $("#new-imagefs_types").val("{{fstypes}}"); 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun // If value of new-imagefs_types is empty disable save button 640*4882a593Smuzhiyun $("#new-imagefs_types").on("input", function() { 641*4882a593Smuzhiyun $(this).val($(this).val().replace(/\s+/g,' ')); 642*4882a593Smuzhiyun if ($(this).val().length === 0) { 643*4882a593Smuzhiyun //$('#apply-change-image_fstypes').prop('disabled', true); 644*4882a593Smuzhiyun $('#apply-change-image_fstypes').attr("disabled", "disabled"); 645*4882a593Smuzhiyun } else { 646*4882a593Smuzhiyun //$('#apply-change-image_fstypes').prop('disabled', false); 647*4882a593Smuzhiyun $('#apply-change-image_fstypes').removeAttr("disabled"); 648*4882a593Smuzhiyun } 649*4882a593Smuzhiyun 650*4882a593Smuzhiyun /*If user types imagefs do the action on checkboxes. 651*4882a593Smuzhiyun Lets say if an imagefstype typed by user and the same 652*4882a593Smuzhiyun imagefs is unchecked in the checkbox, then checkbox needs 653*4882a593Smuzhiyun to get checked. Similarly when user deletes imagefs from 654*4882a593Smuzhiyun textbox the checkbox which is checked gets unchecked. 655*4882a593Smuzhiyun */ 656*4882a593Smuzhiyun $('#all-image_fstypes input').each(function(){ 657*4882a593Smuzhiyun var imagefs_userval = $('#new-imagefs_types').val(); 658*4882a593Smuzhiyun if( imagefs_userval.indexOf($(this).val()) > -1) { 659*4882a593Smuzhiyun $(this).prop('checked', true); 660*4882a593Smuzhiyun } else { 661*4882a593Smuzhiyun $(this).prop('checked', false); 662*4882a593Smuzhiyun } 663*4882a593Smuzhiyun }); 664*4882a593Smuzhiyun 665*4882a593Smuzhiyun // Validate underscore in image fs types 666*4882a593Smuzhiyun if ($(this).val().indexOf('_') > -1) { 667*4882a593Smuzhiyun $('#validate-image_fstypes').addClass('has-error'); 668*4882a593Smuzhiyun $('#hintError-image-fs_type').show(); 669*4882a593Smuzhiyun $("#apply-change-image_fstypes").prop("disabled", true); 670*4882a593Smuzhiyun } else { 671*4882a593Smuzhiyun $('#validate-image_fstypes').removeClass('has-error'); 672*4882a593Smuzhiyun $('#hintError-image-fs_type').hide(); 673*4882a593Smuzhiyun } 674*4882a593Smuzhiyun }); 675*4882a593Smuzhiyun 676*4882a593Smuzhiyun $('#change-image_fstypes-icon').click(function() { 677*4882a593Smuzhiyun $('#change-image_fstypes-icon, #image_fstypes').hide(); 678*4882a593Smuzhiyun $("#change-image_fstypes-form").slideDown(); 679*4882a593Smuzhiyun // avoid false substring matches by including space separators 680*4882a593Smuzhiyun var html = ""; 681*4882a593Smuzhiyun var fstypes = " " + document.getElementById("image_fstypes").innerHTML + " "; 682*4882a593Smuzhiyun var fstypes_list = document.getElementsByClassName('js-checkbox-fstypes-list'); 683*4882a593Smuzhiyun // Add the checked boxes first 684*4882a593Smuzhiyun if (" " != fstypes) { 685*4882a593Smuzhiyun for (var i = 0, length = fstypes_list.length; i < length; i++) { 686*4882a593Smuzhiyun if (0 <= fstypes.indexOf(" "+fstypes_list[i].value+" ")) { 687*4882a593Smuzhiyun html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'" checked="checked">'+fstypes_list[i].value+'</label></div>'; 688*4882a593Smuzhiyun } 689*4882a593Smuzhiyun } 690*4882a593Smuzhiyun } 691*4882a593Smuzhiyun // Add the un-checked boxes second 692*4882a593Smuzhiyun for (var i = 0, length = fstypes_list.length; i < length; i++) { 693*4882a593Smuzhiyun if (0 > fstypes.indexOf(" "+fstypes_list[i].value+" ")) { 694*4882a593Smuzhiyun html += '<div class="checkbox"><label><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label></div>'; 695*4882a593Smuzhiyun } 696*4882a593Smuzhiyun } 697*4882a593Smuzhiyun // Add the 'no search matches' line last 698*4882a593Smuzhiyun html += '<label id="no-match-fstypes" class="text-muted">No image types found</label>\n'; 699*4882a593Smuzhiyun // Display the list 700*4882a593Smuzhiyun document.getElementById("all-image_fstypes").innerHTML = html; 701*4882a593Smuzhiyun $('#no-match-fstypes').hide(); 702*4882a593Smuzhiyun 703*4882a593Smuzhiyun // clear the previous filter values and warning messages 704*4882a593Smuzhiyun $("input#filter-image_fstypes").val(""); 705*4882a593Smuzhiyun }); 706*4882a593Smuzhiyun 707*4882a593Smuzhiyun // When checkbox is checked/unchecked kindly update the text 708*4882a593Smuzhiyun $(document).on("change", "#all-image_fstypes :checkbox", function() { 709*4882a593Smuzhiyun var imagefs = $(this); 710*4882a593Smuzhiyun var imagefs_obj = $('#new-imagefs_types'); 711*4882a593Smuzhiyun var imagefs_userval = imagefs_obj.val(); 712*4882a593Smuzhiyun if ($(this).is(':checked')) { 713*4882a593Smuzhiyun if (imagefs_userval.indexOf($(imagefs).val()) === -1) { 714*4882a593Smuzhiyun imagefs_obj.val(imagefs_userval + " " + $(imagefs).val()); 715*4882a593Smuzhiyun } 716*4882a593Smuzhiyun } else { 717*4882a593Smuzhiyun if (imagefs_userval.indexOf($(imagefs).val()) > -1) { 718*4882a593Smuzhiyun imagefs_obj.val(imagefs_userval.replace($(imagefs).val(), '').trim()); 719*4882a593Smuzhiyun } 720*4882a593Smuzhiyun } 721*4882a593Smuzhiyun if ($('#new-imagefs_types').val().length === 0) { 722*4882a593Smuzhiyun $("#apply-change-image_fstypes").prop("disabled", true); 723*4882a593Smuzhiyun $('#fstypes-error-message').show(); 724*4882a593Smuzhiyun } else { 725*4882a593Smuzhiyun $("#apply-change-image_fstypes").prop("disabled", false); 726*4882a593Smuzhiyun $('#fstypes-error-message').hide(); 727*4882a593Smuzhiyun } 728*4882a593Smuzhiyun }); 729*4882a593Smuzhiyun 730*4882a593Smuzhiyun $('#cancel-change-image_fstypes').click(function(){ 731*4882a593Smuzhiyun $("#new-imagefs_types").val("{{fstypes}}"); 732*4882a593Smuzhiyun $("#change-image_fstypes-form").slideUp(function() { 733*4882a593Smuzhiyun $('#image_fstypes, #change-image_fstypes-icon').show(); 734*4882a593Smuzhiyun }); 735*4882a593Smuzhiyun }); 736*4882a593Smuzhiyun 737*4882a593Smuzhiyun $('#filter-image_fstypes').on('input', function(){ 738*4882a593Smuzhiyun var valThis = $(this).val().toLowerCase(); 739*4882a593Smuzhiyun var matchCount=0; 740*4882a593Smuzhiyun $('#all-image_fstypes label').each(function(){ 741*4882a593Smuzhiyun var text = $(this).text().toLowerCase(); 742*4882a593Smuzhiyun var match = text.indexOf(valThis); 743*4882a593Smuzhiyun if (match >= 0) { 744*4882a593Smuzhiyun $(this).show(); 745*4882a593Smuzhiyun matchCount += 1; 746*4882a593Smuzhiyun } 747*4882a593Smuzhiyun else { 748*4882a593Smuzhiyun $(this).hide(); 749*4882a593Smuzhiyun } 750*4882a593Smuzhiyun }); 751*4882a593Smuzhiyun if (matchCount === 0) { 752*4882a593Smuzhiyun $('#no-match-fstypes').show(); 753*4882a593Smuzhiyun } else { 754*4882a593Smuzhiyun $('#no-match-fstypes').hide(); 755*4882a593Smuzhiyun } 756*4882a593Smuzhiyun }); 757*4882a593Smuzhiyun 758*4882a593Smuzhiyun $('#apply-change-image_fstypes').click(function(){ 759*4882a593Smuzhiyun var fstypes = $('#new-imagefs_types').val(); 760*4882a593Smuzhiyun 761*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'IMAGE_FSTYPES:'+fstypes}); 762*4882a593Smuzhiyun $('#image_fstypes').text(fstypes); 763*4882a593Smuzhiyun $('#image_fstypes').parent().removeClass('muted'); 764*4882a593Smuzhiyun 765*4882a593Smuzhiyun $("#change-image_fstypes-form").slideUp(function() { 766*4882a593Smuzhiyun $('#image_fstypes, #change-image_fstypes-icon').show(); 767*4882a593Smuzhiyun }); 768*4882a593Smuzhiyun }); 769*4882a593Smuzhiyun {% endif %} 770*4882a593Smuzhiyun 771*4882a593Smuzhiyun 772*4882a593Smuzhiyun {% if image_install_append_defined %} 773*4882a593Smuzhiyun 774*4882a593Smuzhiyun // init IMAGE_INSTALL:append trash icon 775*4882a593Smuzhiyun setDeleteTooltip($('#delete-image_install-icon')); 776*4882a593Smuzhiyun 777*4882a593Smuzhiyun // change IMAGE_INSTALL:append variable 778*4882a593Smuzhiyun $('#change-image_install-icon').click(function() { 779*4882a593Smuzhiyun // preset the edit value 780*4882a593Smuzhiyun var current_val = $("span#image_install").text().trim(); 781*4882a593Smuzhiyun if (current_val == "Not set") { 782*4882a593Smuzhiyun current_val=""; 783*4882a593Smuzhiyun $("#apply-change-image_install").attr("disabled","disabled"); 784*4882a593Smuzhiyun } else { 785*4882a593Smuzhiyun // insure these non-empty values have single space prefix 786*4882a593Smuzhiyun current_val=" " + current_val; 787*4882a593Smuzhiyun $("#apply-change-image_install").removeAttr("disabled"); 788*4882a593Smuzhiyun } 789*4882a593Smuzhiyun $("input#new-image_install").val(current_val); 790*4882a593Smuzhiyun 791*4882a593Smuzhiyun $('#change-image_install-icon, #delete-image_install-icon, #image_install').hide(); 792*4882a593Smuzhiyun $("#change-image_install-form").slideDown(); 793*4882a593Smuzhiyun }); 794*4882a593Smuzhiyun 795*4882a593Smuzhiyun $('#cancel-change-image_install').click(function(){ 796*4882a593Smuzhiyun $("#change-image_install-form").slideUp(function() { 797*4882a593Smuzhiyun $('#image_install, #change-image_install-icon').show(); 798*4882a593Smuzhiyun if ($("span#image_install").text() != "Not set") { 799*4882a593Smuzhiyun $('#delete-image_install-icon').show(); 800*4882a593Smuzhiyun setDeleteTooltip($('#delete-image_install-icon')); 801*4882a593Smuzhiyun } 802*4882a593Smuzhiyun }); 803*4882a593Smuzhiyun }); 804*4882a593Smuzhiyun 805*4882a593Smuzhiyun $("#new-image_install").on('input', function(){ 806*4882a593Smuzhiyun if ($(this).val().trim().length == 0) { 807*4882a593Smuzhiyun $("#apply-change-image_install").attr("disabled","disabled"); 808*4882a593Smuzhiyun } 809*4882a593Smuzhiyun else { 810*4882a593Smuzhiyun $("#apply-change-image_install").removeAttr("disabled"); 811*4882a593Smuzhiyun } 812*4882a593Smuzhiyun }); 813*4882a593Smuzhiyun 814*4882a593Smuzhiyun $('#apply-change-image_install').click(function(){ 815*4882a593Smuzhiyun // insure these non-empty values have single space prefix 816*4882a593Smuzhiyun var value = " " + $('#new-image_install').val().trim(); 817*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL:append:'+value}); 818*4882a593Smuzhiyun $('#image_install').text(value); 819*4882a593Smuzhiyun $('#image_install').removeClass('text-muted'); 820*4882a593Smuzhiyun $("#change-image_install-form").slideUp(function () { 821*4882a593Smuzhiyun $('#image_install, #change-image_install-icon').show(); 822*4882a593Smuzhiyun if (value.length > -1) { 823*4882a593Smuzhiyun $('#delete-image_install-icon').show(); 824*4882a593Smuzhiyun setDeleteTooltip($('#delete-image_install-icon')); 825*4882a593Smuzhiyun } 826*4882a593Smuzhiyun }); 827*4882a593Smuzhiyun }); 828*4882a593Smuzhiyun 829*4882a593Smuzhiyun // delete IMAGE_INSTALL:append variable value 830*4882a593Smuzhiyun $('#delete-image_install-icon').click(function(){ 831*4882a593Smuzhiyun $(this).tooltip('hide'); 832*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'IMAGE_INSTALL:append:'+''}); 833*4882a593Smuzhiyun $('#image_install').parent().fadeOut(1000, function(){ 834*4882a593Smuzhiyun $('#image_install').addClass('text-muted'); 835*4882a593Smuzhiyun $('#image_install').text('Not set'); 836*4882a593Smuzhiyun $('#delete-image_install-icon').hide(); 837*4882a593Smuzhiyun $('#image_install').parent().fadeIn(1000); 838*4882a593Smuzhiyun }); 839*4882a593Smuzhiyun }); 840*4882a593Smuzhiyun {% endif %} 841*4882a593Smuzhiyun 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun {% if package_classes_defined %} 844*4882a593Smuzhiyun // change PACKAGE_CLASSES variable 845*4882a593Smuzhiyun $('#change-package_classes-icon').click(function() { 846*4882a593Smuzhiyun $('#change-package_classes-icon, #package_classes').hide(); 847*4882a593Smuzhiyun $("#change-package_classes-form").slideDown(); 848*4882a593Smuzhiyun 849*4882a593Smuzhiyun // initialize the pulldown and checkboxes 850*4882a593Smuzhiyun var value = $("#package_classes").text(); 851*4882a593Smuzhiyun if ( value.indexOf("package_deb") == 0 ) { 852*4882a593Smuzhiyun $("#package_classes-select").prop('selectedIndex', 0); 853*4882a593Smuzhiyun updatePackageClassCheckboxes(); 854*4882a593Smuzhiyun if ( value.indexOf("_ipk") > 0 ) { 855*4882a593Smuzhiyun $("#package_class_1_input").attr("checked",true); 856*4882a593Smuzhiyun } 857*4882a593Smuzhiyun if ( value.indexOf("_rpm") > 0 ) { 858*4882a593Smuzhiyun $("#package_class_2_input").attr("checked",true); 859*4882a593Smuzhiyun } 860*4882a593Smuzhiyun } 861*4882a593Smuzhiyun 862*4882a593Smuzhiyun if ( value.indexOf("package_ipk") == 0 ) { 863*4882a593Smuzhiyun $("#package_classes-select").prop('selectedIndex', 1); 864*4882a593Smuzhiyun updatePackageClassCheckboxes(); 865*4882a593Smuzhiyun if ( value.indexOf("_deb") > 0 ) { 866*4882a593Smuzhiyun $("#package_class_1_input").attr("checked",true); 867*4882a593Smuzhiyun } 868*4882a593Smuzhiyun if ( value.indexOf("_rpm") > 0 ) { 869*4882a593Smuzhiyun $("#package_class_2_input").attr("checked",true); 870*4882a593Smuzhiyun } 871*4882a593Smuzhiyun } 872*4882a593Smuzhiyun 873*4882a593Smuzhiyun if ( value.indexOf("package_rpm") == 0 ) { 874*4882a593Smuzhiyun $("#package_classes-select").prop('selectedIndex', 2); 875*4882a593Smuzhiyun updatePackageClassCheckboxes(); 876*4882a593Smuzhiyun if ( value.indexOf("_deb") > 0 ) { 877*4882a593Smuzhiyun $("#package_class_1_input").attr("checked",true); 878*4882a593Smuzhiyun } 879*4882a593Smuzhiyun if ( value.indexOf("_ipk") > 0 ) { 880*4882a593Smuzhiyun $("#package_class_2_input").attr("checked",true); 881*4882a593Smuzhiyun } 882*4882a593Smuzhiyun } 883*4882a593Smuzhiyun }); 884*4882a593Smuzhiyun 885*4882a593Smuzhiyun $('#cancel-change-package_classes').click(function(){ 886*4882a593Smuzhiyun $("#change-package_classes-form").slideUp(function() { 887*4882a593Smuzhiyun $('#package_classes, #change-package_classes-icon').show(); 888*4882a593Smuzhiyun }); 889*4882a593Smuzhiyun }); 890*4882a593Smuzhiyun 891*4882a593Smuzhiyun $('select').change(function() { 892*4882a593Smuzhiyun updatePackageClassCheckboxes(); 893*4882a593Smuzhiyun }); 894*4882a593Smuzhiyun 895*4882a593Smuzhiyun $('#apply-change-package_classes').click(function(){ 896*4882a593Smuzhiyun var e = document.getElementById("package_classes-select"); 897*4882a593Smuzhiyun var val = e.options[e.selectedIndex].text; 898*4882a593Smuzhiyun 899*4882a593Smuzhiyun pc1_checked = document.getElementById("package_class_1_input").checked; 900*4882a593Smuzhiyun pc2_checked = document.getElementById("package_class_2_input").checked; 901*4882a593Smuzhiyun if (val == "package_deb") { 902*4882a593Smuzhiyun if (pc1_checked) val = val + " package_ipk"; 903*4882a593Smuzhiyun if (pc2_checked) val = val + " package_rpm"; 904*4882a593Smuzhiyun } 905*4882a593Smuzhiyun if (val == "package_ipk") { 906*4882a593Smuzhiyun if (pc1_checked) val = val + " package_deb"; 907*4882a593Smuzhiyun if (pc2_checked) val = val + " package_rpm"; 908*4882a593Smuzhiyun } 909*4882a593Smuzhiyun if (val == "package_rpm") { 910*4882a593Smuzhiyun if (pc1_checked) val = val + " package_deb"; 911*4882a593Smuzhiyun if (pc2_checked) val = val + " package_ipk"; 912*4882a593Smuzhiyun } 913*4882a593Smuzhiyun 914*4882a593Smuzhiyun $('#package_classes').text(val); 915*4882a593Smuzhiyun //$('#package_classes').parent().removeClass('muted'); 916*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'PACKAGE_CLASSES:'+val}); 917*4882a593Smuzhiyun $("#change-package_classes-form").slideUp(function() { 918*4882a593Smuzhiyun $('#package_classes, #change-package_classes-icon').show(); 919*4882a593Smuzhiyun }); 920*4882a593Smuzhiyun }); 921*4882a593Smuzhiyun {% endif %} 922*4882a593Smuzhiyun 923*4882a593Smuzhiyun {% if sstate_dir_defined %} 924*4882a593Smuzhiyun 925*4882a593Smuzhiyun // change SSTATE_DIR variable 926*4882a593Smuzhiyun $('#change-sstate_dir-icon').click(function() { 927*4882a593Smuzhiyun $('#change-sstate_dir-form').removeClass('has-error'); 928*4882a593Smuzhiyun // preset the edit value 929*4882a593Smuzhiyun var current_val = $("span#sstate_dir").text().trim(); 930*4882a593Smuzhiyun if (current_val == "Not set") { 931*4882a593Smuzhiyun current_val=""; 932*4882a593Smuzhiyun $("#apply-change-sstate_dir").attr("disabled","disabled"); 933*4882a593Smuzhiyun } 934*4882a593Smuzhiyun $("input#new-sstate_dir").val(current_val); 935*4882a593Smuzhiyun 936*4882a593Smuzhiyun // enable / disable the save button based on the input value 937*4882a593Smuzhiyun if ( current_val.length ) { 938*4882a593Smuzhiyun $("#apply-change-sstate_dir").removeAttr("disabled"); 939*4882a593Smuzhiyun } 940*4882a593Smuzhiyun else { 941*4882a593Smuzhiyun $("#apply-change-sstate_dir").attr("disabled","disabled"); 942*4882a593Smuzhiyun } 943*4882a593Smuzhiyun 944*4882a593Smuzhiyun $('#change-sstate_dir-icon, #sstate_dir').hide(); 945*4882a593Smuzhiyun $("#change-sstate_dir-form").slideDown(); 946*4882a593Smuzhiyun }); 947*4882a593Smuzhiyun 948*4882a593Smuzhiyun $('#cancel-change-sstate_dir').click(function(){ 949*4882a593Smuzhiyun $("#hintError-sstate_dir").hide(); 950*4882a593Smuzhiyun $("#hintError-initialChar-sstate_dir").hide(); 951*4882a593Smuzhiyun $("#change-sstate_dir-form").slideUp(function() { 952*4882a593Smuzhiyun $('#sstate_dir, #change-sstate_dir-icon').show(); 953*4882a593Smuzhiyun }); 954*4882a593Smuzhiyun }); 955*4882a593Smuzhiyun 956*4882a593Smuzhiyun $("#new-sstate_dir").on('input', function(){ 957*4882a593Smuzhiyun if ($(this).val().trim().length == 0) { 958*4882a593Smuzhiyun $("#apply-change-sstate_dir").attr("disabled","disabled"); 959*4882a593Smuzhiyun $('#change-sstate_dir-form').addClass('has-error'); 960*4882a593Smuzhiyun $('#hintError-sstate_dir').hide(); 961*4882a593Smuzhiyun $('#hintError-initialChar-sstate_dir').hide(); 962*4882a593Smuzhiyun } 963*4882a593Smuzhiyun else { 964*4882a593Smuzhiyun var input = $(this); 965*4882a593Smuzhiyun var reBeginWithSlash = /^\//; 966*4882a593Smuzhiyun var reCheckVariable = /^\$/; 967*4882a593Smuzhiyun var re = /([ <>\\|":%\?\*]+)/; 968*4882a593Smuzhiyun var invalidDir = re.test(input.val()); 969*4882a593Smuzhiyun var invalidSlash = reBeginWithSlash.test(input.val()); 970*4882a593Smuzhiyun var invalidVar = reCheckVariable.test(input.val()); 971*4882a593Smuzhiyun if (!invalidSlash && !invalidVar) { 972*4882a593Smuzhiyun $('#change-sstate_dir-form').addClass('has-error'); 973*4882a593Smuzhiyun $("#apply-change-sstate_dir").attr("disabled","disabled"); 974*4882a593Smuzhiyun $('#hintError-initialChar-sstate_dir').show(); 975*4882a593Smuzhiyun } else if (invalidDir) { 976*4882a593Smuzhiyun $('#change-sstate_dir-form').addClass('has-error'); 977*4882a593Smuzhiyun $("#apply-change-sstate_dir").attr("disabled","disabled"); 978*4882a593Smuzhiyun $('#hintError-sstate_dir').show(); 979*4882a593Smuzhiyun } else { 980*4882a593Smuzhiyun $('#change-sstate_dir-form').removeClass('has-error'); 981*4882a593Smuzhiyun $("#apply-change-sstate_dir").removeAttr("disabled"); 982*4882a593Smuzhiyun $('#hintError-sstate_dir').hide(); 983*4882a593Smuzhiyun $('#hintError-initialChar-sstate_dir').hide(); 984*4882a593Smuzhiyun } 985*4882a593Smuzhiyun } 986*4882a593Smuzhiyun }); 987*4882a593Smuzhiyun 988*4882a593Smuzhiyun $('#apply-change-sstate_dir').click(function(){ 989*4882a593Smuzhiyun var value = $('#new-sstate_dir').val().trim(); 990*4882a593Smuzhiyun postEditAjaxRequest({"configvarChange" : 'SSTATE_DIR:'+value}); 991*4882a593Smuzhiyun $('#sstate_dir').text(value); 992*4882a593Smuzhiyun $('#sstate_dir').removeClass('text-muted'); 993*4882a593Smuzhiyun $("#change-sstate_dir-form").slideUp(function () { 994*4882a593Smuzhiyun $('#sstate_dir, #change-sstate_dir-icon').show(); 995*4882a593Smuzhiyun }); 996*4882a593Smuzhiyun }); 997*4882a593Smuzhiyun 998*4882a593Smuzhiyun {% endif %} 999*4882a593Smuzhiyun 1000*4882a593Smuzhiyun // add new variable 1001*4882a593Smuzhiyun $("button#add-configvar-button").click( function (evt) { 1002*4882a593Smuzhiyun var variable = $("input#variable").val(); 1003*4882a593Smuzhiyun var value = $("input#value").val(); 1004*4882a593Smuzhiyun 1005*4882a593Smuzhiyun postEditAjaxRequest({"configvarAdd" : variable+':'+value}); 1006*4882a593Smuzhiyun 1007*4882a593Smuzhiyun // clear the previous values 1008*4882a593Smuzhiyun $("input#variable").val(""); 1009*4882a593Smuzhiyun $("input#value").val(""); 1010*4882a593Smuzhiyun // Disable add button 1011*4882a593Smuzhiyun $(".save").attr("disabled","disabled"); 1012*4882a593Smuzhiyun 1013*4882a593Smuzhiyun // Reload page if admin-removed core managed value is manually added back in 1014*4882a593Smuzhiyun if (0 <= " DISTRO DL_DIR IMAGE_FSTYPES IMAGE_INSTALL:append PACKAGE_CLASSES SSTATE_DIR ".indexOf( " "+variable+" " )) { 1015*4882a593Smuzhiyun // delayed reload to avoid race condition with postEditAjaxRequest 1016*4882a593Smuzhiyun do_reload=true; 1017*4882a593Smuzhiyun } 1018*4882a593Smuzhiyun }); 1019*4882a593Smuzhiyun 1020*4882a593Smuzhiyun // validate new variable name and value 1021*4882a593Smuzhiyun $("#variable, #value").on('input', function() { 1022*4882a593Smuzhiyun validate_new_variable(); 1023*4882a593Smuzhiyun }); 1024*4882a593Smuzhiyun 1025*4882a593Smuzhiyun // 1026*4882a593Smuzhiyun // draw and register the dynamic configuration variables and handlers 1027*4882a593Smuzhiyun // 1028*4882a593Smuzhiyun 1029*4882a593Smuzhiyun var data = { 1030*4882a593Smuzhiyun configvars : [] 1031*4882a593Smuzhiyun }; 1032*4882a593Smuzhiyun {% for c in configvars %} 1033*4882a593Smuzhiyun data.configvars.push([ "{{c.name}}","{{c.value}}","{{c.pk}}" ]); 1034*4882a593Smuzhiyun {% if '' != vars_context|get_dict_value:c.name %} 1035*4882a593Smuzhiyun data.vars_context[ "{{c.name}}" ] = "{{vars_context|get_dict_value:c.name }}"; 1036*4882a593Smuzhiyun {% endif %} 1037*4882a593Smuzhiyun {% endfor %} 1038*4882a593Smuzhiyun 1039*4882a593Smuzhiyun // draw these elements and assert their event handlers 1040*4882a593Smuzhiyun onEditPageUpdate(data); 1041*4882a593Smuzhiyun}); 1042*4882a593Smuzhiyun 1043*4882a593Smuzhiyun</script> 1044*4882a593Smuzhiyun 1045*4882a593Smuzhiyun{% endblock %} 1046