fix patchData
This commit is contained in:
		
							parent
							
								
									3cb3c3a148
								
							
						
					
					
						commit
						b37a27e154
					
				|  | @ -967,53 +967,70 @@ function refreshData() { | |||
|  * そこで、新しい値とセルが持つ値を突き合わせ、変更があった場合のみ値を更新し、セルそのものは使いまわしつつ値を最新化する。 | ||||
|  */ | ||||
| function patchData(newItems: DataSource[]) { | ||||
| 	const gridRows = cells.value; | ||||
| 	const gridRows = [...cells.value]; | ||||
| 	if (gridRows.length > newItems.length) { | ||||
| 		// 行数が減った場合 | ||||
| 
 | ||||
| 		// 状態が壊れるかもしれないので選択を全解除 | ||||
| 		unSelectionRangeAll(); | ||||
| 
 | ||||
| 		// 行数が減った場合 | ||||
| 		const diff = gridRows | ||||
| 			.map((it, idx) => ({ origin: it.origin, idx })) | ||||
| 			.filter(it => !newItems.includes(it.origin)); | ||||
| 		for (const { idx } of diff) { | ||||
| 			rows.value.splice(idx, 1); | ||||
| 			gridRows.splice(idx, 1); | ||||
| 		} | ||||
| 			.filter(it => !newItems.includes(it.origin)) | ||||
| 			.map(it => it.idx); | ||||
| 		const newRows = rows.value.filter((_, idx) => !diff.includes(idx)); | ||||
| 		const newCells = gridRows.filter((_, idx) => !diff.includes(idx)); | ||||
| 
 | ||||
| 		// 行数が減ったので再度採番 | ||||
| 		for (let rowIdx = 0; rowIdx < rows.value.length; rowIdx++) { | ||||
| 			rows.value[rowIdx].index = rowIdx; | ||||
| 			for (const cell of gridRows[rowIdx].cells) { | ||||
| 		for (let rowIdx = 0; rowIdx < newRows.length; rowIdx++) { | ||||
| 			newRows[rowIdx].index = rowIdx; | ||||
| 			for (const cell of newCells[rowIdx].cells) { | ||||
| 				cell.address.row = rowIdx; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		rows.value = newRows; | ||||
| 		cells.value = newCells; | ||||
| 	} else if (gridRows.length < newItems.length) { | ||||
| 		// 行数が増えた場合 | ||||
| 
 | ||||
| 		// 状態が壊れるかもしれないので選択を全解除 | ||||
| 		unSelectionRangeAll(); | ||||
| 
 | ||||
| 		// 行数が増えた場合 | ||||
| 		const oldOrigins = gridRows.map(it => it.origin); | ||||
| 		const diff = newItems | ||||
| 			.map((it, idx) => ({ origin: it, idx })) | ||||
| 			.filter(it => oldOrigins.indexOf(it.origin) === -1); | ||||
| 
 | ||||
| 		const _cols = columns.value; | ||||
| 		for (const { origin, idx } of diff) { | ||||
| 			const newRow = createRow(idx); | ||||
| 			const newCells = _cols.map(col => createCell(col, newRow, origin[col.setting.bindTo])); | ||||
| 
 | ||||
| 			rows.value.splice(idx, 0, newRow); | ||||
| 			gridRows.splice(idx, 0, { cells: newCells, origin }); | ||||
| 		const newRows = Array.of<GridRow>(); | ||||
| 		const newCells = Array.of<RowHolder>(); | ||||
| 		for (const it of newItems) { | ||||
| 			const idx = oldOrigins.indexOf(it); | ||||
| 			if (idx >= 0) { | ||||
| 				// 既存の行 | ||||
| 				newRows.push(rows.value[idx]); | ||||
| 				newCells.push(gridRows[idx]); | ||||
| 			} else { | ||||
| 				// 新規の行 | ||||
| 				const newRow = createRow(newRows.length); | ||||
| 				newRows.push(newRow); | ||||
| 				newCells.push({ | ||||
| 					cells: columns.value.map(col => { | ||||
| 						const cell = createCell(col, newRow, it[col.setting.bindTo]); | ||||
| 						cell.violation = cellValidation(cell, cell.value); | ||||
| 						return cell; | ||||
| 					}), | ||||
| 					origin: it, | ||||
| 				}); | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		// 行数が増えたので再度採番 | ||||
| 		for (let rowIdx = 0; rowIdx < rows.value.length; rowIdx++) { | ||||
| 			rows.value[rowIdx].index = rowIdx; | ||||
| 			for (const cell of gridRows[rowIdx].cells) { | ||||
| 		for (let rowIdx = 0; rowIdx < newCells.length; rowIdx++) { | ||||
| 			newRows[rowIdx].index = rowIdx; | ||||
| 			for (const cell of newCells[rowIdx].cells) { | ||||
| 				cell.address.row = rowIdx; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		rows.value = newRows; | ||||
| 		cells.value = newCells; | ||||
| 	} else { | ||||
| 		// 行数が変わらない場合 | ||||
| 		const _cols = columns.value; | ||||
|  | @ -1026,7 +1043,8 @@ function patchData(newItems: DataSource[]) { | |||
| 				const oldCell = oldCells[colIdx]; | ||||
| 				const newValue = newItem[_col.setting.bindTo]; | ||||
| 				if (oldCell.value !== newValue) { | ||||
| 					emitCellValue(oldCell, newValue); | ||||
| 					oldCell.violation = cellValidation(oldCell, newValue); | ||||
| 					oldCell.value = newValue; | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue