Skip to content

Commit

Permalink
OpenUI5 Documentation Update 21.12.2024
Browse files Browse the repository at this point in the history
  • Loading branch information
openui5bot committed Dec 21, 2024
1 parent 3e3ccce commit 0482f5a
Show file tree
Hide file tree
Showing 19 changed files with 38 additions and 38 deletions.
4 changes: 2 additions & 2 deletions docs/ARIA_Event_Handling_79a9c51.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ The affected regions of the UI should have the property `aria-live` set to `true

### Event Handling

Accessible events are designed as a signaling mechanism for screen readers. An example for this is when parts of the UI update, either as a result of a direct user action \(such as performing a selection\) or by software \(such as *incoming mail* messages or popups\). Events like a dialog showing up or content updates of parts of the screen are handled by assigning specific roles and properties of the UI elements \(for example, an HTML `<input type=checkbox>` element, would need <code>role=dialog”</code> or property `aria-live` set accordingly\). Screen readers then listen to accessible events raised by browsers for these UI parts and react accordingly.
Accessible events are designed as a signaling mechanism for screen readers. An example for this is when parts of the UI update, either as a result of a direct user action \(such as performing a selection\) or by software \(such as "*incoming mail*" messages or popups\). Events like a dialog showing up or content updates of parts of the screen are handled by assigning specific roles and properties of the UI elements \(for example, an HTML `<input type=checkbox>` element, would need `role="dialog"` or property `aria-live` set accordingly\). Screen readers then listen to accessible events raised by browsers for these UI parts and react accordingly.

When the app is loading or fetching information, the ARIA property <code>aria-busy=true”</code> should be set for the corresponding region.
When the app is loading or fetching information, the ARIA property `aria-busy="true"` should be set for the corresponding region.

Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,5 @@ All images and icons must have a textual explanation that the screen reader can
- The screen reader information must be available at the focus points \(axis values, dialog info, legend\)


You should hide image controls or controls with background CSS images used for pure decoration purposes by using the <code>aria-hidden=true”</code> property.
You should hide image controls or controls with background CSS images used for pure decoration purposes by using the `aria-hidden="true"` property.

2 changes: 1 addition & 1 deletion docs/Basic_Example_How_to_Use_Gherkin_4b0c519.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ Try executing the test now. You should see something like this:

Step 1 is green because a matching step definition was found in the steps file. In Gherkin, the test harness always checks for the existence of the step definition first before executing the step definition's function. After Gherkin finds a step definition, it executes the step definition's function, and thus executes any QUnit assertions inside the function.

In step 2, notice how the text "This test will fail!" is copied from the steps file. You can use this functionality to make it easier to debug your test. We recommend that you start any QUnit assertion comment with the word Verified to make it easier to read your test executions.
In step 2, notice how the text "This test will fail!" is copied from the steps file. You can use this functionality to make it easier to debug your test. We recommend that you start any QUnit assertion comment with the word "Verified" to make it easier to read your test executions.

***

Expand Down
2 changes: 1 addition & 1 deletion docs/Behavior_driven_Development_with_Gherkin_45ac9f1.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Since writing integration tests can be time-consuming, it's better to use unit t

### Gherkin

Gherkin is written in JavaScript and is fully compatible with OpenUI5, OPA, and QUnit. It is based on the cucumber tool.
Gherkin is written in JavaScript and is fully compatible with OpenUI5, OPA, and QUnit. It is based on the "cucumber" tool.

The advantages of using Gherkin are:

Expand Down
8 changes: 4 additions & 4 deletions docs/Keyboard_Usage_of_ARIA_Role_Mapped_Controls_e6cd547.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ Screen readers offer lists that group certain types of elements. These lists eas

- The panel heading hierarchy must be logical \(for example, nested panels must have higher hierarchy levels\).

- Headings must be referenced by the containers they belong to \(using <code>aria-labelledby = HEADING_ID”</code>\).
- Headings must be referenced by the containers they belong to \(using `aria-labelledby = "HEADING_ID"`\).


- **Links**
Expand All @@ -65,7 +65,7 @@ Screen readers offer lists that group certain types of elements. These lists eas

- Sometimes list items may need special roles \(for example `menuitem`\).

- For lists with a specific number of items, speech output should always be *Current item number of N total items*. No matter how many items are visible, if the total number is not known, speech output should always be *Current item number*.
- For lists with a specific number of items, speech output should always be "*Current item number of N total items*". No matter how many items are visible, if the total number is not known, speech output should always be "*Current item number*".


- **Tables**
Expand All @@ -74,15 +74,15 @@ Screen readers offer lists that group certain types of elements. These lists eas

- Tables must have titles.

- Layout tables for presentational purposes must be coded as such \(using ARIA <code>role=presentation”</code>\). Then they are not displayed in the table list.
- Layout tables for presentational purposes must be coded as such \(using ARIA `role="presentation"`\). Then they are not displayed in the table list.

- Editable and active cells may require special interaction models. During navigation, all screen reader relevant information must be available at the focus location.

- Tables have to properly associate and identify \(even hierarchical\) row/column headers. They have to be announced for every cell.

- In case there are no visible headers, but information is organized in a table-like layout with individual columns/cells, a respective row/column identifier has to be provided.

- For tables with a specific number of rows, speech output should always be *Current row of N total rows*. No matter how many rows are visible, if the total number is not known, speech output should always be *Current row*.
- For tables with a specific number of rows, speech output should always be "*Current row of N total rows*". No matter how many rows are visible, if the total number is not known, speech output should always be "*Current row*".



Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ Overview, how the component metadata are mapped to the manifest \(descriptor for
For compatibility reasons, the mapping to the `manifest.json` file is done automatically. If a metadata property has been defined, it can also be consumed via the corresponding property of the `manifest.json` file. For a detailed step-by-step guide, see [Creating a Manifest File for Existing Apps](Creating_a_Manifest_File_for_Existing_Apps_3a9baba.md).

> ### Note:
> To benefit from the performance improvements that can be achieved by using manifest first, we recommend to migrate the component metadata to the `manifest.json` file. For more information about manifest first, see the *Manifest First Function* section in [Manifest \(Descriptor for Applications, Components, and Libraries\)](Manifest_Descriptor_for_Applications_Components_and_Libraries_be0cf40.md).
> To benefit from the performance improvements that can be achieved by using "manifest first", we recommend to migrate the component metadata to the `manifest.json` file. For more information about manifest first, see the *Manifest First Function* section in [Manifest \(Descriptor for Applications, Components, and Libraries\)](Manifest_Descriptor_for_Applications_Components_and_Libraries_be0cf40.md).
**Mapping Table**

Expand Down
14 changes: 7 additions & 7 deletions docs/Navigation_and_Routing_Tutorial_1b6dcd3.md
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,10 @@ In this step we will modify the app and introduce routing. Instead of having the
3. [Step 3: Catch Invalid Hashes](Step_3_Catch_Invalid_Hashes_e047e05.md "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
might also know this as a &quot;404&quot; 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.")
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.
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.
4. [Step 4: Add a Back Button to Not Found Page](Step_4_Add_a_Back_Button_to_Not_Found_Page_66670b0.md "When we are on the Not Found page because of an invalid hash,
we want to get back to our app to select another page. Therefore, we will add a
Back button to the Not Found view and make
Expand All @@ -81,24 +81,24 @@ In this step, we'll create a second button on the home page, with which we can n
mandatory parameters to identify objects in an app.")
In this step, we implement a feature that allows the user to click on an employee in the list to see additional details of the employee. A route pattern can have one or more mandatory parameters to identify objects in an app.
8. [Step 8: Navigate with Flip Transition](Step_8_Navigate_with_Flip_Transition_3e5f6f3.md "In this step, we want to illustrate how to navigate to a page with a custom
transition animation. Both forward and backward navigation will use the flip
transition animation. Both forward and backward navigation will use the &quot;flip&quot;
transition but with a different direction. We will create a simple link on the
Employee view that triggers a flip navigation to a page that
displays the resume data of a certain employee. Pressing the Back
button will navigate back to the Employee view with a reversed flip
transition.")
In this step, we want to illustrate how to navigate to a page with a custom transition animation. Both forward and backward navigation will use the flip transition but with a different direction. We will create a simple link on the *Employee* view that triggers a flip navigation to a page that displays the resume data of a certain employee. Pressing the *Back* button will navigate back to the *Employee* view with a reversed flip transition.
In this step, we want to illustrate how to navigate to a page with a custom transition animation. Both forward and backward navigation will use the "flip" transition but with a different direction. We will create a simple link on the *Employee* view that triggers a flip navigation to a page that displays the resume data of a certain employee. Pressing the *Back* button will navigate back to the *Employee* view with a reversed flip transition.
9. [Step 9: Allow Bookmarkable Tabs with Optional Query Parameters](Step_9_Allow_Bookmarkable_Tabs_with_Optional_Query_Parameters_b8561ff.md "The resume view contains four tabs as we have seen in the previous
steps. 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.")
The `resume` view contains four tabs as we have seen in the previous steps. 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.
10. [Step 10: Implement Lazy Loading](Step_10_Implement_Lazy_Loading_cdab0a1.md "In the previous steps, we have implemented a Resume view that
10. [Step 10: Implement "Lazy Loading"](Step_10_Implement_Lazy_Loading_cdab0a1.md "In the previous steps, we have implemented a Resume view that
uses tabs to display data. The complete content of the tabs is loaded once, no matter which
tab is currently displayed. We can increase the performance of our app by avoiding to load
content that is not visible. Therefore, we implement a lazy loading feature that only
content that is not visible. Therefore, we implement a &quot;lazy loading&quot; feature that only
loads the view and data when requested by the user. ")
In the previous steps, we have implemented a *Resume* view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a lazy loading feature that only loads the view and data when requested by the user.
In the previous steps, we have implemented a *Resume* view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a "lazy loading" feature that only loads the view and data when requested by the user.
11. [Step 11: Assign Multiple Targets](Step_11_Assign_Multiple_Targets_b01840e.md "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
Expand Down
8 changes: 4 additions & 4 deletions docs/Step_10_Implement_Lazy_Loading_cdab0a1.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@

view on: [demo kit nightly build](https://sdk.openui5.org/nightly/#/topic/cdab0a1123514cc08cf2c8deb22f312e) | [demo kit latest release](https://sdk.openui5.org/topic/cdab0a1123514cc08cf2c8deb22f312e)</div>

## Step 10: Implement Lazy Loading
## Step 10: Implement "Lazy Loading"

In the previous steps, we have implemented a *Resume* view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a lazy loading feature that only loads the view and data when requested by the user.
In the previous steps, we have implemented a *Resume* view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a "lazy loading" feature that only loads the view and data when requested by the user.

***

Expand Down Expand Up @@ -151,7 +151,7 @@ sap.ui.define([

Now we extend the `resume` controller a little and add additional logic to the part of the `_onRouteMatched` function where a new tab has been selected and validated. In case the `selectedKey` matches `Hobbies` or `Notes` we call `this.getRouter().getTargets().display("resumeTab" + oQuery.tab)` to display the corresponding target manually. Here the valid targets are `resumeTabHobbies` and `resumeTabNotes` as we have changed the behavior for these two tabs by creating separate views.

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.
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.

***

Expand Down Expand Up @@ -220,7 +220,7 @@ These lines of code make sure that the targets are only loaded when they are nee

We add the `resumeTabHobbies` and `resumeTabNotes` targets to the descriptor file with additional fields that override the default configuration as we now want to display the targets locally inside the `IconTabBar` control and not as pages of the app.

The `resumeTabHobbies` target sets the parent property to `employeeResume`. The parent property expects the name of another target. In our case, this makes sure that the view from the parent target `employeeResume` is loaded before the target `resumeTabHobbies` is displayed. This can be considered as a view dependency. By setting the `controlId` and `controlAggregation` properties the router places the view `ResumeHobbies` into the `content` aggregation of the `IconTabFilter` control with ID `hobbiesTab`. We also set a parameter `id` to a custom ID to illustrate how you could overrule a hard-coded ID inside a view.
The `resumeTabHobbies` target sets the parent property to `employeeResume`. The parent property expects the name of another target. In our case, this makes sure that the view from the parent target `employeeResume` is loaded before the target `resumeTabHobbies` is displayed. This can be considered as a "view dependency". By setting the `controlId` and `controlAggregation` properties the router places the view `ResumeHobbies` into the `content` aggregation of the `IconTabFilter` control with ID `hobbiesTab`. We also set a parameter `id` to a custom ID to illustrate how you could overrule a hard-coded ID inside a view.

> ### Note:
> Each target can define only one parent with its parent property. This is similar to the OpenUI5 control tree where each control can have only one parent control \(accessed with the method `getParent()` of `sap.ui.base.ManagedObject`\). The `controlId` property always references a control inside the parent view that is specified with the `parent` target.
Expand Down
2 changes: 1 addition & 1 deletion docs/Step_11_Assign_Multiple_Targets_b01840e.md
Original file line number Diff line number Diff line change
Expand Up @@ -484,7 +484,7 @@ Add the new texts to the `properties` file.

**Parent topic:**[Navigation and Routing Tutorial](Navigation_and_Routing_Tutorial_1b6dcd3.md "OpenUI5 comes with a powerful routing API that helps you control the state of your application efficiently. This tutorial will illustrate all major features and APIs related to navigation and routing in OpenUI5 apps by creating a simple and easy to understand mobile app. It represents a set of best practices for applying the navigation and routing features of OpenUI5 to your applications.")

**Next:**[Step 10: Implement Lazy Loading](Step_10_Implement_Lazy_Loading_cdab0a1.md "In the previous steps, we have implemented a Resume view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a lazy loading feature that only loads the view and data when requested by the user.")
**Next:**[Step 10: Implement "Lazy Loading"](Step_10_Implement_Lazy_Loading_cdab0a1.md "In the previous steps, we have implemented a Resume view that uses tabs to display data. The complete content of the tabs is loaded once, no matter which tab is currently displayed. We can increase the performance of our app by avoiding to load content that is not visible. Therefore, we implement a &quot;lazy loading&quot; feature that only loads the view and data when requested by the user.")

**Previous:**[Step 12: Make a Search Bookmarkable](Step_12_Make_a_Search_Bookmarkable_e85da53.md "In this step we will make the search bookmarkable. This allows users to search for employees in the Employees table and they can bookmark their search query or share the URL.")

Expand Down
Loading

0 comments on commit 0482f5a

Please sign in to comment.