Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
d32fc69
feat(semaphore-sync): two-tier tag sync (adopt existing + gated intak…
jung-thomas Sep 22, 2026
7ab30d5
Merge pull request #2480 from sap-tutorials/worktree-semaphore-two-ti…
jung-thomas Sep 22, 2026
e36d010
fix(scheduler): record FAILED when a job returns ok:false (#2478)
jung-thomas Sep 23, 2026
5f575f2
Merge remote-tracking branch 'origin/DEV' into worktree-fix-2478-sche…
jung-thomas Sep 23, 2026
4a291ac
Merge pull request #2483 from sap-tutorials/worktree-fix-2478-schedul…
jung-thomas Sep 23, 2026
bea8517
feat(admin): Semaphore sync config panel (#2477)
jung-thomas Sep 23, 2026
7179beb
Merge pull request #2484 from sap-tutorials/worktree-issue-2477-semap…
jung-thomas Sep 23, 2026
287ebf6
docs(authors): add branch protection & pull request guide
jung-thomas Sep 23, 2026
576bbda
fix(admin): route semaphoreConfig nav-key in Shell controller (#2477)
jung-thomas Sep 23, 2026
5c351fd
Merge pull request #2485 from sap-tutorials/worktree-docs-author-bran…
jung-thomas Sep 23, 2026
736e99c
Merge pull request #2486 from sap-tutorials/worktree-fix-semaphorecon…
jung-thomas Sep 23, 2026
a2e6293
docs: register challenge-widget-cost-sizing page in sidebar
jung-thomas Sep 23, 2026
65ee43b
Merge pull request #2487 from sap-tutorials/worktree-docs-sidebar-cha…
jung-thomas Sep 23, 2026
1117c67
fix(semaphore-sync): assign legacyId on Tier-2 tag inserts (#2479)
jung-thomas Sep 23, 2026
64bfa25
Merge pull request #2490 from sap-tutorials/worktree-semaphore-dev-dr…
jung-thomas Sep 23, 2026
585519c
chore(release): 1.31.3
jung-thomas Sep 23, 2026
9ba0eb2
Merge pull request #2491 from sap-tutorials/worktree-release-1.31.3
jung-thomas Sep 23, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .deploy/mta.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ ID: tutorials-ims
# Bump this on each release you deploy — it's the version shown by `cf mtas`
# and in the mtar filename (tutorials-ims_<version>.mtar). Deploy is manual:
# `cd .deploy && mbt build && cf deploy mta_archives/tutorials-ims_<version>.mtar -e ../deploy/<env>.mtaext -f`.
version: 1.31.2
version: 1.31.3

# Top-level parameters (overridable per-env via deploy/<env>.mtaext).
parameters:
Expand Down
52 changes: 52 additions & 0 deletions app/admin-annotations.cds
Original file line number Diff line number Diff line change
Expand Up @@ -4167,6 +4167,58 @@ annotate AdminService.FeatureFlags with @UI: {
]}
};

// --- Semaphore taxonomy-sync tuning keys (#2477) ---
// String/csv/bool ImsConfig rows surfaced as an editable panel. setValue takes
// a free-text parameter (FE renders a parameter dialog); clearValue removes the
// row so the documented default takes effect again.
annotate AdminService.SemaphoreConfig with @UI: {
HeaderInfo: {
TypeName: 'Semaphore Config Key', TypeNamePlural: 'Semaphore Config Keys',
Title: { Value: label },
Description: { Value: key }
},
SelectionFields: [ valueType ],
LineItem: [
{ Value: label },
{ Value: key, Label: 'Config key' },
{ Value: valueType, Label: 'Type' },
{
$Type: 'UI.DataField', Value: effectiveValue, Label: 'Effective value',
// Neutral (3) when a value is set, Critical (2) when falling back to default.
Criticality: { $edmJson: { $If: [ { $Path: 'isDefault' }, 2, 3 ] } }
},
{ Value: defaultValue, Label: 'Default' },
{ $Type: 'UI.DataFieldForAction', Action: 'AdminService.setValue', Label: 'Set value' },
{ $Type: 'UI.DataFieldForAction', Action: 'AdminService.clearValue', Label: 'Reset to default' }
],
Identification: [
{ $Type: 'UI.DataFieldForAction', Action: 'AdminService.setValue', Label: 'Set value' },
{ $Type: 'UI.DataFieldForAction', Action: 'AdminService.clearValue', Label: 'Reset to default' }
],
Facets: [
{ $Type: 'UI.ReferenceFacet', ID: 'General', Label: 'General', Target: '@UI.FieldGroup#General' },
{ $Type: 'UI.ReferenceFacet', ID: 'Value', Label: 'Value', Target: '@UI.FieldGroup#Value' }
],
FieldGroup#General: { Data: [
{ Value: key }, { Value: label }, { Value: valueType }, { Value: description }
]},
FieldGroup#Value: { Data: [
{ Value: effectiveValue, Label: 'Effective value' },
{ Value: rawDbValue, Label: 'Raw DB value' },
{ Value: defaultValue, Label: 'Default value' }
]}
};

annotate AdminService.SemaphoreConfig with {
![key] @Common.Label: 'Config key';
label @Common.Label: 'Setting';
valueType @Common.Label: 'Type';
effectiveValue @Common.Label: 'Effective value';
rawDbValue @Common.Label: 'Raw DB value';
defaultValue @Common.Label: 'Default value';
description @Common.Label: 'Description';
};

// --- Petoberfest admin moderation surface ---
// PetSubmissions: moderation queue list report with approve/hide actions.
// Blob columns (photoDisplay/photoThumb) are NOT exposed here; thumbnails are
Expand Down
6 changes: 4 additions & 2 deletions app/admin-shell/webapp/controller/Shell.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ sap.ui.define([
channels: "channels",
channelCollections: "channelCollections",
channelTopicMap: "channelTopicMap",
channelSubmissions: "channelSubmissions"
channelSubmissions: "channelSubmissions",
semaphoreConfig: "semaphoreConfig"
};

var NAV_KEY_TO_TITLE = {
Expand Down Expand Up @@ -129,7 +130,8 @@ sap.ui.define([
channels: "Channels",
channelCollections: "Channel Collections",
channelTopicMap: "Channel Topic Map",
channelSubmissions: "Channel Submissions"
channelSubmissions: "Channel Submissions",
semaphoreConfig: "Semaphore Config"
};

return Controller.extend("sap.tutorials.admin.shell.controller.Shell", {
Expand Down
24 changes: 24 additions & 0 deletions app/admin-shell/webapp/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
"sap.tutorials.admin.videoRotation": "./components/video-rotation",
"sap.tutorials.admin.pats": "./components/pats",
"sap.tutorials.admin.featureFlags": "./components/featureFlags",
"sap.tutorials.admin.semaphoreConfig": "./components/semaphoreConfig",
"sap.tutorials.admin.petoberfest": "./components/petoberfest",
"sap.tutorials.admin.channels": "./components/channels",
"sap.tutorials.admin.channelCollections": "./components/channel-collections",
Expand Down Expand Up @@ -392,6 +393,12 @@
"componentData": {},
"lazy": true
},
"semaphoreConfigComponent": {
"name": "sap.tutorials.admin.semaphoreConfig",
"settings": {},
"componentData": {},
"lazy": true
},
"petoberfestComponent": {
"name": "sap.tutorials.admin.petoberfest",
"settings": {},
Expand Down Expand Up @@ -931,6 +938,16 @@
}
]
},
{
"name": "semaphoreConfig",
"pattern": "semaphoreConfig",
"target": [
{
"name": "semaphoreConfigTarget",
"prefix": "smc"
}
]
},
{
"name": "petoberfest",
"pattern": "petoberfest",
Expand Down Expand Up @@ -1341,6 +1358,13 @@
"viewLevel": 1,
"prefix": "ffl"
},
"semaphoreConfigTarget": {
"type": "Component",
"usage": "semaphoreConfigComponent",
"id": "semaphoreConfigTarget",
"viewLevel": 1,
"prefix": "smc"
},
"petoberfestTarget": {
"type": "Component",
"usage": "petoberfestComponent",
Expand Down
3 changes: 2 additions & 1 deletion app/admin-shell/webapp/model/navigation.json
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,8 @@
{ "key": "display", "title": "Display" },
{ "key": "tenant", "title": "Tenant" },
{ "key": "ngds", "title": "NGDS Auto-Send", "requiredScope": "Admin" },
{ "key": "featureFlags", "title": "Feature Flags", "requiredScope": "Admin" }
{ "key": "featureFlags", "title": "Feature Flags", "requiredScope": "Admin" },
{ "key": "semaphoreConfig", "title": "Semaphore Config", "requiredScope": "Admin" }
]
},
{
Expand Down
6 changes: 6 additions & 0 deletions app/admin/semaphoreConfig/webapp/Component.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
sap.ui.define(["sap/fe/core/AppComponent"], function (AppComponent) {
"use strict";
return AppComponent.extend("sap.tutorials.admin.semaphoreConfig.Component", {
metadata: { manifest: "json" }
});
});
7 changes: 7 additions & 0 deletions app/admin/semaphoreConfig/webapp/i18n/i18n.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
appTitle=Semaphore Config
appSubtitle=Tuning keys for the Semaphore taxonomy-sync job

# Bound action labels (#2477) — annotations use inline labels; these mirror them
# for i18n-driven references and translation coverage.
setValue=Set value
clearValue=Reset to default
71 changes: 71 additions & 0 deletions app/admin/semaphoreConfig/webapp/manifest.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"_version": "1.65.0",
"sap.app": {
"id": "sap.tutorials.admin.semaphoreConfig",
"type": "application",
"title": "{{appTitle}}",
"description": "{{appSubtitle}}",
"applicationVersion": { "version": "0.0.1" },
"i18n": "i18n/i18n.properties",
"dataSources": {
"mainService": {
"uri": "/admin/",
"type": "OData",
"settings": { "odataVersion": "4.0" }
}
}
},
"sap.ui5": {
"dependencies": {
"minUI5Version": "1.136.0",
"libs": { "sap.fe.templates": {}, "sap.m": {}, "sap.ui.core": {} }
},
"models": {
"": {
"dataSource": "mainService",
"preload": true,
"settings": {
"synchronizationMode": "None",
"operationMode": "Server",
"autoExpandSelect": true,
"earlyRequests": true
}
},
"i18n": {
"type": "sap.ui.model.resource.ResourceModel",
"settings": { "bundleName": "sap.tutorials.admin.semaphoreConfig.i18n.i18n" }
}
},
"routing": {
"routes": [
{ "pattern": ":?query:", "name": "SemaphoreConfigList", "target": "SemaphoreConfigList" },
{ "pattern": "SemaphoreConfig({key}):?query:", "name": "SemaphoreConfigObjectPage", "target": "SemaphoreConfigObjectPage" }
],
"targets": {
"SemaphoreConfigList": {
"type": "Component",
"id": "SemaphoreConfigList",
"name": "sap.fe.templates.ListReport",
"options": {
"settings": {
"contextPath": "/SemaphoreConfig",
"variantManagement": "Page",
"initialLoad": "Enabled",
"navigation": {
"SemaphoreConfig": { "detail": { "route": "SemaphoreConfigObjectPage" } }
}
}
}
},
"SemaphoreConfigObjectPage": {
"type": "Component",
"id": "SemaphoreConfigObjectPage",
"name": "sap.fe.templates.ObjectPage",
"options": {
"settings": { "contextPath": "/SemaphoreConfig", "editableHeaderContent": false }
}
}
}
}
}
}
2 changes: 2 additions & 0 deletions docs/.vitepress/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,7 @@ export default defineConfig({
{ text: 'Authors', items: [
{ text: 'Overview', link: '/authors/' },
{ text: 'Writing tutorials', link: '/authors/writing-tutorials' },
{ text: 'Branch protection & PRs', link: '/authors/branch-protection-and-pull-requests' },
{ text: 'Meta tutorials (QA)', link: '/authors/meta-tutorials' },
{ text: 'Repo / group owners', link: '/authors/repo-group-owners' },
{ text: 'Center admin', link: '/authors/center-admin' },
Expand Down Expand Up @@ -224,6 +225,7 @@ export default defineConfig({
{ text: 'A2A agent consumption guide', link: '/developers/reference/a2a-instructions' },
{ text: 'AI Skills Catalog', link: '/developers/reference/ai-skills-catalog' },
{ text: 'CAP / CDS gotchas', link: '/developers/reference/cap-cds-gotchas' },
{ text: 'Challenge widget cost sizing', link: '/developers/reference/challenge-widget-cost-sizing' },
{ text: 'cds-caching CDS-DB store', link: '/developers/reference/cds-caching-store' },
{ text: 'Community blog RSS transport', link: '/developers/reference/community-rss-transport' },
{ text: 'Cookie and storage analysis', link: '/developers/reference/cookie-and-storage-analysis' },
Expand Down
1 change: 1 addition & 0 deletions docs/authors/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ This folder is the operational manual for everyone working with the SAP Develope
| If you are a... | Read | What you do |
| --- | --- | --- |
| **Tutorial author** writing markdown | [writing-tutorials.md](writing-tutorials.md) | Write, preview, and publish tutorials |
| **Any author** getting a change merged | [branch-protection-and-pull-requests.md](branch-protection-and-pull-requests.md) | Branches, forks, and PRs under the OSPO branch-protection rules (no more direct pushes to `main`) |
| **New tutorial author** learning the ropes | [meta-tutorials.md](meta-tutorials.md) | Follow the platform's own "how to write a tutorial" tutorials (on the QA channel) |
| **Repo group owner** in `sap-tutorials` | [repo-group-owners.md](repo-group-owners.md) | Review PRs, plan tutorials, manage your repos |
| **Center admin** running the platform | [center-admin.md](center-admin.md) | Catalog, taxonomy, pipeline, access, support |
Expand Down
Loading
Loading