From c7282ee2a06ee6868f07ef3c41333e4f3d208598 Mon Sep 17 00:00:00 2001 From: Francisco Gaona Date: Mon, 26 Jan 2026 19:37:17 +0100 Subject: [PATCH] WIP - do not display id on list views and correctly format datetime fields --- backend/src/object/field-mapper.service.ts | 7 +++++- frontend/components/fields/FieldRenderer.vue | 26 ++++++++++++++++++-- frontend/composables/useFieldViews.ts | 5 +++- 3 files changed, 34 insertions(+), 4 deletions(-) diff --git a/backend/src/object/field-mapper.service.ts b/backend/src/object/field-mapper.service.ts index 345c00d..5c55c0d 100644 --- a/backend/src/object/field-mapper.service.ts +++ b/backend/src/object/field-mapper.service.ts @@ -79,6 +79,10 @@ export class FieldMapperService { const frontendType = this.mapFieldType(field.type); const isLookupField = frontendType === 'belongsTo' || field.type.toLowerCase().includes('lookup'); + // Hide 'id' field from list view by default + const isIdField = field.apiName === 'id'; + const defaultShowOnList = isIdField ? false : true; + return { id: field.id, apiName: field.apiName, @@ -95,7 +99,7 @@ export class FieldMapperService { isReadOnly: field.isSystem || uiMetadata.isReadOnly || false, // View visibility - showOnList: uiMetadata.showOnList !== false, + showOnList: uiMetadata.showOnList !== undefined ? uiMetadata.showOnList : defaultShowOnList, showOnDetail: uiMetadata.showOnDetail !== false, showOnEdit: uiMetadata.showOnEdit !== false && !field.isSystem, sortable: uiMetadata.sortable !== false, @@ -141,6 +145,7 @@ export class FieldMapperService { 'boolean': 'boolean', 'date': 'date', 'datetime': 'datetime', + 'date_time': 'datetime', 'time': 'time', 'email': 'email', 'url': 'url', diff --git a/frontend/components/fields/FieldRenderer.vue b/frontend/components/fields/FieldRenderer.vue index 15eace0..6574b23 100644 --- a/frontend/components/fields/FieldRenderer.vue +++ b/frontend/components/fields/FieldRenderer.vue @@ -85,9 +85,31 @@ const formatValue = (val: any): string => { case FieldType.BELONGS_TO: return relationshipDisplayValue.value case FieldType.DATE: - return val instanceof Date ? val.toLocaleDateString() : new Date(val).toLocaleDateString() + try { + const date = val instanceof Date ? val : new Date(val) + return date.toLocaleDateString(undefined, { + year: 'numeric', + month: '2-digit', + day: '2-digit' + }) + } catch { + return String(val) + } case FieldType.DATETIME: - return val instanceof Date ? val.toLocaleString() : new Date(val).toLocaleString() + try { + const date = val instanceof Date ? val : new Date(val) + return date.toLocaleString(undefined, { + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', + hour12: false + }) + } catch { + return String(val) + } case FieldType.BOOLEAN: return val ? 'Yes' : 'No' case FieldType.CURRENCY: diff --git a/frontend/composables/useFieldViews.ts b/frontend/composables/useFieldViews.ts index 22aae95..3228cd1 100644 --- a/frontend/composables/useFieldViews.ts +++ b/frontend/composables/useFieldViews.ts @@ -20,6 +20,9 @@ export const useFields = () => { // Hide system fields and auto-generated fields on edit const shouldHideOnEdit = isSystemField || isAutoGeneratedField + // Hide 'id' field from list view by default (check both apiName and id field) + const shouldHideOnList = fieldDef.apiName === 'id' || fieldDef.label === 'Id' || fieldDef.label === 'ID' + return { id: fieldDef.id, apiName: fieldDef.apiName, @@ -37,7 +40,7 @@ export const useFields = () => { validationRules: fieldDef.validationRules || [], // View options - only hide system and auto-generated fields by default - showOnList: fieldDef.showOnList ?? true, + showOnList: fieldDef.showOnList ?? !shouldHideOnList, showOnDetail: fieldDef.showOnDetail ?? true, showOnEdit: fieldDef.showOnEdit ?? !shouldHideOnEdit, sortable: fieldDef.sortable ?? true,