export function useForm()

in dolphinscheduler-ui/src/views/projects/preference/use-form.ts [40:160]


export function useForm() {
  const router: Router = useRouter()
  const { t } = useI18n()

  const projectCode = Number(router.currentRoute.value.params.projectCode)

  const formRef = ref()
  const jsonRef = ref([]) as Ref<IJsonItem[]>
  const elementsRef = ref([]) as Ref<IFormItem[]>
  const rulesRef = ref({})
  const formProps = ref({})
  const stateRef = ref(0)

  formProps.value = {
    labelPlacement: 'left',
    labelWidth: 'auto',
    size: 'large'
  }

  const data = reactive({
    model: {
      taskPriority: 'MEDIUM',
      workerGroup: 'default',
      environmentCode: null,
      failRetryTimes: 0,
      failRetryInterval: 1,
      cpuQuota: -1,
      memoryMax: -1,
      timeoutFlag: false,
      timeoutNotifyStrategy: ['WARN'],
      timeout: 30
    } as INodeData
  })

  const setValues = (initialValues: { [field: string]: any }) => {
    Object.assign(data.model, initialValues)
  }

  const initProjectPreference = async () => {
    if (projectCode) {
      const result = await queryProjectPreferenceByProjectCode(projectCode)
      if (result?.preferences) {
        setValues(JSON.parse(result.preferences))
        stateRef.value = result.state
      }
    }
  }

  onMounted(() => {
    initProjectPreference()
  })

  const handleUpdate = () => {
    const requestData = {
      projectPreferences: JSON.stringify(data.model)
    } as UpdateProjectPreferenceReq
    updateProjectPreference(requestData, projectCode).then(() => {
      window.$message.success(t('project.preference.success'))
    })
  }

  const handleUpdateState = (value: number) => {
    const requestData = {
      state: value
    } as UpdateProjectPreferenceStateReq

    updateProjectPreferenceState(requestData, projectCode).then(() => {
      window.$message.success(t('project.preference.success'))
    })
  }

  const preferencesItems: IJsonItem[] = [
    Fields.useTaskPriority(),
    useTenant(),
    Fields.useWorkerGroup(projectCode),
    Fields.useEnvironmentName(data.model, true),
    ...Fields.useFailed(),
    useWarningType(),
    useAlertGroup(),
    ...Fields.useResourceLimit()
  ]

  const restructurePreferencesItems = (preferencesItems: any) => {
    for (const item of preferencesItems) {
      if (item.validate?.required) {
        item.validate.required = false
        item.span = 12
      }
      if (item.type === 'select') {
        Object.assign(item, {
          props: { style: 'width: 250px', clearable: true }
        })
      } else {
        Object.assign(item, { props: { style: 'width: 250px' } })
      }
    }
    return preferencesItems
  }

  jsonRef.value = restructurePreferencesItems(preferencesItems)

  const getElements = () => {
    const { rules, elements } = getElementByJson(jsonRef.value, data.model)
    elementsRef.value = elements
    rulesRef.value = rules
  }

  getElements()

  return {
    formRef,
    elementsRef,
    rulesRef,
    model: data.model,
    stateRef,
    formProps,
    t,
    handleUpdate,
    handleUpdateState
  }
}