UNPKG

@wordpress/editor

Version:
217 lines (210 loc) 7.19 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.PostPublishButton = void 0; var _components = require("@wordpress/components"); var _element = require("@wordpress/element"); var _data = require("@wordpress/data"); var _compose = require("@wordpress/compose"); var _label = _interopRequireDefault(require("./label")); var _store = require("../../store"); var _jsxRuntime = require("react/jsx-runtime"); /** * WordPress dependencies */ /** * Internal dependencies */ const noop = () => {}; class PostPublishButton extends _element.Component { constructor(props) { super(props); this.createOnClick = this.createOnClick.bind(this); this.closeEntitiesSavedStates = this.closeEntitiesSavedStates.bind(this); this.state = { entitiesSavedStatesCallback: false }; } createOnClick(callback) { return (...args) => { const { hasNonPostEntityChanges, setEntitiesSavedStatesCallback } = this.props; // If a post with non-post entities is published, but the user // elects to not save changes to the non-post entities, those // entities will still be dirty when the Publish button is clicked. // We also need to check that the `setEntitiesSavedStatesCallback` // prop was passed. See https://github.com/WordPress/gutenberg/pull/37383 if (hasNonPostEntityChanges && setEntitiesSavedStatesCallback) { // The modal for multiple entity saving will open, // hold the callback for saving/publishing the post // so that we can call it if the post entity is checked. this.setState({ entitiesSavedStatesCallback: () => callback(...args) }); // Open the save panel by setting its callback. // To set a function on the useState hook, we must set it // with another function (() => myFunction). Passing the // function on its own will cause an error when called. setEntitiesSavedStatesCallback(() => this.closeEntitiesSavedStates); return noop; } return callback(...args); }; } closeEntitiesSavedStates(savedEntities) { const { postType, postId } = this.props; const { entitiesSavedStatesCallback } = this.state; this.setState({ entitiesSavedStatesCallback: false }, () => { if (savedEntities && savedEntities.some(elt => elt.kind === 'postType' && elt.name === postType && elt.key === postId)) { // The post entity was checked, call the held callback from `createOnClick`. entitiesSavedStatesCallback(); } }); } render() { const { forceIsDirty, hasPublishAction, isBeingScheduled, isOpen, isPostSavingLocked, isPublishable, isPublished, isSaveable, isSaving, isAutoSaving, isToggle, savePostStatus, onSubmit = noop, onToggle, visibility, hasNonPostEntityChanges, isSavingNonPostEntityChanges, postStatus, postStatusHasChanged } = this.props; const isButtonDisabled = (isSaving || !isSaveable || isPostSavingLocked || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); const isToggleDisabled = (isPublished || isSaving || !isSaveable || !isPublishable && !forceIsDirty) && (!hasNonPostEntityChanges || isSavingNonPostEntityChanges); // If the new status has not changed explicitely, we derive it from // other factors, like having a publish action, etc.. We need to preserve // this because it affects when to show the pre and post publish panels. // If it has changed though explicitely, we need to respect that. let publishStatus = 'publish'; if (postStatusHasChanged) { publishStatus = postStatus; } else if (!hasPublishAction) { publishStatus = 'pending'; } else if (visibility === 'private') { publishStatus = 'private'; } else if (isBeingScheduled) { publishStatus = 'future'; } const onClickButton = () => { if (isButtonDisabled) { return; } onSubmit(); savePostStatus(publishStatus); }; // Callback to open the publish panel. const onClickToggle = () => { if (isToggleDisabled) { return; } onToggle(); }; const buttonProps = { 'aria-disabled': isButtonDisabled, className: 'editor-post-publish-button', isBusy: !isAutoSaving && isSaving, variant: 'primary', onClick: this.createOnClick(onClickButton) }; const toggleProps = { 'aria-disabled': isToggleDisabled, 'aria-expanded': isOpen, className: 'editor-post-publish-panel__toggle', isBusy: isSaving && isPublished, variant: 'primary', size: 'compact', onClick: this.createOnClick(onClickToggle) }; const componentProps = isToggle ? toggleProps : buttonProps; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, { children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_components.Button, { ...componentProps, className: `${componentProps.className} editor-post-publish-button__button`, size: "compact", children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_label.default, {}) }) }); } } /** * Renders the publish button. */ exports.PostPublishButton = PostPublishButton; var _default = exports.default = (0, _compose.compose)([(0, _data.withSelect)(select => { var _getCurrentPost$_link; const { isSavingPost, isAutosavingPost, isEditedPostBeingScheduled, getEditedPostVisibility, isCurrentPostPublished, isEditedPostSaveable, isEditedPostPublishable, isPostSavingLocked, getCurrentPost, getCurrentPostType, getCurrentPostId, hasNonPostEntityChanges, isSavingNonPostEntityChanges, getEditedPostAttribute, getPostEdits } = select(_store.store); return { isSaving: isSavingPost(), isAutoSaving: isAutosavingPost(), isBeingScheduled: isEditedPostBeingScheduled(), visibility: getEditedPostVisibility(), isSaveable: isEditedPostSaveable(), isPostSavingLocked: isPostSavingLocked(), isPublishable: isEditedPostPublishable(), isPublished: isCurrentPostPublished(), hasPublishAction: (_getCurrentPost$_link = getCurrentPost()._links?.['wp:action-publish']) !== null && _getCurrentPost$_link !== void 0 ? _getCurrentPost$_link : false, postType: getCurrentPostType(), postId: getCurrentPostId(), postStatus: getEditedPostAttribute('status'), postStatusHasChanged: getPostEdits()?.status, hasNonPostEntityChanges: hasNonPostEntityChanges(), isSavingNonPostEntityChanges: isSavingNonPostEntityChanges() }; }), (0, _data.withDispatch)(dispatch => { const { editPost, savePost } = dispatch(_store.store); return { savePostStatus: status => { editPost({ status }, { undoIgnore: true }); savePost(); } }; })])(PostPublishButton); //# sourceMappingURL=index.js.map