SavePageControls.tsx 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. import React, { useCallback } from 'react';
  2. import EventEmitter from 'events';
  3. import { pagePathUtils, PageGrant } from '@growi/core';
  4. import { useTranslation } from 'next-i18next';
  5. import {
  6. UncontrolledButtonDropdown, Button,
  7. DropdownToggle, DropdownMenu, DropdownItem,
  8. } from 'reactstrap';
  9. import { IPageGrantData } from '~/interfaces/page';
  10. import {
  11. useIsEditable, useCurrentPageId, useIsAclEnabled,
  12. } from '~/stores/context';
  13. import { useCurrentPagePath } from '~/stores/page';
  14. import { useSelectedGrant } from '~/stores/ui';
  15. import loggerFactory from '~/utils/logger';
  16. import GrantSelector from './SavePageControls/GrantSelector';
  17. declare const globalEmitter: EventEmitter;
  18. const logger = loggerFactory('growi:SavePageControls');
  19. const { isTopPage } = pagePathUtils;
  20. export const SavePageControls = (): JSX.Element | null => {
  21. const { t } = useTranslation();
  22. const { data: currentPagePath } = useCurrentPagePath();
  23. const { data: isEditable } = useIsEditable();
  24. const { data: isAclEnabled } = useIsAclEnabled();
  25. const { data: grantData, mutate: mutateGrant } = useSelectedGrant();
  26. const { data: pageId } = useCurrentPageId();
  27. const updateGrantHandler = useCallback((grantData: IPageGrantData): void => {
  28. mutateGrant(grantData);
  29. }, [mutateGrant]);
  30. const save = useCallback(async(): Promise<void> => {
  31. // save
  32. globalEmitter.emit('saveAndReturnToView');
  33. }, []);
  34. const saveAndOverwriteScopesOfDescendants = useCallback(() => {
  35. // save
  36. globalEmitter.emit('saveAndReturnToView', { overwriteScopesOfDescendants: true });
  37. }, []);
  38. if (isEditable == null || isAclEnabled == null || grantData == null) {
  39. return null;
  40. }
  41. if (!isEditable) {
  42. return null;
  43. }
  44. const { grant, grantedGroup } = grantData;
  45. const isRootPage = isTopPage(currentPagePath ?? '');
  46. const labelSubmitButton = pageId == null ? t('Create') : t('Update');
  47. const labelOverwriteScopes = t('page_edit.overwrite_scopes', { operation: labelSubmitButton });
  48. return (
  49. <div className="d-flex align-items-center form-inline flex-nowrap">
  50. {isAclEnabled
  51. && (
  52. <div className="mr-2">
  53. <GrantSelector
  54. grant={grant}
  55. disabled={isRootPage}
  56. grantGroupId={grantedGroup?.id}
  57. grantGroupName={grantedGroup?.name}
  58. onUpdateGrant={updateGrantHandler}
  59. />
  60. </div>
  61. )
  62. }
  63. <UncontrolledButtonDropdown direction="up">
  64. <Button data-testid="save-page-btn" id="caret" color="primary" className="btn-submit" onClick={save}>
  65. {labelSubmitButton}
  66. </Button>
  67. <DropdownToggle caret color="primary" />
  68. <DropdownMenu right>
  69. <DropdownItem onClick={saveAndOverwriteScopesOfDescendants}>
  70. {labelOverwriteScopes}
  71. </DropdownItem>
  72. </DropdownMenu>
  73. </UncontrolledButtonDropdown>
  74. </div>
  75. );
  76. };