mirror of
https://gitlab.com/openstapps/openstapps.git
synced 2025-12-19 04:36:23 +00:00
Compare commits
20 Commits
@openstapp
...
@openstapp
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
296054c8e0 | ||
|
859763367e
|
|||
|
|
848fde4660 | ||
|
|
bd1046a19a | ||
|
|
3b9068197c | ||
|
|
d2c8120255 | ||
|
d44204cf8d
|
|||
|
9d5dd05bb6
|
|||
|
288a49113f
|
|||
| 791b5c895d | |||
| d7a85b7fae | |||
|
|
bff2d985aa | ||
|
|
655efc9d29 | ||
|
|
66712bdd24 | ||
| 8b5b4c765b | |||
|
|
31a6ebfd3f | ||
|
|
991ed1cb1f | ||
|
|
1efe5c1449 | ||
|
|
4dbeb9936c | ||
|
|
29e6128141 |
1
.prettierignore
Normal file
1
.prettierignore
Normal file
@@ -0,0 +1 @@
|
||||
pnpm-lock.yaml
|
||||
@@ -1,5 +1,20 @@
|
||||
# @openstapps/backend
|
||||
|
||||
## 3.1.2
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix backend rejecting plugins
|
||||
- Fix backend sliently falling back to default configs
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix version history offered by backend
|
||||
- Updated dependencies
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -17,7 +17,7 @@ export const backend = {
|
||||
hiddenTypes: [SCThingType.DateSeries, SCThingType.Diff, SCThingType.Floor],
|
||||
mappingIgnoredTags: ['minlength', 'pattern', 'see', 'tjs-format'],
|
||||
maxMultiSearchRouteQueries: 5,
|
||||
maxRequestBodySize: 512 * 1024,
|
||||
maxRequestBodySize: 2 * 10 ** 6,
|
||||
name: 'Goethe-Universität Frankfurt am Main',
|
||||
namespace: '909a8cbc-8520-456c-b474-ef1525f14209',
|
||||
sortableFields: [
|
||||
|
||||
@@ -11,13 +11,13 @@
|
||||
*
|
||||
* To get more information about the meaning of specific fields, please use your IDE to read the TSDoc documentation.
|
||||
*
|
||||
* @type {import('../../src/storage/elasticsearch/types/elasticsearch-config.js')}
|
||||
* @type {import('../../src/storage/elasticsearch/types/elasticsearch-config.js').ElasticsearchConfigFile}
|
||||
*/
|
||||
const config = {
|
||||
internal: {
|
||||
database: {
|
||||
name: 'elasticsearch',
|
||||
version: '5.6',
|
||||
version: '8.4.2',
|
||||
query: {
|
||||
minMatch: '75%',
|
||||
queryType: 'dis_max',
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
// @ts-check
|
||||
import {readFile} from 'fs/promises';
|
||||
import {readFile, readdir} from 'fs/promises';
|
||||
import url from 'url';
|
||||
import path from 'path';
|
||||
|
||||
/**
|
||||
* @example version(1, import.meta.url)
|
||||
@@ -23,20 +25,14 @@ export async function version(options, base) {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param infos {Record<string, import('@openstapps/core').SCAppVersionInfo['published']>}
|
||||
* @param base {string} Base path of the file as `import.meta.url`
|
||||
* @returns {Promise<import('@openstapps/core').SCAppVersionInfo[]>}
|
||||
*/
|
||||
export async function versions(infos, base) {
|
||||
return Promise.all(
|
||||
Object.entries(infos).map(([versionName, published]) =>
|
||||
version(
|
||||
{
|
||||
published,
|
||||
version: versionName,
|
||||
},
|
||||
base,
|
||||
),
|
||||
),
|
||||
).then(it => it.sort(({version: a}, {version: b}) => -a.localeCompare(b, undefined, {numeric: true})));
|
||||
export async function versions(base) {
|
||||
const directory = await readdir(path.dirname(url.fileURLToPath(base)));
|
||||
const versions = [
|
||||
...new Set(directory.filter(it => it.endsWith('.md')).map(it => it.replace(/\.\w+\.md$/, ''))),
|
||||
].sort((a, b) => -a.localeCompare(b, undefined, {numeric: true}));
|
||||
|
||||
return Promise.all(versions.map(versionName => version({version: versionName}, base)));
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Goethe-Uni App 3.1
|
||||
# Goethe-Uni App 2.4
|
||||
|
||||
Wir freuen uns euch mehr in der Goethe-Uni App
|
||||
bieten zu können.
|
||||
@@ -1,4 +1,4 @@
|
||||
# Goethe-Uni App 3.1
|
||||
# Goethe-Uni App 2.4
|
||||
|
||||
The Goethe-Uni App got even better!
|
||||
|
||||
@@ -2,11 +2,6 @@
|
||||
import {versions} from '../../default/tools/version.js';
|
||||
|
||||
/** @type {import('@openstapps/core').SCAppVersionInfo[]} */
|
||||
const versionHistory = await versions(
|
||||
{
|
||||
'3.1.0': {},
|
||||
},
|
||||
import.meta.url,
|
||||
);
|
||||
const versionHistory = await versions(import.meta.url);
|
||||
|
||||
export default versionHistory;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/backend",
|
||||
"description": "A reference implementation for a StApps backend",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.2",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "AGPL-3.0-only",
|
||||
|
||||
@@ -2,6 +2,7 @@ import {cosmiconfig, PublicExplorer} from 'cosmiconfig';
|
||||
import {SCConfigFile} from '@openstapps/core';
|
||||
import path from 'path';
|
||||
import deepmerge from 'deepmerge';
|
||||
import {Logger} from '@openstapps/logger';
|
||||
|
||||
const fallbackNamespace = 'default';
|
||||
const configPath = 'config';
|
||||
@@ -23,31 +24,25 @@ function configLoader(moduleName: string): PublicExplorer {
|
||||
* Find and load a config file
|
||||
*/
|
||||
async function findConfig<T>(moduleName: string, namespace = fallbackNamespace): Promise<T> {
|
||||
return configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, namespace))
|
||||
.then(it => it!.config as T)
|
||||
.catch(() =>
|
||||
configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, fallbackNamespace))
|
||||
.then(it => it!.config),
|
||||
);
|
||||
}
|
||||
const config = await configLoader(moduleName).search(path.posix.join('.', configPath, namespace));
|
||||
|
||||
/**
|
||||
* Loads a config file
|
||||
*/
|
||||
async function loadConfig<T>(moduleName: string): Promise<T> {
|
||||
const namespace = process.env.NODE_APP_INSTANCE;
|
||||
const database = process.env.NODE_CONFIG_ENV;
|
||||
|
||||
const config = await findConfig<T>(moduleName, namespace);
|
||||
if (database) {
|
||||
const databaseConfig = await findConfig<T>(database, namespace);
|
||||
return deepmerge(config, databaseConfig);
|
||||
if (config) {
|
||||
Logger.info(`Using ${namespace} config for ${moduleName}`);
|
||||
return config.config;
|
||||
} else {
|
||||
Logger.info(`Using ${fallbackNamespace} config for ${moduleName}`);
|
||||
return configLoader(moduleName)
|
||||
.search(path.posix.join('.', configPath, fallbackNamespace))
|
||||
.then(it => it!.config);
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
export const backendConfig = await loadConfig<SCConfigFile>('backend');
|
||||
export const prometheusConfig = await loadConfig<unknown>('prometheus');
|
||||
const namespace = process.env.NODE_APP_INSTANCE;
|
||||
const database = process.env.NODE_CONFIG_ENV;
|
||||
|
||||
export const prometheusConfig = await findConfig<unknown>('prometheus', namespace);
|
||||
|
||||
const backendConfigWithoutDatabase = await findConfig<SCConfigFile>('backend', namespace);
|
||||
export const backendConfig = database
|
||||
? deepmerge(backendConfigWithoutDatabase, await findConfig<never>(database, namespace))
|
||||
: backendConfigWithoutDatabase;
|
||||
|
||||
@@ -84,7 +84,10 @@ export class Elasticsearch implements Database {
|
||||
* @param config an assembled config file
|
||||
* @param mailQueue a mail queue for monitoring
|
||||
*/
|
||||
constructor(private readonly config: SCConfigFile, mailQueue?: MailQueue) {
|
||||
constructor(
|
||||
private readonly config: SCConfigFile,
|
||||
mailQueue?: MailQueue,
|
||||
) {
|
||||
if (config.internal.database === undefined || typeof config.internal.database.version !== 'string') {
|
||||
throw new TypeError('Database version is undefined. Check your config file');
|
||||
}
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
"compilerOptions": {
|
||||
"resolveJsonModule": true,
|
||||
"useUnknownInCatchVariables": false,
|
||||
"allowJs": true
|
||||
}
|
||||
"allowJs": true,
|
||||
"checkJs": true
|
||||
},
|
||||
"exclude": ["app.js", "lib/"]
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
"dockerode": "3.3.5",
|
||||
"is-cidr": "4.0.2",
|
||||
"mustache": "4.2.0",
|
||||
"semver": "7.3.8",
|
||||
"semver": "7.5.4",
|
||||
"typescript": "5.1.6"
|
||||
},
|
||||
"devDependencies": {
|
||||
@@ -65,7 +65,7 @@
|
||||
"@types/mustache": "4.2.2",
|
||||
"@types/node": "18.15.3",
|
||||
"@types/proxyquire": "1.3.28",
|
||||
"@types/semver": "7.3.13",
|
||||
"@types/semver": "7.5.6",
|
||||
"@types/sha1": "1.1.3",
|
||||
"@types/sinon": "10.0.14",
|
||||
"@types/sinon-chai": "3.2.9",
|
||||
|
||||
15
configuration/prettier-config/index.js
Normal file
15
configuration/prettier-config/index.js
Normal file
@@ -0,0 +1,15 @@
|
||||
/** @type {import('prettier').Config} */
|
||||
const config = {
|
||||
tabWidth: 2,
|
||||
printWidth: 110,
|
||||
useTabs: false,
|
||||
semi: true,
|
||||
singleQuote: true,
|
||||
quoteProps: 'consistent',
|
||||
trailingComma: 'all',
|
||||
bracketSpacing: false,
|
||||
arrowParens: 'avoid',
|
||||
endOfLine: 'lf'
|
||||
}
|
||||
|
||||
export default config;
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"$schema": "http://json.schemastore.org/prettierrc",
|
||||
"tabWidth": 2,
|
||||
"printWidth": 110,
|
||||
"useTabs": false,
|
||||
"semi": true,
|
||||
"singleQuote": true,
|
||||
"quoteProps": "consistent",
|
||||
"trailingComma": "all",
|
||||
"bracketSpacing": false,
|
||||
"arrowParens": "avoid",
|
||||
"endOfLine": "lf"
|
||||
}
|
||||
@@ -9,16 +9,19 @@
|
||||
"contributors": [
|
||||
"Rainer Killinger <mail-openstapps@killinger.co>"
|
||||
],
|
||||
"main": "index.json",
|
||||
"main": "index.js",
|
||||
"files": [
|
||||
"index.json",
|
||||
"index.js",
|
||||
"CHANGELOG.md",
|
||||
"README.md"
|
||||
],
|
||||
"scripts": {
|
||||
"test": "npx prettier --config index.json --check \"test/*.js\""
|
||||
"test": "prettier --config index.js --check \"test/*.js\""
|
||||
},
|
||||
"devDependencies": {
|
||||
"prettier": "3.1.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"prettier": "2.8.6"
|
||||
"prettier": "3.1.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,13 @@
|
||||
# @openstapps/minimal-connector
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/minimal-connector",
|
||||
"description": "This is a minimal connector which serves as an example",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "GPL-3.0-only",
|
||||
|
||||
@@ -1,5 +1,14 @@
|
||||
# @openstapps/minimal-plugin
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/api-plugin@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Patch Changes
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/minimal-plugin",
|
||||
"description": "Minimal Plugin",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"license": "GPL-3.0-only",
|
||||
|
||||
6
flake.lock
generated
6
flake.lock
generated
@@ -2,11 +2,11 @@
|
||||
"nodes": {
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1701336116,
|
||||
"narHash": "sha256-kEmpezCR/FpITc6yMbAh4WrOCiT2zg5pSjnKrq51h5Y=",
|
||||
"lastModified": 1701626906,
|
||||
"narHash": "sha256-ugr1QyzzwNk505ICE4VMQzonHQ9QS5W33xF2FXzFQ00=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "f5c27c6136db4d76c30e533c20517df6864c46ee",
|
||||
"rev": "0c6d8c783336a59f4c59d4a6daed6ab269c4b361",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
||||
@@ -1,5 +1,20 @@
|
||||
# @openstapps/app
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- Fix version history offered by backend
|
||||
- Updated dependencies
|
||||
- @openstapps/api@3.1.1
|
||||
- @openstapps/core@3.1.1
|
||||
|
||||
## 3.1.1
|
||||
|
||||
### Patch Changes
|
||||
|
||||
- last minute deployment changes
|
||||
|
||||
## 3.1.0
|
||||
|
||||
### Minor Changes
|
||||
|
||||
@@ -28,6 +28,7 @@ export default defineConfig({
|
||||
fixturesFolder: 'cypress/fixtures',
|
||||
defaultCommandTimeout: 20_000,
|
||||
specPattern: 'cypress/integration/**/*.spec.ts',
|
||||
blockHosts: ['mobile.server.uni-frankfurt.de'],
|
||||
/*setupNodeEvents(on, config) {
|
||||
on('task', {
|
||||
log(message) {
|
||||
|
||||
20
frontend/app/cypress/BACKEND.md
Normal file
20
frontend/app/cypress/BACKEND.md
Normal file
@@ -0,0 +1,20 @@
|
||||
# Backend Mocking
|
||||
|
||||
The backend _must_ be mocked using fixtures or other methods.
|
||||
|
||||
You can use
|
||||
|
||||
```typescript
|
||||
cy.interceptMultiSearch(...)
|
||||
cy.interceptSearch({extend: 'fixture', fixture: 'fixture', alias: 'alias'})
|
||||
cy.interceptGet({uid})
|
||||
```
|
||||
|
||||
For mocking the responses based on a request.
|
||||
|
||||
Paths in the commands will be relative to those, so
|
||||
`cy.interceptSearch({extend: 'request', fixture: 'response'})`
|
||||
will actually pull the fixtures from `request.search.req.json`
|
||||
and `response.search.res.json` respectively.
|
||||
|
||||
If `fixture` is omitted, an empty response will be returned.
|
||||
29
frontend/app/cypress/PITFALLS.md
Normal file
29
frontend/app/cypress/PITFALLS.md
Normal file
@@ -0,0 +1,29 @@
|
||||
# A list of (possibly) common pitfalls
|
||||
|
||||
## The component is not updating
|
||||
|
||||
### Calling Cypress invoke will not trigger change detection
|
||||
|
||||
Rewrite
|
||||
|
||||
```typescript
|
||||
cy.get('component-selector').component().invoke('someFunction');
|
||||
```
|
||||
|
||||
Into
|
||||
|
||||
```typescript
|
||||
cy.get('component-selector')
|
||||
.component()
|
||||
.runInsideAngular(component => component.someFunction());
|
||||
```
|
||||
|
||||
## The backend is unreachable
|
||||
|
||||
See `BACKEND.md`, direct calls to backend are prohibited.
|
||||
|
||||
## The search page doesn't work
|
||||
|
||||
Run `cy.patchSearchPage()` after visiting the search page.
|
||||
It set the due time to zero so that the component
|
||||
won't wait for someone to type more.
|
||||
46
frontend/app/cypress/fixtures/canteen/all.search.req.json
Normal file
46
frontend/app/cypress/fixtures/canteen/all.search.req.json
Normal file
@@ -0,0 +1,46 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "canteen"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "student canteen"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "cafe"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "categories",
|
||||
"value": "restaurant"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
31
frontend/app/cypress/fixtures/canteen/dishes.multi.req.json
Normal file
31
frontend/app/cypress/fixtures/canteen/dishes.multi.req.json
Normal file
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"*": {
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "offers.inPlace.uid"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "dish"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "offers.availabilityRange"
|
||||
},
|
||||
"type": "availability"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
889
frontend/app/cypress/fixtures/canteen/dishes.multi.res.json
Normal file
889
frontend/app/cypress/fixtures/canteen/dishes.multi.res.json
Normal file
@@ -0,0 +1,889 @@
|
||||
{
|
||||
"2020-01-01T12:00:00.000Z": {
|
||||
"data": [
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "db0c03b1-b7cc-5513-b3e6-71d6020520ab",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 835,
|
||||
"carbohydrateContent": 99.2,
|
||||
"fatContent": 33,
|
||||
"proteinContent": 33.4,
|
||||
"saltContent": 3.7,
|
||||
"saturatedFatContent": 9.1,
|
||||
"sugarContent": 7.3
|
||||
},
|
||||
"additives": ["gluten (A)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": ["Glutenhaltige Getreide (A)", "Milch u. Milcherzeugnisse (G)"],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Pizza alla Pugliese (A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.829Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Pugliese pizza (A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "b798cc94-ab0a-5fdd-b9d8-127ae8940f47",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 876,
|
||||
"carbohydrateContent": 100.4,
|
||||
"fatContent": 32.7,
|
||||
"proteinContent": 42.6,
|
||||
"saltContent": 4,
|
||||
"saturatedFatContent": 6.3,
|
||||
"sugarContent": 8.6
|
||||
},
|
||||
"additives": ["preserved (2)", "with antioxidants (3)", "gluten (A)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Pizza Carciofi e Prosciutto (2,3,A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.830Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Artichoke-ham pizza (2,3,A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "e5e40978-119b-5537-a3c6-87725f797990",
|
||||
"nutrition": {
|
||||
"calories": 899,
|
||||
"carbohydrateContent": 98.2,
|
||||
"fatContent": 36.7,
|
||||
"proteinContent": 42.4,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 6.8,
|
||||
"sugarContent": 8.1
|
||||
},
|
||||
"additives": ["gluten (A)", "fish (D)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Fisch u. Fischerzeugnisse (D)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"name": "Pizza Salmone e Spinaci (A,D,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.830Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Salami-spinach pizza (A,D,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "94629b59-e0a7-538e-b057-018e268297ca",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 1399,
|
||||
"carbohydrateContent": 148.8,
|
||||
"fatContent": 69.2,
|
||||
"proteinContent": 40.2,
|
||||
"saltContent": 1,
|
||||
"saturatedFatContent": 16.3,
|
||||
"sugarContent": 7.7
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Tagliatelle Pesto verde de Francoforte (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.834Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Tagliatelle w/ Frankfurt-style green pesto (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "34d08548-07fa-51b7-ad88-cfdb6c6ed62b",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 849,
|
||||
"carbohydrateContent": 103.3,
|
||||
"fatContent": 37.4,
|
||||
"proteinContent": 33.5,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 2.6,
|
||||
"sugarContent": 11.6
|
||||
},
|
||||
"additives": [
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"gluten (A)",
|
||||
"milk (G)",
|
||||
"sulphur dioxide / sulphite (L)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Schwefeldioxid / Sulfit (L)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Pizza Antipasti (2,3,A,G,L)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.828Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Antipasti pizza (2,3,A,G,L)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "b58db64e-47bc-565a-abd7-6ca79211217d",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 930,
|
||||
"carbohydrateContent": 100.5,
|
||||
"fatContent": 41.4,
|
||||
"proteinContent": 35.9,
|
||||
"saltContent": 4.7,
|
||||
"saturatedFatContent": 6.6,
|
||||
"sugarContent": 9
|
||||
},
|
||||
"additives": [
|
||||
"with artificial colouring (1)",
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"blackened (6)",
|
||||
"gluten (A)",
|
||||
"milk (G)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"mit Farbstoff (1)",
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"geschwärzt (6)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Pizza alla Diavola (1,2,3,6,A,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.827Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Diavola pizza (1,2,3,6,A,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "734fc8f9-0f4d-54aa-bd8b-87431c7997bb",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 581,
|
||||
"carbohydrateContent": 79.9,
|
||||
"fatContent": 16.5,
|
||||
"proteinContent": 28.3,
|
||||
"saltContent": 3.8,
|
||||
"saturatedFatContent": 4.4,
|
||||
"sugarContent": 13.8
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Cannelloni Ricotta-Spinat (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.832Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Ricotta-spinach cannelloni (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "738be5ff-6b35-5249-8f0d-b5e5830f9f4d",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/beef.svg",
|
||||
"name": "beef"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 880,
|
||||
"carbohydrateContent": 94.3,
|
||||
"fatContent": 36.9,
|
||||
"proteinContent": 39.9,
|
||||
"saltContent": 0.8,
|
||||
"saturatedFatContent": 9.9,
|
||||
"sugarContent": 10.2
|
||||
},
|
||||
"additives": ["gluten (A)", "egg (C)", "milk (G)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Eier u. Eiererzeugnisse (C)",
|
||||
"Milch u. Milcherzeugnisse (G)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/beef.svg",
|
||||
"name": "Rind"
|
||||
}
|
||||
],
|
||||
"name": "Spaghetti Bolognese (A,C,G)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.833Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Spaghetti bolognese (A,C,G)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "7a95dd93-83d3-560c-8069-038b51d1b46b",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarian"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 349,
|
||||
"carbohydrateContent": 5.3,
|
||||
"fatContent": 29.9,
|
||||
"proteinContent": 10.6,
|
||||
"saltContent": 0.3,
|
||||
"saturatedFatContent": 18.9,
|
||||
"sugarContent": 3.6
|
||||
},
|
||||
"additives": ["gluten (A)", "milk (G)", "celery (I)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/vegetarian.svg",
|
||||
"name": "vegetarisch"
|
||||
}
|
||||
],
|
||||
"name": "Flammkuchen mit Spinat und Mozzarella (A,G,I)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.832Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Spinach-mozzarella tarte flambée (A,G,I)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2023-02-24T09:00:00.000Z",
|
||||
"lte": "2023-02-24T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-21:00; Sa-Su off; 2023 Feb 13 - 2023 Apr 06 Mo-Fr 10:00-21:00; 2023 Feb 13 - 2023 Apr 06 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 2.2,
|
||||
"guest": 1.1,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "0405339e-f1f3-54a6-9ac1-a230e2bda5c0"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "f430dde2-e17e-5406-84ae-484e1f095966",
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "pork"
|
||||
}
|
||||
],
|
||||
"nutrition": {
|
||||
"calories": 325,
|
||||
"carbohydrateContent": 5.2,
|
||||
"fatContent": 27.2,
|
||||
"proteinContent": 11.3,
|
||||
"saltContent": 0.9,
|
||||
"saturatedFatContent": 16.4,
|
||||
"sugarContent": 4.1
|
||||
},
|
||||
"additives": ["preserved (2)", "gluten (A)", "milk (G)", "celery (I)"],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)"
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"image": "https://mobile.server.uni-frankfurt.de/_static/canteen/pork.svg",
|
||||
"name": "Schwein"
|
||||
}
|
||||
],
|
||||
"name": "Flammkuchen mit Speck und Zwiebeln (2,A,G,I)"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T17:00:07.831Z",
|
||||
"name": "Studierendenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Bacon-onion tart flambée (2,A,G,I)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "dish"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "main dish"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "dish"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "cafe"
|
||||
}
|
||||
],
|
||||
"field": "offers.inPlace.categories",
|
||||
"onlyOnType": "dish"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 10,
|
||||
"offset": 0,
|
||||
"total": 10
|
||||
},
|
||||
"stats": {
|
||||
"time": 2
|
||||
}
|
||||
}
|
||||
}
|
||||
30
frontend/app/cypress/fixtures/catalog/all.search.req.json
Normal file
30
frontend/app/cypress/fixtures/catalog/all.search.req.json
Normal file
@@ -0,0 +1,30 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "catalog"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "academicTerm.uid"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "level",
|
||||
"value": "0"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
519
frontend/app/cypress/fixtures/catalog/all.search.res.json
Normal file
519
frontend/app/cypress/fixtures/catalog/all.search.res.json
Normal file
@@ -0,0 +1,519 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "3553954b-f551-5326-a4bd-38bedffb3e37",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91602"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:57.998Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 1 - Rechtswissenschaft",
|
||||
"description": "Das stets aktuelle Vorlesungsverzeichnis des Fachbereichs Rechtswissenschaft finden Sie hier! Ein Ausdruck mit allen aktuellen Änderungen hängt außerdem vor dem Dekanat des Fachbereichs (1. OG, Gebäude RuW) aus. Nähere Informationen über den Aufbau des Studiums der Rechtswissenschaft erhalten Sie über unsere Studien- und Prüfungsordnung, die Sie im Dekanat bekommen. Das gedruckte VORLESUNGSVERZEICHNIS kann zudem während der Öffnungszeiten im Hörsaalgebäude am Verkaufsstand der Buchhandlung Hector erworben werden.\n\nDas Veranstaltungsangebot orientiert sich am Studienplan des Fachbereichs Rechtswissenschaft. Die Lehrveranstaltungen beginnen in der ersten Vorlesungswoche. Die Pflichtveranstaltungen enden an unserem Fachbereich\neine Woche vor Vorlesungsende\n, anschließend beginnt die zweiwöchige Klausurenphase.\n\nDie wöchentlichen Veranstaltungen im Schwerpunktbereichsstudium enden bereits zwei Wochen vor dem allgemeinen Vorlesungsende der Universität. Anschließend werden Blockveranstaltungen angeboten.\n\nAchtung:\nIm Schwerpunktbereichsstudium dürfen insgesamt nur maximal zwei rechtsmedizinische und arztrechtliche Veranstaltungen des Insituts für Rechtsmedizin zur Erbringung des Pflichtprogramms gem. § 25 Abs. 3 genutzt werden!\n\n \n\n\nFür Studienanfänger wird eine spezielle dreitägige Orientierungsveranstaltung in der Woche vor Vorlesungsbeginn angeboten; Einzelheiten hierzu werden brieflich mitgeteilt. Für Fragen und Sorgen steht die Studienberatung des Fachbereichs für Studierende aller Semester zur Verfügung.\nZur Zeit findet die Studienberatung telefonisch unter: 069 / 798 – 34211 von Mo - Do von 10:00 Uhr - 12:00 Uhr und Mi von 14.00 Uhr - 17.00 Uhr oder per Mail:\nstudienberatung@jura.uni-frankfurt.de\nstatt.\n\n\n \nDer Fachbereich bietet einen Aufbaustudiengang für im Ausland graduierte Juristinnen und Juristen (LL.M.), einen Aufbaustudiengang \"Europäisches und Internationales Wirtschaftsrecht\" (LL.M. Eur.), einen Weiterbildungsstudiengang \"Law and Finance\" (LL.M. Finance) sowie ein Masterprogramm \"LL.M. Legal Theory\" an. Veranstaltungen zu den Studiengängen siehe Vorlesungsverzeichnis und Aushänge.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "c9d881de-b04e-5775-a36f-58bd7d9a6416",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94670"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.125Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 10 - Neuere Philologien",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "47622795-c4bd-5f3a-80b0-dcb18335314e",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93430"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.172Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 11 - Geowissenschaften / Geographie",
|
||||
"description": "Fachstudienberatung\n\n\n \n\n\nBachelor/Master/Lehramt Geographie\n\n\n\n\nTeilbereich Humangeographie\n\n\n\n\n\n\n\n\n\n\nJens Schreiber, Sprechstunde siehe geostud (\nhttp://www.geostud.de/mein-studium/beratungpruefungsaemter/studienberatung/\n), Campus Westend, PEG-Gebäude, Theodor-W.-Adorno-Platz 6, Raum PEG 2.G 053\n\n \n\n\nTeilbereich Physische Geographie\n\n\n\n\n\n\nAkad. ORätin Dr. Irene Marzolff, Sprechstunde Do 09.00-10.00, Altenhöferallee 1, Zi 2.222, Tel. 798-40173;\n\nVertr.: Dr. Christiane Berger, Sprechstunde Mi 10-10:45, Altenhöferallee 1, Zi. 2.111, Tel. 798-40157 \n\n\n\n\n\n\n\n\n\n\n \n\n\n\n \n\nBSc-Nebenfachbereich\n\n\n\n\n\n\n\n\n Dr. Christiane Berger, Sprechstunde Mi 10-10:45, Altenhöferallee 1, Zi. 2.111, Tel. 798-40157\n\n\n\n\n\n\n\n \n\nBachelor/Master Geowissenschaften\n\n\nDr. Frederik Kirst, Altenhöferallee 1, Zi 2.317, Tel. 798-40199\n\nAkad. ORat\nDr. Rainer Petschick\n, Sprechstunde n.V., Altenhöferallee 1, Zi 2.325, Tel. 798-40192\n\nProf. Dr. Jens O. Herrle, Sprechstunde n.V., Altenhöferallee 1, Zi 2.227, Tel. 798-40180\n\nAkad. Rat PD Dr. Eiken Haussühl, Sprechstunde n.V., Altenhöferallee 1, Zi 1.217, Tel. 798-40105\n\nProf. Dr. Björn Winkler, Sprechstunde n.V., Altenhöferallee 1, Zi 1.219, Tel. 798-40107\n\nProf. Dr. Andreas Junge, Sprechstunde n.V., Altenhöferallee 1, Zi. 1.319, Tel. 798-40144\n\nProf. Dr. Georg Rümpker, Sprechstunde n.V., Altenhöferallee 1, Zi. 1.320, Tel. 798-40142\n\n\n \n\n\nBachelor/Master Meteorologie\n\n\nAkad. ORat Dr. Andreas Kürten, Sprechstunde n.V., Altenhöferallee 1, Zi 3.318, Tel. 798-40256\n\nAkad. Rat Dr. Stamen Dolaptchiev, Sprechstunde n.V., Altenhöferallee 1, Zi 3.336, Tel. 798-40233\n\n\n \n\n\nMaster Umweltwissenschaften\n\n\nProf. Dr. Jörg Oehlmann, Sprechstunde n.V., Max-von-Laue-Str. 7, Tel. 798-42142",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "1dc1df6b-31c6-5ce5-a1b5-18098b07c23a",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91471"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.180Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 12 - Informatik und Mathematik",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "57dde85a-5d8b-5fbd-b72e-3ec2f9dec83e",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93223"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.185Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 13 - Physik",
|
||||
"description": "Dekanat\n:\nhttp://www.uni-frankfurt.de/60506908/\n\n \n\nPrüfungsamt\n: \nGoethe-Universität — Examination office (uni-frankfurt.de)\n\n \n\nFachstudienberatung:\nhttps://www.uni-frankfurt.de/60655696/Studienberatung\n \n\n \n\nFachschaft Physik: \nhttps://fachschaftphysik.uni-frankfurt.de/\n \n\n \n\nVirtuelle und Präsenzlehre:\n\nNach derzeitiger Planung werden im Wintersemester 2022/23 Lehrveranstaltungen in der Regel als Präsenzveranstaltungen angeboten (mit voller Belegung von Hörsälen bzw. Seminarräumen). Ausnahmen davon finden Sie im Vorlesungsverzeichnis bei den jeweiligen Veranstaltungen.\nAngesichts der noch nicht absehbaren Situation im April sind die Einträge im elektronischen Vorlesungsverzeichnis LSF aber derzeit noch als vorläufig zu betrachten. Bitte informieren Sie sich zu einem späteren Zeitpunkt noch einmal im LSF, ob sich bei den Sie interessierenden Veranstaltungen Änderungen ergeben haben.\n \n\nAnfänger-Praktika:\n Die Online-Anmeldung für alle Anfänger-Praktika für das\nWintersemester 2022/23\nist in der Zeit\n\n vom\n15.08.2022, 8.00 Uhr bis 04.09.2022, 22.00\n \n\n \nunter\n\n\nhttps://www.uni-frankfurt.de/60589452/Anfaengerpraktikum\n frei geschaltet.\n\n \n\nFortgeschrittenen-Praktikum für Studierende der Physik: \nDie Online-Anmeldung für alle Fortgeschrittenen-Praktika für das\nWintersemester 2022/23\n\n\nist in der Zeit vom\n12.09.2022 bis zum 09.10.2022\nunter \n\nhttp://goethe.link/FuLPraktikum\n \n\nfrei geschaltet.\n\n \nBitte beachten Sie: Melden Sie sich bitte für den Studiengang (BA, MA) an, in den Sie das Praktikum einbringen wollen.\n \n\nDie virtuelle Einführungsveranstaltung für die Fortgeschrittenen-Praktika finden Sie in OLAT unter dem link: \nhttps://olat-ce.server.uni-frankfurt.de/olat/auth/RepositoryEntry/16096034818\n \n\n \nDetails werden nach der erfolgreichen Anmeldung bekannt gegeben.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "8b6802d7-6365-54c3-ae09-992d42f89430",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91658"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.188Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 14 - Biochemie, Chemie und Pharmazie",
|
||||
"description": "Anschrift des Dekanats:\nMax-von-Laue-Str. 9 (Geb. N101, Rm. 1.12), 60438 Frankfurt am Main, Tel.: 798-29545, mailto:dekanatFB14@uni-frankfurt.de, Öffnungszeiten: Mo, Di, Do, Fr 9-13 Uhr.\n\n\nAuskünfte zu Promotionsangelegenheiten\nerteilt das Dekanat, Tel.: 798-29545;\n\nGeschäftsführende Vorsitzende: Prof. Dr. J. Dressman Tel.: 798-29680.\n\nPromotionsbüro der Naturwissenschaftlichen Fachbereiche:\nRobert-Mayer-Str. 6-8 (Rm. 304), Tel.: 798-23504, mailto:promotionsbuero@math.uni-frankfurt.de.\n\nPrüfungsamt Chemie (Bachelorstudiengang):\nMax-von-Laue-Str. 9 (Geb. N101, Rm. 1.13), 60438 Frankfurt, Tel.: 798-29212, mailto:PruefungsamtFB14@uni-frankfurt.de.\n\nPrüfungsamt Studiengang Biochemie (Bachelor, Master und Diplom) und Chemie (Master):\nMax-von-Laue-Str. 9 (Geb.: N101, Rm. 1.08), 60438 Frankfurt, Tel.: 798-29362, mailto:PruefungsamtFB14@uni-frankfurt.de. \n\n\nStudienfachberatung\n\nBiochemie:\nAllgem. Beratung in Studienangelegenheiten: Prof. Dr. V. Dötsch, Tel.: 798-29631, Prof. Dr. C. Glaubitz, Tel.: 798-29927, Prof. Dr. M. Pos, Tel.: 798-29251, Prof. Dr. R. Tampé, Tel.: 798-29476.\n\nChemie (Bachelor und Master):\n\nJeden Freitag um 11 Uhr bietet Herr Dr. Lill eine Studienberatung in den Räumen des Dekanats an.\n\n- Termine\ndafür und Termine für die Studienfachberatung erhalten Sie über Frau Schreiber im Termine können über das Prüfungsamt (Tel.: 798-29212) vereinbart werden.\n\nProf. Göbel, Tel.: 798-29222, Prof. Schmidt, Tel.: 798-29171, Prof. Dr. A. Terfort, Tel.: 798-29181.\n\n\n\nLehrämter\n\nLehramt an Gymnasien (L3):\nDidaktik der Chemie: Prof. Dr. A. Lühken, Tel.: 798-29446; Anorganische und Analytische Chemie: Dr. L. Fink, Tel.: 798-29123; Physikalische und Theoretische Chemie: Prof. Dr. J. Wachtveitl, Tel.: 798-29351; Organische Chemie und Chemische Biologie: Prof. Dr. M. Göbel, Tel.: 798-29222. \n\nLehramt an Haupt- und Realschulen (L2) sowie an Förderschulen (L5):\nDidaktik der Chemie: Prof. Dr. A. Lühken, Tel.: 798-29446; Anorganische und Analytische Chemie: Dr. L. Fink, Tel.: 798-29123; Physikalische und Theoretische Chemie: Dr. H-D. Barth, Tel.: 798-29428; Organische Chemie und Chemische Biologie: Dr. T. Russ, Tel.: 798-29121.\n\nLehramt an Grundschulen (L1):\nDidaktik der Chemie: Dr. Jens Salzner, Tel.: 798-29454 \n\nChemie für Mediziner:\nDie Veranstaltungen werden im Klinikum Haus 75, Sandhofstr. angeboten. Dr. B. Patzke und Dr. Th. Russ, Tel.: 6301-7624; Internet: http://www.chemed.de/\n\nChemie für Studierende im Nebenfach:\nDr. Buchsbaum, Tel: 798-29171\n\n\n\nPharmazie:\nAllgemeine Studienberatung für Studierende der Pharmazie und Bewerber/-innen zum Pharmaziestudium: Prof. Dr. R. Schmidtko, Tel.: 798-29376.\n\nHess. Landesprüfungsamt für Heilberufe (Hauptstelle):\nLurgiallee 10, 60439 Frankfurt/Main, Frau Manuela Wiegand, Tel.: 069 580013-211.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "977e0f94-bfdd-5c55-adee-e7adc12d9ff0",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94462"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.219Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 15 - Biowissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "3fc1561b-f38a-573d-817c-d5bb93506f61",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93289"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.240Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 16 - Medizin",
|
||||
"description": "Sehr geehrte Studierende,\nSehr geehrte Damen und Herren,\n \ndie Angaben im Vorlesungsverzeichnis werden regelmäßig aktualisiert.\nWir bitten Sie daher, sich unmittelbar vor dem Besuch Ihrer Veranstaltung\nüber die aktuellen Angaben zu Zeit und Ort zu informieren.\n\nAlle Detailangaben zu\nvorklinischen\nund\nklinischen\nWahlfächern\n\nfinden Sie auf den Webseiten des Fachbereichs Medizin.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.000Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "04dd801e-3986-529a-bb67-b4d7c86fc624",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94757"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.030Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 3 - Gesellschaftswissenschaften",
|
||||
"description": "Ab dem 18.07.2022 finden Sie hier das Veranstaltungsangebot für das Wintersemester 2022/23.\nBitte beachten Sie, dass es bis zu Beginn der Anmeldephase noch zu Änderungen in geringem Umfang kommen kann.\n\n \n\nErstsemester\nwerden in die jeweils neusten Prüfungsordnungen (PO 2022 bzw. PO 2019) eingeschrieben.\n\n \n\nVerbindliches Anmeldesystem:\nDie Anmeldung zu allen Lehrveranstaltungen des Fachbereich Gesellschaftswissenschaften erfolgt über QIS-LSF. Weitere Informationen dazu finden Sie auf den Seiten der Fachbereichs im Bereich Studium -> Anmeldeverfahren \nhttps://www.fb03.uni-frankfurt.de/58614228/Anmeldung_zu_Lehrveranstaltungen\n(hier informieren wir Sie auch über die aktuellen Fristen und ggfls. zu Änderungen im Verfahren)!",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "573d7374-fdb2-54e4-846e-231395bc7a21",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "93734"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.049Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 4 - Erziehungswissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "21bc5d2b-c4e2-5df4-abca-fd120805b8e0",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94521"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.053Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 5 - Psychologie und Sportwissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "5f45ed02-171b-5d55-8863-9a878005a5d8",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94505"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.058Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 6 - Evangelische Theologie",
|
||||
"description": "Sehr geehrte Studentinnen und Studenten,\ndas Wintersemester 2021/22 wird aller Voraussicht nach in weiten Teilen wieder im Präsenzbetrieb stattfinden. Bitte beachten Sie zu den hier aufgeführten Lehrveranstaltungen folgende Hinweise:\n\n\nAlle im Vorlesungsverzeichnis aufgeführten\nVeranstaltungen finden statt\n- ggf. wird kurzfristig eine Rückkehr in den Online-Modus notwendig. Darüber informieren wir dann an dieser Stelle.\n\n\nAktuell sind (insbesondere für die Studiengänge Religionswissenschaft) noch nicht alle\nModulangaben\neingetragen. Eine Orientierung bietet - wie stets - die Zuordnung zu Fachgebieten/Professuren sowie die eigenständige Lektüre der Studien- und Prüfungsordnungen. Die Modulangaben werden spätestens bis 15. Juli verbindlich in LSF ersichtlich sein. Fragen zur Modulzuordnung beantworten ebenfalls die zuständigen Fachstudienberater*innen. Wir bitten darum, von Nachfragen bis zur vollständigen Eintragung der Module möglichst abzusehen.\n\n\nBitte informieren Sie sich auch selbst über folgende Seiten:\n\n\nwww.uni-frankfurt.de/corona\n(Informationsseite der Universität)\n\n\nwww.evtheol.uni-frankfurt.de\n(Fachbereichsseite Evangelische Theologie)\n\n\nwww.facebook.com/evtheol.ffm\n(Facebook-Auftritt des Fachbereichs Evangelische Theologie)\n\n\n \n\nIn Forschung und Lehre kooperiert der Fachbereich Evangelische Theologie mit dem Institut für Evangelische Theologie der Justus-Liebig-Universität in Gießen. Dies bedeutet, dass einerseits Gießener Professoren/innen Lehrveranstaltungen in Frankfurt anbieten und umgekehrt, andererseits, dass die Studierenden beider Universitäten die Möglichkeit haben, Lehrveranstaltungen der jeweils anderen Universität in Evangelischer Theologie zu belegen.\n\n\nAlle Veranstaltungen beginnen - soweit nicht anders vermerkt - in der ersten Vorlesungswoche.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "5711d338-0111-5352-991c-11210649f7c8",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94716"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.066Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 7 - Katholische Theologie",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "7e5c2463-c0ab-585a-ad97-b6cf178dd8c4",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92555"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.073Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 8 - Philosophie und Geschichtswissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "d65f83e8-5f69-5dfe-b23e-f0abb327cac4",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91668"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.091Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 9 - Sprach- und Kulturwissenschaften",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "ac329244-cfbe-535d-ae60-88afe09cf7eb",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92184"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.252Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Lehrveranstaltungen für Lehramtsstudiengänge (Modulstruktur)",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
},
|
||||
{
|
||||
"uid": "80e6cc59-7894-5204-8b3a-b1fdb49e7a72",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92603"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.324Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Weitere Studienangebote",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "catalog"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "academicTerm.acronym",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 18,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "catalog"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 18,
|
||||
"offset": 0,
|
||||
"total": 18
|
||||
},
|
||||
"stats": {
|
||||
"time": 3
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "ae3cf884-4dc4-526b-9213-6850135591ab",
|
||||
"uid": "catalog",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "catalog"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "superCatalog.uid"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"operation": "and",
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "academic event"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "catalogs.uid"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
364
frontend/app/cypress/fixtures/catalog/children.search.res.json
Normal file
364
frontend/app/cypress/fixtures/catalog/children.search.res.json
Normal file
@@ -0,0 +1,364 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "1a91ca6f-c1f2-51f4-b48b-0680c661e86b",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94412"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.001Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Allgemeine Veranstaltungen / Informationsveranstaltungen",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "c448ee2b-6a5e-5d88-973b-f71c7a1b63cd",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91482"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.029Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Anwendungsfächer/Exportmodule gemäß Vereinbarungen",
|
||||
"description": "Dieses Verzeichnis gilt ausschließlich für Studierende, die in das Nebenfach BWL bzw. VWL des Fachbereichs 02 Wirtschaftswissenschaften eingeschrieben sind. Ob diese Regelung für Sie gilt, finden Sie unter:\nhttp://www.wiwi.uni-frankfurt.de/mein-wiwi-studium/pruefungsamt/allgemeine-informationen/infos-nebenfachstudierende.html",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "55f677f4-98ab-5645-bfe0-06a38b2c5d72",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92478"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.001Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Bachelorstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "c22d157e-9cfa-551a-8d5c-2c77046e814b",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "91546"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.028Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Graduiertenstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "3da3bc68-d27f-5730-b224-eef7a3e328cc",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "92114"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.014Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Masterstudium",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
},
|
||||
{
|
||||
"uid": "67303028-6ee7-5d64-86b5-f154221a2e93",
|
||||
"superCatalogs": [
|
||||
{
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
],
|
||||
"level": 1,
|
||||
"academicTerm": {
|
||||
"acronym": "WiSe 2022/23",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"name": "Wintersemester 2022/23",
|
||||
"startDate": "2022-09-30T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "94694"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:58.027Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wirtschaftssprachen",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog",
|
||||
"superCatalog": {
|
||||
"categories": ["university events"],
|
||||
"identifiers": {
|
||||
"LSF": "92339"
|
||||
},
|
||||
"level": 0,
|
||||
"name": "FB 2 - Wirtschaftswissenschaften",
|
||||
"type": "catalog",
|
||||
"uid": "ed67e49a-927e-5051-aa03-140385553945",
|
||||
"description": "Alle Veranstaltungen beginnen grundsätzlich in der ersten Vorlesungswoche, es sei denn, es ist im Folgenden anders vermerkt.\nBis zum Semesterbeginn haben alle Angaben nur vorläufigen Charakter.\n\nBeratung zu allen Fragen erhalten Sie bei der Studienfachberatung Wirtschaftswissenschaften: \nSprechzeiten und Kontaktmöglichkeiten\n\n\nWeitere Informationen finden Sie auch auf der Website: \nhttps://www.wiwi.uni-frankfurt.de/"
|
||||
}
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "catalog"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "academicTerm.acronym",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "superCatalog.categories",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 6,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "superCatalogs.categories",
|
||||
"onlyOnType": "catalog"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 6,
|
||||
"offset": 0,
|
||||
"total": 6
|
||||
},
|
||||
"stats": {
|
||||
"time": 3
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "semester"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
}
|
||||
209
frontend/app/cypress/fixtures/catalog/semesters.search.res.json
Normal file
209
frontend/app/cypress/fixtures/catalog/semesters.search.res.json
Normal file
@@ -0,0 +1,209 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "ff2626e2-c1d8-5cd0-a6a2-cc68547a8079",
|
||||
"alternateNames": ["Winter 2019/20"],
|
||||
"acronym": "WiSe 2019/20",
|
||||
"endDate": "2020-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2019-10-13T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.429Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2019/20",
|
||||
"eventsEndDate": "2020-02-14T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2019-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "283210ef-60fd-571c-b2d7-233a223d815c",
|
||||
"alternateNames": ["Sommer 2019"],
|
||||
"acronym": "SoSe 2019",
|
||||
"endDate": "2019-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2019-04-14T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.427Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2019",
|
||||
"eventsEndDate": "2019-07-19T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2019-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "e9333354-79c5-5afc-8c28-e5e7079956ed",
|
||||
"alternateNames": ["Sommer 2020"],
|
||||
"acronym": "SoSe 2020",
|
||||
"endDate": "2020-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2020-04-13T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.430Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2020",
|
||||
"eventsEndDate": "2020-07-17T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2020-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "34757b85-6f96-5b72-adc4-b96ef4c67037",
|
||||
"alternateNames": ["Winter 2020/21"],
|
||||
"acronym": "WiSe 2020/21",
|
||||
"endDate": "2021-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2020-11-01T23:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.431Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2020/21",
|
||||
"eventsEndDate": "2020-02-21T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2020-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "dbf1d23d-5ee9-58d6-af40-f64f3b3019fa",
|
||||
"alternateNames": ["Sommer 2021"],
|
||||
"acronym": "SoSe 2021",
|
||||
"endDate": "2021-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2021-04-11T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.431Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2021",
|
||||
"eventsEndDate": "2021-07-16T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2021-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "049ab143-8b77-5dcc-95e9-8bb6755f3db4",
|
||||
"alternateNames": ["Winter 2021/22"],
|
||||
"acronym": "WiSe 2021/22",
|
||||
"endDate": "2022-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2021-10-17T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.432Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2021/22",
|
||||
"eventsEndDate": "2022-02-18T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2021-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "4b2766cb-e16d-5698-b5b3-e650613d497a",
|
||||
"alternateNames": ["Sommer 2022"],
|
||||
"acronym": "SoSe 2022",
|
||||
"endDate": "2022-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2022-04-10T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.433Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2022",
|
||||
"eventsEndDate": "2022-07-15T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2022-03-31T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "d8045576-799a-5bec-85be-bc0026a76509",
|
||||
"alternateNames": ["Winter 2022/23"],
|
||||
"acronym": "WiSe 2022/23",
|
||||
"endDate": "2023-03-31T21:59:59.999Z",
|
||||
"eventsStartDate": "2022-10-16T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.433Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Wintersemester 2022/23",
|
||||
"eventsEndDate": "2023-02-10T22:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2022-09-30T22:00:00.000Z"
|
||||
},
|
||||
{
|
||||
"uid": "7391f2ee-8f3b-577b-890a-a3f4f4728a9d",
|
||||
"alternateNames": ["Sommer 2023"],
|
||||
"acronym": "SoSe 2023",
|
||||
"endDate": "2023-09-30T21:59:59.999Z",
|
||||
"eventsStartDate": "2023-04-10T22:00:00.000Z",
|
||||
"origin": {
|
||||
"indexed": "2023-02-24T23:14:26.434Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Sommersemester 2023",
|
||||
"eventsEndDate": "2023-07-14T21:59:59.999Z",
|
||||
"type": "semester",
|
||||
"startDate": "2023-03-31T22:00:00.000Z"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 9,
|
||||
"key": "semester"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2019"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2020"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2021"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2022"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2023"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2019/20"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2020/21"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2021/22"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "WiSe 2022/23"
|
||||
}
|
||||
],
|
||||
"field": "acronym",
|
||||
"onlyOnType": "semester"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 9,
|
||||
"offset": 0,
|
||||
"total": 9
|
||||
},
|
||||
"stats": {
|
||||
"time": 2
|
||||
}
|
||||
}
|
||||
549
frontend/app/cypress/fixtures/config/default-config.json
Normal file
549
frontend/app/cypress/fixtures/config/default-config.json
Normal file
File diff suppressed because one or more lines are too long
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "date series"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
17
frontend/app/cypress/fixtures/news/all.search.req.json
Normal file
17
frontend/app/cypress/fixtures/news/all.search.req.json
Normal file
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"filter": {
|
||||
"type": "boolean",
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"type": "value",
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "message"
|
||||
}
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,7 @@
|
||||
"data": [
|
||||
{
|
||||
"datePublished": "2022-06-07T09:42:00.000Z",
|
||||
"uid": "c90c7d30-410f-5aea-a67b-ea1f98929b93",
|
||||
"uid": "message",
|
||||
"messageBody": "DE for Students and Employees",
|
||||
"origin": {
|
||||
"indexed": "2022-06-08T19:30:08.640Z",
|
||||
@@ -2,7 +2,7 @@
|
||||
"data": [
|
||||
{
|
||||
"datePublished": "2022-06-07T09:42:00.000Z",
|
||||
"uid": "c90c7d30-410f-5aea-a67b-ea1f98929b93",
|
||||
"uid": "message",
|
||||
"messageBody": "DE for Students and Employees",
|
||||
"origin": {
|
||||
"indexed": "2022-06-08T19:30:08.640Z",
|
||||
@@ -19,31 +19,11 @@
|
||||
"sameAs": "https://aktuelles.uni-frankfurt.de/?p=59273"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 85,
|
||||
"key": "message"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 85,
|
||||
"key": "news"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "message"
|
||||
}
|
||||
],
|
||||
"facets": [],
|
||||
"pagination": {
|
||||
"count": 10,
|
||||
"count": 1,
|
||||
"offset": 0,
|
||||
"total": 85
|
||||
"total": 1
|
||||
},
|
||||
"stats": {
|
||||
"time": 2
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "date series"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "uid"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "or"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"duration": "PT1H0M0S",
|
||||
"uid": "c010f7d6-5a32-522a-8316-045e032ea25e",
|
||||
"identifiers": {
|
||||
"LSF": "779352"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2059-06-03T10:10:13.842Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Übung",
|
||||
"dates": ["2059-01-19T14:00:00+01:00"],
|
||||
"event": {
|
||||
"categories": ["exercise"],
|
||||
"identifiers": {
|
||||
"LSF": "336024"
|
||||
},
|
||||
"name": "UNIcert (Test)",
|
||||
"originalCategory": "Übung",
|
||||
"type": "academic event",
|
||||
"uid": "2ae9f707-c9d3-5bc6-bfbc-734dbd148336"
|
||||
},
|
||||
"type": "date series",
|
||||
"inPlace": {
|
||||
"alternateNames": ["H I", "Hörsaal I"],
|
||||
"categories": ["learn", "education"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.64988, 50.11825],
|
||||
"type": "Point"
|
||||
},
|
||||
"polygon": {
|
||||
"coordinates": [
|
||||
[
|
||||
[8.650173693895338, 50.11768192973537],
|
||||
[8.649645298719406, 50.1177214866573],
|
||||
[8.649690896272658, 50.11794334878755],
|
||||
[8.649795502424238, 50.11793646935709],
|
||||
[8.649822324514389, 50.11810845482188],
|
||||
[8.64978477358818, 50.118110174673404],
|
||||
[8.649827688932419, 50.11833375484596],
|
||||
[8.650490194559096, 50.11828559920474],
|
||||
[8.650428503751753, 50.11806029895402],
|
||||
[8.65011468529701, 50.11808265704158],
|
||||
[8.650082498788832, 50.11792615020954],
|
||||
[8.650203198194502, 50.117914111201316],
|
||||
[8.650173693895338, 50.11768192973537]
|
||||
]
|
||||
],
|
||||
"type": "Polygon"
|
||||
}
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "706"
|
||||
},
|
||||
"name": "H I (Vorbelegungsrecht Kunstgeschichte)",
|
||||
"type": "room",
|
||||
"uid": "07ccd06f-2f58-52ce-bcdd-2341f79b5893"
|
||||
}
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "date series"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "exercise"
|
||||
}
|
||||
],
|
||||
"field": "event.categories",
|
||||
"onlyOnType": "date series"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "education"
|
||||
},
|
||||
{
|
||||
"count": 1,
|
||||
"key": "learn"
|
||||
}
|
||||
],
|
||||
"field": "inPlace.categories",
|
||||
"onlyOnType": "date series"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 1,
|
||||
"offset": 0,
|
||||
"total": 1
|
||||
},
|
||||
"stats": {
|
||||
"time": 5
|
||||
}
|
||||
}
|
||||
25
frontend/app/cypress/fixtures/schedule/events.multi.req.json
Normal file
25
frontend/app/cypress/fixtures/schedule/events.multi.req.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"*": {
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "date series"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "event.uid"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "academic event"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"*": {
|
||||
"filter": {
|
||||
"arguments": {
|
||||
"filters": [
|
||||
{
|
||||
"arguments": {
|
||||
"field": "type",
|
||||
"value": "date series"
|
||||
},
|
||||
"type": "value"
|
||||
},
|
||||
{
|
||||
"arguments": {
|
||||
"field": "event.uid"
|
||||
},
|
||||
"type": "value"
|
||||
}
|
||||
],
|
||||
"operation": "and"
|
||||
},
|
||||
"type": "boolean"
|
||||
}
|
||||
}
|
||||
}
|
||||
2672
frontend/app/cypress/fixtures/search/generic.search.res.json
Normal file
2672
frontend/app/cypress/fixtures/search/generic.search.res.json
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,70 +0,0 @@
|
||||
{
|
||||
"data": [
|
||||
{
|
||||
"uid": "401169e8-92d8-575b-8fa9-bf49ede63b0e",
|
||||
"level": 0,
|
||||
"academicTerm": {
|
||||
"acronym": "SoSe 2022",
|
||||
"alternateNames": ["Sommer 2022"],
|
||||
"endDate": "2022-09-30T21:59:59.999Z",
|
||||
"eventsEndDate": "2022-07-15T21:59:59.999Z",
|
||||
"eventsStartDate": "2022-04-10T22:00:00.000Z",
|
||||
"name": "Sommersemester 2022",
|
||||
"startDate": "2022-03-31T22:00:00.000Z",
|
||||
"type": "semester",
|
||||
"uid": "4b2766cb-e16d-5698-b5b3-e650613d497a"
|
||||
},
|
||||
"identifiers": {
|
||||
"LSF": "88418"
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2022-06-03T10:08:42.796Z",
|
||||
"name": "Goethe-Uni QIS / LSF",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "FB 1 - Rechtswissenschaft",
|
||||
"description": "Das stets aktuelle Vorlesungsverzeichnis des Fachbereichs Rechtswissenschaft finden Sie hier! Ein Ausdruck mit allen aktuellen Änderungen hängt außerdem vor dem Dekanat des Fachbereichs (1. OG, Gebäude RuW) aus. Nähere Informationen über den Aufbau des Studiums der Rechtswissenschaft erhalten Sie über unsere Studien- und Prüfungsordnung, die Sie im Dekanat bekommen. Das gedruckte VORLESUNGSVERZEICHNIS kann zudem während der Öffnungszeiten im Hörsaalgebäude am Verkaufsstand der Buchhandlung Hector erworben werden.\n\nDas Veranstaltungsangebot orientiert sich am Studienplan des Fachbereichs Rechtswissenschaft. Die Lehrveranstaltungen beginnen in der ersten Vorlesungswoche. Die Pflichtveranstaltungen enden an unserem Fachbereich\neine Woche vor Vorlesungsende\n, anschließend beginnt die zweiwöchige Klausurenphase.\n\nDie wöchentlichen Veranstaltungen im Schwerpunktbereichsstudium enden bereits zwei Wochen vor dem allgemeinen Vorlesungsende der Universität. Anschließend werden Blockveranstaltungen angeboten.\n\nAchtung:\nIm Schwerpunktbereichsstudium dürfen insgesamt nur maximal zwei rechtsmedizinische und arztrechtliche Veranstaltungen des Insituts für Rechtsmedizin zur Erbringung des Pflichtprogramms gem. § 25 Abs. 3 genutzt werden!\n\n\n\n\n \n\nFür Studienanfänger wird eine spezielle dreitägige Orientierungsveranstaltung in der Woche vor Vorlesungsbeginn angeboten; Einzelheiten hierzu werden brieflich mitgeteilt. Für Fragen und Sorgen steht die Studienberatung des Fachbereichs für Studierende aller Semester zur Verfügung und zwar während der Vorlesungszeit Mo, Di, Do, 9.30-11.30 Uhr und Mi, 9.30-11.30 und 13.30-15.30 Uhr in den Räumen des Dekanats, für Berufstätige nach Vereinbarung.\nIn der vorlesungsfreien Zeit ausschließlich Mi 9.30-11.30 Uhr!\n\nDer Fachbereich bietet einen Aufbaustudiengang für im Ausland graduierte Juristinnen und Juristen (LL.M.), einen Aufbaustudiengang \"Europäisches und Internationales Wirtschaftsrecht\" (LL.M. Eur.), einen Weiterbildungsstudiengang \"Law and Finance\" (LL.M. Finance), ein Masterprogramm \"LL.M. Legal Theory\" sowie zusammen mit der Universität Lumière Lyon II das Studienprogramm zum französischen Recht \"Diplôme Universitaire de Droit Français\" (DUDF) an. Veranstaltungen zu den Studiengängen siehe Vorlesungsverzeichnis und Aushänge.",
|
||||
"categories": ["university events"],
|
||||
"type": "catalog"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "catalog"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "SoSe 2022"
|
||||
}
|
||||
],
|
||||
"field": "academicTerm.acronym",
|
||||
"onlyOnType": "catalog"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 1,
|
||||
"key": "university events"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "catalog"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 1,
|
||||
"offset": 0,
|
||||
"total": 1
|
||||
},
|
||||
"stats": {
|
||||
"time": 3
|
||||
}
|
||||
}
|
||||
@@ -1,129 +0,0 @@
|
||||
{
|
||||
"2022-06-08T18:56:17.052Z": {
|
||||
"data": [
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2022-06-08T06:30:00.000Z",
|
||||
"lte": "2022-06-08T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-22:00; Sa-Su off; 2022 Feb 21 - 2022 Apr 08 Mo-Fr 10:00-21:00; 2022 Feb 21 - 2022 Apr 08 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 1.1,
|
||||
"guest": 2.2,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studentenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "b7b50ecd-2c33-5a62-adb0-2a7c6c0ab04c"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "d8a0b68b-4bfc-5780-9d33-a29b2ac0fae2",
|
||||
"nutrition": {
|
||||
"calories": 863,
|
||||
"carbohydrateContent": 103.5,
|
||||
"fatContent": 39,
|
||||
"proteinContent": 33.1,
|
||||
"saltContent": 4.1,
|
||||
"saturatedFatContent": 3.1,
|
||||
"sugarContent": 11.8
|
||||
},
|
||||
"additives": [
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"gluten (A)",
|
||||
"milk (G)",
|
||||
"celery (I)",
|
||||
"sulphur dioxide / sulphite (L)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)",
|
||||
"Schwefeldioxid / Sulfit (L)"
|
||||
],
|
||||
"description": "Pizza Antipasti (2,3,A,G,I,L,A1)",
|
||||
"name": "Pizza Antipasti"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2022-06-08T18:45:04.736Z",
|
||||
"name": "Studentenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Antipasti pizza",
|
||||
"description": "Antipasti pizza (2,3,A,G,I,L,A1)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "dish"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "main dish"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "dish"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "cafe"
|
||||
}
|
||||
],
|
||||
"field": "offers.inPlace.categories",
|
||||
"onlyOnType": "dish"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 1,
|
||||
"offset": 0,
|
||||
"total": 1
|
||||
},
|
||||
"stats": {
|
||||
"time": 8
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,369 +0,0 @@
|
||||
{
|
||||
"2022-06-08T18:56:17.052Z": {
|
||||
"data": [
|
||||
{
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2022-06-08T06:30:00.000Z",
|
||||
"lte": "2022-06-08T20:00:00.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"address": {
|
||||
"addressCountry": "Deutschland",
|
||||
"addressLocality": "Frankfurt am Main",
|
||||
"addressRegion": "Hessen",
|
||||
"postalCode": "60323",
|
||||
"streetAddress": "Kaffeebar Alfredo/Cocktailbar Theodor-W.-Adorno-Platz 2"
|
||||
},
|
||||
"alternateNames": ["Alfredo Anbau Casino"],
|
||||
"categories": ["cafe"],
|
||||
"geo": {
|
||||
"point": {
|
||||
"coordinates": [8.666987121105194, 50.12725203226799],
|
||||
"type": "Point"
|
||||
}
|
||||
},
|
||||
"name": "Alfredo Anbau Casino",
|
||||
"openingHours": "Mo-Fr 08:30-22:00; Sa-Su off; 2022 Feb 21 - 2022 Apr 08 Mo-Fr 10:00-21:00; 2022 Feb 21 - 2022 Apr 08 Sa-Su off",
|
||||
"type": "room",
|
||||
"uid": "86464b64-da1e-5578-a5c4-eec23457f596"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.4,
|
||||
"employee": 1.1,
|
||||
"guest": 2.2,
|
||||
"student": 3.3
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studentenwerk Frankfurt am Main",
|
||||
"type": "organization",
|
||||
"uid": "b7b50ecd-2c33-5a62-adb0-2a7c6c0ab04c"
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "d8a0b68b-4bfc-5780-9d33-a29b2ac0fae2",
|
||||
"nutrition": {
|
||||
"calories": 863,
|
||||
"carbohydrateContent": 103.5,
|
||||
"fatContent": 39,
|
||||
"proteinContent": 33.1,
|
||||
"saltContent": 4.1,
|
||||
"saturatedFatContent": 3.1,
|
||||
"sugarContent": 11.8
|
||||
},
|
||||
"additives": [
|
||||
"preserved (2)",
|
||||
"with antioxidants (3)",
|
||||
"gluten (A)",
|
||||
"milk (G)",
|
||||
"celery (I)",
|
||||
"sulphur dioxide / sulphite (L)"
|
||||
],
|
||||
"translations": {
|
||||
"de": {
|
||||
"additives": [
|
||||
"konserviert (2)",
|
||||
"mit Antioxidationsmittel (3)",
|
||||
"Glutenhaltige Getreide (A)",
|
||||
"Milch u. Milcherzeugnisse (G)",
|
||||
"Sellerie u. Sellerieerzeugnisse (I)",
|
||||
"Schwefeldioxid / Sulfit (L)"
|
||||
],
|
||||
"description": "Pizza Antipasti (2,3,A,G,I,L,A1)",
|
||||
"name": "Pizza Antipasti"
|
||||
}
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2022-06-08T18:45:04.736Z",
|
||||
"name": "Studentenwerk Frankfurt am Main",
|
||||
"type": "remote"
|
||||
},
|
||||
"name": "Antipasti pizza",
|
||||
"description": "Antipasti pizza (2,3,A,G,I,L,A1)",
|
||||
"categories": ["main dish"],
|
||||
"type": "dish"
|
||||
},
|
||||
{
|
||||
"type": "dish",
|
||||
"name": "Pizza mit Geflügelsalami und Champignons",
|
||||
"categories": ["main dish"],
|
||||
"characteristics": [],
|
||||
"additives": [
|
||||
"konserviert",
|
||||
"Antioxidationsmittel",
|
||||
"Farbstoff",
|
||||
"Weizen",
|
||||
"Milch(Laktose; Milcheiweiß)",
|
||||
"Nitritpökelsalz",
|
||||
"Hefe"
|
||||
],
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2017-01-30T00:00:00.000Z",
|
||||
"lte": "2017-01-30T23:59:59.999Z"
|
||||
},
|
||||
"prices": {
|
||||
"default": 4.85,
|
||||
"student": 2.85,
|
||||
"employee": 3.85,
|
||||
"guest": 4.85
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studentenwerk",
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
},
|
||||
"inPlace": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
"coordinates": [13.32612, 52.50978]
|
||||
}
|
||||
},
|
||||
"type": "building",
|
||||
"categories": ["restaurant"],
|
||||
"openingHours": "Mo-Fr 11:00-14:30",
|
||||
"name": "TU-Mensa",
|
||||
"alternateNames": ["MensaHardenberg"],
|
||||
"uid": "72fbc8a3-ebd1-58f9-9526-ad65cba2e402",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
"addressRegion": "Berlin",
|
||||
"postalCode": "10623",
|
||||
"streetAddress": "Hardenbergstraße 34"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"uid": "c9f32915-8ed5-5960-b850-3f7375a89922",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
}
|
||||
},
|
||||
{
|
||||
"type": "dish",
|
||||
"name": "Sahne-Bärlauchsauce",
|
||||
"description": "Nudelauswahl",
|
||||
"categories": ["main dish"],
|
||||
"offers": [
|
||||
{
|
||||
"prices": {
|
||||
"default": 3.45,
|
||||
"student": 2.45,
|
||||
"employee": 3.45
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studentenwerk",
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
},
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2017-01-30T00:00:00.000Z",
|
||||
"lte": "2017-01-30T23:59:59.999Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
"coordinates": [13.32612, 52.50978]
|
||||
}
|
||||
},
|
||||
"type": "building",
|
||||
"categories": ["restaurant"],
|
||||
"openingHours": "Mo-Fr 11:00-14:30",
|
||||
"name": "TU-Mensa",
|
||||
"alternateNames": ["MensaHardenberg"],
|
||||
"uid": "072db1e5-e479-5040-88e0-4a98d731e443",
|
||||
"address": {
|
||||
"addressCountry": "Germany",
|
||||
"addressLocality": "Berlin",
|
||||
"addressRegion": "Berlin",
|
||||
"postalCode": "10623",
|
||||
"streetAddress": "Hardenbergstraße 34"
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"characteristics": [
|
||||
{
|
||||
"name": "bad"
|
||||
},
|
||||
{
|
||||
"name": "vegetarian",
|
||||
"image": "https://backend/res/img/characteristic_small_vegetarian.png"
|
||||
}
|
||||
],
|
||||
"additives": ["Weizen", "Milch(Laktose; Milcheiweiß)"],
|
||||
"uid": "3222631f-82b3-5faf-a8e8-9c10719cc95b",
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
}
|
||||
},
|
||||
{
|
||||
"additives": [
|
||||
"1 = mit Farbstoff",
|
||||
"2 = konserviert",
|
||||
"3 = mit Antioxidationsmittel",
|
||||
"9 = mit Süßungsmittel",
|
||||
"A = Glutenhaltige Getreide",
|
||||
"G = Milch u. Milcherzeugnisse"
|
||||
],
|
||||
"offers": [
|
||||
{
|
||||
"availability": "in stock",
|
||||
"availabilityRange": {
|
||||
"gte": "2017-03-27T00:00:00.000Z",
|
||||
"lte": "2017-03-27T23:59:59.000Z"
|
||||
},
|
||||
"inPlace": {
|
||||
"type": "room",
|
||||
"name": "Cafeteria LEVEL",
|
||||
"categories": ["cafe"],
|
||||
"uid": "e5492c9c-064e-547c-8633-c8fc8955cfcf",
|
||||
"alternateNames": ["Cafeteria LEVEL"],
|
||||
"openingHours": "Mo-Fr 08:30-17:00",
|
||||
"geo": {
|
||||
"point": {
|
||||
"type": "Point",
|
||||
"coordinates": [8.6285375, 50.1743717]
|
||||
}
|
||||
}
|
||||
},
|
||||
"prices": {
|
||||
"default": 6.5,
|
||||
"student": 4.9,
|
||||
"employee": 6.5
|
||||
},
|
||||
"provider": {
|
||||
"name": "Studentenwerk",
|
||||
"type": "organization",
|
||||
"uid": "3b9b3df6-3a7a-58cc-922f-c7335c002634"
|
||||
}
|
||||
}
|
||||
],
|
||||
"categories": ["main dish"],
|
||||
"characteristics": [
|
||||
{
|
||||
"name": "Rind",
|
||||
"image": "https://backend/res/img/characteristic_small_rind.png"
|
||||
}
|
||||
],
|
||||
"description": "Salsa Burger (1,2,3,9,A,G)",
|
||||
"name": "Salsa Burger",
|
||||
"dishAddOns": [
|
||||
{
|
||||
"characteristics": [
|
||||
{
|
||||
"name": "Vegan",
|
||||
"image": "https://backend/res/img/characteristic_small_vegan.png"
|
||||
}
|
||||
],
|
||||
"description": "Pommes frites",
|
||||
"type": "dish",
|
||||
"uid": "db0caac1-062c-5333-9fcb-cfaf0ff7d799",
|
||||
"nutrition": {
|
||||
"calories": 106,
|
||||
"fatContent": 5.4,
|
||||
"saturatedFatContent": 1.8,
|
||||
"carbohydrateContent": 6.8,
|
||||
"sugarContent": 6.1,
|
||||
"proteinContent": 6.9,
|
||||
"saltContent": 3.7
|
||||
},
|
||||
"additives": ["3 = mit Antioxidationsmittel", "5 = geschwefelt"],
|
||||
"name": "Pommes frites",
|
||||
"categories": ["side dish"]
|
||||
},
|
||||
{
|
||||
"characteristics": [
|
||||
{
|
||||
"name": "Vegan",
|
||||
"image": "https://backend/res/img/characteristic_small_vegan.png"
|
||||
}
|
||||
],
|
||||
"description": "Glasierte Karotten",
|
||||
"type": "dish",
|
||||
"uid": "f702fd43-1551-53b2-b35a-b5916e1cf9a1",
|
||||
"nutrition": {
|
||||
"calories": 106,
|
||||
"fatContent": 5.4,
|
||||
"saturatedFatContent": 1.8,
|
||||
"carbohydrateContent": 6.8,
|
||||
"sugarContent": 6.1,
|
||||
"proteinContent": 6.9,
|
||||
"saltContent": 3.7
|
||||
},
|
||||
"additives": ["F = Soja u. Sojaerzeugnisse"],
|
||||
"name": "Glasierte Karotten",
|
||||
"categories": ["side dish", "salad"]
|
||||
}
|
||||
],
|
||||
"type": "dish",
|
||||
"uid": "1c99689c-c6ec-551f-8ad8-f13c5fa812c2",
|
||||
"nutrition": {
|
||||
"calories": 600,
|
||||
"fatContent": 30.5,
|
||||
"saturatedFatContent": 9.9,
|
||||
"carbohydrateContent": 42.2,
|
||||
"sugarContent": 5.7,
|
||||
"proteinContent": 38.6,
|
||||
"saltContent": 3.5
|
||||
},
|
||||
"origin": {
|
||||
"indexed": "2018-09-11T12:30:00Z",
|
||||
"name": "Dummy",
|
||||
"type": "remote"
|
||||
}
|
||||
}
|
||||
],
|
||||
"facets": [
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "dish"
|
||||
}
|
||||
],
|
||||
"field": "type"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "main dish"
|
||||
}
|
||||
],
|
||||
"field": "categories",
|
||||
"onlyOnType": "dish"
|
||||
},
|
||||
{
|
||||
"buckets": [
|
||||
{
|
||||
"count": 10,
|
||||
"key": "cafe"
|
||||
}
|
||||
],
|
||||
"field": "offers.inPlace.categories",
|
||||
"onlyOnType": "dish"
|
||||
}
|
||||
],
|
||||
"pagination": {
|
||||
"count": 1,
|
||||
"offset": 0,
|
||||
"total": 1
|
||||
},
|
||||
"stats": {
|
||||
"time": 8
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,14 +13,24 @@
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
describe('App', () => {
|
||||
beforeEach(() => {
|
||||
cy.interceptSearch({
|
||||
extends: 'news/all',
|
||||
fixture: 'news/all',
|
||||
alias: 'newsSection',
|
||||
});
|
||||
cy.visit('/overview');
|
||||
cy.wait(['@config', '@newsSection']);
|
||||
});
|
||||
|
||||
it('should have a proper title', () => {
|
||||
cy.visit('/');
|
||||
cy.visit('/overview');
|
||||
|
||||
cy.title().should('equal', 'StApps');
|
||||
});
|
||||
|
||||
it('should have a proper working navigation', () => {
|
||||
cy.visit('/');
|
||||
cy.visit('/overview');
|
||||
|
||||
cy.contains('ion-tab-button', 'Mensa').click();
|
||||
cy.get('ion-title').contains('Mensa');
|
||||
|
||||
@@ -14,14 +14,6 @@
|
||||
*/
|
||||
|
||||
describe('assessments', function () {
|
||||
/*it('should have default back navigation', function () {
|
||||
// TODO: Implement this
|
||||
cy.visit(
|
||||
'assessments/detail/02f065a6-6c02-58ab-97d9-a3febdbc91a1?token=mock',
|
||||
);
|
||||
cy.get('ion-back-button').click();
|
||||
});*/
|
||||
|
||||
it('should always have a path', function () {
|
||||
cy.visit('/assessments/detail/02f065a6-6c02-58ab-97d9-a3febdbc91a1?token=mock');
|
||||
|
||||
|
||||
@@ -14,44 +14,49 @@
|
||||
*/
|
||||
|
||||
describe('canteen', function () {
|
||||
const dishUid = '86464b64-da1e-5578-a5c4-eec23457f596';
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/canteen/canteen-1.json',
|
||||
}).as('search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/types/dish/dish-1.json',
|
||||
cy.interceptSearch({
|
||||
extends: 'canteen/all',
|
||||
fixture: 'canteen/all',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'canteen/dishes',
|
||||
fixture: 'canteen/dishes',
|
||||
alias: 'dishes',
|
||||
});
|
||||
cy.interceptGet({
|
||||
uid: dishUid,
|
||||
fixture: 'canteen/canteen',
|
||||
alias: 'detail',
|
||||
});
|
||||
});
|
||||
|
||||
it('should not utilize the default price', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.wait('@detail');
|
||||
cy.contains('4,40 €').should('not.exist');
|
||||
});
|
||||
|
||||
it('should have a student price', function () {
|
||||
cy.visit('/settings');
|
||||
cy.contains('stapps-settings-item', 'Gruppe').find('ion-select').should('be.visible').click();
|
||||
cy.get('ion-popover').contains('ion-item', 'Studierende').click();
|
||||
cy.wait(2000);
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.setSettings({profile: {group: 'student'}});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.wait('@detail');
|
||||
cy.contains('3,30 €').should('exist');
|
||||
});
|
||||
|
||||
it('should have an employee price', function () {
|
||||
cy.visit('/settings');
|
||||
cy.contains('stapps-settings-item', 'Gruppe').find('ion-select').should('be.visible').click();
|
||||
cy.get('ion-popover').contains('ion-item', 'Angestellte').click();
|
||||
cy.wait(2000);
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.contains('1,10 €').should('exist');
|
||||
cy.setSettings({profile: {group: 'employee'}});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.wait('@detail');
|
||||
cy.contains('2,20 €').should('exist');
|
||||
});
|
||||
|
||||
it('should have a guest price', function () {
|
||||
cy.visit('/settings');
|
||||
cy.contains('stapps-settings-item', 'Gruppe').find('ion-select').should('be.visible').click();
|
||||
cy.get('ion-popover').contains('ion-item', 'Gäste').click();
|
||||
cy.wait(2000);
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.contains('2,20 €').should('exist');
|
||||
cy.setSettings({profile: {group: 'guest'}});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.wait('@detail');
|
||||
cy.contains('1,10 €').should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
*/
|
||||
describe('catalog', function () {
|
||||
it('should have path', function () {
|
||||
cy.visit('/data-detail/ae3cf884-4dc4-526b-9213-6850135591ab');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/catalog/catalog-1.json',
|
||||
});
|
||||
cy.interceptGet({uid: 'catalog', fixture: 'catalog/catalog', alias: 'catalog'});
|
||||
cy.interceptSearch({extends: 'catalog/children', fixture: 'catalog/children', alias: 'catalog/children'});
|
||||
cy.visit('/data-detail/catalog');
|
||||
cy.wait('@catalog');
|
||||
|
||||
cy.get('stapps-data-path').within(() => {
|
||||
cy.get('ion-breadcrumb').first().should('contain', 'FB 1 - Rechtswissenschaft');
|
||||
|
||||
@@ -15,14 +15,19 @@
|
||||
|
||||
describe('context menu', function () {
|
||||
beforeEach(function () {
|
||||
cy.visit('/search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/test.json',
|
||||
}).as('search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/multi-result.json',
|
||||
cy.interceptSearch({
|
||||
extends: {query: 'a'},
|
||||
fixture: 'search/generic',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.get('ion-searchbar').type('test');
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'search/event-chips',
|
||||
fixture: 'search/event-chips',
|
||||
alias: 'eventChips',
|
||||
});
|
||||
cy.visit('/search');
|
||||
cy.patchSearchPage();
|
||||
cy.get('ion-searchbar').type('a');
|
||||
cy.wait('@search');
|
||||
cy.get('ion-searchbar > ion-menu-button').click();
|
||||
});
|
||||
@@ -36,14 +41,14 @@ describe('context menu', function () {
|
||||
|
||||
it('should filter', function () {
|
||||
cy.get('stapps-context').within(() => {
|
||||
cy.contains('ion-item', '(27) Akademische Veranstaltung').click();
|
||||
cy.contains('ion-item', '(17) Akademische Veranstaltung').click();
|
||||
cy.wait('@search');
|
||||
});
|
||||
});
|
||||
|
||||
it('should have a working delete button', function () {
|
||||
cy.get('stapps-context').within(() => {
|
||||
cy.contains('ion-item', '(27) Akademische Veranstaltung').click();
|
||||
cy.contains('ion-item', '(17) Akademische Veranstaltung').click();
|
||||
|
||||
cy.get('.checkbox-checked').should('have.length', 1);
|
||||
cy.contains('ion-list-header', 'Filter').find('ion-button').click();
|
||||
@@ -52,14 +57,6 @@ describe('context menu', function () {
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate categories', function () {
|
||||
cy.get('stapps-context').within(() => {
|
||||
cy.contains('ion-item', '(1) Universitätsveranstaltung').should('not.exist');
|
||||
cy.get('.context-filter > ion-button').click();
|
||||
cy.contains('ion-item', '(4) Universitätsveranstaltung').should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
it('should truncate long category items', function () {
|
||||
cy.contains('ion-list', 'Akademische Veranstaltung / Kategorien').within(() => {
|
||||
cy.contains('ion-item', '(1) Tutorium').should('not.exist');
|
||||
|
||||
@@ -12,14 +12,26 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
//import {ScheduleProvider} from '../../src/app/modules/calendar/schedule.provider';
|
||||
import {DashboardComponent} from '../../src/app/modules/dashboard/dashboard.component';
|
||||
|
||||
describe('dashboard', async function () {
|
||||
beforeEach(function () {
|
||||
cy.interceptSearch({
|
||||
extends: 'news/all',
|
||||
fixture: 'news/all',
|
||||
alias: 'newsSection',
|
||||
});
|
||||
cy.interceptSearch({
|
||||
extends: {filter: {type: 'value', arguments: {field: 'type', value: 'job posting'}}},
|
||||
fixture: 'no-results',
|
||||
});
|
||||
|
||||
cy.visit('/overview');
|
||||
cy.wait('@newsSection');
|
||||
});
|
||||
|
||||
describe('schedule section', function () {
|
||||
it('should lead to the week overview', function () {
|
||||
cy.visit('/overview');
|
||||
cy.get('.schedule')
|
||||
.contains('a', /Wochen.*übersicht/)
|
||||
.click();
|
||||
@@ -27,40 +39,29 @@ describe('dashboard', async function () {
|
||||
});
|
||||
|
||||
it('should lead to the calendar', function () {
|
||||
cy.visit('/overview');
|
||||
cy.get('.schedule').contains('a', 'Kein Eintrag gefunden').click();
|
||||
cy.url().should('include', '/schedule/calendar');
|
||||
});
|
||||
|
||||
// TODO: Reenable and stabilize tests
|
||||
//it('should display the next unit', function () {
|
||||
// let angular: any;
|
||||
// cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
// fixture: 'search/types/date-series/date-series-1.json',
|
||||
// }).as('search');
|
||||
// cy.visit('/overview');
|
||||
// cy.get('.schedule-item-button').should('exist');
|
||||
// cy.window()
|
||||
// .then(win => (angular = (win as any).ng))
|
||||
// .then(() =>
|
||||
// cy.get('app-dashboard').then($dashboard => {
|
||||
// const appComponent = angular.getComponent($dashboard[0]);
|
||||
// const scheduleProvider =
|
||||
// appComponent.scheduleProvider as ScheduleProvider;
|
||||
it('should display the next unit', function () {
|
||||
cy.interceptSearch({extends: 'dashboard/next-unit', fixture: 'dashboard/next-unit', alias: 'nextUnit'});
|
||||
|
||||
// scheduleProvider.restore(['abc']);
|
||||
// }),
|
||||
// );
|
||||
// cy.wait('@search');
|
||||
// cy.visit('/overview');
|
||||
// cy.get('.schedule-item-button').should('contain', 'UNIcert (Test)');
|
||||
//});
|
||||
cy.get('.schedule-item-button').should('exist');
|
||||
cy.get('app-dashboard')
|
||||
.component<DashboardComponent>()
|
||||
.its('scheduleProvider')
|
||||
.its('_partialEvents$')
|
||||
.runInsideAngular(events => {
|
||||
events.next([{uid: 'abc'}]);
|
||||
});
|
||||
|
||||
cy.wait('@nextUnit');
|
||||
cy.get('.schedule-item-button').should('contain', 'UNIcert (Test)');
|
||||
});
|
||||
});
|
||||
|
||||
describe('mensa section', function () {
|
||||
it('should have info when nothing is added', function () {
|
||||
cy.visit('/overview');
|
||||
|
||||
cy.get('stapps-mensa-section').within(() => {
|
||||
cy.get('swiper').should('not.exist');
|
||||
cy.get('.nothing-selected > ion-label > a').should('have.text', 'Übersicht der Mensen');
|
||||
@@ -68,28 +69,29 @@ describe('dashboard', async function () {
|
||||
});
|
||||
|
||||
it('should add a mensa', function () {
|
||||
cy.clock(new Date('2022-06-08'), ['Date']);
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'canteen/dishes',
|
||||
fixture: 'canteen/dishes',
|
||||
alias: 'dishes',
|
||||
});
|
||||
cy.interceptSearch({
|
||||
extends: 'canteen/all',
|
||||
fixture: 'canteen/all',
|
||||
alias: 'canteen',
|
||||
});
|
||||
cy.visit('/overview');
|
||||
cy.get('stapps-mensa-section').find('.nothing-selected > ion-label > a').click();
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/canteen/canteen-search-result.json',
|
||||
});
|
||||
|
||||
cy.wait('@canteen');
|
||||
cy.get('stapps-favorite-button').first().click();
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/types/dish/dish-2.json',
|
||||
});
|
||||
|
||||
cy.get('ion-back-button').click();
|
||||
cy.wait('@dishes');
|
||||
cy.get('stapps-mensa-section').find('simple-swiper > *').should('have.length.greaterThan', 1);
|
||||
});
|
||||
});
|
||||
|
||||
describe('news section', function () {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/message/message-1.json',
|
||||
}).as('search');
|
||||
});
|
||||
|
||||
// TODO: Cypress has no real way of setting the presence of a pointing device,
|
||||
// which means the behavior is undefined and depends on the testing device
|
||||
// it('should have desktop navigation buttons', function () {
|
||||
@@ -109,8 +111,6 @@ describe('dashboard', async function () {
|
||||
// });
|
||||
|
||||
it('should have working desktop navigation', function () {
|
||||
cy.visit('/overview');
|
||||
|
||||
cy.get('stapps-news-section').within(function () {
|
||||
cy.get('simple-swiper > *').eq(0).should('be.visible');
|
||||
|
||||
@@ -123,15 +123,10 @@ describe('dashboard', async function () {
|
||||
});
|
||||
|
||||
it('should have a link to the news page', function () {
|
||||
cy.visit('/overview');
|
||||
cy.wait('@search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/message/single-message.json',
|
||||
}).as('search');
|
||||
|
||||
cy.get('stapps-news-section')
|
||||
.contains('ion-item', 'Mehr Nachrichten')
|
||||
.click({scrollBehavior: false, force: true});
|
||||
cy.wait('@newsSection');
|
||||
cy.url().should('include', '/news');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,12 +14,21 @@
|
||||
*/
|
||||
|
||||
describe('favorites', function () {
|
||||
it('should add a favorite', function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/test.json',
|
||||
}).as('search');
|
||||
beforeEach(() => {
|
||||
cy.interceptSearch({
|
||||
extends: {query: 'test'},
|
||||
fixture: 'search/generic',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'search/event-chips',
|
||||
fixture: 'search/event-chips',
|
||||
});
|
||||
});
|
||||
|
||||
it('should add a favorite', function () {
|
||||
cy.visit('/search');
|
||||
cy.patchSearchPage();
|
||||
cy.get('ion-searchbar').type('test');
|
||||
let text!: string;
|
||||
cy.get('stapps-data-list-item')
|
||||
|
||||
@@ -15,16 +15,19 @@
|
||||
|
||||
describe('ical', function () {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/academic-event/event-1.json',
|
||||
}).as('search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/types/date-series/date-series-for-event-1.json',
|
||||
cy.interceptSearch({
|
||||
extends: {query: 'a'},
|
||||
fixture: 'schedule/events',
|
||||
});
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'schedule/events',
|
||||
fixture: 'schedule/events',
|
||||
});
|
||||
});
|
||||
|
||||
it('should export a single event', function () {
|
||||
cy.visit('/search?query=test');
|
||||
cy.visit('/search?query=a');
|
||||
cy.patchSearchPage();
|
||||
cy.wait('@search');
|
||||
cy.contains('ion-chip', 'Termine Auswählen').first().click();
|
||||
|
||||
|
||||
@@ -15,9 +15,16 @@
|
||||
|
||||
describe('news', function () {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/message/message-1.json',
|
||||
}).as('search');
|
||||
cy.interceptSearch({
|
||||
extends: 'news/all',
|
||||
fixture: 'news/all',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.interceptGet({
|
||||
uid: 'message',
|
||||
fixture: 'news/message',
|
||||
alias: 'detail',
|
||||
});
|
||||
});
|
||||
|
||||
it('should show all articles by default', function () {
|
||||
@@ -33,10 +40,8 @@ describe('news', function () {
|
||||
});
|
||||
|
||||
it('should have an external link indicator on detail pages', function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/message/single-message.json',
|
||||
}).as('search');
|
||||
cy.visit('/data-detail/c90c7d30-410f-5aea-a67b-ea1f98929b93');
|
||||
cy.visit('/data-detail/message');
|
||||
cy.wait('@detail');
|
||||
cy.contains('ion-card', 'Ursprünglicher Link').find('ion-icon[name="open_in_browser"]').should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,8 +1,16 @@
|
||||
describe('opening hours', () => {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/canteen/canteen-search-result.json',
|
||||
}).as('search');
|
||||
cy.interceptSearch({
|
||||
extends: 'canteen/all',
|
||||
fixture: 'canteen/all',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'canteen/dishes',
|
||||
fixture: 'canteen/dishes',
|
||||
alias: 'dishes',
|
||||
});
|
||||
cy.clock().invoke('restore');
|
||||
});
|
||||
|
||||
it('should specify relative closing time', () => {
|
||||
|
||||
@@ -13,35 +13,40 @@
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
describe('ratings', function () {
|
||||
const dishUid = '86464b64-da1e-5578-a5c4-eec23457f596';
|
||||
beforeEach(() => {
|
||||
cy.intercept('https://mobile.server.uni-frankfurt.de/rating', {
|
||||
body: {},
|
||||
}).as('rating');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/canteen/canteen-1.json',
|
||||
}).as('search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/types/dish/dish-1.json',
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'canteen/dishes',
|
||||
fixture: 'canteen/dishes',
|
||||
alias: 'dishes',
|
||||
});
|
||||
cy.interceptGet({
|
||||
uid: dishUid,
|
||||
fixture: 'canteen/canteen',
|
||||
alias: 'detail',
|
||||
});
|
||||
});
|
||||
|
||||
it('should open ratings', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.get('.rating-stars').should('not.exist');
|
||||
cy.get('stapps-rating').click({scrollBehavior: 'center'});
|
||||
cy.get('stapps-rating').first().click({scrollBehavior: 'center'});
|
||||
cy.get('.rating-stars').should('exist');
|
||||
});
|
||||
|
||||
it('should submit ratings', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.get('stapps-rating').click({scrollBehavior: 'center'});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.get('stapps-rating').first().click({scrollBehavior: 'center'});
|
||||
cy.get('.rating-stars > ion-icon').first().click({scrollBehavior: 'center'});
|
||||
cy.wait('@rating').its('request.body.rating').should('eq', 5);
|
||||
});
|
||||
|
||||
it('should not be possible to rate twice', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.get('stapps-rating').click({scrollBehavior: 'center'});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.get('stapps-rating').first().click({scrollBehavior: 'center'});
|
||||
cy.get('.rating-stars > ion-icon').first().click({scrollBehavior: 'center'});
|
||||
cy.wait('@rating');
|
||||
cy.get('stapps-rating ion-button').should('have.class', 'button-disabled');
|
||||
@@ -50,16 +55,16 @@ describe('ratings', function () {
|
||||
});
|
||||
|
||||
it('should display a thank you message', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.get('stapps-rating').click({scrollBehavior: 'center'});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.get('stapps-rating').first().click({scrollBehavior: 'center'});
|
||||
cy.get('.rating-stars > ion-icon').first().click({scrollBehavior: 'center'});
|
||||
cy.wait('@rating');
|
||||
cy.get('.thank-you').should('be.visible');
|
||||
});
|
||||
|
||||
it('should be dismissible', function () {
|
||||
cy.visit('/data-detail/86464b64-da1e-5578-a5c4-eec23457f596');
|
||||
cy.get('stapps-rating').click({scrollBehavior: 'center'});
|
||||
cy.visit(`/data-detail/${dishUid}`);
|
||||
cy.get('stapps-rating').first().click({scrollBehavior: 'center'});
|
||||
cy.get('.rating-stars').should('be.visible');
|
||||
cy.get('body').click(0, 0);
|
||||
cy.get('.rating-stars').should('not.exist');
|
||||
|
||||
@@ -15,11 +15,20 @@
|
||||
|
||||
describe('schedule', function () {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/types/academic-event/event-1.json',
|
||||
}).as('search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/types/date-series/date-series-for-event-1.json',
|
||||
cy.interceptSearch({
|
||||
extends: {query: 'a'},
|
||||
fixture: 'schedule/events',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'schedule/events',
|
||||
fixture: 'schedule/events',
|
||||
alias: 'chips',
|
||||
});
|
||||
cy.interceptSearch({
|
||||
extends: 'schedule/date-series',
|
||||
fixture: 'schedule/date-series',
|
||||
alias: 'dateSeries',
|
||||
});
|
||||
});
|
||||
|
||||
@@ -34,15 +43,15 @@ describe('schedule', function () {
|
||||
cy.get('.swiper-slide-active').should('contain', 'Mi');
|
||||
|
||||
cy.get('.left-button').click();
|
||||
cy.wait(2000);
|
||||
cy.get('.schedule-wrapper .swiper').its('0.swiper.animating').should('eq', false);
|
||||
cy.get('.swiper-slide-active').should('contain', 'So');
|
||||
|
||||
cy.get('.right-button').click();
|
||||
cy.wait(2000);
|
||||
cy.get('.schedule-wrapper .swiper').its('0.swiper.animating').should('eq', false);
|
||||
cy.get('.swiper-slide-active').should('contain', 'Mi');
|
||||
|
||||
cy.get('.right-button').click();
|
||||
cy.wait(2000);
|
||||
cy.get('.schedule-wrapper .swiper').its('0.swiper.animating').should('eq', false);
|
||||
cy.get('.swiper-slide-active').should('contain', 'Sa');
|
||||
});
|
||||
|
||||
@@ -67,48 +76,44 @@ describe('schedule', function () {
|
||||
it('should navigate to a specific date', function () {
|
||||
cy.visit('/schedule/calendar/2059-01-19');
|
||||
cy.contains('#date-select-button0', '19.01.59').click();
|
||||
cy.wait(2000);
|
||||
|
||||
cy.get('ion-datetime').should('be.visible').and('have.class', 'datetime-ready');
|
||||
cy.get('input.aux-input').should('have.attr', 'value', '2059-01-19');
|
||||
cy.get('.calendar-header', {includeShadowDom: true}).should('contain', 'January 2059');
|
||||
|
||||
cy.get('button[data-day=1][data-month=1][data-year=2059]', {
|
||||
includeShadowDom: true,
|
||||
}).click();
|
||||
cy.wait(2000);
|
||||
cy.contains('#date-select-button0', '01.01.59').click();
|
||||
|
||||
cy.get('input.aux-input').should('have.attr', 'value', '2059-01-01');
|
||||
cy.get('ion-datetime').should('not.exist');
|
||||
cy.get('#date-select-button0').should('contain', '01.01.59');
|
||||
});
|
||||
|
||||
// TODO: Reenable and stabilize tests
|
||||
//it('should add events', function () {
|
||||
// cy.visit('/schedule/calendar/2059-01-19');
|
||||
// cy.get('stapps-schedule-card').should('not.exist');
|
||||
it('should add events', function () {
|
||||
cy.visit('/schedule/calendar/2059-01-19');
|
||||
cy.get('stapps-schedule-card').should('not.exist');
|
||||
|
||||
// cy.get('ion-fab-button').click();
|
||||
// cy.wait(2000);
|
||||
// cy.get('ion-modal').within(() => {
|
||||
// cy.get('ion-searchbar').click().type('test');
|
||||
// cy.contains('ion-item', 'UNIcert (Test)')
|
||||
// .contains('stapps-add-event-action-chip', 'Termine Auswählen')
|
||||
// .click();
|
||||
// cy.wait(2000);
|
||||
// });
|
||||
cy.get('ion-fab-button').click();
|
||||
|
||||
// cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
// fixture: 'search/types/date-series/date-series-1.json',
|
||||
// });
|
||||
cy.patchSearchPage();
|
||||
cy.get('ion-searchbar').click().type('a');
|
||||
cy.wait('@search');
|
||||
cy.wait('@chips');
|
||||
cy.wait(200);
|
||||
cy.contains('ion-item', 'UNIcert (Test)')
|
||||
.contains('stapps-add-event-action-chip', 'Termine Auswählen')
|
||||
.click();
|
||||
|
||||
// cy.get('ion-app > ion-modal').within(() => {
|
||||
// cy.contains('ion-item', /eine Stunde um 19. Jan. 2059, \d+:00/).click();
|
||||
// cy.wait(2000);
|
||||
// cy.contains('ion-button', 'Bestätigen').click();
|
||||
// cy.wait(2000);
|
||||
// });
|
||||
cy.contains('ion-item', /19\. Januar 2059, \d+:00 - \d+:00/).click();
|
||||
cy.contains('ion-button', 'Bestätigen').click();
|
||||
|
||||
// cy.get('ion-modal').within(() => {
|
||||
// cy.contains('ion-item', 'UNIcert (Test)')
|
||||
// .contains('stapps-add-event-action-chip', 'Hinzugefügt')
|
||||
// .should('exist');
|
||||
// cy.contains('ion-button', 'Schließen').click();
|
||||
// cy.wait(2000);
|
||||
// });
|
||||
cy.wait('@dateSeries');
|
||||
cy.contains('ion-item', 'UNIcert (Test)')
|
||||
.contains('stapps-add-event-action-chip', 'Hinzugefügt')
|
||||
.should('exist');
|
||||
cy.get('ion-back-button').last().click();
|
||||
|
||||
// cy.get('stapps-schedule-card').should('exist');
|
||||
//});
|
||||
cy.get('stapps-schedule-card').should('exist');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2022 StApps
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -15,34 +15,41 @@
|
||||
|
||||
describe('search', function () {
|
||||
beforeEach(function () {
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/test.json',
|
||||
cy.interceptSearch({
|
||||
extends: {query: 'test'},
|
||||
fixture: 'search/generic',
|
||||
alias: 'search',
|
||||
});
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search/multi', {
|
||||
fixture: 'search/multi-result.json',
|
||||
cy.interceptMultiSearch({
|
||||
extends: 'search/event-chips',
|
||||
fixture: 'search/event-chips',
|
||||
alias: 'eventChips',
|
||||
});
|
||||
cy.visit('/search');
|
||||
cy.patchSearchPage();
|
||||
});
|
||||
|
||||
it('should have search results', function () {
|
||||
cy.visit('/search');
|
||||
cy.get('ion-searchbar').type('test');
|
||||
cy.wait('@search');
|
||||
cy.get('stapps-data-list-item').should('have.length.greaterThan', 1);
|
||||
});
|
||||
|
||||
it('should display an error message when no results are found', function () {
|
||||
cy.visit('/search');
|
||||
cy.intercept('POST', 'https://mobile.server.uni-frankfurt.de/search', {
|
||||
fixture: 'search/no-results.json',
|
||||
const query = 'a';
|
||||
cy.interceptSearch({
|
||||
extends: {query},
|
||||
});
|
||||
cy.get('ion-searchbar').type(Array.from({length: 10}, () => 'a').join(''));
|
||||
cy.get('ion-searchbar').type(query);
|
||||
cy.wait('@search');
|
||||
cy.get('stapps-data-list-item').should('have.length', 0);
|
||||
cy.get('stapps-data-list').contains('Keine Ergebnisse');
|
||||
});
|
||||
|
||||
it('should have a working clear button', function () {
|
||||
cy.visit('/search');
|
||||
cy.get('ion-searchbar').type('test');
|
||||
cy.get('ion-searchbar').should('have.value', 'test');
|
||||
cy.wait('@search');
|
||||
cy.get('stapps-data-list-item').should('have.length.greaterThan', 1);
|
||||
cy.get('.searchbar-clear-button').click();
|
||||
cy.get('ion-searchbar').should('have.value', '');
|
||||
|
||||
@@ -1,43 +1,86 @@
|
||||
// ***********************************************
|
||||
// This example namespace declaration will help
|
||||
// with Intellisense and code completion in your
|
||||
// IDE or Text Editor.
|
||||
// ***********************************************
|
||||
// declare namespace Cypress {
|
||||
// interface Chainable<Subject = any> {
|
||||
// customCommand(param: any): typeof customCommand;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// function customCommand(param: any): void {
|
||||
// console.warn(param);
|
||||
// }
|
||||
//
|
||||
// NOTE: You can use it like so:
|
||||
// Cypress.Commands.add('customCommand', customCommand);
|
||||
//
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add("login", (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
|
||||
/*
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/* eslint-disable @typescript-eslint/no-namespace,@typescript-eslint/no-explicit-any */
|
||||
import type {Component} from '@angular/core';
|
||||
import {
|
||||
interceptBackend,
|
||||
interceptConfig,
|
||||
interceptGet,
|
||||
interceptMultiSearch,
|
||||
interceptSearch,
|
||||
} from './commands/backend';
|
||||
import {component, ng, runInsideAngular, zone} from './commands/angular';
|
||||
import {
|
||||
clearAllSettings,
|
||||
getAllSettings,
|
||||
getSetting,
|
||||
setLocalConfig,
|
||||
setSettings,
|
||||
storage,
|
||||
} from './commands/settings';
|
||||
import {patchSearchPage} from './commands/patches';
|
||||
|
||||
const commands = {
|
||||
interceptConfig,
|
||||
interceptBackend,
|
||||
interceptSearch,
|
||||
interceptMultiSearch,
|
||||
interceptGet,
|
||||
storage,
|
||||
setLocalConfig,
|
||||
setSettings,
|
||||
getSetting,
|
||||
clearAllSettings,
|
||||
getAllSettings,
|
||||
patchSearchPage,
|
||||
ng,
|
||||
zone,
|
||||
};
|
||||
|
||||
const childCommands = {
|
||||
component,
|
||||
runInsideAngular,
|
||||
};
|
||||
|
||||
Cypress.Commands.addAll(commands);
|
||||
Cypress.Commands.addAll({prevSubject: true}, childCommands);
|
||||
|
||||
declare global {
|
||||
// eslint-disable-next-line @typescript-eslint/no-namespace
|
||||
namespace Cypress {
|
||||
// items that include generics also have to be defined here separately
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
||||
interface Chainable extends CustomCommands, CustomChildCommands {
|
||||
component<T = Component>(): Cypress.Chainable<T>;
|
||||
|
||||
runInsideAngular<T = any, U = void>(zoneAwareTask: (subject: T) => U): Cypress.Chainable<U>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
type CustomCommands = {
|
||||
[KEY in keyof typeof commands]: (
|
||||
...parameters: Parameters<(typeof commands)[KEY]>
|
||||
) => ChainableReturnType<(typeof commands)[KEY]>;
|
||||
};
|
||||
type OmitFirstArgument<F> = F extends (x: any, ...arguments_: infer P) => infer R
|
||||
? (...arguments_: P) => R
|
||||
: never;
|
||||
type CustomChildCommands = {
|
||||
[KEY in keyof typeof childCommands]: OmitFirstArgument<(typeof childCommands)[KEY]>;
|
||||
};
|
||||
type ChainableReturnType<T extends (...arguments_: any) => any> = ReturnType<T> extends Cypress.Chainable
|
||||
? ReturnType<T>
|
||||
: Cypress.Chainable<null>;
|
||||
|
||||
44
frontend/app/cypress/support/commands/angular.ts
Normal file
44
frontend/app/cypress/support/commands/angular.ts
Normal file
@@ -0,0 +1,44 @@
|
||||
/*
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import type {Component, NgZone} from '@angular/core';
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function ng(): Cypress.Chainable<any> {
|
||||
return cy.window().its('ng');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the Angular zone (Change Detection!)
|
||||
*/
|
||||
export function zone(): Cypress.Chainable<NgZone> {
|
||||
return cy.get('app-root').component().its('zone');
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a callback inside Angular so change detection can happen
|
||||
*/
|
||||
export function runInsideAngular<T, U>(subject: T, zoneAwareTask: (subject: T) => U): Cypress.Chainable<U> {
|
||||
return cy.zone().then(zone => cy.wrap(zone.run(zoneAwareTask, undefined, [subject])));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function component<T = Component>($element: Cypress.JQueryWithSelector): Cypress.Chainable<T> {
|
||||
return cy.ng().then(ng => ng.getComponent($element[0]));
|
||||
}
|
||||
102
frontend/app/cypress/support/commands/backend.ts
Normal file
102
frontend/app/cypress/support/commands/backend.ts
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
||||
import equal from 'fast-deep-equal';
|
||||
import {extendsDeepEqual} from '@openstapps/collection-utils';
|
||||
import {SCSearchRequest, SCSearchResponse} from '@openstapps/core';
|
||||
|
||||
type InterceptArguments = {
|
||||
fixture?: string | SCSearchResponse | ((request: SCSearchRequest) => SCSearchResponse);
|
||||
alias?: string;
|
||||
} & (
|
||||
| {
|
||||
exact: string | SCSearchRequest | ((searchRequest: SCSearchRequest) => boolean);
|
||||
}
|
||||
| {
|
||||
extends: string | SCSearchRequest;
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function interceptConfig(config?: string) {
|
||||
cy.intercept({url: '/', method: 'POST'}, {fixture: config || 'config/default-config.json'}).as('config');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function interceptBackend(route: string, fixtureKey: string, parameters: InterceptArguments) {
|
||||
const condition = 'exact' in parameters ? parameters.exact : parameters.extends;
|
||||
parameters.fixture ||= 'no-results';
|
||||
|
||||
Cypress.Promise.all([
|
||||
typeof condition === 'string' ? cy.fixture(`${condition}.${fixtureKey}.req.json`) : condition,
|
||||
typeof parameters.fixture === 'string'
|
||||
? cy.fixture(`${parameters.fixture}.${fixtureKey}.res.json`)
|
||||
: parameters.fixture,
|
||||
'exact' in parameters ? equal : extendsDeepEqual,
|
||||
] as const).spread((requestCondition, response, comparisonFunction) => {
|
||||
cy.intercept({url: route, method: 'POST'}, request => {
|
||||
const body = request.body;
|
||||
|
||||
if (
|
||||
typeof requestCondition === 'object'
|
||||
? (comparisonFunction as any)(requestCondition, body)
|
||||
: (requestCondition as any)(body)
|
||||
) {
|
||||
request.alias = parameters.alias;
|
||||
|
||||
request.reply(typeof response === 'object' ? response : (response as any)(body));
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function interceptSearch(parameters: InterceptArguments) {
|
||||
parameters.alias ||= 'search';
|
||||
cy.interceptBackend('/search', 'search', parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function interceptMultiSearch(parameters: InterceptArguments) {
|
||||
parameters.alias ||= 'multi-search';
|
||||
cy.interceptBackend('/search/multi', 'multi', parameters);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function interceptGet(parameters: Omit<InterceptArguments, 'exact' | 'extends'> & {uid: string}) {
|
||||
cy.interceptBackend('/search', 'get', {
|
||||
exact: request => {
|
||||
return (
|
||||
request.size === 1 &&
|
||||
request.filter?.type === 'value' &&
|
||||
request.filter.arguments.field === 'uid' &&
|
||||
request.filter.arguments.value === parameters.uid
|
||||
);
|
||||
},
|
||||
fixture: parameters.fixture || `get/${parameters.uid}`,
|
||||
alias: parameters.alias || parameters.uid,
|
||||
});
|
||||
}
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (C) 2021 StApps
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
@@ -12,23 +12,18 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import {Injectable, Pipe, PipeTransform} from '@angular/core';
|
||||
import type {SearchPageComponent} from '../../../src/app/modules/data/list/search-page.component';
|
||||
|
||||
/**
|
||||
* Get the last value of an array
|
||||
* Sets the due time to zero, higher values can lead to issues in cypress
|
||||
*/
|
||||
@Injectable()
|
||||
@Pipe({
|
||||
name: 'nullishCoalesce',
|
||||
pure: true,
|
||||
})
|
||||
export class NullishCoalescingPipe implements PipeTransform {
|
||||
/**
|
||||
* Transform
|
||||
*/
|
||||
// tslint:disable-next-line:prefer-function-over-method
|
||||
transform<T, G>(value: T, fallback: G): T | G {
|
||||
return value ?? fallback;
|
||||
}
|
||||
export function patchSearchPage(dueTime = 0) {
|
||||
return cy
|
||||
.get('stapps-search-page')
|
||||
.component<SearchPageComponent>()
|
||||
.then(component => {
|
||||
component.searchQueryDueTime = dueTime;
|
||||
// component.ngOnDestroy();
|
||||
component.ngOnInit();
|
||||
});
|
||||
}
|
||||
63
frontend/app/cypress/support/commands/settings.ts
Normal file
63
frontend/app/cypress/support/commands/settings.ts
Normal file
@@ -0,0 +1,63 @@
|
||||
/*
|
||||
* Copyright (C) 2023 StApps
|
||||
* This program is free software: you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the Free
|
||||
* Software Foundation, version 3.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import {STORAGE_KEY_SETTING_VALUES} from '../../../src/app/modules/settings/settings.provider';
|
||||
import {Storage} from '@ionic/storage-angular';
|
||||
import deepmerge from 'deepmerge';
|
||||
import {STORAGE_KEY_CONFIG} from '../../../src/app/modules/config/config.provider';
|
||||
import {SCIndexResponse} from '@openstapps/core';
|
||||
|
||||
export function storage(): Cypress.Chainable<Storage> {
|
||||
const storage = new Storage({});
|
||||
return cy.wrap(storage.create());
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes settings
|
||||
*/
|
||||
export function setSettings(settings: Record<string, Record<string, string>>) {
|
||||
return cy.storage().then(async storage => {
|
||||
const currentSettings = (await storage.get(STORAGE_KEY_SETTING_VALUES)) || {};
|
||||
console.log(deepmerge(currentSettings, settings));
|
||||
await storage.set(STORAGE_KEY_SETTING_VALUES, deepmerge(currentSettings, settings));
|
||||
});
|
||||
}
|
||||
|
||||
export function getAllSettings(): Cypress.Chainable<Record<string, Record<string, string>> | undefined> {
|
||||
return cy.storage().invoke('get', STORAGE_KEY_SETTING_VALUES);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reads settings
|
||||
*/
|
||||
export function getSetting(group: string, key: string): Cypress.Chainable<string | undefined> {
|
||||
return cy.storage().then(async storage => {
|
||||
const currentSettings = await storage.get(STORAGE_KEY_SETTING_VALUES);
|
||||
return currentSettings?.[group]?.[key];
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function clearAllSettings() {
|
||||
return cy.storage().invoke('clear');
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
export function setLocalConfig(config: SCIndexResponse | any) {
|
||||
cy.storage().invoke('set', STORAGE_KEY_CONFIG, config);
|
||||
}
|
||||
@@ -12,38 +12,20 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// When a command from ./commands is ready to use, import with `import './commands'` syntax
|
||||
// import './commands';
|
||||
// JIT compiler for dependency mocking
|
||||
import '@angular/compiler';
|
||||
import './commands';
|
||||
|
||||
beforeEach(function () {
|
||||
cy.wrap(
|
||||
new Promise(resolve => {
|
||||
window.indexedDB.deleteDatabase('_ionicstorage').onsuccess = resolve;
|
||||
}),
|
||||
);
|
||||
cy.clearAllSettings();
|
||||
cy.setLocalConfig({});
|
||||
cy.getAllSettings().should('be.empty');
|
||||
cy.setSettings({profile: {language: 'de'}});
|
||||
cy.interceptConfig();
|
||||
cy.clock(new Date('2020-01-01T12:00:00.000Z'), ['Date']);
|
||||
});
|
||||
|
||||
Cypress.on('window:before:load', window => {
|
||||
// Fake that user is using its browser in German
|
||||
Object.defineProperty(window.navigator, 'language', {value: 'de-DE'});
|
||||
Object.defineProperty(window.navigator, 'languages', [{value: 'de-DE'}]);
|
||||
|
||||
cy.spy(window.console, 'error').as('consoleError');
|
||||
});
|
||||
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
|
||||
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
|
||||
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
|
||||
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
|
||||
88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C462D51B10BE605A8502F2C /* Pods_App.framework */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
/* Begin PBXFileReference section */
|
||||
@@ -27,10 +27,10 @@
|
||||
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
|
||||
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
|
||||
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
|
||||
7C462D51B10BE605A8502F2C /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||
E2D249FB277CB255005492AC /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = "<group>"; };
|
||||
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
|
||||
EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
|
||||
/* Begin PBXFrameworksBuildPhase section */
|
||||
@@ -38,28 +38,20 @@
|
||||
isa = PBXFrameworksBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */,
|
||||
88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
/* End PBXFrameworksBuildPhase section */
|
||||
|
||||
/* Begin PBXGroup section */
|
||||
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
504EC2FB1FED79650016851F = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
504EC3061FED79650016851F /* App */,
|
||||
504EC3051FED79650016851F /* Products */,
|
||||
7F8756D8B27F46E3366F6CEA /* Pods */,
|
||||
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */,
|
||||
93DA7B5AF35933F9EF51EE34 /* Pods */,
|
||||
819423158BC1FAAD85B02762 /* Frameworks */,
|
||||
);
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
@@ -87,13 +79,22 @@
|
||||
path = App;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
7F8756D8B27F46E3366F6CEA /* Pods */ = {
|
||||
819423158BC1FAAD85B02762 /* Frameworks */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */,
|
||||
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */,
|
||||
7C462D51B10BE605A8502F2C /* Pods_App.framework */,
|
||||
);
|
||||
name = Frameworks;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
93DA7B5AF35933F9EF51EE34 /* Pods */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */,
|
||||
EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */,
|
||||
);
|
||||
name = Pods;
|
||||
path = Pods;
|
||||
sourceTree = "<group>";
|
||||
};
|
||||
/* End PBXGroup section */
|
||||
@@ -103,11 +104,11 @@
|
||||
isa = PBXNativeTarget;
|
||||
buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */;
|
||||
buildPhases = (
|
||||
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */,
|
||||
947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */,
|
||||
504EC3001FED79650016851F /* Sources */,
|
||||
504EC3011FED79650016851F /* Frameworks */,
|
||||
504EC3021FED79650016851F /* Resources */,
|
||||
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */,
|
||||
F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */,
|
||||
);
|
||||
buildRules = (
|
||||
);
|
||||
@@ -169,16 +170,20 @@
|
||||
/* End PBXResourcesBuildPhase section */
|
||||
|
||||
/* Begin PBXShellScriptBuildPhase section */
|
||||
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = {
|
||||
947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
);
|
||||
inputFileListPaths = (
|
||||
);
|
||||
inputPaths = (
|
||||
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
|
||||
"${PODS_ROOT}/Manifest.lock",
|
||||
);
|
||||
name = "[CP] Check Pods Manifest.lock";
|
||||
outputFileListPaths = (
|
||||
);
|
||||
outputPaths = (
|
||||
"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
|
||||
);
|
||||
@@ -187,7 +192,7 @@
|
||||
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
|
||||
showEnvVarsInLog = 0;
|
||||
};
|
||||
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = {
|
||||
F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */ = {
|
||||
isa = PBXShellScriptBuildPhase;
|
||||
buildActionMask = 2147483647;
|
||||
files = (
|
||||
@@ -344,7 +349,7 @@
|
||||
};
|
||||
504EC3171FED79650016851F /* Debug */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */;
|
||||
baseConfigurationReference = EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
|
||||
@@ -366,7 +371,7 @@
|
||||
};
|
||||
504EC3181FED79650016851F /* Release */ = {
|
||||
isa = XCBuildConfiguration;
|
||||
baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */;
|
||||
baseConfigurationReference = EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */;
|
||||
buildSettings = {
|
||||
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
|
||||
CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
|
||||
|
||||
@@ -26,7 +26,7 @@ def capacitor_pods
|
||||
pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/share'
|
||||
pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/splash-screen'
|
||||
pod 'TransistorsoftCapacitorBackgroundFetch', :path => '../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@1.0.2_@capacitor+core@5.5.0/node_modules/@transistorsoft/capacitor-background-fetch'
|
||||
pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.8.1_@capacitor+core@5.5.0/node_modules/capacitor-secure-storage-plugin'
|
||||
pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.9.0_@capacitor+core@5.5.0/node_modules/capacitor-secure-storage-plugin'
|
||||
pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'
|
||||
end
|
||||
|
||||
|
||||
131
frontend/app/ios/App/Podfile.lock
Normal file
131
frontend/app/ios/App/Podfile.lock
Normal file
@@ -0,0 +1,131 @@
|
||||
PODS:
|
||||
- Capacitor (5.5.0):
|
||||
- CapacitorCordova
|
||||
- CapacitorApp (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorBrowser (5.1.0):
|
||||
- Capacitor
|
||||
- CapacitorClipboard (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorCordova (5.5.0)
|
||||
- CapacitorDevice (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorDialog (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorFilesystem (5.1.4):
|
||||
- Capacitor
|
||||
- CapacitorGeolocation (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorHaptics (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorKeyboard (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorLocalNotifications (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorNetwork (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorPreferences (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorSecureStoragePlugin (0.9.0):
|
||||
- Capacitor
|
||||
- SwiftKeychainWrapper
|
||||
- CapacitorShare (5.0.6):
|
||||
- Capacitor
|
||||
- CapacitorSplashScreen (5.0.6):
|
||||
- Capacitor
|
||||
- CordovaPlugins (5.5.0):
|
||||
- CapacitorCordova
|
||||
- SwiftKeychainWrapper (4.0.1)
|
||||
- TransistorsoftCapacitorBackgroundFetch (1.0.2):
|
||||
- Capacitor
|
||||
|
||||
DEPENDENCIES:
|
||||
- "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@5.5.0_@capacitor+core@5.5.0/node_modules/@capacitor/ios`)"
|
||||
- "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/app`)"
|
||||
- "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@5.1.0_@capacitor+core@5.5.0/node_modules/@capacitor/browser`)"
|
||||
- "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/clipboard`)"
|
||||
- "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@5.5.0_@capacitor+core@5.5.0/node_modules/@capacitor/ios`)"
|
||||
- "CapacitorDevice (from `../../../../node_modules/.pnpm/@capacitor+device@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/device`)"
|
||||
- "CapacitorDialog (from `../../../../node_modules/.pnpm/@capacitor+dialog@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/dialog`)"
|
||||
- "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@5.1.4_@capacitor+core@5.5.0/node_modules/@capacitor/filesystem`)"
|
||||
- "CapacitorGeolocation (from `../../../../node_modules/.pnpm/@capacitor+geolocation@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/geolocation`)"
|
||||
- "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/haptics`)"
|
||||
- "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/keyboard`)"
|
||||
- "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/local-notifications`)"
|
||||
- "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/network`)"
|
||||
- "CapacitorPreferences (from `../../../../node_modules/.pnpm/@capacitor+preferences@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/preferences`)"
|
||||
- "CapacitorSecureStoragePlugin (from `../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.9.0_@capacitor+core@5.5.0/node_modules/capacitor-secure-storage-plugin`)"
|
||||
- "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/share`)"
|
||||
- "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/splash-screen`)"
|
||||
- CordovaPlugins (from `../capacitor-cordova-ios-plugins`)
|
||||
- "TransistorsoftCapacitorBackgroundFetch (from `../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@1.0.2_@capacitor+core@5.5.0/node_modules/@transistorsoft/capacitor-background-fetch`)"
|
||||
|
||||
SPEC REPOS:
|
||||
trunk:
|
||||
- SwiftKeychainWrapper
|
||||
|
||||
EXTERNAL SOURCES:
|
||||
Capacitor:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+ios@5.5.0_@capacitor+core@5.5.0/node_modules/@capacitor/ios"
|
||||
CapacitorApp:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+app@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/app"
|
||||
CapacitorBrowser:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+browser@5.1.0_@capacitor+core@5.5.0/node_modules/@capacitor/browser"
|
||||
CapacitorClipboard:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+clipboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/clipboard"
|
||||
CapacitorCordova:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+ios@5.5.0_@capacitor+core@5.5.0/node_modules/@capacitor/ios"
|
||||
CapacitorDevice:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+device@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/device"
|
||||
CapacitorDialog:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+dialog@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/dialog"
|
||||
CapacitorFilesystem:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+filesystem@5.1.4_@capacitor+core@5.5.0/node_modules/@capacitor/filesystem"
|
||||
CapacitorGeolocation:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+geolocation@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/geolocation"
|
||||
CapacitorHaptics:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+haptics@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/haptics"
|
||||
CapacitorKeyboard:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+keyboard@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/keyboard"
|
||||
CapacitorLocalNotifications:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/local-notifications"
|
||||
CapacitorNetwork:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+network@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/network"
|
||||
CapacitorPreferences:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+preferences@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/preferences"
|
||||
CapacitorSecureStoragePlugin:
|
||||
:path: "../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.9.0_@capacitor+core@5.5.0/node_modules/capacitor-secure-storage-plugin"
|
||||
CapacitorShare:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+share@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/share"
|
||||
CapacitorSplashScreen:
|
||||
:path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@5.0.6_@capacitor+core@5.5.0/node_modules/@capacitor/splash-screen"
|
||||
CordovaPlugins:
|
||||
:path: "../capacitor-cordova-ios-plugins"
|
||||
TransistorsoftCapacitorBackgroundFetch:
|
||||
:path: "../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@1.0.2_@capacitor+core@5.5.0/node_modules/@transistorsoft/capacitor-background-fetch"
|
||||
|
||||
SPEC CHECKSUMS:
|
||||
Capacitor: 57890b363df14d5d2d5d8461aa23e886cb34da2a
|
||||
CapacitorApp: 024e1b1bea5f883d79f6330d309bc441c88ad04a
|
||||
CapacitorBrowser: 7a0fb6a1011abfaaf2dfedfd8248f942a8eda3d6
|
||||
CapacitorClipboard: 77edf49827ea21da2a9c05c690a4a6a4d07199c4
|
||||
CapacitorCordova: 3d3908a3d208a11a75f9df3b18c4405c4de76e1d
|
||||
CapacitorDevice: 2c968f98a1ec4d22357418c1521e7ddc46c675e6
|
||||
CapacitorDialog: 0f3c15dfe9414b83bc64aef4078f1b92bcfead26
|
||||
CapacitorFilesystem: af704badfbc69f6f8623d9ed313e5490e3723dcb
|
||||
CapacitorGeolocation: 7be5f77abc205c0efe319fff8587a7183e7b0240
|
||||
CapacitorHaptics: 1fffc1217c7e64a472d7845be50fb0c2f7d4204c
|
||||
CapacitorKeyboard: b978154b024a5f65e044908e37d15b7de58b9d12
|
||||
CapacitorLocalNotifications: c2d8b14794064fd4814b1d6c4ddbac8029afa295
|
||||
CapacitorNetwork: d80b3e79bef6ec37640ee2806c19771f07ff2d0c
|
||||
CapacitorPreferences: f03954bcb0ff09c792909e46bff88e3183c16b10
|
||||
CapacitorSecureStoragePlugin: e91d7df060f2495a1acff9583641a6953e3aacba
|
||||
CapacitorShare: cd41743331cb71d217c029de54b681cbd91e0fcc
|
||||
CapacitorSplashScreen: 5fa2ab5e46cf5cc530cf16a51c80c7a986579ccd
|
||||
CordovaPlugins: de5669381702d76ed5b1d442177a6a5fc3252a9d
|
||||
SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c
|
||||
TransistorsoftCapacitorBackgroundFetch: 74ca62dae7ec78639eaf3d0d1e24c595ada213dd
|
||||
|
||||
PODFILE CHECKSUM: 073b899f90bacc5049101cb9c562a168757d554e
|
||||
|
||||
COCOAPODS: 1.13.0
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "@openstapps/app",
|
||||
"description": "The generic app tailored to fulfill needs of German universities, written using Ionic Framework.",
|
||||
"version": "3.1.0",
|
||||
"version": "3.1.1",
|
||||
"private": true,
|
||||
"license": "GPL-3.0-only",
|
||||
"author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>",
|
||||
@@ -15,7 +15,7 @@
|
||||
],
|
||||
"scripts": {
|
||||
"analyze": "webpack-bundle-analyzer www/stats.json",
|
||||
"build": "pnpm check-icons && ng build --configuration=production --stats-json && webpack-bundle-analyzer www/stats.json --mode static --report www/bundle-info.html",
|
||||
"build": "pnpm check-icons && ng build --configuration=production --stats-json && webpack-bundle-analyzer www/stats.json --mode static --report www/bundle-info.html --no-open",
|
||||
"build:analyze": "npm run build:stats && npm run analyze",
|
||||
"build:android": "ionic capacitor build android --no-open && cd android && ./gradlew clean assemble && cd ..",
|
||||
"build:prod": "ng build --configuration=production",
|
||||
@@ -42,7 +42,7 @@
|
||||
"postinstall": "jetify && echo \"skipping jetify in production mode\"",
|
||||
"preview": "http-server www --p 8101 -o",
|
||||
"push": "git push && git push origin \"v$npm_package_version\"",
|
||||
"resources:ios": "capacitor-assets generate --ios --iconBackgroundColor $(grep -oP \"(?<=@include ion-color\\(primary, )#[a-fA-F0-9]{3,6}\" src/theme/colors.scss) --splashBackgroundColor $(grep -oP \"(?<=@include ion-color\\(primary, )#[a-fA-F0-9]{3,6}\" src/theme/colors.scss)",
|
||||
"resources:ios": "capacitor-assets generate --ios --iconBackgroundColor $(grep -oE \"^@include ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\") --splashBackgroundColor $(grep -oE \"^@include ion-color\\(primary, #[a-fA-F0-9]{3,6}\" src/theme/colors.scss | grep -oE \"#[a-fA-F0-9]{3,6}\")",
|
||||
"run:android": "ionic capacitor run android --livereload --external",
|
||||
"start": "ionic serve",
|
||||
"start:external": "ionic serve --external",
|
||||
@@ -87,7 +87,7 @@
|
||||
"@openstapps/api": "workspace:*",
|
||||
"@openstapps/collection-utils": "workspace:*",
|
||||
"@openstapps/core": "workspace:*",
|
||||
"@transistorsoft/capacitor-background-fetch": "1.0.2",
|
||||
"@transistorsoft/capacitor-background-fetch": "5.1.1",
|
||||
"@types/dom-view-transitions": "1.0.1",
|
||||
"capacitor-secure-storage-plugin": "0.9.0",
|
||||
"cordova-plugin-calendar": "5.1.6",
|
||||
@@ -106,8 +106,8 @@
|
||||
"ngx-markdown": "16.0.0",
|
||||
"ngx-moment": "6.0.2",
|
||||
"opening_hours": "3.8.0",
|
||||
"prettier": "2.8.6",
|
||||
"rxjs": "7.8.1",
|
||||
"semver": "7.5.4",
|
||||
"swiper": "8.4.5",
|
||||
"tslib": "2.4.1",
|
||||
"zone.js": "0.13.1"
|
||||
@@ -149,6 +149,7 @@
|
||||
"@types/leaflet": "1.9.0",
|
||||
"@types/leaflet.markercluster": "1.5.1",
|
||||
"@types/node": "18.15.3",
|
||||
"@types/semver": "7.5.6",
|
||||
"@typescript-eslint/eslint-plugin": "5.60.1",
|
||||
"@typescript-eslint/parser": "5.60.1",
|
||||
"cordova-res": "0.15.4",
|
||||
@@ -157,6 +158,7 @@
|
||||
"eslint-plugin-jsdoc": "46.4.2",
|
||||
"eslint-plugin-prettier": "4.2.1",
|
||||
"eslint-plugin-unicorn": "47.0.0",
|
||||
"fast-deep-equal": "3.1.3",
|
||||
"fontkit": "2.0.2",
|
||||
"glob": "10.2.7",
|
||||
"http-server": "14.1.1",
|
||||
|
||||
@@ -12,9 +12,11 @@
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
import prettierConfig from '@openstapps/prettier-config';
|
||||
|
||||
module.exports = {
|
||||
...require('@openstapps/prettier-config'),
|
||||
/** @type {import('prettier').Config} */
|
||||
const config = {
|
||||
...prettierConfig,
|
||||
overrides: [
|
||||
{
|
||||
files: 'src/**/*.html',
|
||||
@@ -25,3 +27,5 @@ module.exports = {
|
||||
],
|
||||
ignorePath: ['.prettierignore', '../../.gitignore'],
|
||||
};
|
||||
|
||||
export default config;
|
||||
@@ -49,7 +49,10 @@ export class SharedAxisChoreographer<T> {
|
||||
*/
|
||||
currentValue: T;
|
||||
|
||||
constructor(initialValue: T, readonly pages?: T[]) {
|
||||
constructor(
|
||||
initialValue: T,
|
||||
readonly pages?: T[],
|
||||
) {
|
||||
this.currentValue = initialValue;
|
||||
this.expectedValue = initialValue;
|
||||
}
|
||||
|
||||
@@ -75,10 +75,10 @@ export class AppComponent implements AfterContentInit {
|
||||
});
|
||||
|
||||
if (document.readyState === 'complete') {
|
||||
requestIdleCallback(this.hideSplash.bind(this));
|
||||
this.hideSplash();
|
||||
} else {
|
||||
document.addEventListener('readystatechange', () => {
|
||||
if (document.readyState === 'complete') requestIdleCallback(this.hideSplash.bind(this));
|
||||
if (document.readyState === 'complete') this.hideSplash();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
<ion-card-header>
|
||||
<ion-card-title>
|
||||
{{ license.name }}
|
||||
<ion-icon size="16" weight="300" class="supertext-icon" name="open_in_browser"></ion-icon>
|
||||
<ion-icon [size]="16" [weight]="300" class="supertext-icon" name="open_in_browser"></ion-icon>
|
||||
</ion-card-title>
|
||||
|
||||
<ion-card-subtitle *ngIf="license.authors || license.publisher">
|
||||
|
||||
@@ -13,31 +13,29 @@
|
||||
~ this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
-->
|
||||
|
||||
<div [ngSwitch]="content.type">
|
||||
<markdown [data]="'value' | translateSimple : content" *ngSwitchCase="'markdown'"></markdown>
|
||||
<div *ngSwitchCase="'section'">
|
||||
<ion-card *ngIf="content.card; else noCard">
|
||||
<ion-card-header>
|
||||
<ion-card-title>{{ 'title' | translateSimple : content }}</ion-card-title>
|
||||
</ion-card-header>
|
||||
<ion-card-content>
|
||||
<about-page-content [content]="content.content"></about-page-content>
|
||||
</ion-card-content>
|
||||
</ion-card>
|
||||
<ng-template #noCard>
|
||||
<h2>{{ 'title' | translateSimple : content }}</h2>
|
||||
<markdown *ngIf="content.type === 'markdown'" [data]="'value' | translateSimple : content"></markdown>
|
||||
<div *ngIf="content.type ==='section'">
|
||||
<ion-card *ngIf="content.card; else noCard">
|
||||
<ion-card-header>
|
||||
<ion-card-title>{{ 'title' | translateSimple : content }}</ion-card-title>
|
||||
</ion-card-header>
|
||||
<ion-card-content>
|
||||
<about-page-content [content]="content.content"></about-page-content>
|
||||
</ng-template>
|
||||
</div>
|
||||
<ion-grid *ngSwitchCase="'table'">
|
||||
<ion-row *ngFor="let row of content.rows">
|
||||
<ion-col *ngFor="let col of row">
|
||||
<about-page-content [content]="col"></about-page-content>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
</ion-grid>
|
||||
<ion-item *ngSwitchCase="'router link'" [routerLink]="content.link">
|
||||
<ion-icon *ngIf="content.icon" [name]="content.icon" slot="start"></ion-icon>
|
||||
<ion-label>{{ 'title' | translateSimple : content }}</ion-label>
|
||||
</ion-item>
|
||||
</ion-card-content>
|
||||
</ion-card>
|
||||
<ng-template #noCard>
|
||||
<h2>{{ 'title' | translateSimple : content }}</h2>
|
||||
<about-page-content [content]="content.content"></about-page-content>
|
||||
</ng-template>
|
||||
</div>
|
||||
<ion-grid *ngIf="content.type === 'table'">
|
||||
<ion-row *ngFor="let row of content.rows">
|
||||
<ion-col *ngFor="let col of row">
|
||||
<about-page-content [content]="col"></about-page-content>
|
||||
</ion-col>
|
||||
</ion-row>
|
||||
</ion-grid>
|
||||
<ion-item *ngIf="content.type === 'router link'" [routerLink]="content.link">
|
||||
<ion-icon *ngIf="content.icon" [name]="content.icon" slot="start"></ion-icon>
|
||||
<ion-label>{{ 'title' | translateSimple : content }}</ion-label>
|
||||
</ion-item>
|
||||
|
||||
@@ -35,7 +35,10 @@ export class AboutPageComponent implements OnInit {
|
||||
|
||||
version: string;
|
||||
|
||||
constructor(private readonly route: ActivatedRoute, private readonly configProvider: ConfigProvider) {}
|
||||
constructor(
|
||||
private readonly route: ActivatedRoute,
|
||||
private readonly configProvider: ConfigProvider,
|
||||
) {}
|
||||
|
||||
async ngOnInit() {
|
||||
const route = this.route.snapshot.url.map(it => it.path).join('/');
|
||||
|
||||
@@ -6,6 +6,7 @@ import {Capacitor} from '@capacitor/core';
|
||||
import {ReleaseNotesComponent} from './release-notes.component';
|
||||
import {SCAppVersionInfo} from '@openstapps/core';
|
||||
import {App} from '@capacitor/app';
|
||||
import {coerce} from 'semver';
|
||||
|
||||
export const RELEASE_NOTES_SHOWN_KEY = 'release_notes_shown';
|
||||
|
||||
@@ -17,14 +18,6 @@ export class AppVersionService {
|
||||
private modalController: ModalController,
|
||||
) {}
|
||||
|
||||
/**
|
||||
* Get the release notes of the latest published version
|
||||
*/
|
||||
get publishedVersions() {
|
||||
const platform = Capacitor.getPlatform() as 'android' | 'ios' | 'web';
|
||||
return this.config.config.app.versionHistory?.filter(({published}) => published[platform] !== undefined);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the latest release notes that have not been presented yet
|
||||
*/
|
||||
@@ -32,29 +25,38 @@ export class AppVersionService {
|
||||
if (Capacitor.getPlatform() === 'web') {
|
||||
return;
|
||||
}
|
||||
const storedVersion = (await this.storage.has(RELEASE_NOTES_SHOWN_KEY))
|
||||
? await this.storage.get<string>(RELEASE_NOTES_SHOWN_KEY)
|
||||
: '';
|
||||
const currentVersion = await App.getInfo().then(info => info.version);
|
||||
return this.publishedVersions?.find(({version}) => {
|
||||
const wasNotShown = version.localeCompare(storedVersion, undefined, {numeric: true}) === 1;
|
||||
const isNotFutureVersion = version.localeCompare(currentVersion, undefined, {numeric: true}) <= 0;
|
||||
return wasNotShown && isNotFutureVersion;
|
||||
});
|
||||
const storedVersion = coerce(
|
||||
(await this.storage.has(RELEASE_NOTES_SHOWN_KEY))
|
||||
? await this.storage.get<string>(RELEASE_NOTES_SHOWN_KEY)
|
||||
: '0.0.0',
|
||||
)!;
|
||||
const currentVersion = coerce(await App.getInfo().then(info => info.version))!;
|
||||
|
||||
return this.config.config.app.versionHistory
|
||||
?.filter(({version}) => {
|
||||
const semanticVersion = coerce(version)!;
|
||||
const wasNotShown = semanticVersion.compare(storedVersion) === 1;
|
||||
const isNotFutureVersion = semanticVersion.compare(currentVersion) <= 0;
|
||||
return wasNotShown && isNotFutureVersion;
|
||||
})
|
||||
?.sort((a, b) => coerce(a.version)!.compare(b.version));
|
||||
}
|
||||
|
||||
/**
|
||||
* Present release notes
|
||||
*/
|
||||
async presentReleaseNotes(version: SCAppVersionInfo) {
|
||||
async presentReleaseNotes(versions: SCAppVersionInfo[]) {
|
||||
if (!versions || versions.length === 0) {
|
||||
return;
|
||||
}
|
||||
const modal = await this.modalController.create({
|
||||
component: ReleaseNotesComponent,
|
||||
componentProps: {
|
||||
versionInfo: version,
|
||||
versionInfos: versions,
|
||||
},
|
||||
});
|
||||
await modal.present();
|
||||
await modal.onDidDismiss();
|
||||
await this.storage.put(RELEASE_NOTES_SHOWN_KEY, version.version);
|
||||
await this.storage.put(RELEASE_NOTES_SHOWN_KEY, versions[0].version);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import {ThingTranslateModule} from '../../translation/thing-translate.module';
|
||||
import {IonicModule, ModalController} from '@ionic/angular';
|
||||
import {TranslateModule} from '@ngx-translate/core';
|
||||
import {UtilModule} from '../../util/util.module';
|
||||
import {CommonModule} from '@angular/common';
|
||||
|
||||
@Component({
|
||||
selector: 'stapps-release-notes',
|
||||
@@ -12,10 +13,10 @@ import {UtilModule} from '../../util/util.module';
|
||||
styleUrls: ['release-notes.scss'],
|
||||
standalone: true,
|
||||
changeDetection: ChangeDetectionStrategy.OnPush,
|
||||
imports: [UtilModule, MarkdownModule, ThingTranslateModule, IonicModule, TranslateModule],
|
||||
imports: [UtilModule, MarkdownModule, ThingTranslateModule, IonicModule, TranslateModule, CommonModule],
|
||||
})
|
||||
export class ReleaseNotesComponent {
|
||||
@Input() versionInfo: SCAppVersionInfo;
|
||||
@Input() versionInfos: SCAppVersionInfo[];
|
||||
|
||||
constructor(readonly modalController: ModalController) {}
|
||||
}
|
||||
|
||||
@@ -9,8 +9,10 @@
|
||||
</ion-toolbar>
|
||||
</ion-header>
|
||||
<ion-content parallax>
|
||||
<markdown
|
||||
class="content-card ion-padding"
|
||||
[data]="'releaseNotes' | translateSimple: versionInfo"
|
||||
></markdown>
|
||||
<ng-container *ngFor="let versionInfo of versionInfos">
|
||||
<markdown
|
||||
class="content-card ion-padding"
|
||||
[data]="'releaseNotes' | translateSimple: versionInfo"
|
||||
></markdown>
|
||||
</ng-container>
|
||||
</ion-content>
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
#segment
|
||||
[scrollable]="true"
|
||||
mode="md"
|
||||
(ionChange)="sharedAxisChoreographer.changeViewForState(segment.value)"
|
||||
(ionChange)="sharedAxisChoreographer.changeViewForState($any(segment.value))"
|
||||
value=""
|
||||
>
|
||||
<ion-segment-button *ngFor="let key of assessmentKeys" [value]="key">
|
||||
|
||||
@@ -22,7 +22,7 @@ import {SCAssessment, SCCourseOfStudyWithoutReferences} from '@openstapps/core';
|
||||
styleUrls: ['course-of-study-assessment.scss'],
|
||||
})
|
||||
export class CourseOfStudyAssessmentComponent {
|
||||
@Input() courseOfStudy: SCCourseOfStudyWithoutReferences | null;
|
||||
@Input() courseOfStudy?: SCCourseOfStudyWithoutReferences | null;
|
||||
|
||||
_assessments: Promise<SCAssessment[]>;
|
||||
|
||||
|
||||
@@ -22,7 +22,10 @@ import {AuthHelperService} from './auth-helper.service';
|
||||
providedIn: 'root',
|
||||
})
|
||||
export class AuthGuardService implements CanActivate {
|
||||
constructor(private authHelper: AuthHelperService, private router: Router) {}
|
||||
constructor(
|
||||
private authHelper: AuthHelperService,
|
||||
private router: Router,
|
||||
) {}
|
||||
|
||||
public async canActivate(route: ActivatedProtectedRouteSnapshot, _state: RouterStateSnapshot) {
|
||||
if (route.queryParamMap.get('token')) {
|
||||
|
||||
@@ -89,7 +89,11 @@ export class ScheduleSyncService {
|
||||
async taskId => {
|
||||
await Promise.all([this.postDifferencesNotification(), this.syncNativeCalendar()]);
|
||||
|
||||
await BackgroundFetch.finish(taskId);
|
||||
BackgroundFetch.finish(taskId);
|
||||
},
|
||||
async taskId => {
|
||||
console.log('[BackgroundFetch] TIMEOUT:', taskId);
|
||||
BackgroundFetch.finish(taskId);
|
||||
},
|
||||
);
|
||||
|
||||
@@ -134,9 +138,9 @@ export class ScheduleSyncService {
|
||||
private formatChanges(changes: ChangesOf<SCDateSeries, DateSeriesRelevantData>): string[] {
|
||||
return changes.changes.map(
|
||||
change =>
|
||||
`${
|
||||
this.translator.translator.translatedPropertyNames<SCDateSeries>(SCThingType.DateSeries)?.[change]
|
||||
}: ${formatRelevantKeys[change](
|
||||
`${this.translator.translator.translatedPropertyNames<SCDateSeries>(SCThingType.DateSeries)?.[
|
||||
change
|
||||
]}: ${formatRelevantKeys[change](
|
||||
changes.new[change] as never,
|
||||
this.dateFormatPipe,
|
||||
this.durationFormatPipe,
|
||||
|
||||
@@ -132,7 +132,6 @@ export class AddEventReviewModalComponent implements OnInit {
|
||||
),
|
||||
});
|
||||
}
|
||||
console.log((navigator as unknown as NewShareNavigator).canShare(shareData));
|
||||
|
||||
if (!(navigator as unknown as NewShareNavigator).canShare(shareData)) {
|
||||
return Dialog.alert({
|
||||
|
||||
@@ -38,7 +38,10 @@ export class CalendarService {
|
||||
calendarName = 'StApps';
|
||||
|
||||
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
||||
constructor(readonly calendar: Calendar, private readonly configProvider: ConfigProvider) {
|
||||
constructor(
|
||||
readonly calendar: Calendar,
|
||||
private readonly configProvider: ConfigProvider,
|
||||
) {
|
||||
this.calendarName = (this.configProvider.getValue('name') as string) ?? 'StApps';
|
||||
}
|
||||
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
<ion-item *ngFor="let catalog of catalogs" button="true" lines="inset" (click)="notifySelect(catalog)">
|
||||
<ion-label>
|
||||
<h2>{{ catalog.name }}</h2>
|
||||
<h3>{{ catalog.acronym }}</h3>
|
||||
</ion-label>
|
||||
</ion-item>
|
||||
</ion-list>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
</ion-header>
|
||||
<div #schedule class="schedule">
|
||||
<a [routerLink]="['/schedule/week-overview']">
|
||||
<ion-icon size="36" weight="300" name="calendar_month"></ion-icon>
|
||||
<ion-icon [size]="36" [weight]="300" name="calendar_month"></ion-icon>
|
||||
<ion-label [innerHTML]="'schedule.recurring' | translate"></ion-label>
|
||||
</a>
|
||||
<!-- Avoid structural directives here, they might interfere with the collapse animation -->
|
||||
@@ -33,7 +33,7 @@
|
||||
<ion-label>
|
||||
{{
|
||||
nextEvent
|
||||
? (nextEvent!.dates | nextDateInList | amDateFormat : 'll, HH:mm')
|
||||
? (nextEvent!.dates | nextDateInList | amDateFormat: 'll, HH:mm')
|
||||
: ('dashboard.schedule.noEvent' | translate)
|
||||
}}
|
||||
</ion-label>
|
||||
|
||||
@@ -15,13 +15,13 @@
|
||||
|
||||
<stapps-section [title]="'dashboard.favorites.title' | translate">
|
||||
<ion-button slot="button-end" fill="clear" color="medium" [routerLink]="['/favorites']">
|
||||
<ion-icon slot="icon-only" name="search" size="24"></ion-icon>
|
||||
<ion-icon slot="icon-only" name="search" [size]="24"></ion-icon>
|
||||
</ion-button>
|
||||
<simple-swiper *ngIf="items | async as items; else noItems" @fade>
|
||||
<stapps-data-list-item
|
||||
*ngFor="let item of items"
|
||||
[hideThumbnail]="true"
|
||||
[favoriteButton]="false"
|
||||
[listItemEndInteraction]="false"
|
||||
[item]="item"
|
||||
appearance="square"
|
||||
></stapps-data-list-item>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user