diff --git a/packages/core-data/src/actions.js b/packages/core-data/src/actions.js index 63456f8869f87..8c729082fd543 100644 --- a/packages/core-data/src/actions.js +++ b/packages/core-data/src/actions.js @@ -709,6 +709,43 @@ export function __experimentalResetEditedEntityRecord( kind, name, recordId ) { }; } +/** + * Action triggered to reset only specified properties for the entity. + * + * @param {string} kind Kind of the entity. + * @param {string} name Name of the entity. + * @param {Object} recordId ID of the record. + * @param {Array} itemsToReset List of entity properties to reset. + */ +export const __experimentalResetSpecifiedEntityEdits = ( + kind, + name, + recordId, + itemsToReset +) => async ( { select, dispatch } ) => { + if ( ! select.hasEditsForEntityRecord( kind, name, recordId ) ) { + return; + } + const edits = select.getEntityRecordNonTransientEdits( + kind, + name, + recordId + ); + const editsToDiscard = {}; + for ( const edit in edits ) { + if ( itemsToReset.some( ( item ) => item === edit ) ) { + editsToDiscard[ edit ] = edits[ edit ]; + } + } + return await dispatch( { + type: 'RESET_SPECIFIED_ENTITY_RECORD_EDITS', + kind, + name, + recordId, + edits: Object.keys( editsToDiscard ), + } ); +}; + /** * Returns an action object used in signalling that Upload permissions have been received. * diff --git a/packages/core-data/src/reducer.js b/packages/core-data/src/reducer.js index ba64c9680c420..fca9924641c80 100644 --- a/packages/core-data/src/reducer.js +++ b/packages/core-data/src/reducer.js @@ -1,7 +1,7 @@ /** * External dependencies */ -import { keyBy, map, groupBy, flowRight, isEqual, get } from 'lodash'; +import { keyBy, map, groupBy, flowRight, isEqual, get, omit } from 'lodash'; /** * WordPress dependencies @@ -272,6 +272,14 @@ function entity( entityConfig ) { } = state; return otherEdits; + + case 'RESET_SPECIFIED_ENTITY_RECORD_EDITS': + const edits = state[ action.recordId ]; + + return { + ...state, + [ action.recordId ]: omit( edits, action.edits ), + }; } return state; diff --git a/packages/editor/src/components/entities-saved-states/index.js b/packages/editor/src/components/entities-saved-states/index.js index 06c15a8cf6edb..a66a23a642912 100644 --- a/packages/editor/src/components/entities-saved-states/index.js +++ b/packages/editor/src/components/entities-saved-states/index.js @@ -75,6 +75,7 @@ export default function EntitiesSavedStates( { close } ) { saveEditedEntityRecord, __experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits, __experimentalResetEditedEntityRecord: resetEditedEntityRecord, + __experimentalResetSpecifiedEntityEdits: resetSpecifiedEntityEdits, } = useDispatch( coreStore ); // To group entities by type. @@ -199,7 +200,12 @@ export default function EntitiesSavedStates( { close } ) { resetEditedEntityRecord( kind, name, key ); } } ); - //resetSpecifiedEntityEdits( 'root', 'site', undefined, siteItemsToDiscard ); + resetSpecifiedEntityEdits( + 'root', + 'site', + undefined, + siteItemsToDiscard + ); }; // Explicitly define this with no argument passed. Using `close` on