RevisionIdForm.jsx 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. import React from 'react';
  2. import ReactSelect from 'react-select';
  3. import PropTypes from 'prop-types';
  4. import { format } from 'date-fns';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import PageHistroyContainer from '../../services/PageHistoryContainer';
  7. import RevisionCompareContainer from '../../services/RevisionCompareContainer';
  8. import UserDate from '../User/UserDate';
  9. import Username from '../User/Username';
  10. import UserPicture from '../User/UserPicture';
  11. const RevisionIdForm = (props) => {
  12. /**
  13. * create an Option array for AsyncSelect from the revision list
  14. */
  15. const revisionOptions = () => {
  16. const timeFormat = 'yyyy/MM/dd HH:mm:ss';
  17. const { revisions } = props.pageHistoryContainer.state;
  18. return revisions.map((rev) => {
  19. return { label: `${format(new Date(rev.createdAt), timeFormat)} - ${rev._id}`, value: rev._id };
  20. });
  21. }
  22. /**
  23. * render a revision selector
  24. * @param {label} label text of inputbox
  25. */
  26. const renderRevisionSelector = (label) => {
  27. if (['FromRev', 'ToRev'].indexOf(label) === -1) {
  28. return <></>;
  29. }
  30. const forFromRev = (label === 'FromRev');
  31. const { revisionCompareContainer } = props;
  32. const options = revisionOptions();
  33. const selectedRevision = (forFromRev ? revisionCompareContainer.state.fromRevision : revisionCompareContainer.state.toRevision);
  34. const value = options.find(it => it.value === selectedRevision?._id);
  35. const changeHandler = (forFromRev ? revisionCompareContainer.handleFromRevisionChange : revisionCompareContainer.handleToRevisionChange);
  36. const author = selectedRevision?.author;
  37. const pic = (typeof author === 'object') ? <UserPicture user={author} size="lg" /> : '';
  38. return (
  39. <div className="card">
  40. <div class="card-header">
  41. <ReactSelect
  42. options={options}
  43. onChange={selectedOption => changeHandler(selectedOption.value)}
  44. placeholder={label}
  45. value={value}
  46. />
  47. </div>
  48. <div className="card-body">
  49. { selectedRevision && (
  50. <div className="revision-history-main d-flex mt-3">
  51. <div className="mt-2">
  52. {pic}
  53. </div>
  54. <div className="ml-2">
  55. <div className="revision-history-author">
  56. <strong><Username user={author}></Username></strong>
  57. </div>
  58. <div className="revision-history-meta">
  59. <p>
  60. <UserDate dateTime={selectedRevision.createdAt} />
  61. </p>
  62. </div>
  63. </div>
  64. </div>
  65. )}
  66. </div>
  67. </div>
  68. );
  69. }
  70. const fromRevSelector = renderRevisionSelector('FromRev');
  71. const toRevSelector = renderRevisionSelector('ToRev');
  72. return (
  73. <div className="container-fluid px-0">
  74. <div className="row">
  75. <div className="mb-3 col-sm">
  76. { fromRevSelector }
  77. </div>
  78. <div className="mb-3 col-sm">
  79. { toRevSelector }
  80. </div>
  81. </div>
  82. </div>
  83. );
  84. }
  85. /**
  86. * Wrapper component for using unstated
  87. */
  88. const RevisionIdFormWrapper = withUnstatedContainers(RevisionIdForm, [PageHistroyContainer, RevisionCompareContainer]);
  89. /**
  90. * Properties
  91. */
  92. RevisionIdForm.propTypes = {
  93. pageHistoryContainer: PropTypes.instanceOf(PageHistroyContainer).isRequired,
  94. revisionCompareContainer: PropTypes.instanceOf(RevisionCompareContainer).isRequired,
  95. };
  96. /**
  97. * Properties
  98. */
  99. RevisionIdForm.defaultProps = {
  100. };
  101. export default RevisionIdFormWrapper;