{"ref":"artifact:miyasuta-blog-cap-chart","page":"/artifacts/miyasuta-blog-cap-chart","json":"/artifacts/miyasuta-blog-cap-chart.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"miyasuta-blog-cap-chart","name":"blog-cap-chart","artifact_type":"sample","ecosystem":"cap","domain":"ui-and-frontend-bridge","origin_ring":"independent","use_as":"reference","description":{"one_line":"A Fiori elements overview page over a CAP service whose two donut-chart cards read the same measure from an aggregating view and from the plain entity, so what the aggregation annotations change is visible side by side.","short":"Fiori overview page comparing aggregated and plain donut-chart cards","what_it_solves":"db/schema.cds holds an Expenses entity and an ExpensesAnalytics view selected from it, the view marked `@Aggregation.ApplySupported.PropertyRestrictions` with `category` and `currency` as `@Analytics.Dimension` and `amount` as `@Analytics.Measure` carrying `@Aggregation.default: #SUM`. srv/cat-service.cds exposes both and annotates `UI.Chart` on each with a `#Donut` chart of `amount` by `category`, which is the annotation [Mio Yasutake](actor:mio-yasutake)'s post first reported having failed to put on a CAP service and then, in an update crediting [Oliver Klemenz](actor:oklemenz2), recorded as working without the local annotation the app had needed. The ovptest app's manifest.json names Expenses as the globalFilterEntityType behind the filter bar and carries three cards: a list over Expenses, a `sap.ovp.cards.charts.analytical` card over ExpensesAnalytics, and the same card over Expenses, which the post adds for comparison and which does not aggregate. The overview page reads the service over its V2 endpoint at /v2/catalog/, and the repository's README is the one cds init writes, so [Adding a Donut Chart on top of CAP service](https://community.sap.com/t5/technology-blog-posts-by-members/adding-a-donut-chart-on-top-of-cap-service/ba-p/13461859) is where the project is explained."},"links":{"repo":"https://github.com/miyasuta/blog-cap-chart"},"compat":{"runtimes":["node"]},"type_properties":{"form":{"value":"tutorial","sources":[{"url":"https://community.sap.com/t5/technology-blog-posts-by-members/adding-a-donut-chart-on-top-of-cap-service/ba-p/13461859","title":"Adding a Donut Chart on top of CAP service — SAP Community","checked":"2026-10-19","quote":"The code is available at my GitHub repository ."}]}},"demonstrates":["capability:fiori-annotations","capability:analytical-queries"],"requires":[{"ref":"artifact:cap-js-community-odata-v2-adapter","for":"The V2 endpoint the overview page reads at /v2/catalog/, put in front of the service's own V4 one; the project depends on it under its former name, @sap/cds-odata-v2-adapter-proxy.","requirement":"required","sources":[{"url":"https://community.sap.com/t5/technology-blog-posts-by-members/adding-a-donut-chart-on-top-of-cap-service/ba-p/13461859","title":"Adding a Donut Chart on top of CAP service — SAP Community","checked":"2026-10-19","quote":"CAP services needs to be adapted to OData v2 to be consumed by Fiori Tools.\nFor this, use @sap/cds-odata-v2-adapter-proxy ."},{"url":"https://raw.githubusercontent.com/miyasuta/blog-cap-chart/master/package.json","title":"miyasuta/blog-cap-chart — package.json","checked":"2026-10-19","quote":"\"@sap/cds-odata-v2-adapter-proxy\": \"^1.4.42\""}]}],"maintainers":["actor:mio-yasutake"],"contributors":["actor:mio-yasutake"],"provenance":{"discovered_via":[{"source":"source:github-orgs","channel":"miyasuta"}],"first_seen":"2026-10-08"},"drafted_with_ai":true},"effective_normative_relations":[],"readings":{"liveness":[{"label":"Maintenance","tier":"unknown","evidence":"no release data"},{"label":"Continuity","tier":"fair","evidence":"one contributor, personally owned"},{"label":"Repository","tier":"poor","evidence":"pushed 2020-09, not archived"}],"compatibility":[{"label":"Declared for","tier":"fair","evidence":"nothing declared"},{"label":"Survived majors","tier":"unknown","evidence":"no release dates"},{"label":"Maintainer's CI","tier":"fair","evidence":"no CI configured"}],"practice":[{"label":"Tests","tier":"good","evidence":"2 test files"},{"label":"Docs","tier":"poor","evidence":"README 1 KB"},{"label":"Changelog","tier":"fair","evidence":"none in the repo"}],"reach":[{"value":null,"unit":"installs/week"},{"value":0,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","npm":"not published under this name","stars":0,"forks":1,"open_issues":0,"archived":false,"pushed_at":"2020-09-15","license_spdx":null,"org_owned":false,"default_branch":"master","created_at":"2020-09-09T20:39:35Z","open_prs":0,"tree_truncated":false,"test_files":2,"workflows":0,"other_ci":false,"readme_bytes":674,"docs_files":0,"changelog":false,"license_file":false,"dts_files":0,"first_commit":"2020-09-09","last_commit":"2020-09-15","commits":2,"contributors":1,"readme_path":"README.md","readme_sha":"be0b6d2fb1ccb80b646079ae6e54178496b53301","repo_read":"2026-10-25"},"edges":{"maintainers":[{"ref":"actor:mio-yasutake","name":"Mio Yasutake","json":"/actors/mio-yasutake.json"}],"contributors":[{"ref":"actor:mio-yasutake","name":"Mio Yasutake","json":"/actors/mio-yasutake.json"}],"explained_by":[],"alternative_to_this":[],"needed_by":[],"available_via":[],"parts":[],"add_ons":[],"answered_through_parts":[]}}