AutorÃa | Ultima modificación | Ver Log |
H5PEditor.metadataChangelogWidget = function (semantics, params, $wrapper, parent) {
if (!params.changes) {
params.changes = [];
}
var $ = H5PEditor.$;
// State
var state = {
editing: false,
newLog: false,
currentLog: undefined
};
var widget = $('<div class="field h5p-metadata-changelog"></div>');
H5PEditor.processSemanticsChunk(semantics, {}, widget, parent);
// Get a reference to the fields:
var changeField = H5PEditor.findField('change', parent);
var dateField = H5PEditor.findField('date', changeField);
var authorField = H5PEditor.findField('author', changeField);
var logField = H5PEditor.findField('log', changeField);
var $form = changeField.$content;
var $formFields = dateField.$item.add(authorField.$item).add(logField.$item);
// Add description
var $description = $('<div>', {
'class': 'h5peditor-field-description',
'text': H5PEditor.t('core', 'changelogDescription')
});
$form.append($description);
var $cancelButton = $('<button>', {
'class': 'h5p-metadata-button h5p-cancel',
type: 'button',
text: H5PEditor.t('core', 'cancel'),
click: function () {
resetForm();
state.editing = false;
state.currentLog = undefined;
render();
}
});
var $createLogButton = $('<button>', {
'class': 'h5p-metadata-button inverted h5p-log-change',
type: 'button',
text: H5PEditor.t('core', 'logThisChange'),
click: function () {
var entry = validateForm(false);
if (!entry.date || !entry.author || !entry.log) {
return;
}
if (state.currentLog !== undefined) {
params.changes[state.currentLog] = entry;
}
else {
params.changes.push(entry);
state.newLog = true;
}
state.editing = false;
resetForm();
render();
state.currentLog = undefined;
}
});
var $addLogButton = $('<button>', {
'class': 'h5p-metadata-button inverted h5p-add-author',
type: 'button',
text: H5PEditor.t('core', 'addNewChange'),
click: function () {
state.editing = true;
state.newLog = false;
resetForm();
render();
}
});
var $buttons = $('<div class="h5p-metadata-changelog-buttons"></div>');
$buttons.append($cancelButton);
$buttons.append($createLogButton);
$buttons.append($addLogButton);
$form.append($buttons);
var $newLogMessage = $('<div', {
'class': 'h5p-metadata-new-log-message',
text: H5PEditor.t('core', 'newChangeHasBeenLogged'),
appendTo: $form
});
var $logWrapper = $('<div>', {
'class': "h5p-metadata-logged-changes",
appendTo: $form
});
widget.appendTo($wrapper);
render();
function resetForm() {
dateField.$input.val('');
logField.$input.val('');
validateForm(true);
}
function render() {
$newLogMessage.toggle(state.newLog);
$description.toggle(!state.editing);
$addLogButton.toggle(!state.editing);
$cancelButton.toggle(state.editing);
$createLogButton.toggle(state.editing);
$formFields.toggle(state.editing);
if (state.editing) {
populateForm();
if (!dateField.$input.hasClass('datepicker')) {
dateField.$input.addClass('datepicker');
setupDatePicker(dateField.$input);
}
}
else {
renderLogWrapper();
}
$logWrapper.toggleClass('editing', state.editing);
}
function renderLogWrapper() {
$logWrapper.empty();
$logWrapper.append('<span class="h5peditor-label h5p-metadata-log-wrapper-title">'+ H5PEditor.t('core', 'loggedChanges') + '</span>');
if (params.changes.length == 0) {
$logWrapper.append($('<div class="h5peditor-field-description">' + H5PEditor.t('core', 'noChangesHaveBeenLogged') + '</div>'));
}
else {
var logList = $('<div class="h5p-metadata-log-wrapper"></div>');
$logWrapper.append(logList);
for (var i = 0; i < params.changes.length; i++) {
var log = params.changes[i];
var dateWrapper = $('<div>', {
'class': 'h5p-metadata-log-date',
html: H5PEditor.htmlspecialchars(log.date)
});
var logDescription = $('<div>', {
'class': 'h5p-metadata-log-description',
html: H5PEditor.htmlspecialchars(log.log)
});
var authorWrapper = $('<div>', {
'class': 'h5p-metadata-log-author',
html: 'by ' + H5PEditor.htmlspecialchars(log.author) // TODO - translate
});
var $descriptionWrapper = $('<div class="h5p-metadata-description-wrapper"></div>');
$descriptionWrapper.append(logDescription);
$descriptionWrapper.append(authorWrapper);
var logButtons = $('<div class="h5p-metadata-log-buttons">' +
'<button type="button" class="h5p-metadata-edit h5p-metadata-icon-button"></button>' +
'<button type="button" class="h5p-metadata-delete h5p-metadata-icon-button"></button>' +
'</div>');
logButtons.find('.h5p-metadata-delete').click(function () {
// Ask for confirmation
if (confirm(H5PEditor.t('core', 'confirmDeleteChangeLog'))) {
var wrapper = $(this).closest('.h5p-metadata-log');
var index = $(wrapper).data('index');
deleteLog(index);
}
});
logButtons.find('.h5p-metadata-edit').click(function () {
var wrapper = $(this).closest('.h5p-metadata-log');
var index = $(wrapper).data('index');
editLog(index);
});
var logContent = $('<div>', {
'class': 'h5p-metadata-log',
'data-index': i
});
logContent.append(dateWrapper);
logContent.append($descriptionWrapper);
logContent.append(logButtons);
logList.prepend(logContent);
}
}
}
function editLog(index) {
state.editing = true;
state.currentLog = index;
state.newLog = false;
render();
}
function deleteLog(index) {
params.changes.splice(index, 1);
render();
}
function validateForm(optional) {
dateField.field.optional = optional;
authorField.field.optional = optional;
logField.field.optional = optional;
return {
date: dateField.validate(),
author: authorField.validate(),
log: logField.validate()
};
}
function populateForm() {
if (state.currentLog !== undefined) {
validateForm(true);
var log = params.changes[state.currentLog];
dateField.$input.val(log.date);
// Unescape in case it comes from backend
var unescaper = document.createElement('div');
unescaper.innerHTML = H5PEditor.htmlspecialchars(log.author);
authorField.$input.val(unescaper.textContent);
unescaper.innerHTML = H5PEditor.htmlspecialchars(log.log);
logField.$input.val(unescaper.textContent);
}
}
/**
* Setup the datepicker. Loads the script if not already loaded
*/
function setupDatePicker($dateInput) {
var initDateField = function () {
$dateInput.Zebra_DatePicker({
format: 'd-m-y G:i:s',
onClose: function () {
dateField.validate();
}
});
};
// Make sure datepicker.js is only loaded once
$dateInput.Zebra_DatePicker ? initDateField() : loadDatePickerLib(initDateField);
}
/**
* Load the datepicker JS lib
*
* @param {Function} callback
*/
function loadDatePickerLib(callback) {
$.ajax({
url: H5PEditor.basePath + 'libs/zebra_datepicker.min.js',
dataType: 'script',
success: callback,
error: function (r,e) {
console.warn('error loading libraries: ', e);
},
async: true
});
}
};