WidgetSelectModal.tsx 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. /*
  2. * <<
  3. * Davinci
  4. * ==
  5. * Copyright (C) 2016 - 2017 EDP
  6. * ==
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. * >>
  19. */
  20. import React, { useCallback, useState, useMemo, useRef, useEffect } from 'react'
  21. import { Steps, Modal } from 'antd'
  22. const { Step } = Steps
  23. import { IWidgetFormed } from 'containers/Widget/types'
  24. import WidgetSelector from 'containers/Widget/components/WidgetSelector'
  25. import PollingConfig, { PollingSetting } from './PollingConfig'
  26. import { NativeButtonProps } from 'antd/lib/button/button'
  27. import { WrappedFormUtils } from 'antd/lib/form/Form'
  28. interface IWidgetSelectModalProps {
  29. visible: boolean
  30. loading: boolean
  31. multiple: boolean
  32. widgets: IWidgetFormed[]
  33. onOk: (widgets: IWidgetFormed[], pollingSetting: PollingSetting) => void
  34. onCancel: () => void
  35. }
  36. const WidgetSelectModal: React.FC<IWidgetSelectModalProps> = (props) => {
  37. const { visible, loading, multiple, widgets, onOk, onCancel } = props
  38. const [currentStep, setCurrentStep] = useState(0)
  39. const [selectedWidgets, setSelectedWidgets] = useState([])
  40. const refPollingConfig = useRef<WrappedFormUtils<PollingSetting>>(null)
  41. useEffect(() => {
  42. if (!visible) {
  43. refPollingConfig.current && refPollingConfig.current.resetFields()
  44. setSelectedWidgets([])
  45. setCurrentStep(0)
  46. }
  47. }, [visible, refPollingConfig.current])
  48. const save = useCallback(() => {
  49. refPollingConfig.current.validateFieldsAndScroll((err, values) => {
  50. if (err) {
  51. return
  52. }
  53. onOk(selectedWidgets, values)
  54. })
  55. }, [refPollingConfig.current, selectedWidgets, onOk])
  56. const modalButtonProps: [
  57. [NativeButtonProps, NativeButtonProps],
  58. [NativeButtonProps, NativeButtonProps]
  59. ] = useMemo(
  60. () => [
  61. [
  62. { style: { display: 'none' } },
  63. {
  64. disabled: !selectedWidgets.length,
  65. onClick: () => setCurrentStep(1)
  66. }
  67. ],
  68. [{ onClick: () => setCurrentStep(0) }, {}]
  69. ],
  70. [selectedWidgets.length]
  71. )
  72. const modalButtonTexts = useMemo(() => [['', '下一步'], ['上一步', '']], [])
  73. const [cancelButtonProps, okButtonProps] = modalButtonProps[currentStep]
  74. const [cancelText, okText] = modalButtonTexts[currentStep]
  75. return (
  76. <Modal
  77. title="选择 可视化组件"
  78. wrapClassName="ant-modal-large"
  79. visible={visible}
  80. confirmLoading={loading}
  81. okButtonProps={okButtonProps}
  82. cancelButtonProps={cancelButtonProps}
  83. okText={okText}
  84. cancelText={cancelText}
  85. onOk={save}
  86. onCancel={onCancel}
  87. >
  88. <>
  89. <Steps
  90. current={currentStep}
  91. style={{ padding: '0 5%', marginBottom: 24 }}
  92. >
  93. <Step title="可视化组件" />
  94. <Step title="数据更新" />
  95. </Steps>
  96. {
  97. [
  98. <WidgetSelector
  99. widgets={widgets}
  100. multiple={multiple}
  101. widgetsSelected={selectedWidgets}
  102. onWidgetsSelect={setSelectedWidgets}
  103. />,
  104. <PollingConfig ref={refPollingConfig} />
  105. ][currentStep]
  106. }
  107. </>
  108. </Modal>
  109. )
  110. }
  111. export default WidgetSelectModal