RevisionIdForm.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import { withUnstatedContainers } from '../UnstatedUtils';
  5. import RevisionCompareContainer from '../../services/RevisionCompareContainer';
  6. import UserDate from '../User/UserDate';
  7. import Username from '../User/Username';
  8. import UserPicture from '../User/UserPicture';
  9. const RevisionIdForm = (props) => {
  10. /**
  11. * render a revision selector
  12. * @param {label} label text of inputbox
  13. */
  14. const renderRevisionSelector = (label) => {
  15. if (['page_history.comparing_source', 'page_history.comparing_target'].indexOf(label) === -1) {
  16. return <></>;
  17. }
  18. const forFromRev = (label === 'page_history.comparing_source');
  19. const { t, revisionCompareContainer } = props;
  20. const selectedRevision = (forFromRev ? revisionCompareContainer.state.fromRevision : revisionCompareContainer.state.toRevision);
  21. const author = selectedRevision?.author;
  22. const pic = (typeof author === 'object') ? <UserPicture user={author} size="lg" /> : '';
  23. let islatestRevisionLabel = '';
  24. if (selectedRevision?._id === revisionCompareContainer.state.latestRevision?._id) {
  25. islatestRevisionLabel = <span>({t('page_history.latest_revision')})</span>;
  26. }
  27. return (
  28. <div className="card">
  29. <div className="card-header">{t(label)}</div>
  30. <div className="card-body">
  31. { selectedRevision && (
  32. <div className="revision-history-main d-flex mt-3">
  33. <div className="mt-2">
  34. {pic}
  35. </div>
  36. <div className="ml-2">
  37. <div className="revision-history-author">
  38. <strong><Username user={author}></Username></strong>
  39. </div>
  40. <div className="revision-history-meta">
  41. <p>
  42. <UserDate dateTime={selectedRevision.createdAt} />
  43. </p>
  44. </div>
  45. </div>
  46. </div>
  47. )}
  48. </div>
  49. <div className="card-footer text-muted">
  50. {selectedRevision && (
  51. <React.Fragment>
  52. {selectedRevision._id}{islatestRevisionLabel}
  53. </React.Fragment>
  54. )}
  55. </div>
  56. </div>
  57. );
  58. };
  59. const fromRevSelector = renderRevisionSelector('page_history.comparing_source');
  60. const toRevSelector = renderRevisionSelector('page_history.comparing_target');
  61. return (
  62. <div className="container-fluid px-0">
  63. <div className="row">
  64. <div className="mb-3 col-sm">
  65. { fromRevSelector }
  66. </div>
  67. <div className="mb-3 col-sm">
  68. { toRevSelector }
  69. </div>
  70. </div>
  71. </div>
  72. );
  73. };
  74. /**
  75. * Wrapper component for using unstated
  76. */
  77. const RevisionIdFormWrapper = withUnstatedContainers(RevisionIdForm, [RevisionCompareContainer]);
  78. /**
  79. * Properties
  80. */
  81. RevisionIdForm.propTypes = {
  82. t: PropTypes.func.isRequired, // i18next
  83. revisionCompareContainer: PropTypes.instanceOf(RevisionCompareContainer).isRequired,
  84. };
  85. /**
  86. * Properties
  87. */
  88. RevisionIdForm.defaultProps = {
  89. };
  90. export default withTranslation()(RevisionIdFormWrapper);