feat: add Navigation and OData V4 tutorials, align all packages#295
feat: add Navigation and OData V4 tutorials, align all packages#295petermuessig wants to merge 7 commits into
Conversation
Bring two new tutorials — Navigation and Routing, OData V4 — into the monorepo, and rework all four tutorials onto a single template so they share the same toolchain, layout, namespace, and documentation conventions. Tutorials - packages/navigation/ — 17 steps imported from the OpenUI5 demokit, promoted to the standard `steps/` layout, package names changed to `ui5.tutorial.navigation.stepNN`, ui5.yaml metadata aligned with the rest of the repo, dev dependencies switched to the walkthrough set (@types/openui5, ui5-middleware-serveframework, ui5-tooling-transpile), app namespace renamed `sap.ui.demo.nav` -> `ui5.tutorial.navigation` across manifests, TS imports, JSDoc, XML controllerName, tsconfig paths, and HTML resource-roots. - packages/odatav4/ — 11 steps imported from the same demokit source, restructured from `solutions/` -> `steps/`, root-level markdown moved into per-step README.md, shared `images/` split into per-step `assets/`. JS sources fully converted to TypeScript ES modules (Component, App.controller, model/models, initMockServer, the ~800- line sinon-based mock server, view XML), Hungarian variable prefixes stripped (oModel -> model, aMatches -> matches, sUrl -> url, ...) to match the project's TS style. App namespace standardised to `ui5.tutorial.odatav4`. Namespace alignment across the existing tutorials - packages/walkthrough/ renamed `ui5.walkthrough` -> `ui5.tutorial.walkthrough` across ~630 files (manifests, TS imports + @namespace, XML controllerName + xmlns, tsconfig paths, HTML resource-roots, every README code snippet, step package.json names). - packages/quickstart/ renamed `ui5.quickstart` -> `ui5.tutorial.quickstart` with the same shape across 27 files; ui5.yaml `metadata.name` `quickstart-tutorial` -> `ui5.tutorial.quickstart`. After this commit, all 69 step workspaces follow the same naming convention: `ui5.tutorial.<tutorial>.stepNN`. Documentation - Per-tutorial overview READMEs (packages/{navigation,odatav4}/README.md) now mirror packages/walkthrough/README.md: each step bullet has an inline `[🔗 Live Preview]` link and paired `<details class="ts-only">` / `<details class="js-only">` `[📥 Download Solution]` blocks. - Step READMEs ship with paired ```ts / ```js code blocks so the Jekyll code-couple toggle renders both flavours. JS half generated from the build's sanitized `*-dbg.js` output where applicable. - Folder-structure images replaced with fenced ```text ASCII trees (using `.?s` placeholders so the global toggle flips the extensions); images deleted from the per-step assets. - All callout syntaxes (GitHub-flavoured alerts `> [!NOTE]` plus walkthrough's emoji blockquotes `> 📝 **Note:** <br>`) normalised to the `:note:` / `:tip:` / `:info:` / `:caution:` / `:warning:` shorthand mandated by `_/AUTOMATE.md`. - Step-level "view and download all files at \[demokit\]" links retargeted to the published `https://ui5.github.io/tutorials/...` URLs so they resolve against the local dist via the dev server. - License year bumped 2025 -> 2026 across all overview READMEs; `## License` sections added to the navigation and odatav4 overviews to match the walkthrough/quickstart convention. Tooling - tools/dev-server/server.js: mount `dist/` under `/dist/...` so `npm start` serves the locally-built apps and ZIPs; rewrite the published `https://ui5.github.io/tutorials/...` URLs in rendered markdown to the local `/dist/...` paths for the four known tutorial slugs (walkthrough, quickstart, navigation, odatav4); friendly hint page when an artifact is missing. - README.md: document the `npm install && npm run build && npm start` workflow. Verification - `npm install` succeeds and registers all 69 workspaces under the new `ui5.tutorial.*` namespace. - `npm run typecheck -ws --if-present` exits 0. - `npm run build` exits 0; produces `dist/<tutorial>/build/NN/` apps, `<tutorial>-step-NN.zip` and `<tutorial>-step-NN-js.zip` downloads, and the rewritten `dist/index.md` overview for each tutorial. - `index-cdn.html` present for every webapp that bootstraps SAPUI5 (68 of 69 — walkthrough step 01 is the bare HTML "Hello World" and intentionally has none). - Dev-server smoke test: Live Preview links from the overview README resolve to `/dist/<tutorial>/build/NN/index-cdn.html` with HTTP 200.
Versions - Bump framework to OpenUI5 1.148.1 (latest LTS patch) in every step ui5.yaml and CDN bootstrap URL. - Bump manifest _version to 2.8.0 and minUI5Version to 1.148 across all 69 manifests (mapping per UI5/manifest v2/mapping.json). - specVersion: "4.0" for every ui5.yaml. - @types/openui5 ^1.148.0 in every step package.json. - Sync README narrative and inline manifest snippets that referenced OpenUI5 1.120 / _version 1.60.0 / 1.38.0 to the new values. Reviewer findings (PR #295, @flovogt) - Manifest v2 (_version 2.8.0). - specVersion '4.0'. - Ensure trailing newline on every webapp source file. Cross-tutorial inconsistency cleanup - Quickstart Component.ts: @namespace sap.m.tutorial.quickstart.NN -> ui5.tutorial.quickstart, switch to public static metadata and add interfaces: ["sap.ui.core.IAsyncContentCreation"]. - Strip residual Hungarian-notation in quickstart controllers/index.ts (oEvent/bState/oView) and the named identifiers in odatav4 OPA tests (iGrowingBy/sViewName/oListBinding). - Add explicit "strict": false, "strictNullChecks": false to walkthrough and quickstart tsconfig.json files (match navigation/odatav4). - Drop redundant data-sap-ui-libs from quickstart steps 02 and 03 index.html (Component manifest already declares the libs). - Add data-sap-ui-theme="sap_horizon" to quickstart and navigation bootstrap script tags so the theme is explicit and consistent with walkthrough/odatav4. Indentation normalization per .editorconfig - JSON / XML / YAML / .properties -> 2 spaces. - TS / JS / HTML -> tabs. - Re-indent fenced code blocks inside step README.md files to match the same conventions so doc snippets mirror the actual source files. Verified: npm run typecheck and npm run build both exit 0; ui5-linter clean on sampled steps; manifest validation clean.
|
@flovogt thanks for the review — all three findings are addressed in 9b4f266, plus a broader cleanup pass on cross-tutorial inconsistencies that showed up once versions were aligned. Threads resolved above. Review findings ✅
UI5 LTS alignment
Cross-tutorial cleanup
Indentation normalization per
|
Replace deprecated @types/openui5 package with the official @openui5/types package across all tutorial packages and steps. Updates include: - package.json: @types/openui5 → @openui5/types in devDependencies - tsconfig.json: Updated types array entries - README.md: Updated documentation references This aligns with the OpenUI5 project's official type definitions package.
Latest commit: Migrated from
|
|
@petermuessig working with QUnit tests, i would assume we need the |
|
I'm on it - started just a few mins back after noticing the issues. Ok with me to also use the latest patch for 1.148 |
- tsconfig.json: drop unused "node" type from the `types` array across all 67 step packages. The webapp sources are browser code and don't use any Node.js globals. - tsconfig.json: add explicit "@types/qunit" to the `types` array in the 14 packages that contain QUnit test files (walkthrough steps 27-38, odatav4 steps 08 and 11). - package.json: add "@types/qunit": "2.5.4" as a devDependency to those same 14 packages so the type package resolves via the standard node_modules/@types lookup rather than depending on transitive install layout. - package.json: bump "@openui5/types" from ^1.148.0 to ^1.148.1 across all 67 step packages, aligning with the 1.148.1 references already present in ui5.yaml and the index-cdn.html bootstrap URLs. Verified with `npm run typecheck` across all workspaces.
Cleanup: tsconfig
|
|
package-lock is outdated |
…tion-odatav4-tutorials # Conflicts: # package-lock.json
|
@petermuessig please no merge commits :-D |
|
The merge commit was an easy one - just the package-lock.json. So it was cheaper for me to do so rather than manually rebasing. Just to safe time. Can we now go ahead and squash and merge the change? |
|
@petermuessig Sorry, only noticed after it was done. But then again, we could invert my change easily. And... aren't the actual conflicts little? Should be only 1-2 files, no? |
|
What is the problem with the merge now? It only changes the package-lock.json and fixes it so it can be merged. It anyhow becomes a SQUASH MERGE at the end! |
|
True. Just kidding. |
|
|
||
| ```json | ||
| { | ||
| "_version": "1.12.0", |
There was a problem hiding this comment.
here, it's
"_version": "1.12.0",
but in the actual manifest file at
https://github.com/UI5/tutorials/pull/295/changes#diff-7ce1ab8b4489a1b669bc44882998822f64fd68f9905c245a96f0ad30bb72100fR2
it is
"_version": "2.8.0",
| @@ -202,7 +202,7 @@ Let's go through the compiler options specified in the file: | |||
|
|
|||
| - `"target": "es2023"`: The `target` parameter sets the JavaScript language level that the TypeScript code should be compiled down to. We set it to `es2023`, which means the generated JavaScript code is compatible with ECMAScript 2023. | |||
|
|
|||
| - `"types": [ "node", "@types/openui5"]`: The `types` parameter defines the types used for TypeScript code. We configure this parameter to use the built-in Node.js types and the OpenUI5 types delivered by the `@types/openui5` package. | |||
| - `"types": [ "node", "@openui5/types"]`: The `types` parameter defines the types used for TypeScript code. We configure this parameter to use the built-in Node.js types and the OpenUI5 types delivered by the `@openui5/types` package. | |||
There was a problem hiding this comment.
"node" is explained here and contained above, but in the actual tsconfig file, it is beign removed by this PR.
|
|
||
| /** | ||
| * Returns the base URL from a given URL. | ||
| * @param sUrl - the complete URL |
There was a problem hiding this comment.
sUrl is still Hungarian notation, but the real parameter below is "url".
Same for many others in here.
The init() callback destructured the sinon module into a parameter named `sinon`, then executed `sinon = sinon` — a no-op that shadowed the module-scoped `sinon` binding and left it `undefined` outside the callback. Rename the parameter to `lazySinon` and assign it through so subsequent code (e.g. `sinon.fakeServer`) sees the loaded module.
Steps 08 and 11 shipped OPA5 tests using the legacy demokit namespace `sap.ui.core.tutorial.odatav4`, while the app's manifest declares `sap.app.id` as `ui5.tutorial.odatav4`. As a result `iStartMyUIComponent` could not resolve the component and no journey ran. Rename the namespace to `ui5.tutorial.odatav4` (dot form) and `ui5/tutorial/odatav4` (slash form) in every affected test module — `opaTests.qunit.html` resource-roots, module require paths, the `Opa5.extend` class name, `componentConfig.name`, and `viewNamespace`.
|
|
||
| **Next:** [Step 2: Data Access and Client-Server Communication](../02/README.md) | ||
|
|
||
| **Previous:** [Step 11: Add Table with :n Navigation to Detail Area](../11/README.md) |
What this PR does
Brings two new tutorials into the monorepo — Navigation and Routing (17 steps) and OData V4 (11 steps) — and reworks all four tutorials onto a single template so they share the same toolchain, layout, namespace, and documentation conventions.
After this PR the repo ships 4 tutorials with 69 step workspaces, all under the
ui5.tutorial.<name>.stepNNnaming.Tutorials
packages/navigation/(new)steps/NN/layout.sap.ui.demo.nav→ui5.tutorial.navigationacross manifests, TS imports, JSDoc@namespace, XMLcontrollerName,tsconfigpaths, and HTML resource-roots.@types/openui5,ui5-middleware-serveframework,ui5-tooling-transpile).package.jsonnames →ui5.tutorial.navigation.stepNN;ui5.yamlmetadata aligned.packages/odatav4/(new)solutions/→steps/, root-level markdown moved into per-stepREADME.md, sharedimages/split into per-stepassets/.Component,App.controller,model/models,initMockServer, the ~800-line sinon-based mock server, plus the view XML.oModel→model,aMatches→matches,sUrl→url, …) to match the project's TS style — confirmed againstpackages/walkthrough/.ui5.tutorial.odatav4.Namespace alignment of the existing tutorials
packages/walkthrough/— renamedui5.walkthrough→ui5.tutorial.walkthroughacross ~630 files (manifests, TS imports +@namespace, XMLcontrollerName+xmlns,tsconfigpaths, HTML resource-roots, every README code snippet, steppackage.jsonnames).packages/quickstart/— renamedui5.quickstart→ui5.tutorial.quickstartwith the same shape across 27 files;ui5.yamlmetadata.namequickstart-tutorial→ui5.tutorial.quickstart.Documentation
packages/{navigation,odatav4}/README.md) now mirrorpackages/walkthrough/README.md: each step bullet has an inline🔗 Live Previewlink plus paired<details class="ts-only">/<details class="js-only">📥 Download Solutionblocks.```ts/```jscode blocks so the Jekyll code-couple toggle renders both flavours. The JS half is generated from the build's sanitised*-dbg.jsoutput where applicable.```textASCII trees (using.?splaceholders so the toggle flips the extensions); images deleted from per-stepassets/.> [!NOTE]plus walkthrough's emoji blockquotes> 📝 **Note:** <br>) normalised to the:note:/:tip:/:info:/:caution:/:warning:shorthand mandated by_/AUTOMATE.md— 76 callouts converted.https://ui5.github.io/tutorials/...URLs so they resolve against the localdist/via the dev server.## Licensesections added to the new navigation and odatav4 overviews.Tooling
tools/dev-server/server.js:dist/under/dist/...sonpm startserves the locally-built apps and ZIPs.https://ui5.github.io/tutorials/...URLs in rendered markdown to local/dist/...paths for the four known tutorial slugs (walkthrough,quickstart,navigation,odatav4).README.md: document thenpm install && npm run build && npm startworkflow.Verification
npm installsucceeds and registers all 69 workspaces under the newui5.tutorial.*namespace.npm run typecheck -ws --if-present→ exit 0.npm run build→ exit 0. Producesdist/<tutorial>/build/NN/apps,<tutorial>-step-NN.zipand<tutorial>-step-NN-js.zipdownloads, and the rewrittendist/index.mdoverview for each tutorial.index-cdn.htmlpresent for every webapp that bootstraps SAPUI5 (68 of 69 — walkthrough step 01 is the bare HTML "Hello World" and intentionally has none)./dist/<tutorial>/build/NN/index-cdn.htmlwith HTTP 200.Stats
1363 files changed: 49,009 insertions, 1,320 deletions.
JIRA: FIORITECHP1-35769