diff --git a/projects/components/src/draggable-list/draggable-item/draggable-item.component.ts b/projects/components/src/draggable-list/draggable-item/draggable-item.component.ts new file mode 100644 index 000000000..54181457b --- /dev/null +++ b/projects/components/src/draggable-list/draggable-item/draggable-item.component.ts @@ -0,0 +1,15 @@ +import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; +import { ContentHolder, CONTENT_HOLDER_TEMPLATE } from '../../public-api'; + +@Component({ + selector: 'ht-draggable-item', + changeDetection: ChangeDetectionStrategy.OnPush, + template: CONTENT_HOLDER_TEMPLATE +}) +export class DraggableItemComponent extends ContentHolder { + @Input() + public disabled: boolean = false; + + @Input() + public data?: T; +} diff --git a/projects/components/src/draggable-list/draggable-list.component.scss b/projects/components/src/draggable-list/draggable-list.component.scss new file mode 100644 index 000000000..7c786c961 --- /dev/null +++ b/projects/components/src/draggable-list/draggable-list.component.scss @@ -0,0 +1,11 @@ +@import 'color-palette'; + +.draggable-list .draggable-item { + cursor: move; + + &.disabled { + background-color: $gray-2; + color: $gray-5; + cursor: not-allowed; + } +} diff --git a/projects/components/src/draggable-list/draggable-list.component.ts b/projects/components/src/draggable-list/draggable-list.component.ts new file mode 100644 index 000000000..f4b7b3d81 --- /dev/null +++ b/projects/components/src/draggable-list/draggable-list.component.ts @@ -0,0 +1,52 @@ +import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop'; +import { + AfterContentInit, + ChangeDetectionStrategy, + Component, + ContentChildren, + EventEmitter, + Input, + Output, + QueryList +} from '@angular/core'; +import { DraggableItemComponent } from './draggable-item/draggable-item.component'; + +@Component({ + selector: 'ht-draggable-list', + changeDetection: ChangeDetectionStrategy.OnPush, + styleUrls: ['./draggable-list.component.scss'], + template: ` +
+
+ +
+
+ ` +}) +export class DraggableListComponent implements AfterContentInit { + @Input() + public disabled: boolean = false; + + @Output() + public readonly draggableListChange: EventEmitter = new EventEmitter(); + + @ContentChildren(DraggableItemComponent) + public draggableItemsRef!: QueryList>; + + public draggableItems: DraggableItemComponent[] = []; + + public ngAfterContentInit(): void { + this.draggableItems = this.draggableItemsRef.toArray(); + } + + public dropList(event: CdkDragDrop[]>): void { + moveItemInArray(this.draggableItems, event.previousIndex, event.currentIndex); + this.draggableListChange.emit(this.draggableItems.map(dragabbleItem => dragabbleItem.data!)); + } +} diff --git a/projects/components/src/draggable-list/draggable-list.module.ts b/projects/components/src/draggable-list/draggable-list.module.ts new file mode 100644 index 000000000..8349a82c4 --- /dev/null +++ b/projects/components/src/draggable-list/draggable-list.module.ts @@ -0,0 +1,12 @@ +import { DragDropModule } from '@angular/cdk/drag-drop'; +import { CommonModule } from '@angular/common'; +import { NgModule } from '@angular/core'; +import { DraggableItemComponent } from './draggable-item/draggable-item.component'; +import { DraggableListComponent } from './draggable-list.component'; + +@NgModule({ + declarations: [DraggableListComponent, DraggableItemComponent], + imports: [CommonModule, DragDropModule], + exports: [DraggableListComponent, DraggableItemComponent] +}) +export class DraggableListModule {} diff --git a/projects/components/src/public-api.ts b/projects/components/src/public-api.ts index cbdafa48e..423fd7d26 100644 --- a/projects/components/src/public-api.ts +++ b/projects/components/src/public-api.ts @@ -65,6 +65,11 @@ export * from './description/description.module'; export * from './divider/divider.component'; export * from './divider/divider.module'; +// Draggable list +export { DraggableListComponent } from './draggable-list/draggable-list.component'; +export { DraggableItemComponent } from './draggable-list/draggable-item/draggable-item.component'; +export { DraggableListModule } from './draggable-list/draggable-list.module'; + // Dropdown menu export { MenuDropdownComponent } from './menu-dropdown/menu-dropdown.component'; export { MenuItemComponent } from './menu-dropdown/menu-item/menu-item.component';