@foblex/ng-drag-grid
Version:
Angular library designed for creating complex interfaces with drag-and-drop capabilities, perfect for implementing calendars, task boards, and other applications where item movement is required
1 lines • 67.7 kB
Source Map (JSON)
{"version":3,"file":"foblex-ng-drag-grid.mjs","sources":["../../../projects/ng-drag-grid/src/lib/f-body/f-body-cell/f-body-cell-base.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/f-draggable.state.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-body-cell/get-cell-under-pointer/get-cell-under-pointer.handler.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-body-cell/get-cell-under-pointer/get-cell-under-pointer-request.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/create-placeholder/create-item-placeholder.handler.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/create-placeholder/create-item-placeholder-request.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/get-drag-result/get-drag-result.handler.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/move-item/move-item.handler.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/move-item/move-item-request.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/remove-placeholder/remove-item-placeholder.handler.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/remove-placeholder/remove-item-placeholder-request.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/f-drag-handle/f-drag-handle.directive.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/f-drag-handle/is-drag-handle.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/f-cell-item.drag-move.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-cell-item/f-cell-item.drag-start.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/domain/f-move-event.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/f-draggable-base.ts","../../../projects/ng-drag-grid/src/lib/f-draggable/f-draggable.directive.ts","../../../projects/ng-drag-grid/src/lib/f-body/f-body-cell/f-body-cell.component.ts","../../../projects/ng-drag-grid/src/lib/f-body/f-body-cell/f-body-cell.component.html","../../../projects/ng-drag-grid/src/lib/f-body/f-body.component.ts","../../../projects/ng-drag-grid/src/lib/f-body/f-body.component.html","../../../projects/ng-drag-grid/src/lib/f-body/f-body-row/f-body-row.component.ts","../../../projects/ng-drag-grid/src/lib/f-body/f-body-row/f-body-row.component.html","../../../projects/ng-drag-grid/src/lib/f-drag-table/f-drag-grid.component.ts","../../../projects/ng-drag-grid/src/lib/f-drag-table/f-drag-grid.component.html","../../../projects/ng-drag-grid/src/lib/f-cell-item/f-cell-item-base.ts","../../../projects/ng-drag-grid/src/lib/f-cell-item/f-cell-item.component.ts","../../../projects/ng-drag-grid/src/lib/f-cell-item/f-cell-item.component.html","../../../projects/ng-drag-grid/src/lib/f-header/f-header-cell/f-header-cell.component.ts","../../../projects/ng-drag-grid/src/lib/f-header/f-header-cell/f-header-cell.component.html","../../../projects/ng-drag-grid/src/lib/f-header/f-header.component.ts","../../../projects/ng-drag-grid/src/lib/f-header/f-header.component.html","../../../projects/ng-drag-grid/src/lib/f-header/f-header-row/f-header-row.component.ts","../../../projects/ng-drag-grid/src/lib/f-header/f-header-row/f-header-row.component.html","../../../projects/ng-drag-grid/src/foblex-ng-drag-grid.ts"],"sourcesContent":["import { IHasHostElement } from '@foblex/core';\nimport { InjectionToken } from '@angular/core';\n\nexport const F_BODY_CELL = new InjectionToken<FBodyCellBase>('F_BODY_CELL');\n\nexport abstract class FBodyCellBase implements IHasHostElement {\n\n public abstract uid: string;\n\n public abstract id: string;\n\n public abstract hostElement: HTMLElement;\n\n public abstract disabled: boolean;\n\n public highlight(): void {\n this.hostElement.classList.add('f-drag-over');\n }\n\n public clearHighlight(): void {\n this.hostElement.classList.remove('f-drag-over');\n }\n}\n","import { Injectable, InjectionToken } from '@angular/core';\nimport { IFDraggedHandler } from './domain';\nimport { ITransformModel, Point, TransformModelExtensions } from '@foblex/core';\nimport { FBodyCellBase } from '../f-body';\nimport { FCellItemBase } from '../f-cell-item';\n\nexport const F_DRAGGABLE_STATE = new InjectionToken<FDraggableState>('F_DRAGGABLE_STATE');\n\n@Injectable()\nexport class FDraggableState {\n\n public transform: ITransformModel = TransformModelExtensions.default();\n\n public containerHost: HTMLElement | undefined;\n\n private items: FCellItemBase[] = [];\n\n private cells: FBodyCellBase[] = [];\n\n public draggedItems: IFDraggedHandler[] = [];\n\n public onPointerDownScale: number = 1;\n\n public onPointerDownPosition: Point = new Point(0, 0);\n\n public setContainerHost(element: HTMLElement): void {\n this.containerHost = element;\n }\n\n public findItem(element: HTMLElement): FCellItemBase | undefined {\n return this.items.find((x) => x.hostElement.contains(element));\n }\n\n public addItem(item: FCellItemBase): void {\n this.items.push(item);\n }\n\n public removeItem(item: FCellItemBase): void {\n this.items = this.items.filter((x) => x.uid !== item.uid);\n }\n\n public findCell(element: HTMLElement): FBodyCellBase | undefined {\n return this.cells.find((x) => x.hostElement.contains(element));\n }\n\n public addCell(cell: FBodyCellBase): void {\n this.cells.push(cell);\n }\n\n public removeCell(cell: FBodyCellBase): void {\n this.cells = this.cells.filter((x) => x.uid !== cell.uid);\n }\n\n public reset(): void {\n this.draggedItems.forEach((item) => {\n item.fTimetableItem.clearHighlight();\n });\n this.draggedItems = [];\n }\n}\n","import { Inject, Injectable } from '@angular/core';\nimport { IHandler, IPointerEvent } from '@foblex/core';\nimport { FBodyCellBase } from '../../../../f-body';\nimport { F_DRAGGABLE_STATE, FDraggableState } from '../../../f-draggable.state';\nimport { GetCellUnderPointerRequest } from './get-cell-under-pointer-request';\n\n@Injectable()\nexport class GetCellUnderPointerHandler\n implements IHandler<GetCellUnderPointerRequest, FBodyCellBase | undefined> {\n\n constructor(\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\n ) {\n }\n\n public handle(request: GetCellUnderPointerRequest): FBodyCellBase | undefined {\n let result = this.getBodyCell(request.event);\n if (result && result.disabled) {\n result = undefined;\n }\n return result;\n }\n\n private getBodyCell(event: IPointerEvent): FBodyCellBase | undefined {\n let result: FBodyCellBase | undefined;\n const fCellElement = this.getCellElementsUnderPointer(event);\n\n if (fCellElement) {\n result = this.getCellComponentByElement(fCellElement);\n }\n\n return result;\n }\n\n private getCellElementsUnderPointer(event: IPointerEvent): HTMLElement | undefined {\n const elements = document.elementsFromPoint(event.getPosition().x, event.getPosition().y);\n\n const result = elements.find((x) => x.tagName.toLowerCase() === 'f-body-cell') as HTMLElement | undefined;\n return result;\n }\n\n private getCellComponentByElement(element: HTMLElement): FBodyCellBase | undefined {\n const result = this.fDraggableState.findCell(element);\n return result;\n }\n}\n","import { IPointerEvent } from '@foblex/core';\n\nexport class GetCellUnderPointerRequest {\n\n constructor(\n public event: IPointerEvent\n ) {\n }\n}\n","import { DomElementExtensions, IHandler } from '@foblex/core';\nimport { CreateItemPlaceholderRequest } from './create-item-placeholder-request';\n\nexport class CreateItemPlaceholderHandler\n implements IHandler<CreateItemPlaceholderRequest, HTMLElement> {\n\n public handle(request: CreateItemPlaceholderRequest): HTMLElement {\n const element = request.targetElement;\n\n const fBodyCellContainer = element.parentElement;\n if (!fBodyCellContainer) {\n throw new Error('Element must be a child of f-body-cell');\n }\n\n const placeholder = this.createPlaceholder(request);\n\n fBodyCellContainer.replaceChild(placeholder, element);\n\n return placeholder;\n }\n\n private createPlaceholder(request: CreateItemPlaceholderRequest): HTMLElement {\n const result = DomElementExtensions.deepCloneNode(request.targetElement);\n\n result.innerHTML = '';\n result.style.width = `${ request.initialRect.width }px`;\n result.style.height = `${ request.initialRect.height }px`;\n\n return result;\n }\n}\n","import { IRect } from '@foblex/core';\n\nexport class CreateItemPlaceholderRequest {\n\n constructor(\n public targetElement: HTMLElement,\n public initialRect: IRect\n ) {\n }\n}\n","import { IHandler } from '@foblex/core';\nimport { F_DRAGGABLE_STATE, FDraggableState } from '../../../f-draggable.state';\nimport { Inject, Injectable } from '@angular/core';\nimport { IDragResult } from './i-drag-result';\n\n@Injectable()\nexport class GetDragResultHandler implements IHandler<void, IDragResult[]> {\n\n constructor(\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\n ) {\n }\n\n public handle(): IDragResult[] {\n let result: IDragResult[] = [];\n\n const items = this.fDraggableState.draggedItems || [];\n\n for (let i = 0; i < items.length; i++) {\n items[ i ].end();\n const cellId = items[ i ].fTimetableItem.parentId;\n const itemId = items[ i ].fTimetableItem.hostElement.id;\n\n result.push({\n currentCellId: cellId,\n itemId: itemId\n });\n }\n\n return result;\n }\n}\n","import { IHandler, IPoint, ISize } from '@foblex/core';\nimport { MoveItemRequest } from './move-item-request';\n\nexport class MoveItemHandler\n implements IHandler<MoveItemRequest, void> {\n\n public handle(request: MoveItemRequest): void {\n this.changeStyles(request.targetElement, request.size, request.position);\n }\n\n private changeStyles(element: HTMLElement, size: ISize, position: IPoint): void {\n element.style.position = 'absolute';\n element.style.zIndex = '1000';\n element.style.width = `${ size.width }px`;\n element.style.height = `${ size.height }px`;\n element.style.left = `${ 0 }px`;\n element.style.top = `${ 0 }px`;\n element.style.transform = 'translate(' + position.x + 'px,' + position.y + 'px)';\n }\n}\n","import { IPoint, ISize } from '@foblex/core';\n\nexport class MoveItemRequest {\n\n constructor(\n public targetElement: HTMLElement,\n public size: ISize,\n public position: IPoint\n ) {\n }\n}\n","import { IHandler } from '@foblex/core';\nimport { RemoveItemPlaceholderRequest } from './remove-item-placeholder-request';\n\nexport class RemoveItemPlaceholderHandler\n implements IHandler<RemoveItemPlaceholderRequest, void> {\n\n public handle(request: RemoveItemPlaceholderRequest): void {\n\n const fBodyCellContainer = request.placeholder.parentElement;\n if (!fBodyCellContainer) {\n throw new Error('Element must be a child of f-body-cell');\n }\n\n request.targetElement.removeAttribute('style');\n fBodyCellContainer.replaceChild(request.targetElement, request.placeholder);\n request.placeholder.remove();\n }\n}\n","export class RemoveItemPlaceholderRequest {\n\n constructor(\n public placeholder: HTMLElement,\n public targetElement: HTMLElement,\n ) {\n }\n}\n","import {\n Directive, ElementRef, InjectionToken, Input, OnDestroy\n} from \"@angular/core\";\nimport { Subject } from 'rxjs';\nimport { BooleanExtensions, IHasHostElement } from '@foblex/core';\n\nexport const F_DRAG_HANDLE: InjectionToken<FDragHandleDirective> = new InjectionToken<FDragHandleDirective>('F_DRAG_HANDLE');\n\n@Directive({\n selector: \"[fDragHandle]\",\n standalone: true,\n host: {\n class: \"f-drag-handle f-component\",\n '[class.f-drag-handle-disabled]': 'disabled'\n },\n providers: [ { provide: F_DRAG_HANDLE, useExisting: FDragHandleDirective } ],\n})\nexport class FDragHandleDirective implements IHasHostElement, OnDestroy {\n\n public readonly stateChanges: Subject<void> = new Subject<void>();\n\n @Input('fDragHandleDisabled')\n public get disabled(): boolean {\n return this.isDisabled;\n }\n\n public set disabled(isDisabled: boolean | undefined | string) {\n const value = BooleanExtensions.castToBoolean(isDisabled);\n if (value !== this.isDisabled) {\n this.isDisabled = value;\n this.stateChanges.next();\n }\n }\n\n private isDisabled: boolean = false;\n\n public get hostElement(): HTMLElement {\n return this.elementReference.nativeElement;\n }\n\n constructor(\n private elementReference: ElementRef<HTMLElement>\n ) {\n }\n\n public ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n}\n","export function isDragHandle(element: HTMLElement | SVGElement): boolean {\n const dragHandle = getClosestDragHandle(element);\n return !!dragHandle && !isElementOrParentExcluded(element);\n}\n\nfunction isElementOrParentExcluded(element: HTMLElement | SVGElement): boolean {\n const isContains = isElementContainsClass(element);\n const parentElement = (element.parentElement as HTMLElement);\n const dragHandle = getClosestDragHandle(parentElement);\n if (!isContains && !!dragHandle) {\n return isElementOrParentExcluded(parentElement);\n }\n return isContains;\n}\n\nfunction getClosestDragHandle(element: HTMLElement | SVGElement): HTMLElement {\n return element.closest('.f-drag-handle') as HTMLElement;\n}\n\nfunction isElementContainsClass(element: HTMLElement | SVGElement): boolean {\n return element.classList.contains('f-drag-handle-disabled');\n}\n","import { IPoint, IRect, Point, PointExtensions, RectExtensions } from '@foblex/core';\nimport { FDraggableState } from '../../f-draggable.state';\nimport { IFDraggedHandler } from '../i-f-dragged-handler';\nimport { MoveItemHandler, MoveItemRequest } from './move-item';\nimport { CreateItemPlaceholderHandler, CreateItemPlaceholderRequest } from './create-placeholder';\nimport { RemoveItemPlaceholderHandler, RemoveItemPlaceholderRequest } from './remove-placeholder';\nimport { FCellItemBase } from '../../../f-cell-item';\n\nexport class FCellItemDragMove implements IFDraggedHandler {\n\n private onPointerDownPosition: IPoint = PointExtensions.initialize();\n private placeholder: HTMLElement | undefined;\n\n private parentCell: HTMLElement | undefined;\n private initialRect: IRect = RectExtensions.initialize();\n\n private initialScrollTop: number = 0;\n\n private get draggedElement(): HTMLElement {\n return this.fTimetableItem.hostElement;\n }\n\n private moveHandler: MoveItemHandler = new MoveItemHandler();\n\n constructor(\n private fDraggableState: FDraggableState,\n public fTimetableItem: FCellItemBase\n ) {\n this.onPointerDownPosition = new Point();\n }\n\n public prepare(): void {\n this.fTimetableItem.clearHighlight();\n this.parentCell = this.draggedElement.parentElement as HTMLElement;\n if (!this.parentCell) {\n throw new Error('FTimetable item parent element not found');\n }\n\n this.initialRect = RectExtensions.fromElement(this.draggedElement);\n const containerRect = RectExtensions.fromElement(this.fDraggableState.containerHost!);\n this.initialScrollTop = this.fDraggableState.containerHost!.scrollTop;\n this.onPointerDownPosition = Point.fromPoint(this.initialRect).sub(containerRect).add({ x: 0, y: this.initialScrollTop });\n\n this.placeholder = new CreateItemPlaceholderHandler().handle(\n new CreateItemPlaceholderRequest(this.draggedElement, this.initialRect)\n );\n\n this.moveHandler.handle(\n new MoveItemRequest(this.draggedElement, this.initialRect, this.onPointerDownPosition)\n );\n this.fDraggableState.containerHost?.appendChild(this.draggedElement);\n }\n\n public move(difference: IPoint): void {\n const differenceScroll = this.fDraggableState.containerHost!.scrollTop - this.initialScrollTop;\n const position = Point.fromPoint(this.onPointerDownPosition).add(difference).add({ x: 0, y: differenceScroll });\n this.moveHandler.handle(\n new MoveItemRequest(this.draggedElement, this.initialRect, position)\n );\n }\n\n public end(): void {\n this.fDraggableState.containerHost?.removeChild(this.draggedElement);\n new RemoveItemPlaceholderHandler().handle(\n new RemoveItemPlaceholderRequest(this.placeholder!, this.draggedElement)\n );\n }\n}\n","import { IHandler, IPointerEvent, ITransformModel, Point } from '@foblex/core';\nimport { Inject, Injectable } from '@angular/core';\nimport { F_DRAGGABLE_STATE, FDraggableState } from '../../f-draggable.state';\nimport { isDragHandle } from '../../f-drag-handle';\nimport { FCellItemDragMove } from './f-cell-item.drag-move';\n\n@Injectable()\nexport class FCellItemDragStart implements IHandler<IPointerEvent, void> {\n\n private get transform(): ITransformModel {\n return this.fDraggableState.transform;\n }\n\n private get containerHost(): HTMLElement {\n return this.fDraggableState.containerHost!;\n }\n\n constructor(\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\n ) {\n }\n\n public handle(event: IPointerEvent): void {\n const item = this.fDraggableState.findItem(event.targetElement);\n\n if (!this.containerHost) {\n throw new Error('Container host is not defined');\n }\n\n const pointerPositionInContainer = Point.fromPoint(event.getPosition()).elementTransform(this.containerHost);\n\n if (!item || item.disabled || this.fDraggableState.draggedItems.length || !isDragHandle(event.targetElement)) {\n return;\n }\n\n this.fDraggableState.onPointerDownScale = this.transform.scale;\n this.fDraggableState.onPointerDownPosition = pointerPositionInContainer.div(this.transform.scale);\n this.fDraggableState.draggedItems = [ new FCellItemDragMove(\n this.fDraggableState,\n item\n ) ];\n }\n}\n","import { IDragResult } from './f-cell-item';\n\nexport class FMoveEvent {\n\n constructor(\n public items: IDragResult[],\n public toCellId: string,\n ) {\n }\n}\n","import {\n EventExtensions,\n IMouseEvent,\n IPoint,\n IPointerEvent,\n ITouchDownEvent,\n ITouchMoveEvent, ITouchUpEvent,\n PointExtensions\n} from '@foblex/core';\nimport { ICanRunOutsideAngular } from '@foblex/core/drag-and-drop/i-can-run-outside-angular';\n\nconst IGNORE_TIME: number = 400;\n\nexport abstract class FDraggableBase {\n\n private element!: Document;\n\n private mouseListeners: Function = EventExtensions.emptyListener();\n private touchListeners: Function = EventExtensions.emptyListener();\n\n private startListeners: Function = EventExtensions.emptyListener();\n\n public isSyntheticEvent(event: MouseEvent): boolean {\n const result = !!this.lastTouchEventTime &&\n (this.lastTouchEventTime + IGNORE_TIME > Date.now());\n return result;\n }\n\n private lastTouchEventTime: number = 0;\n\n public isDragStarted: boolean = false;\n private dragStartThreshold: number = 5;\n private dragStartDelay: number = 0;\n\n private dragStartTime: number = 0;\n private dragStartPosition: IPoint = PointExtensions.initialize();\n\n public abstract disabled: boolean;\n\n private moveHandler: Function = this.checkDragSequenceToStart;\n\n protected constructor(\n protected ngZone: ICanRunOutsideAngular\n ) {\n }\n\n private onMouseDown = (event: MouseEvent) => {\n const isSyntheticEvent = this.isSyntheticEvent(event);\n const isFakeEvent = isFakeMousedownFromScreenReader(event);\n const mouseEvent = new IMouseEvent(event);\n\n if (isSyntheticEvent || isFakeEvent || this.disabled) {\n return;\n }\n let result = this.onPointerDown(mouseEvent);\n if (result) {\n\n this.dragStartTime = Date.now();\n this.dragStartPosition = mouseEvent.getPosition();\n\n this.ngZone.runOutsideAngular(() => {\n this.element.addEventListener('selectstart', this.preventDefault, EventExtensions.activeListener());\n this.element.addEventListener('mousemove', this.onMouseMove);\n this.element.addEventListener('mouseup', this.onMouseUp);\n });\n\n this.mouseListeners = () => {\n this.element.removeEventListener('selectstart', this.preventDefault, EventExtensions.activeListener());\n this.element.removeEventListener('mousemove', this.onMouseMove);\n this.element.removeEventListener('mouseup', this.onMouseUp);\n };\n }\n }\n\n private onTouchDown = (event: TouchEvent) => {\n const isFakeEvent = isFakeTouchstartFromScreenReader(event as TouchEvent)\n const touchEvent = new ITouchDownEvent(event);\n\n if (isFakeEvent || this.disabled) {\n return;\n }\n let result = this.onPointerDown(new ITouchDownEvent(event));\n if (result) {\n\n this.dragStartTime = Date.now();\n this.dragStartPosition = touchEvent.getPosition();\n\n this.ngZone.runOutsideAngular(() => {\n this.element.addEventListener('selectstart', this.preventDefault, EventExtensions.activeListener());\n this.element.addEventListener('touchmove', this.onTouchMove);\n this.element.addEventListener('touchend', this.onTouchUp);\n });\n\n this.touchListeners = () => {\n this.element.removeEventListener('selectstart', this.preventDefault, EventExtensions.activeListener());\n this.element.removeEventListener('touchmove', this.onTouchMove);\n this.element.removeEventListener('touchend', this.onTouchUp);\n };\n }\n }\n\n private onMouseMove = (event: MouseEvent) => {\n this.moveHandler(new IMouseEvent(event));\n }\n\n private onTouchMove = (event: TouchEvent) => {\n this.moveHandler(new ITouchMoveEvent(event));\n }\n\n private checkDragSequenceToStart(event: IPointerEvent): void {\n const pointerPosition = event.getPosition();\n\n if (!this.isDragStarted) {\n const distanceX = Math.abs(pointerPosition.x - this.dragStartPosition.x);\n const distanceY = Math.abs(pointerPosition.y - this.dragStartPosition.y);\n const isOverThreshold = distanceX + distanceY >= this.dragStartThreshold;\n\n if (isOverThreshold) {\n const isDelayElapsed = Date.now() >= this.dragStartTime + this.dragStartDelay;\n\n if (!isDelayElapsed) {\n this.endDragSequence();\n return;\n }\n\n event.preventDefault();\n this.prepareDragSequence(event);\n this.isDragStarted = true;\n this.moveHandler = this.onPointerMove;\n if (isTouchEvent(event.originalEvent)) {\n this.lastTouchEventTime = Date.now();\n }\n }\n }\n }\n\n protected abstract prepareDragSequence(event: IPointerEvent): void;\n\n private onMouseUp = (event: MouseEvent) => {\n if (this.isDragStarted) {\n this.onPointerUp(new IMouseEvent(event));\n }\n this.endDragSequence();\n }\n\n private onTouchUp = (event: TouchEvent) => {\n if (this.isDragStarted) {\n this.onPointerUp(new ITouchUpEvent(event));\n }\n this.endDragSequence();\n }\n\n private endDragSequence(): void {\n this.isDragStarted = false;\n this.moveHandler = this.checkDragSequenceToStart;\n this.mouseListeners();\n this.mouseListeners = EventExtensions.emptyListener();\n this.touchListeners();\n this.touchListeners = EventExtensions.emptyListener();\n }\n\n protected abstract onPointerDown(event: IPointerEvent): boolean;\n\n protected abstract onPointerMove(event: IPointerEvent): void;\n\n protected abstract onPointerUp(event: IPointerEvent): void;\n\n protected subscribe(elementToSubscribe: Document): void {\n if (this.element) {\n this.unsubscribe();\n }\n this.element = elementToSubscribe;\n\n this.ngZone.runOutsideAngular(() => {\n this.element.addEventListener('mousedown', this.onMouseDown, EventExtensions.activeListener());\n this.element.addEventListener('touchstart', this.onTouchDown, EventExtensions.passiveListener());\n });\n\n this.startListeners = () => {\n this.element.removeEventListener('mousedown', this.onMouseDown, EventExtensions.activeListener());\n this.element.removeEventListener('touchstart', this.onTouchDown, EventExtensions.passiveListener());\n };\n }\n\n protected unsubscribe(): void {\n\n this.startListeners();\n this.startListeners = EventExtensions.emptyListener();\n this.touchListeners();\n this.touchListeners = EventExtensions.emptyListener();\n this.mouseListeners();\n this.mouseListeners = EventExtensions.emptyListener();\n }\n\n protected preventDefault = (event: Event) => {\n event.preventDefault();\n };\n}\n\nfunction isTouchEvent(event: MouseEvent | TouchEvent): event is TouchEvent {\n return event.type[ 0 ] === 't';\n}\n\nfunction isFakeMousedownFromScreenReader(event: MouseEvent): boolean {\n return event.buttons === 0 || (event.offsetX === 0 && event.offsetY === 0);\n}\n\nfunction isFakeTouchstartFromScreenReader(event: TouchEvent): boolean {\n const touch: Touch | undefined =\n (event.touches && event.touches[ 0 ]) || (event.changedTouches && event.changedTouches[ 0 ]);\n return (\n !!touch &&\n touch.identifier === -1 &&\n (touch.radiusX == null || touch.radiusX === 1) &&\n (touch.radiusY == null || touch.radiusY === 1)\n );\n}\n","import {\n AfterViewInit, booleanAttribute,\n Directive,\n ElementRef, EventEmitter, Inject,\n Injector,\n Input,\n NgZone,\n OnDestroy,\n Output\n} from '@angular/core';\nimport { FDraggableBase } from './f-draggable-base';\nimport { of, Subject, Subscription, switchMap } from 'rxjs';\nimport { DOCUMENT } from '@angular/common';\nimport { IPointerEvent, Point } from '@foblex/core';\nimport { isDragHandle } from './f-drag-handle';\nimport { F_DRAGGABLE_STATE, FDraggableState } from './f-draggable.state';\nimport {\n GetDragResultHandler,\n FCellItemDragStart, GetCellUnderPointerHandler, GetCellUnderPointerRequest\n} from './domain';\nimport { FMoveEvent } from './domain';\nimport { FBodyCellBase } from '../f-body';\n\n@Directive({\n selector: \"fDraggable\",\n standalone: true,\n providers: [\n FDraggableState,\n { provide: F_DRAGGABLE_STATE, useExisting: FDraggableState },\n GetCellUnderPointerHandler,\n FCellItemDragStart,\n GetDragResultHandler\n ],\n host: {\n '[class.f-disabled]': 'disabled'\n }\n})\nexport class FDraggableDirective extends FDraggableBase implements AfterViewInit, OnDestroy {\n\n private subscriptions$: Subscription = new Subscription();\n\n @Input({ transform: booleanAttribute })\n public override disabled: boolean = false;\n\n public get hostElement(): HTMLElement {\n return this.elementReference.nativeElement;\n }\n\n @Output()\n public fMovedTo: EventEmitter<FMoveEvent> = new EventEmitter<FMoveEvent>();\n\n private readonly document: Document;\n\n private fBodyCell: FBodyCellBase | undefined;\n\n constructor(\n private elementReference: ElementRef<HTMLElement>,\n ngZone: NgZone,\n private injector: Injector,\n @Inject(DOCUMENT) document: any,\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState\n ) {\n super(ngZone);\n this.document = document as Document;\n }\n\n public ngAfterViewInit(): void {\n super.subscribe(this.document);\n }\n\n protected override onPointerDown(event: IPointerEvent): boolean {\n let result: boolean =\n event.isMouseLeftButton()\n && isDragHandle(event.targetElement)\n && !this.isDragStarted;\n\n return result;\n }\n\n protected override prepareDragSequence(event: IPointerEvent) {\n\n //TODO: Selection area (for future)\n\n this.injector.get(FCellItemDragStart).handle(event);\n\n this.fDraggableState.draggedItems.forEach((item) => {\n item.prepare?.();\n });\n\n this.hostElement.classList.add('f-dragging');\n }\n\n protected override onPointerMove(event: IPointerEvent): void {\n const pointerPositionInCanvas = Point.fromPoint(event.getPosition()).elementTransform(this.hostElement);\n const difference = pointerPositionInCanvas.div(this.fDraggableState.onPointerDownScale).sub(this.fDraggableState.onPointerDownPosition);\n this.fDraggableState.draggedItems.forEach((item) => {\n item.move(difference);\n });\n this.fBodyCell?.clearHighlight();\n this.fBodyCell = this.getFBodyCellUnderPointer(event);\n this.fBodyCell?.highlight();\n }\n\n protected override onPointerUp(event: IPointerEvent): void {\n\n //TODO: Selection area (for future)\n\n const dragResult = this.injector.get(GetDragResultHandler).handle();\n\n if (dragResult.length) {\n const targetCell = this.getFBodyCellUnderPointer(event);\n if (targetCell) {\n this.fMovedTo.emit(new FMoveEvent(dragResult, targetCell.id));\n }\n }\n\n this.hostElement.classList.remove('f-dragging');\n this.fBodyCell?.clearHighlight();\n this.fDraggableState.reset();\n }\n\n private getFBodyCellUnderPointer(event: IPointerEvent): FBodyCellBase | undefined {\n return this.injector.get(GetCellUnderPointerHandler).handle(\n new GetCellUnderPointerRequest(event)\n );\n }\n\n public ngOnDestroy(): void {\n super.unsubscribe();\n this.subscriptions$.unsubscribe();\n }\n}\n\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n OnDestroy, OnInit\r\n} from '@angular/core';\r\nimport { F_BODY_CELL, FBodyCellBase } from './f-body-cell-base';\r\nimport { F_DRAGGABLE_STATE, FDraggableState } from '../../f-draggable';\r\n\r\nlet uniqueId: number = 0;\r\n\r\n@Component({\r\n selector: 'f-body-cell',\r\n templateUrl: './f-body-cell.component.html',\r\n styleUrl: './f-body-cell.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [{\r\n provide: F_BODY_CELL,\r\n useExisting: FBodyCellComponent\r\n }],\r\n host: {\r\n 'class': 'f-component f-cell f-body-cell',\r\n '[attr.id]': 'id',\r\n '[class.f-disabled]': 'disabled'\r\n }\r\n})\r\nexport class FBodyCellComponent extends FBodyCellBase implements OnInit, OnDestroy {\r\n\r\n public uid = `f-body-cell-${ uniqueId++ }`;\r\n\r\n @Input()\r\n public override get id(): string {\r\n return this._id!;\r\n }\r\n\r\n public override set id(value: any) {\r\n this._id = value || this.uid;\r\n }\r\n\r\n private _id: string | undefined;\r\n\r\n public override get hostElement(): HTMLElement {\r\n return this.elementReference.nativeElement;\r\n }\r\n\r\n @Input({ transform: booleanAttribute })\r\n public override disabled: boolean = false;\r\n\r\n constructor(\r\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\r\n private elementReference: ElementRef<HTMLElement>\r\n ) {\r\n super();\r\n this.id = this.id;\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.fDraggableState.addCell(this);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.fDraggableState.removeCell(this);\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'f-body',\r\n templateUrl: './f-body.component.html',\r\n styleUrl: './f-body.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-body'\r\n }\r\n})\r\nexport class FBodyComponent {\r\n\r\n}\r\n\r\n","<ng-content></ng-content>\r\n\r\n\r\n\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'f-body-row',\r\n templateUrl: './f-body-row.component.html',\r\n styleUrl: './f-body-row.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-body-row'\r\n }\r\n})\r\nexport class FBodyRowComponent {\r\n\r\n}\r\n\r\n","<ng-content></ng-content>\r\n\r\n\r\n\r\n\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component, ElementRef,\r\n Inject,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { F_DRAGGABLE_STATE, FDraggableDirective, FDraggableState } from '../f-draggable';\r\nimport { IHasHostElement } from '@foblex/core';\r\n\r\n@Component({\r\n selector: 'f-drag-grid',\r\n templateUrl: './f-drag-grid.component.html',\r\n styleUrl: './f-drag-grid.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n hostDirectives: [ {\r\n directive: FDraggableDirective,\r\n inputs: ['disabled'],\r\n outputs: ['fMovedTo'],\r\n } ],\r\n host: {\r\n 'class': 'f-component f-drag-grid'\r\n }\r\n})\r\nexport class FDragGridComponent implements OnInit, IHasHostElement {\r\n\r\n public get hostElement(): HTMLElement {\r\n return this.elementReference.nativeElement;\r\n }\r\n\r\n constructor(\r\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\r\n private elementReference: ElementRef<HTMLElement>\r\n ) {\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.fDraggableState.setContainerHost(this.hostElement);\r\n }\r\n}\r\n","<ng-content></ng-content>\r\n","import { IHasHostElement } from '@foblex/core';\n\nexport abstract class FCellItemBase implements IHasHostElement {\n\n public abstract uid: string;\n\n public abstract id: string;\n\n public abstract hostElement: HTMLElement;\n\n public abstract disabled: boolean;\n\n public abstract parentId: string;\n\n public highlight(): void {\n this.hostElement.classList.add('f-dragged');\n }\n\n public clearHighlight(): void {\n this.hostElement.classList.remove('f-dragged');\n }\n}\n","import {\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n Inject,\r\n Input,\r\n OnDestroy,\r\n OnInit\r\n} from '@angular/core';\r\nimport { FCellItemBase } from './f-cell-item-base';\r\nimport { F_DRAGGABLE_STATE, FDraggableState } from '../f-draggable';\r\nimport { F_BODY_CELL, FBodyCellBase } from '../f-body';\r\n\r\nlet uniqueId: number = 0;\r\n\r\n@Component({\r\n selector: 'f-cell-item',\r\n templateUrl: './f-cell-item.component.html',\r\n styleUrl: './f-cell-item.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-cell-item',\r\n '[attr.id]': 'id',\r\n '[class.f-disabled]': 'disabled'\r\n }\r\n})\r\nexport class FCellItemComponent extends FCellItemBase implements OnInit, OnDestroy {\r\n\r\n public uid = `f-drag-table-item-${ uniqueId++ }`;\r\n\r\n @Input()\r\n public override get id(): string {\r\n return this._id!;\r\n }\r\n\r\n public override set id(value: any) {\r\n this._id = value || this.uid;\r\n }\r\n\r\n private _id: string | undefined;\r\n\r\n public override get hostElement(): HTMLElement {\r\n return this.elementReference.nativeElement;\r\n }\r\n\r\n @Input({ transform: booleanAttribute })\r\n public override disabled: boolean = false;\r\n\r\n public override get parentId(): string {\r\n return this.fBodyCell.id;\r\n }\r\n\r\n constructor(\r\n @Inject(F_DRAGGABLE_STATE) private fDraggableState: FDraggableState,\r\n @Inject(F_BODY_CELL) private fBodyCell: FBodyCellBase,\r\n private elementReference: ElementRef<HTMLElement>\r\n ) {\r\n super();\r\n this.id = this.id;\r\n }\r\n\r\n public ngOnInit(): void {\r\n this.fDraggableState.addItem(this);\r\n }\r\n\r\n public ngOnDestroy(): void {\r\n this.fDraggableState.removeItem(this);\r\n }\r\n}\r\n","\r\n<ng-content></ng-content>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'f-header-cell',\r\n templateUrl: './f-header-cell.component.html',\r\n styleUrl: './f-header-cell.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-cell f-header-cell'\r\n }\r\n})\r\nexport class FHeaderCellComponent {\r\n\r\n}\r\n","<ng-content></ng-content>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'f-header',\r\n templateUrl: './f-header.component.html',\r\n styleUrl: './f-header.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-header'\r\n }\r\n})\r\nexport class FHeaderComponent {\r\n\r\n}\r\n\r\n","<ng-content></ng-content>\r\n\r\n\r\n\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\n\r\n@Component({\r\n selector: 'f-header-row',\r\n templateUrl: './f-header-row.component.html',\r\n styleUrl: './f-header-row.component.scss',\r\n standalone: true,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n host: {\r\n 'class': 'f-component f-header-row'\r\n }\r\n})\r\nexport class FHeaderRowComponent {\r\n\r\n}\r\n\r\n","<ng-content></ng-content>\r\n\r\n\r\n\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["uniqueId"],"mappings":"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