useFormValues.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. import { isArray, isFunction, isObject, isString, isNullOrUnDef } from '/@/utils/is';
  2. import { dateUtil } from '/@/utils/dateUtil';
  3. import { unref } from 'vue';
  4. import type { Ref, ComputedRef } from 'vue';
  5. import type { FormProps, FormSchema } from '../types/form';
  6. import { set } from 'lodash-es';
  7. interface UseFormValuesContext {
  8. defaultValueRef: Ref<any>;
  9. getSchema: ComputedRef<FormSchema[]>;
  10. getProps: ComputedRef<FormProps>;
  11. formModel: Recordable;
  12. }
  13. /**
  14. * @desription deconstruct array-link key. This method will mutate the target.
  15. */
  16. function tryDeconstructArray(key: string, value: any, target: Recordable) {
  17. const pattern = /^\[(.+)\]$/;
  18. if (pattern.test(key)) {
  19. const match = key.match(pattern);
  20. if (match && match[1]) {
  21. const keys = match[1].split(',');
  22. value = Array.isArray(value) ? value : [value];
  23. keys.forEach((k, index) => {
  24. set(target, k.trim(), value[index]);
  25. });
  26. return true;
  27. }
  28. }
  29. }
  30. /**
  31. * @desription deconstruct object-link key. This method will mutate the target.
  32. */
  33. function tryDeconstructObject(key: string, value: any, target: Recordable) {
  34. const pattern = /^\{(.+)\}$/;
  35. if (pattern.test(key)) {
  36. const match = key.match(pattern);
  37. if (match && match[1]) {
  38. const keys = match[1].split(',');
  39. value = isObject(value) ? value : {};
  40. keys.forEach((k) => {
  41. set(target, k.trim(), value[k.trim()]);
  42. });
  43. return true;
  44. }
  45. }
  46. }
  47. export function useFormValues({
  48. defaultValueRef,
  49. getSchema,
  50. formModel,
  51. getProps,
  52. }: UseFormValuesContext) {
  53. // Processing form values
  54. function handleFormValues(values: Recordable) {
  55. if (!isObject(values)) {
  56. return {};
  57. }
  58. const res: Recordable = {};
  59. for (const item of Object.entries(values)) {
  60. let [, value] = item;
  61. const [key] = item;
  62. if (!key || (isArray(value) && value.length === 0) || isFunction(value)) {
  63. continue;
  64. }
  65. const transformDateFunc = unref(getProps).transformDateFunc;
  66. if (isObject(value)) {
  67. value = transformDateFunc?.(value);
  68. }
  69. if (isArray(value) && value[0]?.format && value[1]?.format) {
  70. value = value.map((item) => transformDateFunc?.(item));
  71. }
  72. // Remove spaces
  73. if (isString(value)) {
  74. value = value.trim();
  75. }
  76. if (!tryDeconstructArray(key, value, res) && !tryDeconstructObject(key, value, res)) {
  77. // 没有解构成功的,按原样赋值
  78. set(res, key, value);
  79. }
  80. }
  81. return handleRangeTimeValue(res);
  82. }
  83. /**
  84. * @description: Processing time interval parameters
  85. */
  86. function handleRangeTimeValue(values: Recordable) {
  87. const fieldMapToTime = unref(getProps).fieldMapToTime;
  88. if (!fieldMapToTime || !Array.isArray(fieldMapToTime)) {
  89. return values;
  90. }
  91. for (const [field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD'] of fieldMapToTime) {
  92. if (!field || !startTimeKey || !endTimeKey || !values[field]) {
  93. continue;
  94. }
  95. const [startTime, endTime]: string[] = values[field];
  96. values[startTimeKey] = dateUtil(startTime).format(format);
  97. values[endTimeKey] = dateUtil(endTime).format(format);
  98. Reflect.deleteProperty(values, field);
  99. }
  100. return values;
  101. }
  102. function initDefault() {
  103. const schemas = unref(getSchema);
  104. const obj: Recordable = {};
  105. schemas.forEach((item) => {
  106. const { defaultValue } = item;
  107. if (!isNullOrUnDef(defaultValue)) {
  108. obj[item.field] = defaultValue;
  109. formModel[item.field] = defaultValue;
  110. }
  111. });
  112. defaultValueRef.value = obj;
  113. }
  114. return { handleFormValues, initDefault };
  115. }