@sap/cds-dk 7.0.1 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/add.js +36 -40
- package/bin/bind.js +0 -1
- package/bin/build.js +4 -0
- package/bin/cds.js +14 -8
- package/bin/compile/index.js +3 -3
- package/bin/deploy/to-hana.js +1 -1
- package/bin/help.js +2 -3
- package/bin/init.js +2 -2
- package/lib/bind/cfKeyProvider.js +1 -0
- package/lib/bind/index.js +3 -0
- package/lib/bind/userCdsrcJsonStorageProvider.js +2 -10
- package/lib/build/buildTaskEngine.js +1 -1
- package/lib/build/constants.js +16 -14
- package/lib/build/provider/buildTaskHandlerFeatureToggles.js +2 -1
- package/lib/build/provider/java/index.js +2 -2
- package/lib/build/provider/mtx/resourcesTarBuilder.js +2 -6
- package/lib/build/provider/mtx-sidecar/index.js +15 -11
- package/lib/build/util.js +8 -0
- package/lib/cds.js +2 -2
- package/lib/client/base_command.js +3 -6
- package/lib/compile/asyncapi/components/messages/index.js +41 -18
- package/lib/compile/asyncapi/index.js +23 -2
- package/lib/import/odata/metadataconverter/MetadataConverter.js +1 -0
- package/lib/init/constants.js +5 -5
- package/lib/init/index.js +68 -76
- package/lib/init/template/_merging/registry-mta.js +2 -2
- package/lib/init/template/approuter/index.js +10 -7
- package/lib/init/template/auditlog/index.js +3 -4
- package/lib/init/template/cf-manifest/files/manifest.yml.hbs +15 -23
- package/lib/init/template/cf-manifest/files/services-manifest.yml.hbs +22 -17
- package/lib/init/template/cf-manifest/index.js +5 -5
- package/lib/init/template/connectivity/index.js +2 -3
- package/lib/init/template/data/index.js +6 -6
- package/lib/init/template/destination/index.js +3 -5
- package/lib/init/template/enterprise-messaging/index.js +4 -5
- package/lib/init/template/enterprise-messaging-shared/index.js +3 -4
- package/lib/init/template/extensibility/index.js +2 -3
- package/lib/init/template/file-based-messaging/index.js +2 -2
- package/lib/init/template/hana/files/mta.yaml.hbs +1 -1
- package/lib/init/template/hana/index.js +39 -63
- package/lib/init/template/helm/index.js +15 -14
- package/lib/init/template/html5-repo/index.js +3 -7
- package/lib/init/template/java/index.js +6 -6
- package/lib/init/template/kibana/files/mta.yaml.hbs +29 -0
- package/lib/init/template/kibana/index.js +54 -0
- package/lib/init/template/lint/index.js +8 -7
- package/lib/init/template/mta/index.js +3 -2
- package/lib/init/template/multitenancy/files/package.json.hbs +0 -3
- package/lib/init/template/multitenancy/files/package.sidecar.json.hbs +1 -1
- package/lib/init/template/multitenancy/index.js +25 -40
- package/lib/init/template/nodejs/index.js +4 -5
- package/lib/init/template/pipeline/index.js +3 -3
- package/lib/init/template/redis-messaging/index.js +3 -4
- package/lib/init/template/sample/files/app/_i18n/i18n.properties +3 -32
- package/lib/init/template/sample/files/app/_i18n/i18n_de.properties +2 -2
- package/lib/init/template/sample/files/app/admin-books/fiori-service.cds +6 -7
- package/lib/init/template/sample/files/app/admin-books/webapp/Component.js +3 -3
- package/lib/init/template/sample/files/app/admin-books/webapp/i18n/i18n.properties +3 -11
- package/lib/init/template/sample/files/app/admin-books/webapp/manifest.json +117 -113
- package/lib/init/template/sample/files/app/appconfig/fioriSandboxConfig.json +38 -0
- package/lib/init/template/sample/files/app/browse/fiori-service.cds +56 -0
- package/lib/init/template/sample/files/app/browse/webapp/Component.js +7 -0
- package/lib/init/template/sample/files/app/browse/webapp/i18n/i18n.properties +4 -0
- package/lib/init/template/sample/files/app/browse/webapp/manifest.json +139 -0
- package/lib/init/template/sample/files/app/common.cds +78 -81
- package/lib/init/template/sample/files/app/services.cds +1 -0
- package/lib/init/template/sample/files/srv/admin-service.cds +1 -1
- package/lib/init/template/sample/files/srv/cat-service.cds +1 -1
- package/lib/init/template/sample/index.js +6 -5
- package/lib/init/template/sqlite/index.js +1 -1
- package/lib/init/template/templateBase.js +9 -19
- package/lib/init/template/tiny-sample/index.js +6 -6
- package/lib/init/template/toggles/index.js +1 -2
- package/lib/init/template/typer/files/xsconfig.json +0 -1
- package/lib/init/template/typer/index.js +1 -1
- package/lib/init/template/xsuaa/index.js +3 -4
- package/lib/init/util/indent.js +57 -0
- package/lib/init/util/merge.js +71 -15
- package/lib/init/util/mvn.js +24 -10
- package/lib/init/util/projectReader.js +53 -169
- package/lib/init/util/template.js +12 -11
- package/lib/init/util/xml.js +6 -6
- package/lib/util/pruneAxiosErrors.js +22 -0
- package/lib/watch/open.js +6 -3
- package/npm-shrinkwrap.json +20 -37
- package/package.json +1 -2
- package/lib/init/template/kibana-logging/files/cds.package.json +0 -7
- package/lib/init/template/kibana-logging/files/mta.yaml.hbs +0 -14
- package/lib/init/template/kibana-logging/index.js +0 -45
- /package/lib/init/template/{kibana-logging → kibana}/files/package.json.hbs +0 -0
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
const { join } = require('path')
|
|
2
2
|
const cds = require('../../../cds')
|
|
3
|
-
const { exists } = cds.utils
|
|
3
|
+
const { exists, read, write } = cds.utils
|
|
4
|
+
const { APPROUTER, HANA, KIBANA } = require('../../constants').OPTIONS
|
|
4
5
|
const { readProject } = require('../../util/projectReader')
|
|
5
6
|
const { mergeJSON, mergeYAML, sort } = require('../../util/merge')
|
|
6
7
|
const { copyAndTrack, parseMd5File, writeMd5File } = require('../../util/md5')
|
|
@@ -14,28 +15,33 @@ const {
|
|
|
14
15
|
|
|
15
16
|
module.exports = class MultitenancyTemplate extends require('../templateBase') {
|
|
16
17
|
|
|
17
|
-
static hasFacet(env
|
|
18
|
+
static hasFacet(env) {
|
|
18
19
|
// REVISIT: Check if this can be simplified
|
|
20
|
+
const { options } = cds.cli.options
|
|
19
21
|
return options?.add?.has('mtx') || options?.add?.has('multitenancy') ||
|
|
20
22
|
!!env.requires?.multitenancy || !!env.requires?.db?.multiTenant ||
|
|
21
23
|
exists(join('mtx', 'sidecar')) || false
|
|
22
24
|
}
|
|
23
25
|
|
|
24
26
|
getRelatedFacets() {
|
|
25
|
-
return [
|
|
27
|
+
return [APPROUTER, HANA, KIBANA]
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
async run() {
|
|
29
|
-
const project = await readProject(
|
|
30
|
-
const { isNodejs, configFile } = project
|
|
31
|
+
const project = await readProject()
|
|
32
|
+
const { isNodejs, isJava, configFile } = project
|
|
31
33
|
await mergeJSON(configFile, join(__dirname, 'files', `package.json.hbs`), project)
|
|
34
|
+
if (isJava) {
|
|
35
|
+
const packageJson = await read('package.json')
|
|
36
|
+
packageJson.workspaces = ['mtx/sidecar']
|
|
37
|
+
await write('package.json', packageJson, { spaces: 2 })
|
|
38
|
+
}
|
|
32
39
|
if (isNodejs) await sort('package.json', 'dependencies')
|
|
33
40
|
await copyRenderedJSON(join(__dirname, 'files', 'package.sidecar.json.hbs'), join('mtx', 'sidecar', 'package.json'), project)
|
|
34
|
-
await this.runDependentMerging()
|
|
35
41
|
}
|
|
36
42
|
|
|
37
43
|
async runDependentMerging(context = {}) {
|
|
38
|
-
const project = await readProject(
|
|
44
|
+
const project = await readProject()
|
|
39
45
|
const { isNodejs, isJava, hasMta, hasHelm, hasXsuaa, hasHana, srvPath } = project
|
|
40
46
|
|
|
41
47
|
if (hasMta) {
|
|
@@ -87,11 +93,7 @@ module.exports = class MultitenancyTemplate extends require('../templateBase') {
|
|
|
87
93
|
context.oldTrackingData = context.newTrackingData = await parseMd5File(join('chart', '.cds-add-helm-files.md5'))
|
|
88
94
|
}
|
|
89
95
|
|
|
90
|
-
await mergeYAML(
|
|
91
|
-
join('chart', 'values.yaml'),
|
|
92
|
-
join(__dirname, 'files', 'values.yaml.hbs'),
|
|
93
|
-
project
|
|
94
|
-
)
|
|
96
|
+
await mergeYAML(join('chart', 'values.yaml'), join(__dirname, 'files', 'values.yaml.hbs'), project)
|
|
95
97
|
|
|
96
98
|
const envFromObject = {
|
|
97
99
|
envFrom: [
|
|
@@ -124,7 +126,7 @@ module.exports = class MultitenancyTemplate extends require('../templateBase') {
|
|
|
124
126
|
|
|
125
127
|
// REVISIT: Don't reference other templates except for the safe `runDependentMerging` -> low coupling, high cohesion
|
|
126
128
|
const HelmTemplate = require(`../helm`);
|
|
127
|
-
const helmTemplate = new HelmTemplate(
|
|
129
|
+
const helmTemplate = new HelmTemplate(context.oldTrackingData, context.newTrackingData);
|
|
128
130
|
|
|
129
131
|
await helmTemplate.addDependency('web-application', 'sidecar');
|
|
130
132
|
|
|
@@ -153,33 +155,16 @@ module.exports = class MultitenancyTemplate extends require('../templateBase') {
|
|
|
153
155
|
}
|
|
154
156
|
|
|
155
157
|
if (hasXsuaa) {
|
|
156
|
-
await mergeJSON(
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
)
|
|
167
|
-
}
|
|
168
|
-
|
|
169
|
-
if (hasXsuaa && hasHelm) {
|
|
170
|
-
await mergeYAML(
|
|
171
|
-
join('chart', 'values.yaml'),
|
|
172
|
-
{
|
|
173
|
-
xsuaa: {
|
|
174
|
-
parameters: {
|
|
175
|
-
'tenant-mode': 'shared'
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
},
|
|
179
|
-
null,
|
|
180
|
-
{ forceOverwrite: true }
|
|
181
|
-
)
|
|
182
|
-
if (isIndependentCommand) await writeMd5File(join('chart', '.cds-add-helm-files.md5'), context.newTrackingData)
|
|
158
|
+
await mergeJSON('xs-security.json',join(__dirname, 'files', 'xs-security.json.hbs'), project, {
|
|
159
|
+
additions: [{
|
|
160
|
+
in: 'scopes',
|
|
161
|
+
where: [{ property: 'name', isEqualTo: '$XSAPPNAME.mtcallback' }],
|
|
162
|
+
}]
|
|
163
|
+
})
|
|
164
|
+
if (hasHelm) {
|
|
165
|
+
await mergeYAML(join('chart', 'values.yaml'), { xsuaa: { parameters: { 'tenant-mode': 'shared' }}}, null, { forceOverwrite: true })
|
|
166
|
+
if (isIndependentCommand) await writeMd5File(join('chart', '.cds-add-helm-files.md5'), context.newTrackingData)
|
|
167
|
+
}
|
|
183
168
|
}
|
|
184
169
|
}
|
|
185
170
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
const { join } = require('path')
|
|
2
2
|
const cds = require('../../../cds')
|
|
3
|
-
const { exists, mkdirp } = cds.utils
|
|
3
|
+
const { exists, mkdirp, path } = cds.utils
|
|
4
4
|
const { URLS, OPTIONS: { NODEJS, JAVA }, COMMAND_ADD } = require('../../constants')
|
|
5
5
|
const term = require('../../../util/term')
|
|
6
6
|
const { copyFiles } = require('../../util/template')
|
|
@@ -14,18 +14,17 @@ module.exports = class NodejsTemplate extends require('../templateBase') {
|
|
|
14
14
|
|
|
15
15
|
async canRun() {
|
|
16
16
|
if (cds.cli.command === COMMAND_ADD) {
|
|
17
|
-
throw
|
|
17
|
+
throw `You can't change the runtime of an existing project.`
|
|
18
18
|
}
|
|
19
19
|
if (cds.cli.options.add?.has(JAVA)) {
|
|
20
|
-
throw
|
|
20
|
+
throw `Only one runtime per project is supported. Specify either ${term.bold(JAVA)} or ${term.bold(NODEJS)}.`
|
|
21
21
|
}
|
|
22
22
|
return true
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
async run() {
|
|
26
26
|
const { db, srv, app } = (await this.getEnv()).folders
|
|
27
|
-
|
|
28
|
-
await copyFiles(join(__dirname, 'files'), projectPath, { projectName }, this.options.force)
|
|
27
|
+
await copyFiles(join(__dirname, 'files'), cds.root, { projectName: path.basename(cds.root) }, cds.cli.options.force)
|
|
29
28
|
await Promise.all([db, srv, app].map(p => mkdirp(p)))
|
|
30
29
|
}
|
|
31
30
|
|
|
@@ -9,19 +9,19 @@ module.exports = class PipelineTemplate extends require('../templateBase') {
|
|
|
9
9
|
|
|
10
10
|
|
|
11
11
|
async canRun() {
|
|
12
|
-
if (
|
|
12
|
+
if (cds.cli.options.force) {
|
|
13
13
|
return true;
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
if (exists('Jenkinsfile') || exists(join('.pipeline', 'config.yml'))) {
|
|
17
|
-
throw
|
|
17
|
+
throw `Pipeline support file exists. Use --force to overwrite.`
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
return true;
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
async run() {
|
|
24
|
-
await copyFiles(join(__dirname, 'files'), cds.root, {},
|
|
24
|
+
await copyFiles(join(__dirname, 'files'), cds.root, {}, true);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
async finalize() {
|
|
@@ -8,7 +8,7 @@ const { srvNode4, srvJava4, redis } = require('../_merging/registry-mta')
|
|
|
8
8
|
module.exports = class RedisMessagingTemplate extends require('../templateBase') {
|
|
9
9
|
|
|
10
10
|
async canRun() {
|
|
11
|
-
const { hasMta, hasHelm, isJava } = await readProject(
|
|
11
|
+
const { hasMta, hasHelm, isJava } = await readProject()
|
|
12
12
|
if (isJava) throw `'cds add redis-messaging' is not available for Java yet`
|
|
13
13
|
if (hasHelm && !hasMta) throw `'cds add redis-messaging' is not available for Kyma yet`
|
|
14
14
|
return true
|
|
@@ -19,15 +19,14 @@ module.exports = class RedisMessagingTemplate extends require('../templateBase')
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
async run() {
|
|
22
|
-
const project = await readProject(
|
|
22
|
+
const project = await readProject()
|
|
23
23
|
const { configFile } = project
|
|
24
24
|
project.shortcut = !(await read(configFile)).cds?.requires?.messaging?.kind
|
|
25
25
|
await mergeJSON(configFile, join(__dirname, 'files', 'package.json.hbs'), project)
|
|
26
|
-
await this.runDependentMerging()
|
|
27
26
|
}
|
|
28
27
|
|
|
29
28
|
async runDependentMerging() {
|
|
30
|
-
const project = await readProject(
|
|
29
|
+
const project = await readProject()
|
|
31
30
|
const { hasMta, isNodejs, srvPath } = project
|
|
32
31
|
|
|
33
32
|
if (hasMta) {
|
|
@@ -3,41 +3,12 @@ Book = Book
|
|
|
3
3
|
ID = ID
|
|
4
4
|
Title = Title
|
|
5
5
|
Author = Author
|
|
6
|
+
Authors = Authors
|
|
6
7
|
AuthorID = Author ID
|
|
7
|
-
|
|
8
|
+
AuthorName = Author Name
|
|
8
9
|
Name = Name
|
|
9
|
-
Description = Description
|
|
10
|
-
Image = Image
|
|
11
|
-
AuthorName = Author's Name
|
|
12
|
-
DateOfBirth = Date of Birth
|
|
13
|
-
DateOfDeath = Date of Death
|
|
14
|
-
PlaceOfBirth = Place of Birth
|
|
15
|
-
PlaceOfDeath = Place of Death
|
|
16
10
|
Age = Age
|
|
17
|
-
|
|
18
|
-
Authors = Authors
|
|
19
|
-
|
|
11
|
+
Stock = Stock
|
|
20
12
|
Order = Order
|
|
21
13
|
Orders = Orders
|
|
22
|
-
OrderNo = Order Number
|
|
23
|
-
OrderItems = Order Items
|
|
24
|
-
Customer = Customer
|
|
25
|
-
Product = Product
|
|
26
|
-
ProductID = Product ID
|
|
27
|
-
ProductTitle = Product Title
|
|
28
|
-
UnitPrice = Unit Price
|
|
29
|
-
Quantity = Quantity
|
|
30
|
-
|
|
31
14
|
Price = Price
|
|
32
|
-
Currency = Currency
|
|
33
|
-
Date = Date
|
|
34
|
-
Rating = Rating
|
|
35
|
-
NumberOfReviews = Number of Reviews
|
|
36
|
-
|
|
37
|
-
Genre = Genre
|
|
38
|
-
Genres = Genres
|
|
39
|
-
SubGenres = Sub Genres
|
|
40
|
-
|
|
41
|
-
NumCode = Numeric Code
|
|
42
|
-
MinorUnit = Minor Unit
|
|
43
|
-
Exponent = Exponent
|
|
@@ -2,12 +2,12 @@ Books = Bücher
|
|
|
2
2
|
Book = Buch
|
|
3
3
|
ID = ID
|
|
4
4
|
Title = Titel
|
|
5
|
-
Authors = Autoren
|
|
6
5
|
Author = Autor
|
|
6
|
+
Authors = Autoren
|
|
7
7
|
AuthorID = ID des Autors
|
|
8
8
|
AuthorName = Name des Autors
|
|
9
|
-
Age = Alter
|
|
10
9
|
Name = Name
|
|
10
|
+
Age = Alter
|
|
11
11
|
Stock = Bestand
|
|
12
12
|
Order = Bestellung
|
|
13
13
|
Orders = Bestellungen
|
|
@@ -7,7 +7,7 @@ using { sap.capire.bookshop } from '../../db/schema';
|
|
|
7
7
|
//
|
|
8
8
|
|
|
9
9
|
annotate AdminService.Books with @(UI: {
|
|
10
|
-
Facets
|
|
10
|
+
Facets: [
|
|
11
11
|
{
|
|
12
12
|
$Type : 'UI.ReferenceFacet',
|
|
13
13
|
Label : '{i18n>General}',
|
|
@@ -43,7 +43,7 @@ annotate AdminService.Books with @(UI: {
|
|
|
43
43
|
Label: '{i18n>Currency}'
|
|
44
44
|
},
|
|
45
45
|
]},
|
|
46
|
-
FieldGroup #Admin
|
|
46
|
+
FieldGroup #Admin: {Data: [
|
|
47
47
|
{Value: createdBy},
|
|
48
48
|
{Value: createdAt},
|
|
49
49
|
{Value: modifiedBy},
|
|
@@ -61,12 +61,12 @@ annotate sap.capire.bookshop.Books with @fiori.draft.enabled;
|
|
|
61
61
|
annotate AdminService.Books with @odata.draft.enabled;
|
|
62
62
|
|
|
63
63
|
annotate AdminService.Books.texts with @(UI: {
|
|
64
|
-
Identification
|
|
64
|
+
Identification: [{Value: title}],
|
|
65
65
|
SelectionFields: [
|
|
66
66
|
locale,
|
|
67
67
|
title
|
|
68
68
|
],
|
|
69
|
-
LineItem
|
|
69
|
+
LineItem: [
|
|
70
70
|
{
|
|
71
71
|
Value: locale,
|
|
72
72
|
Label: 'Locale'
|
|
@@ -93,14 +93,13 @@ annotate AdminService.Books.texts {
|
|
|
93
93
|
ValueList.entity: 'Languages',
|
|
94
94
|
Common.ValueListWithFixedValues, //show as drop down, not a dialog
|
|
95
95
|
)
|
|
96
|
-
}
|
|
96
|
+
};
|
|
97
97
|
|
|
98
98
|
// In addition we need to expose Languages through AdminService as a target for ValueList
|
|
99
99
|
using {sap} from '@sap/cds/common';
|
|
100
100
|
|
|
101
101
|
extend service AdminService {
|
|
102
|
-
@readonly
|
|
103
|
-
entity Languages as projection on sap.common.Languages;
|
|
102
|
+
@readonly entity Languages as projection on sap.common.Languages;
|
|
104
103
|
}
|
|
105
104
|
|
|
106
105
|
// Workaround for Fiori popup for asking user to enter a new UUID on Create
|
|
@@ -1,11 +1,3 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
# JCI app descriptor contains lower case TITLE
|
|
5
|
-
appTitle=Bookshop Sample
|
|
6
|
-
|
|
7
|
-
# JCI app descriptor contains lower case DESCRIPTION
|
|
8
|
-
appSubTitle=CAP Sample Application
|
|
9
|
-
|
|
10
|
-
# JCI app descriptor contains lower case DESCRIPTION
|
|
11
|
-
appDescription=CDS Sample Service
|
|
1
|
+
appTitle=Manage Books
|
|
2
|
+
appSubTitle=Manage bookshop inventory
|
|
3
|
+
appDescription=Manage your bookshop inventory with ease.
|
|
@@ -1,129 +1,133 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_version": "1.
|
|
2
|
+
"_version": "1.49.0",
|
|
3
3
|
"sap.app": {
|
|
4
|
-
|
|
5
|
-
"
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
"id": "ui5template.basicSAPUI5ApplicationProject",
|
|
20
|
-
"-id": "ui5template.smartTemplate",
|
|
21
|
-
"-version": "1.40.12"
|
|
4
|
+
"applicationVersion": {
|
|
5
|
+
"version": "1.0.0"
|
|
6
|
+
},
|
|
7
|
+
"id": "books",
|
|
8
|
+
"type": "application",
|
|
9
|
+
"title": "{{appTitle}}",
|
|
10
|
+
"description": "{{appDescription}}",
|
|
11
|
+
"i18n": "i18n/i18n.properties",
|
|
12
|
+
"dataSources": {
|
|
13
|
+
"AdminService": {
|
|
14
|
+
"uri": "/odata/v4/admin/",
|
|
15
|
+
"type": "OData",
|
|
16
|
+
"settings": {
|
|
17
|
+
"odataVersion": "4.0"
|
|
18
|
+
}
|
|
22
19
|
}
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
"sap.ui": {
|
|
23
|
+
"technology": "UI5",
|
|
24
|
+
"fullWidth": false,
|
|
25
|
+
"deviceTypes": {
|
|
26
|
+
"desktop": true,
|
|
27
|
+
"tablet": true,
|
|
28
|
+
"phone": true
|
|
29
|
+
}
|
|
23
30
|
},
|
|
24
31
|
"sap.ui5": {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"minUI5Version": "1.115.1",
|
|
34
|
+
"libs": {
|
|
35
|
+
"sap.fe.templates": {}
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
"models": {
|
|
39
|
+
"i18n": {
|
|
40
|
+
"type": "sap.ui.model.resource.ResourceModel",
|
|
41
|
+
"uri": "i18n/i18n.properties"
|
|
29
42
|
},
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
"":
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
43
|
+
"": {
|
|
44
|
+
"dataSource": "AdminService",
|
|
45
|
+
"settings": {
|
|
46
|
+
"synchronizationMode": "None",
|
|
47
|
+
"operationMode": "Server",
|
|
48
|
+
"autoExpandSelect": true,
|
|
49
|
+
"earlyRequests": true,
|
|
50
|
+
"groupProperties": {
|
|
51
|
+
"default": {
|
|
52
|
+
"submit": "Auto"
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
"routing": {
|
|
59
|
+
"routes": [
|
|
60
|
+
{
|
|
61
|
+
"pattern": ":?query:",
|
|
62
|
+
"name": "BooksList",
|
|
63
|
+
"target": "BooksList"
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"pattern": "Books({key}):?query:",
|
|
67
|
+
"name": "BooksDetails",
|
|
68
|
+
"target": "BooksDetails"
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"pattern": "Books({key}/author({key2}):?query:",
|
|
72
|
+
"name": "AuthorsDetails",
|
|
73
|
+
"target": "AuthorsDetails"
|
|
74
|
+
}
|
|
75
|
+
],
|
|
76
|
+
"targets": {
|
|
77
|
+
"BooksList": {
|
|
78
|
+
"type": "Component",
|
|
79
|
+
"id": "BooksList",
|
|
80
|
+
"name": "sap.fe.templates.ListReport",
|
|
81
|
+
"options": {
|
|
82
|
+
"settings": {
|
|
83
|
+
"entitySet": "Books",
|
|
84
|
+
"initialLoad": true,
|
|
85
|
+
"navigation": {
|
|
86
|
+
"Books": {
|
|
87
|
+
"detail": {
|
|
88
|
+
"route": "BooksDetails"
|
|
46
89
|
}
|
|
90
|
+
}
|
|
47
91
|
}
|
|
92
|
+
}
|
|
48
93
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
"
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
{
|
|
58
|
-
|
|
59
|
-
"
|
|
60
|
-
|
|
61
|
-
},
|
|
62
|
-
{
|
|
63
|
-
"pattern": "Books({key}/author({key2}):?query:",
|
|
64
|
-
"name": "AuthorsDetails",
|
|
65
|
-
"target": "AuthorsDetails"
|
|
66
|
-
}
|
|
67
|
-
],
|
|
68
|
-
"targets": {
|
|
69
|
-
"BooksList": {
|
|
70
|
-
"type": "Component",
|
|
71
|
-
"id": "BooksList",
|
|
72
|
-
"name": "sap.fe.templates.ListReport",
|
|
73
|
-
"options": {
|
|
74
|
-
"settings" : {
|
|
75
|
-
"entitySet" : "Books",
|
|
76
|
-
"initialLoad": true,
|
|
77
|
-
"navigation" : {
|
|
78
|
-
"Books" : {
|
|
79
|
-
"detail" : {
|
|
80
|
-
"route" : "BooksDetails"
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
"BooksDetails": {
|
|
88
|
-
"type": "Component",
|
|
89
|
-
"id": "BooksDetailsList",
|
|
90
|
-
"name": "sap.fe.templates.ObjectPage",
|
|
91
|
-
"options": {
|
|
92
|
-
"settings" : {
|
|
93
|
-
"entitySet" : "Books",
|
|
94
|
-
"navigation" : {
|
|
95
|
-
"Authors" : {
|
|
96
|
-
"detail" : {
|
|
97
|
-
"route" : "AuthorsDetails"
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
},
|
|
104
|
-
"AuthorsDetails": {
|
|
105
|
-
"type": "Component",
|
|
106
|
-
"id": "AuthorsDetailsList",
|
|
107
|
-
"name": "sap.fe.templates.ObjectPage",
|
|
108
|
-
"options": {
|
|
109
|
-
"settings" : {
|
|
110
|
-
"entitySet" : "Authors"
|
|
111
|
-
}
|
|
94
|
+
},
|
|
95
|
+
"BooksDetails": {
|
|
96
|
+
"type": "Component",
|
|
97
|
+
"id": "BooksDetailsList",
|
|
98
|
+
"name": "sap.fe.templates.ObjectPage",
|
|
99
|
+
"options": {
|
|
100
|
+
"settings": {
|
|
101
|
+
"entitySet": "Books",
|
|
102
|
+
"navigation": {
|
|
103
|
+
"Authors": {
|
|
104
|
+
"detail": {
|
|
105
|
+
"route": "AuthorsDetails"
|
|
112
106
|
}
|
|
107
|
+
}
|
|
113
108
|
}
|
|
109
|
+
}
|
|
114
110
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
"
|
|
118
|
-
"
|
|
111
|
+
},
|
|
112
|
+
"AuthorsDetails": {
|
|
113
|
+
"type": "Component",
|
|
114
|
+
"id": "AuthorsDetailsList",
|
|
115
|
+
"name": "sap.fe.templates.ObjectPage",
|
|
116
|
+
"options": {
|
|
117
|
+
"settings": {
|
|
118
|
+
"entitySet": "Authors"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
119
122
|
}
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
"
|
|
123
|
-
"
|
|
123
|
+
},
|
|
124
|
+
"contentDensities": {
|
|
125
|
+
"compact": true,
|
|
126
|
+
"cozy": true
|
|
127
|
+
}
|
|
124
128
|
},
|
|
125
129
|
"sap.fiori": {
|
|
126
|
-
|
|
127
|
-
|
|
130
|
+
"registrationIds": [],
|
|
131
|
+
"archeType": "transactional"
|
|
128
132
|
}
|
|
129
|
-
}
|
|
133
|
+
}
|
|
@@ -5,6 +5,23 @@
|
|
|
5
5
|
"config": {
|
|
6
6
|
"catalogs": [],
|
|
7
7
|
"groups": [
|
|
8
|
+
{
|
|
9
|
+
"id": "Bookshop",
|
|
10
|
+
"title": "Bookshop",
|
|
11
|
+
"isPreset": true,
|
|
12
|
+
"isVisible": true,
|
|
13
|
+
"isGroupLocked": false,
|
|
14
|
+
"tiles": [
|
|
15
|
+
{
|
|
16
|
+
"id": "BrowseBooks",
|
|
17
|
+
"tileType": "sap.ushell.ui.tile.StaticTile",
|
|
18
|
+
"properties": {
|
|
19
|
+
"title": "Browse Books",
|
|
20
|
+
"targetURL": "#Books-display"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
]
|
|
24
|
+
},
|
|
8
25
|
{
|
|
9
26
|
"id": "Administration",
|
|
10
27
|
"title": "Administration",
|
|
@@ -35,6 +52,27 @@
|
|
|
35
52
|
"adapter": {
|
|
36
53
|
"config": {
|
|
37
54
|
"inbounds": {
|
|
55
|
+
"BrowseBooks": {
|
|
56
|
+
"semanticObject": "Books",
|
|
57
|
+
"action": "display",
|
|
58
|
+
"title": "Browse Books",
|
|
59
|
+
"signature": {
|
|
60
|
+
"parameters": {
|
|
61
|
+
"Books.ID": {
|
|
62
|
+
"renameTo": "ID"
|
|
63
|
+
},
|
|
64
|
+
"Authors.books.ID": {
|
|
65
|
+
"renameTo": "ID"
|
|
66
|
+
}
|
|
67
|
+
},
|
|
68
|
+
"additionalParameters": "ignored"
|
|
69
|
+
},
|
|
70
|
+
"resolutionResult": {
|
|
71
|
+
"applicationType": "SAPUI5",
|
|
72
|
+
"additionalInformation": "SAPUI5.Component=bookshop",
|
|
73
|
+
"url": "browse/webapp"
|
|
74
|
+
}
|
|
75
|
+
},
|
|
38
76
|
"ManageBooks": {
|
|
39
77
|
"semanticObject": "Books",
|
|
40
78
|
"action": "manage",
|