Repository URL to install this package:
|
Version:
0.3.0 ▾
|
/* Javascript for StudioEditableXBlockMixin. */
function StudioEditableXBlockMixin(runtime, element) {
"use strict";
var fields = [];
var tinyMceAvailable = (typeof $.fn.tinymce !== 'undefined'); // Studio includes a copy of tinyMCE and its jQuery plugin
$(element).find('.field-data-control').each(function() {
var $field = $(this);
var $wrapper = $field.closest('li');
var $resetButton = $wrapper.find('button.setting-clear');
var type = $wrapper.data('cast');
var name = $wrapper.data('field-name');
if (type == 'datetime') {
if ($field.attr('type') == 'date') {
name = name + '-date';
} else {
name = name + '-time';
}
}
fields.push({
name: name,
isSet: function() { return $wrapper.hasClass('is-set'); },
val: function() {
var val = $field.val();
// Cast values to the appropriate type so that we send nice clean JSON over the wire:
if (type == 'boolean')
return (val == 'true' || val == '1');
if (type == "integer")
return parseInt(val, 10);
if (type == "float")
return parseFloat(val);
if (type == "generic" || type == "list" || type == "set") {
val = val.trim();
if (val === "")
val = null;
else
val = JSON.parse(val); // TODO: handle parse errors
}
return val;
}
});
var fieldChanged = function() {
// Field value has been modified:
$wrapper.addClass('is-set');
$resetButton.removeClass('inactive').addClass('active');
};
$field.bind("change input paste", fieldChanged);
$resetButton.click(function() {
$field.val($wrapper.attr('data-default')); // Use attr instead of data to force treating the default value as a string
$wrapper.removeClass('is-set');
$resetButton.removeClass('active').addClass('inactive');
});
if (type == 'html' && tinyMceAvailable) {
if ($field.tinymce())
$field.tinymce().remove(); // Stale instance from a previous dialog. Delete it to avoid interference.
$field.tinymce({
theme: 'modern',
skin: 'studio-tmce4',
height: '200px',
formats: { code: { inline: 'code' } },
codemirror: { path: "" + baseUrl + "/js/vendor" },
plugins: "link codemirror",
menubar: false,
statusbar: false,
toolbar_items_size: 'small',
toolbar: "formatselect | styleselect | bold italic underline forecolor wrapAsCode | bullist numlist outdent indent blockquote | link unlink | code",
resize: "both",
setup : function(ed) {
ed.on('change', fieldChanged);
}
});
}
});
$(element).find('.wrapper-list-settings .list-set').each(function() {
var $optionList = $(this);
var $checkboxes = $(this).find('input');
var $wrapper = $optionList.closest('li');
var $resetButton = $wrapper.find('button.setting-clear');
fields.push({
name: $wrapper.data('field-name'),
isSet: function() { return $wrapper.hasClass('is-set'); },
val: function() {
var val = [];
$checkboxes.each(function() {
if ($(this).is(':checked')) {
val.push(JSON.parse($(this).val()));
}
});
return val;
}
});
var fieldChanged = function() {
// Field value has been modified:
$wrapper.addClass('is-set');
$resetButton.removeClass('inactive').addClass('active');
};
$checkboxes.bind("change input", fieldChanged);
$resetButton.click(function() {
var defaults = JSON.parse($wrapper.attr('data-default'));
$checkboxes.each(function() {
var val = JSON.parse($(this).val());
$(this).prop('checked', defaults.indexOf(val) > -1);
});
$wrapper.removeClass('is-set');
$resetButton.removeClass('active').addClass('inactive');
});
});
var studio_submit = function(data) {
var handlerUrl = runtime.handlerUrl(element, 'submit_studio_edits');
runtime.notify('save', {state: 'start', message: gettext("Saving")});
$.ajax({
type: "POST",
url: handlerUrl,
data: JSON.stringify(data),
dataType: "json",
global: false, // Disable Studio's error handling that conflicts with studio's notify('save') and notify('cancel') :-/
success: function(response) { runtime.notify('save', {state: 'end'}); }
}).fail(function(jqXHR) {
var message = gettext("This may be happening because of an error with our server or your internet connection. Try refreshing the page or making sure you are online.");
if (jqXHR.responseText) { // Is there a more specific error message we can show?
try {
message = JSON.parse(jqXHR.responseText).error;
if (typeof message === "object" && message.messages) {
// e.g. {"error": {"messages": [{"text": "Unknown user 'bob'!", "type": "error"}, ...]}} etc.
message = $.map(message.messages, function(msg) { return msg.text; }).join(", ");
}
} catch (error) { message = jqXHR.responseText.substr(0, 300); }
}
runtime.notify('error', {title: gettext("Unable to update settings"), message: message});
});
};
$('.save-button', element).bind('click', function(e) {
e.preventDefault();
var values = {};
var notSet = []; // List of field names that should be set to default values
for (var i in fields) {
var field = fields[i];
if (field.isSet()) {
values[field.name] = field.val();
} else {
notSet.push(field.name);
}
}
studio_submit({values: values, defaults: notSet});
});
$(element).find('.cancel-button').bind('click', function(e) {
e.preventDefault();
runtime.notify('cancel', {});
});
}