8
0
فهرست منبع

Use re-render whole element with triggerBy in table downcast conversion.

Maciej Gołaszewski 5 سال پیش
والد
کامیت
2b9bd5122a

+ 7 - 10
packages/ckeditor5-table/src/converters/downcast.js

@@ -20,10 +20,10 @@ import { toWidget, toWidgetEditable, setHighlightHandling } from '@ckeditor/cked
  * @returns {Function} Conversion helper.
  */
 export function downcastInsertTable( options = {} ) {
-	return dispatcher => dispatcher.on( 'insert:table', ( evt, data, conversionApi ) => {
-		const table = data.item;
+	return ( modelElement, conversionApi ) => {
+		const table = modelElement;
 
-		if ( !conversionApi.consumable.consume( table, 'insert' ) ) {
+		if ( !conversionApi.consumable.test( table, 'insert' ) ) {
 			return;
 		}
 
@@ -78,11 +78,8 @@ export function downcastInsertTable( options = {} ) {
 			}
 		}
 
-		const viewPosition = conversionApi.mapper.toViewPosition( data.range.start );
-
-		conversionApi.mapper.bindElements( table, asWidget ? tableWidget : figureElement );
-		conversionApi.writer.insert( viewPosition, asWidget ? tableWidget : figureElement );
-	} );
+		return asWidget ? tableWidget : figureElement;
+	};
 }
 
 /**
@@ -341,13 +338,13 @@ function createViewTableCellElement( tableSlot, tableAttributes, insertPosition,
 			conversionApi.mapper.bindElements( innerParagraph, fakeParagraph );
 			conversionApi.writer.insert( paragraphInsertPosition, fakeParagraph );
 
-			conversionApi.mapper.bindElements( tableCell, cellElement );
+			conversionApi.mapper.bindSlotElements( tableCell, cellElement );
 		} else {
 			conversionApi.mapper.bindElements( tableCell, cellElement );
 			conversionApi.mapper.bindElements( innerParagraph, cellElement );
 		}
 	} else {
-		conversionApi.mapper.bindElements( tableCell, cellElement );
+		conversionApi.mapper.bindSlotElements( tableCell, cellElement );
 	}
 }
 

+ 0 - 54
packages/ckeditor5-table/src/converters/table-heading-rows-refresh-post-fixer.js

@@ -1,54 +0,0 @@
-/**
- * @license Copyright (c) 2003-2020, CKSource - Frederico Knabben. All rights reserved.
- * For licensing, see LICENSE.md or https://ckeditor.com/legal/ckeditor-oss-license
- */
-
-/**
- * @module table/converters/table-heading-rows-refresh-post-fixer
- */
-
-/**
- * Injects a table post-fixer into the model which marks the table in the differ to have it re-rendered.
- *
- * Table heading rows are represented in the model by a `headingRows` attribute. However, in the view, it's represented as separate
- * sections of the table (`<thead>` or `<tbody>`) and changing `headingRows` attribute requires moving table rows between two sections.
- * This causes problems with structural changes in a table (like adding and removing rows) thus atomic converters cannot be used.
- *
- * When table `headingRows` attribute changes, the entire table is re-rendered.
- *
- * @param {module:engine/model/model~Model} model
- */
-export default function injectTableHeadingRowsRefreshPostFixer( model ) {
-	model.document.registerPostFixer( () => tableHeadingRowsRefreshPostFixer( model ) );
-}
-
-function tableHeadingRowsRefreshPostFixer( model ) {
-	const differ = model.document.differ;
-
-	// Stores tables to be refreshed so the table will be refreshed once for multiple changes.
-	const tablesToRefresh = new Set();
-
-	for ( const change of differ.getChanges() ) {
-		if ( change.type != 'attribute' ) {
-			continue;
-		}
-
-		const element = change.range.start.nodeAfter;
-
-		if ( element && element.is( 'element', 'table' ) && change.attributeKey == 'headingRows' ) {
-			tablesToRefresh.add( element );
-		}
-	}
-
-	if ( tablesToRefresh.size ) {
-		// @if CK_DEBUG_TABLE // console.log( `Post-fixing table: refreshing heading rows (${ tablesToRefresh.size }).` );
-
-		for ( const table of tablesToRefresh.values() ) {
-			differ.refreshItem( table );
-		}
-
-		return true;
-	}
-
-	return false;
-}

+ 12 - 4
packages/ckeditor5-table/src/tableediting.js

@@ -35,7 +35,6 @@ import TableUtils from '../src/tableutils';
 import injectTableLayoutPostFixer from './converters/table-layout-post-fixer';
 import injectTableCellParagraphPostFixer from './converters/table-cell-paragraph-post-fixer';
 import injectTableCellRefreshPostFixer from './converters/table-cell-refresh-post-fixer';
-import injectTableHeadingRowsRefreshPostFixer from './converters/table-heading-rows-refresh-post-fixer';
 
 import '../theme/tableediting.css';
 
@@ -93,8 +92,17 @@ export default class TableEditing extends Plugin {
 		// Table conversion.
 		conversion.for( 'upcast' ).add( upcastTable() );
 
-		conversion.for( 'editingDowncast' ).add( downcastInsertTable( { asWidget: true } ) );
-		conversion.for( 'dataDowncast' ).add( downcastInsertTable() );
+		conversion.for( 'editingDowncast' ).elementToElement( {
+			model: 'table',
+			view: downcastInsertTable( { asWidget: true } ),
+			triggerBy: [
+				'attribute:headingRows:table'
+			]
+		} );
+		conversion.for( 'dataDowncast' ).elementToElement( {
+			model: 'table',
+			view: downcastInsertTable()
+		} );
 
 		// Table row conversion.
 		conversion.for( 'upcast' ).elementToElement( { model: 'tableRow', view: 'tr' } );
@@ -144,7 +152,7 @@ export default class TableEditing extends Plugin {
 		editor.commands.add( 'selectTableRow', new SelectRowCommand( editor ) );
 		editor.commands.add( 'selectTableColumn', new SelectColumnCommand( editor ) );
 
-		injectTableHeadingRowsRefreshPostFixer( model );
+		// injectTableHeadingRowsRefreshPostFixer( model );
 		injectTableLayoutPostFixer( model );
 		injectTableCellRefreshPostFixer( model );
 		injectTableCellParagraphPostFixer( model );