draggable icon indicating copy to clipboard operation
draggable copied to clipboard

Draggable.Sortable on Table Rows Using rowspan

Open sshaw opened this issue 8 months ago • 1 comments

Looks like it does not work for this case. I ~imaging~ imagine it's because the there's no tag-level grouping of the related rows.

Of course I do not want invalid HTML but for fun I wrapped related rows in a span but things did still not work.

Before Drag

Image

After Drag

Image

Code

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Draggable.js Table Row Example</title>
        <script src="https://unpkg.com/@shopify/[email protected]/lib/draggable.bundle.js"></script>
        <style>
         table {
             width: 100%;
             max-width: 600px;
             border-collapse: collapse;
             margin: 20px auto;
             font-family: Arial, sans-serif;
         }
         th, td {
             border: 1px solid #ddd;
             padding: 8px;
             text-align: left;
         }
         th {
             background-color: #f2f2f2;
         }
         tr {
             background-color: #fff;
             cursor: move;
         }
         tr.dragging {
             opacity: 0.5;
             background-color: #f0f0f0;
         }
         tr:hover {
             background-color: #f5f5f5;
         }
        </style>
    </head>
    <body>
        <table id="sortableTable">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Name</th>
                    <th>Role</th>
                </tr>
            </thead>
            <tbody id="tableBody">
                <tr data-user-id="1" data-user-row="first">
                    <td rowspan="2">1</td>
                    <td rowspan="2">Alice</td>
                    <td>Developer</td>
                </tr>
                <tr data-user-id="1" data-user-row="sub">
                    <td>Team Lead</td>
                </tr>
                <tr data-user-id="2" data-user-row="first">
                    <td rowspan="3">2</td>
                    <td rowspan="3">Bob</td>
                    <td>Designer</td>
                </tr>
                <tr data-user-id="2" data-user-row="sub">
                    <td>UI Specialist</td>
                </tr>
                <tr data-user-id="2" data-user-row="sub">
                    <td>Illustrator</td>
                </tr>

                <tr data-user-id="3" data-user-row="first">
                    <td rowspan="1">3</td>
                    <td rowspan="1">Tommy</td>
                    <td>Manager</td>
                </tr>


                <tr data-user-id="4" data-user-row="first">
                    <td rowspan="2">4</td>
                    <td rowspan="2">Diana</td>
                    <td>Analyst</td>
                </tr>
                <tr data-user-id="4" data-user-row="sub">
                    <td>Data Scientist</td>
                </tr>
            </tbody>
        </table>

        <script>
         document.addEventListener('DOMContentLoaded', () => {
             const tableBody = document.querySelector('#tableBody');
             const sortable = new Draggable.Sortable([tableBody], {
                 draggable: 'tr',
                 mirror: {
                     constrainDimensions: true,
                 },
             });
         });
        </script>
    </body>
</html>

sshaw avatar May 09 '25 18:05 sshaw

uses the folowing code for correcction

Draggable.js Table Row Example

bryan844 avatar Oct 30 '25 11:10 bryan844