SAPUI5 Advanced

Aufwärmübung - Wiederholung vom Walkthrough

Brandeis Consulting & Cadao

Inhalt

  • Erzeugen einer UI5 App mit Template auf Basis eines OData Service eines SAP Systems
  • Wiederholung der wichtigsten Features aus der UI5 Grundlagen Schulung

Voraussetzungen

Ihr müsst nichts machen, das sollte schon alles gegeben sein!

  • Tools:
    • BAS
    • Eclipse mit ADT
  • Ein Service auf dem ABAP Server
  • Eine Verbindung von ABAP Server mit der BTP
Brandeis Consulting & Cadao

Erster Schritt: App mit Template bauen

  • basierend auf OData V4 Service
  • App starten
Brandeis Consulting & Cadao

Application Generator starten

Alternativ: Button Create Project

Brandeis Consulting & Cadao

Template auswählen: Sap Fiori application


==> Start

Brandeis Consulting & Cadao

Template Basic auswählen

==> Next

Brandeis Consulting & Cadao

Parameter einstellen (1/2)

Brandeis Consulting & Cadao

Parameter einstellen (2/2)

Brandeis Consulting & Cadao

Das fertige Projekt

Brandeis Consulting & Cadao

Ausführen der Anwendung

Über die Buttons

Oder über das Terminal

  • Falls das Terminal noch nicht angezeigt wird: Menü->Terminal->New Terminal
  • Eingabe von npm run start
Brandeis Consulting & Cadao

Texte mit i18n auf DE verfügbar machen

  1. Kopie der Datei i18n.properties in i18n_de.properties
  2. Erfassen von ein paar Übersetzungen in der neuen Datei
  3. Aufruf mit URL-Parameter sap-language=de

Beispiel: port8081-workspaces-ws-s2vx9.eu10.applicationstudio.cloud.sap/test/flpSandbox.html?sap-client=100&sap-language=de&sap-ui-xx-viewCache=false#mynssapui5recap-display

Brandeis Consulting & Cadao

Ein Oberflächenelement einbauen

  • <content> ist der Default-Bereich der Page. Der Tag kann deshalb weggelassen werden.
  • Das Attribut id muss mit einem eindeutigen Wert gefüllt werden, damit die Anwendung personalisierbar ist. Das wird geprüft, wenn in der manifest.json das Attribut sap.ui5/flexEnabled: true gesetzt ist.
<mvc:View controllerName="myns.sapui5recap.controller.UserList"
    xmlns:mvc="sap.ui.core.mvc" displayBlock="true"
    xmlns="sap.m">
    <Page id="page" title="{i18n>title}">
        <content >
          <Text id="_IDGenText1" text="Hallo Welt"/>
        </content>
    </Page>
</mvc:View>
webapp/view/UserList.view.xml
Brandeis Consulting & Cadao

Button einbauen

Im View

<mvc:View
    controllerName="myns.sapui5recap.controller.UserList"
    xmlns:mvc="sap.ui.core.mvc"
    displayBlock="true"
    xmlns="sap.m"
>
    <Page
        id="page"
        title="{i18n>title}"
    >
        <content>
            <Text
                id="_IDGenText1"
                text="Hallo Welt"
            />
            <Button
                id="_IDGenButton1"
                text="Drück mich"
                press="buttonPressed"
            />
        </content>
    </Page>
</mvc:View>
webapp/view/UserList.view.xml

Im Controller

sap.ui.define([
    "sap/ui/core/mvc/Controller"
],
    function (Controller) {
        "use strict";

        return Controller.extend(
                  "myns.sapui5recap.controller.UserList", {
            onInit: function () {

            },
            buttonPressed: function () {
                alert("Button gedrückt!");
            }
        });
    });
webapp/controller/Users.controller.js
Brandeis Consulting & Cadao

Ein Blick in die API-Doku

Brandeis Consulting & Cadao

Liste mit Model Binding

...
<List
    id="_IDGenList1"
    headerText="{i18n>userListHeader}"
    items="{/Users}"
>
    <items>
        <ObjectListItem
            id="_IDGenObjectListItem1"
            title="{Firstname} {Lastname}"
        />
    </items>
</List>
Brandeis Consulting & Cadao

API von ObjectListItem anschauen:

  1. Properties, z.B. Icon ==> Icon Explorer
  2. Aggregations, z.B. attributes
    ...
      <ObjectListItem
          id="_IDGenObjectListItem1"
          title="{Firstname} {Lastname}"
          icon="sap-icon://cancel"
      >
          <attributes>
              <ObjectAttribute
                  id="_IDGenObjectAttribute1"
                  title="{i18n>dateOfBirth}"
                  text="{DateOfBirth}"
              />
          </attributes>
      </ObjectListItem>
    ...
Brandeis Consulting & Cadao

Filtern mit SearchField

View

...
<List
    id="_IDGenList1"
    headerText="{i18n>userListHeader}"
    items="{/Users}">
<headerToolbar>
    <Toolbar id="_IDGenToolbar1">
        <Title id="_IDGenTitle1" text="Titel"/>
        <ToolbarSpacer id="_IDGenToolbarSpacer1" />
        <SearchField id="search"
                        width="50%"
                        search="onFilter"/>
    </Toolbar>
...
</headerToolbar>

Controller

sap.ui.define([
    "sap/ui/core/mvc/Controller",
    "sap/ui/model/Filter",
    "sap/ui/model/FilterOperator"
],
function (Controller, Filter, FilterOperator) {    
...
onFilter: function (oEvent) {
    const aFilter = [];
    const sQuery = oEvent.getParameter("query");
    if (sQuery) {
        aFilter.push(new Filter("Firstname", 
                                FilterOperator.Contains, 
                                sQuery));
    }

    // filter binding
    const oList = this.byId("_IDGenList1");
    const oBinding = oList.getBinding("items");
    oBinding.filter(aFilter);
}
Brandeis Consulting & Cadao

Optional: Filter mit LiveSearch

Herausforderungen:

<SearchField id="search"
        width="50%"
        search="onFilter"
        liveChange="onLiveChange" />
            onLiveChange: function (oEvent) {
                
                const aFilter = [];
                const sQuery = oEvent.getParameter("newValue");
                if (sQuery) {
                    aFilter.push(  new Filter({
                                        filters: [
                                        new Filter("Firstname", FilterOperator.Contains, sQuery),
                                        new Filter("Lastname", FilterOperator.Contains, sQuery)
                                        ],
                                        and: false
                                    }) );
                }

                // filter binding
                const oList = this.byId("_IDGenList1");
                const oBinding = oList.getBinding("items");
                oBinding.filter(aFilter);
            }
Brandeis Consulting & Cadao

Navigation und Detailseite (1/5)

Vorgehensweise

  1. Wir legen in der manifest.json eine neue Route und ein neues Target an
  2. Wir verändern die <User.view.xml> so, dass beim Anklicken eines Users die User Details Seite geöffnet wird
  3. Wir legen die Funktion onPress im Users.Controller an
  4. Wir legen eine neue View <UserDetails.view.xml> an
  5. Wir legen für die neue View einen neuen Controller UserDetails.controller.js an
Brandeis Consulting & Cadao

Navigation und Detailseite (2/5)

Schritt 1

"routes": [
       ...,
        {          "pattern": "detail/{UserId}",          "name": "detail",          "target": "TargetDetails"        }
      ],
      "targets": {
      ..,
        "TargetDetails": {          "id": "detail",          "name": "Detail",          "viewName": "UserDetails"        }
      }
webapp/manifest.json
Brandeis Consulting & Cadao

Navigation und Detailseite (3/5)

Schritt 2

...
<items>
    <ObjectListItem
        id="_IDGenObjectListItem1"
        title="{Firstname} {Lastname}"
        icon="sap-icon://cancel"        type="Navigation"        press=".onPress">
...
webapp/view/User.view.xml

Schritt 3

...,
            onPress(oEvent) {
                const oItem = oEvent.getSource();
                const oRouter = this.getOwnerComponent().getRouter();
                oRouter.navTo("detail", {
                    UserId: window.encodeURIComponent(oItem.getBindingContext().getPath().substr(1))
                });
            }
...
webapp/Controller/Users.controller.js
Brandeis Consulting & Cadao

Navigation und Detailseite (4/5)

Schritt 4

<mvc:View
    controllerName="myns.sapui5recap.controller.UserDetails"
    xmlns="sap.m"
    xmlns:mvc="sap.ui.core.mvc">
    <Page id="_IDUserDetail"
        title="{i18n>detailUserTitle}">
        <ObjectHeader id="_IDGenObjectHeader1"
            title="{Firstname} {Lastname}" />
        <ObjectListItem id="_IDGenObjectListItem1">
            <ObjectAttribute id="_IDGenObjectAttribute1"
                title="{i18n>dateOfBirth}"
                text="{DateOfBirth}" />
        </ObjectListItem>
        <ObjectListItem id="_IDGenObjectListItem2">
            <ObjectAttribute id="_IDGenObjectAttribute2"
                title="gender"
                text="{Gender}" />
        </ObjectListItem>
    </Page>
</mvc:View>
webapp/view/UserDetails.view.xml
Brandeis Consulting & Cadao

Navigation und Detailseite (5/5)

Schritt 5

sap.ui.define([
    "sap/ui/core/mvc/Controller",
],
    /**
     * @param {typeof sap.ui.core.mvc.Controller} Controller
     */
    function (Controller) {
        "use strict";

        return Controller.extend("myns.sapui5recap.controller.UserDetails", {
            onInit() {
                const oRouter = this.getOwnerComponent().getRouter();
                oRouter.getRoute("detail").attachPatternMatched(this.onObjectMatched, this);
            },

            onObjectMatched(oEvent) {
                this.getView().bindElement({
                    path: "/" + window.decodeURIComponent(oEvent.getParameter("arguments").UserId)
                });
            }
        });
    });

webapp/Controller/UserDetails.controller.js
Brandeis Consulting & Cadao