xref: /OK3568_Linux_fs/yocto/poky/bitbake/lib/toaster/toastergui/templates/projectconf.html (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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: \ ? % * : | " " &lt; &gt;</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: \ ? % * : | " " &lt; &gt;</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