/* TARGET OBJECT : metadata extension ZC_CHANGEAPPROVAL - README step U12, UI leg abap: URI : abap:/repotree-v1/0M7DEJI/System%20Library/ZLOCAL/ZARENA_PLM/Core%20Data%20Services/Metadata%20Extensions/ZC_CHANGEAPPROVAL/zc_changeapproval.ddlx.acds ACTION : create empty via ADT MCP (objectType DDLX/EX, README U12), replace entire content, save, then activate (after ZC_CHANGEAPPROVAL view). Mirrors app/webapp/annotations/annotation.xml (line items, filter bar, header, facets, actions); the app's local annotations still apply on top at runtime. Labels are literals here; the app carries the i18n texts. Sources (all verified 2026-09-15, abap-docs /abap-fiori-showcase): @Metadata.layer + ANNOTATE ENTITY [abap-docs /abap-docs-cloud/ABENCDS_F1_ANNOTATE_VIEW] @UI.headerInfo typeName/typeNamePlural/typeImageUrl/title/description [05_object_page_header#title-and-subtitle] @UI.presentationVariant sortOrder + visualizations [03_list_report_content (Defining the Default Sort Order)] @UI.facet purpose/type/id/label/position/targetQualifier [06_object_page_content (Nested Tabs, RAPTreeview)] @UI.dataPoint qualifier/title/criticality + #DATAPOINT_REFERENCE header facet [05_object_page_header (Key Value, Progress)] @UI.identification #FOR_ACTION dataAction/label [05_object_page_header (Regular Actions)] @UI.lineItem position/importance/criticality [03_list_report_content (Configuring Tables); 06 (Table)] @UI.selectionField position [02_list_report_header#selection-fields] @UI.fieldGroup qualifier/position [06_object_page_content (Multi Input Field)] @UI.textArrangement #TEXT_ONLY [06_object_page_content#displaying-text-instead-of-id] @UI.multiLineText [05_object_page_header (Plain Text)]; @UI.hidden [06_object_page_content (Hiding Features)] Default filter Status = PENDING is NOT set here (string-literal escaping inside @UI.selectionVariant.filter is unverified); the app's annotation.xml SelectionVariant#Default provides it. */ @Metadata.layer: #CUSTOMER @UI: { headerInfo: { typeName: 'Change Approval', typeNamePlural: 'Change Approvals', typeImageUrl: 'sap-icon://approvals', title: { type: #STANDARD, value: 'ItemNumber' }, description: { type: #STANDARD, value: 'ItemName' } }, presentationVariant: [ { sortOrder: [ { by: 'Status', direction: #ASC }, { by: 'RequestedOn', direction: #DESC } ], visualizations: [ { type: #AS_LINEITEM } ] } ] } annotate entity ZC_CHANGEAPPROVAL with { @UI.facet: [ { id: 'StatusPoint', purpose: #HEADER, type: #DATAPOINT_REFERENCE, targetQualifier: 'StatusPoint' }, { id: 'Keys', purpose: #HEADER, type: #FIELDGROUP_REFERENCE, targetQualifier: 'Keys', label: 'Reference numbers' }, { id: 'Change', purpose: #STANDARD, type: #FIELDGROUP_REFERENCE, targetQualifier: 'Change', label: 'Change', position: 10 }, { id: 'Payload', purpose: #STANDARD, type: #FIELDGROUP_REFERENCE, targetQualifier: 'Payload', label: 'Staged payload', position: 20 }, { id: 'Approval', purpose: #STANDARD, type: #FIELDGROUP_REFERENCE, targetQualifier: 'Approval', label: 'Approval', position: 30 }, { id: 'Execution', purpose: #STANDARD, type: #FIELDGROUP_REFERENCE, targetQualifier: 'Execution', label: 'Execution', position: 40 } ] @UI.identification: [ { position: 10, type: #FOR_ACTION, dataAction: 'approve', label: 'Approve' }, { position: 20, type: #FOR_ACTION, dataAction: 'reject', label: 'Reject' }, { position: 30, type: #FOR_ACTION, dataAction: 'retrySync', label: 'Retry sync' } ] @UI.hidden: true ID; @UI: { lineItem: [ { position: 10, importance: #HIGH } ], selectionField: [ { position: 10 } ], fieldGroup: [ { qualifier: 'Change', position: 10 } ] } @EndUserText.label: 'Item number' ItemNumber; @UI: { lineItem: [ { position: 20, importance: #LOW } ], fieldGroup: [ { qualifier: 'Change', position: 20 } ] } @EndUserText.label: 'Item name' ItemName; @UI: { lineItem: [ { position: 30, importance: #HIGH } ], selectionField: [ { position: 30 } ], fieldGroup: [ { qualifier: 'Change', position: 30 } ] } @EndUserText.label: 'Change type' ChangeType; @UI: { lineItem: [ { position: 60, importance: #MEDIUM } ], selectionField: [ { position: 40 } ], fieldGroup: [ { qualifier: 'Change', position: 40 }, { qualifier: 'Keys', position: 10 } ] } @EndUserText.label: 'Arena ECO' ArenaEcoId; @UI: { lineItem: [ { position: 40, importance: #HIGH, criticality: 'StatusCriticality' } ], selectionField: [ { position: 20 } ], fieldGroup: [ { qualifier: 'Approval', position: 10, criticality: 'StatusCriticality' } ], dataPoint: { qualifier: 'StatusPoint', title: 'Status', criticality: 'StatusCriticality' }, textArrangement: #TEXT_ONLY } @EndUserText.label: 'Status' Status; @UI.hidden: true StatusText; @UI.hidden: true StatusCriticality; @UI.fieldGroup: [ { qualifier: 'Approval', position: 20 } ] @EndUserText.label: 'Requested by' RequestedBy; @UI: { lineItem: [ { position: 50, importance: #MEDIUM } ], fieldGroup: [ { qualifier: 'Approval', position: 30 } ] } @EndUserText.label: 'Requested on' RequestedOn; @UI.fieldGroup: [ { qualifier: 'Approval', position: 40 } ] @EndUserText.label: 'Decided by' DecidedBy; @UI.fieldGroup: [ { qualifier: 'Approval', position: 50 } ] @EndUserText.label: 'Decided on' DecidedOn; @UI.fieldGroup: [ { qualifier: 'Approval', position: 60 } ] @EndUserText.label: 'Reject reason' RejectReason; @UI.fieldGroup: [ { qualifier: 'Execution', position: 10 }, { qualifier: 'Keys', position: 20 } ] @EndUserText.label: 'SAP change number' SapChangeNumber; @UI.fieldGroup: [ { qualifier: 'Execution', position: 20 } ] @EndUserText.label: 'Error message' ErrorMessage; @UI: { fieldGroup: [ { qualifier: 'Payload', position: 10 } ], multiLineText: true } @EndUserText.label: 'Staged payload' SapPreview; @UI.hidden: true IsApprovable; @UI.hidden: true IsRetriable; }