fixes in selecting files from grid ftp
[qcg-portal.git] / qcg / templates / qcg / job_new.html
1 {% extends 'qcg/base.html' %}
2 {% load staticfiles bootstrap3 qcg_utils %}
3
4 {% block extra_css %}
5     <link href="{% static 'qcg/selectize/selectize.bootstrap3.css' %}" rel="stylesheet">
6 {% endblock %}
7
8 {% block extra_js %}
9     <script src="{% static 'qcg/selectize/selectize.min.js' %}"></script>
10     <script src="{% static 'qcg/formset/jquery.formset.js' %}"></script>
11
12     {% include 'filex/source.js.html' %}
13
14     <script>
15         $(function() {
16             var gridftpButton = $('<button/>', {
17                 'type': 'button',
18                 'class': 'btn btn-default pull-right',
19                 'text': 'Wybierz',
20                 'data-toggle': 'modal',
21                 'data-target': '#gridftp'
22             });
23
24             function fullPath(path, file) {
25                 var res = path + file.get('name');
26
27                 if (file.isDir())
28                     res += '/';
29
30                 return res;
31             }
32
33             $('#id_master_file,#id_executable,#id_input,#id_preprocess_script,#id_postprocess_script').before(function() {
34                 var target = this;
35                 return gridftpButton.clone().click(function() {
36                     $('#select-btn').off().click(function() {
37                         var selected = filex.selectedFiles();
38
39                         if (selected.length != 1 || !selected[0].isFile()) {
40                             alert('Wybierz dokładnie jeden plik.');
41                             return;
42                         }
43
44                         var file = fullPath(filex.host + filex.path.full() + '/', selected[0]);
45
46                         target.selectize.clear();
47                         target.selectize.addOption({value: file, text: file});
48                         target.selectize.addItem(file);
49                         target.selectize.refreshItems();
50
51                         $('#gridftp').modal('hide');
52                         filex.clearSelection();
53                     });
54                 });
55             }).wrap('<div style="margin-right: 80px"></div>');
56
57             $('#id_stage_in').before(function() {
58                 var target = this;
59                 return gridftpButton.clone().click(function() {
60                     $('#select-btn').off().click(function() {
61                         var path = filex.host + filex.path.full() + '/';
62
63                         _.each(filex.selectedFiles(), function(item) {
64                             var file = fullPath(path, item);
65                             target.selectize.addOption({value: file, text: file});
66                             target.selectize.addItem(file);
67                         });
68                         target.selectize.refreshItems();
69
70                         $('#gridftp').modal('hide');
71                         filex.clearSelection();
72                     });
73                 });
74             }).wrap('<div style="margin-right: 80px"></div>');
75
76             $('#id_application').selectize();
77             $('#id_arguments,#id_properties,#id_native').selectize({
78                 plugins: ['remove_button'],
79                 create: true,
80                 render: {
81                     option_create: function(data, escape) {
82                         return '<div class="create">Dodaj <strong>' + escape(data.input) + '</strong>&hellip;</div>';
83                     }
84                 }
85             });
86             $('#id_queue').selectize({
87                 create: true,
88                 render: {
89                     option_create: function(data, escape) {
90                         return '<div class="create">Wybierz <strong>' + escape(data.input) + '</strong>&hellip;</div>';
91                     }
92                 }
93             });
94             $('#id_modules,#id_hosts,#id_master_file,#id_executable,#id_input,#id_stage_in,#id_preprocess_script,#id_postprocess_script').selectize({
95                 plugins: ['remove_button']
96             });
97
98             // hide delete checkbox in empty env form
99             $('#env-form-empty').find('div.form-group:last-of-type').hide();
100             $('#env-controls').find('> div').formset({
101                 formTemplate: '#env-form-empty',
102                 parent: '#env-controls',
103                 addLinkParent: '#add-env-form',
104                 addText: 'dodaj »',
105                 addCssClass: 'add-btn',
106                 deleteText: 'Usuń',
107                 deleteCssClass: 'delete-btn btn btn-xs btn-danger'
108             });
109
110             $('input[name="notify_type"],input[name="watch_output_type"],input[name="preprocess_type"],input[name="postprocess_type"]').on('change', function () {
111                 $(this).tab('show');
112             }).each(function() {
113                 $(this).parent().toggleClass('active', this.checked);
114
115                 if (this.checked)
116                     $(this).tab('show');
117             });
118
119             $('#toggle-advanced').click(function(e) {
120                 e.preventDefault();
121                 $('form .collapse').collapse('toggle');
122                 $(this).find('span').text(this.text == "Pokaż zaawansowane" ? "Ukryj zaawansowane" : "Pokaż zaawansowane");
123             });
124         });
125     </script>
126 {% endblock %}
127
128 {% block container %}
129     <h1 class="page-header">{% block title %}Zleć zadanie{% endblock %}</h1>
130
131     {% if errors %}
132         <div class="alert alert-danger">
133             <strong>Uwaga!</strong> Formularz zawiera błędy.
134             {{ form.non_field_errors }}
135             {{ env_formset.non_field_errors }}
136         </div>
137     {% endif %}
138
139     <form action="." method="post" class="form-horizontal">
140         {% csrf_token %}
141
142         <!-- Nav tabs -->
143         <ul class="nav nav-tabs" style="margin-bottom: 20px">
144             <li role="presentation" class="active"><a href="#basic" data-toggle="tab">Podstawowe</a></li>
145             <li role="presentation"><a href="#resources" data-toggle="tab">Zasoby</a></li>
146             <li role="presentation"><a href="#files" data-toggle="tab">Pliki</a></li>
147             <li role="presentation"><a href="#environment" data-toggle="tab">Środowisko</a></li>
148             <li role="presentation"><a href="#monitoring" data-toggle="tab">Powiadomienia</a></li>
149             <li role="presentation"><a href="#other" data-toggle="tab">Inne</a></li>
150         </ul>
151
152         <div class="tab-content">
153             <fieldset id="basic" class="tab-pane active" role="tabpanel">
154                 {% bootstrap_field form.application layout="horizontal" %}
155                 {% bootstrap_field form.master_file layout="horizontal" %}
156                 {% bootstrap_field form.executable layout="horizontal" form_group_class="form-group collapse" %}
157                 {% bootstrap_field form.script layout="horizontal" form_group_class="form-group collapse" %}
158                 {% bootstrap_field form.arguments layout="horizontal" %}
159                 {% bootstrap_field form.note layout="horizontal" %}
160                 {% bootstrap_field form.grant layout="horizontal" form_group_class="form-group collapse" %}
161             </fieldset>
162
163             <fieldset id="resources" class="tab-pane" role="tabpanel">
164                 {% bootstrap_field form.hosts layout="horizontal" %}
165                 {% bootstrap_field form.queue layout="horizontal" %}
166                 {% bootstrap_field form.properties layout="horizontal" form_group_class="form-group collapse" %}
167                 {% bootstrap_field form.modules layout="horizontal" form_group_class="form-group collapse" %}
168                 {% bootstrap_field form.procs layout="horizontal" %}
169                 {% bootstrap_field form.nodes layout="horizontal" form_group_class="form-group collapse" %}
170                 {% bootstrap_field form.wall_time layout="horizontal" form_group_class="form-group timerange" %}
171                 {% bootstrap_field form.memory layout="horizontal" form_group_class="form-group collapse" %}
172                 {% bootstrap_field form.memory_per_slot layout="horizontal" form_group_class="form-group collapse" %}
173                 {% bootstrap_field form.reservation layout="horizontal" form_group_class="form-group collapse" %}
174             </fieldset>
175
176             <fieldset id="files" class="tab-pane" role="tabpanel">
177                 {% bootstrap_field form.input layout="horizontal" %}
178                 {% bootstrap_field form.stage_in layout="horizontal" %}
179 {#                {% bootstrap_field form.stage_out layout="horizontal" form_group_class="form-group collapse" %}#}
180             </fieldset>
181
182             <fieldset id="environment" class="tab-pane" role="tabpanel">
183                 {{ env_formset.management_form }}
184
185                 <div class="form-group">
186                     <label class="col-sm-3 col-md-4 control-label">Zmienne środowiskowe</label>
187                     <div class="col-sm-9 col-md-6">
188                         <div id="env-controls">
189                             {% for env_form in env_formset %}
190                                 <div>{% bootstrap_form env_form layout='inline' %}</div>
191                             {% endfor %}
192                         </div>
193                         <div id="add-env-form"></div>
194                         <div id="env-form-empty" style="display: none">
195                             {% bootstrap_form env_formset.empty_form layout='inline' %}
196                         </div>
197                     </div>
198                 </div>
199             </fieldset>
200
201             <fieldset id="monitoring" class="tab-pane" role="tabpanel">
202                 {% bootstrap_checkbox form.monitoring %}
203
204                 <div class="form-group">
205                     <label class="col-sm-3 col-md-4 control-label">Monitorowanie stanu</label>
206                     <div class="col-sm-9 col-md-6">
207                         <div class="btn-group" data-toggle="buttons">
208                             {% for option in form.notify_type %}
209                                 <label class="btn btn-default">
210                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
211                                             {% if option.is_checked %}checked{% endif %}
212                                             data-target=".notify-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
213                                 </label>
214                             {% endfor %}
215                         </div>
216                     </div>
217                 </div>
218
219                 <div class="tab-content">
220                     <div class="tab-pane notify-type-0"></div>
221
222                     <div class="tab-pane notify-type-1 notify-type-2" style="margin-top: 15px">
223                         {% bootstrap_field form.notify_address layout="horizontal" %}
224                     </div>
225                 </div>
226
227                 <div class="collapse">
228                     <div class="form-group">
229                         <label class="col-sm-3 col-md-4 control-label">Monitorowanie wyjścia</label>
230                         <div class="col-sm-9 col-md-6">
231                             <div class="btn-group" data-toggle="buttons">
232                                 {% for option in form.watch_output_type %}
233                                     <label class="btn btn-default">
234                                         <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
235                                                 {% if option.is_checked %}checked{% endif %}
236                                                 data-target=".watch-output-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
237                                     </label>
238                                 {% endfor %}
239                             </div>
240                         </div>
241                     </div>
242
243                     <div class="tab-content">
244                         <div class="tab-pane watch-output-type-0"></div>
245
246                         <div class="tab-pane watch-output-type-1 watch-output-type-2" style="margin-top: 15px">
247                             {% bootstrap_field form.watch_output_address layout="horizontal" %}
248                             {% bootstrap_field form.watch_output_pattern layout="horizontal" %}
249                         </div>
250                     </div>
251                 </div>
252             </fieldset>
253
254             <fieldset id="other" class="tab-pane" role="tabpanel">
255                 <div class="form-group">
256                     <label class="col-sm-3 col-md-4 control-label">Preprocessing</label>
257                     <div class="col-sm-9 col-md-6">
258                         <div class="btn-group" data-toggle="buttons">
259                             {% for option in form.preprocess_type %}
260                                 <label class="btn btn-default">
261                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
262                                             {% if option.is_checked %}checked{% endif %}
263                                             data-target=".preprocess-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
264                                 </label>
265                             {% endfor %}
266                         </div>
267                     </div>
268                 </div>
269
270                 <div class="tab-content">
271                     <div class="tab-pane preprocess-type-0"></div>
272
273                     <div class="tab-pane preprocess-type-1" style="margin-top: 15px">
274                         {% bootstrap_field form.preprocess_cmd layout="horizontal" %}
275                     </div>
276
277                     <div class="tab-pane preprocess-type-2" style="margin-top: 15px">
278                         {% bootstrap_field form.preprocess_script layout="horizontal" %}
279                     </div>
280                 </div>
281
282                 <div class="form-group">
283                     <label class="col-sm-3 col-md-4 control-label">Postprocessing</label>
284                     <div class="col-sm-9 col-md-6">
285                         <div class="btn-group" data-toggle="buttons">
286                             {% for option in form.postprocess_type %}
287                                 <label class="btn btn-default">
288                                     <input type="radio" autocomplete="off" name="{{ option.name }}" value="{{ option.choice_value }}"
289                                             {% if option.is_checked %}checked{% endif %}
290                                             data-target=".postprocess-type-{{ forloop.counter0 }}"> {{ option.choice_label }}
291                                 </label>
292                             {% endfor %}
293                         </div>
294                     </div>
295                 </div>
296
297                 <div class="tab-content">
298                     <div class="tab-pane postprocess-type-0"></div>
299
300                     <div class="tab-pane postprocess-type-1" style="margin-top: 15px">
301                         {% bootstrap_field form.postprocess_cmd layout="horizontal" %}
302                     </div>
303
304                     <div class="tab-pane postprocess-type-2" style="margin-top: 15px">
305                         {% bootstrap_field form.postprocess_script layout="horizontal" %}
306                     </div>
307                 </div>
308
309                 {% bootstrap_field form.native layout="horizontal" %}
310                 {% bootstrap_checkbox form.persistent %}
311             </fieldset>
312         </div>
313
314         <hr>
315
316         <div class="row">
317             <div class="col-sm-offset-3 col-md-offset-4 col-sm-9 col-md-6">
318                 <button type="submit" class="btn btn-primary">Zleć zadanie</button>
319                 <button type="reset" class="btn btn-warning">Resetuj</button>
320                 <a id="toggle-advanced" href="#"><span class="text-muted">Pokaż zaawansowane</span></a>
321             </div>
322         </div>
323     </form>
324
325     <div id="gridftp" class="modal fade" tabindex="-1" role="dialog" aria-labelledby="modal-label" aria-hidden="true">
326         <div class="modal-dialog modal-lg">
327             <div class="modal-content">
328                 <div class="modal-header">
329                     <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
330                     <h4 class="modal-title" id="modal-label">Wybierz plik</h4>
331                 </div>
332                 <div class="modal-body">
333                     {% include 'filex/source.html' %}
334                 </div>
335                 <div class="modal-footer">
336                     <button type="button" class="btn btn-default" data-dismiss="modal">Anuluj</button>
337                     <button id="select-btn" type="button" class="btn btn-primary">Wybierz</button>
338                 </div>
339             </div>
340         </div>
341     </div>
342
343 {% endblock %}