##// END OF EJS Templates
small whitespace cleanup, renamed drag_info...
Paul Ivanov -
Show More
@@ -1,41 +1,40 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2014 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // Running Kernels List
10 10 //============================================================================
11 11
12 12 var IPython = (function (IPython) {
13 13 "use strict";
14 14
15 15 var utils = IPython.utils;
16 16
17 17 var KernelList = function (selector, options) {
18 18 IPython.NotebookList.call(this, selector, options, 'running');
19 19 };
20 20
21 21 KernelList.prototype = Object.create(IPython.NotebookList.prototype);
22 22
23 23 KernelList.prototype.sessions_loaded = function (d) {
24 24 this.sessions = d;
25 // clear out the previous list
26 25 this.clear_list();
27 26 var item;
28 27 for (var path in d) {
29 28 item = this.new_notebook_item(-1);
30 29 this.add_link('', path, item);
31 this.add_shutdown_button(item,this.sessions[path]);
30 this.add_shutdown_button(item, this.sessions[path]);
32 31 }
33 32
34 33 $('#running_list_header').toggle($.isEmptyObject(d));
35 34 }
36 35
37 36 IPython.KernelList = KernelList;
38 37
39 38 return IPython;
40 39
41 40 }(IPython));
@@ -1,411 +1,412 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2011 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // NotebookList
10 10 //============================================================================
11 11
12 12 var IPython = (function (IPython) {
13 13 "use strict";
14 14
15 15 var utils = IPython.utils;
16 16
17 17 var NotebookList = function (selector, options, element_name) {
18 18 var that = this
19 19 // allow code re-use by just changing element_name in kernellist.js
20 20 this.element_name = element_name || 'notebook';
21 21 this.selector = selector;
22 22 if (this.selector !== undefined) {
23 23 this.element = $(selector);
24 24 this.style();
25 25 this.bind_events();
26 26 }
27 27 this.notebooks_list = [];
28 28 this.sessions = {};
29 29 this.base_url = options.base_url || utils.get_body_data("baseUrl");
30 30 this.notebook_path = options.notebook_path || utils.get_body_data("notebookPath");
31 31 $([IPython.events]).on('sessions_loaded.Dashboard',
32 32 function(e, d) { that.sessions_loaded(d); });
33 33 };
34 34
35 35 NotebookList.prototype.style = function () {
36 $('#' + this.element_name + '_toolbar').addClass('list_toolbar');
37 $('#drag_info').addClass('toolbar_info');
38 $('#' + this.element_name + '_buttons').addClass('toolbar_buttons');
39 $('#' + this.element_name + '_list_header').addClass('list_header');
36 var prefix = '#' + this.element_name
37 $(prefix + '_toolbar').addClass('list_toolbar');
38 $(prefix + '_list_info').addClass('toolbar_info');
39 $(prefix + '_buttons').addClass('toolbar_buttons');
40 $(prefix + '_list_header').addClass('list_header');
40 41 this.element.addClass("list_container");
41 42 };
42 43
43 44
44 45 NotebookList.prototype.bind_events = function () {
45 46 var that = this;
46 47 $('#refresh_' + this.element_name + '_list').click(function () {
47 48 that.load_sessions();
48 49 });
49 50 this.element.bind('dragover', function () {
50 51 return false;
51 52 });
52 53 this.element.bind('drop', function(event){
53 54 that.handleFilesUpload(event,'drop');
54 55 return false;
55 56 });
56 57 };
57 58
58 59 NotebookList.prototype.handleFilesUpload = function(event, dropOrForm) {
59 60 var that = this;
60 61 var files;
61 62 if(dropOrForm =='drop'){
62 63 files = event.originalEvent.dataTransfer.files;
63 64 } else
64 65 {
65 66 files = event.originalEvent.target.files;
66 67 }
67 68 for (var i = 0; i < files.length; i++) {
68 69 var f = files[i];
69 70 var reader = new FileReader();
70 71 reader.readAsText(f);
71 72 var name_and_ext = utils.splitext(f.name);
72 73 var file_ext = name_and_ext[1];
73 74 if (file_ext === '.ipynb') {
74 75 var item = that.new_notebook_item(0);
75 76 that.add_name_input(f.name, item);
76 77 // Store the notebook item in the reader so we can use it later
77 78 // to know which item it belongs to.
78 79 $(reader).data('item', item);
79 80 reader.onload = function (event) {
80 81 var nbitem = $(event.target).data('item');
81 82 that.add_notebook_data(event.target.result, nbitem);
82 83 that.add_upload_button(nbitem);
83 84 };
84 85 } else {
85 86 var dialog = 'Uploaded notebooks must be .ipynb files';
86 87 IPython.dialog.modal({
87 88 title : 'Invalid file type',
88 89 body : dialog,
89 90 buttons : {'OK' : {'class' : 'btn-primary'}}
90 91 });
91 92 }
92 93 }
93 94 // Replace the file input form wth a clone of itself. This is required to
94 95 // reset the form. Otherwise, if you upload a file, delete it and try to
95 96 // upload it again, the changed event won't fire.
96 97 var form = $('input.fileinput');
97 98 form.replaceWith(form.clone(true));
98 99 return false;
99 100 };
100 101
101 102 NotebookList.prototype.clear_list = function () {
102 103 this.element.children('.list_item').remove();
103 104 };
104 105
105 106 NotebookList.prototype.load_sessions = function(){
106 107 IPython.session_list.load_sessions();
107 108 };
108 109
109 110
110 111 NotebookList.prototype.sessions_loaded = function(data){
111 112 this.sessions = data;
112 113 this.load_list();
113 114 };
114 115
115 116 NotebookList.prototype.load_list = function () {
116 117 var that = this;
117 118 var settings = {
118 119 processData : false,
119 120 cache : false,
120 121 type : "GET",
121 122 dataType : "json",
122 123 success : $.proxy(this.list_loaded, this),
123 124 error : $.proxy( function(){
124 125 that.list_loaded([], null, null, {msg:"Error connecting to server."});
125 126 },this)
126 127 };
127 128
128 129 var url = utils.url_join_encode(
129 130 this.base_url,
130 131 'api',
131 132 'notebooks',
132 133 this.notebook_path
133 134 );
134 135 $.ajax(url, settings);
135 136 };
136 137
137 138
138 139 NotebookList.prototype.list_loaded = function (data, status, xhr, param) {
139 140 var message = 'Notebook list empty.';
140 141 if (param !== undefined && param.msg) {
141 142 message = param.msg;
142 143 }
143 144 var item = null;
144 145 var len = data.length;
145 146 this.clear_list();
146 147 if (len === 0) {
147 148 item = this.new_notebook_item(0);
148 149 var span12 = item.children().first();
149 150 span12.empty();
150 151 span12.append($('<div style="margin:auto;text-align:center;color:grey"/>').text(message));
151 152 }
152 153 var path = this.notebook_path;
153 154 var offset = 0;
154 155 if (path !== '') {
155 156 item = this.new_notebook_item(0);
156 157 this.add_dir(path, '..', item);
157 158 offset = 1;
158 159 }
159 160 for (var i=0; i<len; i++) {
160 161 if (data[i].type === 'directory') {
161 162 var name = data[i].name;
162 163 item = this.new_notebook_item(i+offset);
163 164 this.add_dir(path, name, item);
164 165 } else {
165 166 var name = data[i].name;
166 167 item = this.new_notebook_item(i+offset);
167 168 this.add_link(path, name, item);
168 169 name = utils.url_path_join(path, name);
169 170 if(this.sessions[name] === undefined){
170 171 this.add_delete_button(item);
171 172 } else {
172 173 this.add_shutdown_button(item,this.sessions[name]);
173 174 }
174 175 }
175 176 }
176 177 };
177 178
178 179
179 180 NotebookList.prototype.new_notebook_item = function (index) {
180 181 var item = $('<div/>').addClass("list_item").addClass("row-fluid");
181 182 // item.addClass('list_item ui-widget ui-widget-content ui-helper-clearfix');
182 183 // item.css('border-top-style','none');
183 184 item.append($("<div/>").addClass("span12").append(
184 185 $('<i/>').addClass('item_icon')
185 186 ).append(
186 187 $("<a/>").addClass("item_link").append(
187 188 $("<span/>").addClass("item_name")
188 189 )
189 190 ).append(
190 191 $('<div/>').addClass("item_buttons btn-group pull-right")
191 192 ));
192 193
193 194 if (index === -1) {
194 195 this.element.append(item);
195 196 } else {
196 197 this.element.children().eq(index).after(item);
197 198 }
198 199 return item;
199 200 };
200 201
201 202
202 203 NotebookList.prototype.add_dir = function (path, name, item) {
203 204 item.data('name', name);
204 205 item.data('path', path);
205 206 item.find(".item_name").text(name);
206 207 item.find(".item_icon").addClass('icon-folder-open');
207 208 item.find("a.item_link")
208 209 .attr('href',
209 210 utils.url_join_encode(
210 211 this.base_url,
211 212 "tree",
212 213 path,
213 214 name
214 215 )
215 216 );
216 217 };
217 218
218 219
219 220 NotebookList.prototype.add_link = function (path, nbname, item) {
220 221 item.data('nbname', nbname);
221 222 item.data('path', path);
222 223 item.find(".item_name").text(nbname);
223 224 item.find(".item_icon").addClass('icon-book');
224 225 item.find("a.item_link")
225 226 .attr('href',
226 227 utils.url_join_encode(
227 228 this.base_url,
228 229 "notebooks",
229 230 path,
230 231 nbname
231 232 )
232 233 ).attr('target','_blank');
233 234 };
234 235
235 236
236 237 NotebookList.prototype.add_name_input = function (nbname, item) {
237 238 item.data('nbname', nbname);
238 239 item.find(".item_icon").addClass('icon-book');
239 240 item.find(".item_name").empty().append(
240 241 $('<input/>')
241 242 .addClass("nbname_input")
242 243 .attr('value', utils.splitext(nbname)[0])
243 244 .attr('size', '30')
244 245 .attr('type', 'text')
245 246 );
246 247 };
247 248
248 249
249 250 NotebookList.prototype.add_notebook_data = function (data, item) {
250 251 item.data('nbdata', data);
251 252 };
252 253
253 254
254 255 NotebookList.prototype.add_shutdown_button = function (item, session) {
255 256 var that = this;
256 257 var shutdown_button = $("<button/>").text("Shutdown").addClass("btn btn-mini btn-danger").
257 258 click(function (e) {
258 259 var settings = {
259 260 processData : false,
260 261 cache : false,
261 262 type : "DELETE",
262 263 dataType : "json",
263 264 success : function () {
264 265 that.load_sessions();
265 266 }
266 267 };
267 268 var url = utils.url_join_encode(
268 269 that.base_url,
269 270 'api/sessions',
270 271 session
271 272 );
272 273 $.ajax(url, settings);
273 274 return false;
274 275 });
275 276 // var new_buttons = item.find('a'); // shutdown_button;
276 277 item.find(".item_buttons").text("").append(shutdown_button);
277 278 };
278 279
279 280 NotebookList.prototype.add_delete_button = function (item) {
280 281 var new_buttons = $('<span/>').addClass("btn-group pull-right");
281 282 var notebooklist = this;
282 283 var delete_button = $("<button/>").text("Delete").addClass("btn btn-mini").
283 284 click(function (e) {
284 285 // $(this) is the button that was clicked.
285 286 var that = $(this);
286 287 // We use the nbname and notebook_id from the parent notebook_item element's
287 288 // data because the outer scopes values change as we iterate through the loop.
288 289 var parent_item = that.parents('div.list_item');
289 290 var nbname = parent_item.data('nbname');
290 291 var message = 'Are you sure you want to permanently delete the notebook: ' + nbname + '?';
291 292 IPython.dialog.modal({
292 293 title : "Delete notebook",
293 294 body : message,
294 295 buttons : {
295 296 Delete : {
296 297 class: "btn-danger",
297 298 click: function() {
298 299 var settings = {
299 300 processData : false,
300 301 cache : false,
301 302 type : "DELETE",
302 303 dataType : "json",
303 304 success : function (data, status, xhr) {
304 305 parent_item.remove();
305 306 }
306 307 };
307 308 var url = utils.url_join_encode(
308 309 notebooklist.base_url,
309 310 'api/notebooks',
310 311 notebooklist.notebook_path,
311 312 nbname
312 313 );
313 314 $.ajax(url, settings);
314 315 }
315 316 },
316 317 Cancel : {}
317 318 }
318 319 });
319 320 return false;
320 321 });
321 322 item.find(".item_buttons").text("").append(delete_button);
322 323 };
323 324
324 325
325 326 NotebookList.prototype.add_upload_button = function (item) {
326 327 var that = this;
327 328 var upload_button = $('<button/>').text("Upload")
328 329 .addClass('btn btn-primary btn-mini upload_button')
329 330 .click(function (e) {
330 331 var nbname = item.find('.item_name > input').val();
331 332 if (nbname.slice(nbname.length-6, nbname.length) != ".ipynb") {
332 333 nbname = nbname + ".ipynb";
333 334 }
334 335 var path = that.notebook_path;
335 336 var nbdata = item.data('nbdata');
336 337 var content_type = 'application/json';
337 338 var model = {
338 339 content : JSON.parse(nbdata),
339 340 };
340 341 var settings = {
341 342 processData : false,
342 343 cache : false,
343 344 type : 'PUT',
344 345 dataType : 'json',
345 346 data : JSON.stringify(model),
346 347 headers : {'Content-Type': content_type},
347 348 success : function (data, status, xhr) {
348 349 that.add_link(path, nbname, item);
349 350 that.add_delete_button(item);
350 351 },
351 352 error : function (data, status, xhr) {
352 353 console.log(data, status);
353 354 }
354 355 };
355 356
356 357 var url = utils.url_join_encode(
357 358 that.base_url,
358 359 'api/notebooks',
359 360 that.notebook_path,
360 361 nbname
361 362 );
362 363 $.ajax(url, settings);
363 364 return false;
364 365 });
365 366 var cancel_button = $('<button/>').text("Cancel")
366 367 .addClass("btn btn-mini")
367 368 .click(function (e) {
368 369 console.log('cancel click');
369 370 item.remove();
370 371 return false;
371 372 });
372 373 item.find(".item_buttons").empty()
373 374 .append(upload_button)
374 375 .append(cancel_button);
375 376 };
376 377
377 378
378 379 NotebookList.prototype.new_notebook = function(){
379 380 var path = this.notebook_path;
380 381 var base_url = this.base_url;
381 382 var settings = {
382 383 processData : false,
383 384 cache : false,
384 385 type : "POST",
385 386 dataType : "json",
386 387 async : false,
387 388 success : function (data, status, xhr) {
388 389 var notebook_name = data.name;
389 390 window.open(
390 391 utils.url_join_encode(
391 392 base_url,
392 393 'notebooks',
393 394 path,
394 395 notebook_name),
395 396 '_blank'
396 397 );
397 398 }
398 399 };
399 400 var url = utils.url_join_encode(
400 401 base_url,
401 402 'api/notebooks',
402 403 path
403 404 );
404 405 $.ajax(url, settings);
405 406 };
406 407
407 408 IPython.NotebookList = NotebookList;
408 409
409 410 return IPython;
410 411
411 412 }(IPython));
@@ -1,52 +1,52 b''
1 1 //----------------------------------------------------------------------------
2 2 // Copyright (C) 2014 The IPython Development Team
3 3 //
4 4 // Distributed under the terms of the BSD License. The full license is in
5 5 // the file COPYING, distributed as part of this software.
6 6 //----------------------------------------------------------------------------
7 7
8 8 //============================================================================
9 9 // Running Kernels List
10 10 //============================================================================
11 11
12 12 var IPython = (function (IPython) {
13 13 "use strict";
14 14
15 15 var utils = IPython.utils;
16 16
17 17 var SesssionList = function (options) {
18 18 this.sessions = {};
19 19 this.base_url = options.base_url || utils.get_body_data("baseUrl");
20 20 };
21 21
22 22 SesssionList.prototype.load_sessions = function(){
23 23 var that = this;
24 24 var settings = {
25 25 processData : false,
26 26 cache : false,
27 27 type : "GET",
28 28 dataType : "json",
29 29 success : $.proxy(that.sessions_loaded, this)
30 30 };
31 31 var url = utils.url_join_encode(this.base_url, 'api/sessions');
32 $.ajax(url,settings);
32 $.ajax(url, settings);
33 33 };
34 34
35 35 SesssionList.prototype.sessions_loaded = function(data){
36 36 this.sessions = {};
37 37 var len = data.length;
38 38 var nb_path;
39 39 for (var i=0; i<len; i++) {
40 40 nb_path = utils.url_path_join(
41 41 data[i].notebook.path,
42 42 data[i].notebook.name
43 43 );
44 44 this.sessions[nb_path] = data[i].id;
45 45 }
46 46 $([IPython.events]).trigger('sessions_loaded.Dashboard', this.sessions);
47 47 };
48 48 IPython.SesssionList = SesssionList;
49 49
50 50 return IPython;
51 51
52 52 }(IPython));
@@ -1,123 +1,122 b''
1 1 {% extends "page.html" %}
2 2
3 3 {% block title %}{{page_title}}{% endblock %}
4 4
5 5
6 6 {% block stylesheet %}
7 7 {{super()}}
8 8 <link rel="stylesheet" href="{{ static_url("tree/css/override.css") }}" type="text/css" />
9 9 {% endblock %}
10 10
11 11 {% block params %}
12 12
13 13 data-project="{{project}}"
14 14 data-base-url="{{base_url}}"
15 15 data-notebook-path="{{notebook_path}}"
16 16 data-base-kernel-url="{{base_kernel_url}}"
17 17
18 18 {% endblock %}
19 19
20 20
21 21 {% block site %}
22 22
23 23 <div id="ipython-main-app" class="container">
24 24
25 25 <div id="tab_content" class="tabbable">
26 26 <ul id="tabs" class="nav nav-tabs">
27 27 <li class="active"><a href="#notebooks" data-toggle="tab">Notebooks</a></li>
28 28 <li><a href="#running" data-toggle="tab">Running</a></li>
29 29 <li><a href="#clusters" data-toggle="tab">Clusters</a></li>
30 30 </ul>
31 31
32 32 <div class="tab-content">
33 33 <div id="notebooks" class="tab-pane active">
34 34 <div id="notebook_toolbar" class="row-fluid">
35 35 <div class="span8">
36 36 <form id='alternate_upload' class='alternate_upload' >
37 <span id="drag_info" style="position:absolute" >
37 <span id="notebook_list_info" style="position:absolute" >
38 38 To import a notebook, drag the file onto the listing below or <strong>click here</strong>.
39 </span>
39 </span>
40 40 <input type="file" name="datafile" class="fileinput" multiple='multiple'>
41 41 </form>
42 42 </div>
43 43 <div class="span4 clearfix">
44 44 <span id="notebook_buttons" class="pull-right">
45 45 <button id="new_notebook" title="Create new notebook" class="btn btn-small">New Notebook</button>
46 46 <button id="refresh_notebook_list" title="Refresh notebook list" class="btn btn-small"><i class="icon-refresh"></i></button>
47 47 </span>
48 48 </div>
49 49 </div>
50 50
51 51 <div id="notebook_list">
52 52 <div id="notebook_list_header" class="row-fluid list_header">
53 53 <div id="project_name">
54 54 <ul class="breadcrumb">
55 55 <li><a href="{{breadcrumbs[0][0]}}"><i class="icon-home"></i></a><span>/</span></li>
56 56 {% for crumb in breadcrumbs[1:] %}
57 57 <li><a href="{{crumb[0]}}">{{crumb[1]}}</a> <span>/</span></li>
58 58 {% endfor %}
59 59 </ul>
60 60 </div>
61 61 </div>
62 62 </div>
63 63 </div>
64 64
65 65 <div id="running" class="tab-pane">
66 66
67 67 <div id="running_toolbar" class="row-fluid">
68 68 <div class="span8">
69 69 <span id="running_list_info">Currently running IPython notebooks</span>
70 70 </div>
71 71 <div class="span4" class="clearfix">
72 72 <span id="running_buttons" class="pull-right">
73 73 <button id="refresh_running_list" title="Refresh running list" class="btn btn-small"><i class="icon-refresh"></i></button>
74 74 </span>
75 75 </div>
76 76 </div>
77 77
78 78 <div id="running_list">
79 <div id="running_list_header" class="row-fluid list_header" style='display:none'>
79 <div id="running_list_header" class="row-fluid list_header">
80 80 <div> There are no notebooks running. </div>
81 <!-- damn it, I seem to need this stupid placeholder, otherwise items don't get added to the list -->
82 81 </div>
83 82 </div>
84 83 </div>
85 84
86 85 <div id="clusters" class="tab-pane">
87 86
88 87 <div id="cluster_toolbar" class="row-fluid">
89 88 <div class="span8">
90 89 <span id="cluster_list_info">IPython parallel computing clusters</span>
91 90 </div>
92 91 <div class="span4" class="clearfix">
93 92 <span id="cluster_buttons" class="pull-right">
94 93 <button id="refresh_cluster_list" title="Refresh cluster list" class="btn btn-small"><i class="icon-refresh"></i></button>
95 94 </span>
96 95 </div>
97 96 </div>
98 97
99 98 <div id="cluster_list">
100 99 <div id="cluster_list_header" class="row-fluid list_header">
101 100 <div class="profile_col span4">profile</div>
102 101 <div class="status_col span3">status</div>
103 102 <div class="engines_col span3" title="Enter the number of engines to start or empty for default"># of engines</div>
104 103 <div class="action_col span2">action</div>
105 104 </div>
106 105 </div>
107 106 </div>
108 107 </div>
109 108
110 109 </div>
111 110
112 111 {% endblock %}
113 112
114 113 {% block script %}
115 114 {{super()}}
116 115 <script src="{{ static_url("base/js/utils.js") }}" type="text/javascript" charset="utf-8"></script>
117 116 <script src="{{static_url("base/js/dialog.js") }}" type="text/javascript" charset="utf-8"></script>
118 117 <script src="{{static_url("tree/js/sessionlist.js") }}" type="text/javascript" charset="utf-8"></script>
119 118 <script src="{{static_url("tree/js/notebooklist.js") }}" type="text/javascript" charset="utf-8"></script>
120 119 <script src="{{static_url("tree/js/kernellist.js") }}" type="text/javascript" charset="utf-8"></script>
121 120 <script src="{{static_url("tree/js/clusterlist.js") }}" type="text/javascript" charset="utf-8"></script>
122 121 <script src="{{static_url("tree/js/main.js") }}" type="text/javascript" charset="utf-8"></script>
123 122 {% endblock %}
General Comments 0
You need to be logged in to leave comments. Login now