Exemple #1
0
import $ from 'jquery'
import StudentView from 'js/student_view'
import helper from 'js/url'

export default StudentView.extend({
    events: {},

    initialize() {},

    render() {
        return this;
    },

    postRender() {
        return this;
    },
});
Exemple #2
0
export default StudentView.extend({
  initialize() {
  },

  render() {
    return this;
  },

  postRender() {
    var filterTag = '#block-' + this.model.id;
    var $container = this.$el.find('div.blubber-stream');
    var assetsBaseUrl = $container.attr('data-assets-base-url');

    // hide tags used to filter Blubber threads
    var filterHashTags = function () {
      jQuery('a.hashtag', $container).filter(function () {
        return jQuery(this).text() == filterTag;
      }).hide();
    };

    this.loadStylesheets([ assetsBaseUrl + 'stylesheets/blubberforum.css' ]);

    this.loadScripts(
      [
        assetsBaseUrl + 'javascripts/autoresize.jquery.min.js',
        assetsBaseUrl + 'javascripts/blubber.js',
        assetsBaseUrl + 'javascripts/formdata.js'
      ],
      function () {
        // ensure that the filter tag is set properly before
        // creating the new Blubber posting
        jQuery(document).ajaxSend(function (event, xhr, options) {
          if (options.type != 'POST') {
            return;
          }

          if (options.url.substr(-12) != '/new_posting') {
            return;
          }

          if (options.data.indexOf(filterTag.replace(/#/, '%23')) == -1) {
            options.data = options.data + '+' + filterTag.replace(/#/, '%23');
          }
        });

        jQuery.get($container.attr('data-stream-url'), function (data) {
          $container.html(data);
          $container.removeClass('loading');

          // hide filter hash tags of newly created postings
          var originalInsertThread = window.STUDIP.Blubber.insertThread;
          window.STUDIP.Blubber.insertThread = function (postingId, date, contents) {
            originalInsertThread(postingId, date, contents);
            filterHashTags();
          };

          filterHashTags();

          var $newPostingInput = jQuery('#new_posting');
          $newPostingInput.after('<input type="submit" value="Absenden">');
          $newPostingInput.next().click(function () {
            var event = jQuery.Event('keydown');
            event.keyCode = 13;
            event.which = 13;
            jQuery('#new_posting').trigger(event);
          });
        });
      }
    );

    return this;
  },

  loadStylesheets(stylesheets) {
    for (var i = 0; i < stylesheets.length; i++) {
      if (document.createStyleSheet) {
        document.createStyleSheet(stylesheets[i]);
      } else {
        var attributes = {
          'rel': 'stylesheet',
          'href': stylesheets[i],
          'type': 'text/css',
          'media': 'screen'
        };
        jQuery('<link>', attributes).appendTo('head');
      }
    }
  },

  loadScripts(scripts, callback) {
    var remaining = scripts.length;

    for (var i = 0; i < scripts.length; i++) {
      jQuery.getScript(scripts[i], function () {
        remaining--;

        if (remaining == 0) {
          callback();
        }
      });
    }
  }
});
Exemple #3
0
import StudentView from 'js/student_view'
import slick from 'slick-carousel'


export default StudentView.extend({
  events: {},

  initialize() {
  },

  render() {
    return this;
  },

  postRender() {
      var $autoplay = this.$el.find('input[name="gallery-autoplay"]').val() == 1;
      var $autoplaytimer = this.$el.find('input[name="gallery-autoplay-timer"]').val()*1000;
      var $hidenav = this.$el.find('input[name="gallery-hidenav"]').val() == 0;
      if (!$hidenav) {
            this.$el.find(".cw-gallery").addClass("cw-gallery-hidenav");
      }
      $autoplaytimer == "" ? $autoplaytimer = 2000 : $autoplaytimer = $autoplaytimer;
      this.$('.cw-gallery').slick({
            arrows: $hidenav,
            autoplay: $autoplay,
            autoplaySpeed: $autoplaytimer,
            infinite: true
      });
  }
});
Exemple #4
0
export default StudentView.extend({
    events: {
        'click button[name=reset-exercise]': function (event) {
            var $form = this.$(event.target).closest('form'),
            view = this,
            $exercise_index = $form.find('input[name="exercise_index"]').val(),
            $block = this.$el.parent();

            if (confirm('Soll die Antwort zurückgesetzt werden?')) {
                helper.callHandler(this.model.id, 'exercise_reset', $form.serialize())
                .then(function () {
                    return view.renderServerSide();
                }).catch(function () {
                    console.log('failed to reset the exercise');
                }).then(function () {
                    $block.find('.exercise').hide();
                    $block.find('#exercise' + $exercise_index).show();
                    $(window).trigger('resize');
                });
            }

          return false;
        },

        'click button[name=submit-exercise]': function (event) {
            let $form = this.$(event.target).closest('form'),
                view = this,
                $exercise_index = $form.find('input[name="exercise_index"]').val(),
                $block = this.$el.parent();

            let files = [];
            if (this.$('input[name="upload"]').length > 0) {
                files.push(this.$('input[name="upload"]')[0].files[0]); //Files[0] = 1st file
            }
            if (this.$('input[name="upload[]"]').length > 0) {
                files = this.$('input[name="upload[]"]')[0].files; 
            }
            let files_array = [];
            let promises = [];
            if (files.length > 0) {
                $.each(files, function(index, file){
                    let filePromise = new Promise( resolve => {
                        let reader = new FileReader();
                        let file_data = {};
                        reader.readAsDataURL(file);
                        reader.onloadend = function(){
                            file_data.file = reader.result;
                            file_data.name = file.name;
                            file_data.size = file.size;
                            file_data.type = file.type;
                            files_array.push(file_data);
                            resolve(reader.result);
                        };
                    });
                    promises.push(filePromise);
                });
            }

            let indexed_array = {};

            $.each($form.serializeArray(), function () {
                if (this.name.indexOf('[') < 0) {
                        indexed_array[this.name] = this.value || '';
                } else {
                    let splinter = this.name.split('[');
                    let name = splinter[0];
                    let key = splinter[1].split(']')[0];
                    if (!indexed_array[name]) {
                        indexed_array[name] = [indexed_array[name]];
                    }
                    indexed_array[name][key] = this.value || '';
                }
            });

            Promise.all(promises).then(function() {
                indexed_array.files = files_array;
                helper.callHandler(view.model.id, 'exercise_submit', indexed_array)
                .then(function (resp) {
                    if(resp.is_nobody) {
                        var $ex =view.$("#exercise"+resp.exercise_index);
                        $ex.find(".cw-test-content").first().html('<form class="studip_form"><fieldset><legend>'+resp.title+'</legend>'+resp.solution+'</fieldset></form>');
                    } else {
                        return view.renderServerSide();
                    }
                }).then(function () {
                    $block.find('.exercise').hide();
                    $block.find('#exercise' + $exercise_index).show();
                    $block.find('.submitinfo').slideDown(250).delay(1500).slideUp(250);
                    $(window).trigger('resize');
                })
                .catch(function () {
                    console.log('failed to store the solution');
                });
            });                
            
            return false;
        },

        'click button[name=exercisenav]': function (event) {
            var options = $.parseJSON(this.$(event.target).attr('button-data')),
            $num = parseInt(options.id),
            $block = this.$el.parent();

            if (options.direction == 'next') {
                $num++;
            } else {
                $num--;
            }
            if ($num > parseInt(options.numexes, 10)) {
                $num = 1;
            }
            if ($num < 1) {
                $num = parseInt(options.numexes, 10);
            }
            $block.find('.exercise').hide();
            $block.find('#exercise' + $num).show();

            $(window).trigger('resize');
        },

        'click button[name=exercise-hint-button]': function (event) {
            $('#exercise-hint-' + this.$(event.target).attr('exercise-data')).toggle('slow');
            if (this.$(event.target).hasClass("showing")) {
                this.$(event.target).removeClass("showing");
                this.$(event.target).html("Hinweis anzeigen");
            } else {
                this.$(event.target).addClass("showing");
                this.$(event.target).html("Hinweis ausblenden");
            }
        }
    },

    initialize() {
    },

    render() {
        return this;
    },

    postRender() {
        // TODO this code from vips.js should be called by vips.js
        if (this.$('.exercise').hasClass('vips14')) {
            this.$('.rh_list').sortable({
                item: '> .rh_item',
                tolerance: 'pointer',
                connectWith: '.rh_list',
                update: function(event, ui) {
                    if (ui.sender) {
                        ui.item.find('input').val(jQuery(this).data('group'));
                    }
                },
                over: function(event, ui) {
                    jQuery(this).addClass('hover');
                },
                out: function(event, ui) {
                    jQuery(this).removeClass('hover');
                },
                receive: function(event, ui) {
                    var sortable = jQuery(this);
                    var container = sortable.closest('tbody').find('.answer_container');
        
                    // default answer container can have more items
                    if (sortable.children().length > 1 && !sortable.is(container)) {
                        sortable.find('.rh_item').each(function(i) {
                            if (!ui.item.is(this)) {
                                jQuery(this).find('input').val(-1);
                                jQuery(this).detach().appendTo(container)
                                            .css('opacity', 0).animate({opacity: 1});
                            }
                        });
                    }
                }
            });
        } else {
            this.$('.rh_list').sortable({
                axis: 'y',
                containment: 'parent',
                item: '> .rh_item',
                tolerance: 'pointer',
                update: this.rh_move_choice
            });
        }

    },

    // TODO this code from vips.js should be called by vips.js
    rh_move_choice(event, ui)
    {
        jQuery(this).children().each(function(i) {
            jQuery(this).find('input').val(i);
        });
    }

});
Exemple #5
0
export default StudentView.extend({
    events: {
    },

    initialize() {
    },

    postRender() {
        var $assorttype = this.$(".assorttype-selection-assort").val();  
        if (!$assorttype) {return;}
        var $div = $("<div>", {class: "assortblock-content"});
        this.$el.append($div);
        if($assorttype == "tabs") {
            var $ul = $("<ul>");
            $div.append($ul);
        }
        try {
            var $assortblocks = JSON.parse(this.$(".assortblocks-selection-assort").val());
        } catch (e) {
                console.log("json parse crashed!");
                console.log(e);
                return;
        }
        var $maxheight = 0;
        if(!$assortblocks) {return ;}
        $.each($assortblocks , function(){
            var $id = this["id"];
            var $name = this["name"];
            if(!$id) {return;}
            if(!$name) {$name = $id; }
            var $thisblock = $("#block-"+$id);
            if ($thisblock.length == 0) { return; }
            $thisblock.hide();
            if ($maxheight < $thisblock.height()) $maxheight = $thisblock.height();
            if ($name == "") {$name = "Block "+$id;}
            switch($assorttype){
                case "accordion":
                    $div.append("<h3>"+$name+"</h3><div>"+$thisblock.html()+"</div>");
                    break;
                case "tabs":
                    $ul.append("<li><a href='#tabs-"+$id+"'>"+$name+"</a></li>");
                    $div.append("<div id ='tabs-"+$id+"'>"+$thisblock.html()+"</div>");
                    break;
            }
        });
        switch($assorttype){
            case "accordion":
                $div.accordion({
                    heightStyle: "content" 
                });
                break;
            case "tabs":
                $div.tabs({
                      heightStyle: "auto"
                });
                break;
        }
        $div.find(".controls").hide();
    },

    render() { 
        return this; 
    }
});
Exemple #6
0
export default StudentView.extend({
    events: {
        'touchstart .cw-canvasblock-canvas' :'touchStart',
        'touchmove .cw-canvasblock-canvas': 'touchMove',
        'touchend .cw-canvasblock-canvas' :'touchEnd',

        'mousedown .cw-canvasblock-canvas' :'mouseDown',
        'mousemove .cw-canvasblock-canvas': 'mouseMove',
        'mouseup .cw-canvasblock-canvas' :'mouseUp',
        'mouseout .cw-canvasblock-canvas' :'mouseUp',
        'mouseleave .cw-canvasblock-canvas' :'mouseUp',

        'click .cw-canvasblock-reset': 'reset',
        'click .cw-canvasblock-color': 'changeColor',
        'click .cw-canvasblock-size': 'changeSize',
        'click .cw-canvasblock-tool': 'changeTool',
        'click .cw-canvasblock-download' : 'downloadImage',
        'click .cw-canvasblock-undo': 'undoDraw'
    },

    initialize() { },

    render() {
        return this;
    },

    postRender() {
        var $view = this;
        var $original_img = $view.$('.cw-canvasblock-original-img');
        $view.buildCanvas($original_img);

        $original_img.on('load', function(){
            $view.buildCanvas($original_img);
        });
    },

    buildCanvas($original_img) {
        var $view = this;
        var $canvas = $view.$('.cw-canvasblock-canvas');
        var img = $original_img[0];
        var canvas = $canvas[0];
        canvas.width = 860;
        if ($original_img[0].height > 0) {
            canvas.height = Math.round((canvas.width / $original_img[0].width) * $original_img[0].height);
        } else {
            canvas.height = 484;
        }
        $original_img.hide();
        this.context = canvas.getContext( '2d' );
        this.paint = false;
        this.write = false;
        this.clickX = new Array();
        this.clickY = new Array();
        this.clickDrag = new Array();

        this.colors = {
                'white': 'rgba(255,255,255,1)',
                'blue': 'rgba(52,152,219,1)',
                'green': 'rgba(46,204,113,1)',
                'purple': 'rgba(155,89,182,1)',
                'red': 'rgba(231,76,60,1)',
                'yellow': 'rgba(254,211,48,1)',
                'orange': 'rgba(243,156,18,1)',
                'grey': 'rgba(149,165,166,1)',
                'darkgrey': 'rgba(52,73,94,1)',
                'black': 'rgba(0,0,0,1)'
        };
        this.$('.cw-canvasblock-color').each(function(index){
            let color = $(this).val();
            $(this).css('background-color', $view.colors[color]);
        });

        this.clickColor = new Array();
        this.currentColor = this.colors['blue'];

        this.$('.cw-canvasblock-color[value="blue"]').addClass('selected-color');

        this.sizes = {'small': 2, 'normal': 5, 'large': 8, 'huge': 12};
        this.clickSize = new Array();
        this.currentSize = this.sizes['normal'];
        this.$('.cw-canvasblock-size-normal').addClass('selected-size');

        this.tools = {'pen': 'pen', 'text': 'text'}
        this.clickTool = new Array();
        this.currentTool = this.tools['pen'];
        this.$('.cw-canvasblock-tool-pen').addClass('selected-tool');

        this.Text = new Array();

        $canvas.addClass('cw-canvasblock-tool-selected-'+this.currentTool);

        this.loadStoredData();
        this.redraw();
    },

    mouseDown(e) {
        if (this.write) {
            return;
        }
        var mouseX = e.offsetX;
        var mouseY = e.offsetY;
        if(this.currentTool == 'pen') {
            this.paint = true;
            this.addClick(e.offsetX, e.offsetY, false);
            this.redraw();
        }
        if(this.currentTool == 'text') {
            this.write = true;
            this.addClick(e.offsetX, e.offsetY, false);
        }
    },

    mouseMove(e) {
        if(this.paint){
            this.addClick(e.offsetX, e.offsetY, true);
            this.redraw();
        }
    },

    mouseUp(e) {
        this.paint = false;
    },

    touchStart(e) {
        e.preventDefault();
        if (this.write) {
            return;
        }
        var canvas = this.$('.cw-canvasblock-canvas')[0];
        var mousePos = this.getTouchPos(canvas, e);
        if(this.currentTool == 'pen') {
            this.paint = true;
            this.addClick(mousePos.x, mousePos.y, false);
            this.redraw();
        }
        if(this.currentTool == 'text') {
            this.write = true;
            this.addClick(mousePos.x, mousePos.y, false);
        }
    },

    touchMove(e) {
        e.preventDefault();

        var canvas = this.$('.cw-canvasblock-canvas')[0];
        var mousePos = this.getTouchPos(canvas, e);
        if(this.paint){
            this.addClick(mousePos.x, mousePos.y, true);
            this.redraw();
        }
    },

    touchEnd(e) {
        this.paint = false;
    },

    getTouchPos(canvasDom, touchEvent) {
        var rect = canvasDom.getBoundingClientRect();
        return {
            x: touchEvent.touches[0].clientX - rect.left,
            y: touchEvent.touches[0].clientY - rect.top
        };
    },

    preventScrollOnCanvas(e) {
        var canvas = this.$('.cw-canvasblock-canvas')[0];
        if (e.target == canvas) {
            e.preventDefault();
        }
    },

    addClick(x, y, dragging) {
        this.clickX.push(x);
        this.clickY.push(y);
        this.clickDrag.push(dragging);
        this.clickColor.push(this.currentColor);
        this.clickSize.push(this.currentSize);
        this.clickTool.push(this.currentTool);
        if (this.currentTool == 'text') {
           this.enableTextInput(x, y);
        } else {
            this.Text.push('');
        }
    },

    loadStoredData() {
        var draw = this.$('.cw-canvasblock-stored-draw').val();
        if ( draw == '') {
            return;
        }
        draw = JSON.parse(draw);
        this.clickX =  JSON.parse(draw.clickX);
        this.clickY =  JSON.parse(draw.clickY);
        this.clickDrag =  JSON.parse(draw.clickDrag);
        this.clickColor =  JSON.parse(draw.clickColor);
        this.clickSize =  JSON.parse(draw.clickSize);
        this.clickTool =  JSON.parse(draw.clickTool);
        this.Text =  JSON.parse(draw.Text);
    },

    redraw() {
        var $view = this;
        var context = this.context;
        var clickX = this.clickX;
        var clickY = this.clickY;
        var clickDrag = this.clickDrag;

        var outlineImage = new Image();
        outlineImage.src = this.$('.cw-canvasblock-original-img').attr('src');
        var bg = this.$('.cw-canvasblock-bgimage').val();

        $(outlineImage).on('load', function(){// chrome needs this!
            context.clearRect(0, 0, context.canvas.width, context.canvas.height); // Clears the canvas
            context.fillStyle = "#ffffff";
            context.fillRect(0, 0, context.canvas.width, context.canvas.height); // set background
            if (bg == 1) { 
                context.drawImage(outlineImage, 0, 0, context.canvas.width, context.canvas.height);
            }
            context.lineJoin = "round";

            for(var i=0; i < clickX.length; i++) {
                if ($view.clickTool[i] == 'pen') {
                    context.beginPath();
                    if(clickDrag[i] && i) {
                        context.moveTo(clickX[i-1], clickY[i-1]);
                     } else {
                         context.moveTo(clickX[i]-1, clickY[i]);
                     }
                     context.lineTo(clickX[i], clickY[i]);
                     context.closePath();
                     context.strokeStyle = $view.clickColor[i];
                     context.lineWidth = $view.clickSize[i];
                     context.stroke();
                }
                if ($view.clickTool[i] == 'text') {
                    let fontsize = $view.clickSize[i]*6;
                    context.font = fontsize+"px Arial";
                    context.fillStyle = $view.clickColor[i];
                    context.fillText($view.Text[i], clickX[i], clickY[i]+fontsize);
                }
            }
        });

        if (bg == 0) {
            $(outlineImage).trigger('load');
        }
        this.store();
    },

    store(){
      var $view = this;
      var draw = {};

      draw.clickX = JSON.stringify(this.clickX);
      draw.clickY = JSON.stringify(this.clickY);
      draw.clickDrag = JSON.stringify(this.clickDrag);
      draw.clickColor = JSON.stringify(this.clickColor);
      draw.clickSize = JSON.stringify(this.clickSize);
      draw.clickTool = JSON.stringify(this.clickTool);
      draw.Text = JSON.stringify(this.Text);

      draw = JSON.stringify(draw);

      helper
      .callHandler(this.model.id, 'store_draw', {
          canvas_draw: draw
      })
      .then(
        // success
        function () {
        },

        // error
        function (error) {
          var errorMessage = 'Could not store drawing: '+$.parseJSON(error.responseText).reason;
          alert(errorMessage);
          console.log(errorMessage, arguments);
        });
    },

    reset() {
        this.clickX.length = 0;
        this.clickY.length = 0;
        this.clickDrag.length = 0;
        this.clickColor.length = 0;
        this.clickSize.length = 0;
        this.clickTool.length = 0;
        this.Text.length = 0;
        this.$('input.cw-canvasblock-text-input').remove();
        this.paint = false;
        this.write = false;
        this.redraw();
    },

    changeColor(e) {
        if (this.write) {
            return;
        }
        var color = e.target.value;
        this.$('.cw-canvasblock-color').removeClass('selected-color');
        $(e.target).addClass('selected-color');
        this.currentColor = this.colors[color];
    },

    changeSize(e) {
        if (this.write) {
            return;
        }
        var size = e.target.value;
        this.$('.cw-canvasblock-size').removeClass('selected-size');
        $(e.target).addClass('selected-size');
        this.currentSize = this.sizes[size];
    },

    changeTool(e) {
        var tool = e.target.value;
        if (this.write) {
            this.clickX.pop();
            this.clickY.pop();
            this.clickDrag.pop();
            this.clickColor.pop();
            this.clickSize.pop();
            this.clickTool.pop();
            this.$('input.cw-canvasblock-text-input').remove();
            this.write = false;
        }
        this.$('.cw-canvasblock-tool').removeClass('selected-tool');
        $(e.target).addClass('selected-tool');
        var $canvas = this.$('.cw-canvasblock-canvas');
        this.currentTool = this.tools[tool];

        $canvas.removeClass('cw-canvasblock-tool-selected-pen').removeClass('cw-canvasblock-tool-selected-text');
        $canvas.addClass('cw-canvasblock-tool-selected-'+this.currentTool);
    },

    enableTextInput(x, y) {
        var $view = this;
        this.$('input.cw-canvasblock-text-input').remove();
        let fontsize = this.currentSize*6;
        $view.$('.cw-canvasblock-canvas').before('<input class="cw-canvasblock-text-input">');
        var $input = this.$('input.cw-canvasblock-text-input');
        $input.ready(function(){
            $input.focus();
        });
        $input.css('position', 'absolute');
        $input.css('top', (this.$('canvas')[0].offsetTop + y) + 'px');
        $input.css('left', x +'px');
        $input.css('line-height', fontsize +'px');
        $input.css('font-size', fontsize +'px');
        $input.css('max-width', '300px');

        $input[0].addEventListener('keyup', function(e){
            if (e.defaultPrevented) {
                return;
            }
            var key = e.key || e.keyCode;
            if (key === 'Enter' || key === 13) {
                $view.Text.push($input.val());
                $view.$('input.cw-canvasblock-text-input').remove();
                $view.write = false;
                $view.redraw();
            }
            if (key === 'Escape' || key === 'Esc' || key === 27) {
                $view.clickX.pop();
                $view.clickY.pop();
                $view.clickDrag.pop();
                $view.clickColor.pop();
                $view.clickSize.pop();
                $view.clickTool.pop();
                $view.$('input.cw-canvasblock-text-input').remove();
                $view.write = false;
            }
        }, false);

    },

    downloadImage() {
        var image = this.context.canvas.toDataURL();
        $("<a/>", {
            "class": "cw-canvasblock-download-link",
            "text": 'download',
            "title": 'download',
            "href": image,
            "download" : "cw-img.png"
        }).appendTo(this.$el);

        var link = this.$('.cw-canvasblock-download-link');
        link[0].click();
        link.remove();
    },

    undoDraw() {
        var dragging = this.clickDrag[this.clickDrag.length -1];

        this.clickX.pop();
        this.clickY.pop();
        this.clickDrag.pop();
        this.clickColor.pop();
        this.clickSize.pop();
        this.clickTool.pop();
        if (this.write) {
            this.$('input.cw-canvasblock-text-input').remove();
            this.write = false;
        } else {
            this.Text.pop('');
        }

        if (dragging){
            this.undoDraw();
        }

        this.redraw();
    }
});
Exemple #7
0
import StudentView from 'js/student_view'

export default StudentView.extend({
  initialize() { },

  render() {
    return this;
  }
});
Exemple #8
0
export default StudentView.extend({
    events: {},

    initialize() {},

    render() {
        return this;
    },

    postRender() {
        if (this.$(".cw-chart-stored-content").val() != "") {
            this.buildChart();
        }

        return this;
    },

    buildChart() {
        var $view = this;
        var ctx = $view.$('.cw-chartblock-canvas').get(0).getContext('2d');

        var $type = $view.$(".cw-chart-stored-type").val();
        var $content = $view.$(".cw-chart-stored-content").val();
        var json = JSON.parse($content);
        
        var $labels = [];
        var $data = [];
        var $backgroundColor = [];
        var $borderColor = [];
        $.each(json, function(i){
            $labels.push(json[i].label);
            $data.push(json[i].value);
            $backgroundColor.push('rgba('+$view.getColor(json[i].color)+', 0.6)' );
            $borderColor.push('rgba('+$view.getColor(json[i].color)+', 1.0)' );
        });

        var $label = $view.$('.cw-chart-stored-label').val();

        if (($type == 'bar') || ($type == 'horizontalBar')) {
            var myChart = new Chart(ctx, {
                type: $type,
                data: {
                    labels: $labels,
                    datasets: [{
                        label: $label,
                        data: $data,
                        backgroundColor: $backgroundColor,
                        borderColor: $borderColor,
                        borderWidth: 1
                    }]
                },
                options: {
                    scales: {
                        yAxes: [{
                            ticks: {
                                beginAtZero:true
                            }
                        }]
                    },
                    legend: {
                        display: false
                    }
                }
            });
        }

        if (($type == 'pie') || ($type == 'doughnut') || ($type == 'polarArea')){
            var myChart = new Chart(ctx, {
                type: $type,
                data: {
                    labels: $labels,
                    datasets: [{
                        data: $data,
                        backgroundColor: $backgroundColor,
                        borderWidth: 1
                    }]
                },
                options: {}
            });
        }

        if ($type == 'line') {
            var myChart = new Chart(ctx, {
                type: $type,
                data: {
                    labels: $labels,
                    datasets: [{
                        label: $label,
                        data: $data,
                        fill: false, 
                        borderWidth: 2,
                        pointBackgroundColor: $borderColor
                    }]
                },
                options: {}
            });
        }
    },

    getColor($color) {
        switch($color) {
            case 'red':
                return '192, 57, 43';
            case 'blue': 
                return '52, 152, 219';
            case 'yellow':
                return '241, 196, 15';
            case 'green':
                return '46, 204, 113';
            case 'purple':
                return '155, 89, 182';
            case 'orange':
                return '230, 126, 34';
            case 'turquoise':
                return '26, 188, 156';
            case 'grey':
                return '52, 73, 94';
            case 'lightgrey':
                return '149, 165, 166';
            case 'black':
                return '0, 0, 0';
        }
    }

});
Exemple #9
0
import jQuery from 'jquery'
import StudentView from 'js/student_view'
import hljs from 'highlight.js'

export default StudentView.extend({
  events: {},

  initialize() {
  },

  render() {
    return this;
  },

  postRender() {
    hljs.highlightBlock(this.$('.code-content > pre > code')[0]);
  }
});
Exemple #10
0
export default StudentView.extend({
    events: {
        'click button[name=play]':   'playVideo',
        'click button[name=stop]':   'stopVideo',
        'click .cw-iav-stop-button-continue': 'continueVideo',
        'click .cw-iav-test-button-continue': 'continueVideo',
        'click button[name=submit-exercise]': 'submitExercise'
    },

    initialize() {},

    render() {
        return this;
    },

    postRender() {
        var $view =  this,
        $player_element = $view.$('.cw-iav-player').get(0);

        if (typeof $player_element !== 'undefined') {
            if ($player_element.readyState >= 2) {      //if firefox
                $view.setupVideo();
            } else {    // else may be chrome
                $player_element.addEventListener('loadedmetadata', function () {
                    $view.setupVideo();
                }, false);
            }
            // TODO this code from vips.js should be called by vips.js
            this.$('.rh_list').sortable({
                axis: 'y',
                containment: 'parent',
                item: '> .rh_item',
                tolerance: 'pointer',
                update: this.rh_move_choice
            });
        }

    },

    setupVideo() {
        var $view =  this,
        $player = $view.$('.cw-iav-player'),
        $player_element = $player.get(0),
        $duration = parseInt($player_element.duration),
        $playbutton = $view.$('.cw-iav-playbutton'),
        $range = $view.$('.cw-iav-range'),
        $time = $view.$('.cw-iav-time');
        if (isNaN($duration)) {
          $duration = 0;
        }

        $time.html($view.displayTimer(0, $duration));
        $range.slider({
          range: 'max',
          min: 0,
          max: $duration,
          value: 0,
          slide( event, ui ) {
            $player.prop('currentTime',ui.value);
            $time.html($view.displayTimer(ui.value, $duration));
          }
        });
        $player.find('source').each(function () {
          var $source = $(this).prop('src');
          if ($source.indexOf('mp4') > -1) {
            $(this).prop('type', 'audio/mp4')
          }
          if ($source.indexOf('ogg') > -1) {
            $(this).prop('type', 'audio/ogg')
          }
          if ($source.indexOf('webm') > -1) {
            $(this).prop('type', 'audio/webm')
          }
        });

        var overlay_json = $view.$('.overlay-json').val();
        if (overlay_json != "") {
            overlay_json = JSON.parse(overlay_json);
            $view.addOverlays(overlay_json);
        }

        var stop_json = $view.$('.stop-json').val();
        if (stop_json != "") {
            stop_json = JSON.parse(stop_json);
            $view.addStops(stop_json);
        }
        var test_json = $view.$('.test-json').val();
        if (test_json != "") {
            test_json = JSON.parse(test_json);
            $view.setupTests(test_json);
        }
        $player_element.addEventListener('timeupdate',function () {
            var $current = parseInt($player.prop('currentTime'));
            try {
                $range.slider( 'value', $current );
            }
            catch(err) {
            }
            $time.html($view.displayTimer($current, $duration));
            $view.interactionEventOverlay($current, overlay_json);
            $view.interactionEventStopAndTest($current);
            if ($current == $duration) {
                $view.onWatched();
            }
        }, false);

        $player_element.addEventListener('ended', function () {
          $playbutton.removeClass('playing');
          $player.prop('currentTime', 0);
        }, false);
    },

    displayTimer($current, $duration) {
        if (isNaN($duration) || ($duration == 0)) {
          return '';
        } else {
          return this.seconds2time($current) + '/' + this.seconds2time($duration);
        }
    },

    seconds2time(seconds) {
        var hours   = Math.floor(seconds / 3600),
            minutes = Math.floor((seconds - (hours * 3600)) / 60),
            time = '';

        seconds = seconds - (hours * 3600) - (minutes * 60);

        if (hours != 0) {
          time = hours + ':';
        }
        if (minutes != 0 || time !== '') {
          minutes = (minutes < 10 && time !== '') ? '0' + minutes : String(minutes);
          time += minutes + ':';
        }
        if (time === '') {
          time = (seconds < 10) ? '0:0' + seconds : '0:' + seconds;
        }
        else {
          time += (seconds < 10) ? '0' + seconds : String(seconds);
        }

        return time;
    },

    interactionEventOverlay($time, overlay_json) {
        if (overlay_json == "") { return; }
        var $view = this;

        for (var i in overlay_json) {
            var $overlay = $view.$('.cw-iav-overlay-content');
            if (($time >= overlay_json[i].start ) && ($time <= overlay_json[i].end)) {
                $overlay.filter('[data-overlayid='+overlay_json[i].id+']').show('fade', 800);
            } else {
                $overlay.filter('[data-overlayid='+overlay_json[i].id+']').hide('fade', 800);
            }
        }
    },

    interactionEventStopAndTest($time) {
        var $view = this;
        var stop_json = $view.$('.stop-json').val();
        if (stop_json != "") {
            stop_json = JSON.parse(stop_json);
        }
        var test_json = $view.$('.test-json').val();
        if (test_json != "") {
            test_json = JSON.parse(test_json);
        }
        if ((stop_json == "") && (test_json == "")){ return; }

        var $range = $view.$('.cw-iav-range'),
            $player = $view.$('.cw-iav-player'),
            $playbutton = $view.$('.cw-iav-playbutton'),
            interactionevents = [];
        for (var i in stop_json) {
            if (stop_json[i].solved == true) {
                continue;
            }
            if ($time >= stop_json[i].moment){
                interactionevents.push({"type": "stop", "id": stop_json[i].id , "moment":  stop_json[i].moment});
            }
        }
        for (var i in test_json) {
            if ((test_json[i].use_test == false)||(test_json[i].solved == true)) {
                continue;
            }
            if ($time >= test_json[i].moment){
                interactionevents.push({"type": "test", "id": test_json[i].test_id , "moment":  test_json[i].moment});
            }
        }
        if (interactionevents.length > 0) {
            interactionevents.sort(function (a, b) {
                return a.moment - b.moment;
            });
            let interaction = false;
            if (interactionevents[0].type == 'stop') {
                let $stop = $view.$('.cw-iav-stop-content[data-stopid='+interactionevents[0].id+']')
                if ($stop.is(':hidden')) {
                    $stop.show('fade', 800);
                    interaction = true;
                }
            }

            if (interactionevents[0].type == 'test') {
                let $test = $view.$('.cw-iav-test-content[data-testid='+interactionevents[0].id+']');
                if ($test.is(':hidden')) {
                    $test.show('fade', 800);
                    $(window).trigger('resize');
                    interaction = true;
                }
            }

            if (interaction) {
                $player.prop('currentTime', interactionevents[0].moment);
                try {$range.slider('disable');}
                catch(err) {}
                $player.trigger('pause');
                $playbutton.removeClass('playing').hide();
                $playbutton.removeClass('playing').hide();
            }
        }
    },

    addOverlays(overlay_json) {
        var $view = this;
        var $overlay_wrapper = $view.$('.cw-iav-overlay-wrapper');
        var html = "";
        for (var i in overlay_json) {
            var $item = $view.$('.cw-iav-overlay-content-default').clone();
            $item.attr('data-overlayid', overlay_json[i].id);
            $item.find('.cw-iav-overlay-content-title').text(overlay_json[i].title);
            $item.find('.cw-iav-overlay-content-text').text(overlay_json[i].content); 
            $item.removeClass('cw-iav-overlay-content-default').addClass('overlay-content-'+overlay_json[i].id).addClass(overlay_json[i].position).addClass(overlay_json[i].type).addClass(overlay_json[i].color);

            $($item).appendTo($overlay_wrapper);
        }
        $view.$('.cw-iav-overlay-content.overlay-content-default').remove();
        $view.$('.cw-iav-overlay-content').hide();
    },

    addStops(stop_json) {
        var $view = this;
        var $stop_wrapper = $view.$('.cw-iav-stop-wrapper');
        var html = "";
        for (var i in stop_json) {
            var $item = $view.$('.cw-iav-stop-content-default').clone();
            $item.attr('data-stopid', stop_json[i].id);
            $item.attr('data-stop-moment', stop_json[i].moment);
            $item.find('.cw-iav-stop-content-title').text(stop_json[i].title);
            $item.find('.cw-iav-stop-content-text').text(stop_json[i].content); 
            $item.find('.cw-iav-stop-button-continue').attr('data-stopid', stop_json[i].id); 
            $item.removeClass('cw-iav-stop-content-default').addClass('stop-content-'+stop_json[i].id).addClass(stop_json[i].type).addClass(stop_json[i].position).addClass(stop_json[i].color);

            $($item).appendTo($stop_wrapper);
        }
        $view.$('.cw-iav-stop-content.cw-iav-stop-content-default').remove();
        $view.$('.cw-iav-stop-content').hide();
    },

    setupTests(test_json) {
        for (var i in test_json) {
            let $test = this.$('.cw-iav-test-content[data-testid="'+test_json[i].test_id+'"]');
            $test.attr('data-test-moment', test_json[i].moment);
        }
    },

    playVideo() {
        var $view = this,
            $player = $view.$('.cw-iav-player'),
            $player_element = $player[0],
            $range = $view.$('.cw-iav-range'),
            $playbutton = $view.$('.cw-iav-playbutton');

        if ($player_element.paused) {
            $player.trigger('play');
            $playbutton.addClass('playing');
        } else {
            $player.trigger('pause');
            $playbutton.removeClass('playing');
        }
    },

    stopVideo() {
        var $view = this,
            $player = $view.$('.cw-iav-player'),
            $playbutton = $view.$('.cw-iav-playbutton'),
            $range = $view.$('.cw-iav-range');

        $player.trigger('pause');
        $range.slider('enable');
        $view.$('.cw-iav-overlay-content').hide();
        $view.$('.cw-iav-stop-content').hide();
        $player.prop('currentTime', 0);
        $playbutton.removeClass('playing').show();
        if ($view.$('.stop-json').val() != "") {
            var stop_json = JSON.parse($view.$('.stop-json').val());
            for (var i = 0; i < stop_json.length; i++) {
                stop_json[i].solved = false;
            }
            $view.$('.stop-json').val(JSON.stringify(stop_json));
        }
    },

    continueVideo(event) {
        var $view = this,
            $player = $view.$('.cw-iav-player'),
            $playbutton = $view.$('.cw-iav-playbutton'),
            $range = $view.$('.cw-iav-range'),
            $continue_button = this.$(event.target),
            item_id = '';

        $player.trigger('play');
        $playbutton.addClass('playing').show();
        $range.slider('enable');

        if ($continue_button.hasClass('cw-iav-stop-button-continue')) {
            item_id = event.currentTarget.attributes.getNamedItem('data-stopid').value;
            if ($view.$('.stop-json').val() != "") {
                var stop_json = JSON.parse($view.$('.stop-json').val());
                stop_json[item_id].solved = true;
                $continue_button.closest('.cw-iav-stop-content').addClass('cw-iav-stop-solved');
                $view.$('.stop-json').val(JSON.stringify(stop_json));
            }
        }
        if ($continue_button.hasClass('cw-iav-test-button-continue')) {
            item_id = event.currentTarget.attributes.getNamedItem('data-testid').value;
            if ($view.$('.test-json').val() != "") {
                var test_json = JSON.parse($view.$('.test-json').val());
                $.each(test_json, function(i, item){
                    if (item.test_id == item_id){
                        item.solved = true;
                        $continue_button.closest('.cw-iav-test-content').addClass('cw-iav-test-solved');
                    }
                });
                $view.$('.test-json').val(JSON.stringify(test_json));
            }
        }
        $view.$('.cw-iav-stop-content').hide('fade', 800);
        $view.$('.cw-iav-test-content').hide('fade', 800);
    },

    submitExercise(event) {
        var $form = this.$(event.target).closest('form'),
        view = this,
        top = document.body.scrollTop,
        $player = view.$('.cw-iav-player'),
        $current = $player.prop('currentTime'),
        $test_json = view.$('.test-json').val(),
        $stop_json = view.$('.stop-json').val(),
        $block = this.$el.parent();

        helper.callHandler(this.model.id, 'exercise_submit', $form.serialize())
        .then(function (resp) {
            return view.renderServerSide();
        }).then(function () {
            view.$('.test-json').val($test_json);
            view.$('.stop-json').val($stop_json);
            $player.prop('currentTime', $current);
            
            document.body.scrollTop = top;
        })
        .catch(function () {
            console.log('failed to store the solution');
        });

        return false;
    },

    onWatched() {
        helper
          .callHandler(this.model.id, 'watched', {})
          .catch(function (error) {
            var errorMessage = 'Could not update the block: ' + $.parseJSON(error.responseText).reason;
            alert(errorMessage);
            console.log(errorMessage, arguments);
        });
    },

    // TODO this code from vips.js should be called by vips.js
    rh_move_choice(event, ui)
    {
        jQuery(this).children().each(function(i) {
            jQuery(this).find('input').val(i);
        });
    }

});