Issue #2179✓ ResueltoAbierto el 2 de agosto de 2019por afdallahReacciones 3

Automáticamente envolve cada arrastre de componente en lienzo con otro componente

Respuesta rápidapor afdallah2

@pouyamiralayi conseguí resolver el problema haciendo que el componente fuera un objeto. Así. '''javascript resultante.contenido = { etiquetaNombre: 'div', removible: cierto, // No se puede quitar arrastrable: cierto, // No se puede mover copiable: true, // Desactivar copiar/pegar Clases: ['Contenedor'], Tipo: 'Cuadrí...

Lee la respuesta completa abajo ↓

Pregunta

Estoy intentando asegurarme de que cada componente se arrastre hacia el lienzo para ser envuelto con un componente columna. Para lograrlo uso el evento de lienzo.

Primero desactivé el evento de ventana para evitar que se disparara el evento de arrastrar y soltar por defecto de HTML 5. Evento 'Canvas:Drop' '''javascript ditor.on('canvas:drop', function (dataTransfer) { event.preventDefault() })


Supongamos que mi componente de columna es tan simple, solo una div.

evento 'canvas:dragdata'
'''javascript
editor.on('canvas:dragdata', handleDragData)

function handleDragData (dataTransfer, result) {
    if (!event.currentTarget.closest('.column')) {
        result.content.'
            <div class="column" data-gjs-type="column">
                <div class="column-inner">
                    ${dataTransfer.getData(dataTransfer.types[0])}
                </div>
            </div>
        `
}

Error de retorno de código anterior, indicando que DataTransfer no está definido

Por lo que entiendo, podemos personalizar lo que dejamos caer en el lienzo con 'result.content'

Algo así como '''javascript //...

result.contenido = { tipo: 'encabezado' }


o 

'''javascript
//...

result.content = '<div>Reemplazaré el componente arrastrado por defecto</div>'

Lo que no entiendo es cómo envolver el componente arrastrado con elemento/componente.

Respuestas (2)

👍 Muy útilafdallah2 de agosto de 2019

@pouyamiralayi conseguí resolver el problema haciendo que el componente fuera un objeto. Así.

'''javascript resultante.contenido = { etiquetaNombre: 'div', removible: cierto, // No se puede quitar arrastrable: cierto, // No se puede mover copiable: true, // Desactivar copiar/pegar Clases: ['Contenedor'], Tipo: 'Cuadrícula', atributos: { título: 'aquí' }, estilo: { color: 'rojo'}, componentes: { etiquetaNombre: 'div', Clases: ['Row'], Hoverable: falso, seleccionable: false, arrastrable: falso, componentes: { etiquetaNombre: 'div', Clases: ['Col-Auto'], tipo: 'columna', estilo: { ancho: '100%', flex: 1 }, componentes: { tipo: JSON.parse(dataTransfer.getData(dataTransfer.types[0]))['type'] tipo: resultado.contento.tipo } } } }


En fin, gracias por intentar ayudar.
pouyamiralayi2 de agosto de 2019

¡Hola! El evento que buscas es este editor.on('bloque:arrastrar:stop', función (elemento) { element.replaceWith({ etiquetaNombre: 'div', estilo:{'borde': '1px rojo sólido'}, Componentes: [elemento] }) }) Fíjate aquí que estoy usando un div con borde rojo como wrapper; En tu caso es la columna. Salud.

Preguntas y respuestas relacionadas

Continúa investigando con debates sobre temas similares.

Plugins de pago que cumplen con este problema

Seleccionado por temas clave y relevancia de etiquetas para ayudarte a enviar más rápido.

Ver todos los plugins

Cargando recomendaciones de plugins de pago...

Opción gratuita

Consulta los plugins de código abierto de GrapesJS en GitHub O haz una búsqueda rápida en nuestro catálogo gratuito.

Explora plugins gratuitos →
Opción premium

Los plugins premium incluyen soporte, actualizaciones regulares y funciones listas para producción — ahorrando días de trabajo de integración.

Explora plugins premium →

Explorar categorías de plugins

Ve directamente a las páginas de categorías de plugins en el marketplace.