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