ValueMappings.tsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import React, { PureComponent } from 'react';
  2. import MappingRow from './MappingRow';
  3. import { OptionModuleProps } from './module';
  4. import { MappingType, RangeMap, ValueMap } from 'app/types';
  5. interface State {
  6. mappings: Array<ValueMap | RangeMap>;
  7. nextIdToAdd: number;
  8. }
  9. export default class ValueMappings extends PureComponent<OptionModuleProps, State> {
  10. constructor(props) {
  11. super(props);
  12. const mappings = props.options.mappings;
  13. this.state = {
  14. mappings: mappings || [],
  15. nextIdToAdd: mappings.length > 0 ? this.getMaxIdFromMappings(mappings) : 1,
  16. };
  17. }
  18. getMaxIdFromMappings(mappings) {
  19. return Math.max.apply(null, mappings.map(mapping => mapping.id).map(m => m)) + 1;
  20. }
  21. addMapping = () =>
  22. this.setState(prevState => ({
  23. mappings: [
  24. ...prevState.mappings,
  25. {
  26. id: prevState.nextIdToAdd,
  27. operator: '',
  28. value: '',
  29. text: '',
  30. type: MappingType.ValueToText,
  31. from: '',
  32. to: '',
  33. },
  34. ],
  35. nextIdToAdd: prevState.nextIdToAdd + 1,
  36. }));
  37. onRemoveMapping = id => {
  38. this.setState(
  39. prevState => ({
  40. mappings: prevState.mappings.filter(m => {
  41. return m.id !== id;
  42. }),
  43. }),
  44. () => {
  45. this.props.onChange({ ...this.props.options, mappings: this.state.mappings });
  46. }
  47. );
  48. };
  49. updateGauge = mapping => {
  50. this.setState(
  51. prevState => ({
  52. mappings: prevState.mappings.map(m => {
  53. if (m.id === mapping.id) {
  54. return { ...mapping };
  55. }
  56. return m;
  57. }),
  58. }),
  59. () => {
  60. this.props.onChange({ ...this.props.options, mappings: this.state.mappings });
  61. }
  62. );
  63. };
  64. render() {
  65. const { mappings } = this.state;
  66. return (
  67. <div className="section gf-form-group">
  68. <h5 className="section-heading">Value mappings</h5>
  69. <div>
  70. {mappings.length > 0 &&
  71. mappings.map((mapping, index) => (
  72. <MappingRow
  73. key={`${mapping.text}-${index}`}
  74. mapping={mapping}
  75. updateMapping={this.updateGauge}
  76. removeMapping={() => this.onRemoveMapping(mapping.id)}
  77. />
  78. ))}
  79. </div>
  80. <div className="add-mapping-row" onClick={this.addMapping}>
  81. <div className="add-mapping-row-icon">
  82. <i className="fa fa-plus" />
  83. </div>
  84. <div className="add-mapping-row-label">Add mapping</div>
  85. </div>
  86. </div>
  87. );
  88. }
  89. }