You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

index.tsx 7.9 kB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. import KFModal from '@/components/KFModal';
  2. import { AvailableRange } from '@/enums';
  3. import { type CodeConfigData } from '@/pages/CodeConfig/List';
  4. import { addCodeConfigReq, updateCodeConfigReq } from '@/services/codeConfig';
  5. import { to } from '@/utils/promise';
  6. import { Form, Input, Radio, message, type ModalProps } from 'antd';
  7. import { omit } from 'lodash';
  8. export enum VerifyMode {
  9. Password = 0, // 用户名密码
  10. SSH = 1, // SSH Key
  11. }
  12. export enum OperationType {
  13. Create = 0, // 新建
  14. Update = 1, // 更新
  15. }
  16. type FormData = Partial<CodeConfigData>;
  17. interface AddCodeConfigModalProps extends Omit<ModalProps, 'onOk'> {
  18. opType: OperationType;
  19. codeConfigData?: CodeConfigData;
  20. onOk: () => void;
  21. }
  22. function AddCodeConfigModal({ opType, codeConfigData, onOk, ...rest }: AddCodeConfigModalProps) {
  23. // 上传请求
  24. const createCodeConfig = async (formData: FormData) => {
  25. const params: FormData & { id?: number } = {
  26. ...formData,
  27. };
  28. // 清除多余的信息
  29. if (formData.code_repo_vis === AvailableRange.Public) {
  30. omit(params, ['verify_mode', 'git_user_name', 'git_password', 'ssh_key']);
  31. }
  32. if (formData.verify_mode === VerifyMode.Password) {
  33. omit(params, ['ssh_key']);
  34. } else if (formData.verify_mode === VerifyMode.SSH) {
  35. omit(params, ['git_user_name', 'git_password']);
  36. }
  37. if (opType === OperationType.Update) {
  38. params.id = codeConfigData?.id;
  39. }
  40. const request = opType === OperationType.Create ? addCodeConfigReq : updateCodeConfigReq;
  41. const [res] = await to(request(params));
  42. if (res) {
  43. message.success(opType === OperationType.Create ? '创建成功' : '修改成功');
  44. onOk?.();
  45. }
  46. };
  47. // 提交
  48. const onFinish = (formData: FormData) => {
  49. createCodeConfig(formData);
  50. };
  51. // 设置初始值
  52. const initialValues: FormData = codeConfigData ?? {
  53. code_repo_vis: AvailableRange.Public,
  54. verify_mode: VerifyMode.Password,
  55. };
  56. if (initialValues.verify_mode === undefined || initialValues.verify_mode === null) {
  57. initialValues.verify_mode = VerifyMode.Password;
  58. }
  59. return (
  60. <KFModal
  61. {...rest}
  62. title="新建代码配置"
  63. image={require('@/assets/img/create-experiment.png')}
  64. width={825}
  65. okButtonProps={{
  66. htmlType: 'submit',
  67. form: 'form',
  68. }}
  69. destroyOnClose
  70. >
  71. <Form
  72. name="form"
  73. layout="vertical"
  74. onFinish={onFinish}
  75. initialValues={initialValues}
  76. autoComplete="off"
  77. >
  78. {/* 禁止 Chrome 自动填充 */}
  79. {/* <Input type="text" style={{ display: 'none' }} />
  80. <Input type="password" style={{ display: 'none' }} /> */}
  81. <Form.Item
  82. label="代码仓库名称"
  83. name="code_repo_name"
  84. required
  85. rules={[
  86. {
  87. required: true,
  88. message: '请输入代码仓库名称',
  89. },
  90. ]}
  91. >
  92. <Input placeholder="请输入代码仓库名称" showCount allowClear maxLength={64} />
  93. </Form.Item>
  94. <Form.Item
  95. label="代码仓库可见性"
  96. name="code_repo_vis"
  97. rules={[
  98. {
  99. required: true,
  100. message: '请选择代码仓库可见性',
  101. },
  102. ]}
  103. >
  104. <Radio.Group>
  105. <Radio value={AvailableRange.Public}>公开</Radio>
  106. <Radio value={AvailableRange.Private}>私有</Radio>
  107. </Radio.Group>
  108. </Form.Item>
  109. <Form.Item
  110. label="Git 地址"
  111. name="git_url"
  112. rules={[
  113. {
  114. required: true,
  115. message: '请输入 Git 地址',
  116. },
  117. {
  118. type: 'url',
  119. message: '请输入正确的 Git 地址',
  120. },
  121. ]}
  122. >
  123. <Input placeholder="请输入 Git 地址" showCount allowClear maxLength={256} />
  124. </Form.Item>
  125. <Form.Item
  126. label="代码分支/Tag"
  127. name="git_branch"
  128. rules={[
  129. {
  130. required: true,
  131. message: '请输入代码分支/Tag',
  132. },
  133. ]}
  134. >
  135. <Input placeholder="请输入代码分支/Tag" showCount allowClear maxLength={64} />
  136. </Form.Item>
  137. <Form.Item
  138. noStyle
  139. shouldUpdate={(prevValues, currentValues) =>
  140. prevValues?.code_repo_vis !== currentValues?.code_repo_vis
  141. }
  142. >
  143. {({ getFieldValue }) => {
  144. return getFieldValue('code_repo_vis') === AvailableRange.Private ? (
  145. <>
  146. <Form.Item
  147. label="验证方式"
  148. name="verify_mode"
  149. rules={[
  150. {
  151. required: true,
  152. message: '请选择验证方式',
  153. },
  154. ]}
  155. >
  156. <Radio.Group>
  157. <Radio value={VerifyMode.Password}>用户名/密码</Radio>
  158. <Radio value={VerifyMode.SSH}>SSH Key</Radio>
  159. </Radio.Group>
  160. </Form.Item>
  161. <Form.Item
  162. noStyle
  163. shouldUpdate={(prevValues, currentValues) =>
  164. prevValues?.verify_mode !== currentValues?.verify_mode
  165. }
  166. >
  167. {({ getFieldValue }) => {
  168. return getFieldValue('verify_mode') === VerifyMode.Password ? (
  169. <>
  170. <Form.Item
  171. label="Git 用户名"
  172. name="git_user_name"
  173. rules={[
  174. {
  175. required: true,
  176. message: '请输入 Git 用户名',
  177. },
  178. ]}
  179. >
  180. <Input
  181. placeholder="请输入 Git 用户名"
  182. autoComplete="off"
  183. showCount
  184. allowClear
  185. maxLength={64}
  186. />
  187. </Form.Item>
  188. <Form.Item
  189. label="Git 密码"
  190. name="git_password"
  191. rules={[
  192. {
  193. required: true,
  194. message: '请输入 Git 密码',
  195. },
  196. ]}
  197. >
  198. <Input.Password
  199. autoComplete="new-password"
  200. placeholder="请输入 Git 密码"
  201. allowClear
  202. />
  203. </Form.Item>
  204. </>
  205. ) : (
  206. <Form.Item
  207. label="SSH Key"
  208. name="ssh_key"
  209. rules={[
  210. {
  211. required: true,
  212. message: '请输入 SSH Key',
  213. },
  214. ]}
  215. >
  216. <Input.TextArea
  217. placeholder="请输入 SSH Key"
  218. showCount
  219. maxLength={1024}
  220. autoSize={{ minRows: 3, maxRows: 6 }}
  221. allowClear
  222. />
  223. </Form.Item>
  224. );
  225. }}
  226. </Form.Item>
  227. </>
  228. ) : null;
  229. }}
  230. </Form.Item>
  231. </Form>
  232. </KFModal>
  233. );
  234. }
  235. export default AddCodeConfigModal;