Files
arena-plm-fiori/app/webapp/annotations/annotation.xml
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

405 lines
27 KiB
XML

<?xml version="1.0" encoding="UTF-8"?>
<!--
Local UI annotations for the Arena PLM change-approval Fiori Elements app.
Service identity is the live $metadata of RAP UI binding ZUI_ARENA_CHANGE_APPR_O4 (PRD V-2, reconciled
2026-09-16): webapp/localService/mainService/metadata.xml is a byte-identical copy of
docs/v2/zui_arena_change_appr_o4.metadata.xml. URL /sap/opu/odata4/sap/zui_arena_change_appr_o4/srvd/sap/
zui_arena_change_approval/0001/ (first segment = binding), schema namespace
com.sap.gateway.srvd.zui_arena_change_approval.v0001 (from the service DEFINITION), entity type
ChangeApprovalType. Keep this file's edmx:Reference, every Annotations Target and every
DataFieldForAction.Action in sync with it.
Layering: the backend (metadata extension ZC_CHANGEAPPROVAL) already emits most UI annotations. An
annotation in this file replaces the backend annotation with the same term + qualifier on the same
target; deleting it here makes the backend one effective again
[source: fiori-mcp-server "Visualizing and Managing Annotations with SAP Fiori Tools - Service Modeler",
verified 2026-09-16].
-->
<edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/UI.xml">
<edmx:Include Namespace="com.sap.vocabularies.UI.v1" Alias="UI"/>
</edmx:Reference>
<edmx:Reference Uri="https://sap.github.io/odata-vocabularies/vocabularies/Common.xml">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="Common"/>
</edmx:Reference>
<edmx:Reference Uri="/sap/opu/odata4/sap/zui_arena_change_appr_o4/srvd/sap/zui_arena_change_approval/0001/$metadata">
<edmx:Include Namespace="com.sap.gateway.srvd.zui_arena_change_approval.v0001"/>
</edmx:Reference>
<edmx:DataServices>
<Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="local">
<!-- ============================================================================
Property-level annotations: labels, read-only field control, hiding.
UI.Hidden hides a property everywhere; UI.HiddenFilter removes it from the
filter bar / Adapt Filters / table personalization filters.
[source: fiori-mcp-server "Hiding UI Elements with the UI.Hidden Annotation";
"Enabling Table Personalization in SAP Fiori Elements (OData V2 & V4)";
"Filter Fields - Add, Configure, Move, Delete...", verified 2026-09-14]
============================================================================ -->
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ID">
<Annotation Term="Common.Label" String="{@i18n>FIELD_ID}"/>
<Annotation Term="UI.Hidden" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ItemNumber">
<Annotation Term="Common.Label" String="{@i18n>FIELD_ITEM}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ItemName">
<Annotation Term="Common.Label" String="{@i18n>FIELD_NAME}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ChangeType">
<Annotation Term="Common.Label" String="{@i18n>FIELD_CHANGE_TYPE}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/Status">
<Annotation Term="Common.Label" String="{@i18n>FIELD_STATUS}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/StatusCriticality">
<Annotation Term="Common.Label" String="{@i18n>FIELD_STATUS_CRITICALITY}"/>
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/RequestedBy">
<Annotation Term="Common.Label" String="{@i18n>FIELD_REQUESTED_BY}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/RequestedOn">
<Annotation Term="Common.Label" String="{@i18n>FIELD_REQUESTED_ON}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/DecidedBy">
<Annotation Term="Common.Label" String="{@i18n>FIELD_DECIDED_BY}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/DecidedOn">
<Annotation Term="Common.Label" String="{@i18n>FIELD_DECIDED_ON}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ArenaEcoId">
<Annotation Term="Common.Label" String="{@i18n>FIELD_ARENA_ECO}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/SapChangeNumber">
<Annotation Term="Common.Label" String="{@i18n>FIELD_SAP_CHANGE_NO}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/ErrorMessage">
<Annotation Term="Common.Label" String="{@i18n>FIELD_ERROR_MSG}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/RejectReason">
<Annotation Term="Common.Label" String="{@i18n>FIELD_REJECT_REASON}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/SapPreview">
<Annotation Term="Common.Label" String="{@i18n>FIELD_STAGED_PAYLOAD}"/>
<Annotation Term="Common.FieldControl" EnumMember="Common.FieldControlType/ReadOnly"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
<!-- long JSON payload: render as text area [source: fiori-mcp-server "Text and Text Arrangement" sample (@UI.MultiLineText), verified 2026-09-14] -->
<Annotation Term="UI.MultiLineText" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/IsApprovable">
<Annotation Term="Common.Label" String="{@i18n>FIELD_IS_APPROVABLE}"/>
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
</Annotations>
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType/IsRetriable">
<Annotation Term="Common.Label" String="{@i18n>FIELD_IS_RETRIABLE}"/>
<Annotation Term="UI.Hidden" Bool="true"/>
<Annotation Term="UI.HiddenFilter" Bool="true"/>
</Annotations>
<!-- Action parameter label for the reject dialog -->
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.reject(com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType)/RejectReason">
<Annotation Term="Common.Label" String="{@i18n>FIELD_REJECT_REASON}"/>
</Annotations>
<!-- ============================================================================
Entity-type annotations
============================================================================ -->
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval.v0001.ChangeApprovalType">
<!-- Semantic key: bold ObjectIdentifier in responsive tables
[source: fiori-mcp-server "Handling Semantic Key Fields in SAP Fiori Elements", verified 2026-09-14] -->
<Annotation Term="Common.SemanticKey">
<Collection>
<PropertyPath>ItemNumber</PropertyPath>
<PropertyPath>ChangeType</PropertyPath>
<PropertyPath>ArenaEcoId</PropertyPath>
</Collection>
</Annotation>
<!-- Object page header (TypeImageUrl = object-type icon)
[source: fiori-mcp-server "Setting Up the Object Page Header (UI.HeaderInfo)";
"Object Page Header - Fiori Tools" (TypeImageUrl: sap-icon://...), verified 2026-09-14] -->
<Annotation Term="UI.HeaderInfo">
<Record Type="UI.HeaderInfoType">
<PropertyValue Property="TypeName" String="{@i18n>CHANGE_APPROVAL_TITLE}"/>
<PropertyValue Property="TypeNamePlural" String="{@i18n>CHANGE_APPROVALS_TITLE}"/>
<PropertyValue Property="TypeImageUrl" String="sap-icon://approvals"/>
<PropertyValue Property="Title">
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ItemNumber"/>
</Record>
</PropertyValue>
<PropertyValue Property="Description">
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ItemName"/>
</Record>
</PropertyValue>
</Record>
</Annotation>
<!-- Header facets: status data point + reference-number form
[source: fiori-mcp-server "Form Facet - Add a header form facet to an Object Page", verified 2026-09-14] -->
<Annotation Term="UI.DataPoint" Qualifier="StatusPoint">
<Record Type="UI.DataPointType">
<PropertyValue Property="Title" String="{@i18n>FIELD_STATUS}"/>
<PropertyValue Property="Value" Path="Status"/>
<PropertyValue Property="Criticality" Path="StatusCriticality"/>
</Record>
</Annotation>
<Annotation Term="UI.FieldGroup" Qualifier="Keys">
<Record Type="UI.FieldGroupType">
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ArenaEcoId"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="SapChangeNumber"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.HeaderFacets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="HeaderStatusFacet"/>
<PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#StatusPoint"/>
</Record>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="HeaderReferencesFacet"/>
<PropertyValue Property="Label" String="{@i18n>FACET_REFERENCES}"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Keys"/>
</Record>
</Collection>
</Annotation>
<!-- Filter bar -->
<Annotation Term="UI.SelectionFields">
<Collection>
<PropertyPath>ItemNumber</PropertyPath>
<PropertyPath>Status</PropertyPath>
<PropertyPath>ChangeType</PropertyPath>
<PropertyPath>ArenaEcoId</PropertyPath>
</Collection>
</Annotation>
<!-- Default list report view: Status = PENDING, sorted Status asc then RequestedOn desc.
Wired via manifest sap.ui5.routing.targets.ChangeApprovalList.options.settings
.defaultTemplateAnnotationPath (V4 requires a SelectionPresentationVariant).
[source: fiori-mcp-server "Configure Default Visualizations, Sort Order, and Filter Defaults
(UI.SelectionPresentationVariant, UI.PresentationVariant, UI.SelectionVariant)";
"Filter Bar Default Values", verified 2026-09-14] -->
<Annotation Term="UI.SelectionVariant" Qualifier="Default">
<Record Type="UI.SelectionVariantType">
<PropertyValue Property="Text" String="{@i18n>SPV_DEFAULT}"/>
<PropertyValue Property="SelectOptions">
<Collection>
<Record Type="UI.SelectOptionType">
<PropertyValue Property="PropertyName" PropertyPath="Status"/>
<PropertyValue Property="Ranges">
<Collection>
<Record Type="UI.SelectionRangeType">
<PropertyValue Property="Sign" EnumMember="UI.SelectionRangeSignType/I"/>
<PropertyValue Property="Option" EnumMember="UI.SelectionRangeOptionType/EQ"/>
<PropertyValue Property="Low" String="PENDING"/>
</Record>
</Collection>
</PropertyValue>
</Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.PresentationVariant" Qualifier="Default">
<Record Type="UI.PresentationVariantType">
<PropertyValue Property="Text" String="{@i18n>SPV_DEFAULT}"/>
<PropertyValue Property="SortOrder">
<Collection>
<Record Type="Common.SortOrderType">
<PropertyValue Property="Property" PropertyPath="Status"/>
<PropertyValue Property="Descending" Bool="false"/>
</Record>
<Record Type="Common.SortOrderType">
<PropertyValue Property="Property" PropertyPath="RequestedOn"/>
<PropertyValue Property="Descending" Bool="true"/>
</Record>
</Collection>
</PropertyValue>
<PropertyValue Property="Visualizations">
<Collection>
<AnnotationPath>@UI.LineItem</AnnotationPath>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.SelectionPresentationVariant" Qualifier="Default">
<Record Type="UI.SelectionPresentationVariantType">
<PropertyValue Property="Text" String="{@i18n>SPV_DEFAULT}"/>
<PropertyValue Property="SelectionVariant" Path="@UI.SelectionVariant#Default"/>
<PropertyValue Property="PresentationVariant" Path="@UI.PresentationVariant#Default"/>
</Record>
</Annotation>
<!-- Object page header actions (the ONLY place approve/reject/retry are offered; the list
report table is display-only with selectionMode None in the manifest).
Enablement is owned by the backend: RAP emits Core.OperationAvailable
Path="_it/__OperationControl/<action>" for the ( features : instance ) actions (live $metadata
2026-09-16). Deliberately NO OperationAvailable in this file - a local one would replace the
backend annotation on the same target.
[source: fiori-mcp-server "Action Control for Context-Dependent Actions (SAP Fiori Elements)";
"Enable Header Actions on the Object Page (UI.Identification / DataFieldForAction)";
"Visualizing and Managing Annotations with SAP Fiori Tools - Service Modeler", verified 2026-09-16] -->
<Annotation Term="UI.Identification">
<Collection>
<Record Type="UI.DataFieldForAction">
<PropertyValue Property="Label" String="{@i18n>ACTION_APPROVE}"/>
<PropertyValue Property="Action" String="com.sap.gateway.srvd.zui_arena_change_approval.v0001.approve"/>
<PropertyValue Property="Determining" Bool="false"/>
<PropertyValue Property="Criticality" EnumMember="UI.CriticalityType/Positive"/>
</Record>
<Record Type="UI.DataFieldForAction">
<PropertyValue Property="Label" String="{@i18n>ACTION_REJECT}"/>
<PropertyValue Property="Action" String="com.sap.gateway.srvd.zui_arena_change_approval.v0001.reject"/>
<PropertyValue Property="Determining" Bool="false"/>
<PropertyValue Property="Criticality" EnumMember="UI.CriticalityType/Negative"/>
</Record>
<Record Type="UI.DataFieldForAction">
<PropertyValue Property="Label" String="{@i18n>ACTION_RETRY}"/>
<PropertyValue Property="Action" String="com.sap.gateway.srvd.zui_arena_change_approval.v0001.retrySync"/>
<PropertyValue Property="Determining" Bool="false"/>
<PropertyValue Property="Criticality" EnumMember="UI.CriticalityType/Critical"/>
</Record>
</Collection>
</Annotation>
<!-- List report table: columns only (no toolbar actions - decisions are taken on the object page).
UI.Importance: High stays visible on narrow screens, Medium/Low are hidden progressively;
semantic-key columns without importance are treated as High.
[source: fiori-mcp-server "Tables - configuration and annotation samples for SAP Fiori elements"
(Control column visibility by screen size using UI.Importance), verified 2026-09-14] -->
<Annotation Term="UI.LineItem">
<Collection>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ItemNumber"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ItemName"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Low"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ChangeType"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="Status"/>
<PropertyValue Property="Criticality" Path="StatusCriticality"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/High"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="RequestedOn"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
</Record>
<Record Type="UI.DataField">
<PropertyValue Property="Value" Path="ArenaEcoId"/>
<Annotation Term="UI.Importance" EnumMember="UI.ImportanceType/Medium"/>
</Record>
</Collection>
</Annotation>
<!-- Object page sections -->
<Annotation Term="UI.FieldGroup" Qualifier="Change">
<Record Type="UI.FieldGroupType">
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="ItemNumber"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="ItemName"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="ChangeType"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="ArenaEcoId"/></Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.FieldGroup" Qualifier="Approval">
<Record Type="UI.FieldGroupType">
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="Status"/><PropertyValue Property="Criticality" Path="StatusCriticality"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="RequestedBy"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="RequestedOn"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="DecidedBy"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="DecidedOn"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="RejectReason"/></Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<!-- Staged payload gets its own section so the long JSON does not crowd the decision fields -->
<Annotation Term="UI.FieldGroup" Qualifier="Payload">
<Record Type="UI.FieldGroupType">
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="SapPreview"/></Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.FieldGroup" Qualifier="Execution">
<Record Type="UI.FieldGroupType">
<PropertyValue Property="Data">
<Collection>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="SapChangeNumber"/></Record>
<Record Type="UI.DataField"><PropertyValue Property="Value" Path="ErrorMessage"/></Record>
</Collection>
</PropertyValue>
</Record>
</Annotation>
<Annotation Term="UI.Facets">
<Collection>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="ChangeFacet"/>
<PropertyValue Property="Label" String="{@i18n>FACET_CHANGE}"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Change"/>
</Record>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="PayloadFacet"/>
<PropertyValue Property="Label" String="{@i18n>FACET_STAGED_PAYLOAD}"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Payload"/>
</Record>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="ApprovalFacet"/>
<PropertyValue Property="Label" String="{@i18n>FACET_APPROVAL}"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Approval"/>
</Record>
<Record Type="UI.ReferenceFacet">
<PropertyValue Property="ID" String="ExecutionFacet"/>
<PropertyValue Property="Label" String="{@i18n>FACET_EXECUTION}"/>
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Execution"/>
</Record>
</Collection>
</Annotation>
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>