Skip to content

Port extensibility customization guide to XTravels - #2917

Draft
nkaputnik wants to merge 2 commits into
mainfrom
port-extensibility-guide-to-xtravels
Draft

nkaputnik wants to merge 2 commits into
mainfrom
port-extensibility-guide-to-xtravels

Conversation

@nkaputnik

Copy link
Copy Markdown
Contributor

What

Ports the extensibility customization guide from the Orders/bookshop sample to XTravels.

Changes

  • Model-only extension walkthrough using x_priority (enum high/medium/low) and x_CostCenter (association to a new x_CostCenters code list), extending only app-local sap.capire.travels entities.
  • Environment setup rewritten for XTravels: multi-repo workspace (xtravels, xflights, common, s4) with npm workspace globs, local multitenancy via MTX sidecar, and tenant subscription.
  • All four screenshots regenerated against a running XTravels tenant:
    • base Travels list
    • extension project readme
    • Fiori preview showing the Priority and Cost Center columns
    • deployed tenant UI showing the Priority and Cost Center columns
  • Removed the superseded Orders screenshots.

Notes

  • Draft for review.
  • The Cost Center column is subject to Fiori responsive pop-in, so the preview and deployed screenshots were captured at a wide viewport to show it.

Port the extensibility customization guide from the Orders/bookshop
sample to XTravels: model-only extension (x_priority + x_CostCenter),
multi-repo workspace setup, local multitenancy, and tenant subscription.

Regenerate all four screenshots against a running XTravels tenant:
- base Travels list
- extension project readme
- Fiori preview with Priority and Cost Center columns
- deployed tenant UI with Priority and Cost Center columns

Remove the superseded Orders screenshots.
@hyperspace-pr-bot

Copy link
Copy Markdown
Contributor

👋 Hi — I'm PR Bot, your SAP code review assistant.

I'll automatically review your pull requests for code quality, security, and SAP compliance. Get an overview of what I do →

What I do

  • Summarize your pull request changes
  • Review code for quality, correctness, and reliability
  • Suggest fixes when a pipeline job fails

Key commands

Command Description
/review [--all] Trigger a code review. Add --all to include files excluded by excluded_paths.
/summarize Generate a PR summary
/ask <question> Ask about the current changes
/help See all available commands

*This introduction message will be shown to you only once, you will not see it in future PRs.

@hyperspace-pr-bot

hyperspace-pr-bot Bot commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

Control Panel

Hi, I'm an AI-powered Review Bot that helps you with summarizing and reviewing pull requests.
To interact with me, just use the following actions:

  • 📝 Summarize PR
  • 🔍 Review
  • 🗑️ Delete all bot comments and reviews

@hyperspace-pr-bot hyperspace-pr-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I posted several focused review comments on changed lines covering a correctness issue in the verification flow, a misleading CodeList statement, a typo, and accessibility improvements for alt text and sensory-dependent instructions. The guide is generally coherent after the XTravels port, but these fixes should improve accuracy and reader usability before merge.

PR Bot Information

Version: 1.31.51

Comment thread guides/extensibility/customization.md Outdated
2. Verify that it worked by opening the [XTravels Fiori UI](http://localhost:4004/travels/webapp/index.html) in a **new private browser window** and log in as `carol`, which is assigned to tenant `t1`.

![A screenshot of an SAP Fiori UI on the orders management example. It shows a table with the columns order number, customer, currency and date. The table contains two orders.](assets/image-20221004054556898.png){.mute-dark}
![A screenshot of the SAP Fiori UI of the XTravels application. It shows a table of travels with the columns Travel, Description, Customer, Agency, Starting Date, and Travel Status.](assets/xtravels-travels-list.png){.mute-dark}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Best Practices: The alt text describes the image type instead of the image content

Alt text should summarize the useful information and avoid phrases such as “A screenshot” and “It shows.” Consider making the table content the subject of the alt text.

Suggested change
![A screenshot of the SAP Fiori UI of the XTravels application. It shows a table of travels with the columns Travel, Description, Customer, Agency, Starting Date, and Travel Status.](assets/xtravels-travels-list.png){.mute-dark}
![XTravels travel list with columns for Travel, Description, Customer, Agency, Starting Date, and Travel Status.](assets/xtravels-travels-list.png){.mute-dark}

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

```

![A screenshot of a readme.md file as it's described in the previous "Add a readme" section of this guide.](assets/orders-ext.png){.ignore-dark}
![A screenshot of a readme.md file as it's described in the previous "Add a readme" section of this guide.](assets/xtravels-ext-readme.png){.ignore-dark}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Best Practices: The alt text does not summarize the informative content

Alt text should describe the purpose or key message of the screenshot rather than referring to the screenshot itself. Consider naming the README content that the reader should take away.

Suggested change
![A screenshot of a readme.md file as it's described in the previous "Add a readme" section of this guide.](assets/xtravels-ext-readme.png){.ignore-dark}
![README.md getting-started content for the XTravels extension project template.](assets/xtravels-ext-readme.png){.ignore-dark}

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

#### Verify the Extension

Verify your extensions are applied correctly by opening the [Orders Fiori Preview](http://localhost:4006/$fiori-preview/OrdersService/Orders#preview-app) in a **new private browser window**, log in as `bob`, and see columns _Priority_ and _Sales Region_ filled as in the following screenshot:
Verify your extensions are applied correctly by opening the [Travels Fiori Preview](http://localhost:4006/$fiori-preview/TravelService/Travels#preview-app) in a **new private browser window**, log in as `bob`, and see columns _Priority_ and _Cost Center_ filled as in the following screenshot:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Best Practices: The instruction relies on sensory language and combines several actions

“See columns” is less accessible and the sentence is hard to follow. Consider using “confirm” and keeping the expected result clear.

Suggested change
Verify your extensions are applied correctly by opening the [Travels Fiori Preview](http://localhost:4006/$fiori-preview/TravelService/Travels#preview-app) in a **new private browser window**, log in as `bob`, and see columns _Priority_ and _Cost Center_ filled as in the following screenshot:
Verify your extensions are applied correctly by opening the [Travels Fiori Preview](http://localhost:4006/$fiori-preview/TravelService/Travels#preview-app) in a **new private browser window**, log in as `bob`, and confirm that the _Priority_ and _Cost Center_ columns contain values, as in the following screenshot:

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

Verify your extensions are applied correctly by opening the [Travels Fiori Preview](http://localhost:4006/$fiori-preview/TravelService/Travels#preview-app) in a **new private browser window**, log in as `bob`, and see columns _Priority_ and _Cost Center_ filled as in the following screenshot:

![This screenshot is explained in the accompanying text.](assets/image-20221004080722532.png){.mute-dark}
![A screenshot of the generic Fiori preview of TravelService.Travels. The travels table shows the two extension columns Priority, with values high and low, and Cost Center, with values Travel & Expenses and Sales.](assets/xtravels-fiori-preview-ext.png){.mute-dark}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Best Practices: The alt text starts with screenshot boilerplate

Alt text should convey the relevant state directly and avoid “A screenshot” or “shows.” Consider focusing on the Fiori preview and extension column values.

Suggested change
![A screenshot of the generic Fiori preview of TravelService.Travels. The travels table shows the two extension columns Priority, with values high and low, and Cost Center, with values Travel & Expenses and Sales.](assets/xtravels-fiori-preview-ext.png){.mute-dark}
![Generic Fiori preview for TravelService.Travels with extension columns Priority, containing high and low, and Cost Center, containing Travel & Expenses and Sales.](assets/xtravels-fiori-preview-ext.png){.mute-dark}

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

#### Verify the Extension {#test-extension }

Verify your extensions are applied correctly by opening the [Order Management UI](http://localhost:4004/orders/index.html#manage-orders) in a **new private browser window**, log in as `bob`, and check that columns _Priority_ and _Sales Region_ are displayed as in the following screenshot. Also, check that there's content with a proper label in the _Sales Region_ column.
Verify your extensions are applied correctly by opening the [XTravels UI](http://localhost:4004/travels/webapp/index.html) in a **new private browser window**, log in as `bob`, and check that columns _Priority_ and _Cost Center_ are displayed as in the following screenshot. Also, check that there's content with a proper label in the _Cost Center_ column.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Logic Error: This verification expects Cost Center data before the guide adds it

The next step says the Cost Center column is not filled until users copy initial data to db/data/, so readers who follow the steps in order will see a blank column here. Consider moving the Add Data step before this verification, or change this verification and screenshot to check only that the columns exist.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

### Extending the Service Model

In the existing in `OrdersService`, the new entities `x_CustomerPostalAddresses` and `x_Remarks` are automatically included since they are targets of the corresponding _compositions_.
In the existing in `TravelService`, the new entities `x_ApproverPostalAddresses` and `x_Notes` are automatically included since they are targets of the corresponding _compositions_.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Typo: The sentence has an extra “in”

“In the existing in TravelService” is grammatically incorrect and interrupts the explanation. Consider making TravelService the location of the auto-included entities.

Suggested change
In the existing in `TravelService`, the new entities `x_ApproverPostalAddresses` and `x_Notes` are automatically included since they are targets of the corresponding _compositions_.
In `TravelService`, the new entities `x_ApproverPostalAddresses` and `x_Notes` are automatically included since they are targets of the corresponding _compositions_.

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

In the existing in `TravelService`, the new entities `x_ApproverPostalAddresses` and `x_Notes` are automatically included since they are targets of the corresponding _compositions_.

The new entities `x_Customers` and `x_SalesRegion` are [autoexposed](../services/providing-services#auto-exposed-entities) in a read-only way as [CodeLists](../../cds/common#aspect-codelist). Only if wanted to _change_ it, you would need to expose them explicitly:
The new entities `x_Approvers` and `x_CostCenters` are [autoexposed](../services/providing-services#auto-exposed-entities) in a read-only way as [CodeLists](../../cds/common#aspect-codelist). Only if wanted to _change_ it, you would need to expose them explicitly:

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Bug: The text incorrectly says both entities are CodeLists

x_Approvers is defined with cuid, managed, while only x_CostCenters extends CodeList. Consider separating the autoexposure statement from the CodeList statement so readers do not model x_Approvers as a code list.

Suggested change
The new entities `x_Approvers` and `x_CostCenters` are [autoexposed](../services/providing-services#auto-exposed-entities) in a read-only way as [CodeLists](../../cds/common#aspect-codelist). Only if wanted to _change_ it, you would need to expose them explicitly:
The new entities `x_Approvers` and `x_CostCenters` are [autoexposed](../services/providing-services#auto-exposed-entities) in a read-only way. Only `x_CostCenters` is a [CodeList](../../cds/common#aspect-codelist). If you want to change how they are exposed, expose them explicitly:

Double-check suggestion before committing. Edit this comment for amendments.


Please provide feedback on the review comment by checking the appropriate box:

  • 🌟 Awesome comment, a human might have missed that.
  • ✅ Helpful comment
  • 🤷 Neutral
  • ❌ This comment is not helpful

Co-authored-by: hyperspace-pr-bot[bot] <209611008+hyperspace-pr-bot[bot]@users.noreply.github.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant