/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import { onMounted, reactive, ref, Ref } from 'vue' import getElementByJson from '@/components/form/get-elements-by-json' import type { IFormItem, IJsonItem, INodeData } from '../task/components/node/types' import * as Fields from '@/views/projects/task/components/node/fields' import { Router, useRouter } from 'vue-router' import { queryProjectPreferenceByProjectCode, updateProjectPreference, updateProjectPreferenceState } from '@/service/modules/projects-preference' import { useI18n } from 'vue-i18n' import { UpdateProjectPreferenceReq, UpdateProjectPreferenceStateReq } from '@/service/modules/projects-preference/types' import { useWarningType } from '@/views/projects/preference/components/use-warning-type' import { useTenant } from '@/views/projects/preference/components/use-tenant' import { useAlertGroup } from '@/views/projects/preference/components/use-alert-group' 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 const elementsRef = ref([]) as Ref 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 (let item of preferencesItems) { if (item.validate?.required) { item.validate.required = false item.span = 12 } 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 } }