149 lines
5.2 KiB
JavaScript

(function($) {
/**
* Context plugin form.
*/
function DrupalContextPlugins(form) {
this.form = form;
// Sync the form selector and state field with the list of plugins currently enabled.
this.setState = function() {
var state = [];
$('.context-plugin-list > li', this.form).each(function() {
var plugin = $(this).attr('class').split('context-plugin-')[1].split(' ')[0];
if ($(this).is('.disabled')) {
$('.context-plugin-selector select option[value="'+plugin+'"]', this.form).show();
}
else {
state.push(plugin);
$('.context-plugin-selector select option[value="'+plugin+'"]', this.form).hide();
}
});
// Set the hidden plugin list state.
$('.context-plugin-selector input.context-plugins-state', this.form).val(state.join(','));
// Reset the selector.
$('.context-plugin-selector select', this.form).val(0);
return this;
};
// Add a plugin to the list.
this.addPlugin = function(plugin) {
$('.context-plugin-list > li.context-plugin-'+plugin, this.form).removeClass('disabled');
this.showForm(plugin).setState();
return this;
};
// Remove a plugin from the list.
this.removePlugin = function(plugin) {
$('.context-plugin-list > li.context-plugin-'+plugin, this.form).addClass('disabled');
this.hideForm(plugin).setState();
return this;
};
// Show a plugin form.
this.showForm = function(plugin) {
$('.context-plugin-forms > .context-plugin-form.active-form', this.form).removeClass('active-form');
$('.context-plugin-forms > .context-plugin-form-'+plugin, this.form).addClass('active-form');
$('.context-plugin-list > li > a').removeClass('active-form');
$('.context-plugin-list > li.context-plugin-'+plugin+' > a').addClass('active-form');
return this;
};
// Show a plugin form.
this.hideForm = function(plugin) {
$('.context-plugin-forms > .context-plugin-form-'+plugin, this.form).removeClass('active-form');
$('.context-plugin-list > li.context-plugin-'+plugin+' > a').removeClass('active-form');
return this;
};
// Select handler.
$('.context-plugin-selector select', this.form).change(function() {
var plugins = $(this).parents('div.context-plugins').data('contextPlugins');
if (plugins) {
var plugin = $(this).val();
plugins.addPlugin(plugin);
}
});
// Show form handler.
$('.context-plugin-list > li > a', this.form).click(function() {
var plugins = $(this).parents('div.context-plugins').data('contextPlugins');
if (plugins) {
var plugin = $(this).attr('href').split('#context-plugin-form-')[1];
plugins.showForm(plugin);
}
return false;
});
// Remove handler.
$('.context-plugin-list span.remove', this.form).click(function() {
var plugins = $(this).parents('div.context-plugins').data('contextPlugins');
if (plugins) {
var plugin = $(this).parent().attr('href').split('#context-plugin-form-')[1];
plugins.removePlugin(plugin);
}
return false;
});
// Set the plugin states.
this.setState();
}
Drupal.behaviors.context_ui = { attach: function(context) {
// Initialize context plugin form.
$('form div.context-plugins:not(.context-ui-processed)').each(function() {
$(this).addClass('context-ui-processed');
$(this).data('contextPlugins', new DrupalContextPlugins($(this)));
});
// Initialize context editor.
if ($().pageEditor) {
$('form.context-editor:not(.context-ui-processed)')
.addClass('context-ui-processed')
.pageEditor()
.each(function() {
var editor = $(this);
var defaultContext = $('li.context-editable', this).attr('id').split('context-editable-trigger-')[1];
$(this).data('defaultContext', defaultContext);
// Attach start/end handlers to editable contexts.
$('li.context-editable a.edit', editor).click(function() {
var trigger = $(this).parents('li.context-editable').addClass('context-editing');
var context = trigger.attr('id').split('context-editable-trigger-')[1];
editor.pageEditor('start', context);
return false;
});
$('li.context-editable a.done', editor).click(function() {
editor.pageEditor('end');
return false;
});
$(editor).submit(function() {
if (editor.pageEditor('isEditing')) {
editor.pageEditor('end');
}
});
// Handler for start event.
editor.bind('start.pageEditor', function(event, context) {
// Fallback to first context if param is empty.
if (!context) {
context = $(this).data('defaultContext');
$('li#context-editable-trigger-'+context, this).addClass('context-editing');
}
$(document.body).addClass('context-editing');
$('#context-editable-'+context, this).show();
});
// Handler for end event.
editor.bind('end.pageEditor', function(event, context) {
$(document.body).removeClass('context-editing');
$('div.contexts div.context-editable', this).hide();
$('li.context-editable').removeClass('context-editing');
$('form.context-editor').addClass('edited');
});
});
}
}};
})(jQuery);