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

« back to all changes in this revision

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

  • Committer: mattgiuca
  • Date: 2008-08-18 12:15:25 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1027
Tutorial: Added new feature - previous attempt viewing. Allows users to see
    code they have previously submitted to tutorials.
    A new button ("View previous attempts") appears on each exercise box.
    This uses the getattempts and getattempt Ajax services checked in
    previously.
Note once again: Students are not (for the moment) able to see deactivated
attempts (this is a conservative approach - the ability to see deactivated
attempts can be turned on by setting HISTORY_ALLOW_INACTIVE = True in
tutorialservice).

Show diffs side-by-side

added added

removed removed

Lines of Context:
87
87
            handle_testresponse(exercisediv, exerciseid, testresponse);
88
88
            set_saved_status(exerciseid, filename, "Saved");
89
89
            set_submit_status(exerciseid, filename, "Submit");
 
90
            /* Close the "view previous" area (force reload) */
 
91
            close_previous(exerciseid);
90
92
        }
91
93
    ajax_call(callback, "tutorialservice", "", args, "POST",
92
94
        "multipart/form-data");
459
461
        break;
460
462
    }
461
463
}
 
464
 
 
465
/** User clicks "view previous attempts" button. Do an Ajax call and populate.
 
466
 * exerciseid: "id" of the exercise's div element.
 
467
 * filename: Filename of the exercise's XML file (used to identify the
 
468
 *     exercise when interacting with the server).
 
469
 */
 
470
function open_previous(exerciseid, filename)
 
471
{
 
472
    var exercisediv = document.getElementById(exerciseid);
 
473
    var divs = exercisediv.getElementsByTagName("div");
 
474
    var attempthistory;
 
475
    for (var i=0; i<divs.length; i++)
 
476
        if (divs[i].getAttribute("class") == "attempthistory")
 
477
            attempthistory = divs[i];
 
478
 
 
479
    /* Get handles on the four existing elements of the history box */
 
480
    var openbutton = attempthistory.getElementsByTagName("p")[0];
 
481
    var openarea = attempthistory.getElementsByTagName("div")[0];
 
482
    var dropdown = attempthistory.getElementsByTagName("select")[0];
 
483
    var textarea = attempthistory.getElementsByTagName("textarea")[0];
 
484
 
 
485
    /* Activate the "open" state, and clear the dropdown box */
 
486
    openbutton.setAttribute("style", "display: none");
 
487
    openarea.setAttribute("style", "display: auto");
 
488
    textarea.setAttribute("style", "display: none");
 
489
    dom_removechildren(dropdown);
 
490
    var pleasewait = document.createElement("option");
 
491
    pleasewait.appendChild(document.createTextNode("Retrieving past attempts..."));
 
492
    dropdown.appendChild(pleasewait);
 
493
 
 
494
    var args = {"exercise": filename, "action": "getattempts"};
 
495
 
 
496
    /* Send the form as multipart/form-data, since we are sending a whole lump
 
497
     * of Python code, it should be treated like a file upload. */
 
498
    /* AJAX callback function */
 
499
    var callback = function(xhr)
 
500
        {
 
501
            var attempts;
 
502
            var attempt;
 
503
            var opt;
 
504
            try
 
505
            {
 
506
                attempts = JSON.parse(xhr.responseText);
 
507
            }
 
508
            catch (ex)
 
509
            {
 
510
                alert("There was an error fetching your attempt history. "
 
511
                    + "Please notify the administrators of this.");
 
512
                return;
 
513
            }
 
514
            /* Populate the attempt history div */
 
515
            dom_removechildren(dropdown);
 
516
            for (var i=0; i<attempts.length; i++)
 
517
            {
 
518
                /* An object with a date and complete */
 
519
                attempt = attempts[i];
 
520
                opt = document.createElement("option");
 
521
                opt.setAttribute("value", attempt.date);
 
522
                opt.appendChild(document.createTextNode(attempt.date));
 
523
                if (attempt.complete)
 
524
                {
 
525
                    /* Add a little green ball to this option
 
526
                     * This is probably hideously illegal, but looks nice :)
 
527
                     */
 
528
                    opt.appendChild(document.createTextNode(" "));
 
529
                    var img = document.createElement("img");
 
530
                    img.setAttribute("src",
 
531
                        make_path("media/images/tutorial/tiny/complete.png"));
 
532
                    img.setAttribute("alt", "Complete");
 
533
                    opt.appendChild(img);
 
534
                }
 
535
                dropdown.appendChild(opt);
 
536
            }
 
537
        }
 
538
    ajax_call(callback, "tutorialservice", "", args, "GET");
 
539
}
 
540
 
 
541
function close_previous(exerciseid)
 
542
{
 
543
    var exercisediv = document.getElementById(exerciseid);
 
544
    var divs = exercisediv.getElementsByTagName("div");
 
545
    var attempthistory;
 
546
    for (var i=0; i<divs.length; i++)
 
547
        if (divs[i].getAttribute("class") == "attempthistory")
 
548
            attempthistory = divs[i];
 
549
 
 
550
    /* Get handles on the four existing elements of the history box */
 
551
    var openbutton = attempthistory.getElementsByTagName("p")[0];
 
552
    var openarea = attempthistory.getElementsByTagName("div")[0];
 
553
 
 
554
    /* Deactivate the "open" state */
 
555
    openbutton.setAttribute("style", "display: auto");
 
556
    openarea.setAttribute("style", "display: none");
 
557
}
 
558
 
 
559
/** User selects an attempt in the dropdown. Do an Ajax call and populate.
 
560
 * exerciseid: "id" of the exercise's div element.
 
561
 * filename: Filename of the exercise's XML file (used to identify the
 
562
 *     exercise when interacting with the server).
 
563
 */
 
564
function select_attempt(exerciseid, filename)
 
565
{
 
566
    var exercisediv = document.getElementById(exerciseid);
 
567
    var divs = exercisediv.getElementsByTagName("div");
 
568
    var attempthistory;
 
569
    for (var i=0; i<divs.length; i++)
 
570
        if (divs[i].getAttribute("class") == "attempthistory")
 
571
            attempthistory = divs[i];
 
572
 
 
573
    /* Get handles on the four existing elements of the history box */
 
574
    var dropdown = attempthistory.getElementsByTagName("select")[0];
 
575
    var textarea = attempthistory.getElementsByTagName("textarea")[0];
 
576
 
 
577
    /* Get the "value" of the selected option */
 
578
    var date = dropdown.options[dropdown.selectedIndex].getAttribute("value");
 
579
 
 
580
    var args = {"exercise": filename, "action": "getattempt", "date": date};
 
581
 
 
582
    /* Send the form as multipart/form-data, since we are sending a whole lump
 
583
     * of Python code, it should be treated like a file upload. */
 
584
    /* AJAX callback function */
 
585
    var callback = function(xhr)
 
586
        {
 
587
            var attempt;
 
588
            try
 
589
            {
 
590
                attempt = JSON.parse(xhr.responseText);
 
591
            }
 
592
            catch (ex)
 
593
            {
 
594
                alert("There was an error fetching your attempt history. "
 
595
                    + "Please notify the administrators of this.");
 
596
                return;
 
597
            }
 
598
            if (attempt == null)
 
599
            {
 
600
                /* There was no data for this date - that's odd */
 
601
                alert("There was no attempt made before that date.");
 
602
                return;
 
603
            }
 
604
            /* Populate the attempt text field */
 
605
            textarea.removeAttribute("readonly");
 
606
            dom_removechildren(textarea);
 
607
            textarea.appendChild(document.createTextNode(attempt));
 
608
            textarea.setAttribute("style", "display: auto");
 
609
            //textarea.setAttribute("readonly", "readonly");
 
610
        }
 
611
    ajax_call(callback, "tutorialservice", "", args, "GET");
 
612
}