Menu

#315 Implement drag'n'drop support

Backlog
open
nobody
None
4normal
2025-12-18
2025-12-18
No

Dragging and dropping a CSV should open the data import wizard.
Dragging and dropping a .mky or .rvl file should insert the file as a group.

AI overview suggests the following:

Yes, Electron apps can support drag and drop from the OS using standard HTML5 drag and drop events
, with the added benefit of accessing native file paths.
Steps to Implement OS to Electron Drag & Drop

  1. Configure the Renderer Process (HTML/JavaScript)
    In your renderer process (the webpage in the Electron window), you need to listen for the relevant drag and drop events. It is essential to prevent the default browser behavior for dragover and drop events.

    HTML (index.html): Define a drop zone element.
    html

<div id="drop-zone">
  <p>Drag and drop files here</p>
</div>

Renderer JavaScript (renderer.js): Add event listeners.
javascript

const dropZone = document.getElementById('drop-zone');

// Prevent default behavior for drag events
dropZone.addEventListener('dragover', (event) => {
  event.preventDefault();
  event.stopPropagation();
});

dropZone.addEventListener('drop', (event) => {
  event.preventDefault();
  event.stopPropagation();

  const files = event.dataTransfer.files;
  if (files && files.length > 0) {
    // Process the files
    handleFiles(files);
  }
});
  1. Access File Paths
    Electron enhances the DOM's File interface by adding a path attribute, which exposes the absolute file path of the native files.

    Renderer JavaScript (renderer.js): The handleFiles function can now access the full file path.
    javascript

function handleFiles(files) {
  for (const file of files) {
    // Access the absolute file path
    console.log('File path:', file.path); 

    // You can now use Node.js modules (like 'fs') via the preload script 
    // to read or manipulate the file using its path.
  }
}
  1. Use Node.js Modules (via Preload Script and IPC)
    To interact with the file system using Node.js's fs module, you should use a preload.js script and Inter-Process Communication (IPC) for security.

    Preload Script (preload.js): Expose a secure way to communicate with the main process.
    javascript

const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  handleDroppedFiles: (filePaths) => ipcRenderer.invoke('handle-dropped-files', filePaths)
});

Main Process (main.js): Listen for the IPC message and use Node.js fs to process the files.
javascript

const { app, BrowserWindow, ipcMain } = require('electron');
const fs = require('fs');
// ... other main process code ...

ipcMain.handle('handle-dropped-files', async (event, filePaths) => {
  for (const filePath of filePaths) {
    try {
      const data = fs.readFileSync(filePath, 'utf8');
      console.log('File content:', data);
      // Perform other file operations here
    } catch (err) {
      console.error('Error reading file:', err);
    }
  }
  return true; // Return a result if needed
});

Update Renderer JavaScript (renderer.js): Call the exposed function.
javascript

async function handleFiles(files) {
  const filePaths = Array.from(files).map(file => file.path);
  await window.electronAPI.handleDroppedFiles(filePaths);
  console.log('Files processed by main process.');
}

By following these steps, you enable native drag-and-drop functionality in your Electron application, allowing users to seamlessly interact with files from their operating system.

Discussion


Log in to post a comment.

MongoDB Logo MongoDB