From e45e8b2abe3f5906bbc3418e4d20827e443cc410 Mon Sep 17 00:00:00 2001 From: Angie Byron Date: Wed, 13 Oct 2010 17:09:00 +0000 Subject: #902644 follow-up: Committing missing JS file. --- misc/machine-name.js | 110 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 misc/machine-name.js (limited to 'misc') diff --git a/misc/machine-name.js b/misc/machine-name.js new file mode 100644 index 000000000..befbc0efd --- /dev/null +++ b/misc/machine-name.js @@ -0,0 +1,110 @@ +// $Id$ +(function ($) { + +/** + * Attach the machine-readable name form element behavior. + */ +Drupal.behaviors.machineName = { + /** + * Attaches the behavior. + * + * @param settings.machineName + * A list of elements to process, keyed by the HTML ID of the form element + * containing the human-readable value. Each element is an object defining + * the following properties: + * - target: The HTML ID of the machine name form element. + * - suffix: The HTML ID of a container to show the machine name preview in + * (usually a field suffix after the human-readable name form element). + * - label: The label to show for the machine name preview. + * - replace_pattern: A regular expression (without modifiers) matching + * disallowed characters in the machine name; e.g., '[^a-z0-9]+'. + * - replace: A character to replace disallowed characters with; e.g., '_' + * or '-'. + */ + attach: function (context, settings) { + var self = this; + $.each(settings.machineName, function (source_id, options) { + var $source = $(source_id, context).addClass('machine-name-source'); + var $target = $(options.target, context).addClass('machine-name-target'); + var $suffix = $(options.suffix, context); + var $wrapper = $target.parents('.form-item:first'); + // All elements have to exist. + if (!$source.length || !$target.length || !$suffix.length || !$wrapper.length) { + return; + } + // Skip processing upon a form validation error on the machine name. + if ($target.hasClass('error')) { + return; + } + // Hide the form item container of the machine name form element. + $wrapper.hide(); + // Append the machine name preview to the source field. + if ($target.is(':disabled')) { + var machine = $target.val(); + } + else { + var machine = self.transliterate($source.val(), options); + } + var $preview = $('' + machine + ''); + $suffix.empty() + .append(' ').append('' + options.label + ':') + .append(' ').append($preview); + + // Append a link to edit the machine name, if it is editable, and only if + // one of the following conditions is met: + // - the machine name is empty. + // - the human-readable name is equal to the existing machine name. + if (!$target.is(':disabled') && ($target.val() == '' || $target.val() == machine)) { + var $link = $('' + Drupal.t('Edit') + '') + .click(function () { + $wrapper.show(); + $target.focus(); + $suffix.hide(); + $source.unbind('keyup.machineName'); + return false; + }); + $suffix.append(' ').append($link); + + // Preview machine name in realtime when the human-readable name changes. + $source.bind('keyup.machineName change.machineName', function () { + machine = self.transliterate($(this).val(), options); + // Set the machine name to the transliterated value. + if (machine != options.replace && machine != '') { + $target.val(machine); + $preview.text(machine); + $suffix.show(); + } + else { + $suffix.hide(); + $target.val(machine); + $preview.empty(); + } + }); + // Initialize machine name preview. + $source.keyup(); + } + }); + }, + + /** + * Transliterate a human-readable name to a machine name. + * + * @param source + * A string to transliterate. + * @param settings + * The machine name settings for the corresponding field, containing: + * - replace_pattern: A regular expression (without modifiers) matching + * disallowed characters in the machine name; e.g., '[^a-z0-9]+'. + * - replace: A character to replace disallowed characters with; e.g., '_' + * or '-'. + * + * @return + * The transliterated source string. + */ + transliterate: function (source, settings) { + var rx = new RegExp(settings.replace_pattern, 'g'); + return source.toLowerCase().replace(rx, settings.replace); + } +}; + +})(jQuery); -- cgit v1.2.3