@innertia-solutions/nuxt-theme-spark 0.1.61 → 0.1.63
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/Table.vue +36 -2
- package/package.json +1 -1
package/components/Table.vue
CHANGED
|
@@ -302,6 +302,36 @@ const setColumnOrder = (order) => { columnOrder.value = order }
|
|
|
302
302
|
// ─── Header drag reorder ──────────────────────────────────────────────────────
|
|
303
303
|
let draggedHeaderId = null
|
|
304
304
|
const dragOverHeaderId = ref(null)
|
|
305
|
+
const resizeHoverId = ref(null)
|
|
306
|
+
|
|
307
|
+
// ─── Column auto-size on double click ─────────────────────────────────────────
|
|
308
|
+
const _canvas = typeof document !== 'undefined' ? document.createElement('canvas') : null
|
|
309
|
+
const _ctx = _canvas?.getContext('2d')
|
|
310
|
+
|
|
311
|
+
const measureText = (text, font) => {
|
|
312
|
+
if (!_ctx) return 0
|
|
313
|
+
_ctx.font = font
|
|
314
|
+
return _ctx.measureText(String(text ?? '')).width
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const autoSizeColumn = (header) => {
|
|
318
|
+
const colId = header.column.id
|
|
319
|
+
const pad = 32 // px-4 on each side
|
|
320
|
+
|
|
321
|
+
// Measure header label
|
|
322
|
+
const label = header.column.columnDef.meta?.label ?? header.id
|
|
323
|
+
let max = measureText(label, '500 12px ui-sans-serif,system-ui,sans-serif') + pad + 20 // +20 for sort icon
|
|
324
|
+
|
|
325
|
+
// Measure all visible data cells
|
|
326
|
+
if (tableBodyRef.value) {
|
|
327
|
+
tableBodyRef.value.querySelectorAll(`td[data-col-id="${colId}"]`).forEach(td => {
|
|
328
|
+
const w = measureText(td.textContent?.trim(), '14px ui-sans-serif,system-ui,sans-serif') + pad
|
|
329
|
+
if (w > max) max = w
|
|
330
|
+
})
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
header.column.setSize(Math.ceil(max))
|
|
334
|
+
}
|
|
305
335
|
|
|
306
336
|
const onHeaderDragStart = (colId) => { draggedHeaderId = colId }
|
|
307
337
|
const onHeaderDragOver = (e, colId) => { e.preventDefault(); dragOverHeaderId.value = colId }
|
|
@@ -462,8 +492,8 @@ defineExpose({
|
|
|
462
492
|
v-for="header in headerGroup.headers"
|
|
463
493
|
:key="header.id"
|
|
464
494
|
scope="col"
|
|
465
|
-
:draggable="header.id !== 'select'"
|
|
466
|
-
@dragstart="header.id !== 'select' && onHeaderDragStart(header.id)"
|
|
495
|
+
:draggable="header.id !== 'select' && resizeHoverId !== header.id"
|
|
496
|
+
@dragstart="header.id !== 'select' && resizeHoverId !== header.id && onHeaderDragStart(header.id)"
|
|
467
497
|
@dragover="header.id !== 'select' && onHeaderDragOver($event, header.id)"
|
|
468
498
|
@dragleave="onHeaderDragLeave"
|
|
469
499
|
@drop="header.id !== 'select' && onHeaderDrop(header.id)"
|
|
@@ -499,8 +529,11 @@ defineExpose({
|
|
|
499
529
|
<div
|
|
500
530
|
v-if="header.column.getCanResize()"
|
|
501
531
|
class="absolute right-0 top-0 h-full w-3 cursor-col-resize group/rz flex items-center justify-center select-none touch-none"
|
|
532
|
+
@mouseenter="resizeHoverId = header.id"
|
|
533
|
+
@mouseleave="resizeHoverId = null"
|
|
502
534
|
@mousedown.stop="header.getResizeHandler()?.($event)"
|
|
503
535
|
@touchstart.passive.stop="header.getResizeHandler()?.($event)"
|
|
536
|
+
@dblclick.stop="autoSizeColumn(header)"
|
|
504
537
|
@dragstart.stop.prevent
|
|
505
538
|
@click.stop
|
|
506
539
|
>
|
|
@@ -602,6 +635,7 @@ defineExpose({
|
|
|
602
635
|
<td
|
|
603
636
|
v-for="cell in row.getVisibleCells()"
|
|
604
637
|
:key="cell.id"
|
|
638
|
+
:data-col-id="cell.column.id"
|
|
605
639
|
:class="[
|
|
606
640
|
cell.column.id === 'select'
|
|
607
641
|
? 'text-center w-12'
|