@composy/kanban-core 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +171 -37
  2. package/dist/index.css +114 -114
  3. package/dist/index.js +221 -126
  4. package/dist/index.js.map +1 -1
  5. package/dist/index.min.css +1 -1
  6. package/dist/index.min.js +758 -1
  7. package/dist/index.min.js.map +1 -0
  8. package/es/.dts-output-manifest.json +1 -0
  9. package/es/.dts.tsbuildinfo +1 -0
  10. package/es/core/ColumnManager.d.ts +4 -3
  11. package/es/core/ColumnManager.js +43 -18
  12. package/es/core/ColumnManager.js.map +1 -1
  13. package/es/core/DragController.d.ts +1 -2
  14. package/es/core/DragController.js +11 -1
  15. package/es/core/DragController.js.map +1 -1
  16. package/es/core/EventEmitter.d.ts +0 -1
  17. package/es/core/EventEmitter.js +8 -3
  18. package/es/core/EventEmitter.js.map +1 -1
  19. package/es/core/FilterEngine.d.ts +1 -2
  20. package/es/core/FilterEngine.js +10 -5
  21. package/es/core/FilterEngine.js.map +1 -1
  22. package/es/core/KanbanBoard.d.ts +3 -3
  23. package/es/core/KanbanBoard.js +61 -15
  24. package/es/core/KanbanBoard.js.map +1 -1
  25. package/es/core/Renderer.d.ts +2 -3
  26. package/es/core/Renderer.js +11 -7
  27. package/es/core/Renderer.js.map +1 -1
  28. package/es/core/index.d.ts +2 -3
  29. package/es/core/index.js +1 -1
  30. package/es/index.d.ts +3 -4
  31. package/es/index.js +2 -2
  32. package/es/styles/kanban.css +114 -114
  33. package/es/types/index.d.ts +3 -4
  34. package/es/types/index.js +1 -1
  35. package/es/utils/dom.d.ts +0 -1
  36. package/es/utils/dom.js +1 -1
  37. package/es/utils/dom.js.map +1 -1
  38. package/es/utils/id.d.ts +0 -1
  39. package/es/utils/id.js +1 -1
  40. package/es/utils/id.js.map +1 -1
  41. package/es/utils/index.d.ts +1 -2
  42. package/es/utils/index.js +1 -1
  43. package/es/utils/index.js.map +1 -1
  44. package/es/version.d.ts +0 -1
  45. package/es/version.js +1 -1
  46. package/es/version.js.map +1 -1
  47. package/esm/core/ColumnManager.js +43 -18
  48. package/esm/core/ColumnManager.js.map +1 -1
  49. package/esm/core/DragController.js +11 -1
  50. package/esm/core/DragController.js.map +1 -1
  51. package/esm/core/EventEmitter.js +8 -3
  52. package/esm/core/EventEmitter.js.map +1 -1
  53. package/esm/core/FilterEngine.js +10 -5
  54. package/esm/core/FilterEngine.js.map +1 -1
  55. package/esm/core/KanbanBoard.js +63 -17
  56. package/esm/core/KanbanBoard.js.map +1 -1
  57. package/esm/core/Renderer.js +11 -7
  58. package/esm/core/Renderer.js.map +1 -1
  59. package/esm/index.js +4 -4
  60. package/esm/styles/kanban.less +357 -339
  61. package/esm/utils/dom.js +1 -1
  62. package/esm/utils/dom.js.map +1 -1
  63. package/esm/utils/id.js +1 -1
  64. package/esm/utils/id.js.map +1 -1
  65. package/esm/utils/index.js +2 -2
  66. package/esm/utils/index.js.map +1 -1
  67. package/esm/version.js +1 -1
  68. package/esm/version.js.map +1 -1
  69. package/lib/core/ColumnManager.cjs +43 -18
  70. package/lib/core/ColumnManager.cjs.map +1 -1
  71. package/{esm/core/ColumnManager.d.ts → lib/core/ColumnManager.d.cts} +4 -3
  72. package/lib/core/DragController.cjs +11 -1
  73. package/lib/core/DragController.cjs.map +1 -1
  74. package/{esm/core/DragController.d.ts → lib/core/DragController.d.cts} +1 -2
  75. package/lib/core/EventEmitter.cjs +8 -3
  76. package/lib/core/EventEmitter.cjs.map +1 -1
  77. package/lib/core/{EventEmitter.d.ts → EventEmitter.d.cts} +0 -1
  78. package/lib/core/FilterEngine.cjs +10 -5
  79. package/lib/core/FilterEngine.cjs.map +1 -1
  80. package/{esm/core/FilterEngine.d.ts → lib/core/FilterEngine.d.cts} +1 -2
  81. package/lib/core/KanbanBoard.cjs +61 -15
  82. package/lib/core/KanbanBoard.cjs.map +1 -1
  83. package/{esm/core/KanbanBoard.d.ts → lib/core/KanbanBoard.d.cts} +3 -3
  84. package/lib/core/Renderer.cjs +11 -7
  85. package/lib/core/Renderer.cjs.map +1 -1
  86. package/{esm/core/Renderer.d.ts → lib/core/Renderer.d.cts} +2 -3
  87. package/lib/core/index.cjs +1 -1
  88. package/{esm/core/index.d.ts → lib/core/index.d.cts} +2 -3
  89. package/lib/index.cjs +2 -2
  90. package/lib/{index.d.ts → index.d.cts} +3 -4
  91. package/lib/styles/kanban.css +114 -114
  92. package/lib/types/index.cjs +1 -1
  93. package/{esm/types/index.d.ts → lib/types/index.d.cts} +3 -4
  94. package/lib/utils/dom.cjs +1 -1
  95. package/lib/utils/dom.cjs.map +1 -1
  96. package/lib/utils/{dom.d.ts → dom.d.cts} +0 -1
  97. package/lib/utils/id.cjs +1 -1
  98. package/lib/utils/id.cjs.map +1 -1
  99. package/{esm/utils/id.d.ts → lib/utils/id.d.cts} +0 -1
  100. package/lib/utils/index.cjs +1 -1
  101. package/lib/utils/index.cjs.map +1 -1
  102. package/lib/utils/{index.d.ts → index.d.cts} +1 -2
  103. package/lib/version.cjs +1 -1
  104. package/lib/version.cjs.map +1 -1
  105. package/{esm/version.d.ts → lib/version.d.cts} +0 -1
  106. package/package.json +23 -21
  107. package/es/core/ColumnManager.d.ts.map +0 -1
  108. package/es/core/DragController.d.ts.map +0 -1
  109. package/es/core/EventEmitter.d.ts.map +0 -1
  110. package/es/core/FilterEngine.d.ts.map +0 -1
  111. package/es/core/KanbanBoard.d.ts.map +0 -1
  112. package/es/core/Renderer.d.ts.map +0 -1
  113. package/es/core/index.d.ts.map +0 -1
  114. package/es/index.d.ts.map +0 -1
  115. package/es/types/index.d.ts.map +0 -1
  116. package/es/utils/dom.d.ts.map +0 -1
  117. package/es/utils/id.d.ts.map +0 -1
  118. package/es/utils/index.d.ts.map +0 -1
  119. package/es/version.d.ts.map +0 -1
  120. package/esm/core/ColumnManager.d.ts.map +0 -1
  121. package/esm/core/DragController.d.ts.map +0 -1
  122. package/esm/core/EventEmitter.d.ts +0 -35
  123. package/esm/core/EventEmitter.d.ts.map +0 -1
  124. package/esm/core/FilterEngine.d.ts.map +0 -1
  125. package/esm/core/KanbanBoard.d.ts.map +0 -1
  126. package/esm/core/Renderer.d.ts.map +0 -1
  127. package/esm/core/index.d.ts.map +0 -1
  128. package/esm/core/index.js +0 -17
  129. package/esm/index.d.ts +0 -15
  130. package/esm/index.d.ts.map +0 -1
  131. package/esm/types/index.d.ts.map +0 -1
  132. package/esm/types/index.js +0 -10
  133. package/esm/utils/dom.d.ts +0 -24
  134. package/esm/utils/dom.d.ts.map +0 -1
  135. package/esm/utils/id.d.ts.map +0 -1
  136. package/esm/utils/index.d.ts +0 -25
  137. package/esm/utils/index.d.ts.map +0 -1
  138. package/esm/version.d.ts.map +0 -1
  139. package/lib/core/ColumnManager.d.ts +0 -99
  140. package/lib/core/DragController.d.ts +0 -55
  141. package/lib/core/FilterEngine.d.ts +0 -45
  142. package/lib/core/KanbanBoard.d.ts +0 -152
  143. package/lib/core/Renderer.d.ts +0 -59
  144. package/lib/core/index.d.ts +0 -11
  145. package/lib/types/index.d.ts +0 -209
  146. package/lib/utils/id.d.ts +0 -9
  147. package/lib/version.d.ts +0 -6
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.min.js","names":[],"sources":["../src/utils/id.ts","../src/core/ColumnManager.ts","../src/core/DragController.ts","../src/core/EventEmitter.ts","../src/core/FilterEngine.ts","../src/utils/dom.ts","../src/version.ts","../src/core/Renderer.ts","../src/core/KanbanBoard.ts","../src/utils/index.ts"],"sourcesContent":["let counter = 0\r\n\r\n/**\r\n * 生成唯一 ID\r\n */\r\nexport function generateId(prefix = 'kb'): string {\r\n counter++\r\n const timestamp = Date.now().toString(36)\r\n const random = Math.random().toString(36).substring(2, 6)\r\n return `${prefix}_${timestamp}_${random}_${counter}`\r\n}\r\n\r\n/**\r\n * 重置计数器(仅测试用)\r\n */\r\nexport function resetIdCounter(): void {\r\n counter = 0\r\n}\r\n","import type { Card, Column } from '../types'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport { generateId } from '../utils/id'\r\n\r\n/**\r\n * 列管理器\r\n */\r\nexport class ColumnManager {\r\n private columns: Column[] = []\r\n private events: EventEmitter\r\n\r\n constructor(events: EventEmitter) {\r\n this.events = events\r\n }\r\n\r\n /**\r\n * 初始化列\r\n */\r\n init(columns: Partial<Column>[]): void {\r\n this.columns = columns.map((col, index) => this.normalizeColumn(col, index))\r\n this.sortColumns()\r\n }\r\n\r\n /**\r\n * 标准化列数据\r\n */\r\n private normalizeColumn(partial: Partial<Column>, index: number): Column {\r\n const id = partial.id || generateId('col')\r\n const cards = (partial.cards ?? []).map((card, cardIndex) =>\r\n this.normalizeCard({ ...card, columnId: id }, id, cardIndex)\r\n )\r\n cards.sort((a, b) => a.order - b.order)\r\n cards.forEach((card, cardIndex) => {\r\n card.order = cardIndex\r\n })\r\n return {\r\n id,\r\n title: partial.title ?? `Column ${index + 1}`,\r\n cards,\r\n wipLimit: partial.wipLimit,\r\n collapsed: partial.collapsed ?? false,\r\n color: partial.color,\r\n order: partial.order ?? index,\r\n }\r\n }\r\n\r\n /**\r\n * 标准化卡片数据\r\n */\r\n private normalizeCard(\r\n partial: Partial<Card>,\r\n columnId: string,\r\n index: number\r\n ): Card {\r\n const id = partial.id || generateId('card')\r\n return {\r\n id,\r\n title: partial.title ?? '',\r\n description: partial.description,\r\n labels: partial.labels?.map(label => ({ ...label })) ?? [],\r\n assignees: partial.assignees ? [...partial.assignees] : [],\r\n dueDate: partial.dueDate,\r\n priority: partial.priority,\r\n order: partial.order ?? index,\r\n columnId: partial.columnId ?? columnId,\r\n data: partial.data,\r\n createdAt: partial.createdAt ?? new Date().toISOString(),\r\n updatedAt: partial.updatedAt,\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有列\r\n */\r\n getColumns(): Column[] {\r\n return [...this.columns].sort((a, b) => a.order - b.order)\r\n }\r\n\r\n /**\r\n * 获取单列\r\n */\r\n getColumn(id: string): Column | undefined {\r\n return this.columns.find(c => c.id === id)\r\n }\r\n\r\n /**\r\n * 添加列\r\n */\r\n addColumn(partial: Partial<Column>): Column {\r\n const column = this.normalizeColumn(partial, this.columns.length)\r\n this.columns.push(column)\r\n this.sortColumns()\r\n this.events.emit('column:add', { column })\r\n return column\r\n }\r\n\r\n /**\r\n * 移除列\r\n */\r\n removeColumn(id: string): Column | undefined {\r\n const index = this.columns.findIndex(c => c.id === id)\r\n if (index === -1) return undefined\r\n const [column] = this.columns.splice(index, 1)\r\n this.reorderColumns()\r\n this.events.emit('column:remove', { column })\r\n return column\r\n }\r\n\r\n /**\r\n * 更新列\r\n */\r\n updateColumn(id: string, changes: Partial<Column>): Column | undefined {\r\n const column = this.columns.find(c => c.id === id)\r\n if (!column) return undefined\r\n Object.assign(column, changes, { id }) // 不允许更改 id\r\n if (changes.cards) {\r\n column.cards = changes.cards.map((card, index) =>\r\n this.normalizeCard(card, id, index)\r\n )\r\n column.cards.sort((a, b) => a.order - b.order)\r\n this.reorderCards(column)\r\n }\r\n if (changes.order !== undefined) this.sortColumns()\r\n this.events.emit('column:update', { column, changes })\r\n return column\r\n }\r\n\r\n /**\r\n * 移动列\r\n */\r\n moveColumn(id: string, toIndex: number): void {\r\n this.sortColumns()\r\n const fromIndex = this.columns.findIndex(c => c.id === id)\r\n if (fromIndex === -1) return\r\n const [column] = this.columns.splice(fromIndex, 1)\r\n const targetIndex = this.clampIndex(toIndex, this.columns.length)\r\n this.columns.splice(targetIndex, 0, column)\r\n this.reorderColumns()\r\n this.events.emit('column:move', { column, fromIndex, toIndex: targetIndex })\r\n }\r\n\r\n /**\r\n * 折叠/展开列\r\n */\r\n toggleCollapse(id: string): void {\r\n const column = this.columns.find(c => c.id === id)\r\n if (!column) return\r\n column.collapsed = !column.collapsed\r\n this.events.emit('column:collapse', { column, collapsed: column.collapsed })\r\n }\r\n\r\n /**\r\n * 获取列中的卡片\r\n */\r\n getCards(columnId: string): Card[] {\r\n const column = this.columns.find(c => c.id === columnId)\r\n return column ? [...column.cards].sort((a, b) => a.order - b.order) : []\r\n }\r\n\r\n /**\r\n * 添加卡片到列\r\n */\r\n addCard(columnId: string, partial: Partial<Card>): Card | undefined {\r\n const column = this.columns.find(c => c.id === columnId)\r\n if (!column) return undefined\r\n\r\n // 检查 WIP 限制\r\n if (column.wipLimit && column.cards.length >= column.wipLimit) {\r\n this.events.emit('error', {\r\n error: new Error(\r\n `Column \"${column.title}\" reached WIP limit (${column.wipLimit})`\r\n ),\r\n })\r\n return undefined\r\n }\r\n\r\n const card = this.normalizeCard(\r\n { ...partial, columnId },\r\n columnId,\r\n column.cards.length\r\n )\r\n column.cards.push(card)\r\n this.events.emit('card:add', { card, columnId })\r\n return card\r\n }\r\n\r\n /**\r\n * 移除卡片\r\n */\r\n removeCard(cardId: string): Card | undefined {\r\n for (const column of this.columns) {\r\n const index = column.cards.findIndex(c => c.id === cardId)\r\n if (index !== -1) {\r\n const [card] = column.cards.splice(index, 1)\r\n this.reorderCards(column)\r\n this.events.emit('card:remove', { card, columnId: column.id })\r\n return card\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 更新卡片\r\n */\r\n updateCard(cardId: string, changes: Partial<Card>): Card | undefined {\r\n for (const column of this.columns) {\r\n const card = column.cards.find(c => c.id === cardId)\r\n if (card) {\r\n Object.assign(card, changes, { id: cardId, columnId: column.id })\r\n card.updatedAt = new Date().toISOString()\r\n this.events.emit('card:update', { card, changes })\r\n return card\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 获取单张卡片\r\n */\r\n getCard(cardId: string): Card | undefined {\r\n for (const column of this.columns) {\r\n const card = column.cards.find(c => c.id === cardId)\r\n if (card) return card\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 移动卡片\r\n */\r\n moveCard(cardId: string, toColumnId: string, toIndex: number): void {\r\n let fromColumn: Column | undefined\r\n let cardIndex = -1\r\n\r\n for (const column of this.columns) {\r\n const idx = column.cards.findIndex(c => c.id === cardId)\r\n if (idx !== -1) {\r\n fromColumn = column\r\n cardIndex = idx\r\n break\r\n }\r\n }\r\n\r\n if (!fromColumn || cardIndex === -1) return\r\n\r\n const toColumn = this.columns.find(c => c.id === toColumnId)\r\n if (!toColumn) return\r\n\r\n // 检查 WIP 限制(跨列移动时)\r\n if (\r\n fromColumn.id !== toColumnId &&\r\n toColumn.wipLimit &&\r\n toColumn.cards.length >= toColumn.wipLimit\r\n ) {\r\n this.events.emit('error', {\r\n error: new Error(\r\n `Column \"${toColumn.title}\" reached WIP limit (${toColumn.wipLimit})`\r\n ),\r\n })\r\n return\r\n }\r\n\r\n const [card] = fromColumn.cards.splice(cardIndex, 1)\r\n card.columnId = toColumnId\r\n const targetIndex = this.clampIndex(toIndex, toColumn.cards.length)\r\n toColumn.cards.splice(targetIndex, 0, card)\r\n\r\n this.reorderCards(fromColumn)\r\n this.reorderCards(toColumn)\r\n\r\n this.events.emit('card:move', {\r\n card,\r\n fromColumnId: fromColumn.id,\r\n toColumnId,\r\n toIndex: targetIndex,\r\n })\r\n }\r\n\r\n /**\r\n * 获取所有卡片\r\n */\r\n getAllCards(): Card[] {\r\n const cards: Card[] = []\r\n for (const column of this.columns) {\r\n cards.push(...column.cards)\r\n }\r\n return cards\r\n }\r\n\r\n /**\r\n * 获取卡片总数\r\n */\r\n getCardCount(): number {\r\n return this.columns.reduce((sum, col) => sum + col.cards.length, 0)\r\n }\r\n\r\n /**\r\n * 重新排序列\r\n */\r\n private reorderColumns(): void {\r\n this.columns.forEach((col, index) => {\r\n col.order = index\r\n })\r\n }\r\n\r\n /**\r\n * 重新排序列中的卡片\r\n */\r\n private reorderCards(column: Column): void {\r\n column.cards.forEach((card, index) => {\r\n card.order = index\r\n })\r\n }\r\n\r\n /**\r\n * 设置列数据(用于导入)\r\n */\r\n setColumns(columns: Column[]): void {\r\n this.columns = columns.map((column, index) =>\r\n this.normalizeColumn(column, index)\r\n )\r\n this.sortColumns()\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.columns = []\r\n }\r\n\r\n private clampIndex(index: number, length: number): number {\r\n if (!Number.isFinite(index)) return length\r\n return Math.min(Math.max(Math.trunc(index), 0), length)\r\n }\r\n\r\n private sortColumns(): void {\r\n this.columns.sort((a, b) => a.order - b.order)\r\n this.reorderColumns()\r\n }\r\n}\r\n","import type { EventEmitter } from './EventEmitter'\r\n\r\n/**\r\n * DragState - Drag State interface\r\n */\r\nexport interface DragState {\r\n dragging: boolean\r\n cardId: string | null\r\n sourceColumnId: string | null\r\n targetColumnId: string | null\r\n targetIndex: number\r\n placeholder: HTMLElement | null\r\n}\r\n\r\n/**\r\n * 拖拽控制器 - HTML5 Drag & Drop API\r\n */\r\nexport class DragController {\r\n private events: EventEmitter\r\n private state: DragState = {\r\n dragging: false,\r\n cardId: null,\r\n sourceColumnId: null,\r\n targetColumnId: null,\r\n targetIndex: 0,\r\n placeholder: null,\r\n }\r\n private prefix: string\r\n private cleanupFns: (() => void)[] = []\r\n\r\n constructor(events: EventEmitter, prefix: string) {\r\n this.events = events\r\n this.prefix = prefix\r\n }\r\n\r\n /**\r\n * 为卡片元素启用拖拽\r\n */\r\n enableCardDrag(cardEl: HTMLElement, cardId: string, columnId: string): void {\r\n cardEl.setAttribute('draggable', 'true')\r\n cardEl.dataset.cardId = cardId\r\n cardEl.dataset.columnId = columnId\r\n\r\n const onDragStart = (e: DragEvent) => {\r\n if (!e.dataTransfer) return\r\n e.dataTransfer.effectAllowed = 'move'\r\n e.dataTransfer.setData('text/plain', cardId)\r\n\r\n this.state.dragging = true\r\n this.state.cardId = cardId\r\n this.state.sourceColumnId = columnId\r\n this.state.targetColumnId = columnId\r\n this.state.targetIndex = 0\r\n\r\n cardEl.classList.add(`${this.prefix}-card--dragging`)\r\n this.events.emit('card:drag-start', { cardId, columnId })\r\n\r\n // 创建占位符\r\n this.createPlaceholder(cardEl)\r\n }\r\n\r\n const onDragEnd = () => {\r\n cardEl.classList.remove(`${this.prefix}-card--dragging`)\r\n this.removePlaceholder()\r\n this.state.dragging = false\r\n this.state.cardId = null\r\n this.state.sourceColumnId = null\r\n this.state.targetColumnId = null\r\n this.state.targetIndex = 0\r\n this.events.emit('card:drag-end', { cardId })\r\n }\r\n\r\n cardEl.addEventListener('dragstart', onDragStart)\r\n cardEl.addEventListener('dragend', onDragEnd)\r\n\r\n this.cleanupFns.push(() => {\r\n cardEl.removeEventListener('dragstart', onDragStart)\r\n cardEl.removeEventListener('dragend', onDragEnd)\r\n })\r\n }\r\n\r\n /**\r\n * 为列容器启用拖拽接受\r\n */\r\n enableColumnDrop(columnBodyEl: HTMLElement, columnId: string): void {\r\n const onDragOver = (e: DragEvent) => {\r\n e.preventDefault()\r\n if (!e.dataTransfer) return\r\n e.dataTransfer.dropEffect = 'move'\r\n\r\n this.state.targetColumnId = columnId\r\n\r\n // 计算插入位置\r\n const afterElement = this.getDragAfterElement(columnBodyEl, e.clientY)\r\n const placeholder = this.state.placeholder\r\n if (placeholder) {\r\n if (afterElement) {\r\n columnBodyEl.insertBefore(placeholder, afterElement)\r\n } else {\r\n // 插入到最后一张卡片之后,但在“添加卡片”按钮之前\r\n const addBtn = columnBodyEl.querySelector(`.${this.prefix}-add-card`)\r\n if (addBtn) {\r\n columnBodyEl.insertBefore(placeholder, addBtn)\r\n } else {\r\n columnBodyEl.appendChild(placeholder)\r\n }\r\n }\r\n }\r\n }\r\n\r\n const onDragEnter = (e: DragEvent) => {\r\n e.preventDefault()\r\n columnBodyEl.classList.add(`${this.prefix}-column-body--drag-over`)\r\n }\r\n\r\n const onDragLeave = (e: DragEvent) => {\r\n // 检查是否真的离开了列\r\n const rect = columnBodyEl.getBoundingClientRect()\r\n if (\r\n e.clientX < rect.left ||\r\n e.clientX > rect.right ||\r\n e.clientY < rect.top ||\r\n e.clientY > rect.bottom\r\n ) {\r\n columnBodyEl.classList.remove(`${this.prefix}-column-body--drag-over`)\r\n }\r\n }\r\n\r\n const onDrop = (e: DragEvent) => {\r\n e.preventDefault()\r\n columnBodyEl.classList.remove(`${this.prefix}-column-body--drag-over`)\r\n\r\n const cardId = this.state.cardId\r\n if (!cardId) return\r\n\r\n // 计算 drop 位置:只统计占位符前面的可见卡片数量\r\n const placeholder = this.state.placeholder\r\n let dropIndex = 0\r\n\r\n if (placeholder && placeholder.parentNode === columnBodyEl) {\r\n const children = [...columnBodyEl.children]\r\n for (const child of children) {\r\n if (child === placeholder) break\r\n if (\r\n (child as HTMLElement).hasAttribute('data-card-id') &&\r\n !(child as HTMLElement).classList.contains(\r\n `${this.prefix}-card--dragging`\r\n )\r\n ) {\r\n dropIndex++\r\n }\r\n }\r\n } else {\r\n // 占位符不在当前列时,放到末尾\r\n const cards = columnBodyEl.querySelectorAll(\r\n `[data-card-id]:not(.${this.prefix}-card--dragging)`\r\n )\r\n dropIndex = cards.length\r\n }\r\n\r\n this.state.targetIndex = dropIndex\r\n\r\n this.events.emit('card:drop', {\r\n cardId,\r\n fromColumnId: this.state.sourceColumnId,\r\n toColumnId: columnId,\r\n toIndex: dropIndex,\r\n })\r\n\r\n this.removePlaceholder()\r\n }\r\n\r\n columnBodyEl.addEventListener('dragover', onDragOver)\r\n columnBodyEl.addEventListener('dragenter', onDragEnter)\r\n columnBodyEl.addEventListener('dragleave', onDragLeave)\r\n columnBodyEl.addEventListener('drop', onDrop)\r\n\r\n this.cleanupFns.push(() => {\r\n columnBodyEl.removeEventListener('dragover', onDragOver)\r\n columnBodyEl.removeEventListener('dragenter', onDragEnter)\r\n columnBodyEl.removeEventListener('dragleave', onDragLeave)\r\n columnBodyEl.removeEventListener('drop', onDrop)\r\n })\r\n }\r\n\r\n /**\r\n * 为列头部启用列拖拽\r\n */\r\n enableColumnDrag(\r\n columnEl: HTMLElement,\r\n handleEl: HTMLElement,\r\n columnId: string,\r\n boardEl: HTMLElement\r\n ): void {\r\n handleEl.setAttribute('draggable', 'true')\r\n\r\n const onDragStart = (e: DragEvent) => {\r\n if (!e.dataTransfer) return\r\n e.dataTransfer.effectAllowed = 'move'\r\n e.dataTransfer.setData('application/kanban-column', columnId)\r\n columnEl.classList.add(`${this.prefix}-column--dragging`)\r\n }\r\n\r\n const onDragEnd = () => {\r\n columnEl.classList.remove(`${this.prefix}-column--dragging`)\r\n // 清除所有列的 drag-over 状态\r\n boardEl\r\n .querySelectorAll(`.${this.prefix}-column--drag-over`)\r\n .forEach(el => {\r\n el.classList.remove(`${this.prefix}-column--drag-over`)\r\n })\r\n }\r\n\r\n const onDragOver = (e: DragEvent) => {\r\n if (!e.dataTransfer?.types.includes('application/kanban-column')) return\r\n e.preventDefault()\r\n e.dataTransfer.dropEffect = 'move'\r\n columnEl.classList.add(`${this.prefix}-column--drag-over`)\r\n }\r\n\r\n const onDragLeave = () => {\r\n columnEl.classList.remove(`${this.prefix}-column--drag-over`)\r\n }\r\n\r\n const onDrop = (e: DragEvent) => {\r\n e.preventDefault()\r\n columnEl.classList.remove(`${this.prefix}-column--drag-over`)\r\n const fromColumnId = e.dataTransfer?.getData('application/kanban-column')\r\n if (!fromColumnId || fromColumnId === columnId) return\r\n\r\n // 计算目标位置\r\n const columns = [...boardEl.querySelectorAll(`[data-column-id]`)]\r\n const toIndex = columns.indexOf(columnEl)\r\n this.events.emit('column:drop', {\r\n fromColumnId,\r\n toColumnId: columnId,\r\n toIndex,\r\n })\r\n }\r\n\r\n handleEl.addEventListener('dragstart', onDragStart)\r\n handleEl.addEventListener('dragend', onDragEnd)\r\n columnEl.addEventListener('dragover', onDragOver)\r\n columnEl.addEventListener('dragleave', onDragLeave)\r\n columnEl.addEventListener('drop', onDrop)\r\n\r\n this.cleanupFns.push(() => {\r\n handleEl.removeEventListener('dragstart', onDragStart)\r\n handleEl.removeEventListener('dragend', onDragEnd)\r\n columnEl.removeEventListener('dragover', onDragOver)\r\n columnEl.removeEventListener('dragleave', onDragLeave)\r\n columnEl.removeEventListener('drop', onDrop)\r\n })\r\n }\r\n\r\n /**\r\n * 获取鼠标位置之后的元素\r\n */\r\n private getDragAfterElement(\r\n container: HTMLElement,\r\n y: number\r\n ): HTMLElement | null {\r\n const draggableElements = [\r\n ...container.querySelectorAll(\r\n `[data-card-id]:not(.${this.prefix}-card--dragging):not(.${this.prefix}-placeholder)`\r\n ),\r\n ] as HTMLElement[]\r\n\r\n let closestOffset = Number.NEGATIVE_INFINITY\r\n let closestElement: HTMLElement | null = null\r\n\r\n draggableElements.forEach(child => {\r\n const box = child.getBoundingClientRect()\r\n const offset = y - box.top - box.height / 2\r\n if (offset < 0 && offset > closestOffset) {\r\n closestOffset = offset\r\n closestElement = child\r\n }\r\n })\r\n\r\n return closestElement\r\n }\r\n\r\n /**\r\n * 创建占位符\r\n */\r\n private createPlaceholder(cardEl: HTMLElement): void {\r\n this.removePlaceholder()\r\n const placeholder = document.createElement('div')\r\n placeholder.className = `${this.prefix}-placeholder`\r\n placeholder.style.height = `${cardEl.offsetHeight}px`\r\n this.state.placeholder = placeholder\r\n }\r\n\r\n /**\r\n * 移除占位符\r\n */\r\n private removePlaceholder(): void {\r\n if (this.state.placeholder) {\r\n this.state.placeholder.parentNode?.removeChild(this.state.placeholder)\r\n this.state.placeholder = null\r\n }\r\n }\r\n\r\n /**\r\n * 获取当前拖拽状态\r\n */\r\n getState(): Readonly<DragState> {\r\n return { ...this.state }\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy(): void {\r\n this.cleanupFns.forEach(fn => fn())\r\n this.cleanupFns = []\r\n this.removePlaceholder()\r\n this.state.dragging = false\r\n this.state.cardId = null\r\n this.state.sourceColumnId = null\r\n this.state.targetColumnId = null\r\n this.state.targetIndex = 0\r\n }\r\n}\r\n","/**\r\n * 轻量级事件发射器\r\n */\r\nexport type EventHandler = (...args: unknown[]) => void\r\n\r\n/**\r\n * EventEmitter - Event Emitter class\r\n */\r\nexport class EventEmitter {\r\n private listeners = new Map<string, Set<EventHandler>>()\r\n\r\n /**\r\n * 监听事件\r\n */\r\n on(event: string, handler: EventHandler): () => void {\r\n if (!this.listeners.has(event)) {\r\n this.listeners.set(event, new Set())\r\n }\r\n const handlers = this.listeners.get(event)\r\n if (!handlers) return () => this.off(event, handler)\r\n handlers.add(handler)\r\n return () => this.off(event, handler)\r\n }\r\n\r\n /**\r\n * 监听一次性事件\r\n */\r\n once(event: string, handler: EventHandler): () => void {\r\n const wrapper: EventHandler = (...args) => {\r\n this.off(event, wrapper)\r\n handler(...args)\r\n }\r\n return this.on(event, wrapper)\r\n }\r\n\r\n /**\r\n * 移除监听器\r\n */\r\n off(event: string, handler: EventHandler): void {\r\n const handlers = this.listeners.get(event)\r\n if (!handlers) return\r\n handlers.delete(handler)\r\n if (handlers.size === 0) this.listeners.delete(event)\r\n }\r\n\r\n /**\r\n * 触发事件\r\n */\r\n emit(event: string, payload?: unknown): void {\r\n const handlers = this.listeners.get(event)\r\n if (handlers) {\r\n handlers.forEach(handler => {\r\n try {\r\n handler(payload)\r\n } catch (err) {\r\n console.error(\r\n `[KanbanBoard] Error in event handler for \"${event}\":`,\r\n err\r\n )\r\n }\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 移除所有监听器\r\n */\r\n removeAll(): void {\r\n this.listeners.clear()\r\n }\r\n\r\n /**\r\n * 获取监听器数量\r\n */\r\n listenerCount(event: string): number {\r\n return this.listeners.get(event)?.size ?? 0\r\n }\r\n}\r\n","import type { Card, Column, FilterCriteria } from '../types'\r\nimport type { EventEmitter } from './EventEmitter'\r\n\r\n/**\r\n * 筛选/搜索引擎\r\n */\r\nexport class FilterEngine {\r\n private events: EventEmitter\r\n private currentCriteria: FilterCriteria | null = null\r\n /** 被过滤隐藏的卡片 ID 集合 */\r\n private hiddenCardIds = new Set<string>()\r\n\r\n constructor(events: EventEmitter) {\r\n this.events = events\r\n }\r\n\r\n /**\r\n * 应用筛选条件\r\n */\r\n filter(criteria: FilterCriteria, columns: Column[]): Set<string> {\r\n this.currentCriteria = criteria\r\n this.hiddenCardIds.clear()\r\n\r\n const allCards = columns.flatMap(col => col.cards)\r\n\r\n for (const card of allCards) {\r\n if (!this.matchCriteria(card, criteria)) {\r\n this.hiddenCardIds.add(card.id)\r\n }\r\n }\r\n\r\n this.events.emit('filter:change', { criteria })\r\n return new Set(this.hiddenCardIds)\r\n }\r\n\r\n /**\r\n * 搜索卡片\r\n */\r\n search(keyword: string, columns: Column[]): Card[] {\r\n this.events.emit('search:change', { keyword })\r\n const normalizedKeyword = keyword.trim()\r\n this.currentCriteria = normalizedKeyword\r\n ? { keyword: normalizedKeyword }\r\n : null\r\n\r\n if (!normalizedKeyword) {\r\n this.clearFilter()\r\n return columns.flatMap(col => col.cards)\r\n }\r\n\r\n const lowerKeyword = normalizedKeyword.toLowerCase()\r\n const allCards = columns.flatMap(col => col.cards)\r\n const matched: Card[] = []\r\n\r\n this.hiddenCardIds.clear()\r\n\r\n for (const card of allCards) {\r\n const titleMatch = card.title.toLowerCase().includes(lowerKeyword)\r\n const descMatch =\r\n card.description?.toLowerCase().includes(lowerKeyword) ?? false\r\n const labelMatch =\r\n card.labels?.some(l => l.name.toLowerCase().includes(lowerKeyword)) ??\r\n false\r\n const assigneeMatch =\r\n card.assignees?.some(a => a.toLowerCase().includes(lowerKeyword)) ??\r\n false\r\n\r\n if (titleMatch || descMatch || labelMatch || assigneeMatch) {\r\n matched.push(card)\r\n } else {\r\n this.hiddenCardIds.add(card.id)\r\n }\r\n }\r\n\r\n return matched\r\n }\r\n\r\n /**\r\n * 清除筛选\r\n */\r\n clearFilter(): void {\r\n this.currentCriteria = null\r\n this.hiddenCardIds.clear()\r\n this.events.emit('filter:clear', undefined)\r\n }\r\n\r\n /**\r\n * 检查卡片是否可见\r\n */\r\n isCardVisible(cardId: string): boolean {\r\n return !this.hiddenCardIds.has(cardId)\r\n }\r\n\r\n /**\r\n * 获取隐藏的卡片 ID 集合\r\n */\r\n getHiddenCardIds(): Set<string> {\r\n return new Set(this.hiddenCardIds)\r\n }\r\n\r\n /**\r\n * 获取当前筛选条件\r\n */\r\n getCurrentCriteria(): FilterCriteria | null {\r\n return this.currentCriteria\r\n }\r\n\r\n /**\r\n * 匹配筛选条件\r\n */\r\n private matchCriteria(card: Card, criteria: FilterCriteria): boolean {\r\n // 关键词\r\n if (criteria.keyword) {\r\n const kw = criteria.keyword.toLowerCase()\r\n const titleMatch = card.title.toLowerCase().includes(kw)\r\n const descMatch = card.description?.toLowerCase().includes(kw) ?? false\r\n if (!titleMatch && !descMatch) return false\r\n }\r\n\r\n // 标签\r\n if (criteria.labelIds?.length) {\r\n const cardLabelIds = card.labels?.map(l => l.id) ?? []\r\n if (!criteria.labelIds.some(id => cardLabelIds.includes(id))) return false\r\n }\r\n\r\n // 成员\r\n if (criteria.assignees?.length) {\r\n if (!criteria.assignees.some(a => card.assignees?.includes(a)))\r\n return false\r\n }\r\n\r\n // 优先级\r\n if (criteria.priorities?.length) {\r\n if (!card.priority || !criteria.priorities.includes(card.priority))\r\n return false\r\n }\r\n\r\n // 列\r\n if (criteria.columnIds?.length) {\r\n if (!criteria.columnIds.includes(card.columnId)) return false\r\n }\r\n\r\n // 截止日期\r\n if (criteria.dueDateRange) {\r\n if (!card.dueDate) return false\r\n const dueDate = new Date(card.dueDate).getTime()\r\n if (Number.isNaN(dueDate)) return false\r\n if (criteria.dueDateRange.start) {\r\n const start = new Date(criteria.dueDateRange.start).getTime()\r\n if (Number.isNaN(start) || dueDate < start) return false\r\n }\r\n if (criteria.dueDateRange.end) {\r\n const end = new Date(criteria.dueDateRange.end).getTime()\r\n if (Number.isNaN(end) || dueDate > end) return false\r\n }\r\n }\r\n\r\n // 自定义函数\r\n if (criteria.custom) {\r\n if (!criteria.custom(card)) return false\r\n }\r\n\r\n return true\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy(): void {\r\n this.hiddenCardIds.clear()\r\n this.currentCriteria = null\r\n }\r\n}\r\n","/**\r\n * DOM 工具函数\r\n */\r\n\r\n/**\r\n * 创建 DOM 元素\r\n */\r\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\r\n tag: K,\r\n className?: string,\r\n attributes?: Record<string, string>\r\n): HTMLElementTagNameMap[K] {\r\n const el = document.createElement(tag)\r\n if (className) el.className = className\r\n if (attributes) {\r\n Object.entries(attributes).forEach(([key, value]) => {\r\n el.setAttribute(key, value)\r\n })\r\n }\r\n return el\r\n}\r\n\r\n/**\r\n * 从选择器或元素获取 HTMLElement\r\n */\r\nexport function resolveElement(\r\n target: HTMLElement | string\r\n): HTMLElement | null {\r\n if (typeof target === 'string') {\r\n return document.querySelector(target)\r\n }\r\n return target\r\n}\r\n\r\n/**\r\n * 清空元素内容\r\n */\r\nexport function clearElement(el: HTMLElement): void {\r\n el.innerHTML = ''\r\n}\r\n\r\n/**\r\n * 安全移除元素\r\n */\r\nexport function removeElement(el: HTMLElement | null): void {\r\n el?.parentNode?.removeChild(el)\r\n}\r\n\r\n/**\r\n * 插入元素到指定位置\r\n */\r\nexport function insertAt(\r\n parent: HTMLElement,\r\n child: HTMLElement,\r\n index: number\r\n): void {\r\n const ref = parent.children[index] as HTMLElement | undefined\r\n if (ref) {\r\n parent.insertBefore(child, ref)\r\n } else {\r\n parent.appendChild(child)\r\n }\r\n}\r\n","/**\r\n * @file version.ts\r\n * @description version 模块\r\n */\r\n\r\nexport const VERSION = '0.1.0'\r\n","import type { Card, Column, KanbanOptions } from '../types'\r\nimport type { DragController } from './DragController'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport { createElement } from '../utils/dom'\r\n\r\n/**\r\n * DOM 渲染器\r\n */\r\nexport class Renderer {\r\n private container: HTMLElement\r\n private boardEl: HTMLElement | null = null\r\n private events: EventEmitter\r\n private dragController: DragController\r\n private options: KanbanOptions\r\n private prefix: string\r\n private columnElements = new Map<string, HTMLElement>()\r\n private columnBodyElements = new Map<string, HTMLElement>()\r\n private cardElements = new Map<string, HTMLElement>()\r\n\r\n constructor(\r\n container: HTMLElement,\r\n events: EventEmitter,\r\n dragController: DragController,\r\n options: KanbanOptions\r\n ) {\r\n this.container = container\r\n this.events = events\r\n this.dragController = dragController\r\n this.options = options\r\n this.prefix = options.classPrefix || 'kanban'\r\n }\r\n\r\n /**\r\n * 渲染整个看板\r\n */\r\n render(columns: Column[], hiddenCardIds?: Set<string>): void {\r\n this.cleanup()\r\n\r\n // 清除容器中残留的旧看板元素(HMR / 重复渲染保护)\r\n const staleBoards = this.container.querySelectorAll('[data-kanban-board]')\r\n staleBoards.forEach(el => el.remove())\r\n\r\n const p = this.prefix\r\n this.boardEl = createElement('div', `${p}-board`)\r\n this.boardEl.setAttribute('data-kanban-board', '')\r\n\r\n // 列容器\r\n const columnsContainer = createElement('div', `${p}-columns`)\r\n\r\n for (const column of columns) {\r\n const colEl = this.renderColumn(column, hiddenCardIds)\r\n columnsContainer.appendChild(colEl)\r\n }\r\n\r\n // 添加列按钮\r\n if (this.options.showAddColumn !== false) {\r\n const addColBtn = createElement('div', `${p}-add-column`)\r\n addColBtn.innerHTML = `<button class=\"${p}-add-column-btn\">+ 添加列</button>`\r\n addColBtn\r\n .querySelector<HTMLButtonElement>('button')\r\n ?.addEventListener('click', () => {\r\n this.events.emit('ui:add-column')\r\n })\r\n columnsContainer.appendChild(addColBtn)\r\n }\r\n\r\n this.boardEl.appendChild(columnsContainer)\r\n this.container.appendChild(this.boardEl)\r\n }\r\n\r\n /**\r\n * 渲染单个列\r\n */\r\n private renderColumn(\r\n column: Column,\r\n hiddenCardIds?: Set<string>\r\n ): HTMLElement {\r\n const p = this.prefix\r\n const colEl = createElement('div', `${p}-column`, {\r\n 'data-column-id': column.id,\r\n })\r\n if (column.collapsed) colEl.classList.add(`${p}-column--collapsed`)\r\n\r\n // 列头部\r\n const header = this.renderColumnHeader(column)\r\n colEl.appendChild(header)\r\n\r\n // 列内容\r\n const body = createElement('div', `${p}-column-body`)\r\n body.dataset.columnId = column.id\r\n\r\n if (!column.collapsed) {\r\n const visibleCards = column.cards\r\n .filter(card => !hiddenCardIds || !hiddenCardIds.has(card.id))\r\n .sort((a, b) => a.order - b.order)\r\n\r\n for (const card of visibleCards) {\r\n const cardEl = this.renderCard(card, column.id)\r\n body.appendChild(cardEl)\r\n }\r\n\r\n // 添加卡片按钮\r\n if (this.options.showAddCard !== false) {\r\n const addBtn = createElement('div', `${p}-add-card`)\r\n addBtn.innerHTML = `<button class=\"${p}-add-card-btn\">+ 添加卡片</button>`\r\n addBtn\r\n .querySelector<HTMLButtonElement>('button')\r\n ?.addEventListener('click', () => {\r\n this.events.emit('ui:add-card', { columnId: column.id })\r\n })\r\n body.appendChild(addBtn)\r\n }\r\n\r\n // 启用列内拖拽放置\r\n if (this.options.draggable !== false) {\r\n this.dragController.enableColumnDrop(body, column.id)\r\n }\r\n }\r\n\r\n colEl.appendChild(body)\r\n\r\n // 列拖拽\r\n const boardEl = this.boardEl\r\n if (this.options.columnDraggable !== false && boardEl) {\r\n const dragHandle = header.querySelector(\r\n `.${p}-column-drag-handle`\r\n ) as HTMLElement\r\n if (dragHandle) {\r\n this.dragController.enableColumnDrag(\r\n colEl,\r\n dragHandle,\r\n column.id,\r\n boardEl\r\n )\r\n }\r\n }\r\n\r\n this.columnElements.set(column.id, colEl)\r\n this.columnBodyElements.set(column.id, body)\r\n\r\n return colEl\r\n }\r\n\r\n /**\r\n * 渲染列头部\r\n */\r\n private renderColumnHeader(column: Column): HTMLElement {\r\n const p = this.prefix\r\n const header = createElement('div', `${p}-column-header`)\r\n\r\n if (this.options.columnHeaderRenderer) {\r\n this.options.columnHeaderRenderer(column, header)\r\n return header\r\n }\r\n\r\n // 拖拽手柄\r\n if (this.options.columnDraggable !== false) {\r\n const handle = createElement('span', `${p}-column-drag-handle`)\r\n handle.innerHTML = '&#8942;&#8942;'\r\n handle.title = '拖拽排序'\r\n header.appendChild(handle)\r\n }\r\n\r\n // 颜色指示器\r\n if (column.color) {\r\n const indicator = createElement('span', `${p}-column-color`)\r\n indicator.style.backgroundColor = column.color\r\n header.appendChild(indicator)\r\n }\r\n\r\n // 标题\r\n const titleEl = createElement('span', `${p}-column-title`)\r\n titleEl.textContent = column.title\r\n header.appendChild(titleEl)\r\n\r\n // 卡片计数\r\n if (this.options.showCardCount !== false) {\r\n const count = createElement('span', `${p}-column-count`)\r\n const wipText = column.wipLimit ? `/${column.wipLimit}` : ''\r\n count.textContent = `${column.cards.length}${wipText}`\r\n if (column.wipLimit && column.cards.length >= column.wipLimit) {\r\n count.classList.add(`${p}-column-count--limit`)\r\n }\r\n header.appendChild(count)\r\n }\r\n\r\n // 折叠按钮\r\n const collapseBtn = createElement('button', `${p}-column-collapse-btn`)\r\n collapseBtn.innerHTML = column.collapsed ? '&#9654;' : '&#9660;'\r\n collapseBtn.title = column.collapsed ? '展开' : '折叠'\r\n collapseBtn.addEventListener('click', () => {\r\n this.events.emit('ui:toggle-collapse', { columnId: column.id })\r\n })\r\n header.appendChild(collapseBtn)\r\n\r\n // 操作菜单\r\n if (this.options.showColumnActions !== false) {\r\n const actions = createElement('button', `${p}-column-actions-btn`)\r\n actions.innerHTML = '&#8943;'\r\n actions.title = '更多操作'\r\n actions.addEventListener('click', e => {\r\n e.stopPropagation()\r\n this.events.emit('ui:column-actions', { columnId: column.id, event: e })\r\n })\r\n header.appendChild(actions)\r\n }\r\n\r\n return header\r\n }\r\n\r\n /**\r\n * 渲染单张卡片\r\n */\r\n private renderCard(card: Card, columnId: string): HTMLElement {\r\n const p = this.prefix\r\n const cardEl = createElement('div', `${p}-card`, {\r\n 'data-card-id': card.id,\r\n })\r\n\r\n if (this.options.cardRenderer) {\r\n this.options.cardRenderer(card, cardEl)\r\n } else {\r\n this.renderDefaultCard(card, cardEl)\r\n }\r\n\r\n // 启用卡片拖拽\r\n if (this.options.draggable !== false) {\r\n this.dragController.enableCardDrag(cardEl, card.id, columnId)\r\n }\r\n\r\n // 点击事件\r\n cardEl.addEventListener('click', () => {\r\n this.events.emit('card:click', { card })\r\n })\r\n\r\n this.cardElements.set(card.id, cardEl)\r\n return cardEl\r\n }\r\n\r\n /**\r\n * 默认卡片渲染\r\n */\r\n private renderDefaultCard(card: Card, cardEl: HTMLElement): void {\r\n const p = this.prefix\r\n\r\n // 优先级指示器\r\n if (card.priority) {\r\n const priorityEl = createElement(\r\n 'div',\r\n `${p}-card-priority ${p}-card-priority--${card.priority}`\r\n )\r\n cardEl.appendChild(priorityEl)\r\n }\r\n\r\n // 标签\r\n if (card.labels?.length) {\r\n const labelsEl = createElement('div', `${p}-card-labels`)\r\n for (const label of card.labels) {\r\n const labelEl = createElement('span', `${p}-card-label`)\r\n labelEl.style.backgroundColor = label.color\r\n labelEl.textContent = label.name\r\n labelsEl.appendChild(labelEl)\r\n }\r\n cardEl.appendChild(labelsEl)\r\n }\r\n\r\n // 标题\r\n const titleEl = createElement('div', `${p}-card-title`)\r\n titleEl.textContent = card.title\r\n cardEl.appendChild(titleEl)\r\n\r\n // 描述\r\n if (card.description) {\r\n const descEl = createElement('div', `${p}-card-desc`)\r\n descEl.textContent = card.description\r\n cardEl.appendChild(descEl)\r\n }\r\n\r\n // 底部信息栏\r\n const hasFooter = card.assignees?.length || card.dueDate\r\n if (hasFooter) {\r\n const footer = createElement('div', `${p}-card-footer`)\r\n\r\n if (card.assignees?.length) {\r\n const assigneesEl = createElement('div', `${p}-card-assignees`)\r\n for (const assignee of card.assignees.slice(0, 3)) {\r\n const avatar = createElement('span', `${p}-card-avatar`)\r\n avatar.textContent = assignee.charAt(0).toUpperCase()\r\n avatar.title = assignee\r\n assigneesEl.appendChild(avatar)\r\n }\r\n if (card.assignees.length > 3) {\r\n const more = createElement('span', `${p}-card-avatar-more`)\r\n more.textContent = `+${card.assignees.length - 3}`\r\n assigneesEl.appendChild(more)\r\n }\r\n footer.appendChild(assigneesEl)\r\n }\r\n\r\n if (card.dueDate) {\r\n const dueEl = createElement('span', `${p}-card-due`)\r\n const date = new Date(card.dueDate)\r\n if (Number.isNaN(date.getTime())) {\r\n dueEl.textContent = 'Invalid date'\r\n } else {\r\n dueEl.textContent = `${date.getMonth() + 1}/${date.getDate()}`\r\n if (date < new Date()) dueEl.classList.add(`${p}-card-due--overdue`)\r\n }\r\n footer.appendChild(dueEl)\r\n }\r\n\r\n cardEl.appendChild(footer)\r\n }\r\n }\r\n\r\n /**\r\n * 获取列元素\r\n */\r\n getColumnElement(columnId: string): HTMLElement | undefined {\r\n return this.columnElements.get(columnId)\r\n }\r\n\r\n /**\r\n * 获取卡片元素\r\n */\r\n getCardElement(cardId: string): HTMLElement | undefined {\r\n return this.cardElements.get(cardId)\r\n }\r\n\r\n /**\r\n * 获取看板根元素\r\n */\r\n getBoardElement(): HTMLElement | null {\r\n return this.boardEl\r\n }\r\n\r\n /**\r\n * 清理 DOM\r\n */\r\n private cleanup(): void {\r\n this.columnElements.clear()\r\n this.columnBodyElements.clear()\r\n this.cardElements.clear()\r\n if (this.boardEl) {\r\n this.boardEl.remove()\r\n this.boardEl = null\r\n }\r\n }\r\n\r\n /**\r\n * 销毁\r\n */\r\n destroy(): void {\r\n this.cleanup()\r\n }\r\n}\r\n","import type {\r\n BoardData,\r\n Card,\r\n Column,\r\n FilterCriteria,\r\n KanbanOptions,\r\n Label,\r\n} from '../types'\r\nimport type { EventHandler } from './EventEmitter'\r\nimport { resolveElement } from '../utils/dom'\r\nimport { VERSION } from '../version'\r\nimport { ColumnManager } from './ColumnManager'\r\nimport { DragController } from './DragController'\r\nimport { EventEmitter } from './EventEmitter'\r\nimport { FilterEngine } from './FilterEngine'\r\nimport { Renderer } from './Renderer'\r\n\r\ninterface CardDropPayload {\r\n cardId: string\r\n fromColumnId: string | null\r\n toColumnId: string\r\n toIndex: number\r\n}\r\n\r\ninterface ColumnDropPayload {\r\n fromColumnId: string\r\n toColumnId: string\r\n toIndex: number\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === 'object' && value !== null\r\n}\r\n\r\nfunction isCard(value: unknown): value is Card {\r\n return (\r\n isRecord(value) &&\r\n typeof value.id === 'string' &&\r\n typeof value.title === 'string' &&\r\n typeof value.order === 'number' &&\r\n typeof value.columnId === 'string'\r\n )\r\n}\r\n\r\nfunction isColumn(value: unknown): value is Column {\r\n return (\r\n isRecord(value) &&\r\n typeof value.id === 'string' &&\r\n typeof value.title === 'string' &&\r\n Array.isArray(value.cards) &&\r\n typeof value.order === 'number'\r\n )\r\n}\r\n\r\nfunction isCardDropPayload(value: unknown): value is CardDropPayload {\r\n return (\r\n isRecord(value) &&\r\n typeof value.cardId === 'string' &&\r\n (value.fromColumnId === null || typeof value.fromColumnId === 'string') &&\r\n typeof value.toColumnId === 'string' &&\r\n typeof value.toIndex === 'number'\r\n )\r\n}\r\n\r\nfunction isColumnDropPayload(value: unknown): value is ColumnDropPayload {\r\n return (\r\n isRecord(value) &&\r\n typeof value.fromColumnId === 'string' &&\r\n typeof value.toColumnId === 'string' &&\r\n typeof value.toIndex === 'number'\r\n )\r\n}\r\n\r\n/**\r\n * KanbanBoard - 看板视图库,支持拖拽卡片与列管理\r\n */\r\nexport class KanbanBoard {\r\n private container: HTMLElement\r\n private options: KanbanOptions\r\n private destroyed = false\r\n\r\n readonly events: EventEmitter\r\n private columnManager: ColumnManager\r\n private dragController: DragController\r\n private filterEngine: FilterEngine\r\n private renderer: Renderer\r\n private labels: Label[] = []\r\n\r\n constructor(options: KanbanOptions) {\r\n this.options = {\r\n draggable: true,\r\n columnDraggable: true,\r\n crossColumnDrag: true,\r\n searchable: true,\r\n showAddCard: true,\r\n showAddColumn: true,\r\n showColumnActions: true,\r\n showCardCount: true,\r\n classPrefix: 'kanban',\r\n ...options,\r\n }\r\n\r\n const el = resolveElement(options.container)\r\n if (!el) {\r\n throw new Error('[KanbanBoard] Container element not found')\r\n }\r\n this.container = el\r\n\r\n // 初始化子系统\r\n this.events = new EventEmitter()\r\n this.columnManager = new ColumnManager(this.events)\r\n this.dragController = new DragController(\r\n this.events,\r\n this.options.classPrefix || 'kanban'\r\n )\r\n this.filterEngine = new FilterEngine(this.events)\r\n this.renderer = new Renderer(\r\n this.container,\r\n this.events,\r\n this.dragController,\r\n this.options\r\n )\r\n\r\n // 初始化标签\r\n this.labels = options.labels || []\r\n\r\n this.init()\r\n }\r\n\r\n private init(): void {\r\n // 初始化列数据\r\n if (this.options.columns?.length) {\r\n this.columnManager.init(this.options.columns as Partial<Column>[])\r\n }\r\n\r\n // 绑定内部事件\r\n this.bindInternalEvents()\r\n\r\n // 首次渲染\r\n this.render()\r\n\r\n // 触发 ready\r\n this.events.emit('ready', { instance: this })\r\n this.options.onReady?.(this)\r\n\r\n if (this.options.debug) {\r\n console.debug('[KanbanBoard] Initialized', {\r\n columns: this.columnManager.getColumns().length,\r\n cards: this.columnManager.getCardCount(),\r\n })\r\n }\r\n }\r\n\r\n /**\r\n * 绑定内部事件\r\n */\r\n private bindInternalEvents(): void {\r\n // 卡片拖拽放置\r\n this.events.on('card:drop', (payload: unknown) => {\r\n if (!isCardDropPayload(payload)) return\r\n const card = this.columnManager.getCard(payload.cardId)\r\n this.columnManager.moveCard(\r\n payload.cardId,\r\n payload.toColumnId,\r\n payload.toIndex\r\n )\r\n if (card && card.columnId === payload.toColumnId) {\r\n this.options.onCardMove?.(\r\n card,\r\n payload.fromColumnId ?? '',\r\n payload.toColumnId,\r\n card.order\r\n )\r\n }\r\n // 延迟渲染,等待浏览器完成拖拽操作(dragend 事件触发后再重建 DOM)\r\n this.scheduleRender()\r\n })\r\n\r\n // 列拖拽放置\r\n this.events.on('column:drop', (payload: unknown) => {\r\n if (!isColumnDropPayload(payload)) return\r\n const columns = this.columnManager.getColumns()\r\n if (\r\n payload.fromColumnId === payload.toColumnId ||\r\n !columns.some(column => column.id === payload.fromColumnId) ||\r\n !columns.some(column => column.id === payload.toColumnId)\r\n ) {\r\n return\r\n }\r\n const fromIndex = columns.findIndex(c => c.id === payload.fromColumnId)\r\n this.columnManager.moveColumn(payload.fromColumnId, payload.toIndex)\r\n const col = this.columnManager.getColumn(payload.fromColumnId)\r\n if (col) this.options.onColumnMove?.(col, fromIndex, col.order)\r\n this.scheduleRender()\r\n })\r\n\r\n // UI 事件 - 折叠列\r\n this.events.on('ui:toggle-collapse', (payload: unknown) => {\r\n if (!isRecord(payload) || typeof payload.columnId !== 'string') return\r\n this.columnManager.toggleCollapse(payload.columnId)\r\n const col = this.columnManager.getColumn(payload.columnId)\r\n if (col) this.options.onColumnCollapse?.(col, col.collapsed ?? false)\r\n this.render()\r\n })\r\n\r\n // 回调转发\r\n this.events.on('card:add', (p: unknown) => {\r\n if (!isRecord(p) || !isCard(p.card) || typeof p.columnId !== 'string')\r\n return\r\n this.options.onCardAdd?.(p.card, p.columnId)\r\n })\r\n this.events.on('card:remove', (p: unknown) => {\r\n if (!isRecord(p) || !isCard(p.card) || typeof p.columnId !== 'string')\r\n return\r\n this.options.onCardRemove?.(p.card, p.columnId)\r\n })\r\n this.events.on('card:click', (p: unknown) => {\r\n if (!isRecord(p) || !isCard(p.card)) return\r\n this.options.onCardClick?.(p.card)\r\n })\r\n this.events.on('card:update', (p: unknown) => {\r\n if (!isRecord(p) || !isCard(p.card)) return\r\n this.options.onCardUpdate?.(p.card)\r\n })\r\n this.events.on('column:add', (p: unknown) => {\r\n if (!isRecord(p) || !isColumn(p.column)) return\r\n this.options.onColumnAdd?.(p.column)\r\n })\r\n this.events.on('column:remove', (p: unknown) => {\r\n if (!isRecord(p) || !isColumn(p.column)) return\r\n this.options.onColumnRemove?.(p.column)\r\n })\r\n this.events.on('error', (p: unknown) => {\r\n if (!isRecord(p) || !(p.error instanceof Error)) return\r\n this.options.onError?.(p.error)\r\n })\r\n }\r\n\r\n // ============================================================\r\n // Column API\r\n // ============================================================\r\n\r\n /**\r\n * 添加列\r\n */\r\n addColumn(partial: Partial<Column>): Column {\r\n const column = this.columnManager.addColumn(partial)\r\n this.render()\r\n return column\r\n }\r\n\r\n /**\r\n * 移除列\r\n */\r\n removeColumn(id: string): Column | undefined {\r\n const column = this.columnManager.removeColumn(id)\r\n if (column) this.render()\r\n return column\r\n }\r\n\r\n /**\r\n * 更新列\r\n */\r\n updateColumn(id: string, changes: Partial<Column>): Column | undefined {\r\n const column = this.columnManager.updateColumn(id, changes)\r\n if (column) this.render()\r\n return column\r\n }\r\n\r\n /**\r\n * 移动列\r\n */\r\n moveColumn(id: string, toIndex: number): void {\r\n this.columnManager.moveColumn(id, toIndex)\r\n this.render()\r\n }\r\n\r\n /**\r\n * 折叠/展开列\r\n */\r\n toggleColumnCollapse(id: string): void {\r\n this.columnManager.toggleCollapse(id)\r\n this.render()\r\n }\r\n\r\n /**\r\n * 获取所有列\r\n */\r\n getColumns(): Column[] {\r\n return this.columnManager.getColumns()\r\n }\r\n\r\n /**\r\n * 获取单列\r\n */\r\n getColumn(id: string): Column | undefined {\r\n return this.columnManager.getColumn(id)\r\n }\r\n\r\n // ============================================================\r\n // Card API\r\n // ============================================================\r\n\r\n /**\r\n * 添加卡片\r\n */\r\n addCard(columnId: string, partial: Partial<Card>): Card | undefined {\r\n const card = this.columnManager.addCard(columnId, partial)\r\n if (card) this.render()\r\n return card\r\n }\r\n\r\n /**\r\n * 移除卡片\r\n */\r\n removeCard(cardId: string): Card | undefined {\r\n const card = this.columnManager.removeCard(cardId)\r\n if (card) this.render()\r\n return card\r\n }\r\n\r\n /**\r\n * 更新卡片\r\n */\r\n updateCard(cardId: string, changes: Partial<Card>): Card | undefined {\r\n const card = this.columnManager.updateCard(cardId, changes)\r\n if (card) this.render()\r\n return card\r\n }\r\n\r\n /**\r\n * 移动卡片\r\n */\r\n moveCard(cardId: string, toColumnId: string, toIndex: number): void {\r\n this.columnManager.moveCard(cardId, toColumnId, toIndex)\r\n this.render()\r\n }\r\n\r\n /**\r\n * 获取单张卡片\r\n */\r\n getCard(cardId: string): Card | undefined {\r\n return this.columnManager.getCard(cardId)\r\n }\r\n\r\n /**\r\n * 获取所有卡片\r\n */\r\n getAllCards(): Card[] {\r\n return this.columnManager.getAllCards()\r\n }\r\n\r\n /**\r\n * 获取卡片总数\r\n */\r\n getCardCount(): number {\r\n return this.columnManager.getCardCount()\r\n }\r\n\r\n // ============================================================\r\n // Filter / Search API\r\n // ============================================================\r\n\r\n /**\r\n * 筛选卡片\r\n */\r\n filter(criteria: FilterCriteria): void {\r\n this.filterEngine.filter(criteria, this.columnManager.getColumns())\r\n this.render()\r\n }\r\n\r\n /**\r\n * 搜索卡片\r\n */\r\n search(keyword: string): Card[] {\r\n const result = this.filterEngine.search(\r\n keyword,\r\n this.columnManager.getColumns()\r\n )\r\n this.render()\r\n return result\r\n }\r\n\r\n /**\r\n * 清除筛选\r\n */\r\n clearFilter(): void {\r\n this.filterEngine.clearFilter()\r\n this.render()\r\n }\r\n\r\n // ============================================================\r\n // Import / Export API\r\n // ============================================================\r\n\r\n /**\r\n * 导出看板数据\r\n */\r\n exportData(): BoardData {\r\n const data: BoardData = {\r\n version: VERSION,\r\n title: this.options.title || 'Kanban Board',\r\n columns: this.columnManager.getColumns(),\r\n labels: this.labels,\r\n exportedAt: new Date().toISOString(),\r\n }\r\n this.events.emit('data:export', { board: data })\r\n return data\r\n }\r\n\r\n /**\r\n * 导入看板数据\r\n */\r\n importData(data: BoardData): void {\r\n if (!data || !Array.isArray(data.columns)) {\r\n this.events.emit('error', {\r\n error: new Error(\r\n '[KanbanBoard] Invalid board data: columns must be an array'\r\n ),\r\n })\r\n return\r\n }\r\n this.columnManager.setColumns(data.columns)\r\n this.labels = Array.isArray(data.labels) ? [...data.labels] : []\r\n this.filterEngine.clearFilter()\r\n this.events.emit('data:import', { board: data })\r\n this.render()\r\n }\r\n\r\n // ============================================================\r\n // Event API\r\n // ============================================================\r\n\r\n /**\r\n * 监听事件\r\n */\r\n on(event: string, handler: EventHandler): () => void {\r\n return this.events.on(event, handler)\r\n }\r\n\r\n /**\r\n * 监听一次性事件\r\n */\r\n once(event: string, handler: EventHandler): () => void {\r\n return this.events.once(event, handler)\r\n }\r\n\r\n /**\r\n * 移除事件监听\r\n */\r\n off(event: string, handler: EventHandler): void {\r\n this.events.off(event, handler)\r\n }\r\n\r\n // ============================================================\r\n // Label API\r\n // ============================================================\r\n\r\n /**\r\n * 获取所有标签\r\n */\r\n getLabels(): Label[] {\r\n return [...this.labels]\r\n }\r\n\r\n /**\r\n * 添加标签\r\n */\r\n addLabel(label: Label): void {\r\n this.labels.push(label)\r\n }\r\n\r\n /**\r\n * 移除标签\r\n */\r\n removeLabel(id: string): void {\r\n this.labels = this.labels.filter(l => l.id !== id)\r\n }\r\n\r\n // ============================================================\r\n // Render\r\n // ============================================================\r\n\r\n private renderTimer: ReturnType<typeof setTimeout> | null = null\r\n\r\n /**\r\n * 延迟渲染(合并多次调用,等待浏览器拖拽操作完成)\r\n */\r\n private scheduleRender(): void {\r\n if (this.renderTimer !== null) return\r\n this.renderTimer = setTimeout(() => {\r\n this.renderTimer = null\r\n this.render()\r\n }, 0)\r\n }\r\n\r\n /**\r\n * 重新渲染\r\n */\r\n render(): void {\r\n if (this.destroyed) return\r\n this.dragController.destroy()\r\n this.dragController = new DragController(\r\n this.events,\r\n this.options.classPrefix || 'kanban'\r\n )\r\n this.renderer = new Renderer(\r\n this.container,\r\n this.events,\r\n this.dragController,\r\n this.options\r\n )\r\n this.renderer.render(\r\n this.columnManager.getColumns(),\r\n this.filterEngine.getHiddenCardIds()\r\n )\r\n }\r\n\r\n /**\r\n * 获取看板根元素\r\n */\r\n getBoardElement(): HTMLElement | null {\r\n return this.renderer.getBoardElement()\r\n }\r\n\r\n /**\r\n * 获取配置\r\n */\r\n getOptions(): Readonly<KanbanOptions> {\r\n return { ...this.options }\r\n }\r\n\r\n // ============================================================\r\n // Lifecycle\r\n // ============================================================\r\n\r\n /**\r\n * 销毁实例\r\n */\r\n destroy(): void {\r\n if (this.destroyed) return\r\n this.destroyed = true\r\n\r\n if (this.renderTimer !== null) {\r\n clearTimeout(this.renderTimer)\r\n this.renderTimer = null\r\n }\r\n\r\n this.dragController.destroy()\r\n this.filterEngine.destroy()\r\n this.renderer.destroy()\r\n this.columnManager.clear()\r\n\r\n this.events.emit('destroy', undefined)\r\n this.options.onDestroy?.()\r\n this.events.removeAll()\r\n\r\n if (this.options.debug) {\r\n console.debug('[KanbanBoard] Destroyed')\r\n }\r\n }\r\n\r\n /**\r\n * 是否已销毁\r\n */\r\n isDestroyed(): boolean {\r\n return this.destroyed\r\n }\r\n}\r\n\r\n/**\r\n * 创建看板实例(工厂函数)\r\n */\r\nexport function createKanbanBoard(options: KanbanOptions): KanbanBoard {\r\n return new KanbanBoard(options)\r\n}\r\n","/**\r\n * @file index.ts\r\n * @description index 模块\r\n */\r\n\r\n/**\r\n * Utility functions for @composy/kanban-core\r\n */\r\n\r\nexport {\r\n clearElement,\r\n createElement,\r\n insertAt,\r\n removeElement,\r\n resolveElement,\r\n} from './dom'\r\nexport { generateId, resetIdCounter } from './id'\r\n\r\n/**\r\n * Get element from selector or element\r\n * @deprecated Use resolveElement instead\r\n */\r\n/**\r\n * getElement 函数\r\n * @param target - 参数\r\n * @returns 返回值\r\n */\r\n/**\r\n * getElement - get Element function\r\n * @param target - 参数说明\r\n * @returns 返回值说明\r\n */\r\nexport function getElement(target: HTMLElement | string): HTMLElement | null {\r\n if (typeof target === 'string') {\r\n return document.querySelector(target)\r\n }\r\n return target\r\n}\r\n"],"mappings":"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"}
@@ -0,0 +1 @@
1
+ {"version":1,"configuration":"b551ff32068c35fa7947dfe9fb4e0908d8bb79860e692824a1bcc52890ea9b17","sources":{"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\types\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\types\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\EventEmitter.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\EventEmitter.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\utils\\id.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\utils\\id.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\ColumnManager.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\ColumnManager.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\DragController.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\DragController.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\FilterEngine.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\FilterEngine.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\utils\\dom.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\utils\\dom.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\version.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\version.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\Renderer.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\Renderer.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\KanbanBoard.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\KanbanBoard.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\core\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\core\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\utils\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\utils\\index.d.ts"],"D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\src\\index.ts":["D:\\WorkBench\\ldesign\\libraries\\kanban\\packages\\core\\es\\index.d.ts"]}}
@@ -0,0 +1 @@
1
+ {"fileNames":["../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es5.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.dom.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.webworker.importscripts.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.scripthost.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.core.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.collection.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.generator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.iterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.proxy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.reflect.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.array.include.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2016.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2018.regexp.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.array.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.object.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.symbol.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2019.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.bigint.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.date.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.promise.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.string.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.intl.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.number.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.decorators.legacy.d.ts","../../../../../node_modules/.pnpm/typescript@5.9.3/node_modules/typescript/lib/lib.es2020.full.d.ts","../src/types/index.ts","../src/core/eventemitter.ts","../src/utils/id.ts","../src/core/columnmanager.ts","../src/core/dragcontroller.ts","../src/core/filterengine.ts","../src/utils/dom.ts","../src/version.ts","../src/core/renderer.ts","../src/core/kanbanboard.ts","../src/core/index.ts","../src/utils/index.ts","../src/index.ts"],"fileIdsList":[[52,53,54],[53],[52,53],[53,55,56,57,60,61],[52,53,55,56,57,58,59,60],[52,53,56,58],[52,53,55,56,57,59,60,61,63],[54,58]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7a3c8b952931daebdfc7a2897c53c0a1c73624593fa070e46bd537e64dcd20a","affectsGlobalScope":true,"impliedFormat":1},{"version":"80e18897e5884b6723488d4f5652167e7bb5024f946743134ecc4aa4ee731f89","affectsGlobalScope":true,"impliedFormat":1},{"version":"cd034f499c6cdca722b60c04b5b1b78e058487a7085a8e0d6fb50809947ee573","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"1305d1e76ca44e30fb8b2b8075fa522b83f60c0bcf5d4326a9d2cf79b53724f8","impliedFormat":1},{"version":"0cc559b142cdd8de2fa96f5e5c5d18c99541a83f76fd0e8b1d89d6246d975cf3","signature":"bd6c6de2e19ec2952bc9d094f9337c38c32a59cd4bf2de0c3a6de9d55a92cb45"},{"version":"a36e388a9d88ab9b2733088aee11409c6777e1d69d67bda098dd33dd7cb6d6ed","signature":"ee1f642a1672fd10b77089cd51684f75908c89d9808b363ff7bc7d7c108b1bac"},{"version":"d02eea403b59429d5e52f06a8acc2be6b0bccc9fc25f86f6f2a40c1a0b07c8a6","signature":"792e8f1f66fbba099f33fad5928cd20bf5baf66cb705ea70c398785e213fe7a2"},{"version":"d631e1c684ccdd4d0dab27e29c3545873d3f2a1e0a57df06d1d6c3d39995f570","signature":"41f8ae164975f4a203628252767bda8826e64a9fb8f6047c4046c0316653c259"},{"version":"a5cc3805aca98e772e1bb949181d92d0f5a41de5a84967afa16f491af960fb4f","signature":"0c958faeb04ea6c52d9ce2d8ae9c578c8f8440d4ac3d98c174ac120a7c26a953"},{"version":"dcefe6c2a0689d04565a4affc34ac942bfe588c2c76f2dcc6a32ad700cd07748","signature":"ca1ce96e8bda0a222f893009d619fbbd224ae49d9029788f91dfb476f0be711f"},{"version":"cf2b08a4595a0d72cfb760d25e75c6ae79d13c9c552e63b4cdd4dba88c466dd7","signature":"d0cde343431d43f8d30692fa04af5bce465750cdbd1f7eb42bcb51ef99ea8795"},{"version":"a06b9e3c88123552c2edbea44adb157eb8d546ec32543948db7a7ec9b762b748","signature":"b09571a432cf1d36ff30547493e1077b23151abb1f6323efa4540c97617b2445"},{"version":"ea7986d4078cb9e03dd0bf6ed6deac9034f6b94566d9742c7b4ddf9ce6f18935","signature":"de12ba667cd3c3d8473df19a1e7f0306c7b81c66b9f9b942870a2c11338f1ad7"},{"version":"8962ab27a706d1d534b97e139c5274e9931aab19d28695df6d6181f59932be9d","signature":"bfae3d2c94ed398345ad43571f49c73e56cd8161dc555eb15975c6efb7752e0e"},{"version":"9936d0828c0b2f77dc7e062329712ee04bebdc89a0c3c546e27e31104971e931","signature":"b924e318c9ca9a1cea62beaadcff2534fbd09698589a418d4c851b3c4ce5f2ee"},{"version":"39a2f159ff6cdb49a9b593f27c3cae8ca2500a2c7ef62db6f2fd6a9d2e707077","signature":"e05f43dfd5481b7c9201bc32a1b63a06a3f2f92030e7b049617c1dbd16e9d0e4"},{"version":"4476ee0785acb121827f2cf2c5147d88cb25618248931b458de7eaf1ea94ea8b","signature":"b734f0858c001ebc26878abedce2fcf13de07d877e074cd8083a6230d6e98bea"}],"root":[[52,64]],"options":{"allowJs":false,"declaration":true,"declarationDir":"./","declarationMap":false,"emitDeclarationOnly":true,"esModuleInterop":true,"module":99,"noImplicitAny":false,"outDir":"./","rootDir":"../src","skipLibCheck":true,"sourceMap":true,"strict":false,"target":7,"tsBuildInfoFile":"./.dts.tsbuildinfo"},"referencedMap":[[55,1],[56,2],[57,3],[62,4],[61,5],[60,6],[64,7],[63,8]],"semanticDiagnosticsPerFile":[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64],"version":"5.9.3"}
@@ -1,5 +1,5 @@
1
- import type { Column, Card } from '../types';
2
- import { EventEmitter } from './EventEmitter';
1
+ import type { Card, Column } from '../types';
2
+ import type { EventEmitter } from './EventEmitter';
3
3
  /**
4
4
  * 列管理器
5
5
  */
@@ -95,5 +95,6 @@ export declare class ColumnManager {
95
95
  * 清空所有数据
96
96
  */
97
97
  clear(): void;
98
+ private clampIndex;
99
+ private sortColumns;
98
100
  }
99
- //# sourceMappingURL=ColumnManager.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/kanban-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:33:25 *
5
+ * Build time: 2024-10-12 17:29:00 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -19,15 +19,25 @@ var ColumnManager = class {
19
19
  */
20
20
  init(columns) {
21
21
  this.columns = columns.map((col, index) => this.normalizeColumn(col, index));
22
+ this.sortColumns();
22
23
  }
23
24
  /**
24
25
  * 标准化列数据
25
26
  */
26
27
  normalizeColumn(partial, index) {
28
+ const id = partial.id || generateId("col");
29
+ const cards = (partial.cards ?? []).map((card, cardIndex) => this.normalizeCard({
30
+ ...card,
31
+ columnId: id
32
+ }, id, cardIndex));
33
+ cards.sort((a, b) => a.order - b.order);
34
+ cards.forEach((card, cardIndex) => {
35
+ card.order = cardIndex;
36
+ });
27
37
  return {
28
- id: partial.id || generateId("col"),
29
- title: partial.title || `Column ${index + 1}`,
30
- cards: (partial.cards || []).map((card, cardIndex) => this.normalizeCard(card, partial.id || "", cardIndex)),
38
+ id,
39
+ title: partial.title ?? `Column ${index + 1}`,
40
+ cards,
31
41
  wipLimit: partial.wipLimit,
32
42
  collapsed: partial.collapsed ?? false,
33
43
  color: partial.color,
@@ -40,16 +50,16 @@ var ColumnManager = class {
40
50
  normalizeCard(partial, columnId, index) {
41
51
  return {
42
52
  id: partial.id || generateId("card"),
43
- title: partial.title || "",
53
+ title: partial.title ?? "",
44
54
  description: partial.description,
45
- labels: partial.labels || [],
46
- assignees: partial.assignees || [],
55
+ labels: partial.labels?.map((label) => ({ ...label })) ?? [],
56
+ assignees: partial.assignees ? [...partial.assignees] : [],
47
57
  dueDate: partial.dueDate,
48
58
  priority: partial.priority,
49
59
  order: partial.order ?? index,
50
- columnId: partial.columnId || columnId,
60
+ columnId: partial.columnId ?? columnId,
51
61
  data: partial.data,
52
- createdAt: partial.createdAt || (/* @__PURE__ */ new Date()).toISOString(),
62
+ createdAt: partial.createdAt ?? (/* @__PURE__ */ new Date()).toISOString(),
53
63
  updatedAt: partial.updatedAt
54
64
  };
55
65
  }
@@ -70,11 +80,8 @@ var ColumnManager = class {
70
80
  */
71
81
  addColumn(partial) {
72
82
  const column = this.normalizeColumn(partial, this.columns.length);
73
- column.cards = column.cards.map((card) => ({
74
- ...card,
75
- columnId: column.id
76
- }));
77
83
  this.columns.push(column);
84
+ this.sortColumns();
78
85
  this.events.emit("column:add", { column });
79
86
  return column;
80
87
  }
@@ -96,6 +103,12 @@ var ColumnManager = class {
96
103
  const column = this.columns.find((c) => c.id === id);
97
104
  if (!column) return void 0;
98
105
  Object.assign(column, changes, { id });
106
+ if (changes.cards) {
107
+ column.cards = changes.cards.map((card, index) => this.normalizeCard(card, id, index));
108
+ column.cards.sort((a, b) => a.order - b.order);
109
+ this.reorderCards(column);
110
+ }
111
+ if (changes.order !== void 0) this.sortColumns();
99
112
  this.events.emit("column:update", {
100
113
  column,
101
114
  changes
@@ -106,15 +119,17 @@ var ColumnManager = class {
106
119
  * 移动列
107
120
  */
108
121
  moveColumn(id, toIndex) {
122
+ this.sortColumns();
109
123
  const fromIndex = this.columns.findIndex((c) => c.id === id);
110
124
  if (fromIndex === -1) return;
111
125
  const [column] = this.columns.splice(fromIndex, 1);
112
- this.columns.splice(toIndex, 0, column);
126
+ const targetIndex = this.clampIndex(toIndex, this.columns.length);
127
+ this.columns.splice(targetIndex, 0, column);
113
128
  this.reorderColumns();
114
129
  this.events.emit("column:move", {
115
130
  column,
116
131
  fromIndex,
117
- toIndex
132
+ toIndex: targetIndex
118
133
  });
119
134
  }
120
135
  /**
@@ -226,14 +241,15 @@ var ColumnManager = class {
226
241
  }
227
242
  const [card] = fromColumn.cards.splice(cardIndex, 1);
228
243
  card.columnId = toColumnId;
229
- toColumn.cards.splice(toIndex, 0, card);
244
+ const targetIndex = this.clampIndex(toIndex, toColumn.cards.length);
245
+ toColumn.cards.splice(targetIndex, 0, card);
230
246
  this.reorderCards(fromColumn);
231
247
  this.reorderCards(toColumn);
232
248
  this.events.emit("card:move", {
233
249
  card,
234
250
  fromColumnId: fromColumn.id,
235
251
  toColumnId,
236
- toIndex
252
+ toIndex: targetIndex
237
253
  });
238
254
  }
239
255
  /**
@@ -270,7 +286,8 @@ var ColumnManager = class {
270
286
  * 设置列数据(用于导入)
271
287
  */
272
288
  setColumns(columns) {
273
- this.columns = columns;
289
+ this.columns = columns.map((column, index) => this.normalizeColumn(column, index));
290
+ this.sortColumns();
274
291
  }
275
292
  /**
276
293
  * 清空所有数据
@@ -278,6 +295,14 @@ var ColumnManager = class {
278
295
  clear() {
279
296
  this.columns = [];
280
297
  }
298
+ clampIndex(index, length) {
299
+ if (!Number.isFinite(index)) return length;
300
+ return Math.min(Math.max(Math.trunc(index), 0), length);
301
+ }
302
+ sortColumns() {
303
+ this.columns.sort((a, b) => a.order - b.order);
304
+ this.reorderColumns();
305
+ }
281
306
  };
282
307
  //#endregion
283
308
  export { ColumnManager };
@@ -1 +1 @@
1
- {"version":3,"file":"ColumnManager.js","names":[],"sources":["../../src/core/ColumnManager.ts"],"sourcesContent":["import type { Column, Card } from '../types';\nimport { generateId } from '../utils/id';\nimport { EventEmitter } from './EventEmitter';\n\n/**\n * 列管理器\n */\nexport class ColumnManager {\n private columns: Column[] = [];\n private events: EventEmitter;\n\n constructor(events: EventEmitter) {\n this.events = events;\n }\n\n /**\n * 初始化列\n */\n init(columns: Partial<Column>[]): void {\n this.columns = columns.map((col, index) => this.normalizeColumn(col, index));\n }\n\n /**\n * 标准化列数据\n */\n private normalizeColumn(partial: Partial<Column>, index: number): Column {\n return {\n id: partial.id || generateId('col'),\n title: partial.title || `Column ${index + 1}`,\n cards: (partial.cards || []).map((card, cardIndex) =>\n this.normalizeCard(card, partial.id || '', cardIndex),\n ),\n wipLimit: partial.wipLimit,\n collapsed: partial.collapsed ?? false,\n color: partial.color,\n order: partial.order ?? index,\n };\n }\n\n /**\n * 标准化卡片数据\n */\n private normalizeCard(partial: Partial<Card>, columnId: string, index: number): Card {\n const id = partial.id || generateId('card');\n return {\n id,\n title: partial.title || '',\n description: partial.description,\n labels: partial.labels || [],\n assignees: partial.assignees || [],\n dueDate: partial.dueDate,\n priority: partial.priority,\n order: partial.order ?? index,\n columnId: partial.columnId || columnId,\n data: partial.data,\n createdAt: partial.createdAt || new Date().toISOString(),\n updatedAt: partial.updatedAt,\n };\n }\n\n /**\n * 获取所有列\n */\n getColumns(): Column[] {\n return [...this.columns].sort((a, b) => a.order - b.order);\n }\n\n /**\n * 获取单列\n */\n getColumn(id: string): Column | undefined {\n return this.columns.find(c => c.id === id);\n }\n\n /**\n * 添加列\n */\n addColumn(partial: Partial<Column>): Column {\n const column = this.normalizeColumn(partial, this.columns.length);\n // 确保新列的 cards 关联 columnId\n column.cards = column.cards.map(card => ({ ...card, columnId: column.id }));\n this.columns.push(column);\n this.events.emit('column:add', { column });\n return column;\n }\n\n /**\n * 移除列\n */\n removeColumn(id: string): Column | undefined {\n const index = this.columns.findIndex(c => c.id === id);\n if (index === -1) return undefined;\n const [column] = this.columns.splice(index, 1);\n this.reorderColumns();\n this.events.emit('column:remove', { column });\n return column;\n }\n\n /**\n * 更新列\n */\n updateColumn(id: string, changes: Partial<Column>): Column | undefined {\n const column = this.columns.find(c => c.id === id);\n if (!column) return undefined;\n Object.assign(column, changes, { id }); // 不允许更改 id\n this.events.emit('column:update', { column, changes });\n return column;\n }\n\n /**\n * 移动列\n */\n moveColumn(id: string, toIndex: number): void {\n const fromIndex = this.columns.findIndex(c => c.id === id);\n if (fromIndex === -1) return;\n const [column] = this.columns.splice(fromIndex, 1);\n this.columns.splice(toIndex, 0, column);\n this.reorderColumns();\n this.events.emit('column:move', { column, fromIndex, toIndex });\n }\n\n /**\n * 折叠/展开列\n */\n toggleCollapse(id: string): void {\n const column = this.columns.find(c => c.id === id);\n if (!column) return;\n column.collapsed = !column.collapsed;\n this.events.emit('column:collapse', { column, collapsed: column.collapsed });\n }\n\n /**\n * 获取列中的卡片\n */\n getCards(columnId: string): Card[] {\n const column = this.columns.find(c => c.id === columnId);\n return column ? [...column.cards].sort((a, b) => a.order - b.order) : [];\n }\n\n /**\n * 添加卡片到列\n */\n addCard(columnId: string, partial: Partial<Card>): Card | undefined {\n const column = this.columns.find(c => c.id === columnId);\n if (!column) return undefined;\n\n // 检查 WIP 限制\n if (column.wipLimit && column.cards.length >= column.wipLimit) {\n this.events.emit('error', {\n error: new Error(`Column \"${column.title}\" reached WIP limit (${column.wipLimit})`),\n });\n return undefined;\n }\n\n const card = this.normalizeCard(\n { ...partial, columnId },\n columnId,\n column.cards.length,\n );\n column.cards.push(card);\n this.events.emit('card:add', { card, columnId });\n return card;\n }\n\n /**\n * 移除卡片\n */\n removeCard(cardId: string): Card | undefined {\n for (const column of this.columns) {\n const index = column.cards.findIndex(c => c.id === cardId);\n if (index !== -1) {\n const [card] = column.cards.splice(index, 1);\n this.reorderCards(column);\n this.events.emit('card:remove', { card, columnId: column.id });\n return card;\n }\n }\n return undefined;\n }\n\n /**\n * 更新卡片\n */\n updateCard(cardId: string, changes: Partial<Card>): Card | undefined {\n for (const column of this.columns) {\n const card = column.cards.find(c => c.id === cardId);\n if (card) {\n Object.assign(card, changes, { id: cardId, columnId: column.id });\n card.updatedAt = new Date().toISOString();\n this.events.emit('card:update', { card, changes });\n return card;\n }\n }\n return undefined;\n }\n\n /**\n * 获取单张卡片\n */\n getCard(cardId: string): Card | undefined {\n for (const column of this.columns) {\n const card = column.cards.find(c => c.id === cardId);\n if (card) return card;\n }\n return undefined;\n }\n\n /**\n * 移动卡片\n */\n moveCard(cardId: string, toColumnId: string, toIndex: number): void {\n let fromColumn: Column | undefined;\n let cardIndex = -1;\n\n for (const column of this.columns) {\n const idx = column.cards.findIndex(c => c.id === cardId);\n if (idx !== -1) {\n fromColumn = column;\n cardIndex = idx;\n break;\n }\n }\n\n if (!fromColumn || cardIndex === -1) return;\n\n const toColumn = this.columns.find(c => c.id === toColumnId);\n if (!toColumn) return;\n\n // 检查 WIP 限制(跨列移动时)\n if (\n fromColumn.id !== toColumnId &&\n toColumn.wipLimit &&\n toColumn.cards.length >= toColumn.wipLimit\n ) {\n this.events.emit('error', {\n error: new Error(`Column \"${toColumn.title}\" reached WIP limit (${toColumn.wipLimit})`),\n });\n return;\n }\n\n const [card] = fromColumn.cards.splice(cardIndex, 1);\n card.columnId = toColumnId;\n toColumn.cards.splice(toIndex, 0, card);\n\n this.reorderCards(fromColumn);\n this.reorderCards(toColumn);\n\n this.events.emit('card:move', {\n card,\n fromColumnId: fromColumn.id,\n toColumnId,\n toIndex,\n });\n }\n\n /**\n * 获取所有卡片\n */\n getAllCards(): Card[] {\n const cards: Card[] = [];\n for (const column of this.columns) {\n cards.push(...column.cards);\n }\n return cards;\n }\n\n /**\n * 获取卡片总数\n */\n getCardCount(): number {\n return this.columns.reduce((sum, col) => sum + col.cards.length, 0);\n }\n\n /**\n * 重新排序列\n */\n private reorderColumns(): void {\n this.columns.forEach((col, index) => {\n col.order = index;\n });\n }\n\n /**\n * 重新排序列中的卡片\n */\n private reorderCards(column: Column): void {\n column.cards.forEach((card, index) => {\n card.order = index;\n });\n }\n\n /**\n * 设置列数据(用于导入)\n */\n setColumns(columns: Column[]): void {\n this.columns = columns;\n }\n\n /**\n * 清空所有数据\n */\n clear(): void {\n this.columns = [];\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ColumnManager.js","names":[],"sources":["../../src/core/ColumnManager.ts"],"sourcesContent":["import type { Card, Column } from '../types'\r\nimport type { EventEmitter } from './EventEmitter'\r\nimport { generateId } from '../utils/id'\r\n\r\n/**\r\n * 列管理器\r\n */\r\nexport class ColumnManager {\r\n private columns: Column[] = []\r\n private events: EventEmitter\r\n\r\n constructor(events: EventEmitter) {\r\n this.events = events\r\n }\r\n\r\n /**\r\n * 初始化列\r\n */\r\n init(columns: Partial<Column>[]): void {\r\n this.columns = columns.map((col, index) => this.normalizeColumn(col, index))\r\n this.sortColumns()\r\n }\r\n\r\n /**\r\n * 标准化列数据\r\n */\r\n private normalizeColumn(partial: Partial<Column>, index: number): Column {\r\n const id = partial.id || generateId('col')\r\n const cards = (partial.cards ?? []).map((card, cardIndex) =>\r\n this.normalizeCard({ ...card, columnId: id }, id, cardIndex)\r\n )\r\n cards.sort((a, b) => a.order - b.order)\r\n cards.forEach((card, cardIndex) => {\r\n card.order = cardIndex\r\n })\r\n return {\r\n id,\r\n title: partial.title ?? `Column ${index + 1}`,\r\n cards,\r\n wipLimit: partial.wipLimit,\r\n collapsed: partial.collapsed ?? false,\r\n color: partial.color,\r\n order: partial.order ?? index,\r\n }\r\n }\r\n\r\n /**\r\n * 标准化卡片数据\r\n */\r\n private normalizeCard(\r\n partial: Partial<Card>,\r\n columnId: string,\r\n index: number\r\n ): Card {\r\n const id = partial.id || generateId('card')\r\n return {\r\n id,\r\n title: partial.title ?? '',\r\n description: partial.description,\r\n labels: partial.labels?.map(label => ({ ...label })) ?? [],\r\n assignees: partial.assignees ? [...partial.assignees] : [],\r\n dueDate: partial.dueDate,\r\n priority: partial.priority,\r\n order: partial.order ?? index,\r\n columnId: partial.columnId ?? columnId,\r\n data: partial.data,\r\n createdAt: partial.createdAt ?? new Date().toISOString(),\r\n updatedAt: partial.updatedAt,\r\n }\r\n }\r\n\r\n /**\r\n * 获取所有列\r\n */\r\n getColumns(): Column[] {\r\n return [...this.columns].sort((a, b) => a.order - b.order)\r\n }\r\n\r\n /**\r\n * 获取单列\r\n */\r\n getColumn(id: string): Column | undefined {\r\n return this.columns.find(c => c.id === id)\r\n }\r\n\r\n /**\r\n * 添加列\r\n */\r\n addColumn(partial: Partial<Column>): Column {\r\n const column = this.normalizeColumn(partial, this.columns.length)\r\n this.columns.push(column)\r\n this.sortColumns()\r\n this.events.emit('column:add', { column })\r\n return column\r\n }\r\n\r\n /**\r\n * 移除列\r\n */\r\n removeColumn(id: string): Column | undefined {\r\n const index = this.columns.findIndex(c => c.id === id)\r\n if (index === -1) return undefined\r\n const [column] = this.columns.splice(index, 1)\r\n this.reorderColumns()\r\n this.events.emit('column:remove', { column })\r\n return column\r\n }\r\n\r\n /**\r\n * 更新列\r\n */\r\n updateColumn(id: string, changes: Partial<Column>): Column | undefined {\r\n const column = this.columns.find(c => c.id === id)\r\n if (!column) return undefined\r\n Object.assign(column, changes, { id }) // 不允许更改 id\r\n if (changes.cards) {\r\n column.cards = changes.cards.map((card, index) =>\r\n this.normalizeCard(card, id, index)\r\n )\r\n column.cards.sort((a, b) => a.order - b.order)\r\n this.reorderCards(column)\r\n }\r\n if (changes.order !== undefined) this.sortColumns()\r\n this.events.emit('column:update', { column, changes })\r\n return column\r\n }\r\n\r\n /**\r\n * 移动列\r\n */\r\n moveColumn(id: string, toIndex: number): void {\r\n this.sortColumns()\r\n const fromIndex = this.columns.findIndex(c => c.id === id)\r\n if (fromIndex === -1) return\r\n const [column] = this.columns.splice(fromIndex, 1)\r\n const targetIndex = this.clampIndex(toIndex, this.columns.length)\r\n this.columns.splice(targetIndex, 0, column)\r\n this.reorderColumns()\r\n this.events.emit('column:move', { column, fromIndex, toIndex: targetIndex })\r\n }\r\n\r\n /**\r\n * 折叠/展开列\r\n */\r\n toggleCollapse(id: string): void {\r\n const column = this.columns.find(c => c.id === id)\r\n if (!column) return\r\n column.collapsed = !column.collapsed\r\n this.events.emit('column:collapse', { column, collapsed: column.collapsed })\r\n }\r\n\r\n /**\r\n * 获取列中的卡片\r\n */\r\n getCards(columnId: string): Card[] {\r\n const column = this.columns.find(c => c.id === columnId)\r\n return column ? [...column.cards].sort((a, b) => a.order - b.order) : []\r\n }\r\n\r\n /**\r\n * 添加卡片到列\r\n */\r\n addCard(columnId: string, partial: Partial<Card>): Card | undefined {\r\n const column = this.columns.find(c => c.id === columnId)\r\n if (!column) return undefined\r\n\r\n // 检查 WIP 限制\r\n if (column.wipLimit && column.cards.length >= column.wipLimit) {\r\n this.events.emit('error', {\r\n error: new Error(\r\n `Column \"${column.title}\" reached WIP limit (${column.wipLimit})`\r\n ),\r\n })\r\n return undefined\r\n }\r\n\r\n const card = this.normalizeCard(\r\n { ...partial, columnId },\r\n columnId,\r\n column.cards.length\r\n )\r\n column.cards.push(card)\r\n this.events.emit('card:add', { card, columnId })\r\n return card\r\n }\r\n\r\n /**\r\n * 移除卡片\r\n */\r\n removeCard(cardId: string): Card | undefined {\r\n for (const column of this.columns) {\r\n const index = column.cards.findIndex(c => c.id === cardId)\r\n if (index !== -1) {\r\n const [card] = column.cards.splice(index, 1)\r\n this.reorderCards(column)\r\n this.events.emit('card:remove', { card, columnId: column.id })\r\n return card\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 更新卡片\r\n */\r\n updateCard(cardId: string, changes: Partial<Card>): Card | undefined {\r\n for (const column of this.columns) {\r\n const card = column.cards.find(c => c.id === cardId)\r\n if (card) {\r\n Object.assign(card, changes, { id: cardId, columnId: column.id })\r\n card.updatedAt = new Date().toISOString()\r\n this.events.emit('card:update', { card, changes })\r\n return card\r\n }\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 获取单张卡片\r\n */\r\n getCard(cardId: string): Card | undefined {\r\n for (const column of this.columns) {\r\n const card = column.cards.find(c => c.id === cardId)\r\n if (card) return card\r\n }\r\n return undefined\r\n }\r\n\r\n /**\r\n * 移动卡片\r\n */\r\n moveCard(cardId: string, toColumnId: string, toIndex: number): void {\r\n let fromColumn: Column | undefined\r\n let cardIndex = -1\r\n\r\n for (const column of this.columns) {\r\n const idx = column.cards.findIndex(c => c.id === cardId)\r\n if (idx !== -1) {\r\n fromColumn = column\r\n cardIndex = idx\r\n break\r\n }\r\n }\r\n\r\n if (!fromColumn || cardIndex === -1) return\r\n\r\n const toColumn = this.columns.find(c => c.id === toColumnId)\r\n if (!toColumn) return\r\n\r\n // 检查 WIP 限制(跨列移动时)\r\n if (\r\n fromColumn.id !== toColumnId &&\r\n toColumn.wipLimit &&\r\n toColumn.cards.length >= toColumn.wipLimit\r\n ) {\r\n this.events.emit('error', {\r\n error: new Error(\r\n `Column \"${toColumn.title}\" reached WIP limit (${toColumn.wipLimit})`\r\n ),\r\n })\r\n return\r\n }\r\n\r\n const [card] = fromColumn.cards.splice(cardIndex, 1)\r\n card.columnId = toColumnId\r\n const targetIndex = this.clampIndex(toIndex, toColumn.cards.length)\r\n toColumn.cards.splice(targetIndex, 0, card)\r\n\r\n this.reorderCards(fromColumn)\r\n this.reorderCards(toColumn)\r\n\r\n this.events.emit('card:move', {\r\n card,\r\n fromColumnId: fromColumn.id,\r\n toColumnId,\r\n toIndex: targetIndex,\r\n })\r\n }\r\n\r\n /**\r\n * 获取所有卡片\r\n */\r\n getAllCards(): Card[] {\r\n const cards: Card[] = []\r\n for (const column of this.columns) {\r\n cards.push(...column.cards)\r\n }\r\n return cards\r\n }\r\n\r\n /**\r\n * 获取卡片总数\r\n */\r\n getCardCount(): number {\r\n return this.columns.reduce((sum, col) => sum + col.cards.length, 0)\r\n }\r\n\r\n /**\r\n * 重新排序列\r\n */\r\n private reorderColumns(): void {\r\n this.columns.forEach((col, index) => {\r\n col.order = index\r\n })\r\n }\r\n\r\n /**\r\n * 重新排序列中的卡片\r\n */\r\n private reorderCards(column: Column): void {\r\n column.cards.forEach((card, index) => {\r\n card.order = index\r\n })\r\n }\r\n\r\n /**\r\n * 设置列数据(用于导入)\r\n */\r\n setColumns(columns: Column[]): void {\r\n this.columns = columns.map((column, index) =>\r\n this.normalizeColumn(column, index)\r\n )\r\n this.sortColumns()\r\n }\r\n\r\n /**\r\n * 清空所有数据\r\n */\r\n clear(): void {\r\n this.columns = []\r\n }\r\n\r\n private clampIndex(index: number, length: number): number {\r\n if (!Number.isFinite(index)) return length\r\n return Math.min(Math.max(Math.trunc(index), 0), length)\r\n }\r\n\r\n private sortColumns(): void {\r\n this.columns.sort((a, b) => a.order - b.order)\r\n this.reorderColumns()\r\n }\r\n}\r\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { EventEmitter } from './EventEmitter';
1
+ import type { EventEmitter } from './EventEmitter';
2
2
  /**
3
3
  * DragState - Drag State interface
4
4
  */
@@ -52,4 +52,3 @@ export declare class DragController {
52
52
  */
53
53
  destroy(): void;
54
54
  }
55
- //# sourceMappingURL=DragController.d.ts.map
@@ -2,7 +2,7 @@
2
2
  * ***********************************
3
3
  * @composy/kanban-core v0.0.1 *
4
4
  * Built with rollup *
5
- * Build time: 2024-08-17 11:33:25 *
5
+ * Build time: 2024-10-12 17:29:00 *
6
6
  * Build mode: production *
7
7
  * Minified: No *
8
8
  * ***********************************
@@ -36,6 +36,8 @@ var DragController = class {
36
36
  this.state.dragging = true;
37
37
  this.state.cardId = cardId;
38
38
  this.state.sourceColumnId = columnId;
39
+ this.state.targetColumnId = columnId;
40
+ this.state.targetIndex = 0;
39
41
  cardEl.classList.add(`${this.prefix}-card--dragging`);
40
42
  this.events.emit("card:drag-start", {
41
43
  cardId,
@@ -49,6 +51,8 @@ var DragController = class {
49
51
  this.state.dragging = false;
50
52
  this.state.cardId = null;
51
53
  this.state.sourceColumnId = null;
54
+ this.state.targetColumnId = null;
55
+ this.state.targetIndex = 0;
52
56
  this.events.emit("card:drag-end", { cardId });
53
57
  };
54
58
  cardEl.addEventListener("dragstart", onDragStart);
@@ -98,6 +102,7 @@ var DragController = class {
98
102
  if (child.hasAttribute("data-card-id") && !child.classList.contains(`${this.prefix}-card--dragging`)) dropIndex++;
99
103
  }
100
104
  } else dropIndex = columnBodyEl.querySelectorAll(`[data-card-id]:not(.${this.prefix}-card--dragging)`).length;
105
+ this.state.targetIndex = dropIndex;
101
106
  this.events.emit("card:drop", {
102
107
  cardId,
103
108
  fromColumnId: this.state.sourceColumnId,
@@ -217,6 +222,11 @@ var DragController = class {
217
222
  this.cleanupFns.forEach((fn) => fn());
218
223
  this.cleanupFns = [];
219
224
  this.removePlaceholder();
225
+ this.state.dragging = false;
226
+ this.state.cardId = null;
227
+ this.state.sourceColumnId = null;
228
+ this.state.targetColumnId = null;
229
+ this.state.targetIndex = 0;
220
230
  }
221
231
  };
222
232
  //#endregion