@visactor/vtable-plugins 1.19.9-alpha.2 → 1.20.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (268) hide show
  1. package/README.md +7 -4
  2. package/cjs/add-row-column.d.ts +2 -2
  3. package/cjs/add-row-column.js +3 -3
  4. package/cjs/add-row-column.js.map +1 -1
  5. package/cjs/auto-fill/auto-fill-helper.d.ts +23 -0
  6. package/cjs/auto-fill/auto-fill-helper.js +83 -0
  7. package/cjs/auto-fill/auto-fill-helper.js.map +1 -0
  8. package/cjs/auto-fill/auto-fill-manager.d.ts +26 -0
  9. package/cjs/auto-fill/auto-fill-manager.js +244 -0
  10. package/cjs/auto-fill/auto-fill-manager.js.map +1 -0
  11. package/cjs/auto-fill/auto-fill-services.d.ts +12 -0
  12. package/cjs/auto-fill/auto-fill-services.js +27 -0
  13. package/cjs/auto-fill/auto-fill-services.js.map +1 -0
  14. package/cjs/auto-fill/date-tools.d.ts +5 -0
  15. package/cjs/auto-fill/date-tools.js +37 -0
  16. package/cjs/auto-fill/date-tools.js.map +1 -0
  17. package/cjs/auto-fill/index.d.ts +21 -0
  18. package/cjs/auto-fill/index.js +52 -0
  19. package/cjs/auto-fill/index.js.map +1 -0
  20. package/cjs/auto-fill/rules.d.ts +10 -0
  21. package/cjs/auto-fill/rules.js +196 -0
  22. package/cjs/auto-fill/rules.js.map +1 -0
  23. package/cjs/auto-fill/series-converters.d.ts +27 -0
  24. package/cjs/auto-fill/series-converters.js +90 -0
  25. package/cjs/auto-fill/series-converters.js.map +1 -0
  26. package/cjs/auto-fill/types.d.ts +67 -0
  27. package/cjs/auto-fill/types.js +20 -0
  28. package/cjs/auto-fill/types.js.map +1 -0
  29. package/cjs/auto-fill/utils/date.d.ts +5 -0
  30. package/cjs/auto-fill/utils/date.js +76 -0
  31. package/cjs/auto-fill/utils/date.js.map +1 -0
  32. package/cjs/auto-fill/utils/fill.d.ts +82 -0
  33. package/cjs/auto-fill/utils/fill.js +361 -0
  34. package/cjs/auto-fill/utils/fill.js.map +1 -0
  35. package/cjs/carousel-animation.d.ts +1 -1
  36. package/cjs/carousel-animation.js.map +1 -1
  37. package/cjs/column-series.js +1 -1
  38. package/cjs/column-series.js.map +1 -1
  39. package/cjs/context-menu.d.ts +34 -0
  40. package/cjs/context-menu.js +157 -0
  41. package/cjs/context-menu.js.map +1 -0
  42. package/cjs/contextmenu/handle-menu-helper.d.ts +23 -0
  43. package/cjs/contextmenu/handle-menu-helper.js +107 -0
  44. package/cjs/contextmenu/handle-menu-helper.js.map +1 -0
  45. package/cjs/contextmenu/index.d.ts +3 -0
  46. package/cjs/contextmenu/index.js +22 -0
  47. package/cjs/contextmenu/index.js.map +1 -0
  48. package/cjs/contextmenu/menu-manager.d.ts +27 -0
  49. package/cjs/contextmenu/menu-manager.js +139 -0
  50. package/cjs/contextmenu/menu-manager.js.map +1 -0
  51. package/cjs/contextmenu/styles.d.ts +106 -0
  52. package/cjs/contextmenu/styles.js +195 -0
  53. package/cjs/contextmenu/styles.js.map +1 -0
  54. package/cjs/contextmenu/types.d.ts +69 -0
  55. package/cjs/contextmenu/types.js +122 -0
  56. package/cjs/contextmenu/types.js.map +1 -0
  57. package/cjs/excel-edit-cell-keyboard.js +2 -2
  58. package/cjs/excel-edit-cell-keyboard.js.map +1 -1
  59. package/cjs/excel-import.js +8 -8
  60. package/cjs/excel-import.js.map +1 -1
  61. package/cjs/fillHandleUtils/autoFillHandle.js.map +1 -1
  62. package/cjs/fillHandleUtils/translateRowObj.js.map +1 -1
  63. package/cjs/filter/condition-filter.d.ts +30 -0
  64. package/cjs/filter/condition-filter.js +271 -0
  65. package/cjs/filter/condition-filter.js.map +1 -0
  66. package/cjs/filter/filter-engine.d.ts +13 -0
  67. package/cjs/filter/filter-engine.js +102 -0
  68. package/cjs/filter/filter-engine.js.map +1 -0
  69. package/cjs/filter/filter-state-manager.d.ts +21 -0
  70. package/cjs/filter/filter-state-manager.js +102 -0
  71. package/cjs/filter/filter-state-manager.js.map +1 -0
  72. package/cjs/filter/filter-toolbar.d.ts +31 -0
  73. package/cjs/filter/filter-toolbar.js +98 -0
  74. package/cjs/filter/filter-toolbar.js.map +1 -0
  75. package/cjs/filter/filter.d.ts +26 -0
  76. package/cjs/filter/filter.js +150 -0
  77. package/cjs/filter/filter.js.map +1 -0
  78. package/cjs/filter/index.d.ts +7 -0
  79. package/cjs/filter/index.js +66 -0
  80. package/cjs/filter/index.js.map +1 -0
  81. package/cjs/filter/styles.d.ts +126 -0
  82. package/cjs/filter/styles.js +145 -0
  83. package/cjs/filter/styles.js.map +1 -0
  84. package/cjs/filter/types.d.ts +55 -0
  85. package/cjs/filter/types.js +18 -0
  86. package/cjs/filter/types.js.map +1 -0
  87. package/cjs/filter/value-filter.d.ts +31 -0
  88. package/cjs/filter/value-filter.js +280 -0
  89. package/cjs/filter/value-filter.js.map +1 -0
  90. package/cjs/focus-highlight.js +1 -1
  91. package/cjs/focus-highlight.js.map +1 -1
  92. package/cjs/gantt-export-image.js.map +1 -1
  93. package/cjs/header-highlight.js.map +1 -1
  94. package/cjs/highlight-header-when-select-cell.d.ts +1 -2
  95. package/cjs/highlight-header-when-select-cell.js +1 -1
  96. package/cjs/highlight-header-when-select-cell.js.map +1 -1
  97. package/cjs/index.d.ts +4 -0
  98. package/cjs/index.js +3 -1
  99. package/cjs/index.js.map +1 -1
  100. package/cjs/invert-highlight.js.map +1 -1
  101. package/cjs/paste-add-row-column.d.ts +1 -0
  102. package/cjs/paste-add-row-column.js +3 -2
  103. package/cjs/paste-add-row-column.js.map +1 -1
  104. package/cjs/rotate-table.js +1 -1
  105. package/cjs/rotate-table.js.map +1 -1
  106. package/cjs/row-series.js +1 -1
  107. package/cjs/row-series.js.map +1 -1
  108. package/cjs/table-carousel-animation.js +2 -3
  109. package/cjs/table-carousel-animation.js.map +1 -1
  110. package/cjs/table-export/csv/index.js +1 -1
  111. package/cjs/table-export/csv/index.js.map +1 -1
  112. package/cjs/table-export/excel/index.js +0 -1
  113. package/cjs/table-export/excel/index.js.map +1 -1
  114. package/cjs/table-export/excel/style.js.map +1 -1
  115. package/cjs/table-export/index.js.map +1 -1
  116. package/cjs/table-export/util/color.js.map +1 -1
  117. package/cjs/table-export/util/download.js.map +1 -1
  118. package/cjs/table-export/util/encode.js.map +1 -1
  119. package/cjs/table-export/util/indent.js.map +1 -1
  120. package/cjs/table-export/util/pagination.js.map +1 -1
  121. package/cjs/table-export/util/promise.js.map +1 -1
  122. package/cjs/table-export/util/type.js +1 -1
  123. package/cjs/table-export/util/type.js.map +1 -1
  124. package/cjs/table-export.js +1 -2
  125. package/cjs/table-export.js.map +1 -1
  126. package/cjs/table-series-number.d.ts +41 -0
  127. package/cjs/table-series-number.js +261 -0
  128. package/cjs/table-series-number.js.map +1 -0
  129. package/cjs/types.d.ts +1 -0
  130. package/cjs/types.js +17 -1
  131. package/cjs/types.js.map +1 -1
  132. package/cjs/wps-fill-handle.js +1 -1
  133. package/cjs/wps-fill-handle.js.map +1 -1
  134. package/dist/vtable-plugins.js +7594 -1492
  135. package/dist/vtable-plugins.min.js +14 -14
  136. package/es/add-row-column.d.ts +2 -2
  137. package/es/add-row-column.js +3 -3
  138. package/es/add-row-column.js.map +1 -1
  139. package/es/auto-fill/auto-fill-helper.d.ts +23 -0
  140. package/es/auto-fill/auto-fill-helper.js +75 -0
  141. package/es/auto-fill/auto-fill-helper.js.map +1 -0
  142. package/es/auto-fill/auto-fill-manager.d.ts +26 -0
  143. package/es/auto-fill/auto-fill-manager.js +218 -0
  144. package/es/auto-fill/auto-fill-manager.js.map +1 -0
  145. package/es/auto-fill/auto-fill-services.d.ts +12 -0
  146. package/es/auto-fill/auto-fill-services.js +19 -0
  147. package/es/auto-fill/auto-fill-services.js.map +1 -0
  148. package/es/auto-fill/date-tools.d.ts +5 -0
  149. package/es/auto-fill/date-tools.js +29 -0
  150. package/es/auto-fill/date-tools.js.map +1 -0
  151. package/es/auto-fill/index.d.ts +21 -0
  152. package/es/auto-fill/index.js +21 -0
  153. package/es/auto-fill/index.js.map +1 -0
  154. package/es/auto-fill/rules.d.ts +10 -0
  155. package/es/auto-fill/rules.js +203 -0
  156. package/es/auto-fill/rules.js.map +1 -0
  157. package/es/auto-fill/series-converters.d.ts +27 -0
  158. package/es/auto-fill/series-converters.js +83 -0
  159. package/es/auto-fill/series-converters.js.map +1 -0
  160. package/es/auto-fill/types.d.ts +67 -0
  161. package/es/auto-fill/types.js +27 -0
  162. package/es/auto-fill/types.js.map +1 -0
  163. package/es/auto-fill/utils/date.d.ts +5 -0
  164. package/es/auto-fill/utils/date.js +68 -0
  165. package/es/auto-fill/utils/date.js.map +1 -0
  166. package/es/auto-fill/utils/fill.d.ts +82 -0
  167. package/es/auto-fill/utils/fill.js +347 -0
  168. package/es/auto-fill/utils/fill.js.map +1 -0
  169. package/es/carousel-animation.d.ts +1 -1
  170. package/es/carousel-animation.js.map +1 -1
  171. package/es/column-series.js +1 -1
  172. package/es/column-series.js.map +1 -1
  173. package/es/context-menu.d.ts +34 -0
  174. package/es/context-menu.js +129 -0
  175. package/es/context-menu.js.map +1 -0
  176. package/es/contextmenu/handle-menu-helper.d.ts +23 -0
  177. package/es/contextmenu/handle-menu-helper.js +99 -0
  178. package/es/contextmenu/handle-menu-helper.js.map +1 -0
  179. package/es/contextmenu/index.d.ts +3 -0
  180. package/es/contextmenu/index.js +6 -0
  181. package/es/contextmenu/index.js.map +1 -0
  182. package/es/contextmenu/menu-manager.d.ts +27 -0
  183. package/es/contextmenu/menu-manager.js +130 -0
  184. package/es/contextmenu/menu-manager.js.map +1 -0
  185. package/es/contextmenu/styles.d.ts +106 -0
  186. package/es/contextmenu/styles.js +197 -0
  187. package/es/contextmenu/styles.js.map +1 -0
  188. package/es/contextmenu/types.d.ts +69 -0
  189. package/es/contextmenu/types.js +121 -0
  190. package/es/contextmenu/types.js.map +1 -0
  191. package/es/excel-edit-cell-keyboard.js +2 -2
  192. package/es/excel-edit-cell-keyboard.js.map +1 -1
  193. package/es/excel-import.js +8 -8
  194. package/es/excel-import.js.map +1 -1
  195. package/es/fillHandleUtils/autoFillHandle.js.map +1 -1
  196. package/es/fillHandleUtils/translateRowObj.js.map +1 -1
  197. package/es/filter/condition-filter.d.ts +30 -0
  198. package/es/filter/condition-filter.js +262 -0
  199. package/es/filter/condition-filter.js.map +1 -0
  200. package/es/filter/filter-engine.d.ts +13 -0
  201. package/es/filter/filter-engine.js +94 -0
  202. package/es/filter/filter-engine.js.map +1 -0
  203. package/es/filter/filter-state-manager.d.ts +21 -0
  204. package/es/filter/filter-state-manager.js +94 -0
  205. package/es/filter/filter-state-manager.js.map +1 -0
  206. package/es/filter/filter-toolbar.d.ts +31 -0
  207. package/es/filter/filter-toolbar.js +90 -0
  208. package/es/filter/filter-toolbar.js.map +1 -0
  209. package/es/filter/filter.d.ts +26 -0
  210. package/es/filter/filter.js +125 -0
  211. package/es/filter/filter.js.map +1 -0
  212. package/es/filter/index.d.ts +7 -0
  213. package/es/filter/index.js +14 -0
  214. package/es/filter/index.js.map +1 -0
  215. package/es/filter/styles.d.ts +126 -0
  216. package/es/filter/styles.js +140 -0
  217. package/es/filter/styles.js.map +1 -0
  218. package/es/filter/types.d.ts +55 -0
  219. package/es/filter/types.js +17 -0
  220. package/es/filter/types.js.map +1 -0
  221. package/es/filter/value-filter.d.ts +31 -0
  222. package/es/filter/value-filter.js +275 -0
  223. package/es/filter/value-filter.js.map +1 -0
  224. package/es/focus-highlight.js +1 -1
  225. package/es/focus-highlight.js.map +1 -1
  226. package/es/gantt-export-image.js.map +1 -1
  227. package/es/header-highlight.js.map +1 -1
  228. package/es/highlight-header-when-select-cell.d.ts +1 -2
  229. package/es/highlight-header-when-select-cell.js +1 -1
  230. package/es/highlight-header-when-select-cell.js.map +1 -1
  231. package/es/index.d.ts +4 -0
  232. package/es/index.js +8 -0
  233. package/es/index.js.map +1 -1
  234. package/es/invert-highlight.js.map +1 -1
  235. package/es/paste-add-row-column.d.ts +1 -0
  236. package/es/paste-add-row-column.js +3 -2
  237. package/es/paste-add-row-column.js.map +1 -1
  238. package/es/rotate-table.js +1 -1
  239. package/es/rotate-table.js.map +1 -1
  240. package/es/row-series.js +1 -1
  241. package/es/row-series.js.map +1 -1
  242. package/es/table-carousel-animation.js +3 -3
  243. package/es/table-carousel-animation.js.map +1 -1
  244. package/es/table-export/csv/index.js +1 -1
  245. package/es/table-export/csv/index.js.map +1 -1
  246. package/es/table-export/excel/index.js +1 -2
  247. package/es/table-export/excel/index.js.map +1 -1
  248. package/es/table-export/excel/style.js.map +1 -1
  249. package/es/table-export/index.js.map +1 -1
  250. package/es/table-export/util/color.js.map +1 -1
  251. package/es/table-export/util/download.js.map +1 -1
  252. package/es/table-export/util/encode.js.map +1 -1
  253. package/es/table-export/util/indent.js.map +1 -1
  254. package/es/table-export/util/pagination.js.map +1 -1
  255. package/es/table-export/util/promise.js.map +1 -1
  256. package/es/table-export/util/type.js +1 -1
  257. package/es/table-export/util/type.js.map +1 -1
  258. package/es/table-export.js +1 -2
  259. package/es/table-export.js.map +1 -1
  260. package/es/table-series-number.d.ts +41 -0
  261. package/es/table-series-number.js +253 -0
  262. package/es/table-series-number.js.map +1 -0
  263. package/es/types.d.ts +1 -0
  264. package/es/types.js +2 -1
  265. package/es/types.js.map +1 -1
  266. package/es/wps-fill-handle.js +1 -1
  267. package/es/wps-fill-handle.js.map +1 -1
  268. package/package.json +8 -8
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/auto-fill-manager.ts"],"names":[],"mappings":"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","file":"auto-fill-manager.js","sourcesContent":["/**\n * Copyright 2023-present DreamNum Co., Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Direction, APPLY_TYPE, CellValueType } from './types';\nimport type {\n ISourceDataPiece,\n ICellData,\n Nullable,\n IRuleConfirmedData,\n IDiscreteRange,\n IAutoFillLocation\n} from './types';\nimport { AutoFillService } from './auto-fill-services';\nimport { otherRule } from './rules';\nimport { fillCopy, getDataIndex, getLenS } from './utils/fill';\nimport type { ICopyDataInType } from './utils/fill';\nimport type { APPLY_FUNCTIONS } from './types';\nimport type { CellRange } from '@visactor/vtable/es/ts-types/table-engine';\nimport type { ListTable } from '@visactor/vtable';\nimport * as VTable from '@visactor/vtable';\nimport {\n getSelectedRangeArray,\n getTargetRange,\n openAutoFillMenu,\n getCellMatrix,\n isMergeCell\n} from './auto-fill-helper';\nimport type { IAutoFillPluginOptions } from '.';\nimport { InteractionState } from '@visactor/vtable/es/ts-types';\nexport class AutoFillManager {\n // 源数据\n private sourceData: ISourceDataPiece[] = [];\n // autoFillService 维护规则列表\n private autoFillService: AutoFillService;\n // 表格实例\n private tableInstance: ListTable;\n // 源范围\n private sourceRange: IDiscreteRange;\n // 目标范围\n private targetRange: IDiscreteRange;\n // 填充方向\n private direction: Direction;\n // 行列头\n private headers: {\n row: Set<number>;\n col: Set<number>;\n };\n\n private options?: IAutoFillPluginOptions;\n\n constructor(options?: IAutoFillPluginOptions) {\n this.options = options;\n this.autoFillService = new AutoFillService();\n }\n\n setTable(table: ListTable) {\n this.headers = {\n row: new Set(),\n col: new Set()\n };\n this.tableInstance = table;\n table.on(VTable.TABLE_EVENT_TYPE.DROPDOWN_MENU_CLICK, (args: any) => {\n if (args.text === '复制填充') {\n this.fillData(APPLY_TYPE.COPY);\n } else if (args.text === '序列填充') {\n this.fillData(APPLY_TYPE.SERIES);\n }\n });\n\n //cal headers\n const rowHeaderCells = this.tableInstance.getAllRowHeaderCells()[0];\n if (rowHeaderCells) {\n rowHeaderCells.forEach(cell => {\n this.headers.col.add(cell.col);\n });\n }\n const colHeaderCells = this.tableInstance.getAllColumnHeaderCells()[0];\n if (colHeaderCells) {\n colHeaderCells.forEach(cell => {\n this.headers.row.add(cell.row);\n });\n }\n }\n\n // 开始拖拽\n handleStartDrag(selectedRange: CellRange) {\n this.sourceRange = getSelectedRangeArray(selectedRange);\n this.sourceRange.cols = this.sourceRange.cols.filter(col => !this.headers.col.has(col));\n this.sourceRange.rows = this.sourceRange.rows.filter(row => !this.headers.row.has(row));\n }\n // 结束拖拽\n handleEndDrag(endSelectCellRange: CellRange, direction: string) {\n // set direction\n this.direction = direction as Direction;\n // set target range\n const selectedRange = getSelectedRangeArray(endSelectCellRange);\n this.targetRange = getTargetRange(this.direction, this.sourceRange, selectedRange);\n this.targetRange.cols = this.targetRange.cols.filter(col => !this.headers.col.has(col));\n this.targetRange.rows = this.targetRange.rows.filter(row => !this.headers.row.has(row));\n // open auto fill menu\n if (!this.options?.fillMode) {\n openAutoFillMenu(this.tableInstance, Math.max(...selectedRange.cols), Math.max(...selectedRange.rows));\n } else {\n this.fillData(this.options.fillMode as APPLY_TYPE);\n }\n }\n\n handleDbClick() {\n if (!this.sourceRange) {\n return;\n }\n this.direction = Direction.DOWN;\n // 双击填充时,自动检测填充范围\n const detectFillRange = getSelectedRangeArray(this._detectFillRange());\n this.targetRange = getTargetRange(this.direction, this.sourceRange, detectFillRange);\n this.targetRange.cols = this.targetRange.cols.filter(col => !this.headers.col.has(col));\n this.targetRange.rows = this.targetRange.rows.filter(row => !this.headers.row.has(row));\n if (this.targetRange.cols.length === 0 || this.targetRange.rows.length === 0) {\n return;\n }\n const startCol = this.sourceRange.cols[0];\n const startRow = this.sourceRange.rows[0];\n const endCol = this.targetRange.cols[this.targetRange.cols.length - 1];\n const endRow = this.targetRange.rows[this.targetRange.rows.length - 1];\n // 更新选区\n const stateManager = this.tableInstance.stateManager;\n stateManager.updateSelectPos(startCol, startRow, false, false, false, true, true);\n stateManager.updateInteractionState(InteractionState.grabing);\n stateManager.updateSelectPos(endCol, endRow, false, false, false, true, true);\n stateManager.endSelectCells(false, false);\n stateManager.updateInteractionState(InteractionState.default);\n // 快速填充\n if (!this.options?.fastFillMode) {\n // 打开自动填充菜单\n openAutoFillMenu(this.tableInstance, endCol, endRow);\n } else {\n this.fillData(this.options.fastFillMode as APPLY_TYPE);\n }\n }\n\n /**\n * 填充数据\n * @param applyType - 填充类型\n */\n fillData(applyType: APPLY_TYPE) {\n console.log('fill data applyType', applyType);\n // 获取源数据\n this.sourceData = this.getSourceData(this.sourceRange, this.direction);\n const location = {\n source: this.sourceRange,\n target: this.targetRange\n };\n\n // 填充数据\n this._fillData(location, this.direction, applyType);\n }\n /**\n * 获取源数据\n * @param source - 源范围\n * @param direction - 方向\n * @returns 源数据\n */\n private getSourceData(source: IDiscreteRange, direction: Direction) {\n const rules = this.autoFillService.getRules();\n const sourceData: ISourceDataPiece[] = [];\n const isVertical = direction === Direction.DOWN || direction === Direction.UP;\n let aArray: number[];\n let bArray: number[];\n if (isVertical) {\n aArray = source.cols;\n bArray = source.rows;\n } else {\n aArray = source.rows;\n bArray = source.cols;\n }\n const matrix = getCellMatrix(this.tableInstance);\n // 按照行或列将源数据分成多个片段,获取单元格数据\n aArray.forEach(a => {\n const sourceDataPiece = this.getEmptySourceDataPiece();\n const prevData: IRuleConfirmedData = {\n type: undefined,\n cellData: undefined\n };\n bArray.forEach(b => {\n let data: Nullable<ICellData>;\n if (isVertical) {\n data = matrix.getValue(b, a);\n } else {\n data = matrix.getValue(a, b);\n }\n // find rules to match data\n const { type, isContinue } = rules.find(r => r.match(data, null)) || otherRule;\n if (isContinue(prevData, data)) {\n const typeInfo = sourceDataPiece[type];\n\n const last = typeInfo![typeInfo!.length - 1];\n last.data.push(data);\n last.index.push(b - bArray[0]);\n } else {\n const typeInfo = sourceDataPiece[type];\n if (typeInfo) {\n typeInfo.push({\n data: [data],\n index: [b - bArray[0]]\n });\n } else {\n sourceDataPiece[type] = [\n {\n data: [data],\n index: [b - bArray[0]]\n }\n ];\n }\n }\n prevData.type = type;\n prevData.cellData = data;\n });\n sourceData.push(sourceDataPiece);\n });\n return sourceData;\n }\n /**\n * 获取空的片段数据对象\n * @returns 空的片段数据对象\n */\n private getEmptySourceDataPiece() {\n const sourceDataPiece: ISourceDataPiece = {};\n this.autoFillService.getRules().forEach(r => {\n sourceDataPiece[r.type] = [];\n });\n\n return sourceDataPiece;\n }\n /**\n * 快速填充检测填充范围\n * @returns 填充范围\n */\n private _detectFillRange() {\n // sourceRange\n const start = { row: Math.min(...this.sourceRange.rows), col: Math.min(...this.sourceRange.cols) };\n const end = { row: Math.max(...this.sourceRange.rows), col: Math.max(...this.sourceRange.cols) };\n // matrix\n const matrix = getCellMatrix(this.tableInstance);\n const maxRow = matrix.getMaxRows();\n const maxColumn = matrix.getMaxColumns();\n let detectEndRow = end.row;\n // left column first, or consider right column.\n if (start.col > 0 && matrix.getValue(start.row, start.col - 1)?.v) {\n let cur = start.row;\n while (matrix.getValue(cur, start.col - 1)?.v && cur <= maxRow) {\n cur += 1;\n }\n detectEndRow = cur - 1;\n } else if (end.col < maxColumn && matrix.getValue(end.row, end.col + 1)?.v) {\n let cur = start.row;\n while (matrix.getValue(cur, end.col + 1)?.v && cur <= maxRow) {\n cur += 1;\n }\n detectEndRow = cur - 1;\n }\n for (let i = end.row + 1; i <= detectEndRow; i++) {\n for (let j = start.col; j <= end.col; j++) {\n if (matrix.getValue(i, j)?.v) {\n detectEndRow = i - 1;\n break;\n }\n }\n }\n return {\n start: { row: start.row, col: start.col },\n end: { row: detectEndRow, col: end.col }\n };\n }\n\n /**\n * 填充数据\n * @param location - 位置\n * @param direction - 方向\n * @param applyType - 填充类型\n */\n private _fillData(location: IAutoFillLocation, direction: Direction, applyType: APPLY_TYPE) {\n const { source, target } = location;\n if (!source || !target || direction == null) {\n return;\n }\n\n const { cols: targetCols, rows: targetRows } = target;\n const { cols: sourceCols, rows: sourceRows } = source;\n\n const sourceData = this.sourceData;\n\n let csLen;\n if (direction === Direction.DOWN || direction === Direction.UP) {\n csLen = sourceRows.length;\n } else {\n csLen = sourceCols.length;\n }\n\n const applyDatas: Array<Array<Nullable<ICellData>>> = [];\n\n if (direction === Direction.DOWN || direction === Direction.UP) {\n const asLen = targetRows.length;\n const untransformedApplyDatas: Nullable<ICellData>[][] = [];\n targetCols.forEach((_, i) => {\n const copyD = sourceData[i];\n const applyData = this.getApplyData(copyD, csLen, asLen, direction, applyType, location);\n untransformedApplyDatas.push(applyData);\n });\n for (let i = 0; i < untransformedApplyDatas[0].length; i++) {\n const row: Array<Nullable<ICellData>> = [];\n for (let j = 0; j < untransformedApplyDatas.length; j++) {\n row.push({\n s: null,\n ...untransformedApplyDatas[j][i]\n });\n }\n applyDatas.push(row);\n }\n } else {\n const asLen = targetCols.length;\n targetRows.forEach((_, i) => {\n const copyD = sourceData[i];\n const applyData = this.getApplyData(copyD, csLen, asLen, direction, applyType, location);\n const row: Array<Nullable<ICellData>> = [];\n for (let j = 0; j < applyData.length; j++) {\n row.push({\n s: null,\n ...applyData[j]\n });\n }\n applyDatas.push(row);\n });\n }\n\n // 获取填充的值\n const values: string[][] = [];\n targetRows.forEach((row, rowIndex) => {\n const rowValues: string[] = [];\n targetCols.forEach((col, colIndex) => {\n // 如果当前单元格是合并单元格,则先进行拆开单元格,再进行填充\n const range = isMergeCell(this.tableInstance, col, row);\n if (range) {\n this.tableInstance.unmergeCells(range.start.col, range.start.row, range.end.col, range.end.row);\n }\n // 填充数据存入rowValues,再一次性填充到表格中\n if (applyDatas[rowIndex][colIndex]) {\n rowValues.push(applyDatas[rowIndex][colIndex]!.v + '');\n }\n });\n values.push(rowValues);\n });\n // 获取填充开始的行和列,设置表格值\n const minRow = Math.min(...targetRows);\n const minCol = Math.min(...targetCols);\n this.tableInstance.changeCellValues(minCol, minRow, values);\n }\n\n /**\n * 根据源数据计算填充数据\n * @param sourceDataPiece - 源数据片段\n * @param csLen - 源长度\n * @param asLen - 目标长度\n * @param direction - 方向\n * @param applyType - 填充类型\n * @param location - 位置\n * @returns 填充数据\n */\n private getApplyData(\n sourceDataPiece: ISourceDataPiece,\n csLen: number,\n asLen: number,\n direction: Direction,\n applyType: APPLY_TYPE,\n location: IAutoFillLocation\n ) {\n const applyData: Array<Nullable<ICellData>> = [];\n const num = Math.floor(asLen / csLen);\n const rsd = asLen % csLen;\n const rules = this.autoFillService.getRules();\n\n const applyDataInTypes: { [key: string]: any[] } = {};\n\n rules.forEach(r => {\n applyDataInTypes[r.type] = [];\n });\n\n // calc cell data to apply\n rules.forEach(r => {\n const { type, applyFunctions: customApplyFunctions = {} } = r;\n const copyDataInType = sourceDataPiece[type];\n if (!copyDataInType) {\n return;\n }\n // copyDataInType is an array of copy-squads in same types\n // a copy-squad is an array of continuous cells that has the same type, e.g. [1, 3, 5] is a copy squad, but [1, 3, ab, 5] will be divided into two copy-squads\n copyDataInType.forEach(copySquad => {\n const s = getLenS(copySquad.index, rsd);\n const len = copySquad.index.length * num + s;\n\n // We do not process cell.custom by default. If the user needs to process it, they can do so in the hook extension.\n const arrData = this.applyFunctions(\n copySquad,\n len,\n direction,\n applyType,\n customApplyFunctions,\n sourceDataPiece,\n location\n );\n\n const arrIndex = getDataIndex(csLen, asLen, copySquad.index);\n applyDataInTypes[type].push({ data: arrData, index: arrIndex });\n });\n });\n\n // calc index\n for (let x = 0; x < asLen; x++) {\n rules.forEach(r => {\n const { type } = r;\n const applyDataInType = applyDataInTypes[type];\n for (let y = 0; y < applyDataInType.length; y++) {\n if (x in applyDataInType[y].index) {\n applyData.push(applyDataInType[y].data[applyDataInType[y].index[x]]);\n }\n }\n });\n }\n\n return applyData;\n }\n /**\n * 根据规则计算填充函数\n * @param copySquad - 复制数据\n * @param len - 长度\n * @param direction - 方向\n * @param applyType - 填充类型\n * @param customApplyFunctions - 自定义应用函数\n * @param sourceDataPiece - 源数据片段\n * @param location - 位置\n * @returns 填充数据\n */\n private applyFunctions(\n copySquad: ICopyDataInType,\n len: number,\n direction: Direction,\n applyType: APPLY_TYPE,\n customApplyFunctions: APPLY_FUNCTIONS,\n sourceDataPiece: ISourceDataPiece,\n location: IAutoFillLocation\n ) {\n const { data } = copySquad;\n const isReverse = direction === Direction.UP || direction === Direction.LEFT;\n\n // 复制填充\n if (applyType === APPLY_TYPE.COPY) {\n const custom = customApplyFunctions?.[APPLY_TYPE.COPY];\n if (custom) {\n return custom(copySquad, len, direction, sourceDataPiece, location);\n }\n isReverse && data.reverse();\n return fillCopy(data, len);\n }\n // 序列填充\n if (applyType === APPLY_TYPE.SERIES) {\n const custom = customApplyFunctions?.[APPLY_TYPE.SERIES];\n if (custom) {\n return custom(copySquad, len, direction, sourceDataPiece);\n }\n isReverse && data.reverse();\n // special rules, if not provide custom SERIES apply functions, will be applied as copy\n if (customApplyFunctions?.[APPLY_TYPE.COPY]) {\n return customApplyFunctions[APPLY_TYPE.COPY](copySquad, len, direction, sourceDataPiece, location);\n }\n return fillCopy(data, len);\n }\n }\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { IAutoFillRule } from './types';
2
+ export interface IAutoFillService {
3
+ getRules: () => IAutoFillRule[];
4
+ registerRule: (rule: IAutoFillRule) => void;
5
+ }
6
+ export declare class AutoFillService implements IAutoFillService {
7
+ private _rules;
8
+ constructor();
9
+ private _init;
10
+ registerRule(rule: IAutoFillRule): void;
11
+ getRules(): IAutoFillRule[];
12
+ }
@@ -0,0 +1,19 @@
1
+ import { dateRule, numberRule, extendNumberRule, chnNumberRule, chnWeek2Rule, chnWeek3Rule, loopSeriesRule, otherRule } from "./rules";
2
+
3
+ export class AutoFillService {
4
+ constructor() {
5
+ this._rules = [], this._init();
6
+ }
7
+ _init() {
8
+ this._rules = [ dateRule, numberRule, extendNumberRule, chnNumberRule, chnWeek2Rule, chnWeek3Rule, loopSeriesRule, otherRule ].sort(((a, b) => b.priority - a.priority));
9
+ }
10
+ registerRule(rule) {
11
+ if (this._rules.find((r => r.type === rule.type))) throw new Error(`Registry rule failed, type '${rule.type}' already exist!`);
12
+ const index = this._rules.findIndex((r => r.priority < rule.priority));
13
+ this._rules.splice(-1 === index ? this._rules.length : index, 0, rule);
14
+ }
15
+ getRules() {
16
+ return this._rules;
17
+ }
18
+ }
19
+ //# sourceMappingURL=auto-fill-services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/auto-fill-services.ts"],"names":[],"mappings":"AAgBA,OAAO,EACL,QAAQ,EACR,UAAU,EACV,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,SAAS,EACV,MAAM,SAAS,CAAC;AAOjB,MAAM,OAAO,eAAe;IAG1B;QAFQ,WAAM,GAAoB,EAAE,CAAC;QAGnC,IAAI,CAAC,KAAK,EAAE,CAAC;IACf,CAAC;IAEO,KAAK;QACX,IAAI,CAAC,MAAM,GAAG;YACZ,QAAQ;YACR,UAAU;YACV,gBAAgB;YAChB,aAAa;YACb,YAAY;YACZ,YAAY;YACZ,cAAc;YACd,SAAS;SACV,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAED,YAAY,CAAC,IAAmB;QAE9B,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,IAAI,kBAAkB,CAAC,CAAC;SAC7E;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QACrE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACzE,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;CACF","file":"auto-fill-services.js","sourcesContent":["/**\n * Copyright 2023-present DreamNum Co., Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport type { IAutoFillRule } from './types';\nimport {\n dateRule,\n numberRule,\n extendNumberRule,\n chnNumberRule,\n chnWeek2Rule,\n chnWeek3Rule,\n loopSeriesRule,\n otherRule\n} from './rules';\n\nexport interface IAutoFillService {\n getRules: () => IAutoFillRule[];\n registerRule: (rule: IAutoFillRule) => void;\n}\n\nexport class AutoFillService implements IAutoFillService {\n private _rules: IAutoFillRule[] = [];\n\n constructor() {\n this._init();\n }\n\n private _init() {\n this._rules = [\n dateRule,\n numberRule,\n extendNumberRule,\n chnNumberRule,\n chnWeek2Rule,\n chnWeek3Rule,\n loopSeriesRule,\n otherRule\n ].sort((a, b) => b.priority - a.priority);\n }\n\n registerRule(rule: IAutoFillRule) {\n // if rule.type is used, console error\n if (this._rules.find(r => r.type === rule.type)) {\n throw new Error(`Registry rule failed, type '${rule.type}' already exist!`);\n }\n // insert rules according to the rule.priority, the higher priority will be inserted at the beginning of the array\n const index = this._rules.findIndex(r => r.priority < rule.priority);\n this._rules.splice(index === -1 ? this._rules.length : index, 0, rule);\n }\n\n getRules() {\n return this._rules;\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare function isValid(date: Date): boolean;
2
+ export declare function differenceInDays(dateLeft: Date, dateRight: Date): number;
3
+ export declare function addDays(date: Date, amount: number): Date;
4
+ export declare function parse(dateString: string, format: string, referenceDate?: Date): Date;
5
+ export declare function format(date: Date, format: string): string;
@@ -0,0 +1,29 @@
1
+ export function isValid(date) {
2
+ return date instanceof Date && !isNaN(date.getTime());
3
+ }
4
+
5
+ export function differenceInDays(dateLeft, dateRight) {
6
+ if (!isValid(dateLeft) || !isValid(dateRight)) throw new Error("Invalid date passed to differenceInDays");
7
+ const leftTime = Date.UTC(dateLeft.getFullYear(), dateLeft.getMonth(), dateLeft.getDate()), rightTime = Date.UTC(dateRight.getFullYear(), dateRight.getMonth(), dateRight.getDate());
8
+ return Math.floor((rightTime - leftTime) / 864e5);
9
+ }
10
+
11
+ export function addDays(date, amount) {
12
+ if (!isValid(date)) throw new Error("Invalid date passed to addDays");
13
+ const newDate = new Date(date);
14
+ return newDate.setDate(newDate.getDate() + amount), newDate;
15
+ }
16
+
17
+ export function parse(dateString, format, referenceDate = new Date) {
18
+ const yearMatch = format.match(/y+/), monthMatch = format.match(/M+/), dayMatch = format.match(/d+/);
19
+ if (!yearMatch || !monthMatch || !dayMatch) throw new Error("Format string must contain yyyy, MM (or M), and dd (or d)");
20
+ const yearIndex = format.indexOf(yearMatch[0]), monthIndex = format.indexOf(monthMatch[0]), dayIndex = format.indexOf(dayMatch[0]), year = parseInt(dateString.substring(yearIndex, yearIndex + yearMatch[0].length), 10), month = parseInt(dateString.substring(monthIndex, monthIndex + monthMatch[0].length), 10) - 1, day = parseInt(dateString.substring(dayIndex, dayIndex + dayMatch[0].length), 10), fullYear = year < 100 ? 2e3 + year : year, date = new Date(fullYear, month, day);
21
+ return date.getFullYear() !== fullYear || date.getMonth() !== month || date.getDate() !== day ? new Date(NaN) : date;
22
+ }
23
+
24
+ export function format(date, format) {
25
+ if (!isValid(date)) throw new Error("Invalid date passed to format");
26
+ const year = date.getFullYear(), month = date.getMonth() + 1, day = date.getDate();
27
+ return format.replace("yyyy", year.toString()).replace("MM", month.toString().padStart(2, "0")).replace("M", month.toString()).replace("dd", day.toString().padStart(2, "0")).replace("d", day.toString());
28
+ }
29
+ //# sourceMappingURL=date-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/date-tools.ts"],"names":[],"mappings":"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","file":"date-tools.js","sourcesContent":["import { TimeUtil } from '@visactor/vutils';\n\n/**\n * 检查日期是否有效\n * @param date 待检查的日期\n * @returns 是否有效\n */\nexport function isValid(date: Date): boolean {\n return date instanceof Date && !isNaN(date.getTime());\n}\n\n/**\n * 计算两个日期之间的天数差\n * @param dateLeft 较早的日期\n * @param dateRight 较晚的日期\n * @returns 天数差(dateRight - dateLeft)\n */\nexport function differenceInDays(dateLeft: Date, dateRight: Date): number {\n if (!isValid(dateLeft) || !isValid(dateRight)) {\n throw new Error('Invalid date passed to differenceInDays');\n }\n\n // 转换为UTC时间戳(忽略时分秒影响)\n const leftTime = Date.UTC(dateLeft.getFullYear(), dateLeft.getMonth(), dateLeft.getDate());\n\n const rightTime = Date.UTC(dateRight.getFullYear(), dateRight.getMonth(), dateRight.getDate());\n\n // 一天的毫秒数:86400000 = 24 * 60 * 60 * 1000\n return Math.floor((rightTime - leftTime) / 86400000);\n}\n\n/**\n * 给日期增加指定天数\n * @param date 基础日期\n * @param amount 要增加的天数\n * @returns 新的日期对象\n */\nexport function addDays(date: Date, amount: number): Date {\n if (!isValid(date)) {\n throw new Error('Invalid date passed to addDays');\n }\n\n const newDate = new Date(date);\n newDate.setDate(newDate.getDate() + amount);\n return newDate;\n}\n\n/**\n * 解析日期字符串为Date对象\n * @param dateString 日期字符串\n * @param format 格式字符串(支持yyyy、MM、dd、M、d)\n * @param referenceDate 参考日期(用于补全缺失信息)\n * @returns 解析后的Date对象\n */\nexport function parse(dateString: string, format: string, referenceDate: Date = new Date()): Date {\n // 提取格式中的日期部分\n const yearMatch = format.match(/y+/);\n const monthMatch = format.match(/M+/);\n const dayMatch = format.match(/d+/);\n\n if (!yearMatch || !monthMatch || !dayMatch) {\n throw new Error('Format string must contain yyyy, MM (or M), and dd (or d)');\n }\n\n // 提取日期字符串中的对应部分\n const yearIndex = format.indexOf(yearMatch[0]);\n const monthIndex = format.indexOf(monthMatch[0]);\n const dayIndex = format.indexOf(dayMatch[0]);\n\n const year = parseInt(dateString.substring(yearIndex, yearIndex + yearMatch[0].length), 10);\n const month = parseInt(dateString.substring(monthIndex, monthIndex + monthMatch[0].length), 10) - 1; // 月份从0开始\n const day = parseInt(dateString.substring(dayIndex, dayIndex + dayMatch[0].length), 10);\n\n // 处理可能的年份简写(如\"24\"解析为2024)\n const fullYear = year < 100 ? 2000 + year : year;\n\n const date = new Date(fullYear, month, day);\n\n // 验证解析结果是否正确(处理无效日期如2月30日)\n if (date.getFullYear() !== fullYear || date.getMonth() !== month || date.getDate() !== day) {\n return new Date(NaN); // 返回无效日期\n }\n\n return date;\n}\n\n/**\n * 格式化日期为指定字符串\n * @param date 日期对象\n * @param format 格式字符串(支持yyyy、MM、dd、M、d)\n * @returns 格式化后的字符串\n */\nexport function format(date: Date, format: string): string {\n if (!isValid(date)) {\n throw new Error('Invalid date passed to format');\n }\n\n const year = date.getFullYear();\n const month = date.getMonth() + 1; // 月份从1开始\n const day = date.getDate();\n\n // 替换格式中的占位符\n return format\n .replace('yyyy', year.toString())\n .replace('MM', month.toString().padStart(2, '0'))\n .replace('M', month.toString())\n .replace('dd', day.toString().padStart(2, '0'))\n .replace('d', day.toString());\n}\n"]}
@@ -0,0 +1,21 @@
1
+ import * as VTable from '@visactor/vtable';
2
+ import type { TableEvents } from '@visactor/vtable/src/core/TABLE_EVENT_TYPE';
3
+ export interface IAutoFillPluginOptions {
4
+ fillMode?: 'copy' | 'series';
5
+ fastFillMode?: 'copy' | 'series';
6
+ }
7
+ export declare class AutoFillPlugin implements VTable.plugins.IVTablePlugin {
8
+ id: string;
9
+ name: string;
10
+ runTime: ("mousedown_fill_handle" | "drag_fill_handle_end" | "dblclick_fill_handle")[];
11
+ table: VTable.ListTable;
12
+ private autoFillManager;
13
+ constructor(options?: IAutoFillPluginOptions);
14
+ run(...args: [
15
+ {
16
+ direction: string;
17
+ },
18
+ TableEvents[keyof TableEvents] | TableEvents[keyof TableEvents][],
19
+ VTable.BaseTableAPI
20
+ ]): void;
21
+ }
@@ -0,0 +1,21 @@
1
+ import * as VTable from "@visactor/vtable";
2
+
3
+ import { AutoFillManager } from "./auto-fill-manager";
4
+
5
+ export class AutoFillPlugin {
6
+ constructor(options) {
7
+ this.id = "auto-fill", this.name = "Auto Fill", this.runTime = [ VTable.TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE, VTable.TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END, VTable.TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE ],
8
+ this.autoFillManager = new AutoFillManager(options);
9
+ }
10
+ run(...args) {
11
+ var _a, _b;
12
+ if (args[1] === VTable.TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE) {
13
+ const [_, __, table] = args;
14
+ this.table = table, this.autoFillManager.setTable(this.table), this.autoFillManager.handleStartDrag(null === (_a = this.table) || void 0 === _a ? void 0 : _a.getSelectedCellRanges()[0]);
15
+ } else if (args[1] === VTable.TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END) {
16
+ const [{direction: direction}] = args;
17
+ this.autoFillManager.handleEndDrag(null === (_b = this.table) || void 0 === _b ? void 0 : _b.getSelectedCellRanges()[0], direction);
18
+ } else args[1] === VTable.TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE && this.autoFillManager.handleDbClick();
19
+ }
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,kBAAkB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAqBtD,MAAM,OAAO,cAAc;IAUzB,YAAY,OAAgC;QAT5C,OAAE,GAAG,WAAW,CAAC;QACjB,SAAI,GAAG,WAAW,CAAC;QACnB,YAAO,GAAG;YACR,MAAM,CAAC,gBAAgB,CAAC,qBAAqB;YAC7C,MAAM,CAAC,gBAAgB,CAAC,oBAAoB;YAC5C,MAAM,CAAC,gBAAgB,CAAC,oBAAoB;SAC7C,CAAC;QAIA,IAAI,CAAC,eAAe,GAAG,IAAI,eAAe,CAAC,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,GAAG,CACD,GAAG,IAIF;;QAGD,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,EAAE;YAC7D,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,GAAG,IAAI,CAAC;YAC5B,IAAI,CAAC,KAAK,GAAG,KAAyB,CAAC;YACvC,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1C,IAAI,CAAC,eAAe,CAAC,eAAe,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,qBAAqB,GAAG,CAAC,CAAC,CAAC,CAAC;SAC9E;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE;YAEnE,MAAM,CAAC,EAAE,SAAS,EAAE,CAAC,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,MAAA,IAAI,CAAC,KAAK,0CAAE,qBAAqB,GAAG,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;SACvF;aAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE;YACnE,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,CAAC;SACtC;IACH,CAAC;CACF","file":"index.js","sourcesContent":["import * as VTable from '@visactor/vtable';\nimport type { TableEvents } from '@visactor/vtable/src/core/TABLE_EVENT_TYPE';\nimport { AutoFillManager } from './auto-fill-manager';\n/**\n * 自动填充插件\n */\nexport interface IAutoFillPluginOptions {\n /**\n * 填充模式\n * 'copy': 复制填充\n * 'series': 序列填充\n * 不填写则开启自动填充菜单\n */\n fillMode?: 'copy' | 'series';\n /**\n * 快速填充模式\n * 'copy': 复制填充\n * 'series': 序列填充\n * 不填写则开启自动填充菜单\n */\n fastFillMode?: 'copy' | 'series';\n}\n\nexport class AutoFillPlugin implements VTable.plugins.IVTablePlugin {\n id = `auto-fill`;\n name = 'Auto Fill';\n runTime = [\n VTable.TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE,\n VTable.TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END,\n VTable.TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE\n ];\n table: VTable.ListTable;\n private autoFillManager: AutoFillManager;\n constructor(options?: IAutoFillPluginOptions) {\n this.autoFillManager = new AutoFillManager(options);\n }\n run(\n ...args: [\n { direction: string },\n TableEvents[keyof TableEvents] | TableEvents[keyof TableEvents][],\n VTable.BaseTableAPI\n ]\n ) {\n // start drag\n console.log('auto fill plugin run', args);\n if (args[1] === VTable.TABLE_EVENT_TYPE.MOUSEDOWN_FILL_HANDLE) {\n const [_, __, table] = args;\n this.table = table as VTable.ListTable;\n this.autoFillManager.setTable(this.table);\n this.autoFillManager.handleStartDrag(this.table?.getSelectedCellRanges()[0]);\n } else if (args[1] === VTable.TABLE_EVENT_TYPE.DRAG_FILL_HANDLE_END) {\n // end drag\n const [{ direction }] = args;\n this.autoFillManager.handleEndDrag(this.table?.getSelectedCellRanges()[0], direction);\n } else if (args[1] === VTable.TABLE_EVENT_TYPE.DBLCLICK_FILL_HANDLE) {\n this.autoFillManager.handleDbClick();\n }\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { IAutoFillRule } from './types';
2
+ export declare const dateRule: IAutoFillRule;
3
+ export declare const numberRule: IAutoFillRule;
4
+ export declare const otherRule: IAutoFillRule;
5
+ export declare const extendNumberRule: IAutoFillRule;
6
+ export declare const chnNumberRule: IAutoFillRule;
7
+ export declare const chnWeek2Rule: IAutoFillRule;
8
+ export declare const chnWeek3Rule: IAutoFillRule;
9
+ export declare const loopSeriesRule: IAutoFillRule;
10
+ export declare function reverseIfNeed<T>(data: T[], reverse: boolean): T[];
@@ -0,0 +1,203 @@
1
+ import { chineseToNumber, fillChnNumber, fillChnWeek, fillCopy, fillExtendNumber, fillLoopSeries, fillSeries, getLoopSeriesInfo, isChnNumber, isChnWeek2, isChnWeek3, isEqualDiff, isLoopSeries, matchExtendNumber } from "./utils/fill";
2
+
3
+ import { APPLY_TYPE, DATA_TYPE, Direction } from "./types";
4
+
5
+ import { converterManager, DateConverter } from "./series-converters";
6
+
7
+ import { CellValueType } from "./types";
8
+
9
+ export const dateRule = {
10
+ type: DATA_TYPE.DATE,
11
+ priority: 1100,
12
+ match: (cellData, accessor) => "string" == typeof (null == cellData ? void 0 : cellData.v) && converterManager.getConverter(cellData.v) instanceof DateConverter,
13
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.DATE,
14
+ applyFunctions: {
15
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
16
+ var _a;
17
+ const {data: data} = dataWithIndex, converter = converterManager.getConverter(null === (_a = data[0]) || void 0 === _a ? void 0 : _a.v);
18
+ return direction === Direction.LEFT || direction === Direction.UP ? (data.reverse(),
19
+ fillSeries(data, len, direction, converter).reverse()) : fillSeries(data, len, direction, converter);
20
+ }
21
+ }
22
+ };
23
+
24
+ export const numberRule = {
25
+ type: DATA_TYPE.NUMBER,
26
+ priority: 1e3,
27
+ match: cellData => "number" == typeof (null == cellData ? void 0 : cellData.v) || (null == cellData ? void 0 : cellData.t) === CellValueType.NUMBER,
28
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.NUMBER,
29
+ applyFunctions: {
30
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
31
+ const {data: data} = dataWithIndex;
32
+ return direction === Direction.LEFT || direction === Direction.UP ? (data.reverse(),
33
+ fillSeries(data, len, direction).reverse()) : fillSeries(data, len, direction);
34
+ }
35
+ }
36
+ };
37
+
38
+ export const otherRule = {
39
+ type: DATA_TYPE.OTHER,
40
+ priority: 0,
41
+ match: () => !0,
42
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.OTHER
43
+ };
44
+
45
+ export const extendNumberRule = {
46
+ type: DATA_TYPE.EXTEND_NUMBER,
47
+ priority: 900,
48
+ match: cellData => matchExtendNumber(`${null == cellData ? void 0 : cellData.v}` || "").isExtendNumber,
49
+ isContinue: (prev, cur) => {
50
+ var _a;
51
+ if (prev.type === DATA_TYPE.EXTEND_NUMBER) {
52
+ const {beforeTxt: beforeTxt, afterTxt: afterTxt} = matchExtendNumber(`${null === (_a = prev.cellData) || void 0 === _a ? void 0 : _a.v}` || ""), {beforeTxt: curBeforeTxt, afterTxt: curAfterTxt} = matchExtendNumber(`${null == cur ? void 0 : cur.v}` || "");
53
+ if (beforeTxt === curBeforeTxt && afterTxt === curAfterTxt) return !0;
54
+ }
55
+ return !1;
56
+ },
57
+ applyFunctions: {
58
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
59
+ var _a;
60
+ const {data: data} = dataWithIndex, isReverse = direction === Direction.UP || direction === Direction.LEFT;
61
+ let step;
62
+ if (1 === data.length) return step = isReverse ? -1 : 1, reverseIfNeed(fillExtendNumber(data, len, step), isReverse);
63
+ const dataNumArr = [];
64
+ for (let i = 0; i < data.length; i++) {
65
+ const txt = `${null === (_a = data[i]) || void 0 === _a ? void 0 : _a.v}`;
66
+ txt && dataNumArr.push(Number(matchExtendNumber(txt).matchTxt));
67
+ }
68
+ return isReverse && (data.reverse(), dataNumArr.reverse()), isEqualDiff(dataNumArr) ? (step = dataNumArr[1] - dataNumArr[0],
69
+ reverseIfNeed(fillExtendNumber(data, len, step), isReverse)) : fillCopy(data, len);
70
+ }
71
+ }
72
+ };
73
+
74
+ export const chnNumberRule = {
75
+ type: DATA_TYPE.CHN_NUMBER,
76
+ priority: 830,
77
+ match: cellData => !!isChnNumber(`${null == cellData ? void 0 : cellData.v}` || ""),
78
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.CHN_NUMBER,
79
+ applyFunctions: {
80
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
81
+ var _a, _b;
82
+ const {data: data} = dataWithIndex, isReverse = direction === Direction.LEFT || direction === Direction.UP;
83
+ if (1 === data.length) {
84
+ let step;
85
+ return step = isReverse ? -1 : 1, reverseIfNeed(fillChnNumber(data, len, step), isReverse);
86
+ }
87
+ let hasWeek = !1;
88
+ for (let i = 0; i < data.length; i++) {
89
+ if ("日" === (null === (_a = data[i]) || void 0 === _a ? void 0 : _a.v)) {
90
+ hasWeek = !0;
91
+ break;
92
+ }
93
+ }
94
+ const dataNumArr = [];
95
+ let weekIndex = 0;
96
+ for (let i = 0; i < data.length; i++) {
97
+ const formattedValue = `${null === (_b = data[i]) || void 0 === _b ? void 0 : _b.v}`;
98
+ "日" === formattedValue ? 0 === i ? dataNumArr.push(0) : (weekIndex++, dataNumArr.push(7 * weekIndex)) : hasWeek && chineseToNumber(formattedValue) > 0 && chineseToNumber(formattedValue) < 7 ? dataNumArr.push(chineseToNumber(formattedValue) + 7 * weekIndex) : dataNumArr.push(chineseToNumber(formattedValue));
99
+ }
100
+ if (isReverse && (data.reverse(), dataNumArr.reverse()), isEqualDiff(dataNumArr)) {
101
+ const step = dataNumArr[1] - dataNumArr[0];
102
+ return reverseIfNeed(fillChnNumber(data, len, step), isReverse);
103
+ }
104
+ return fillCopy(data, len);
105
+ }
106
+ }
107
+ };
108
+
109
+ export const chnWeek2Rule = {
110
+ type: DATA_TYPE.CHN_WEEK2,
111
+ priority: 820,
112
+ match: cellData => !!isChnWeek2(`${null == cellData ? void 0 : cellData.v}` || ""),
113
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.CHN_WEEK2,
114
+ applyFunctions: {
115
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
116
+ var _a;
117
+ const {data: data} = dataWithIndex, isReverse = direction === Direction.LEFT || direction === Direction.UP;
118
+ if (1 === data.length) {
119
+ let step;
120
+ return step = isReverse ? -1 : 1, reverseIfNeed(fillChnWeek(data, len, step, 1), isReverse);
121
+ }
122
+ const dataNumArr = [];
123
+ let weekIndex = 0;
124
+ for (let i = 0; i < data.length; i++) {
125
+ const formattedValue = `${null === (_a = data[i]) || void 0 === _a ? void 0 : _a.v}`, lastTxt = null == formattedValue ? void 0 : formattedValue.substr(formattedValue.length - 1, 1);
126
+ "周日" === formattedValue ? 0 === i ? dataNumArr.push(0) : (weekIndex++, dataNumArr.push(7 * weekIndex)) : dataNumArr.push(chineseToNumber(lastTxt) + 7 * weekIndex);
127
+ }
128
+ if (isReverse && (data.reverse(), dataNumArr.reverse()), isEqualDiff(dataNumArr)) {
129
+ const step = dataNumArr[1] - dataNumArr[0];
130
+ return reverseIfNeed(fillChnWeek(data, len, step, 1), isReverse);
131
+ }
132
+ return fillCopy(data, len);
133
+ }
134
+ }
135
+ };
136
+
137
+ export const chnWeek3Rule = {
138
+ type: DATA_TYPE.CHN_WEEK3,
139
+ priority: 810,
140
+ match: cellData => isChnWeek3(`${null == cellData ? void 0 : cellData.v}` || ""),
141
+ isContinue: (prev, cur) => prev.type === DATA_TYPE.CHN_WEEK3,
142
+ applyFunctions: {
143
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
144
+ var _a;
145
+ const {data: data} = dataWithIndex, isReverse = direction === Direction.LEFT || direction === Direction.UP;
146
+ if (1 === data.length) {
147
+ let step;
148
+ return step = isReverse ? -1 : 1, reverseIfNeed(fillChnWeek(data, len, step, 2), isReverse);
149
+ }
150
+ const dataNumArr = [];
151
+ let weekIndex = 0;
152
+ for (let i = 0; i < data.length; i++) {
153
+ const formattedValue = `${null === (_a = data[i]) || void 0 === _a ? void 0 : _a.v}`;
154
+ if (formattedValue) {
155
+ const lastTxt = formattedValue.substr(formattedValue.length - 1, 1);
156
+ "星期日" === formattedValue ? 0 === i ? dataNumArr.push(0) : (weekIndex++, dataNumArr.push(7 * weekIndex)) : dataNumArr.push(chineseToNumber(lastTxt) + 7 * weekIndex);
157
+ }
158
+ }
159
+ if (isReverse && (data.reverse(), dataNumArr.reverse()), isEqualDiff(dataNumArr)) {
160
+ const step = dataNumArr[1] - dataNumArr[0];
161
+ return reverseIfNeed(fillChnWeek(data, len, step, 2), isReverse);
162
+ }
163
+ return fillCopy(data, len);
164
+ }
165
+ }
166
+ };
167
+
168
+ export const loopSeriesRule = {
169
+ type: DATA_TYPE.LOOP_SERIES,
170
+ priority: 800,
171
+ match: cellData => isLoopSeries(`${null == cellData ? void 0 : cellData.v}` || ""),
172
+ isContinue: (prev, cur) => {
173
+ var _a;
174
+ return prev.type === DATA_TYPE.LOOP_SERIES && getLoopSeriesInfo(`${null === (_a = prev.cellData) || void 0 === _a ? void 0 : _a.v}` || "").name === getLoopSeriesInfo(`${null == cur ? void 0 : cur.v}` || "").name;
175
+ },
176
+ applyFunctions: {
177
+ [APPLY_TYPE.SERIES]: (dataWithIndex, len, direction) => {
178
+ var _a, _b;
179
+ const {data: data} = dataWithIndex, isReverse = direction === Direction.LEFT || direction === Direction.UP, {series: series} = getLoopSeriesInfo(`${null === (_a = data[0]) || void 0 === _a ? void 0 : _a.v}` || "");
180
+ if (1 === data.length) {
181
+ let step;
182
+ return step = isReverse ? -1 : 1, reverseIfNeed(fillLoopSeries(data, len, step, series), isReverse);
183
+ }
184
+ const dataNumArr = [];
185
+ let cycleIndex = 0;
186
+ for (let i = 0; i < data.length; i++) {
187
+ const formattedValue = `${null === (_b = data[i]) || void 0 === _b ? void 0 : _b.v}`;
188
+ formattedValue && (formattedValue === series[0] ? 0 === i ? dataNumArr.push(0) : (cycleIndex++,
189
+ dataNumArr.push(cycleIndex * series.length)) : dataNumArr.push(series.indexOf(formattedValue) + 7 * cycleIndex));
190
+ }
191
+ if (isReverse && (data.reverse(), dataNumArr.reverse()), isEqualDiff(dataNumArr)) {
192
+ const step = dataNumArr[1] - dataNumArr[0];
193
+ return reverseIfNeed(fillLoopSeries(data, len, step, series), isReverse);
194
+ }
195
+ return fillCopy(data, len);
196
+ }
197
+ }
198
+ };
199
+
200
+ export function reverseIfNeed(data, reverse) {
201
+ return reverse ? data.reverse() : data;
202
+ }
203
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/rules.ts"],"names":[],"mappings":"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","file":"rules.js","sourcesContent":["/**\n * Copyright 2023-present DreamNum Co., Ltd.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport type { IAutoFillRule } from './types';\n\nimport {\n chineseToNumber,\n fillChnNumber,\n fillChnWeek,\n fillCopy,\n fillExtendNumber,\n fillLoopSeries,\n fillSeries,\n getLoopSeriesInfo,\n isChnNumber,\n isChnWeek2,\n isChnWeek3,\n isEqualDiff,\n isLoopSeries,\n matchExtendNumber\n} from './utils/fill';\nimport { APPLY_TYPE, DATA_TYPE, Direction } from './types';\nimport { converterManager, DateConverter } from './series-converters';\nimport { CellValueType } from './types';\nexport const dateRule: IAutoFillRule = {\n type: DATA_TYPE.DATE,\n priority: 1100,\n match: (cellData: any, accessor: any) => {\n return typeof cellData?.v === 'string' && converterManager.getConverter(cellData.v) instanceof DateConverter;\n },\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.DATE) {\n return true;\n }\n return false;\n },\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n const converter = converterManager.getConverter(data[0]?.v);\n if (direction === Direction.LEFT || direction === Direction.UP) {\n data.reverse();\n return fillSeries(data, len, direction, converter).reverse();\n }\n return fillSeries(data, len, direction, converter);\n }\n }\n};\n\nexport const numberRule: IAutoFillRule = {\n type: DATA_TYPE.NUMBER,\n priority: 1000,\n match: (cellData: any) => typeof cellData?.v === 'number' || cellData?.t === CellValueType.NUMBER,\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.NUMBER) {\n return true;\n }\n return false;\n },\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n if (direction === Direction.LEFT || direction === Direction.UP) {\n data.reverse();\n return fillSeries(data, len, direction).reverse();\n }\n return fillSeries(data, len, direction);\n }\n }\n};\n\nexport const otherRule: IAutoFillRule = {\n type: DATA_TYPE.OTHER,\n priority: 0,\n match: () => true,\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.OTHER) {\n return true;\n }\n return false;\n }\n};\n\nexport const extendNumberRule: IAutoFillRule = {\n type: DATA_TYPE.EXTEND_NUMBER,\n priority: 900,\n match: cellData => matchExtendNumber(`${cellData?.v}` || '').isExtendNumber,\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.EXTEND_NUMBER) {\n const { beforeTxt, afterTxt } = matchExtendNumber(`${prev.cellData?.v}` || '');\n const { beforeTxt: curBeforeTxt, afterTxt: curAfterTxt } = matchExtendNumber(`${cur?.v}` || '');\n if (beforeTxt === curBeforeTxt && afterTxt === curAfterTxt) {\n return true;\n }\n }\n return false;\n },\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n const isReverse = direction === Direction.UP || direction === Direction.LEFT;\n\n let step;\n if (data.length === 1) {\n step = isReverse ? -1 : 1;\n return reverseIfNeed(fillExtendNumber(data, len, step), isReverse);\n }\n const dataNumArr = [];\n\n for (let i = 0; i < data.length; i++) {\n const txt = `${data[i]?.v}`;\n txt && dataNumArr.push(Number(matchExtendNumber(txt).matchTxt));\n }\n\n if (isReverse) {\n data.reverse();\n dataNumArr.reverse();\n }\n\n if (isEqualDiff(dataNumArr)) {\n step = dataNumArr[1] - dataNumArr[0];\n return reverseIfNeed(fillExtendNumber(data, len, step), isReverse);\n }\n return fillCopy(data, len);\n }\n }\n};\n\nexport const chnNumberRule: IAutoFillRule = {\n type: DATA_TYPE.CHN_NUMBER,\n priority: 830,\n match: cellData => {\n if (isChnNumber(`${cellData?.v}` || '')) {\n return true;\n }\n return false;\n },\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.CHN_NUMBER) {\n return true;\n }\n return false;\n },\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n\n const isReverse = direction === Direction.LEFT || direction === Direction.UP;\n if (data.length === 1) {\n let step;\n if (!isReverse) {\n step = 1;\n } else {\n step = -1;\n }\n return reverseIfNeed(fillChnNumber(data, len, step), isReverse);\n }\n let hasWeek = false;\n for (let i = 0; i < data.length; i++) {\n const formattedValue = data[i]?.v;\n\n if (formattedValue === '日') {\n hasWeek = true;\n break;\n }\n }\n\n const dataNumArr = [];\n let weekIndex = 0;\n for (let i = 0; i < data.length; i++) {\n const formattedValue = `${data[i]?.v}`;\n if (formattedValue === '日') {\n if (i === 0) {\n dataNumArr.push(0);\n } else {\n weekIndex++;\n dataNumArr.push(weekIndex * 7);\n }\n } else if (hasWeek && chineseToNumber(formattedValue) > 0 && chineseToNumber(formattedValue) < 7) {\n dataNumArr.push(chineseToNumber(formattedValue) + weekIndex * 7);\n } else {\n dataNumArr.push(chineseToNumber(formattedValue));\n }\n }\n\n if (isReverse) {\n data.reverse();\n dataNumArr.reverse();\n }\n\n if (isEqualDiff(dataNumArr)) {\n // Always fill with sequence of Chinese lowercase numbers\n const step = dataNumArr[1] - dataNumArr[0];\n return reverseIfNeed(fillChnNumber(data, len, step), isReverse);\n }\n // Not an arithmetic progression, copy data\n return fillCopy(data, len);\n }\n }\n};\n\nexport const chnWeek2Rule: IAutoFillRule = {\n type: DATA_TYPE.CHN_WEEK2,\n priority: 820,\n match: cellData => {\n if (isChnWeek2(`${cellData?.v}` || '')) {\n return true;\n }\n return false;\n },\n isContinue: (prev: any, cur: any) => prev.type === DATA_TYPE.CHN_WEEK2,\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n\n const isReverse = direction === Direction.LEFT || direction === Direction.UP;\n if (data.length === 1) {\n let step;\n if (!isReverse) {\n step = 1;\n } else {\n step = -1;\n }\n\n return reverseIfNeed(fillChnWeek(data, len, step, 1), isReverse);\n }\n const dataNumArr = [];\n let weekIndex = 0;\n\n for (let i = 0; i < data.length; i++) {\n const formattedValue = `${data[i]?.v}`;\n const lastTxt = formattedValue?.substr(formattedValue.length - 1, 1);\n if (formattedValue === '周日') {\n if (i === 0) {\n dataNumArr.push(0);\n } else {\n weekIndex++;\n dataNumArr.push(weekIndex * 7);\n }\n } else {\n dataNumArr.push(chineseToNumber(lastTxt) + weekIndex * 7);\n }\n }\n\n if (isReverse) {\n data.reverse();\n dataNumArr.reverse();\n }\n\n if (isEqualDiff(dataNumArr)) {\n const step = dataNumArr[1] - dataNumArr[0];\n return reverseIfNeed(fillChnWeek(data, len, step, 1), isReverse);\n }\n return fillCopy(data, len);\n }\n }\n};\n\nexport const chnWeek3Rule: IAutoFillRule = {\n type: DATA_TYPE.CHN_WEEK3,\n priority: 810,\n match: cellData => isChnWeek3(`${cellData?.v}` || ''),\n isContinue: (prev: any, cur: any) => prev.type === DATA_TYPE.CHN_WEEK3,\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n\n const isReverse = direction === Direction.LEFT || direction === Direction.UP;\n if (data.length === 1) {\n let step;\n if (!isReverse) {\n step = 1;\n } else {\n step = -1;\n }\n\n return reverseIfNeed(fillChnWeek(data, len, step, 2), isReverse);\n }\n const dataNumArr = [];\n let weekIndex = 0;\n\n for (let i = 0; i < data.length; i++) {\n const formattedValue = `${data[i]?.v}`;\n if (formattedValue) {\n const lastTxt = formattedValue.substr(formattedValue.length - 1, 1);\n if (formattedValue === '星期日') {\n if (i === 0) {\n dataNumArr.push(0);\n } else {\n weekIndex++;\n dataNumArr.push(weekIndex * 7);\n }\n } else {\n dataNumArr.push(chineseToNumber(lastTxt) + weekIndex * 7);\n }\n }\n }\n\n if (isReverse) {\n data.reverse();\n dataNumArr.reverse();\n }\n\n if (isEqualDiff(dataNumArr)) {\n const step = dataNumArr[1] - dataNumArr[0];\n return reverseIfNeed(fillChnWeek(data, len, step, 2), isReverse);\n }\n return fillCopy(data, len);\n }\n }\n};\n\nexport const loopSeriesRule: IAutoFillRule = {\n type: DATA_TYPE.LOOP_SERIES,\n priority: 800,\n match: cellData => isLoopSeries(`${cellData?.v}` || ''),\n isContinue: (prev: any, cur: any) => {\n if (prev.type === DATA_TYPE.LOOP_SERIES) {\n return getLoopSeriesInfo(`${prev.cellData?.v}` || '').name === getLoopSeriesInfo(`${cur?.v}` || '').name;\n }\n return false;\n },\n applyFunctions: {\n [APPLY_TYPE.SERIES]: (dataWithIndex: any, len: any, direction: any) => {\n const { data } = dataWithIndex;\n const isReverse = direction === Direction.LEFT || direction === Direction.UP;\n const { series } = getLoopSeriesInfo(`${data[0]?.v}` || '');\n if (data.length === 1) {\n let step;\n if (!isReverse) {\n step = 1;\n } else {\n step = -1;\n }\n\n return reverseIfNeed(fillLoopSeries(data, len, step, series), isReverse);\n }\n const dataNumArr = [];\n let cycleIndex = 0;\n for (let i = 0; i < data.length; i++) {\n const formattedValue = `${data[i]?.v}`;\n if (formattedValue) {\n if (formattedValue === series[0]) {\n if (i === 0) {\n dataNumArr.push(0);\n } else {\n cycleIndex++;\n dataNumArr.push(cycleIndex * series.length);\n }\n } else {\n dataNumArr.push(series.indexOf(formattedValue) + cycleIndex * 7);\n }\n }\n }\n\n if (isReverse) {\n data.reverse();\n dataNumArr.reverse();\n }\n\n if (isEqualDiff(dataNumArr)) {\n const step = dataNumArr[1] - dataNumArr[0];\n return reverseIfNeed(fillLoopSeries(data, len, step, series), isReverse);\n }\n return fillCopy(data, len);\n }\n }\n};\n\nexport function reverseIfNeed<T>(data: T[], reverse: boolean): T[] {\n return reverse ? data.reverse() : data;\n}\n"]}
@@ -0,0 +1,27 @@
1
+ export interface IConverter {
2
+ key: string;
3
+ detect(value: any): boolean;
4
+ toNumber(value: any): {
5
+ v: number;
6
+ meta?: any;
7
+ };
8
+ fromNumber(num: number, meta?: any): any;
9
+ }
10
+ export declare class DateConverter implements IConverter {
11
+ key: string;
12
+ private baseDate;
13
+ private dateFormats;
14
+ detect(value: any): boolean;
15
+ toNumber(value: Date | string): {
16
+ v: number;
17
+ meta?: string;
18
+ };
19
+ fromNumber(daysOffset: number, meta?: string): string;
20
+ }
21
+ export declare class ConverterManager {
22
+ private converters;
23
+ register(converter: IConverter): void;
24
+ getConverter(value: any): IConverter | null;
25
+ getConverterByKey(key: string): IConverter | null;
26
+ }
27
+ export declare const converterManager: ConverterManager;
@@ -0,0 +1,83 @@
1
+ import { parse, isValid, differenceInDays, addDays, format } from "./utils/date";
2
+
3
+ export class DateConverter {
4
+ constructor() {
5
+ this.key = "date", this.baseDate = new Date(1900, 0, 1), this.dateFormats = [ {
6
+ pattern: /^\d{4}-\d{2}-\d{2}$/,
7
+ format: "yyyy-MM-dd"
8
+ }, {
9
+ pattern: /^\d{4}-\d{1,2}-\d{1,2}$/,
10
+ format: "yyyy-M-d"
11
+ }, {
12
+ pattern: /^\d{4}\/\d{2}\/\d{2}$/,
13
+ format: "yyyy/MM/dd"
14
+ }, {
15
+ pattern: /^\d{4}\/\d{1,2}\/\d{1,2}$/,
16
+ format: "yyyy/M/d"
17
+ }, {
18
+ pattern: /^\d{2}\/\d{2}\/\d{4}$/,
19
+ format: "MM/dd/yyyy"
20
+ }, {
21
+ pattern: /^\d{4}年\d{1,2}月\d{1,2}(日)?$/,
22
+ format: "yyyy年M月d日",
23
+ parser: value => {
24
+ const match = value.match(/(\d{4})年(\d{1,2})月(\d{1,2})/);
25
+ if (!match) throw new Error("无效的中文日期格式");
26
+ return new Date(+match[1], +match[2] - 1, +match[3]);
27
+ }
28
+ } ];
29
+ }
30
+ detect(value) {
31
+ if (value instanceof Date) return !isNaN(value.getTime());
32
+ if ("string" != typeof value) return !1;
33
+ const str = value.trim(), matchedFormat = this.dateFormats.find((rule => rule.pattern.test(str)));
34
+ if (matchedFormat) try {
35
+ const date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date);
36
+ return isValid(date);
37
+ } catch (_a) {
38
+ return !1;
39
+ }
40
+ return !1;
41
+ }
42
+ toNumber(value) {
43
+ let date, formatMeta;
44
+ if (value instanceof Date) {
45
+ if (!isValid(value)) throw new Error("无效的日期对象");
46
+ date = value, formatMeta = "yyyy-MM-dd";
47
+ } else {
48
+ const str = value.trim(), matchedFormat = this.dateFormats.find((rule => rule.pattern.test(str)));
49
+ if (!matchedFormat) throw new Error(`不支持的日期格式: ${str}`);
50
+ if (date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date),
51
+ !isValid(date)) throw new Error(`无效的日期值: ${str}`);
52
+ formatMeta = matchedFormat.format;
53
+ }
54
+ return {
55
+ v: differenceInDays(date, this.baseDate),
56
+ meta: formatMeta
57
+ };
58
+ }
59
+ fromNumber(daysOffset, meta) {
60
+ const targetDate = addDays(this.baseDate, daysOffset);
61
+ return targetDate.setHours(0, 0, 0, 0), format(targetDate, meta || "yyyy-MM-dd");
62
+ }
63
+ }
64
+
65
+ export class ConverterManager {
66
+ constructor() {
67
+ this.converters = [];
68
+ }
69
+ register(converter) {
70
+ this.converters.push(converter);
71
+ }
72
+ getConverter(value) {
73
+ return this.converters.find((converter => converter.detect(value))) || null;
74
+ }
75
+ getConverterByKey(key) {
76
+ return this.converters.find((converter => converter.key === key)) || null;
77
+ }
78
+ }
79
+
80
+ export const converterManager = new ConverterManager;
81
+
82
+ converterManager.register(new DateConverter);
83
+ //# sourceMappingURL=series-converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auto-fill/series-converters.ts"],"names":[],"mappings":"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","file":"series-converters.js","sourcesContent":["import { parse, isValid, differenceInDays, addDays, format } from './utils/date';\n\n// 通用转换器接口\nexport interface IConverter {\n key: string; // 转换器标识\n detect(value: any): boolean; // 检测值是否可被当前转换器处理\n toNumber(value: any): { v: number; meta?: any }; // 转换为数字\n fromNumber(num: number, meta?: any): any; // 从数字转换回来\n}\n\n// 日期格式规则\ninterface DateFormatRule {\n pattern: RegExp;\n format: string;\n parser?: (value: string) => Date;\n}\n\n/**\n * 日期转换器 - 实现IConverter接口\n */\nexport class DateConverter implements IConverter {\n key = 'date'; // 标识为日期转换器\n private baseDate = new Date(1900, 0, 1);\n\n // 日期格式规则\n private dateFormats: DateFormatRule[] = [\n { pattern: /^\\d{4}-\\d{2}-\\d{2}$/, format: 'yyyy-MM-dd' },\n { pattern: /^\\d{4}-\\d{1,2}-\\d{1,2}$/, format: 'yyyy-M-d' },\n { pattern: /^\\d{4}\\/\\d{2}\\/\\d{2}$/, format: 'yyyy/MM/dd' },\n { pattern: /^\\d{4}\\/\\d{1,2}\\/\\d{1,2}$/, format: 'yyyy/M/d' },\n { pattern: /^\\d{2}\\/\\d{2}\\/\\d{4}$/, format: 'MM/dd/yyyy' },\n {\n pattern: /^\\d{4}年\\d{1,2}月\\d{1,2}(日)?$/,\n format: 'yyyy年M月d日',\n parser: (value: string) => {\n const match = value.match(/(\\d{4})年(\\d{1,2})月(\\d{1,2})/);\n if (!match) throw new Error('无效的中文日期格式');\n return new Date(+match[1], +match[2] - 1, +match[3]);\n }\n }\n ];\n\n // 检测是否为日期\n detect(value: any): boolean {\n if (value instanceof Date) {\n return !isNaN(value.getTime());\n }\n\n if (typeof value !== 'string') {\n return false;\n }\n\n const str = value.trim();\n const matchedFormat = this.dateFormats.find(rule => rule.pattern.test(str));\n\n if (matchedFormat) {\n try {\n const date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date());\n return isValid(date);\n } catch {\n return false;\n }\n }\n\n return false;\n }\n\n // 转换为数字(日偏移量)\n toNumber(value: Date | string): { v: number; meta?: string } {\n let date: Date;\n let formatMeta: string | undefined;\n\n if (value instanceof Date) {\n if (!isValid(value)) throw new Error('无效的日期对象');\n date = value;\n formatMeta = 'yyyy-MM-dd';\n } else {\n const str = value.trim();\n const matchedFormat = this.dateFormats.find(rule => rule.pattern.test(str));\n\n if (!matchedFormat) throw new Error(`不支持的日期格式: ${str}`);\n\n date = matchedFormat.parser ? matchedFormat.parser(str) : parse(str, matchedFormat.format, new Date());\n\n if (!isValid(date)) throw new Error(`无效的日期值: ${str}`);\n formatMeta = matchedFormat.format;\n }\n\n return {\n v: differenceInDays(date, this.baseDate),\n meta: formatMeta\n };\n }\n\n // 从数字转换回日期\n fromNumber(daysOffset: number, meta?: string): string {\n const targetDate = addDays(this.baseDate, daysOffset);\n targetDate.setHours(0, 0, 0, 0);\n\n return format(targetDate, meta || 'yyyy-MM-dd');\n }\n}\n\n/**\n * 转换器管理器 - 用于统一管理和获取转换器\n */\nexport class ConverterManager {\n private converters: IConverter[] = [];\n\n // 注册转换器\n register(converter: IConverter): void {\n this.converters.push(converter);\n }\n\n // 根据值自动获取合适的转换器\n getConverter(value: any): IConverter | null {\n return this.converters.find(converter => converter.detect(value)) || null;\n }\n\n // 根据key获取转换器\n getConverterByKey(key: string): IConverter | null {\n return this.converters.find(converter => converter.key === key) || null;\n }\n}\n\n// 初始化示例\nexport const converterManager = new ConverterManager();\nconverterManager.register(new DateConverter());\n"]}