{"version":3,"file":"acorex-components-kanban.mjs","sources":["../../../../packages/components/kanban/src/lib/kanban.component.ts","../../../../packages/components/kanban/src/lib/kanban.component.html","../../../../packages/components/kanban/src/acorex-components-kanban.ts"],"sourcesContent":["import { NXComponent } from '@acorex/cdk/common';\nimport { AXDragDirective, AXDropListDirective, AXDropListDroppedEvent } from '@acorex/cdk/drag-drop';\nimport { AXDecoratorGenericComponent, AXDecoratorHeadingComponent } from '@acorex/components/decorators';\nimport { AXTooltipDirective } from '@acorex/components/tooltip';\nimport { NgClass, NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, input, output, TemplateRef, ViewEncapsulation } from '@angular/core';\nimport {\n  AXKanbanBeforeDropEvent,\n  AXKanbanItem,\n  AXKanbanMouseEvent,\n  AXKanbanSortEvent,\n  AXKanbanStatus,\n} from './kanban.class';\n\n@Component({\n  selector: 'ax-kanban',\n  templateUrl: './kanban.component.html',\n  styleUrls: ['./kanban.component.css'],\n  encapsulation: ViewEncapsulation.None,\n\n  imports: [\n    NgClass,\n    NgTemplateOutlet,\n    AXDragDirective,\n    AXDropListDirective,\n    AXDecoratorGenericComponent,\n    AXDecoratorHeadingComponent,\n    // AXDecoratorIconComponent,\n    AXTooltipDirective,\n  ],\n})\nexport class AXKanbanComponent extends NXComponent {\n  hasActions = input(false);\n  dragStartDelay = input(0);\n  statuses = input<AXKanbanStatus[]>([]);\n  itemTemplate = input<TemplateRef<unknown>>();\n  dataSource = input<AXKanbanItem[] | any[]>();\n\n  keyField = input<string>('id');\n  indexField = input<string>('index');\n  titleField = input<string>('title');\n  cssClassField = input<string>('cssClass');\n  priorityField = input<string>('priority');\n  statusKeyField = input<string>('statusKey');\n  descriptionField = input<string>('description');\n  emptyTemplate = input<TemplateRef<unknown>>();\n  headerTemplate = input<TemplateRef<unknown>>();\n  footerTemplate = input<TemplateRef<unknown>>();\n  contentFooterTemplate = input<TemplateRef<unknown>>();\n  tooltipTemplate = input<string | TemplateRef<unknown>>();\n\n  onBeforeDrop = output<AXKanbanBeforeDropEvent>();\n  onSortChanged = output<AXKanbanSortEvent>();\n  onItemClick = output<AXKanbanMouseEvent>();\n  onActionClick = output<AXKanbanMouseEvent>();\n  onItemDblClick = output<AXKanbanMouseEvent>();\n  onItemRightClick = output<AXKanbanMouseEvent>();\n\n  protected items = computed<AXKanbanItem[]>(() => {\n    // ... your excellent gap-filling index logic remains the same ...\n    const dataSource = this.dataSource() || [];\n    const mappedItems = dataSource.map<AXKanbanItem>((item: any) => ({\n      id: item[this.keyField()],\n      index: item[this.indexField()],\n      title: item[this.titleField()],\n      cssClass: item[this.cssClassField()],\n      priority: item[this.priorityField()],\n      statusKey: item[this.statusKeyField()],\n      description: item[this.descriptionField()],\n    }));\n\n    const itemsByStatus = new Map<any, AXKanbanItem[]>();\n    for (const item of mappedItems) {\n      if (!itemsByStatus.has(item.statusKey)) {\n        itemsByStatus.set(item.statusKey, []);\n      }\n      itemsByStatus.get(item.statusKey).push(item);\n    }\n\n    const finalProcessedItems: AXKanbanItem[] = [];\n    for (const group of itemsByStatus.values()) {\n      const correctlyIndexedItems: AXKanbanItem[] = [];\n      const itemsToBeIndexed: AXKanbanItem[] = [];\n      const takenIndices = new Set<number>();\n      for (const item of group) {\n        const hasValidIndex = item.index != null && typeof item.index === 'number' && !takenIndices.has(item.index);\n        if (hasValidIndex) {\n          takenIndices.add(item.index);\n          correctlyIndexedItems.push(item);\n        } else {\n          itemsToBeIndexed.push(item);\n        }\n      }\n      let currentIndex = 0;\n      for (const item of itemsToBeIndexed) {\n        while (takenIndices.has(currentIndex)) {\n          currentIndex++;\n        }\n        item.index = currentIndex;\n        currentIndex++;\n      }\n      const processedGroup = [...correctlyIndexedItems, ...itemsToBeIndexed];\n      processedGroup.sort((a, b) => a.index - b.index);\n      finalProcessedItems.push(...processedGroup);\n    }\n    return finalProcessedItems;\n  });\n\n  protected filteredStatuses = computed(() => this.statuses().sort((a, b) => a.index - b.index));\n\n  /**\n   * Handles a drop operation to reorder items or move them between statuses.\n   * It uses the component's current rendered state (`this.items`) as the source\n   * of truth, performs precise re-indexing, and emits a comprehensive event with\n   * the updated data source.\n   *\n   * @param event AXDropListDroppedEvent - The drag-and-drop event including indices and container information.\n   * @returns Promise<void>\n   */\n  async drop(event: AXDropListDroppedEvent): Promise<void> {\n    const { item: droppedItemDirective, currentIndex, previousIndex, container, previousContainer } = event;\n\n    // --- 1. Get identifiers and the item's original data ---\n    const currentStatusKey = JSON.parse(container.element.id);\n    const previousStatusKey = JSON.parse(previousContainer.element.id);\n    const movedItemOriginalData = droppedItemDirective.dragData() as AXKanbanItem;\n\n    if (!movedItemOriginalData) {\n      console.warn('AXKanban: Dragged item has no [dragData]. Sort event cannot be emitted.');\n      return;\n    }\n\n    // --- 2. Get the original item from dataSource ---\n    const originalItemFromDataSource = this.dataSource().find(\n      (item) => item[this.keyField()] === movedItemOriginalData.id,\n    );\n\n    if (!originalItemFromDataSource) {\n      console.warn('AXKanban: Item not found in dataSource.');\n      return;\n    }\n\n    // --- 3. Perform the move operation ---\n    await this.performMove(\n      originalItemFromDataSource,\n      previousStatusKey,\n      currentStatusKey,\n      previousIndex,\n      currentIndex,\n      event.nativeEvent,\n    );\n  }\n\n  /**\n   * Programmatically move an item to a different status or reorder within the same status.\n   * @param itemId The ID of the item to move (using keyField)\n   * @param targetStatusKey The target status key to move the item to\n   * @param targetIndex Optional target index within the target status. If not provided, item will be appended to the end.\n   * @returns Promise<boolean> - true if the move was successful, false otherwise\n   */\n  async moveItem(itemId: any, targetStatusKey: any, targetIndex?: number): Promise<boolean> {\n    const keyField = this.keyField();\n    const originalItem = this.dataSource().find((item) => item[keyField] === itemId);\n\n    if (!originalItem) {\n      console.warn(`AXKanban: Item with id \"${itemId}\" not found in dataSource.`);\n      return false;\n    }\n\n    // Get current status from dataSource\n    const statusKeyField = this.statusKeyField();\n    const previousStatusKey = originalItem[statusKeyField];\n\n    // Get current index from the computed items state (more accurate than dataSource field)\n    const currentItem = this.items().find((i) => i.id === itemId);\n    const previousIndex = currentItem?.index ?? 0;\n\n    // If target index is not provided, append to the end\n    let currentIndex = targetIndex;\n    if (currentIndex === undefined) {\n      const targetStatusItems = this.items().filter((i) => i.statusKey === targetStatusKey);\n      currentIndex = targetStatusItems.length;\n    }\n\n    // Perform the move\n    return await this.performMove(originalItem, previousStatusKey, targetStatusKey, previousIndex, currentIndex, null);\n  }\n\n  /**\n   * Programmatically reorder an item within the same status.\n   * @param itemId The ID of the item to reorder (using keyField)\n   * @param newIndex The new index position within the same status\n   * @returns Promise<boolean> - true if the reorder was successful, false otherwise\n   */\n  async reorderItem(itemId: any, newIndex: number): Promise<boolean> {\n    const keyField = this.keyField();\n    const originalItem = this.dataSource().find((item) => item[keyField] === itemId);\n\n    if (!originalItem) {\n      console.warn(`AXKanban: Item with id \"${itemId}\" not found in dataSource.`);\n      return false;\n    }\n\n    // Get current status from dataSource\n    const statusKeyField = this.statusKeyField();\n    const statusKey = originalItem[statusKeyField];\n\n    // Get current index from the computed items state (more accurate than dataSource field)\n    const currentItem = this.items().find((i) => i.id === itemId);\n    const previousIndex = currentItem?.index ?? 0;\n\n    // Perform the move (same status, different index)\n    return await this.performMove(originalItem, statusKey, statusKey, previousIndex, newIndex, null);\n  }\n\n  /**\n   * Programmatically move an item to a different status.\n   * @param itemId The ID of the item to move (using keyField)\n   * @param targetStatusKey The target status key to move the item to\n   * @param targetIndex Optional target index within the target status. If not provided, item will be appended to the end.\n   * @returns Promise<boolean> - true if the move was successful, false otherwise\n   */\n  async moveItemToStatus(itemId: any, targetStatusKey: any, targetIndex?: number): Promise<boolean> {\n    return await this.moveItem(itemId, targetStatusKey, targetIndex);\n  }\n\n  /**\n   * Core method that performs the move operation, handles re-indexing, and emits events.\n   * This is used by both drag-and-drop operations and programmatic moves.\n   *\n   * @param originalItem The original item from dataSource that is being moved\n   * @param previousStatusKey The status key the item is moving from\n   * @param currentStatusKey The status key the item is moving to\n   * @param previousIndex The index the item is moving from\n   * @param currentIndex The index the item is moving to\n   * @param nativeEvent The native mouse event (null for programmatic moves)\n   * @returns Promise<boolean> - true if the move was successful, false otherwise\n   */\n  private async performMove(\n    originalItem: any,\n    previousStatusKey: any,\n    currentStatusKey: any,\n    previousIndex: number,\n    currentIndex: number,\n    nativeEvent: MouseEvent | null,\n  ): Promise<boolean> {\n    // --- 1. Emit beforeDrop event and check if drop should be canceled ---\n    const shouldProceed = await this.emitBeforeDropEvent(\n      originalItem,\n      previousStatusKey,\n      currentStatusKey,\n      previousIndex,\n      currentIndex,\n      nativeEvent,\n    );\n    if (!shouldProceed) {\n      return false;\n    }\n\n    // --- 2. Use the `items` computed property as the source of truth for the operation ---\n    // This is the CRUCIAL FIX. We operate on the data as it was rendered.\n    const currentItemsState = structuredClone(this.items());\n\n    // --- 3. Perform the move operation based on the scenario ---\n    if (previousStatusKey === currentStatusKey) {\n      // --- Scenario A: Reordering within the same list ---\n      const list = currentItemsState.filter((i) => i.statusKey === currentStatusKey);\n\n      // Remove from the old position and insert into the new position\n      const [movedItem] = list.splice(previousIndex, 1);\n      list.splice(currentIndex, 0, movedItem);\n\n      // Re-index only this modified list\n      list.forEach((item, idx) => (item.index = idx));\n    } else {\n      // --- Scenario B: Moving to a different list ---\n      const sourceList = currentItemsState.filter((i) => i.statusKey === previousStatusKey);\n      const destList = currentItemsState.filter((i) => i.statusKey === currentStatusKey);\n\n      // Remove from source list\n      const [movedItem] = sourceList.splice(previousIndex, 1);\n\n      // Update its status and add to destination list\n      movedItem.statusKey = currentStatusKey;\n      destList.splice(currentIndex, 0, movedItem);\n\n      // Re-index both affected lists\n      sourceList.forEach((item, idx) => (item.index = idx));\n      destList.forEach((item, idx) => (item.index = idx));\n    }\n\n    // --- 4. Map the changes back to a new version of the original dataSource ---\n    // This preserves any extra properties the user might have on their data objects.\n    const keyField = this.keyField();\n    const statusKeyField = this.statusKeyField();\n    const indexField = this.indexField();\n\n    const updatedItemsMap = new Map(currentItemsState.map((i) => [i.id, i]));\n    const finalDataSource = structuredClone(this.dataSource());\n\n    finalDataSource.forEach((originalItem) => {\n      const updatedItem = updatedItemsMap.get(originalItem[keyField]);\n      if (updatedItem) {\n        originalItem[indexField] = updatedItem.index;\n        originalItem[statusKeyField] = updatedItem.statusKey;\n      }\n    });\n\n    const movedItemId = originalItem[keyField];\n    const finalOriginalItemFromDataSource = finalDataSource.find((item) => item[keyField] === movedItemId);\n\n    // --- 5. Emit the final, comprehensive event ---\n    this.onSortChanged.emit({\n      sender: this,\n      nativeEvent: nativeEvent,\n      // The original data object that was moved\n      item: finalOriginalItemFromDataSource,\n      // The complete, precisely re-indexed data source, ready for state update\n      allItems: finalDataSource,\n      currentIndex,\n      previousIndex,\n      currentStatusKey,\n      previousStatusKey,\n    });\n\n    return true;\n  }\n\n  /**\n   * Emit beforeDrop event and return whether to continue with the drop operation.\n   * Supports both synchronous and asynchronous event handlers via the `wait()` method.\n   * @param item The original item from dataSource that is being moved\n   * @param previousStatusKey The status key the item is moving from\n   * @param currentStatusKey The status key the item is moving to\n   * @param previousIndex The index the item is moving from\n   * @param currentIndex The index the item is moving to\n   * @param nativeEvent The native mouse event (null for programmatic moves)\n   * @returns Promise<boolean> - true if the drop should proceed, false if it should be canceled\n   */\n  private async emitBeforeDropEvent(\n    item: any,\n    previousStatusKey: any,\n    currentStatusKey: any,\n    previousIndex: number,\n    currentIndex: number,\n    nativeEvent: MouseEvent | null,\n  ): Promise<boolean> {\n    const pendingPromises: Promise<any>[] = [];\n\n    const beforeDropEvent: AXKanbanBeforeDropEvent = {\n      sender: this,\n      nativeEvent,\n      item,\n      previousStatusKey,\n      currentStatusKey,\n      previousIndex,\n      currentIndex,\n      canceled: false,\n      wait: (promise: Promise<any>) => {\n        pendingPromises.push(promise);\n      },\n    };\n\n    // Emit the event - handlers can call event.wait() to register async operations\n    this.onBeforeDrop.emit(beforeDropEvent);\n\n    // Wait for all registered async operations to complete\n    if (pendingPromises.length > 0) {\n      await Promise.all(pendingPromises);\n    }\n\n    // After all async operations complete, check if the drop was canceled\n    return !beforeDropEvent.canceled;\n  }\n\n  protected getItemsById(key: any): AXKanbanItem[] {\n    return this.items().filter((e) => e.statusKey === key);\n  }\n\n  protected getOriginalItemsById(key: any): any[] {\n    return this.dataSource().filter((e) => e[this.statusKeyField()] === key);\n  }\n\n  protected stringify(value: any): string {\n    return JSON.stringify(value);\n  }\n\n  protected handleActionClick(event: MouseEvent, item: AXKanbanItem) {\n    const originalItemFromDataSource = this.dataSource().find(\n      (originalItem) => originalItem[this.keyField()] === item.id,\n    );\n    this.onActionClick.emit({ item: originalItemFromDataSource, nativeEvent: event, sender: this });\n  }\n\n  protected handleClick(event: MouseEvent, item: AXKanbanItem) {\n    const originalItemFromDataSource = this.dataSource().find(\n      (originalItem) => originalItem[this.keyField()] === item.id,\n    );\n    this.onItemClick.emit({ item: originalItemFromDataSource, nativeEvent: event, sender: this });\n  }\n\n  protected handleDblClick(event: MouseEvent, item: AXKanbanItem) {\n    const originalItemFromDataSource = this.dataSource().find(\n      (originalItem) => originalItem[this.keyField()] === item.id,\n    );\n    this.onItemDblClick.emit({ item: originalItemFromDataSource, nativeEvent: event, sender: this });\n  }\n\n  protected handleRightClick(event: MouseEvent, item: AXKanbanItem) {\n    const originalItemFromDataSource = this.dataSource().find(\n      (originalItem) => originalItem[this.keyField()] === item.id,\n    );\n    this.onItemRightClick.emit({ item: originalItemFromDataSource, nativeEvent: event, sender: this });\n  }\n}\n","@for (status of filteredStatuses(); track status.key) {\n  <div class=\"ax-kanban-status {{ status.cssClass }}\">\n    <ax-header>\n      @if (headerTemplate()) {\n        <ng-container\n          [ngTemplateOutlet]=\"headerTemplate()\"\n          [ngTemplateOutletContext]=\"{ $implicit: status }\"\n        ></ng-container>\n      } @else {\n        <ax-title>{{ status.title }}</ax-title>\n      }\n    </ax-header>\n    <ax-content axDropList dropListGroup=\"kanban\" [id]=\"stringify(status.key)\" (dropListDropped)=\"drop($event)\">\n      @if (emptyTemplate() && getOriginalItemsById(status.key).length === 0) {\n        <ng-container\n          [ngTemplateOutlet]=\"emptyTemplate()\"\n          [ngTemplateOutletContext]=\"{ $implicit: status }\"\n        ></ng-container>\n      }\n      @if (itemTemplate()) {\n        @for (item of getOriginalItemsById(status.key); track item[keyField()]) {\n          <div\n            axDrag\n            [dragData]=\"item\"\n            class=\"{{ item.cssClass }}\"\n            [dragStartDelay]=\"dragStartDelay()\"\n            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n            [axTooltip]=\"tooltipTemplate()\"\n            [axTooltipContext]=\"item\"\n            (click)=\"handleClick($event, item)\"\n            (dblclick)=\"handleDblClick($event, item)\"\n            (contextmenu)=\"handleRightClick($event, item)\"\n          >\n            <ng-container\n              [ngTemplateOutlet]=\"itemTemplate()\"\n              [ngTemplateOutletContext]=\"{ $implicit: item }\"\n            ></ng-container>\n          </div>\n        }\n      } @else {\n        @for (item of getItemsById(status.key); track item.id) {\n          <div\n            axDrag\n            [dragData]=\"item\"\n            [dragCursor]=\"'grab'\"\n            [dragStartDelay]=\"dragStartDelay()\"\n            class=\"ax-kanban-item  {{ item.cssClass }}\"\n            [ngClass]=\"`ax-kanban-${item.priority ?? 'primary'}-periority`\"\n            [axTooltipDisabled]=\"tooltipTemplate() ? false : true\"\n            [axTooltip]=\"tooltipTemplate()\"\n            [axTooltipContext]=\"item\"\n            (click)=\"handleClick($event, item)\"\n            (dblclick)=\"handleDblClick($event, item)\"\n            (contextmenu)=\"handleRightClick($event, item)\"\n          >\n            <ax-heading>\n              <ax-title>\n                <span class=\"ax-kanban-truncate\">{{ item.title }}</span>\n                @if (hasActions()) {\n                  <!-- <ax-icon\n                    class=\"ax-icon ax-icon-more-horizontal ax-kanban-action-icon\"\n                    (click)=\"handleActionClick($event, item)\"\n                  >\n                  </ax-icon> -->\n                }\n              </ax-title>\n              <ax-subtitle>{{ item.description }}</ax-subtitle>\n            </ax-heading>\n          </div>\n        }\n      }\n      @if (contentFooterTemplate()) {\n        <ax-footer>\n          <ng-container\n            [ngTemplateOutlet]=\"contentFooterTemplate()\"\n            [ngTemplateOutletContext]=\"{ $implicit: status }\"\n          ></ng-container>\n        </ax-footer>\n      }\n    </ax-content>\n    @if (footerTemplate()) {\n      <ax-footer>\n        <ng-container\n          [ngTemplateOutlet]=\"footerTemplate()\"\n          [ngTemplateOutletContext]=\"{ $implicit: status }\"\n        ></ng-container>\n      </ax-footer>\n    }\n  </div>\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}