toolbar.jsx 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import React from 'react';
  2. import { Tag, Icon, Modal, Button } from 'antd';
  3. import FilterBox from './filterBox';
  4. import emitter from '../../../eventManger/ev';
  5. import './toolbar.less';
  6. class Toolar extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. this.state = {
  10. filters: props.filters || [],
  11. showFilterBox: false
  12. }
  13. }
  14. filterUsingChange = (e) => {
  15. const key = e.target.dataset.key;
  16. const { filters } = this.state;
  17. let nextFilters = filters.map(f => {
  18. if(f.key == key) {
  19. f.using = !f.using
  20. }
  21. return f;
  22. });
  23. this.setState({ filters: nextFilters });
  24. }
  25. showFilterBox = (e) => {
  26. this.setState({
  27. showFilterBox: true
  28. });
  29. }
  30. hideFilterBox = (e) => {
  31. this.setState({
  32. showFilterBox: false,
  33. });
  34. }
  35. /**
  36. * 生成过滤条件
  37. */
  38. createFilters = () => {
  39. emitter.emit('getFilters', function(filters) {
  40. this.setState({
  41. filters: filters
  42. }, ()=>{console.log(this.state.filters)});
  43. this.hideFilterBox()
  44. }.bind(this));
  45. }
  46. /**
  47. * 生成过滤规则文本
  48. */
  49. createFilterLabel = (filter) => {
  50. let { label, name, operator, operatorLabel, type, using, value1, value2 } = filter;
  51. let filterLabel;
  52. if(type == 'string') {
  53. if(operator == 'null') {
  54. filterLabel = `${label} ${operatorLabel}`;
  55. }else {
  56. filterLabel = `${label} ${operatorLabel} ${value1}`;
  57. }
  58. }else if(type == 'number') {
  59. if(operator == 'null') {
  60. filterLabel = `${label} ${operatorLabel}`;
  61. }else if(operator == 'betwen') {
  62. filterLabel = `${label} ${operatorLabel} ${value1} ~ ${value2}`;
  63. }else {
  64. filterLabel = `${label} ${operatorLabel} ${value1}`;
  65. }
  66. }else if(type == 'time') {
  67. value1 = new Date(value1).format('yyyy/MM/dd');
  68. value2 = new Date(value2).format('yyyy/MM/dd');
  69. if(operator == 'null') {
  70. filterLabel = `${label} ${operatorLabel}`;
  71. }else if(operator == 'betwen') {
  72. filterLabel = `${label} ${operatorLabel} ${value1} ~ ${value2}`;
  73. }else {
  74. filterLabel = `${label} ${operatorLabel} ${value1}`;
  75. }
  76. }else if(type == 'categorical') {
  77. if(operator == 'null') {
  78. filterLabel = `${label} ${operatorLabel}`;
  79. }else {
  80. filterLabel = `${label} ${operatorLabel} ${value1}`;
  81. }
  82. }else {
  83. filterLabel = '错误条件';
  84. }
  85. return filterLabel;
  86. }
  87. render() {
  88. const { filters, showFilterBox } = this.state;
  89. let tags = filters.map((f, i)=>{
  90. return {
  91. key: f.key,
  92. label: this.createFilterLabel(f),
  93. using: f.using
  94. }
  95. });
  96. return (
  97. <div className='toolbar'>
  98. <div className='filters'>
  99. <h6 style={{ marginRight: 8, display: 'inline' }}>筛选:</h6>
  100. {tags.map(tag => (
  101. <Tag
  102. className={`filter-tag ${tag.using?'filter-tag-using':''}`}
  103. key={tag.key}
  104. closable={false}
  105. onClick={this.filterUsingChange}
  106. data-key={tag.key}
  107. >
  108. {tag.label}
  109. </Tag>
  110. ))}
  111. <Tag
  112. onClick={this.showFilterBox}
  113. className={`filter-tag filter-tag-add`}
  114. >
  115. <Icon type="bars" />
  116. 筛选条件管理
  117. </Tag>
  118. </div>
  119. <div className='tools'>
  120. <Button className='tools-button' size='small'>按钮</Button>
  121. </div>
  122. <Modal
  123. className='filter-box'
  124. title="筛选条件管理"
  125. visible={showFilterBox}
  126. onOk={this.createFilters}
  127. onCancel={this.hideFilterBox}
  128. maskClosable={false}
  129. destroyOnClose={true}
  130. >
  131. <FilterBox filterData={filters}/>
  132. </Modal>
  133. </div>
  134. );
  135. }
  136. }
  137. export default Toolar;