2
0

RevisionIdForm.jsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React from 'react';
  2. import AsyncSelect from 'react-select/async';
  3. import ReactSelect from 'react-select';
  4. import PropTypes from 'prop-types';
  5. import { withUnstatedContainers } from '../UnstatedUtils';
  6. import RevisionCompareContainer from '../../services/RevisionCompareContainer';
  7. class RevisionIdForm extends React.Component {
  8. /**
  9. * create an Option array for AsyncSelect from the revision list
  10. */
  11. revisionOptions() {
  12. const { revisionCompareContainer } = this.props;
  13. return revisionCompareContainer.state.revisions.map(rev => {
  14. return { label: `${new Date(rev.createdAt)} - ${rev._id}`, value: rev._id };
  15. });
  16. }
  17. /**
  18. * render a revision selector
  19. * @param {label} label text of inputbox
  20. */
  21. renderRevisionSelector(label) {
  22. if (["FromRev", "ToRev"].indexOf(label) === -1) {
  23. return <></>
  24. }
  25. const forFromRev = (label === "FromRev");
  26. const { revisionCompareContainer } = this.props;
  27. const options = this.revisionOptions();
  28. const selectedRevisionId = (forFromRev ? revisionCompareContainer.state.fromRevision?._id : revisionCompareContainer.state.toRevision?._id );
  29. const value = options.find(it => it.value === selectedRevisionId);
  30. const changeHandler = (forFromRev ? revisionCompareContainer.handleFromRevisionChange : revisionCompareContainer.handleToRevisionChange);
  31. return (
  32. <ReactSelect
  33. options={options}
  34. onChange={(selectedOption) => changeHandler(selectedOption.value)}
  35. placeholder={label}
  36. value={value}
  37. />
  38. );
  39. }
  40. render() {
  41. const fromRevSelector = this.renderRevisionSelector("FromRev");
  42. const toRevSelector = this.renderRevisionSelector("ToRev");
  43. return (
  44. <div className="container-fluid px-0">
  45. <div className="row">
  46. <div className="mb-3 col-sm">
  47. { fromRevSelector }
  48. </div>
  49. <div className="mb-3 col-sm">
  50. { toRevSelector }
  51. </div>
  52. </div>
  53. </div>
  54. );
  55. }
  56. }
  57. /**
  58. * Wrapper component for using unstated
  59. */
  60. const RevisionIdFormWrapper = withUnstatedContainers(RevisionIdForm, [RevisionCompareContainer]);
  61. /**
  62. * Properties
  63. */
  64. RevisionIdForm.propTypes = {
  65. revisionCompareContainer: PropTypes.instanceOf(RevisionCompareContainer).isRequired,
  66. };
  67. /**
  68. * Properties
  69. */
  70. RevisionIdForm.defaultProps = {
  71. };
  72. export default RevisionIdFormWrapper;