CreateTemplateModal.jsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. import React from 'react';
  2. import { pathUtils } from '@growi/core/dist/utils';
  3. import { useTranslation } from 'next-i18next';
  4. import PropTypes from 'prop-types';
  5. import { Modal, ModalHeader, ModalBody } from 'reactstrap';
  6. import urljoin from 'url-join';
  7. const CreateTemplateModal = (props) => {
  8. const { t } = useTranslation();
  9. const { path } = props;
  10. const parentPath = pathUtils.addTrailingSlash(path);
  11. function generateUrl(label) {
  12. return encodeURI(urljoin(parentPath, label, '#edit'));
  13. }
  14. /**
  15. * @param {string} target Which hierarchy to create [children, descendants]
  16. */
  17. function renderTemplateCard(target, label) {
  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. <a
  27. data-testid={`template-button-${target}`}
  28. href={generateUrl(label)}
  29. className="btn btn-sm btn-primary"
  30. id={`template-button-${target}`}
  31. >
  32. { t('Edit') }
  33. </a>
  34. </div>
  35. </div>
  36. );
  37. }
  38. return (
  39. <Modal isOpen={props.isOpen} toggle={props.onClose} data-testid="page-template-modal">
  40. <ModalHeader tag="h4" toggle={props.onClose} className="bg-primary text-light">
  41. {t('template.modal_label.Create/Edit Template Page')}
  42. </ModalHeader>
  43. <ModalBody>
  44. <div>
  45. <label className="form-label mb-4">
  46. <code>{parentPath}</code><br />
  47. { t('template.modal_label.Create template under') }
  48. </label>
  49. <div className="row row-cols-2">
  50. <div className="col">
  51. {renderTemplateCard('children', '_template')}
  52. </div>
  53. <div className="col">
  54. {renderTemplateCard('descendants', '__template')}
  55. </div>
  56. </div>
  57. </div>
  58. </ModalBody>
  59. </Modal>
  60. );
  61. };
  62. CreateTemplateModal.propTypes = {
  63. path: PropTypes.string.isRequired,
  64. isOpen: PropTypes.bool.isRequired,
  65. onClose: PropTypes.func.isRequired,
  66. };
  67. export default CreateTemplateModal;