|
| 1 | +import { Registry } from "../registries/registry"; |
1 | 2 | import { |
2 | 3 | AddColumnsRowsCommand, |
3 | 4 | ApplyRangeChange, |
4 | 5 | CellPosition, |
5 | 6 | ChangeType, |
6 | | - Command, |
| 7 | + CoreCommand, |
| 8 | + CoreCommandTypes, |
7 | 9 | CoreGetters, |
8 | 10 | DeleteSheetCommand, |
9 | 11 | MoveRangeCommand, |
@@ -284,42 +286,54 @@ export function orderRange(range: Range): Range { |
284 | 286 | }; |
285 | 287 | } |
286 | 288 |
|
287 | | -export function getRangeAdapter(cmd: Command): RangeAdapter | undefined { |
288 | | - switch (cmd.type) { |
289 | | - case "REMOVE_COLUMNS_ROWS": |
290 | | - return { |
291 | | - applyChange: getApplyRangeChangeRemoveColRow(cmd), |
292 | | - sheetId: cmd.sheetId, |
293 | | - sheetName: cmd.sheetName, |
294 | | - }; |
295 | | - case "ADD_COLUMNS_ROWS": |
296 | | - return { |
297 | | - applyChange: getApplyRangeChangeAddColRow(cmd), |
298 | | - sheetId: cmd.sheetId, |
299 | | - sheetName: cmd.sheetName, |
300 | | - }; |
301 | | - case "DELETE_SHEET": |
302 | | - return { |
303 | | - applyChange: getApplyRangeChangeDeleteSheet(cmd), |
304 | | - sheetId: cmd.sheetId, |
305 | | - sheetName: cmd.sheetName, |
306 | | - }; |
307 | | - case "RENAME_SHEET": |
308 | | - return { |
309 | | - applyChange: getApplyRangeChangeRenameSheet(cmd), |
310 | | - sheetId: cmd.sheetId, |
311 | | - sheetName: cmd.oldName, |
312 | | - }; |
313 | | - case "MOVE_RANGES": |
314 | | - return { |
315 | | - applyChange: getApplyRangeChangeMoveRange(cmd), |
316 | | - sheetId: cmd.sheetId, |
317 | | - sheetName: cmd.sheetName, |
318 | | - }; |
| 289 | +export function getRangeAdapter(cmd: CoreCommand): RangeAdapter | undefined { |
| 290 | + return rangeAdapterRegistry.get(cmd.type)?.(cmd); |
| 291 | +} |
| 292 | + |
| 293 | +type GetRangeAdapter<C extends CoreCommand> = (cmd: C) => RangeAdapter; |
| 294 | + |
| 295 | +class RangeAdapterRegistry extends Registry<GetRangeAdapter<CoreCommand>> { |
| 296 | + add<C extends CoreCommandTypes>( |
| 297 | + cmdType: C, |
| 298 | + fn: GetRangeAdapter<Extract<CoreCommand, { type: C }>> |
| 299 | + ): this { |
| 300 | + super.add(cmdType, fn); |
| 301 | + return this; |
| 302 | + } |
| 303 | + get<C extends CoreCommandTypes>(cmdType: C): GetRangeAdapter<Extract<CoreCommand, { type: C }>> { |
| 304 | + return this.content[cmdType]; |
319 | 305 | } |
320 | | - return undefined; |
321 | 306 | } |
322 | 307 |
|
| 308 | +export const rangeAdapterRegistry = new RangeAdapterRegistry(); |
| 309 | + |
| 310 | +rangeAdapterRegistry |
| 311 | + .add("REMOVE_COLUMNS_ROWS", (cmd) => ({ |
| 312 | + applyChange: getApplyRangeChangeRemoveColRow(cmd), |
| 313 | + sheetId: cmd.sheetId, |
| 314 | + sheetName: { old: cmd.sheetName, current: cmd.sheetName }, |
| 315 | + })) |
| 316 | + .add("ADD_COLUMNS_ROWS", (cmd) => ({ |
| 317 | + applyChange: getApplyRangeChangeAddColRow(cmd), |
| 318 | + sheetId: cmd.sheetId, |
| 319 | + sheetName: { old: cmd.sheetName, current: cmd.sheetName }, |
| 320 | + })) |
| 321 | + .add("DELETE_SHEET", (cmd) => ({ |
| 322 | + applyChange: getApplyRangeChangeDeleteSheet(cmd), |
| 323 | + sheetId: cmd.sheetId, |
| 324 | + sheetName: { old: cmd.sheetName, current: cmd.sheetName }, |
| 325 | + })) |
| 326 | + .add("RENAME_SHEET", (cmd) => ({ |
| 327 | + applyChange: getApplyRangeChangeRenameSheet(cmd), |
| 328 | + sheetId: cmd.sheetId, |
| 329 | + sheetName: { old: cmd.oldName, current: cmd.newName }, |
| 330 | + })) |
| 331 | + .add("MOVE_RANGES", (cmd) => ({ |
| 332 | + applyChange: getApplyRangeChangeMoveRange(cmd), |
| 333 | + sheetId: cmd.sheetId, |
| 334 | + sheetName: { old: cmd.sheetName, current: cmd.sheetName }, |
| 335 | + })); |
| 336 | + |
323 | 337 | function getApplyRangeChangeRemoveColRow(cmd: RemoveColumnsRowsCommand): ApplyRangeChange { |
324 | 338 | const start: "left" | "top" = cmd.dimension === "COL" ? "left" : "top"; |
325 | 339 | const end: "right" | "bottom" = cmd.dimension === "COL" ? "right" : "bottom"; |
|
0 commit comments