From c170987cbea84695ce259689dc064720d4728929 Mon Sep 17 00:00:00 2001 From: Peter Muessig Date: Tue, 11 Aug 2026 21:58:06 +0300 Subject: [PATCH] fix(tutorials): resolve rendering and consistency issues across tutorials - build: copy each tutorial's top-level assets/ folder into dist//assets/ so root README images (navigation, databinding) no longer 404 on GitHub Pages - navigation/odatav4/databinding: remove backticks from file-path headings that rendered as gray code spans, and shift the heading hierarchy down one level to match the walkthrough/quickstart outline (fence-aware; i18n code comments untouched) - walkthrough: replace project-structure screenshots in steps 09/26/27/28 with fenced ASCII folder trees, and delete the now-unused screenshot PNGs - quickstart: fix steps 02/03 headings to use the .ts/.js dual notation --- packages/databinding/steps/01/README.md | 22 ++++---- packages/databinding/steps/02/README.md | 12 ++--- packages/databinding/steps/03/README.md | 10 ++-- packages/databinding/steps/04/README.md | 14 ++--- packages/databinding/steps/05/README.md | 12 ++--- packages/databinding/steps/06/README.md | 20 ++++---- packages/databinding/steps/07/README.md | 12 ++--- packages/databinding/steps/08/README.md | 18 +++---- packages/databinding/steps/09/README.md | 18 +++---- packages/databinding/steps/10/README.md | 18 +++---- packages/databinding/steps/11/README.md | 12 ++--- packages/databinding/steps/12/README.md | 22 ++++---- packages/databinding/steps/13/README.md | 18 +++---- packages/databinding/steps/14/README.md | 14 ++--- packages/databinding/steps/15/README.md | 22 ++++---- packages/navigation/steps/01/README.md | 12 ++--- packages/navigation/steps/02/README.md | 22 ++++---- packages/navigation/steps/03/README.md | 20 ++++---- packages/navigation/steps/04/README.md | 22 ++++---- packages/navigation/steps/05/README.md | 20 ++++---- packages/navigation/steps/06/README.md | 24 ++++----- packages/navigation/steps/07/README.md | 26 +++++----- packages/navigation/steps/08/README.md | 28 +++++----- packages/navigation/steps/09/README.md | 14 ++--- packages/navigation/steps/10/README.md | 22 ++++---- packages/navigation/steps/11/README.md | 32 ++++++------ packages/navigation/steps/12/README.md | 12 ++--- packages/navigation/steps/13/README.md | 10 ++-- packages/navigation/steps/14/README.md | 10 ++-- packages/navigation/steps/15/README.md | 12 ++--- packages/navigation/steps/16/README.md | 10 ++-- packages/navigation/steps/17/README.md | 10 ++-- packages/odatav4/steps/01/README.md | 14 ++--- packages/odatav4/steps/02/README.md | 14 ++--- packages/odatav4/steps/03/README.md | 10 ++-- packages/odatav4/steps/04/README.md | 12 ++--- packages/odatav4/steps/05/README.md | 8 +-- packages/odatav4/steps/06/README.md | 12 ++--- packages/odatav4/steps/07/README.md | 12 ++--- packages/odatav4/steps/08/README.md | 12 ++--- packages/odatav4/steps/09/README.md | 12 ++--- packages/odatav4/steps/10/README.md | 8 +-- packages/odatav4/steps/11/README.md | 8 +-- packages/quickstart/steps/02/README.md | 2 +- packages/quickstart/steps/03/README.md | 2 +- packages/walkthrough/steps/09/README.md | 17 +++++-- ...e237a36972a44ac8522dd1a540ac062_LowRes.png | Bin 23291 -> 0 bytes packages/walkthrough/steps/26/README.md | 34 +++++++++++-- ...a5e2b02d72d40d388f5e601d7de74df_LowRes.png | Bin 63098 -> 0 bytes packages/walkthrough/steps/27/README.md | 43 +++++++++++++++- ...b5613ac3ab94757af2c7823039222a9_LowRes.png | Bin 75913 -> 0 bytes packages/walkthrough/steps/28/README.md | 48 +++++++++++++++++- ...7e84d5bd72a485498564b92894869b5_LowRes.png | Bin 89123 -> 0 bytes tools/builder/prepare-gh-pages.js | 9 ++++ 54 files changed, 479 insertions(+), 348 deletions(-) delete mode 100644 packages/walkthrough/steps/09/assets/loio1e237a36972a44ac8522dd1a540ac062_LowRes.png delete mode 100644 packages/walkthrough/steps/26/assets/loio7a5e2b02d72d40d388f5e601d7de74df_LowRes.png delete mode 100644 packages/walkthrough/steps/27/assets/loio1b5613ac3ab94757af2c7823039222a9_LowRes.png delete mode 100644 packages/walkthrough/steps/28/assets/loio27e84d5bd72a485498564b92894869b5_LowRes.png diff --git a/packages/databinding/steps/01/README.md b/packages/databinding/steps/01/README.md index 8f9a3c61a..249afb758 100644 --- a/packages/databinding/steps/01/README.md +++ b/packages/databinding/steps/01/README.md @@ -1,15 +1,15 @@ -# Step 1: No Data Binding +## Step 1: No Data Binding In this step, we create a basic application and simply place some text on the screen using a standard `sap.m.Text` control. The text in this control is a hard-coded part of the control's definition; therefore, this is not an example of data binding! -## Preview +### Preview ![The browser shows the text "Hi, my name is Harry Hawk"](assets/Tutorial_Data_Binding_Step_1_6d391d5.png "The browser shows the text "Hi, my name is Harry Hawk"") You can view this step live: [πŸ”— Live Preview of Step 1](https://ui5.github.io/tutorials/databinding/build/01/index-cdn.html). -## Setup +### Setup Open a terminal and install UI5 Tooling globally on your machine by executing the following command: @@ -17,11 +17,11 @@ Open a terminal and install UI5 Tooling globally on your machine by executing th npm install --global @ui5/cli ``` -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 1](https://ui5.github.io/tutorials/databinding/databinding-step-01.zip) (TS)[πŸ“₯ Download step 1](https://ui5.github.io/tutorials/databinding/databinding-step-01-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -36,7 +36,7 @@ webapp/ 2. Create a new file called `package.json` which will enable you to execute commands and consume packages from the [npm registry](https://www.npmjs.com/) via the npm command line interface. Enter the following content: -## package.json \(New\) +### package.json \(New\) ```json { @@ -55,7 +55,7 @@ webapp/ 4. Create a new HTML file named `index.html` in your webapp folder and enter the following content: -## webapp/index.html \(New\) +### webapp/index.html \(New\) ```html @@ -84,7 +84,7 @@ webapp/ 5. Create a new file named `manifest.json` in the webapp folder; it's also known as the "app descriptor". All application-specific configuration options which we'll introduce in this tutorial will be added to this file. Enter the following content: -## webapp/manifest.json \(New\) +### webapp/manifest.json \(New\) ```json { @@ -129,7 +129,7 @@ webapp/ 6. Create a new file named `Component.ts/.js` in the webapp folder. Enter the following content: -## `webapp/Component.ts/.js` \(New\) +### webapp/Component.ts/.js \(New\) ```ts // webapp/Component.ts @@ -162,7 +162,7 @@ sap.ui.define(["sap/ui/core/UIComponent"], function (UIComponent) { 7. Create a new folder named `view` in the webapp folder. Then, create a new file `App.view.xml` within the `view` folder. We start by placing the `sap.m.Text` control into the XML view. Since the value of the control's text property is hard-coded, it doesn't relate to any data that might exist within a model object. Therefore, data binding is **not** used here. -## webapp/view/App.view.xml \(New\) +### webapp/view/App.view.xml \(New\) ```xml [πŸ“₯ Download step 2](https://ui5.github.io/tutorials/databinding/databinding-step-02.zip) (TS)[πŸ“₯ Download step 2](https://ui5.github.io/tutorials/databinding/databinding-step-02-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -49,7 +49,7 @@ webapp/ 1. Create a new folder named `model` in the `webapp` folder. In this folder, create a file called `data.json` with the following content: -## webapp/model/data.json \(New\) +### webapp/model/data.json \(New\) ```json { @@ -59,7 +59,7 @@ webapp/ 2. Create a new JSON model in the `manifest.json` and set its path via a URI. This binds the model object to the app component and makes it globally available to all controls used within the application. -## webapp/manifest.json +### webapp/manifest.json ```json { diff --git a/packages/databinding/steps/03/README.md b/packages/databinding/steps/03/README.md index 439e5e5c9..5fc1dff44 100644 --- a/packages/databinding/steps/03/README.md +++ b/packages/databinding/steps/03/README.md @@ -1,19 +1,19 @@ -# Step 3: Create Property Binding +## Step 3: Create Property Binding Although there is no visible difference, the text on the screen is now derived from model data. -## Preview +### Preview ![The browser shows the text "Hi, my name is Harry Hawk"](assets/Tutorial_Data_Binding_Step_1_6d391d5.png "The browser shows the text "Hi, my name is Harry Hawk"") You can view this step live: [πŸ”— Live Preview of Step 3](https://ui5.github.io/tutorials/databinding/build/03/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 3](https://ui5.github.io/tutorials/databinding/databinding-step-03.zip) (TS)[πŸ“₯ Download step 3](https://ui5.github.io/tutorials/databinding/databinding-step-03-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -28,7 +28,7 @@ webapp/ Assign the `text` property of the `sap.m.Text` control to the value `{/greetingText}`. The curly brackets enclosing a binding path \(binding syntax\) are automatically interpreted as a binding. These binding instances are called property bindings. In this scenario, the control's `text` property is bound to the `greetingText` property at the root of the default model. The slash \(`/`\) at the beginning of the binding path signifies an absolute binding path. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 4](https://ui5.github.io/tutorials/databinding/databinding-step-04.zip) (TS)[πŸ“₯ Download step 4](https://ui5.github.io/tutorials/databinding/databinding-step-04-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -30,7 +30,7 @@ webapp/ Replace the content of the `App.view.xml` file with the following content: -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 5](https://ui5.github.io/tutorials/databinding/databinding-step-05.zip) (TS)[πŸ“₯ Download step 5](https://ui5.github.io/tutorials/databinding/databinding-step-05-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -30,7 +30,7 @@ webapp/ Insert the highlighted code into the `Component.ts/.js` file. The `init` function calls the init function of its parent, retrieves the default model instance bound to the component, and sets the default binding mode to one-way data binding. -## `webapp/Component.ts/.js` +### webapp/Component.ts/.js ```ts // webapp/Component.ts diff --git a/packages/databinding/steps/06/README.md b/packages/databinding/steps/06/README.md index 2e282a863..760c6bda7 100644 --- a/packages/databinding/steps/06/README.md +++ b/packages/databinding/steps/06/README.md @@ -1,23 +1,23 @@ -# Step 6: Resource Models +## Step 6: Resource Models Business applications often require language-specific \(translatable\) text used as labels and descriptions on the user interface. The example we used at the start of this tutorial was quite simplistic as we stored language-specific text directly in a JSON model object. Generally speaking, unless language-specific text comes directly from a back-end system, it's not considered good programming practice to put translatable texts directly into a model. So, let's fix this by placing all translatable texts \(such as field labels\) into a resource bundle. -## Preview +### Preview -### The texts are now derived from a resource model \(No visual change to last step\) +#### The texts are now derived from a resource model \(No visual change to last step\) ![The texts are now derived from a resource model (No visual change to last step)](assets/Tutorial_Data_Binding_Step_4_61d68f1.png "The texts are now derived from a resource model (No visual change to last step)") You can view this step live: [πŸ”— Live Preview of Step 6](https://ui5.github.io/tutorials/databinding/build/06/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 6](https://ui5.github.io/tutorials/databinding/databinding-step-06.zip) (TS)[πŸ“₯ Download step 6](https://ui5.github.io/tutorials/databinding/databinding-step-06-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -36,7 +36,7 @@ Create a new entry in the `manifest.json` file under the `models` entry as shown Also add the `i18n` property to the `sap.app` section and modify the `title` and `description` property to use the corresponding texts from the `i18n.properties` as shown below. -## webapp/manifest.json +### webapp/manifest.json ```json ... @@ -89,7 +89,7 @@ Also add the `i18n` property to the `sap.app` section and modify the `title` and Update the `i18n.properties` and add the code shown below. -## webapp/i18n/i18n.properties \(New\) +### webapp/i18n/i18n.properties \(New\) ```properties # App Descriptor @@ -111,7 +111,7 @@ Language-specific text stored in resource models obeys the Java convention for i Modify the data binding for the panel header and the labels in `App.view.xml` to include the model name. Note that a "greater than" character separates the model name and the property name. Also, i18n property names **must not** start with a slash character. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 7](https://ui5.github.io/tutorials/databinding/databinding-step-07.zip) (TS)[πŸ“₯ Download step 7](https://ui5.github.io/tutorials/databinding/databinding-step-07-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -31,7 +31,7 @@ webapp/ └── manifest.json ``` -## webapp/i18n/i18n\_de.properties \(New\) +### webapp/i18n/i18n\_de.properties \(New\) In the `i18n` folder, duplicate the `i18n.properties` file and rename its copy to `i18n`**`_de`**`.properties`. Replace the English text with the German text provided below. The suffix `de` represents the locale for the German language. Since the `de` locale is already set in the `supportedLocales` configuration of the `manifest.json`, it will be taken into account. diff --git a/packages/databinding/steps/08/README.md b/packages/databinding/steps/08/README.md index 2ff88b688..adcf11ec7 100644 --- a/packages/databinding/steps/08/README.md +++ b/packages/databinding/steps/08/README.md @@ -1,21 +1,21 @@ -# Step 8: Binding Paths: Accessing Properties in Hierarchically Structured Models +## Step 8: Binding Paths: Accessing Properties in Hierarchically Structured Models In Step 6 , we stated that the fields in a resource model are arranged in a flat structure; in other words, there is no hierarchy of properties. However, this is only true for resource models. The properties within JSON and OData models are usually arranged in a hierarchical structure. So, let's explore how to reference fields in a hierarchically structured model object. -## Preview +### Preview -### A second panel with address data is added +#### A second panel with address data is added ![A second panel with address data is added](assets/Tutorial_Data_Binding_Step_8_12705f5.png "A second panel with address data is added") You can view this step live: [πŸ”— Live Preview of Step 8](https://ui5.github.io/tutorials/databinding/build/08/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 8](https://ui5.github.io/tutorials/databinding/databinding-step-08.zip) (TS)[πŸ“₯ Download step 8](https://ui5.github.io/tutorials/databinding/databinding-step-08-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -33,7 +33,7 @@ webapp/ In the `data.json` file, add an additional sub-object named `address`. This object has four properties: `street`, `city`, `zip`, and `country`. -## webapp/model/data.json +### webapp/model/data.json ```json { @@ -55,7 +55,7 @@ The `text` property of the `Label` element is bound to the i18n resource bundle The `htmlText` property of the `FormattedText` element is bound to four JSON model properties: `/address/street`, `/address/zip`, `/address/city`, and `/address/country`. You can achieve the resulting address format by separating each one of these JSON model property references with a hard-coded newline character. Note that `zip` and `city` are separated by a space. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 9](https://ui5.github.io/tutorials/databinding/databinding-step-09.zip) (TS)[πŸ“₯ Download step 9](https://ui5.github.io/tutorials/databinding/databinding-step-09-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -35,7 +35,7 @@ webapp/ Create a new folder named `controller` within your `webapp` folder as a general location for all controller files for this app. Next, create a new file named `App.controller.ts/.js` with the following content: -## `webapp/controller/App.controller.ts/.js` \(New\) +### webapp/controller/App.controller.ts/.js \(New\) ```ts // webapp/controller/App.controller.ts @@ -88,7 +88,7 @@ In the `formatMail` function, we use the `sap.m.URLHelper.normalizeEmail` functi Enhance the `App.view.xml` file as shown below: -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 10](https://ui5.github.io/tutorials/databinding/databinding-step-10.zip) (TS)[πŸ“₯ Download step 10](https://ui5.github.io/tutorials/databinding/databinding-step-10-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -35,7 +35,7 @@ webapp/ Add two new JSON model properties, `salesAmount` and `currencyCode`, to the `data.json` file. -## webapp/model/data.json +### webapp/model/data.json ```json { @@ -55,7 +55,7 @@ Add two new JSON model properties, `salesAmount` and `currencyCode`, to the `dat Add a `sap.ui.layout.HorizontalLayout` to the content of the second `sap.m.Panel` within `App.view.xml` file. Move the existing `sap.ui.layout.VerticalLayout` to the default aggregation of the new `sap.ui.layout.HorizontalLayout`. Finally, add a second `sap.ui.layout.VerticalLayout`, containing a `sap.m.Label` and a `sap.m.Input` control, to the `sap.ui.layout.HorizontalLayout`. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 11](https://ui5.github.io/tutorials/databinding/databinding-step-11.zip) (TS)[πŸ“₯ Download step 11](https://ui5.github.io/tutorials/databinding/databinding-step-11-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -33,7 +33,7 @@ webapp/ └── manifest.json ``` -## webapp/manifest.json +### webapp/manifest.json To generally enable validation in the app, add the `handleValidation` property into the `sap.ui5` section of the `manifest.json` file as shown below. diff --git a/packages/databinding/steps/12/README.md b/packages/databinding/steps/12/README.md index 8ff778bad..a1d5e77a0 100644 --- a/packages/databinding/steps/12/README.md +++ b/packages/databinding/steps/12/README.md @@ -1,5 +1,5 @@ -# Step 12: Aggregation Binding Using Templates +## Step 12: Aggregation Binding Using Templates Aggregation binding, also known as "list binding", lets a control bind to a list within the model data. This binding allows relative binding to the list entries by its child controls. @@ -9,19 +9,19 @@ The system automatically creates as many child controls as are needed to display - It uses a factory function to generate the correct control for each bound list entry, based on the data received at runtime. -## Preview +### Preview -### A third panel with a list of products is displayed +#### A third panel with a list of products is displayed ![A third panel with a list of products is displayed](assets/Tutorial_Data_Binding_Step_12_1642433.png "A third panel with a list of products is displayed") You can view this step live: [πŸ”— Live Preview of Step 12](https://ui5.github.io/tutorials/databinding/build/12/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 12](https://ui5.github.io/tutorials/databinding/databinding-step-12.zip) (TS)[πŸ“₯ Download step 12](https://ui5.github.io/tutorials/databinding/databinding-step-12-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -42,7 +42,7 @@ webapp/ Add a new entry named `products` to the `models` entry under `sap.ui5` in the `manifest.json` file: -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -78,7 +78,7 @@ Add a new entry named `products` to the `models` entry under `sap.ui5` in the `m Create a new file named `Products.json` in the `model` folder. Enter the data for the products: -## webapp/model/Products.json \(New\) +### webapp/model/Products.json \(New\) ```json { @@ -149,7 +149,7 @@ Create a new file named `Products.json` in the `model` folder. Enter the data fo In the `App.view.xml` file, add a new panel with an `sap.m.List` control containing the `sap.m.ObjectListItem` template control as shown below. Note that the template control is only present once in the XML view. It's automatically cloned for each entry in the products' JSON model. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 13](https://ui5.github.io/tutorials/databinding/databinding-step-13.zip) (TS)[πŸ“₯ Download step 13](https://ui5.github.io/tutorials/databinding/databinding-step-13-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -36,7 +36,7 @@ webapp/ In the `App.view.xml` file, add a `press` event handler to the items in the list. Below the panel with the list, add a new panel with an `sap.m.SimpleForm`. To populate the form with data, we bind the entire panel to the path of the element you clicked in the list. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml ... @@ -109,7 +109,7 @@ In the `App.view.xml` file, add a `press` event handler to the items in the list In the controller, add a new function `onItemSelected`, which binds the newly created panel to the correct item whenever it's pressed. -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -152,7 +152,7 @@ sap.ui.define(["sap/ui/core/mvc/Controller", "sap/m/library", "sap/ui/model/type Lastly, add the new texts to the `i18n.properties` and `i18n_de.properties` files. -## webapp/i18n/i18n.properties +### webapp/i18n/i18n.properties ```properties ... @@ -174,7 +174,7 @@ Discontinued=Discontinued ``` -## webapp/i18n/i18n\_de.properties +### webapp/i18n/i18n\_de.properties ```properties # Screen titles diff --git a/packages/databinding/steps/14/README.md b/packages/databinding/steps/14/README.md index e6d601f2c..709e1cb65 100644 --- a/packages/databinding/steps/14/README.md +++ b/packages/databinding/steps/14/README.md @@ -1,21 +1,21 @@ -# Step 14: Expression Binding +## Step 14: Expression Binding An expression binding lets you display a calculated value on the screen, which is derived from values found in a model object. This feature allows you to insert simple formatting or calculations directly into the data binding string. In this example, we're changing the color of the price depending on whether it's above or below a certain threshold. The threshold value is stored in the JSON model. -## Preview +### Preview -### Prices are color-coded depending on a selected threshold +#### Prices are color-coded depending on a selected threshold ![Prices are color-coded depending on a selected threshold](assets/Tutorial_Data_Binding_Step_14_b9fb758.png "Prices are color-coded depending on a selected threshold") You can view this step live: [πŸ”— Live Preview of Step 14](https://ui5.github.io/tutorials/databinding/build/14/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 14](https://ui5.github.io/tutorials/databinding/databinding-step-14.zip) (TS)[πŸ“₯ Download step 14](https://ui5.github.io/tutorials/databinding/databinding-step-14-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -36,7 +36,7 @@ webapp/ Add a new property called `priceThreshold` with a value of 20 to the `data.json` file. -## webapp/model/data.json +### webapp/model/data.json ```json { @@ -57,7 +57,7 @@ Add a new property called `priceThreshold` with a value of 20 to the `data.json` In the `App.view.xml` file, add a new `numberState` property to the `ObjectListItem` element within the `List`. The value of this property is an expression that gets evaluated for each item. The expression compares each invoice value against the price threshold and returns a number state based on the result. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml ... diff --git a/packages/databinding/steps/15/README.md b/packages/databinding/steps/15/README.md index 13ea4d672..5c0d5b30d 100644 --- a/packages/databinding/steps/15/README.md +++ b/packages/databinding/steps/15/README.md @@ -1,21 +1,21 @@ -# Step 15: Aggregation Binding Using a Factory Function +## Step 15: Aggregation Binding Using a Factory Function Instead of using a single hard-coded template control, we now opt for a factory function to generate different controls based on the data received at runtime. This approach is much more flexible and allows for the display of complex or heterogeneous data. -## Preview +### Preview -### A different type of list item is displayed for a discontinued product +#### A different type of list item is displayed for a discontinued product ![A different type of list item is displayed for a discontinued product](assets/Tutorial_Data_Binding_Step_15_db27ba8.png "A different type of list item is displayed for a discontinued product") You can view this step live: [πŸ”— Live Preview of Step 15](https://ui5.github.io/tutorials/databinding/build/15/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 15](https://ui5.github.io/tutorials/databinding/databinding-step-15.zip) (TS)[πŸ“₯ Download step 15](https://ui5.github.io/tutorials/databinding/databinding-step-15-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -38,7 +38,7 @@ webapp/ Create a `ProductSimple.fragment.xml` file in the `view` folder. Here, define an `sap.m.StandardListItem` that is used when the stock level is zero and the product is discontinued. In this simple use case, you only need to define a warning icon and a "Product Discontinued" message in the `info` property. -## webapp/view/ProductSimple.fragment.xml \(New\) +### webapp/view/ProductSimple.fragment.xml \(New\) ```xml πŸ“ > The content of the `localService` folder will not be changed in this tutorial. The `i18n` folder will always contain the `i18n.properties` file only. Therefore, we will show both subfolders collapsed in the following steps. -## The Initial App +### The Initial App With the downloaded coding, you have an initial app with recommended settings that provides the basic features of an OpenUI5 app: diff --git a/packages/navigation/steps/02/README.md b/packages/navigation/steps/02/README.md index 2c07f0221..224db8b27 100644 --- a/packages/navigation/steps/02/README.md +++ b/packages/navigation/steps/02/README.md @@ -1,20 +1,20 @@ -# Step 2: Enable Routing +## Step 2: Enable Routing In this step we will modify the app and introduce routing. Instead of having the home page of the app hard coded we will configure a router to wire multiple views together when our app is called. The routing configuration controls the application flow when the user triggers a navigation action or opens a link to the application directly. -## Preview +### Preview -### Views are wired together using the router +#### Views are wired together using the router ![Views are wired together using the router](assets/Tutorial_Navigation_and_Routing_Step_02a.png "Views are wired together using the router") You can view this step live: [πŸ”— Live Preview of Step 2](https://ui5.github.io/tutorials/navigation/build/02/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 2](https://ui5.github.io/tutorials/navigation/navigation-step-02.zip) (TS)[πŸ“₯ Download step 2](https://ui5.github.io/tutorials/navigation/navigation-step-02-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -38,7 +38,7 @@ webapp/ └── manifest.json ``` -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -112,7 +112,7 @@ Single-page applications based on OpenUI5 can use a so-called β€œrouter” to di > πŸ“ > As of OpenUI5 version 1.30, we recommend that you define the routing in the `manifest.json` descriptor file using routes and targets. In older versions of OpenUI5, the routing configuration had to be done directly in the metadata section of the component, and with different syntax. -## `webapp/Component.ts/.js` +### webapp/Component.ts/.js ```ts // webapp/Component.ts @@ -160,7 +160,7 @@ sap.ui.define(["sap/ui/core/UIComponent"], function (UIComponent) { We override the `init` function and call the parent’s `init` function first. We get a reference to the router and call `initialize()`on it. The router is instantiated automatically with the configuration loaded in the descriptor. The routing events and our configuration in the descriptor are now automatically enabled in the app. Running the app at this point would lead to an error, because the home view is not implemented yet. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml homePageTitle`, you can use data binding just the way you are used to it. -## `webapp/controller/Home.controller.ts/.js` \(New\) +### webapp/controller/Home.controller.ts/.js \(New\) ```ts // webapp/controller/Home.controller.ts @@ -228,7 +228,7 @@ Create a file `Home.controller.ts` in the `webapp/controller` folder. The contro > > Based on the routing configuration, you define the navigation between pages and pass parameters to the target views. -## Conventions +### Conventions - Configure the router in the `manifest.json` descriptor file diff --git a/packages/navigation/steps/03/README.md b/packages/navigation/steps/03/README.md index 3f8395045..189cdf197 100644 --- a/packages/navigation/steps/03/README.md +++ b/packages/navigation/steps/03/README.md @@ -1,20 +1,20 @@ -# Step 3: Catch Invalid Hashes +## Step 3: Catch Invalid Hashes Sometimes it is important to display an indication that the requested resource was not found. To give you an example: If a user tries to access an invalid pattern which does not match any of the configured routes, the user is notified that something went wrong. You might also know this as a β€œ404” or *Not Found Page* from traditional web pages. In this step, we will implement a feature that detects invalid hashes and visualizes this in a nice way. -## Preview +### Preview -### Not Found page +#### Not Found page ![Not Found page](assets/Tutorial_Navigation_and_Routing_Step_03.png "Not Found page") You can view this step live: [πŸ”— Live Preview of Step 3](https://ui5.github.io/tutorials/navigation/build/03/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 3](https://ui5.github.io/tutorials/navigation/navigation-step-03.zip) (TS)[πŸ“₯ Download step 3](https://ui5.github.io/tutorials/navigation/navigation-step-03-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -40,7 +40,7 @@ webapp/ └── manifest.json ``` -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -84,7 +84,7 @@ webapp/ Let’s extend the routing configuration in the descriptor by adding a `bypassed` property and setting its `target` to `notFound`. This configuration tells the router to display the `notFound` target in case no route was matched to the current hash. Next, we add a `notFound` target to the `bypassed` section. The `notFound` target simply configures a `NotFound` view with a `show` transition. -## webapp/view/NotFound.view.xml \(New\) +### webapp/view/NotFound.view.xml \(New\) ```xml [πŸ“₯ Download step 4](https://ui5.github.io/tutorials/navigation/navigation-step-04.zip) (TS)[πŸ“₯ Download step 4](https://ui5.github.io/tutorials/navigation/navigation-step-04-js.zip) (JS). -## webapp/view/NotFound.view.xml +### webapp/view/NotFound.view.xml ```xml [πŸ“₯ Do In the `NotFound` view, we set the property `showNavButton` of the `Page` control to `true` which automatically displays the *Back* button. We also add an event handler function `onNavBack` to the `navButtonPress` event of the control. The `onNavBack` function will handle the actual back navigation. We could directly add this function to the `NotFound` view’s controller. However, we are smart enough to anticipate that we might need the same handler function for different views. DRY \(β€œDon’t Repeat Yourself”\) is the right approach for us, so let’s create a `BaseController` from which all other controllers will inherit. -## `webapp/controller/BaseController.ts/.js` \(New\) +### webapp/controller/BaseController.ts/.js \(New\) ```ts // webapp/controller/BaseController.ts @@ -130,7 +130,7 @@ The third parameter of `navTo("appHome", {}, true /*no history*/);` has the valu > πŸ“ > In OpenUI5 there are multiple options to reuse code. We recommend to use a base controller for such helper methods because this allows us to decoratively use the `onNavBack` handler directly in any XML view without adding additional code to the controller. Our base controller is an abstract controller that will not be instantiated in any view. Therefore, the naming convention `*.controller.ts` does not apply, and we can just name the file `BaseController.ts`. By not using the naming convention `*.controller.ts` we can even prevent any unintentional usage in views. -## `webapp/controller/NotFound.controller.ts/.js` +### webapp/controller/NotFound.controller.ts/.js ```ts // webapp/controller/NotFound.controller.ts @@ -163,7 +163,7 @@ In order to reuse the base controller implementation, we have to change the depe At this point you can open `index.html#/thisIsInvalid` in your browser and press the *Back* button to see what happens. You will be redirected to the app’s home page that is matched by the route `appHome` as you opened the *Not Found* page with an invalid hash. If you change the hash to something invalid when you are on the home page of the app, you will also go to the *Not Found* page but with a history entry. When you press back, you will get to the home page again, but this time with a native history navigation. -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -194,7 +194,7 @@ sap.ui.define(["ui5/tutorial/navigation/controller/BaseController"], function (B To be consistent, we will now adjust all of our controllers to extend to inherit from the `BaseController`. Change the `App` controller as described above. -## `webapp/controller/Home.controller.ts/.js` +### webapp/controller/Home.controller.ts/.js ```ts // webapp/controller/Home.controller.ts @@ -223,7 +223,7 @@ The same applies to our `Home` controller, we now also inherit from the `BaseCon > πŸ“ > In this step we have added the *Back* button. The user can always use the browser’s native *Back* button as well. Each app can freely configure the behavior of the *Back* button. However, there is no clean way to apply the same logic for the browser’s *Back* button in single-page applications. Tweaking the browser history or using other quirks for cancelling backward or forward navigation is not recommended due to the implementation details of the browsers. The browser’s *Back* button always uses the browser history while the *Back* button of the app can make use of the browser history **or** can implement its own navigation logic. Make sure to understand this difference and only control the *Back* button inside the app. -## Conventions +### Conventions - Implement a global `onNavBack` handler for back navigation in your app diff --git a/packages/navigation/steps/05/README.md b/packages/navigation/steps/05/README.md index f460c25bf..13e545fe3 100644 --- a/packages/navigation/steps/05/README.md +++ b/packages/navigation/steps/05/README.md @@ -1,4 +1,4 @@ -# Step 5: Display a Target Without Changing the Hash +## Step 5: Display a Target Without Changing the Hash In this step, you will learn more about targets and how to display a target from the routing configuration manually. @@ -6,19 +6,19 @@ We will display the *Not Found* target from the previous step without changing t Fortunately, we can extend our app and offer an easy solution. There are some use cases that should not be persisted in the URL but just be triggered by the application logic if needed. A target is a navigation-related configuration for a view and we can display targets manually without referencing them in a navigation route. Good examples for this are temporary errors, switching to an edit page for a business object, or going to a *Settings* page. Sometimes you will also have to implement a way back manually. -## Preview +### Preview -### The new Home page with a navigation button +#### The new Home page with a navigation button ![The new Home page with a navigation button](assets/Tutorial_Navigation_and_Routing_Step_05.png "The new Home page with a navigation button") You can view this step live: [πŸ”— Live Preview of Step 5](https://ui5.github.io/tutorials/navigation/build/05/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 5](https://ui5.github.io/tutorials/navigation/navigation-step-05.zip) (TS)[πŸ“₯ Download step 5](https://ui5.github.io/tutorials/navigation/navigation-step-05-js.zip) (JS). -## webapp/view/Home.view.xml +### webapp/view/Home.view.xml ```xml [πŸ“₯ Do We start by changing the `Button` control from the home view. When the button is pressed, the `onDisplayNotFound` handler is called. -## `webapp/controller/Home.controller.ts/.js` +### webapp/controller/Home.controller.ts/.js ```ts // webapp/controller/Home.controller.ts @@ -84,7 +84,7 @@ If you now call the app and press the *Display Not Found* button you see that th When pressing the app’s *Back* button, the `onNavBack` from the previous step is called. It detects that there is no previous hash and therefore tries to navigate to the `appHome` route again. The router is smart enough to detect that the current hash did not change and therefore skips the navigation to the route. Fortunately, there is an easy workaround for us. However, we need to touch the `Home` controller again. -## `webapp/controller/Home.controller.ts/.js` \(Changed Again\) +### webapp/controller/Home.controller.ts/.js \(Changed Again\) ```ts // webapp/controller/Home.controller.ts @@ -123,7 +123,7 @@ sap.ui.define(["ui5/tutorial/navigation/controller/BaseController"], function (B This time we pass on a data object as the second parameter for the display method which contains the name of the current target; the one from which we navigate to the `notFound` target. We decide to choose the key `fromTarget` but since it is a custom configuration object any other key would be fine as well. -## `webapp/controller/NotFound.controller.ts/.js` +### webapp/controller/NotFound.controller.ts/.js ```ts // webapp/controller/NotFound.controller.ts @@ -199,7 +199,7 @@ From the router reference we can fetch a reference to the `notFound` target. Eac Similar to OpenUI5 controls, targets define API methods and events that can be attached. We attach a display event handler and save the configuration that was received as the event parameter `data` in an internal controller variable `this.data`. This also includes the `fromTarget` information in case the caller passed it on. However, we now have to override the base controller’s `onNavBack` implementation to change the behavior a bit. We add a special case for our *Back* functionality in case the `fromTarget` property has been passed on. If specified, we simply display the target defined as `fromTarget` manually the same way we actually called the `notFound` target manually. Otherwise we just call the `onNavBack` implementation in the `BaseController`. -## webapp/i18n/i18n.properties +### webapp/i18n/i18n.properties ```properties ... @@ -210,7 +210,7 @@ Add the new property to the `i18n.properties` file. When we now click the *Back* button, it works as expected and brings us back to the overview page, also when the *Not Found* view is displayed manually. -## Conventions +### Conventions - Display targets manually if you want to trigger a navigation without changing the hash diff --git a/packages/navigation/steps/06/README.md b/packages/navigation/steps/06/README.md index 04394e326..ad2afa026 100644 --- a/packages/navigation/steps/06/README.md +++ b/packages/navigation/steps/06/README.md @@ -1,24 +1,24 @@ -# Step 6: Navigate to Routes with Hard-Coded Patterns +## Step 6: Navigate to Routes with Hard-Coded Patterns In this step, we'll create a second button on the home page, with which we can navigate to a simple list of employees. This example illustrates how to navigate to a route that has a hard-coded pattern. -## Preview +### Preview -### Show Employee List button on the Home page +#### Show Employee List button on the Home page ![Show Employee List button on the Home page](assets/Tutorial_Navigation_and_Routing_Step_06a.png "Show Employee List button on the Home page") -### Employee list with Back button +#### Employee list with Back button ![Employee list with Back button](assets/Tutorial_Navigation_and_Routing_Step_06b.png "Employee list with Back button") You can view this step live: [πŸ”— Live Preview of Step 6](https://ui5.github.io/tutorials/navigation/build/06/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 6](https://ui5.github.io/tutorials/navigation/navigation-step-06.zip) (TS)[πŸ“₯ Download step 6](https://ui5.github.io/tutorials/navigation/navigation-step-06-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -49,7 +49,7 @@ webapp/ └── manifest.json ``` -## webapp/view/Home.view.xml +### webapp/view/Home.view.xml ```xml [πŸ“₯ Download step 7](https://ui5.github.io/tutorials/navigation/navigation-step-07.zip) (TS)[πŸ“₯ Download step 7](https://ui5.github.io/tutorials/navigation/navigation-step-07-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -57,7 +57,7 @@ webapp/ └── manifest.json ``` -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -133,7 +133,7 @@ The following hashes would match in our case: `employees/2`, `employees/7`, `emp Next, we have to create the view `employees.Employee`; for better illustration the `path` is not specified this time. -## webapp/view/employee/Employee.view.xml \(New\) +### webapp/view/employee/Employee.view.xml \(New\) ```xml Requiring `sap/ui/layout/form/ResponsiveGridLayout` is needed because we use the `ResponsiveGridLayout` as `layout` for the `sap/ui/layout/form/SimpleForm`. > The `sap/ui/layout/form/SimpleForm` requires the configured layout, in case it's not done by the consumer but this may cause an additional rendering cycle if rendering starts before the layout finished loading. -## `webapp/controller/employee/Employee.controller.ts/.js` \(New\) +### webapp/controller/employee/Employee.controller.ts/.js \(New\) ```ts // webapp/controller/employee/Employee.controller.ts @@ -291,7 +291,7 @@ We also add an event handler to the `change` event as a private function `_onBin > πŸ“ > Instead of calling `attachMatched(…)` on a route we could also call `attachRouteMatched(…)` directly on the router. However, the event for the latter is fired for every matched event of any route in the whole app. We don’t use the latter because we would have to implement an additional check for making sure that current route is the route that has been matched. We want to avoid this extra overhead and register on the route instead. -## webapp/view/employee/EmployeeList.view.xml +### webapp/view/employee/EmployeeList.view.xml ```xml [πŸ“₯ Download step 8](https://ui5.github.io/tutorials/navigation/navigation-step-08.zip) (TS)[πŸ“₯ Download step 8](https://ui5.github.io/tutorials/navigation/navigation-step-08-js.zip) (JS). -### Folder structure for this step +#### Folder structure for this step ```text webapp/ @@ -58,7 +58,7 @@ webapp/ └── manifest.json ``` -## webapp/view/employee/Employee.view.xml +### webapp/view/employee/Employee.view.xml ```xml > You can also implement your own transitions and add it to a control that extends `sap.m.NavContainer` \(for example, `sap.m.App` or `sap.m.SplitApp`\). For more information, see the [API Reference: `NavContainer`](https://sdk.openui5.org/#/api/sap.m.NavContainer). -## webapp/view/employee/Resume.view.xml \(New\) +### webapp/view/employee/Resume.view.xml \(New\) ```xml @@ -410,7 +410,7 @@ Create a file `ResumeProjects.view.xml` in the `webapp/view/employee` folder. Th > πŸ“ > For more complex applications, the performance is significantly increased if parts of the UI are only loaded when the user is actively selecting it. In this example, the view is always loaded even though the user never decided to display the project information. In the next steps, we will extend the UI so that the content is loaded β€œlazy” by OpenUI5 only when the filter item is clicked. The back-end service will fetch the data only on request and the UI will only have to be updated with the selected data instead of loading all data. -## webapp/i18n/i18n.properties +### webapp/i18n/i18n.properties ```properties ... diff --git a/packages/navigation/steps/09/README.md b/packages/navigation/steps/09/README.md index 69ddcdc06..46847eb44 100644 --- a/packages/navigation/steps/09/README.md +++ b/packages/navigation/steps/09/README.md @@ -1,22 +1,22 @@ -# Step 9: Allow Bookmarkable Tabs with Optional Query Parameters +## Step 9: Allow Bookmarkable Tabs with Optional Query Parameters The `resume` view contains four tabs as we have seen in the previous step of this tutorial. However, when the user navigates to the `resume` page, only the first tab is displayed initially. Navigating directly to a specific tab or bookmarking a tab is not yet supported in our current app. In this step, we implement a bookmarking feature by enabling deep linking to tabs with optional query parameters. A deep link is basically a link that directly references a deeper structure and parameters of the app in the URL. It is often bookmarked or shared to have a convenient entry point into the app for a certain task or action. The selected tab should be reflected in the URL but the tab can also be omitted, for example, when we initially navigate to the resume page. -## Preview +### Preview -### Deep link to allow bookmarkable tabs +#### Deep link to allow bookmarkable tabs ![Deep link to allow bookmarkable tabs](assets/Tutorial_Navigation_and_Routing_Step_09.png "Deep link to allow bookmarkable tabs") You can view this step live: [πŸ”— Live Preview of Step 9](https://ui5.github.io/tutorials/navigation/build/09/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 9](https://ui5.github.io/tutorials/navigation/navigation-step-09.zip) (TS)[πŸ“₯ Download step 9](https://ui5.github.io/tutorials/navigation/navigation-step-09-js.zip) (JS). -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -73,7 +73,7 @@ This allows URLs like `webapp/index.html#/employees/3/resume?tab=Projects` where The `:?query:` parameter starts and ends with `:`, which means that it is optional. If you want to make it mandatory, you can use the `{?query}` syntax \(everything in between `{}` is considered as being mandatory\). -## webapp/view/employee/Resume.view.xml +### webapp/view/employee/Resume.view.xml ```xml [πŸ“₯ Download step 10](https://ui5.github.io/tutorials/navigation/navigation-step-10.zip) (TS)[πŸ“₯ Download step 10](https://ui5.github.io/tutorials/navigation/navigation-step-10-js.zip) (JS). -### Folder Structure for this Step +#### Folder Structure for this Step ![Folder Structure for this Step](assets/Tutorial_Navigation_and_Routing_Step_10b.png "Folder Structure for this Step") -## webapp/view/employee/Resume.view.xml +### webapp/view/employee/Resume.view.xml ```xml @@ -73,7 +73,7 @@ In the `resume` view we remove the content of the *Hobbies* and *Notes* tabs as Create the file `ResumeHobbies.view.xml` in the `webapp/view/employee` folder. Move the content for the tab that was previously in the `Resume` view to the newly created view. We don’t need a controller for this view as there is no additional logic involved. This view will be lazy-loaded and placed into the content of the *Hobbies* tab with navigation features. -## webapp/view/employee/ResumeNotes.view.xml \(New\) +### webapp/view/employee/ResumeNotes.view.xml \(New\) ```xml @@ -83,7 +83,7 @@ Create the file `ResumeHobbies.view.xml` in the `webapp/view/employee` folder. M Create the file `ResumeNotes.view.xml` in the `webapp/view/employee` folder similar to the *Hobbies* view to transform this tab to a separate view as well. -## `webapp/controller/employee/Resume.controller.ts/.js` +### webapp/controller/employee/Resume.controller.ts/.js ```ts // webapp/controller/employee/Resume.controller.ts @@ -213,7 +213,7 @@ Now we extend the `Resume` controller a little and add additional logic to the p These lines of code make sure that the targets are only loaded when they are needed \(β€œlazy loading”\). But the router does not know the new targets yet, so let’s create them in our routing configuration. -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -290,7 +290,7 @@ We have now implemented lazy loading for the tabs *Hobbies* and *Notes*. These t Try it out yourself: Open the *Network* tab of your browser's developer tools and click on the tabs of your app. In the network traffic you will see that `ResumeHobbies.view.xml` file is only loaded when the *Hobbies* tab is displayed the first time. The same applies for the *Notes* tab. Mission accomplished! -## Conventions +### Conventions - Lazy-load content that is not initially displayed to the user diff --git a/packages/navigation/steps/11/README.md b/packages/navigation/steps/11/README.md index 66d515f2b..bccc38485 100644 --- a/packages/navigation/steps/11/README.md +++ b/packages/navigation/steps/11/README.md @@ -1,32 +1,32 @@ -# Step 11: Assign Multiple Targets +## Step 11: Assign Multiple Targets In this step, we will add a new button to the home page to illustrate the usage of multiple targets for a route. When the button is pressed, a new page opens that contains two parts: a header part at the top and a content part. The content part displays a table of employees that can be sorted and searched. We will use the array notation in the routing configuration to assign multiple targets to a route - a feature that we have not yet introduced. -## Preview +### Preview -### New button Show Employee Overview +#### New button Show Employee Overview ![New button Show Employee Overview](assets/Tutorial_Navigation_and_Routing_Step_11a.png "New button Show Employee Overview") -### Employee Overview with search field +#### Employee Overview with search field ![Employee Overview with search field](assets/Tutorial_Navigation_and_Routing_Step_11b.png "Employee Overview with search field") -### Sort options for the Employee Overview +#### Sort options for the Employee Overview ![Sort options for the Employee Overview](assets/Tutorial_Navigation_and_Routing_Step_11c.png "Sort options for the Employee Overview") You can view this step live: [πŸ”— Live Preview of Step 11](https://ui5.github.io/tutorials/navigation/build/11/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 11](https://ui5.github.io/tutorials/navigation/navigation-step-11.zip) (TS)[πŸ“₯ Download step 11](https://ui5.github.io/tutorials/navigation/navigation-step-11-js.zip) (JS). -### Folder Structure for this Step +#### Folder Structure for this Step ![Folder Structure for this Step](assets/Tutorial_Navigation_and_Routing_Step_11d.png "Folder Structure for this Step") -## webapp/view/Home.view.xml +### webapp/view/Home.view.xml ```xml [πŸ“₯ Do First we add a new button to the `Home` view and add an event handler for the `press` event. -## `webapp/controller/Home.controller.ts/.js` +### webapp/controller/Home.controller.ts/.js ```ts // webapp/controller/Home.controller.ts @@ -94,7 +94,7 @@ sap.ui.define(["ui5/tutorial/navigation/controller/BaseController"], function (B As you know already from the previous steps, we add the `press` event handler `onNavToEmployeeOverview`. It navigates to the route `employeeOverview` which does not exist yet, so let’s create it. -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -197,7 +197,7 @@ The router makes sure that the parent view is loaded in addition to the target v - `EmployeeOverviewContent` -## webapp/view/employee/overview/EmployeeOverview.view.xml \(New\) +### webapp/view/employee/overview/EmployeeOverview.view.xml \(New\) ```xml @@ -256,7 +256,7 @@ The controller does not contain any logic yet, but we will add back navigation f Create the file `EmployeeOverviewTop.view.xml` and place it in the `webapp/view/employee/overview` folder. This view displays a static text for illustration purposes. Change it according to your own requirements. We don’t need a controller for this view -## webapp/view/employee/overview/EmployeeOverviewContent.view.xml \(New\) +### webapp/view/employee/overview/EmployeeOverviewContent.view.xml \(New\) ```xml [πŸ“₯ Download step 12](https://ui5.github.io/tutorials/navigation/navigation-step-12.zip) (TS)[πŸ“₯ Download step 12](https://ui5.github.io/tutorials/navigation/navigation-step-12-js.zip) (JS). -## webapp/manifest.json +### webapp/manifest.json ```json { @@ -72,7 +72,7 @@ You can download the solution for this step here: [πŸ“₯ Do In order to make the search bookmarkable we have to think about how the pattern of the corresponding route should match the bookmark. We decide to allow `/#/employees/overview?search=mySearchQueryString` in order to bookmark a search. Therefore, we simply extend our routing configuration a little. We add the optional `:?query:` parameter to the route `employeeOverview`. We keep in mind that we want to use `search` as the URL parameter for the search term that was entered in the search field. -## `webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js` +### webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js ```ts // webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts diff --git a/packages/navigation/steps/13/README.md b/packages/navigation/steps/13/README.md index b5f49f565..c9b1202dc 100644 --- a/packages/navigation/steps/13/README.md +++ b/packages/navigation/steps/13/README.md @@ -1,20 +1,20 @@ -# Step 13: Make Table Sorting Bookmarkable +## Step 13: Make Table Sorting Bookmarkable In this step, we will create a button at the top of the table which will change the sorting of the table. When the current sorting state of the table is changed, the sorting state will be reflected in the URL. This illustrates how to make the table sorting bookmarkable. -## Preview +### Preview -### Bookmarkable search and sorting +#### Bookmarkable search and sorting ![Bookmarkable search and sorting](assets/Tutorial_Navigation_and_Routing_Step_13.png "Bookmarkable search and sorting") You can view this step live: [πŸ”— Live Preview of Step 13](https://ui5.github.io/tutorials/navigation/build/13/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 13](https://ui5.github.io/tutorials/navigation/navigation-step-13.zip) (TS)[πŸ“₯ Download step 13](https://ui5.github.io/tutorials/navigation/navigation-step-13-js.zip) (JS). -## `webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js` +### webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js ```ts // webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts diff --git a/packages/navigation/steps/14/README.md b/packages/navigation/steps/14/README.md index df73c8429..1949822df 100644 --- a/packages/navigation/steps/14/README.md +++ b/packages/navigation/steps/14/README.md @@ -1,20 +1,20 @@ -# Step 14: Make Dialogs Bookmarkable +## Step 14: Make Dialogs Bookmarkable In this step, we want to allow bookmarking of the dialog box that is opened when the user clicks the *Sort* button. The dialog should automatically open when the URL contains the query parameter `showDialog`. -## Preview +### Preview -### Bookmark for a dialog +#### Bookmark for a dialog ![Bookmark for a dialog](assets/Tutorial_Navigation_and_Routing_Step_14.png "Bookmark for a dialog") You can view this step live: [πŸ”— Live Preview of Step 14](https://ui5.github.io/tutorials/navigation/build/14/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 14](https://ui5.github.io/tutorials/navigation/navigation-step-14.zip) (TS)[πŸ“₯ Download step 14](https://ui5.github.io/tutorials/navigation/navigation-step-14-js.zip) (JS). -## `webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js` +### webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js ```ts // webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts diff --git a/packages/navigation/steps/15/README.md b/packages/navigation/steps/15/README.md index f563ae72b..0dbb90a84 100644 --- a/packages/navigation/steps/15/README.md +++ b/packages/navigation/steps/15/README.md @@ -1,20 +1,20 @@ -# Step 15: Reuse an Existing Route +## Step 15: Reuse an Existing Route The *Employees* table displays employee data. However, the resumes of the employees are not accessible from this view yet. We could create a new route and a new view to visualize the resume again, but we could also simply reuse an existing route to cross-link the resume of a certain employee. In this step, we will add a feature that allows users to directly navigate to the resume of a certain employee. We will reuse the *Resume* page that we have created in an earlier step. This example illustrates that there can be multiple navigation paths that direct to the same page. -## Preview +### Preview -### Navigation to an existing route from a table item +#### Navigation to an existing route from a table item ![Navigation to an existing route from a table item](assets/Tutorial_Navigation_and_Routing_Step_15.png "Navigation to an existing route from a table item") You can view this step live: [πŸ”— Live Preview of Step 15](https://ui5.github.io/tutorials/navigation/build/15/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 15](https://ui5.github.io/tutorials/navigation/navigation-step-15.zip) (TS)[πŸ“₯ Download step 15](https://ui5.github.io/tutorials/navigation/navigation-step-15-js.zip) (JS). -## webapp/view/employee/overview/EmployeeOverviewContent.view.xml +### webapp/view/employee/overview/EmployeeOverviewContent.view.xml ```xml [πŸ“₯ Do In the `EmployeeOverviewContent` view we register an event handler for the `itemPress` event and set the type attribute of the `ColumnListItem` to `Active` so that we can choose an item and trigger the navigation. -## `webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js` +### webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts/.js ```ts // webapp/controller/employee/overview/EmployeeOverviewContent.controller.ts diff --git a/packages/navigation/steps/16/README.md b/packages/navigation/steps/16/README.md index 7e246dbce..9c8a27738 100644 --- a/packages/navigation/steps/16/README.md +++ b/packages/navigation/steps/16/README.md @@ -1,20 +1,20 @@ -# Step 16: Handle Invalid Hashes by Listening to Bypassed Events +## Step 16: Handle Invalid Hashes by Listening to Bypassed Events So far we have created many useful routes in our app. In the very early steps we have also made sure that a *Not Found* page is displayed in case the app was called with an invalid hash. Now, we proceed further and track invalid hashes to be able to detect and correct any invalid links or add new URL patterns that are often requested but not found. Therefore, we simply listen to the bypassed events -## Preview +### Preview -### Console output for invalid hashes when listening to bypassed events +#### Console output for invalid hashes when listening to bypassed events ![Console output for invalid hashes when listening to bypassed events](assets/Tutorial_Navigation_and_Routing_Step_16.png "Console output for invalid hashes when listening to bypassed events") You can view this step live: [πŸ”— Live Preview of Step 16](https://ui5.github.io/tutorials/navigation/build/16/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 16](https://ui5.github.io/tutorials/navigation/navigation-step-16.zip) (TS)[πŸ“₯ Download step 16](https://ui5.github.io/tutorials/navigation/navigation-step-16-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts diff --git a/packages/navigation/steps/17/README.md b/packages/navigation/steps/17/README.md index 5e4b7d68f..f5737b65c 100644 --- a/packages/navigation/steps/17/README.md +++ b/packages/navigation/steps/17/README.md @@ -1,20 +1,20 @@ -# Step 17: Listen to Matched Events of Any Route +## Step 17: Listen to Matched Events of Any Route In the previous step, we have listened for bypassed events to detect possible technical issues with our app. In this step, we want to improve the analysis use case even more by listening to any matched event of the route. We could use this information to measure how the app is used and how frequently the pages are called. Many Web analytic tools track page hits this way. The collected information can be used, for example to improve our app and its usability. -## Preview +### Preview -### Console output for routes matched by listening to routeMatched events +#### Console output for routes matched by listening to routeMatched events ![Console output for routes matched by listening to routeMatched events](assets/Tutorial_Navigation_and_Routing_Step_17.png "Console output for routes matched by listening to routeMatched events") You can view this step live: [πŸ”— Live Preview of Step 17](https://ui5.github.io/tutorials/navigation/build/17/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 17](https://ui5.github.io/tutorials/navigation/navigation-step-17.zip) (TS)[πŸ“₯ Download step 17](https://ui5.github.io/tutorials/navigation/navigation-step-17-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts diff --git a/packages/odatav4/steps/01/README.md b/packages/odatav4/steps/01/README.md index 754d26f77..52f916360 100644 --- a/packages/odatav4/steps/01/README.md +++ b/packages/odatav4/steps/01/README.md @@ -1,10 +1,10 @@ -# Step 1: The Initial App +## Step 1: The Initial App We start by setting up a simple app that loads data from an OData service and displays it in a table. We use a mock server to simulate requests to and responses from the service. The structure and data model created in this step will be used throughout this tutorial to illustrate the OData V4 features in OpenUI5. -## Preview +### Preview **Initial app with a simple table** @@ -12,7 +12,7 @@ The structure and data model created in this step will be used throughout this t *** -## Setup +### Setup The initial code for this step ships with the repository at [packages/odatav4/steps/01/](./). Open it and run: @@ -51,7 +51,7 @@ webapp/ └── App.view.xml ``` -## The Initial App +### The Initial App The downloaded code includes an app that displays a table containing a table of users. For performance reasons, the table only loads 10 users at a time. More data can be retrieved by using the *More* button at the bottom of the page. @@ -59,11 +59,11 @@ During the implementation of the app, we use local mock data so that we can conc The most important files are the following: -### `webapp/index.html` +#### webapp/index.html This file defines the home page of the app. It contains the bootstrap script and tells the runtime where to find our custom resources. It also initializes the mock server that intercepts all requests to the real *TripPin* service and sends back mock responses. -### `webapp/manifest.json` +#### webapp/manifest.json The `manifest.json` descriptor file contains the app configuration. In the `sap.app` section, the OData V4 service is configured as the default service: @@ -80,7 +80,7 @@ The `manifest.json` descriptor file contains the app configuration. In the `sap. ``` -### Mock server \(`webapp/localService/*`\) +#### Mock server \(`webapp/localService/*`\) > πŸ“ > The mock server included in this tutorial is only meant to support the features needed in this tutorial. Currently, there is no "general-purpose mock server" for application development available with OData V4 \(like there is for OData V2\). diff --git a/packages/odatav4/steps/02/README.md b/packages/odatav4/steps/02/README.md index a4e67f44a..a08e33e55 100644 --- a/packages/odatav4/steps/02/README.md +++ b/packages/odatav4/steps/02/README.md @@ -1,8 +1,8 @@ -# Step 2: Data Access and Client-Server Communication +## Step 2: Data Access and Client-Server Communication In this step, we see how the `Table` that is bound to the `People` entity set initially requests its data, and how the data can be refreshed. We use the *Console* tab in the browser developer tools to monitor the communication between the browser and the server. We see the initial request as well as the requests for refreshing the data. -## Preview +### Preview **App with a toolbar that contains a Refresh button** @@ -12,11 +12,11 @@ In this step, we see how the `Table` that is bound to the `People` entity set in You can view this step live: [πŸ”— Live Preview of Step 2](https://ui5.github.io/tutorials/odatav4/build/02/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 2](https://ui5.github.io/tutorials/odatav4/odatav4-step-02.zip) (TS)[πŸ“₯ Download step 2](https://ui5.github.io/tutorials/odatav4/odatav4-step-02-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -138,7 +138,7 @@ We add the event handler `onRefresh` to the controller. In this method, we retri We also add the private method `_getText` to retrieve translatable texts from the resource bundle \(`i18n` model\). -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml ... @@ -170,7 +170,7 @@ We also add the private method `_getText` to retrieve translatable texts from th We add the `headerToolbar` with a single `Button` to the `Table`. The button has a `press` event to which we attach an event handler called `onRefresh`. -## webapp/i18n/i18n.properties +### webapp/i18n/i18n.properties ``` # App Descriptor @@ -193,7 +193,7 @@ refreshSuccessMessage=Data refreshed We add the tooltip and message texts to the `properties` file. -## Under the Hood +### Under the Hood To get more insight into the client-server communication, we open the *Console* tab of the browser developer tools and then reload the app. diff --git a/packages/odatav4/steps/03/README.md b/packages/odatav4/steps/03/README.md index 1b0d246d5..d9d14bd40 100644 --- a/packages/odatav4/steps/03/README.md +++ b/packages/odatav4/steps/03/README.md @@ -1,10 +1,10 @@ -# Step 3: Automatic Data Type Detection +## Step 3: Automatic Data Type Detection In this step, we use the automatic data type detection of the OData V4 model to parse, validate, and format user entries. The service metadata contains type information for the properties of each entity. The OData V4 Model utilizes this information to compute the corresponding OpenUI5 type, including constraints, and sets this type to the OpenUI5 property binding for the entity property. For example, for `` the OpenUI5 type `Int64` is used, which corresponds to the OData type `Edm.Int64`. -## Preview +### Preview **Input does not match the underlying data type** @@ -12,11 +12,11 @@ The OData V4 Model utilizes this information to compute the corresponding OpenUI You can view this step live: [πŸ”— Live Preview of Step 3](https://ui5.github.io/tutorials/odatav4/build/03/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 3](https://ui5.github.io/tutorials/odatav4/odatav4-step-03.zip) (TS)[πŸ“₯ Download step 3](https://ui5.github.io/tutorials/odatav4/odatav4-step-03-js.zip) (JS). -## `webapp/manifest.json` +### webapp/manifest.json ```json { @@ -58,7 +58,7 @@ We now run the app using the `index.html` file and enter values that don't match > πŸ“ > If you explicitly define a type in the binding info of a control, the automatic type detection for that binding will be turned off. For example, if you change the `Input` for `Age` in the view to ` diff --git a/packages/odatav4/steps/04/README.md b/packages/odatav4/steps/04/README.md index fdfd04060..07231df87 100644 --- a/packages/odatav4/steps/04/README.md +++ b/packages/odatav4/steps/04/README.md @@ -1,8 +1,8 @@ -# Step 4: Filtering, Sorting, and Counting +## Step 4: Filtering, Sorting, and Counting In this step, we add features to filter, sort, and count the user data by using the OData V4 model API to apply OData system query options `$filter`, `$orderby`, and `$count`. -## Preview +### Preview **App now has a search field, the entries can be sorted, and you can see how many entities are loaded and how many more are available** @@ -12,11 +12,11 @@ In this step, we add features to filter, sort, and count the user data by using You can view this step live: [πŸ”— Live Preview of Step 4](https://ui5.github.io/tutorials/odatav4/build/04/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 4](https://ui5.github.io/tutorials/odatav4/odatav4-step-04.zip) (TS)[πŸ“₯ Download step 4](https://ui5.github.io/tutorials/odatav4/odatav4-step-04-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -152,7 +152,7 @@ The **`onSort`** event handler requests the data unordered, or in ascending orde We add the `order` property to variable `oJSONData` in `onInit` method. This property stores the current sort order. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 5](https://ui5.github.io/tutorials/odatav4/odatav4-step-05.zip) (TS)[πŸ“₯ Download step 5](https://ui5.github.io/tutorials/odatav4/odatav4-step-05-js.zip) (JS). -## `webapp/manifest.json` +### webapp/manifest.json ```json ... diff --git a/packages/odatav4/steps/06/README.md b/packages/odatav4/steps/06/README.md index fc4104188..af8f75dfe 100644 --- a/packages/odatav4/steps/06/README.md +++ b/packages/odatav4/steps/06/README.md @@ -1,8 +1,8 @@ -# Step 6: Create and Edit +## Step 6: Create and Edit In this step, we will make it possible to create and edit \(update\) user data from the user interface and send the data to the back end. -## Preview +### Preview **Data can now be edited and added.** @@ -10,11 +10,11 @@ In this step, we will make it possible to create and edit \(update\) user data f You can view this step live: [πŸ”— Live Preview of Step 6](https://ui5.github.io/tutorials/odatav4/build/06/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 6](https://ui5.github.io/tutorials/odatav4/odatav4-step-06.zip) (TS)[πŸ“₯ Download step 6](https://ui5.github.io/tutorials/odatav4/odatav4-step-06-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -412,7 +412,7 @@ The `onResetChanges` method handles discarding pending changes. It uses the `res The `onInputChange` event handler manages entries in any of the `Input` fields and triggers updates to the `appView` model as needed. It does an extra check on the `UserName` field to make sure that users cannot be saved without a `UserName`. Otherwise the OData service would return errors because `UserName` is a mandatory field. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 7](https://ui5.github.io/tutorials/odatav4/odatav4-step-07.zip) (TS)[πŸ“₯ Download step 7](https://ui5.github.io/tutorials/odatav4/odatav4-step-07-js.zip) (JS). -## `webapp/App.controller.ts/.js` +### webapp/App.controller.ts/.js ``` ... @@ -88,7 +88,7 @@ You can download the solution for this step here: [πŸ“₯ Do We add the `onDelete` event handler to the controller. In the event handler, we check whether an item is selected in the table and if so, we retrieve the binding context of the selection and call its `delete` method. By doing this, the context is removed from the table on the client side and the deletion is stored as a pending change in the update group of the table's list binding. A call to `_setUIChanges` ensures that the `appView` model reflects the deletion as a pending change and that the *Save* button becomes enabled. The deletion will be submitted with all other changes related to the same update group once the *Save* button is pressed. If the deletion fails on the server side, or the changes are reset via API, the related entity is restored in the table automatically. To distinguish these two situations, the rejected error has `canceled` set to `true` in case of a reset. -## webapp/App.view.xml +### webapp/App.view.xml ``` [πŸ“₯ Download step 8](https://ui5.github.io/tutorials/odatav4/odatav4-step-08.zip) (TS)[πŸ“₯ Download step 8](https://ui5.github.io/tutorials/odatav4/odatav4-step-08-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -76,7 +76,7 @@ The invocation is asynchronous; the `invoke` method therefore returns a `Promise > πŸ“ > Many of the methods in the OData V4 API of OpenUI5 return a `Promise` to manage asynchronous processing -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 9](https://ui5.github.io/tutorials/odatav4/odatav4-step-09.zip) (TS)[πŸ“₯ Download step 9](https://ui5.github.io/tutorials/odatav4/odatav4-step-09-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts @@ -138,7 +138,7 @@ Afterwards the detail area is made visible and is resized. The application also needs to close the detail area if its binding context is deleted. If the deleted context is restored after a failed DELETE request, or undeleted via `Context#resetChanges`, it could be shown in the detail area again, unless the user had selected another row in the meantime. Hence, we call `_setDetailArea` without a context once the context gets deleted, and with the restored context in the error handler of the `Context#delete` API. In `_setDetailArea` we resize the view based on the given context in an appropriate way. -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml [πŸ“₯ Download step 10](https://ui5.github.io/tutorials/odatav4/odatav4-step-10.zip) (TS)[πŸ“₯ Download step 10](https://ui5.github.io/tutorials/odatav4/odatav4-step-10-js.zip) (JS). -## `webapp/controller/App.controller.ts/.js` +### webapp/controller/App.controller.ts/.js ```ts // webapp/controller/App.controller.ts diff --git a/packages/odatav4/steps/11/README.md b/packages/odatav4/steps/11/README.md index ab0602a00..fa4da0542 100644 --- a/packages/odatav4/steps/11/README.md +++ b/packages/odatav4/steps/11/README.md @@ -1,8 +1,8 @@ -# Step 11: Add Table with :n Navigation to Detail Area +## Step 11: Add Table with :n Navigation to Detail Area In this step we add a table with additional information to the detail area. -## Preview +### Preview **A table containing information about friends of the selected user is added** @@ -10,11 +10,11 @@ In this step we add a table with additional information to the detail area. You can view this step live: [πŸ”— Live Preview of Step 11](https://ui5.github.io/tutorials/odatav4/build/11/index-cdn.html). -## Coding +### Coding You can download the solution for this step here: [πŸ“₯ Download step 11](https://ui5.github.io/tutorials/odatav4/odatav4-step-11.zip) (TS)[πŸ“₯ Download step 11](https://ui5.github.io/tutorials/odatav4/odatav4-step-11-js.zip) (JS). -## webapp/view/App.view.xml +### webapp/view/App.view.xml ```xml ``` -### webapp/App.controller.js \(New\) +### webapp/App.controller.ts/.js \(New\) In our controller, we load the `Controller` base class and extend it to define the behavior of our app. We also add the event handler for our button. The `MessageToast` is also loaded as a dependency. When the button is pressed, we now display a "Hello App" message. diff --git a/packages/quickstart/steps/03/README.md b/packages/quickstart/steps/03/README.md index 80a9887de..b3afdb86e 100644 --- a/packages/quickstart/steps/03/README.md +++ b/packages/quickstart/steps/03/README.md @@ -114,7 +114,7 @@ Don't worry too much about the details, we will explain them in the next tutoria ``` -### webapp/App.controller.js +### webapp/App.controller.ts/.js The `onPress` function now also triggers the navigation to the `intro` page. We fetch the `app` control by its ID and instruct it to navigate by calling the `to` method. diff --git a/packages/walkthrough/steps/09/README.md b/packages/walkthrough/steps/09/README.md index c3b46013a..e136dc52f 100644 --- a/packages/walkthrough/steps/09/README.md +++ b/packages/walkthrough/steps/09/README.md @@ -21,9 +21,20 @@ You can access the live preview by clicking on this link: [πŸ”— Live Preview of After this step your project structure will look like the figure below. We will create the `Component.ts/.js` file now and modify the related files in the app. -![Folder Structure for this Step](assets/loio1e237a36972a44ac8522dd1a540ac062_LowRes.png "Folder Structure for this Step") - -*Folder Structure for this Step* +```text +webapp/ +β”œβ”€β”€ Component.ts/.js +β”œβ”€β”€ controller/ +β”‚ └── App.controller.ts/.js +β”œβ”€β”€ i18n/ +β”‚ └── i18n.properties +β”œβ”€β”€ index-cdn.html +β”œβ”€β”€ index.html +β”œβ”€β”€ index.ts/.js +β”œβ”€β”€ manifest.json +└── view/ + └── App.view.xml +``` *** ### Coding diff --git a/packages/walkthrough/steps/09/assets/loio1e237a36972a44ac8522dd1a540ac062_LowRes.png b/packages/walkthrough/steps/09/assets/loio1e237a36972a44ac8522dd1a540ac062_LowRes.png deleted file mode 100644 index 1da9f1413a862f51075f1921528d26f93f221903..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23291 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 Structure for this Step* +```text +webapp/ +β”œβ”€β”€ Component.ts/.js +β”œβ”€β”€ controller/ +β”‚ β”œβ”€β”€ App.controller.ts/.js +β”‚ β”œβ”€β”€ HelloPanel.controller.ts/.js +β”‚ └── InvoiceList.controller.ts/.js +β”œβ”€β”€ css/ +β”‚ └── style.css +β”œβ”€β”€ i18n/ +β”‚ └── i18n.properties +β”œβ”€β”€ index-cdn.html +β”œβ”€β”€ index.html +β”œβ”€β”€ localService/ +β”‚ β”œβ”€β”€ metadata.xml +β”‚ β”œβ”€β”€ mockdata/ +β”‚ β”‚ └── Invoices.json +β”‚ └── mockserver.ts/.js +β”œβ”€β”€ manifest.json +β”œβ”€β”€ model/ +β”‚ └── formatter.ts/.js +β”œβ”€β”€ test/ +β”‚ β”œβ”€β”€ initMockServer.ts/.js +β”‚ β”œβ”€β”€ mockServer-cdn.html +β”‚ └── mockServer.html +└── view/ + β”œβ”€β”€ App.view.xml + β”œβ”€β”€ HelloDialog.fragment.xml + β”œβ”€β”€ HelloPanel.view.xml + └── InvoiceList.view.xml +``` You can access the live preview by clicking on this link: [πŸ”— Live Preview of Step 26](https://ui5.github.io/tutorials/walkthrough/build/26/test/mockServer-cdn.html). diff --git a/packages/walkthrough/steps/26/assets/loio7a5e2b02d72d40d388f5e601d7de74df_LowRes.png b/packages/walkthrough/steps/26/assets/loio7a5e2b02d72d40d388f5e601d7de74df_LowRes.png deleted file mode 100644 index 09902422e4d6cd97810ded9a1d97e7e1164a79e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63098 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 V3p0loM>f}h*9C7suSPs2^FQlop%?%F diff --git a/packages/walkthrough/steps/27/README.md b/packages/walkthrough/steps/27/README.md index b17701547..829f12cf0 100644 --- a/packages/walkthrough/steps/27/README.md +++ b/packages/walkthrough/steps/27/README.md @@ -19,8 +19,47 @@ Actually, every feature that we added to the app so far, would require a separat We add a new folder `unit` under the `test` folder and a `model` subfolder where we will place our formatter unit test. The folder structure matches the app structure to easily find the corresponding unit tests. -![Folder Structure for this Step](assets/loio1b5613ac3ab94757af2c7823039222a9_LowRes.png "Folder Structure for this Step") -*Folder Structure for this Step* +```text +webapp/ +β”œβ”€β”€ Component.ts/.js +β”œβ”€β”€ controller/ +β”‚ β”œβ”€β”€ App.controller.ts/.js +β”‚ β”œβ”€β”€ HelloPanel.controller.ts/.js +β”‚ └── InvoiceList.controller.ts/.js +β”œβ”€β”€ css/ +β”‚ └── style.css +β”œβ”€β”€ i18n/ +β”‚ └── i18n.properties +β”œβ”€β”€ index-cdn.html +β”œβ”€β”€ index.html +β”œβ”€β”€ localService/ +β”‚ β”œβ”€β”€ metadata.xml +β”‚ β”œβ”€β”€ mockdata/ +β”‚ β”‚ └── Invoices.json +β”‚ └── mockserver.ts/.js +β”œβ”€β”€ manifest.json +β”œβ”€β”€ model/ +β”‚ └── formatter.ts/.js +β”œβ”€β”€ test/ +β”‚ β”œβ”€β”€ Test.cdn.qunit.html +β”‚ β”œβ”€β”€ Test.qunit.html +β”‚ β”œβ”€β”€ initMockServer.ts/.js +β”‚ β”œβ”€β”€ mockServer-cdn.html +β”‚ β”œβ”€β”€ mockServer.html +β”‚ β”œβ”€β”€ testsuite.cdn.qunit.html +β”‚ β”œβ”€β”€ testsuite.cdn.qunit.ts/.js +β”‚ β”œβ”€β”€ testsuite.qunit.html +β”‚ β”œβ”€β”€ testsuite.qunit.ts/.js +β”‚ └── unit/ +β”‚ β”œβ”€β”€ model/ +β”‚ β”‚ └── formatter.ts/.js +β”‚ └── unitTests.qunit.ts/.js +└── view/ + β”œβ”€β”€ App.view.xml + β”œβ”€β”€ HelloDialog.fragment.xml + β”œβ”€β”€ HelloPanel.view.xml + └── InvoiceList.view.xml +``` You can access the live preview by clicking on this link: [πŸ”— Live Preview of Step 27](https://ui5.github.io/tutorials/walkthrough/build/27/test/Test.cdn.qunit.html?testsuite=test-resources/ui5/tutorial/walkthrough/testsuite.cdn.qunit&test=unit/unitTests). diff --git a/packages/walkthrough/steps/27/assets/loio1b5613ac3ab94757af2c7823039222a9_LowRes.png b/packages/walkthrough/steps/27/assets/loio1b5613ac3ab94757af2c7823039222a9_LowRes.png deleted file mode 100644 index 362bcde5d47524d0cc9afb1403d645429d2cf1e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75913 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�k!d@p2Z>nSlE9ayN zWQ^Pp3i>lQJY-TR0&lsI83Koq2nf7;ZgcTL1#2tl6lnaF;OXL$CEr8PD=esCbh^{@ zJNY0`^yDASrUtt$l0%}xw;(dEtlYb@O^c1{kpNREOe_v})G}mb>p&8LIb9hV&?!FI zwvS|u#pG-42L%Y70g?I-U9S$5l;d5yhTJUTqcz_6{Ym?YfQ3NLP#>UrIQ_37Ab~?A zN7>i6FQjB@j10{cv+hdOP~&f8Yw0fj_$J=)WVMom1CDegnEx)2L_VGqU;Cj~udw_M zp`c*kZw2arBNyA3f9LB_!}rz!Gf*vY!#bJ73`hYNRS;kWhFG?dseHQ@@Ip!u1Ejn66GgF*smH$! zUN?zH4+Vep?Z0Pyb<-Y2f#UilDAKzm%)>T3r2=<_T>7(8bp^CR*FbAgXN)MdnkDI7 zE$N|TY>Z+r9A!T*G2oCd$*02+SsOM-a{L%S-051gG2DK5;bc8jc8g1uz+h-sx6_>p z@I~XS$S0xxP=ICItA37+(d@pxdQaF$!$9(5!Lh!H1e9j>lrS-@GXPf-17krzfc~JT zPg_}+*HVR31p91R_S9*?AO%>n1?4XkHA+XA{SjS{(dCK9mC(2m!loPGEB z(-SO=8^0dI1Z8@}6k~&-OurpG4kQ@Tw=$U4YFrabM}vy?uD!Q3sPN8ayO6QZ%(9GF zPw~M0g*_wcE?6(Rhu3HI`pZ!jtu{30dOq^)qe8{iOMolauDNUEr3MR@TRMb7!gqhP zR6XFTjxX{@OYE~QwFN2_K2U9U@ph@-+N4o^aH--@!QXhnIy}3u@+mR#3LFMf;%O$9 z)T1t~tpkByzPgIaTJR_^t^_{*hZg`OLyH0AMz;Psi|c5xnIRDQm|r*yBl#W>cjD|)Jxov&f;AY`YfXq zbTS5q?;k3%yT5nL?7ZoF_-mn7(9zi)-B}iq(g7LzW}Zox5cJe9C`Pyz_FWp>Q!yBb zF>H5X8mttVP=n&1xtiH${u`z=|5p>eZx6fH8t2~4gKs_|Kk$FkhkyIP{?La%r7<`G z^&s@th5NS;4D!e45C`x3M85!TVfBw^0sW@kq1d)|Zgaup*S7Qy{dIdbDM9J*{xBE} z11bZ##MDHn{AdgArXvpoR=XPdOgR>175rHe{(F#g$AwM<%-G{Loy;am)qdfq;^+a3 zzt_OBshA1d_mLOdo9!Z8;%wcCY^ zYVVyAord@B01&Rs=#BjG5(b_`I4!pCt1gu-Zqj>6bw7*`#l>y??tkxF^8dO>)yRwy5uJ)|%eM{C3R&;chg+(cBBc}+|MaB|s z2O!9Qr)mc)aHMprs12T8+t#63Y8UA@` z!4Ys~c!}OMw*6)azNGq;bgb@T+x*u&1#>yFWfSKI(S~iXCnLjm5bp(jDTeQxdjfs( zYjP|Hv_`7p0X@b%!y%^yDtWIuwZ?%auUgh3Y{s9qK$w8aCEB(Z8TFY9A!$`|Inau? z4*~)t5I&r91Q7ZqHb-}2Vg0o7X+-1P1DNVn_dPyGqC`{#38s#<