MappingRow.tsx 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. import React, { PureComponent } from 'react';
  2. import { Label } from 'app/core/components/Label/Label';
  3. import ToggleButtonGroup, { ToggleButton } from 'app/core/components/ToggleButtonGroup/ToggleButtonGroup';
  4. import { MappingType, RangeMap, ValueMap } from 'app/types';
  5. interface Props {
  6. mapping: ValueMap | RangeMap;
  7. updateMapping: (mapping) => void;
  8. removeMapping: () => void;
  9. }
  10. interface State {
  11. mapping: ValueMap | RangeMap;
  12. }
  13. export default class MappingRow extends PureComponent<Props, State> {
  14. constructor(props) {
  15. super(props);
  16. this.state = {
  17. mapping: props.mapping,
  18. };
  19. }
  20. onMappingValueChange = event => {
  21. const { mapping } = this.state;
  22. const updatedMapping = { ...mapping, value: event.target.value };
  23. this.setState({ mapping: updatedMapping });
  24. };
  25. onMappingFromChange = event => {
  26. const { mapping } = this.state;
  27. const updatedMapping = { ...mapping, from: event.target.value };
  28. this.setState({ mapping: updatedMapping });
  29. };
  30. onMappingToChange = event => {
  31. const { mapping } = this.state;
  32. const updatedMapping = { ...mapping, to: event.target.value };
  33. this.setState({ mapping: updatedMapping });
  34. };
  35. onMappingTextChange = event => {
  36. const { mapping } = this.state;
  37. const updatedMapping = { ...mapping, text: event.target.value };
  38. this.setState({ mapping: updatedMapping });
  39. };
  40. onMappingTypeChange = mappingType => {
  41. const { mapping } = this.state;
  42. const updatedMapping = { ...mapping, type: mappingType };
  43. this.setState({ mapping: updatedMapping });
  44. };
  45. updateMapping = () => {
  46. const { mapping } = this.state;
  47. this.props.updateMapping(mapping);
  48. };
  49. renderRow() {
  50. const { mapping } = this.state;
  51. if (mapping.type === MappingType.RangeToText) {
  52. const rangeMap = mapping as RangeMap;
  53. return (
  54. <div className="gf-form">
  55. <div className="gf-form-inline mapping-row-input">
  56. <Label width={4}>From</Label>
  57. <div>
  58. <input
  59. className="gf-form-input"
  60. value={rangeMap.from}
  61. onBlur={this.updateMapping}
  62. onChange={this.onMappingFromChange}
  63. />
  64. </div>
  65. </div>
  66. <div className="gf-form-inline mapping-row-input">
  67. <Label width={4}>To</Label>
  68. <div>
  69. <input
  70. className="gf-form-input"
  71. value={rangeMap.to}
  72. onBlur={this.updateMapping}
  73. onChange={this.onMappingToChange}
  74. />
  75. </div>
  76. </div>
  77. <div className="gf-form-inline mapping-row-input">
  78. <Label width={4}>Text</Label>
  79. <div>
  80. <input
  81. className="gf-form-input"
  82. value={rangeMap.text}
  83. onBlur={this.updateMapping}
  84. onChange={this.onMappingTextChange}
  85. />
  86. </div>
  87. </div>
  88. </div>
  89. );
  90. }
  91. const valueMap = mapping as ValueMap;
  92. return (
  93. <div className="gf-form">
  94. <div className="gf-form-inline mapping-row-input">
  95. <Label width={4}>Value</Label>
  96. <div>
  97. <input
  98. className="gf-form-input"
  99. onBlur={this.updateMapping}
  100. onChange={this.onMappingValueChange}
  101. value={valueMap.value}
  102. />
  103. </div>
  104. </div>
  105. <div className="gf-form-inline mapping-row-input">
  106. <Label width={4}>Text</Label>
  107. <div>
  108. <input
  109. className="gf-form-input"
  110. onBlur={this.updateMapping}
  111. value={valueMap.text}
  112. onChange={this.onMappingTextChange}
  113. />
  114. </div>
  115. </div>
  116. </div>
  117. );
  118. }
  119. render() {
  120. const { mapping } = this.state;
  121. return (
  122. <div className="mapping-row">
  123. <div className="mapping-row-type">
  124. <ToggleButtonGroup
  125. onChange={mappingType => this.onMappingTypeChange(mappingType)}
  126. value={mapping.type}
  127. stackedButtons={true}
  128. render={({ selectedValue, onChange, stackedButtons }) => {
  129. return [
  130. <ToggleButton
  131. className="btn-small"
  132. key="value"
  133. onChange={onChange}
  134. selected={selectedValue === MappingType.ValueToText}
  135. value={MappingType.ValueToText}
  136. stackedButtons={stackedButtons}
  137. >
  138. Value
  139. </ToggleButton>,
  140. <ToggleButton
  141. className="btn-small"
  142. key="range"
  143. onChange={onChange}
  144. selected={selectedValue === MappingType.RangeToText}
  145. value={MappingType.RangeToText}
  146. stackedButtons={stackedButtons}
  147. >
  148. Range
  149. </ToggleButton>,
  150. ];
  151. }}
  152. />
  153. </div>
  154. <div>{this.renderRow()}</div>
  155. <div onClick={this.props.removeMapping} className="threshold-row-remove">
  156. <i className="fa fa-times" />
  157. </div>
  158. </div>
  159. );
  160. }
  161. }