From 5bdcb3b82f1d2cb9864f94fbce04788bde85ceeb Mon Sep 17 00:00:00 2001 From: jingrow Date: Thu, 14 May 2026 04:11:43 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=96=B0=E5=BB=BA=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=97=B6=E6=97=A0=E6=B3=95=E8=87=AA=E5=8A=A8=E5=A1=AB?= =?UTF-8?q?=E5=85=85=E9=BB=98=E8=AE=A4=E5=80=BC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- frontend/src/core/pagetype/default.vue | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/frontend/src/core/pagetype/default.vue b/frontend/src/core/pagetype/default.vue index 46f2381d0..cf250bb36 100644 --- a/frontend/src/core/pagetype/default.vue +++ b/frontend/src/core/pagetype/default.vue @@ -982,6 +982,47 @@ async function loadMeta() { } } +// Set default values from field definitions for new records +function applyDefaultValues() { + const titleField = pageMeta.value?.title_field + + for (const field of metaFields.value) { + if (!field.default || field.fieldname === titleField) continue + if (field.fieldtype === 'Table' || field.fieldtype === 'Table MultiSelect') continue + + const defaultVal = String(field.default) + let value: any = undefined + + if (defaultVal === '__user' || defaultVal.toLowerCase() === 'user') { + value = authStore.user?.name || '' + } else if (defaultVal === 'user_fullname') { + value = authStore.user?.full_name || '' + } else if (defaultVal === 'Today') { + value = new Date().toISOString().split('T')[0] + } else if (defaultVal.toLowerCase() === 'now') { + if (field.fieldtype === 'Time') { + value = new Date().toTimeString().slice(0, 8) + } else { + value = new Date().toISOString().slice(0, 19).replace('T', ' ') + } + } else if (defaultVal.startsWith(':')) { + // Dynamic defaults (e.g. ":User") - skip for now, handled by plugins + continue + } else if (field.fieldtype === 'Check') { + value = defaultVal === '1' ? 1 : 0 + } else if (field.fieldtype === 'Select' && defaultVal) { + // Use the default as-is for Select fields + value = defaultVal + } else { + value = field.default + } + + if (value !== undefined && record[field.fieldname] === undefined) { + record[field.fieldname] = value + } + } +} + // 应用字段配置插件 async function applyFieldConfig() { const { triggerFieldConfig } = await import('@/core/plugins/fieldPlugin') @@ -1057,6 +1098,8 @@ async function loadDetail() { if (isNew.value) { Object.keys(record).forEach(k => delete record[k]) originalRecord.value = {} + // Set default values from field definitions + applyDefaultValues() // Trigger record init plugins for new records await triggerRecordInit(entity.value, record) // Apply field config plugins for new records (set default values) @@ -1427,6 +1470,12 @@ watch( toolbarComponent.value = tb ? markRaw(tb) : null await loadMeta() await loadDetail() + // Re-subscribe realtime for the new document + if (!isNew.value && String(newVal.id)) { + realtime.watchDocument(entity.value, String(newVal.id), { + onUpdate: handlePgUpdate + }) + } } else if (idChanged) { // Only id changed: reload detail + re-subscribe realtime await loadDetail()