123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /**
- * @file
- * Defines Javascript behaviors for the filefield_sources module.
- */
- (function ($, Drupal) {
- "use strict";
- // Behavior to add source options to configured fields.
- Drupal.behaviors.fileFieldSources = {};
- Drupal.behaviors.fileFieldSources.attach = function(context, settings) {
- $('div.filefield-sources-list:not(.filefield-sources-processed)', context).each(function() {
- $(this).addClass('filefield-sources-processed');
- var $fileFieldElement = $(this).parents('div.form-managed-file:first');
- $(this).find('a').click(function() {
- // Remove the active class.
- $(this).parents('div.filefield-sources-list').find('a.active').removeClass('active');
- // Find the unique FileField Source class name.
- var fileFieldSourceClass = this.className.match(/filefield-source-[0-9a-z_]+/i)[0];
- // The default upload element is a special case.
- if ($(this).is('.filefield-source-upload')) {
- $fileFieldElement.find('div.filefield-sources-list').siblings('.form-file, .form-submit').css('display', '');
- $fileFieldElement.find('div.filefield-source').css('display', 'none');
- }
- else {
- $fileFieldElement.find('div.filefield-sources-list').siblings('.form-file, .form-submit').css('display', 'none');
- $fileFieldElement.find('div.filefield-source').not('div.' + fileFieldSourceClass).css('display', 'none');
- $fileFieldElement.find('div.' + fileFieldSourceClass).css('display', '');
- }
- // Add the active class.
- $(this).addClass('active');
- Drupal.fileFieldSources.updateHintText($fileFieldElement.get(0));
- }).first().triggerHandler('click');
- // Clipboard support.
- $fileFieldElement.find('.filefield-source-clipboard-capture')
- .bind('paste', Drupal.fileFieldSources.pasteEvent)
- .bind('focus', Drupal.fileFieldSources.pasteFocus)
- .bind('blur', Drupal.fileFieldSources.pasteBlur);
- // Imce support.
- $fileFieldElement.find('.filefield-sources-imce-browse')
- .bind('click', Drupal.fileFieldSources.imceBrowse);
- });
- if (context === document) {
- $('form').submit(function() {
- Drupal.fileFieldSources.removeHintText();
- });
- }
- };
- // Helper functions used by FileField Sources.
- Drupal.fileFieldSources = {
- /**
- * Update the hint text when clicking between source types.
- */
- updateHintText: function(fileFieldElement) {
- // Add default value hint text to text fields.
- $(fileFieldElement).find('div.filefield-source').each(function() {
- var matches = this.className.match(/filefield-source-([a-z]+)/);
- var sourceType = matches[1];
- var textfield = $(this).find('input.form-text:first').get(0);
- var defaultText = (drupalSettings.fileFieldSources && drupalSettings.fileFieldSources[sourceType]) ? drupalSettings.fileFieldSources[sourceType].hintText : '';
- // If the field doesn't exist, just return.
- if (!textfield) {
- return;
- }
- // If this field is not shown, remove its value and be done.
- if (!$(this).is(':visible') && textfield.value == defaultText) {
- textfield.value = '';
- return;
- }
- // Set a default value:
- if (textfield.value == '') {
- textfield.value = defaultText;
- }
- // Set a default class.
- if (textfield.value == defaultText) {
- $(textfield).addClass('hint');
- }
- $(textfield).focus(hideHintText);
- $(textfield).blur(showHintText);
- function showHintText() {
- if (this.value == '') {
- this.value = defaultText;
- $(this).addClass('hint');
- }
- }
- function hideHintText() {
- if (this.value == defaultText) {
- this.value = '';
- $(this).removeClass('hint');
- }
- }
- });
- },
- /**
- * Delete all hint text from a form before submit.
- */
- removeHintText: function() {
- $('div.filefield-source input.hint').val('').removeClass('hint');
- },
- /**
- * Clean up the default value on focus.
- */
- pasteFocus: function(e) {
- // Set default text.
- if (!this.defaultText) {
- this.defaultText = this.innerHTML;
- this.innerHTML = '';
- }
- // Remove non-text nodes.
- $(this).children().remove();
- },
- /**
- * Restore default value on blur.
- */
- pasteBlur: function(e) {
- if (this.defaultText && !this.innerHTML) {
- this.innerHTML = this.defaultText;
- }
- },
- pasteEvent: function(e) {
- var clipboardData = null;
- var targetElement = this;
- var userAgent = navigator.userAgent.toLowerCase();
- // Chrome.
- if (window.event && window.event.clipboardData && window.event.clipboardData.items) {
- clipboardData = window.event.clipboardData;
- }
- // All browsers in the future (hopefully).
- else if (e.originalEvent && e.originalEvent.clipboardData && e.originalEvent.clipboardData.items) {
- clipboardData = e.originalEvent.clipboardData;
- }
- // Firefox with content editable pastes as img tag with data href.
- else if (userAgent.match(/mozilla/) && !userAgent.match(/webkit/)) {
- Drupal.fileFieldSources.waitForPaste(targetElement);
- return true;
- }
- else {
- Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('Paste from clipboard not supported in this browser.'));
- return false;
- }
- var items = clipboardData.items;
- var types = clipboardData.types;
- var filename = targetElement.firstChild ? targetElement.firstChild.textContent : '';
- // Handle files and image content directly in the clipboard.
- var fileFound = false;
- for (var n = 0; n < items.length; n++) {
- if (items[n] && items[n].kind === 'file') {
- var fileBlob = items[n].getAsFile();
- var fileReader = new FileReader();
- // Define events to fire after the file is read into memory.
- fileReader.onload = function() {
- Drupal.fileFieldSources.pasteSubmit(targetElement, filename, this.result);
- };
- fileReader.onerror = function() {
- Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('Error reading file from clipboard.'));
- };
- // Read in the file to fire the above events.
- fileReader.readAsDataURL(fileBlob);
- fileFound = true;
- break;
- }
- // Handle files that a copy/pasted as a file reference.
- /* if (types[n] && types[n] === 'Files') {
- TODO: Figure out how to capture copy/paste of entire files from desktop.
- }*/
- }
- if (!fileFound) {
- Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('No file in clipboard.'));
- }
- return false;
- },
- /**
- * For browsers that don't support native clipboardData attributes.
- */
- waitForPaste: function(targetElement) {
- if (targetElement.children && targetElement.children.length > 0) {
- var filename = targetElement.firstChild ? targetElement.firstChild.textContent : '';
- var tagFound = false;
- $(targetElement).find('img[src^="data:image"]').each(function(n, element) {
- Drupal.fileFieldSources.pasteSubmit(targetElement, filename, element.src);
- tagFound = true;
- });
- $(targetElement).html(filename);
- if (!tagFound) {
- Drupal.fileFieldSources.pasteError(targetElement, Drupal.t('No file in clipboard.'));
- }
- }
- else {
- setTimeout(function() {
- Drupal.fileFieldSources.waitForPaste(targetElement);
- }, 200);
- }
- },
- /**
- * Set an error on the paste field temporarily then clear it.
- */
- pasteError: function(domElement, errorMessage) {
- var $description = $(domElement).parents('.filefield-source-clipboard:first').find('.description');
- if (!$description.data('originalDescription')) {
- $description.data('originalDescription', $description.html())
- }
- $description.html(errorMessage);
- var errorTimeout = setTimeout(function() {
- $description.html($description.data('originalDescription'));
- $(this).unbind('click.pasteError');
- }, 3000);
- $(domElement).bind('click.pasteError', function() {
- clearTimeout(errorTimeout);
- $description.html($description.data('originalDescription'));
- $(this).unbind('click.pasteError');
- });
- },
- /**
- * After retreiving a clipboard, post the results to the server.
- */
- pasteSubmit: function(targetElement, filename, contents) {
- var $wrapper = $(targetElement).parents('.filefield-source-clipboard');
- $wrapper.find('.filefield-source-clipboard-filename').val(filename);
- $wrapper.find('.filefield-source-clipboard-contents').val(contents);
- $wrapper.find('input.form-submit').trigger('mousedown');
- },
- /**
- * Click event for the imce browse link.
- */
- imceBrowse: function (e) {
- window.open(this.href, '', 'width=760,height=560,resizable=1');
- e.preventDefault();
- }
- };
- // Override triggerUploadButton method from file.js.
- Drupal.file.triggerUploadButton = function (event) {
- $(event.target).closest('.form-managed-file').find('.form-submit.upload-button').trigger('mousedown');
- }
- })(jQuery, Drupal);
|