mapServe.tsx 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221
  1. import React, { useState, useEffect } from 'react';
  2. import { FlowchartFormWrapper } from '@antv/xflow';
  3. import { Position, Size, ColorPicker, InputNumberFiled, InputFiled, SelectField } from '../fields';
  4. import { PREFIX } from '../constants';
  5. import { connect } from 'dva';
  6. import { UnityAction } from '@/utils/utils';
  7. import { Button, Select, TreeSelect } from 'antd';
  8. const { Option } = Select;
  9. export const enum TYPE {
  10. AUDIT = 1,
  11. INITIATOR,
  12. COPYMAN,
  13. }
  14. export const typeOption = [
  15. { label: '审批人', value: TYPE.AUDIT },
  16. { label: '发起人', value: TYPE.INITIATOR },
  17. { label: '抄送人', value: TYPE.COPYMAN },
  18. ];
  19. export interface IConfig {
  20. label?: string;
  21. x?: number;
  22. y?: number;
  23. width?: number;
  24. height?: number;
  25. count?: number;
  26. fontSize?: number;
  27. fontFill?: string;
  28. fill?: string;
  29. stroke?: string;
  30. flow_id?: string;
  31. flow_node_id?: string;
  32. process_code?: string;
  33. type: TYPE;
  34. roleID: number;
  35. audits: { type: string; value: number; origin?: string | number; name?: string }[];
  36. }
  37. const Component = (props: any) => {
  38. const defaultConfig = {
  39. type: TYPE.AUDIT,
  40. };
  41. const { config, plugin = {}, depUserTree, roleList } = props;
  42. const { updateNode } = plugin;
  43. const [nodeConfig, setNodeConfig] = useState<IConfig>({
  44. ...defaultConfig,
  45. ...config,
  46. });
  47. const onNodeConfigChange = (key: string, value: number | string | object) => {
  48. if (key) {
  49. setNodeConfig({
  50. ...nodeConfig,
  51. [key]: value,
  52. });
  53. updateNode({
  54. [key]: value,
  55. });
  56. } else if (value instanceof Object) {
  57. setNodeConfig({
  58. ...nodeConfig,
  59. ...value,
  60. });
  61. updateNode({
  62. ...value,
  63. });
  64. }
  65. };
  66. const handleTreeChange = (values: (string | number)[]) => {
  67. const newValues = values.map(cur => {
  68. if (typeof cur == 'string' && cur.includes('||')) {
  69. return { type: 'user', value: Number(cur.split('||')[0]), origin: cur };
  70. } else {
  71. return { type: 'dep', value: cur, origin: cur };
  72. }
  73. });
  74. onNodeConfigChange('audits', newValues);
  75. };
  76. const onSave = () => {
  77. UnityAction.emit('NODE_SAVE', nodeConfig);
  78. };
  79. useEffect(() => {
  80. setNodeConfig({
  81. ...defaultConfig,
  82. ...config,
  83. });
  84. }, [config]);
  85. return (
  86. <div className={`${PREFIX}-panel-body`}>
  87. <div className={`${PREFIX}-panel-group`}>
  88. <h5>内容</h5>
  89. <InputFiled
  90. label="标题"
  91. value={nodeConfig.label}
  92. onChange={value => {
  93. onNodeConfigChange('label', value);
  94. }}
  95. />
  96. <SelectField
  97. label="节点类型"
  98. value={nodeConfig.type}
  99. onChange={value => {
  100. onNodeConfigChange('type', value);
  101. }}
  102. options={typeOption}
  103. />
  104. </div>
  105. <div className={`${PREFIX}-panel-group`}>
  106. <h5>样式</h5>
  107. <Position
  108. x={nodeConfig.x}
  109. y={nodeConfig.y}
  110. onChange={(key, value) => {
  111. onNodeConfigChange(key, value);
  112. }}
  113. />
  114. <Size
  115. width={nodeConfig.width}
  116. height={nodeConfig.height}
  117. onChange={(key, value) => {
  118. onNodeConfigChange(key, value);
  119. }}
  120. />
  121. <ColorPicker
  122. label="填充"
  123. value={nodeConfig.fill}
  124. onChange={(value: string) => {
  125. onNodeConfigChange('fill', value);
  126. }}
  127. />
  128. <ColorPicker
  129. label="边框"
  130. value={nodeConfig.stroke}
  131. onChange={(value: string) => {
  132. onNodeConfigChange('stroke', value);
  133. }}
  134. />
  135. <InputNumberFiled
  136. label="消息数量"
  137. value={nodeConfig.count}
  138. onChange={value => {
  139. onNodeConfigChange('count', value);
  140. }}
  141. />
  142. <div className={`${PREFIX}-node-text-style`}>
  143. <InputNumberFiled
  144. label="字号"
  145. value={nodeConfig.fontSize}
  146. width={68}
  147. onChange={value => {
  148. onNodeConfigChange('fontSize', value);
  149. }}
  150. />
  151. <ColorPicker
  152. value={nodeConfig.fontFill}
  153. onChange={(value: string) => {
  154. onNodeConfigChange('fontFill', value);
  155. }}
  156. />
  157. </div>
  158. <div className="group">
  159. <label>{typeOption.find(item => item.value == nodeConfig.type)?.label || '审批人'}</label>
  160. {nodeConfig.type != TYPE.AUDIT ? (
  161. <TreeSelect
  162. showSearch
  163. multiple
  164. allowClear
  165. defaultValue={nodeConfig.audits?.map(item => item.origin)}
  166. style={{ width: '80%' }}
  167. placeholder="请选择"
  168. treeData={depUserTree}
  169. onChange={values => {
  170. handleTreeChange(values);
  171. }}
  172. />
  173. ) : (
  174. <Select
  175. showSearch
  176. style={{ width: '100%' }}
  177. filterOption={(input, option) => option.props.children.indexOf(input) >= 0}
  178. onChange={value => {
  179. onNodeConfigChange('roleID', value);
  180. }}
  181. >
  182. {roleList &&
  183. roleList.map(item => (
  184. <Option key={item.ID} value={item.ID + ''}>
  185. {item.Name}
  186. </Option>
  187. ))}
  188. </Select>
  189. )}
  190. </div>
  191. </div>
  192. <Button style={{ marginTop: 20 }} type="primary" onClick={onSave}>
  193. 保存
  194. </Button>
  195. </div>
  196. );
  197. };
  198. function RecthServe(props: any) {
  199. return (
  200. <FlowchartFormWrapper {...props}>
  201. {(config, plugin) => <Component {...props} plugin={plugin} config={config} />}
  202. </FlowchartFormWrapper>
  203. );
  204. }
  205. export default connect(({ xflow, flow }) => ({
  206. auditList: xflow.auditList,
  207. depUserTree: flow.depUserTree,
  208. roleList: flow.roleList,
  209. }))(RecthServe);