@wordpress/editor
Version:
Enhanced block editor for WordPress posts.
164 lines (138 loc) • 5.24 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = EntitiesSavedStates;
var _element = require("@wordpress/element");
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _lodash = require("lodash");
var _components = require("@wordpress/components");
var _i18n = require("@wordpress/i18n");
var _data = require("@wordpress/data");
var _coreData = require("@wordpress/core-data");
var _compose = require("@wordpress/compose");
var _icons = require("@wordpress/icons");
var _entityTypeList = _interopRequireDefault(require("./entity-type-list"));
/**
* External dependencies
*/
/**
* WordPress dependencies
*/
/**
* Internal dependencies
*/
const TRANSLATED_SITE_PROTPERTIES = {
title: (0, _i18n.__)('Title'),
description: (0, _i18n.__)('Tagline'),
site_logo: (0, _i18n.__)('Logo'),
show_on_front: (0, _i18n.__)('Show on front'),
page_on_front: (0, _i18n.__)('Page on front')
};
function EntitiesSavedStates({
close
}) {
const saveButtonRef = (0, _element.useRef)();
const {
dirtyEntityRecords
} = (0, _data.useSelect)(select => {
const dirtyRecords = select(_coreData.store).__experimentalGetDirtyEntityRecords(); // Remove site object and decouple into its edited pieces.
const dirtyRecordsWithoutSite = dirtyRecords.filter(record => !(record.kind === 'root' && record.name === 'site'));
const siteEdits = select(_coreData.store).getEntityRecordEdits('root', 'site');
const siteEditsAsEntities = [];
for (const property in siteEdits) {
siteEditsAsEntities.push({
kind: 'root',
name: 'site',
title: TRANSLATED_SITE_PROTPERTIES[property] || property,
property
});
}
const dirtyRecordsWithSiteItems = [...dirtyRecordsWithoutSite, ...siteEditsAsEntities];
return {
dirtyEntityRecords: dirtyRecordsWithSiteItems
};
}, []);
const {
saveEditedEntityRecord,
__experimentalSaveSpecifiedEntityEdits: saveSpecifiedEntityEdits
} = (0, _data.useDispatch)(_coreData.store); // To group entities by type.
const partitionedSavables = Object.values((0, _lodash.groupBy)(dirtyEntityRecords, 'name')); // Unchecked entities to be ignored by save function.
const [unselectedEntities, _setUnselectedEntities] = (0, _element.useState)([]);
const setUnselectedEntities = ({
kind,
name,
key,
property
}, checked) => {
if (checked) {
_setUnselectedEntities(unselectedEntities.filter(elt => elt.kind !== kind || elt.name !== name || elt.key !== key || elt.property !== property));
} else {
_setUnselectedEntities([...unselectedEntities, {
kind,
name,
key,
property
}]);
}
};
const saveCheckedEntities = () => {
const entitiesToSave = dirtyEntityRecords.filter(({
kind,
name,
key,
property
}) => {
return !(0, _lodash.some)(unselectedEntities, elt => elt.kind === kind && elt.name === name && elt.key === key && elt.property === property);
});
close(entitiesToSave);
const siteItemsToSave = [];
entitiesToSave.forEach(({
kind,
name,
key,
property
}) => {
if ('root' === kind && 'site' === name) {
siteItemsToSave.push(property);
} else {
saveEditedEntityRecord(kind, name, key);
}
});
saveSpecifiedEntityEdits('root', 'site', undefined, siteItemsToSave);
}; // Explicitly define this with no argument passed. Using `close` on
// its own will use the event object in place of the expected saved entities.
const dismissPanel = (0, _element.useCallback)(() => close(), [close]);
const [saveDialogRef, saveDialogProps] = (0, _compose.__experimentalUseDialog)({
onClose: () => dismissPanel()
});
return (0, _element.createElement)("div", (0, _extends2.default)({
ref: saveDialogRef
}, saveDialogProps, {
className: "entities-saved-states__panel"
}), (0, _element.createElement)("div", {
className: "entities-saved-states__panel-header"
}, (0, _element.createElement)(_components.Button, {
ref: saveButtonRef,
isPrimary: true,
disabled: dirtyEntityRecords.length - unselectedEntities.length === 0,
onClick: saveCheckedEntities,
className: "editor-entities-saved-states__save-button"
}, (0, _i18n.__)('Save')), (0, _element.createElement)(_components.Button, {
icon: _icons.close,
onClick: dismissPanel,
label: (0, _i18n.__)('Close panel')
})), (0, _element.createElement)("div", {
className: "entities-saved-states__text-prompt"
}, (0, _element.createElement)("strong", null, (0, _i18n.__)('Select the changes you want to save')), (0, _element.createElement)("p", null, (0, _i18n.__)('Some changes may affect other areas of your site.'))), partitionedSavables.map(list => {
return (0, _element.createElement)(_entityTypeList.default, {
key: list[0].name,
list: list,
closePanel: dismissPanel,
unselectedEntities: unselectedEntities,
setUnselectedEntities: setUnselectedEntities
});
}));
}
//# sourceMappingURL=index.js.map