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
+10
View File
@@ -0,0 +1,10 @@
node_modules/
dist/
.scp/
.env
Makefile*.mta
mta_archives
mta-*
resources
archive.zip
.*_mta_build_tmp
+95
View File
@@ -0,0 +1,95 @@
## Application Details
| |
| ------------- |
|**Generation Date and Time**<br>Mon Sep 14 2026 12:49:13 GMT-0700 (Pacific Daylight Time)|
|**App Generator**<br>SAP Fiori Application Generator|
|**App Generator Version**<br>1.32.0|
|**Generation Platform**<br>Visual Studio Code|
|**Template Used**<br>List Report Page V4|
|**Service Type**<br>File|
|**Metadata File**<br>metadata.xml|
|**Module Name**<br>app|
|**Application Title**<br>Arena PLM Engineering Changes Approval Flow|
|**Namespace**<br>com.minicircuits|
|**UI5 Theme**<br>sap_horizon|
|**UI5 Version**<br>1.152.0|
|**Enable TypeScript**<br>True|
|**Add Eslint configuration**<br>True, see https://www.npmjs.com/package/@sap-ux/eslint-plugin-fiori-tools#rules for the eslint rules.|
|**Main Entity**<br>ChangeApprovals|
## Service binding (provisional)
The app binds to the RAP **UI** service binding, not the A2X binding the worker uses.
The single source of truth for the service identity is the header comment of
`webapp/localService/mainService/metadata.xml`:
| Item | Value |
|---|---|
| Service binding (OData V4 - UI) | `ZUI_ARENA_CHANGE_APPROVAL_O4` |
| Service definition | `ZUI_ARENA_CHANGE_APPROVAL` |
| 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` |
| Entity type / entity set | `ChangeApproval_Type` / `ChangeApproval` |
The first URL segment and the schema namespace are derived from the service **binding** name,
the segment after `srvd/sap/` from the service **definition** name - strongly indicated by the
tenant's `/sap/opu/odata4/sap/api_currencyexchangerate/srvd_a2x/sap/currencyexchangerate/0001`
(namespace `com.sap.gateway.srvd_a2x.api_currencyexchangerate.v0001`) and SAP Help's
`/sap/opu/odata4/sap/api_product/srvd_a2x/sap/product/0002`
[source: sap-docs sap-help loio 5f45f125dfe84c20beb18f5de1512f5a, verified 2026-09-14].
`webapp/manifest.json` (`sap.app.dataSources.mainService.uri`, routing) and
`webapp/annotations/annotation.xml` (`edmx:Reference`, every `Annotations Target`, every
`DataFieldForAction.Action`) must stay in sync with it. JSON cannot carry comments, so the
manifest references this note instead.
**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.**
## Status model and actions
`Status`: `PENDING -> APPROVED -> EXECUTING -> SYNCED | FAILED`; `REJECTED` is terminal;
`FAILED -> retrySync -> EXECUTING`. `approve`/`reject` are enabled only for `PENDING`,
`retrySync` only for `FAILED` (mocked via `IsApprovable` / `IsRetriable`, which stand in for the
`Core.OperationAvailable` RAP emits for `( features : instance )` actions - PRD RAP-1).
Actions are offered on the object page header only; the list report table is display-only
(`selectionMode: "None"`).
## Launchpad
`sap.app.crossNavigation.inbounds` declares the intent `ArenaChangeApproval-manage`; on
deployment to the ABAP environment the launchpad app descriptor item (target mapping + tile) is
generated from it, and an IAM app / business catalog / business role make it visible
[source: sap-docs /btp-cloud-platform/30-development/sap-fiori-applications-in-the-abap-environment-1d9deef, verified 2026-09-14].
`sap.fiori.registrationIds` stays empty: it holds SAP Fiori IDs of SAP-delivered apps and is not
required for a custom app (only `archeType` is mandatory)
[source: sap-docs /sapui5/04_Essentials/manifest-descriptor-for-applications-components-and-libraries-be0cf40, verified 2026-09-14].
Dev server: `npm run start-mock` / `npm run int-test` bind to port **8082** (8080 is taken on
the dev host). Mock data lives in `webapp/localService/mainService/data/ChangeApproval.json`
(`generateMockData: false`), 8 rows covering every status.
## app
An SAP Fiori application.
### Starting the generated app
- This app has been generated using the SAP Fiori tools - App Generator, as part of the SAP Fiori tools suite. To launch the generated application, run the following from the generated application root folder:
```
npm start
```
- It is also possible to run the application using mock data that reflects the OData Service URL supplied during application generation. In order to run the application with Mock Data, run the following from the generated app root folder:
```
npm run start-mock
```
#### Pre-requisites:
1. Active NodeJS LTS (Long Term Support) version and associated supported NPM version. (See https://nodejs.org)
+5
View File
@@ -0,0 +1,5 @@
import fioriTools from '@sap-ux/eslint-plugin-fiori-tools';
export default [
...fioriTools.configs.recommended
];
+11164
View File
File diff suppressed because it is too large Load Diff
+39
View File
@@ -0,0 +1,39 @@
{
"name": "com.minicircuits.arenaplm",
"version": "0.0.1",
"description": "An SAP Fiori application.",
"keywords": [
"ui5",
"openui5",
"sapui5"
],
"main": "webapp/index.html",
"dependencies": {},
"devDependencies": {
"@ui5/cli": "^4.0.33",
"@sap/ux-ui5-tooling": "1",
"@sap-ux/eslint-plugin-fiori-tools": "^10.0.0",
"eslint": "^10",
"@sapui5/types": "~1.152.0",
"ui5-tooling-transpile": "^3.10.0",
"typescript": "^5.9.3",
"@sap-ux/ui5-middleware-fe-mockserver": "2"
},
"scripts": {
"start": "echo \\\"This application was generated with a local metadata file and does not reference a live server. Please add the required server configuration or start this application with mock data using the target: `npm run start-mock`.\\\"",
"start-local": "fiori run --config ./ui5-local.yaml --open \"test/flp.html#app-preview\"",
"build": "ui5 build --config=ui5.yaml --clean-dest --dest dist",
"lint": "eslint ./",
"ts-typecheck": "tsc --noEmit",
"prestart": "npm run ts-typecheck",
"prebuild": "npm run ts-typecheck",
"start-mock": "fiori run --config ./ui5-mock.yaml --port 8082 --open \"test/flp.html#app-preview\"",
"deploy": "fiori verify",
"deploy-config": "fiori add deploy-config",
"start-noflp": "echo \\\"This application was generated with a local metadata file and does not reference a live server. Please add the required server configuration or start this application with mock data using the target: `npm run start-mock`.\\\"",
"int-test": "fiori run --config ./ui5-mock.yaml --port 8082 --open \"/test/integration/opaTests.qunit.html\"",
"start-variants-management": "echo \\\"This application was generated with a local metadata file and does not reference a live server. Please add the required server configuration or start this application with mock data using the target: `npm run start-mock`.\\\""
},
"sapuxLayer": "CUSTOMER_BASE",
"sapux": true
}
+26
View File
@@ -0,0 +1,26 @@
{
"compilerOptions": {
"target": "es2022",
"module": "es2022",
"skipLibCheck": true,
"allowJs": true,
"strict": true,
"strictPropertyInitialization": false,
"moduleResolution": "node",
"rootDir": "./webapp",
"outDir": "./dist",
"baseUrl": "./",
"paths": {
"com/minicircuits/arenaplm/*": [
"./webapp/*"
]
},
"typeRoots": [
"./node_modules/@types",
"./node_modules/@sapui5/types"
]
},
"include": [
"./webapp/**/*"
]
}
+62
View File
@@ -0,0 +1,62 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "4.0"
metadata:
name: com.minicircuits.arenaplm
type: application
framework:
name: SAPUI5
version: 1.152.0
libraries:
- name: sap.m
- name: sap.ui.core
- name: sap.fe.templates
- name: sap.ushell
- name: themelib_sap_horizon
server:
customMiddleware:
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: ui5-tooling-transpile-middleware
afterMiddleware: compression
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
excludePatterns:
- /Component-preload.js
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertErrors: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
backend: []
- name: sap-fe-mockserver
beforeMiddleware: csp
configuration:
mountPath: /
services:
- urlPath: /sap/opu/odata4/sap/zui_arena_change_approval_o4/srvd/sap/zui_arena_change_approval/0001/
metadataPath: ./webapp/localService/mainService/metadata.xml
mockdataPath: ./webapp/localService/mainService/data
generateMockData: false
builder:
resources:
excludes:
- /test/**
- /localService/**
customTasks:
- name: ui5-tooling-transpile-task
afterTask: replaceVersion
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
+62
View File
@@ -0,0 +1,62 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "4.0"
metadata:
name: com.minicircuits.arenaplm
type: application
server:
customMiddleware:
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertErrors: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
ui5:
path:
- /resources
- /test-resources
url: https://ui5.sap.com
backend: []
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon
test:
- framework: OPA5
path: /test/integration/opaTests.qunit.html
- framework: Testsuite
- name: ui5-tooling-transpile-middleware
afterMiddleware: compression
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
excludePatterns:
- /Component-preload.js
- name: sap-fe-mockserver
beforeMiddleware: csp
configuration:
mountPath: /
services:
- urlPath: /sap/opu/odata4/sap/zui_arena_change_approval_o4/srvd/sap/zui_arena_change_approval/0001/
metadataPath: ./webapp/localService/mainService/metadata.xml
mockdataPath: ./webapp/localService/mainService/data
generateMockData: false
builder:
resources:
excludes:
- /test/**
- /localService/**
customTasks:
- name: ui5-tooling-transpile-task
afterTask: replaceVersion
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
+49
View File
@@ -0,0 +1,49 @@
# yaml-language-server: $schema=https://sap.github.io/ui5-tooling/schema/ui5.yaml.json
specVersion: "4.0"
metadata:
name: com.minicircuits.arenaplm
type: application
server:
customMiddleware:
- name: fiori-tools-proxy
afterMiddleware: compression
configuration:
ignoreCertErrors: false # If set to true, certificate errors will be ignored. E.g. self-signed certificates will be accepted
ui5:
path:
- /resources
- /test-resources
url: https://ui5.sap.com
backend: []
- name: fiori-tools-appreload
afterMiddleware: compression
configuration:
port: 35729
path: webapp
delay: 300
- name: fiori-tools-preview
afterMiddleware: fiori-tools-appreload
configuration:
flp:
theme: sap_horizon
- name: ui5-tooling-transpile-middleware
afterMiddleware: compression
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
excludePatterns:
- /Component-preload.js
builder:
resources:
excludes:
- /test/**
- /localService/**
customTasks:
- name: ui5-tooling-transpile-task
afterTask: replaceVersion
configuration:
debug: true
transformModulesToUI5:
overridesToOverride: true
+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;
};