index.tsx 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  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, { PureComponent } from 'react'
  21. import SplitPane from 'components/SplitPane'
  22. import GlobalControlRelatedItemForm from './GlobalControlRelatedItemForm'
  23. import GlobalControlRelatedViewForm from './GlobalControlRelatedViewForm'
  24. import LocalControlRelatedInfoForm from './LocalControlRelatedInfoForm'
  25. import BaseForm from './BaseForm'
  26. import ValueForm from './ValueForm'
  27. import { Form } from 'antd'
  28. import { FormComponentProps } from 'antd/lib/form/Form'
  29. import { CheckboxChangeEvent } from 'antd/lib/checkbox'
  30. import { RadioChangeEvent } from 'antd/lib/radio'
  31. import { TreeNode } from 'antd/lib/tree-select'
  32. import { IControl, IControlOption } from '../../types'
  33. import { IViewBase, IFormedViews } from 'app/containers/View/types'
  34. import { IFlatRelatedItem, IFlatRelatedView } from './types'
  35. import { parseDefaultValue } from '../../util'
  36. import {
  37. ControlFieldTypes,
  38. ControlPanelTypes,
  39. IS_RANGE_TYPE
  40. } from '../../constants'
  41. import styles from '../../Control.less'
  42. interface IControlFormProps extends FormComponentProps {
  43. type: ControlPanelTypes
  44. views: IViewBase[]
  45. formedViews: IFormedViews
  46. controls: IControl[]
  47. controlBase: Omit<IControl, 'relatedItems' | 'relatedViews'>
  48. relatedItemList: IFlatRelatedItem[]
  49. relatedViewList: IFlatRelatedView[]
  50. defaultValueOptions: Array<IControlOption | TreeNode>
  51. defaultValueLoading: boolean
  52. formWillChangeValues: Partial<IControl>
  53. onItemCheck: (id: number) => () => void
  54. onCheckAll: (e: CheckboxChangeEvent) => void
  55. onFieldTypeChange: (id: number) => (e: RadioChangeEvent) => void
  56. onControlTypeChange: (value: string) => void
  57. onMultipleSettingChange: (e: CheckboxChangeEvent) => void
  58. onSliderPropChange: (min: number, max: number, step: number) => void
  59. onOptionTypeChange: (e: RadioChangeEvent) => void
  60. onValueViewChange: (viewId: number) => void
  61. onDefaultValueTypeChange: (e: RadioChangeEvent) => void
  62. onGetDefaultValueOptions: () => void
  63. onCommonPropChange: (propName: string, value) => void
  64. onOpenOptionModal: (index?: number) => void
  65. onDeleteOption: (value: string) => () => void
  66. }
  67. class ControlForm extends PureComponent<IControlFormProps> {
  68. public componentDidMount() {
  69. const { controlBase, relatedItemList, relatedViewList } = this.props
  70. this.initControlForm(controlBase, relatedItemList, relatedViewList)
  71. }
  72. public componentDidUpdate(prevProps: IControlFormProps) {
  73. const {
  74. form,
  75. controlBase,
  76. relatedItemList,
  77. relatedViewList,
  78. formWillChangeValues
  79. } = this.props
  80. if (controlBase.key !== prevProps.controlBase.key) {
  81. this.initControlForm(controlBase, relatedItemList, relatedViewList)
  82. }
  83. if (formWillChangeValues !== prevProps.formWillChangeValues) {
  84. form.setFieldsValue(formWillChangeValues)
  85. }
  86. }
  87. private initControlForm(
  88. controlBase: Omit<IControl, 'relatedItems' | 'relatedViews'>,
  89. relatedItemList: IFlatRelatedItem[],
  90. relatedViewList: IFlatRelatedView[]
  91. ) {
  92. const { form } = this.props
  93. const relatedItemFormValues = relatedItemList.reduce(
  94. (values, { id, checked, viewId }) => ({
  95. ...values,
  96. [`relatedItems[${id}].checked`]: checked,
  97. [`relatedItems[${id}].viewId`]: viewId
  98. }),
  99. {}
  100. )
  101. const relatedViewFormValues = relatedViewList.reduce(
  102. (values, { id, fieldType, fields }) => ({
  103. ...values,
  104. [`relatedViews[${id}].fieldType`]: fieldType,
  105. [`relatedViews[${id}].fields`]: fields
  106. ? IS_RANGE_TYPE[controlBase.type] &&
  107. fieldType === ControlFieldTypes.Variable
  108. ? fields
  109. : fields[0]
  110. : void 0
  111. }),
  112. {}
  113. )
  114. form.resetFields()
  115. form.setFieldsValue({
  116. ...controlBase,
  117. ...parseDefaultValue(controlBase),
  118. ...relatedItemFormValues,
  119. ...relatedViewFormValues
  120. })
  121. }
  122. public render() {
  123. const {
  124. form,
  125. type,
  126. views,
  127. formedViews,
  128. controls,
  129. controlBase,
  130. relatedItemList,
  131. relatedViewList,
  132. defaultValueOptions,
  133. defaultValueLoading,
  134. onItemCheck,
  135. onCheckAll,
  136. onFieldTypeChange,
  137. onControlTypeChange,
  138. onMultipleSettingChange,
  139. onSliderPropChange,
  140. onOptionTypeChange,
  141. onValueViewChange,
  142. onDefaultValueTypeChange,
  143. onGetDefaultValueOptions,
  144. onCommonPropChange,
  145. onOpenOptionModal,
  146. onDeleteOption
  147. } = this.props
  148. const commonForm = (
  149. <>
  150. <BaseForm
  151. form={form}
  152. controls={controls}
  153. controlBase={controlBase}
  154. onControlTypeChange={onControlTypeChange}
  155. onMultipleSettingChange={onMultipleSettingChange}
  156. onSliderPropChange={onSliderPropChange}
  157. onCommonPropChange={onCommonPropChange}
  158. />
  159. <ValueForm
  160. form={form}
  161. views={views}
  162. formedViews={formedViews}
  163. controlBase={controlBase}
  164. defaultValueOptions={defaultValueOptions}
  165. defaultValueLoading={defaultValueLoading}
  166. onOptionTypeChange={onOptionTypeChange}
  167. onValueViewChange={onValueViewChange}
  168. onDefaultValueTypeChange={onDefaultValueTypeChange}
  169. onGetDefaultValueOptions={onGetDefaultValueOptions}
  170. onCommonPropChange={onCommonPropChange}
  171. onOpenOptionModal={onOpenOptionModal}
  172. onDeleteOption={onDeleteOption}
  173. />
  174. </>
  175. )
  176. const compositeForm =
  177. type === ControlPanelTypes.Global ? (
  178. <SplitPane
  179. type="horizontal"
  180. initialSize={300}
  181. minSize={300}
  182. maxSize={480}
  183. className={styles.splitPanel}
  184. spliter
  185. >
  186. <div className={styles.relatedForm}>
  187. <GlobalControlRelatedItemForm
  188. form={form}
  189. relatedItems={relatedItemList}
  190. onItemCheck={onItemCheck}
  191. onCheckAll={onCheckAll}
  192. />
  193. <GlobalControlRelatedViewForm
  194. form={form}
  195. relatedViews={relatedViewList}
  196. controlType={controlBase.type}
  197. optionWithVariable={controlBase.optionWithVariable}
  198. onFieldTypeChange={onFieldTypeChange}
  199. />
  200. </div>
  201. <div className={styles.commonForm}>{commonForm}</div>
  202. </SplitPane>
  203. ) : (
  204. <div className={styles.commonForm}>
  205. <LocalControlRelatedInfoForm
  206. form={form}
  207. relatedView={relatedViewList[0]}
  208. controlType={controlBase.type}
  209. optionWithVariable={controlBase.optionWithVariable}
  210. onFieldTypeChange={onFieldTypeChange}
  211. />
  212. {commonForm}
  213. </div>
  214. )
  215. return <Form className={styles.controlForm}>{compositeForm}</Form>
  216. }
  217. }
  218. export default Form.create<IControlFormProps>()(ControlForm)