@linkup-ai/abap-ai 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +384 -0
- package/dist/adt-client.js +364 -0
- package/dist/cli/activate.js +113 -0
- package/dist/cli/init.js +333 -0
- package/dist/cli/remove.js +80 -0
- package/dist/cli/status.js +229 -0
- package/dist/cli/systems.js +68 -0
- package/dist/cli.js +81 -0
- package/dist/index.js +1318 -0
- package/dist/knowledge/abap/abap-dictionary.md +199 -0
- package/dist/knowledge/abap/abap-sql.md +296 -0
- package/dist/knowledge/abap/amdp.md +273 -0
- package/dist/knowledge/abap/clean-code.md +293 -0
- package/dist/knowledge/abap/cloud-background-processing.md +250 -0
- package/dist/knowledge/abap/cloud-communication.md +265 -0
- package/dist/knowledge/abap/cloud-development.md +176 -0
- package/dist/knowledge/abap/cloud-extensibility.md +252 -0
- package/dist/knowledge/abap/cloud-released-apis.md +261 -0
- package/dist/knowledge/abap/constructor-expressions.md +289 -0
- package/dist/knowledge/abap/enhancements.md +232 -0
- package/dist/knowledge/abap/exceptions.md +271 -0
- package/dist/knowledge/abap/internal-tables.md +205 -0
- package/dist/knowledge/abap/object-orientation.md +298 -0
- package/dist/knowledge/abap/performance.md +216 -0
- package/dist/knowledge/abap/rap-abstract-entities.md +206 -0
- package/dist/knowledge/abap/rap-business-events.md +216 -0
- package/dist/knowledge/abap/rap-draft.md +191 -0
- package/dist/knowledge/abap/rap-eml.md +453 -0
- package/dist/knowledge/abap/rap-end-to-end.md +486 -0
- package/dist/knowledge/abap/rap-feature-control.md +185 -0
- package/dist/knowledge/abap/rap-numbering.md +280 -0
- package/dist/knowledge/abap/rap-service-exposure.md +163 -0
- package/dist/knowledge/abap/rap-unmanaged.md +468 -0
- package/dist/knowledge/abap/string-processing.md +180 -0
- package/dist/knowledge/abap/unit-testing.md +303 -0
- package/dist/knowledge/abap-cds/access-control.md +241 -0
- package/dist/knowledge/abap-cds/annotations.md +331 -0
- package/dist/knowledge/abap-cds/associations.md +254 -0
- package/dist/knowledge/abap-cds/expressions.md +230 -0
- package/dist/knowledge/abap-cds/functions.md +245 -0
- package/dist/knowledge/abap-cds/metadata-extensions.md +294 -0
- package/dist/knowledge/cap/authentication.md +278 -0
- package/dist/knowledge/cap/cdl-syntax.md +247 -0
- package/dist/knowledge/cap/cql-queries.md +266 -0
- package/dist/knowledge/cap/deployment.md +343 -0
- package/dist/knowledge/cap/event-handlers.md +287 -0
- package/dist/knowledge/cap/fiori-integration.md +303 -0
- package/dist/knowledge/cap/service-definitions.md +287 -0
- package/dist/knowledge/fiori/annotations.md +347 -0
- package/dist/knowledge/fiori/deployment.md +340 -0
- package/dist/knowledge/fiori/fiori-elements.md +332 -0
- package/dist/knowledge/fiori/fiori-side-effects.md +107 -0
- package/dist/knowledge/fiori/fiori-valuelist.md +144 -0
- package/dist/knowledge/fiori/ui5-controllers.md +358 -0
- package/dist/knowledge/fiori/ui5-data-binding.md +311 -0
- package/dist/knowledge/fiori/ui5-fragments-dialogs.md +330 -0
- package/dist/knowledge/fiori/ui5-manifest.md +411 -0
- package/dist/knowledge/fiori/ui5-routing.md +303 -0
- package/dist/knowledge/fiori/ui5-xml-views.md +294 -0
- package/dist/logger.js +114 -0
- package/dist/system-profile.js +207 -0
- package/dist/tools/abap-doc.js +72 -0
- package/dist/tools/abapgit.js +161 -0
- package/dist/tools/activate.js +68 -0
- package/dist/tools/atc-check.js +117 -0
- package/dist/tools/auth-object.js +56 -0
- package/dist/tools/breakpoints.js +76 -0
- package/dist/tools/call-hierarchy.js +84 -0
- package/dist/tools/cds-annotations.js +98 -0
- package/dist/tools/cds-dependencies.js +65 -0
- package/dist/tools/check.js +47 -0
- package/dist/tools/code-completion.js +70 -0
- package/dist/tools/code-coverage.js +111 -0
- package/dist/tools/create-amdp.js +111 -0
- package/dist/tools/create-dcl.js +81 -0
- package/dist/tools/create-transport.js +38 -0
- package/dist/tools/create.js +285 -0
- package/dist/tools/data-preview.js +37 -0
- package/dist/tools/delete.js +45 -0
- package/dist/tools/deploy-bsp.js +298 -0
- package/dist/tools/discovery.js +59 -0
- package/dist/tools/element-info.js +93 -0
- package/dist/tools/enhancements.js +186 -0
- package/dist/tools/extract-method.js +44 -0
- package/dist/tools/function-group.js +59 -0
- package/dist/tools/knowledge.js +275 -0
- package/dist/tools/lock-object.js +75 -0
- package/dist/tools/message-class.js +67 -0
- package/dist/tools/navigate.js +80 -0
- package/dist/tools/number-range.js +57 -0
- package/dist/tools/object-documentation.js +43 -0
- package/dist/tools/object-structure.js +78 -0
- package/dist/tools/object-versions.js +57 -0
- package/dist/tools/package-contents.js +60 -0
- package/dist/tools/pretty-printer.js +35 -0
- package/dist/tools/publish-binding.js +49 -0
- package/dist/tools/quick-fix.js +69 -0
- package/dist/tools/read.js +167 -0
- package/dist/tools/refactor-rename.js +60 -0
- package/dist/tools/release-transport.js +24 -0
- package/dist/tools/released-apis.js +51 -0
- package/dist/tools/repository-tree.js +90 -0
- package/dist/tools/scaffold-rap.js +642 -0
- package/dist/tools/search.js +73 -0
- package/dist/tools/shared/data-format.js +101 -0
- package/dist/tools/sql-console.js +17 -0
- package/dist/tools/system-info.js +270 -0
- package/dist/tools/traces.js +66 -0
- package/dist/tools/transport-contents.js +83 -0
- package/dist/tools/transports.js +67 -0
- package/dist/tools/unit-test.js +135 -0
- package/dist/tools/where-used.js +59 -0
- package/dist/tools/write.js +101 -0
- package/package.json +49 -0
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
# Fiori Annotations — XML and CDS Reference
|
|
2
|
+
|
|
3
|
+
## XML Annotation File Setup
|
|
4
|
+
|
|
5
|
+
```json
|
|
6
|
+
// manifest.json — dataSources configuration
|
|
7
|
+
{
|
|
8
|
+
"sap.app": {
|
|
9
|
+
"dataSources": {
|
|
10
|
+
"mainService": {
|
|
11
|
+
"uri": "/sap/opu/odata/sap/SERVICE/",
|
|
12
|
+
"type": "OData",
|
|
13
|
+
"settings": {
|
|
14
|
+
"localUri": "localService/metadata.xml",
|
|
15
|
+
"annotations": ["annotation"]
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"annotation": {
|
|
19
|
+
"type": "ODataAnnotation",
|
|
20
|
+
"uri": "annotations/annotation.xml"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
File location: `webapp/annotations/annotation.xml`
|
|
28
|
+
|
|
29
|
+
Prerequisites: local metadata.xml copy, single `EntityContainer`, valid `<edmx:DataServices/Schema>` nodes.
|
|
30
|
+
|
|
31
|
+
## LineItem — Table Columns
|
|
32
|
+
|
|
33
|
+
```xml
|
|
34
|
+
<Annotations Target="Namespace.EntityType">
|
|
35
|
+
<Annotation Term="UI.LineItem">
|
|
36
|
+
<Collection>
|
|
37
|
+
<Record Type="UI.DataField">
|
|
38
|
+
<PropertyValue Property="Value" Path="PropertyName"/>
|
|
39
|
+
<PropertyValue Property="Label" String="Column Label"/>
|
|
40
|
+
</Record>
|
|
41
|
+
<Record Type="UI.DataField">
|
|
42
|
+
<PropertyValue Property="Value" Path="Price"/>
|
|
43
|
+
<PropertyValue Property="Criticality" Path="PriceCriticality"/>
|
|
44
|
+
</Record>
|
|
45
|
+
<Record Type="UI.DataFieldForAnnotation">
|
|
46
|
+
<PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#Rating"/>
|
|
47
|
+
<PropertyValue Property="Label" String="Rating"/>
|
|
48
|
+
</Record>
|
|
49
|
+
<Record Type="UI.DataFieldForAction">
|
|
50
|
+
<PropertyValue Property="Label" String="Approve"/>
|
|
51
|
+
<PropertyValue Property="Action" String="Namespace.Approve"/>
|
|
52
|
+
</Record>
|
|
53
|
+
</Collection>
|
|
54
|
+
</Annotation>
|
|
55
|
+
</Annotations>
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## SelectionFields — Filter Bar
|
|
59
|
+
|
|
60
|
+
```xml
|
|
61
|
+
<Annotation Term="UI.SelectionFields">
|
|
62
|
+
<Collection>
|
|
63
|
+
<PropertyPath>Property1</PropertyPath>
|
|
64
|
+
<PropertyPath>Property2</PropertyPath>
|
|
65
|
+
<PropertyPath>Property3</PropertyPath>
|
|
66
|
+
</Collection>
|
|
67
|
+
</Annotation>
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
## HeaderInfo — Object Page Title Area
|
|
71
|
+
|
|
72
|
+
```xml
|
|
73
|
+
<Annotation Term="UI.HeaderInfo">
|
|
74
|
+
<Record Type="UI.HeaderInfoType">
|
|
75
|
+
<PropertyValue Property="TypeName" String="Sales Order"/>
|
|
76
|
+
<PropertyValue Property="TypeNamePlural" String="Sales Orders"/>
|
|
77
|
+
<PropertyValue Property="Title">
|
|
78
|
+
<Record Type="UI.DataField">
|
|
79
|
+
<PropertyValue Property="Value" Path="OrderID"/>
|
|
80
|
+
</Record>
|
|
81
|
+
</PropertyValue>
|
|
82
|
+
<PropertyValue Property="Description">
|
|
83
|
+
<Record Type="UI.DataField">
|
|
84
|
+
<PropertyValue Property="Value" Path="CustomerName"/>
|
|
85
|
+
</Record>
|
|
86
|
+
</PropertyValue>
|
|
87
|
+
<PropertyValue Property="ImageUrl" Path="ProductImage"/>
|
|
88
|
+
</Record>
|
|
89
|
+
</Annotation>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Facets — Object Page Sections
|
|
93
|
+
|
|
94
|
+
```xml
|
|
95
|
+
<Annotation Term="UI.Facets">
|
|
96
|
+
<Collection>
|
|
97
|
+
<!-- Grouped section with sub-facets -->
|
|
98
|
+
<Record Type="UI.CollectionFacet">
|
|
99
|
+
<PropertyValue Property="Label" String="General"/>
|
|
100
|
+
<PropertyValue Property="ID" String="GeneralSection"/>
|
|
101
|
+
<PropertyValue Property="Facets">
|
|
102
|
+
<Collection>
|
|
103
|
+
<Record Type="UI.ReferenceFacet">
|
|
104
|
+
<PropertyValue Property="Target"
|
|
105
|
+
AnnotationPath="@UI.FieldGroup#Basic"/>
|
|
106
|
+
</Record>
|
|
107
|
+
<Record Type="UI.ReferenceFacet">
|
|
108
|
+
<PropertyValue Property="Target"
|
|
109
|
+
AnnotationPath="@UI.FieldGroup#Dates"/>
|
|
110
|
+
</Record>
|
|
111
|
+
</Collection>
|
|
112
|
+
</PropertyValue>
|
|
113
|
+
</Record>
|
|
114
|
+
<!-- Navigation property table section -->
|
|
115
|
+
<Record Type="UI.ReferenceFacet">
|
|
116
|
+
<PropertyValue Property="Label" String="Items"/>
|
|
117
|
+
<PropertyValue Property="ID" String="ItemsSection"/>
|
|
118
|
+
<PropertyValue Property="Target"
|
|
119
|
+
AnnotationPath="to_Items/@UI.LineItem"/>
|
|
120
|
+
</Record>
|
|
121
|
+
</Collection>
|
|
122
|
+
</Annotation>
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## FieldGroup — Grouped Form Fields
|
|
126
|
+
|
|
127
|
+
```xml
|
|
128
|
+
<Annotation Term="UI.FieldGroup" Qualifier="Basic">
|
|
129
|
+
<Record Type="UI.FieldGroupType">
|
|
130
|
+
<PropertyValue Property="Data">
|
|
131
|
+
<Collection>
|
|
132
|
+
<Record Type="UI.DataField">
|
|
133
|
+
<PropertyValue Property="Value" Path="OrderID"/>
|
|
134
|
+
</Record>
|
|
135
|
+
<Record Type="UI.DataField">
|
|
136
|
+
<PropertyValue Property="Value" Path="Status"/>
|
|
137
|
+
<PropertyValue Property="Criticality" Path="StatusCriticality"/>
|
|
138
|
+
</Record>
|
|
139
|
+
<Record Type="UI.DataFieldWithUrl">
|
|
140
|
+
<PropertyValue Property="Value" Path="WebsiteUrl"/>
|
|
141
|
+
<PropertyValue Property="Url" Path="WebsiteUrl"/>
|
|
142
|
+
</Record>
|
|
143
|
+
</Collection>
|
|
144
|
+
</PropertyValue>
|
|
145
|
+
</Record>
|
|
146
|
+
</Annotation>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
## DataPoint — KPI / Header Values
|
|
150
|
+
|
|
151
|
+
```xml
|
|
152
|
+
<Annotation Term="UI.DataPoint" Qualifier="Revenue">
|
|
153
|
+
<Record Type="UI.DataPointType">
|
|
154
|
+
<PropertyValue Property="Value" Path="TotalRevenue"/>
|
|
155
|
+
<PropertyValue Property="Title" String="Revenue"/>
|
|
156
|
+
<PropertyValue Property="Criticality" Path="RevenueCriticality"/>
|
|
157
|
+
<PropertyValue Property="TargetValue" Path="RevenueTarget"/>
|
|
158
|
+
<PropertyValue Property="Visualization"
|
|
159
|
+
EnumMember="UI.VisualizationType/Progress"/>
|
|
160
|
+
</Record>
|
|
161
|
+
</Annotation>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## ValueList — Value Help (F4)
|
|
165
|
+
|
|
166
|
+
```xml
|
|
167
|
+
<Annotations Target="Namespace.EntityType/CategoryID">
|
|
168
|
+
<Annotation Term="Common.ValueList">
|
|
169
|
+
<Record Type="Common.ValueListType">
|
|
170
|
+
<PropertyValue Property="CollectionPath" String="Categories"/>
|
|
171
|
+
<PropertyValue Property="Parameters">
|
|
172
|
+
<Collection>
|
|
173
|
+
<Record Type="Common.ValueListParameterInOut">
|
|
174
|
+
<PropertyValue Property="LocalDataProperty"
|
|
175
|
+
PropertyPath="CategoryID"/>
|
|
176
|
+
<PropertyValue Property="ValueListProperty" String="ID"/>
|
|
177
|
+
</Record>
|
|
178
|
+
<Record Type="Common.ValueListParameterDisplayOnly">
|
|
179
|
+
<PropertyValue Property="ValueListProperty"
|
|
180
|
+
String="Description"/>
|
|
181
|
+
</Record>
|
|
182
|
+
</Collection>
|
|
183
|
+
</PropertyValue>
|
|
184
|
+
</Record>
|
|
185
|
+
</Annotation>
|
|
186
|
+
</Annotations>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
## Common.Text — Display Text for Coded Values
|
|
190
|
+
|
|
191
|
+
```xml
|
|
192
|
+
<Annotations Target="Namespace.EntityType/StatusCode">
|
|
193
|
+
<Annotation Term="Common.Text" Path="StatusText"/>
|
|
194
|
+
<Annotation Term="Common.TextArrangement"
|
|
195
|
+
EnumMember="UI.TextArrangementType/TextFirst"/>
|
|
196
|
+
</Annotations>
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
## Chart
|
|
200
|
+
|
|
201
|
+
```xml
|
|
202
|
+
<Annotation Term="UI.Chart" Qualifier="SalesChart">
|
|
203
|
+
<Record Type="UI.ChartDefinitionType">
|
|
204
|
+
<PropertyValue Property="Title" String="Sales Overview"/>
|
|
205
|
+
<PropertyValue Property="ChartType" EnumMember="UI.ChartType/Column"/>
|
|
206
|
+
<PropertyValue Property="Dimensions">
|
|
207
|
+
<Collection><PropertyPath>Region</PropertyPath></Collection>
|
|
208
|
+
</PropertyValue>
|
|
209
|
+
<PropertyValue Property="DimensionAttributes">
|
|
210
|
+
<Collection>
|
|
211
|
+
<Record Type="UI.ChartDimensionAttributeType">
|
|
212
|
+
<PropertyValue Property="Dimension" PropertyPath="Region"/>
|
|
213
|
+
<PropertyValue Property="Role"
|
|
214
|
+
EnumMember="UI.ChartDimensionRoleType/Category"/>
|
|
215
|
+
</Record>
|
|
216
|
+
</Collection>
|
|
217
|
+
</PropertyValue>
|
|
218
|
+
<PropertyValue Property="Measures">
|
|
219
|
+
<Collection><PropertyPath>Amount</PropertyPath></Collection>
|
|
220
|
+
</PropertyValue>
|
|
221
|
+
<PropertyValue Property="MeasureAttributes">
|
|
222
|
+
<Collection>
|
|
223
|
+
<Record Type="UI.ChartMeasureAttributeType">
|
|
224
|
+
<PropertyValue Property="Measure" PropertyPath="Amount"/>
|
|
225
|
+
<PropertyValue Property="Role"
|
|
226
|
+
EnumMember="UI.ChartMeasureRoleType/Axis1"/>
|
|
227
|
+
</Record>
|
|
228
|
+
</Collection>
|
|
229
|
+
</PropertyValue>
|
|
230
|
+
</Record>
|
|
231
|
+
</Annotation>
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
## CDS Equivalents (CAP)
|
|
235
|
+
|
|
236
|
+
```cds
|
|
237
|
+
annotate CatalogService.Orders with @(
|
|
238
|
+
UI: {
|
|
239
|
+
SelectionFields: [ status, customer, createdAt ],
|
|
240
|
+
LineItem: [
|
|
241
|
+
{ Value: orderNo },
|
|
242
|
+
{ Value: customer, Label: 'Customer' },
|
|
243
|
+
{ Value: totalAmount },
|
|
244
|
+
{ Value: status, Criticality: statusCriticality },
|
|
245
|
+
{ $Type: 'UI.DataFieldForAction', Action: 'approve', Label: 'Approve' }
|
|
246
|
+
],
|
|
247
|
+
HeaderInfo: {
|
|
248
|
+
TypeName: 'Order',
|
|
249
|
+
TypeNamePlural: 'Orders',
|
|
250
|
+
Title: { Value: orderNo },
|
|
251
|
+
Description: { Value: customer }
|
|
252
|
+
},
|
|
253
|
+
Facets: [
|
|
254
|
+
{
|
|
255
|
+
$Type: 'UI.CollectionFacet', ID: 'General', Label: 'General',
|
|
256
|
+
Facets: [
|
|
257
|
+
{ $Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#Main' }
|
|
258
|
+
]
|
|
259
|
+
},
|
|
260
|
+
{ $Type: 'UI.ReferenceFacet', Target: 'items/@UI.LineItem', Label: 'Items' }
|
|
261
|
+
],
|
|
262
|
+
FieldGroup#Main: {
|
|
263
|
+
Data: [
|
|
264
|
+
{ Value: orderNo },
|
|
265
|
+
{ Value: status, Criticality: statusCriticality },
|
|
266
|
+
{ Value: totalAmount }
|
|
267
|
+
]
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
);
|
|
271
|
+
|
|
272
|
+
// Value help
|
|
273
|
+
annotate CatalogService.Orders with {
|
|
274
|
+
status @Common.ValueList: {
|
|
275
|
+
CollectionPath: 'StatusCodes',
|
|
276
|
+
Parameters: [
|
|
277
|
+
{ $Type: 'Common.ValueListParameterInOut', LocalDataProperty: status,
|
|
278
|
+
ValueListProperty: 'code' },
|
|
279
|
+
{ $Type: 'Common.ValueListParameterDisplayOnly',
|
|
280
|
+
ValueListProperty: 'description' }
|
|
281
|
+
]
|
|
282
|
+
};
|
|
283
|
+
status @Common.Text: statusText @Common.TextArrangement: #TextFirst;
|
|
284
|
+
};
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Vocabulary Quick Reference
|
|
288
|
+
|
|
289
|
+
| Annotation | Purpose |
|
|
290
|
+
|---|---|
|
|
291
|
+
| `UI.LineItem` | Table columns |
|
|
292
|
+
| `UI.SelectionFields` | Filter bar fields |
|
|
293
|
+
| `UI.HeaderInfo` | Object page title/subtitle |
|
|
294
|
+
| `UI.HeaderFacets` | Object page header KPIs |
|
|
295
|
+
| `UI.Facets` | Object page sections |
|
|
296
|
+
| `UI.FieldGroup#Qualifier` | Form field grouping |
|
|
297
|
+
| `UI.DataPoint#Qualifier` | KPI / progress / rating |
|
|
298
|
+
| `UI.Chart` | Chart definition |
|
|
299
|
+
| `UI.PresentationVariant` | Default sort + visualization |
|
|
300
|
+
| `UI.SelectionVariant` | Default filter values |
|
|
301
|
+
| `UI.Identification` | Object page footer actions |
|
|
302
|
+
| `Common.Label` | Property display label |
|
|
303
|
+
| `Common.Text` | Display text for code/ID fields |
|
|
304
|
+
| `Common.TextArrangement` | Text display order (TextFirst, TextOnly) |
|
|
305
|
+
| `Common.ValueList` | Value help / F4 |
|
|
306
|
+
| `Common.SemanticObject` | Intent-based navigation target |
|
|
307
|
+
| `Common.DraftRoot` | Draft handling root entity |
|
|
308
|
+
| `Capabilities.InsertRestrictions` | Create permission |
|
|
309
|
+
| `Capabilities.UpdateRestrictions` | Edit permission |
|
|
310
|
+
| `Capabilities.DeleteRestrictions` | Delete permission |
|
|
311
|
+
| `Capabilities.FilterRestrictions` | Filter limitations |
|
|
312
|
+
|
|
313
|
+
## Criticality Values
|
|
314
|
+
|
|
315
|
+
| Value | CDS | Rendering |
|
|
316
|
+
|---|---|---|
|
|
317
|
+
| 0 | `Neutral` | Grey (default) |
|
|
318
|
+
| 1 | `Negative` | Red (error) |
|
|
319
|
+
| 2 | `Critical` | Orange (warning) |
|
|
320
|
+
| 3 | `Positive` | Green (success) |
|
|
321
|
+
| 5 | `Information` | Blue (info) |
|
|
322
|
+
|
|
323
|
+
## Rules
|
|
324
|
+
|
|
325
|
+
- Local annotation files override backend annotations (same term + qualifier + target)
|
|
326
|
+
- Annotation file must be referenced in `manifest.json` `dataSources.*.settings.annotations`
|
|
327
|
+
- Use `Qualifier` to define multiple instances of same annotation term (e.g., `FieldGroup#Basic`, `FieldGroup#Dates`)
|
|
328
|
+
- `Path` resolves at runtime from entity data; `String` is static text
|
|
329
|
+
- `PropertyPath` is used inside `Collection` elements; `Path` is used inside `Record` property values
|
|
330
|
+
- `AnnotationPath` navigates to other annotations (e.g., `@UI.FieldGroup#Basic`)
|
|
331
|
+
- Navigation properties in annotation paths use `/` separator: `to_Items/@UI.LineItem`
|
|
332
|
+
- Always pair `Common.Text` with `Common.TextArrangement` for readable ID fields
|
|
333
|
+
- i18n keys: use camelCase for non-CAP, PascalCase for CAP projects
|
|
334
|
+
- Handle i18n externalization near project end to minimize unused entries
|
|
335
|
+
|
|
336
|
+
## Anti-Patterns
|
|
337
|
+
|
|
338
|
+
| Anti-Pattern | Correct Approach |
|
|
339
|
+
|---|---|
|
|
340
|
+
| Editing backend annotation files directly | Create local annotation overrides |
|
|
341
|
+
| Missing `Common.Text` on code/ID fields | Always add `Text` + `TextArrangement` |
|
|
342
|
+
| Using `String` for dynamic values | Use `Path` to bind to entity properties |
|
|
343
|
+
| Omitting `Qualifier` on multiple FieldGroups | Each FieldGroup needs unique qualifier |
|
|
344
|
+
| Putting actions in `UI.FieldGroup` | Use `UI.DataFieldForAction` in `LineItem` or `Identification` |
|
|
345
|
+
| Defining ValueList without `InOut` parameter | At least one `ValueListParameterInOut` required |
|
|
346
|
+
| Annotations in metadata.xml directly | Use separate annotation.xml files |
|
|
347
|
+
| Ignoring diagnostics warnings in IDE | Fix all warnings before deployment |
|
|
@@ -0,0 +1,340 @@
|
|
|
1
|
+
# Fiori Deployment — ABAP and Cloud Foundry
|
|
2
|
+
|
|
3
|
+
## ABAP Deployment — ui5-deploy.yaml
|
|
4
|
+
|
|
5
|
+
```yaml
|
|
6
|
+
specVersion: "2.4"
|
|
7
|
+
metadata:
|
|
8
|
+
name: project-name
|
|
9
|
+
type: application
|
|
10
|
+
builder:
|
|
11
|
+
resources:
|
|
12
|
+
excludes:
|
|
13
|
+
- /test/**
|
|
14
|
+
- /localService/**
|
|
15
|
+
deploy:
|
|
16
|
+
target:
|
|
17
|
+
url: https://system.example.com
|
|
18
|
+
client: "100"
|
|
19
|
+
scp: false
|
|
20
|
+
params:
|
|
21
|
+
sap-language: EN
|
|
22
|
+
app:
|
|
23
|
+
name: ZAPP_NAME
|
|
24
|
+
package: ZPACKAGE
|
|
25
|
+
description: Application description
|
|
26
|
+
transport: DEVK900123
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
```json
|
|
30
|
+
// package.json — deploy script
|
|
31
|
+
{
|
|
32
|
+
"scripts": {
|
|
33
|
+
"deploy": "fiori deploy --config ui5-deploy.yaml"
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```bash
|
|
39
|
+
# Generate deploy config
|
|
40
|
+
npx fiori add deploy-config
|
|
41
|
+
|
|
42
|
+
# Execute deployment
|
|
43
|
+
npm run deploy
|
|
44
|
+
|
|
45
|
+
# Undeploy
|
|
46
|
+
npx fiori undeploy --config ui5-deploy.yaml
|
|
47
|
+
|
|
48
|
+
# Debug deployment issues
|
|
49
|
+
DEBUG=ux-odata-client npm run deploy
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### ABAP Prerequisites
|
|
53
|
+
|
|
54
|
+
| Requirement | Minimum |
|
|
55
|
+
|---|---|
|
|
56
|
+
| SAP_UI Component | 7.53+ |
|
|
57
|
+
| ABAP Repository Service | `/sap/opu/odata/UI5/ABAP_REPOSITORY_SRV` active |
|
|
58
|
+
| Authorization | `S_DEVELOP` with required activities |
|
|
59
|
+
| Transport | Required unless `$TMP` / local package |
|
|
60
|
+
|
|
61
|
+
### Authentication
|
|
62
|
+
|
|
63
|
+
| Method | On-Premise | BTP ABAP |
|
|
64
|
+
|---|---|---|
|
|
65
|
+
| Basic Auth | Yes | No |
|
|
66
|
+
| Reentrance Ticket | No | Yes |
|
|
67
|
+
| OAuth 2.0 | No | Deprecated |
|
|
68
|
+
|
|
69
|
+
## Cloud Foundry Deployment — mta.yaml
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
_schema-version: "3.2"
|
|
73
|
+
ID: project-name
|
|
74
|
+
version: 0.0.1
|
|
75
|
+
modules:
|
|
76
|
+
- name: project-name-destination-content
|
|
77
|
+
type: com.sap.application.content
|
|
78
|
+
requires:
|
|
79
|
+
- name: project-name-destination-service
|
|
80
|
+
parameters:
|
|
81
|
+
content-target: true
|
|
82
|
+
- name: project-name-repo-host
|
|
83
|
+
parameters:
|
|
84
|
+
service-key:
|
|
85
|
+
name: project-name-repo-host-key
|
|
86
|
+
- name: project-name-uaa
|
|
87
|
+
parameters:
|
|
88
|
+
service-key:
|
|
89
|
+
name: project-name-uaa-key
|
|
90
|
+
parameters:
|
|
91
|
+
content:
|
|
92
|
+
instance:
|
|
93
|
+
destinations:
|
|
94
|
+
- Name: project-name-repo-host
|
|
95
|
+
ServiceInstanceName: project-name-html5-srv
|
|
96
|
+
ServiceKeyName: project-name-repo-host-key
|
|
97
|
+
sap.cloud.service: project-name
|
|
98
|
+
- Authentication: OAuth2UserTokenExchange
|
|
99
|
+
Name: project-name-uaa
|
|
100
|
+
ServiceInstanceName: project-name-xsuaa
|
|
101
|
+
ServiceKeyName: project-name-uaa-key
|
|
102
|
+
sap.cloud.service: project-name
|
|
103
|
+
existing_destinations_policy: update
|
|
104
|
+
|
|
105
|
+
- name: project-name
|
|
106
|
+
type: html5
|
|
107
|
+
path: .
|
|
108
|
+
build-parameters:
|
|
109
|
+
build-result: dist
|
|
110
|
+
builder: custom
|
|
111
|
+
commands:
|
|
112
|
+
- npm install
|
|
113
|
+
- npm run build:cf
|
|
114
|
+
|
|
115
|
+
resources:
|
|
116
|
+
- name: project-name-repo-host
|
|
117
|
+
type: org.cloudfoundry.managed-service
|
|
118
|
+
parameters:
|
|
119
|
+
service: html5-apps-repo
|
|
120
|
+
service-plan: app-host
|
|
121
|
+
- name: project-name-destination-service
|
|
122
|
+
type: org.cloudfoundry.managed-service
|
|
123
|
+
parameters:
|
|
124
|
+
service: destination
|
|
125
|
+
service-plan: lite
|
|
126
|
+
- name: project-name-uaa
|
|
127
|
+
type: org.cloudfoundry.managed-service
|
|
128
|
+
parameters:
|
|
129
|
+
service: xsuaa
|
|
130
|
+
service-plan: application
|
|
131
|
+
config:
|
|
132
|
+
xsappname: project-name
|
|
133
|
+
tenant-mode: dedicated
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### xs-app.json — App Router
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"welcomeFile": "/index.html",
|
|
141
|
+
"authenticationMethod": "route",
|
|
142
|
+
"routes": [
|
|
143
|
+
{
|
|
144
|
+
"source": "^/sap/opu/odata/(.*)$",
|
|
145
|
+
"target": "/sap/opu/odata/$1",
|
|
146
|
+
"destination": "backend-destination",
|
|
147
|
+
"authenticationType": "xsuaa"
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"source": "^(.*)$",
|
|
151
|
+
"target": "$1",
|
|
152
|
+
"service": "html5-apps-repo-rt",
|
|
153
|
+
"authenticationType": "xsuaa"
|
|
154
|
+
}
|
|
155
|
+
]
|
|
156
|
+
}
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
```bash
|
|
160
|
+
# CF prerequisites
|
|
161
|
+
npm install -g mta
|
|
162
|
+
cf install-plugin -r CF-Community "multiapps"
|
|
163
|
+
|
|
164
|
+
# Build MTA archive
|
|
165
|
+
mbt build
|
|
166
|
+
|
|
167
|
+
# Deploy to CF
|
|
168
|
+
cf deploy mta_archives/project-name_0.0.1.mtar
|
|
169
|
+
|
|
170
|
+
# Undeploy from CF
|
|
171
|
+
cf undeploy project-name --delete-services
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
## Fiori Launchpad Configuration
|
|
175
|
+
|
|
176
|
+
```json
|
|
177
|
+
// manifest.json — crossNavigation inbound
|
|
178
|
+
{
|
|
179
|
+
"sap.app": {
|
|
180
|
+
"crossNavigation": {
|
|
181
|
+
"inbounds": {
|
|
182
|
+
"intent1": {
|
|
183
|
+
"semanticObject": "Product",
|
|
184
|
+
"action": "display",
|
|
185
|
+
"title": "{{appTitle}}",
|
|
186
|
+
"subTitle": "{{appSubTitle}}",
|
|
187
|
+
"signature": {
|
|
188
|
+
"parameters": {},
|
|
189
|
+
"additionalParameters": "allowed"
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
```bash
|
|
199
|
+
# Generate FLP config
|
|
200
|
+
npx fiori add flp-config
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
| Parameter | Description | Example |
|
|
204
|
+
|---|---|---|
|
|
205
|
+
| Semantic Object | Business object identifier | `SalesOrder`, `Product` |
|
|
206
|
+
| Action | Navigation verb | `display`, `manage`, `create` |
|
|
207
|
+
| Title | Launchpad tile title | `Manage Products` |
|
|
208
|
+
| Subtitle | Tile subtitle (optional) | `Product Administration` |
|
|
209
|
+
|
|
210
|
+
## Complete manifest.json — Data Sources
|
|
211
|
+
|
|
212
|
+
```json
|
|
213
|
+
{
|
|
214
|
+
"sap.app": {
|
|
215
|
+
"id": "com.mycompany.products",
|
|
216
|
+
"type": "application",
|
|
217
|
+
"applicationVersion": { "version": "1.0.0" },
|
|
218
|
+
"dataSources": {
|
|
219
|
+
"mainService": {
|
|
220
|
+
"uri": "/sap/opu/odata/sap/PRODUCT_SRV/",
|
|
221
|
+
"type": "OData",
|
|
222
|
+
"settings": {
|
|
223
|
+
"annotations": ["annotation"],
|
|
224
|
+
"localUri": "localService/metadata.xml",
|
|
225
|
+
"odataVersion": "2.0"
|
|
226
|
+
}
|
|
227
|
+
},
|
|
228
|
+
"annotation": {
|
|
229
|
+
"type": "ODataAnnotation",
|
|
230
|
+
"uri": "annotations/annotation.xml",
|
|
231
|
+
"settings": {
|
|
232
|
+
"localUri": "annotations/annotation.xml"
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
"sap.ui5": {
|
|
238
|
+
"dependencies": {
|
|
239
|
+
"minUI5Version": "1.120.0",
|
|
240
|
+
"libs": { "sap.fe.templates": {} }
|
|
241
|
+
},
|
|
242
|
+
"models": {
|
|
243
|
+
"i18n": {
|
|
244
|
+
"type": "sap.ui.model.resource.ResourceModel",
|
|
245
|
+
"settings": {
|
|
246
|
+
"bundleName": "com.mycompany.products.i18n.i18n"
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
"": {
|
|
250
|
+
"dataSource": "mainService",
|
|
251
|
+
"preload": true,
|
|
252
|
+
"settings": {
|
|
253
|
+
"defaultBindingMode": "TwoWay",
|
|
254
|
+
"defaultCountMode": "Inline",
|
|
255
|
+
"refreshAfterChange": false
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
},
|
|
260
|
+
"sap.fiori": {
|
|
261
|
+
"registrationIds": [],
|
|
262
|
+
"archeType": "transactional"
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
## Required OData Services (ABAP)
|
|
268
|
+
|
|
269
|
+
| Service | Path |
|
|
270
|
+
|---|---|
|
|
271
|
+
| SAPUI5 Repository | `/sap/opu/odata/UI5/ABAP_REPOSITORY_SRV` |
|
|
272
|
+
| OData V2 Catalog | `/sap/opu/odata/IWFND/CATALOGSERVICE;v=2` |
|
|
273
|
+
| OData V4 Catalog (dev) | `/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0001` |
|
|
274
|
+
| OData V4 Catalog (prod) | `/sap/opu/odata4/iwfnd/config/default/iwfnd/catalog/0002` |
|
|
275
|
+
| ATO Settings | `/sap/bc/adt/ato/settings` |
|
|
276
|
+
|
|
277
|
+
## Transport Request Options
|
|
278
|
+
|
|
279
|
+
| Option | When to Use |
|
|
280
|
+
|---|---|
|
|
281
|
+
| Enter manually | Known transport ID |
|
|
282
|
+
| Choose from existing | Browse system transports |
|
|
283
|
+
| Create new | Generate during config |
|
|
284
|
+
| Create during deployment | Auto-create on first deploy |
|
|
285
|
+
|
|
286
|
+
## Project Structure (CF)
|
|
287
|
+
|
|
288
|
+
```
|
|
289
|
+
project/
|
|
290
|
+
├── webapp/
|
|
291
|
+
│ ├── manifest.json
|
|
292
|
+
│ ├── annotations/
|
|
293
|
+
│ │ └── annotation.xml
|
|
294
|
+
│ └── i18n/
|
|
295
|
+
│ └── i18n.properties
|
|
296
|
+
├── mta.yaml
|
|
297
|
+
├── xs-app.json
|
|
298
|
+
├── xs-security.json
|
|
299
|
+
├── ui5.yaml
|
|
300
|
+
├── ui5-deploy.yaml
|
|
301
|
+
└── package.json
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
## Rules
|
|
305
|
+
|
|
306
|
+
- Always exclude `/test/**` and `/localService/**` from deployment builds
|
|
307
|
+
- ABAP app name (`ZAPP_NAME`) must follow customer namespace (Z/Y prefix)
|
|
308
|
+
- Package must exist before deployment; transport must be modifiable
|
|
309
|
+
- For BTP ABAP, use reentrance tickets (not basic auth)
|
|
310
|
+
- CF deployment requires `mta` CLI v1.0+ and `multiapps` CF plugin
|
|
311
|
+
- Set `scp: false` for on-premise ABAP; `scp: true` for BTP ABAP Environment
|
|
312
|
+
- `crossNavigation.inbounds` is required for Fiori Launchpad tile registration
|
|
313
|
+
- Semantic object + action must be unique across the Fiori Launchpad
|
|
314
|
+
- Use `odataVersion: "2.0"` or `"4.0"` explicitly in dataSources settings
|
|
315
|
+
- `existing_destinations_policy: update` in mta.yaml prevents destination conflicts on redeploy
|
|
316
|
+
|
|
317
|
+
## Anti-Patterns
|
|
318
|
+
|
|
319
|
+
| Anti-Pattern | Correct Approach |
|
|
320
|
+
|---|---|
|
|
321
|
+
| Deploying without transport in non-local package | Always assign modifiable transport request |
|
|
322
|
+
| Using basic auth for BTP ABAP | Use reentrance tickets |
|
|
323
|
+
| Missing `localUri` for metadata | Always provide local metadata copy |
|
|
324
|
+
| Deploying test files to production | Exclude `/test/**` in builder resources |
|
|
325
|
+
| Hardcoding service URL in xs-app.json | Use BTP destination name |
|
|
326
|
+
| Omitting `crossNavigation` for launchpad apps | Add FLP config before deployment |
|
|
327
|
+
| Skipping `multiapps` plugin for CF deploy | Install: `cf install-plugin -r CF-Community "multiapps"` |
|
|
328
|
+
| Using `scp: true` for on-premise systems | Set `scp: false` for on-premise ABAP |
|
|
329
|
+
| Missing `html5-apps-repo` resource in mta.yaml | Required for HTML5 repository hosting |
|
|
330
|
+
| Deploying without checking `/IWFND/ERROR_LOG` on failures | Always check error log for 400 errors |
|
|
331
|
+
|
|
332
|
+
## Troubleshooting
|
|
333
|
+
|
|
334
|
+
| Issue | Check |
|
|
335
|
+
|---|---|
|
|
336
|
+
| Service activation error | SAP_UI 7.53+ installed? |
|
|
337
|
+
| HTTP 400 on deploy | `/IWFND/ERROR_LOG` in SAP GUI |
|
|
338
|
+
| Virus scan failure | `/IWFND/VIRUS_SCAN` config |
|
|
339
|
+
| Authorization error | `S_DEVELOP` authorization object |
|
|
340
|
+
| CF deploy fails | `cf login` active? `multiapps` plugin installed? |
|