AutorÃa | Ultima modificación | Ver Log |
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
//
/**
* Atto recordrtc library functions
*
* @package atto_recordrtc
* @author Jesus Federico (jesus [at] blindsidenetworks [dt] com)
* @author Jacob Prud'homme (jacob [dt] prudhomme [at] blindsidenetworks [dt] com)
* @copyright 2017 Blindside Networks Inc.
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
/**
* @module moodle-atto_recordrtc-button
*/
/**
* Atto text editor recordrtc plugin.
*
* @namespace M.atto_recordrtc
* @class button
* @extends M.editor_atto.EditorPlugin
*/
// ESLint directives.
/* eslint-disable camelcase, spaced-comment */
// JSHint directives.
/*global M */
/*jshint onevar: false */
// Scrutinizer CI directives.
/** global: Y */
/** global: M */
var PLUGINNAME = 'atto_recordrtc',
TEMPLATE = '' +
'<div class="{{PLUGINNAME}} container-fluid">' +
'<div class="{{bs_row}} hide">' +
'<div class="{{bs_col}}12">' +
'<div id="alert-danger" class="alert {{bs_al_dang}}">' +
'<strong>{{insecurealert_title}}</strong> {{insecurealert}}' +
'</div>' +
'</div>' +
'</div>' +
'<div class="{{bs_row}} hide">' +
'{{#if isAudio}}' +
'<div class="{{bs_col}}1"></div>' +
'<div class="{{bs_col}}10">' +
'<audio id="player"></audio>' +
'</div>' +
'<div class="{{bs_col}}1"></div>' +
'{{else}}' +
'<div class="{{bs_col}}12">' +
'<video id="player"></video>' +
'</div>' +
'{{/if}}' +
'</div>' +
'<div class="{{bs_row}}">' +
'<div class="{{bs_col}}1"></div>' +
'<div class="{{bs_col}}10">' +
'<button id="start-stop" class="{{bs_ss_btn}}">{{startrecording}}</button>' +
'</div>' +
'<div class="{{bs_col}}1"></div>' +
'</div>' +
'<div class="{{bs_row}} hide">' +
'<div class="{{bs_col}}3"></div>' +
'<div class="{{bs_col}}6">' +
'<button id="upload" class="btn btn-primary btn-block">{{attachrecording}}</button>' +
'</div>' +
'<div class="{{bs_col}}3"></div>' +
'</div>' +
'</div>';
Y.namespace('M.atto_recordrtc').Button = Y.Base.create('button', Y.M.editor_atto.EditorPlugin, [], {
/**
* The current language by default.
*/
_lang: 'en',
initializer: function() {
if (this.get('host').canShowFilepicker('media')) {
// Add audio and/or video buttons depending on the settings.
var allowedtypes = this.get('allowedtypes'),
buttonadded = false;
if (allowedtypes === 'both' || allowedtypes === 'audio') {
this._addButton('audio', this._audio);
buttonadded = true;
}
if (allowedtypes === 'both' || allowedtypes === 'video') {
this._addButton('video', this._video);
buttonadded = true;
}
if (!buttonadded) {
// Plugin not available here.
return;
}
// Initialize the dialogue box.
var dialogue = this.getDialogue({
width: 1000,
focusAfterHide: null
});
dialogue.after('visibleChange', function() {
var closed = !dialogue.get('visible'),
m = M.atto_recordrtc.commonmodule;
if (closed) {
// If dialogue is closed during recording, do the following.
window.clearInterval(m.countdownTicker);
if (m.mediaRecorder && m.mediaRecorder.state !== 'inactive') {
m.mediaRecorder.stop();
}
if (m.stream) {
m.stream.getTracks().forEach(function(track) {
if (track.readyState !== 'ended') {
track.stop();
}
});
}
// Because the player uses ids to identify things (this should be fixed)
// we must make sure the dialogue contents only exist once in the DOM.
// Therefore, when a dialogue is closed, we must remove its contents.
this.getDialogue().set('bodyContent', '');
}
}, this);
dialogue.on('click', function() {
this.centered();
});
// Require adapter.js library.
window.require(['core/adapter'], function(adapter) {
window.adapter = adapter;
});
}
},
/**
* Add the buttons to the Atto toolbar.
*
* @method _addButton
* @param {string} type
* @param {callback} callback
* @private
*/
_addButton: function(type, callback) {
this.addButton({
buttonName: type,
icon: this.get(type + 'rtcicon'),
iconComponent: PLUGINNAME,
callback: callback,
title: type + 'rtc',
tags: type + 'rtc',
tagMatchRequiresAll: false
});
},
/**
* Toggle audiortc and normal display mode
*
* @method _audio
* @private
*/
_audio: function() {
var dialogue = this.getDialogue({
focusAfterHide: 'audio'
});
dialogue.set('headerContent', M.util.get_string('audiortc', 'atto_recordrtc'));
dialogue.set('bodyContent', this._createContent('audio'));
dialogue.show();
M.atto_recordrtc.audiomodule.init(this);
},
/**
* Toggle videortc and normal display mode
*
* @method _video
* @private
*/
_video: function() {
var dialogue = this.getDialogue({
focusAfterHide: 'video'
});
dialogue.set('headerContent', M.util.get_string('videortc', 'atto_recordrtc'));
dialogue.set('bodyContent', this._createContent('video'));
dialogue.show();
M.atto_recordrtc.videomodule.init(this);
},
/**
* Create the HTML to be displayed in the dialogue box
*
* @method _createContent
* @param {string} type
* @returns {Object}
* @private
*/
_createContent: function(type) {
var isAudio = (type === 'audio'),
bsRow = 'row',
bsCol = 'col-',
bsAlDang = 'alert-danger',
bsSsBtn = 'btn btn-lg btn-outline-danger btn-block';
var bodyContent = Y.Handlebars.compile(TEMPLATE)({
PLUGINNAME: PLUGINNAME,
isAudio: isAudio,
bs_row: bsRow,
bs_col: bsCol,
bs_al_dang: bsAlDang,
bs_ss_btn: bsSsBtn,
insecurealert_title: M.util.get_string('insecurealert_title', 'atto_recordrtc'),
insecurealert: M.util.get_string('insecurealert', 'atto_recordrtc'),
startrecording: M.util.get_string('startrecording', 'atto_recordrtc'),
attachrecording: M.util.get_string('attachrecording', 'atto_recordrtc')
});
return bodyContent;
},
/**
* Close the dialogue without further action.
*
* @method closeDialogue
* @param {Object} scope The "this" context of the editor.
*/
closeDialogue: function(scope) {
scope.getDialogue().hide({
focusAfterHide: null
});
scope.editor.focus();
},
/**
* Insert the annotation link in the editor.
*
* @method setLink
* @param {Object} scope The "this" context of the editor.
* @param {string} annotation The HTML link to the recording.
*/
setLink: function(scope, annotation) {
scope.getDialogue().hide({
focusAfterHide: null
});
scope.editor.focus();
scope.get('host').insertContentAtFocusPoint(annotation);
scope.markUpdated();
}
}, {
ATTRS: {
/**
* The contextid to use when generating this recordrtc.
*
* @attribute contextid
* @type String
*/
contextid: {
value: null
},
/**
* The sesskey to use when generating this recordrtc.
*
* @attribute sesskey
* @type String
*/
sesskey: {
value: null
},
/**
* The allowedtypes to use when generating this recordrtc.
*
* @attribute allowedtypes
* @type String
*/
allowedtypes: {
value: null
},
/**
* The audiobitrate to use when generating this recordrtc.
*
* @attribute audiobitrate
* @type String
*/
audiobitrate: {
value: null
},
/**
* The videobitrate to use when generating this recordrtc.
*
* @attribute videobitrate
* @type String
*/
videobitrate: {
value: null
},
/**
* The audiotimelimit to use when generating this recordrtc.
*
* @attribute audiotimelimit
* @type String
*/
audiotimelimit: {
value: null
},
/**
* The videotimelimit to use when generating this recordrtc.
*
* @attribute videotimelimit
* @type String
*/
videotimelimit: {
value: null
},
/**
* The defaulttimelimit to use when generating this recordrtc.
*
* @attribute defaulttimelimit
* @type String
*/
defaulttimelimit: {
value: null
},
/**
* The audiortcicon to use when generating this recordrtc.
*
* @attribute audiortcicon
* @type String
*/
audiortcicon: {
value: null
},
/**
* The videortcicon to use when generating this recordrtc.
*
* @attribute videortcicon
* @type String
*/
videortcicon: {
value: null
},
/**
* Maximum upload size set on server, in bytes.
*
* @attribute maxrecsize
* @type String
*/
maxrecsize: {
value: null
}
}
});