CreateTemplateModal.tsx 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. import React 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 { TargetType, LabelType } from '~/interfaces/template';
  6. import { useOnTemplateButtonClicked } from './Navbar/hooks';
  7. type TemplateCardProps = {
  8. target: TargetType;
  9. label: LabelType;
  10. isPageCreating: boolean;
  11. onClickHandler: () => void;
  12. };
  13. const TemplateCard: React.FC<TemplateCardProps> = ({
  14. target, label, isPageCreating, onClickHandler,
  15. }) => {
  16. const { t } = useTranslation();
  17. return (
  18. <div className="card card-select-template">
  19. <div className="card-header">{t(`template.${target}.label`)}</div>
  20. <div className="card-body">
  21. <p className="text-center"><code>{label}</code></p>
  22. <p className="form-text text-muted text-center"><small>{t(`template.${target}.desc`)}</small></p>
  23. </div>
  24. <div className="card-footer text-center">
  25. <button
  26. disabled={isPageCreating}
  27. data-testid={`template-button-${target}`}
  28. className="btn btn-sm btn-primary"
  29. id={`template-button-${target}`}
  30. onClick={onClickHandler}
  31. type="button"
  32. >
  33. {t('Edit')}
  34. </button>
  35. </div>
  36. </div>
  37. );
  38. };
  39. type CreateTemplateModalProps = {
  40. path: string;
  41. isOpen: boolean;
  42. onClose: () => void;
  43. };
  44. export const CreateTemplateModal: React.FC<CreateTemplateModalProps> = ({
  45. path, isOpen, onClose,
  46. }) => {
  47. const { t } = useTranslation();
  48. const { onClickHandler: onClickTemplateButton, isPageCreating } = useOnTemplateButtonClicked(path);
  49. const parentPath = pathUtils.addTrailingSlash(path);
  50. const renderTemplateCard = (target: TargetType, label: LabelType) => (
  51. <div className="col">
  52. <TemplateCard
  53. target={target}
  54. label={label}
  55. isPageCreating={isPageCreating}
  56. onClickHandler={() => onClickTemplateButton(label)}
  57. />
  58. </div>
  59. );
  60. return (
  61. <Modal isOpen={isOpen} toggle={onClose} data-testid="page-template-modal">
  62. <ModalHeader tag="h4" toggle={onClose} className="bg-primary text-light">
  63. {t('template.modal_label.Create/Edit Template Page')}
  64. </ModalHeader>
  65. <ModalBody>
  66. <div>
  67. <label className="form-label mb-4">
  68. <code>{parentPath}</code><br />
  69. {t('template.modal_label.Create template under')}
  70. </label>
  71. <div className="row row-cols-2">
  72. {renderTemplateCard('children', '_template')}
  73. {renderTemplateCard('descendants', '__template')}
  74. </div>
  75. </div>
  76. </ModalBody>
  77. </Modal>
  78. );
  79. };