Workflow.tsx 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  1. import React, { useEffect, useState } from "react";
  2. import type { IProjectData, ITaskData } from "../../api/task";
  3. import ProjectList, { type TView } from "./ProjectList";
  4. import ProjectTask from "./ProjectTask";
  5. import { Button, Card, Modal, Tree } from "antd";
  6. import { ArrowLeftOutlined } from "@ant-design/icons";
  7. import type { Key } from "antd/es/table/interface";
  8. import { useIntl } from "react-intl";
  9. interface IModal {
  10. tiger?: React.ReactNode;
  11. studioName?: string;
  12. open?: boolean;
  13. onClose?: () => void;
  14. onSelect?: (data: IProjectData | undefined) => void;
  15. onOk?: (data: ITaskData[] | undefined) => void;
  16. }
  17. export const WorkflowModal = ({
  18. tiger,
  19. studioName,
  20. open,
  21. onSelect,
  22. onOk,
  23. onClose,
  24. }: IModal) => {
  25. const [openModal, setOpenModal] = useState(open);
  26. const [data, setData] = useState<ITaskData[]>();
  27. useEffect(() => setOpenModal(open), [open]);
  28. const showModal = () => {
  29. setOpenModal(true);
  30. };
  31. const handleOk = () => {
  32. if (onOk) {
  33. onOk(data);
  34. } else {
  35. setOpenModal(false);
  36. }
  37. };
  38. const handleCancel = () => {
  39. if (onClose) {
  40. onClose();
  41. } else {
  42. setOpenModal(false);
  43. }
  44. };
  45. return (
  46. <>
  47. <div onClick={() => showModal()}>{tiger}</div>
  48. <Modal
  49. destroyOnHidden={true}
  50. width={1200}
  51. style={{ top: 10 }}
  52. title={""}
  53. open={openModal}
  54. onOk={handleOk}
  55. onCancel={handleCancel}
  56. >
  57. <Workflow
  58. studioName={studioName}
  59. onData={(data) => setData(data)}
  60. onSelect={onSelect}
  61. />
  62. </Modal>
  63. </>
  64. );
  65. };
  66. interface IWidget {
  67. studioName?: string;
  68. onSelect?: (data: IProjectData | undefined) => void;
  69. onData?: (data: ITaskData[] | undefined) => void;
  70. }
  71. const Workflow = ({ studioName, onSelect, onData }: IWidget) => {
  72. const intl = useIntl();
  73. const [project, setProject] = useState<IProjectData>();
  74. const [view, setView] = useState<TView>("studio");
  75. const selectWorkflow = (selected: IProjectData | undefined) => {
  76. onSelect && onSelect(selected);
  77. setProject(selected);
  78. };
  79. return (
  80. <div style={{ display: "flex" }}>
  81. <div style={{ minWidth: 200, flex: 1 }}>
  82. <Tree
  83. multiple={false}
  84. defaultSelectedKeys={["studio"]}
  85. treeData={[
  86. {
  87. title: intl.formatMessage({ id: "labels.this-studio" }),
  88. key: "studio",
  89. },
  90. {
  91. title: intl.formatMessage({ id: "labels.shared" }),
  92. key: "shared",
  93. },
  94. {
  95. title: intl.formatMessage({ id: "labels.community" }),
  96. key: "community",
  97. },
  98. ]}
  99. onSelect={(selectedKeys: Key[]) => {
  100. console.debug("selectedKeys", selectedKeys);
  101. if (selectedKeys.length > 0) {
  102. selectWorkflow(undefined);
  103. setView(selectedKeys[0].toString() as TView);
  104. }
  105. }}
  106. />
  107. </div>
  108. <div style={{ flex: 5 }}>
  109. <div style={{ display: project ? "block" : "none" }}>
  110. <Card
  111. title={
  112. project ? (
  113. <>
  114. <Button
  115. type="link"
  116. icon={<ArrowLeftOutlined />}
  117. onClick={() => {
  118. selectWorkflow(undefined);
  119. }}
  120. />
  121. {project.title}
  122. </>
  123. ) : (
  124. "请选择一个工作流"
  125. )
  126. }
  127. >
  128. {project ? (
  129. <ProjectTask
  130. studioName={studioName}
  131. projectId={project.id}
  132. readonly={view !== "studio"}
  133. onChange={onData}
  134. />
  135. ) : (
  136. <></>
  137. )}
  138. </Card>
  139. </div>
  140. <div style={{ display: project ? "none" : "block" }}>
  141. <ProjectList
  142. studioName={studioName}
  143. view={view}
  144. type="workflow"
  145. readonly
  146. onSelect={(data: IProjectData) => selectWorkflow(data)}
  147. />
  148. </div>
  149. </div>
  150. </div>
  151. );
  152. };
  153. export default Workflow;