~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/media/console/console.js

  • Committer: chadnickbok
  • Date: 2009-01-22 02:14:14 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1173
Fixes Issue #14

When uploading files, students will now be shown an
error message if there upload would replace already existing
files.

This upload will not be performed until it will not clobber
any old files.

Note that there is currently a way to change this behaviour in
the code in action.py, to allow files to be overwritten. However
there is no way this flag can be set through the browser interface
(yet).

Show diffs side-by-side

added added

removed removed

Lines of Context:
36
36
 
37
37
interrupted = false;
38
38
 
39
 
 
40
 
function get_console_start_directory()
41
 
{
42
 
    if((typeof(current_path) != 'undefined') && current_file)
43
 
    {
44
 
        // We have a current_path - give a suggestion to the server
45
 
        var path;
46
 
        if (current_file.isdir)
47
 
        {
48
 
            // Browser
49
 
            return path_join("/home", current_path);
50
 
        }
51
 
        else
52
 
        {
53
 
            // Editor - need to chop off filename
54
 
            var tmp_path = current_path.split('/');
55
 
            tmp_path.pop();
56
 
            return path_join("/home", tmp_path.join('/'));
57
 
        }
58
 
    }
59
 
    else
60
 
    {
61
 
        // No current_path - let the server decide
62
 
        return '';
63
 
    }
64
 
}
65
 
 
66
39
/* Starts the console server, if it isn't already.
67
40
 * This can be called any number of times - it only starts the one server.
68
41
 * Note that this is asynchronous. It will return after signalling to start
85
58
    var callback1 = function(xhr)
86
59
        {
87
60
            var json_text = xhr.responseText;
88
 
            try
89
 
            {
90
 
                server_key = JSON.parse(json_text).key;
91
 
                server_started = true;
92
 
                var args = {
93
 
                    "ivle.op": "chat", "kind": "splash", "key": server_key
94
 
                };
95
 
                var callback2 = function(xhr)
96
 
                {
97
 
                    console_response(null, null, xhr.responseText);
98
 
                    if (callback != null)
99
 
                        callback();
100
 
                };
101
 
                ajax_call(callback2, "console", "service", args, "POST");
102
 
            }
103
 
            catch (e)
104
 
            {
105
 
                alert("An error occured when starting the IVLE console. " +
106
 
                    "Please refresh the page and try again.\n" +
107
 
                    "Details have been logged for further examination.")
108
 
            }
109
 
        }
110
 
 
111
 
    $("#console_output").append(
112
 
        '<span class="console_message">IVLE console starting up...</span>\n');
113
 
    console_maximize(true);
114
 
    ajax_call(
115
 
        callback1, "console", "service",
116
 
        {"ivle.op": "start", "cwd": get_console_start_directory()}, 
117
 
        "POST");
118
 
}
119
 
 
120
 
/** Start up the console backend before the user has entered text.
121
 
 * This will disable the text input, start a backend, and enable the input
122
 
 * again.
123
 
 */
124
 
function start_server_early()
125
 
{
126
 
    var inputbox = document.getElementById("console_inputText");
127
 
    inputbox.setAttribute("disabled", "disabled");
128
 
    var callback = function(xhr)
129
 
    {
130
 
        inputbox.removeAttribute("disabled")
131
 
    }
132
 
    start_server(callback);
 
61
            server_key = JSON.parse(json_text).key;
 
62
            server_started = true;
 
63
            if (callback != null)
 
64
                callback();
 
65
        }
 
66
 
 
67
    //var current_path;
 
68
    if((typeof(current_path) != 'undefined') && current_file)
 
69
    {
 
70
        // We have a current_path - give a suggestion to the server
 
71
        var path;
 
72
        if (current_file.isdir)
 
73
        {
 
74
            // Browser
 
75
            path = path_join("/home", current_path);
 
76
        }
 
77
        else
 
78
        {
 
79
            // Editor - need to chop off filename
 
80
            var tmp_path = current_path.split('/');
 
81
            tmp_path.pop();
 
82
            path = path_join("/home", tmp_path.join('/'));
 
83
        }
 
84
        ajax_call(callback1, "consoleservice", "start", {"startdir": path}, "POST");
 
85
    }
 
86
    else
 
87
    {
 
88
        // No current_path - let the server decide
 
89
        ajax_call(callback1, "consoleservice", "start", {}, "POST");
 
90
    }
133
91
}
134
92
 
135
93
/** Initialises the console. All apps which import console are required to
159
117
function console_minimize()
160
118
{
161
119
    if (!windowpane_mode) return;
162
 
    console_body.setAttribute("class", "console_body windowpane minimal");
 
120
    console_body.setAttribute("class", "windowpane minimal");
163
121
    console_filler.setAttribute("class", "windowpane minimal");
164
122
}
165
123
 
166
124
/** Show the main console panel, so it enlarges out to its full size.
167
125
 */
168
 
function console_maximize(do_not_start)
 
126
function console_maximize()
169
127
{
170
128
    if (!windowpane_mode) return;
171
 
    if (!do_not_start && !server_started) start_server_early();
172
 
    console_body.setAttribute("class", "console_body windowpane maximal");
 
129
    console_body.setAttribute("class", "windowpane maximal");
173
130
    console_filler.setAttribute("class", "windowpane maximal");
174
131
}
175
132
 
295
252
{
296
253
    interrupted = false;
297
254
 
298
 
    // Open up the console so we can see the output
299
 
    console_maximize();
300
 
 
301
255
    if (typeof(inputbox) == "string")
302
256
    {
303
 
        var inputline = inputbox + "\n";
 
257
        var inputline = inputbox;
304
258
        inputbox = null;
 
259
        var graytimer = null;
305
260
    }
306
261
    else
307
262
    {
308
 
        /* Disable the text box */
309
 
        inputbox.setAttribute("disabled", "disabled");
310
 
 
 
263
        GLOBAL_inputbox = inputbox;     /* For timer */
311
264
        var inputline = inputbox.value + "\n";
 
265
        var graytimer = setTimeout("GLOBAL_inputbox.setAttribute(\"class\", "
 
266
            + "\"disabled\");", 100);
312
267
    }
313
268
    var output = document.getElementById("console_output");
314
269
    {
316
271
        var span = document.createElement("span");
317
272
        span.setAttribute("class", "inputPrompt");
318
273
        span.appendChild(document.createTextNode(
319
 
              document.getElementById("console_prompt").firstChild.nodeValue)
 
274
              document.getElementById("console_prompt").firstChild.textContent)
320
275
                        );
321
276
        output.appendChild(span);
322
277
        // Print input line itself in a span
324
279
        span.setAttribute("class", "inputMsg");
325
280
        span.appendChild(document.createTextNode(inputline));
326
281
        output.appendChild(span);
327
 
        divScroll.activeScroll();
328
282
    }
329
 
    var args = {
330
 
        "ivle.op": "chat", "kind": which, "key": server_key,
331
 
        "text": inputline, "cwd": get_console_start_directory()
332
 
        };
 
283
    var args = {"key": server_key, "text":inputline};
333
284
    var callback = function(xhr)
334
285
        {
335
 
            console_response(inputbox, inputline, xhr.responseText);
 
286
            console_response(inputbox, graytimer, inputline, xhr.responseText);
336
287
        }
337
 
    ajax_call(callback, "console", "service", args, "POST");
 
288
    /* Disable the text box */
 
289
    if (inputbox != null)
 
290
        inputbox.setAttribute("disabled", "disabled");
 
291
    ajax_call(callback, "consoleservice", which, args, "POST");
338
292
}
339
293
 
340
 
function console_response(inputbox, inputline, responseText)
 
294
function console_response(inputbox, graytimer, inputline, responseText)
341
295
{
342
296
    try
343
297
    {
356
310
        {
357
311
            output.appendChild(document.createTextNode(res.okay + "\n"));
358
312
            output.appendChild(span);
359
 
            divScroll.activeScroll();
360
313
        }
361
314
        // set the prompt to >>>
362
315
        set_prompt(">>>");
379
332
 
380
333
        // Print a reason to explain why we'd do such a horrible thing
381
334
        // (console timeout, server error etc.)
382
 
        print_error(
383
 
            "IVLE console restarted: " + res.restart, "console_message");
 
335
        print_error("Console Restart: " + res.restart);
384
336
        
385
337
        // set the prompt to >>>
386
338
        set_prompt(">>>");
395
347
        if (res.output.length > 0)
396
348
        {
397
349
            output.appendChild(document.createTextNode(res.output));
398
 
            divScroll.activeScroll();
399
350
        }
400
351
        var callback = function(xhr)
401
352
            {
402
 
                console_response(inputbox, null, xhr.responseText);
 
353
                console_response(inputbox, graytimer,
 
354
                                 null, xhr.responseText);
403
355
            }
404
356
        if (interrupted)
405
357
        {
409
361
        {
410
362
            var kind = "chat";
411
363
        }
412
 
        var args = {
413
 
            "ivle.op": "chat", "kind": kind, "key": server_key,
414
 
            "text": '', "cwd": get_console_start_directory()
415
 
            };
416
 
        ajax_call(callback, "console", "service", args, "POST");
 
364
        var args = {"key": server_key, "text":''};
 
365
        ajax_call(callback, "consoleservice", kind, args, "POST");
417
366
 
418
367
        // Open up the console so we can see the output
 
368
        // FIXME: do we need to maximize here?
419
369
        console_maximize();
420
370
 
 
371
        /* Auto-scrolling */
 
372
        divScroll.activeScroll();
 
373
 
421
374
        // Return early, so we don't re-enable the input box.
422
375
        return;
423
376
    }
424
 
    else if (res.hasOwnProperty('input'))
425
 
    {
426
 
        set_prompt("+++");
427
 
    }
428
377
    else
429
378
    {
430
 
        alert("An internal error occurred in the python console.");
431
 
        return;
 
379
        // assert res.hasOwnProperty('input')
 
380
        set_prompt("...");
432
381
    }
433
382
 
434
383
    if (inputbox != null)
435
384
    {
436
385
        /* Re-enable the text box */
 
386
        clearTimeout(graytimer);
437
387
        inputbox.removeAttribute("disabled");
 
388
        inputbox.removeAttribute("class");
438
389
        interrupted = false;
439
390
    }
440
391
 
 
392
    /* Open up the console so we can see the output */
 
393
    console_maximize();
441
394
    /* Auto-scrolling */
442
395
    divScroll.activeScroll();
443
396
 
488
441
            hist.submit(inp.value);
489
442
            inp.value = hist.curr();
490
443
        }
491
 
 
492
 
        /* Disable the text box. This will be redone by
493
 
         * console_enter_line, but we do it here too in case start_server
494
 
         * takes a while.
495
 
         */
496
 
        inp.setAttribute("disabled", "disabled");
497
444
        /* Start the server if it hasn't already been started */
498
445
        start_server(callback);
499
446
        break;
500
447
    case 38:                /* Up arrow */
501
448
        hist.up(inp.value);
502
449
        inp.value = hist.curr();
503
 
        /* Inhibit further responses to this event, or WebKit moves the
504
 
         * cursor to the start. */
505
 
        return false;
506
450
        break;
507
451
    case 40:                /* Down arrow */
508
452
        hist.down(inp.value);
509
453
        inp.value = hist.curr();
510
 
        return false;
511
454
        break;
512
455
    }
513
456
}
527
470
    }
528
471
    else
529
472
    {
530
 
        xhr = ajax_call(null, "console", "service", {"ivle.op": "chat", "kind": "terminate", "key": server_key, "cwd": get_console_start_directory()}, "POST");
531
 
        console_response(null, null, xhr.responseText);
 
473
        xhr = ajax_call(null, "consoleservice", "restart", {"key": server_key}, "POST");
 
474
        console_response(null, null, null, xhr.responseText);
532
475
    }
533
476
}
534
477
 
535
478
/** Prints an error line in the console **/
536
 
function print_error(error, cls)
537
 
{
538
 
    if (!cls)
539
 
        cls = "errorMsg";
540
 
 
 
479
function print_error(error)
 
480
541
481
    var output = document.getElementById("console_output");
542
482
  
543
483
    // Create text block
544
484
    var span = document.createElement("span");
545
 
    span.setAttribute("class", cls);
 
485
    span.setAttribute("class", "errorMsg");
546
486
    span.appendChild(document.createTextNode(error + "\n"));
547
487
    output.appendChild(span);
548
488