Compare commits
13 Commits
openSAP-we
...
openSAP-we
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0ea0202f5f | ||
|
|
4649916761 | ||
|
|
b49ace9375 | ||
|
|
d647596fb2 | ||
|
|
0bf6e2fc3b | ||
|
|
7297c7f957 | ||
|
|
d258ac3348 | ||
|
|
5afb637c8f | ||
|
|
a0275c97ef | ||
|
|
8500f12eaf | ||
|
|
3cb08f966a | ||
|
|
3eb82fd99d | ||
|
|
a82e7a9c9f |
@@ -11,7 +11,7 @@ In SAP Business Application Studio, open a terminal.
|
||||
Then clone the repo with this specific branch:
|
||||
|
||||
```sh
|
||||
git clone https://github.com/sap-samples/cloud-cap-samples projects/cloud-cap-samples -b openSAP-week2-unit1
|
||||
git clone https://github.com/sap-samples/cloud-cap-samples projects/cloud-cap-samples -b openSAP-week3-unit2
|
||||
cd projects/cloud-cap-samples
|
||||
```
|
||||
|
||||
@@ -24,7 +24,7 @@ npm install
|
||||
|
||||
Now you're ready to run the samples, for example:
|
||||
```sh
|
||||
cd packages/bookshop
|
||||
cd packages/officesupplies
|
||||
cds watch
|
||||
```
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
ID;name
|
||||
101;Emily Brontë
|
||||
107;Charlotte Brontë
|
||||
150;Edgar Allen Poe
|
||||
170;Richard Carpenter
|
||||
|
@@ -1,6 +0,0 @@
|
||||
ID;title;author_ID;stock
|
||||
201;Wuthering Heights;101;12
|
||||
207;Jane Eyre;107;11
|
||||
251;The Raven;150;333
|
||||
252;Eleonora;150;555
|
||||
271;Catweazle;170;22
|
||||
|
@@ -1,40 +0,0 @@
|
||||
namespace sap.capire.bookshop;
|
||||
using { Currency, managed } from '@sap/cds/common';
|
||||
|
||||
entity Books : managed, additionalInfo {
|
||||
key ID : Integer;
|
||||
title : localized String(111);
|
||||
descr : localized String(1111);
|
||||
author : Association to Authors;
|
||||
stock : Integer;
|
||||
price : Decimal(9,2);
|
||||
currency : Currency;
|
||||
}
|
||||
|
||||
entity Authors : managed {
|
||||
key ID : Integer;
|
||||
name : String(111);
|
||||
books : Association to many Books on books.author = $self;
|
||||
}
|
||||
|
||||
entity Orders : managed {
|
||||
key ID : UUID;
|
||||
OrderNo : String @title:'Order Number'; //> readable key
|
||||
Items : Composition of many OrderItems on Items.parent = $self;
|
||||
}
|
||||
entity OrderItems {
|
||||
key ID : UUID;
|
||||
parent : Association to Orders;
|
||||
book : Association to Books;
|
||||
amount : Integer;
|
||||
}
|
||||
|
||||
entity Movies: additionalInfo {
|
||||
key ID : Integer;
|
||||
name : String(111);
|
||||
}
|
||||
|
||||
aspect additionalInfo{
|
||||
genre: String(100);
|
||||
language: String(200);
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
### Submit Orders
|
||||
POST http://localhost:4004/browse/Orders
|
||||
Content-Type: application/json
|
||||
|
||||
{ "OrderNo":"2019-09...", "Items":[
|
||||
{ "book_ID":201, "amount":5 }
|
||||
]}
|
||||
|
||||
# Sending this three times should result in a 409: 5 exceeds stock for book #201
|
||||
|
||||
### Check books entity that stock was reduced
|
||||
GET http://localhost:4004/admin/Books(201)
|
||||
@@ -1,7 +0,0 @@
|
||||
using { sap.capire.bookshop as my } from '../db/schema';
|
||||
service AdminService @(_requires:'admin') {
|
||||
entity Books as projection on my.Books;
|
||||
entity Movies as projection on my.Movies;
|
||||
entity Authors as projection on my.Authors;
|
||||
entity Orders as select from my.Orders;
|
||||
}
|
||||
@@ -1,10 +0,0 @@
|
||||
using { sap.capire.bookshop as my } from '../db/schema';
|
||||
service CatalogService @(path:'/browse') {
|
||||
|
||||
@readonly entity Books as SELECT from my.Books {*,
|
||||
author.name as author
|
||||
} excluding { createdBy, modifiedBy };
|
||||
|
||||
@requires_: 'authenticated-user'
|
||||
@insertonly entity Orders as projection on my.Orders;
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
/**
|
||||
* Implementation for CatalogService defined in ./cat-service.cds
|
||||
*/
|
||||
module.exports = (srv)=>{
|
||||
|
||||
// Use reflection to get the csn definition of Books
|
||||
const {Books} = cds.entities
|
||||
|
||||
// Add some discount for overstocked books
|
||||
srv.after ('READ','Books', (each)=>{
|
||||
if (each.stock > 111) each.title += ' -- 11% discount!'
|
||||
})
|
||||
|
||||
// Reduce stock of books upon incoming orders
|
||||
srv.before ('CREATE','Orders', async (req)=>{
|
||||
const tx = cds.transaction(req), order = req.data;
|
||||
if (order.Items) {
|
||||
const affectedRows = await tx.run(order.Items.map(item =>
|
||||
UPDATE(Books) .where({ID:item.book_ID})
|
||||
.and(`stock >=`, item.amount)
|
||||
.set(`stock -=`, item.amount)
|
||||
)
|
||||
)
|
||||
if (affectedRows.some(row => !row)) req.error(409, 'Sold out, sorry')
|
||||
}
|
||||
})
|
||||
|
||||
}
|
||||
24
packages/officesupplies/.eslintrc
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"extends": "eslint:recommended",
|
||||
"env": {
|
||||
"node": true,
|
||||
"es6": true,
|
||||
"jest": true
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": 2017
|
||||
},
|
||||
"globals": {
|
||||
"SELECT": true,
|
||||
"INSERT": true,
|
||||
"UPDATE": true,
|
||||
"DELETE": true,
|
||||
"CREATE": true,
|
||||
"DROP": true,
|
||||
"cds": true
|
||||
},
|
||||
"rules": {
|
||||
"no-console": "off",
|
||||
"require-atomic-updates": "off"
|
||||
}
|
||||
}
|
||||
23
packages/officesupplies/.gitignore
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
# CAP officesupplies
|
||||
_out
|
||||
*.db
|
||||
connection.properties
|
||||
default-*.json
|
||||
gen/
|
||||
node_modules/
|
||||
package-lock.json
|
||||
target/
|
||||
|
||||
# Web IDE, App Studio
|
||||
.che/
|
||||
.gen/
|
||||
|
||||
# MTA
|
||||
*_mta_build_tmp
|
||||
*.mtar
|
||||
mta_archives/
|
||||
|
||||
# Other
|
||||
.DS_Store
|
||||
*.orig
|
||||
*.log
|
||||
4
packages/officesupplies/.vscode/cds.js
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
// used in launch.json to refer to an installed cds via an absolute path
|
||||
|
||||
const cds = require('@sap/cds');
|
||||
cds.exec();
|
||||
19
packages/officesupplies/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": "cds run",
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"program": "${workspaceFolder}/.vscode/cds",
|
||||
"args": [ "run", "--with-mocks", "--in-memory?" ],
|
||||
"skipFiles": [ "<node_internals>/**" ],
|
||||
"internalConsoleOptions": "openOnSessionStart",
|
||||
"console": "internalConsole",
|
||||
"autoAttachChildProcesses": true
|
||||
}
|
||||
]
|
||||
}
|
||||
7
packages/officesupplies/.vscode/settings.json
vendored
Normal file
@@ -0,0 +1,7 @@
|
||||
{
|
||||
"files.exclude": {
|
||||
"**/.gitignore": true,
|
||||
"**/.git": true,
|
||||
"**/.vscode": true
|
||||
}
|
||||
}
|
||||
23
packages/officesupplies/.vscode/tasks.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
||||
{
|
||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||
// for the documentation about the tasks.json format
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"type": "shell",
|
||||
"label": "cds watch",
|
||||
"command": ["cds", "watch"],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"type": "shell",
|
||||
"label": "cds run",
|
||||
"command": ["cds", "run", "--with-mocks", "--in-memory?"],
|
||||
"problemMatcher": []
|
||||
}
|
||||
]
|
||||
}
|
||||
25
packages/officesupplies/README.md
Normal file
@@ -0,0 +1,25 @@
|
||||
# Getting Started
|
||||
|
||||
Welcome to your new project.
|
||||
|
||||
It contains these folders and files, following our recommended project layout:
|
||||
|
||||
File / Folder | Purpose
|
||||
---------|----------
|
||||
`app/` | content for UI frontends go here
|
||||
`db/` | your domain models and data go here
|
||||
`srv/` | your service models and code go here
|
||||
`package.json` | project metadata and configuration
|
||||
`readme.md` | this getting started guide
|
||||
|
||||
|
||||
## Next Steps...
|
||||
|
||||
- Open a new terminal and run `cds watch`
|
||||
- ( in VSCode simply choose _**Terminal** > Run Task > cds watch_ )
|
||||
- Start adding content, e.g. a [db/schema.cds](db/schema.cds), ...
|
||||
|
||||
|
||||
## Learn more...
|
||||
|
||||
Learn more at https://cap.cloud.sap/docs/get-started/
|
||||
4
packages/officesupplies/app/products/.npmrc
Normal file
@@ -0,0 +1,4 @@
|
||||
@sap:registry=https://npm.sap.com
|
||||
@ui5:registry=https://registry.npmjs.org
|
||||
save = true
|
||||
save-exact = true
|
||||
21
packages/officesupplies/app/products/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# products
|
||||
|
||||
This is a my new Fiori elements app
|
||||
|
||||
## Starting the generated app
|
||||
|
||||
- This app has been generated using the SAP UX - App Generator, as part of the SAP UX Tools Suite. In order to launch the generated app, simply run the following from the generated app root folder:
|
||||
|
||||
```
|
||||
npm start
|
||||
```
|
||||
|
||||
- Is it also possible to run the application using mock data that reflects the OData Service URL supplied during application generation. In order to run the application with Mock Data, run the following from the generated app root folder:
|
||||
|
||||
```
|
||||
npm run start-mock
|
||||
```
|
||||
|
||||
### Pre-requisites:
|
||||
|
||||
1. Active NodeJS LTS (Long Term Support) version and associated supported NPM version. (See https://nodejs.org)
|
||||
BIN
packages/officesupplies/app/products/images/box.png
Normal file
|
After Width: | Height: | Size: 12 KiB |
BIN
packages/officesupplies/app/products/images/envelopes.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
packages/officesupplies/app/products/images/eraser.png
Normal file
|
After Width: | Height: | Size: 42 KiB |
BIN
packages/officesupplies/app/products/images/hanger1.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/officesupplies/app/products/images/hanger2.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/officesupplies/app/products/images/hanger3.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/officesupplies/app/products/images/hanger4.png
Normal file
|
After Width: | Height: | Size: 16 KiB |
BIN
packages/officesupplies/app/products/images/magnets.png
Normal file
|
After Width: | Height: | Size: 37 KiB |
BIN
packages/officesupplies/app/products/images/mug.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
packages/officesupplies/app/products/images/pen.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
33
packages/officesupplies/app/products/package.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "products",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"sapux": true,
|
||||
"description": "This is a my new Fiori elements app",
|
||||
"keywords": [
|
||||
"ui5",
|
||||
"openui5",
|
||||
"sapui5"
|
||||
],
|
||||
"main": "webapp/index.html",
|
||||
"scripts": {
|
||||
"start": "npm run start-app-router",
|
||||
"start-app-router": "npm run build && run-script-os",
|
||||
"start-app-router:default": "destinations='[{\"name\":\"odata\",\"url\":\"http://localhost:4004\",\"strictSSL\":false}]' node node_modules/@sap/approuter/approuter.js",
|
||||
"start-app-router:windows": "set destinations=[{\"name\":\"odata\",\"url\":\"http://localhost:4004\",\"strictSSL\":false}] && node node_modules/@sap/approuter/approuter.js",
|
||||
"build": "rimraf dist && ui5 build -a --include-task=generateManifestBundle generateCachebusterInfo"
|
||||
},
|
||||
"remarkConfig": {
|
||||
"plugins": [
|
||||
"remark-preset-lint-consistent"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@sap/approuter": "6.5.1",
|
||||
"@ui5/cli": "1.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"run-script-os": "1.0.7",
|
||||
"rimraf": "3.0.0"
|
||||
}
|
||||
}
|
||||
4
packages/officesupplies/app/products/ui5.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
specVersion: '1.0'
|
||||
metadata:
|
||||
name: products
|
||||
type: application
|
||||
10
packages/officesupplies/app/products/webapp/Component.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/* global hasher */
|
||||
sap.ui.define(['sap/fe/AppComponent'], function(AppComponent) {
|
||||
'use strict';
|
||||
|
||||
return AppComponent.extend('sap.uxfe.demo.products.Component', {
|
||||
metadata: {
|
||||
manifest: 'json'
|
||||
}
|
||||
});
|
||||
});
|
||||
118
packages/officesupplies/app/products/webapp/WEB-INF/web.xml
Normal file
@@ -0,0 +1,118 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
|
||||
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
version="2.5"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee">
|
||||
|
||||
<display-name>OData v4</display-name>
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- UI5 resource servlet used to handle application resources -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<servlet>
|
||||
<display-name>ResourceServlet</display-name>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<servlet-class>com.sap.ui5.resource.ResourceServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<url-pattern>/resources/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<url-pattern>/test-resources/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<!-- enable CORS -->
|
||||
<context-param>
|
||||
<param-name>com.sap.ui5.resource.ACCEPTED_ORIGINS</param-name>
|
||||
<param-value>*</param-value>
|
||||
</context-param>
|
||||
|
||||
<!-- BEGIN: DEV MODE -->
|
||||
<!-- DEV MODE switched off by default and can be switched on during development -->
|
||||
<!-- but has to be switched off for productive use on a Java server! -->
|
||||
<context-param>
|
||||
<param-name>com.sap.ui5.resource.DEV_MODE</param-name>
|
||||
<param-value>true</param-value>
|
||||
</context-param>
|
||||
<!-- END: DEV MODE -->
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Cache Control Filter to prevent caching of any resource -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<filter>
|
||||
<display-name>CacheControlFilter</display-name>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<filter-class>com.sap.ui5.resource.CacheControlFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.html</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.js</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.css</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.json</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.xml</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.gif</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.png</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.jpg</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.properties</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.tmpl</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- UI5 proxy servlet -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<servlet>
|
||||
<servlet-name>SimpleProxyServlet</servlet-name>
|
||||
<servlet-class>com.sap.ui5.proxy.SimpleProxyServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>SimpleProxyServlet</servlet-name>
|
||||
<url-pattern>/proxy/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Welcome file list -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file>test.html</welcome-file>
|
||||
</welcome-file-list>
|
||||
|
||||
|
||||
</web-app>
|
||||
@@ -0,0 +1,9 @@
|
||||
# This is the resource bundle for products
|
||||
|
||||
#Texts for manifest.json
|
||||
|
||||
#XTIT: Application name
|
||||
appTitle=Products
|
||||
|
||||
#YDES: Application description
|
||||
appDescription=This is a my new Fiori elements app
|
||||
38
packages/officesupplies/app/products/webapp/index.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{appTitle}}</title>
|
||||
|
||||
<script>
|
||||
window['sap-ushell-config'] = {
|
||||
defaultRenderer: 'fiori2',
|
||||
applications: {
|
||||
"fe-lrop-v4": {
|
||||
title: 'Products',
|
||||
description: 'This is a my new Fiori elements app',
|
||||
additionalInformation: 'SAPUI5.Component=sap.uxfe.demo.products',
|
||||
applicationType: 'URL',
|
||||
url: './',
|
||||
navigationMode: 'embedded'
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<script src="https://sapui5.hana.ondemand.com/1.71.0/test-resources/sap/ushell/bootstrap/sandbox.js"></script>
|
||||
<script
|
||||
src="https://sapui5.hana.ondemand.com/1.71.0/resources/sap-ui-core.js"
|
||||
data-sap-ui-libs="sap.m, sap.ushell, sap.collaboration, sap.ui.layout"
|
||||
data-sap-ui-compatVersion="edge"
|
||||
data-sap-ui-theme="sap_fiori_3"
|
||||
data-sap-ui-frameOptions="allow"
|
||||
></script>
|
||||
<script>
|
||||
sap.ui.getCore().attachInit(() => sap.ushell.Container.createRenderer().placeAt('content'));
|
||||
</script>
|
||||
</head>
|
||||
<body class="sapUiBody" id="content"></body>
|
||||
</html>
|
||||
@@ -0,0 +1,233 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Capabilities.V1.xml">
|
||||
<edmx:Include Alias="Capabilities" Namespace="Org.OData.Capabilities.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://wiki.scn.sap.com/wiki/download/attachments/448470974/Common.xml?api=v2">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://wiki.scn.sap.com/wiki/download/attachments/448470968/UI.xml?api=v2">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="CatalogService" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Currencies" EntityType="CatalogService.Currencies">
|
||||
<NavigationPropertyBinding Path="texts" Target="Currencies_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Currencies_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Currencies_texts" EntityType="CatalogService.Currencies_texts"/>
|
||||
<EntitySet Name="Products" EntityType="CatalogService.Products">
|
||||
<NavigationPropertyBinding Path="currency" Target="Currencies"/>
|
||||
<NavigationPropertyBinding Path="supplier" Target="Suppliers"/>
|
||||
<NavigationPropertyBinding Path="texts" Target="Products_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Products_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Products_texts" EntityType="CatalogService.Products_texts"/>
|
||||
<EntitySet Name="Suppliers" EntityType="CatalogService.Suppliers">
|
||||
<NavigationPropertyBinding Path="products" Target="Products"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Currencies">
|
||||
<Key>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
<Property Name="symbol" Type="Edm.String" MaxLength="2"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(CatalogService.Currencies_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="CatalogService.Currencies_texts">
|
||||
<ReferentialConstraint Property="code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Currencies_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="5" Nullable="false"/>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Products">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="identifier" Type="Edm.String"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="description" Type="Edm.String"/>
|
||||
<Property Name="availability" Type="Edm.Int32"/>
|
||||
<Property Name="storageCapacity" Type="Edm.Int32"/>
|
||||
<Property Name="criticality" Type="Edm.Int32"/>
|
||||
<Property Name="price" Type="Edm.Decimal" Scale="2" Precision="9"/>
|
||||
<NavigationProperty Name="currency" Type="CatalogService.Currencies">
|
||||
<ReferentialConstraint Property="currency_code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="supplier" Type="CatalogService.Suppliers" Partner="products">
|
||||
<ReferentialConstraint Property="supplier_ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="image_url" Type="Edm.String"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(CatalogService.Products_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="CatalogService.Products_texts">
|
||||
<ReferentialConstraint Property="ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="currency_code" Type="Edm.String" MaxLength="3"/>
|
||||
<Property Name="supplier_ID" Type="Edm.Guid"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Products_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="5" Nullable="false"/>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="description" Type="Edm.String"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Suppliers">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="identifier" Type="Edm.String"/>
|
||||
<Property Name="name" Type="Edm.String"/>
|
||||
<Property Name="phone" Type="Edm.String"/>
|
||||
<Property Name="building" Type="Edm.String"/>
|
||||
<Property Name="street" Type="Edm.String"/>
|
||||
<Property Name="postCode" Type="Edm.String"/>
|
||||
<Property Name="city" Type="Edm.String"/>
|
||||
<Property Name="country" Type="Edm.String"/>
|
||||
<NavigationProperty Name="products" Type="Collection(CatalogService.Products)" Partner="supplier"/>
|
||||
</EntityType>
|
||||
<Annotations Target="CatalogService.Currencies">
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Path>name</Path>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/name">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/descr">
|
||||
<Annotation Term="Common.Label" String="Description"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/code">
|
||||
<Annotation Term="Common.Label" String="Currency Code"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/symbol">
|
||||
<Annotation Term="Common.Label" String="Currency Symbol"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/name">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/descr">
|
||||
<Annotation Term="Common.Label" String="Description"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/code">
|
||||
<Annotation Term="Common.Label" String="Currency Code"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.EntityContainer/Products">
|
||||
<Annotation Term="Capabilities.DeleteRestrictions">
|
||||
<Record Type="Capabilities.DeleteRestrictionsType">
|
||||
<PropertyValue Property="Deletable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Capabilities.InsertRestrictions">
|
||||
<Record Type="Capabilities.InsertRestrictionsType">
|
||||
<PropertyValue Property="Insertable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Capabilities.UpdateRestrictions">
|
||||
<Record Type="Capabilities.UpdateRestrictionsType">
|
||||
<PropertyValue Property="Updatable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/ID">
|
||||
<Annotation Term="Common.Label" String="UUID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/identifier">
|
||||
<Annotation Term="Common.Label" String="ID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/title">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/currency">
|
||||
<Annotation Term="Common.Label" String="Currency"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="A currency code as specified in ISO 4217"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/currency_code">
|
||||
<Annotation Term="Common.Label" String="Currency"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="A currency code as specified in ISO 4217"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products_texts/ID">
|
||||
<Annotation Term="Common.Label" String="UUID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products_texts/title">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.EntityContainer/Suppliers">
|
||||
<Annotation Term="Capabilities.DeleteRestrictions">
|
||||
<Record Type="Capabilities.DeleteRestrictionsType">
|
||||
<PropertyValue Property="Deletable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Capabilities.InsertRestrictions">
|
||||
<Record Type="Capabilities.InsertRestrictionsType">
|
||||
<PropertyValue Property="Insertable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Capabilities.UpdateRestrictions">
|
||||
<Record Type="Capabilities.UpdateRestrictionsType">
|
||||
<PropertyValue Property="Updatable" Bool="false"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
133
packages/officesupplies/app/products/webapp/manifest.json
Normal file
@@ -0,0 +1,133 @@
|
||||
{
|
||||
"_version": "1.15.0",
|
||||
"sap.app": {
|
||||
"id": "sap.uxfe.demo.products",
|
||||
"type": "application",
|
||||
"i18n": "i18n/i18n.properties",
|
||||
"applicationVersion": {
|
||||
"version": "1.0"
|
||||
},
|
||||
"title": "{{appTitle}}",
|
||||
"description": "{{appDescription}}",
|
||||
"ach": "CA-UI5-FE",
|
||||
"dataSources": {
|
||||
"mainService": {
|
||||
"uri": "/catalog/",
|
||||
"type": "OData",
|
||||
"settings": {
|
||||
"odataVersion": "4.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"offline": false,
|
||||
"resources": "resources.json",
|
||||
"sourceTemplate": {
|
||||
"id": "ui5template.fiorielements.v4.lrop",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"sap.ui": {
|
||||
"technology": "UI5",
|
||||
"icons": {
|
||||
"icon": "",
|
||||
"favIcon": "",
|
||||
"phone": "",
|
||||
"phone@2": "",
|
||||
"tablet": "",
|
||||
"tablet@2": ""
|
||||
},
|
||||
"deviceTypes": {
|
||||
"desktop": true,
|
||||
"tablet": true,
|
||||
"phone": true
|
||||
}
|
||||
},
|
||||
"sap.ui5": {
|
||||
"resources": {
|
||||
"js": [],
|
||||
"css": []
|
||||
},
|
||||
"dependencies": {
|
||||
"minUI5Version": "1.71.0",
|
||||
"libs": {
|
||||
"sap.fe": {}
|
||||
}
|
||||
},
|
||||
"models": {
|
||||
"i18n": {
|
||||
"type": "sap.ui.model.resource.ResourceModel",
|
||||
"uri": "i18n/i18n.properties"
|
||||
},
|
||||
"": {
|
||||
"dataSource": "mainService",
|
||||
"settings": {
|
||||
"synchronizationMode": "None",
|
||||
"operationMode": "Server",
|
||||
"autoExpandSelect": true,
|
||||
"earlyRequests": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"routing": {
|
||||
"routes": [
|
||||
{
|
||||
"pattern": "",
|
||||
"name": "ProductsList",
|
||||
"target": "ProductsList"
|
||||
},
|
||||
{
|
||||
"pattern": "Products({key})",
|
||||
"name": "ProductsObjectPage",
|
||||
"target": "ProductsObjectPage"
|
||||
}
|
||||
],
|
||||
"targets": {
|
||||
"ProductsList": {
|
||||
"type": "Component",
|
||||
"id": "ProductsList",
|
||||
"name": "sap.fe.templates.ListReport",
|
||||
"options": {
|
||||
"settings": {
|
||||
"entitySet": "Products",
|
||||
"variantManagement": "Page",
|
||||
"navigation": {
|
||||
"Products": {
|
||||
"detail": {
|
||||
"route": "ProductsObjectPage"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"ProductsObjectPage": {
|
||||
"type": "Component",
|
||||
"id": "ProductsObjectPage",
|
||||
"name": "sap.fe.templates.ObjectPage",
|
||||
"options": {
|
||||
"settings": {
|
||||
"entitySet": "Products"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"contentDensities": {
|
||||
"compact": true,
|
||||
"cozy": true
|
||||
}
|
||||
},
|
||||
"sap.platform.abap": {
|
||||
"_version": "1.1.0",
|
||||
"uri": ""
|
||||
},
|
||||
"sap.platform.hcp": {
|
||||
"_version": "1.1.0",
|
||||
"uri": ""
|
||||
},
|
||||
"sap.fiori": {
|
||||
"_version": "1.1.0",
|
||||
"registrationIds": [],
|
||||
"archeType": "transactional"
|
||||
}
|
||||
}
|
||||
16
packages/officesupplies/app/products/xs-app.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"welcomeFile": "/index.html",
|
||||
"authenticationMethod": "none",
|
||||
"routes": [
|
||||
{
|
||||
"source": "^/catalog/(.*)$",
|
||||
"target": "/catalog/$1",
|
||||
"destination": "odata",
|
||||
"csrfProtection": false
|
||||
},
|
||||
{
|
||||
"source": "^(.*)",
|
||||
"localDir": "webapp"
|
||||
}
|
||||
]
|
||||
}
|
||||
4
packages/officesupplies/app/suppliers/.npmrc
Normal file
@@ -0,0 +1,4 @@
|
||||
@sap:registry=https://npm.sap.com
|
||||
@ui5:registry=https://registry.npmjs.org
|
||||
save = true
|
||||
save-exact = true
|
||||
21
packages/officesupplies/app/suppliers/README.md
Normal file
@@ -0,0 +1,21 @@
|
||||
# suppliers
|
||||
|
||||
This is a my new Fiori elements app
|
||||
|
||||
## Starting the generated app
|
||||
|
||||
- This app has been generated using the SAP UX - App Generator, as part of the SAP UX Tools Suite. In order to launch the generated app, simply run the following from the generated app root folder:
|
||||
|
||||
```
|
||||
npm start
|
||||
```
|
||||
|
||||
- Is it also possible to run the application using mock data that reflects the OData Service URL supplied during application generation. In order to run the application with Mock Data, run the following from the generated app root folder:
|
||||
|
||||
```
|
||||
npm run start-mock
|
||||
```
|
||||
|
||||
### Pre-requisites:
|
||||
|
||||
1. Active NodeJS LTS (Long Term Support) version and associated supported NPM version. (See https://nodejs.org)
|
||||
33
packages/officesupplies/app/suppliers/package.json
Normal file
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"name": "suppliers",
|
||||
"version": "0.0.1",
|
||||
"private": true,
|
||||
"sapux": true,
|
||||
"description": "This is a my new Fiori elements app",
|
||||
"keywords": [
|
||||
"ui5",
|
||||
"openui5",
|
||||
"sapui5"
|
||||
],
|
||||
"main": "webapp/index.html",
|
||||
"scripts": {
|
||||
"start": "npm run start-app-router",
|
||||
"start-app-router": "npm run build && run-script-os",
|
||||
"start-app-router:default": "destinations='[{\"name\":\"odata\",\"url\":\"http://localhost:4004\",\"strictSSL\":false}]' node node_modules/@sap/approuter/approuter.js",
|
||||
"start-app-router:windows": "set destinations=[{\"name\":\"odata\",\"url\":\"http://localhost:4004\",\"strictSSL\":false}] && node node_modules/@sap/approuter/approuter.js",
|
||||
"build": "rimraf dist && ui5 build -a --include-task=generateManifestBundle generateCachebusterInfo"
|
||||
},
|
||||
"remarkConfig": {
|
||||
"plugins": [
|
||||
"remark-preset-lint-consistent"
|
||||
]
|
||||
},
|
||||
"dependencies": {
|
||||
"@sap/approuter": "6.5.1",
|
||||
"@ui5/cli": "1.8.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"run-script-os": "1.0.7",
|
||||
"rimraf": "3.0.0"
|
||||
}
|
||||
}
|
||||
4
packages/officesupplies/app/suppliers/ui5.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
specVersion: '1.0'
|
||||
metadata:
|
||||
name: suppliers
|
||||
type: application
|
||||
10
packages/officesupplies/app/suppliers/webapp/Component.js
Normal file
@@ -0,0 +1,10 @@
|
||||
/* global hasher */
|
||||
sap.ui.define(['sap/fe/AppComponent'], function(AppComponent) {
|
||||
'use strict';
|
||||
|
||||
return AppComponent.extend('supplier.suppliers.Component', {
|
||||
metadata: {
|
||||
manifest: 'json'
|
||||
}
|
||||
});
|
||||
});
|
||||
118
packages/officesupplies/app/suppliers/webapp/WEB-INF/web.xml
Normal file
@@ -0,0 +1,118 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
|
||||
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
|
||||
version="2.5"
|
||||
xmlns="http://java.sun.com/xml/ns/javaee">
|
||||
|
||||
<display-name>OData v4</display-name>
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- UI5 resource servlet used to handle application resources -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<servlet>
|
||||
<display-name>ResourceServlet</display-name>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<servlet-class>com.sap.ui5.resource.ResourceServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<url-pattern>/resources/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
<servlet-mapping>
|
||||
<servlet-name>ResourceServlet</servlet-name>
|
||||
<url-pattern>/test-resources/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
<!-- enable CORS -->
|
||||
<context-param>
|
||||
<param-name>com.sap.ui5.resource.ACCEPTED_ORIGINS</param-name>
|
||||
<param-value>*</param-value>
|
||||
</context-param>
|
||||
|
||||
<!-- BEGIN: DEV MODE -->
|
||||
<!-- DEV MODE switched off by default and can be switched on during development -->
|
||||
<!-- but has to be switched off for productive use on a Java server! -->
|
||||
<context-param>
|
||||
<param-name>com.sap.ui5.resource.DEV_MODE</param-name>
|
||||
<param-value>true</param-value>
|
||||
</context-param>
|
||||
<!-- END: DEV MODE -->
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Cache Control Filter to prevent caching of any resource -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<filter>
|
||||
<display-name>CacheControlFilter</display-name>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<filter-class>com.sap.ui5.resource.CacheControlFilter</filter-class>
|
||||
</filter>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.html</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.js</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.css</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.json</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.xml</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.gif</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.png</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.jpg</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.properties</url-pattern>
|
||||
</filter-mapping>
|
||||
<filter-mapping>
|
||||
<filter-name>CacheControlFilter</filter-name>
|
||||
<url-pattern>*.tmpl</url-pattern>
|
||||
</filter-mapping>
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- UI5 proxy servlet -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<servlet>
|
||||
<servlet-name>SimpleProxyServlet</servlet-name>
|
||||
<servlet-class>com.sap.ui5.proxy.SimpleProxyServlet</servlet-class>
|
||||
</servlet>
|
||||
<servlet-mapping>
|
||||
<servlet-name>SimpleProxyServlet</servlet-name>
|
||||
<url-pattern>/proxy/*</url-pattern>
|
||||
</servlet-mapping>
|
||||
|
||||
|
||||
<!-- ============================================================== -->
|
||||
<!-- Welcome file list -->
|
||||
<!-- ============================================================== -->
|
||||
|
||||
<welcome-file-list>
|
||||
<welcome-file>test.html</welcome-file>
|
||||
</welcome-file-list>
|
||||
|
||||
|
||||
</web-app>
|
||||
@@ -0,0 +1,9 @@
|
||||
# This is the resource bundle for suppliers
|
||||
|
||||
#Texts for manifest.json
|
||||
|
||||
#XTIT: Application name
|
||||
appTitle=suppliers
|
||||
|
||||
#YDES: Application description
|
||||
appDescription=This is a my new Fiori elements app
|
||||
38
packages/officesupplies/app/suppliers/webapp/index.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>{{appTitle}}</title>
|
||||
|
||||
<script>
|
||||
window['sap-ushell-config'] = {
|
||||
defaultRenderer: 'fiori2',
|
||||
applications: {
|
||||
"fe-lrop-v4": {
|
||||
title: 'suppliers',
|
||||
description: 'This is a my new Fiori elements app',
|
||||
additionalInformation: 'SAPUI5.Component=supplier.suppliers',
|
||||
applicationType: 'URL',
|
||||
url: './',
|
||||
navigationMode: 'embedded'
|
||||
}
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<script src="https://sapui5.hana.ondemand.com/1.71.0/test-resources/sap/ushell/bootstrap/sandbox.js"></script>
|
||||
<script
|
||||
src="https://sapui5.hana.ondemand.com/1.71.0/resources/sap-ui-core.js"
|
||||
data-sap-ui-libs="sap.m, sap.ushell, sap.collaboration, sap.ui.layout"
|
||||
data-sap-ui-compatVersion="edge"
|
||||
data-sap-ui-theme="sap_fiori_3"
|
||||
data-sap-ui-frameOptions="allow"
|
||||
></script>
|
||||
<script>
|
||||
sap.ui.getCore().attachInit(() => sap.ushell.Container.createRenderer().placeAt('content'));
|
||||
</script>
|
||||
</head>
|
||||
<body class="sapUiBody" id="content"></body>
|
||||
</html>
|
||||
@@ -0,0 +1,346 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<edmx:Edmx Version="4.0" xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx">
|
||||
<edmx:Reference Uri="https://wiki.scn.sap.com/wiki/download/attachments/448470974/Common.xml?api=v2">
|
||||
<edmx:Include Alias="Common" Namespace="com.sap.vocabularies.Common.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Core.V1.xml">
|
||||
<edmx:Include Alias="Core" Namespace="Org.OData.Core.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://oasis-tcs.github.io/odata-vocabularies/vocabularies/Org.OData.Measures.V1.xml">
|
||||
<edmx:Include Alias="Measures" Namespace="Org.OData.Measures.V1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:Reference Uri="https://wiki.scn.sap.com/wiki/download/attachments/448470968/UI.xml?api=v2">
|
||||
<edmx:Include Alias="UI" Namespace="com.sap.vocabularies.UI.v1"/>
|
||||
</edmx:Reference>
|
||||
<edmx:DataServices>
|
||||
<Schema Namespace="CatalogService" xmlns="http://docs.oasis-open.org/odata/ns/edm">
|
||||
<EntityContainer Name="EntityContainer">
|
||||
<EntitySet Name="Currencies" EntityType="CatalogService.Currencies">
|
||||
<NavigationPropertyBinding Path="texts" Target="Currencies_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Currencies_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Currencies_texts" EntityType="CatalogService.Currencies_texts"/>
|
||||
<EntitySet Name="Products" EntityType="CatalogService.Products">
|
||||
<NavigationPropertyBinding Path="currency" Target="Currencies"/>
|
||||
<NavigationPropertyBinding Path="supplier" Target="Suppliers"/>
|
||||
<NavigationPropertyBinding Path="texts" Target="Products_texts"/>
|
||||
<NavigationPropertyBinding Path="localized" Target="Products_texts"/>
|
||||
</EntitySet>
|
||||
<EntitySet Name="Products_texts" EntityType="CatalogService.Products_texts"/>
|
||||
<EntitySet Name="Suppliers" EntityType="CatalogService.Suppliers">
|
||||
<NavigationPropertyBinding Path="products" Target="Products"/>
|
||||
</EntitySet>
|
||||
</EntityContainer>
|
||||
<EntityType Name="Currencies">
|
||||
<Key>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
<Property Name="symbol" Type="Edm.String" MaxLength="2"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(CatalogService.Currencies_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="CatalogService.Currencies_texts">
|
||||
<ReferentialConstraint Property="code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
</EntityType>
|
||||
<EntityType Name="Currencies_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="code"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="5" Nullable="false"/>
|
||||
<Property Name="name" Type="Edm.String" MaxLength="255"/>
|
||||
<Property Name="descr" Type="Edm.String" MaxLength="1000"/>
|
||||
<Property Name="code" Type="Edm.String" MaxLength="3" Nullable="false"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Products">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="identifier" Type="Edm.String"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="description" Type="Edm.String"/>
|
||||
<Property Name="availability" Type="Edm.Int32"/>
|
||||
<Property Name="storageCapacity" Type="Edm.Int32"/>
|
||||
<Property Name="criticality" Type="Edm.Int32"/>
|
||||
<Property Name="price" Type="Edm.Decimal" Scale="2" Precision="9"/>
|
||||
<NavigationProperty Name="currency" Type="CatalogService.Currencies">
|
||||
<ReferentialConstraint Property="currency_code" ReferencedProperty="code"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="supplier" Type="CatalogService.Suppliers" Partner="products">
|
||||
<ReferentialConstraint Property="supplier_ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="image_url" Type="Edm.String"/>
|
||||
<NavigationProperty Name="texts" Type="Collection(CatalogService.Products_texts)">
|
||||
<OnDelete Action="Cascade"/>
|
||||
</NavigationProperty>
|
||||
<NavigationProperty Name="localized" Type="CatalogService.Products_texts">
|
||||
<ReferentialConstraint Property="ID" ReferencedProperty="ID"/>
|
||||
</NavigationProperty>
|
||||
<Property Name="currency_code" Type="Edm.String" MaxLength="3"/>
|
||||
<Property Name="supplier_ID" Type="Edm.Guid"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Products_texts">
|
||||
<Key>
|
||||
<PropertyRef Name="locale"/>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="locale" Type="Edm.String" MaxLength="5" Nullable="false"/>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="title" Type="Edm.String"/>
|
||||
<Property Name="description" Type="Edm.String"/>
|
||||
</EntityType>
|
||||
<EntityType Name="Suppliers">
|
||||
<Key>
|
||||
<PropertyRef Name="ID"/>
|
||||
</Key>
|
||||
<Property Name="ID" Type="Edm.Guid" Nullable="false"/>
|
||||
<Property Name="identifier" Type="Edm.String"/>
|
||||
<Property Name="name" Type="Edm.String"/>
|
||||
<Property Name="phone" Type="Edm.String"/>
|
||||
<Property Name="building" Type="Edm.String"/>
|
||||
<Property Name="street" Type="Edm.String"/>
|
||||
<Property Name="postCode" Type="Edm.String"/>
|
||||
<Property Name="city" Type="Edm.String"/>
|
||||
<Property Name="country" Type="Edm.String"/>
|
||||
<NavigationProperty Name="products" Type="Collection(CatalogService.Products)" Partner="supplier"/>
|
||||
</EntityType>
|
||||
<Annotations Target="CatalogService.Currencies">
|
||||
<Annotation Term="UI.Identification">
|
||||
<Collection>
|
||||
<Path>name</Path>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/name">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/descr">
|
||||
<Annotation Term="Common.Label" String="Description"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/code">
|
||||
<Annotation Term="Common.Label" String="Currency Code"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies/symbol">
|
||||
<Annotation Term="Common.Label" String="Currency Symbol"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/name">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/descr">
|
||||
<Annotation Term="Common.Label" String="Description"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Currencies_texts/code">
|
||||
<Annotation Term="Common.Label" String="Currency Code"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products">
|
||||
<Annotation Term="UI.DataPoint" Qualifier="Price">
|
||||
<Record Type="UI.DataPointType">
|
||||
<PropertyValue Property="Title" String="Price"/>
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.CollectionFacet">
|
||||
<PropertyValue Property="Label" String="Product Information"/>
|
||||
<PropertyValue Property="Facets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#Description"/>
|
||||
<PropertyValue Property="Label" String="Description"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="Description">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="description"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="ProductDetail">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="identifier"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="availability"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.FieldGroup" Qualifier="SupplierDetail">
|
||||
<Record Type="UI.FieldGroupType">
|
||||
<PropertyValue Property="Data">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="supplier/identifier"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="supplier/postCode"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="supplier/phone"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderFacets">
|
||||
<Collection>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#ProductDetail"/>
|
||||
<PropertyValue Property="Label" String="Details"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.FieldGroup#SupplierDetail"/>
|
||||
<PropertyValue Property="Label" String="Supplier"/>
|
||||
</Record>
|
||||
<Record Type="UI.ReferenceFacet">
|
||||
<PropertyValue Property="Target" AnnotationPath="@UI.DataPoint#Price"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.HeaderInfo">
|
||||
<Record Type="UI.HeaderInfoType">
|
||||
<PropertyValue Property="Title">
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
</Record>
|
||||
</PropertyValue>
|
||||
<PropertyValue Property="TypeName" String="Product"/>
|
||||
<PropertyValue Property="TypeNamePlural" String="Products"/>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.LineItem">
|
||||
<Collection>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="image_url"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="identifier"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="title"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="availability"/>
|
||||
</Record>
|
||||
<Record Type="UI.DataField">
|
||||
<PropertyValue Property="Value" Path="price"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
<Annotation Term="UI.SelectionFields">
|
||||
<Collection>
|
||||
<PropertyPath>identifier</PropertyPath>
|
||||
<PropertyPath>title</PropertyPath>
|
||||
<PropertyPath>availability</PropertyPath>
|
||||
<PropertyPath>price</PropertyPath>
|
||||
</Collection>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/ID">
|
||||
<Annotation Term="Common.Label" String="ProductID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/identifier">
|
||||
<Annotation Term="Common.Label" String="ID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/title">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/description">
|
||||
<Annotation Term="Common.Label" String="Description"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/availability">
|
||||
<Annotation Term="Common.Label" String="In Stock"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/price">
|
||||
<Annotation Term="Common.Label" String="Price"/>
|
||||
<Annotation Term="Measures.ISOCurrency" Path="currency_code"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/currency">
|
||||
<Annotation Term="Common.Label" String="Currency"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="A currency code as specified in ISO 4217"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/image_url">
|
||||
<Annotation Term="Common.Label" String="Image"/>
|
||||
<Annotation Term="UI.IsImageURL" Bool="true"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products/currency_code">
|
||||
<Annotation Term="Common.Label" String="Currency"/>
|
||||
<Annotation Term="Common.ValueList">
|
||||
<Record Type="Common.ValueListType">
|
||||
<PropertyValue Property="Label" String="Currency"/>
|
||||
<PropertyValue Property="CollectionPath" String="Currencies"/>
|
||||
<PropertyValue Property="Parameters">
|
||||
<Collection>
|
||||
<Record Type="Common.ValueListParameterInOut">
|
||||
<PropertyValue Property="LocalDataProperty" PropertyPath="currency_code"/>
|
||||
<PropertyValue Property="ValueListProperty" String="code"/>
|
||||
</Record>
|
||||
<Record Type="Common.ValueListParameterDisplayOnly">
|
||||
<PropertyValue Property="ValueListProperty" String="name"/>
|
||||
</Record>
|
||||
</Collection>
|
||||
</PropertyValue>
|
||||
</Record>
|
||||
</Annotation>
|
||||
<Annotation Term="Core.Description" String="A currency code as specified in ISO 4217"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products_texts/ID">
|
||||
<Annotation Term="Common.Label" String="UUID"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Products_texts/title">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Suppliers/identifier">
|
||||
<Annotation Term="Common.Label" String="Name"/>
|
||||
<Annotation Term="Common.Text" Path="name">
|
||||
<Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextFirst"/>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Suppliers/phone">
|
||||
<Annotation Term="Common.Label" String="Phone"/>
|
||||
</Annotations>
|
||||
<Annotations Target="CatalogService.Suppliers/postCode">
|
||||
<Annotation Term="Common.Label" String="City"/>
|
||||
<Annotation Term="Common.Text" Path="city">
|
||||
<Annotation Term="UI.TextArrangement" EnumMember="UI.TextArrangementType/TextFirst"/>
|
||||
</Annotation>
|
||||
</Annotations>
|
||||
</Schema>
|
||||
</edmx:DataServices>
|
||||
</edmx:Edmx>
|
||||
155
packages/officesupplies/app/suppliers/webapp/manifest.json
Normal file
@@ -0,0 +1,155 @@
|
||||
{
|
||||
"_version": "1.15.0",
|
||||
"sap.app": {
|
||||
"id": "supplier.suppliers",
|
||||
"type": "application",
|
||||
"i18n": "i18n/i18n.properties",
|
||||
"applicationVersion": {
|
||||
"version": "1.0"
|
||||
},
|
||||
"title": "{{appTitle}}",
|
||||
"description": "{{appDescription}}",
|
||||
"ach": "CA-UI5-FE",
|
||||
"dataSources": {
|
||||
"mainService": {
|
||||
"uri": "/catalog/",
|
||||
"type": "OData",
|
||||
"settings": {
|
||||
"odataVersion": "4.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"offline": false,
|
||||
"resources": "resources.json",
|
||||
"sourceTemplate": {
|
||||
"id": "ui5template.fiorielements.v4.lrop",
|
||||
"version": "1.0.0"
|
||||
}
|
||||
},
|
||||
"sap.ui": {
|
||||
"technology": "UI5",
|
||||
"icons": {
|
||||
"icon": "",
|
||||
"favIcon": "",
|
||||
"phone": "",
|
||||
"phone@2": "",
|
||||
"tablet": "",
|
||||
"tablet@2": ""
|
||||
},
|
||||
"deviceTypes": {
|
||||
"desktop": true,
|
||||
"tablet": true,
|
||||
"phone": true
|
||||
}
|
||||
},
|
||||
"sap.ui5": {
|
||||
"resources": {
|
||||
"js": [],
|
||||
"css": []
|
||||
},
|
||||
"dependencies": {
|
||||
"minUI5Version": "1.71.0",
|
||||
"libs": {
|
||||
"sap.fe": {}
|
||||
}
|
||||
},
|
||||
"models": {
|
||||
"i18n": {
|
||||
"type": "sap.ui.model.resource.ResourceModel",
|
||||
"uri": "i18n/i18n.properties"
|
||||
},
|
||||
"": {
|
||||
"dataSource": "mainService",
|
||||
"settings": {
|
||||
"synchronizationMode": "None",
|
||||
"operationMode": "Server",
|
||||
"autoExpandSelect": true,
|
||||
"earlyRequests": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"routing": {
|
||||
"routes": [
|
||||
{
|
||||
"pattern": "",
|
||||
"name": "SuppliersList",
|
||||
"target": "SuppliersList"
|
||||
},
|
||||
{
|
||||
"pattern": "Suppliers({key})",
|
||||
"name": "SuppliersObjectPage",
|
||||
"target": "SuppliersObjectPage"
|
||||
},
|
||||
{
|
||||
"pattern": "Suppliers({key})/texts({key2})",
|
||||
"name": "Currencies_textsObjectPage",
|
||||
"target": "Currencies_textsObjectPage"
|
||||
}
|
||||
],
|
||||
"targets": {
|
||||
"SuppliersList": {
|
||||
"type": "Component",
|
||||
"id": "SuppliersList",
|
||||
"name": "sap.fe.templates.ListReport",
|
||||
"options": {
|
||||
"settings": {
|
||||
"entitySet": "Suppliers",
|
||||
"variantManagement": "Page",
|
||||
"navigation": {
|
||||
"Suppliers": {
|
||||
"detail": {
|
||||
"route": "SuppliersObjectPage"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"SuppliersObjectPage": {
|
||||
"type": "Component",
|
||||
"id": "SuppliersObjectPage",
|
||||
"name": "sap.fe.templates.ObjectPage",
|
||||
"options": {
|
||||
"settings": {
|
||||
"entitySet": "Suppliers",
|
||||
"navigation": {
|
||||
"texts": {
|
||||
"detail": {
|
||||
"route": "Currencies_textsObjectPage"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"Currencies_textsObjectPage": {
|
||||
"type": "Component",
|
||||
"id": "Currencies_textsObjectPage",
|
||||
"name": "sap.fe.templates.ObjectPage",
|
||||
"options": {
|
||||
"settings": {
|
||||
"entitySet": "Currencies_texts"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"contentDensities": {
|
||||
"compact": true,
|
||||
"cozy": true
|
||||
}
|
||||
},
|
||||
"sap.platform.abap": {
|
||||
"_version": "1.1.0",
|
||||
"uri": ""
|
||||
},
|
||||
"sap.platform.hcp": {
|
||||
"_version": "1.1.0",
|
||||
"uri": ""
|
||||
},
|
||||
"sap.fiori": {
|
||||
"_version": "1.1.0",
|
||||
"registrationIds": [],
|
||||
"archeType": "transactional"
|
||||
}
|
||||
}
|
||||
16
packages/officesupplies/app/suppliers/xs-app.json
Normal file
@@ -0,0 +1,16 @@
|
||||
{
|
||||
"welcomeFile": "/index.html",
|
||||
"authenticationMethod": "none",
|
||||
"routes": [
|
||||
{
|
||||
"source": "^/catalog/(.*)$",
|
||||
"target": "/catalog/$1",
|
||||
"destination": "odata",
|
||||
"csrfProtection": false
|
||||
},
|
||||
{
|
||||
"source": "^(.*)",
|
||||
"localDir": "webapp"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
ID,IDENTIFIER,TITLE,DESCRIPTION,AVAILABILITY,STORAGE_CAPACITY,CRITICALITY,PRICE,CURRENCY_CODE,SUPPLIER_ID,IMAGE_URL
|
||||
844ede5c-071e-34ed-907f-f99cb3a4693d,MC-CM-1003,Tea- / Coffee-Mug,Robust high-quality ceramic mug for every-day use in two unobstrusive colours.,153,200,0,2.65,USD,8b001df1-dab2-39a2-8b1a-89b6b445e237,../images/mug.png
|
||||
64d40922-ea0d-30f9-9b83-eb4448ee4c2e,MC-CH-1000,Coat Hangers,"Set of high-quality hangers with coated surface, trouser bar - anti slip. Super slim design - space saving - The hooks can be rotated through 360 degree rotation, practical for various room situations. Material: ABS (plastic); Colour: turquoise.",10,200,3,2.6,USD,12726eec-165c-3713-a674-3d2fc4f5127f,../images/hanger1.png
|
||||
a6756d40-792e-34c9-8b2e-df3acb0c54b4,MC-CH-1001,Coat Hangers,"Set of high-quality hangers with coated surface, trouser bar - anti slip. Super slim design - space saving - The hooks can be rotated through 360 degree rotation, practical for various room situations. Material: ABS (plastic); Colour: assorted (2 of each pink, grey, blue green, black).",34,200,2,21.73,USD,12726eec-165c-3713-a674-3d2fc4f5127f,../images/hanger2.png
|
||||
37f028f0-1dd5-30ae-9cdd-a7f543e4d61d,MC-CH-1002,Wooden Coat Hangers - Pack of 5,"Pack of 5 quality wooden hangers with trouser bar. Slim design for space saving - The hooks can be rotated through 360 degree rotation, practical for various room situations. Material: ABS (plastic); Colour: assorted (2 of each pink, grey, blue green, black).",5,200,2,6.4,USD,8b001df1-dab2-39a2-8b1a-89b6b445e237,../images/hanger3.png
|
||||
a376e380-00e8-3d90-ba9f-c332c2df0f28,MC-CH-1003,Designer Coat Hooks - Pack of 3,Pack of 3 designer coat hook. Heavy-duty stainless steel hooks in a stylish shape.,6,200,1,6.49,USD,8b001df1-dab2-39a2-8b1a-89b6b445e237,../images/hanger4.png
|
||||
fc16c43d-bb4e-30db-8b7e-98b3fdc7f0b9,MC-CH-1004,Vacuum Wall Hook - Pack of 6,"Big suction cup with diameter of 70mm, can load more than 10kg; bright contemporary colour; Principle of work: Atmospheric pressure, safely and easy to install and tear off, no need to drill a hole or add glue, without any damage to the surface; can be used on a variety of surfaces, including paint, glasses, wood, ceramic tile, gypsum, and any other smooth surface.",17,200,0,5.76,USD,12726eec-165c-3713-a674-3d2fc4f5127f,../images/hanger4.png
|
||||
|
@@ -0,0 +1,16 @@
|
||||
ID,IDENTIFIER,NAME,COUNTRY,POSTCODE,CITY,STREET,BUILDING,PHONE
|
||||
12726eec-165c-3713-a674-3d2fc4f5127f,OFFIPOR,OffiPOR,PR,Guaynabo,PR 00968,City View Plaza,301,+1 787-38515864
|
||||
9655e5b6-bd8c-31ee-b94a-0651449721a0,POLIRADO,POLirado,PL,Warszawa,02-675,Ul. Woloska,5,+48 883 77522087
|
||||
f1fd8dd5-3156-3469-b4f1-a03ff5041080,REGULCUST,Regular Custom Ltd,GB,Knutsford,WA16 6DW,King Street,25,+44 1565 47759991
|
||||
bb2fa1e5-5c3a-3d26-b5c1-ed53f3e08622,OFFICEGURU,Office-Guru AG,DE,Siegen,57078,Birlenbacher Str.,19-21,+49 271 7722547
|
||||
b91f077f-2086-3517-8244-d3b50835651b,MEINRESSORT,Mein Ressort GmbH,CH,Regensdorf,8105,Althardstrasse,80,+41 44 84008483
|
||||
8b001df1-dab2-39a2-8b1a-89b6b445e237,OFFICELINE,Office Line Prag,CZ,Praha,140 00,Vyskocilova,1481/4,+420 776 9487923
|
||||
3c7e6cbb-ea0f-35d2-a2ce-c85057a57916,DEPOT4ALL,Depot-4All,DE,Freiberg a. N.,71691,Grundelbachstrasse,10,+49 7141 2463585
|
||||
41b46958-5ad7-30b6-9884-b547c1e26b7e,ITELOFFICE,ITeL-Office,DE,Dresden,01187,Chemnitzer Strasse,48,+49 351 31915489
|
||||
7c5a5e3a-6dfa-35d3-8bf4-0cadbddb761a,FAMOUSUS,FamousUS,US,Houston,TX 77098,2601 Westheimer Road,Suite C250,+1 713-12001085
|
||||
36de419f-0a4c-3a5a-b285-188979ce13ec,CHINACHAIN,ChinaChain,CN,Guangzhou,510613,No. 233 Tien He Road North,6402-6403,+86 20 86454650
|
||||
41b922ad-35d9-352d-80c7-ee63ba1c007c,FAMOUSUS1,FamousUS (LV),US,Las Vegas,NV 89118,W Sunset Rd,3620,+1 702-486454400
|
||||
b4b3188c-fa27-3467-a38a-f36ede8acc18,FAMOUSUS2,FamousUS (SF),US,South San Francisco,CA 94080,Forbes Blvd,401,+1 650-486454500
|
||||
b5f1b294-a102-38e1-88c5-9b4d9ff0dd33,FAMOUSUS3,FamousUS (NY),US,New York,NY 10128,3rd Ave,1588,+1 212-486454600
|
||||
391da904-9acd-334b-885e-4b4da38f3c6e,FAMOUSUS4,FamousUS (ORL),US,Orlando,FL 32806,W Sturtevant St,47,+1 407-486454700
|
||||
1f6aed3b-bac0-39e5-ba5b-c091b0d18f40,FAMOUSUS5,FamousUS (NSH),US,Nashville,TN 37211,Space Park S Dr,486-810,+1 615-486454800
|
||||
|
5
packages/officesupplies/db/csv/sap.common-Currencies.csv
Normal file
@@ -0,0 +1,5 @@
|
||||
"SYMBOL";"DESCR";"NAME";"CODE"
|
||||
"€";"Euro";"Euro";"EUR"
|
||||
"£";"British Pound";"British Pound";"GBP"
|
||||
"₹";"Indian Rupee";"Indian Rupee";"INR"
|
||||
"$";"US Dollar";"US Dollar";"USD"
|
||||
|
30
packages/officesupplies/db/schema.cds
Normal file
@@ -0,0 +1,30 @@
|
||||
namespace sap.capire.officesupplies;
|
||||
using { Currency } from '@sap/cds/common';
|
||||
|
||||
entity Products {
|
||||
@Common.Label : 'UUID'
|
||||
key ID : UUID;
|
||||
identifier : String @Common.Label : 'ID';
|
||||
title : localized String @( Common.Label : 'Name' );
|
||||
description : localized String;
|
||||
availability : Integer;
|
||||
storage_capacity: Integer;
|
||||
criticality : Integer;
|
||||
price : Decimal(9,2);
|
||||
currency : Currency;
|
||||
supplier : Association to Suppliers;
|
||||
image_url : String;
|
||||
}
|
||||
|
||||
entity Suppliers {
|
||||
key ID : UUID;
|
||||
identifier: String;
|
||||
name : String;
|
||||
phone : String;
|
||||
building : String;
|
||||
street : String @multiline;
|
||||
postCode : String;
|
||||
city : String;
|
||||
country : String;
|
||||
products : Composition of many Products on products.supplier = $self;
|
||||
}
|
||||
19
packages/officesupplies/i18n/i18n.properties
Normal file
@@ -0,0 +1,19 @@
|
||||
Cat.ProductID=ProductID
|
||||
Cat.ProductStock=In Stock
|
||||
Cat.ProductPrice=Price
|
||||
Cat.ProductTitle=Title
|
||||
Cat.ProductDescr=Description
|
||||
Cat.ProductImage=Image
|
||||
Cat.SuppliersIdentifier=Name
|
||||
Cat.SuppliersPostCode=City
|
||||
Cat.SuppliersPhone=Phone
|
||||
|
||||
Cat.HeaderFacetDetails=Details
|
||||
Cat.HeaderFacetSupplier=Supplier
|
||||
Cat.HeaderPrice=Price
|
||||
|
||||
Cat.FacetProductInformation=Product Information
|
||||
Cat.FacetSectionDescription=Description
|
||||
|
||||
Cat.TypeName=Product
|
||||
Cat.TypeNamePlural=Products
|
||||
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "bookshop",
|
||||
"name": "officesupplies",
|
||||
"version": "1.0.0",
|
||||
"description": "A simple CAP project.",
|
||||
"repository": "<Add your repository here>",
|
||||
72
packages/officesupplies/srv/cat-service.cds
Normal file
@@ -0,0 +1,72 @@
|
||||
using sap.capire.officesupplies from '../db/schema';
|
||||
|
||||
@path:'/catalog'
|
||||
service CatalogService {
|
||||
entity Products as projection on officesupplies.Products;
|
||||
entity Suppliers as projection on officesupplies.Suppliers;
|
||||
};
|
||||
|
||||
annotate CatalogService.Products with @(
|
||||
UI: {
|
||||
HeaderInfo: {
|
||||
TypeName: '{i18n>Cat.TypeName}',
|
||||
TypeNamePlural: '{i18n>Cat.TypeNamePlural}',
|
||||
Title: { $Type: 'UI.DataField', Value: title }
|
||||
},
|
||||
SelectionFields: [ identifier, title, availability, price],
|
||||
LineItem: [
|
||||
{$Type: 'UI.DataField', Value: image_url},
|
||||
{$Type: 'UI.DataField', Value: identifier},
|
||||
{$Type: 'UI.DataField', Value: title},
|
||||
{$Type: 'UI.DataField', Value: availability},
|
||||
{$Type: 'UI.DataField', Value: price}
|
||||
],
|
||||
HeaderFacets: [
|
||||
{$Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#ProductDetail', Label:'{i18n>Cat.HeaderFacetDetails}' },
|
||||
{$Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#SupplierDetail', Label:'{i18n>Cat.HeaderFacetSupplier}' },
|
||||
{$Type: 'UI.ReferenceFacet', Target: '@UI.DataPoint#Price'}
|
||||
],
|
||||
Facets: [
|
||||
{
|
||||
$Type: 'UI.CollectionFacet',
|
||||
Label: '{i18n>Cat.FacetProductInformation}',
|
||||
Facets: [
|
||||
{$Type: 'UI.ReferenceFacet', Target: '@UI.FieldGroup#Description', Label: '{i18n>Cat.FacetSectionDescription}'},
|
||||
]
|
||||
}
|
||||
],
|
||||
DataPoint#Price: {Value: price, Title: '{i18n>Cat.HeaderPrice}'},
|
||||
FieldGroup#Description: {
|
||||
Data:[
|
||||
{$Type: 'UI.DataField', Value: description}
|
||||
]
|
||||
},
|
||||
FieldGroup#ProductDetail: {
|
||||
Data:[
|
||||
{$Type: 'UI.DataField', Value: identifier},
|
||||
{$Type: 'UI.DataField', Value: availability}
|
||||
]
|
||||
},
|
||||
FieldGroup#SupplierDetail: {
|
||||
Data:[
|
||||
{$Type: 'UI.DataField', Value: supplier.identifier},
|
||||
{$Type: 'UI.DataField', Value: supplier.postCode},
|
||||
{$Type: 'UI.DataField', Value: supplier.phone}
|
||||
]
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
annotate CatalogService.Products with {
|
||||
ID @( Common: { Label: '{i18n>Cat.ProductID}'} );
|
||||
availability @( Common.Label: '{i18n>Cat.ProductStock}' );
|
||||
price @( Common.Label: '{i18n>Cat.ProductPrice}', Measures.ISOCurrency: currency_code );
|
||||
description @( Common.Label: '{i18n>Cat.ProductDescr}' );
|
||||
image_url @( Common.Label: '{i18n>Cat.ProductImage}', UI.IsImageURL: true);
|
||||
}
|
||||
|
||||
annotate CatalogService.Suppliers with {
|
||||
identifier @( Common : { Label: '{i18n>Cat.SuppliersIdentifier}', Text: name, TextArrangement: #TextFirst } );
|
||||
postCode @( Common : { Label: '{i18n>Cat.SuppliersPostCode}', Text: city, TextArrangement: #TextFirst } );
|
||||
phone @Common.Label: '{i18n>Cat.SuppliersPhone}';
|
||||
}
|
||||