upload current sources

This commit is contained in:
2026-09-16 01:47:28 -07:00
commit f8b45ea4a5
109 changed files with 26012 additions and 0 deletions
+20
View File
@@ -0,0 +1,20 @@
import BaseComponent from "sap/fe/core/AppComponent";
/**
* @namespace com.minicircuits.arenaplm
*/
export default class Component extends BaseComponent {
public static metadata = {
manifest: "json"
};
/**
* The component is initialized by UI5 automatically during the startup of the app and calls the init method once.
* @public
* @override
*/
//public init() : void {
// super.init();
//}
}
+396
View File
@@ -0,0 +1,396 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
Local UI annotations for the Arena PLM change-approval Fiori Elements app.
Service identity (binding, service definition, version, namespace) is defined ONCE in
webapp/localService/mainService/metadata.xml - keep this file's edmx:Reference, every
Annotations Target and every DataFieldForAction.Action in sync with it.
Provisional - namespace = binding name is strongly indicated, not proven; reconcile namespace,
entity type suffix and URL segments against the live $metadata of the RAP UI service binding
at PRD V-2 before deploy.
-->
<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_approval_o4/srvd/sap/zui_arena_change_approval/0001/$metadata">
<edmx:Include Namespace="com.sap.gateway.srvd.zui_arena_change_approval_o4.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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.ChangeApproval_Type/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_o4.v0001.reject(com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001.ChangeApproval_Type)/RejectReason">
<Annotation Term="Common.Label" String="{@i18n>FIELD_REJECT_REASON}"/>
</Annotations>
<!-- ============================================================================
Entity-type annotations
============================================================================ -->
<Annotations Target="com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001.ChangeApproval_Type">
<!-- 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 comes from Core.OperationAvailable in the service metadata
(approve/reject: IsApprovable, retrySync: IsRetriable).
[source: fiori-mcp-server "Action Control for Context-Dependent Actions";
sap-docs /sapui5/06_SAP_Fiori_Elements/actions-cbf16c5#enabling-custom-actions-defined-using-annotations,
verified 2026-09-14] -->
<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_o4.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_o4.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_o4.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>
+79
View File
@@ -0,0 +1,79 @@
# This is the resource bundle for com.minicircuits.arenaplm
#
# Text-type comments follow SAP's translator conventions
# (# <text type>: <note>) - XTIT title/heading, XFLD field label, XBUT button.
# [source: sap-docs SAP Translation Hub loio 028d963837b84dbf8d73d4306b032900, verified 2026-09-14]
#Texts for manifest.json
#XTIT: Application name
appTitle=Arena PLM Change Approvals
#YDES: Application description
appDescription=Arena PLM Change Approval Workbench
#XTIT: Fiori launchpad tile title (sap.app.crossNavigation.inbounds)
flpTitle=Arena PLM Change Approvals
#XTIT: Fiori launchpad tile subtitle
flpSubtitle=Approve staged Arena changes for SAP
#XTIT: Object type name (singular) in the object page header
CHANGE_APPROVAL_TITLE=Change Approval
#XTIT: Object type name (plural) - list report table header
CHANGE_APPROVALS_TITLE=Change Approvals
#XBUT: Approves the staged change and triggers the SAP sync
ACTION_APPROVE=Approve
#XBUT: Rejects the staged change; asks for a reason
ACTION_REJECT=Reject
#XBUT: Re-runs a FAILED SAP sync (FAILED -> EXECUTING)
ACTION_RETRY=Retry Sync
#XFLD: Arena item number (e.g. MC-100-0042)
FIELD_ITEM=Item Number
#XFLD: Arena item name / description
FIELD_NAME=Item Name
#XFLD: Kind of SAP object being synced (PRODUCT, CHANGE_MASTER, BOM, DOCUMENTS)
FIELD_CHANGE_TYPE=Change Type
#XFLD: Approval/sync status (PENDING, APPROVED, EXECUTING, SYNCED, REJECTED, FAILED); text comes from the RAP text element (PRD RAP-3)
FIELD_STATUS=Status
#XFLD: User who staged the change
FIELD_REQUESTED_BY=Requested By
#XFLD: Timestamp the change was staged
FIELD_REQUESTED_ON=Requested On
#XFLD: User who approved or rejected the change
FIELD_DECIDED_BY=Decided By
#XFLD: Timestamp of the approve/reject decision
FIELD_DECIDED_ON=Decided On
#XFLD: Arena engineering change order id (e.g. ECO-2026-0113)
FIELD_ARENA_ECO=Arena ECO
#XFLD: SAP change master number created by the sync
FIELD_SAP_CHANGE_NO=SAP Change Number
#XFLD: Error returned by SAP when the sync failed
FIELD_ERROR_MSG=Error Message
#XFLD: Reason entered by the approver when rejecting
FIELD_REJECT_REASON=Rejection Reason
#XFLD: JSON payload that will be written to SAP on approval
FIELD_STAGED_PAYLOAD=Staged SAP Payload
#XFLD: Technical flag - approve/reject allowed (hidden)
FIELD_IS_APPROVABLE=Can Be Approved
#XFLD: Technical flag - retry allowed (hidden)
FIELD_IS_RETRIABLE=Can Be Retried
#XFLD: Technical record key (hidden)
FIELD_ID=Record ID
#XFLD: Technical criticality code for the status (hidden)
FIELD_STATUS_CRITICALITY=Status Criticality
#XTIT: Object page section - what is being changed
FACET_CHANGE=Change
#XTIT: Object page section - who requested / decided and when
FACET_APPROVAL=Approval
#XTIT: Object page section - the JSON payload staged for SAP (shown before the approval section)
FACET_STAGED_PAYLOAD=Staged Payload
#XTIT: Object page section - outcome of the SAP sync (change number / error)
FACET_EXECUTION=SAP Result
#XTIT: Object page header facet - Arena / SAP reference numbers
FACET_REFERENCES=References
#XTIT: Name of the default list report view (pending approvals first)
SPV_DEFAULT=Pending Approvals
+79
View File
@@ -0,0 +1,79 @@
# This is the English resource bundle for com.minicircuits.arenaplm
#
# Text-type comments follow SAP's translator conventions
# (# <text type>: <note>) - XTIT title/heading, XFLD field label, XBUT button.
# [source: sap-docs SAP Translation Hub loio 028d963837b84dbf8d73d4306b032900, verified 2026-09-14]
#Texts for manifest.json
#XTIT: Application name
appTitle=Arena PLM Change Approvals
#YDES: Application description
appDescription=Arena PLM Change Approval Workbench
#XTIT: Fiori launchpad tile title (sap.app.crossNavigation.inbounds)
flpTitle=Arena PLM Change Approvals
#XTIT: Fiori launchpad tile subtitle
flpSubtitle=Approve staged Arena changes for SAP
#XTIT: Object type name (singular) in the object page header
CHANGE_APPROVAL_TITLE=Change Approval
#XTIT: Object type name (plural) - list report table header
CHANGE_APPROVALS_TITLE=Change Approvals
#XBUT: Approves the staged change and triggers the SAP sync
ACTION_APPROVE=Approve
#XBUT: Rejects the staged change; asks for a reason
ACTION_REJECT=Reject
#XBUT: Re-runs a FAILED SAP sync (FAILED -> EXECUTING)
ACTION_RETRY=Retry Sync
#XFLD: Arena item number (e.g. MC-100-0042)
FIELD_ITEM=Item Number
#XFLD: Arena item name / description
FIELD_NAME=Item Name
#XFLD: Kind of SAP object being synced (PRODUCT, CHANGE_MASTER, BOM, DOCUMENTS)
FIELD_CHANGE_TYPE=Change Type
#XFLD: Approval/sync status (PENDING, APPROVED, EXECUTING, SYNCED, REJECTED, FAILED); text comes from the RAP text element (PRD RAP-3)
FIELD_STATUS=Status
#XFLD: User who staged the change
FIELD_REQUESTED_BY=Requested By
#XFLD: Timestamp the change was staged
FIELD_REQUESTED_ON=Requested On
#XFLD: User who approved or rejected the change
FIELD_DECIDED_BY=Decided By
#XFLD: Timestamp of the approve/reject decision
FIELD_DECIDED_ON=Decided On
#XFLD: Arena engineering change order id (e.g. ECO-2026-0113)
FIELD_ARENA_ECO=Arena ECO
#XFLD: SAP change master number created by the sync
FIELD_SAP_CHANGE_NO=SAP Change Number
#XFLD: Error returned by SAP when the sync failed
FIELD_ERROR_MSG=Error Message
#XFLD: Reason entered by the approver when rejecting
FIELD_REJECT_REASON=Rejection Reason
#XFLD: JSON payload that will be written to SAP on approval
FIELD_STAGED_PAYLOAD=Staged SAP Payload
#XFLD: Technical flag - approve/reject allowed (hidden)
FIELD_IS_APPROVABLE=Can Be Approved
#XFLD: Technical flag - retry allowed (hidden)
FIELD_IS_RETRIABLE=Can Be Retried
#XFLD: Technical record key (hidden)
FIELD_ID=Record ID
#XFLD: Technical criticality code for the status (hidden)
FIELD_STATUS_CRITICALITY=Status Criticality
#XTIT: Object page section - what is being changed
FACET_CHANGE=Change
#XTIT: Object page section - who requested / decided and when
FACET_APPROVAL=Approval
#XTIT: Object page section - the JSON payload staged for SAP (shown before the approval section)
FACET_STAGED_PAYLOAD=Staged Payload
#XTIT: Object page section - outcome of the SAP sync (change number / error)
FACET_EXECUTION=SAP Result
#XTIT: Object page header facet - Arena / SAP reference numbers
FACET_REFERENCES=References
#XTIT: Name of the default list report view (pending approvals first)
SPV_DEFAULT=Pending Approvals
+35
View File
@@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Arena PLM Engineering Changes Approval Flow</title>
<style>
html, body, body > div, #container, #container-uiarea {
height: 100%;
}
</style>
<script
id="sap-ui-bootstrap"
src="resources/sap-ui-core.js"
data-sap-ui-theme="sap_horizon"
data-sap-ui-resource-roots='{
"com.minicircuits.arenaplm": "./"
}'
data-sap-ui-on-init="module:sap/ui/core/ComponentSupport"
data-sap-ui-compat-version="edge"
data-sap-ui-async="true"
data-sap-ui-frame-options="trusted"
></script>
</head>
<body class="sapUiBody sapUiSizeCompact" id="content">
<div
data-sap-ui-component
data-name="com.minicircuits.arenaplm"
data-id="container"
data-settings='{"id" : "com.minicircuits.arenaplm"}'
data-handle-validation="true"
></div>
</body>
</html>
@@ -0,0 +1,154 @@
[
{
"ID": "6f1c2a3e-0001-4a6b-9c1d-000000000001",
"ItemNumber": "MC-100-0042",
"ItemName": "RF Amplifier Module, 2-18 GHz",
"ChangeType": "PRODUCT",
"Status": "PENDING",
"StatusCriticality": 2,
"ArenaEcoId": "ECO-2026-0113",
"RequestedBy": "AZAW",
"RequestedOn": "2026-09-12T14:05:00Z",
"DecidedBy": null,
"DecidedOn": null,
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"Product\":\"MC-100-0042\",\"ProductType\":\"FERT\",\"BaseUnit\":\"PC\",\"IndustrySector\":\"M\",\"GrossWeight\":\"0.412\",\"WeightUnit\":\"KG\",\"ProductGroup\":\"RFAMP\",\"CrossPlantStatus\":\"\",\"_ProductDescription\":[{\"Language\":\"EN\",\"ProductDescription\":\"RF Amplifier Module, 2-18 GHz\"}],\"_ProductPlant\":[{\"Plant\":\"1710\",\"AvailabilityCheckType\":\"02\",\"ProfitCenter\":\"YB700\",\"MRPType\":\"PD\",\"ProcurementType\":\"E\"},{\"Plant\":\"1720\",\"AvailabilityCheckType\":\"02\",\"ProfitCenter\":\"YB700\",\"MRPType\":\"PD\",\"ProcurementType\":\"F\"}],\"_ProductSalesDelivery\":[{\"ProductSalesOrg\":\"1710\",\"ProductDistributionChnl\":\"10\",\"DeliveryQuantityUnit\":\"PC\",\"ItemCategoryGroup\":\"NORM\"}],\"_ProductStorage\":[{\"Plant\":\"1710\",\"StorageLocation\":\"171A\"}],\"_ProductValuation\":[{\"ValuationArea\":\"1710\",\"ValuationClass\":\"7920\",\"PriceControl\":\"S\",\"StandardPrice\":\"245.00\",\"Currency\":\"USD\"}]}",
"IsApprovable": true,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0002-4a6b-9c1d-000000000002",
"ItemNumber": "MC-100-0042",
"ItemName": "RF Amplifier Module, 2-18 GHz",
"ChangeType": "CHANGE_MASTER",
"Status": "PENDING",
"StatusCriticality": 2,
"ArenaEcoId": "ECO-2026-0113",
"RequestedBy": "AZAW",
"RequestedOn": "2026-09-12T14:05:04Z",
"DecidedBy": null,
"DecidedOn": null,
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"ChangeNumberDescription\":\"ECO: Rev C amplifier bias network update\",\"ChangeNumberValidFromDate\":\"2026-09-12T00:00:00Z\",\"ReasonForChangeText\":\"ARENA ECO-2026-0113\",\"ChangeNumberStatus\":\"01\"}",
"IsApprovable": true,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0003-4a6b-9c1d-000000000003",
"ItemNumber": "MC-200-0117",
"ItemName": "Bias Tee Assembly, SMA",
"ChangeType": "BOM",
"Status": "PENDING",
"StatusCriticality": 2,
"ArenaEcoId": "ECO-2026-0118",
"RequestedBy": "JDOE",
"RequestedOn": "2026-09-13T09:41:00Z",
"DecidedBy": null,
"DecidedOn": null,
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"Material\":\"MC-200-0117\",\"Plant\":\"1710\",\"BillOfMaterialCategory\":\"M\",\"BillOfMaterialVariantUsage\":\"1\",\"HeaderValidityStartDate\":\"2026-09-13T00:00:00Z\",\"ToBOMItem\":[{\"BillOfMaterialItemNumber\":\"0010\",\"BillOfMaterialComponent\":\"MC-500-0031\",\"BillOfMaterialItemQuantity\":\"2\",\"BillOfMaterialItemCategory\":\"L\"},{\"BillOfMaterialItemNumber\":\"0020\",\"BillOfMaterialComponent\":\"MC-500-0088\",\"BillOfMaterialItemQuantity\":\"1\",\"BillOfMaterialItemCategory\":\"L\"}]}",
"IsApprovable": true,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0004-4a6b-9c1d-000000000004",
"ItemNumber": "MC-300-0009",
"ItemName": "Low Noise Amplifier, 0.5-4 GHz",
"ChangeType": "PRODUCT",
"Status": "APPROVED",
"StatusCriticality": 2,
"ArenaEcoId": "ECO-2026-0097",
"RequestedBy": "AZAW",
"RequestedOn": "2026-09-08T16:22:00Z",
"DecidedBy": "MSMITH",
"DecidedOn": "2026-09-09T08:10:00Z",
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"Product\":\"MC-300-0009\",\"ProductType\":\"FERT\",\"BaseUnit\":\"PC\",\"ProductGroup\":\"LNA\",\"_ProductDescription\":[{\"Language\":\"EN\",\"ProductDescription\":\"Low Noise Amplifier, 0.5-4 GHz\"}]}",
"IsApprovable": false,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0007-4a6b-9c1d-000000000007",
"ItemNumber": "MC-300-0009",
"ItemName": "Low Noise Amplifier, 0.5-4 GHz",
"ChangeType": "CHANGE_MASTER",
"Status": "EXECUTING",
"ArenaEcoId": "ECO-2026-0097",
"RequestedBy": "AZAW",
"RequestedOn": "2026-09-08T16:22:03Z",
"DecidedBy": "MSMITH",
"DecidedOn": "2026-09-09T08:10:00Z",
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"ChangeNumberDescription\":\"ECO: LNA input match rework\",\"ChangeNumberValidFromDate\":\"2026-09-09T00:00:00Z\",\"ReasonForChangeText\":\"ARENA ECO-2026-0097\",\"ChangeNumberStatus\":\"01\"}",
"StatusCriticality": 5,
"IsApprovable": false,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0008-4a6b-9c1d-000000000008",
"ItemNumber": "MC-150-0301",
"ItemName": "Directional Coupler, 10 dB",
"ChangeType": "CHANGE_MASTER",
"Status": "SYNCED",
"ArenaEcoId": "ECO-2026-0088",
"RequestedBy": "JDOE",
"RequestedOn": "2026-09-05T10:00:00Z",
"DecidedBy": "MSMITH",
"DecidedOn": "2026-09-05T11:30:00Z",
"SapChangeNumber": "500000012301",
"ErrorMessage": null,
"RejectReason": null,
"SapPreview": "{\"ChangeNumberDescription\":\"ECO: Coupler housing plating change\",\"ChangeNumberValidFromDate\":\"2026-09-05T00:00:00Z\",\"ReasonForChangeText\":\"ARENA ECO-2026-0088\",\"ChangeNumberStatus\":\"01\"}",
"StatusCriticality": 3,
"IsApprovable": false,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0005-4a6b-9c1d-000000000005",
"ItemNumber": "MC-410-0250",
"ItemName": "Datasheet MC-410-0250 Rev B",
"ChangeType": "DOCUMENTS",
"Status": "REJECTED",
"StatusCriticality": 1,
"ArenaEcoId": "ECO-2026-0101",
"RequestedBy": "JDOE",
"RequestedOn": "2026-09-10T11:15:00Z",
"DecidedBy": "MSMITH",
"DecidedOn": "2026-09-10T13:02:00Z",
"SapChangeNumber": null,
"ErrorMessage": null,
"RejectReason": "Datasheet revision B superseded by Rev C in Arena; re-stage after ECO-2026-0121 is released.",
"SapPreview": "{\"BusinessObjectTypeName\":\"BUS1001006\",\"LinkedSAPObjectKey\":\"MC-410-0250\",\"Url\":\"https://app.bom.com/files/MC-410-0250-B.pdf\",\"MIMEType\":\"text/url\",\"AttachmentDescription\":\"MC-410-0250 Datasheet Rev B\"}",
"IsApprovable": false,
"IsRetriable": false
},
{
"ID": "6f1c2a3e-0006-4a6b-9c1d-000000000006",
"ItemNumber": "MC-200-0117",
"ItemName": "Bias Tee Assembly, SMA",
"ChangeType": "CHANGE_MASTER",
"Status": "FAILED",
"StatusCriticality": 1,
"ArenaEcoId": "ECO-2026-0118",
"RequestedBy": "JDOE",
"RequestedOn": "2026-09-13T09:40:00Z",
"DecidedBy": "AZAW",
"DecidedOn": "2026-09-13T10:05:00Z",
"SapChangeNumber": null,
"ErrorMessage": "API_CHANGEMASTER;v=0002 returned 400: Input parameters are initial (A_ChangeMasterObjTypeAssgmt requires IsActiveForChangeNumber).",
"RejectReason": null,
"SapPreview": "{\"ChangeNumberDescription\":\"ECO: Bias tee connector change to SMA-F\",\"ChangeNumberValidFromDate\":\"2026-09-13T00:00:00Z\",\"ReasonForChangeText\":\"ARENA ECO-2026-0118\",\"ChangeNumberStatus\":\"01\"}",
"IsApprovable": false,
"IsRetriable": true
}
]
@@ -0,0 +1,133 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
MOCK OData V4 $metadata for the Arena PLM change-approval Fiori Elements app (ADR-002).
=====================================================================================
SERVICE IDENTITY - single source of truth for the app (referenced by manifest.json,
annotation.xml and ui5-mock.yaml / ui5-local.yaml):
RAP service binding (OData V4 - UI) : ZUI_ARENA_CHANGE_APPROVAL_O4
RAP service definition : ZUI_ARENA_CHANGE_APPROVAL
Version : 0001
Service URL : /sap/opu/odata4/sap/zui_arena_change_approval_o4/srvd/sap/zui_arena_change_approval/0001/
Schema namespace / alias : com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001 / SAP__self
Root entity type / entity set : ChangeApproval_Type / ChangeApproval
The first URL segment after /sap/opu/odata4/sap/ and the schema namespace are strongly
indicated to be derived from the service BINDING name (the segment after srvd|srvd_a2x/sap/
is the service DEFINITION name): the tenant serves
/sap/opu/odata4/sap/api_currencyexchangerate/srvd_a2x/sap/currencyexchangerate/0001 with
namespace com.sap.gateway.srvd_a2x.api_currencyexchangerate.v0001, and SAP Help documents
/sap/opu/odata4/sap/api_product/srvd_a2x/sap/product/0002.
[source: live tenant my429480 ~/projects/sap-apps/exchange-rates-cap/package.json lines 33,39 and
srv/external/API_CURRENCYEXCHANGERATE.edmx line 55; sap-docs sap-help loio 5f45f125dfe84c20beb18f5de1512f5a,
verified 2026-09-14]
Provisional - namespace = binding name is strongly indicated, not proven; reconcile namespace,
entity type suffix and URL segments against the live $metadata of the RAP UI service binding
at PRD V-2 before deploy.
=====================================================================================
Shape mirrors what an ABAP Cloud OData V4 service binding emits: schema namespace
com.sap.gateway.<srvd|srvd_a2x>.<binding>.v0001 with Alias="SAP__self", entity types
suffixed "_Type", un-suffixed entity sets, and vocabulary aliases SAP__common /
SAP__capabilities / SAP__core / SAP__UI.
[source: live tenant my429480 EDMX ~/projects/sap-apps/exchange-rates-cap/srv/external/API_CURRENCYEXCHANGERATE.edmx
lines 13-31 (vocabulary aliases), 55 (schema/alias), 57 (_Type), 95 (entity set), verified 2026-09-14]
A Fiori app consumes the UI service binding (srvd), not the A2X binding used by the worker.
[source: sap-docs sap-help loio 5717c0a1dafc4335add0207b81c39cef, verified 2026-09-14]
Action availability: RAP emits Core.OperationAvailable for actions declared with
"( features : instance )" in the behavior definition; the Fiori side needs no extra annotation.
[source: sap-docs /sapui5/06_SAP_Fiori_Elements/actions-cbf16c5#enabling-custom-actions-defined-using-annotations
("No ABAP CDS annotation is required, since the setting is made according to the modelling ... in RAP BDEF"),
abap-docs /abap-docs-standard/ABENBDL_ACTIONS_FC, verified 2026-09-14]
The mock models the emitted result with the boolean properties IsApprovable / IsRetriable.
-->
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
<edmx:Reference Uri="/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_CAPABILITIES',Version='0001',SAP__Origin='LOCAL')/$value">
<edmx:Include Namespace="Org.OData.Capabilities.V1" Alias="SAP__capabilities"/>
</edmx:Reference>
<edmx:Reference Uri="/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_COMMON',Version='0001',SAP__Origin='LOCAL')/$value">
<edmx:Include Namespace="com.sap.vocabularies.Common.v1" Alias="SAP__common"/>
</edmx:Reference>
<edmx:Reference Uri="/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_CORE',Version='0001',SAP__Origin='LOCAL')/$value">
<edmx:Include Namespace="Org.OData.Core.V1" Alias="SAP__core"/>
</edmx:Reference>
<edmx:Reference Uri="/sap/opu/odata/IWFND/CATALOGSERVICE;v=2/Vocabularies(TechnicalName='%2FIWBEP%2FVOC_UI',Version='0001',SAP__Origin='LOCAL')/$value">
<edmx:Include Namespace="com.sap.vocabularies.UI.v1" Alias="SAP__UI"/>
</edmx:Reference>
<edmx:DataServices>
<Schema Namespace="com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001" Alias="SAP__self" xmlns="http://docs.oasis-open.org/odata/ns/edm">
<Annotation Term="SAP__core.SchemaVersion" String="1.0.0"/>
<EntityType Name="ChangeApproval_Type">
<Key>
<PropertyRef Name="ID"/>
</Key>
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
<Property Name="ItemNumber" Type="Edm.String" MaxLength="18"/>
<Property Name="ItemName" Type="Edm.String" MaxLength="40"/>
<Property Name="ChangeType" Type="Edm.String" MaxLength="15"/>
<!-- Status domain: PENDING -> APPROVED -> EXECUTING -> SYNCED | FAILED; REJECTED terminal;
FAILED -retrySync-> EXECUTING. approve/reject only for PENDING, retrySync only for FAILED (PRD RAP-1). -->
<Property Name="Status" Type="Edm.String" MaxLength="10"/>
<Property Name="StatusCriticality" Type="Edm.Byte"/>
<Property Name="ArenaEcoId" Type="Edm.String" MaxLength="20"/>
<Property Name="RequestedBy" Type="Edm.String" MaxLength="12"/>
<Property Name="RequestedOn" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="DecidedBy" Type="Edm.String" MaxLength="12"/>
<Property Name="DecidedOn" Type="Edm.DateTimeOffset" Precision="7"/>
<Property Name="SapChangeNumber" Type="Edm.String" MaxLength="12"/>
<Property Name="ErrorMessage" Type="Edm.String" MaxLength="255"/>
<Property Name="RejectReason" Type="Edm.String" MaxLength="255"/>
<!-- abap.string on the RAP side: emitted as Edm.String without MaxLength -->
<Property Name="SapPreview" Type="Edm.String"/>
<!-- Instance feature-control results (RAP "features : instance"), consumed by Core.OperationAvailable below -->
<Property Name="IsApprovable" Type="Edm.Boolean"/>
<Property Name="IsRetriable" Type="Edm.Boolean"/>
</EntityType>
<!-- Bound actions (binding parameter "_it" as emitted by RAP service bindings) -->
<Action Name="approve" IsBound="true">
<Parameter Name="_it" Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
<ReturnType Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
</Action>
<Action Name="reject" IsBound="true">
<Parameter Name="_it" Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
<Parameter Name="RejectReason" Type="Edm.String" Nullable="false" MaxLength="255"/>
<ReturnType Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
</Action>
<Action Name="retrySync" IsBound="true">
<Parameter Name="_it" Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
<ReturnType Type="SAP__self.ChangeApproval_Type" Nullable="false"/>
</Action>
<EntityContainer Name="Container">
<EntitySet Name="ChangeApproval" EntityType="com.sap.gateway.srvd.zui_arena_change_approval_o4.v0001.ChangeApproval_Type"/>
</EntityContainer>
<!-- Service-side (metadata) annotations, as a RAP service binding would emit them -->
<Annotations Target="SAP__self.ChangeApproval_Type/ID">
<Annotation Term="SAP__core.Computed"/>
</Annotations>
<Annotations Target="SAP__self.approve">
<Annotation Term="SAP__core.OperationAvailable" Path="IsApprovable"/>
</Annotations>
<Annotations Target="SAP__self.reject">
<Annotation Term="SAP__core.OperationAvailable" Path="IsApprovable"/>
</Annotations>
<Annotations Target="SAP__self.retrySync">
<Annotation Term="SAP__core.OperationAvailable" Path="IsRetriable"/>
</Annotations>
<Annotations Target="SAP__self.Container/ChangeApproval">
<Annotation Term="SAP__capabilities.InsertRestrictions">
<Record><PropertyValue Property="Insertable" Bool="false"/></Record>
</Annotation>
<Annotation Term="SAP__capabilities.DeleteRestrictions">
<Record><PropertyValue Property="Deletable" Bool="false"/></Record>
</Annotation>
<Annotation Term="SAP__capabilities.UpdateRestrictions">
<Record><PropertyValue Property="Updatable" Bool="false"/></Record>
</Annotation>
</Annotations>
</Schema>
</edmx:DataServices>
</edmx:Edmx>
+179
View File
@@ -0,0 +1,179 @@
{
"_version": "2.11.0",
"sap.app": {
"id": "com.minicircuits.arenaplm",
"type": "application",
"i18n": "i18n/i18n.properties",
"applicationVersion": {
"version": "0.0.1"
},
"title": "{{appTitle}}",
"description": "{{appDescription}}",
"resources": "resources.json",
"sourceTemplate": {
"id": "@sap/generator-fiori:lrop",
"version": "1.32.0",
"toolsId": "0ea36282-572c-4a90-b419-a3705f20a9c3"
},
"dataSources": {
"annotation": {
"type": "ODataAnnotation",
"uri": "annotations/annotation.xml",
"settings": {
"localUri": "annotations/annotation.xml"
}
},
"mainService": {
"uri": "/sap/opu/odata4/sap/zui_arena_change_approval_o4/srvd/sap/zui_arena_change_approval/0001/",
"type": "OData",
"settings": {
"annotations": [
"annotation"
],
"localUri": "localService/mainService/metadata.xml",
"odataVersion": "4.0"
}
}
},
"crossNavigation": {
"inbounds": {
"ArenaChangeApproval-manage": {
"semanticObject": "ArenaChangeApproval",
"action": "manage",
"title": "{{flpTitle}}",
"subTitle": "{{flpSubtitle}}",
"icon": "sap-icon://approvals",
"signature": {
"parameters": {},
"additionalParameters": "allowed"
}
}
}
}
},
"sap.ui": {
"technology": "UI5",
"icons": {
"icon": "",
"favIcon": "",
"phone": "",
"phone@2": "",
"tablet": "",
"tablet@2": ""
},
"deviceTypes": {
"desktop": true,
"tablet": true,
"phone": true
}
},
"sap.ui5": {
"flexEnabled": true,
"dependencies": {
"minUI5Version": "1.152.0",
"libs": {
"sap.m": {},
"sap.ui.core": {},
"sap.fe.templates": {}
}
},
"contentDensities": {
"compact": true,
"cozy": true
},
"models": {
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "com.minicircuits.arenaplm.i18n.i18n"
}
},
"": {
"dataSource": "mainService",
"preload": true,
"settings": {
"operationMode": "Server",
"autoExpandSelect": true,
"earlyRequests": true
}
},
"@i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"uri": "i18n/i18n.properties"
}
},
"resources": {
"css": []
},
"routing": {
"config": {},
"routes": [
{
"pattern": ":?query:",
"name": "ChangeApprovalList",
"target": "ChangeApprovalList"
},
{
"pattern": "ChangeApproval({key}):?query:",
"name": "ChangeApprovalObjectPage",
"target": [
"ChangeApprovalList",
"ChangeApprovalObjectPage"
]
}
],
"targets": {
"ChangeApprovalList": {
"type": "Component",
"id": "ChangeApprovalList",
"name": "sap.fe.templates.ListReport",
"options": {
"settings": {
"contextPath": "/ChangeApproval",
"defaultTemplateAnnotationPath": "com.sap.vocabularies.UI.v1.SelectionPresentationVariant#Default",
"initialLoad": "Enabled",
"variantManagement": "Page",
"navigation": {
"ChangeApproval": {
"detail": {
"route": "ChangeApprovalObjectPage"
}
}
},
"controlConfiguration": {
"@com.sap.vocabularies.UI.v1.LineItem": {
"tableSettings": {
"type": "ResponsiveTable",
"selectionMode": "None"
}
}
}
}
},
"controlAggregation": "beginColumnPages"
},
"ChangeApprovalObjectPage": {
"type": "Component",
"id": "ChangeApprovalObjectPage",
"name": "sap.fe.templates.ObjectPage",
"options": {
"settings": {
"editableHeaderContent": false,
"contextPath": "/ChangeApproval"
}
},
"controlAggregation": "midColumnPages"
}
}
}
},
"sap.fiori": {
"registrationIds": [],
"archeType": "transactional"
},
"sap.fe": {
"app": {
"enableLazyLoading": true
}
}
}
@@ -0,0 +1,61 @@
/******************************************************************************
* ╔═══════════════════════════════════════════════════════════════════════╗ *
* ║ ║ *
* ║ WARNING: AUTO-GENERATED FILE ║ *
* ║ ║ *
* ║ This file is automatically generated by SAP Fiori tools and is ║ *
* ║ overwritten when you run the OPA test generator again. ║ *
* ║ ║ *
* ║ To add your own custom tests: ║ *
* ║ - Create a new journey test file in this directory. ║ *
* ║ - Follow the same pattern as this file. ║ *
* ║ - Add the new file to the opaTests.qunit.js config file. ║ *
* ║ - Custom journey files are not overwritten. ║ *
* ║ ║ *
* ╚═══════════════════════════════════════════════════════════════════════╝ *
******************************************************************************/
import opaTest from "sap/ui/test/opaQunit";
import type { Given, When, Then } from "./types/OpaJourneyTypes.gen";
import runner from "./pages/JourneyRunner";
function journey() {
QUnit.module("ChangeApprovalsListListReport journey");
const defaultTableId = "";
opaTest("Start application", function (Given: Given, _When: When, Then: Then) {
Given.iStartMyApp();
Then.onTheChangeApprovalsListGenerated.iSeeThisPage();
});
// Note: this test will only work if the ListReport page has a search field and shows data that matches the search term. Please ensure that the test data and search term are set up accordingly.
// opaTest("Perform a global search and check the result", function (Given: Given, When: When, Then: Then) {
// When.onTheChangeApprovalsListGenerated.onFilterBar().iChangeSearchField("Search Term");
// When.onTheChangeApprovalsListGenerated.onFilterBar().iExecuteSearch();
// Then.onTheChangeApprovalsListGenerated.onTable(defaultTableId).iCheckRows();
// When.onTheChangeApprovalsListGenerated.onFilterBar().iChangeSearchField(undefined);
// Then.onTheChangeApprovalsListGenerated.onFilterBar().iCheckSearchField(undefined);
// });
opaTest("Check table columns and actions", function (_Given: Given, _When: When, Then: Then) {
Then.onTheChangeApprovalsListGenerated.onTable(defaultTableId).iCheckColumns(undefined, {"ItemNumber":{"header":"ItemNumber"},"ItemName":{"header":"ItemName"},"ChangeType":{"header":"ChangeType"},"Status":{"header":"Status"},"StatusCriticality":{"header":"StatusCriticality"}});
});
opaTest("Navigate to ObjectPage", function (_Given: Given, When: When, Then: Then) {
// Note: this test will fail if the ListReport page doesn't show any data
When.onTheChangeApprovalsListGenerated.onFilterBar().iExecuteSearch();
Then.onTheChangeApprovalsListGenerated.onTable(defaultTableId).iCheckRows();
When.onTheChangeApprovalsListGenerated.onTable(defaultTableId).iPressRow(0);
Then.onTheChangeApprovalsObjectPageGenerated.iSeeThisPage();
});
opaTest("Teardown", function (Given: Given) {
// Cleanup
Given.iTearDownMyApp();
});
}
runner.run([journey]);
@@ -0,0 +1,71 @@
/******************************************************************************
* ╔═══════════════════════════════════════════════════════════════════════╗ *
* ║ ║ *
* ║ WARNING: AUTO-GENERATED FILE ║ *
* ║ ║ *
* ║ This file is automatically generated by SAP Fiori tools and is ║ *
* ║ overwritten when you run the OPA test generator again. ║ *
* ║ ║ *
* ║ To add your own custom tests: ║ *
* ║ - Create a new journey test file in this directory. ║ *
* ║ - Follow the same pattern as this file. ║ *
* ║ - Add the new file to the opaTests.qunit.js config file. ║ *
* ║ - Custom journey files are not overwritten. ║ *
* ║ ║ *
* ╚═══════════════════════════════════════════════════════════════════════╝ *
******************************************************************************/
import opaTest from "sap/ui/test/opaQunit";
import type { Given, When, Then } from "./types/OpaJourneyTypes.gen";
import runner from "./pages/JourneyRunner";
function journey() {
QUnit.module("ChangeApprovalsObjectPageObjectPage journey");
opaTest("Navigate to ChangeApprovalsObjectPageObjectPage", function (Given: Given, When: When, Then: Then) {
Given.iStartMyApp();
When.onTheChangeApprovalsListGenerated.onFilterBar().iExecuteSearch();
Then.onTheChangeApprovalsListGenerated.onTable("").iCheckRows();
When.onTheChangeApprovalsListGenerated.onTable("").iPressRow(0);
Then.onTheChangeApprovalsObjectPageGenerated.iSeeThisPage();
});
opaTest("Check the ChangeFacet section of the Object Page", function (_Given: Given, _When: When, Then: Then) {
Then.onTheChangeApprovalsObjectPageGenerated.iCheckSection({ section: "ChangeFacet" }, {});
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ChangeFacet" }).iCheckField({ property: "ItemNumber" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ChangeFacet" }).iCheckField({ property: "ItemName" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ChangeFacet" }).iCheckField({ property: "ChangeType" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ChangeFacet" }).iCheckField({ property: "ArenaEcoId" });
});
opaTest("Check the ApprovalFacet section of the Object Page", function (_Given: Given, _When: When, Then: Then) {
Then.onTheChangeApprovalsObjectPageGenerated.iCheckSection({ section: "ApprovalFacet" }, {});
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "Status" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "RequestedBy" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "RequestedOn" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "DecidedBy" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "DecidedOn" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ApprovalFacet" }).iCheckField({ property: "RejectReason" });
});
opaTest("Check the ExecutionFacet section of the Object Page", function (_Given: Given, _When: When, Then: Then) {
Then.onTheChangeApprovalsObjectPageGenerated.iCheckSection({ section: "ExecutionFacet" }, {});
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ExecutionFacet" }).iCheckField({ property: "SapChangeNumber" });
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "ExecutionFacet" }).iCheckField({ property: "ErrorMessage" });
});
opaTest("Check the PayloadFacet section of the Object Page", function (_Given: Given, _When: When, Then: Then) {
Then.onTheChangeApprovalsObjectPageGenerated.iCheckSection({ section: "PayloadFacet" }, {});
Then.onTheChangeApprovalsObjectPageGenerated.onForm({ section: "PayloadFacet" }).iCheckField({ property: "SapPreview" });
});
opaTest("Teardown", function (Given: Given) {
// Cleanup
Given.iTearDownMyApp();
});
}
runner.run([journey]);
@@ -0,0 +1,25 @@
/******************************************************************************
* ╔═══════════════════════════════════════════════════════════════════════╗ *
* ║ ║ *
* ║ WARNING: AUTO-GENERATED FILE ║ *
* ║ ║ *
* ║ This file is automatically generated by SAP Fiori tools and is ║ *
* ║ overwritten when you run the OPA test generator again. ║ *
* ║ ║ *
* ║ To add your own custom pages: ║ *
* ║ - Create a new page file in this directory. ║ *
* ║ - Follow the same pattern as this file. ║ *
* ║ - Add the new file to the JourneyRunner. ║ *
* ║ - Custom page files are not overwritten. ║ *
* ║ ║ *
* ╚═══════════════════════════════════════════════════════════════════════╝ *
******************************************************************************/
export const actions = {};
export const assertions = {};
export default class ListReport {
actions = actions;
assertions = assertions;
}
@@ -0,0 +1,25 @@
/******************************************************************************
* ╔═══════════════════════════════════════════════════════════════════════╗ *
* ║ ║ *
* ║ WARNING: AUTO-GENERATED FILE ║ *
* ║ ║ *
* ║ This file is automatically generated by SAP Fiori tools and is ║ *
* ║ overwritten when you run the OPA test generator again. ║ *
* ║ ║ *
* ║ To add your own custom pages: ║ *
* ║ - Create a new page file in this directory. ║ *
* ║ - Follow the same pattern as this file. ║ *
* ║ - Add the new file to the JourneyRunner. ║ *
* ║ - Custom page files are not overwritten. ║ *
* ║ ║ *
* ╚═══════════════════════════════════════════════════════════════════════╝ *
******************************************************************************/
export const actions = {};
export const assertions = {};
export default class ObjectPage {
actions = actions;
assertions = assertions;
}
@@ -0,0 +1,32 @@
import JourneyRunner from "sap/fe/test/JourneyRunner";
import ListReport from "sap/fe/test/ListReport";
import ObjectPage from "sap/fe/test/ObjectPage";
import CustomChangeApprovalsListGenerated from "./ChangeApprovalsList.gen";
import CustomChangeApprovalsObjectPageGenerated from "./ChangeApprovalsObjectPage.gen";
const runner = new JourneyRunner({
launchUrl: sap.ui.require.toUrl("com/minicircuits/arenaplm") + "/test/flp.html#app-preview",
pages: {
onTheChangeApprovalsListGenerated: new ListReport(
{
appId: "com.minicircuits.arenaplm",
componentId: "ChangeApprovalList",
entitySet: "",
contextPath: "/ChangeApproval"
},
CustomChangeApprovalsListGenerated
),
onTheChangeApprovalsObjectPageGenerated: new ObjectPage(
{
appId: "com.minicircuits.arenaplm",
componentId: "ChangeApprovalObjectPage",
entitySet: "",
contextPath: "/ChangeApproval"
},
CustomChangeApprovalsObjectPageGenerated
)
},
async: true
});
export default runner;
@@ -0,0 +1,56 @@
/******************************************************************************
* ╔═══════════════════════════════════════════════════════════════════════╗ *
* ║ ║ *
* ║ WARNING: AUTO-GENERATED FILE ║ *
* ║ ║ *
* ║ This file is automatically generated by SAP Fiori tools and is ║ *
* ║ overwritten when you run the OPA test generator again. ║ *
* ║ ║ *
* ║ Do not edit this file directly. Any changes will be lost. ║ *
* ║ ║ *
* ╚═══════════════════════════════════════════════════════════════════════╝ *
******************************************************************************/
import type Opa5 from "sap/ui/test/Opa5";
import type { actions as ListReportActions, assertions as ListReportAssertions } from "sap/fe/test/ListReport";
import type { actions as ObjectPageActions, assertions as ObjectPageAssertions } from "sap/fe/test/ObjectPage";
import type { actions as TemplatePageActions, assertions as TemplatePageAssertions } from "sap/fe/test/TemplatePage";
import type Shell from "sap/fe/test/Shell";
import type BaseArrangements from "sap/fe/test/BaseArrangements";
import type { actions as ChangeApprovalsListGeneratedCustomActions, assertions as ChangeApprovalsListGeneratedCustomAssertions } from "../pages/ChangeApprovalsList.gen";
import type { actions as ChangeApprovalsObjectPageGeneratedCustomActions, assertions as ChangeApprovalsObjectPageGeneratedCustomAssertions } from "../pages/ChangeApprovalsObjectPage.gen";
/**
* Enables OPA5 fluent `.and` chaining on page objects and their sub-objects.
*
* @example
* Then.onTheObjectPageGenerated.iCheckSection({ section: "A" }).and.iCheckSection({ section: "B" });
* When.onTheListReportGenerated.onFilterBar().iExecuteSearch().and.iClearFilterBar();
*/
type WithAnd<T> = {
[K in keyof T | 'and']: K extends 'and'
? WithAnd<T>
: K extends keyof T
? T[K] extends (...args: infer A) => infer R
? (...args: A) => (R extends Opa5 | object ? (keyof R extends never ? WithAnd<T> : [R] extends [Opa5] ? WithAnd<T> : WithAnd<R>) : WithAnd<T>)
: T[K]
: never;
};
export type Given = Opa5 & BaseArrangements & {
iTearDownMyApp: () => Given;
iStartMyApp: (sAppHash?: string, mInUrlParameters?: object) => Given;
and: Given;
};
export type When = Opa5 & BaseArrangements & {
onTheChangeApprovalsListGenerated: WithAnd<Opa5 & ListReportActions & TemplatePageActions & typeof ChangeApprovalsListGeneratedCustomActions>;
onTheChangeApprovalsObjectPageGenerated: WithAnd<Opa5 & ObjectPageActions & TemplatePageActions & typeof ChangeApprovalsObjectPageGeneratedCustomActions>;
onTheShell: Shell;
};
export type Then = Opa5 & BaseArrangements & {
onTheChangeApprovalsListGenerated: WithAnd<Opa5 & ListReportAssertions & TemplatePageAssertions & typeof ChangeApprovalsListGeneratedCustomAssertions>;
onTheChangeApprovalsObjectPageGenerated: WithAnd<Opa5 & ObjectPageAssertions & TemplatePageAssertions & typeof ChangeApprovalsObjectPageGeneratedCustomAssertions>;
onTheShell: Shell;
};