Bloque de desplazamiento del editor de Gutenberg a la vista

4 minutos de lectura

avatar de usuario
niklas

¿Cómo puedo desplazar un bloque recién insertado a la vista en el editor de wordpress gutenberg?

Estoy creando el bloque con

const nextBlock = createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );
//scroll the block into the view

También he visto que gutenberg usa el dom-scroll-into-view paquete como por ejemplo aquí.

Su documentación dice:

var scrollIntoView = require('dom-scroll-into-view');
scrollIntoView(source,container,config);

pero, ¿cómo puedo hacer que funcione en mi caso, cómo obtener los elementos DOM de origen y contenedor?

  • Me pregunto si podrías usar const blockNode = getBlockDOMNode( blockId ) y const scrollContainer = getScrollContainer( blockNode ) como en MultiSelectScrollIntoView. tal vez como scrollIntoView( blockNode, scrollContainer, { onlyScrollIfNeeded: true, } ); . ¿Tenemos el ID de bloque de nextBlock.id o con el 'block-' prefijo?

    – birgire

    22 de junio de 2019 a las 15:35


  • ¿Puedes crear un JSFiddle para esto para que podamos reproducir tu problema?

    – Lajos Arpad

    23 de junio de 2019 a las 13:07

  • Bueno, supongo que no. Es la instalación predeterminada de wordpress con muchos archivos js y css específicos de wordpress. Para reproducir, uno tendría que configurar un entorno de wordpress con wordpress> 5.0 … pero tal vez encuentre un patio de juegos de wordpress en línea en algún lugar.

    – Nicolás

    23 de junio de 2019 a las 13:29


avatar de usuario
Sally C.J.

en mi caso, ¿cómo obtener los elementos DOM fuente y contenedor?

En realidad es bastante fácil… solo usa document.querySelector() para obtener el nodo de bloque y luego wp.dom.getScrollContainer() para obtener el contenedor de ese nodo:

const nextBlock = wp.blocks.createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = document.querySelector( '[data-block="' + nextBlock.clientId + '"]' );
const container = wp.dom.getScrollContainer( source );

Referencias: Una Dos

Y aquí está mi código:

/**
 * External dependencies
 */
import scrollIntoView from 'dom-scroll-into-view';

/**
 * WordPress dependencies
 */
import { createBlock } from '@wordpress/blocks';     // wp.blocks.createBlock
import { dispatch } from '@wordpress/data';          // wp.data.dispatch
import { getScrollContainer } from '@wordpress/dom'; // wp.dom.getScrollContainer

function getBlockDOMNode( clientId ) {
    return document.querySelector( '[data-block="' + clientId + '"]' );
}

const nextBlock = createBlock( 'core/paragraph' );
dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = getBlockDOMNode( nextBlock.clientId );
const container = source ? getScrollContainer( source ) : null;
if ( source && container ) {
    scrollIntoView( source, container );
}

ACTUALIZAR

Para probar el importeducar scrollIntoView()prueba esto:

function scrollBlockIntoView( block ) {
    const source = getBlockDOMNode( block.clientId );
    const container = source ? getScrollContainer( source ) : null;
    if ( source && container ) {
        console.log( source, container );
        scrollIntoView( source, container );
    }
}

window.scrollBlockIntoView = function( block ) {
    scrollBlockIntoView( block || {} );
};

Y luego desde la consola del navegador, ejecute esto:

scrollBlockIntoView( wp.data.select('core/editor').getBlocks()[1] )

Pero asegúrese de tener al menos dos bloques en el editor, por ejemplo, un párrafo con un contenido extenso y un bloque de imagen.

Probado y probado trabajando en Chrome (Windows 10).

  • ¿Te funciona? La fuente y el contenedor son válidos y parecen ser los elementos correctos, pero no se desplaza.

    – Nicolás

    27 de junio de 2019 a las 12:58

  • Su solución solo funciona en safari, pero creo que la respuesta es completa, correcta y cercana a lo que necesitaba. Supongo que es un dom-scroll-into-view ¿tema? ¿O podríamos estar usándolo mal?

    – Nicolás

    27 de junio de 2019 a las 13:02

  • Así que estoy en WordPress 5.2.2. Y en realidad, el insertBlock() call en realidad desplaza automáticamente el bloque insertado a la vista, sin tener que llamar scrollIntoView(). y si, el scrollIntoView() en mi código funciona correctamente.

    – Sally C.J.

    27 de junio de 2019 a las 14:16

dom-scroll-into-view es un paquete NPM en sí mismo en https://github.com/yiminghe/dom-scroll-into-view

Tienen una demo disponible en http://yiminghe.me/dom-scroll-into-view/examples/demo.html

Y su código fuente principal es https://github.com/yiminghe/dom-scroll-into-view/blob/master/src/dom-scroll-into-view.js


Respuesta corta:

  • source es el elemento HTML que desea mostrar.

  • container es su elemento contenedor, o simplemente puede ponerlo para que sea window si no tiene un contenedor particular que envuelva su elemento.

  • Finalmente config es un objeto opcional que le permite configurar algunos ajustes finos como un poco de margen en la parte superior izquierda si no desea que esto toque el borde superior exacto del navegador. Puedes empezar pasando {} a eso por ahora.

  • Lo sé, pero no puedo imaginarme ese uso concreto en el caso de Gutenberg.

    – Nicolás

    23 de junio de 2019 a las 0:53

  • @niklas scrollIntoView necesita elementos DOM ya que es una acción DOM pura. Y React no recomienda acceder a elementos DOM explícitamente. La única solución es usar ref que es exactamente lo que el último tipo que agregó scrollIntoView a gutenberg ha hecho. Aquí está el PR que puedes seguir: github.com/WordPress/gutenberg/commit/… . Básicamente, solo agregue una referencia a sus bloques creados, luego obtenga DOM usando esa referencia y pásela a scrollIntoView.

    – Ayuda en

    24 de junio de 2019 a las 1:37

  • y ¿cómo agregar referencias al “contenedor del editor de bloques”?

    – Nicolás

    24 de junio de 2019 a las 9:26

  • @niklas, es posible que puedas dejarlo así window y ver cómo funciona. De lo contrario, puedes seguir this.inserterResults en el PR que compartí.

    – Ayuda en

    24 de junio de 2019 a las 21:57

¿Ha sido útil esta solución?

Bloque de desplazamiento del editor de Gutenberg a la vista

4 minutos de lectura

avatar de usuario
niklas

¿Cómo puedo desplazar un bloque recién insertado a la vista en el editor de wordpress gutenberg?

Estoy creando el bloque con

const nextBlock = createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );
//scroll the block into the view

También he visto que gutenberg usa el dom-scroll-into-view paquete como por ejemplo aquí.

Su documentación dice:

var scrollIntoView = require('dom-scroll-into-view');
scrollIntoView(source,container,config);

pero, ¿cómo puedo hacer que funcione en mi caso, cómo obtener los elementos DOM de origen y contenedor?

  • Me pregunto si podrías usar const blockNode = getBlockDOMNode( blockId ) y const scrollContainer = getScrollContainer( blockNode ) como en MultiSelectScrollIntoView. tal vez como scrollIntoView( blockNode, scrollContainer, { onlyScrollIfNeeded: true, } ); . ¿Tenemos el ID de bloque de nextBlock.id o con el 'block-' prefijo?

    – birgire

    22 de junio de 2019 a las 15:35


  • ¿Puedes crear un JSFiddle para esto para que podamos reproducir tu problema?

    – Lajos Arpad

    23 de junio de 2019 a las 13:07

  • Bueno, supongo que no. Es la instalación predeterminada de wordpress con muchos archivos js y css específicos de wordpress. Para reproducir, uno tendría que configurar un entorno de wordpress con wordpress> 5.0 … pero tal vez encuentre un patio de juegos de wordpress en línea en algún lugar.

    – Nicolás

    23 de junio de 2019 a las 13:29


avatar de usuario
Sally C.J.

en mi caso, ¿cómo obtener los elementos DOM fuente y contenedor?

En realidad es bastante fácil… solo usa document.querySelector() para obtener el nodo de bloque y luego wp.dom.getScrollContainer() para obtener el contenedor de ese nodo:

const nextBlock = wp.blocks.createBlock( 'core/paragraph' );
wp.data.dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = document.querySelector( '[data-block="' + nextBlock.clientId + '"]' );
const container = wp.dom.getScrollContainer( source );

Referencias: Una Dos

Y aquí está mi código:

/**
 * External dependencies
 */
import scrollIntoView from 'dom-scroll-into-view';

/**
 * WordPress dependencies
 */
import { createBlock } from '@wordpress/blocks';     // wp.blocks.createBlock
import { dispatch } from '@wordpress/data';          // wp.data.dispatch
import { getScrollContainer } from '@wordpress/dom'; // wp.dom.getScrollContainer

function getBlockDOMNode( clientId ) {
    return document.querySelector( '[data-block="' + clientId + '"]' );
}

const nextBlock = createBlock( 'core/paragraph' );
dispatch( 'core/editor' ).insertBlock( nextBlock );

const source = getBlockDOMNode( nextBlock.clientId );
const container = source ? getScrollContainer( source ) : null;
if ( source && container ) {
    scrollIntoView( source, container );
}

ACTUALIZAR

Para probar el importeducar scrollIntoView()prueba esto:

function scrollBlockIntoView( block ) {
    const source = getBlockDOMNode( block.clientId );
    const container = source ? getScrollContainer( source ) : null;
    if ( source && container ) {
        console.log( source, container );
        scrollIntoView( source, container );
    }
}

window.scrollBlockIntoView = function( block ) {
    scrollBlockIntoView( block || {} );
};

Y luego desde la consola del navegador, ejecute esto:

scrollBlockIntoView( wp.data.select('core/editor').getBlocks()[1] )

Pero asegúrese de tener al menos dos bloques en el editor, por ejemplo, un párrafo con un contenido extenso y un bloque de imagen.

Probado y probado trabajando en Chrome (Windows 10).

  • ¿Te funciona? La fuente y el contenedor son válidos y parecen ser los elementos correctos, pero no se desplaza.

    – Nicolás

    27 de junio de 2019 a las 12:58

  • Su solución solo funciona en safari, pero creo que la respuesta es completa, correcta y cercana a lo que necesitaba. Supongo que es un dom-scroll-into-view ¿tema? ¿O podríamos estar usándolo mal?

    – Nicolás

    27 de junio de 2019 a las 13:02

  • Así que estoy en WordPress 5.2.2. Y en realidad, el insertBlock() call en realidad desplaza automáticamente el bloque insertado a la vista, sin tener que llamar scrollIntoView(). y si, el scrollIntoView() en mi código funciona correctamente.

    – Sally C.J.

    27 de junio de 2019 a las 14:16

dom-scroll-into-view es un paquete NPM en sí mismo en https://github.com/yiminghe/dom-scroll-into-view

Tienen una demo disponible en http://yiminghe.me/dom-scroll-into-view/examples/demo.html

Y su código fuente principal es https://github.com/yiminghe/dom-scroll-into-view/blob/master/src/dom-scroll-into-view.js


Respuesta corta:

  • source es el elemento HTML que desea mostrar.

  • container es su elemento contenedor, o simplemente puede ponerlo para que sea window si no tiene un contenedor particular que envuelva su elemento.

  • Finalmente config es un objeto opcional que le permite configurar algunos ajustes finos como un poco de margen en la parte superior izquierda si no desea que esto toque el borde superior exacto del navegador. Puedes empezar pasando {} a eso por ahora.

  • Lo sé, pero no puedo imaginarme ese uso concreto en el caso de Gutenberg.

    – Nicolás

    23 de junio de 2019 a las 0:53

  • @niklas scrollIntoView necesita elementos DOM ya que es una acción DOM pura. Y React no recomienda acceder a elementos DOM explícitamente. La única solución es usar ref que es exactamente lo que el último tipo que agregó scrollIntoView a gutenberg ha hecho. Aquí está el PR que puedes seguir: github.com/WordPress/gutenberg/commit/… . Básicamente, solo agregue una referencia a sus bloques creados, luego obtenga DOM usando esa referencia y pásela a scrollIntoView.

    – Ayuda en

    24 de junio de 2019 a las 1:37

  • y ¿cómo agregar referencias al “contenedor del editor de bloques”?

    – Nicolás

    24 de junio de 2019 a las 9:26

  • @niklas, es posible que puedas dejarlo así window y ver cómo funciona. De lo contrario, puedes seguir this.inserterResults en el PR que compartí.

    – Ayuda en

    24 de junio de 2019 a las 21:57

¿Ha sido útil esta solución?