@visactor/vtable-plugins 1.21.1 → 1.22.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/cjs/add-row-column.js +2 -2
- package/cjs/add-row-column.js.map +1 -1
- package/cjs/auto-fill/utils/date.js +1 -1
- package/cjs/auto-fill/utils/fill.js +1 -1
- package/cjs/column-series.js +1 -1
- package/cjs/column-series.js.map +1 -1
- package/cjs/context-menu.js +1 -1
- package/cjs/context-menu.js.map +1 -1
- package/cjs/contextmenu/handle-menu-helper.d.ts +1 -1
- package/cjs/contextmenu/handle-menu-helper.js +33 -14
- package/cjs/contextmenu/handle-menu-helper.js.map +1 -1
- package/cjs/contextmenu/menu-manager.js +1 -2
- package/cjs/contextmenu/styles.js +2 -1
- package/cjs/gantt-export-image.js +2 -2
- package/cjs/gantt-export-image.js.map +1 -1
- package/cjs/highlight-header-when-select-cell.js +1 -1
- package/cjs/highlight-header-when-select-cell.js.map +1 -1
- package/cjs/index.d.ts +1 -0
- package/cjs/index.js +4 -4
- package/cjs/index.js.map +1 -1
- package/cjs/master-detail-plugin/checkbox.d.ts +5 -0
- package/cjs/master-detail-plugin/checkbox.js +105 -0
- package/cjs/master-detail-plugin/checkbox.js.map +1 -0
- package/cjs/master-detail-plugin/config.d.ts +17 -0
- package/cjs/master-detail-plugin/config.js +113 -0
- package/cjs/master-detail-plugin/config.js.map +1 -0
- package/cjs/master-detail-plugin/core.d.ts +50 -0
- package/cjs/master-detail-plugin/core.js +310 -0
- package/cjs/master-detail-plugin/core.js.map +1 -0
- package/cjs/master-detail-plugin/events.d.ts +59 -0
- package/cjs/master-detail-plugin/events.js +265 -0
- package/cjs/master-detail-plugin/events.js.map +1 -0
- package/cjs/master-detail-plugin/index.d.ts +4 -0
- package/cjs/master-detail-plugin/index.js +15 -0
- package/cjs/master-detail-plugin/index.js.map +1 -0
- package/cjs/master-detail-plugin/subtable.d.ts +39 -0
- package/cjs/master-detail-plugin/subtable.js +457 -0
- package/cjs/master-detail-plugin/subtable.js.map +1 -0
- package/cjs/master-detail-plugin/table-api-extensions.d.ts +59 -0
- package/cjs/master-detail-plugin/table-api-extensions.js +462 -0
- package/cjs/master-detail-plugin/table-api-extensions.js.map +1 -0
- package/cjs/master-detail-plugin/types.d.ts +61 -0
- package/cjs/master-detail-plugin/types.js +20 -0
- package/cjs/master-detail-plugin/types.js.map +1 -0
- package/cjs/master-detail-plugin/utils.d.ts +8 -0
- package/cjs/master-detail-plugin/utils.js +62 -0
- package/cjs/master-detail-plugin/utils.js.map +1 -0
- package/cjs/master-detail-plugin.d.ts +1 -0
- package/cjs/master-detail-plugin.js +15 -0
- package/cjs/master-detail-plugin.js.map +1 -0
- package/cjs/paste-add-row-column.js +2 -2
- package/cjs/paste-add-row-column.js.map +1 -1
- package/cjs/row-series.js +1 -2
- package/cjs/table-carousel-animation.js +2 -1
- package/cjs/table-export/csv/index.js +1 -1
- package/cjs/table-export/util/color.js +2 -1
- package/cjs/table-export/util/download.js +1 -1
- package/cjs/table-export/util/encode.js +1 -1
- package/cjs/table-export/util/indent.js +1 -1
- package/cjs/table-export/util/pagination.js +1 -1
- package/cjs/table-export/util/promise.js +1 -1
- package/cjs/table-export/util/type.js +1 -1
- package/cjs/table-series-number.d.ts +3 -0
- package/cjs/table-series-number.js +18 -3
- package/cjs/table-series-number.js.map +1 -1
- package/dist/vtable-plugins.js +2918 -254
- package/dist/vtable-plugins.min.js +3 -3
- package/es/add-row-column.js +2 -2
- package/es/add-row-column.js.map +1 -1
- package/es/auto-fill/utils/date.js +1 -1
- package/es/auto-fill/utils/fill.js +1 -1
- package/es/column-series.js +1 -1
- package/es/column-series.js.map +1 -1
- package/es/context-menu.js +1 -1
- package/es/context-menu.js.map +1 -1
- package/es/contextmenu/handle-menu-helper.d.ts +1 -1
- package/es/contextmenu/handle-menu-helper.js +33 -14
- package/es/contextmenu/handle-menu-helper.js.map +1 -1
- package/es/contextmenu/menu-manager.js +1 -2
- package/es/contextmenu/styles.js +2 -1
- package/es/gantt-export-image.js +3 -1
- package/es/gantt-export-image.js.map +1 -1
- package/es/highlight-header-when-select-cell.js +1 -1
- package/es/highlight-header-when-select-cell.js.map +1 -1
- package/es/index.d.ts +1 -0
- package/es/index.js +2 -0
- package/es/index.js.map +1 -1
- package/es/master-detail-plugin/checkbox.d.ts +5 -0
- package/es/master-detail-plugin/checkbox.js +94 -0
- package/es/master-detail-plugin/checkbox.js.map +1 -0
- package/es/master-detail-plugin/config.d.ts +17 -0
- package/es/master-detail-plugin/config.js +80 -0
- package/es/master-detail-plugin/config.js.map +1 -0
- package/es/master-detail-plugin/core.d.ts +50 -0
- package/es/master-detail-plugin/core.js +285 -0
- package/es/master-detail-plugin/core.js.map +1 -0
- package/es/master-detail-plugin/events.d.ts +59 -0
- package/es/master-detail-plugin/events.js +232 -0
- package/es/master-detail-plugin/events.js.map +1 -0
- package/es/master-detail-plugin/index.d.ts +4 -0
- package/es/master-detail-plugin/index.js +4 -0
- package/es/master-detail-plugin/index.js.map +1 -0
- package/es/master-detail-plugin/subtable.d.ts +39 -0
- package/es/master-detail-plugin/subtable.js +426 -0
- package/es/master-detail-plugin/subtable.js.map +1 -0
- package/es/master-detail-plugin/table-api-extensions.d.ts +59 -0
- package/es/master-detail-plugin/table-api-extensions.js +445 -0
- package/es/master-detail-plugin/table-api-extensions.js.map +1 -0
- package/es/master-detail-plugin/types.d.ts +61 -0
- package/es/master-detail-plugin/types.js +12 -0
- package/es/master-detail-plugin/types.js.map +1 -0
- package/es/master-detail-plugin/utils.d.ts +8 -0
- package/es/master-detail-plugin/utils.js +52 -0
- package/es/master-detail-plugin/utils.js.map +1 -0
- package/es/master-detail-plugin.d.ts +1 -0
- package/es/master-detail-plugin.js +2 -0
- package/es/master-detail-plugin.js.map +1 -0
- package/es/paste-add-row-column.js +2 -2
- package/es/paste-add-row-column.js.map +1 -1
- package/es/row-series.js +1 -2
- package/es/table-carousel-animation.js +2 -1
- package/es/table-export/csv/index.js +1 -1
- package/es/table-export/util/color.js +2 -1
- package/es/table-export/util/download.js +1 -1
- package/es/table-export/util/encode.js +1 -1
- package/es/table-export/util/indent.js +1 -1
- package/es/table-export/util/pagination.js +1 -1
- package/es/table-export/util/promise.js +1 -1
- package/es/table-export/util/type.js +1 -1
- package/es/table-series-number.d.ts +3 -0
- package/es/table-series-number.js +17 -3
- package/es/table-series-number.js.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/gantt-export-image.ts"],"names":[],"mappings":"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","file":"gantt-export-image.js","sourcesContent":["/**\r\n * 这个文件提供了甘特图导出功能,但使用了懒加载方式避免强制依赖\r\n * 只有在实际使用时才会尝试加载 @visactor/vtable-gantt\r\n */\r\n\r\n// 使用类型声明而不是直接导入,避免静态依赖\r\ntype Gantt = any;\r\ninterface IGanttPlugin {\r\n id: string;\r\n name: string;\r\n run: (...args: any[]) => void;\r\n release?: () => void;\r\n}\r\n\r\n// 甘特图导出配置项接口\r\nexport interface ExportOptions {\r\n fileName?: string;\r\n type?: 'png' | 'jpeg';\r\n quality?: number;\r\n backgroundColor?: string;\r\n scale?: number;\r\n download?: boolean;\r\n}\r\n\r\n// 检查依赖是否可用\r\nconst checkGanttDependency = () => {\r\n try {\r\n // 不实际导入,只检查是否可用\r\n require.resolve('@visactor/vtable-gantt');\r\n return true;\r\n } catch (e) {\r\n console.warn(\r\n '警告: 使用 ExportGanttPlugin 需要安装 @visactor/vtable-gantt 依赖。\\n' +\r\n '请执行: npm install @visactor/vtable-gantt\\n' +\r\n '更多信息请参考文档: https://visactor.io/vtable'\r\n );\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * 甘特图导出插件\r\n * @description 提供完整的甘特图导出功能,支持高分辨率输出和精准布局保留\r\n */\r\nexport class ExportGanttPlugin implements IGanttPlugin {\r\n id: string = `gantt-export-helper`;\r\n name = 'Gantt Export Helper';\r\n private _gantt: Gantt | null = null;\r\n\r\n constructor() {\r\n // 构造时提前检查依赖可用性,以便给开发者更早的反馈\r\n checkGanttDependency();\r\n }\r\n\r\n // run 方法,在插件初始化时由 PluginManager调用\r\n run(...args: any[]): void {\r\n const ganttInstance = args[0] as Gantt;\r\n if (!ganttInstance) {\r\n console.error('ExportGanttPlugin: Gantt instance not provided to run method.');\r\n return;\r\n }\r\n this._gantt = ganttInstance;\r\n }\r\n /**\r\n * 执行甘特图导出操作\r\n * @async\r\n * @param {ExportOptions} [options={}] 导出配置选项\r\n * @returns {Promise<string | undefined>} 返回Base64格式的图片数据,或在未初始化时返回 undefined\r\n * @throws {Error} 导出过程中发生错误时抛出异常\r\n */\r\n async exportToImage(options: ExportOptions = {}): Promise<string | undefined> {\r\n // 初始检查依赖是否存在\r\n if (!checkGanttDependency()) {\r\n return undefined;\r\n }\r\n\r\n if (!this._gantt) {\r\n // 保留这个 error\r\n console.error('ExportGanttPlugin: Gantt instance not available.');\r\n return undefined;\r\n }\r\n\r\n const {\r\n fileName = 'gantt-export',\r\n type = 'png',\r\n quality = 1,\r\n backgroundColor = '#ffffff',\r\n scale = window.devicePixelRatio || 1,\r\n download = true // 默认执行下载\r\n } = options;\r\n\r\n try {\r\n const { tempContainer, clonedGantt } = await this.createFullSizeContainer(scale);\r\n\r\n try {\r\n await new Promise(resolve => requestAnimationFrame(resolve));\r\n\r\n const totalWidth =\r\n (clonedGantt.taskListTableInstance.getAllColsWidth() + clonedGantt.getAllDateColsWidth()) * scale;\r\n const totalHeight = clonedGantt.getAllRowsHeight() * scale;\r\n\r\n const exportCanvas = document.createElement('canvas');\r\n exportCanvas.width = totalWidth;\r\n exportCanvas.height = totalHeight;\r\n const ctx = exportCanvas.getContext('2d')!;\r\n\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(0, 0, totalWidth, totalHeight);\r\n\r\n if (clonedGantt.taskListTableInstance?.canvas) {\r\n ctx.drawImage(\r\n clonedGantt.taskListTableInstance.canvas,\r\n 0,\r\n 0,\r\n clonedGantt.taskListTableInstance.getAllColsWidth() * scale,\r\n totalHeight\r\n );\r\n }\r\n\r\n const splitLineWidth = 3 * scale;\r\n const splitLineX = clonedGantt.taskListTableInstance.getAllColsWidth() * scale;\r\n ctx.fillStyle = 'rgb(225, 228, 232)';\r\n ctx.fillRect(splitLineX - splitLineWidth / 2, 0, splitLineWidth, totalHeight);\r\n\r\n const sourceX = 4 * scale;\r\n const sourceWidth = clonedGantt.canvas.width - sourceX;\r\n\r\n if (clonedGantt.canvas) {\r\n ctx.drawImage(\r\n clonedGantt.canvas,\r\n sourceX,\r\n 0,\r\n sourceWidth,\r\n clonedGantt.canvas.height,\r\n (clonedGantt.taskListTableInstance.getAllColsWidth() + 1.5) * scale,\r\n 0,\r\n (clonedGantt.getAllDateColsWidth() - 1.5) * scale,\r\n totalHeight\r\n );\r\n }\r\n\r\n return this.finalizeExport(exportCanvas, fileName, type, quality, download);\r\n } finally {\r\n tempContainer.remove();\r\n // 确保克隆的甘特图实例被释放\r\n clonedGantt.release();\r\n }\r\n } catch (error) {\r\n console.error('[Gantt Export Plugin] Export failed:', error);\r\n throw new Error(`甘特图导出失败: ${error instanceof Error ? error.message : '未知错误'}`);\r\n }\r\n }\r\n\r\n /**\r\n * 获取甘特图的 Base64 图片数据,不触发下载\r\n * @async\r\n * @param {Omit<ExportOptions, 'download'>} [options={}] 导出配置选项(不包含 download 参数)\r\n * @returns {Promise<string | undefined>} 返回 Base64 格式的图片数据,或在未初始化时返回 undefined\r\n * @throws {Error} 导出过程中发生错误时抛出异常\r\n */\r\n async exportToBase64(options: Omit<ExportOptions, 'download'> = {}): Promise<string | undefined> {\r\n // 调用 exportToImage 方法,但设置 download 为 false\r\n return this.exportToImage({\r\n ...options,\r\n download: false\r\n });\r\n }\r\n\r\n private async createFullSizeContainer(scale: number) {\r\n if (!this._gantt) {\r\n // 保留这个 error\r\n throw new Error('ExportGanttPlugin: Gantt instance not available to create container.');\r\n }\r\n\r\n const tempContainer = document.createElement('div');\r\n tempContainer.style.position = 'fixed';\r\n tempContainer.style.left = '-9999px';\r\n tempContainer.style.overflow = 'hidden';\r\n tempContainer.style.width = `${window.innerWidth + 100}px`;\r\n tempContainer.style.height = `${window.innerHeight + 100}px`;\r\n document.body.appendChild(tempContainer);\r\n\r\n const clonedContainer = document.createElement('div');\r\n\r\n const totalWidth = this._gantt.taskListTableInstance.getAllColsWidth() + this._gantt.getAllDateColsWidth();\r\n const totalHeight = this._gantt.getAllRowsHeight();\r\n\r\n clonedContainer.style.width = `${totalWidth}px`;\r\n clonedContainer.style.height = `${totalHeight}px`;\r\n tempContainer.appendChild(clonedContainer);\r\n\r\n try {\r\n // 动态导入甘特图组件\r\n let GanttClass;\r\n try {\r\n const module = await import('@visactor/vtable-gantt');\r\n GanttClass = module.Gantt;\r\n if (!GanttClass) {\r\n throw new Error('Gantt class not found in @visactor/vtable-gantt');\r\n }\r\n } catch (err) {\r\n console.error('无法加载甘特图组件:', err);\r\n throw new Error(\r\n '导出甘特图需要安装并正确加载 @visactor/vtable-gantt 依赖\\n' + '请执行: npm install @visactor/vtable-gantt'\r\n );\r\n }\r\n\r\n const clonedGantt = new GanttClass(clonedContainer, {\r\n ...this._gantt.options,\r\n records: this._gantt.records,\r\n taskListTable: {\r\n ...this._gantt.options.taskListTable,\r\n tableWidth: undefined as unknown as number,\r\n minTableWidth: undefined as unknown as number,\r\n maxTableWidth: undefined as unknown as number\r\n },\r\n plugins: []\r\n });\r\n\r\n clonedGantt.setPixelRatio(scale);\r\n\r\n // 禁用裁剪\r\n if ((clonedGantt as any).scenegraph?.ganttGroup) {\r\n (clonedGantt as any).scenegraph.ganttGroup.setAttribute('clip', false);\r\n }\r\n if ((clonedGantt.taskListTableInstance as any)?.scenegraph?.tableGroup) {\r\n (clonedGantt.taskListTableInstance as any).scenegraph.tableGroup.setAttribute('clip', false);\r\n }\r\n\r\n clonedGantt.scenegraph.stage.render();\r\n\r\n return { tempContainer, clonedGantt };\r\n } catch (err) {\r\n // 清理创建的DOM元素\r\n if (tempContainer && tempContainer.parentNode) {\r\n tempContainer.remove();\r\n }\r\n console.error('无法导入甘特图组件,请确保已安装 @visactor/vtable-gantt 依赖', err);\r\n throw new Error('导出甘特图需要安装 @visactor/vtable-gantt 依赖');\r\n }\r\n }\r\n private finalizeExport(\r\n canvas: HTMLCanvasElement,\r\n fileName: string,\r\n type: string,\r\n quality: number,\r\n download: boolean = true\r\n ): string {\r\n const base64 = canvas.toDataURL(`image/${type}`, quality);\r\n\r\n // 如果需要下载,则创建下载链接\r\n if (download) {\r\n const link = document.createElement('a');\r\n link.download = `${fileName}.${type}`;\r\n link.href = base64;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n\r\n return base64;\r\n }\r\n\r\n release(): void {\r\n this._gantt = null;\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/gantt-export-image.ts"],"names":[],"mappings":"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","file":"gantt-export-image.js","sourcesContent":["/**\r\n * 这个文件提供了甘特图导出功能,但使用了懒加载方式避免强制依赖\r\n * 只有在实际使用时才会尝试加载 @visactor/vtable-gantt\r\n */\r\nimport { vglobal } from '@visactor/vtable/es/vrender';\r\n// 使用类型声明而不是直接导入,避免静态依赖\r\ntype Gantt = any;\r\ninterface IGanttPlugin {\r\n id: string;\r\n name: string;\r\n run: (...args: any[]) => void;\r\n release?: () => void;\r\n}\r\n\r\n// 甘特图导出配置项接口\r\nexport interface ExportOptions {\r\n fileName?: string;\r\n type?: 'png' | 'jpeg';\r\n quality?: number;\r\n backgroundColor?: string;\r\n scale?: number;\r\n download?: boolean;\r\n}\r\n\r\n// 检查依赖是否可用\r\nconst checkGanttDependency = () => {\r\n try {\r\n // 不实际导入,只检查是否可用\r\n require.resolve('@visactor/vtable-gantt');\r\n return true;\r\n } catch (e) {\r\n console.warn(\r\n '警告: 使用 ExportGanttPlugin 需要安装 @visactor/vtable-gantt 依赖。\\n' +\r\n '请执行: npm install @visactor/vtable-gantt\\n' +\r\n '更多信息请参考文档: https://visactor.io/vtable'\r\n );\r\n return false;\r\n }\r\n};\r\n\r\n/**\r\n * 甘特图导出插件\r\n * @description 提供完整的甘特图导出功能,支持高分辨率输出和精准布局保留\r\n */\r\nexport class ExportGanttPlugin implements IGanttPlugin {\r\n id: string = `gantt-export-helper`;\r\n name = 'Gantt Export Helper';\r\n private _gantt: Gantt | null = null;\r\n\r\n constructor() {\r\n // 构造时提前检查依赖可用性,以便给开发者更早的反馈\r\n checkGanttDependency();\r\n }\r\n\r\n // run 方法,在插件初始化时由 PluginManager调用\r\n run(...args: any[]): void {\r\n const ganttInstance = args[0] as Gantt;\r\n if (!ganttInstance) {\r\n console.error('ExportGanttPlugin: Gantt instance not provided to run method.');\r\n return;\r\n }\r\n this._gantt = ganttInstance;\r\n }\r\n /**\r\n * 执行甘特图导出操作\r\n * @async\r\n * @param {ExportOptions} [options={}] 导出配置选项\r\n * @returns {Promise<string | undefined>} 返回Base64格式的图片数据,或在未初始化时返回 undefined\r\n * @throws {Error} 导出过程中发生错误时抛出异常\r\n */\r\n async exportToImage(options: ExportOptions = {}): Promise<string | undefined> {\r\n // 初始检查依赖是否存在\r\n if (!checkGanttDependency()) {\r\n return undefined;\r\n }\r\n\r\n if (!this._gantt) {\r\n // 保留这个 error\r\n console.error('ExportGanttPlugin: Gantt instance not available.');\r\n return undefined;\r\n }\r\n\r\n const {\r\n fileName = 'gantt-export',\r\n type = 'png',\r\n quality = 1,\r\n backgroundColor = '#ffffff',\r\n scale = window.devicePixelRatio || 1,\r\n download = true // 默认执行下载\r\n } = options;\r\n\r\n try {\r\n const { tempContainer, clonedGantt } = await this.createFullSizeContainer(scale);\r\n\r\n try {\r\n await new Promise(resolve => vglobal.getRequestAnimationFrame()(resolve));\r\n\r\n const totalWidth =\r\n (clonedGantt.taskListTableInstance.getAllColsWidth() + clonedGantt.getAllDateColsWidth()) * scale;\r\n const totalHeight = clonedGantt.getAllRowsHeight() * scale;\r\n\r\n const exportCanvas = document.createElement('canvas');\r\n exportCanvas.width = totalWidth;\r\n exportCanvas.height = totalHeight;\r\n const ctx = exportCanvas.getContext('2d')!;\r\n\r\n ctx.fillStyle = backgroundColor;\r\n ctx.fillRect(0, 0, totalWidth, totalHeight);\r\n\r\n if (clonedGantt.taskListTableInstance?.canvas) {\r\n ctx.drawImage(\r\n clonedGantt.taskListTableInstance.canvas,\r\n 0,\r\n 0,\r\n clonedGantt.taskListTableInstance.getAllColsWidth() * scale,\r\n totalHeight\r\n );\r\n }\r\n\r\n const splitLineWidth = 3 * scale;\r\n const splitLineX = clonedGantt.taskListTableInstance.getAllColsWidth() * scale;\r\n ctx.fillStyle = 'rgb(225, 228, 232)';\r\n ctx.fillRect(splitLineX - splitLineWidth / 2, 0, splitLineWidth, totalHeight);\r\n\r\n const sourceX = 4 * scale;\r\n const sourceWidth = clonedGantt.canvas.width - sourceX;\r\n\r\n if (clonedGantt.canvas) {\r\n ctx.drawImage(\r\n clonedGantt.canvas,\r\n sourceX,\r\n 0,\r\n sourceWidth,\r\n clonedGantt.canvas.height,\r\n (clonedGantt.taskListTableInstance.getAllColsWidth() + 1.5) * scale,\r\n 0,\r\n (clonedGantt.getAllDateColsWidth() - 1.5) * scale,\r\n totalHeight\r\n );\r\n }\r\n\r\n return this.finalizeExport(exportCanvas, fileName, type, quality, download);\r\n } finally {\r\n tempContainer.remove();\r\n // 确保克隆的甘特图实例被释放\r\n clonedGantt.release();\r\n }\r\n } catch (error) {\r\n console.error('[Gantt Export Plugin] Export failed:', error);\r\n throw new Error(`甘特图导出失败: ${error instanceof Error ? error.message : '未知错误'}`);\r\n }\r\n }\r\n\r\n /**\r\n * 获取甘特图的 Base64 图片数据,不触发下载\r\n * @async\r\n * @param {Omit<ExportOptions, 'download'>} [options={}] 导出配置选项(不包含 download 参数)\r\n * @returns {Promise<string | undefined>} 返回 Base64 格式的图片数据,或在未初始化时返回 undefined\r\n * @throws {Error} 导出过程中发生错误时抛出异常\r\n */\r\n async exportToBase64(options: Omit<ExportOptions, 'download'> = {}): Promise<string | undefined> {\r\n // 调用 exportToImage 方法,但设置 download 为 false\r\n return this.exportToImage({\r\n ...options,\r\n download: false\r\n });\r\n }\r\n\r\n private async createFullSizeContainer(scale: number) {\r\n if (!this._gantt) {\r\n // 保留这个 error\r\n throw new Error('ExportGanttPlugin: Gantt instance not available to create container.');\r\n }\r\n\r\n const tempContainer = document.createElement('div');\r\n tempContainer.style.position = 'fixed';\r\n tempContainer.style.left = '-9999px';\r\n tempContainer.style.overflow = 'hidden';\r\n tempContainer.style.width = `${window.innerWidth + 100}px`;\r\n tempContainer.style.height = `${window.innerHeight + 100}px`;\r\n document.body.appendChild(tempContainer);\r\n\r\n const clonedContainer = document.createElement('div');\r\n\r\n const totalWidth = this._gantt.taskListTableInstance.getAllColsWidth() + this._gantt.getAllDateColsWidth();\r\n const totalHeight = this._gantt.getAllRowsHeight();\r\n\r\n clonedContainer.style.width = `${totalWidth}px`;\r\n clonedContainer.style.height = `${totalHeight}px`;\r\n tempContainer.appendChild(clonedContainer);\r\n\r\n try {\r\n // 动态导入甘特图组件\r\n let GanttClass;\r\n try {\r\n const module = await import('@visactor/vtable-gantt');\r\n GanttClass = module.Gantt;\r\n if (!GanttClass) {\r\n throw new Error('Gantt class not found in @visactor/vtable-gantt');\r\n }\r\n } catch (err) {\r\n console.error('无法加载甘特图组件:', err);\r\n throw new Error(\r\n '导出甘特图需要安装并正确加载 @visactor/vtable-gantt 依赖\\n' + '请执行: npm install @visactor/vtable-gantt'\r\n );\r\n }\r\n\r\n const clonedGantt = new GanttClass(clonedContainer, {\r\n ...this._gantt.options,\r\n records: this._gantt.records,\r\n taskListTable: {\r\n ...this._gantt.options.taskListTable,\r\n tableWidth: undefined as unknown as number,\r\n minTableWidth: undefined as unknown as number,\r\n maxTableWidth: undefined as unknown as number\r\n },\r\n plugins: []\r\n });\r\n\r\n clonedGantt.setPixelRatio(scale);\r\n\r\n // 禁用裁剪\r\n if ((clonedGantt as any).scenegraph?.ganttGroup) {\r\n (clonedGantt as any).scenegraph.ganttGroup.setAttribute('clip', false);\r\n }\r\n if ((clonedGantt.taskListTableInstance as any)?.scenegraph?.tableGroup) {\r\n (clonedGantt.taskListTableInstance as any).scenegraph.tableGroup.setAttribute('clip', false);\r\n }\r\n\r\n clonedGantt.scenegraph.stage.render();\r\n\r\n return { tempContainer, clonedGantt };\r\n } catch (err) {\r\n // 清理创建的DOM元素\r\n if (tempContainer && tempContainer.parentNode) {\r\n tempContainer.remove();\r\n }\r\n console.error('无法导入甘特图组件,请确保已安装 @visactor/vtable-gantt 依赖', err);\r\n throw new Error('导出甘特图需要安装 @visactor/vtable-gantt 依赖');\r\n }\r\n }\r\n private finalizeExport(\r\n canvas: HTMLCanvasElement,\r\n fileName: string,\r\n type: string,\r\n quality: number,\r\n download: boolean = true\r\n ): string {\r\n const base64 = canvas.toDataURL(`image/${type}`, quality);\r\n\r\n // 如果需要下载,则创建下载链接\r\n if (download) {\r\n const link = document.createElement('a');\r\n link.download = `${fileName}.${type}`;\r\n link.href = base64;\r\n document.body.appendChild(link);\r\n link.click();\r\n document.body.removeChild(link);\r\n }\r\n\r\n return base64;\r\n }\r\n\r\n release(): void {\r\n this._gantt = null;\r\n }\r\n}\r\n"]}
|
|
@@ -11,7 +11,7 @@ class HighlightHeaderWhenSelectCellPlugin {
|
|
|
11
11
|
var _a;
|
|
12
12
|
this.id = "highlight-header-when-select-cell", this.name = "Highlight Header When Select Cell",
|
|
13
13
|
this.runTime = [ vtable_1.TABLE_EVENT_TYPE.INITIALIZED, vtable_1.TABLE_EVENT_TYPE.SELECTED_CLEAR, vtable_1.TABLE_EVENT_TYPE.SELECTED_CELL, vtable_1.TABLE_EVENT_TYPE.MOUSEMOVE_TABLE ],
|
|
14
|
-
this.colHeaderRanges = [], this.rowHeaderRanges = [], this.id = null !== (_a = pluginOptions.id) && void 0 !== _a ? _a : this.id,
|
|
14
|
+
this.colHeaderRanges = [], this.rowHeaderRanges = [], this.id = null !== (_a = null == pluginOptions ? void 0 : pluginOptions.id) && void 0 !== _a ? _a : this.id,
|
|
15
15
|
this.pluginOptions = pluginOptions;
|
|
16
16
|
}
|
|
17
17
|
run(...args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/highlight-header-when-select-cell.ts"],"names":[],"mappings":"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","file":"highlight-header-when-select-cell.js","sourcesContent":["import type { CellRange } from '@visactor/vtable/es/ts-types';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { BaseTableAPI, pluginsDefinition } from '@visactor/vtable';\nexport interface IHighlightHeaderWhenSelectCellPluginOptions {\n id?: string;\n rowHighlight?: boolean;\n colHighlight?: boolean;\n colHighlightBGColor?: string;\n colHighlightColor?: string;\n rowHighlightBGColor?: string;\n rowHighlightColor?: string;\n}\n\nexport class HighlightHeaderWhenSelectCellPlugin implements pluginsDefinition.IVTablePlugin {\n id = `highlight-header-when-select-cell`;\n name = 'Highlight Header When Select Cell';\n runTime = [\n TABLE_EVENT_TYPE.INITIALIZED,\n TABLE_EVENT_TYPE.SELECTED_CLEAR,\n TABLE_EVENT_TYPE.SELECTED_CELL,\n TABLE_EVENT_TYPE.MOUSEMOVE_TABLE\n ];\n table: BaseTableAPI;\n pluginOptions: IHighlightHeaderWhenSelectCellPluginOptions;\n colHeaderRanges: CellRange[] = [];\n rowHeaderRanges: CellRange[] = [];\n constructor(pluginOptions: IHighlightHeaderWhenSelectCellPluginOptions) {\n this.id = pluginOptions.id ?? this.id;\n this.pluginOptions = pluginOptions;\n }\n run(...args: any[]) {\n // const eventArgs = args[0];\n const runTime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table;\n if (runTime === TABLE_EVENT_TYPE.SELECTED_CLEAR) {\n this.clearHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.SELECTED_CELL) {\n this.updateHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.MOUSEMOVE_TABLE) {\n this.updateHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.INITIALIZED) {\n this.registerStyle();\n }\n }\n\n registerStyle() {\n this.table.registerCustomCellStyle('col-highlight', {\n bgColor: this.pluginOptions?.colHighlightBGColor ?? '#82b2f5',\n color: this.pluginOptions?.colHighlightColor ?? '#FFF'\n });\n\n this.table.registerCustomCellStyle('row-highlight', {\n bgColor: this.pluginOptions?.rowHighlightBGColor ?? '#82b2f5',\n color: this.pluginOptions?.rowHighlightColor ?? 'yellow'\n });\n }\n\n clearHighlight() {\n if (this.colHeaderRanges) {\n this.colHeaderRanges.forEach(range => {\n this.table.arrangeCustomCellStyle({ range }, undefined);\n });\n }\n if (this.rowHeaderRanges) {\n this.rowHeaderRanges.forEach(range => {\n this.table.arrangeCustomCellStyle({ range }, undefined);\n });\n }\n // clear range\n this.colHeaderRanges = [];\n this.rowHeaderRanges = [];\n }\n\n updateHighlight() {\n if (this.pluginOptions?.colHighlight === false && this.pluginOptions?.rowHighlight === false) {\n return;\n }\n const selectRanges = this.table.getSelectedCellRanges();\n if (selectRanges.length < 2) {\n this.clearHighlight();\n // return;\n }\n for (let i = 0; i < selectRanges.length; i++) {\n const selectRange = selectRanges[i];\n const rowSelectRange = [selectRange.start.row, selectRange.end.row];\n rowSelectRange.sort((a, b) => a - b); // sort\n const colSelectRange = [selectRange.start.col, selectRange.end.col];\n colSelectRange.sort((a, b) => a - b); // sort\n\n let colHeaderRange: CellRange;\n let rowHeaderRange: CellRange;\n if (this.table.isPivotTable()) {\n colHeaderRange = {\n start: {\n col: colSelectRange[0],\n row: 0\n },\n end: {\n col: colSelectRange[1],\n row: this.table.columnHeaderLevelCount - 1\n }\n };\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: this.table.rowHeaderLevelCount - 1,\n row: rowSelectRange[1]\n }\n };\n } else if (this.table.internalProps.transpose) {\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: this.table.rowHeaderLevelCount - 1,\n row: rowSelectRange[1]\n }\n };\n } else {\n colHeaderRange = {\n start: {\n col: colSelectRange[0],\n row: 0\n },\n end: {\n col: colSelectRange[1],\n row: this.table.columnHeaderLevelCount - 1\n }\n };\n if (this.table.internalProps.rowSeriesNumber) {\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: 0,\n row: rowSelectRange[1]\n }\n };\n }\n }\n\n if (\n this.pluginOptions?.colHighlight !== false &&\n !this.colHeaderRanges.find(range => isSameRange(range, colHeaderRange))\n ) {\n // this.colHeaderRanges && this.table.arrangeCustomCellStyle({ range: this.colHeaderRanges }, undefined);\n colHeaderRange && this.table.arrangeCustomCellStyle({ range: colHeaderRange }, 'col-highlight');\n this.colHeaderRanges.push(colHeaderRange);\n }\n\n if (\n this.pluginOptions?.rowHighlight !== false &&\n !this.rowHeaderRanges.find(range => isSameRange(range, rowHeaderRange))\n ) {\n // this.rowHeaderRanges && this.table.arrangeCustomCellStyle({ range: this.rowHeaderRanges }, undefined);\n rowHeaderRange && this.table.arrangeCustomCellStyle({ range: rowHeaderRange }, 'row-highlight');\n this.rowHeaderRanges.push(rowHeaderRange);\n }\n }\n }\n update() {\n this.registerStyle();\n this.updateHighlight();\n }\n release() {\n this.rowHeaderRanges = [];\n this.colHeaderRanges = [];\n }\n}\n\nfunction isSameRange(a: CellRange | undefined, b: CellRange | undefined) {\n if (a === undefined && b === undefined) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n return (\n a.start.col === b.start.col && a.start.row === b.start.row && a.end.col === b.end.col && a.end.row === b.end.row\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/highlight-header-when-select-cell.ts"],"names":[],"mappings":"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","file":"highlight-header-when-select-cell.js","sourcesContent":["import type { CellRange } from '@visactor/vtable/es/ts-types';\nimport { TABLE_EVENT_TYPE } from '@visactor/vtable';\nimport type { BaseTableAPI, pluginsDefinition } from '@visactor/vtable';\nexport interface IHighlightHeaderWhenSelectCellPluginOptions {\n id?: string;\n rowHighlight?: boolean;\n colHighlight?: boolean;\n colHighlightBGColor?: string;\n colHighlightColor?: string;\n rowHighlightBGColor?: string;\n rowHighlightColor?: string;\n}\n\nexport class HighlightHeaderWhenSelectCellPlugin implements pluginsDefinition.IVTablePlugin {\n id = `highlight-header-when-select-cell`;\n name = 'Highlight Header When Select Cell';\n runTime = [\n TABLE_EVENT_TYPE.INITIALIZED,\n TABLE_EVENT_TYPE.SELECTED_CLEAR,\n TABLE_EVENT_TYPE.SELECTED_CELL,\n TABLE_EVENT_TYPE.MOUSEMOVE_TABLE\n ];\n table: BaseTableAPI;\n pluginOptions: IHighlightHeaderWhenSelectCellPluginOptions;\n colHeaderRanges: CellRange[] = [];\n rowHeaderRanges: CellRange[] = [];\n constructor(pluginOptions: IHighlightHeaderWhenSelectCellPluginOptions) {\n this.id = pluginOptions?.id ?? this.id;\n this.pluginOptions = pluginOptions;\n }\n run(...args: any[]) {\n // const eventArgs = args[0];\n const runTime = args[1];\n const table: BaseTableAPI = args[2];\n this.table = table;\n if (runTime === TABLE_EVENT_TYPE.SELECTED_CLEAR) {\n this.clearHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.SELECTED_CELL) {\n this.updateHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.MOUSEMOVE_TABLE) {\n this.updateHighlight();\n } else if (runTime === TABLE_EVENT_TYPE.INITIALIZED) {\n this.registerStyle();\n }\n }\n\n registerStyle() {\n this.table.registerCustomCellStyle('col-highlight', {\n bgColor: this.pluginOptions?.colHighlightBGColor ?? '#82b2f5',\n color: this.pluginOptions?.colHighlightColor ?? '#FFF'\n });\n\n this.table.registerCustomCellStyle('row-highlight', {\n bgColor: this.pluginOptions?.rowHighlightBGColor ?? '#82b2f5',\n color: this.pluginOptions?.rowHighlightColor ?? 'yellow'\n });\n }\n\n clearHighlight() {\n if (this.colHeaderRanges) {\n this.colHeaderRanges.forEach(range => {\n this.table.arrangeCustomCellStyle({ range }, undefined);\n });\n }\n if (this.rowHeaderRanges) {\n this.rowHeaderRanges.forEach(range => {\n this.table.arrangeCustomCellStyle({ range }, undefined);\n });\n }\n // clear range\n this.colHeaderRanges = [];\n this.rowHeaderRanges = [];\n }\n\n updateHighlight() {\n if (this.pluginOptions?.colHighlight === false && this.pluginOptions?.rowHighlight === false) {\n return;\n }\n const selectRanges = this.table.getSelectedCellRanges();\n if (selectRanges.length < 2) {\n this.clearHighlight();\n // return;\n }\n for (let i = 0; i < selectRanges.length; i++) {\n const selectRange = selectRanges[i];\n const rowSelectRange = [selectRange.start.row, selectRange.end.row];\n rowSelectRange.sort((a, b) => a - b); // sort\n const colSelectRange = [selectRange.start.col, selectRange.end.col];\n colSelectRange.sort((a, b) => a - b); // sort\n\n let colHeaderRange: CellRange;\n let rowHeaderRange: CellRange;\n if (this.table.isPivotTable()) {\n colHeaderRange = {\n start: {\n col: colSelectRange[0],\n row: 0\n },\n end: {\n col: colSelectRange[1],\n row: this.table.columnHeaderLevelCount - 1\n }\n };\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: this.table.rowHeaderLevelCount - 1,\n row: rowSelectRange[1]\n }\n };\n } else if (this.table.internalProps.transpose) {\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: this.table.rowHeaderLevelCount - 1,\n row: rowSelectRange[1]\n }\n };\n } else {\n colHeaderRange = {\n start: {\n col: colSelectRange[0],\n row: 0\n },\n end: {\n col: colSelectRange[1],\n row: this.table.columnHeaderLevelCount - 1\n }\n };\n if (this.table.internalProps.rowSeriesNumber) {\n rowHeaderRange = {\n start: {\n col: 0,\n row: rowSelectRange[0]\n },\n end: {\n col: 0,\n row: rowSelectRange[1]\n }\n };\n }\n }\n\n if (\n this.pluginOptions?.colHighlight !== false &&\n !this.colHeaderRanges.find(range => isSameRange(range, colHeaderRange))\n ) {\n // this.colHeaderRanges && this.table.arrangeCustomCellStyle({ range: this.colHeaderRanges }, undefined);\n colHeaderRange && this.table.arrangeCustomCellStyle({ range: colHeaderRange }, 'col-highlight');\n this.colHeaderRanges.push(colHeaderRange);\n }\n\n if (\n this.pluginOptions?.rowHighlight !== false &&\n !this.rowHeaderRanges.find(range => isSameRange(range, rowHeaderRange))\n ) {\n // this.rowHeaderRanges && this.table.arrangeCustomCellStyle({ range: this.rowHeaderRanges }, undefined);\n rowHeaderRange && this.table.arrangeCustomCellStyle({ range: rowHeaderRange }, 'row-highlight');\n this.rowHeaderRanges.push(rowHeaderRange);\n }\n }\n }\n update() {\n this.registerStyle();\n this.updateHighlight();\n }\n release() {\n this.rowHeaderRanges = [];\n this.colHeaderRanges = [];\n }\n}\n\nfunction isSameRange(a: CellRange | undefined, b: CellRange | undefined) {\n if (a === undefined && b === undefined) {\n return true;\n }\n\n if (a === undefined || b === undefined) {\n return false;\n }\n\n return (\n a.start.col === b.start.col && a.start.row === b.start.row && a.end.col === b.end.col && a.end.row === b.end.row\n );\n}\n"]}
|
package/cjs/index.d.ts
CHANGED
|
@@ -13,6 +13,7 @@ export * from './rotate-table';
|
|
|
13
13
|
export * from './gantt-export-image';
|
|
14
14
|
export * from './paste-add-row-column';
|
|
15
15
|
export * from './wps-fill-handle';
|
|
16
|
+
export * from './master-detail-plugin';
|
|
16
17
|
export * from './excel-import';
|
|
17
18
|
export * from './table-series-number';
|
|
18
19
|
export * from './context-menu';
|
package/cjs/index.js
CHANGED
|
@@ -24,8 +24,8 @@ __exportStar(require("./highlight-header-when-select-cell"), exports), __exportS
|
|
|
24
24
|
__exportStar(require("./types"), exports), __exportStar(require("./focus-highlight"), exports),
|
|
25
25
|
__exportStar(require("./table-carousel-animation"), exports), __exportStar(require("./rotate-table"), exports),
|
|
26
26
|
__exportStar(require("./gantt-export-image"), exports), __exportStar(require("./paste-add-row-column"), exports),
|
|
27
|
-
__exportStar(require("./wps-fill-handle"), exports), __exportStar(require("./
|
|
28
|
-
__exportStar(require("./
|
|
29
|
-
__exportStar(require("./
|
|
30
|
-
__exportStar(require("./auto-fill"), exports);
|
|
27
|
+
__exportStar(require("./wps-fill-handle"), exports), __exportStar(require("./master-detail-plugin"), exports),
|
|
28
|
+
__exportStar(require("./excel-import"), exports), __exportStar(require("./table-series-number"), exports),
|
|
29
|
+
__exportStar(require("./context-menu"), exports), __exportStar(require("./filter"), exports),
|
|
30
|
+
__exportStar(require("./table-export"), exports), __exportStar(require("./auto-fill"), exports);
|
|
31
31
|
//# sourceMappingURL=index.js.map
|
package/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,mDAAiC;AACjC,kDAAgC;AAChC,+CAA6B;AAC7B,sEAAoD;AACpD,6DAA2C;AAC3C,0CAAwB;AACxB,oDAAkC;AAClC,6DAA2C;AAC3C,iDAA+B;AAC/B,uDAAqC;AACrC,yDAAuC;AACvC,oDAAkC;AAClC,iDAA+B;AAC/B,wDAAsC;AACtC,iDAA+B;AAC/B,2CAAyB;AACzB,iDAA+B;AAC/B,8CAA4B","file":"index.js","sourcesContent":["export * from './carousel-animation';\nexport * from './invert-highlight';\nexport * from './header-highlight';\nexport * from './add-row-column';\nexport * from './column-series';\nexport * from './row-series';\nexport * from './highlight-header-when-select-cell';\nexport * from './excel-edit-cell-keyboard';\nexport * from './types';\nexport * from './focus-highlight';\nexport * from './table-carousel-animation';\nexport * from './rotate-table';\nexport * from './gantt-export-image';\nexport * from './paste-add-row-column';\nexport * from './wps-fill-handle';\nexport * from './excel-import';\nexport * from './table-series-number';\nexport * from './context-menu';\nexport * from './filter';\nexport * from './table-export';\nexport * from './auto-fill';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,uDAAqC;AACrC,qDAAmC;AACnC,qDAAmC;AACnC,mDAAiC;AACjC,kDAAgC;AAChC,+CAA6B;AAC7B,sEAAoD;AACpD,6DAA2C;AAC3C,0CAAwB;AACxB,oDAAkC;AAClC,6DAA2C;AAC3C,iDAA+B;AAC/B,uDAAqC;AACrC,yDAAuC;AACvC,oDAAkC;AAClC,yDAAuC;AACvC,iDAA+B;AAC/B,wDAAsC;AACtC,iDAA+B;AAC/B,2CAAyB;AACzB,iDAA+B;AAC/B,8CAA4B","file":"index.js","sourcesContent":["export * from './carousel-animation';\nexport * from './invert-highlight';\nexport * from './header-highlight';\nexport * from './add-row-column';\nexport * from './column-series';\nexport * from './row-series';\nexport * from './highlight-header-when-select-cell';\nexport * from './excel-edit-cell-keyboard';\nexport * from './types';\nexport * from './focus-highlight';\nexport * from './table-carousel-animation';\nexport * from './rotate-table';\nexport * from './gantt-export-image';\nexport * from './paste-add-row-column';\nexport * from './wps-fill-handle';\nexport * from './master-detail-plugin';\nexport * from './excel-import';\nexport * from './table-series-number';\nexport * from './context-menu';\nexport * from './filter';\nexport * from './table-export';\nexport * from './auto-fill';\n"]}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: !0
|
|
5
|
+
}), exports.bindMasterDetailCheckboxChange = void 0;
|
|
6
|
+
|
|
7
|
+
const utils_1 = require("./utils");
|
|
8
|
+
|
|
9
|
+
function bindMasterDetailCheckboxChange(table, eventManager) {
|
|
10
|
+
const checkboxChangeHandler = args => {
|
|
11
|
+
var _a;
|
|
12
|
+
const {col: col, row: row, checked: checked, field: field} = args;
|
|
13
|
+
if (table.isHeader(col, row)) {
|
|
14
|
+
const internalProps = (0, utils_1.getInternalProps)(table);
|
|
15
|
+
return void eventManager.getExpandedRows().forEach((expandedRow => {
|
|
16
|
+
var _a;
|
|
17
|
+
const bodyRowIndex = expandedRow - table.columnHeaderLevelCount, subTableInstance = null === (_a = internalProps.subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
18
|
+
if (subTableInstance && field) {
|
|
19
|
+
updateAllSubTableCheckboxes(subTableInstance, "string" == typeof field ? field : String(field), checked);
|
|
20
|
+
}
|
|
21
|
+
}));
|
|
22
|
+
}
|
|
23
|
+
const rowIndex = row;
|
|
24
|
+
if (!eventManager.isRowExpanded(rowIndex)) return;
|
|
25
|
+
const bodyRowIndex = row - table.columnHeaderLevelCount, subTableInstance = null === (_a = (0,
|
|
26
|
+
utils_1.getInternalProps)(table).subTableInstances) || void 0 === _a ? void 0 : _a.get(bodyRowIndex);
|
|
27
|
+
if (subTableInstance && field) {
|
|
28
|
+
updateAllSubTableCheckboxes(subTableInstance, "string" == typeof field ? field : String(field), checked);
|
|
29
|
+
}
|
|
30
|
+
}, originalUpdateHeaderCheckedState = table.stateManager.updateHeaderCheckedState;
|
|
31
|
+
table.stateManager.updateHeaderCheckedState = function(field, col, row) {
|
|
32
|
+
const stateManager = this;
|
|
33
|
+
let result, allChecked = !0, allUnChecked = !0, hasChecked = !1, hasIndeterminate = !1;
|
|
34
|
+
return stateManager.checkedState.forEach(((check_state, index) => {
|
|
35
|
+
var _a;
|
|
36
|
+
index = index.includes(",") ? index.split(",").map((item => Number(item))) : Number(index);
|
|
37
|
+
const tableIndex = stateManager.table.getTableIndexByRecordIndex(index), mergeCell = stateManager.table.transpose ? stateManager.table.getCustomMerge(tableIndex, row) : stateManager.table.getCustomMerge(col, tableIndex), data = null === (_a = stateManager.table.dataSource) || void 0 === _a ? void 0 : _a.get(index);
|
|
38
|
+
if (mergeCell || !stateManager.table.internalProps.enableCheckboxCascade && (null == data ? void 0 : data.vtableMerge)) return;
|
|
39
|
+
const checkValue = null == check_state ? void 0 : check_state[field];
|
|
40
|
+
"indeterminate" === checkValue ? (hasIndeterminate = !0, hasChecked = !0, allChecked = !1,
|
|
41
|
+
allUnChecked = !1) : !0 !== checkValue ? allChecked = !1 : (allUnChecked = !1, hasChecked = !0);
|
|
42
|
+
})), result = hasIndeterminate ? "indeterminate" : !!allChecked || !allUnChecked && (!!hasChecked && "indeterminate"),
|
|
43
|
+
stateManager.headerCheckedState[field] = result, result;
|
|
44
|
+
}, table.on("checkbox_state_change", checkboxChangeHandler);
|
|
45
|
+
const subTableCleanup = bindSubTableCheckboxEvents(table);
|
|
46
|
+
return () => {
|
|
47
|
+
table.off("checkbox_state_change", checkboxChangeHandler), table.stateManager.updateHeaderCheckedState = originalUpdateHeaderCheckedState,
|
|
48
|
+
subTableCleanup();
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function bindSubTableCheckboxEvents(table) {
|
|
53
|
+
const internalProps = (0, utils_1.getInternalProps)(table), originalSet = internalProps.subTableInstances.set;
|
|
54
|
+
return originalSet && internalProps.subTableInstances ? (internalProps.subTableInstances.set = function(key, subTable) {
|
|
55
|
+
const result = originalSet.call(this, key, subTable), checkboxHandler = args => {
|
|
56
|
+
const {field: field} = args;
|
|
57
|
+
updateMainTableRowCheckboxFromSubTable(table, subTable, key, field);
|
|
58
|
+
};
|
|
59
|
+
subTable.on("checkbox_state_change", checkboxHandler);
|
|
60
|
+
return subTable.__checkboxHandler = checkboxHandler, result;
|
|
61
|
+
}, () => {
|
|
62
|
+
internalProps.subTableInstances && originalSet && (internalProps.subTableInstances.set = originalSet);
|
|
63
|
+
}) : () => {};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function updateMainTableRowCheckboxFromSubTable(mainTable, subTable, subTableKey, field) {
|
|
67
|
+
const mainTableRow = subTableKey + mainTable.columnHeaderLevelCount;
|
|
68
|
+
let subTableState = !1;
|
|
69
|
+
const headerState = subTable.stateManager.headerCheckedState[field];
|
|
70
|
+
void 0 !== headerState && (subTableState = headerState);
|
|
71
|
+
const mainTableCheckboxCol = (0, utils_1.findCheckboxColumnIndex)(mainTable, field);
|
|
72
|
+
if (-1 !== mainTableCheckboxCol && mainTable.stateManager) {
|
|
73
|
+
mainTable.stateManager.setCheckedState(mainTableCheckboxCol, mainTableRow, field, subTableState);
|
|
74
|
+
if ("checkbox" === mainTable.getCellType(mainTableCheckboxCol, mainTableRow) && (0,
|
|
75
|
+
utils_1.setCellCheckboxStateByAttribute)(mainTableCheckboxCol, mainTableRow, subTableState, mainTable),
|
|
76
|
+
mainTable.internalProps.enableCheckboxCascade) {
|
|
77
|
+
const oldHeaderCheckedState = mainTable.stateManager.headerCheckedState[field], newHeaderCheckedState = mainTable.stateManager.updateHeaderCheckedState(field, mainTableCheckboxCol, 0);
|
|
78
|
+
if (oldHeaderCheckedState !== newHeaderCheckedState) {
|
|
79
|
+
const headerRow = 0;
|
|
80
|
+
mainTable.isHeader(mainTableCheckboxCol, headerRow) && mainTable.scenegraph.updateHeaderCheckboxCellState(mainTableCheckboxCol, headerRow, newHeaderCheckedState);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function updateAllSubTableCheckboxes(subTable, field, checked) {
|
|
87
|
+
if (!subTable.stateManager) return;
|
|
88
|
+
subTable.stateManager.headerCheckedState[field] = checked;
|
|
89
|
+
(subTable.records || []).forEach(((record, recordIndex) => {
|
|
90
|
+
const indexKey = recordIndex.toString();
|
|
91
|
+
record[field] = checked;
|
|
92
|
+
let recordStates = subTable.stateManager.checkedState.get(indexKey);
|
|
93
|
+
recordStates || (recordStates = {}, subTable.stateManager.checkedState.set(indexKey, recordStates)),
|
|
94
|
+
recordStates[field] = checked;
|
|
95
|
+
}));
|
|
96
|
+
const checkboxCol = (0, utils_1.findCheckboxColumnIndex)(subTable, field);
|
|
97
|
+
if (checkboxCol >= 0) {
|
|
98
|
+
subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, 0, checked);
|
|
99
|
+
for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) (0,
|
|
100
|
+
utils_1.setCellCheckboxStateByAttribute)(checkboxCol, row, checked, subTable);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=checkbox.js.map
|
|
105
|
+
exports.bindMasterDetailCheckboxChange = bindMasterDetailCheckboxChange;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/master-detail-plugin/checkbox.ts"],"names":[],"mappings":"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","file":"checkbox.js","sourcesContent":["import type * as VTable from '@visactor/vtable';\r\nimport { getInternalProps, findCheckboxColumnIndex, setCellCheckboxStateByAttribute } from './utils';\r\n/**\r\n * 设置主从表checkbox联动功能\r\n */\r\nexport function bindMasterDetailCheckboxChange(\r\n table: VTable.ListTable,\r\n eventManager: { isRowExpanded: (row: number) => boolean; getExpandedRows: () => number[] }\r\n): () => void {\r\n const checkboxChangeHandler = (args: unknown) => {\r\n const { col, row, checked, field } = args as { col: number; row: number; checked: boolean; field: string };\r\n\r\n // 主表表头checkbox变化:同步更新所有已展开子表的对应字段\r\n if (table.isHeader(col, row)) {\r\n const internalProps = getInternalProps(table);\r\n const expandedRows = eventManager.getExpandedRows();\r\n expandedRows.forEach(expandedRow => {\r\n const bodyRowIndex = expandedRow - table.columnHeaderLevelCount;\r\n const subTableInstance = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTableInstance && field) {\r\n const fieldStr = typeof field === 'string' ? field : String(field);\r\n updateAllSubTableCheckboxes(subTableInstance, fieldStr, checked);\r\n }\r\n });\r\n return;\r\n }\r\n\r\n // 主表body行checkbox变化:如果该行已展开,则更新对应子表的所有checkbox\r\n const rowIndex = row;\r\n if (!eventManager.isRowExpanded(rowIndex)) {\r\n return;\r\n }\r\n const bodyRowIndex = row - table.columnHeaderLevelCount;\r\n const internalProps = getInternalProps(table);\r\n const subTableInstance = internalProps.subTableInstances?.get(bodyRowIndex);\r\n if (subTableInstance && field) {\r\n const fieldStr = typeof field === 'string' ? field : String(field);\r\n updateAllSubTableCheckboxes(subTableInstance, fieldStr, checked);\r\n }\r\n };\r\n\r\n // 增强主表的updateHeaderCheckedState方法,添加indeterminate状态处理\r\n const originalUpdateHeaderCheckedState = table.stateManager.updateHeaderCheckedState;\r\n table.stateManager.updateHeaderCheckedState = function (\r\n field: string | number,\r\n col: number,\r\n row: number\r\n ): boolean | 'indeterminate' {\r\n const stateManager = this;\r\n let allChecked = true;\r\n let allUnChecked = true;\r\n let hasChecked = false;\r\n let hasIndeterminate = false;\r\n\r\n stateManager.checkedState.forEach(\r\n (check_state: Record<string | number, boolean | 'indeterminate'>, index: string | number | number[]) => {\r\n if ((index as string).includes(',')) {\r\n index = (index as string).split(',').map(item => {\r\n return Number(item);\r\n }) as number[];\r\n } else {\r\n index = Number(index);\r\n }\r\n const tableIndex = stateManager.table.getTableIndexByRecordIndex(index as number);\r\n const mergeCell = (stateManager.table as VTable.ListTable).transpose\r\n ? stateManager.table.getCustomMerge(tableIndex, row)\r\n : stateManager.table.getCustomMerge(col, tableIndex);\r\n\r\n const data = stateManager.table.dataSource?.get(index as number);\r\n if (mergeCell || (!stateManager.table.internalProps.enableCheckboxCascade && data?.vtableMerge)) {\r\n // 不参与check状态的计算\r\n return;\r\n }\r\n\r\n const checkValue = check_state?.[field];\r\n // 主从表特判:处理indeterminate状态\r\n if (checkValue === 'indeterminate') {\r\n hasIndeterminate = true;\r\n hasChecked = true;\r\n allChecked = false;\r\n allUnChecked = false;\r\n } else if (checkValue !== true) {\r\n allChecked = false;\r\n } else {\r\n allUnChecked = false;\r\n hasChecked = true;\r\n }\r\n }\r\n );\r\n\r\n let result: boolean | 'indeterminate';\r\n if (hasIndeterminate) {\r\n result = 'indeterminate';\r\n } else if (allChecked) {\r\n result = true;\r\n } else if (allUnChecked) {\r\n result = false;\r\n } else if (hasChecked) {\r\n result = 'indeterminate';\r\n } else {\r\n result = false;\r\n }\r\n stateManager.headerCheckedState[field] = result;\r\n return result;\r\n };\r\n\r\n // 绑定主表复选框状态变化事件\r\n table.on('checkbox_state_change', checkboxChangeHandler);\r\n // 绑定子表复选框事件,实现反向联动\r\n const subTableCleanup = bindSubTableCheckboxEvents(table);\r\n // 返回清理函数,用于移除所有事件监听器和恢复原始方法\r\n return () => {\r\n table.off('checkbox_state_change', checkboxChangeHandler);\r\n // 恢复原始的updateHeaderCheckedState方法\r\n table.stateManager.updateHeaderCheckedState = originalUpdateHeaderCheckedState;\r\n subTableCleanup();\r\n };\r\n}\r\n\r\n/**\r\n * 绑定子表checkbox事件,实现子表到主表的反向联动\r\n */\r\nfunction bindSubTableCheckboxEvents(table: VTable.ListTable): () => void {\r\n const internalProps = getInternalProps(table);\r\n const originalSet = internalProps.subTableInstances.set;\r\n if (originalSet && internalProps.subTableInstances) {\r\n internalProps.subTableInstances.set = function (key: number, subTable: VTable.ListTable) {\r\n const result = originalSet.call(this, key, subTable);\r\n // 为新创建的子表绑定checkbox事件\r\n const checkboxHandler = (args: unknown) => {\r\n const { field } = args as { col: number; row: number; checked: boolean; field: string };\r\n updateMainTableRowCheckboxFromSubTable(table, subTable, key, field as string);\r\n };\r\n subTable.on('checkbox_state_change', checkboxHandler);\r\n const extendedSubTable = subTable as VTable.ListTable & { __checkboxHandler?: (args: unknown) => void };\r\n extendedSubTable.__checkboxHandler = checkboxHandler;\r\n return result;\r\n };\r\n // 返回清理函数\r\n return () => {\r\n if (internalProps.subTableInstances && originalSet) {\r\n internalProps.subTableInstances.set = originalSet;\r\n }\r\n };\r\n }\r\n // 如果没有设置成功,返回空的清理函数\r\n return () => {\r\n //\r\n };\r\n}\r\n\r\n/**\r\n * 根据子表状态更新主表对应展开行的checkbox状态\r\n */\r\nfunction updateMainTableRowCheckboxFromSubTable(\r\n mainTable: VTable.ListTable,\r\n subTable: VTable.ListTable,\r\n subTableKey: number,\r\n field: string\r\n) {\r\n // 将bodyRowIndex转换为主表rowIndex\r\n const mainTableRow = subTableKey + mainTable.columnHeaderLevelCount;\r\n let subTableState: boolean | 'indeterminate' = false;\r\n const headerState = subTable.stateManager.headerCheckedState[field];\r\n if (headerState !== undefined) {\r\n subTableState = headerState;\r\n }\r\n const mainTableCheckboxCol = findCheckboxColumnIndex(mainTable, field);\r\n if (mainTableCheckboxCol === -1) {\r\n return;\r\n }\r\n // 更新主表对应行的checkbox状态\r\n if (mainTable.stateManager) {\r\n mainTable.stateManager.setCheckedState(mainTableCheckboxCol, mainTableRow, field, subTableState);\r\n const cellType = mainTable.getCellType(mainTableCheckboxCol, mainTableRow);\r\n if (cellType === 'checkbox') {\r\n setCellCheckboxStateByAttribute(mainTableCheckboxCol, mainTableRow, subTableState, mainTable);\r\n }\r\n if (mainTable.internalProps.enableCheckboxCascade) {\r\n const oldHeaderCheckedState = mainTable.stateManager.headerCheckedState[field];\r\n const newHeaderCheckedState = mainTable.stateManager.updateHeaderCheckedState(field, mainTableCheckboxCol, 0);\r\n if (oldHeaderCheckedState !== newHeaderCheckedState) {\r\n const headerRow = 0;\r\n if (mainTable.isHeader(mainTableCheckboxCol, headerRow)) {\r\n mainTable.scenegraph.updateHeaderCheckboxCellState(mainTableCheckboxCol, headerRow, newHeaderCheckedState);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 更新子表的checkbox状态\r\n */\r\nfunction updateAllSubTableCheckboxes(subTable: VTable.ListTable, field: string, checked: boolean): void {\r\n if (!subTable.stateManager) {\r\n return;\r\n }\r\n // 设置表头状态\r\n subTable.stateManager.headerCheckedState[field] = checked;\r\n const records = subTable.records || [];\r\n records.forEach((record, recordIndex) => {\r\n const indexKey = recordIndex.toString();\r\n (record as Record<string, unknown>)[field] = checked;\r\n let recordStates = subTable.stateManager.checkedState.get(indexKey);\r\n if (!recordStates) {\r\n recordStates = {};\r\n subTable.stateManager.checkedState.set(indexKey, recordStates);\r\n }\r\n recordStates[field] = checked;\r\n });\r\n // 使用缓存的列索引避免重复查找\r\n const checkboxCol = findCheckboxColumnIndex(subTable, field);\r\n if (checkboxCol >= 0) {\r\n subTable.scenegraph.updateHeaderCheckboxCellState(checkboxCol, 0, checked);\r\n for (let row = subTable.columnHeaderLevelCount; row < subTable.rowCount; row++) {\r\n setCellCheckboxStateByAttribute(checkboxCol, row, checked, subTable);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { DetailTableOptions, MasterDetailPluginOptions } from './types';
|
|
3
|
+
export declare class ConfigManager {
|
|
4
|
+
private pluginOptions;
|
|
5
|
+
private table;
|
|
6
|
+
constructor(pluginOptions: MasterDetailPluginOptions, table: VTable.ListTable);
|
|
7
|
+
private hasChildren;
|
|
8
|
+
injectMasterDetailOptions(options: VTable.ListTableConstructorOptions): void;
|
|
9
|
+
private getDataCount;
|
|
10
|
+
private disableRefreshHierarchyState;
|
|
11
|
+
private setupInitializedListener;
|
|
12
|
+
private processRecordsHierarchyStates;
|
|
13
|
+
getDetailConfigForRecord(record: unknown, bodyRowIndex: number): DetailTableOptions | null;
|
|
14
|
+
private isRowExpanded;
|
|
15
|
+
setRowExpandedChecker(checker: (row: number) => boolean): void;
|
|
16
|
+
release(): void;
|
|
17
|
+
}
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var __createBinding = this && this.__createBinding || (Object.create ? function(o, m, k, k2) {
|
|
4
|
+
void 0 === k2 && (k2 = k);
|
|
5
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
6
|
+
desc && !("get" in desc ? !m.__esModule : desc.writable || desc.configurable) || (desc = {
|
|
7
|
+
enumerable: !0,
|
|
8
|
+
get: function() {
|
|
9
|
+
return m[k];
|
|
10
|
+
}
|
|
11
|
+
}), Object.defineProperty(o, k2, desc);
|
|
12
|
+
} : function(o, m, k, k2) {
|
|
13
|
+
void 0 === k2 && (k2 = k), o[k2] = m[k];
|
|
14
|
+
}), __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function(o, v) {
|
|
15
|
+
Object.defineProperty(o, "default", {
|
|
16
|
+
enumerable: !0,
|
|
17
|
+
value: v
|
|
18
|
+
});
|
|
19
|
+
} : function(o, v) {
|
|
20
|
+
o.default = v;
|
|
21
|
+
}), __importStar = this && this.__importStar || function(mod) {
|
|
22
|
+
if (mod && mod.__esModule) return mod;
|
|
23
|
+
var result = {};
|
|
24
|
+
if (null != mod) for (var k in mod) "default" !== k && Object.prototype.hasOwnProperty.call(mod, k) && __createBinding(result, mod, k);
|
|
25
|
+
return __setModuleDefault(result, mod), result;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
Object.defineProperty(exports, "__esModule", {
|
|
29
|
+
value: !0
|
|
30
|
+
}), exports.ConfigManager = void 0;
|
|
31
|
+
|
|
32
|
+
const VTable = __importStar(require("@visactor/vtable"));
|
|
33
|
+
|
|
34
|
+
class ConfigManager {
|
|
35
|
+
constructor(pluginOptions, table) {
|
|
36
|
+
this.pluginOptions = pluginOptions, this.table = table, this.isRowExpanded = () => !1;
|
|
37
|
+
}
|
|
38
|
+
hasChildren(record) {
|
|
39
|
+
if (record && "object" == typeof record && "children" in record) {
|
|
40
|
+
const children = record.children;
|
|
41
|
+
return Array.isArray(children) && children.length > 0;
|
|
42
|
+
}
|
|
43
|
+
return !1;
|
|
44
|
+
}
|
|
45
|
+
injectMasterDetailOptions(options) {
|
|
46
|
+
options.masterDetail = !0, options.customConfig || (options.customConfig = {}),
|
|
47
|
+
options.customConfig.scrollEventAlwaysTrigger = !0;
|
|
48
|
+
const originalCustomComputeRowHeight = options.customComputeRowHeight;
|
|
49
|
+
if (options.customComputeRowHeight = params => {
|
|
50
|
+
var _a;
|
|
51
|
+
const {row: row, table: table} = params;
|
|
52
|
+
if (this.isRowExpanded(row)) {
|
|
53
|
+
const expandedHeight = table.getRowHeight(row);
|
|
54
|
+
return Array.isArray(expandedHeight) ? null !== (_a = expandedHeight[0]) && void 0 !== _a ? _a : "auto" : expandedHeight;
|
|
55
|
+
}
|
|
56
|
+
if (originalCustomComputeRowHeight) {
|
|
57
|
+
const userResult = originalCustomComputeRowHeight(params);
|
|
58
|
+
if (null != userResult) return userResult;
|
|
59
|
+
}
|
|
60
|
+
}, options.columns && options.columns.length > 0) {
|
|
61
|
+
options.columns[0].tree = !0;
|
|
62
|
+
}
|
|
63
|
+
if (this.setupInitializedListener(), this.pluginOptions.detailTableOptions) {
|
|
64
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
65
|
+
"function" == typeof detailOptions ? options.getDetailGridOptions = detailOptions : options.detailTableOptions = detailOptions;
|
|
66
|
+
}
|
|
67
|
+
this.disableRefreshHierarchyState();
|
|
68
|
+
}
|
|
69
|
+
getDataCount() {
|
|
70
|
+
var _a, _b, _c, _d, _e;
|
|
71
|
+
return this.table.pagination ? null !== (_c = null === (_b = null === (_a = this.table.dataSource) || void 0 === _a ? void 0 : _a.currentPagerIndexedData) || void 0 === _b ? void 0 : _b.length) && void 0 !== _c ? _c : 0 : null !== (_e = null === (_d = this.table.dataSource) || void 0 === _d ? void 0 : _d.sourceLength) && void 0 !== _e ? _e : 0;
|
|
72
|
+
}
|
|
73
|
+
disableRefreshHierarchyState() {
|
|
74
|
+
setTimeout((() => {
|
|
75
|
+
const tableWithPrivateMethod = this.table;
|
|
76
|
+
tableWithPrivateMethod && "function" == typeof tableWithPrivateMethod._refreshHierarchyState && (tableWithPrivateMethod._originalRefreshHierarchyState = tableWithPrivateMethod._refreshHierarchyState,
|
|
77
|
+
tableWithPrivateMethod._refreshHierarchyState = () => {});
|
|
78
|
+
}), 0);
|
|
79
|
+
}
|
|
80
|
+
setupInitializedListener() {
|
|
81
|
+
this.table.on("initialized", (() => {
|
|
82
|
+
const records = this.table.dataSource.records;
|
|
83
|
+
this.processRecordsHierarchyStates(records), this.table.renderWithRecreateCells();
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
processRecordsHierarchyStates(records) {
|
|
87
|
+
const HierarchyState = VTable.TYPES.HierarchyState;
|
|
88
|
+
(recordList => {
|
|
89
|
+
recordList.forEach((record => {
|
|
90
|
+
if (record && "object" == typeof record) {
|
|
91
|
+
const recordObj = record;
|
|
92
|
+
(this.hasChildren(record) || !0 === recordObj.children) && (recordObj.hierarchyState = HierarchyState.collapse);
|
|
93
|
+
}
|
|
94
|
+
}));
|
|
95
|
+
})(records);
|
|
96
|
+
}
|
|
97
|
+
getDetailConfigForRecord(record, bodyRowIndex) {
|
|
98
|
+
const detailOptions = this.pluginOptions.detailTableOptions;
|
|
99
|
+
return detailOptions ? "function" == typeof detailOptions ? detailOptions({
|
|
100
|
+
data: record,
|
|
101
|
+
bodyRowIndex: bodyRowIndex
|
|
102
|
+
}) : detailOptions : null;
|
|
103
|
+
}
|
|
104
|
+
setRowExpandedChecker(checker) {
|
|
105
|
+
this.isRowExpanded = checker;
|
|
106
|
+
}
|
|
107
|
+
release() {
|
|
108
|
+
this.isRowExpanded = () => !1, this.table = null, this.pluginOptions = null;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
exports.ConfigManager = ConfigManager;
|
|
113
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/master-detail-plugin/config.ts"],"names":[],"mappings":"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","file":"config.js","sourcesContent":["import * as VTable from '@visactor/vtable';\r\nimport type { DetailTableOptions, MasterDetailPluginOptions } from './types';\r\n\r\n/**\r\n * 配置注入相关功能\r\n */\r\nexport class ConfigManager {\r\n constructor(private pluginOptions: MasterDetailPluginOptions, private table: VTable.ListTable) {}\r\n\r\n /**\r\n * 检查记录是否有子数据\r\n */\r\n private hasChildren(record: unknown): boolean {\r\n if (record && typeof record === 'object' && 'children' in record) {\r\n const children = record.children;\r\n return Array.isArray(children) && children.length > 0;\r\n }\r\n return false;\r\n }\r\n\r\n /**\r\n * 注入主从表配置到表格选项中\r\n */\r\n injectMasterDetailOptions(options: VTable.ListTableConstructorOptions): void {\r\n // 启用主从表基础设施\r\n (options as VTable.ListTableConstructorOptions & { masterDetail: boolean }).masterDetail = true;\r\n if (!options.customConfig) {\r\n options.customConfig = {};\r\n }\r\n // 确保滚动事件始终触发,用于子表位置同步\r\n options.customConfig.scrollEventAlwaysTrigger = true;\r\n const originalCustomComputeRowHeight = options.customComputeRowHeight;\r\n // 这个customComputeRowHeight用来保持展开行的高度\r\n options.customComputeRowHeight = params => {\r\n const { row, table } = params;\r\n if (this.isRowExpanded(row)) {\r\n const expandedHeight = table.getRowHeight(row);\r\n if (Array.isArray(expandedHeight)) {\r\n return expandedHeight[0] ?? 'auto';\r\n }\r\n return expandedHeight as number | 'auto';\r\n }\r\n if (originalCustomComputeRowHeight) {\r\n const userResult = originalCustomComputeRowHeight(params);\r\n if (userResult !== undefined && userResult !== null) {\r\n return userResult;\r\n }\r\n }\r\n };\r\n\r\n // 设置第一列为树形结构,是为什么方便getHierarchyState等的判断,他们需要有tree的配置,这不会导致主从表变为tree的状态,因为在_setRecords的时候会直接强制设置为grid\r\n if (options.columns && options.columns.length > 0) {\r\n const firstColumn = options.columns[0] as VTable.TYPES.ColumnDefine;\r\n firstColumn.tree = true;\r\n }\r\n\r\n // 监听表格初始化完成事件,设置图标\r\n this.setupInitializedListener();\r\n\r\n // 注入子表配置\r\n if (this.pluginOptions.detailTableOptions) {\r\n const detailOptions = this.pluginOptions.detailTableOptions;\r\n // 判断是静态配置还是动态函数\r\n if (typeof detailOptions === 'function') {\r\n // 动态配置:根据数据和行索引返回不同的子表配置\r\n (\r\n options as VTable.ListTableConstructorOptions & {\r\n getDetailGridOptions: (params: { data: unknown; bodyRowIndex: number }) => DetailTableOptions;\r\n }\r\n ).getDetailGridOptions = detailOptions;\r\n } else {\r\n // 静态配置:所有子表使用相同配置\r\n (\r\n options as VTable.ListTableConstructorOptions & { detailTableOptions: DetailTableOptions }\r\n ).detailTableOptions = detailOptions;\r\n }\r\n }\r\n // 禁用 _refreshHierarchyState 方法\r\n this.disableRefreshHierarchyState();\r\n }\r\n\r\n /**\r\n * 获取数据数量\r\n */\r\n private getDataCount(): number {\r\n if (this.table.pagination) {\r\n return this.table.dataSource?.currentPagerIndexedData?.length ?? 0;\r\n }\r\n return this.table.dataSource?.sourceLength ?? 0;\r\n }\r\n\r\n /**\r\n * 禁用VTable的_refreshHierarchyState方法\r\n */\r\n private disableRefreshHierarchyState(): void {\r\n // 延迟执行,确保表格已经创建完成\r\n setTimeout(() => {\r\n const tableWithPrivateMethod = this.table as unknown as {\r\n _refreshHierarchyState?: () => void;\r\n _originalRefreshHierarchyState?: () => void;\r\n };\r\n if (tableWithPrivateMethod && typeof tableWithPrivateMethod._refreshHierarchyState === 'function') {\r\n tableWithPrivateMethod._originalRefreshHierarchyState = tableWithPrivateMethod._refreshHierarchyState;\r\n tableWithPrivateMethod._refreshHierarchyState = () => {\r\n // 禁用_refreshHierarchyState函数\r\n };\r\n }\r\n }, 0);\r\n }\r\n\r\n /**\r\n * 处理图标的显示\r\n */\r\n private setupInitializedListener(): void {\r\n // 监听表格初始化完成事件\r\n this.table.on('initialized', () => {\r\n const records = this.table.dataSource.records;\r\n this.processRecordsHierarchyStates(records);\r\n this.table.renderWithRecreateCells();\r\n });\r\n }\r\n\r\n /**\r\n * 处理图标的显示\r\n */\r\n private processRecordsHierarchyStates(records: unknown[]): void {\r\n const HierarchyState = VTable.TYPES.HierarchyState;\r\n const processRecords = (recordList: unknown[]) => {\r\n recordList.forEach(record => {\r\n if (record && typeof record === 'object') {\r\n const recordObj = record as Record<string, unknown>;\r\n // 处理普通的有子数据的记录\r\n if (this.hasChildren(record)) {\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n } else if (recordObj.children === true) {\r\n recordObj.hierarchyState = HierarchyState.collapse;\r\n }\r\n }\r\n });\r\n };\r\n processRecords(records);\r\n }\r\n\r\n /**\r\n * 获取详情配置\r\n */\r\n getDetailConfigForRecord(record: unknown, bodyRowIndex: number): DetailTableOptions | null {\r\n const detailOptions = this.pluginOptions.detailTableOptions;\r\n if (!detailOptions) {\r\n return null;\r\n }\r\n // 判断是函数还是静态配置\r\n if (typeof detailOptions === 'function') {\r\n return detailOptions({ data: record, bodyRowIndex: bodyRowIndex });\r\n }\r\n return detailOptions;\r\n }\r\n\r\n private isRowExpanded: (row: number) => boolean = () => false;\r\n\r\n /**\r\n * 设置行展开状态检查函数\r\n */\r\n setRowExpandedChecker(checker: (row: number) => boolean): void {\r\n this.isRowExpanded = checker;\r\n }\r\n\r\n /**\r\n * 释放所有资源和引用\r\n */\r\n release(): void {\r\n this.isRowExpanded = () => false;\r\n // 清理对表格的引用\r\n (this as unknown as { table: VTable.ListTable | null }).table = null;\r\n (this as unknown as { pluginOptions: MasterDetailPluginOptions | null }).pluginOptions = null;\r\n }\r\n}\r\n"]}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as VTable from '@visactor/vtable';
|
|
2
|
+
import type { MasterDetailPluginOptions } from './types';
|
|
3
|
+
export declare class MasterDetailPlugin implements VTable.plugins.IVTablePlugin {
|
|
4
|
+
id: string;
|
|
5
|
+
name: string;
|
|
6
|
+
runTime: ("sort_click" | "after_sort" | "before_init" | "initialized" | "after_update_cell_content_width" | "after_update_select_border_height")[];
|
|
7
|
+
pluginOptions: MasterDetailPluginOptions;
|
|
8
|
+
table: VTable.ListTable;
|
|
9
|
+
private configManager;
|
|
10
|
+
private eventManager;
|
|
11
|
+
private subTableManager;
|
|
12
|
+
private tableAPIExtensions;
|
|
13
|
+
private resizeObserver?;
|
|
14
|
+
private checkboxCascadeCleanup;
|
|
15
|
+
constructor(pluginOptions?: MasterDetailPluginOptions);
|
|
16
|
+
run(...args: unknown[]): boolean | void;
|
|
17
|
+
private initializeManagers;
|
|
18
|
+
private setupMasterDetailFeatures;
|
|
19
|
+
private mainTableClickHandler?;
|
|
20
|
+
private setupUnifiedSelectionManagement;
|
|
21
|
+
private initCheckboxCascade;
|
|
22
|
+
private initInternalProps;
|
|
23
|
+
private extendTableAPI;
|
|
24
|
+
private updateOriginalHeightsAfterAdaptive;
|
|
25
|
+
private restoreExpandedStatesAfter;
|
|
26
|
+
expandRow(rowIndex: number, colIndex?: number): void;
|
|
27
|
+
collapseRow(rowIndex: number, colIndex?: number): void;
|
|
28
|
+
private collapseRowToNoRealRecordIndex;
|
|
29
|
+
toggleRowExpand(rowIndex: number, colIndex?: number): void;
|
|
30
|
+
private updateRowHeightForExpand;
|
|
31
|
+
private drawUnderlineForRow;
|
|
32
|
+
private getRowCells;
|
|
33
|
+
private addUnderlineToCell;
|
|
34
|
+
private removeUnderlineFromRow;
|
|
35
|
+
private removeUnderlineFromCell;
|
|
36
|
+
private refreshRowIcon;
|
|
37
|
+
update(): void;
|
|
38
|
+
setRecordChildren(children: unknown[], col: number, row: number): void;
|
|
39
|
+
release(): void;
|
|
40
|
+
private clearAllSubTableVisibleSelections;
|
|
41
|
+
getAllSubTableInstances(): Map<number, VTable.ListTable> | null;
|
|
42
|
+
getSubTableByRowIndex(rowIndex: number): VTable.ListTable | null;
|
|
43
|
+
getSubTableByBodyRowIndex(bodyRowIndex: number): VTable.ListTable | null;
|
|
44
|
+
filterSubTables(predicate: (bodyRowIndex: number, subTable: VTable.ListTable, record?: unknown) => boolean): Array<{
|
|
45
|
+
bodyRowIndex: number;
|
|
46
|
+
subTable: VTable.ListTable;
|
|
47
|
+
record?: unknown;
|
|
48
|
+
}>;
|
|
49
|
+
private cleanupMasterDetailFeatures;
|
|
50
|
+
}
|