QueryRows.tsx 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. import React, { PureComponent } from 'react';
  2. import promql from './slate-plugins/prism/promql';
  3. import QueryField from './QueryField';
  4. class QueryRow extends PureComponent<any, any> {
  5. constructor(props) {
  6. super(props);
  7. this.state = {
  8. edited: false,
  9. query: props.query || '',
  10. };
  11. }
  12. handleChangeQuery = value => {
  13. const { index, onChangeQuery } = this.props;
  14. const { query } = this.state;
  15. const edited = query !== value;
  16. this.setState({ edited, query: value });
  17. if (onChangeQuery) {
  18. onChangeQuery(value, index);
  19. }
  20. };
  21. handleClickAddButton = () => {
  22. const { index, onAddQueryRow } = this.props;
  23. if (onAddQueryRow) {
  24. onAddQueryRow(index);
  25. }
  26. };
  27. handleClickRemoveButton = () => {
  28. const { index, onRemoveQueryRow } = this.props;
  29. if (onRemoveQueryRow) {
  30. onRemoveQueryRow(index);
  31. }
  32. };
  33. handlePressEnter = () => {
  34. const { onExecuteQuery } = this.props;
  35. if (onExecuteQuery) {
  36. onExecuteQuery();
  37. }
  38. };
  39. render() {
  40. const { request } = this.props;
  41. const { edited, query } = this.state;
  42. return (
  43. <div className="query-row">
  44. <div className="query-row-tools">
  45. <button className="btn navbar-button navbar-button--tight" onClick={this.handleClickAddButton}>
  46. <i className="fa fa-plus" />
  47. </button>
  48. <button className="btn navbar-button navbar-button--tight" onClick={this.handleClickRemoveButton}>
  49. <i className="fa fa-minus" />
  50. </button>
  51. </div>
  52. <div className="slate-query-field-wrapper">
  53. <QueryField
  54. initialQuery={edited ? null : query}
  55. portalPrefix="explore"
  56. onPressEnter={this.handlePressEnter}
  57. onQueryChange={this.handleChangeQuery}
  58. placeholder="Enter a PromQL query"
  59. prismLanguage="promql"
  60. prismDefinition={promql}
  61. request={request}
  62. />
  63. </div>
  64. </div>
  65. );
  66. }
  67. }
  68. export default class QueryRows extends PureComponent<any, any> {
  69. render() {
  70. const { className = '', queries, ...handlers } = this.props;
  71. return (
  72. <div className={className}>
  73. {queries.map((q, index) => <QueryRow key={q.key} index={index} query={q.query} {...handlers} />)}
  74. </div>
  75. );
  76. }
  77. }