HEX
Server: Apache
System: Linux webd011.cluster130.gra.hosting.ovh.net 5.15.167-ovh-vps-grsec-zfs-classid #1 SMP Tue Sep 17 08:14:20 UTC 2024 x86_64
User: ezpgggd (105871)
PHP: 7.4.33
Disabled: _dyuweyrj4,_dyuweyrj4r,dl
Upload Files
File: /home/ezpgggd/www/wp-content/plugins/wallsio/classic/js/tinymce.js
/*global jQuery */

import "../css/tinymce.scss";

import { fromDetails as wallUrlFromDetails, toDetails as wallUrlToDetails } from '../../shared/WallUrl';
import EditPopup from './EditPopup';


tinymce.PluginManager.add('wallsio', (editor) => {

  editor.addButton( 'wallsio_view_edit', {
    tooltip: 'Edit Wall',
    icon: 'dashicon dashicons-edit',
    onclick: onEditClick,
  });

  editor.addButton('wallsio_view_remove', {
    tooltip: 'Remove',
    icon: 'dashicon dashicons-no',
    onclick: () => editor.fire('cut'),
  });

  editor.on('init', () => {
    editor.on('Click', shimClickHandler, true);
    editor.on('DblClick', shimDblClickHandler);

    editor.on('wptoolbar', addToolbar, true);
  });

  function updateContent(node, values) {
    const url = wallUrlFromDetails(values);

    jQuery(node).data('rendered', false);

    editor.dom.setAttrib(node, 'data-wpview-text', encodeURIComponent(url));

    wp.mce.views.createInstance('embedURL', url, { url: true }, false).render();

    editor.selection.select(node);
    editor.nodeChanged();
    editor.focus();
  }

  function shimClickHandler(evt) {
    if (!isOurShim(evt.target)) {
      return;
    }

    // Prevent other code from disabling the shim
    evt.preventDefault();
    evt.stopPropagation();
    evt.stopImmediatePropagation();
  }

  function shimDblClickHandler(evt) {
    if (!isOurShim(evt.target)) {
      return;
    }

    const wpView = jQuery(evt.target).closest(wpViewSelector()).get(0);

    if (!isOurWpView(wpView)) {
      return;
    }

    evt.preventDefault();

    openEditPopupForView(wpView);
  }

  function openEditPopupForView(wpView) {
    const values = getCurrentValues(wpView);

    const popup = new EditPopup();

    popup.open(values, (values) => {
      updateContent(wpView, values);
    });
  }

  function addToolbar(evt) {
    const element = evt.element;

    if (!isOurWpView(element)) {
      return;
    }

    // Don't add other (native) toolbars to our element
    evt.preventDefault();
    evt.stopPropagation();
    evt.stopImmediatePropagation();

    evt.toolbar = editor.wp._createToolbar([
      'wallsio_view_edit',
      'wallsio_view_remove',
    ]);
  }

  function onEditClick() {
    const node = editor.selection.getNode();

    if (!isOurWpView(node)) {
      return;
    }

    openEditPopupForView(node);
  }

  function getCurrentValues(wpView) {
    const urlValue = jQuery(wpView).attr('data-wpview-text');

    if (!urlValue || typeof urlValue !== 'string') {
      return {};
    }

    const url = decodeURIComponent(urlValue);

    return wallUrlToDetails(url);
  }

  /**
   * Whether the element is a shim for an oembed which is handled by us
   *
   * @param  {HTMLElement}  element
   * @return {Boolean}
   */
  function isOurShim(element) {
    const selector = iframeSelector() + '~ .mce-shim';

    return matches(element, selector);
  }

  /**
   * Whether an element matches the given selector
   *
   * Works just like element.matches(selector)
   *
   * @param  {HTMLElement} element
   * @param  {string} selector
   *
   * @return {Boolean}
   */
  function matches(element, selector) {
    return jQuery(element).filter(selector).length > 0;
  }

  /**
   * Selector for oembed iframes which are handled by us
   *
   * @return {string}
   */
  function iframeSelector() {
    return '.wpview iframe[src^="https://my.walls.io/"]';
  }

  function wpViewSelector() {
    return '.wpview';
  }

  function isOurWpView(element) {
    return matches(element, wpViewSelector()) && hasChild(element, iframeSelector());
  }

  function hasChild(element, childSelector) {
    return element.querySelector(childSelector) !== null;
  }
});