@composy/kanban-core 0.0.1

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 (145) hide show
  1. package/README.md +37 -0
  2. package/dist/index.css +307 -0
  3. package/dist/index.js +1279 -0
  4. package/dist/index.js.map +1 -0
  5. package/dist/index.min.css +1 -0
  6. package/dist/index.min.js +1 -0
  7. package/es/core/ColumnManager.d.ts +99 -0
  8. package/es/core/ColumnManager.d.ts.map +1 -0
  9. package/es/core/ColumnManager.js +285 -0
  10. package/es/core/ColumnManager.js.map +1 -0
  11. package/es/core/DragController.d.ts +55 -0
  12. package/es/core/DragController.d.ts.map +1 -0
  13. package/es/core/DragController.js +225 -0
  14. package/es/core/DragController.js.map +1 -0
  15. package/es/core/EventEmitter.d.ts +35 -0
  16. package/es/core/EventEmitter.d.ts.map +1 -0
  17. package/es/core/EventEmitter.js +68 -0
  18. package/es/core/EventEmitter.js.map +1 -0
  19. package/es/core/FilterEngine.d.ts +45 -0
  20. package/es/core/FilterEngine.d.ts.map +1 -0
  21. package/es/core/FilterEngine.js +127 -0
  22. package/es/core/FilterEngine.js.map +1 -0
  23. package/es/core/KanbanBoard.d.ts +152 -0
  24. package/es/core/KanbanBoard.d.ts.map +1 -0
  25. package/es/core/KanbanBoard.js +332 -0
  26. package/es/core/KanbanBoard.js.map +1 -0
  27. package/es/core/Renderer.d.ts +59 -0
  28. package/es/core/Renderer.d.ts.map +1 -0
  29. package/es/core/Renderer.js +247 -0
  30. package/es/core/Renderer.js.map +1 -0
  31. package/es/core/index.d.ts +11 -0
  32. package/es/core/index.d.ts.map +1 -0
  33. package/es/core/index.js +17 -0
  34. package/es/index.d.ts +15 -0
  35. package/es/index.d.ts.map +1 -0
  36. package/es/index.js +21 -0
  37. package/es/styles/kanban.css +306 -0
  38. package/es/types/index.d.ts +209 -0
  39. package/es/types/index.d.ts.map +1 -0
  40. package/es/types/index.js +10 -0
  41. package/es/utils/dom.d.ts +24 -0
  42. package/es/utils/dom.d.ts.map +1 -0
  43. package/es/utils/dom.js +37 -0
  44. package/es/utils/dom.js.map +1 -0
  45. package/es/utils/id.d.ts +9 -0
  46. package/es/utils/id.d.ts.map +1 -0
  47. package/es/utils/id.js +22 -0
  48. package/es/utils/id.js.map +1 -0
  49. package/es/utils/index.d.ts +25 -0
  50. package/es/utils/index.d.ts.map +1 -0
  51. package/es/utils/index.js +20 -0
  52. package/es/utils/index.js.map +1 -0
  53. package/es/version.d.ts +6 -0
  54. package/es/version.d.ts.map +1 -0
  55. package/es/version.js +15 -0
  56. package/es/version.js.map +1 -0
  57. package/esm/core/ColumnManager.d.ts +99 -0
  58. package/esm/core/ColumnManager.d.ts.map +1 -0
  59. package/esm/core/ColumnManager.js +285 -0
  60. package/esm/core/ColumnManager.js.map +1 -0
  61. package/esm/core/DragController.d.ts +55 -0
  62. package/esm/core/DragController.d.ts.map +1 -0
  63. package/esm/core/DragController.js +225 -0
  64. package/esm/core/DragController.js.map +1 -0
  65. package/esm/core/EventEmitter.d.ts +35 -0
  66. package/esm/core/EventEmitter.d.ts.map +1 -0
  67. package/esm/core/EventEmitter.js +68 -0
  68. package/esm/core/EventEmitter.js.map +1 -0
  69. package/esm/core/FilterEngine.d.ts +45 -0
  70. package/esm/core/FilterEngine.d.ts.map +1 -0
  71. package/esm/core/FilterEngine.js +127 -0
  72. package/esm/core/FilterEngine.js.map +1 -0
  73. package/esm/core/KanbanBoard.d.ts +152 -0
  74. package/esm/core/KanbanBoard.d.ts.map +1 -0
  75. package/esm/core/KanbanBoard.js +332 -0
  76. package/esm/core/KanbanBoard.js.map +1 -0
  77. package/esm/core/Renderer.d.ts +59 -0
  78. package/esm/core/Renderer.d.ts.map +1 -0
  79. package/esm/core/Renderer.js +247 -0
  80. package/esm/core/Renderer.js.map +1 -0
  81. package/esm/core/index.d.ts +11 -0
  82. package/esm/core/index.d.ts.map +1 -0
  83. package/esm/core/index.js +17 -0
  84. package/esm/index.d.ts +15 -0
  85. package/esm/index.d.ts.map +1 -0
  86. package/esm/index.js +21 -0
  87. package/esm/styles/kanban.less +339 -0
  88. package/esm/types/index.d.ts +209 -0
  89. package/esm/types/index.d.ts.map +1 -0
  90. package/esm/types/index.js +10 -0
  91. package/esm/utils/dom.d.ts +24 -0
  92. package/esm/utils/dom.d.ts.map +1 -0
  93. package/esm/utils/dom.js +37 -0
  94. package/esm/utils/dom.js.map +1 -0
  95. package/esm/utils/id.d.ts +9 -0
  96. package/esm/utils/id.d.ts.map +1 -0
  97. package/esm/utils/id.js +22 -0
  98. package/esm/utils/id.js.map +1 -0
  99. package/esm/utils/index.d.ts +25 -0
  100. package/esm/utils/index.d.ts.map +1 -0
  101. package/esm/utils/index.js +20 -0
  102. package/esm/utils/index.js.map +1 -0
  103. package/esm/version.d.ts +6 -0
  104. package/esm/version.d.ts.map +1 -0
  105. package/esm/version.js +15 -0
  106. package/esm/version.js.map +1 -0
  107. package/lib/core/ColumnManager.cjs +286 -0
  108. package/lib/core/ColumnManager.cjs.map +1 -0
  109. package/lib/core/ColumnManager.d.ts +99 -0
  110. package/lib/core/DragController.cjs +226 -0
  111. package/lib/core/DragController.cjs.map +1 -0
  112. package/lib/core/DragController.d.ts +55 -0
  113. package/lib/core/EventEmitter.cjs +69 -0
  114. package/lib/core/EventEmitter.cjs.map +1 -0
  115. package/lib/core/EventEmitter.d.ts +35 -0
  116. package/lib/core/FilterEngine.cjs +128 -0
  117. package/lib/core/FilterEngine.cjs.map +1 -0
  118. package/lib/core/FilterEngine.d.ts +45 -0
  119. package/lib/core/KanbanBoard.cjs +334 -0
  120. package/lib/core/KanbanBoard.cjs.map +1 -0
  121. package/lib/core/KanbanBoard.d.ts +152 -0
  122. package/lib/core/Renderer.cjs +248 -0
  123. package/lib/core/Renderer.cjs.map +1 -0
  124. package/lib/core/Renderer.d.ts +59 -0
  125. package/lib/core/index.cjs +24 -0
  126. package/lib/core/index.d.ts +11 -0
  127. package/lib/index.cjs +37 -0
  128. package/lib/index.d.ts +15 -0
  129. package/lib/package.json +3 -0
  130. package/lib/styles/kanban.css +306 -0
  131. package/lib/types/index.cjs +11 -0
  132. package/lib/types/index.d.ts +209 -0
  133. package/lib/utils/dom.cjs +42 -0
  134. package/lib/utils/dom.cjs.map +1 -0
  135. package/lib/utils/dom.d.ts +24 -0
  136. package/lib/utils/id.cjs +24 -0
  137. package/lib/utils/id.cjs.map +1 -0
  138. package/lib/utils/id.d.ts +9 -0
  139. package/lib/utils/index.cjs +28 -0
  140. package/lib/utils/index.cjs.map +1 -0
  141. package/lib/utils/index.d.ts +25 -0
  142. package/lib/version.cjs +16 -0
  143. package/lib/version.cjs.map +1 -0
  144. package/lib/version.d.ts +6 -0
  145. package/package.json +105 -0
@@ -0,0 +1,68 @@
1
+ /*!
2
+ * ***********************************
3
+ * @composy/kanban-core v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-08-17 11:33:25 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ //#region src/core/EventEmitter.ts
11
+ var EventEmitter = class {
12
+ constructor() {
13
+ this.listeners = /* @__PURE__ */ new Map();
14
+ }
15
+ /**
16
+ * 监听事件
17
+ */
18
+ on(event, handler) {
19
+ if (!this.listeners.has(event)) this.listeners.set(event, /* @__PURE__ */ new Set());
20
+ this.listeners.get(event).add(handler);
21
+ return () => this.off(event, handler);
22
+ }
23
+ /**
24
+ * 监听一次性事件
25
+ */
26
+ once(event, handler) {
27
+ const wrapper = (...args) => {
28
+ this.off(event, wrapper);
29
+ handler(...args);
30
+ };
31
+ return this.on(event, wrapper);
32
+ }
33
+ /**
34
+ * 移除监听器
35
+ */
36
+ off(event, handler) {
37
+ this.listeners.get(event)?.delete(handler);
38
+ }
39
+ /**
40
+ * 触发事件
41
+ */
42
+ emit(event, payload) {
43
+ const handlers = this.listeners.get(event);
44
+ if (handlers) handlers.forEach((handler) => {
45
+ try {
46
+ handler(payload);
47
+ } catch (err) {
48
+ console.error(`[KanbanBoard] Error in event handler for "${event}":`, err);
49
+ }
50
+ });
51
+ }
52
+ /**
53
+ * 移除所有监听器
54
+ */
55
+ removeAll() {
56
+ this.listeners.clear();
57
+ }
58
+ /**
59
+ * 获取监听器数量
60
+ */
61
+ listenerCount(event) {
62
+ return this.listeners.get(event)?.size ?? 0;
63
+ }
64
+ };
65
+ //#endregion
66
+ export { EventEmitter };
67
+ /*! End of @composy/kanban-core | Powered by @composy/builder */
68
+ //# sourceMappingURL=EventEmitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EventEmitter.js","names":[],"sources":["../../src/core/EventEmitter.ts"],"sourcesContent":["/**\n * 轻量级事件发射器\n */\nexport type EventHandler = (...args: unknown[]) => void;\n\n/**\n * EventEmitter - Event Emitter class\n */\nexport class EventEmitter {\n private listeners = new Map<string, Set<EventHandler>>();\n\n /**\n * 监听事件\n */\n on(event: string, handler: EventHandler): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n this.listeners.get(event)!.add(handler);\n return () => this.off(event, handler);\n }\n\n /**\n * 监听一次性事件\n */\n once(event: string, handler: EventHandler): () => void {\n const wrapper: EventHandler = (...args) => {\n this.off(event, wrapper);\n handler(...args);\n };\n return this.on(event, wrapper);\n }\n\n /**\n * 移除监听器\n */\n off(event: string, handler: EventHandler): void {\n this.listeners.get(event)?.delete(handler);\n }\n\n /**\n * 触发事件\n */\n emit(event: string, payload?: unknown): void {\n const handlers = this.listeners.get(event);\n if (handlers) {\n handlers.forEach(handler => {\n try {\n handler(payload);\n } catch (err) {\n console.error(`[KanbanBoard] Error in event handler for \"${event}\":`, err);\n }\n });\n }\n }\n\n /**\n * 移除所有监听器\n */\n removeAll(): void {\n this.listeners.clear();\n }\n\n /**\n * 获取监听器数量\n */\n listenerCount(event: string): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n"],"mappings":";;;;;;;;;;AAQO,IAAM,eAAN,MAAmB;CAAnB,cAAA;EACL,KAAQ,4BAAY,IAAI,IAA+B;CAAA;;;;CAKvD,GAAG,OAAe,SAAmC;EACnD,IAAI,CAAC,KAAK,UAAU,IAAI,KAAK,GAC3B,KAAK,UAAU,IAAI,uBAAO,IAAI,IAAI,CAAC;EAErC,KAAK,UAAU,IAAI,KAAK,CAAA,CAAG,IAAI,OAAO;EACtC,aAAa,KAAK,IAAI,OAAO,OAAO;CACtC;;;;CAKA,KAAK,OAAe,SAAmC;EACrD,MAAM,WAAwB,GAAI,SAAS;GACzC,KAAK,IAAI,OAAO,OAAO;GACvB,QAAQ,GAAG,IAAI;EACjB;EACA,OAAO,KAAK,GAAG,OAAO,OAAO;CAC/B;;;;CAKA,IAAI,OAAe,SAA6B;EAC9C,KAAK,UAAU,IAAI,KAAK,CAAA,EAAG,OAAO,OAAO;CAC3C;;;;CAKA,KAAK,OAAe,SAAyB;EAC3C,MAAM,WAAW,KAAK,UAAU,IAAI,KAAK;EACzC,IAAI,UACF,SAAS,SAAQ,YAAW;GAC1B,IAAI;IACF,QAAQ,OAAO;GACjB,SAAS,KAAK;IACZ,QAAQ,MAAM,6CAA6C,MAAK,KAAM,GAAG;GAC3E;EACF,CAAC;CAEL;;;;CAKA,YAAkB;EAChB,KAAK,UAAU,MAAM;CACvB;;;;CAKA,cAAc,OAAuB;EACnC,OAAO,KAAK,UAAU,IAAI,KAAK,CAAA,EAAG,QAAQ;CAC5C;AACF"}
@@ -0,0 +1,45 @@
1
+ import type { Card, Column, FilterCriteria } from '../types';
2
+ import { EventEmitter } from './EventEmitter';
3
+ /**
4
+ * 筛选/搜索引擎
5
+ */
6
+ export declare class FilterEngine {
7
+ private events;
8
+ private currentCriteria;
9
+ /** 被过滤隐藏的卡片 ID 集合 */
10
+ private hiddenCardIds;
11
+ constructor(events: EventEmitter);
12
+ /**
13
+ * 应用筛选条件
14
+ */
15
+ filter(criteria: FilterCriteria, columns: Column[]): Set<string>;
16
+ /**
17
+ * 搜索卡片
18
+ */
19
+ search(keyword: string, columns: Column[]): Card[];
20
+ /**
21
+ * 清除筛选
22
+ */
23
+ clearFilter(): void;
24
+ /**
25
+ * 检查卡片是否可见
26
+ */
27
+ isCardVisible(cardId: string): boolean;
28
+ /**
29
+ * 获取隐藏的卡片 ID 集合
30
+ */
31
+ getHiddenCardIds(): Set<string>;
32
+ /**
33
+ * 获取当前筛选条件
34
+ */
35
+ getCurrentCriteria(): FilterCriteria | null;
36
+ /**
37
+ * 匹配筛选条件
38
+ */
39
+ private matchCriteria;
40
+ /**
41
+ * 销毁
42
+ */
43
+ destroy(): void;
44
+ }
45
+ //# sourceMappingURL=FilterEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterEngine.d.ts","sourceRoot":"","sources":["../../src/core/FilterEngine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;GAEG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAe;IAC7B,OAAO,CAAC,eAAe,CAA+B;IACtD,qBAAqB;IACrB,OAAO,CAAC,aAAa,CAAqB;gBAE9B,MAAM,EAAE,YAAY;IAIhC;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IAgBhE;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE;IA8BlD;;OAEG;IACH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IACH,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAItC;;OAEG;IACH,gBAAgB,IAAI,GAAG,CAAC,MAAM,CAAC;IAI/B;;OAEG;IACH,kBAAkB,IAAI,cAAc,GAAG,IAAI;IAI3C;;OAEG;IACH,OAAO,CAAC,aAAa;IAkDrB;;OAEG;IACH,OAAO,IAAI,IAAI;CAIhB"}
@@ -0,0 +1,127 @@
1
+ /*!
2
+ * ***********************************
3
+ * @composy/kanban-core v0.0.1 *
4
+ * Built with rollup *
5
+ * Build time: 2024-08-17 11:33:25 *
6
+ * Build mode: production *
7
+ * Minified: No *
8
+ * ***********************************
9
+ */
10
+ //#region src/core/FilterEngine.ts
11
+ var FilterEngine = class {
12
+ constructor(events) {
13
+ this.currentCriteria = null;
14
+ /** 被过滤隐藏的卡片 ID 集合 */
15
+ this.hiddenCardIds = /* @__PURE__ */ new Set();
16
+ this.events = events;
17
+ }
18
+ /**
19
+ * 应用筛选条件
20
+ */
21
+ filter(criteria, columns) {
22
+ this.currentCriteria = criteria;
23
+ this.hiddenCardIds.clear();
24
+ const allCards = columns.flatMap((col) => col.cards);
25
+ for (const card of allCards) if (!this.matchCriteria(card, criteria)) this.hiddenCardIds.add(card.id);
26
+ this.events.emit("filter:change", { criteria });
27
+ return new Set(this.hiddenCardIds);
28
+ }
29
+ /**
30
+ * 搜索卡片
31
+ */
32
+ search(keyword, columns) {
33
+ this.events.emit("search:change", { keyword });
34
+ if (!keyword.trim()) {
35
+ this.clearFilter();
36
+ return columns.flatMap((col) => col.cards);
37
+ }
38
+ const lowerKeyword = keyword.toLowerCase();
39
+ const allCards = columns.flatMap((col) => col.cards);
40
+ const matched = [];
41
+ this.hiddenCardIds.clear();
42
+ for (const card of allCards) {
43
+ const titleMatch = card.title.toLowerCase().includes(lowerKeyword);
44
+ const descMatch = card.description?.toLowerCase().includes(lowerKeyword) ?? false;
45
+ const labelMatch = card.labels?.some((l) => l.name.toLowerCase().includes(lowerKeyword)) ?? false;
46
+ const assigneeMatch = card.assignees?.some((a) => a.toLowerCase().includes(lowerKeyword)) ?? false;
47
+ if (titleMatch || descMatch || labelMatch || assigneeMatch) matched.push(card);
48
+ else this.hiddenCardIds.add(card.id);
49
+ }
50
+ return matched;
51
+ }
52
+ /**
53
+ * 清除筛选
54
+ */
55
+ clearFilter() {
56
+ this.currentCriteria = null;
57
+ this.hiddenCardIds.clear();
58
+ this.events.emit("filter:clear", void 0);
59
+ }
60
+ /**
61
+ * 检查卡片是否可见
62
+ */
63
+ isCardVisible(cardId) {
64
+ return !this.hiddenCardIds.has(cardId);
65
+ }
66
+ /**
67
+ * 获取隐藏的卡片 ID 集合
68
+ */
69
+ getHiddenCardIds() {
70
+ return new Set(this.hiddenCardIds);
71
+ }
72
+ /**
73
+ * 获取当前筛选条件
74
+ */
75
+ getCurrentCriteria() {
76
+ return this.currentCriteria;
77
+ }
78
+ /**
79
+ * 匹配筛选条件
80
+ */
81
+ matchCriteria(card, criteria) {
82
+ if (criteria.keyword) {
83
+ const kw = criteria.keyword.toLowerCase();
84
+ const titleMatch = card.title.toLowerCase().includes(kw);
85
+ const descMatch = card.description?.toLowerCase().includes(kw) ?? false;
86
+ if (!titleMatch && !descMatch) return false;
87
+ }
88
+ if (criteria.labelIds?.length) {
89
+ const cardLabelIds = card.labels?.map((l) => l.id) ?? [];
90
+ if (!criteria.labelIds.some((id) => cardLabelIds.includes(id))) return false;
91
+ }
92
+ if (criteria.assignees?.length) {
93
+ if (!criteria.assignees.some((a) => card.assignees?.includes(a))) return false;
94
+ }
95
+ if (criteria.priorities?.length) {
96
+ if (!card.priority || !criteria.priorities.includes(card.priority)) return false;
97
+ }
98
+ if (criteria.columnIds?.length) {
99
+ if (!criteria.columnIds.includes(card.columnId)) return false;
100
+ }
101
+ if (criteria.dueDateRange) {
102
+ if (!card.dueDate) return false;
103
+ const dueDate = new Date(card.dueDate).getTime();
104
+ if (criteria.dueDateRange.start) {
105
+ if (dueDate < new Date(criteria.dueDateRange.start).getTime()) return false;
106
+ }
107
+ if (criteria.dueDateRange.end) {
108
+ if (dueDate > new Date(criteria.dueDateRange.end).getTime()) return false;
109
+ }
110
+ }
111
+ if (criteria.custom) {
112
+ if (!criteria.custom(card)) return false;
113
+ }
114
+ return true;
115
+ }
116
+ /**
117
+ * 销毁
118
+ */
119
+ destroy() {
120
+ this.hiddenCardIds.clear();
121
+ this.currentCriteria = null;
122
+ }
123
+ };
124
+ //#endregion
125
+ export { FilterEngine };
126
+ /*! End of @composy/kanban-core | Powered by @composy/builder */
127
+ //# sourceMappingURL=FilterEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FilterEngine.js","names":[],"sources":["../../src/core/FilterEngine.ts"],"sourcesContent":["import type { Card, Column, FilterCriteria } from '../types';\nimport { EventEmitter } from './EventEmitter';\n\n/**\n * 筛选/搜索引擎\n */\nexport class FilterEngine {\n private events: EventEmitter;\n private currentCriteria: FilterCriteria | null = null;\n /** 被过滤隐藏的卡片 ID 集合 */\n private hiddenCardIds = new Set<string>();\n\n constructor(events: EventEmitter) {\n this.events = events;\n }\n\n /**\n * 应用筛选条件\n */\n filter(criteria: FilterCriteria, columns: Column[]): Set<string> {\n this.currentCriteria = criteria;\n this.hiddenCardIds.clear();\n\n const allCards = columns.flatMap(col => col.cards);\n\n for (const card of allCards) {\n if (!this.matchCriteria(card, criteria)) {\n this.hiddenCardIds.add(card.id);\n }\n }\n\n this.events.emit('filter:change', { criteria });\n return new Set(this.hiddenCardIds);\n }\n\n /**\n * 搜索卡片\n */\n search(keyword: string, columns: Column[]): Card[] {\n this.events.emit('search:change', { keyword });\n\n if (!keyword.trim()) {\n this.clearFilter();\n return columns.flatMap(col => col.cards);\n }\n\n const lowerKeyword = keyword.toLowerCase();\n const allCards = columns.flatMap(col => col.cards);\n const matched: Card[] = [];\n\n this.hiddenCardIds.clear();\n\n for (const card of allCards) {\n const titleMatch = card.title.toLowerCase().includes(lowerKeyword);\n const descMatch = card.description?.toLowerCase().includes(lowerKeyword) ?? false;\n const labelMatch = card.labels?.some(l => l.name.toLowerCase().includes(lowerKeyword)) ?? false;\n const assigneeMatch = card.assignees?.some(a => a.toLowerCase().includes(lowerKeyword)) ?? false;\n\n if (titleMatch || descMatch || labelMatch || assigneeMatch) {\n matched.push(card);\n } else {\n this.hiddenCardIds.add(card.id);\n }\n }\n\n return matched;\n }\n\n /**\n * 清除筛选\n */\n clearFilter(): void {\n this.currentCriteria = null;\n this.hiddenCardIds.clear();\n this.events.emit('filter:clear', undefined);\n }\n\n /**\n * 检查卡片是否可见\n */\n isCardVisible(cardId: string): boolean {\n return !this.hiddenCardIds.has(cardId);\n }\n\n /**\n * 获取隐藏的卡片 ID 集合\n */\n getHiddenCardIds(): Set<string> {\n return new Set(this.hiddenCardIds);\n }\n\n /**\n * 获取当前筛选条件\n */\n getCurrentCriteria(): FilterCriteria | null {\n return this.currentCriteria;\n }\n\n /**\n * 匹配筛选条件\n */\n private matchCriteria(card: Card, criteria: FilterCriteria): boolean {\n // 关键词\n if (criteria.keyword) {\n const kw = criteria.keyword.toLowerCase();\n const titleMatch = card.title.toLowerCase().includes(kw);\n const descMatch = card.description?.toLowerCase().includes(kw) ?? false;\n if (!titleMatch && !descMatch) return false;\n }\n\n // 标签\n if (criteria.labelIds?.length) {\n const cardLabelIds = card.labels?.map(l => l.id) ?? [];\n if (!criteria.labelIds.some(id => cardLabelIds.includes(id))) return false;\n }\n\n // 成员\n if (criteria.assignees?.length) {\n if (!criteria.assignees.some(a => card.assignees?.includes(a))) return false;\n }\n\n // 优先级\n if (criteria.priorities?.length) {\n if (!card.priority || !criteria.priorities.includes(card.priority)) return false;\n }\n\n // 列\n if (criteria.columnIds?.length) {\n if (!criteria.columnIds.includes(card.columnId)) return false;\n }\n\n // 截止日期\n if (criteria.dueDateRange) {\n if (!card.dueDate) return false;\n const dueDate = new Date(card.dueDate).getTime();\n if (criteria.dueDateRange.start) {\n if (dueDate < new Date(criteria.dueDateRange.start).getTime()) return false;\n }\n if (criteria.dueDateRange.end) {\n if (dueDate > new Date(criteria.dueDateRange.end).getTime()) return false;\n }\n }\n\n // 自定义函数\n if (criteria.custom) {\n if (!criteria.custom(card)) return false;\n }\n\n return true;\n }\n\n /**\n * 销毁\n */\n destroy(): void {\n this.hiddenCardIds.clear();\n this.currentCriteria = null;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ import type { KanbanOptions, Column, Card, FilterCriteria, BoardData, Label } from '../types';
2
+ import { EventEmitter, type EventHandler } from './EventEmitter';
3
+ /**
4
+ * KanbanBoard - 看板视图库,支持拖拽卡片与列管理
5
+ */
6
+ export declare class KanbanBoard {
7
+ private container;
8
+ private options;
9
+ private destroyed;
10
+ readonly events: EventEmitter;
11
+ private columnManager;
12
+ private dragController;
13
+ private filterEngine;
14
+ private renderer;
15
+ private labels;
16
+ constructor(options: KanbanOptions);
17
+ private init;
18
+ /**
19
+ * 绑定内部事件
20
+ */
21
+ private bindInternalEvents;
22
+ /**
23
+ * 添加列
24
+ */
25
+ addColumn(partial: Partial<Column>): Column;
26
+ /**
27
+ * 移除列
28
+ */
29
+ removeColumn(id: string): Column | undefined;
30
+ /**
31
+ * 更新列
32
+ */
33
+ updateColumn(id: string, changes: Partial<Column>): Column | undefined;
34
+ /**
35
+ * 移动列
36
+ */
37
+ moveColumn(id: string, toIndex: number): void;
38
+ /**
39
+ * 折叠/展开列
40
+ */
41
+ toggleColumnCollapse(id: string): void;
42
+ /**
43
+ * 获取所有列
44
+ */
45
+ getColumns(): Column[];
46
+ /**
47
+ * 获取单列
48
+ */
49
+ getColumn(id: string): Column | undefined;
50
+ /**
51
+ * 添加卡片
52
+ */
53
+ addCard(columnId: string, partial: Partial<Card>): Card | undefined;
54
+ /**
55
+ * 移除卡片
56
+ */
57
+ removeCard(cardId: string): Card | undefined;
58
+ /**
59
+ * 更新卡片
60
+ */
61
+ updateCard(cardId: string, changes: Partial<Card>): Card | undefined;
62
+ /**
63
+ * 移动卡片
64
+ */
65
+ moveCard(cardId: string, toColumnId: string, toIndex: number): void;
66
+ /**
67
+ * 获取单张卡片
68
+ */
69
+ getCard(cardId: string): Card | undefined;
70
+ /**
71
+ * 获取所有卡片
72
+ */
73
+ getAllCards(): Card[];
74
+ /**
75
+ * 获取卡片总数
76
+ */
77
+ getCardCount(): number;
78
+ /**
79
+ * 筛选卡片
80
+ */
81
+ filter(criteria: FilterCriteria): void;
82
+ /**
83
+ * 搜索卡片
84
+ */
85
+ search(keyword: string): Card[];
86
+ /**
87
+ * 清除筛选
88
+ */
89
+ clearFilter(): void;
90
+ /**
91
+ * 导出看板数据
92
+ */
93
+ exportData(): BoardData;
94
+ /**
95
+ * 导入看板数据
96
+ */
97
+ importData(data: BoardData): void;
98
+ /**
99
+ * 监听事件
100
+ */
101
+ on(event: string, handler: EventHandler): () => void;
102
+ /**
103
+ * 监听一次性事件
104
+ */
105
+ once(event: string, handler: EventHandler): () => void;
106
+ /**
107
+ * 移除事件监听
108
+ */
109
+ off(event: string, handler: EventHandler): void;
110
+ /**
111
+ * 获取所有标签
112
+ */
113
+ getLabels(): Label[];
114
+ /**
115
+ * 添加标签
116
+ */
117
+ addLabel(label: Label): void;
118
+ /**
119
+ * 移除标签
120
+ */
121
+ removeLabel(id: string): void;
122
+ private renderTimer;
123
+ /**
124
+ * 延迟渲染(合并多次调用,等待浏览器拖拽操作完成)
125
+ */
126
+ private scheduleRender;
127
+ /**
128
+ * 重新渲染
129
+ */
130
+ render(): void;
131
+ /**
132
+ * 获取看板根元素
133
+ */
134
+ getBoardElement(): HTMLElement | null;
135
+ /**
136
+ * 获取配置
137
+ */
138
+ getOptions(): Readonly<KanbanOptions>;
139
+ /**
140
+ * 销毁实例
141
+ */
142
+ destroy(): void;
143
+ /**
144
+ * 是否已销毁
145
+ */
146
+ isDestroyed(): boolean;
147
+ }
148
+ /**
149
+ * 创建看板实例(工厂函数)
150
+ */
151
+ export declare function createKanbanBoard(options: KanbanOptions): KanbanBoard;
152
+ //# sourceMappingURL=KanbanBoard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KanbanBoard.d.ts","sourceRoot":"","sources":["../../src/core/KanbanBoard.ts"],"names":[],"mappings":"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"}