formItemConfig.ts 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. /**
  2. * @description:表单配置
  3. */
  4. import { IVFormComponent } from '../typings/v-form-component';
  5. import { isArray } from 'lodash-es';
  6. import { componentMap as VbenCmp, add } from '/@/components/Form/src/componentMap';
  7. import { ComponentType } from '/@/components/Form/src/types';
  8. import { componentMap as Cmp } from '../components';
  9. import { Component } from 'vue';
  10. const componentMap = new Map<string, Component>();
  11. //如果有其它控件,可以在这里初始化
  12. //注册Ant控件库
  13. Cmp.forEach((value, key) => {
  14. componentMap.set(key, value);
  15. if (VbenCmp[key] == null) {
  16. add(key as ComponentType, value);
  17. }
  18. });
  19. //注册vben控件库
  20. VbenCmp.forEach((value, key) => {
  21. componentMap.set(key, value);
  22. });
  23. export { componentMap };
  24. /**
  25. * 设置自定义表单控件
  26. * @param {IVFormComponent | IVFormComponent[]} config
  27. */
  28. export function setFormDesignComponents(config: IVFormComponent | IVFormComponent[]) {
  29. if (isArray(config)) {
  30. config.forEach((item) => {
  31. const { componentInstance: component, ...rest } = item;
  32. componentMap[item.component] = component;
  33. customComponents.push(Object.assign({ props: {} }, rest));
  34. });
  35. } else {
  36. const { componentInstance: component, ...rest } = config;
  37. componentMap[config.component] = component;
  38. customComponents.push(Object.assign({ props: {} }, rest));
  39. }
  40. }
  41. //外部设置的自定义控件
  42. export const customComponents: IVFormComponent[] = [];
  43. // 左侧控件列表与初始化的控件属性
  44. // props.slotName,会在formitem级别生成一个slot,并绑定当前record值
  45. // 属性props,类型为对象,不能为undefined或是null。
  46. export const baseComponents: IVFormComponent[] = [
  47. {
  48. component: 'InputCountDown',
  49. label: '倒计时输入',
  50. icon: 'line-md:iconify2',
  51. colProps: { span: 24 },
  52. field: '',
  53. componentProps: {},
  54. },
  55. {
  56. component: 'IconPicker',
  57. label: '图标选择器',
  58. icon: 'line-md:iconify2',
  59. colProps: { span: 24 },
  60. field: '',
  61. componentProps: {},
  62. },
  63. {
  64. component: 'StrengthMeter',
  65. label: '密码强度',
  66. icon: 'wpf:password1',
  67. colProps: { span: 24 },
  68. field: '',
  69. componentProps: {},
  70. },
  71. {
  72. component: 'AutoComplete',
  73. label: '自动完成',
  74. icon: 'wpf:password1',
  75. colProps: { span: 24 },
  76. field: '',
  77. componentProps: {
  78. placeholder: '请输入正则表达式',
  79. options: [
  80. {
  81. value: '/^(?:(?:\\+|00)86)?1[3-9]\\d{9}$/',
  82. label: '手机号码',
  83. },
  84. {
  85. value: '/^((ht|f)tps?:\\/\\/)?[\\w-]+(\\.[\\w-]+)+:\\d{1,5}\\/?$/',
  86. label: '网址带端口号',
  87. },
  88. ],
  89. },
  90. },
  91. {
  92. component: 'Divider',
  93. label: '分割线',
  94. icon: 'radix-icons:divider-horizontal',
  95. colProps: { span: 24 },
  96. field: '',
  97. componentProps: {
  98. orientation: 'center',
  99. dashed: true,
  100. },
  101. },
  102. {
  103. component: 'Checkbox',
  104. label: '复选框',
  105. icon: 'ant-design:check-circle-outlined',
  106. colProps: { span: 24 },
  107. field: '',
  108. },
  109. {
  110. component: 'CheckboxGroup',
  111. label: '复选框-组',
  112. icon: 'ant-design:check-circle-filled',
  113. field: '',
  114. colProps: { span: 24 },
  115. componentProps: {
  116. options: [
  117. {
  118. label: '选项1',
  119. value: '1',
  120. },
  121. {
  122. label: '选项2',
  123. value: '2',
  124. },
  125. ],
  126. },
  127. },
  128. {
  129. component: 'Input',
  130. label: '输入框',
  131. icon: 'bi:input-cursor-text',
  132. field: '',
  133. colProps: { span: 24 },
  134. componentProps: {
  135. type: 'text',
  136. },
  137. },
  138. {
  139. component: 'InputNumber',
  140. label: '数字输入框',
  141. icon: 'ant-design:field-number-outlined',
  142. field: '',
  143. colProps: { span: 24 },
  144. componentProps: { style: 'width:200px' },
  145. },
  146. {
  147. component: 'InputTextArea',
  148. label: '文本域',
  149. icon: 'ant-design:file-text-filled',
  150. field: '',
  151. colProps: { span: 24 },
  152. componentProps: {},
  153. },
  154. {
  155. component: 'Select',
  156. label: '下拉选择',
  157. icon: 'gg:select',
  158. field: '',
  159. colProps: { span: 24 },
  160. componentProps: {
  161. options: [
  162. {
  163. label: '选项1',
  164. value: '1',
  165. },
  166. {
  167. label: '选项2',
  168. value: '2',
  169. },
  170. ],
  171. },
  172. },
  173. {
  174. component: 'Radio',
  175. label: '单选框',
  176. icon: 'ant-design:check-circle-outlined',
  177. field: '',
  178. colProps: { span: 24 },
  179. componentProps: {},
  180. },
  181. {
  182. component: 'RadioGroup',
  183. label: '单选框-组',
  184. icon: 'carbon:radio-button-checked',
  185. field: '',
  186. colProps: { span: 24 },
  187. componentProps: {
  188. options: [
  189. {
  190. label: '选项1',
  191. value: '1',
  192. },
  193. {
  194. label: '选项2',
  195. value: '2',
  196. },
  197. ],
  198. },
  199. },
  200. {
  201. component: 'DatePicker',
  202. label: '日期选择',
  203. icon: 'healthicons:i-schedule-school-date-time-outline',
  204. field: '',
  205. colProps: { span: 24 },
  206. componentProps: {},
  207. },
  208. {
  209. component: 'RangePicker',
  210. label: '日期范围',
  211. icon: 'healthicons:i-schedule-school-date-time-outline',
  212. field: '',
  213. colProps: { span: 24 },
  214. componentProps: {
  215. placeholder: ['开始日期', '结束日期'],
  216. },
  217. },
  218. {
  219. component: 'MonthPicker',
  220. label: '月份选择',
  221. icon: 'healthicons:i-schedule-school-date-time-outline',
  222. field: '',
  223. colProps: { span: 24 },
  224. componentProps: {
  225. placeholder: '请选择月份',
  226. },
  227. },
  228. {
  229. component: 'TimePicker',
  230. label: '时间选择',
  231. icon: 'healthicons:i-schedule-school-date-time',
  232. field: '',
  233. colProps: { span: 24 },
  234. componentProps: {},
  235. },
  236. {
  237. component: 'Slider',
  238. label: '滑动输入条',
  239. icon: 'vaadin:slider',
  240. field: '',
  241. colProps: { span: 24 },
  242. componentProps: {},
  243. },
  244. {
  245. component: 'Rate',
  246. label: '评分',
  247. icon: 'ic:outline-star-rate',
  248. field: '',
  249. colProps: { span: 24 },
  250. componentProps: {},
  251. },
  252. {
  253. component: 'Switch',
  254. label: '开关',
  255. icon: 'entypo:switch',
  256. field: '',
  257. colProps: { span: 24 },
  258. componentProps: {},
  259. },
  260. {
  261. component: 'TreeSelect',
  262. label: '树形选择',
  263. icon: 'clarity:tree-view-line',
  264. field: '',
  265. colProps: { span: 24 },
  266. componentProps: {
  267. treeData: [
  268. {
  269. label: '选项1',
  270. value: '1',
  271. children: [
  272. {
  273. label: '选项三',
  274. value: '1-1',
  275. },
  276. ],
  277. },
  278. {
  279. label: '选项2',
  280. value: '2',
  281. },
  282. ],
  283. },
  284. },
  285. {
  286. component: 'Upload',
  287. label: '上传',
  288. icon: 'ant-design:upload-outlined',
  289. field: '',
  290. colProps: { span: 24 },
  291. componentProps: {
  292. api: () => 1,
  293. },
  294. },
  295. {
  296. component: 'Cascader',
  297. label: '级联选择',
  298. icon: 'ant-design:check-outlined',
  299. field: '',
  300. colProps: { span: 24 },
  301. componentProps: {
  302. options: [
  303. {
  304. label: '选项1',
  305. value: '1',
  306. children: [
  307. {
  308. label: '选项三',
  309. value: '1-1',
  310. },
  311. ],
  312. },
  313. {
  314. label: '选项2',
  315. value: '2',
  316. },
  317. ],
  318. },
  319. },
  320. // {
  321. // component: 'Button',
  322. // label: '按钮',
  323. // icon: 'dashicons:button',
  324. // field: '',
  325. // colProps: { span: 24 },
  326. // hiddenLabel: true,
  327. // componentProps: {},
  328. // },
  329. // {
  330. // component: 'ColorPicker',
  331. // label: '颜色选择器',
  332. // icon: 'carbon:color-palette',
  333. // field: '',
  334. // colProps: { span: 24 },
  335. // componentProps: {
  336. // defaultValue: '',
  337. // value: '',
  338. // },
  339. // },
  340. {
  341. component: 'slot',
  342. label: '插槽',
  343. icon: 'vs:timeslot-question',
  344. field: '',
  345. colProps: { span: 24 },
  346. componentProps: {
  347. slotName: 'slotName',
  348. },
  349. },
  350. ];
  351. // https://next.antdv.com/components/transfer-cn
  352. const transferControl = {
  353. component: 'Transfer',
  354. label: '穿梭框',
  355. icon: 'bx:bx-transfer-alt',
  356. field: '',
  357. colProps: { span: 24 },
  358. componentProps: {
  359. render: (item) => item.title,
  360. dataSource: [
  361. {
  362. key: 'key-1',
  363. title: '标题1',
  364. description: '描述',
  365. disabled: false,
  366. chosen: true,
  367. },
  368. {
  369. key: 'key-2',
  370. title: 'title2',
  371. description: 'description2',
  372. disabled: true,
  373. },
  374. {
  375. key: 'key-3',
  376. title: '标题3',
  377. description: '描述3',
  378. disabled: false,
  379. chosen: true,
  380. },
  381. ],
  382. },
  383. };
  384. baseComponents.push(transferControl);
  385. export const layoutComponents: IVFormComponent[] = [
  386. {
  387. field: '',
  388. component: 'Grid',
  389. label: '栅格布局',
  390. icon: 'icon-grid',
  391. componentProps: {},
  392. columns: [
  393. {
  394. span: 12,
  395. children: [],
  396. },
  397. {
  398. span: 12,
  399. children: [],
  400. },
  401. ],
  402. colProps: { span: 24 },
  403. options: {
  404. gutter: 0,
  405. },
  406. },
  407. ];