RevisionIdForm.jsx 2.7 KB

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