RevisionIdForm.jsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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.state = {
  10. };
  11. this.loadFilteredRevisionOptions = this.loadFilteredRevisionOptions.bind(this);
  12. this.handleInputChange = this.handleInputChange.bind(this);
  13. }
  14. loadFilteredRevisionOptions(inputText, callback) {
  15. const { revisionCompareContainer } = this.props;
  16. const revisionOptions = revisionCompareContainer.state.recentRevisions.map(rev => {
  17. return { label: rev._id, value: rev._id };
  18. });
  19. const filteredRevisionOptions = revisionOptions.filter(rev =>
  20. rev.label.toLowerCase().includes(inputText.toLowerCase())
  21. );
  22. return callback(filteredRevisionOptions);
  23. }
  24. /**
  25. * render a row (Revision component and RevisionDiff component)
  26. * @param {label} label text of inputbox
  27. */
  28. renderRevisionSelector(label) {
  29. if (["FromRev", "ToRev"].indexOf(label) === -1) {
  30. return <div></div>
  31. }
  32. const { revisionCompareContainer } = this.props;
  33. const changeHandler = (label === "FromRev" ? revisionCompareContainer.handleFromRevisionChange : revisionCompareContainer.handleToRevisionChange);
  34. return (
  35. <div class="input-group mb-3 col-sm">
  36. <div class="input-group-prepend">
  37. <label class="input-group-text" for="inputGroupSelect01">{ label }</label>
  38. </div>
  39. <AsyncSelect
  40. cacheOptions
  41. loadOptions={this.loadFilteredRevisionOptions}
  42. defaultOptions
  43. onChange={(selectedOption) => changeHandler(selectedOption.value)}
  44. />
  45. </div>
  46. );
  47. }
  48. render() {
  49. const fromRevSelector = this.renderRevisionSelector("FromRev");
  50. const toRevSelector = this.renderRevisionSelector("ToRev");
  51. return (
  52. <div class="container-fluid px-0">
  53. <div class="row">
  54. { fromRevSelector }
  55. { toRevSelector }
  56. </div>
  57. </div>
  58. );
  59. }
  60. }
  61. /**
  62. * Wrapper component for using unstated
  63. */
  64. const RevisionIdFormWrapper = withUnstatedContainers(RevisionIdForm, [RevisionCompareContainer]);
  65. /**
  66. * Properties
  67. */
  68. RevisionIdForm.propTypes = {
  69. revisionCompareContainer: PropTypes.instanceOf(RevisionCompareContainer).isRequired,
  70. };
  71. /**
  72. * Properties
  73. */
  74. RevisionIdForm.defaultProps = {
  75. };
  76. export default RevisionIdFormWrapper;