ckeditor5-1.0.x-dev/js/ie11.user.warnings.js

js/ie11.user.warnings.js
/**
 * @file
 * Provide warnings when attempting to load CKEditor 5 on IE11.
 */

(function (Drupal, Modernizr) {
  const isIE11 = Modernizr.mq('(-ms-high-contrast: active), (-ms-high-contrast: none)');

  // If the browser is IE11, create an alternate version of
  // Drupal.editors.ckeditor5 that provides warnings. In IE11, the incompatible
  // Javascript of CKEditor 5 prevents Drupal.editors.ckeditor5 from being
  // created. Features such as Quick Edit that require the presence of a
  // Drupal.editors.ckeditor5, even for fields that do not use CKEditor 5.
  if (isIE11) {
    // This will reference a MutationObserver used by several functions in
    // Drupal.editors.ckeditor5. It is declared here and not the editor object
    // in order to work with IE11 object scope.
    let quickEditLabelObserver = null;

    /**
     * @namespace
     */
    Drupal.editors.ckeditor5 = {
      /**
       * Provides a warning when trying to attach CKEditor 5 to a field in IE11.
       *
       * @param {HTMLElement} element
       *   The element the editor would have been attached to.
       */
      attach: function attach(element) {
        // Add a Drupal.Message container above the textarea and use it to
        // provide a warning message to IE11 users.
        const editorMessageContainer = document.createElement('div');
        element.parentNode.insertBefore(editorMessageContainer, element);
        const editorMessages = new Drupal.Message(editorMessageContainer);
        editorMessages.add(Drupal.t('Internet Explorer 11 user: a rich text editor is available for this field when used with any other supported browser.'), {
          type: 'warning'
        });
      },

      /**
       * Editor detach callback.
       */
      detach: function detach() {
        const quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');
        if (quickEditToolbar) {
          // Remove classes that style the Quick Edit toolbar as a warning.
          quickEditToolbar.classList.remove('ck5-ie11');
          quickEditToolbar.classList.add('icon-pencil');

          // Disconnect the observer from the Quick Edit label that converts the
          // label to a warning. A warning isn't needed for fields not using
          // CKEditor 5.
          quickEditLabelObserver.disconnect();
        }
      },

      /**
       * Registers a callback which CKEditor 5 will call on change:data event.
       */
      onChange: function onChange(element, callback) {
        // Intentionally empty.
      },

      /**
       * Provides a warning when Quick Edit tries to attach CKEditor 5 in IE11.
       *
       * @param {HTMLElement} element
       *   The element the editor would have been attached to.
       *
       * @see Drupal.quickedit.editors.editor
       */
      attachInlineEditor: function attachInlineEditor(element) {
        const quickEditToolbar = document.querySelector('#quickedit-entity-toolbar .quickedit-toolbar');

        if (quickEditToolbar) {
          quickEditToolbar.classList.add('ck5-ie11');
          quickEditToolbar.classList.remove('icon-pencil');
          element.classList.add('ck5-ie11');

          // Prepare variables that will be used for changing the QuickEdit
          // toolbar label to a warning.
          const toolbarLabel = quickEditToolbar.querySelector('.quickedit-toolbar-label');
          const notEditableAlert = Drupal.t('Field Not Editable');
          const notEditableMessage = Drupal.t('CKEditor 5 is not compatible with IE11.');

          /**
           * Changes the Quick Edit label to a warning.
           */
          function quickEditLabelWarnIE11() {
            // Disconnect the observer to prevent infinite recursion.
            quickEditLabelObserver.disconnect();

            // Change the quickEdit toolbar label to a warning that informs
            // IE11 users that they can't edit the field due to CKEditor not
            // working with IE11.
            toolbarLabel.innerHTML = '<div><b>' + notEditableAlert + '</b><div>' + notEditableMessage + '</div></div>';
            quickEditLabelObserver.observe(toolbarLabel, { childList: true });
          }

          /**
           * MutationObserver callback for the Quick Edit label.
           *
           * @param mutations
           *   The element's mutations.
           */
          function whenQuickEditLabelChanges(mutations) {
            for (i = 0; i < mutations.length; i++) {
              if (mutations[i].type === 'childList') {
                quickEditLabelWarnIE11();
              }
            }
          }

          // Updating the Quick Edit label to display as a warning is triggered
          // via an observer. An observer us used as there are multiple
          // Quick Edit Backbone View events that alter the contents of this
          // label. An observer is used to guarantee the warning persists
          // without having to override multiple Backbone event handlers.
          quickEditLabelObserver = new MutationObserver(whenQuickEditLabelChanges);
          quickEditLabelObserver.observe(toolbarLabel, { childList: true });
        }
      },
    }
  }
})(Drupal, Modernizr);

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc