viewLayout.jsx 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import React from "react"
  2. import "./viewLayout.less"
  3. import ReactGridLayout from 'react-grid-layout'
  4. import { Icon, Modal, Tooltip } from 'antd'
  5. import { connect } from 'dva'
  6. import ChartView from './chartView'
  7. class ViewLayout extends React.PureComponent {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. visiblePreviewBox: false,
  12. screenWidth: document.documentElement.clientWidth || document.body.clientWidth,
  13. screenHeight: document.documentElement.clientHeight || document.body.clientHeight
  14. };
  15. }
  16. componentDidMount() {
  17. window.addEventListener('resize', this.onWindowResize);
  18. }
  19. componentWillUnmount() {
  20. window.removeEventListener('resize', this.onWindowResize);
  21. }
  22. onWindowResize = () => {
  23. this.setState({
  24. screenWidth: document.documentElement.clientWidth || document.body.clientWidth,
  25. screenHeight: document.documentElement.clientHeight || document.body.clientHeight
  26. });
  27. }
  28. createElement = (item, isPreview) => {
  29. const { dispatch, main, dashboardDesigner } = this.props;
  30. const { currentUser } = main;
  31. const { editMode } = dashboardDesigner;
  32. const { code, name, viewType, layout, chartCode, filters } = item;
  33. return (
  34. <div className={`chartview${editMode ? ' chartview-edit' : ''}`} key={code} data-grid={layout}>
  35. <div className='chartview-toolbar mover'>
  36. <div className='chart-title'><span>{name}</span></div>
  37. <div className='chart-tools'>
  38. {viewType !== 'richText' && !!filters && filters.length > 0 && <Tooltip title={'默认过滤条件: 【' + filters.map((f, i) => f.filterLabel).join(',') + '】'}>
  39. <Icon className='visible-icon' type="info-circle" theme="outlined" />
  40. </Tooltip>}
  41. {!isPreview && viewType !== 'richText' && <Icon type="arrows-alt" onClick={() => this.showPreviewBox(item)}/>}
  42. {editMode && item.creatorCode === currentUser.code && viewType !== 'richText' && <Icon type='edit' onClick={() => {
  43. dispatch({ type: 'dashboard/remoteModify' });
  44. dispatch({ type: 'chartDesigner/reset' });
  45. dispatch({ type: 'main/redirect', path: '/chart/' + chartCode });
  46. }}/>}
  47. {!isPreview && editMode && item.creatorCode === currentUser.code && <Icon type='delete' onClick={() => {
  48. dispatch({ type: 'dashboardDesigner/deleteItem', item });
  49. }} />}
  50. {isPreview && <Icon type="close" onClick={this.hidePreviewBox}/>}
  51. </div>
  52. </div>
  53. <ChartView tableBodyHeight={isPreview ? (this.state.screenHeight * 0.8 - 24 - 40 - 50 - 38) : 50 * layout.h - 30 - 50 -38} editMode={isPreview ? false : editMode} item={{...item}}/>
  54. </div>
  55. )
  56. }
  57. onLayoutChange = (layout) => {
  58. const { dispatch, reset } = this.props;
  59. dispatch({ type: 'dashboardDesigner/changeLayout', layout });
  60. setTimeout(() => {
  61. reset();
  62. }, 500)
  63. }
  64. onResize = () => {
  65. const { reset } = this.props;
  66. reset();
  67. }
  68. showPreviewBox = (item) => {
  69. this.setState({
  70. previewItem: item,
  71. visiblePreviewBox: true
  72. });
  73. }
  74. hidePreviewBox = () => {
  75. this.setState({
  76. visiblePreviewBox: false
  77. });
  78. }
  79. render() {
  80. const { dashboardDesigner, contentSize } = this.props;
  81. const { editMode } = dashboardDesigner;
  82. const { visiblePreviewBox, previewItem } = this.state;
  83. const children = dashboardDesigner.items.map((item) => this.createElement(item));
  84. return (<div>
  85. <ReactGridLayout
  86. width={contentSize.width}
  87. autoSize={true}
  88. cols={12}
  89. margin = {editMode ? [2, 2] : [0, 0]}
  90. rowHeight = {50}
  91. isDraggable={editMode}
  92. isResizable={editMode}
  93. draggableHandle='.mover'
  94. onLayoutChange={this.onLayoutChange}
  95. onResize={this.onResize}
  96. onBreakpointChange={this.onBreakpointChange}
  97. verticalCompact={true}
  98. compactType='vertical'
  99. >
  100. {children}
  101. </ReactGridLayout>
  102. <Modal
  103. className='previewbox'
  104. width='80%'
  105. height='80%'
  106. visible={visiblePreviewBox}
  107. onCancel={this.hidePreviewBox}
  108. footer={null}
  109. keyboard={true}
  110. maskClosable={true}
  111. >
  112. {previewItem && this.createElement(previewItem, true)}
  113. </Modal>
  114. </div>);
  115. }
  116. }
  117. export default connect(({ present: { main, dashboardDesigner } }) => ({ main, dashboardDesigner }))(ViewLayout);