CreateTemplateModal.jsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { Modal, ModalHeader, ModalBody } from 'reactstrap';
  4. import { withTranslation } from 'react-i18next';
  5. import { pathUtils } from 'growi-commons';
  6. import urljoin from 'url-join';
  7. import { withUnstatedContainers } from './UnstatedUtils';
  8. import PageContainer from '../services/PageContainer';
  9. const CreateTemplateModal = (props) => {
  10. const { t, pageContainer } = props;
  11. const { path } = pageContainer.state;
  12. const parentPath = pathUtils.addTrailingSlash(path);
  13. function generateUrl(label) {
  14. return encodeURI(urljoin(parentPath, label, '#edit'));
  15. }
  16. /**
  17. * @param {string} target Which hierarchy to create [children, decendants]
  18. */
  19. function renderTemplateCard(target, label) {
  20. return (
  21. <div className="card card-select-template">
  22. <div className="card-header">{ t(`template.${target}.label`) }</div>
  23. <div className="card-body">
  24. <p className="text-center"><code>{label}</code></p>
  25. <p className="form-text text-muted text-center"><small>{t(`template.${target}.desc`) }</small></p>
  26. </div>
  27. <div className="card-footer text-center">
  28. <a
  29. href={generateUrl(label)}
  30. className="btn btn-sm btn-primary"
  31. id={`template-button-${target}`}
  32. >
  33. { t('Edit') }
  34. </a>
  35. </div>
  36. </div>
  37. );
  38. }
  39. return (
  40. <Modal isOpen={props.isOpen} toggle={props.onClose} className="grw-create-page">
  41. <ModalHeader tag="h4" toggle={props.onClose} className="bg-primary text-light">
  42. {t('template.modal_label.Create/Edit Template Page')}
  43. </ModalHeader>
  44. <ModalBody>
  45. <div className="form-group">
  46. <label className="mb-4">
  47. <code>{parentPath}</code><br />
  48. { t('template.modal_label.Create template under') }
  49. </label>
  50. <div className="card-deck">
  51. {renderTemplateCard('children', '_template')}
  52. {renderTemplateCard('decendants', '__template')}
  53. </div>
  54. </div>
  55. </ModalBody>
  56. </Modal>
  57. );
  58. };
  59. /**
  60. * Wrapper component for using unstated
  61. */
  62. const CreateTemplateModalWrapper = withUnstatedContainers(CreateTemplateModal, [PageContainer]);
  63. CreateTemplateModal.propTypes = {
  64. t: PropTypes.func.isRequired, // i18next
  65. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  66. isOpen: PropTypes.bool.isRequired,
  67. onClose: PropTypes.func.isRequired,
  68. };
  69. export default withTranslation()(CreateTemplateModalWrapper);