Drag a column to a new position.
(fromCol: number)
| 545 | |
| 546 | /** Drag a column to a new position. */ |
| 547 | private startColDrag(fromCol: number): void { |
| 548 | const dom = this.dom |
| 549 | if (!dom) return |
| 550 | this.syncFromDom() |
| 551 | const wrapper = dom.querySelector<HTMLElement>('.cm-table-wrapper') |
| 552 | const headers = Array.from(dom.querySelectorAll<HTMLElement>('thead th')) |
| 553 | if (!wrapper || headers.length === 0) return |
| 554 | dom.classList.add('is-dragging') |
| 555 | const indicator = document.createElement('div') |
| 556 | indicator.className = 'cm-table-drop-indicator cm-table-drop-col' |
| 557 | wrapper.append(indicator) |
| 558 | |
| 559 | // Drop-onto-column semantics, mirroring rows. |
| 560 | const hoveredFor = (x: number): number => { |
| 561 | for (let i = 0; i < headers.length; i++) { |
| 562 | if (x <= headers[i].getBoundingClientRect().right) return i |
| 563 | } |
| 564 | return headers.length - 1 |
| 565 | } |
| 566 | const place = (hovered: number): void => { |
| 567 | if (hovered === fromCol) { |
| 568 | indicator.style.display = 'none' |
| 569 | return |
| 570 | } |
| 571 | indicator.style.display = 'block' |
| 572 | const wrect = wrapper.getBoundingClientRect() |
| 573 | const rect = headers[hovered].getBoundingClientRect() |
| 574 | const left = (hovered > fromCol ? rect.right : rect.left) - wrect.left |
| 575 | indicator.style.left = `${left}px` |
| 576 | } |
| 577 | place(fromCol) |
| 578 | |
| 579 | const onMove = (e: MouseEvent): void => place(hoveredFor(e.clientX)) |
| 580 | const onUp = (e: MouseEvent): void => { |
| 581 | window.removeEventListener('mousemove', onMove) |
| 582 | window.removeEventListener('mouseup', onUp) |
| 583 | indicator.remove() |
| 584 | dom.classList.remove('is-dragging') |
| 585 | const hovered = hoveredFor(e.clientX) |
| 586 | if (hovered !== fromCol) { |
| 587 | this.applyModel(moveColumn(this.model, fromCol, hovered)) |
| 588 | } |
| 589 | } |
| 590 | window.addEventListener('mousemove', onMove) |
| 591 | window.addEventListener('mouseup', onUp) |
| 592 | } |
| 593 | |
| 594 | private onCellKeydown( |
| 595 | event: KeyboardEvent, |
no test coverage detected