@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.
- package/README.md +37 -0
- package/dist/index.css +307 -0
- package/dist/index.js +1279 -0
- package/dist/index.js.map +1 -0
- package/dist/index.min.css +1 -0
- package/dist/index.min.js +1 -0
- package/es/core/ColumnManager.d.ts +99 -0
- package/es/core/ColumnManager.d.ts.map +1 -0
- package/es/core/ColumnManager.js +285 -0
- package/es/core/ColumnManager.js.map +1 -0
- package/es/core/DragController.d.ts +55 -0
- package/es/core/DragController.d.ts.map +1 -0
- package/es/core/DragController.js +225 -0
- package/es/core/DragController.js.map +1 -0
- package/es/core/EventEmitter.d.ts +35 -0
- package/es/core/EventEmitter.d.ts.map +1 -0
- package/es/core/EventEmitter.js +68 -0
- package/es/core/EventEmitter.js.map +1 -0
- package/es/core/FilterEngine.d.ts +45 -0
- package/es/core/FilterEngine.d.ts.map +1 -0
- package/es/core/FilterEngine.js +127 -0
- package/es/core/FilterEngine.js.map +1 -0
- package/es/core/KanbanBoard.d.ts +152 -0
- package/es/core/KanbanBoard.d.ts.map +1 -0
- package/es/core/KanbanBoard.js +332 -0
- package/es/core/KanbanBoard.js.map +1 -0
- package/es/core/Renderer.d.ts +59 -0
- package/es/core/Renderer.d.ts.map +1 -0
- package/es/core/Renderer.js +247 -0
- package/es/core/Renderer.js.map +1 -0
- package/es/core/index.d.ts +11 -0
- package/es/core/index.d.ts.map +1 -0
- package/es/core/index.js +17 -0
- package/es/index.d.ts +15 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +21 -0
- package/es/styles/kanban.css +306 -0
- package/es/types/index.d.ts +209 -0
- package/es/types/index.d.ts.map +1 -0
- package/es/types/index.js +10 -0
- package/es/utils/dom.d.ts +24 -0
- package/es/utils/dom.d.ts.map +1 -0
- package/es/utils/dom.js +37 -0
- package/es/utils/dom.js.map +1 -0
- package/es/utils/id.d.ts +9 -0
- package/es/utils/id.d.ts.map +1 -0
- package/es/utils/id.js +22 -0
- package/es/utils/id.js.map +1 -0
- package/es/utils/index.d.ts +25 -0
- package/es/utils/index.d.ts.map +1 -0
- package/es/utils/index.js +20 -0
- package/es/utils/index.js.map +1 -0
- package/es/version.d.ts +6 -0
- package/es/version.d.ts.map +1 -0
- package/es/version.js +15 -0
- package/es/version.js.map +1 -0
- package/esm/core/ColumnManager.d.ts +99 -0
- package/esm/core/ColumnManager.d.ts.map +1 -0
- package/esm/core/ColumnManager.js +285 -0
- package/esm/core/ColumnManager.js.map +1 -0
- package/esm/core/DragController.d.ts +55 -0
- package/esm/core/DragController.d.ts.map +1 -0
- package/esm/core/DragController.js +225 -0
- package/esm/core/DragController.js.map +1 -0
- package/esm/core/EventEmitter.d.ts +35 -0
- package/esm/core/EventEmitter.d.ts.map +1 -0
- package/esm/core/EventEmitter.js +68 -0
- package/esm/core/EventEmitter.js.map +1 -0
- package/esm/core/FilterEngine.d.ts +45 -0
- package/esm/core/FilterEngine.d.ts.map +1 -0
- package/esm/core/FilterEngine.js +127 -0
- package/esm/core/FilterEngine.js.map +1 -0
- package/esm/core/KanbanBoard.d.ts +152 -0
- package/esm/core/KanbanBoard.d.ts.map +1 -0
- package/esm/core/KanbanBoard.js +332 -0
- package/esm/core/KanbanBoard.js.map +1 -0
- package/esm/core/Renderer.d.ts +59 -0
- package/esm/core/Renderer.d.ts.map +1 -0
- package/esm/core/Renderer.js +247 -0
- package/esm/core/Renderer.js.map +1 -0
- package/esm/core/index.d.ts +11 -0
- package/esm/core/index.d.ts.map +1 -0
- package/esm/core/index.js +17 -0
- package/esm/index.d.ts +15 -0
- package/esm/index.d.ts.map +1 -0
- package/esm/index.js +21 -0
- package/esm/styles/kanban.less +339 -0
- package/esm/types/index.d.ts +209 -0
- package/esm/types/index.d.ts.map +1 -0
- package/esm/types/index.js +10 -0
- package/esm/utils/dom.d.ts +24 -0
- package/esm/utils/dom.d.ts.map +1 -0
- package/esm/utils/dom.js +37 -0
- package/esm/utils/dom.js.map +1 -0
- package/esm/utils/id.d.ts +9 -0
- package/esm/utils/id.d.ts.map +1 -0
- package/esm/utils/id.js +22 -0
- package/esm/utils/id.js.map +1 -0
- package/esm/utils/index.d.ts +25 -0
- package/esm/utils/index.d.ts.map +1 -0
- package/esm/utils/index.js +20 -0
- package/esm/utils/index.js.map +1 -0
- package/esm/version.d.ts +6 -0
- package/esm/version.d.ts.map +1 -0
- package/esm/version.js +15 -0
- package/esm/version.js.map +1 -0
- package/lib/core/ColumnManager.cjs +286 -0
- package/lib/core/ColumnManager.cjs.map +1 -0
- package/lib/core/ColumnManager.d.ts +99 -0
- package/lib/core/DragController.cjs +226 -0
- package/lib/core/DragController.cjs.map +1 -0
- package/lib/core/DragController.d.ts +55 -0
- package/lib/core/EventEmitter.cjs +69 -0
- package/lib/core/EventEmitter.cjs.map +1 -0
- package/lib/core/EventEmitter.d.ts +35 -0
- package/lib/core/FilterEngine.cjs +128 -0
- package/lib/core/FilterEngine.cjs.map +1 -0
- package/lib/core/FilterEngine.d.ts +45 -0
- package/lib/core/KanbanBoard.cjs +334 -0
- package/lib/core/KanbanBoard.cjs.map +1 -0
- package/lib/core/KanbanBoard.d.ts +152 -0
- package/lib/core/Renderer.cjs +248 -0
- package/lib/core/Renderer.cjs.map +1 -0
- package/lib/core/Renderer.d.ts +59 -0
- package/lib/core/index.cjs +24 -0
- package/lib/core/index.d.ts +11 -0
- package/lib/index.cjs +37 -0
- package/lib/index.d.ts +15 -0
- package/lib/package.json +3 -0
- package/lib/styles/kanban.css +306 -0
- package/lib/types/index.cjs +11 -0
- package/lib/types/index.d.ts +209 -0
- package/lib/utils/dom.cjs +42 -0
- package/lib/utils/dom.cjs.map +1 -0
- package/lib/utils/dom.d.ts +24 -0
- package/lib/utils/id.cjs +24 -0
- package/lib/utils/id.cjs.map +1 -0
- package/lib/utils/id.d.ts +9 -0
- package/lib/utils/index.cjs +28 -0
- package/lib/utils/index.cjs.map +1 -0
- package/lib/utils/index.d.ts +25 -0
- package/lib/version.cjs +16 -0
- package/lib/version.cjs.map +1 -0
- package/lib/version.d.ts +6 -0
- package/package.json +105 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DOM 工具函数
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* 创建 DOM 元素
|
|
6
|
+
*/
|
|
7
|
+
export declare function createElement<K extends keyof HTMLElementTagNameMap>(tag: K, className?: string, attributes?: Record<string, string>): HTMLElementTagNameMap[K];
|
|
8
|
+
/**
|
|
9
|
+
* 从选择器或元素获取 HTMLElement
|
|
10
|
+
*/
|
|
11
|
+
export declare function resolveElement(target: HTMLElement | string): HTMLElement | null;
|
|
12
|
+
/**
|
|
13
|
+
* 清空元素内容
|
|
14
|
+
*/
|
|
15
|
+
export declare function clearElement(el: HTMLElement): void;
|
|
16
|
+
/**
|
|
17
|
+
* 安全移除元素
|
|
18
|
+
*/
|
|
19
|
+
export declare function removeElement(el: HTMLElement | null): void;
|
|
20
|
+
/**
|
|
21
|
+
* 插入元素到指定位置
|
|
22
|
+
*/
|
|
23
|
+
export declare function insertAt(parent: HTMLElement, child: HTMLElement, index: number): void;
|
|
24
|
+
//# sourceMappingURL=dom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.d.ts","sourceRoot":"","sources":["../../src/utils/dom.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,MAAM,qBAAqB,EACjE,GAAG,EAAE,CAAC,EACN,SAAS,CAAC,EAAE,MAAM,EAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAClC,qBAAqB,CAAC,CAAC,CAAC,CAS1B;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAK/E;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,CAElD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,WAAW,GAAG,IAAI,GAAG,IAAI,CAE1D;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAOrF"}
|
package/esm/utils/dom.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
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/utils/dom.ts
|
|
11
|
+
function createElement(tag, className, attributes) {
|
|
12
|
+
const el = document.createElement(tag);
|
|
13
|
+
if (className) el.className = className;
|
|
14
|
+
if (attributes) Object.entries(attributes).forEach(([key, value]) => {
|
|
15
|
+
el.setAttribute(key, value);
|
|
16
|
+
});
|
|
17
|
+
return el;
|
|
18
|
+
}
|
|
19
|
+
function resolveElement(target) {
|
|
20
|
+
if (typeof target === "string") return document.querySelector(target);
|
|
21
|
+
return target;
|
|
22
|
+
}
|
|
23
|
+
function clearElement(el) {
|
|
24
|
+
el.innerHTML = "";
|
|
25
|
+
}
|
|
26
|
+
function removeElement(el) {
|
|
27
|
+
el?.parentNode?.removeChild(el);
|
|
28
|
+
}
|
|
29
|
+
function insertAt(parent, child, index) {
|
|
30
|
+
const ref = parent.children[index];
|
|
31
|
+
if (ref) parent.insertBefore(child, ref);
|
|
32
|
+
else parent.appendChild(child);
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { clearElement, createElement, insertAt, removeElement, resolveElement };
|
|
36
|
+
/*! End of @composy/kanban-core | Powered by @composy/builder */
|
|
37
|
+
//# sourceMappingURL=dom.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dom.js","names":[],"sources":["../../src/utils/dom.ts"],"sourcesContent":["/**\n * DOM 工具函数\n */\n\n/**\n * 创建 DOM 元素\n */\nexport function createElement<K extends keyof HTMLElementTagNameMap>(\n tag: K,\n className?: string,\n attributes?: Record<string, string>,\n): HTMLElementTagNameMap[K] {\n const el = document.createElement(tag);\n if (className) el.className = className;\n if (attributes) {\n Object.entries(attributes).forEach(([key, value]) => {\n el.setAttribute(key, value);\n });\n }\n return el;\n}\n\n/**\n * 从选择器或元素获取 HTMLElement\n */\nexport function resolveElement(target: HTMLElement | string): HTMLElement | null {\n if (typeof target === 'string') {\n return document.querySelector(target);\n }\n return target;\n}\n\n/**\n * 清空元素内容\n */\nexport function clearElement(el: HTMLElement): void {\n el.innerHTML = '';\n}\n\n/**\n * 安全移除元素\n */\nexport function removeElement(el: HTMLElement | null): void {\n el?.parentNode?.removeChild(el);\n}\n\n/**\n * 插入元素到指定位置\n */\nexport function insertAt(parent: HTMLElement, child: HTMLElement, index: number): void {\n const ref = parent.children[index] as HTMLElement | undefined;\n if (ref) {\n parent.insertBefore(child, ref);\n } else {\n parent.appendChild(child);\n }\n}\n"],"mappings":";;;;;;;;;;AAOO,SAAS,cACd,KACA,WACA,YAC0B;CAC1B,MAAM,KAAK,SAAS,cAAc,GAAG;CACrC,IAAI,WAAW,GAAG,YAAY;CAC9B,IAAI,YACF,OAAO,QAAQ,UAAU,CAAA,CAAE,SAAS,CAAC,KAAK,WAAW;EACnD,GAAG,aAAa,KAAK,KAAK;CAC5B,CAAC;CAEH,OAAO;AACT;AAKO,SAAS,eAAe,QAAkD;CAC/E,IAAI,OAAO,WAAW,UACpB,OAAO,SAAS,cAAc,MAAM;CAEtC,OAAO;AACT;AAKO,SAAS,aAAa,IAAuB;CAClD,GAAG,YAAY;AACjB;AAKO,SAAS,cAAc,IAA8B;CAC1D,IAAI,YAAY,YAAY,EAAE;AAChC;AAKO,SAAS,SAAS,QAAqB,OAAoB,OAAqB;CACrF,MAAM,MAAM,OAAO,SAAS;CAC5B,IAAI,KACF,OAAO,aAAa,OAAO,GAAG;MAE9B,OAAO,YAAY,KAAK;AAE5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/utils/id.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,SAAO,GAAG,MAAM,CAKhD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
|
package/esm/utils/id.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
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/utils/id.ts
|
|
11
|
+
let counter = 0;
|
|
12
|
+
function generateId(prefix = "kb") {
|
|
13
|
+
counter++;
|
|
14
|
+
return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).substring(2, 6)}_${counter}`;
|
|
15
|
+
}
|
|
16
|
+
function resetIdCounter() {
|
|
17
|
+
counter = 0;
|
|
18
|
+
}
|
|
19
|
+
//#endregion
|
|
20
|
+
export { generateId, resetIdCounter };
|
|
21
|
+
/*! End of @composy/kanban-core | Powered by @composy/builder */
|
|
22
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","names":[],"sources":["../../src/utils/id.ts"],"sourcesContent":["let counter = 0;\n\n/**\n * 生成唯一 ID\n */\nexport function generateId(prefix = 'kb'): string {\n counter++;\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 6);\n return `${prefix}_${timestamp}_${random}_${counter}`;\n}\n\n/**\n * 重置计数器(仅测试用)\n */\nexport function resetIdCounter(): void {\n counter = 0;\n}\n"],"mappings":";;;;;;;;;;AAAA,IAAI,UAAU;AAKP,SAAS,WAAW,SAAS,MAAc;CAChD;CAGA,OAAO,GAAG,OAAM,GAFE,KAAK,IAAI,CAAA,CAAE,SAAS,EAElB,EAAS,GADd,KAAK,OAAO,CAAA,CAAE,SAAS,EAAE,CAAA,CAAE,UAAU,GAAG,CACtB,EAAM,GAAI;AAC7C;AAKO,SAAS,iBAAuB;CACrC,UAAU;AACZ"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file index.ts
|
|
3
|
+
* @description index 模块
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Utility functions for @composy/kanban-core
|
|
7
|
+
*/
|
|
8
|
+
export { generateId, resetIdCounter } from './id';
|
|
9
|
+
export { createElement, resolveElement, clearElement, removeElement, insertAt } from './dom';
|
|
10
|
+
/**
|
|
11
|
+
* Get element from selector or element
|
|
12
|
+
* @deprecated Use resolveElement instead
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* getElement 函数
|
|
16
|
+
* @param target - 参数
|
|
17
|
+
* @returns 返回值
|
|
18
|
+
*/
|
|
19
|
+
/**
|
|
20
|
+
* getElement - get Element function
|
|
21
|
+
* @param target - 参数说明
|
|
22
|
+
* @returns 返回值说明
|
|
23
|
+
*/
|
|
24
|
+
export declare function getElement(target: HTMLElement | string): HTMLElement | null;
|
|
25
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAE7F;;;GAGG;AACH;;;;GAIG;AACH;;;;GAIG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,WAAW,GAAG,IAAI,CAK3E"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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
|
+
import { clearElement, createElement, insertAt, removeElement, resolveElement } from "./dom.js";
|
|
11
|
+
import { generateId, resetIdCounter } from "./id.js";
|
|
12
|
+
//#region src/utils/index.ts
|
|
13
|
+
function getElement(target) {
|
|
14
|
+
if (typeof target === "string") return document.querySelector(target);
|
|
15
|
+
return target;
|
|
16
|
+
}
|
|
17
|
+
//#endregion
|
|
18
|
+
export { clearElement, createElement, generateId, getElement, insertAt, removeElement, resetIdCounter, resolveElement };
|
|
19
|
+
/*! End of @composy/kanban-core | Powered by @composy/builder */
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../src/utils/index.ts"],"sourcesContent":["/**\n * @file index.ts\n * @description index 模块\n */\n\n/**\n * Utility functions for @composy/kanban-core\n */\n\nexport { generateId, resetIdCounter } from './id';\nexport { createElement, resolveElement, clearElement, removeElement, insertAt } from './dom';\n\n/**\n * Get element from selector or element\n * @deprecated Use resolveElement instead\n */\n/**\n * getElement 函数\n * @param target - 参数\n * @returns 返回值\n */\n/**\n * getElement - get Element function\n * @param target - 参数说明\n * @returns 返回值说明\n */\nexport function getElement(target: HTMLElement | string): HTMLElement | null {\n if (typeof target === 'string') {\n return document.querySelector(target);\n }\n return target;\n}\n"],"mappings":";;;;;;;;;;;;AA0BO,SAAS,WAAW,QAAkD;CAC3E,IAAI,OAAO,WAAW,UACpB,OAAO,SAAS,cAAc,MAAM;CAEtC,OAAO;AACT"}
|
package/esm/version.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC"}
|
package/esm/version.js
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
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/version.ts
|
|
11
|
+
const VERSION = "0.1.0";
|
|
12
|
+
//#endregion
|
|
13
|
+
export { VERSION };
|
|
14
|
+
/*! End of @composy/kanban-core | Powered by @composy/builder */
|
|
15
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","names":[],"sources":["../src/version.ts"],"sourcesContent":["/**\n * @file version.ts\n * @description version 模块\n */\n\nexport const VERSION = '0.1.0';\n"],"mappings":";;;;;;;;;;AAKO,MAAM,UAAU"}
|
|
@@ -0,0 +1,286 @@
|
|
|
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
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
11
|
+
const require_id = require("../utils/id.cjs");
|
|
12
|
+
//#region src/core/ColumnManager.ts
|
|
13
|
+
var ColumnManager = class {
|
|
14
|
+
constructor(events) {
|
|
15
|
+
this.columns = [];
|
|
16
|
+
this.events = events;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* 初始化列
|
|
20
|
+
*/
|
|
21
|
+
init(columns) {
|
|
22
|
+
this.columns = columns.map((col, index) => this.normalizeColumn(col, index));
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* 标准化列数据
|
|
26
|
+
*/
|
|
27
|
+
normalizeColumn(partial, index) {
|
|
28
|
+
return {
|
|
29
|
+
id: partial.id || require_id.generateId("col"),
|
|
30
|
+
title: partial.title || `Column ${index + 1}`,
|
|
31
|
+
cards: (partial.cards || []).map((card, cardIndex) => this.normalizeCard(card, partial.id || "", cardIndex)),
|
|
32
|
+
wipLimit: partial.wipLimit,
|
|
33
|
+
collapsed: partial.collapsed ?? false,
|
|
34
|
+
color: partial.color,
|
|
35
|
+
order: partial.order ?? index
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 标准化卡片数据
|
|
40
|
+
*/
|
|
41
|
+
normalizeCard(partial, columnId, index) {
|
|
42
|
+
return {
|
|
43
|
+
id: partial.id || require_id.generateId("card"),
|
|
44
|
+
title: partial.title || "",
|
|
45
|
+
description: partial.description,
|
|
46
|
+
labels: partial.labels || [],
|
|
47
|
+
assignees: partial.assignees || [],
|
|
48
|
+
dueDate: partial.dueDate,
|
|
49
|
+
priority: partial.priority,
|
|
50
|
+
order: partial.order ?? index,
|
|
51
|
+
columnId: partial.columnId || columnId,
|
|
52
|
+
data: partial.data,
|
|
53
|
+
createdAt: partial.createdAt || (/* @__PURE__ */ new Date()).toISOString(),
|
|
54
|
+
updatedAt: partial.updatedAt
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* 获取所有列
|
|
59
|
+
*/
|
|
60
|
+
getColumns() {
|
|
61
|
+
return [...this.columns].sort((a, b) => a.order - b.order);
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* 获取单列
|
|
65
|
+
*/
|
|
66
|
+
getColumn(id) {
|
|
67
|
+
return this.columns.find((c) => c.id === id);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* 添加列
|
|
71
|
+
*/
|
|
72
|
+
addColumn(partial) {
|
|
73
|
+
const column = this.normalizeColumn(partial, this.columns.length);
|
|
74
|
+
column.cards = column.cards.map((card) => ({
|
|
75
|
+
...card,
|
|
76
|
+
columnId: column.id
|
|
77
|
+
}));
|
|
78
|
+
this.columns.push(column);
|
|
79
|
+
this.events.emit("column:add", { column });
|
|
80
|
+
return column;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 移除列
|
|
84
|
+
*/
|
|
85
|
+
removeColumn(id) {
|
|
86
|
+
const index = this.columns.findIndex((c) => c.id === id);
|
|
87
|
+
if (index === -1) return void 0;
|
|
88
|
+
const [column] = this.columns.splice(index, 1);
|
|
89
|
+
this.reorderColumns();
|
|
90
|
+
this.events.emit("column:remove", { column });
|
|
91
|
+
return column;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* 更新列
|
|
95
|
+
*/
|
|
96
|
+
updateColumn(id, changes) {
|
|
97
|
+
const column = this.columns.find((c) => c.id === id);
|
|
98
|
+
if (!column) return void 0;
|
|
99
|
+
Object.assign(column, changes, { id });
|
|
100
|
+
this.events.emit("column:update", {
|
|
101
|
+
column,
|
|
102
|
+
changes
|
|
103
|
+
});
|
|
104
|
+
return column;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* 移动列
|
|
108
|
+
*/
|
|
109
|
+
moveColumn(id, toIndex) {
|
|
110
|
+
const fromIndex = this.columns.findIndex((c) => c.id === id);
|
|
111
|
+
if (fromIndex === -1) return;
|
|
112
|
+
const [column] = this.columns.splice(fromIndex, 1);
|
|
113
|
+
this.columns.splice(toIndex, 0, column);
|
|
114
|
+
this.reorderColumns();
|
|
115
|
+
this.events.emit("column:move", {
|
|
116
|
+
column,
|
|
117
|
+
fromIndex,
|
|
118
|
+
toIndex
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* 折叠/展开列
|
|
123
|
+
*/
|
|
124
|
+
toggleCollapse(id) {
|
|
125
|
+
const column = this.columns.find((c) => c.id === id);
|
|
126
|
+
if (!column) return;
|
|
127
|
+
column.collapsed = !column.collapsed;
|
|
128
|
+
this.events.emit("column:collapse", {
|
|
129
|
+
column,
|
|
130
|
+
collapsed: column.collapsed
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* 获取列中的卡片
|
|
135
|
+
*/
|
|
136
|
+
getCards(columnId) {
|
|
137
|
+
const column = this.columns.find((c) => c.id === columnId);
|
|
138
|
+
return column ? [...column.cards].sort((a, b) => a.order - b.order) : [];
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* 添加卡片到列
|
|
142
|
+
*/
|
|
143
|
+
addCard(columnId, partial) {
|
|
144
|
+
const column = this.columns.find((c) => c.id === columnId);
|
|
145
|
+
if (!column) return void 0;
|
|
146
|
+
if (column.wipLimit && column.cards.length >= column.wipLimit) {
|
|
147
|
+
this.events.emit("error", { error: /* @__PURE__ */ new Error(`Column "${column.title}" reached WIP limit (${column.wipLimit})`) });
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const card = this.normalizeCard({
|
|
151
|
+
...partial,
|
|
152
|
+
columnId
|
|
153
|
+
}, columnId, column.cards.length);
|
|
154
|
+
column.cards.push(card);
|
|
155
|
+
this.events.emit("card:add", {
|
|
156
|
+
card,
|
|
157
|
+
columnId
|
|
158
|
+
});
|
|
159
|
+
return card;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* 移除卡片
|
|
163
|
+
*/
|
|
164
|
+
removeCard(cardId) {
|
|
165
|
+
for (const column of this.columns) {
|
|
166
|
+
const index = column.cards.findIndex((c) => c.id === cardId);
|
|
167
|
+
if (index !== -1) {
|
|
168
|
+
const [card] = column.cards.splice(index, 1);
|
|
169
|
+
this.reorderCards(column);
|
|
170
|
+
this.events.emit("card:remove", {
|
|
171
|
+
card,
|
|
172
|
+
columnId: column.id
|
|
173
|
+
});
|
|
174
|
+
return card;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* 更新卡片
|
|
180
|
+
*/
|
|
181
|
+
updateCard(cardId, changes) {
|
|
182
|
+
for (const column of this.columns) {
|
|
183
|
+
const card = column.cards.find((c) => c.id === cardId);
|
|
184
|
+
if (card) {
|
|
185
|
+
Object.assign(card, changes, {
|
|
186
|
+
id: cardId,
|
|
187
|
+
columnId: column.id
|
|
188
|
+
});
|
|
189
|
+
card.updatedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
190
|
+
this.events.emit("card:update", {
|
|
191
|
+
card,
|
|
192
|
+
changes
|
|
193
|
+
});
|
|
194
|
+
return card;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 获取单张卡片
|
|
200
|
+
*/
|
|
201
|
+
getCard(cardId) {
|
|
202
|
+
for (const column of this.columns) {
|
|
203
|
+
const card = column.cards.find((c) => c.id === cardId);
|
|
204
|
+
if (card) return card;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* 移动卡片
|
|
209
|
+
*/
|
|
210
|
+
moveCard(cardId, toColumnId, toIndex) {
|
|
211
|
+
let fromColumn;
|
|
212
|
+
let cardIndex = -1;
|
|
213
|
+
for (const column of this.columns) {
|
|
214
|
+
const idx = column.cards.findIndex((c) => c.id === cardId);
|
|
215
|
+
if (idx !== -1) {
|
|
216
|
+
fromColumn = column;
|
|
217
|
+
cardIndex = idx;
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
if (!fromColumn || cardIndex === -1) return;
|
|
222
|
+
const toColumn = this.columns.find((c) => c.id === toColumnId);
|
|
223
|
+
if (!toColumn) return;
|
|
224
|
+
if (fromColumn.id !== toColumnId && toColumn.wipLimit && toColumn.cards.length >= toColumn.wipLimit) {
|
|
225
|
+
this.events.emit("error", { error: /* @__PURE__ */ new Error(`Column "${toColumn.title}" reached WIP limit (${toColumn.wipLimit})`) });
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
const [card] = fromColumn.cards.splice(cardIndex, 1);
|
|
229
|
+
card.columnId = toColumnId;
|
|
230
|
+
toColumn.cards.splice(toIndex, 0, card);
|
|
231
|
+
this.reorderCards(fromColumn);
|
|
232
|
+
this.reorderCards(toColumn);
|
|
233
|
+
this.events.emit("card:move", {
|
|
234
|
+
card,
|
|
235
|
+
fromColumnId: fromColumn.id,
|
|
236
|
+
toColumnId,
|
|
237
|
+
toIndex
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* 获取所有卡片
|
|
242
|
+
*/
|
|
243
|
+
getAllCards() {
|
|
244
|
+
const cards = [];
|
|
245
|
+
for (const column of this.columns) cards.push(...column.cards);
|
|
246
|
+
return cards;
|
|
247
|
+
}
|
|
248
|
+
/**
|
|
249
|
+
* 获取卡片总数
|
|
250
|
+
*/
|
|
251
|
+
getCardCount() {
|
|
252
|
+
return this.columns.reduce((sum, col) => sum + col.cards.length, 0);
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* 重新排序列
|
|
256
|
+
*/
|
|
257
|
+
reorderColumns() {
|
|
258
|
+
this.columns.forEach((col, index) => {
|
|
259
|
+
col.order = index;
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* 重新排序列中的卡片
|
|
264
|
+
*/
|
|
265
|
+
reorderCards(column) {
|
|
266
|
+
column.cards.forEach((card, index) => {
|
|
267
|
+
card.order = index;
|
|
268
|
+
});
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* 设置列数据(用于导入)
|
|
272
|
+
*/
|
|
273
|
+
setColumns(columns) {
|
|
274
|
+
this.columns = columns;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* 清空所有数据
|
|
278
|
+
*/
|
|
279
|
+
clear() {
|
|
280
|
+
this.columns = [];
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
//#endregion
|
|
284
|
+
exports.ColumnManager = ColumnManager;
|
|
285
|
+
/*! End of @composy/kanban-core | Powered by @composy/builder */
|
|
286
|
+
//# sourceMappingURL=ColumnManager.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ColumnManager.cjs","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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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import type { Column, Card } from '../types';
|
|
2
|
+
import { EventEmitter } from './EventEmitter';
|
|
3
|
+
/**
|
|
4
|
+
* 列管理器
|
|
5
|
+
*/
|
|
6
|
+
export declare class ColumnManager {
|
|
7
|
+
private columns;
|
|
8
|
+
private events;
|
|
9
|
+
constructor(events: EventEmitter);
|
|
10
|
+
/**
|
|
11
|
+
* 初始化列
|
|
12
|
+
*/
|
|
13
|
+
init(columns: Partial<Column>[]): void;
|
|
14
|
+
/**
|
|
15
|
+
* 标准化列数据
|
|
16
|
+
*/
|
|
17
|
+
private normalizeColumn;
|
|
18
|
+
/**
|
|
19
|
+
* 标准化卡片数据
|
|
20
|
+
*/
|
|
21
|
+
private normalizeCard;
|
|
22
|
+
/**
|
|
23
|
+
* 获取所有列
|
|
24
|
+
*/
|
|
25
|
+
getColumns(): Column[];
|
|
26
|
+
/**
|
|
27
|
+
* 获取单列
|
|
28
|
+
*/
|
|
29
|
+
getColumn(id: string): Column | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* 添加列
|
|
32
|
+
*/
|
|
33
|
+
addColumn(partial: Partial<Column>): Column;
|
|
34
|
+
/**
|
|
35
|
+
* 移除列
|
|
36
|
+
*/
|
|
37
|
+
removeColumn(id: string): Column | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* 更新列
|
|
40
|
+
*/
|
|
41
|
+
updateColumn(id: string, changes: Partial<Column>): Column | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* 移动列
|
|
44
|
+
*/
|
|
45
|
+
moveColumn(id: string, toIndex: number): void;
|
|
46
|
+
/**
|
|
47
|
+
* 折叠/展开列
|
|
48
|
+
*/
|
|
49
|
+
toggleCollapse(id: string): void;
|
|
50
|
+
/**
|
|
51
|
+
* 获取列中的卡片
|
|
52
|
+
*/
|
|
53
|
+
getCards(columnId: string): Card[];
|
|
54
|
+
/**
|
|
55
|
+
* 添加卡片到列
|
|
56
|
+
*/
|
|
57
|
+
addCard(columnId: string, partial: Partial<Card>): Card | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* 移除卡片
|
|
60
|
+
*/
|
|
61
|
+
removeCard(cardId: string): Card | undefined;
|
|
62
|
+
/**
|
|
63
|
+
* 更新卡片
|
|
64
|
+
*/
|
|
65
|
+
updateCard(cardId: string, changes: Partial<Card>): Card | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* 获取单张卡片
|
|
68
|
+
*/
|
|
69
|
+
getCard(cardId: string): Card | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* 移动卡片
|
|
72
|
+
*/
|
|
73
|
+
moveCard(cardId: string, toColumnId: string, toIndex: number): void;
|
|
74
|
+
/**
|
|
75
|
+
* 获取所有卡片
|
|
76
|
+
*/
|
|
77
|
+
getAllCards(): Card[];
|
|
78
|
+
/**
|
|
79
|
+
* 获取卡片总数
|
|
80
|
+
*/
|
|
81
|
+
getCardCount(): number;
|
|
82
|
+
/**
|
|
83
|
+
* 重新排序列
|
|
84
|
+
*/
|
|
85
|
+
private reorderColumns;
|
|
86
|
+
/**
|
|
87
|
+
* 重新排序列中的卡片
|
|
88
|
+
*/
|
|
89
|
+
private reorderCards;
|
|
90
|
+
/**
|
|
91
|
+
* 设置列数据(用于导入)
|
|
92
|
+
*/
|
|
93
|
+
setColumns(columns: Column[]): void;
|
|
94
|
+
/**
|
|
95
|
+
* 清空所有数据
|
|
96
|
+
*/
|
|
97
|
+
clear(): void;
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=ColumnManager.d.ts.map
|