133 lines
4.5 KiB
TypeScript
133 lines
4.5 KiB
TypeScript
import { expect, tap } from '@git.zone/tstest/tapbundle';
|
|
import { DeesInputWysiwyg } from '../ts_web/elements/wysiwyg/dees-input-wysiwyg.js';
|
|
|
|
// Initialize the element
|
|
DeesInputWysiwyg;
|
|
|
|
tap.test('wysiwyg drag visual feedback - block movement', async () => {
|
|
const element = document.createElement('dees-input-wysiwyg');
|
|
document.body.appendChild(element);
|
|
|
|
await element.updateComplete;
|
|
|
|
// Set initial content
|
|
element.blocks = [
|
|
{ id: 'block1', type: 'paragraph', content: 'Block 1' },
|
|
{ id: 'block2', type: 'paragraph', content: 'Block 2' },
|
|
{ id: 'block3', type: 'paragraph', content: 'Block 3' },
|
|
];
|
|
element.renderBlocksProgrammatically();
|
|
|
|
await element.updateComplete;
|
|
|
|
const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement;
|
|
const block1 = editorContent.querySelector('[data-block-id="block1"]') as HTMLElement;
|
|
|
|
// Manually start drag
|
|
const mockDragEvent = {
|
|
dataTransfer: {
|
|
effectAllowed: '',
|
|
setData: (type: string, data: string) => {},
|
|
setDragImage: (img: any, x: number, y: number) => {}
|
|
},
|
|
clientY: 50,
|
|
preventDefault: () => {},
|
|
} as any;
|
|
|
|
element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]);
|
|
|
|
// Wait for dragging class
|
|
await new Promise(resolve => setTimeout(resolve, 20));
|
|
|
|
// Check dragging state
|
|
console.log('Block 1 classes:', block1.className);
|
|
console.log('Editor content classes:', editorContent.className);
|
|
expect(block1.classList.contains('dragging')).toBeTrue();
|
|
expect(editorContent.classList.contains('dragging')).toBeTrue();
|
|
|
|
// Check drop indicator exists
|
|
const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement;
|
|
console.log('Drop indicator:', dropIndicator);
|
|
expect(dropIndicator).toBeTruthy();
|
|
|
|
// Test block movement calculation
|
|
console.log('Testing updateBlockPositions...');
|
|
|
|
// Access private method for testing
|
|
const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler);
|
|
|
|
// Simulate dragging to different position
|
|
updateBlockPositions(150); // Move down
|
|
|
|
// Check if blocks have move classes
|
|
const blocks = Array.from(editorContent.querySelectorAll('.block-wrapper'));
|
|
console.log('Block classes after move:');
|
|
blocks.forEach((block, i) => {
|
|
console.log(`Block ${i}:`, block.className, 'transform:', (block as HTMLElement).style.getPropertyValue('--drag-offset'));
|
|
});
|
|
|
|
// Clean up
|
|
element.dragDropHandler.handleDragEnd();
|
|
document.body.removeChild(element);
|
|
});
|
|
|
|
tap.test('wysiwyg drop indicator positioning', async () => {
|
|
const element = document.createElement('dees-input-wysiwyg');
|
|
document.body.appendChild(element);
|
|
|
|
await element.updateComplete;
|
|
|
|
// Set initial content
|
|
element.blocks = [
|
|
{ id: 'block1', type: 'paragraph', content: 'Paragraph 1' },
|
|
{ id: 'block2', type: 'heading-2', content: 'Heading 2' },
|
|
];
|
|
element.renderBlocksProgrammatically();
|
|
|
|
await element.updateComplete;
|
|
|
|
const editorContent = element.shadowRoot!.querySelector('.editor-content') as HTMLDivElement;
|
|
|
|
// Start dragging first block
|
|
const mockDragEvent = {
|
|
dataTransfer: {
|
|
effectAllowed: '',
|
|
setData: (type: string, data: string) => {},
|
|
setDragImage: (img: any, x: number, y: number) => {}
|
|
},
|
|
clientY: 50,
|
|
preventDefault: () => {},
|
|
} as any;
|
|
|
|
element.dragDropHandler.handleDragStart(mockDragEvent, element.blocks[0]);
|
|
|
|
// Wait for initialization
|
|
await new Promise(resolve => setTimeout(resolve, 20));
|
|
|
|
// Get drop indicator
|
|
const dropIndicator = editorContent.querySelector('.drop-indicator') as HTMLElement;
|
|
expect(dropIndicator).toBeTruthy();
|
|
|
|
// Check initial display state
|
|
console.log('Drop indicator initial display:', dropIndicator.style.display);
|
|
|
|
// Trigger updateBlockPositions to see drop indicator
|
|
const updateBlockPositions = element.dragDropHandler['updateBlockPositions'].bind(element.dragDropHandler);
|
|
updateBlockPositions(100);
|
|
|
|
// Check drop indicator position
|
|
console.log('Drop indicator after update:');
|
|
console.log('- display:', dropIndicator.style.display);
|
|
console.log('- top:', dropIndicator.style.top);
|
|
console.log('- height:', dropIndicator.style.height);
|
|
|
|
expect(dropIndicator.style.display).toEqual('block');
|
|
expect(dropIndicator.style.top).toBeTruthy();
|
|
expect(dropIndicator.style.height).toBeTruthy();
|
|
|
|
// Clean up
|
|
element.dragDropHandler.handleDragEnd();
|
|
document.body.removeChild(element);
|
|
});
|
|
|
|
tap.start(); |