CreateTemplateModal.tsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import React, { useCallback } from 'react';
  2. import { pathUtils } from '@growi/core/dist/utils';
  3. import { useTranslation } from 'next-i18next';
  4. import { Modal, ModalHeader, ModalBody } from 'reactstrap';
  5. import { useOnTemplateButtonClicked } from '~/client/services/use-on-template-button-clicked';
  6. import { toastError } from '~/client/util/toastr';
  7. import { TargetType, LabelType } from '~/interfaces/template';
  8. type TemplateCardProps = {
  9. target: TargetType;
  10. label: LabelType;
  11. isPageCreating: boolean;
  12. onClickHandler: () => void;
  13. };
  14. const TemplateCard: React.FC<TemplateCardProps> = ({
  15. target, label, isPageCreating, onClickHandler,
  16. }) => {
  17. const { t } = useTranslation();
  18. return (
  19. <div className="card card-select-template">
  20. <div className="card-header">{t(`template.${target}.label`)}</div>
  21. <div className="card-body">
  22. <p className="text-center"><code>{label}</code></p>
  23. <p className="form-text text-muted text-center"><small>{t(`template.${target}.desc`)}</small></p>
  24. </div>
  25. <div className="card-footer text-center">
  26. <button
  27. disabled={isPageCreating}
  28. data-testid={`template-button-${target}`}
  29. className="btn btn-sm btn-primary"
  30. id={`template-button-${target}`}
  31. onClick={onClickHandler}
  32. type="button"
  33. >
  34. {t('Edit')}
  35. </button>
  36. </div>
  37. </div>
  38. );
  39. };
  40. type CreateTemplateModalProps = {
  41. path: string;
  42. isOpen: boolean;
  43. onClose: () => void;
  44. };
  45. export const CreateTemplateModal: React.FC<CreateTemplateModalProps> = ({
  46. path, isOpen, onClose,
  47. }) => {
  48. const { t } = useTranslation();
  49. const { onClickHandler: onClickTemplateButton, isPageCreating } = useOnTemplateButtonClicked(path);
  50. const onClickTemplateButtonHandler = useCallback(async(label: LabelType) => {
  51. try {
  52. await onClickTemplateButton(label);
  53. }
  54. catch (err) {
  55. toastError(err);
  56. }
  57. }, [onClickTemplateButton]);
  58. const parentPath = pathUtils.addTrailingSlash(path);
  59. const renderTemplateCard = (target: TargetType, label: LabelType) => (
  60. <div className="col">
  61. <TemplateCard
  62. target={target}
  63. label={label}
  64. isPageCreating={isPageCreating}
  65. onClickHandler={() => onClickTemplateButtonHandler(label)}
  66. />
  67. </div>
  68. );
  69. return (
  70. <Modal isOpen={isOpen} toggle={onClose} data-testid="page-template-modal">
  71. <ModalHeader tag="h4" toggle={onClose} className="bg-primary text-light">
  72. {t('template.modal_label.Create/Edit Template Page')}
  73. </ModalHeader>
  74. <ModalBody>
  75. <div>
  76. <label className="form-label mb-4">
  77. <code>{parentPath}</code><br />
  78. {t('template.modal_label.Create template under')}
  79. </label>
  80. <div className="row row-cols-2">
  81. {renderTemplateCard('children', '_template')}
  82. {renderTemplateCard('descendants', '__template')}
  83. </div>
  84. </div>
  85. </ModalBody>
  86. </Modal>
  87. );
  88. };