{"ref":"artifact:miyasuta-cap-feature-control","page":"/artifacts/miyasuta-cap-feature-control","json":"/artifacts/miyasuta-cap-feature-control.json","generated":"2026-10-26","drafted_with_ai":true,"entity":{"id":"miyasuta-cap-feature-control","name":"cap-feature-control","artifact_type":"sample","ecosystem":"cap","domain":"ui-and-frontend-bridge","origin_ring":"independent","description":{"one_line":"A singleton entity whose two flags drive what a Fiori elements page offers: the restriction, action-availability and button-visibility annotations all reach it by `$edmJson` `$Path`.","short":"Singleton entity whose flags drive Fiori elements feature control","what_it_solves":"`FeatureControl` is an `@odata.singleton` holding `operationHidden` and `operationEnabled`, computed in its READ handler from whether the caller `is('Admin')`, and the annotations reach it over `/CatalogService.EntityContainer/FeatureControl/...`: `Deletable` inside `Capabilities.DeleteRestrictions` and, as the file writes it, `Updatable` inside `Capabilities.InsertRestrictions`; `Core.OperationAvailable` on the bound `updateStock` and the unbound `autoFillStock`; and `UI.Hidden` on both action buttons in the `UI.LineItem`. Beside those the file keeps variants that were tried and commented out, among them two that wrap the path in `$Not` to read the opposite flag, both marked `//this does not work`, and a `UI.CreateHidden` block marked `//this works`. [fiori-dynamic-feature-control](artifact:miyasuta-fiori-dynamic-feature-control) answers the field-level half of the same question in CAP Java; this one is operation-level, in TypeScript, with [cds-plugin-ui5](artifact:ui5-community-cds-plugin-ui5) in devDependencies and `app/listreport` as an npm workspace under `sapux`."},"links":{"repo":"https://github.com/miyasuta/cap-feature-control"},"identity":{"license":"UNLICENSED"},"compat":{"runtimes":["node"],"cds_range":"^10"},"demonstrates":["capability:fiori-annotations"],"maintainers":["actor:mio-yasutake"],"provenance":{"discovered_via":[{"source":"source:github","channel":"miyasuta"}],"first_seen":"2026-10-08"},"use_as":"reference","contributors":["actor:mio-yasutake"],"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":"good","evidence":"pushed 2026-08, not archived"}],"compatibility":[{"label":"Declared for","tier":"good","evidence":"^10 — includes cds 10"},{"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":"9 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":2,"unit":"watching"}]},"signals":{"crawled_at":"2026-10-25","npm":"not published under this name","stars":2,"forks":0,"open_issues":0,"archived":false,"pushed_at":"2026-08-06","license_spdx":null,"org_owned":false,"default_branch":"main","created_at":"2025-05-11T20:36:11Z","open_prs":0,"tree_truncated":false,"test_files":9,"workflows":0,"other_ci":false,"readme_bytes":674,"docs_files":0,"changelog":false,"license_file":false,"dts_files":0,"first_commit":"2025-05-10","last_commit":"2026-08-06","commits":9,"contributors":1,"readme_path":"README.md","readme_sha":"dbac29eb1594d1dd9e9cd90a11879f1495caa4b6","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":[]}}