import React from 'react'; import PropTypes from 'prop-types'; import { withTranslation } from 'react-i18next'; import { UncontrolledButtonDropdown, Button, DropdownToggle, DropdownMenu, DropdownItem, } from 'reactstrap'; import loggerFactory from '~/utils/logger'; import PageContainer from '~/client/services/PageContainer'; import AppContainer from '~/client/services/AppContainer'; import EditorContainer from '~/client/services/EditorContainer'; import { withUnstatedContainers } from './UnstatedUtils'; import GrantSelector from './SavePageControls/GrantSelector'; import { getOptionsToSave } from '~/client/util/editor'; // TODO: remove this when omitting unstated is completed import { useEditorMode, useSelectedGrant, useSelectedGrantGroupId, useSelectedGrantGroupName, } from '~/stores/ui'; import { useIsEditable, useSlackChannels } from '~/stores/context'; import { useIsSlackEnabled } from '~/stores/editor'; const logger = loggerFactory('growi:SavePageControls'); class SavePageControls extends React.Component { constructor(props) { super(props); const config = this.props.appContainer.getConfig(); this.isAclEnabled = config.isAclEnabled; this.updateGrantHandler = this.updateGrantHandler.bind(this); this.save = this.save.bind(this); this.saveAndOverwriteScopesOfDescendants = this.saveAndOverwriteScopesOfDescendants.bind(this); } updateGrantHandler(data) { const { mutateGrant, mutateGrantGroupId, mutateGrantGroupName } = this.props; mutateGrant(data.grant); mutateGrantGroupId(data.grantGroupId); mutateGrantGroupName(data.grantGroupName); } async save() { const { isSlackEnabled, slackChannels, grant, grantGroupId, grantGroupName, pageContainer, editorContainer, } = this.props; // disable unsaved warning editorContainer.disableUnsavedWarning(); try { // save const optionsToSave = getOptionsToSave(isSlackEnabled, slackChannels, grant, grantGroupId, grantGroupName, editorContainer); await pageContainer.saveAndReload(optionsToSave, this.props.editorMode); } catch (error) { logger.error('failed to save', error); pageContainer.showErrorToastr(error); if (error.code === 'conflict') { pageContainer.setState({ remoteRevisionId: error.data.revisionId, remoteRevisionBody: error.data.revisionBody, remoteRevisionUpdateAt: error.data.createdAt, lastUpdateUser: error.data.user, }); } } } saveAndOverwriteScopesOfDescendants() { const { isSlackEnabled, slackChannels, grant, grantGroupId, grantGroupName, pageContainer, editorContainer, } = this.props; // disable unsaved warning editorContainer.disableUnsavedWarning(); // save const currentOptionsToSave = getOptionsToSave(isSlackEnabled, slackChannels, grant, grantGroupId, grantGroupName, editorContainer); const optionsToSave = Object.assign(currentOptionsToSave, { overwriteScopesOfDescendants: true, }); pageContainer.saveAndReload(optionsToSave, this.props.editorMode); } render() { const { t, pageContainer, grant, grantGroupId, grantGroupName, } = this.props; const isRootPage = pageContainer.state.path === '/'; const labelSubmitButton = pageContainer.state.pageId == null ? t('Create') : t('Update'); const labelOverwriteScopes = t('page_edit.overwrite_scopes', { operation: labelSubmitButton }); return (