@fleetbase/ember-ui
Version:
Fleetbase UI provides all the interface components, helpers, services and utilities for building a Fleetbase extension into the Console.
139 lines (117 loc) • 3.46 kB
JavaScript
import Component from '@glimmer/component';
import { tracked } from '@glimmer/tracking';
import { action } from '@ember/object';
/**
* Main Kanban Board Component
*
* Usage:
* <Kanban @columns={{this.columns}} @onCardMove={{this.handleCardMove}} as |Column|>
* <Column @column={{column}} as |Card|>
* <Card @card={{card}} />
* </Column>
* </Kanban>
*
* Or auto-render:
* <Kanban @columns={{this.columns}} @onCardMove={{this.handleCardMove}} />
*/
export default class KanbanComponent extends Component {
draggedCard = null;
draggedColumn = null;
isDragging = false;
get calculatedHeight() {
const offset = this.args.headerOffset ?? 0;
return `calc(100vh - ${offset}px)`;
}
/**
* Handle card drag start
*/
onCardDragStart(card, event) {
const dt = event?.dataTransfer;
if (!dt) return;
this.isDragging = true;
this.draggedCard = card;
const dragData = JSON.stringify({
type: 'card',
cardId: card.id,
sourceColumnId: this.args.columnIdPath ? card[this.args.columnIdPath] : card.columnId,
});
dt.setData('application/json', dragData);
dt.setData('text/plain', dragData);
dt.effectAllowed = 'move';
// Call parent callback if provided
if (this.args.onCardDragStart) {
this.args.onCardDragStart(card, event);
}
}
/**
* Handle card drag end
*/
onCardDragEnd(card, event) {
this.isDragging = false;
this.draggedCard = null;
// Call parent callback if provided
if (this.args.onCardDragEnd) {
this.args.onCardDragEnd(card, event);
}
}
/**
* Handle card drop on column
*/
onCardDrop(targetColumnId, targetPosition = null) {
if (!this.draggedCard) return;
const card = this.draggedCard;
const columnIdPath = this.args.columnIdPath;
const sourceColumnId = columnIdPath ? card[columnIdPath] : card.columnId;
// Don't do anything if dropping in same position
if (sourceColumnId === targetColumnId && targetPosition === card.position) {
return;
}
// Call parent callback
if (this.args.onCardMove) {
this.args.onCardMove(card, targetColumnId, targetPosition, sourceColumnId);
}
this.isDragging = false;
this.draggedCard = null;
}
/**
* Handle column drag end
*/
onColumnDragEnd(column, event) {
this.draggedColumn = null;
// Call parent callback if provided
if (this.args.onColumnDragEnd) {
this.args.onColumnDragEnd(column, event);
}
}
/**
* Handle column drop
*/
onColumnDrop(targetPosition) {
if (!this.draggedColumn) return;
const column = this.draggedColumn;
// Call parent callback
if (this.args.onColumnMove) {
this.args.onColumnMove(column, targetPosition);
}
}
/**
* Handle keyboard navigation
*/
onKeyDown(event) {
if (event.key === 'Escape' && this.isDragging) {
this.onCardDragEnd(this.draggedCard, event);
}
}
/**
* Get columns array
*/
get columns() {
return this.args.columns || [];
}
}