| | |
| | | isSelectField, |
| | | mergeFormConfigForEdit, |
| | | } from "./approvalFormField.js"; |
| | | import { |
| | | formatKnownSelectLabel, |
| | | resolveInstanceFormPayload, |
| | | resolveListFieldRawValue, |
| | | } from "./approvalModuleListSearch.js"; |
| | | |
| | | export const DETAIL_STORAGE_KEY = "oa_approve_instance_detail_row"; |
| | | |
| | |
| | | return parseTime(val, "{y}-{m}-{d} {h}:{i}:{s}") || String(val); |
| | | } |
| | | |
| | | /** 解析实例 formConfig 为只读展示字段 */ |
| | | export function resolveInstanceDisplayFields(formConfig) { |
| | | const merged = mergeFormConfigForEdit("", formConfig); |
| | | /** 解析实例为只读展示字段(合并 formPayload,支持传整行或仅 formConfig) */ |
| | | export function resolveInstanceDisplayFields(formConfigOrRow) { |
| | | const row = |
| | | formConfigOrRow && |
| | | typeof formConfigOrRow === "object" && |
| | | (formConfigOrRow.formConfig != null || |
| | | formConfigOrRow.formPayload != null || |
| | | formConfigOrRow.formFieldDefs != null) |
| | | ? formConfigOrRow |
| | | : { formConfig: formConfigOrRow }; |
| | | const { fields } = resolveInstanceFormPayload(row); |
| | | if (fields.length) return fields.filter(f => f?.key); |
| | | const merged = mergeFormConfigForEdit("", row.formConfig); |
| | | return (merged.fields || []).filter(f => f?.key); |
| | | } |
| | | |
| | |
| | | const val = field.value ?? field.defaultValue; |
| | | if (val === undefined || val === null || val === "") return "-"; |
| | | if (isSelectField(field)) { |
| | | return getFieldOptionLabel(field, val) || String(val); |
| | | const fromOptions = getFieldOptionLabel(field, val); |
| | | if (fromOptions && fromOptions !== "-") return fromOptions; |
| | | const known = formatKnownSelectLabel(field.key, val); |
| | | if (known) return known; |
| | | return String(val); |
| | | } |
| | | const known = formatKnownSelectLabel(field?.key, val); |
| | | if (known) return known; |
| | | const shown = formatFieldDisplayValue(field, val); |
| | | return shown || String(val); |
| | | } |
| | | |
| | | const DATETIME_LIST_PROPS = new Set([ |
| | | "startTime", |
| | | "endTime", |
| | | "overtimeDate", |
| | | "applyTime", |
| | | ]); |
| | | |
| | | function formatListFieldDisplay(prop, val, field) { |
| | | if (val === undefined || val === null || val === "") return "-"; |
| | | if (DATETIME_LIST_PROPS.has(prop)) { |
| | | const shown = formatDateTime(val); |
| | | if (shown && shown !== "-") return shown; |
| | | } |
| | | if (field?.type === "datetimerange") { |
| | | const shown = formatFieldDisplayValue(field, val); |
| | | if (shown) return shown; |
| | | } |
| | | if (field) return displayFieldValue({ ...field, value: val }); |
| | | const known = formatKnownSelectLabel(prop, val); |
| | | if (known) return known; |
| | | return String(val); |
| | | } |
| | | |
| | | /** 审批记录 result:approved | rejected | pending */ |
| | |
| | | }; |
| | | } |
| | | |
| | | /** 从 formConfig 提取列表展示字段(label + value) */ |
| | | export function buildFormDisplayRows(formConfig, listFields = []) { |
| | | const fields = resolveInstanceDisplayFields(formConfig); |
| | | /** 从实例行提取列表展示字段(label + value,含 formPayload) */ |
| | | export function buildFormDisplayRows(row, listFields = []) { |
| | | const { fields, formPayload } = resolveInstanceFormPayload(row); |
| | | const fieldByKey = new Map((fields || []).map(f => [f.key, f])); |
| | | const rows = []; |
| | | const propKeys = (listFields || []).map(f => f.prop).filter(Boolean); |
| | | const defs = listFields || []; |
| | | |
| | | if (propKeys.length) { |
| | | propKeys.forEach(prop => { |
| | | const hit = fields.find(f => f.key === prop); |
| | | if (hit) { |
| | | rows.push({ label: hit.label, value: displayFieldValue(hit) }); |
| | | } |
| | | if (defs.length) { |
| | | defs.forEach(def => { |
| | | if (!def?.prop) return; |
| | | const prop = def.prop; |
| | | const hit = fieldByKey.get(prop); |
| | | const raw = resolveListFieldRawValue(prop, row, fields, formPayload); |
| | | rows.push({ |
| | | label: def.label || hit?.label || prop, |
| | | value: formatListFieldDisplay(prop, raw, hit), |
| | | }); |
| | | }); |
| | | } else { |
| | | fields.slice(0, 3).forEach(f => { |
| | |
| | | /** 列表行增强(保留原始字段供详情/编辑) */ |
| | | export function mapInstanceListRow(row, listFields = []) { |
| | | if (!row) return {}; |
| | | const displayRows = buildFormDisplayRows(row.formConfig, listFields); |
| | | const displayRows = buildFormDisplayRows(row, listFields); |
| | | const extra = {}; |
| | | const formFields = resolveInstanceDisplayFields(row.formConfig); |
| | | const { fields, formPayload } = resolveInstanceFormPayload(row); |
| | | (listFields || []).forEach(def => { |
| | | if (!def?.prop) return; |
| | | const hit = formFields.find(f => f.key === def.prop); |
| | | extra[def.prop] = hit ? displayFieldValue(hit) : "-"; |
| | | }); |
| | | const formPayload = {}; |
| | | formFields.forEach(f => { |
| | | if (f?.key) formPayload[f.key] = f.value ?? f.defaultValue ?? ""; |
| | | const hit = fields.find(f => f.key === def.prop); |
| | | const raw = resolveListFieldRawValue(def.prop, row, fields, formPayload); |
| | | extra[def.prop] = formatListFieldDisplay(def.prop, raw, hit); |
| | | }); |
| | | return { |
| | | ...row, |
| | |
| | | createTime: formatDateTime(row.applyTime || row.createTime), |
| | | displayRows, |
| | | formPayload, |
| | | formFieldDefs: fields, |
| | | ...extra, |
| | | }; |
| | | } |