Merge pull request #840 from SAP-samples/hierarch-object-page
Fiori: Tree View Object Page
This commit is contained in:
64
bookshop/db/data/sap.capire.bookshop-Contents.csv
Normal file
64
bookshop/db/data/sap.capire.bookshop-Contents.csv
Normal file
@@ -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
|
||||
|
@@ -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,16 @@ 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;
|
||||
children : Composition of many Contents on children.parent = $self;
|
||||
book : Association to Books;
|
||||
}
|
||||
|
||||
type Price : Decimal(9,2);
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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: [
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user