@chase-shao/vue-component-lib 1.2.33 → 1.2.35
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs.js +1 -1
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.es.js +650 -643
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs.js","sources":["../src/stores/useLibraryMainStore.ts","../src/assets/js/util.ts","../src/services/axios.ts","../src/services/dataGetter.ts","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js","../src/components/data-gen/actions/types.ts","../src/services/dataGen.ts","../src/services/validation.ts","../src/components/data-gen/widgets/InputText.vue","../src/components/data-gen/widgets/InputNumber.vue","../src/components/data-gen/widgets/SelectList.vue","../src/components/data-gen/widgets/Cascader.vue","../src/components/data-gen/widgets/FileUpload.vue","../src/components/data-gen/widgets/TextArea.vue","../src/components/data-gen/widgets/CheckBox.vue","../src/components/data-gen/widgets/index.vue","../src/components/data-gen/actions/SubmitButton.vue","../src/components/data-gen/actions/DetailLink.vue","../src/components/data-gen/actions/index.vue","../src/composables/useRouter.ts","../src/composables/useTriggers.ts","../src/composables/usePinia.ts","../src/components/data-gen/views/CreateView.vue","../src/components/data-gen/views/UpdateView.vue","../src/composables/customComps.ts","../src/components/data-gen/views/DetailView.vue","../src/components/data-gen/views/ListView.vue","../src/main.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport { ref } from 'vue'\n\nexport const useLibraryMainStore = defineStore('main', () => {\n const token = ref<string | undefined>(undefined)\n \n return {\n token\n }\n})\n","import type { Store } from 'pinia'\n\n/**\n * 该函数用于创建一个异步的延迟操作,使程序暂停执行指定的毫秒数。\n * @param tick - 延迟的毫秒数。\n * @returns 一个 Promise,在指定的毫秒数后解析。\n */\nexport const sleep = async (tick: number) => new Promise((resolve) => setTimeout(resolve, tick))\n\n/**\n * async get data from store, if store ie empty load from remote.\n * @param store Target Pinia store\n * @param key Data key\n * @param remoteFunction Remote load function\n * @param defaultValue data default value\n * @returns {Promise<*>}\n */\nexport const getStoreData = async (\n store: Record<string, any>,\n key: string,\n remoteFunction: Function,\n defaultValue = undefined\n) => {\n // if store data is undefined, store at initial state.\n // then set store data to null and load from remote\n if (store[key] === undefined) {\n try {\n store[key] = null\n store[key] = (await remoteFunction()) || defaultValue\n } catch (e) {\n // if remote hih uncaught error, then set store data to initial state.\n console.error(e)\n store[key] = undefined\n }\n }\n // if store data is null, then other threads is loading data from remote.\n // wait certain time to until data loaded. Mean to save http resource\n while (store[key] === null) {\n await sleep(100)\n }\n return store[key]\n}\n\n/**\n * Pat a 0 to left if input string length is 1\n * @param str\n * @returns {string}\n */\nexport const patLeft0 = (str: any): string => {\n const s = `0${str}`\n return s.substring(s.length - 2)\n}\n\n/**\n * Format date as input format.\n * @param date input date\n * @param format date format, default as 'yyyy-MM-dd hh:mm:ss'\n * @returns {string|*}\n */\nexport const dateFormatter = (date: Date | string, format = 'yyyy-MM-dd hh:mm:ss'): string => {\n if (!date || (typeof date === 'string' && date.length === 0)) {\n return ''\n }\n\n try {\n const _date = new Date(date)\n const meta = [\n ['yyyy', _date.getFullYear()],\n ['yy', _date.getFullYear().toString().substring(2)],\n ['MM', patLeft0(_date.getMonth() + 1)],\n ['M', _date.getMonth() + 1],\n ['dd', patLeft0(_date.getDate())],\n ['d', _date.getDate()],\n ['hh', patLeft0(_date.getHours())],\n ['h', _date.getHours()],\n ['mm', patLeft0(_date.getMinutes())],\n ['m', _date.getMinutes()],\n ['ss', patLeft0(_date.getSeconds())],\n ['s', _date.getSeconds()]\n ] as [string, string][]\n\n for (const [key, value] of meta) {\n format = format.replace(key, value)\n }\n\n return format\n } catch (e) {\n return date.toLocaleString()\n }\n}\n","import { default as Axios } from 'axios'\nimport { useLibraryMainStore } from '@/stores/useLibraryMainStore'\nimport { getStoreData } from '../assets/js/util'\nimport { getLibraryConfig } from '@/main'\n\n// 获取配置,优先使用全局配置,回退到环境变量\nfunction getApiConfig() {\n const config = getLibraryConfig()\n return {\n apiBase: config.apiBase || import.meta.env.VITE_BPM_API_BASE || '',\n appSecret: config.appSecret || import.meta.env.VITE_BPM_APP_SECRET || ''\n }\n}\n\n// 动态创建 axios 实例\nfunction createAxiosInstance() {\n const { apiBase } = getApiConfig()\n return Axios.create({\n baseURL: apiBase,\n timeout: 10000, // 10s\n headers: { 'Content-Type': 'application/json' },\n withCredentials: true\n })\n}\n\nexport const getToken = async () => {\n const { apiBase, appSecret } = getApiConfig()\n const axios = createAxiosInstance()\n const mainStore = useLibraryMainStore()\n \n return await getStoreData(mainStore, 'token', async () => {\n const res = await axios.get<{ token: string }>(`${apiBase}/GenerateToken`, {\n params: {\n appid: 'bpm',\n appsecret: appSecret,\n },\n })\n\n return res?.data?.token\n })\n}\n\nexport const getAxios = async () => {\n const token = await getToken()\n const axios = createAxiosInstance()\n axios.defaults.headers.common['Authorization'] = `Bearer ${token}`\n return axios\n}\n","export default {\n CurrentUserEmail: (store:any) => store.svrStore()?.userInfo?.email_address ?? 'test.email@dataGetter.ts',\n CurrentUserPositionCode: (store:any) => store.bpmStore()?.positionCode ?? 888,\n CurrentDatetime: () => new Date().toISOString(),\n ApproverEmail: (store:any) => store.svrStore()?.userInfo?.email_address ?? 'test.email@dataGetter.ts',\n ApproverPositionCode: (store:any) => store.bpmStore()?.positionCode ?? 999,\n RejectReason: () => 'Test Reject Reason',\n} as { [key: string]: Function }\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import type { RedirectType } from '@/types'\n\nenum ActionTypeEnum {\n Submit,\n Link\n}\n\ntype ActionProps = {\n // title: string,\n url: string\n redirectType: RedirectType\n}\n\n// type ActionType = 'submit' | 'link'\n\ntype ActionEmits = {\n (e: 'click', actionType: ActionTypeEnum, url: string, redirectType: RedirectType, title: string): void\n}\n\ntype ActionNoTypeEmits = {\n (e: 'click', url: string, redirectType: RedirectType): void\n}\n\nexport type {\n ActionProps,\n ActionEmits\n}\n\nexport { ActionTypeEnum, ActionNoTypeEmits }","import type { RedirectType } from '@/types'\nimport { getAxios } from './axios'\nimport { default as dataGetter } from './dataGetter'\nimport { v4 as uuidv4 } from 'uuid'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\n\nexport type SelectOption = {\n value: string | number\n label: string\n [key: string]: unknown\n}\n\nexport type WidgetConfig = {\n widget: string\n readonly: boolean\n title: string\n dataSourceProvider: string\n options?: SelectOption[]\n multiple?: boolean\n remote?: string\n uploadURL?: string\n [key: string]: unknown\n}\n\nexport type ValidationConfig = {\n ruleName: string\n ruleParameter: any\n errorMessage: string\n}\n\nexport type Trigger = {\n event: string\n handlerName: string\n}\n\nexport type FieldConfig = {\n widget?: WidgetConfig\n order?: number\n validations: ValidationConfig[]\n modelValue?: any\n column?: boolean\n triggers?: Trigger[]\n uiFilters?: any[]\n isFiltered: boolean\n dependent: string\n fieldValue?: any\n}\n\nexport type TabsConfig = {\n key: string\n title: string\n filters: Record<string, any>[]\n}\n\nexport type Action = {\n redirectUrl: string,\n location: 'InTable' | 'InOperation',\n attributeType: 'UIControl',\n readonly: boolean,\n widget: ActionTypeEnum,\n title: string,\n isSubmit: boolean,\n requestUrl?: string\n redirectType?: 'Create' | 'Details' | 'Update'\n}\n\nexport type PageConfig = {\n pageType: string\n fields: Record<string, FieldConfig>\n actions?: Action[]\n globalValidations: Array<{\n rule: string\n errorMessage: string\n param?: any\n appliesTo: string[]\n }>\n tabs?: TabsConfig[]\n}\n\ntype FieldData = {\n attributes: Object[]\n propertyValue?: any\n}\n\nexport enum PageActionType {\n Create = 0,\n Update = 1,\n Details = 2,\n List = 3,\n}\n\nfunction mapPageData(input: any, type: PageActionType, store: { svrStore: any, bpmStore: any }): PageConfig {\n const config: PageConfig = {\n pageType: '',\n fields: {},\n globalValidations: [],\n }\n\n // 处理ClassAttributes\n input.__ClassAttributes?.forEach((attr: any) => {\n if (attr.attributeType === 'UIPageType') {\n config.pageType = attr.Type\n } else if (attr.attributeType === 'UIValidationControl') {\n config.globalValidations.push({\n rule: attr.ruleName,\n errorMessage: attr.errorMessage,\n param: attr.ruleParameter,\n appliesTo: attr.propertyNames || ['*'],\n })\n } else if (attr.attributeType === 'UIControl') {\n if (attr.widget === 'Tab') {\n if (!config.tabs) {\n config.tabs = []\n }\n config.tabs.unshift({\n key: uuidv4(),\n title: attr.title,\n filters: attr.filters ? JSON.parse(attr.filters) : [],\n })\n return\n }\n if (!config.actions) {\n config.actions = []\n }\n config.actions.push({\n isSubmit: attr.isSubmit,\n requestUrl: attr.requestUrl,\n redirectUrl: attr.redirectUrl,\n redirectType: attr.redirectType,\n title: attr.title,\n widget: attr.widget === 'Link' ? ActionTypeEnum.Link : ActionTypeEnum.Submit,\n location: attr.location,\n attributeType: attr.attributeType,\n readonly: attr.readonly,\n })\n }\n })\n\n // 处理字段配置\n Object.entries(input).forEach(([fieldName, fieldData]) => {\n if (fieldName === '__ClassAttributes' || fieldName === 'className') return\n if (fieldName === 'id' || fieldName === 'deleteFlag' || fieldName === 'status' || fieldName === 'workFlowReason') {\n return\n }\n if(type !== PageActionType.List){\n if(fieldName === 'workflowId'){\n return\n }\n }\n const fieldConfig: FieldConfig = {\n validations: [],\n triggers: [],\n isFiltered: false,\n dependent: ''\n }\n\n const { attributes, propertyValue } = fieldData as FieldData\n // 处理字段值\n switch (propertyValue) {\n case null:\n fieldConfig.modelValue = ''\n break\n case undefined:\n fieldConfig.modelValue = ''\n break\n default:\n fieldConfig.modelValue = propertyValue\n break\n }\n if(fieldName === 'onBehalf' && type === PageActionType.Create){\n fieldConfig.modelValue = dataGetter.CurrentUserEmail(store)\n }\n\n // 处理控件属性\n attributes?.forEach((attr: any) => {\n if (attr.order || attr.Order) {\n fieldConfig.order = (attr.order ?? attr.Order) as number\n } else if (attr.attributeType === 'UIControl') {\n fieldConfig.widget = {\n ...attr,\n column: true,\n } as WidgetConfig\n } else if (attr.attributeType === 'UIValidationControl' && type !== PageActionType.List) {\n if (fieldConfig.widget?.widget !== 'CheckBox') {\n fieldConfig.validations.push(attr as ValidationConfig)\n }\n } else if (attr.attributeType === 'UIListed') {\n fieldConfig.widget = {\n ...attr,\n column: true,\n } as WidgetConfig\n } else if (attr.attributeType === 'UIFiltered') {\n fieldConfig.isFiltered = true\n } else if (attr.dependentType) {\n fieldConfig.dependent = dataGetter[attr.dependentType] ? dataGetter[attr.dependentType](store) : ''\n } else if (attr.eventType === 'Change') {\n fieldConfig.triggers?.push({\n event: 'change',\n handlerName: attr.eventName\n })\n }\n })\n\n config.fields[fieldName] = fieldConfig\n })\n\n return config\n}\n\nexport const getPageData = async (\n type: PageActionType,\n className: string,\n store: {\n svrStore: any,\n bpmStore: any\n },\n opt?: {\n workflowId: string\n },\n) => {\n const axios = await getAxios()\n const res = await axios.get(`/General/${className}/${type}/page`, { params: opt })\n return mapPageData(res?.data, type, store)\n}\n\nexport const getBtnList = async (\n type: PageActionType,\n className: string,\n opt: {\n workflowId: string\n email: string\n },\n): Promise<{\n button: string,\n isShow: boolean\n}[]> => {\n const axios = await getAxios()\n const res = await axios.post(`/General/${className}/${type}/button/List`, null, { params: opt })\n return res?.data\n}\n\nexport type ListDataRes = {\n __ClassAttributes: {\n redirectUrl: string,\n location: 'InTable' | 'InOperation',\n attributeType: 'UIControl',\n readonly: boolean,\n widget: 'Link',\n title: 'Approve' | 'Create' | 'Update',\n isSubmit: boolean\n redirectType: RedirectType,\n }[],\n data: object[],\n totalCount: number\n}\n\nexport type Paging = {\n current: number,\n total: number,\n pageSize: number,\n defaultPageSize: number,\n showTotal: boolean,\n showPageSize: boolean,\n filters: Record<string, any>[],\n}\n\nexport async function getListData(\n className: string,\n params: {\n filters: object[]\n sorts: object[]\n pageNumber: number\n pageSize: number\n }\n) {\n const axios = await getAxios()\n const res = await axios.post<ListDataRes>(`/General/${className}/list`, params)\n return {\n data: res.data.data,\n totalCount: res.data.totalCount,\n // actions: res.data.__ClassAttributes.filter(item=> item.attributeType === 'UIControl').map((attr) => {\n // return {\n // redirectUrl: attr.redirectUrl,\n // location: attr.location,\n // attributeType: attr.attributeType,\n // redirectType: attr.redirectType,\n // readonly: attr.readonly,\n // widget: attr.widget,\n // title: attr.title,\n // isSubmit: attr.isSubmit,\n // }\n // }\n // ),\n }\n}\n\nexport async function createData(className: string, data: object, url: string) {\n const axios = await getAxios()\n const res = await axios.post<number[]>(url, data, {\n params: {\n className,\n },\n })\n return res.data.length > 0 ? res.data[0] : 0\n}\n\nfunction replaceId(url: string, id: string): string {\n return url.replace(/{workflowId}/g, id)\n}\n\nexport async function updateData(className: string, id: string, data: object, url: string) {\n const axios = await getAxios()\n const replacedUrl = replaceId(url, id)\n const res = await axios.put(replacedUrl, data, {\n params: {\n className,\n },\n })\n return res?.data\n}\n\nfunction replaceWorkflowId(url: string, id: string): string {\n return url.replace(/{WorkflowId}/g, id)\n}\n\nfunction replaceEmail(url: string, email: string): string {\n return url.replace(/{ApproverEmail}/g, email)\n}\n\nfunction replaceReason(url: string, reason: string): string {\n return url.replace(/{WorkFlowReason}/g, reason)\n}\n\nfunction replaceStatus(url: string, status: string): string {\n return url.replace(/{Status}/g, status)\n}\n\nfunction replaceIsGlobal(url: string, ifGlobal: string): string {\n return url.replace(/{IfTriggerGlobal_RandP_Approval}/g, ifGlobal)\n}\n\nexport async function approveData(className: string, id: string, email: string, reason: string, data: object, url: string, status: string, ifGlobal: string) {\n const axios = await getAxios()\n let replacedUrl = replaceWorkflowId(url, id)\n replacedUrl = replaceEmail(replacedUrl, email)\n replacedUrl = replaceReason(replacedUrl, reason)\n replacedUrl = replaceStatus(replacedUrl, status)\n replacedUrl = replaceIsGlobal(replacedUrl, ifGlobal)\n const res = await axios.put(replacedUrl, data, {\n params: {\n className,\n reason\n },\n })\n return res?.data\n}\n\nexport async function getOptions(url: string, value?: string): Promise<SelectOption[]> {\n const axios = await getAxios()\n const res = await axios.get(url, { params: { value } })\n const list = res?.data as { [key: string]: string }\n return Object.entries(list).map(([key, item]) => ({\n value: key,\n label: item,\n }))\n}\n\nexport async function getProcess(className: string, workflowId: string): Promise<any[]> {\n const axios = await getAxios()\n const res = await axios.get(`/General/${className}/${workflowId}/process`)\n return res?.data\n}","import type { ValidationConfig } from './dataGen'\n\nexport const validateRules = (configs: ValidationConfig[], value: any) => {\n let errorMessages = ''\n const res = configs.every(config => {\n const isValid = vallidateRule(config, value)\n if (!isValid) {\n errorMessages = config.errorMessage\n }\n return isValid\n })\n return { res, errorMessages }\n}\n\nexport const vallidateRule = (config: ValidationConfig, value: any): boolean => {\n const { ruleName, ruleParameter } = config\n return validations[ruleName](ruleParameter, value as string)\n}\n\nconst validations = {\n Regex: (parameter: string, value: string): boolean => {\n const reg = new RegExp(parameter)\n return reg.test(value)\n },\n Required: (_: string, value: string): boolean => {\n return !!value\n }\n} as { [key: string]: Function }\n","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: string | null): void => {\n emits('input', v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <AInput\n v-model=\"model\"\n allow-clear\n :disabled=\"props.readonly || props.config.Readonly\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n ></AInput>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted } from 'vue'\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst max = ref<number>(100)\nconst min = ref<number>(0)\nonMounted(() => {\n if (props.validations) {\n props.validations.forEach((v) => {\n if (v.ruleName === 'Max') {\n max.value = v.ruleParameter\n }\n if (v.ruleName === 'Min') {\n min.value = v.ruleParameter\n }\n })\n }\n})\n\nconst validate = (v?: number) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: number): void => {\n emits('input', v)\n}\n\nconst changeHandler = (v?: number): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <AInputNumber\n v-model=\"model\"\n clearable\n :disabled=\"props.readonly\"\n :min=\"min\"\n :max=\"max\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n ></AInputNumber>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted, computed } from 'vue'\nimport { getOptions } from '@/services/dataGen'\nimport type { WidgetConfig, SelectOption, Trigger } from '@/services/dataGen'\nimport { validateRules } from '@/services/validation'\nimport type { FormCompProps } from './index'\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<{\n (e: 'update:modelValue', value?: string | number | null): void\n (e: 'change', value?: string | number | null): void\n // 添加动态事件类型\n (e: string, ...value: any[]): void\n}>()\n\nconst loading = ref<boolean>(false)\nconst _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\n// 动态事件绑定对象\nconst eventHandlers = computed(() => {\n const handlers: Record<string, (v?: string) => void> = {}\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n handlers[trigger.event] = (v?: string) => {\n \n // 使用类型断言来绕过严格的事件类型检查\n emits(trigger.event, trigger.handlerName, v)\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n // emits('update:modelValue', v)\n }\n })\n }\n\n // handlers['change'] = (v?: string | number | null) => {\n // emits('update:modelValue', v)\n // emits('change', v)\n // }\n\n return handlers\n})\n\nconst loadOptions = async () => {\n if (props.config.dataSourceProvider) {\n _options.value = await getOptions(props.config.dataSourceProvider)\n }\n}\nonMounted(loadOptions)\n\nconst changeHandler = (v?: string) => {\n emits('update:modelValue', v)\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ASelect allow-clear v-model=\"model\" :loading=\"loading\" :filter-option=\"true\" :allow-search=\"true\" @change=\"changeHandler\">\n <template v-for=\"item in _options\" :key=\"item.value\">\n <AOption :value=\"item.value\" :label=\"item.label\"></AOption>\n </template>\n </ASelect>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted } from 'vue'\nimport type { WidgetConfig, SelectOption } from '@/services/dataGen'\nimport { getAxios } from '@/services/axios'\n\nconst props = defineProps<{\n modelValue: string\n config: WidgetConfig\n}>()\nconst emits = defineEmits<{\n (e: 'update:modelValue', value?: string | number | null): void\n (e: 'change', value?: string | number | null): void\n}>()\n\nconst _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst changeHandler = (v?: string | number | null) => {\n emits('update:modelValue', v)\n emits('change', v)\n}\n\nonMounted(async () => {\n if (props.config) {\n const url = props.config.dataSourceProvider\n if (url) {\n const axios = await getAxios()\n const res = await axios.get(url)\n _options.value = res.data as SelectOption[]\n }\n }\n})\n\nconst fieldNames = { value: 'key', label: 'value' }\n\ndefineExpose({\n validate(){\n return true\n }\n})\n</script>\n\n<template>\n <ASpace direction=\"vertical\" size=\"large\">\n <ACascader\n :field-names=\"fieldNames\"\n :model-value=\"modelValue\"\n :options=\"_options\"\n :style=\"{ width: '320px' }\"\n placeholder=\"Please select ...\"\n @change=\"changeHandler\"\n />\n </ASpace>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed,nextTick } from 'vue'\nimport type {UploadInstance, FileItem} from '@arco-design/web-vue'\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<{\n className: string\n} & FormCompProps>()\nconst emits = defineEmits<MyEmits>()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst ApiBase = import.meta.env.VITE_BPM_API_BASE || ''\n\nconst uploadRef = ref<UploadInstance | null>(null)\n\nconst id = ref<number>(0)\n\nconst fileList = ref<FileItem[]>([])\n\nfunction replaceIdAndClassName(url: string, workflowId: string, className: string): string {\n return url.replace(/{WorkflowId}/g, workflowId).replace(/{ClassName}/g, className)\n}\n\nconst action = computed<string>(() => {\n if(props.config.uploadURL){\n const url = ApiBase + props.config.uploadURL\n return replaceIdAndClassName(url, id.value.toString(), props.className)\n }\n return ''\n})\n\n//const _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst changeHandler = (v?: string | number | null) => {\n emits('change', v)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n submit(workflowId: number){\n if (uploadRef.value) {\n if(props.config.uploadURL){\n id.value = workflowId\n }\n nextTick(() => {\n uploadRef.value.submit()\n })\n }\n },\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <a-upload\n ref=\"uploadRef\"\n v-model=\"fileList\"\n :auto-upload=\"false\"\n :action=\"action\"\n :limit=\"props.config.allowedNumber\"\n @change=\"changeHandler\"\n >\n <template #start-icon></template>\n </a-upload>\n</template>","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: string | null): void => {\n emits('update:modelValue', v)\n emits('input', v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n emits('update:modelValue', v)\n const valid = validate(v)\n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ATextarea\n :model-value=\"props.modelValue\"\n placeholder=\"Please enter something\"\n allow-clear\n :disabled=\"props.readonly\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n />\n</template>","<script lang=\"ts\" setup>\nimport { onMounted } from 'vue';\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ACheckbox\n v-model=\"model\"\n clearable\n :disabled=\"props.readonly || props.config.Readonly\"\n @change=\"changeHandler\"\n >Yes</ACheckbox>\n</template>\n","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport type { FieldConfig } from '@/services/dataGen'\nimport { ref, watch, computed, useTemplateRef } from 'vue'\nimport InputText from './InputText.vue'\nimport InputNumber from './InputNumber.vue'\nimport SelectList from './SelectList.vue'\nimport Cascader from './Cascader.vue'\nimport FileUpload from './FileUpload.vue'\nimport TextArea from './TextArea.vue'\nimport CheckBox from './CheckBox.vue'\n\ntype FieldCompProps = {\n config: FieldConfig\n className: string\n} & FormCompProps\n\nconst props = defineProps<FieldCompProps>()\nconst emits = defineEmits<FormCompEmits>()\nconst model = defineModel()\n\nconst widgetRef = useTemplateRef('widgetRef')\n\n// const _value = ref<string | number>(props.modelValue || props.config?.value)\n// watch(_value, (newValue) => {\n// emits('update:modelValue', newValue)\n// })\n\nconst curComp = computed(() => {\n switch (props.config?.widget?.widget) {\n case 'TextBox':\n return InputText\n case 'Number':\n return InputNumber\n case 'SelectList':\n return SelectList\n case 'Cascade':\n return Cascader\n case 'File':\n return FileUpload\n case 'TextArea':\n return TextArea\n case 'DropDown':\n return SelectList\n case 'CheckBox':\n return CheckBox\n default:\n return InputText\n }\n})\n\nconst errMsg = ref<string>('')\nconst errHandler = (v: string) => {\n errMsg.value = v\n}\n\nconst changeHandler = (handlerName: string, v: any): void => {\n emits('change', handlerName, v)\n}\n// const updateHandler = (v: any): void => emits('update:modelValue', v)\n\nfunction isFileUpload() {\n return props.config?.widget?.widget === 'File'\n}\n\ndefineExpose({\n isFileUpload(){\n return props.config?.widget?.widget === 'File'\n },\n submit(workflowId: number) {\n if (isFileUpload()) {\n (widgetRef.value as InstanceType<typeof FileUpload>).submit(workflowId)\n }\n },\n validate(){\n return (widgetRef.value as InstanceType<typeof TextArea>)?.validate() \n },\n getCompName(){\n return props?.config?.widget?.title\n }\n})\n</script>\n\n<template>\n <div class=\"widget-wrapper\">\n <div class=\"title mb-1.5\">{{ props?.config?.widget?.title }}<span class=\"required\" v-if=\"props.config.validations.length\">*</span></div>\n <div class=\"form-widget\">\n <div class=\"widget\">\n <component\n ref=\"widgetRef\"\n :is=\"curComp\"\n v-model=\"model\"\n :config=\"props.config.widget\"\n :validations=\"props.config.validations\"\n :triggers=\"props.config.triggers\"\n :class-name=\"props.className\"\n @error=\"errHandler\"\n @change=\"changeHandler\"\n ></component>\n </div>\n <div v-if=\"errMsg.length > 0\" class=\"err-msg\">{{ errMsg }}</div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.err-msg {\n font-size $size-text-light\n color $color-red\n margin-top $gap-4\n}\n\n.required {\n color: $color-red\n font-size: $size-text-heavy\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { ActionProps, ActionNoTypeEmits } from '@/components/data-gen/actions/types'\n\nconst props = defineProps<ActionProps>()\n\nconst emits = defineEmits<ActionNoTypeEmits>()\n\nfunction clickHandler() {\n emits('click', props.url, props.redirectType)\n}\n</script>\n\n<template>\n <AButton type=\"primary\" @click=\"clickHandler\">\n <slot></slot>\n </AButton>\n</template>","<script setup lang=\"ts\">\nimport type { ActionProps, ActionNoTypeEmits } from '@/components/data-gen/actions/types'\n\nconst props = defineProps<ActionProps>()\n\nconst emits = defineEmits<ActionNoTypeEmits>()\n\nfunction clickHandler() {\n emits('click', props.url, props.redirectType)\n}\n</script>\n\n<template>\n<ALink @click=\"clickHandler\">\n <slot></slot>\n</ALink>\n</template>","<script setup lang=\"ts\">\nimport type { Action } from '@/services/dataGen'\nimport type { ActionEmits } from '@/components/data-gen/actions/types'\nimport { computed } from 'vue'\nimport SubmitButton from '@/components/data-gen/actions/SubmitButton.vue'\nimport DetailLink from '@/components/data-gen/actions/DetailLink.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport type { RedirectType } from '@/types'\n\nconst props = defineProps<{\n config: Action\n}>()\n\nconst emits = defineEmits<ActionEmits>()\n\nfunction clickHandler(url: string, redirectType: RedirectType) {\n emits('click', props.config.widget, url, redirectType, props.config.title)\n}\n\nconst curComp = computed(() => {\n switch (props.config.location) {\n case 'InOperation':\n return SubmitButton\n case 'InTable':\n default:\n return DetailLink\n }\n})\n\nconst curUrl = computed(() => {\n if (props.config.widget === ActionTypeEnum.Submit) {\n return props.config.requestUrl ?? ''\n } else if (props.config.widget === ActionTypeEnum.Link) {\n return props.config.redirectUrl ?? ''\n }\n return ''\n})\n\nconst redirectType = computed(() => {\n return props.config.redirectType ?? 'Details'\n})\n</script>\n\n<template>\n <component\n :is=\"curComp\"\n :url=\"curUrl\"\n :redirect-type=\"redirectType\"\n @click=\"clickHandler\"\n >\n {{ props.config.title }}\n </component>\n</template>\n\n<style lang=\"stylus\" scoped></style>\n","import { inject, type InjectionKey } from 'vue'\nimport { useRouter as useVueRouter } from 'vue-router'\nimport type { Router } from 'vue-router'\n\nexport const RouterKey: InjectionKey<Router> = Symbol('library-router')\n\nexport function useLibraryRouter(): Router {\n // 首先尝试从注入中获取宿主提供的 router\n const injectedRouter = inject(RouterKey, null)\n if (injectedRouter) {\n return injectedRouter\n }\n \n // 如果没有注入,回退到标准的 useRouter\n return useVueRouter()\n}\n","import { inject, type InjectionKey } from 'vue'\nimport { type Trigger } from '@/services/dataGen'\n\nexport const TriggersKey: InjectionKey<Record<string, (...args: any[]) => any>> = Symbol('library-triggers')\n\nexport function useTriggers(): Record<string, (...args: any[]) => any> {\n // 首先尝试从注入中获取宿主提供的 triggers\n const injectedTriggers = inject(TriggersKey, null)\n if (injectedTriggers) {\n return injectedTriggers\n }\n\n // 如果没有注入,返回一个空对象\n return {}\n}","import { inject, type InjectionKey } from 'vue'\nimport type { Pinia } from 'pinia'\n\nexport const PiniaKey: InjectionKey<Pinia> = Symbol('library-pinia')\n\nexport const BpmStoreKey: InjectionKey<Pinia> = Symbol('library-bpmStore')\n\nexport const SvrStoreKey: InjectionKey<Pinia> = Symbol('library-svrStore')\n\nexport function useLibraryPinia(): Pinia | null {\n // 从注入中获取宿主提供的 pinia\n return inject(PiniaKey, null)\n}\n\nexport function useBpmStore(): any {\n // 从注入中获取宿主提供的 bpmStore\n return inject(BpmStoreKey, null)\n}\n\nexport function useSvrStore(): any {\n // 从注入中获取宿主提供的 svrStore\n return inject(SvrStoreKey, null)\n}","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, useTemplateRef, getCurrentInstance, type VNodeRef } from 'vue'\nimport { getPageData, PageActionType, createData, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst bpmStore = useBpmStore()\n// console.log(\"🚀 ~ bpmStore:\", bpmStore().positionCode)\n\nconst svrStore = useSvrStore()\n// console.log(\"🚀 ~ svrStore:\", svrStore().userInfo)\n\nconst router = useLibraryRouter()\n\nconst triggers = useTriggers()\n\nconst dataWidgetsRefs = useTemplateRef('dataWidgets')\n\n// 在 setup 中获取实例\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\nconst _dependent = ref<Record<string, any>>({})\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\n\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n .filter((w) => !hiddenFields.value.includes(w.fieldKey))\n // .sort((a: WidgetConfig, b: WidgetConfig) => (a.order ?? 0) - (b.order ?? 0))\n\n return list\n}\n\nfunction genDependentField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list = Object.entries(fields).filter(([_, value]) => value.dependent).reduce((acc, [key, value]) => {\n acc[key] = value.dependent\n return acc\n }, {} as Record<string, any>)\n return list\n}\n\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst _data = reactive<Record<string, any>>({})\nconst loading = ref(false)\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Create, props.className, {\n svrStore,\n bpmStore\n })\n _fields.value = genField(pageData.value.fields)\n _dependent.value = genDependentField(pageData.value.fields)\n for (const key in pageData.value.fields) {\n _data[key] = pageData.value.fields[key].modelValue\n }\n loading.value = false\n})\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType) {\n switch (type) {\n case ActionTypeEnum.Submit:\n // 遍历所有的widget组件\n let validateResult = true\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.validate) {\n if(!widget.validate()){\n validateResult = false\n }\n }\n })\n if(!validateResult){\n instance?.appContext.config.globalProperties.$message.error('表单验证未通过,请检查输入项')\n return\n }\n const res = await createData(props.className, {..._data, ..._dependent.value}, url)\n // 遍历所有的widget组件\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.submit) {\n widget.submit(res)\n }\n })\n instance?.appContext.config.globalProperties.$notification.success('创建成功!')\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n if(redirectType === 'List') {\n router.push({name: 'List', params: {className: props.className}})\n }\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nconst newHiddenFields: string[] = ['jobScpope', \n 'currentWorkdayId', \n 'originalGrade', \n 'jobTitlePrevious', \n 'positionId']\n\nconst hiddenFields = ref<string[]>(newHiddenFields)\n\nfunction changeHandler(handlerName: string, v: string){\n triggers[handlerName]?.(v, hiddenFields)\n if(pageData.value){\n _fields.value = genField(pageData.value.fields)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">创建 {{ className }}</h1>\n <p class=\"page-subtitle\">请填写以下信息创建新的 {{ className }} 记录</p>\n </slot>\n </div>\n\n <!-- 表单内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"form-container\">\n <div class=\"form-card\">\n <div class=\"form-fields\">\n <template v-for=\"(value, key) in _fields\" :key=\"value.fieldKey\">\n <div class=\"form-field-wrapper\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"key\" \n :config=\"value\"\n :class-name=\"className\"\n v-model=\"_data[value.fieldKey]\"\n class=\"form-field\"\n @change=\"changeHandler\"\n />\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"form-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.form-container {\n width: 100%\n margin: 0 auto\n}\n\n.form-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n}\n\n.form-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.form-field-wrapper {\n .form-field {\n width: 100%\n }\n}\n\n.form-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .form-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .form-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, useTemplateRef, getCurrentInstance } from 'vue'\nimport { getPageData, updateData, PageActionType, getBtnList, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst router = useLibraryRouter()\n\nconst triggers = useTriggers()\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\n\nconst dataWidgetsRefs = useTemplateRef('dataWidgets')\n\n// 在 setup 中获取实例\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string,\n workflowId: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\nconst _dependent = ref<Record<string, any>>({})\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\n\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n .filter((w) => !hiddenFields.value.includes(w.fieldKey))\n // .sort((a: WidgetConfig, b: WidgetConfig) => (a.order ?? 0) - (b.order ?? 0))\n\n return list\n}\n\nfunction genDependentField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list = Object.entries(fields).filter(([_, value]) => value.dependent).reduce((acc, [key, value]) => {\n acc[key] = value.dependent\n return acc\n }, {} as Record<string, any>)\n return list\n}\n\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst _data = reactive<Record<string, any>>({})\nconst loading = ref(false)\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Update, props.className, {\n svrStore,\n bpmStore\n }, {\n workflowId: props.workflowId,\n })\n const btnList = await getBtnList(PageActionType.Update, props.className, {workflowId: props.workflowId, email: getApproverEmail()})\n pageData.value.actions = pageData.value.actions?.filter(item=>{\n const btn = btnList.find(btn => btn.button === item.title)\n if(!btn){\n return true\n }\n return btn.isShow\n })\n _fields.value = genField(pageData.value.fields)\n _dependent.value = genDependentField(pageData.value.fields)\n for (const key in pageData.value.fields) {\n _data[key] = pageData.value.fields[key].modelValue\n }\n loading.value = false\n})\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType) {\n switch (type) {\n case ActionTypeEnum.Submit:\n // 遍历所有的widget组件\n let validateResult = true\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.validate) {\n if(!widget.validate()){\n validateResult = false\n }\n }\n })\n if(!validateResult){\n instance?.appContext.config.globalProperties.$message.error('表单验证未通过,请检查输入项')\n return\n }\n const res = await updateData(props.className, props.workflowId, {..._data, ..._dependent.value}, url)\n // 遍历所有的widget组件\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.submit) {\n widget.submit(res)\n }\n })\n instance?.appContext.config.globalProperties.$notification.success('修改成功!')\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n router.push({name: redirectType, params: {className: props.className}})\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nconst newHiddenFields: string[] = ['jobScpope', \n 'currentWorkdayId', \n 'originalGrade', \n 'jobTitlePrevious', \n 'positionId']\n\nconst hiddenFields = ref<string[]>(newHiddenFields)\n\nfunction changeHandler(handlerName: string, v: string){\n triggers[handlerName]?.(v, hiddenFields)\n if(pageData.value){\n _fields.value = genField(pageData.value.fields)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">编辑 {{ className }}</h1>\n <p class=\"page-subtitle\">修改以下信息来更新 {{ className }} 记录 (ID: {{ workflowId }})</p>\n </slot>\n </div>\n\n <!-- 表单内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"form-container\">\n <div class=\"form-card\">\n <div class=\"form-fields\">\n <template v-for=\"(value, key) in _fields\" :key=\"value.fieldKey\">\n <div class=\"form-field-wrapper\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"key\" \n :config=\"value\" \n v-model=\"_data[value.fieldKey]\"\n class=\"form-field\"\n @change=\"changeHandler\"\n />\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"form-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.form-container {\n width: 100%\n margin: 0 auto\n}\n\n.form-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n}\n\n.form-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.form-field-wrapper {\n .form-field {\n width: 100%\n }\n}\n\n.form-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .form-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .form-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>","import { inject, type InjectionKey } from 'vue'\n\nexport const CustomCompsKey: InjectionKey<any> = Symbol('library-custom-comp')\n\nexport function useLibraryCustomComps(): any {\n return inject(CustomCompsKey, null)\n}\n","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, getCurrentInstance} from 'vue'\nimport { getPageData, getBtnList, approveData, PageActionType, getProcess, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport type { DescData } from '@arco-design/web-vue'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport dataGetter from '@/services/dataGetter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\nimport {useLibraryCustomComps} from \"@/composables/customComps\"\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\n\nconst triggers = useTriggers()\n\nconst router = useLibraryRouter()\n\nconst customComps = useLibraryCustomComps()\n\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string,\n workflowId: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n if(typeof value.modelValue === 'boolean'){\n value.fieldValue = value.modelValue ? 'Yes' : 'No'\n }else{\n value.fieldValue = value.modelValue\n }\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n\n return list\n}\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst loading = ref(true)\n\nconst formatDate = (date:string, format = 'yyyy-MM-dd hh:mm:ss.fff') => {\n const d = new Date(date)\n\n if (isNaN(d.getTime())) {\n return date\n }\n\n const data:any = {\n 'yyyy': d.getFullYear(),\n 'yy': d.getFullYear().toString().substring(2),\n 'MM': (d.getMonth() + 1).toString().padStart(2, '0'),\n 'M': (d.getMonth() + 1),\n 'dd': d.getDate().toString().padStart(2, '0'),\n 'd': d.getDate(),\n 'hh': d.getHours().toString().padStart(2, '0'),\n 'h': d.getHours(),\n 'mm': d.getMinutes().toString().padStart(2, '0'),\n 'm': d.getMinutes(),\n 'ss': d.getSeconds().toString().padStart(2, '0'),\n 's': d.getSeconds(),\n 'fff': d.getMilliseconds().toString().padStart(3, '0'),\n 'f': d.getMilliseconds(),\n }\n\n let res = format\n for (const key of Object.keys(data)) {\n res = res.replace(key, data[key])\n }\n\n return res\n}\n\nconst mapWorkflowSteps = (process:any[], status:any) => {\n const currentIndex = process.findIndex(item => item.isCurrent)\n return process.map((p, index) => {\n const step = {\n id: p.id,\n title: '',\n proxy: '',\n sub: '',\n desc: '',\n status: 1,\n time: ''\n }\n step.title = p.workflowProcessApprovers[0]?.name\n const nodeApprover = p.workflowProcessApprovers[p.workflowProcessApprovers.length - 1]\n const history = p.workflowHistorys[p.workflowHistorys.length - 1]\n const actualApprover = history?.workflowHistoryApprovers[history?.workflowHistoryApprovers?.length - 1]\n if (nodeApprover && actualApprover && nodeApprover?.email?.toLowerCase() !== actualApprover?.approverEmail?.toLowerCase()) {\n step.title = `${actualApprover.name}`\n step.proxy = `代理: ${nodeApprover.name}`\n }\n if (p.sort > 1) {\n step.sub = '审批角色:' + p.nodeName.replace('Submit', '').replace('Approve', '')\n } else {\n step.sub = '提交申请'\n }\n if (p.isCurrent && status !== -1) {\n // canRecall.value = index === 0\n step.desc = '审批中'\n step.status = 1\n } else {\n const history = p.workflowHistorys[p.workflowHistorys.length - 1]\n if (history && history.status === 100) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n step.status = 2\n step.desc = '已审批'\n } else if (history && history.status === 999) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n step.status = 0\n step.desc = '已跳过'\n } else if (history) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n if (p.sort === 1) {\n step.status = 2\n step.desc = ''\n } else {\n const historyApprover = history.workflowHistoryApprovers[0]\n step.status = 3\n step.desc = historyApprover?.reason ? `拒绝原因:${historyApprover.reason}` : '已拒绝'\n }\n } else if (index < currentIndex || currentIndex === -1) {\n step.status = 0\n step.desc = '已跳过'\n } else {\n step.status = 0\n step.desc = '待审批'\n }\n if (history && history.status !== 1) {\n } else {\n }\n }\n\n return step\n })\n}\n\n\nconst steps = ref<any[]>([])\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Details, props.className, {\n svrStore,\n bpmStore\n }, {\n workflowId: props.workflowId,\n })\n const btnList = await getBtnList(PageActionType.Details, props.className, {workflowId: props.workflowId, email: getApproverEmail()})\n pageData.value.actions = pageData.value.actions?.filter(item=>{\n const btn = btnList.find(btn => btn.button === item.title)\n if(!btn){\n return true\n }\n return btn.isShow\n })\n _fields.value = genField(pageData.value.fields)\n const process = await getProcess(props.className, props.workflowId)\n console.log(\"🚀 ~ process:\", process)\n steps.value = mapWorkflowSteps(process, 0)\n\n loading.value = false\n})\n\nasync function triggerFn(title: string): Promise<any> {\n return triggers[title]?.()\n}\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType, title: string) {\n try {\n switch (type) {\n case ActionTypeEnum.Submit:\n const {reason,ifGlobal} = await triggerFn(title)\n const status = title === 'Approve' ? '100' : '-1'\n await approveData(props.className, props.workflowId, getApproverEmail(), reason, [props.workflowId], url, status, ifGlobal)\n const successContent = title === 'Approve' ? '审批已通过!' : '审批已拒绝!'\n instance?.appContext.config.globalProperties.$notification.success(successContent)\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n if(redirectType === 'List'){\n router.push({name: 'List', params: {className: props.className}})\n }\n break\n default:\n console.warn('Unknown action type:', type)\n }\n } catch (error) {\n // console.error('Action failed:', error)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">{{ className }} 详情</h1>\n <p class=\"page-subtitle\">查看 {{ className }} 记录详细信息 (ID: {{ workflowId }})</p>\n </slot>\n </div>\n\n <!-- 详情内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"detail-container\">\n <div class=\"detail-card\">\n <component :is=\"customComps.Steps\" :steps=\"steps\"/>\n <div class=\"detail-fields\">\n <template v-for=\"(item) in _fields\" :key=\"item.fieldKey\">\n <div class=\"detail-field-wrapper\">\n <!-- <template v-if=\"['ifTriggerGlobal_RandP_Approval'].includes(item.fieldKey)\">\n <div class=\"detail-field\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"item.fieldKey\" \n :config=\"item\"\n :class-name=\"className\"\n v-model=\"item.modelValue\"\n class=\"form-field\"\n />\n </div>\n </template> -->\n <div class=\"detail-field\">\n <div class=\"field-label\">{{ item.widget?.title }}</div>\n <div class=\"field-value\">{{ item.fieldValue }}</div>\n </div>\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"detail-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.detail-container {\n width: 100%\n margin: 0 auto\n}\n\n.detail-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n padding-top: 20px\n}\n\n.detail-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.detail-field-wrapper {\n .detail-field {\n width: 100%\n \n .field-label {\n font-weight: 500\n color: #262626\n margin-bottom: 8px\n font-size: 14px\n line-height: 1.4\n }\n \n .field-value {\n color: #595959\n padding: 8px 12px\n background-color: #fafafa\n border-radius: 4px\n min-height: 40px\n display: flex\n align-items: center\n font-size: 14px\n line-height: 1.5\n border: 1px solid #f0f0f0\n word-break: break-word\n }\n }\n}\n\n.detail-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .detail-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .detail-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, onActivated, onMounted, reactive, ref } from 'vue'\nimport { getPageData, getListData, type PageConfig, type FieldConfig, type Action, type Paging } from '@/services/dataGen'\nimport { FileItem, type TableColumnData } from '@arco-design/web-vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\ndefineOptions({\n name: 'ListView'\n})\nconst router = useLibraryRouter()\n\nconst props = defineProps<{\n className: string\n}>()\n\nconst pageData = ref<PageConfig>()\n\nconst paging = reactive<Paging>({\n current: 1,\n total: 0,\n pageSize: 10,\n defaultPageSize: 10,\n showTotal: true,\n showPageSize: true,\n filters: [],\n})\n\nfunction createListParams() {\n // 将搜索表单转换为过滤条件\n const searchFilters = Object.entries(searchForm.value)\n .filter(([, value]) => value && value !== '')\n .map(([key, value]) => ({\n key,\n value,\n // operator: 'like' // 根据实际需要调整操作符\n }))\n\n return {\n pageNumber: paging.current,\n pageSize: paging.pageSize,\n filters: [...paging.filters, ...searchFilters],\n sorts: [{\n \"key\": \"status\",\n \"type\": 0\n }],\n }\n}\n\n// 优化滚动配置 - 移除固定高度\nconst scroll = computed(() => {\n const columnCount = _columns.value.length\n const estimatedWidth = columnCount * 150 + 250 // 包含Actions列宽度\n return {\n x: estimatedWidth, // 只设置横向滚动\n // 移除 y 属性,让表格高度自适应\n }\n})\n\n// 优化列配置\nconst mapColumns = (fields: Record<string, FieldConfig>) => {\n const col = Object.entries(fields)\n .filter(([, item]) => item.widget?.column)\n .map(([key, value], index) => {\n return {\n title: value.widget!.title,\n dataIndex: key.charAt(0).toLowerCase() + key.slice(1),\n order: value.order,\n ellipsis: true,\n tooltip: true,\n width: 150,\n minWidth: 100, // 启用最小宽度\n resizable: true, // 启用列宽调整\n } as TableColumnData\n })\n .sort((a, b) => a.order - b.order)\n\n col.push({\n title: 'Actions',\n slotName: 'optional',\n align: 'center',\n width: 250,\n minWidth: 200,\n fixed: 'right',\n resizable: false,\n })\n _columns.value = col\n}\n\n// 优化数据加载,减少不必要的响应式\nconst _data = ref<object[]>([])\nconst _columns = ref<TableColumnData[]>([])\nconst loadingPage = ref(true)\nconst loadingTable = ref(true)\n\nconst actions = ref<Action[]>()\n\nconst loadData = async () => {\n loadingTable.value = true\n const res = await getListData(props.className, createListParams())\n _data.value = res.data\n paging.total = res.totalCount\n loadingTable.value = false\n}\n\nonMounted(async () => {\n loadingPage.value = true\n pageData.value = await getPageData(3, props.className, {\n svrStore,\n bpmStore\n })\n mapColumns(pageData.value.fields)\n initSearchForm(pageData.value.fields)\n loadData()\n actions.value = pageData.value.actions\n loadingPage.value = false\n})\n\nonActivated(() => {\n loadData()\n})\n\nconst pageChangeHandler = (page: number) => {\n paging.current = page\n loadData()\n}\n\nconst pageSizeChangeHandler = (pageSize: number) => {\n paging.pageSize = pageSize\n loadData()\n}\n\nfunction clickHandler(type: ActionTypeEnum, _: string, redirectType: RedirectType, title: string, workflowId: string) {\n switch (type) {\n case ActionTypeEnum.Link:\n router.push({ name: redirectType, params: { workflowId } })\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nfunction createHandler(actionType: ActionTypeEnum, _: string, redirectType: RedirectType) {\n switch (actionType) {\n case ActionTypeEnum.Link:\n router.push({ name: redirectType })\n break\n default:\n console.warn('Unknown action type:', actionType)\n }\n}\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nfunction replaceEmail(url: string, email: string): string {\n return url.replace(/{currentUserEmail}/g, email)\n}\n\nfunction tabHandler(key: string) {\n const filters = pageData.value?.tabs?.find(item => item.key === key)?.filters\n paging.filters = filters?.map(item => {\n return {\n ...item,\n value: replaceEmail(item.value, getApproverEmail())\n }\n }) || []\n loadData()\n}\n\n// 添加查询表单数据\nconst searchForm = ref<Record<string, any>>({})\n\n// 计算可搜索的字段\nconst searchableFields = computed(() => {\n if (!pageData.value?.fields) return []\n return Object.entries(pageData.value.fields)\n .filter(([, item]) => item.isFiltered)\n})\n\n// 初始化查询表单\nconst initSearchForm = (fields: Record<string, FieldConfig>) => {\n const form: Record<string, any> = {}\n Object.entries(fields).forEach(([key, value]) => {\n form[key] = value.modelValue \n })\n searchForm.value = form\n}\n\n// 查询处理函数\nconst handleSearch = () => {\n paging.current = 1\n loadData()\n}\n\n// 重置查询\nconst handleReset = () => {\n // Object.keys(searchForm.value).forEach(key => {\n // searchForm.value[key] = ''\n // })\n \n if(pageData.value){\n initSearchForm(pageData.value.fields)\n }\n handleSearch()\n}\n\nfunction judgeHiddenActions(action: Action, record: any) {\n if (action.location !== 'InTable') {\n return false\n }\n if (action.title === 'Update') {\n if(record.status === 100){\n return false\n }\n if(record.status === -1){\n return false\n } \n }\n return true\n}\n</script>\n\n<template>\n <div class=\"list-container\">\n <div class=\"page-title\">{{ className }} : List</div>\n <!-- 查询表单 -->\n <a-card>\n <div class=\"query-title\">\n <h3>查询条件</h3>\n <div>\n <template v-for=\"action in actions\" :key=\"action.title\">\n <template v-if=\"action.location === 'InOperation'\">\n <ActionButton :config=\"action\" @click=\"createHandler\" />\n </template>\n </template>\n </div>\n </div>\n <a-row :gutter=\"[24, 20]\" class=\"search-row\">\n <template v-for=\"[key, field] in searchableFields\" :key=\"key\">\n <a-col :span=\"6\" class=\"search-col\">\n <DataWidgets :name=\"key\" :config=\"field\" v-model=\"searchForm[key]\" class=\"form-field\" />\n </a-col>\n </template>\n <a-col :span=\"6\" class=\"search-col\">\n <div class=\"field-wrapper\">\n <a-space size=\"medium\">\n <a-button type=\"primary\" size=\"medium\" @click=\"handleSearch\">\n 查询\n </a-button>\n <a-button size=\"medium\" @click=\"handleReset\">\n 重置\n </a-button>\n </a-space>\n </div>\n </a-col>\n </a-row>\n </a-card>\n\n <a-tabs size=\"large\" @tab-click=\"tabHandler\">\n <a-tab-pane v-for=\"tab in pageData?.tabs\" :key=\"tab.key\" :title=\"tab.title\">\n </a-tab-pane>\n </a-tabs>\n <a-table \n :columns=\"_columns\" \n :data=\"_data\" \n stripe \n border\n :pagination=\"{\n current: paging.current,\n total: paging.total,\n pageSize: paging.pageSize,\n showTotal: paging.showTotal,\n showPageSize: paging.showPageSize,\n showJumper: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\" \n :loading=\"loadingTable\" \n size=\"medium\" \n :scroll=\"scroll\"\n @page-change=\"pageChangeHandler\"\n @page-size-change=\"pageSizeChangeHandler\">\n \n <template #optional=\"{ record }\">\n <a-space size=\"small\">\n <template v-for=\"action in actions\" :key=\"action.title\">\n <template v-if=\"judgeHiddenActions(action, record)\">\n <ActionButton \n :config=\"action\" \n size=\"small\"\n @click=\"(...args) => clickHandler(...args, record.workflowId)\" \n />\n </template>\n </template>\n </a-space>\n </template>\n </a-table>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.list-container {\n padding 16px\n \n // 移除固定高度相关的CSS\n :deep(.arco-table) {\n .arco-table-body {\n overflow-x: auto\n // 移除 overflow-y 和固定高度相关样式\n }\n }\n}\n\n.page-title {\n font-size: 24px;\n font-weight: bold;\n color: #1d2129;\n margin-bottom: 16px;\n padding: 12px 0;\n}\n\n.query-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.search-row {\n margin-top: 16px;\n}\n\n.field-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.field-label {\n font-weight: 500;\n margin-bottom: 8px;\n}\n</style>\n","import type { App } from 'vue'\nimport type { Router } from 'vue-router'\nimport type { Pinia } from 'pinia'\nimport CreateView from '@/components/data-gen/views/CreateView.vue'\nimport UpdateView from '@/components/data-gen/views/UpdateView.vue'\nimport DetailView from '@/components/data-gen/views/DetailView.vue'\nimport ListView from '@/components/data-gen/views/ListView.vue'\nimport { RouterKey } from '@/composables/useRouter'\nimport { PiniaKey, BpmStoreKey, SvrStoreKey} from '@/composables/usePinia'\nimport {TriggersKey} from '@/composables/useTriggers'\nimport { CustomCompsKey } from '@/composables/customComps'\n\n// 导入样式文件\nimport '@/styles/index.styl'\n\n// 全局配置\nexport interface LibraryConfig {\n apiBase?: string\n appSecret?: string\n}\n\nlet globalConfig: LibraryConfig = {}\n\nexport function setLibraryConfig(config: LibraryConfig) {\n globalConfig = { ...globalConfig, ...config }\n}\n\nexport function getLibraryConfig(): LibraryConfig {\n return globalConfig\n}\n\ninterface PluginOptions {\n router?: Router\n pinia?: Pinia\n config?: LibraryConfig\n [key: string]: any\n}\n\nconst MyPlugin = {\n install(app: App, options: PluginOptions = {}) {\n // 设置全局配置\n if (options.config) {\n setLibraryConfig(options.config)\n }\n \n // 如果宿主提供了 router,注入它以便共享\n if (options.router) {\n app.provide(RouterKey, options.router)\n }\n \n // 如果宿主提供了 pinia,注入它以便共享\n if (options.pinia) {\n app.provide(PiniaKey, options.pinia)\n }\n\n // 如果宿主提供了 bpmStore,注入它以便共享\n if (options.useBpmStore) {\n app.provide(BpmStoreKey, options.useBpmStore)\n }\n\n // 如果宿主提供了 svrStore,注入它以便共享\n if (options.useSvrStore) {\n app.provide(SvrStoreKey, options.useSvrStore)\n }\n\n // 如果宿主提供了 triggers,注入它以便共享\n if (options.triggers) {\n app.provide(TriggersKey, options.triggers)\n }\n\n if (options.customComps) {\n app.provide(CustomCompsKey, options.customComps)\n }\n\n // 注册组件\n app.component('CreateView', CreateView)\n app.component('UpdateView', UpdateView)\n app.component('DetailView', DetailView)\n app.component('ListView', ListView)\n }\n}\n\nexport default MyPlugin\n\nexport { CreateView, UpdateView, DetailView, ListView }\nexport { RouterKey } from '@/composables/useRouter'\nexport { PiniaKey } from '@/composables/usePinia'"],"names":["useLibraryMainStore","defineStore","ref","sleep","tick","resolve","getStoreData","store","key","remoteFunction","defaultValue","e","getApiConfig","config","getLibraryConfig","createAxiosInstance","apiBase","Axios","getToken","appSecret","axios","mainStore","getAxios","token","dataGetter","byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","ActionTypeEnum","PageActionType","mapPageData","input","type","attr","uuidv4","fieldName","fieldData","fieldConfig","attributes","propertyValue","getPageData","className","opt","res","getBtnList","getListData","params","createData","data","url","replaceId","id","updateData","replacedUrl","replaceWorkflowId","replaceEmail","email","replaceReason","reason","replaceStatus","status","replaceIsGlobal","ifGlobal","approveData","getOptions","value","list","item","getProcess","workflowId","validateRules","configs","errorMessages","isValid","vallidateRule","ruleName","ruleParameter","validations","parameter","_","props","__props","emits","__emit","model","_useModel","validate","v","inputHandler","changeHandler","valid","trigger","__expose","_createBlock","_component_AInput","$event","max","min","onMounted","_component_AInputNumber","loading","_options","computed","handlers","loadOptions","_component_ASelect","_createElementBlock","_Fragment","_renderList","_component_AOption","fieldNames","_component_ASpace","_createVNode","_component_ACascader","modelValue","ApiBase","uploadRef","fileList","replaceIdAndClassName","action","nextTick","_component_a_upload","_cache","_component_ATextarea","_component_ACheckbox","widgetRef","useTemplateRef","curComp","InputText","InputNumber","SelectList","Cascader","FileUpload","TextArea","CheckBox","errMsg","errHandler","handlerName","isFileUpload","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createTextVNode","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","_resolveDynamicComponent","_hoisted_6","clickHandler","_component_AButton","_renderSlot","_ctx","_component_ALink","redirectType","SubmitButton","DetailLink","curUrl","RouterKey","useLibraryRouter","injectedRouter","inject","useVueRouter","TriggersKey","useTriggers","injectedTriggers","PiniaKey","BpmStoreKey","SvrStoreKey","useBpmStore","useSvrStore","bpmStore","svrStore","router","triggers","dataWidgetsRefs","instance","getCurrentInstance","pageData","_fields","_dependent","genField","fields","w","hiddenFields","genDependentField","acc","reversedActions","_data","reactive","validateResult","widget","newHiddenFields","_component_a_spin","_hoisted_7","DataWidgets","$slots","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","ActionButton","btnList","getApproverEmail","btn","CustomCompsKey","useLibraryCustomComps","customComps","formatDate","date","format","d","mapWorkflowSteps","process","currentIndex","p","index","step","nodeApprover","history","actualApprover","historyApprover","steps","triggerFn","title","successContent","_unref","_hoisted_12","_hoisted_13","_hoisted_14","paging","createListParams","searchFilters","searchForm","scroll","_columns","mapColumns","col","a","b","loadingPage","loadingTable","actions","loadData","initSearchForm","onActivated","pageChangeHandler","page","pageSizeChangeHandler","pageSize","createHandler","actionType","tabHandler","filters","searchableFields","form","handleSearch","handleReset","judgeHiddenActions","record","_component_a_card","_component_a_row","field","_component_a_col","_component_a_space","_component_a_button","_component_a_tabs","tab","_component_a_tab_pane","_component_a_table","_withCtx","args","globalConfig","setLibraryConfig","MyPlugin","app","CreateView","UpdateView","DetailView","ListView"],"mappings":"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","x_google_ignoreList":[4,5,6,7]}
|
|
1
|
+
{"version":3,"file":"index.cjs.js","sources":["../src/stores/useLibraryMainStore.ts","../src/assets/js/util.ts","../src/services/axios.ts","../src/services/dataGetter.ts","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/stringify.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/rng.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/native.js","../node_modules/.pnpm/uuid@11.1.0/node_modules/uuid/dist/esm-browser/v4.js","../src/components/data-gen/actions/types.ts","../src/services/dataGen.ts","../src/services/validation.ts","../src/components/data-gen/widgets/InputText.vue","../src/components/data-gen/widgets/InputNumber.vue","../src/components/data-gen/widgets/SelectList.vue","../src/components/data-gen/widgets/Cascader.vue","../src/components/data-gen/widgets/FileUpload.vue","../src/components/data-gen/widgets/TextArea.vue","../src/components/data-gen/widgets/CheckBox.vue","../src/components/data-gen/widgets/index.vue","../src/components/data-gen/actions/SubmitButton.vue","../src/components/data-gen/actions/DetailLink.vue","../src/components/data-gen/actions/index.vue","../src/composables/useRouter.ts","../src/composables/useTriggers.ts","../src/composables/usePinia.ts","../src/components/data-gen/views/CreateView.vue","../src/components/data-gen/views/UpdateView.vue","../src/composables/customComps.ts","../src/components/data-gen/views/DetailView.vue","../src/components/data-gen/views/ListView.vue","../src/main.ts"],"sourcesContent":["import { defineStore } from 'pinia'\nimport { ref } from 'vue'\n\nexport const useLibraryMainStore = defineStore('main', () => {\n const token = ref<string | undefined>(undefined)\n \n return {\n token\n }\n})\n","import type { Store } from 'pinia'\n\n/**\n * 该函数用于创建一个异步的延迟操作,使程序暂停执行指定的毫秒数。\n * @param tick - 延迟的毫秒数。\n * @returns 一个 Promise,在指定的毫秒数后解析。\n */\nexport const sleep = async (tick: number) => new Promise((resolve) => setTimeout(resolve, tick))\n\n/**\n * async get data from store, if store ie empty load from remote.\n * @param store Target Pinia store\n * @param key Data key\n * @param remoteFunction Remote load function\n * @param defaultValue data default value\n * @returns {Promise<*>}\n */\nexport const getStoreData = async (\n store: Record<string, any>,\n key: string,\n remoteFunction: Function,\n defaultValue = undefined\n) => {\n // if store data is undefined, store at initial state.\n // then set store data to null and load from remote\n if (store[key] === undefined) {\n try {\n store[key] = null\n store[key] = (await remoteFunction()) || defaultValue\n } catch (e) {\n // if remote hih uncaught error, then set store data to initial state.\n console.error(e)\n store[key] = undefined\n }\n }\n // if store data is null, then other threads is loading data from remote.\n // wait certain time to until data loaded. Mean to save http resource\n while (store[key] === null) {\n await sleep(100)\n }\n return store[key]\n}\n\n/**\n * Pat a 0 to left if input string length is 1\n * @param str\n * @returns {string}\n */\nexport const patLeft0 = (str: any): string => {\n const s = `0${str}`\n return s.substring(s.length - 2)\n}\n\n/**\n * Format date as input format.\n * @param date input date\n * @param format date format, default as 'yyyy-MM-dd hh:mm:ss'\n * @returns {string|*}\n */\nexport const dateFormatter = (date: Date | string, format = 'yyyy-MM-dd hh:mm:ss'): string => {\n if (!date || (typeof date === 'string' && date.length === 0)) {\n return ''\n }\n\n try {\n const _date = new Date(date)\n const meta = [\n ['yyyy', _date.getFullYear()],\n ['yy', _date.getFullYear().toString().substring(2)],\n ['MM', patLeft0(_date.getMonth() + 1)],\n ['M', _date.getMonth() + 1],\n ['dd', patLeft0(_date.getDate())],\n ['d', _date.getDate()],\n ['hh', patLeft0(_date.getHours())],\n ['h', _date.getHours()],\n ['mm', patLeft0(_date.getMinutes())],\n ['m', _date.getMinutes()],\n ['ss', patLeft0(_date.getSeconds())],\n ['s', _date.getSeconds()]\n ] as [string, string][]\n\n for (const [key, value] of meta) {\n format = format.replace(key, value)\n }\n\n return format\n } catch (e) {\n return date.toLocaleString()\n }\n}\n","import { default as Axios } from 'axios'\nimport { useLibraryMainStore } from '@/stores/useLibraryMainStore'\nimport { getStoreData } from '../assets/js/util'\nimport { getLibraryConfig } from '@/main'\n\n// 获取配置,优先使用全局配置,回退到环境变量\nfunction getApiConfig() {\n const config = getLibraryConfig()\n return {\n apiBase: config.apiBase || import.meta.env.VITE_BPM_API_BASE || '',\n appSecret: config.appSecret || import.meta.env.VITE_BPM_APP_SECRET || ''\n }\n}\n\n// 动态创建 axios 实例\nfunction createAxiosInstance() {\n const { apiBase } = getApiConfig()\n return Axios.create({\n baseURL: apiBase,\n timeout: 10000, // 10s\n headers: { 'Content-Type': 'application/json' },\n withCredentials: true\n })\n}\n\nexport const getToken = async () => {\n const { apiBase, appSecret } = getApiConfig()\n const axios = createAxiosInstance()\n const mainStore = useLibraryMainStore()\n \n return await getStoreData(mainStore, 'token', async () => {\n const res = await axios.get<{ token: string }>(`${apiBase}/GenerateToken`, {\n params: {\n appid: 'bpm',\n appsecret: appSecret,\n },\n })\n\n return res?.data?.token\n })\n}\n\nexport const getAxios = async () => {\n const token = await getToken()\n const axios = createAxiosInstance()\n axios.defaults.headers.common['Authorization'] = `Bearer ${token}`\n return axios\n}\n","export default {\n CurrentUserEmail: (store:any) => store.svrStore()?.userInfo?.email_address ?? 'test.email@dataGetter.ts',\n CurrentUserPositionCode: (store:any) => store.bpmStore()?.positionCode ?? 888,\n CurrentDatetime: () => new Date().toISOString(),\n ApproverEmail: (store:any) => store.svrStore()?.userInfo?.email_address ?? 'test.email@dataGetter.ts',\n ApproverPositionCode: (store:any) => store.bpmStore()?.positionCode ?? 999,\n RejectReason: () => 'Test Reject Reason',\n} as { [key: string]: Function }\n","import validate from './validate.js';\nconst byteToHex = [];\nfor (let i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).slice(1));\n}\nexport function unsafeStringify(arr, offset = 0) {\n return (byteToHex[arr[offset + 0]] +\n byteToHex[arr[offset + 1]] +\n byteToHex[arr[offset + 2]] +\n byteToHex[arr[offset + 3]] +\n '-' +\n byteToHex[arr[offset + 4]] +\n byteToHex[arr[offset + 5]] +\n '-' +\n byteToHex[arr[offset + 6]] +\n byteToHex[arr[offset + 7]] +\n '-' +\n byteToHex[arr[offset + 8]] +\n byteToHex[arr[offset + 9]] +\n '-' +\n byteToHex[arr[offset + 10]] +\n byteToHex[arr[offset + 11]] +\n byteToHex[arr[offset + 12]] +\n byteToHex[arr[offset + 13]] +\n byteToHex[arr[offset + 14]] +\n byteToHex[arr[offset + 15]]).toLowerCase();\n}\nfunction stringify(arr, offset = 0) {\n const uuid = unsafeStringify(arr, offset);\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n return uuid;\n}\nexport default stringify;\n","let getRandomValues;\nconst rnds8 = new Uint8Array(16);\nexport default function rng() {\n if (!getRandomValues) {\n if (typeof crypto === 'undefined' || !crypto.getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n getRandomValues = crypto.getRandomValues.bind(crypto);\n }\n return getRandomValues(rnds8);\n}\n","const randomUUID = typeof crypto !== 'undefined' && crypto.randomUUID && crypto.randomUUID.bind(crypto);\nexport default { randomUUID };\n","import native from './native.js';\nimport rng from './rng.js';\nimport { unsafeStringify } from './stringify.js';\nfunction v4(options, buf, offset) {\n if (native.randomUUID && !buf && !options) {\n return native.randomUUID();\n }\n options = options || {};\n const rnds = options.random ?? options.rng?.() ?? rng();\n if (rnds.length < 16) {\n throw new Error('Random bytes length must be >= 16');\n }\n rnds[6] = (rnds[6] & 0x0f) | 0x40;\n rnds[8] = (rnds[8] & 0x3f) | 0x80;\n if (buf) {\n offset = offset || 0;\n if (offset < 0 || offset + 16 > buf.length) {\n throw new RangeError(`UUID byte range ${offset}:${offset + 15} is out of buffer bounds`);\n }\n for (let i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n return buf;\n }\n return unsafeStringify(rnds);\n}\nexport default v4;\n","import type { RedirectType } from '@/types'\n\nenum ActionTypeEnum {\n Submit,\n Link\n}\n\ntype ActionProps = {\n // title: string,\n url: string\n redirectType: RedirectType\n}\n\n// type ActionType = 'submit' | 'link'\n\ntype ActionEmits = {\n (e: 'click', actionType: ActionTypeEnum, url: string, redirectType: RedirectType, title: string): void\n}\n\ntype ActionNoTypeEmits = {\n (e: 'click', url: string, redirectType: RedirectType): void\n}\n\nexport type {\n ActionProps,\n ActionEmits\n}\n\nexport { ActionTypeEnum, ActionNoTypeEmits }","import type { RedirectType } from '@/types'\nimport { getAxios } from './axios'\nimport { default as dataGetter } from './dataGetter'\nimport { v4 as uuidv4 } from 'uuid'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\n\nexport type SelectOption = {\n value: string | number\n label: string\n [key: string]: unknown\n}\n\nexport type WidgetConfig = {\n widget: string\n readonly: boolean\n title: string\n dataSourceProvider: string\n options?: SelectOption[]\n multiple?: boolean\n remote?: string\n uploadURL?: string\n [key: string]: unknown\n}\n\nexport type ValidationConfig = {\n ruleName: string\n ruleParameter: any\n errorMessage: string\n}\n\nexport type Trigger = {\n event: string\n handlerName: string\n}\n\nexport type FieldConfig = {\n widget?: WidgetConfig\n order?: number\n validations: ValidationConfig[]\n modelValue?: any\n column?: boolean\n triggers?: Trigger[]\n uiFilters?: any[]\n isFiltered: boolean\n dependent: string\n fieldValue?: any\n}\n\nexport type TabsConfig = {\n key: string\n title: string\n filters: Record<string, any>[]\n}\n\nexport type Action = {\n redirectUrl: string,\n location: 'InTable' | 'InOperation',\n attributeType: 'UIControl',\n readonly: boolean,\n widget: ActionTypeEnum,\n title: string,\n isSubmit: boolean,\n requestUrl?: string\n redirectType?: 'Create' | 'Details' | 'Update'\n}\n\nexport type PageConfig = {\n pageType: string\n fields: Record<string, FieldConfig>\n actions?: Action[]\n globalValidations: Array<{\n rule: string\n errorMessage: string\n param?: any\n appliesTo: string[]\n }>\n tabs?: TabsConfig[]\n}\n\ntype FieldData = {\n attributes: Object[]\n propertyValue?: any\n}\n\nexport enum PageActionType {\n Create = 0,\n Update = 1,\n Details = 2,\n List = 3,\n}\n\nfunction mapPageData(input: any, type: PageActionType, store: { svrStore: any, bpmStore: any }): PageConfig {\n const config: PageConfig = {\n pageType: '',\n fields: {},\n globalValidations: [],\n }\n\n // 处理ClassAttributes\n input.__ClassAttributes?.forEach((attr: any) => {\n if (attr.attributeType === 'UIPageType') {\n config.pageType = attr.Type\n } else if (attr.attributeType === 'UIValidationControl') {\n config.globalValidations.push({\n rule: attr.ruleName,\n errorMessage: attr.errorMessage,\n param: attr.ruleParameter,\n appliesTo: attr.propertyNames || ['*'],\n })\n } else if (attr.attributeType === 'UIControl') {\n if (attr.widget === 'Tab') {\n if (!config.tabs) {\n config.tabs = []\n }\n config.tabs.unshift({\n key: uuidv4(),\n title: attr.title,\n filters: attr.filters ? JSON.parse(attr.filters) : [],\n })\n return\n }\n if (!config.actions) {\n config.actions = []\n }\n config.actions.push({\n isSubmit: attr.isSubmit,\n requestUrl: attr.requestUrl,\n redirectUrl: attr.redirectUrl,\n redirectType: attr.redirectType,\n title: attr.title,\n widget: attr.widget === 'Link' ? ActionTypeEnum.Link : ActionTypeEnum.Submit,\n location: attr.location,\n attributeType: attr.attributeType,\n readonly: attr.readonly,\n })\n }\n })\n\n // 处理字段配置\n Object.entries(input).forEach(([fieldName, fieldData]) => {\n if (fieldName === '__ClassAttributes' || fieldName === 'className') return\n if (fieldName === 'id' || fieldName === 'deleteFlag' || fieldName === 'status' || fieldName === 'workFlowReason') {\n return\n }\n if(type !== PageActionType.List){\n if(fieldName === 'workflowId'){\n return\n }\n }\n const fieldConfig: FieldConfig = {\n validations: [],\n triggers: [],\n isFiltered: false,\n dependent: ''\n }\n\n const { attributes, propertyValue } = fieldData as FieldData\n // 处理字段值\n switch (propertyValue) {\n case null:\n fieldConfig.modelValue = ''\n break\n case undefined:\n fieldConfig.modelValue = ''\n break\n default:\n fieldConfig.modelValue = propertyValue\n break\n }\n if(fieldName === 'onBehalf' && type === PageActionType.Create){\n fieldConfig.modelValue = dataGetter.CurrentUserEmail(store)\n }\n\n // 处理控件属性\n attributes?.forEach((attr: any) => {\n if (attr.order || attr.Order) {\n fieldConfig.order = (attr.order ?? attr.Order) as number\n } else if (attr.attributeType === 'UIControl') {\n fieldConfig.widget = {\n ...attr,\n column: true,\n } as WidgetConfig\n } else if (attr.attributeType === 'UIValidationControl' && type !== PageActionType.List) {\n if (fieldConfig.widget?.widget !== 'CheckBox') {\n fieldConfig.validations.push(attr as ValidationConfig)\n }\n } else if (attr.attributeType === 'UIListed') {\n fieldConfig.widget = {\n ...attr,\n column: true,\n } as WidgetConfig\n } else if (attr.attributeType === 'UIFiltered') {\n fieldConfig.isFiltered = true\n } else if (attr.dependentType) {\n fieldConfig.dependent = dataGetter[attr.dependentType] ? dataGetter[attr.dependentType](store) : ''\n } else if (attr.eventType === 'Change') {\n fieldConfig.triggers?.push({\n event: 'change',\n handlerName: attr.eventName\n })\n }\n })\n\n config.fields[fieldName] = fieldConfig\n })\n\n return config\n}\n\nexport const getPageData = async (\n type: PageActionType,\n className: string,\n store: {\n svrStore: any,\n bpmStore: any\n },\n opt?: {\n workflowId: string\n },\n) => {\n const axios = await getAxios()\n const res = await axios.get(`/General/${className}/${type}/page`, { params: opt })\n return mapPageData(res?.data, type, store)\n}\n\nexport const getBtnList = async (\n type: PageActionType,\n className: string,\n opt: {\n workflowId: string\n email: string\n },\n): Promise<{\n button: string,\n isShow: boolean\n}[]> => {\n const axios = await getAxios()\n const res = await axios.post(`/General/${className}/${type}/button/List`, null, { params: opt })\n return res?.data\n}\n\nexport type ListDataRes = {\n __ClassAttributes: {\n redirectUrl: string,\n location: 'InTable' | 'InOperation',\n attributeType: 'UIControl',\n readonly: boolean,\n widget: 'Link',\n title: 'Approve' | 'Create' | 'Update',\n isSubmit: boolean\n redirectType: RedirectType,\n }[],\n data: object[],\n totalCount: number\n}\n\nexport type Paging = {\n current: number,\n total: number,\n pageSize: number,\n defaultPageSize: number,\n showTotal: boolean,\n showPageSize: boolean,\n filters: Record<string, any>[],\n}\n\nexport async function getListData(\n className: string,\n params: {\n filters: object[]\n sorts: object[]\n pageNumber: number\n pageSize: number\n }\n) {\n const axios = await getAxios()\n const res = await axios.post<ListDataRes>(`/General/${className}/list`, params)\n return {\n data: res.data.data,\n totalCount: res.data.totalCount,\n // actions: res.data.__ClassAttributes.filter(item=> item.attributeType === 'UIControl').map((attr) => {\n // return {\n // redirectUrl: attr.redirectUrl,\n // location: attr.location,\n // attributeType: attr.attributeType,\n // redirectType: attr.redirectType,\n // readonly: attr.readonly,\n // widget: attr.widget,\n // title: attr.title,\n // isSubmit: attr.isSubmit,\n // }\n // }\n // ),\n }\n}\n\nexport async function createData(className: string, data: object, url: string) {\n const axios = await getAxios()\n const res = await axios.post<number[]>(url, data, {\n params: {\n className,\n },\n })\n return res.data.length > 0 ? res.data[0] : 0\n}\n\nfunction replaceId(url: string, id: string): string {\n return url.replace(/{workflowId}/g, id)\n}\n\nexport async function updateData(className: string, id: string, data: object, url: string) {\n const axios = await getAxios()\n const replacedUrl = replaceId(url, id)\n const res = await axios.put(replacedUrl, data, {\n params: {\n className,\n },\n })\n return res?.data\n}\n\nfunction replaceWorkflowId(url: string, id: string): string {\n return url.replace(/{WorkflowId}/g, id)\n}\n\nfunction replaceEmail(url: string, email: string): string {\n return url.replace(/{ApproverEmail}/g, email)\n}\n\nfunction replaceReason(url: string, reason: string): string {\n return url.replace(/{WorkFlowReason}/g, reason)\n}\n\nfunction replaceStatus(url: string, status: string): string {\n return url.replace(/{Status}/g, status)\n}\n\nfunction replaceIsGlobal(url: string, ifGlobal: string): string {\n return url.replace(/{IfTriggerGlobal_RandP_Approval}/g, ifGlobal)\n}\n\nexport async function approveData(className: string, id: string, email: string, reason: string, data: object, url: string, status: string, ifGlobal: string) {\n const axios = await getAxios()\n let replacedUrl = replaceWorkflowId(url, id)\n replacedUrl = replaceEmail(replacedUrl, email)\n replacedUrl = replaceReason(replacedUrl, reason)\n replacedUrl = replaceStatus(replacedUrl, status)\n replacedUrl = replaceIsGlobal(replacedUrl, ifGlobal)\n const res = await axios.put(replacedUrl, data, {\n params: {\n className,\n reason\n },\n })\n return res?.data\n}\n\nexport async function getOptions(url: string, value?: string): Promise<SelectOption[]> {\n const axios = await getAxios()\n const res = await axios.get(url, { params: { value } })\n const list = res?.data as { [key: string]: string }\n return Object.entries(list).map(([key, item]) => ({\n value: key,\n label: item,\n }))\n}\n\nexport async function getProcess(className: string, workflowId: string): Promise<any[]> {\n const axios = await getAxios()\n const res = await axios.get(`/General/${className}/${workflowId}/process`)\n return res?.data\n}","import type { ValidationConfig } from './dataGen'\n\nexport const validateRules = (configs: ValidationConfig[], value: any) => {\n let errorMessages = ''\n const res = configs.every(config => {\n const isValid = vallidateRule(config, value)\n if (!isValid) {\n errorMessages = config.errorMessage\n }\n return isValid\n })\n return { res, errorMessages }\n}\n\nexport const vallidateRule = (config: ValidationConfig, value: any): boolean => {\n const { ruleName, ruleParameter } = config\n return validations[ruleName](ruleParameter, value as string)\n}\n\nconst validations = {\n Regex: (parameter: string, value: string): boolean => {\n const reg = new RegExp(parameter)\n return reg.test(value)\n },\n Required: (_: string, value: string): boolean => {\n return !!value\n }\n} as { [key: string]: Function }\n","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: string | null): void => {\n emits('input', v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <AInput\n v-model=\"model\"\n allow-clear\n :disabled=\"props.readonly || props.config.Readonly\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n ></AInput>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted } from 'vue'\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst max = ref<number>(100)\nconst min = ref<number>(0)\nonMounted(() => {\n if (props.validations) {\n props.validations.forEach((v) => {\n if (v.ruleName === 'Max') {\n max.value = v.ruleParameter\n }\n if (v.ruleName === 'Min') {\n min.value = v.ruleParameter\n }\n })\n }\n})\n\nconst validate = (v?: number) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: number): void => {\n emits('input', v)\n}\n\nconst changeHandler = (v?: number): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <AInputNumber\n v-model=\"model\"\n clearable\n :disabled=\"props.readonly\"\n :min=\"min\"\n :max=\"max\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n ></AInputNumber>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted, computed } from 'vue'\nimport { getOptions } from '@/services/dataGen'\nimport type { WidgetConfig, SelectOption, Trigger } from '@/services/dataGen'\nimport { validateRules } from '@/services/validation'\nimport type { FormCompProps } from './index'\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<{\n (e: 'update:modelValue', value?: string | number | null): void\n (e: 'change', value?: string | number | null): void\n // 添加动态事件类型\n (e: string, ...value: any[]): void\n}>()\n\nconst loading = ref<boolean>(false)\nconst _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\n// 动态事件绑定对象\nconst eventHandlers = computed(() => {\n const handlers: Record<string, (v?: string) => void> = {}\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n handlers[trigger.event] = (v?: string) => {\n \n // 使用类型断言来绕过严格的事件类型检查\n emits(trigger.event, trigger.handlerName, v)\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n // emits('update:modelValue', v)\n }\n })\n }\n\n // handlers['change'] = (v?: string | number | null) => {\n // emits('update:modelValue', v)\n // emits('change', v)\n // }\n\n return handlers\n})\n\nconst loadOptions = async () => {\n if (props.config.dataSourceProvider) {\n _options.value = await getOptions(props.config.dataSourceProvider)\n }\n}\nonMounted(loadOptions)\n\nconst changeHandler = (v?: string) => {\n emits('update:modelValue', v)\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ASelect allow-clear v-model=\"model\" :loading=\"loading\" :filter-option=\"true\" :allow-search=\"true\" @change=\"changeHandler\">\n <template v-for=\"item in _options\" :key=\"item.value\">\n <AOption :value=\"item.value\" :label=\"item.label\"></AOption>\n </template>\n </ASelect>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, onMounted } from 'vue'\nimport type { WidgetConfig, SelectOption } from '@/services/dataGen'\nimport { getAxios } from '@/services/axios'\n\nconst props = defineProps<{\n modelValue: string\n config: WidgetConfig\n}>()\nconst emits = defineEmits<{\n (e: 'update:modelValue', value?: string | number | null): void\n (e: 'change', value?: string | number | null): void\n}>()\n\nconst _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst changeHandler = (v?: string | number | null) => {\n emits('update:modelValue', v)\n emits('change', v)\n}\n\nonMounted(async () => {\n if (props.config) {\n const url = props.config.dataSourceProvider\n if (url) {\n const axios = await getAxios()\n const res = await axios.get(url)\n _options.value = res.data as SelectOption[]\n }\n }\n})\n\nconst fieldNames = { value: 'key', label: 'value' }\n\ndefineExpose({\n validate(){\n return true\n }\n})\n</script>\n\n<template>\n <ASpace direction=\"vertical\" size=\"large\">\n <ACascader\n :field-names=\"fieldNames\"\n :model-value=\"modelValue\"\n :options=\"_options\"\n :style=\"{ width: '320px' }\"\n placeholder=\"Please select ...\"\n @change=\"changeHandler\"\n />\n </ASpace>\n</template>\n","<script lang=\"ts\" setup>\nimport { ref, computed,nextTick, onMounted } from 'vue'\nimport type {UploadInstance, FileItem} from '@arco-design/web-vue'\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\nimport { getLibraryConfig } from '@/main'\nimport { getToken } from '@/services/axios'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<{\n className: string\n} & FormCompProps>()\nconst emits = defineEmits<MyEmits>()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\nconst config = getLibraryConfig()\nconst ApiBase = config.apiBase\nconst uploadRef = ref<UploadInstance | null>(null)\n\nconst id = ref<number>(0)\n\nconst fileList = ref<FileItem[]>([])\n\nconst headers = ref<{[key: string]: string}>({})\nonMounted(async ()=>{\n const token = await getToken()\n headers.value = {\n Authorization: `Bearer ${token}`\n }\n})\n\nfunction replaceIdAndClassName(url: string, workflowId: string, className: string): string {\n return url.replace(/{WorkflowId}/g, workflowId).replace(/{ClassName}/g, className)\n}\n\nconst action = computed<string>(() => {\n if(props.config.uploadURL){\n const url = ApiBase + props.config.uploadURL\n return replaceIdAndClassName(url, id.value.toString(), props.className)\n }\n return ''\n})\n\n//const _options = ref<SelectOption[]>(props.config.options ?? [])\n\nconst changeHandler = (v?: string | number | null) => {\n emits('change', v)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n submit(workflowId: number){\n if (uploadRef.value) {\n if(props.config.uploadURL){\n id.value = workflowId\n }\n nextTick(() => {\n uploadRef.value.submit()\n })\n }\n },\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <a-upload\n ref=\"uploadRef\"\n v-model=\"fileList\"\n :auto-upload=\"false\"\n :action=\"action\"\n :limit=\"props.config.allowedNumber\"\n :headers=\"headers\"\n @change=\"changeHandler\"\n >\n <template #start-icon></template>\n </a-upload>\n</template>","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst inputHandler = (v?: string | null): void => {\n emits('update:modelValue', v)\n emits('input', v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n emits('update:modelValue', v)\n const valid = validate(v)\n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ATextarea\n :model-value=\"props.modelValue\"\n placeholder=\"Please enter something\"\n allow-clear\n :disabled=\"props.readonly\"\n @input=\"inputHandler\"\n @change=\"changeHandler\"\n />\n</template>","<script lang=\"ts\" setup>\nimport { onMounted } from 'vue';\nimport type { FormCompProps, FormCompEmits } from './index'\nimport { validateRules } from '@/services/validation'\n\ntype MyEmits = FormCompEmits & {\n (e: 'input', value: any): void\n}\n\nconst props = defineProps<FormCompProps>()\nconst emits = defineEmits<MyEmits>()\nconst model = defineModel()\n\nconst validate = (v?: string | null) => {\n return validateRules(props.validations!, v)\n}\n\nconst changeHandler = (v?: string | null): void => {\n const valid = validate(v) \n emits('error', valid.res ? '' : valid.errorMessages)\n if (props.triggers && props.triggers.length > 0) {\n props.triggers.forEach(trigger => {\n if(trigger.event === 'change'){\n emits(trigger.event, trigger.handlerName, v)\n }\n })\n }\n}\n\ndefineExpose({\n validate(){\n const valid = validate(props.modelValue) \n emits('error', valid.res ? '' : valid.errorMessages)\n return valid.res\n }\n})\n</script>\n\n<template>\n <ACheckbox\n v-model=\"model\"\n clearable\n :disabled=\"props.readonly || props.config.Readonly\"\n @change=\"changeHandler\"\n >Yes</ACheckbox>\n</template>\n","<script lang=\"ts\" setup>\nimport type { FormCompProps, FormCompEmits } from './index'\nimport type { FieldConfig } from '@/services/dataGen'\nimport { ref, watch, computed, useTemplateRef } from 'vue'\nimport InputText from './InputText.vue'\nimport InputNumber from './InputNumber.vue'\nimport SelectList from './SelectList.vue'\nimport Cascader from './Cascader.vue'\nimport FileUpload from './FileUpload.vue'\nimport TextArea from './TextArea.vue'\nimport CheckBox from './CheckBox.vue'\n\ntype FieldCompProps = {\n config: FieldConfig\n className: string\n} & FormCompProps\n\nconst props = defineProps<FieldCompProps>()\nconst emits = defineEmits<FormCompEmits>()\nconst model = defineModel()\n\nconst widgetRef = useTemplateRef('widgetRef')\n\n// const _value = ref<string | number>(props.modelValue || props.config?.value)\n// watch(_value, (newValue) => {\n// emits('update:modelValue', newValue)\n// })\n\nconst curComp = computed(() => {\n switch (props.config?.widget?.widget) {\n case 'TextBox':\n return InputText\n case 'Number':\n return InputNumber\n case 'SelectList':\n return SelectList\n case 'Cascade':\n return Cascader\n case 'File':\n return FileUpload\n case 'TextArea':\n return TextArea\n case 'DropDown':\n return SelectList\n case 'CheckBox':\n return CheckBox\n default:\n return InputText\n }\n})\n\nconst errMsg = ref<string>('')\nconst errHandler = (v: string) => {\n errMsg.value = v\n}\n\nconst changeHandler = (handlerName: string, v: any): void => {\n emits('change', handlerName, v)\n}\n// const updateHandler = (v: any): void => emits('update:modelValue', v)\n\nfunction isFileUpload() {\n return props.config?.widget?.widget === 'File'\n}\n\ndefineExpose({\n isFileUpload(){\n return props.config?.widget?.widget === 'File'\n },\n submit(workflowId: number) {\n if (isFileUpload()) {\n (widgetRef.value as InstanceType<typeof FileUpload>).submit(workflowId)\n }\n },\n validate(){\n return (widgetRef.value as InstanceType<typeof TextArea>)?.validate() \n },\n getCompName(){\n return props?.config?.widget?.title\n }\n})\n</script>\n\n<template>\n <div class=\"widget-wrapper\">\n <div class=\"title mb-1.5\">{{ props?.config?.widget?.title }}<span class=\"required\" v-if=\"props.config.validations.length\">*</span></div>\n <div class=\"form-widget\">\n <div class=\"widget\">\n <component\n ref=\"widgetRef\"\n :is=\"curComp\"\n v-model=\"model\"\n :config=\"props.config.widget\"\n :validations=\"props.config.validations\"\n :triggers=\"props.config.triggers\"\n :class-name=\"props.className\"\n @error=\"errHandler\"\n @change=\"changeHandler\"\n ></component>\n </div>\n <div v-if=\"errMsg.length > 0\" class=\"err-msg\">{{ errMsg }}</div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.err-msg {\n font-size $size-text-light\n color $color-red\n margin-top $gap-4\n}\n\n.required {\n color: $color-red\n font-size: $size-text-heavy\n}\n</style>\n","<script setup lang=\"ts\">\nimport type { ActionProps, ActionNoTypeEmits } from '@/components/data-gen/actions/types'\n\nconst props = defineProps<ActionProps>()\n\nconst emits = defineEmits<ActionNoTypeEmits>()\n\nfunction clickHandler() {\n emits('click', props.url, props.redirectType)\n}\n</script>\n\n<template>\n <AButton type=\"primary\" @click=\"clickHandler\">\n <slot></slot>\n </AButton>\n</template>","<script setup lang=\"ts\">\nimport type { ActionProps, ActionNoTypeEmits } from '@/components/data-gen/actions/types'\n\nconst props = defineProps<ActionProps>()\n\nconst emits = defineEmits<ActionNoTypeEmits>()\n\nfunction clickHandler() {\n emits('click', props.url, props.redirectType)\n}\n</script>\n\n<template>\n<ALink @click=\"clickHandler\">\n <slot></slot>\n</ALink>\n</template>","<script setup lang=\"ts\">\nimport type { Action } from '@/services/dataGen'\nimport type { ActionEmits } from '@/components/data-gen/actions/types'\nimport { computed } from 'vue'\nimport SubmitButton from '@/components/data-gen/actions/SubmitButton.vue'\nimport DetailLink from '@/components/data-gen/actions/DetailLink.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport type { RedirectType } from '@/types'\n\nconst props = defineProps<{\n config: Action\n}>()\n\nconst emits = defineEmits<ActionEmits>()\n\nfunction clickHandler(url: string, redirectType: RedirectType) {\n emits('click', props.config.widget, url, redirectType, props.config.title)\n}\n\nconst curComp = computed(() => {\n switch (props.config.location) {\n case 'InOperation':\n return SubmitButton\n case 'InTable':\n default:\n return DetailLink\n }\n})\n\nconst curUrl = computed(() => {\n if (props.config.widget === ActionTypeEnum.Submit) {\n return props.config.requestUrl ?? ''\n } else if (props.config.widget === ActionTypeEnum.Link) {\n return props.config.redirectUrl ?? ''\n }\n return ''\n})\n\nconst redirectType = computed(() => {\n return props.config.redirectType ?? 'Details'\n})\n</script>\n\n<template>\n <component\n :is=\"curComp\"\n :url=\"curUrl\"\n :redirect-type=\"redirectType\"\n @click=\"clickHandler\"\n >\n {{ props.config.title }}\n </component>\n</template>\n\n<style lang=\"stylus\" scoped></style>\n","import { inject, type InjectionKey } from 'vue'\nimport { useRouter as useVueRouter } from 'vue-router'\nimport type { Router } from 'vue-router'\n\nexport const RouterKey: InjectionKey<Router> = Symbol('library-router')\n\nexport function useLibraryRouter(): Router {\n // 首先尝试从注入中获取宿主提供的 router\n const injectedRouter = inject(RouterKey, null)\n if (injectedRouter) {\n return injectedRouter\n }\n \n // 如果没有注入,回退到标准的 useRouter\n return useVueRouter()\n}\n","import { inject, type InjectionKey } from 'vue'\nimport { type Trigger } from '@/services/dataGen'\n\nexport const TriggersKey: InjectionKey<Record<string, (...args: any[]) => any>> = Symbol('library-triggers')\n\nexport function useTriggers(): Record<string, (...args: any[]) => any> {\n // 首先尝试从注入中获取宿主提供的 triggers\n const injectedTriggers = inject(TriggersKey, null)\n if (injectedTriggers) {\n return injectedTriggers\n }\n\n // 如果没有注入,返回一个空对象\n return {}\n}","import { inject, type InjectionKey } from 'vue'\nimport type { Pinia } from 'pinia'\n\nexport const PiniaKey: InjectionKey<Pinia> = Symbol('library-pinia')\n\nexport const BpmStoreKey: InjectionKey<Pinia> = Symbol('library-bpmStore')\n\nexport const SvrStoreKey: InjectionKey<Pinia> = Symbol('library-svrStore')\n\nexport function useLibraryPinia(): Pinia | null {\n // 从注入中获取宿主提供的 pinia\n return inject(PiniaKey, null)\n}\n\nexport function useBpmStore(): any {\n // 从注入中获取宿主提供的 bpmStore\n return inject(BpmStoreKey, null)\n}\n\nexport function useSvrStore(): any {\n // 从注入中获取宿主提供的 svrStore\n return inject(SvrStoreKey, null)\n}","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, useTemplateRef, getCurrentInstance, type VNodeRef } from 'vue'\nimport { getPageData, PageActionType, createData, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst bpmStore = useBpmStore()\n// console.log(\"🚀 ~ bpmStore:\", bpmStore().positionCode)\n\nconst svrStore = useSvrStore()\n// console.log(\"🚀 ~ svrStore:\", svrStore().userInfo)\n\nconst router = useLibraryRouter()\n\nconst triggers = useTriggers()\n\nconst dataWidgetsRefs = useTemplateRef('dataWidgets')\n\n// 在 setup 中获取实例\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\nconst _dependent = ref<Record<string, any>>({})\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\n\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n .filter((w) => !hiddenFields.value.includes(w.fieldKey))\n // .sort((a: WidgetConfig, b: WidgetConfig) => (a.order ?? 0) - (b.order ?? 0))\n\n return list\n}\n\nfunction genDependentField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list = Object.entries(fields).filter(([_, value]) => value.dependent).reduce((acc, [key, value]) => {\n acc[key] = value.dependent\n return acc\n }, {} as Record<string, any>)\n return list\n}\n\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst _data = reactive<Record<string, any>>({})\nconst loading = ref(false)\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Create, props.className, {\n svrStore,\n bpmStore\n })\n _fields.value = genField(pageData.value.fields)\n _dependent.value = genDependentField(pageData.value.fields)\n for (const key in pageData.value.fields) {\n _data[key] = pageData.value.fields[key].modelValue\n }\n loading.value = false\n})\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType) {\n switch (type) {\n case ActionTypeEnum.Submit:\n // 遍历所有的widget组件\n let validateResult = true\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.validate) {\n if(!widget.validate()){\n validateResult = false\n }\n }\n })\n if(!validateResult){\n instance?.appContext.config.globalProperties.$message.error('表单验证未通过,请检查输入项')\n return\n }\n const res = await createData(props.className, {..._data, ..._dependent.value}, url)\n // 遍历所有的widget组件\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.submit) {\n widget.submit(res)\n }\n })\n instance?.appContext.config.globalProperties.$notification.success('创建成功!')\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n if(redirectType === 'List') {\n router.push({name: 'List', params: {className: props.className}})\n }\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nconst newHiddenFields: string[] = ['jobScpope', \n 'currentWorkdayId', \n 'originalGrade', \n 'jobTitlePrevious', \n 'positionId']\n\nconst hiddenFields = ref<string[]>(newHiddenFields)\n\nfunction changeHandler(handlerName: string, v: string){\n triggers[handlerName]?.(v, hiddenFields)\n if(pageData.value){\n _fields.value = genField(pageData.value.fields)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">创建 {{ className }}</h1>\n <p class=\"page-subtitle\">请填写以下信息创建新的 {{ className }} 记录</p>\n </slot>\n </div>\n\n <!-- 表单内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"form-container\">\n <div class=\"form-card\">\n <div class=\"form-fields\">\n <template v-for=\"(value, key) in _fields\" :key=\"value.fieldKey\">\n <div class=\"form-field-wrapper\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"key\" \n :config=\"value\"\n :class-name=\"className\"\n v-model=\"_data[value.fieldKey]\"\n class=\"form-field\"\n @change=\"changeHandler\"\n />\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"form-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.form-container {\n width: 100%\n margin: 0 auto\n}\n\n.form-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n}\n\n.form-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.form-field-wrapper {\n .form-field {\n width: 100%\n }\n}\n\n.form-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .form-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .form-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, useTemplateRef, getCurrentInstance } from 'vue'\nimport { getPageData, updateData, PageActionType, getBtnList, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst router = useLibraryRouter()\n\nconst triggers = useTriggers()\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\n\nconst dataWidgetsRefs = useTemplateRef('dataWidgets')\n\n// 在 setup 中获取实例\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string,\n workflowId: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\nconst _dependent = ref<Record<string, any>>({})\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\n\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n .filter((w) => !hiddenFields.value.includes(w.fieldKey))\n // .sort((a: WidgetConfig, b: WidgetConfig) => (a.order ?? 0) - (b.order ?? 0))\n\n return list\n}\n\nfunction genDependentField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list = Object.entries(fields).filter(([_, value]) => value.dependent).reduce((acc, [key, value]) => {\n acc[key] = value.dependent\n return acc\n }, {} as Record<string, any>)\n return list\n}\n\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst _data = reactive<Record<string, any>>({})\nconst loading = ref(false)\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Update, props.className, {\n svrStore,\n bpmStore\n }, {\n workflowId: props.workflowId,\n })\n const btnList = await getBtnList(PageActionType.Update, props.className, {workflowId: props.workflowId, email: getApproverEmail()})\n pageData.value.actions = pageData.value.actions?.filter(item=>{\n const btn = btnList.find(btn => btn.button === item.title)\n if(!btn){\n return true\n }\n return btn.isShow\n })\n _fields.value = genField(pageData.value.fields)\n _dependent.value = genDependentField(pageData.value.fields)\n for (const key in pageData.value.fields) {\n _data[key] = pageData.value.fields[key].modelValue\n }\n loading.value = false\n})\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType) {\n switch (type) {\n case ActionTypeEnum.Submit:\n // 遍历所有的widget组件\n let validateResult = true\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.validate) {\n if(!widget.validate()){\n validateResult = false\n }\n }\n })\n if(!validateResult){\n instance?.appContext.config.globalProperties.$message.error('表单验证未通过,请检查输入项')\n return\n }\n const res = await updateData(props.className, props.workflowId, {..._data, ..._dependent.value}, url)\n // 遍历所有的widget组件\n dataWidgetsRefs.value?.forEach((widget) => {\n if (widget?.submit) {\n widget.submit(res)\n }\n })\n instance?.appContext.config.globalProperties.$notification.success('修改成功!')\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n router.push({name: redirectType, params: {className: props.className}})\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nconst newHiddenFields: string[] = ['jobScpope', \n 'currentWorkdayId', \n 'originalGrade', \n 'jobTitlePrevious', \n 'positionId']\n\nconst hiddenFields = ref<string[]>(newHiddenFields)\n\nfunction changeHandler(handlerName: string, v: string){\n triggers[handlerName]?.(v, hiddenFields)\n if(pageData.value){\n _fields.value = genField(pageData.value.fields)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">编辑 {{ className }}</h1>\n <p class=\"page-subtitle\">修改以下信息来更新 {{ className }} 记录 (ID: {{ workflowId }})</p>\n </slot>\n </div>\n\n <!-- 表单内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"form-container\">\n <div class=\"form-card\">\n <div class=\"form-fields\">\n <template v-for=\"(value, key) in _fields\" :key=\"value.fieldKey\">\n <div class=\"form-field-wrapper\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"key\" \n :config=\"value\" \n v-model=\"_data[value.fieldKey]\"\n class=\"form-field\"\n @change=\"changeHandler\"\n />\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"form-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.form-container {\n width: 100%\n margin: 0 auto\n}\n\n.form-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n}\n\n.form-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.form-field-wrapper {\n .form-field {\n width: 100%\n }\n}\n\n.form-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .form-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .form-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>","import { inject, type InjectionKey } from 'vue'\n\nexport const CustomCompsKey: InjectionKey<any> = Symbol('library-custom-comp')\n\nexport function useLibraryCustomComps(): any {\n return inject(CustomCompsKey, null)\n}\n","<script lang=\"ts\" setup>\nimport { computed, onMounted, reactive, ref, getCurrentInstance} from 'vue'\nimport { getPageData, getBtnList, approveData, PageActionType, getProcess, type PageConfig, type FieldConfig } from '@/services/dataGen'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport type { DescData } from '@arco-design/web-vue'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport dataGetter from '@/services/dataGetter'\nimport type { RedirectType } from '@/types'\nimport { useTriggers } from '@/composables/useTriggers'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\nimport {useLibraryCustomComps} from \"@/composables/customComps\"\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\n\nconst triggers = useTriggers()\n\nconst router = useLibraryRouter()\n\nconst customComps = useLibraryCustomComps()\n\nconst instance = getCurrentInstance()\n\nconst props = defineProps<{\n className: string,\n workflowId: string\n}>()\n\nconst pageData = ref<PageConfig>()\nconst _fields = ref<WidgetConfig[]>([])\n\ntype WidgetConfig = {\n fieldKey: string\n} & FieldConfig\nfunction genField(fields: Record<string, FieldConfig>) {\n if (!fields) return []\n const list: WidgetConfig[] = Object.entries(fields)\n .map(([key, value]) => {\n if(typeof value.modelValue === 'boolean'){\n value.fieldValue = value.modelValue ? 'Yes' : 'No'\n }else{\n value.fieldValue = value.modelValue\n }\n return {\n fieldKey: key,\n ...value,\n } as WidgetConfig\n })\n .filter((w) => w.widget && w.widget.widget !== 'Hidden')\n\n return list\n}\nconst reversedActions = computed(() => {\n if (!pageData.value?.actions) return []\n return [...pageData.value.actions].reverse()\n})\n\nconst loading = ref(true)\n\nconst formatDate = (date:string, format = 'yyyy-MM-dd hh:mm:ss.fff') => {\n const d = new Date(date)\n\n if (isNaN(d.getTime())) {\n return date\n }\n\n const data:any = {\n 'yyyy': d.getFullYear(),\n 'yy': d.getFullYear().toString().substring(2),\n 'MM': (d.getMonth() + 1).toString().padStart(2, '0'),\n 'M': (d.getMonth() + 1),\n 'dd': d.getDate().toString().padStart(2, '0'),\n 'd': d.getDate(),\n 'hh': d.getHours().toString().padStart(2, '0'),\n 'h': d.getHours(),\n 'mm': d.getMinutes().toString().padStart(2, '0'),\n 'm': d.getMinutes(),\n 'ss': d.getSeconds().toString().padStart(2, '0'),\n 's': d.getSeconds(),\n 'fff': d.getMilliseconds().toString().padStart(3, '0'),\n 'f': d.getMilliseconds(),\n }\n\n let res = format\n for (const key of Object.keys(data)) {\n res = res.replace(key, data[key])\n }\n\n return res\n}\n\nconst mapWorkflowSteps = (process:any[], status:any) => {\n const currentIndex = process.findIndex(item => item.isCurrent)\n return process.map((p, index) => {\n const step = {\n id: p.id,\n title: '',\n proxy: '',\n sub: '',\n desc: '',\n status: 1,\n time: ''\n }\n step.title = p.workflowProcessApprovers[0]?.name\n const nodeApprover = p.workflowProcessApprovers[p.workflowProcessApprovers.length - 1]\n const history = p.workflowHistorys[p.workflowHistorys.length - 1]\n const actualApprover = history?.workflowHistoryApprovers[history?.workflowHistoryApprovers?.length - 1]\n if (nodeApprover && actualApprover && nodeApprover?.email?.toLowerCase() !== actualApprover?.approverEmail?.toLowerCase()) {\n step.title = `${actualApprover.name}`\n step.proxy = `代理: ${nodeApprover.name}`\n }\n if (p.sort > 1) {\n step.sub = '审批角色:' + p.nodeName.replace('Submit', '').replace('Approve', '')\n } else {\n step.sub = '提交申请'\n }\n if (p.isCurrent && status !== -1) {\n // canRecall.value = index === 0\n step.desc = '审批中'\n step.status = 1\n } else {\n const history = p.workflowHistorys[p.workflowHistorys.length - 1]\n if (history && history.status === 100) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n step.status = 2\n step.desc = '已审批'\n } else if (history && history.status === 999) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n step.status = 0\n step.desc = '已跳过'\n } else if (history) {\n step.time = formatDate(history.takeActionAt, 'yyyy-MM-dd hh:mm:ss')\n if (p.sort === 1) {\n step.status = 2\n step.desc = ''\n } else {\n const historyApprover = history.workflowHistoryApprovers[0]\n step.status = 3\n step.desc = historyApprover?.reason ? `拒绝原因:${historyApprover.reason}` : '已拒绝'\n }\n } else if (index < currentIndex || currentIndex === -1) {\n step.status = 0\n step.desc = '已跳过'\n } else {\n step.status = 0\n step.desc = '待审批'\n }\n if (history && history.status !== 1) {\n } else {\n }\n }\n\n return step\n })\n}\n\n\nconst steps = ref<any[]>([])\nconst isGlobal = ref(false)\nonMounted(async () => {\n loading.value = true\n pageData.value = await getPageData(PageActionType.Details, props.className, {\n svrStore,\n bpmStore\n }, {\n workflowId: props.workflowId,\n })\n const btnList = await getBtnList(PageActionType.Details, props.className, {workflowId: props.workflowId, email: getApproverEmail()})\n pageData.value.actions = pageData.value.actions?.filter(item=>{\n const btn = btnList.find(btn => btn.button === item.title)\n if(!btn){\n return true\n }\n return btn.isShow\n })\n isGlobal.value = btnList.find(item => item.button === 'IsGlobal')?.isShow ?? false\n _fields.value = genField(pageData.value.fields)\n const process = await getProcess(props.className, props.workflowId)\n steps.value = mapWorkflowSteps(process, 0)\n\n loading.value = false\n})\n\nasync function triggerFn(title: string, opt: any): Promise<any> {\n return triggers[title]?.(opt)\n}\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nasync function clickHandler(type: ActionTypeEnum, url: string, redirectType: RedirectType, title: string) {\n try {\n switch (type) {\n case ActionTypeEnum.Submit:\n const {reason,ifGlobal} = await triggerFn(title, {isGlobal: isGlobal.value})\n const status = title === 'Approve' ? '100' : '-1'\n await approveData(props.className, props.workflowId, getApproverEmail(), reason, [props.workflowId], url, status, ifGlobal)\n const successContent = title === 'Approve' ? '审批已通过!' : '审批已拒绝!'\n instance?.appContext.config.globalProperties.$notification.success(successContent)\n router.push({name: 'List', params: {className: props.className}})\n break\n case ActionTypeEnum.Link:\n if(redirectType === 'List'){\n router.push({name: 'List', params: {className: props.className}})\n }\n break\n default:\n console.warn('Unknown action type:', type)\n }\n } catch (error) {\n // console.error('Action failed:', error)\n }\n}\n</script>\n\n<template>\n <div class=\"page-container\">\n <!-- 页面头部 -->\n <div class=\"page-header\">\n <slot name=\"title\">\n <h1 class=\"page-title\">{{ className }} 详情</h1>\n <p class=\"page-subtitle\">查看 {{ className }} 记录详细信息 (ID: {{ workflowId }})</p>\n </slot>\n </div>\n\n <!-- 详情内容区域 -->\n <div class=\"page-body\">\n <a-spin :loading=\"loading\" class=\"detail-container\">\n <div class=\"detail-card\">\n <component :is=\"customComps.Steps\" :steps=\"steps\"/>\n <div class=\"detail-fields\">\n <template v-for=\"(item) in _fields\" :key=\"item.fieldKey\">\n <div class=\"detail-field-wrapper\">\n <!-- <template v-if=\"['ifTriggerGlobal_RandP_Approval'].includes(item.fieldKey)\">\n <div class=\"detail-field\">\n <DataWidgets \n ref=\"dataWidgets\"\n :name=\"item.fieldKey\" \n :config=\"item\"\n :class-name=\"className\"\n v-model=\"item.modelValue\"\n class=\"form-field\"\n />\n </div>\n </template> -->\n <div class=\"detail-field\">\n <div class=\"field-label\">{{ item.widget?.title }}</div>\n <div class=\"field-value\">{{ item.fieldValue }}</div>\n </div>\n </div>\n </template>\n </div>\n \n <!-- 自定义内容插槽 -->\n <div v-if=\"$slots.content\" class=\"detail-content\">\n <slot name=\"content\"></slot>\n </div>\n </div>\n </a-spin>\n </div>\n\n <!-- 操作按钮区域 -->\n <div class=\"page-footer\">\n <div class=\"action-container\">\n <slot name=\"action\"></slot>\n <div class=\"action-buttons\">\n <template v-for=\"action in reversedActions\" :key=\"action.Title\">\n <ActionButton \n :config=\"action\" \n class=\"action-button\" \n @click=\"clickHandler\"\n />\n </template>\n </div>\n </div>\n </div>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.page-container {\n min-height: 100vh\n background-color: #f5f5f5\n display: flex\n flex-direction: column\n}\n\n.page-header {\n background: white\n border-bottom: 1px solid #e8e8e8\n padding: 24px 32px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n \n .page-title {\n font-size: 24px\n font-weight: 600\n color: #262626\n margin: 0 0 8px 0\n line-height: 1.3\n }\n \n .page-subtitle {\n font-size: 14px\n color: #8c8c8c\n margin: 0\n line-height: 1.5\n }\n}\n\n.page-body {\n flex: 1\n padding: 24px 32px\n overflow-y: auto\n}\n\n.detail-container {\n width: 100%\n margin: 0 auto\n}\n\n.detail-card {\n background: white\n border-radius: 8px\n box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06)\n overflow: hidden\n padding-top: 20px\n}\n\n.detail-fields {\n padding: 32px\n display: grid\n grid-template-columns: repeat(auto-fit, minmax(320px, 1fr))\n gap: 24px\n \n @media (max-width: 768px) {\n grid-template-columns: 1fr\n padding: 24px 16px\n gap: 20px\n }\n}\n\n.detail-field-wrapper {\n .detail-field {\n width: 100%\n \n .field-label {\n font-weight: 500\n color: #262626\n margin-bottom: 8px\n font-size: 14px\n line-height: 1.4\n }\n \n .field-value {\n color: #595959\n padding: 8px 12px\n background-color: #fafafa\n border-radius: 4px\n min-height: 40px\n display: flex\n align-items: center\n font-size: 14px\n line-height: 1.5\n border: 1px solid #f0f0f0\n word-break: break-word\n }\n }\n}\n\n.detail-content {\n border-top: 1px solid #f0f0f0\n padding: 24px 32px\n background: #fafafa\n}\n\n.page-footer {\n background: white\n border-top: 1px solid #e8e8e8\n padding: 16px 32px\n box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.06)\n \n @media (max-width: 768px) {\n padding: 16px 16px\n }\n}\n\n.action-container {\n max-width: 1200px\n margin: 0 auto\n display: flex\n justify-content: flex-end\n align-items: center\n gap: 12px\n}\n\n.action-buttons {\n display: flex\n gap: 12px\n align-items: center\n}\n\n.action-button {\n min-width: 88px\n height: 36px\n \n &:hover {\n transform: translateY(-1px)\n transition: transform 0.2s ease\n }\n}\n\n/* 响应式调整 */\n@media (max-width: 1024px) {\n .detail-fields {\n grid-template-columns: repeat(auto-fit, minmax(280px, 1fr))\n }\n}\n\n@media (max-width: 640px) {\n .page-header {\n padding: 20px 16px\n \n .page-title {\n font-size: 20px\n }\n }\n \n .page-body {\n padding: 16px\n }\n \n .detail-fields {\n padding: 20px 16px\n }\n \n .action-container {\n flex-direction: column-reverse\n align-items: stretch\n }\n \n .action-buttons {\n justify-content: center\n }\n}\n</style>\n","<script lang=\"ts\" setup>\nimport { computed, onActivated, onMounted, reactive, ref } from 'vue'\nimport { getPageData, getListData, type PageConfig, type FieldConfig, type Action, type Paging } from '@/services/dataGen'\nimport { FileItem, type TableColumnData } from '@arco-design/web-vue'\nimport ActionButton from '@/components/data-gen/actions/index.vue'\nimport { ActionTypeEnum } from '@/components/data-gen/actions/types'\nimport { useLibraryRouter } from '@/composables/useRouter'\nimport type { RedirectType } from '@/types'\nimport DataWidgets from '@/components/data-gen/widgets/index.vue'\nimport { useSvrStore, useBpmStore } from \"@/composables/usePinia\"\n\nconst svrStore = useSvrStore()\nconst bpmStore = useBpmStore()\ndefineOptions({\n name: 'ListView'\n})\nconst router = useLibraryRouter()\n\nconst props = defineProps<{\n className: string\n}>()\n\nconst pageData = ref<PageConfig>()\n\nconst paging = reactive<Paging>({\n current: 1,\n total: 0,\n pageSize: 10,\n defaultPageSize: 10,\n showTotal: true,\n showPageSize: true,\n filters: [],\n})\n\nfunction createListParams() {\n // 将搜索表单转换为过滤条件\n const searchFilters = Object.entries(searchForm.value)\n .filter(([, value]) => value && value !== '')\n .map(([key, value]) => ({\n key,\n value,\n // operator: 'like' // 根据实际需要调整操作符\n }))\n\n return {\n pageNumber: paging.current,\n pageSize: paging.pageSize,\n filters: [...paging.filters, ...searchFilters],\n sorts: [{\n \"key\": \"status\",\n \"type\": 0\n }],\n }\n}\n\n// 优化滚动配置 - 移除固定高度\nconst scroll = computed(() => {\n const columnCount = _columns.value.length\n const estimatedWidth = columnCount * 150 + 250 // 包含Actions列宽度\n return {\n x: estimatedWidth, // 只设置横向滚动\n // 移除 y 属性,让表格高度自适应\n }\n})\n\n// 优化列配置\nconst mapColumns = (fields: Record<string, FieldConfig>) => {\n const col = Object.entries(fields)\n .filter(([, item]) => item.widget?.column)\n .map(([key, value], index) => {\n return {\n title: value.widget!.title,\n dataIndex: key.charAt(0).toLowerCase() + key.slice(1),\n order: value.order,\n ellipsis: true,\n tooltip: true,\n width: 150,\n minWidth: 100, // 启用最小宽度\n resizable: true, // 启用列宽调整\n } as TableColumnData\n })\n .sort((a, b) => a.order - b.order)\n\n col.push({\n title: 'Actions',\n slotName: 'optional',\n align: 'center',\n width: 250,\n minWidth: 200,\n fixed: 'right',\n resizable: false,\n })\n _columns.value = col\n}\n\n// 优化数据加载,减少不必要的响应式\nconst _data = ref<object[]>([])\nconst _columns = ref<TableColumnData[]>([])\nconst loadingPage = ref(true)\nconst loadingTable = ref(true)\n\nconst actions = ref<Action[]>()\n\nconst loadData = async () => {\n loadingTable.value = true\n const res = await getListData(props.className, createListParams())\n _data.value = res.data\n paging.total = res.totalCount\n loadingTable.value = false\n}\n\nonMounted(async () => {\n loadingPage.value = true\n pageData.value = await getPageData(3, props.className, {\n svrStore,\n bpmStore\n })\n mapColumns(pageData.value.fields)\n initSearchForm(pageData.value.fields)\n loadData()\n actions.value = pageData.value.actions\n loadingPage.value = false\n})\n\nonActivated(() => {\n loadData()\n})\n\nconst pageChangeHandler = (page: number) => {\n paging.current = page\n loadData()\n}\n\nconst pageSizeChangeHandler = (pageSize: number) => {\n paging.pageSize = pageSize\n loadData()\n}\n\nfunction clickHandler(type: ActionTypeEnum, _: string, redirectType: RedirectType, title: string, workflowId: string) {\n switch (type) {\n case ActionTypeEnum.Link:\n router.push({ name: redirectType, params: { workflowId } })\n break\n default:\n console.warn('Unknown action type:', type)\n }\n}\n\nfunction createHandler(actionType: ActionTypeEnum, _: string, redirectType: RedirectType) {\n switch (actionType) {\n case ActionTypeEnum.Link:\n router.push({ name: redirectType })\n break\n default:\n console.warn('Unknown action type:', actionType)\n }\n}\n\nfunction getApproverEmail(){\n return svrStore()?.userInfo?.email_address ?? ''\n}\n\nfunction replaceEmail(url: string, email: string): string {\n return url.replace(/{currentUserEmail}/g, email)\n}\n\nfunction tabHandler(key: string) {\n const filters = pageData.value?.tabs?.find(item => item.key === key)?.filters\n paging.filters = filters?.map(item => {\n return {\n ...item,\n value: replaceEmail(item.value, getApproverEmail())\n }\n }) || []\n loadData()\n}\n\n// 添加查询表单数据\nconst searchForm = ref<Record<string, any>>({})\n\n// 计算可搜索的字段\nconst searchableFields = computed(() => {\n if (!pageData.value?.fields) return []\n return Object.entries(pageData.value.fields)\n .filter(([, item]) => item.isFiltered)\n})\n\n// 初始化查询表单\nconst initSearchForm = (fields: Record<string, FieldConfig>) => {\n const form: Record<string, any> = {}\n Object.entries(fields).forEach(([key, value]) => {\n form[key] = value.modelValue \n })\n searchForm.value = form\n}\n\n// 查询处理函数\nconst handleSearch = () => {\n paging.current = 1\n loadData()\n}\n\n// 重置查询\nconst handleReset = () => {\n // Object.keys(searchForm.value).forEach(key => {\n // searchForm.value[key] = ''\n // })\n \n if(pageData.value){\n initSearchForm(pageData.value.fields)\n }\n handleSearch()\n}\n\nfunction judgeHiddenActions(action: Action, record: any) {\n if (action.location !== 'InTable') {\n return false\n }\n if (action.title === 'Update') {\n if(record.status === 100){\n return false\n }\n if(record.status === -1){\n return false\n } \n }\n return true\n}\n</script>\n\n<template>\n <div class=\"list-container\">\n <div class=\"page-title\">{{ className }} : List</div>\n <!-- 查询表单 -->\n <a-card>\n <div class=\"query-title\">\n <h3>查询条件</h3>\n <div>\n <template v-for=\"action in actions\" :key=\"action.title\">\n <template v-if=\"action.location === 'InOperation'\">\n <ActionButton :config=\"action\" @click=\"createHandler\" />\n </template>\n </template>\n </div>\n </div>\n <a-row :gutter=\"[24, 20]\" class=\"search-row\">\n <template v-for=\"[key, field] in searchableFields\" :key=\"key\">\n <a-col :span=\"6\" class=\"search-col\">\n <DataWidgets :name=\"key\" :config=\"field\" v-model=\"searchForm[key]\" class=\"form-field\" />\n </a-col>\n </template>\n <a-col :span=\"6\" class=\"search-col\">\n <div class=\"field-wrapper\">\n <a-space size=\"medium\">\n <a-button type=\"primary\" size=\"medium\" @click=\"handleSearch\">\n 查询\n </a-button>\n <a-button size=\"medium\" @click=\"handleReset\">\n 重置\n </a-button>\n </a-space>\n </div>\n </a-col>\n </a-row>\n </a-card>\n\n <a-tabs size=\"large\" @tab-click=\"tabHandler\">\n <a-tab-pane v-for=\"tab in pageData?.tabs\" :key=\"tab.key\" :title=\"tab.title\">\n </a-tab-pane>\n </a-tabs>\n <a-table \n :columns=\"_columns\" \n :data=\"_data\" \n stripe \n border\n :pagination=\"{\n current: paging.current,\n total: paging.total,\n pageSize: paging.pageSize,\n showTotal: paging.showTotal,\n showPageSize: paging.showPageSize,\n showJumper: true,\n pageSizeOptions: [10, 20, 50, 100]\n }\" \n :loading=\"loadingTable\" \n size=\"medium\" \n :scroll=\"scroll\"\n @page-change=\"pageChangeHandler\"\n @page-size-change=\"pageSizeChangeHandler\">\n \n <template #optional=\"{ record }\">\n <a-space size=\"small\">\n <template v-for=\"action in actions\" :key=\"action.title\">\n <template v-if=\"judgeHiddenActions(action, record)\">\n <ActionButton \n :config=\"action\" \n size=\"small\"\n @click=\"(...args) => clickHandler(...args, record.workflowId)\" \n />\n </template>\n </template>\n </a-space>\n </template>\n </a-table>\n </div>\n</template>\n\n<style lang=\"stylus\" scoped>\n.list-container {\n padding 16px\n \n // 移除固定高度相关的CSS\n :deep(.arco-table) {\n .arco-table-body {\n overflow-x: auto\n // 移除 overflow-y 和固定高度相关样式\n }\n }\n}\n\n.page-title {\n font-size: 24px;\n font-weight: bold;\n color: #1d2129;\n margin-bottom: 16px;\n padding: 12px 0;\n}\n\n.query-title {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.search-row {\n margin-top: 16px;\n}\n\n.field-wrapper {\n display: flex;\n flex-direction: column;\n}\n\n.field-label {\n font-weight: 500;\n margin-bottom: 8px;\n}\n</style>\n","import type { App } from 'vue'\nimport type { Router } from 'vue-router'\nimport type { Pinia } from 'pinia'\nimport CreateView from '@/components/data-gen/views/CreateView.vue'\nimport UpdateView from '@/components/data-gen/views/UpdateView.vue'\nimport DetailView from '@/components/data-gen/views/DetailView.vue'\nimport ListView from '@/components/data-gen/views/ListView.vue'\nimport { RouterKey } from '@/composables/useRouter'\nimport { PiniaKey, BpmStoreKey, SvrStoreKey} from '@/composables/usePinia'\nimport {TriggersKey} from '@/composables/useTriggers'\nimport { CustomCompsKey } from '@/composables/customComps'\n\n// 导入样式文件\nimport '@/styles/index.styl'\n\n// 全局配置\nexport interface LibraryConfig {\n apiBase?: string\n appSecret?: string\n}\n\nlet globalConfig: LibraryConfig = {}\n\nexport function setLibraryConfig(config: LibraryConfig) {\n globalConfig = { ...globalConfig, ...config }\n}\n\nexport function getLibraryConfig(): LibraryConfig {\n return globalConfig\n}\n\ninterface PluginOptions {\n router?: Router\n pinia?: Pinia\n config?: LibraryConfig\n [key: string]: any\n}\n\nconst MyPlugin = {\n install(app: App, options: PluginOptions = {}) {\n // 设置全局配置\n if (options.config) {\n setLibraryConfig(options.config)\n }\n \n // 如果宿主提供了 router,注入它以便共享\n if (options.router) {\n app.provide(RouterKey, options.router)\n }\n \n // 如果宿主提供了 pinia,注入它以便共享\n if (options.pinia) {\n app.provide(PiniaKey, options.pinia)\n }\n\n // 如果宿主提供了 bpmStore,注入它以便共享\n if (options.useBpmStore) {\n app.provide(BpmStoreKey, options.useBpmStore)\n }\n\n // 如果宿主提供了 svrStore,注入它以便共享\n if (options.useSvrStore) {\n app.provide(SvrStoreKey, options.useSvrStore)\n }\n\n // 如果宿主提供了 triggers,注入它以便共享\n if (options.triggers) {\n app.provide(TriggersKey, options.triggers)\n }\n\n if (options.customComps) {\n app.provide(CustomCompsKey, options.customComps)\n }\n\n // 注册组件\n app.component('CreateView', CreateView)\n app.component('UpdateView', UpdateView)\n app.component('DetailView', DetailView)\n app.component('ListView', ListView)\n }\n}\n\nexport default MyPlugin\n\nexport { CreateView, UpdateView, DetailView, ListView }\nexport { RouterKey } from '@/composables/useRouter'\nexport { PiniaKey } from '@/composables/usePinia'"],"names":["useLibraryMainStore","defineStore","ref","sleep","tick","resolve","getStoreData","store","key","remoteFunction","defaultValue","e","getApiConfig","config","getLibraryConfig","createAxiosInstance","apiBase","Axios","getToken","appSecret","axios","mainStore","getAxios","token","dataGetter","byteToHex","i","unsafeStringify","arr","offset","getRandomValues","rnds8","rng","randomUUID","native","v4","options","buf","rnds","ActionTypeEnum","PageActionType","mapPageData","input","type","attr","uuidv4","fieldName","fieldData","fieldConfig","attributes","propertyValue","getPageData","className","opt","res","getBtnList","getListData","params","createData","data","url","replaceId","id","updateData","replacedUrl","replaceWorkflowId","replaceEmail","email","replaceReason","reason","replaceStatus","status","replaceIsGlobal","ifGlobal","approveData","getOptions","value","list","item","getProcess","workflowId","validateRules","configs","errorMessages","isValid","vallidateRule","ruleName","ruleParameter","validations","parameter","_","props","__props","emits","__emit","model","_useModel","validate","v","inputHandler","changeHandler","valid","trigger","__expose","_createBlock","_component_AInput","$event","max","min","onMounted","_component_AInputNumber","loading","_options","computed","handlers","loadOptions","_component_ASelect","_createElementBlock","_Fragment","_renderList","_component_AOption","fieldNames","_component_ASpace","_createVNode","_component_ACascader","modelValue","ApiBase","uploadRef","fileList","headers","replaceIdAndClassName","action","nextTick","_component_a_upload","_cache","_component_ATextarea","_component_ACheckbox","widgetRef","useTemplateRef","curComp","InputText","InputNumber","SelectList","Cascader","FileUpload","TextArea","CheckBox","errMsg","errHandler","handlerName","isFileUpload","_openBlock","_hoisted_1","_createElementVNode","_hoisted_2","_createTextVNode","_toDisplayString","_hoisted_3","_hoisted_4","_hoisted_5","_resolveDynamicComponent","_hoisted_6","clickHandler","_component_AButton","_renderSlot","_ctx","_component_ALink","redirectType","SubmitButton","DetailLink","curUrl","RouterKey","useLibraryRouter","injectedRouter","inject","useVueRouter","TriggersKey","useTriggers","injectedTriggers","PiniaKey","BpmStoreKey","SvrStoreKey","useBpmStore","useSvrStore","bpmStore","svrStore","router","triggers","dataWidgetsRefs","instance","getCurrentInstance","pageData","_fields","_dependent","genField","fields","w","hiddenFields","genDependentField","acc","reversedActions","_data","reactive","validateResult","widget","newHiddenFields","_component_a_spin","_hoisted_7","DataWidgets","$slots","_hoisted_8","_hoisted_9","_hoisted_10","_hoisted_11","ActionButton","btnList","getApproverEmail","btn","CustomCompsKey","useLibraryCustomComps","customComps","formatDate","date","format","mapWorkflowSteps","process","currentIndex","p","index","step","nodeApprover","history","actualApprover","historyApprover","steps","isGlobal","triggerFn","title","successContent","_unref","_hoisted_12","_hoisted_13","_hoisted_14","paging","createListParams","searchFilters","searchForm","scroll","_columns","mapColumns","col","a","b","loadingPage","loadingTable","actions","loadData","initSearchForm","onActivated","pageChangeHandler","page","pageSizeChangeHandler","pageSize","createHandler","actionType","tabHandler","filters","searchableFields","form","handleSearch","handleReset","judgeHiddenActions","record","_component_a_card","_component_a_row","field","_component_a_col","_component_a_space","_component_a_button","_component_a_tabs","tab","_component_a_tab_pane","_component_a_table","_withCtx","args","globalConfig","setLibraryConfig","MyPlugin","app","CreateView","UpdateView","DetailView","ListView"],"mappings":"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","x_google_ignoreList":[4,5,6,7]}
|