From aeb8bca9acd3b8baf200f53521e5dd4a30886184 Mon Sep 17 00:00:00 2001 From: D070615 Date: Wed, 18 Jun 2025 15:41:46 +0200 Subject: [PATCH 1/2] object page first version --- .../db/data/sap.capire.bookshop-Contents.csv | 64 +++++++++++++++++ bookshop/db/schema.cds | 10 +++ bookshop/srv/admin-service.cds | 1 + fiori/app/admin-books/fiori-service.cds | 10 +-- fiori/app/admin-books/webapp/manifest.json | 28 ++++++++ fiori/app/common.cds | 71 +++++++++++++++++++ 6 files changed, 179 insertions(+), 5 deletions(-) create mode 100644 bookshop/db/data/sap.capire.bookshop-Contents.csv diff --git a/bookshop/db/data/sap.capire.bookshop-Contents.csv b/bookshop/db/data/sap.capire.bookshop-Contents.csv new file mode 100644 index 00000000..492be022 --- /dev/null +++ b/bookshop/db/data/sap.capire.bookshop-Contents.csv @@ -0,0 +1,64 @@ +ID;parent_ID;name;page;book_ID +f846b0b9-01d4-4f6d-82a4-d79204f62514;;Foreword;3;207 +f846b0b9-01d4-4f6d-82a4-d79204f62515;;Chapter 1;4;207 +f846b0b9-01d4-4f6d-82a4-d79204f62516;f846b0b9-01d4-4f6d-82a4-d79204f62515;Section 1.1;5;207 +f846b0b9-01d4-4f6d-82a4-d79204f62517;f846b0b9-01d4-4f6d-82a4-d79204f62515;Section 1.2;28;207 +f846b0b9-01d4-4f6d-82a4-d79204f62518;f846b0b9-01d4-4f6d-82a4-d79204f62517;Subsection 1.2.1;30;207 +f846b0b9-01d4-4f6d-82a4-d79204f62519;f846b0b9-01d4-4f6d-82a4-d79204f62517;Subsection 1.2.2;33;207 +f846b0b9-01d4-4f6d-82a4-d79204f62520;f846b0b9-01d4-4f6d-82a4-d79204f62515;Section 1.3;36;207 +f846b0b9-01d4-4f6d-82a4-d79204f62521;;Chapter 2;54;207 +f846b0b9-01d4-4f6d-82a4-d79204f62522;f846b0b9-01d4-4f6d-82a4-d79204f62521;Section 2.1;56;207 +f846b0b9-01d4-4f6d-82a4-d79204f62523;f846b0b9-01d4-4f6d-82a4-d79204f62521;Section 2.2;58;207 +f846b0b9-01d4-4f6d-82a4-d79204f62524;;Conclusion;63;207 +f846b0b9-01d4-4f6d-82a4-d79204f62525;;Endnotes;65;207 +f846b0b9-01d4-4f6d-82a4-d79204f62526;;Copyright notice;2;251 +f846b0b9-01d4-4f6d-82a4-d79204f62527;;Chapter 1;3;251 +f846b0b9-01d4-4f6d-82a4-d79204f62528;f846b0b9-01d4-4f6d-82a4-d79204f62527;Section 1.1;5;251 +f846b0b9-01d4-4f6d-82a4-d79204f62529;f846b0b9-01d4-4f6d-82a4-d79204f62527;Section 1.2;13;251 +f846b0b9-01d4-4f6d-82a4-d79204f62530;;Chapter 2;20;251 +f846b0b9-01d4-4f6d-82a4-d79204f62531;f846b0b9-01d4-4f6d-82a4-d79204f62530;Section 2.1;21;251 +f846b0b9-01d4-4f6d-82a4-d79204f62532;f846b0b9-01d4-4f6d-82a4-d79204f62530;Section 2.2;25;251 +f846b0b9-01d4-4f6d-82a4-d79204f62533;f846b0b9-01d4-4f6d-82a4-d79204f62530;Section 2.3;27;251 +f846b0b9-01d4-4f6d-82a4-d79204f62534;;Chapter 3;30;251 +f846b0b9-01d4-4f6d-82a4-d79204f62535;;Endnotes;41;251 +f846b0b9-01d4-4f6d-82a4-d79204f62551;;Acknowledgements;1;271 +f846b0b9-01d4-4f6d-82a4-d79204f62552;;The Flight;2;271 +f846b0b9-01d4-4f6d-82a4-d79204f62553;;Hexwood Farm;8;271 +f846b0b9-01d4-4f6d-82a4-d79204f62554;f846b0b9-01d4-4f6d-82a4-d79204f62553;Castle Saburac;13;271 +f846b0b9-01d4-4f6d-82a4-d79204f62555;f846b0b9-01d4-4f6d-82a4-d79204f62553;The Curse of Rapkyn;27;271 +f846b0b9-01d4-4f6d-82a4-d79204f62556;f846b0b9-01d4-4f6d-82a4-d79204f62553;The Mannikin;35;271 +f846b0b9-01d4-4f6d-82a4-d79204f62557;;The Eye of Time;44;271 +f846b0b9-01d4-4f6d-82a4-d79204f62558;;The Enchanting;59;271 +f846b0b9-01d4-4f6d-82a4-d79204f62559;f846b0b9-01d4-4f6d-82a4-d79204f62558;The Telling Bone;73;271 +f846b0b9-01d4-4f6d-82a4-d79204f62560;f846b0b9-01d4-4f6d-82a4-d79204f62558;The Power of Adamcos;86;271 +f846b0b9-01d4-4f6d-82a4-d79204f62561;f846b0b9-01d4-4f6d-82a4-d79204f62558;The House of the Sorcerer;98;271 +f846b0b9-01d4-4f6d-82a4-d79204f62562;;The Changeling;105;271 +f846b0b9-01d4-4f6d-82a4-d79204f62563;f846b0b9-01d4-4f6d-82a4-d79204f62562;The Flying Broomsticks;118;271 +f846b0b9-01d4-4f6d-82a4-d79204f62564;f846b0b9-01d4-4f6d-82a4-d79204f62563;The Fish Out of Water;126;271 +f846b0b9-01d4-4f6d-82a4-d79204f62565;;The Final Magic;138;271 +f846b0b9-01d4-4f6d-82a4-d79204f62566;;Copyright;159;271 +f846b0b9-01d4-4f6d-82a4-d79204f62567;;Editor's Note;1;201 +f846b0b9-01d4-4f6d-82a4-d79204f62568;;Chapter I;2;201 +f846b0b9-01d4-4f6d-82a4-d79204f62569;;Chapter II;31;201 +f846b0b9-01d4-4f6d-82a4-d79204f62570;f846b0b9-01d4-4f6d-82a4-d79204f62569;Section II.I;47;201 +f846b0b9-01d4-4f6d-82a4-d79204f62571;f846b0b9-01d4-4f6d-82a4-d79204f62569;Section II.II;62;201 +f846b0b9-01d4-4f6d-82a4-d79204f62572;f846b0b9-01d4-4f6d-82a4-d79204f62569;Section II.III;75;201 +f846b0b9-01d4-4f6d-82a4-d79204f62573;f846b0b9-01d4-4f6d-82a4-d79204f62569;Section II.IV;87;201 +f846b0b9-01d4-4f6d-82a4-d79204f62574;;Chapter III;105;201 +f846b0b9-01d4-4f6d-82a4-d79204f62575;f846b0b9-01d4-4f6d-82a4-d79204f62574;Section III.I;128;201 +f846b0b9-01d4-4f6d-82a4-d79204f62576;f846b0b9-01d4-4f6d-82a4-d79204f62575;Subsection III.I.I;156;201 +f846b0b9-01d4-4f6d-82a4-d79204f62577;f846b0b9-01d4-4f6d-82a4-d79204f62575;Subsection III.I.II;173;201 +f846b0b9-01d4-4f6d-82a4-d79204f62578;f846b0b9-01d4-4f6d-82a4-d79204f62574;Section III.II;185;201 +f846b0b9-01d4-4f6d-82a4-d79204f62579;;Chapter IV;203;201 +f846b0b9-01d4-4f6d-82a4-d79204f62580;;Acknowledgments;250;201 +f846b0b9-01d4-4f6d-82a4-d79204f62582;;Foreword;1;252 +f846b0b9-01d4-4f6d-82a4-d79204f62583;;Chapter 1;3;252 +f846b0b9-01d4-4f6d-82a4-d79204f62584;f846b0b9-01d4-4f6d-82a4-d79204f62583;Section 1.1;5;252 +f846b0b9-01d4-4f6d-82a4-d79204f62585;f846b0b9-01d4-4f6d-82a4-d79204f62583;Section 1.2;8;252 +f846b0b9-01d4-4f6d-82a4-d79204f62586;;Chapter 2;10;252 +f846b0b9-01d4-4f6d-82a4-d79204f62587;f846b0b9-01d4-4f6d-82a4-d79204f62586;Section 2.1;12;252 +f846b0b9-01d4-4f6d-82a4-d79204f62588;f846b0b9-01d4-4f6d-82a4-d79204f62587;Subsection 2.1.1;14;252 +f846b0b9-01d4-4f6d-82a4-d79204f62589;f846b0b9-01d4-4f6d-82a4-d79204f62587;Subsection 2.1.2;16;252 +f846b0b9-01d4-4f6d-82a4-d79204f62590;f846b0b9-01d4-4f6d-82a4-d79204f62586;Section 2.2;18;252 +f846b0b9-01d4-4f6d-82a4-d79204f62591;f846b0b9-01d4-4f6d-82a4-d79204f62590;Subsection 2.2.1;21;252 +f846b0b9-01d4-4f6d-82a4-d79204f62592;;Endnotes;25;252 diff --git a/bookshop/db/schema.cds b/bookshop/db/schema.cds index 7519ea95..903e5ca6 100644 --- a/bookshop/db/schema.cds +++ b/bookshop/db/schema.cds @@ -11,6 +11,7 @@ entity Books : managed { price : Price; currency : Currency; image : LargeBinary @Core.MediaType: 'image/png'; + contents : Composition of many Contents on contents.book = $self; } entity Authors : managed { @@ -30,6 +31,15 @@ entity Genres : sap.common.CodeList { children : Composition of many Genres on children.parent = $self; } +/** Hierarchically organized entity for Contents */ +entity Contents { + key ID : UUID; + name : String; + page : Integer; + parent : Association to Contents; + book : Association to Books; +} + type Price : Decimal(9,2); diff --git a/bookshop/srv/admin-service.cds b/bookshop/srv/admin-service.cds index 37b02eb7..69085b38 100644 --- a/bookshop/srv/admin-service.cds +++ b/bookshop/srv/admin-service.cds @@ -3,4 +3,5 @@ service AdminService @(path:'/admin') { entity Authors as projection on my.Authors; entity Books as projection on my.Books; entity Genres as projection on my.Genres; + entity Contents as projection on my.Contents; } diff --git a/fiori/app/admin-books/fiori-service.cds b/fiori/app/admin-books/fiori-service.cds index d7e00a00..39422ed0 100644 --- a/fiori/app/admin-books/fiori-service.cds +++ b/fiori/app/admin-books/fiori-service.cds @@ -4,7 +4,6 @@ using from '../common'; // to help UI linter get the complete annotations annotate sap.capire.bookshop.Genres with @fiori.draft.enabled; annotate AdminService.Genres with @odata.draft.enabled; annotate AdminService.Genres with @odata.draft.bypass; -annotate AdminService.Genres with @odata.draft.bypass; //////////////////////////////////////////////////////////////////////////// @@ -15,10 +14,11 @@ annotate AdminService.Genres with @odata.draft.bypass; annotate AdminService.Books with @( UI: { Facets: [ - {$Type: 'UI.ReferenceFacet', Label: '{i18n>General}', Target: '@UI.FieldGroup#General'}, - {$Type: 'UI.ReferenceFacet', Label: '{i18n>Translations}', Target: 'texts/@UI.LineItem'}, - {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, - {$Type: 'UI.ReferenceFacet', Label: '{i18n>Admin}', Target: '@UI.FieldGroup#Admin'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>General}', Target: '@UI.FieldGroup#General'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Translations}', Target: 'texts/@UI.LineItem'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Details}', Target: '@UI.FieldGroup#Details'}, + {$Type: 'UI.ReferenceFacet', Label: '{i18n>Admin}', Target: '@UI.FieldGroup#Admin'}, + {$Type : 'UI.ReferenceFacet', Label : '{i18n>Contents}', Target : 'contents/@UI.PresentationVariant'} ], FieldGroup#General: { Data: [ diff --git a/fiori/app/admin-books/webapp/manifest.json b/fiori/app/admin-books/webapp/manifest.json index 2c8c7b60..c9b6f31c 100644 --- a/fiori/app/admin-books/webapp/manifest.json +++ b/fiori/app/admin-books/webapp/manifest.json @@ -79,6 +79,11 @@ "pattern": "Books({key}/author({key2}):?query:", "name": "AuthorsDetails", "target": "AuthorsDetails" + }, + { + "pattern": "Books({key})/contents({key2}):?query:", + "name": "ContentsDetails", + "target": "ContentsDetails" } ], "targets": { @@ -112,11 +117,34 @@ "detail" : { "route" : "AuthorsDetails" } + }, + "contents": { + "detail": { + "route": "ContentsDetails" + } + } + }, + "controlConfiguration": { + "contents/@com.sap.vocabularies.UI.v1.LineItem": { + "tableSettings": { + "hierarchyQualifier": "ContentsHierarchy", + "type": "TreeTable" + } } } } } }, + "ContentsDetails": { + "type": "Component", + "id": "ContentsDetails", + "name": "sap.fe.templates.ObjectPage", + "options": { + "settings": { + "contextPath": "/Books/contents" + } + } + }, "AuthorsDetails": { "type": "Component", "id": "AuthorsDetailsList", diff --git a/fiori/app/common.cds b/fiori/app/common.cds index d704237b..233bbf2d 100644 --- a/fiori/app/common.cds +++ b/fiori/app/common.cds @@ -103,6 +103,7 @@ annotate Hierarchy with @Capabilities.SortRestrictions.NonSortableProperties: [ ]; extend my.Genres with Hierarchy; +extend my.Contents with Hierarchy; //////////////////////////////////////////////////////////////////////////// // @@ -165,6 +166,76 @@ annotate my.Genres with { name @title: '{i18n>Genre}'; } +//////////////////////////////////////////////////////////////////////////// +// +// Contents Tree Table Annotations +// +// DISCLAIMER: The below are an alpha version implementation and will change in final release !!! +// +annotate my.Contents with @Aggregation.RecursiveHierarchy #ContentsHierarchy: { + $Type: 'Aggregation.RecursiveHierarchyType', + NodeProperty: ID, // identifies a node + ParentNavigationProperty: parent // navigates to a node's parent +}; + +annotate my.Contents with @Hierarchy.RecursiveHierarchy #ContentsHierarchy: { + $Type: 'Hierarchy.RecursiveHierarchyType', + LimitedDescendantCount: LimitedDescendantCount, + DistanceFromRoot: DistanceFromRoot, + DrillState: DrillState, + Matched: Matched, + MatchedDescendantCount: MatchedDescendantCount, + LimitedRank: LimitedRank +}; + +annotate my.Contents with @( + cds.search: {name} +); + +//////////////////////////////////////////////////////////////////////////// +// +// Contents List +// +annotate my.Contents with @UI: { + PresentationVariant : { + $Type : 'UI.PresentationVariantType', + RequestAtLeast: [name], + Visualizations: ['@UI.LineItem'], + }, + LineItem : [{ + $Type: 'UI.DataField', + Value: name, + Label : '{i18n>Name}' + }, + { + $Type: 'UI.DataField', + Value: page, + Label : '{i18n>Page}' + }], + HeaderInfo : { + $Type : 'UI.HeaderInfoType', + TypeName : '{i18n>ContentsLevel}', + TypeNamePlural: '{i18n>ContentsLevels}', + Title : { + $Type: 'UI.DataField', + Value: name, + } + }, + FieldGroup : { + $Type: 'UI.FieldGroupType', + Data : [{ + $Type: 'UI.DataField', + Value: page, + Label : '{i18n>PageNumber}' + }], + }, + Facets : [{ + $Type : 'UI.ReferenceFacet', + Target: '@UI.FieldGroup', + Label : '{i18n>Informations}', + }], +}; + //////////////////////////////////////////////////////////////////////////// // // Authors List From 34f75b52c82c48d5ce4aff5e782eff6d2186ef56 Mon Sep 17 00:00:00 2001 From: "Dr. David A. Kunz" Date: Thu, 26 Jun 2025 13:36:03 +0200 Subject: [PATCH 2/2] add children as composition --- bookshop/db/schema.cds | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/bookshop/db/schema.cds b/bookshop/db/schema.cds index 903e5ca6..6ad597b6 100644 --- a/bookshop/db/schema.cds +++ b/bookshop/db/schema.cds @@ -33,11 +33,12 @@ entity Genres : sap.common.CodeList { /** Hierarchically organized entity for Contents */ entity Contents { - key ID : UUID; - name : String; - page : Integer; - parent : Association to Contents; - book : Association to Books; + key ID : UUID; + name : String; + page : Integer; + parent : Association to Contents; + children : Composition of many Contents on children.parent = $self; + book : Association to Books; } type Price : Decimal(9,2);