123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150 |
- /**
- * @file
- * Linkit field ui functions
- */
- (function($, behavior) {
- 'use strict';
- Drupal.behaviors[behavior] = {
- attach: function(context, settings) {
- // If there is no fields, just stop here.
- if (undefined === settings.linkit || null === settings.linkit.fields) {
- return false;
- }
- $.each(settings.linkit.fields, function(i, instance) {
- $('#' + instance.source, context).once(behavior, function() {
- var element = this;
- $('.linkit-field-' + instance.source).click(function(event) {
- event.preventDefault();
- // Only care about selection if the element is a textarea.
- if ('textarea' === element.nodeName.toLowerCase()) {
- instance.selection = Drupal.linkit.getDialogHelper('field').getSelection(element);
- }
- Drupal.settings.linkit.currentInstance = instance;
- Drupal.linkit.createModal();
- });
- });
- });
- }
- };
- /**
- * Linkit field dialog helper.
- */
- Drupal.linkit.registerDialogHelper('field', {
- afterInit: function() {},
- /**
- * Insert the link into the field.
- *
- * @param {Object} data
- * The link object.
- */
- insertLink: function(data) {
- var instance = Drupal.settings.linkit.currentInstance,
- // Call the insert plugin.
- link = Drupal.linkit.getInsertPlugin(instance.insertPlugin).insert(data, instance);
- if (instance.hasOwnProperty('selection')) {
- // Replace the selection and insert the link there.
- this.replaceSelection(instance.source, instance.selection, link);
- }
- else if (instance.hasOwnProperty('titleField')) {
- // The "linkContent" property will always be present when AJAX used.
- // Otherwise, if you use simple insert without autocomplete, then this
- // property will be undefined and title field should not be filled in.
- //
- // @see Drupal.behaviors.linkitSearch.attach
- if (instance.hasOwnProperty('linkContent')) {
- this.replaceFieldValue(instance.titleField, instance.linkContent);
- }
- // The "path" property will always be present after dialog was
- // opened and contain raw URL.
- //
- // @see Drupal.behaviors.linkitDashboard.attach
- this.replaceFieldValue(instance.source, data.path);
- }
- else {
- // Replace the field value.
- this.replaceFieldValue(instance.source, link);
- }
- },
- /**
- * Get field selection.
- */
- getSelection: function(element) {
- var object = {
- start: element.value.length,
- end: element.value.length,
- length: 0,
- text: ''
- };
- // Mozilla and DOM 3.0.
- if ('selectionStart' in element) {
- var length = element.selectionEnd - element.selectionStart;
- object = {
- start: element.selectionStart,
- end: element.selectionEnd,
- length: length,
- text: element.value.substr(element.selectionStart, length)
- };
- }
- // IE.
- else if (document.selection) {
- element.focus();
- var range = document.selection.createRange(),
- textRange = element.createTextRange(),
- textRangeDuplicate = textRange.duplicate();
- textRangeDuplicate.moveToBookmark(range.getBookmark());
- textRange.setEndPoint('EndToStart', textRangeDuplicate);
- if (!(range || textRange)) {
- return object;
- }
- // For some reason IE doesn't always count the \n and \r in the length.
- var text_part = range.text.replace(/[\r\n]/g, '.'),
- text_whole = element.value.replace(/[\r\n]/g, '.'),
- the_start = text_whole.indexOf(text_part, textRange.text.length);
- object = {
- start: the_start,
- end: the_start + text_part.length,
- length: text_part.length,
- text: range.text
- };
- }
- return object;
- },
- /**
- * Replace the field selection.
- */
- replaceSelection: function(id, selection, text) {
- var field = this.getField(id);
- field.value = field.value.substr(0, selection.start) + text + field.value.substr(selection.end, field.value.length);
- },
- /**
- * Replace the field value.
- */
- replaceFieldValue: function(id, text) {
- this.getField(id).value = text;
- },
- getField: function(id) {
- return document.getElementById(id);
- }
- });
- })(jQuery, 'linkitField');
|