Files
arena-plm-fiori/docs/handover/rap/zc_changeapproval.ddlx.asddlx
T
alexzandClaude Opus 5 468729eb4e Sync current sources: clean RAP handover names, app rebind, tooling
Working-tree state as of 2026-09-29, uncommitted since the initial
"upload current sources" commit:

- docs/handover/rap/: renamed the 11 generator-suffixed sources
  (zz*000) to the clean object names built on the tenant, plus the
  A2X leg and parameter-entity edits.
- app/: manifest, annotations, i18n, mock data and local/mock ui5
  configs updated to the live service shape.
- PRD.md, CHANGELOG.md, KNOWLEDGE.md: build record through
  2026-09-19, including the rejected reentrance-ticket path.
- tools/adt-reentrance-login/: retained login helper (new).
- docs/v2/zui_arena_change_appr_o4.metadata.xml: captured live
  $metadata (new).
- Dropped a stray 0.3GB-class Eclipse installer that the initial
  commit had tracked under a URL-mangled filename, and the
  machine-specific 0M7DEJI.code-workspace.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-29 10:22:52 -07:00

144 lines
6.1 KiB
Plaintext

/* 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;
}