// |
| name | sapui5 |
| description | This skill should be used when developing SAP UI5 applications, including creating freestyle apps, Fiori Elements apps, custom controls, testing, data binding, OData integration, routing, and troubleshooting. Use when building enterprise web applications with SAP UI5 framework, implementing MVC patterns, configuring manifest.json, creating XML views, writing controllers, setting up data models (JSON, OData v2/v4), implementing responsive UI with sap.m controls, building List Report or Object Page applications with Fiori Elements, writing unit tests with QUnit, integration tests with OPA5, setting up mock servers, handling security (XSS, CSP), optimizing performance, implementing accessibility features, or debugging UI5 applications. Also use when working with sap.ui.mdc (Metadata-Driven Controls) including MDC Table, MDC FilterBar, MDC Value Help, control delegates, PropertyInfo, TypeMap, VariantManagement, or developing TypeScript control libraries with @ui5/ts-interface-generator. Keywords: sapui5, ui5, openui5, sap ui5, ui5 framework, sapui5 framework, ui5 application, sapui5 app, ui5 development, sapui5 development, ui5 tooling, ui5 cli, Component.js, manifest.json, xml view, data binding, odata v2, odata v4, fiori elements, sap.m controls, mvc pattern, routing, navigation, qunit, opa5, testing, mock server, sap.ui.mdc, mdc table, typescript, accessibility, security, performance, ui5 inspector, ui5 troubleshooting |
| license | GPL-3.0 |
| metadata | {"version":"1.4.0","last_verified":"2025-11-27T00:00:00.000Z","framework_version":"1.120.0+","documentation_source":"https://github.com/SAP-docs/sapui5","documentation_files_analyzed":1416,"reference_files":11,"status":"production"} |
Comprehensive skill for building enterprise applications with SAP UI5 framework.
Use UI5 Tooling (recommended) or SAP Business Application Studio:
# Install UI5 CLI
npm install -g @ui5/cli
# Create new project
mkdir my-sapui5-app && cd my-sapui5-app
npm init -y
# Initialize UI5 project
ui5 init
# Add UI5 dependencies
npm install --save-dev @ui5/cli
# Start development server
ui5 serve
Project Structure:
my-sapui5-app/
โโโ webapp/
โ โโโ Component.js
โ โโโ manifest.json
โ โโโ index.html
โ โโโ controller/
โ โ โโโ Main.controller.js
โ โโโ view/
โ โ โโโ Main.view.xml
โ โโโ model/
โ โ โโโ formatter.js
โ โโโ i18n/
โ โ โโโ i18n.properties
โ โโโ css/
โ โ โโโ style.css
โ โโโ test/
โ โโโ unit/
โ โโโ integration/
โโโ ui5.yaml
โโโ package.json
Templates Available:
templates/basic-component.js: Component templatetemplates/manifest.json: Application descriptor templatetemplates/xml-view.xml: XML view with common patternstemplates/controller.js: Controller with best practicestemplates/formatter.js: Common formatter functionsUse templates by copying to your project and replacing placeholders ({{namespace}}, {{ControllerName}}, etc.).
Reference: references/core-architecture.md for detailed architecture concepts.
Key manifest sections:
sap.app: Application metadata and data sourcessap.ui: UI technology and device typessap.ui5: UI5-specific configuration (models, routing, dependencies)JSON Model (client-side):
var oModel = new JSONModel({
products: [...]
});
this.getView().setModel(oModel);
OData V2 Model (server-side):
"": {
"dataSource": "mainService",
"settings": {
"defaultBindingMode": "TwoWay",
"useBatch": true
}
}
Resource Model (i18n):
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": {
"bundleName": "my.app.i18n.i18n"
}
}
Reference: references/data-binding-models.md for comprehensive guide.
XML View (recommended):
<mvc:View
controllerName="my.app.controller.Main"
xmlns="sap.m"
xmlns:mvc="sap.ui.core.mvc">
<Page title="{i18n>title}">
<List items="{/products}">
<StandardListItem title="{name}" description="{price}"/>
</List>
</Page>
</mvc:View>
Navigate programmatically:
this.getOwnerComponent().getRouter().navTo("detail", {
objectId: sId
});
Reference: references/routing-navigation.md for routing patterns.
Build applications without JavaScript UI code using OData annotations.
manifest.json for List Report + Object Page:
{
"sap.ui5": {
"dependencies": {
"libs": {
"sap.fe.templates": {}
}
},
"routing": {
"targets": {
"ProductsList": {
"type": "Component",
"name": "sap.fe.templates.ListReport",
"options": {
"settings": {
"contextPath": "/Products",
"variantManagement": "Page"
}
}
}
}
}
}
}
Key Annotations:
@UI.LineItem: Table columns@UI.SelectionFields: Filter bar fields@UI.HeaderInfo: Object page header@UI.Facets: Object page sectionsReference: references/fiori-elements.md for comprehensive guide.
The sap.ui.mdc library provides metadata-driven controls for building dynamic UIs at runtime.
<mdc:Table
id="mdcTable"
delegate='{name: "my/app/delegate/TableDelegate", payload: {}}'
p13nMode="Sort,Filter,Column"
type="ResponsiveTable">
<mdc:columns>
<mdcTable:Column propertyKey="name" header="Name">
<Text text="{name}"/>
</mdcTable:Column>
</mdc:columns>
</mdc:Table>
Reference: references/mdc-typescript-advanced.md for comprehensive MDC guide with TypeScript.
Test individual functions and modules:
QUnit.module("Formatter Tests");
QUnit.test("Should format price correctly", function(assert) {
var fPrice = 123.456;
var sResult = formatter.formatPrice(fPrice);
assert.strictEqual(sResult, "123.46 EUR", "Price formatted");
});
Test user interactions and flows:
opaTest("Should navigate to detail page", function(Given, When, Then) {
Given.iStartMyApp();
When.onTheWorklistPage.iPressOnTheFirstListItem();
Then.onTheObjectPage.iShouldSeeTheObjectPage();
Then.iTeardownMyApp();
});
Simulate OData backend:
var oMockServer = new MockServer({
rootUri: "/sap/opu/odata/sap/SERVICE_SRV/"
});
oMockServer.simulate("localService/metadata.xml", {
sMockdataBaseUrl: "localService/mockdata"
});
oMockServer.start();
Reference: references/testing.md for comprehensive testing guide.
// Create
oModel.create("/Products", oData, {success: function() {MessageToast.show("Created");}});
// Read
oModel.read("/Products", {filters: [new Filter("Price", FilterOperator.GT, 100)]});
// Update
oModel.update("/Products(1)", {Price: 200}, {success: function() {MessageToast.show("Updated");}});
// Delete
oModel.remove("/Products(1)", {success: function() {MessageToast.show("Deleted");}});
var oBinding = this.byId("table").getBinding("items");
oBinding.filter([new Filter("price", FilterOperator.GT, 100)]);
oBinding.sort([new Sorter("name", false)]);
if (!this.pDialog) {
this.pDialog = this.loadFragment({
name: "my.app.view.fragments.MyDialog"
});
}
this.pDialog.then(function(oDialog) {oDialog.open();});
console.log(this.getView().getModel().getData())ui5 serve # Development server
ui5 build # Build for production
npm test # Run tests
Ctrl+Alt+Shift+SThis skill includes comprehensive reference documentation (11 files):
Access these files for detailed information on specific topics while keeping the main skill concise.
Ready-to-use templates in templates/ directory:
When using this skill:
License: GPL-3.0 Version: 1.4.0 Last Verified: 2025-11-27 Next Review: 2026-02-27 (Quarterly)