195 lines
6.6 KiB
JavaScript
195 lines
6.6 KiB
JavaScript
define(
|
|
[
|
|
"jquery", "underscore",
|
|
"js/views/abstract_editor", "js/models/uploads", "js/views/uploads"
|
|
|
|
],
|
|
function($, _, AbstractEditor, FileUpload, UploadDialog) {
|
|
"use strict";
|
|
|
|
var VideoUploadDialog = UploadDialog.extend({
|
|
error: function() {
|
|
this.model.set({
|
|
"uploading": false,
|
|
"uploadedBytes": 0,
|
|
"title": gettext("Sorry, there was an error parsing the subtitles that you uploaded. Please check the format and try again.")
|
|
});
|
|
}
|
|
});
|
|
|
|
var Translations = AbstractEditor.extend({
|
|
events : {
|
|
"click .setting-clear" : "clear",
|
|
"click .create-setting" : "addEntry",
|
|
"click .remove-setting" : "removeEntry",
|
|
"click .upload-setting" : "upload",
|
|
"change select" : "onChangeHandler"
|
|
},
|
|
|
|
templateName: "metadata-translations-entry",
|
|
templateItemName: "metadata-translations-item",
|
|
|
|
initialize: function () {
|
|
var templateName = _.result(this, 'templateItemName'),
|
|
tpl = document.getElementById(templateName).text;
|
|
|
|
if(!tpl) {
|
|
console.error("Couldn't load template for item: " + templateName);
|
|
}
|
|
|
|
this.templateItem = _.template(tpl);
|
|
AbstractEditor.prototype.initialize.apply(this, arguments);
|
|
},
|
|
|
|
getDropdown: function () {
|
|
var dropdown,
|
|
disableOptions = function (element, values) {
|
|
var dropdown = $(element).clone();
|
|
|
|
_.each(values, function(value, key) {
|
|
// Note: IE may raise an exception if key is an empty string,
|
|
// while other browsers return null as excepted. So coerce it
|
|
// into null for browser consistency.
|
|
if (key === "") {
|
|
key = null;
|
|
}
|
|
|
|
var option = dropdown[0].options.namedItem(key);
|
|
|
|
if (option) {
|
|
option.disabled = true;
|
|
}
|
|
});
|
|
|
|
return dropdown;
|
|
};
|
|
|
|
return function (values) {
|
|
if (dropdown) {
|
|
return disableOptions(dropdown, values);
|
|
}
|
|
|
|
dropdown = document.createElement('select');
|
|
dropdown.options.add(new Option());
|
|
_.each(this.model.get('languages'), function(lang, index) {
|
|
var option = new Option();
|
|
|
|
option.setAttribute('name', lang.code);
|
|
option.value = lang.code;
|
|
option.text = lang.label;
|
|
dropdown.options.add(option);
|
|
});
|
|
|
|
return disableOptions(dropdown, values);
|
|
};
|
|
}(),
|
|
|
|
getValueFromEditor: function () {
|
|
var dict = {},
|
|
items = this.$el.find('ol').find('.list-settings-item');
|
|
|
|
_.each(items, function(element, index) {
|
|
var key = $(element).find('select').val(),
|
|
value = $(element).find('.input').val();
|
|
|
|
// Keys should be unique, so if our keys are duplicated and
|
|
// second key is empty or key and value are empty just do
|
|
// nothing. Otherwise, it'll be overwritten by the new value.
|
|
if (value === '') {
|
|
if (key === '' || key in dict) {
|
|
return false;
|
|
}
|
|
}
|
|
|
|
dict[key] = value;
|
|
});
|
|
|
|
return dict;
|
|
},
|
|
|
|
// @TODO: Use backbone render patterns.
|
|
setValueInEditor: function (values) {
|
|
var self = this,
|
|
frag = document.createDocumentFragment(),
|
|
dropdown = self.getDropdown(values);
|
|
|
|
_.each(values, function(value, key) {
|
|
var html = $(self.templateItem({
|
|
'lang': key,
|
|
'value': value,
|
|
'url': self.model.get('urlRoot') + '/' + key
|
|
})).prepend(dropdown.clone().val(key))[0];
|
|
|
|
frag.appendChild(html);
|
|
});
|
|
|
|
this.$el.find('ol').html([frag]);
|
|
},
|
|
|
|
addEntry: function(event) {
|
|
event.preventDefault();
|
|
// We don't call updateModel here since it's bound to the
|
|
// change event
|
|
var dict = $.extend(true, {}, this.model.get('value'));
|
|
dict[''] = '';
|
|
this.setValueInEditor(dict);
|
|
this.$el.find('.create-setting').addClass('is-disabled').attr('aria-disabled', true);
|
|
},
|
|
|
|
removeEntry: function(event) {
|
|
event.preventDefault();
|
|
|
|
var entry = $(event.currentTarget).data('lang');
|
|
this.setValueInEditor(_.omit(this.model.get('value'), entry));
|
|
this.updateModel();
|
|
this.$el.find('.create-setting').removeClass('is-disabled').attr('aria-disabled', false);
|
|
},
|
|
|
|
upload: function (event) {
|
|
event.preventDefault();
|
|
|
|
var self = this,
|
|
target = $(event.currentTarget),
|
|
lang = target.data('lang'),
|
|
model = new FileUpload({
|
|
title: gettext('Upload translation'),
|
|
fileFormats: ['srt']
|
|
}),
|
|
view = new VideoUploadDialog({
|
|
model: model,
|
|
url: self.model.get('urlRoot') + '/' + lang,
|
|
parentElement: target.closest('.xblock-editor'),
|
|
onSuccess: function (response) {
|
|
if (!response['filename']) { return; }
|
|
|
|
var dict = $.extend(true, {}, self.model.get('value'));
|
|
|
|
dict[lang] = response['filename'];
|
|
self.model.setValue(dict);
|
|
}
|
|
});
|
|
|
|
view.show();
|
|
},
|
|
|
|
enableAdd: function() {
|
|
this.$el.find('.create-setting').removeClass('is-disabled').attr('aria-disabled', false);
|
|
},
|
|
|
|
clear: function() {
|
|
AbstractEditor.prototype.clear.apply(this, arguments);
|
|
if (_.isNull(this.model.getValue())) {
|
|
this.$el.find('.create-setting').removeClass('is-disabled').attr('aria-disabled', false);
|
|
}
|
|
},
|
|
|
|
onChangeHandler: function (event) {
|
|
this.showClearButton();
|
|
this.enableAdd();
|
|
this.updateModel();
|
|
}
|
|
});
|
|
|
|
return Translations;
|
|
});
|