NodeAttrs.tsx 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419
  1. import { Cell } from "@antv/x6";
  2. import { Select, Form, Input, Divider, AutoComplete } from "antd";
  3. import { useEffect, useState } from "react";
  4. import {
  5. ListLangBySearchKey,
  6. GetAllPage,
  7. GetAllTablesAndViews,
  8. GetAllWfScene,
  9. GetAllWorkflows,
  10. } from "@/api";
  11. import { useRequest } from "umi";
  12. import SelectModal from "./SelectModal";
  13. import { CorrelationType } from "@/enum";
  14. interface LanItem {
  15. en: string;
  16. key: string;
  17. ["zh-CN"]: string;
  18. }
  19. export default function NodeAttrs({
  20. cell,
  21. onChange,
  22. }: {
  23. cell?: Cell;
  24. onChange?: (data: any) => void;
  25. }) {
  26. const defaultModel = {
  27. "zh-CN": "",
  28. en: "",
  29. langText: "",
  30. desc: "",
  31. linkType: CorrelationType.scene,
  32. linkValue: {
  33. value: undefined,
  34. label: undefined,
  35. },
  36. remember: "",
  37. recordTime: "",
  38. recordUser: "",
  39. recordConent: "",
  40. };
  41. const [lanOptions, setLanOptions] = useState<any[]>([]);
  42. const [formModel, setFormModel] = useState(cell?.data?.attrs || defaultModel);
  43. useEffect(() => {
  44. if(cell) {
  45. setFormModel(cell?.data?.attrs || defaultModel);
  46. }
  47. }, [cell]);
  48. const { run } = useRequest(ListLangBySearchKey, {
  49. manual: true,
  50. onSuccess(data, params) {
  51. setLanOptions(
  52. (data.result || []).map((item: LanItem) => ({
  53. ...item,
  54. label: `${item.en || ""}[zh-CN:${item["zh-CN"]}]`,
  55. value: item[params[0].searchLan],
  56. }))
  57. );
  58. },
  59. });
  60. useEffect(() => {
  61. onChange?.(formModel);
  62. }, [formModel]);
  63. const handleSearch = (serchKey: string, searchLan: "en" | "zh-CN") => {
  64. run({
  65. maxCount: 10,
  66. searchKey: serchKey,
  67. searchLan,
  68. });
  69. };
  70. const handleChange = (key: string, value: any) => {
  71. setFormModel({
  72. ...formModel,
  73. langText: "",
  74. [key]: value,
  75. });
  76. };
  77. const handleSelectLang = (option: LanItem) => {
  78. setFormModel(() => {
  79. return {
  80. ...formModel,
  81. langText: option.key,
  82. en: option?.en,
  83. ["zh-CN"]: option?.["zh-CN"],
  84. };
  85. });
  86. };
  87. return (
  88. <div>
  89. <Divider style={{ margin: "0" }}>基本</Divider>
  90. <section className="px-16px">
  91. <Form.Item
  92. label="中文"
  93. labelCol={{ span: 10 }}
  94. labelAlign="left"
  95. className="mb-8px"
  96. colon={false}
  97. layout="vertical"
  98. >
  99. <AutoComplete
  100. allowClear
  101. placeholder="请输入"
  102. options={lanOptions}
  103. onSearch={(val) => handleSearch(val, "zh-CN")}
  104. value={formModel["zh-CN"]}
  105. onChange={(val) => handleChange("zh-CN", val)}
  106. onSelect={(_val, opt) => handleSelectLang(opt)}
  107. disabled={!cell}
  108. />
  109. </Form.Item>
  110. <Form.Item
  111. label="English"
  112. labelCol={{ span: 10 }}
  113. labelAlign="left"
  114. className="mb-8px"
  115. colon={false}
  116. layout="vertical"
  117. >
  118. <AutoComplete
  119. allowClear
  120. style={{ width: "100%" }}
  121. placeholder="请输入"
  122. options={lanOptions}
  123. onSearch={(val) => handleSearch(val, "en")}
  124. value={formModel.en}
  125. onChange={(val) => handleChange("en", val)}
  126. onSelect={(_val, opt) => handleSelectLang(opt)}
  127. disabled={!cell}
  128. />
  129. </Form.Item>
  130. <Form.Item
  131. label="节点描述"
  132. labelCol={{ span: 10 }}
  133. labelAlign="left"
  134. className="mb-8px"
  135. colon={false}
  136. >
  137. <Input.TextArea
  138. placeholder="请输入"
  139. value={formModel.desc}
  140. onChange={(e) => handleChange("desc", e.target.value)}
  141. disabled={!cell}
  142. />
  143. </Form.Item>
  144. <Form.Item
  145. label="关联类型"
  146. labelCol={{ span: 10 }}
  147. labelAlign="left"
  148. className="mb-8px"
  149. colon={false}
  150. >
  151. <Select
  152. placeholder="请选择"
  153. disabled={!cell}
  154. options={[
  155. { value: CorrelationType.scene, label: "场景" },
  156. { value: CorrelationType.flow, label: "流程" },
  157. { value: CorrelationType.page, label: "页面" },
  158. { value: CorrelationType.table, label: "数据表" },
  159. { value: CorrelationType.view, label: "视图" },
  160. ]}
  161. value={formModel.linkType}
  162. onChange={(val) => {
  163. setFormModel({
  164. ...formModel,
  165. linkType: val,
  166. linkValue: {
  167. label: undefined,
  168. value: undefined,
  169. },
  170. });
  171. }}
  172. />
  173. </Form.Item>
  174. <Form.Item
  175. labelCol={{ span: 10 }}
  176. labelAlign="left"
  177. className="mb-8px"
  178. colon={false}
  179. >
  180. {formModel.linkType === CorrelationType.scene && (
  181. <SelectModal
  182. key="1"
  183. value={formModel.linkValue}
  184. api={GetAllWfScene}
  185. disabled={!cell}
  186. onSuccess={(data) => {
  187. return data?.result?.model || [];
  188. }}
  189. columns={[
  190. { title: "名称", dataIndex: "name" },
  191. { title: "描述", dataIndex: "memo" },
  192. ]}
  193. onChange={(rows) => {
  194. const item = rows[0];
  195. item &&
  196. handleChange("linkValue", {
  197. value: item.id,
  198. label: item.name,
  199. });
  200. }}
  201. defaultParams={[
  202. {
  203. currentPage: 1,
  204. pageSize: 10,
  205. orderByProperty: "Id",
  206. Ascending: false,
  207. filters: [
  208. {
  209. name: "EnterpriseId",
  210. },
  211. ],
  212. },
  213. ]}
  214. />
  215. )}
  216. {formModel.linkType === CorrelationType.flow && (
  217. <SelectModal
  218. key="2"
  219. value={formModel.linkValue}
  220. api={GetAllWorkflows}
  221. disabled={!cell}
  222. onSuccess={(data) => {
  223. return data?.result || [];
  224. }}
  225. columns={[
  226. { title: "名称", dataIndex: "name" },
  227. { title: "描述", dataIndex: "memo" },
  228. ]}
  229. onChange={(rows) => {
  230. const item = rows[0];
  231. item &&
  232. handleChange("linkValue", {
  233. value: item.id,
  234. label: item.name,
  235. });
  236. }}
  237. defaultParams={[
  238. {
  239. currentPage: 1,
  240. pageSize: 10,
  241. orderByProperty: "Id",
  242. Ascending: false,
  243. filters: [
  244. {
  245. name: "EnterpriseId",
  246. },
  247. ],
  248. },
  249. ]}
  250. />
  251. )}
  252. {formModel.linkType === CorrelationType.page && (
  253. <SelectModal
  254. key="3"
  255. value={formModel.linkValue}
  256. api={GetAllPage}
  257. disabled={!cell}
  258. onSuccess={(data) => {
  259. return data?.result || [];
  260. }}
  261. columns={[
  262. {
  263. title: "名称",
  264. dataIndex: "name",
  265. render: (_val, record) => (
  266. <span>
  267. {record.name}({record.fileName})
  268. </span>
  269. ),
  270. },
  271. { title: "描述", dataIndex: "description" },
  272. ]}
  273. onChange={(rows) => {
  274. const item = rows[0];
  275. item &&
  276. handleChange("linkValue", {
  277. value: item.id,
  278. label: item.name,
  279. });
  280. }}
  281. />
  282. )}
  283. {formModel.linkType === CorrelationType.table && (
  284. <SelectModal
  285. key="4"
  286. value={formModel.linkValue}
  287. api={GetAllTablesAndViews}
  288. disabled={!cell}
  289. onSuccess={(data) => {
  290. return data?.result?.appBusinessTables || [];
  291. }}
  292. columns={[
  293. {
  294. title: "名称",
  295. dataIndex: "name",
  296. render: (val, record) => (
  297. <span>
  298. {record.name}({record.schemaName})
  299. </span>
  300. ),
  301. },
  302. { title: "描述", dataIndex: "description" },
  303. ]}
  304. onChange={(rows) => {
  305. const item = rows[0];
  306. item &&
  307. handleChange("linkValue", {
  308. value: item.id,
  309. label: item.name,
  310. });
  311. }}
  312. />
  313. )}
  314. {formModel.linkType === CorrelationType.view && (
  315. <SelectModal
  316. key="5"
  317. value={formModel.linkValue}
  318. api={GetAllTablesAndViews}
  319. disabled={!cell}
  320. onSuccess={(data) => {
  321. return data?.result?.bpmViewTables || [];
  322. }}
  323. columns={[
  324. {
  325. title: "名称",
  326. dataIndex: "name",
  327. render: (val, record) => (
  328. <span>
  329. {record.name}({record.schemaName})
  330. </span>
  331. ),
  332. },
  333. { title: "描述", dataIndex: "description" },
  334. ]}
  335. onChange={(rows) => {
  336. const item = rows[0];
  337. item &&
  338. handleChange("linkValue", {
  339. value: item.id,
  340. label: item.name,
  341. });
  342. }}
  343. />
  344. )}
  345. </Form.Item>
  346. </section>
  347. <Divider style={{ margin: "0" }}>需求</Divider>
  348. <section className="px-16px">
  349. <Form.Item
  350. label="参与人"
  351. labelCol={{ span: 10 }}
  352. labelAlign="left"
  353. className="mb-8px"
  354. colon={false}
  355. >
  356. <Input
  357. placeholder="请输入"
  358. value={formModel.remember}
  359. onChange={(e) => handleChange("remember", e.target.value)}
  360. disabled={!cell}
  361. />
  362. </Form.Item>
  363. <Form.Item
  364. label="记录时间"
  365. labelCol={{ span: 10 }}
  366. labelAlign="left"
  367. className="mb-8px"
  368. colon={false}
  369. >
  370. <Input
  371. placeholder="请输入"
  372. value={formModel.recordTime}
  373. onChange={(e) => handleChange("recordTime", e.target.value)}
  374. disabled={!cell}
  375. />
  376. </Form.Item>
  377. <Form.Item
  378. label="记录人"
  379. labelCol={{ span: 10 }}
  380. labelAlign="left"
  381. className="mb-8px"
  382. colon={false}
  383. >
  384. <Input.TextArea
  385. placeholder="请输入"
  386. value={formModel.recordUser}
  387. onChange={(e) => handleChange("recordUser", e.target.value)}
  388. disabled={!cell}
  389. />
  390. </Form.Item>
  391. <Form.Item
  392. label="内容"
  393. labelCol={{ span: 10 }}
  394. labelAlign="left"
  395. className="mb-8px"
  396. colon={false}
  397. >
  398. <Input.TextArea
  399. rows={5}
  400. placeholder="请输入"
  401. value={formModel.recordConent}
  402. onChange={(e) => handleChange("recordConent", e.target.value)}
  403. disabled={!cell}
  404. />
  405. </Form.Item>
  406. </section>
  407. </div>
  408. );
  409. }