Sync current sources: clean RAP handover names, app rebind, tooling
Working-tree state as of 2026-09-29, uncommitted since the initial "upload current sources" commit: - docs/handover/rap/: renamed the 11 generator-suffixed sources (zz*000) to the clean object names built on the tenant, plus the A2X leg and parameter-entity edits. - app/: manifest, annotations, i18n, mock data and local/mock ui5 configs updated to the live service shape. - PRD.md, CHANGELOG.md, KNOWLEDGE.md: build record through 2026-09-19, including the rejected reentrance-ticket path. - tools/adt-reentrance-login/: retained login helper (new). - docs/v2/zui_arena_change_appr_o4.metadata.xml: captured live $metadata (new). - Dropped a stray 0.3GB-class Eclipse installer that the initial commit had tracked under a URL-mangled filename, and the machine-specific 0M7DEJI.code-workspace. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
+41
-24
@@ -17,42 +17,55 @@
|
||||
|**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)
|
||||
## Service binding (live, reconciled 2026-09-16 - PRD V-2)
|
||||
|
||||
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`:
|
||||
The single source of truth for the service identity is the live `$metadata` of the published
|
||||
binding, captured 2026-09-16 as `docs/v2/zui_arena_change_appr_o4.metadata.xml` (repo root).
|
||||
`webapp/localService/mainService/metadata.xml` is a **byte-identical copy** of it, so the mock
|
||||
server serves the real contract. Refresh both together; never hand-edit the copy.
|
||||
|
||||
| Item | Value |
|
||||
|---|---|
|
||||
| Service binding (OData V4 - UI) | `ZUI_ARENA_CHANGE_APPROVAL_O4` |
|
||||
| Service binding (OData V4 - UI) | `ZUI_ARENA_CHANGE_APPR_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` |
|
||||
| Service URL | `/sap/opu/odata4/sap/zui_arena_change_appr_o4/srvd/sap/zui_arena_change_approval/0001/` |
|
||||
| Schema namespace / alias | `com.sap.gateway.srvd.zui_arena_change_approval.v0001` / `SAP__self` |
|
||||
| Entity type / entity set | `ChangeApprovalType` / `ChangeApproval` |
|
||||
| Bound actions | `approve`, `reject(RejectReason)`, `retrySync` |
|
||||
|
||||
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].
|
||||
Only the first URL segment comes from the service **binding** name. The schema namespace comes
|
||||
from the service **definition** name, and the entity type carries a `Type` suffix without an
|
||||
underscore (live `$metadata`, 2026-09-16; see `KNOWLEDGE.md`). The pre-V-2 assumption of a
|
||||
binding-derived namespace and a `_Type` suffix was wrong.
|
||||
|
||||
`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.
|
||||
`webapp/manifest.json` (`sap.app.dataSources.mainService.uri`), `ui5-mock.yaml` /
|
||||
`ui5-local.yaml` (`sap-fe-mockserver` `urlPath`) 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.**
|
||||
**Annotation layering.** The backend metadata extension already emits most UI annotations
|
||||
(LineItem, HeaderInfo, Facets, FieldGroups, Identification, SelectionFields, SemanticKey,
|
||||
`Status` text with `TextOnly`). An annotation in `annotation.xml` replaces the backend annotation
|
||||
with the same term + qualifier on the same target, and deleting it there makes the backend one
|
||||
effective again [source: fiori-mcp-server "Visualizing and Managing Annotations with SAP Fiori
|
||||
Tools - Service Modeler", verified 2026-09-16].
|
||||
|
||||
**Backend for a non-mock run: not configured.** `ui5.yaml` and `ui5-local.yaml` carry
|
||||
`fiori-tools-proxy` with `backend: []`, and `npm start` is a generator placeholder. When a live
|
||||
preview is added, the backend is the **UI host** `https://my431353.s4hana.cloud.sap`, never the
|
||||
`-api` host: a business-user call there is blocked by UCON (live 2026-09-16, `KNOWLEDGE.md`).
|
||||
|
||||
## 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).
|
||||
`FAILED -> retrySync -> APPROVED`. `approve`/`reject` are enabled only for `PENDING`,
|
||||
`retrySync` only for `FAILED`. The backend owns enablement: RAP emits
|
||||
`Core.OperationAvailable Path="_it/__OperationControl/<action>"` for the `( features : instance )`
|
||||
actions (PRD RAP-1), and the app keeps no local `OperationAvailable`, which would replace it
|
||||
[source: fiori-mcp-server "Action Control for Context-Dependent Actions (SAP Fiori Elements)",
|
||||
verified 2026-09-16]. `IsApprovable` / `IsRetriable` are still in the service but hidden, and
|
||||
nothing in the app binds to them.
|
||||
Actions are offered on the object page header only; the list report table is display-only
|
||||
(`selectionMode: "None"`).
|
||||
|
||||
@@ -68,7 +81,11 @@ required for a custom app (only `archeType` is mandatory)
|
||||
|
||||
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.
|
||||
(`generateMockData: false`), 8 rows covering every status. Each row carries every live property:
|
||||
`StatusText` / `StatusCriticality` as `ZR_CHANGEAPPROVAL` computes them, `__OperationControl`
|
||||
consistent with the status, `LocalLastChangedAt`, and `SAP__Messages: []`. Initial CHAR values are
|
||||
`""`, not `null`, on `Nullable="false"` properties. The mock server does not execute bound
|
||||
actions (see `KNOWLEDGE.md`), so status transitions show only against the live service.
|
||||
|
||||
## app
|
||||
|
||||
|
||||
Reference in New Issue
Block a user