mapServe.tsx 6.0 KB

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