Compare commits

..

2 Commits

Author SHA1 Message Date
Jovan Krunić
be98df0bad fix: use modal instead of menu inside of a split pane
Closes #234
2025-07-04 17:05:24 +00:00
Jovan Krunić
533c3cbcb3 fix: use modal instead of menu inside of a split pane
Closes #234
2025-07-04 19:02:47 +02:00
108 changed files with 3294 additions and 4851 deletions

View File

@@ -1,8 +0,0 @@
---
"@openstapps/projectmanagement": patch
"@openstapps/core-tools": patch
"@openstapps/easy-ast": patch
"@openstapps/app": patch
---
Updated node-glob dependency

7
.vscode/launch.json vendored
View File

@@ -4,13 +4,6 @@
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0", "version": "0.2.0",
"configurations": [ "configurations": [
{
"name": "Launch Chrome",
"request": "launch",
"type": "chrome",
"url": "http://localhost:8100",
"webRoot": "${workspaceFolder}/frontend/app/www"
},
{ {
"type":"node", "type":"node",
"request": "launch", "request": "launch",

View File

@@ -1,31 +1,5 @@
# @openstapps/backend # @openstapps/backend
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/logger@4.0.2
## 4.0.2
### Patch Changes
- 6b06de40: Updated nodemailer dependency
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -112,7 +112,7 @@ const menus = [
icon: 'school', icon: 'school',
items: [ items: [
{ {
icon: 'star', icon: 'grade',
route: '/favorites', route: '/favorites',
title: 'favorites', title: 'favorites',
translations: { translations: {

View File

@@ -5,8 +5,8 @@ const userGroupSetting = {
categories: ['profile'], categories: ['profile'],
defaultValue: 'students', defaultValue: 'students',
description: description:
'The user group the app is going to use primarily.' + 'The user group the app is going to be used.' +
' This settings for example is getting used for the predefined price category of mensa meals.', 'This settings for example is getting used for the predefined price category of mensa meals.',
inputType: SCSettingInputType.SingleChoice, inputType: SCSettingInputType.SingleChoice,
name: 'group', name: 'group',
order: 1, order: 1,
@@ -25,7 +25,7 @@ const userGroupSetting = {
}, },
en: { en: {
description: description:
'The user group the app is going to use primarily.' + 'The user group the app is going to be used.' +
' This settings for example is getting used for the predefined price category of mensa meals.', ' This settings for example is getting used for the predefined price category of mensa meals.',
name: 'Group', name: 'Group',
values: ['students', 'employees', 'guests'], values: ['students', 'employees', 'guests'],

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/backend", "name": "@openstapps/backend",
"description": "A reference implementation for a StApps backend", "description": "A reference implementation for a StApps backend",
"version": "4.0.3", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
@@ -43,11 +43,11 @@
"test:unit": "cross-env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true STAPPS_LOG_LEVEL=0 mocha --exit" "test:unit": "cross-env NODE_CONFIG_ENV=elasticsearch ALLOW_NO_TRANSPORT=true STAPPS_LOG_LEVEL=0 mocha --exit"
}, },
"dependencies": { "dependencies": {
"@elastic/elasticsearch": "8.14.1", "@elastic/elasticsearch": "8.4.0",
"@openstapps/core": "workspace:*", "@openstapps/core": "workspace:*",
"@openstapps/core-tools": "workspace:*", "@openstapps/core-tools": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"@types/body-parser": "1.19.6", "@types/body-parser": "1.19.2",
"@types/cors": "2.8.13", "@types/cors": "2.8.13",
"@types/express": "4.17.17", "@types/express": "4.17.17",
"@types/geojson": "1.0.6", "@types/geojson": "1.0.6",
@@ -56,20 +56,20 @@
"@types/nodemailer": "6.4.7", "@types/nodemailer": "6.4.7",
"@types/promise-queue": "2.2.0", "@types/promise-queue": "2.2.0",
"@types/uuid": "8.3.4", "@types/uuid": "8.3.4",
"body-parser": "1.20.3", "body-parser": "1.20.2",
"cors": "2.8.5", "cors": "2.8.5",
"cosmiconfig": "8.1.3", "cosmiconfig": "8.1.3",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"express": "4.21.2", "express": "4.18.2",
"express-prom-bundle": "6.6.0", "express-prom-bundle": "6.6.0",
"express-promise-router": "4.1.1", "express-promise-router": "4.1.1",
"got": "12.6.0", "got": "12.6.0",
"moment": "2.30.1", "moment": "2.30.1",
"morgan": "1.10.1", "morgan": "1.10.0",
"nock": "13.3.1", "nock": "13.3.1",
"node-cache": "5.1.2", "node-cache": "5.1.2",
"node-cron": "3.0.2", "node-cron": "3.0.2",
"nodemailer": "6.9.9", "nodemailer": "6.9.1",
"prom-client": "14.1.1", "prom-client": "14.1.1",
"promise-queue": "2.2.5", "promise-queue": "2.2.5",
"uuid": "8.3.2" "uuid": "8.3.2"
@@ -83,7 +83,7 @@
"@types/chai": "4.3.20", "@types/chai": "4.3.20",
"@types/chai-as-promised": "7.1.8", "@types/chai-as-promised": "7.1.8",
"@types/mocha": "10.0.10", "@types/mocha": "10.0.10",
"@types/morgan": "1.9.10", "@types/morgan": "1.9.4",
"@types/sinon": "10.0.14", "@types/sinon": "10.0.14",
"@types/sinon-express-mock": "1.3.9", "@types/sinon-express-mock": "1.3.9",
"@types/supertest": "2.0.12", "@types/supertest": "2.0.12",

View File

@@ -1,11 +1,5 @@
# @openstapps/database # @openstapps/database
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,4 +1,4 @@
FROM elasticsearch:8.14.3 FROM elasticsearch:8.4.2
EXPOSE 9200 EXPOSE 9200
EXPOSE 9300 EXPOSE 9300

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openstapps/database", "name": "@openstapps/database",
"version": "4.0.1", "version": "4.0.0",
"private": true, "private": true,
"files": [ "files": [
"config", "config",

View File

@@ -1,12 +1,5 @@
# @openstapps/proxy # @openstapps/proxy
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/proxy", "name": "@openstapps/proxy",
"description": "NGINX proxy that is dynamically configured by a Node.js script", "description": "NGINX proxy that is dynamically configured by a Node.js script",
"version": "4.0.2", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",

View File

@@ -1,11 +1,5 @@
# @openstapps/backend-config # @openstapps/backend-config
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/backend-config", "name": "@openstapps/backend-config",
"description": "Backend Configuration for OpenStApps", "description": "Backend Configuration for OpenStApps",
"version": "4.0.3", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -10,7 +10,7 @@
<group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/> <group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/>
<group title="campus map" title.de="Campus Karte" icon="map" route="/map"/> <group title="campus map" title.de="Campus Karte" icon="map" route="/map"/>
<group title="my app" title.de="Meine App" icon="school" route="/profile"> <group title="my app" title.de="Meine App" icon="school" route="/profile">
<item title="favorites" title.de="Favoriten" icon="star" route="/favorites"/> <item title="favorites" title.de="Favoriten" icon="grade" route="/favorites"/>
<item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/> <item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/>
<item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/> <item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/>
<item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/> <item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/>

View File

@@ -10,7 +10,7 @@
<group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/> <group title="canteen" title.de="Mensa" icon="local_cafe" route="/canteen"/>
<group title="campus map" title.de="Campus Karte" icon="map" route="/map"/> <group title="campus map" title.de="Campus Karte" icon="map" route="/map"/>
<group title="my app" title.de="Meine App" icon="school" route="/profile"> <group title="my app" title.de="Meine App" icon="school" route="/profile">
<item title="favorites" title.de="Favoriten" icon="star" route="/favorites"/> <item title="favorites" title.de="Favoriten" icon="grade" route="/favorites"/>
<item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/> <item title="schedule" title.de="Stundenplan" icon="calendar_today" route="/schedule"/>
<item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/> <item title="library account" title.de="Bibliothekskonto" icon="badge" route="/library-account" authProvider="paia"/>
<item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/> <item title="settings" title.de="Einstellungen" icon="settings" route="/settings"/>

View File

@@ -1,11 +1,5 @@
# @openstapps/eslint-config # @openstapps/eslint-config
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/eslint-config", "name": "@openstapps/eslint-config",
"description": "A collection of configuration base files for StApps projects. Just an (unused) experiment for now.", "description": "A collection of configuration base files for StApps projects. Just an (unused) experiment for now.",
"version": "4.0.3", "version": "4.0.0",
"type": "commonjs", "type": "commonjs",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/eslint-config.git", "repository": "git@gitlab.com:openstapps/eslint-config.git",
@@ -22,8 +22,8 @@
"typescript": "5.4.2" "typescript": "5.4.2"
}, },
"peerDependencies": { "peerDependencies": {
"@typescript-eslint/eslint-plugin": "7.11.0", "@typescript-eslint/eslint-plugin": "7.2.0",
"@typescript-eslint/parser": "7.11.0", "@typescript-eslint/parser": "7.2.0",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-config-prettier": "9.1.0", "eslint-config-prettier": "9.1.0",
"eslint-plugin-jsdoc": "48.2.1", "eslint-plugin-jsdoc": "48.2.1",

View File

@@ -1,19 +1,5 @@
# @openstapps/projectmanagement # @openstapps/projectmanagement
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/gitlab-api@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/projectmanagement", "name": "@openstapps/projectmanagement",
"description": "Main documentation and scripts for maintenance.", "description": "Main documentation and scripts for maintenance.",
"version": "4.0.2", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -41,9 +41,10 @@
"@openstapps/collection-utils": "workspace:*", "@openstapps/collection-utils": "workspace:*",
"@openstapps/gitlab-api": "workspace:*", "@openstapps/gitlab-api": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"@slack/web-api": "6.8.1",
"commander": "10.0.0", "commander": "10.0.0",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"glob": "10.5.0", "glob": "10.3.10",
"mustache": "4.2.0" "mustache": "4.2.0"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -22,6 +22,7 @@ import {
User, User,
} from '@openstapps/gitlab-api'; } from '@openstapps/gitlab-api';
import {Logger} from '@openstapps/logger'; import {Logger} from '@openstapps/logger';
import {WebClient} from '@slack/web-api';
import {CONCURRENCY, GROUPS, MAX_DEPTH_FOR_REMINDER, NOTE_PREFIX, SLACK_CHANNEL} from '../configuration.js'; import {CONCURRENCY, GROUPS, MAX_DEPTH_FOR_REMINDER, NOTE_PREFIX, SLACK_CHANNEL} from '../configuration.js';
import {mapAsyncLimit} from '@openstapps/collection-utils'; import {mapAsyncLimit} from '@openstapps/collection-utils';
@@ -52,7 +53,8 @@ export async function remind(api: Api): Promise<void> {
Logger.info(`Found ${mergeRequests.length} open merge requests.`); Logger.info(`Found ${mergeRequests.length} open merge requests.`);
// instantiate slack client // instantiate slack client
const client = undefined; const client =
process.env.SLACK_API_TOKEN === undefined ? undefined : new WebClient(process.env.SLACK_API_TOKEN);
// get members of the main group // get members of the main group
const members = await api.getMembers(MembershipScope.GROUPS, GROUPS[0]); const members = await api.getMembers(MembershipScope.GROUPS, GROUPS[0]);

View File

@@ -1,22 +1,5 @@
# @openstapps/minimal-connector # @openstapps/minimal-connector
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/api@4.0.2
## 4.0.1
### Patch Changes
- Updated dependencies [b40ba7ad]
- @openstapps/api@4.0.1
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/minimal-connector", "name": "@openstapps/minimal-connector",
"description": "This is a minimal connector which serves as an example", "description": "This is a minimal connector which serves as an example",
"version": "4.0.2", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -1,11 +1,5 @@
# @openstapps/minimal-deployment # @openstapps/minimal-deployment
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,21 +1,23 @@
version: '3.7'
x-development-variables: &development-variables x-development-variables: &development-variables
NODE_ENV: "development" NODE_ENV: "development"
ALLOW_NO_TRANSPORT: "true" ALLOW_NO_TRANSPORT: "true"
services: services:
database: database:
image: registry.gitlab.com/openstapps/openstapps/database:4.0.1 image: registry.gitlab.com/openstapps/openstapps/database:3.0.0
# If you need persistence for debugging purposes uncomment the following lines # If you need persistence for debugging purposes uncomment the following lines
# volumes: #volumes:
# - ./database:/usr/share/elasticsearch/data # - ./database:/usr/share/elasticsearch/data
expose: expose:
- 9200 - 9200
ports: ports:
- 127.0.0.1:9200:9200 - 127.0.0.1:9200:9200
environment: environment:
# - bootstrap.memory_lock=true - bootstrap.memory_lock=true
# - discovery.type=single-node - "ES_JAVA_OPTS=-Xms2g -Xmx2g"
- "ES_JAVA_OPTS=-Xms4g -Xmx4g" - discovery.type=single-node
ulimits: ulimits:
memlock: memlock:
soft: -1 soft: -1
@@ -23,7 +25,7 @@ services:
restart: unless-stopped restart: unless-stopped
backend: backend:
image: registry.gitlab.com/openstapps/openstapps/backend:4.0.1 image: registry.gitlab.com/openstapps/openstapps/backend:3.1.0
environment: environment:
<<: *development-variables <<: *development-variables
ES_ADDR: "http://database:9200" ES_ADDR: "http://database:9200"
@@ -35,11 +37,10 @@ services:
ports: ports:
- 127.0.0.1:3000:3000 - 127.0.0.1:3000:3000
labels: labels:
- stapps.version=4.0.0 - stapps.version=4.1.0
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
database: - database
condition: service_healthy
links: links:
- database - database

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openstapps/minimal-deployment", "name": "@openstapps/minimal-deployment",
"version": "4.0.1", "version": "4.0.0",
"private": true, "private": true,
"files": [ "files": [
"database", "database",

View File

@@ -1,26 +1,5 @@
# @openstapps/minimal-plugin # @openstapps/minimal-plugin
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/api-plugin@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/api@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
- Updated dependencies [b40ba7ad]
- @openstapps/api-plugin@4.0.1
- @openstapps/api@4.0.1
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/minimal-plugin", "name": "@openstapps/minimal-plugin",
"description": "Minimal Plugin", "description": "Minimal Plugin",
"version": "4.0.2", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -34,7 +34,7 @@
"@openstapps/core-tools": "workspace:*", "@openstapps/core-tools": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"commander": "10.0.0", "commander": "10.0.0",
"express": "4.21.2", "express": "4.18.2",
"ts-node": "10.9.2" "ts-node": "10.9.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -1,30 +1,5 @@
# @openstapps/app # @openstapps/app
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
- @openstapps/api@4.0.2
- @openstapps/collection-utils@4.0.0
- @openstapps/core@4.0.2
## 4.0.2
### Patch Changes
- @openstapps/core@4.0.2
- @openstapps/api@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
- Updated dependencies [b40ba7ad]
- @openstapps/api@4.0.1
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -2,14 +2,13 @@
android { android {
compileOptions { compileOptions {
sourceCompatibility JavaVersion.VERSION_21 sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_21 targetCompatibility JavaVersion.VERSION_17
} }
} }
apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle" apply from: "../capacitor-cordova-android-plugins/cordova.variables.gradle"
dependencies { dependencies {
implementation project(':capacitor-community-in-app-review')
implementation project(':capacitor-community-screen-brightness') implementation project(':capacitor-community-screen-brightness')
implementation project(':capacitor-app') implementation project(':capacitor-app')
implementation project(':capacitor-browser') implementation project(':capacitor-browser')

View File

@@ -1,8 +1,4 @@
[ [
{
"pkg": "@capacitor-community/in-app-review",
"classpath": "com.getcapacitor.community.inappreview.InAppReviewPlugin"
},
{ {
"pkg": "@capacitor-community/screen-brightness", "pkg": "@capacitor-community/screen-brightness",
"classpath": "com.elylucas.capscreenbrightness.ScreenBrightnessPlugin" "classpath": "com.elylucas.capscreenbrightness.ScreenBrightnessPlugin"

View File

@@ -7,6 +7,5 @@
<item name="android:statusBarColor">@color/colorPrimary</item> <item name="android:statusBarColor">@color/colorPrimary</item>
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
</resources> </resources>

View File

@@ -7,7 +7,6 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
@@ -18,7 +17,6 @@
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">true</item> <item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>

View File

@@ -7,8 +7,8 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.7.2' classpath 'com.android.tools.build:gradle:8.2.1'
classpath 'com.google.gms:google-services:4.4.2' classpath 'com.google.gms:google-services:4.4.0'
// NOTE: Do not place your application dependencies here; they belong // NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files // in the individual module build.gradle files

View File

@@ -1,60 +1,57 @@
// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN // DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN
include ':capacitor-android' include ':capacitor-android'
project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/android/capacitor') project(':capacitor-android').projectDir = new File('../../../node_modules/.pnpm/@capacitor+android@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/android/capacitor')
include ':capacitor-community-in-app-review'
project(':capacitor-community-in-app-review').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+in-app-review@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/in-app-review/android')
include ':capacitor-community-screen-brightness' include ':capacitor-community-screen-brightness'
project(':capacitor-community-screen-brightness').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+screen-brightness@7.0.0_@capacitor+core@7.4.2/node_modules/@capacitor-community/screen-brightness/android') project(':capacitor-community-screen-brightness').projectDir = new File('../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness/android')
include ':capacitor-app' include ':capacitor-app'
project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app/android') project(':capacitor-app').projectDir = new File('../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app/android')
include ':capacitor-browser' include ':capacitor-browser'
project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser/android') project(':capacitor-browser').projectDir = new File('../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser/android')
include ':capacitor-clipboard' include ':capacitor-clipboard'
project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard/android') project(':capacitor-clipboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard/android')
include ':capacitor-device' include ':capacitor-device'
project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/device/android') project(':capacitor-device').projectDir = new File('../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device/android')
include ':capacitor-dialog' include ':capacitor-dialog'
project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/dialog/android') project(':capacitor-dialog').projectDir = new File('../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog/android')
include ':capacitor-filesystem' include ':capacitor-filesystem'
project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@7.1.4_@capacitor+core@7.4.2/node_modules/@capacitor/filesystem/android') project(':capacitor-filesystem').projectDir = new File('../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem/android')
include ':capacitor-geolocation' include ':capacitor-geolocation'
project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@7.1.5_@capacitor+core@7.4.2/node_modules/@capacitor/geolocation/android') project(':capacitor-geolocation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation/android')
include ':capacitor-haptics' include ':capacitor-haptics'
project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics/android') project(':capacitor-haptics').projectDir = new File('../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics/android')
include ':capacitor-keyboard' include ':capacitor-keyboard'
project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard/android') project(':capacitor-keyboard').projectDir = new File('../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard/android')
include ':capacitor-local-notifications' include ':capacitor-local-notifications'
project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications/android') project(':capacitor-local-notifications').projectDir = new File('../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications/android')
include ':capacitor-network' include ':capacitor-network'
project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network/android') project(':capacitor-network').projectDir = new File('../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network/android')
include ':capacitor-preferences' include ':capacitor-preferences'
project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/preferences/android') project(':capacitor-preferences').projectDir = new File('../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences/android')
include ':capacitor-screen-orientation' include ':capacitor-screen-orientation'
project(':capacitor-screen-orientation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+screen-orientation@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/screen-orientation/android') project(':capacitor-screen-orientation').projectDir = new File('../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation/android')
include ':capacitor-share' include ':capacitor-share'
project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share/android') project(':capacitor-share').projectDir = new File('../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share/android')
include ':capacitor-splash-screen' include ':capacitor-splash-screen'
project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen/android') project(':capacitor-splash-screen').projectDir = new File('../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen/android')
include ':transistorsoft-capacitor-background-fetch' include ':transistorsoft-capacitor-background-fetch'
project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@7.1.0_@capacitor+core@7.4.2/node_modules/@transistorsoft/capacitor-background-fetch/android') project(':transistorsoft-capacitor-background-fetch').projectDir = new File('../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch/android')
include ':capacitor-secure-storage-plugin' include ':capacitor-secure-storage-plugin'
project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.11.0_@capacitor+core@7.4.2/node_modules/capacitor-secure-storage-plugin/android') project(':capacitor-secure-storage-plugin').projectDir = new File('../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin/android')

View File

@@ -1,7 +1,6 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.2.1-all.zip
networkTimeout=10000 networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@@ -15,8 +15,6 @@
# See the License for the specific language governing permissions and # See the License for the specific language governing permissions and
# limitations under the License. # limitations under the License.
# #
# SPDX-License-Identifier: Apache-2.0
#
############################################################################## ##############################################################################
# #
@@ -57,7 +55,7 @@
# Darwin, MinGW, and NonStop. # Darwin, MinGW, and NonStop.
# #
# (3) This script is generated from the Groovy template # (3) This script is generated from the Groovy template
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt # https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
# within the Gradle project. # within the Gradle project.
# #
# You can find Gradle at https://github.com/gradle/gradle/. # You can find Gradle at https://github.com/gradle/gradle/.
@@ -85,9 +83,10 @@ done
# This is normally unused # This is normally unused
# shellcheck disable=SC2034 # shellcheck disable=SC2034
APP_BASE_NAME=${0##*/} APP_BASE_NAME=${0##*/}
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
' "$PWD" ) || exit # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value. # Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum MAX_FD=maximum
@@ -134,13 +133,10 @@ location of your Java installation."
fi fi
else else
JAVACMD=java JAVACMD=java
if ! command -v java >/dev/null 2>&1 which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
then
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the Please set the JAVA_HOME variable in your environment to match the
location of your Java installation." location of your Java installation."
fi
fi fi
# Increase the maximum file descriptors if we can. # Increase the maximum file descriptors if we can.
@@ -148,7 +144,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
case $MAX_FD in #( case $MAX_FD in #(
max*) max*)
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045 # shellcheck disable=SC3045
MAX_FD=$( ulimit -H -n ) || MAX_FD=$( ulimit -H -n ) ||
warn "Could not query maximum file descriptor limit" warn "Could not query maximum file descriptor limit"
esac esac
@@ -156,7 +152,7 @@ if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
'' | soft) :;; #( '' | soft) :;; #(
*) *)
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
# shellcheck disable=SC2039,SC3045 # shellcheck disable=SC3045
ulimit -n "$MAX_FD" || ulimit -n "$MAX_FD" ||
warn "Could not set maximum file descriptor limit to $MAX_FD" warn "Could not set maximum file descriptor limit to $MAX_FD"
esac esac
@@ -201,15 +197,11 @@ if "$cygwin" || "$msys" ; then
done done
fi fi
# Collect all arguments for the java command;
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. # * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # shell script including quotes and variable substitutions, so put them in
# double quotes to make sure that they get re-expanded; and
# Collect all arguments for the java command: # * put everything else in single quotes, so that it's not re-expanded.
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
# and any embedded shellness will be escaped.
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
# treated as '${Hostname}' itself on the command line.
set -- \ set -- \
"-Dorg.gradle.appname=$APP_BASE_NAME" \ "-Dorg.gradle.appname=$APP_BASE_NAME" \

View File

@@ -13,8 +13,6 @@
@rem See the License for the specific language governing permissions and @rem See the License for the specific language governing permissions and
@rem limitations under the License. @rem limitations under the License.
@rem @rem
@rem SPDX-License-Identifier: Apache-2.0
@rem
@if "%DEBUG%"=="" @echo off @if "%DEBUG%"=="" @echo off
@rem ########################################################################## @rem ##########################################################################
@@ -45,11 +43,11 @@ set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if %ERRORLEVEL% equ 0 goto execute if %ERRORLEVEL% equ 0 goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail
@@ -59,11 +57,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto execute if exist "%JAVA_EXE%" goto execute
echo. 1>&2 echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo. 1>&2 echo.
echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation. 1>&2 echo location of your Java installation.
goto fail goto fail

View File

@@ -1,16 +1,16 @@
ext { ext {
minSdkVersion = 23 minSdkVersion = 22
compileSdkVersion = 35 compileSdkVersion = 34
targetSdkVersion = 35 targetSdkVersion = 34
androidxActivityVersion = '1.9.2' androidxActivityVersion = '1.8.0'
androidxAppCompatVersion = '1.7.0' androidxAppCompatVersion = '1.6.1'
androidxCoordinatorLayoutVersion = '1.2.0' androidxCoordinatorLayoutVersion = '1.2.0'
androidxCoreVersion = '1.15.0' androidxCoreVersion = '1.12.0'
androidxFragmentVersion = '1.8.4' androidxFragmentVersion = '1.6.2'
coreSplashScreenVersion = '1.0.1' coreSplashScreenVersion = '1.0.1'
androidxWebkitVersion = '1.12.1' androidxWebkitVersion = '1.9.0'
junitVersion = '4.13.2' junitVersion = '4.13.2'
androidxJunitVersion = '1.2.1' androidxJunitVersion = '1.1.5'
androidxEspressoCoreVersion = '3.6.1' androidxEspressoCoreVersion = '3.5.1'
cordovaAndroidVersion = '10.1.1' cordovaAndroidVersion = '10.1.1'
} }

View File

@@ -299,7 +299,7 @@
"icon": "school", "icon": "school",
"items": [ "items": [
{ {
"icon": "star", "icon": "grade",
"route": "/favorites", "route": "/favorites",
"title": "favorites", "title": "favorites",
"translations": { "translations": {

View File

@@ -14,8 +14,6 @@
*/ */
describe('context menu', function () { describe('context menu', function () {
const contextMenuSelector = 'stapps-context-menu-modal';
beforeEach(function () { beforeEach(function () {
cy.interceptSearch({ cy.interceptSearch({
extends: {query: 'a'}, extends: {query: 'a'},
@@ -35,21 +33,21 @@ describe('context menu', function () {
}); });
it('should sort', function () { it('should sort', function () {
cy.get(contextMenuSelector).within(() => { cy.get('stapps-context').within(() => {
cy.contains('ion-item', 'Name').click(); cy.contains('ion-item', 'Name').click();
cy.wait('@search'); cy.wait('@search');
}); });
}); });
it('should filter', function () { it('should filter', function () {
cy.get(contextMenuSelector).within(() => { cy.get('stapps-context').within(() => {
cy.contains('ion-item', '(17) Akademische Veranstaltung').click(); cy.contains('ion-item', '(17) Akademische Veranstaltung').click();
cy.wait('@search'); cy.wait('@search');
}); });
}); });
it('should have a working delete button', function () { it('should have a working delete button', function () {
cy.get(contextMenuSelector).within(() => { cy.get('stapps-context').within(() => {
cy.contains('ion-item', '(17) Akademische Veranstaltung').click(); cy.contains('ion-item', '(17) Akademische Veranstaltung').click();
cy.get('.checkbox-checked').should('have.length', 1); cy.get('.checkbox-checked').should('have.length', 1);
@@ -62,7 +60,7 @@ describe('context menu', function () {
it('should truncate long category items', function () { it('should truncate long category items', function () {
cy.contains('ion-list', 'Akademische Veranstaltung / Kategorien').within(() => { cy.contains('ion-list', 'Akademische Veranstaltung / Kategorien').within(() => {
cy.contains('ion-item', '(1) Tutorium').should('not.exist'); cy.contains('ion-item', '(1) Tutorium').should('not.exist');
cy.get('ion-button').click(); cy.get('div > ion-button').click();
cy.contains('ion-item', '(1) Tutorium').should('exist'); cy.contains('ion-item', '(1) Tutorium').should('exist');
}); });
}); });

View File

@@ -33,9 +33,9 @@ describe('dashboard', async function () {
describe('schedule section', function () { describe('schedule section', function () {
it('should lead to the week overview', function () { it('should lead to the week overview', function () {
cy.get('.schedule') cy.get('.schedule')
.contains('a', /Wochen.*ansicht/) .contains('a', /Wochen.*übersicht/)
.click(); .click();
cy.url().should('include', '/schedule/weekly-view'); cy.url().should('include', '/schedule/week-overview');
}); });
it('should lead to the calendar', function () { it('should lead to the calendar', function () {

View File

@@ -100,7 +100,7 @@ describe('schedule', function () {
cy.get('ion-searchbar').click().type('a'); cy.get('ion-searchbar').click().type('a');
cy.wait('@search'); cy.wait('@search');
cy.wait('@chips'); cy.wait('@chips');
cy.wait(1000); cy.wait(200);
cy.contains('ion-item', 'UNIcert (Test)') cy.contains('ion-item', 'UNIcert (Test)')
.contains('stapps-add-event-action-chip', 'Termine Auswählen') .contains('stapps-add-event-action-chip', 'Termine Auswählen')
.click(); .click();

View File

@@ -20,7 +20,7 @@ const config = {
htmlGlob: 'src/**/*.html', htmlGlob: 'src/**/*.html',
scriptGlob: 'src/**/*.ts', scriptGlob: 'src/**/*.ts',
additionalIcons: { additionalIcons: {
about: ['copyright', 'campaign', 'policy', 'description', 'text_snippet', 'expand_more', 'expand_all'], about: ['copyright', 'campaign', 'policy', 'description', 'text_snippet'],
navigation: [ navigation: [
'home', 'home',
'newspaper', 'newspaper',
@@ -30,7 +30,7 @@ const config = {
'local_library', 'local_library',
'inventory_2', 'inventory_2',
'map', 'map',
'star', 'grade',
'account_circle', 'account_circle',
'settings', 'settings',
'info', 'info',

View File

@@ -304,7 +304,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = YES; MTL_ENABLE_DEBUG_INFO = YES;
ONLY_ACTIVE_ARCH = YES; ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos; SDKROOT = iphoneos;
@@ -355,7 +355,7 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES; GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
MTL_ENABLE_DEBUG_INFO = NO; MTL_ENABLE_DEBUG_INFO = NO;
SDKROOT = iphoneos; SDKROOT = iphoneos;
SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
@@ -373,7 +373,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YSGS9WV338; DEVELOPMENT_TEAM = YSGS9WV338;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\"";
PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app; PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app;
@@ -395,7 +395,7 @@
CODE_SIGN_STYLE = Automatic; CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = YSGS9WV338; DEVELOPMENT_TEAM = YSGS9WV338;
INFOPLIST_FILE = App/Info.plist; INFOPLIST_FILE = App/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 14.0; IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app; PRODUCT_BUNDLE_IDENTIFIER = de.openstapps.app;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -1,6 +1,6 @@
require_relative '../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios/scripts/pods_helpers' require_relative '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios/scripts/pods_helpers'
platform :ios, '14.0' platform :ios, '13.0'
use_frameworks! use_frameworks!
# workaround to avoid Xcode caching of Pods that requires # workaround to avoid Xcode caching of Pods that requires
@@ -9,27 +9,26 @@ use_frameworks!
install! 'cocoapods', :disable_input_output_paths => true install! 'cocoapods', :disable_input_output_paths => true
def capacitor_pods def capacitor_pods
pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios' pod 'Capacitor', :path => '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios'
pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios' pod 'CapacitorCordova', :path => '../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios'
pod 'CapacitorCommunityInAppReview', :path => '../../../../node_modules/.pnpm/@capacitor-community+in-app-review@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/in-app-review' pod 'CapacitorCommunityScreenBrightness', :path => '../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness'
pod 'CapacitorCommunityScreenBrightness', :path => '../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@7.0.0_@capacitor+core@7.4.2/node_modules/@capacitor-community/screen-brightness' pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app'
pod 'CapacitorApp', :path => '../../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app' pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser'
pod 'CapacitorBrowser', :path => '../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser' pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard'
pod 'CapacitorClipboard', :path => '../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard' pod 'CapacitorDevice', :path => '../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device'
pod 'CapacitorDevice', :path => '../../../../node_modules/.pnpm/@capacitor+device@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/device' pod 'CapacitorDialog', :path => '../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog'
pod 'CapacitorDialog', :path => '../../../../node_modules/.pnpm/@capacitor+dialog@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/dialog' pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem'
pod 'CapacitorFilesystem', :path => '../../../../node_modules/.pnpm/@capacitor+filesystem@7.1.4_@capacitor+core@7.4.2/node_modules/@capacitor/filesystem' pod 'CapacitorGeolocation', :path => '../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation'
pod 'CapacitorGeolocation', :path => '../../../../node_modules/.pnpm/@capacitor+geolocation@7.1.5_@capacitor+core@7.4.2/node_modules/@capacitor/geolocation' pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics'
pod 'CapacitorHaptics', :path => '../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics' pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard'
pod 'CapacitorKeyboard', :path => '../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard' pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications'
pod 'CapacitorLocalNotifications', :path => '../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications' pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network'
pod 'CapacitorNetwork', :path => '../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network' pod 'CapacitorPreferences', :path => '../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences'
pod 'CapacitorPreferences', :path => '../../../../node_modules/.pnpm/@capacitor+preferences@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/preferences' pod 'CapacitorScreenOrientation', :path => '../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation'
pod 'CapacitorScreenOrientation', :path => '../../../../node_modules/.pnpm/@capacitor+screen-orientation@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/screen-orientation' pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share'
pod 'CapacitorShare', :path => '../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share' pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen'
pod 'CapacitorSplashScreen', :path => '../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen' pod 'TransistorsoftCapacitorBackgroundFetch', :path => '../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch'
pod 'TransistorsoftCapacitorBackgroundFetch', :path => '../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@7.1.0_@capacitor+core@7.4.2/node_modules/@transistorsoft/capacitor-background-fetch' pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin'
pod 'CapacitorSecureStoragePlugin', :path => '../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.11.0_@capacitor+core@7.4.2/node_modules/capacitor-secure-storage-plugin'
pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins' pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'
end end

View File

@@ -1,157 +1,143 @@
PODS: PODS:
- Capacitor (7.4.2): - Capacitor (6.2.1):
- CapacitorCordova - CapacitorCordova
- CapacitorApp (7.0.2): - CapacitorApp (6.0.0):
- Capacitor - Capacitor
- CapacitorBrowser (7.0.2): - CapacitorBrowser (6.0.1):
- Capacitor - Capacitor
- CapacitorClipboard (7.0.2): - CapacitorClipboard (6.0.0):
- Capacitor - Capacitor
- CapacitorCommunityInAppReview (7.0.1): - CapacitorCommunityScreenBrightness (6.0.0):
- Capacitor - Capacitor
- CapacitorCommunityScreenBrightness (7.0.0): - CapacitorCordova (6.2.1)
- CapacitorDevice (6.0.0):
- Capacitor - Capacitor
- CapacitorCordova (7.4.2) - CapacitorDialog (6.0.0):
- CapacitorDevice (7.0.2):
- Capacitor - Capacitor
- CapacitorDialog (7.0.2): - CapacitorFilesystem (6.0.0):
- Capacitor - Capacitor
- CapacitorFilesystem (7.1.4): - CapacitorGeolocation (6.0.0):
- Capacitor - Capacitor
- IONFilesystemLib (~> 1.0.1) - CapacitorHaptics (6.0.0):
- CapacitorGeolocation (7.1.5):
- Capacitor - Capacitor
- IONGeolocationLib (= 1.0.1) - CapacitorKeyboard (6.0.1):
- CapacitorHaptics (7.0.2):
- Capacitor - Capacitor
- CapacitorKeyboard (7.0.2): - CapacitorLocalNotifications (6.0.0):
- Capacitor - Capacitor
- CapacitorLocalNotifications (7.0.2): - CapacitorNetwork (6.0.1):
- Capacitor - Capacitor
- CapacitorNetwork (7.0.2): - CapacitorPreferences (6.0.1):
- Capacitor - Capacitor
- CapacitorPreferences (7.0.2): - CapacitorScreenOrientation (6.0.1):
- Capacitor - Capacitor
- CapacitorScreenOrientation (7.0.2): - CapacitorSecureStoragePlugin (0.10.0):
- Capacitor
- CapacitorSecureStoragePlugin (0.11.0):
- Capacitor - Capacitor
- SwiftKeychainWrapper - SwiftKeychainWrapper
- CapacitorShare (7.0.2): - CapacitorShare (6.0.1):
- Capacitor - Capacitor
- CapacitorSplashScreen (7.0.2): - CapacitorSplashScreen (6.0.1):
- Capacitor - Capacitor
- CordovaPlugins (7.4.2): - CordovaPlugins (6.2.1):
- CapacitorCordova - CapacitorCordova
- IONFilesystemLib (1.0.1)
- IONGeolocationLib (1.0.1)
- SwiftKeychainWrapper (4.0.1) - SwiftKeychainWrapper (4.0.1)
- TransistorsoftCapacitorBackgroundFetch (7.1.0): - TransistorsoftCapacitorBackgroundFetch (6.0.0):
- Capacitor - Capacitor
DEPENDENCIES: DEPENDENCIES:
- "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios`)" - "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios`)"
- "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app`)" - "CapacitorApp (from `../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app`)"
- "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser`)" - "CapacitorBrowser (from `../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser`)"
- "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard`)" - "CapacitorClipboard (from `../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard`)"
- "CapacitorCommunityInAppReview (from `../../../../node_modules/.pnpm/@capacitor-community+in-app-review@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/in-app-review`)" - "CapacitorCommunityScreenBrightness (from `../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness`)"
- "CapacitorCommunityScreenBrightness (from `../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@7.0.0_@capacitor+core@7.4.2/node_modules/@capacitor-community/screen-brightness`)" - "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios`)"
- "CapacitorCordova (from `../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios`)" - "CapacitorDevice (from `../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device`)"
- "CapacitorDevice (from `../../../../node_modules/.pnpm/@capacitor+device@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/device`)" - "CapacitorDialog (from `../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog`)"
- "CapacitorDialog (from `../../../../node_modules/.pnpm/@capacitor+dialog@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/dialog`)" - "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem`)"
- "CapacitorFilesystem (from `../../../../node_modules/.pnpm/@capacitor+filesystem@7.1.4_@capacitor+core@7.4.2/node_modules/@capacitor/filesystem`)" - "CapacitorGeolocation (from `../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation`)"
- "CapacitorGeolocation (from `../../../../node_modules/.pnpm/@capacitor+geolocation@7.1.5_@capacitor+core@7.4.2/node_modules/@capacitor/geolocation`)" - "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics`)"
- "CapacitorHaptics (from `../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics`)" - "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard`)"
- "CapacitorKeyboard (from `../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard`)" - "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications`)"
- "CapacitorLocalNotifications (from `../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications`)" - "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network`)"
- "CapacitorNetwork (from `../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network`)" - "CapacitorPreferences (from `../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences`)"
- "CapacitorPreferences (from `../../../../node_modules/.pnpm/@capacitor+preferences@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/preferences`)" - "CapacitorScreenOrientation (from `../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation`)"
- "CapacitorScreenOrientation (from `../../../../node_modules/.pnpm/@capacitor+screen-orientation@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/screen-orientation`)" - "CapacitorSecureStoragePlugin (from `../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin`)"
- "CapacitorSecureStoragePlugin (from `../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.11.0_@capacitor+core@7.4.2/node_modules/capacitor-secure-storage-plugin`)" - "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share`)"
- "CapacitorShare (from `../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share`)" - "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen`)"
- "CapacitorSplashScreen (from `../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen`)"
- CordovaPlugins (from `../capacitor-cordova-ios-plugins`) - CordovaPlugins (from `../capacitor-cordova-ios-plugins`)
- "TransistorsoftCapacitorBackgroundFetch (from `../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@7.1.0_@capacitor+core@7.4.2/node_modules/@transistorsoft/capacitor-background-fetch`)" - "TransistorsoftCapacitorBackgroundFetch (from `../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch`)"
SPEC REPOS: SPEC REPOS:
trunk: trunk:
- IONFilesystemLib
- IONGeolocationLib
- SwiftKeychainWrapper - SwiftKeychainWrapper
EXTERNAL SOURCES: EXTERNAL SOURCES:
Capacitor: Capacitor:
:path: "../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios" :path: "../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios"
CapacitorApp: CapacitorApp:
:path: "../../../../node_modules/.pnpm/@capacitor+app@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/app" :path: "../../../../node_modules/.pnpm/@capacitor+app@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/app"
CapacitorBrowser: CapacitorBrowser:
:path: "../../../../node_modules/.pnpm/@capacitor+browser@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/browser" :path: "../../../../node_modules/.pnpm/@capacitor+browser@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/browser"
CapacitorClipboard: CapacitorClipboard:
:path: "../../../../node_modules/.pnpm/@capacitor+clipboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/clipboard" :path: "../../../../node_modules/.pnpm/@capacitor+clipboard@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/clipboard"
CapacitorCommunityInAppReview:
:path: "../../../../node_modules/.pnpm/@capacitor-community+in-app-review@7.0.1_@capacitor+core@7.4.2/node_modules/@capacitor-community/in-app-review"
CapacitorCommunityScreenBrightness: CapacitorCommunityScreenBrightness:
:path: "../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@7.0.0_@capacitor+core@7.4.2/node_modules/@capacitor-community/screen-brightness" :path: "../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor-community/screen-brightness"
CapacitorCordova: CapacitorCordova:
:path: "../../../../node_modules/.pnpm/@capacitor+ios@7.4.2_@capacitor+core@7.4.2/node_modules/@capacitor/ios" :path: "../../../../node_modules/.pnpm/@capacitor+ios@6.2.1_@capacitor+core@6.2.1/node_modules/@capacitor/ios"
CapacitorDevice: CapacitorDevice:
:path: "../../../../node_modules/.pnpm/@capacitor+device@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/device" :path: "../../../../node_modules/.pnpm/@capacitor+device@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/device"
CapacitorDialog: CapacitorDialog:
:path: "../../../../node_modules/.pnpm/@capacitor+dialog@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/dialog" :path: "../../../../node_modules/.pnpm/@capacitor+dialog@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/dialog"
CapacitorFilesystem: CapacitorFilesystem:
:path: "../../../../node_modules/.pnpm/@capacitor+filesystem@7.1.4_@capacitor+core@7.4.2/node_modules/@capacitor/filesystem" :path: "../../../../node_modules/.pnpm/@capacitor+filesystem@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/filesystem"
CapacitorGeolocation: CapacitorGeolocation:
:path: "../../../../node_modules/.pnpm/@capacitor+geolocation@7.1.5_@capacitor+core@7.4.2/node_modules/@capacitor/geolocation" :path: "../../../../node_modules/.pnpm/@capacitor+geolocation@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/geolocation"
CapacitorHaptics: CapacitorHaptics:
:path: "../../../../node_modules/.pnpm/@capacitor+haptics@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/haptics" :path: "../../../../node_modules/.pnpm/@capacitor+haptics@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/haptics"
CapacitorKeyboard: CapacitorKeyboard:
:path: "../../../../node_modules/.pnpm/@capacitor+keyboard@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/keyboard" :path: "../../../../node_modules/.pnpm/@capacitor+keyboard@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/keyboard"
CapacitorLocalNotifications: CapacitorLocalNotifications:
:path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/local-notifications" :path: "../../../../node_modules/.pnpm/@capacitor+local-notifications@6.0.0_@capacitor+core@6.2.1/node_modules/@capacitor/local-notifications"
CapacitorNetwork: CapacitorNetwork:
:path: "../../../../node_modules/.pnpm/@capacitor+network@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/network" :path: "../../../../node_modules/.pnpm/@capacitor+network@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/network"
CapacitorPreferences: CapacitorPreferences:
:path: "../../../../node_modules/.pnpm/@capacitor+preferences@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/preferences" :path: "../../../../node_modules/.pnpm/@capacitor+preferences@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/preferences"
CapacitorScreenOrientation: CapacitorScreenOrientation:
:path: "../../../../node_modules/.pnpm/@capacitor+screen-orientation@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/screen-orientation" :path: "../../../../node_modules/.pnpm/@capacitor+screen-orientation@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/screen-orientation"
CapacitorSecureStoragePlugin: CapacitorSecureStoragePlugin:
:path: "../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.11.0_@capacitor+core@7.4.2/node_modules/capacitor-secure-storage-plugin" :path: "../../../../node_modules/.pnpm/capacitor-secure-storage-plugin@0.10.0_@capacitor+core@6.2.1/node_modules/capacitor-secure-storage-plugin"
CapacitorShare: CapacitorShare:
:path: "../../../../node_modules/.pnpm/@capacitor+share@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/share" :path: "../../../../node_modules/.pnpm/@capacitor+share@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/share"
CapacitorSplashScreen: CapacitorSplashScreen:
:path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@7.0.2_@capacitor+core@7.4.2/node_modules/@capacitor/splash-screen" :path: "../../../../node_modules/.pnpm/@capacitor+splash-screen@6.0.1_@capacitor+core@6.2.1/node_modules/@capacitor/splash-screen"
CordovaPlugins: CordovaPlugins:
:path: "../capacitor-cordova-ios-plugins" :path: "../capacitor-cordova-ios-plugins"
TransistorsoftCapacitorBackgroundFetch: TransistorsoftCapacitorBackgroundFetch:
:path: "../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@7.1.0_@capacitor+core@7.4.2/node_modules/@transistorsoft/capacitor-background-fetch" :path: "../../../../node_modules/.pnpm/@transistorsoft+capacitor-background-fetch@6.0.0_@capacitor+core@6.2.1/node_modules/@transistorsoft/capacitor-background-fetch"
SPEC CHECKSUMS: SPEC CHECKSUMS:
Capacitor: 9d9e481b79ffaeacaf7a85d6a11adec32bd33b59 Capacitor: c95400d761e376be9da6be5a05f226c0e865cebf
CapacitorApp: 1f6922c9c5c8b1c538d7fbe92ebe44a81b34bed3 CapacitorApp: 30145f2ea2311e4f3744472119ec87d2ddf4c0a7
CapacitorBrowser: 22541e48442de44dc629c214388290d6eecc6ae9 CapacitorBrowser: 6c0e04dc80556a966ebc2269ac72f09d83eec1ce
CapacitorClipboard: 7e227702976d4435a5a40df54f65e154d0dfc1f3 CapacitorClipboard: c1cb27fea166aab5c99bda605d3bc768cf00eabe
CapacitorCommunityInAppReview: a8f26c4e48a8ccc9df0acf1c7bca39844c325572 CapacitorCommunityScreenBrightness: 95d4c839fc8e925dcf75ffee66f62a00f560f146
CapacitorCommunityScreenBrightness: 508f3d0f79024cd8da7d063f456870a4a1932723 CapacitorCordova: 8d93e14982f440181be7304aa9559ca631d77fff
CapacitorCordova: 5e58d04631bc5094894ac106e2bf1da18a9e6151 CapacitorDevice: 38ad323d74e3a86b56253680538ac23a2c9b4a68
CapacitorDevice: 81ae78d5d1942707caad79276badd458bf6ec603 CapacitorDialog: bd99f63c9788a137263b2d75e718b1fc4d9f70c3
CapacitorDialog: 5bf72a94b747fb339df6f64ef60812e5e4630ad2 CapacitorFilesystem: 9c2cc1e89d3b8b91503b316e9f6c2915c9bf9419
CapacitorFilesystem: f9bd850c41e048180e5dc0cbb90f2033ede9d2cc CapacitorGeolocation: 86f82a32b238ff79d5be6fc0943f2866965d3f1b
CapacitorGeolocation: 84f868bea4c2499aebc3bb3a88fd0a508f87ab87 CapacitorHaptics: 0cea833e6a8bf489dd6acaaebf6d953b90086c59
CapacitorHaptics: b3fb2869e72c4466e18ce9ccbeb60a3d8723b3d4 CapacitorKeyboard: f38d730356be5569d72eb87ad9c8166947728c36
CapacitorKeyboard: a86aa9e4741b6444a802df26440a92ae041b34a6 CapacitorLocalNotifications: d051c73ec8bf38807214f5b905ee6426e13756f8
CapacitorLocalNotifications: 665188ae8accd40806129073896fb2b39322d858 CapacitorNetwork: 7ff188197e880d8485f280492b54d3202e9f3a61
CapacitorNetwork: 695069886b3c5ed514db69aa3d026b8dc3c03a6b CapacitorPreferences: 97d529423bb7c1196455e9a1b6dd1074625c78bd
CapacitorPreferences: 65107ed7437d96ee72583df5763985e3c0ff2bc2 CapacitorScreenOrientation: f3a0744a56f673929d18bd0d9a5ef5f5595e7352
CapacitorScreenOrientation: e0d5b9ef293b269b8f93373355d5b276f50fabea CapacitorSecureStoragePlugin: 545b51d782d35e61a39231ecf99a966b060a2cbb
CapacitorSecureStoragePlugin: 450d402026ee3bcc018fa206504d9c0572fee78d CapacitorShare: ec1bcbc16696696133740ac876192c0480ca3018
CapacitorShare: be166411fa995ead2d39b104aa0aae56d8615c66 CapacitorSplashScreen: d2d8fe9541d7bebdf735839b89edf6e762cea969
CapacitorSplashScreen: 157947576b59d913792063a8d442a79e6d283ee5 CordovaPlugins: b40548c03c597049ef851a7014da5ac8f155d914
CordovaPlugins: 7b9a4f380c92ca7f28630723befaca556461f4c3
IONFilesystemLib: 89258b8e3e85465da93127d25d7ce37f977e8a6f
IONGeolocationLib: 20f9d0248a0b5264511fb57a37e25dd2badf797a
SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c
TransistorsoftCapacitorBackgroundFetch: 28e561636145a899f05025d31f627019c16791f5 TransistorsoftCapacitorBackgroundFetch: dfa73a0fd038bc1986255360e4b20165a4a0f066
PODFILE CHECKSUM: 90bc09990a659848ea76c94331d39bad0b28024d PODFILE CHECKSUM: 601bc3c09529fe24d68110bc709379698476efe1
COCOAPODS: 1.16.2 COCOAPODS: 1.16.2

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/app", "name": "@openstapps/app",
"description": "The generic app tailored to fulfill needs of German universities, written using Ionic Framework.", "description": "The generic app tailored to fulfill needs of German universities, written using Ionic Framework.",
"version": "4.0.3", "version": "4.0.0",
"private": true, "private": true,
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>", "author": "Karl-Philipp Wulfert <krlwlfrt@gmail.com>",
@@ -48,53 +48,53 @@
"test:integration": "sh integration-test.sh" "test:integration": "sh integration-test.sh"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "18.2.13", "@angular/animations": "17.3.12",
"@angular/cdk": "18.2.13", "@angular/cdk": "17.3.10",
"@angular/common": "18.2.13", "@angular/common": "17.3.12",
"@angular/core": "18.2.13", "@angular/core": "17.3.12",
"@angular/forms": "18.2.13", "@angular/forms": "17.3.12",
"@angular/platform-browser": "18.2.13", "@angular/platform-browser": "17.3.12",
"@angular/router": "18.2.13", "@angular/router": "17.3.12",
"@awesome-cordova-plugins/calendar": "6.6.0", "@awesome-cordova-plugins/calendar": "6.6.0",
"@awesome-cordova-plugins/core": "6.6.0", "@awesome-cordova-plugins/core": "6.6.0",
"@capacitor-community/in-app-review": "7.0.1", "@capacitor-community/screen-brightness": "6.0.0",
"@capacitor-community/screen-brightness": "7.0.0", "@capacitor/app": "6.0.0",
"@capacitor/app": "7.0.2", "@capacitor/browser": "6.0.1",
"@capacitor/browser": "7.0.2", "@capacitor/clipboard": "6.0.0",
"@capacitor/clipboard": "7.0.2", "@capacitor/core": "6.2.1",
"@capacitor/core": "7.4.2", "@capacitor/device": "6.0.0",
"@capacitor/device": "7.0.2", "@capacitor/dialog": "6.0.0",
"@capacitor/dialog": "7.0.2", "@capacitor/filesystem": "6.0.0",
"@capacitor/filesystem": "7.1.4", "@capacitor/geolocation": "6.0.0",
"@capacitor/geolocation": "7.1.5", "@capacitor/haptics": "6.0.0",
"@capacitor/haptics": "7.0.2", "@capacitor/keyboard": "6.0.1",
"@capacitor/keyboard": "7.0.2", "@capacitor/local-notifications": "6.0.0",
"@capacitor/local-notifications": "7.0.2", "@capacitor/network": "6.0.1",
"@capacitor/network": "7.0.2", "@capacitor/preferences": "6.0.1",
"@capacitor/preferences": "7.0.2", "@capacitor/screen-orientation": "6.0.1",
"@capacitor/screen-orientation": "7.0.2", "@capacitor/share": "6.0.1",
"@capacitor/share": "7.0.2", "@capacitor/splash-screen": "6.0.1",
"@capacitor/splash-screen": "7.0.2", "@ionic-native/core": "5.36.0",
"@ionic/angular": "8.7.3", "@ionic/angular": "8.6.1",
"@ionic/angular-server": "8.7.3", "@ionic/angular-server": "8.6.1",
"@ionic/storage-angular": "4.0.0", "@ionic/storage-angular": "4.0.0",
"@maplibre/ngx-maplibre-gl": "17.4.1", "@maplibre/ngx-maplibre-gl": "17.4.1",
"@ngx-translate/core": "15.0.0", "@ngx-translate/core": "15.0.0",
"@ngx-translate/http-loader": "8.0.0", "@ngx-translate/http-loader": "8.0.0",
"@openid/appauth": "1.3.2", "@openid/appauth": "1.3.1",
"@openstapps/api": "workspace:*", "@openstapps/api": "workspace:*",
"@openstapps/collection-utils": "workspace:*", "@openstapps/collection-utils": "workspace:*",
"@openstapps/core": "workspace:*", "@openstapps/core": "workspace:*",
"@transistorsoft/capacitor-background-fetch": "7.1.0", "@transistorsoft/capacitor-background-fetch": "6.0.0",
"@types/dom-view-transitions": "1.0.4", "@types/dom-view-transitions": "1.0.4",
"capacitor-secure-storage-plugin": "0.11.0", "capacitor-secure-storage-plugin": "0.10.0",
"cordova-plugin-calendar": "5.1.6", "cordova-plugin-calendar": "5.1.6",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"form-data": "4.0.4", "form-data": "4.0.0",
"geojson": "0.5.0", "geojson": "0.5.0",
"ionic-appauth": "2.1.0", "ionic-appauth": "0.9.0",
"ionicons": "8.0.13", "ionicons": "7.4.0",
"jsonpath-plus": "10.3.0", "jsonpath-plus": "10.3.0",
"maplibre-gl": "4.0.2", "maplibre-gl": "4.0.2",
"material-symbols": "0.17.1", "material-symbols": "0.17.1",
@@ -110,31 +110,31 @@
"semver": "7.6.0", "semver": "7.6.0",
"swiper": "8.4.5", "swiper": "8.4.5",
"tslib": "2.6.2", "tslib": "2.6.2",
"zone.js": "0.14.10" "zone.js": "0.14.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/architect": "0.1802.20", "@angular-devkit/architect": "0.1703.17",
"@angular-devkit/build-angular": "18.2.20", "@angular-devkit/build-angular": "17.3.17",
"@angular-devkit/core": "18.2.20", "@angular-devkit/core": "17.3.17",
"@angular-devkit/schematics": "18.2.20", "@angular-devkit/schematics": "17.3.17",
"@angular-eslint/builder": "18.4.3", "@angular-eslint/builder": "17.5.3",
"@angular-eslint/eslint-plugin": "18.4.3", "@angular-eslint/eslint-plugin": "17.5.3",
"@angular-eslint/eslint-plugin-template": "18.4.3", "@angular-eslint/eslint-plugin-template": "17.5.3",
"@angular-eslint/schematics": "18.4.1", "@angular-eslint/schematics": "17.5.3",
"@angular-eslint/template-parser": "18.4.3", "@angular-eslint/template-parser": "17.5.3",
"@angular/cli": "18.2.20", "@angular/cli": "17.3.17",
"@angular/compiler": "18.2.13", "@angular/compiler": "17.3.12",
"@angular/compiler-cli": "18.2.13", "@angular/compiler-cli": "17.3.12",
"@angular/language-server": "18.2.0", "@angular/language-server": "17.3.2",
"@angular/language-service": "18.2.13", "@angular/language-service": "17.3.12",
"@angular/platform-browser-dynamic": "18.2.13", "@angular/platform-browser-dynamic": "17.3.12",
"@capacitor/android": "7.4.2", "@capacitor/android": "6.2.1",
"@capacitor/assets": "3.0.5", "@capacitor/assets": "3.0.4",
"@capacitor/cli": "7.4.2", "@capacitor/cli": "6.2.1",
"@capacitor/ios": "7.4.2", "@capacitor/ios": "6.2.1",
"@compodoc/compodoc": "1.1.23", "@compodoc/compodoc": "1.1.23",
"@cypress/schematic": "4.1.1", "@cypress/schematic": "3.0.0",
"@ionic/angular-toolkit": "12.3.0", "@ionic/angular-toolkit": "11.0.1",
"@ionic/cli": "7.2.0", "@ionic/cli": "7.2.0",
"@openstapps/prettier-config": "workspace:*", "@openstapps/prettier-config": "workspace:*",
"@openstapps/tsconfig": "workspace:*", "@openstapps/tsconfig": "workspace:*",
@@ -149,17 +149,17 @@
"@types/karma-jasmine": "4.0.5", "@types/karma-jasmine": "4.0.5",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"@types/semver": "7.5.8", "@types/semver": "7.5.8",
"@typescript-eslint/eslint-plugin": "7.11.0", "@typescript-eslint/eslint-plugin": "7.2.0",
"@typescript-eslint/parser": "7.11.0", "@typescript-eslint/parser": "7.2.0",
"cordova-res": "0.15.4", "cordova-res": "0.15.4",
"cypress": "15.0.0", "cypress": "14.5.0",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-plugin-jsdoc": "48.2.1", "eslint-plugin-jsdoc": "48.2.1",
"eslint-plugin-prettier": "5.1.3", "eslint-plugin-prettier": "5.1.3",
"eslint-plugin-unicorn": "51.0.1", "eslint-plugin-unicorn": "51.0.1",
"fast-deep-equal": "3.1.3", "fast-deep-equal": "3.1.3",
"fontkit": "2.0.2", "fontkit": "2.0.2",
"glob": "10.5.0", "glob": "10.3.10",
"http-server": "14.1.1", "http-server": "14.1.1",
"is-docker": "2.2.1", "is-docker": "2.2.1",
"jasmine-core": "5.1.2", "jasmine-core": "5.1.2",

View File

@@ -33,7 +33,6 @@ import {sampleAuthConfiguration} from './_helpers/data/sample-configuration';
import {StorageProvider} from './modules/storage/storage.provider'; import {StorageProvider} from './modules/storage/storage.provider';
import {SimpleBrowser} from './util/browser.factory'; import {SimpleBrowser} from './util/browser.factory';
import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import {InAppReviewProvider} from './modules/settings/in-app-review/in-app-review.provider';
describe('AppComponent', () => { describe('AppComponent', () => {
let platformReadySpy: any; let platformReadySpy: any;
@@ -41,7 +40,6 @@ describe('AppComponent', () => {
let translateServiceSpy: jasmine.SpyObj<TranslateService>; let translateServiceSpy: jasmine.SpyObj<TranslateService>;
let thingTranslateServiceSpy: jasmine.SpyObj<ThingTranslateService>; let thingTranslateServiceSpy: jasmine.SpyObj<ThingTranslateService>;
let settingsProvider: jasmine.SpyObj<SettingsProvider>; let settingsProvider: jasmine.SpyObj<SettingsProvider>;
let inAppReviewProvider: jasmine.SpyObj<InAppReviewProvider>;
let configProvider: jasmine.SpyObj<ConfigProvider>; let configProvider: jasmine.SpyObj<ConfigProvider>;
let ngxLogger: jasmine.SpyObj<NGXLogger>; let ngxLogger: jasmine.SpyObj<NGXLogger>;
let scheduleSyncServiceSpy: jasmine.SpyObj<ScheduleSyncService>; let scheduleSyncServiceSpy: jasmine.SpyObj<ScheduleSyncService>;
@@ -87,7 +85,6 @@ describe('AppComponent', () => {
{provide: ThingTranslateService, useValue: thingTranslateServiceSpy}, {provide: ThingTranslateService, useValue: thingTranslateServiceSpy},
{provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy}, {provide: ScheduleSyncService, useValue: scheduleSyncServiceSpy},
{provide: SettingsProvider, useValue: settingsProvider}, {provide: SettingsProvider, useValue: settingsProvider},
{provide: InAppReviewProvider, useValue: inAppReviewProvider},
{provide: ConfigProvider, useValue: configProvider}, {provide: ConfigProvider, useValue: configProvider},
{provide: NGXLogger, useValue: ngxLogger}, {provide: NGXLogger, useValue: ngxLogger},
{provide: StorageProvider, useValue: storageProvider}, {provide: StorageProvider, useValue: storageProvider},

View File

@@ -17,7 +17,6 @@ import {Router} from '@angular/router';
import {App, URLOpenListenerEvent} from '@capacitor/app'; import {App, URLOpenListenerEvent} from '@capacitor/app';
import {Platform, ToastController} from '@ionic/angular/standalone'; import {Platform, ToastController} from '@ionic/angular/standalone';
import {SettingsProvider} from './modules/settings/settings.provider'; import {SettingsProvider} from './modules/settings/settings.provider';
import {InAppReviewProvider} from './modules/settings/in-app-review/in-app-review.provider';
import {AuthHelperService} from './modules/auth/auth-helper.service'; import {AuthHelperService} from './modules/auth/auth-helper.service';
import {environment} from '../environments/environment'; import {environment} from '../environments/environment';
import {Capacitor} from '@capacitor/core'; import {Capacitor} from '@capacitor/core';
@@ -56,7 +55,6 @@ export class AppComponent implements AfterContentInit {
constructor( constructor(
private readonly platform: Platform, private readonly platform: Platform,
private readonly settingsProvider: SettingsProvider, private readonly settingsProvider: SettingsProvider,
private readonly inAppReviewProvider: InAppReviewProvider,
private readonly router: Router, private readonly router: Router,
private readonly zone: NgZone, private readonly zone: NgZone,
private readonly authHelper: AuthHelperService, private readonly authHelper: AuthHelperService,
@@ -88,8 +86,6 @@ export class AppComponent implements AfterContentInit {
async hideSplash() { async hideSplash() {
if (Capacitor.isNativePlatform()) { if (Capacitor.isNativePlatform()) {
void SplashScreen.hide(); void SplashScreen.hide();
await this.inAppReviewProvider.increaseSessionCount();
void this.inAppReviewProvider.startInAppReviewIfFeasible();
} }
} }

View File

@@ -19,7 +19,7 @@
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
<div #schedule class="schedule"> <div #schedule class="schedule">
<a [routerLink]="['/schedule/weekly-view']"> <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> <ion-label [innerHTML]="'schedule.recurring' | translate"></ion-label>
</a> </a>

View File

@@ -127,7 +127,6 @@ export class AddEventActionChipComponent {
.filter(it => it.selected) .filter(it => it.selected)
.map(it => it.item), .map(it => it.item),
}, },
mode: 'md', // TODO Remove if Issue 239 is solved.
}); });
await modal.present(); await modal.present();

View File

@@ -36,7 +36,7 @@ export class ChipFilterComponent {
/** /**
* Emits when the chip has been activated/deactivated * Emits when the chip has been activated/deactivated
*/ */
@Output() toggled = new EventEmitter<unknown>(); @Output() toggle = new EventEmitter<unknown>();
/** /**
* Value to emit when chip has been activated/deactivated * Value to emit when chip has been activated/deactivated
@@ -47,6 +47,6 @@ export class ChipFilterComponent {
* Signalize that the chip filter has been activated/deactivated * Signalize that the chip filter has been activated/deactivated
*/ */
emitToggle(value: unknown) { emitToggle(value: unknown) {
this.toggled.emit(value); this.toggle.emit(value);
} }
} }

View File

@@ -19,6 +19,6 @@
[size]="24" [size]="24"
[fill]="(isFavorite$ | async) || false" [fill]="(isFavorite$ | async) || false"
[class.selected]="isFavorite$ | async" [class.selected]="isFavorite$ | async"
name="star" name="grade"
></ion-icon> ></ion-icon>
</ion-button> </ion-button>

View File

@@ -31,7 +31,7 @@
slot="icon-only" slot="icon-only"
[size]="32" [size]="32"
color="medium" color="medium"
name="star" name="grade"
></ion-icon> ></ion-icon>
} }
<label class="thank-you">{{ 'ratings.thank_you' | translate }}</label> <label class="thank-you">{{ 'ratings.thank_you' | translate }}</label>

View File

@@ -15,12 +15,7 @@
import {Component, DestroyRef, inject, Input, OnInit} from '@angular/core'; import {Component, DestroyRef, inject, Input, OnInit} from '@angular/core';
import {ActivatedRoute, Router} from '@angular/router'; import {ActivatedRoute, Router} from '@angular/router';
import {Keyboard} from '@capacitor/keyboard'; import {Keyboard} from '@capacitor/keyboard';
import { import {AlertController, AnimationBuilder, AnimationController, ModalController} from '@ionic/angular/standalone';
AlertController,
AnimationBuilder,
AnimationController,
ModalController,
} from '@ionic/angular/standalone';
import {Capacitor} from '@capacitor/core'; import {Capacitor} from '@capacitor/core';
import { import {
SCFacet, SCFacet,
@@ -41,8 +36,8 @@ import {PositionService} from '../../map/position.service';
import {ConfigProvider} from '../../config/config.provider'; import {ConfigProvider} from '../../config/config.provider';
import {searchPageSwitchAnimation} from './search-page-switch-animation'; import {searchPageSwitchAnimation} from './search-page-switch-animation';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {ContextMenuModalComponent} from '../../menu/context/context-menu-modal.component'; import {ContextMenuModalComponent} from "../../menu/context/context-menu-modal.component";
import {enterAnimation, leaveAnimation} from '../../menu/context/context-menu-modal.animations'; import {enterAnimation, leaveAnimation} from "../../menu/context/context-menu-modal.animations";
/** /**
* SearchPageComponent queries things and shows list of things as search results and filter as context menu * SearchPageComponent queries things and shows list of things as search results and filter as context menu
@@ -383,9 +378,8 @@ export class SearchPageComponent implements OnInit {
cssClass: 'context-menu-modal', cssClass: 'context-menu-modal',
showBackdrop: true, showBackdrop: true,
backdropDismiss: true, backdropDismiss: true,
mode: 'md', // TODO has to be fixed to md for now. ios mode is unresponsive. Remove if Issue 239 is solved enterAnimation: (baseEl: HTMLElement) => enterAnimation(baseEl, this.animationController),
enterAnimation: (baseElement: HTMLElement) => enterAnimation(baseElement, this.animationController), leaveAnimation: (baseEl: HTMLElement) => leaveAnimation(baseEl, this.animationController),
leaveAnimation: (baseElement: HTMLElement) => leaveAnimation(baseElement, this.animationController),
componentProps: { componentProps: {
contextMenuService: this.contextMenuService, contextMenuService: this.contextMenuService,
}, },

View File

@@ -37,8 +37,7 @@
> >
</ion-searchbar> </ion-searchbar>
@if (showContextMenu) { @if (showContextMenu) {
<!-- TODO has to be fixed to md for now. ios mode displays broken/missing icon --> <ion-menu-button menu="context" auto-hide="false" slot="end" (click)="openContextMenu()">
<ion-menu-button mode="md" menu="context" auto-hide="false" slot="end" (click)="openContextMenu()">
<ion-icon name="tune"></ion-icon> <ion-icon name="tune"></ion-icon>
</ion-menu-button> </ion-menu-button>
} }

View File

@@ -1,27 +1,14 @@
/*
* Copyright (C) 2025 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 {Animation, AnimationController} from '@ionic/angular'; import {Animation, AnimationController} from '@ionic/angular';
/** /**
* Defines the animation for showing a modal as a right-hand sidebar. * Defines the animation for showing a modal as a right-hand sidebar.
* @param baseElement The root element of the modal (including Shadow DOM). *
* @param baseEl The root element of the modal (including Shadow DOM).
* @param animationCtrl The Ionic AnimationController. * @param animationCtrl The Ionic AnimationController.
* @returns The configured Ionic animation. * @returns The configured Ionic animation.
*/ */
export const enterAnimation = (baseElement: HTMLElement, animationCtrl: AnimationController): Animation => { export const enterAnimation = (baseEl: HTMLElement, animationCtrl: AnimationController): Animation => {
const root = baseElement.shadowRoot; const root = baseEl.shadowRoot;
const backdrop = root?.querySelector('ion-backdrop'); const backdrop = root?.querySelector('ion-backdrop');
const wrapper = root?.querySelector('.modal-wrapper'); const wrapper = root?.querySelector('.modal-wrapper');
@@ -35,6 +22,7 @@ export const enterAnimation = (baseElement: HTMLElement, animationCtrl: Animatio
height: '100%', height: '100%',
width: '304px', width: '304px',
maxWidth: '75%', maxWidth: '75%',
margin: '0',
opacity: '1', opacity: '1',
}); });
} }
@@ -51,7 +39,7 @@ export const enterAnimation = (baseElement: HTMLElement, animationCtrl: Animatio
return animationCtrl return animationCtrl
.create() .create()
.addElement(baseElement) .addElement(baseEl)
.duration(400) .duration(400)
.easing('ease-out') .easing('ease-out')
.addAnimation([backdropAnimation, wrapperAnimation]); .addAnimation([backdropAnimation, wrapperAnimation]);
@@ -59,10 +47,11 @@ export const enterAnimation = (baseElement: HTMLElement, animationCtrl: Animatio
/** /**
* Defines the animation for hiding a modal by sliding it out to the right. * Defines the animation for hiding a modal by sliding it out to the right.
* @param baseElement The root element of the modal. *
* @param baseEl The root element of the modal.
* @param animationCtrl The Ionic AnimationController. * @param animationCtrl The Ionic AnimationController.
* @returns The configured Ionic animation (reverse of enterAnimation). * @returns The configured Ionic animation (reverse of enterAnimation).
*/ */
export const leaveAnimation = (baseElement: HTMLElement, animationCtrl: AnimationController): Animation => { export const leaveAnimation = (baseEl: HTMLElement, animationCtrl: AnimationController): Animation => {
return enterAnimation(baseElement, animationCtrl).direction('reverse'); return enterAnimation(baseEl, animationCtrl).direction('reverse');
}; };

View File

@@ -1,180 +0,0 @@
/*
* Copyright (C) 2025 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-non-null-assertion,@typescript-eslint/no-explicit-any */
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {FormsModule} from '@angular/forms';
import {CommonModule} from '@angular/common';
import {TranslateModule} from '@ngx-translate/core';
import {IonicModule} from '@ionic/angular';
import {SCThingType} from '@openstapps/core';
import {ContextMenuModalComponent} from './context-menu-modal.component';
import {ContextMenuService} from './context-menu.service';
import {FilterContext, SortContext} from './context-type';
import {provideIonicAngular, ModalController} from '@ionic/angular/standalone';
import {BehaviorSubject, of} from 'rxjs';
import {addIcons} from 'ionicons';
import {swapVertical, trash, menu} from 'ionicons/icons';
describe('ContextMenuModalComponent', () => {
let fixture: ComponentFixture<ContextMenuModalComponent>;
let component: ContextMenuModalComponent;
let modalControllerSpy: jasmine.SpyObj<ModalController>;
let contextMenuServiceMock: Partial<ContextMenuService>;
// Register used icons (suppress warnings)
addIcons({
delete: trash,
sort: swapVertical,
menu: menu,
});
beforeEach(async () => {
modalControllerSpy = jasmine.createSpyObj<ModalController>('ModalController', ['dismiss']);
contextMenuServiceMock = {
filterOptions: new BehaviorSubject<FilterContext | undefined>(getFilterContextType()),
sortOptions: new BehaviorSubject<SortContext | undefined>(getSortContextType()),
filterContextChanged$: of(getFilterContextType()),
sortContextChanged$: of(getSortContextType()),
contextFilterChanged: jasmine.createSpy(),
contextSortChanged: jasmine.createSpy(),
};
await TestBed.configureTestingModule({
declarations: [ContextMenuModalComponent],
imports: [CommonModule, FormsModule, TranslateModule.forRoot(), IonicModule.forRoot()],
providers: [
provideIonicAngular(),
{
provide: ModalController,
useValue: modalControllerSpy,
},
{
provide: ContextMenuService,
useValue: contextMenuServiceMock,
},
],
}).compileComponents();
fixture = TestBed.createComponent(ContextMenuModalComponent);
component = fixture.componentInstance;
component.contextMenuService = contextMenuServiceMock as ContextMenuService;
component.translator = {
translatedPropertyValue: () => 'translated',
} as any;
fixture.detectChanges();
});
it('should create the component', () => {
expect(component).toBeTruthy();
});
it('should load initial sort and filter context', () => {
expect(component.sortOption?.value).toBe('relevance');
expect(component.filterOption?.options?.length).toBeGreaterThan(0);
});
it('should display sort items', () => {
const sortItems = fixture.nativeElement.querySelectorAll('.sort-item');
expect(sortItems.length).toBe(component.sortOption.values.length);
});
it('should update and reverse sort value on click', () => {
const value = component.sortOption.values[1]; // "name", reversible
component.sortChanged(component.sortOption, value);
expect(component.sortOption.value).toBe('name');
expect(component.sortOption.reversed).toBeFalse();
component.sortChanged(component.sortOption, value);
expect(component.sortOption.reversed).toBeTrue();
});
it('should call contextFilterChanged when filter is reset', () => {
component.filterOption.options[0].buckets[0].checked = true;
component.resetFilter(component.filterOption);
const allUnchecked = component.filterOption.options.every(opt =>
opt.buckets.every(bucket => !bucket.checked),
);
expect(allUnchecked).toBeTrue();
expect(contextMenuServiceMock.contextFilterChanged).toHaveBeenCalled();
});
it('should dismiss the modal', () => {
component.dismiss();
expect(modalControllerSpy.dismiss).toHaveBeenCalled();
});
});
/**
*
*/
function getSortContextType(): SortContext {
return {
name: 'sort',
reversed: false,
value: 'relevance',
values: [
{value: 'relevance', reversible: false},
{value: 'name', reversible: true},
{value: 'date', reversible: true},
{value: 'type', reversible: true},
],
};
}
/**
*
*/
function getFilterContextType(): FilterContext {
return {
name: 'filter',
compact: false,
options: facetsMock
.filter(facet => facet.buckets.length > 0)
.map((facet, i) => ({
buckets: facet.buckets.map(bucket => ({
count: bucket.count,
key: bucket.key,
checked: false,
})),
compact: false,
field: facet.field,
onlyOnType: facet.onlyOnType,
info: {
onlyOnType: facet.onlyOnType,
field: facet.field,
sortOrder: i,
},
})),
};
}
const facetsMock = [
{
buckets: [
{count: 10, key: 'lecture'},
{count: 5, key: 'seminar'},
],
field: 'type',
onlyOnType: SCThingType.AcademicEvent,
},
{
buckets: [{count: 7, key: 'research'}],
field: 'categories',
onlyOnType: SCThingType.AcademicEvent,
},
];

View File

@@ -1,43 +1,26 @@
/* import {LangChangeEvent,TranslateService} from '@ngx-translate/core';
* Copyright (C) 2025 StApps import {SCLanguage,SCThingTranslator,SCThingType,SCTranslations} from '@openstapps/core';
* 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 {LangChangeEvent, TranslateService} from '@ngx-translate/core';
import {SCLanguage, SCThingTranslator, SCThingType, SCTranslations} from '@openstapps/core';
import {ContextMenuService} from './context-menu.service'; import {ContextMenuService} from './context-menu.service';
import {FilterContext, FilterFacet, SortContext, SortContextOption} from './context-type.js'; import {FilterContext,FilterFacet,SortContext,SortContextOption} from './context-type.js';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {ModalController} from '@ionic/angular/standalone'; import {ModalController} from '@ionic/angular/standalone';
import {Component, Input, OnInit, OnDestroy} from '@angular/core'; import {Component,Input} from '@angular/core';
import {Subject, takeUntil} from 'rxjs'; import {Subject,takeUntil} from 'rxjs';
@Component({ @Component({
selector: 'stapps-context-menu-modal', selector: 'stapps-context-menu-modal',
templateUrl: './context-menu-modal.html', templateUrl: './context-menu-modal.html',
}) })
export class ContextMenuModalComponent implements OnInit, OnDestroy { export class ContextMenuModalComponent {
@Input() contextMenuService: ContextMenuService; @Input() contextMenuService: ContextMenuService;
compactFilterOptionCount = 5; compactFilterOptionCount = 5;
filterOption: FilterContext; filterOption: FilterContext;
sortOption: SortContext; sortOption: SortContext;
language: keyof SCTranslations<SCLanguage>; language: keyof SCTranslations<SCLanguage>;
translator: SCThingTranslator; translator: SCThingTranslator;
scThingType = SCThingType; scThingType = SCThingType;
// Using a subject to manage subscriptions for clean-up // Using a subject to manage subscriptions for clean-up
@@ -45,15 +28,17 @@ export class ContextMenuModalComponent implements OnInit, OnDestroy {
constructor( constructor(
private translateService: TranslateService, private translateService: TranslateService,
private readonly modalController: ModalController, private readonly modalCtrl: ModalController
) { ) {
this.language = this.translateService.currentLang as keyof SCTranslations<SCLanguage>; this.language = this.translateService.currentLang as keyof SCTranslations<SCLanguage>;
this.translator = new SCThingTranslator(this.language); this.translator = new SCThingTranslator(this.language);
this.translateService.onLangChange.pipe(takeUntilDestroyed()).subscribe((event: LangChangeEvent) => { this.translateService.onLangChange
this.language = event.lang as keyof SCTranslations<SCLanguage>; .pipe(takeUntilDestroyed())
this.translator = new SCThingTranslator(this.language); .subscribe((event: LangChangeEvent) => {
}); this.language = event.lang as keyof SCTranslations<SCLanguage>;
this.translator = new SCThingTranslator(this.language);
});
} }
ngOnInit(): void { ngOnInit(): void {
@@ -68,17 +53,21 @@ export class ContextMenuModalComponent implements OnInit, OnDestroy {
} }
// Move the subscription logic here. It's now safe to access this.contextMenuService. // Move the subscription logic here. It's now safe to access this.contextMenuService.
this.contextMenuService.filterContextChanged$.pipe(takeUntil(this.destroy$)).subscribe(fc => { this.contextMenuService.filterContextChanged$
if (fc) { .pipe(takeUntil(this.destroy$))
this.filterOption = fc; .subscribe(fc => {
} if (fc) {
}); this.filterOption = fc;
}
});
this.contextMenuService.sortContextChanged$.pipe(takeUntil(this.destroy$)).subscribe(sc => { this.contextMenuService.sortContextChanged$
if (sc) { .pipe(takeUntil(this.destroy$))
this.sortOption = sc; .subscribe(sc => {
} if (sc) {
}); this.sortOption = sc;
}
});
} }
ngOnDestroy(): void { ngOnDestroy(): void {
@@ -122,6 +111,6 @@ export class ContextMenuModalComponent implements OnInit, OnDestroy {
} }
dismiss() { dismiss() {
this.modalController.dismiss(); this.modalCtrl.dismiss();
} }
} }

View File

@@ -1,22 +1,8 @@
<!--
~ Copyright (C) 2025 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/>.
-->
<ion-header> <ion-header>
<ion-toolbar color="primary" mode="ios"> <ion-toolbar color="primary" mode="ios">
<ion-label class="ion-padding-horizontal"> <ion-label class="ion-padding-horizontal">
<h1 class="ion-padding-horizontal">{{ 'menu.context.title' | translate | titlecase }}</h1> <h1 class="ion-padding-horizontal">{{ 'menu.context.title' | translate | titlecase }}</h1>
</ion-label> </ion-label>
</ion-toolbar> </ion-toolbar>
</ion-header> </ion-header>
@@ -34,7 +20,7 @@
(click)="sortChanged(sortOption, value)" (click)="sortChanged(sortOption, value)"
> >
<ion-radio [value]="i"> <ion-radio [value]="i">
{{ 'menu.context.sort.' + value.value | translate | titlecase }} {{ ('menu.context.sort.' + value.value) | translate | titlecase }}
<span *ngIf="sortOption.value === value.value && value.reversible"> <span *ngIf="sortOption.value === value.value && value.reversible">
<ion-icon *ngIf="sortOption.reversed" name="arrow_downward"></ion-icon> <ion-icon *ngIf="sortOption.reversed" name="arrow_downward"></ion-icon>
<ion-icon *ngIf="!sortOption.reversed" name="arrow_upward"></ion-icon> <ion-icon *ngIf="!sortOption.reversed" name="arrow_upward"></ion-icon>
@@ -57,18 +43,12 @@
<ion-list class="filter-group" *ngFor="let facet of facets"> <ion-list class="filter-group" *ngFor="let facet of facets">
<ion-list-header class="h3"> <ion-list-header class="h3">
<ion-label> <ion-label>
<span *ngIf="facet.info.onlyOnType" <span *ngIf="facet.info.onlyOnType"><b>{{ facet.info.onlyOnType | titlecase }}</b> / </span>
><b>{{ facet.info.onlyOnType | titlecase }}</b> /
</span>
{{ facet.info.field | titlecase }} {{ facet.info.field | titlecase }}
</ion-label> </ion-label>
</ion-list-header> </ion-list-header>
<ng-container <ng-container *ngFor="let bucket of !facet.compact ? facet.buckets.slice(0, compactFilterOptionCount) : facet.buckets">
*ngFor="
let bucket of !facet.compact ? facet.buckets.slice(0, compactFilterOptionCount) : facet.buckets
"
>
<ion-item> <ion-item>
<ion-checkbox <ion-checkbox
[(ngModel)]="bucket.checked" [(ngModel)]="bucket.checked"
@@ -85,18 +65,15 @@
{{ {{
facet.field === 'type' facet.field === 'type'
? (getTranslatedPropertyValue($any(bucket.key), 'type') | titlecase) ? (getTranslatedPropertyValue($any(bucket.key), 'type') | titlecase)
: (facet.onlyOnType && getTranslatedPropertyValue(facet.onlyOnType, facet.field, bucket.key) : (facet.onlyOnType &&
| titlecase) getTranslatedPropertyValue(facet.onlyOnType, facet.field, bucket.key)
| titlecase)
}} }}
</ion-checkbox> </ion-checkbox>
</ion-item> </ion-item>
</ng-container> </ng-container>
<ion-button <ion-button *ngIf="!facet.compact && facet.buckets.length > compactFilterOptionCount" fill="clear" (click)="facet.compact = true">
*ngIf="!facet.compact && facet.buckets.length > compactFilterOptionCount"
fill="clear"
(click)="facet.compact = true"
>
{{ 'menu.context.filter.showAll' | translate }} {{ 'menu.context.filter.showAll' | translate }}
</ion-button> </ion-button>
</ion-list> </ion-list>

View File

@@ -0,0 +1,303 @@
/*
* 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-non-null-assertion, @typescript-eslint/ban-ts-comment */
import {APP_BASE_HREF, CommonModule, Location, LocationStrategy, PathLocationStrategy} from '@angular/common';
import {ComponentFixture, TestBed} from '@angular/core/testing';
import {FormsModule} from '@angular/forms';
import {ChildrenOutletContexts, RouterModule, UrlSerializer} from '@angular/router';
import {TranslateModule} from '@ngx-translate/core';
import {SCFacet, SCThingType} from '@openstapps/core';
import {ContextMenuComponent} from './context-menu.component';
import {SettingsModule} from '../../settings/settings.module';
import {ContextMenuService} from './context-menu.service';
import {FilterContext, SortContext} from './context-type';
import {Component} from '@angular/core';
import {By} from '@angular/platform-browser';
import {provideIonicAngular} from '@ionic/angular/standalone';
@Component({
template: `<ion-content id="foo"></ion-content><stapps-context contentId="foo"></stapps-context> `,
})
class ContextMenuContainerComponent {}
describe('ContextMenuComponent', async () => {
let fixture: ComponentFixture<ContextMenuContainerComponent>;
let instance: ContextMenuComponent;
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [ContextMenuComponent, ContextMenuContainerComponent],
providers: [
provideIonicAngular(),
ChildrenOutletContexts,
Location,
UrlSerializer,
ContextMenuService,
{provide: LocationStrategy, useClass: PathLocationStrategy},
{provide: APP_BASE_HREF, useValue: '/'},
],
imports: [
FormsModule,
TranslateModule.forRoot(),
CommonModule,
SettingsModule,
RouterModule.forRoot([]),
],
}).compileComponents();
fixture = TestBed.createComponent(ContextMenuContainerComponent);
instance = fixture.debugElement.query(By.directive(ContextMenuComponent)).componentInstance;
});
it('should show items in sort context', () => {
instance.sortOption = getSortContextType();
fixture.detectChanges();
const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort');
expect(sort!.querySelector('ion-radio')?.textContent).toContain('relevance');
});
it('should show items in filter context', () => {
instance.filterOption = getFilterContextType();
fixture.detectChanges();
const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter');
const filterItem = filter.querySelector('.filter-group');
expect(filterItem!.querySelector('ion-list-header')!.textContent).toContain('Type');
});
it('should set sort context value and reverse on click', () => {
instance.sortOption = getSortContextType();
fixture.detectChanges();
const sort: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-sort');
// @ts-expect-error not relevant for this case
const sortItem: HTMLElement = sort.querySelectorAll('.sort-item')[1];
sortItem!.click();
expect(instance.sortOption.value).toEqual('name');
expect(instance.sortOption.reversed).toBe(false);
// click again for reverse
sortItem!.click();
expect(instance.sortOption.reversed).toBe(true);
});
it('should show all filterable facets', () => {
// get set facets with non empty buckets
const facets: SCFacet[] = getFilterContextType().options;
instance.filterOption = getFilterContextType();
fixture.detectChanges();
// get filter context div
const filter: HTMLElement = fixture.debugElement.nativeElement.querySelector('.context-filter');
// get all filter groups that represent a facet
const filterGroups = filter.querySelectorAll('.filter-group');
expect(filterGroups.length).toEqual(facets.length);
for (const facet of facets) {
let filterGroup;
// get filter option for facets field
// eslint-disable-next-line unicorn/no-array-for-each
filterGroups.forEach(element => {
if (
element
.querySelector('ion-list-header')!
.textContent!.toString()
.toLowerCase()
.includes(facet.field)
) {
filterGroup = element;
return;
}
});
expect(filterGroup).toBeDefined();
const filterItems = filterGroup!.querySelectorAll('.filter-item-label');
if (filterItems.length !== facet.buckets.length) {
console.log(JSON.stringify(facet));
}
expect(filterItems.length).toEqual(facet.buckets.length);
// check all buckets are shown
for (const bucket of facet.buckets) {
let filterItem;
for (let i = 0; i < filterItems.length; i++) {
if (
filterItems.item(i).textContent!.toString().toLowerCase().indexOf(bucket.key.toLowerCase()) > 0
) {
filterItem = filterItems.item(i);
break;
}
}
expect(filterItem).toBeDefined();
}
}
});
it('should reset filter', () => {
instance.filterOption = getFilterContextType();
instance.filterOption.options = [
{
field: 'type',
buckets: [{count: 10, key: 'date series', checked: true}],
info: {
onlyOnType: SCThingType.AcademicEvent,
field: 'date series',
sortOrder: 0,
},
},
];
fixture.detectChanges();
// click reset button
const resetButton: HTMLElement = fixture.debugElement.nativeElement.querySelector('.resetFilterButton');
resetButton.click();
expect(instance.filterOption.options[0].buckets[0].checked).toEqual(false);
});
});
/**
*
*/
function getSortContextType(): SortContext {
return {
name: 'sort',
reversed: false,
value: 'relevance',
values: [
{
reversible: false,
value: 'relevance',
},
{
reversible: true,
value: 'name',
},
{
reversible: true,
value: 'date',
},
{
reversible: true,
value: 'type',
},
],
};
}
/**
*
*/
function getFilterContextType(): FilterContext {
return {
name: 'filter',
compact: false,
options: facetsMock
.filter(facet => facet.buckets.length > 0)
.map((facet, i) => {
return {
buckets: facet.buckets.map(bucket => {
return {
count: bucket.count,
key: bucket.key,
checked: false,
};
}),
compact: false,
field: facet.field,
onlyOnType: facet.onlyOnType,
info: {
onlyOnType: facet.onlyOnType,
field: facet.field,
sortOrder: i,
},
};
}),
};
}
const facetsMock: SCFacet[] = [
{
buckets: [
{
count: 60,
key: 'academic event',
},
{
count: 160,
key: 'message',
},
{
count: 151,
key: 'date series',
},
{
count: 106,
key: 'dish',
},
{
count: 20,
key: 'building',
},
],
field: 'type',
},
{
buckets: [
{
count: 12,
key: 'Max Mustermann',
},
{
count: 2,
key: 'Foo Bar',
},
],
field: 'performers',
onlyOnType: SCThingType.AcademicEvent,
},
{
buckets: [
{
count: 5,
key: 'colloquium',
},
{
count: 15,
key: 'course',
},
],
field: 'categories',
onlyOnType: SCThingType.AcademicEvent,
},
{
buckets: [
{
count: 5,
key: 'employees',
},
{
count: 15,
key: 'students',
},
],
field: 'audiences',
onlyOnType: SCThingType.Message,
},
];

View File

@@ -12,13 +12,14 @@
* You should have received a copy of the GNU General Public License along with * 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 program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {TestBed} from '@angular/core/testing'; import {TestBed} from '@angular/core/testing';
import {ContextMenuService} from './context-menu.service'; import {ContextMenuService} from './context-menu.service';
import {SCFacet} from '@openstapps/core'; import {SCFacet} from '@openstapps/core';
import {FilterContext, SortContext} from './context-type'; import {FilterContext, SortContext} from './context-type';
import {ThingTranslateModule} from '../../../translation/thing-translate.module'; import {ThingTranslateModule} from '../../../translation/thing-translate.module';
import {TranslateModule} from '@ngx-translate/core'; import {TranslateModule} from '@ngx-translate/core';
import {firstValueFrom, filter} from 'rxjs';
describe('ContextMenuService', () => { describe('ContextMenuService', () => {
let service: ContextMenuService; let service: ContextMenuService;
@@ -35,39 +36,39 @@ describe('ContextMenuService', () => {
expect(service).toBeTruthy(); expect(service).toBeTruthy();
}); });
it('should update filterOptions', async () => { it('should update filterOptions', done => {
service.filterContextChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.updateContextFilter(facetsMock); service.updateContextFilter(facetsMock);
const result = await firstValueFrom(service.filterContextChanged$.pipe(filter(Boolean)));
expect(result).toBeDefined();
}); });
it('should update filterQuery', async () => { it('should update filterQuery', done => {
service.filterContextChanged$.subscribe(result => {
expect(result).toBeDefined();
expect(service.contextFilter.options[0].buckets.length).toEqual(
filterContext.options[0].buckets.length,
);
done();
});
service.updateContextFilter(facetsMock); service.updateContextFilter(facetsMock);
const result = await firstValueFrom(service.filterContextChanged$.pipe(filter(Boolean)));
expect(result).toBeDefined();
const current = service.contextFilter;
expect(current.options[0].buckets.length).toEqual(filterContext.options[0].buckets.length);
}); });
it('should update sortOptions', async () => { it('should update sortOptions', done => {
service.sortContextChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.setContextSort(sortContext); service.setContextSort(sortContext);
const result = await firstValueFrom(service.sortContextChanged$.pipe(filter(Boolean)));
expect(result).toBeDefined();
}); });
it('should update sortQuery', async () => { it('should update sortQuery', done => {
service.sortContextChanged$.subscribe(result => {
expect(result).toBeDefined();
done();
});
service.setContextSort(sortContext); service.setContextSort(sortContext);
const result = await firstValueFrom(service.sortContextChanged$.pipe(filter(Boolean)));
expect(result).toBeDefined();
}); });
}); });

View File

@@ -40,7 +40,7 @@ import {
IonToolbar, IonToolbar,
} from '@ionic/angular/standalone'; } from '@ionic/angular/standalone';
import {IonIconDirective} from 'src/app/util/ion-icon/ion-icon.directive'; import {IonIconDirective} from 'src/app/util/ion-icon/ion-icon.directive';
import {ContextMenuModalComponent} from './context/context-menu-modal.component'; import {ContextMenuModalComponent} from "./context/context-menu-modal.component";
/** /**
* Menu module * Menu module

View File

@@ -62,9 +62,7 @@ export class TabsComponent {
void this.loadMenuEntries(); void this.loadMenuEntries();
this.router.events.subscribe((event: unknown) => { this.router.events.subscribe((event: unknown) => {
if (event instanceof NavigationEnd) { if (event instanceof NavigationEnd) {
setTimeout(() => { this.selectTab(event.url);
this.selectTab(event.url);
}, 300);
} }
}); });
this.selectTab(router.url); this.selectTab(router.url);

View File

@@ -136,7 +136,7 @@ export class SchedulePageComponent implements OnInit, AfterViewInit {
onInit() { onInit() {
this.tabChoreographer = new SharedAxisChoreographer(this.activatedRoute.snapshot.paramMap.get('mode'), [ this.tabChoreographer = new SharedAxisChoreographer(this.activatedRoute.snapshot.paramMap.get('mode'), [
'calendar', 'calendar',
'weekly-view', 'week-overview',
'single', 'single',
]); ]);
} }

View File

@@ -21,7 +21,7 @@
@if (tabChoreographer.currentValue === 'calendar') { @if (tabChoreographer.currentValue === 'calendar') {
<ion-title [innerHTML]="'schedule.calendar' | translate | titlecase"></ion-title> <ion-title [innerHTML]="'schedule.calendar' | translate | titlecase"></ion-title>
} }
@if (tabChoreographer.currentValue === 'weekly-view') { @if (tabChoreographer.currentValue === 'week-overview') {
<ion-title [innerHTML]="'schedule.recurring' | translate | titlecase"></ion-title> <ion-title [innerHTML]="'schedule.recurring' | translate | titlecase"></ion-title>
} }
@if (tabChoreographer.currentValue === 'single') { @if (tabChoreographer.currentValue === 'single') {
@@ -39,7 +39,7 @@
<ion-label class="ion-text-wrap" [innerHTML]="'schedule.calendar' | translate"></ion-label> <ion-label class="ion-text-wrap" [innerHTML]="'schedule.calendar' | translate"></ion-label>
<ion-icon name="calendar_today"></ion-icon> <ion-icon name="calendar_today"></ion-icon>
</ion-segment-button> </ion-segment-button>
<ion-segment-button value="weekly-view" layout="icon-start"> <ion-segment-button value="week-overview" layout="icon-start">
<ion-label class="ion-text-wrap" [innerHTML]="'schedule.recurring' | translate"></ion-label> <ion-label class="ion-text-wrap" [innerHTML]="'schedule.recurring' | translate"></ion-label>
<ion-icon name="event_repeat"></ion-icon> <ion-icon name="event_repeat"></ion-icon>
</ion-segment-button> </ion-segment-button>
@@ -61,7 +61,7 @@
<stapps-calendar-view [layout]="layout"></stapps-calendar-view> <stapps-calendar-view [layout]="layout"></stapps-calendar-view>
} }
<!-- Schedule view needs full week --> <!-- Schedule view needs full week -->
@case ('weekly-view') { @case ('week-overview') {
<stapps-schedule-view [layout]="layout"></stapps-schedule-view> <stapps-schedule-view [layout]="layout"></stapps-schedule-view>
} }
@case ('single') { @case ('single') {

View File

@@ -66,7 +66,7 @@ import {IonIconDirective} from 'src/app/util/ion-icon/ion-icon.directive';
const settingsRoutes: Routes = [ const settingsRoutes: Routes = [
{path: 'schedule', redirectTo: 'schedule/calendar/now'}, {path: 'schedule', redirectTo: 'schedule/calendar/now'},
{path: 'schedule/calendar', redirectTo: 'schedule/calendar/now'}, {path: 'schedule/calendar', redirectTo: 'schedule/calendar/now'},
{path: 'schedule/weekly-view', redirectTo: 'schedule/weekly-view/now'}, {path: 'schedule/week-overview', redirectTo: 'schedule/week-overview/now'},
{path: 'schedule/single', redirectTo: 'schedule/single/now'}, {path: 'schedule/single', redirectTo: 'schedule/single/now'},
// calendar | recurring | single // calendar | recurring | single
{path: 'schedule/:mode/:date', component: SchedulePageComponent}, {path: 'schedule/:mode/:date', component: SchedulePageComponent},

View File

@@ -1,94 +0,0 @@
/*
* Copyright (C) 2022 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 unicorn/no-useless-undefined, @typescript-eslint/no-non-null-assertion */
import {TestBed} from '@angular/core/testing';
import {StorageProvider} from '../../storage/storage.provider';
import {
InAppReviewProvider,
IN_APP_REVIEW_COOLDOWN_DAYS,
IN_APP_REVIEW_NECESSARY_SESSIONS,
IN_APP_REVIEW_SETTINGS_KEY,
IN_APP_REVIEW_SESSIONS_KEY,
IN_APP_REVIEW_LAST_RATING_KEY,
} from './in-app-review.provider';
describe('InappRatingProvider', () => {
let storageProviderSpy: jasmine.SpyObj<StorageProvider>;
let inappRatingProvider: InAppReviewProvider;
const ONE_DAY_IN_MILLIS = 1000 * 3600 * 24;
beforeEach(async () => {
storageProviderSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']);
TestBed.configureTestingModule({
imports: [],
providers: [
InAppReviewProvider,
{
provide: StorageProvider,
useValue: storageProviderSpy,
},
],
});
// set settings returned from config
inappRatingProvider = TestBed.inject(InAppReviewProvider);
storageProviderSpy.has.and.returnValue(Promise.resolve(false));
});
it('should set user sessions count starting with one', async () => {
storageProviderSpy.get.and.returnValue(Promise.resolve(0));
const sessionCount = await inappRatingProvider.increaseSessionCount();
expect(sessionCount).toEqual(1);
});
it('should start in app rating/review flow if contitions are met', async () => {
const nowMinusCooldownDays = Date.now() - (IN_APP_REVIEW_COOLDOWN_DAYS + 1) * ONE_DAY_IN_MILLIS;
spyOn(inappRatingProvider, 'requestReview').and.returnValue(Promise.resolve());
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_SESSIONS_KEY}`)
.and.returnValue(Promise.resolve(IN_APP_REVIEW_NECESSARY_SESSIONS));
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_LAST_RATING_KEY}`)
.and.returnValue(Promise.resolve(nowMinusCooldownDays));
await inappRatingProvider.startInAppReviewIfFeasible();
expect(inappRatingProvider.requestReview).toHaveBeenCalledTimes(1);
});
it('should not start in app rating/review flow if contitions are not met', async () => {
const nowMinusCooldownDays = Date.now() - IN_APP_REVIEW_COOLDOWN_DAYS * ONE_DAY_IN_MILLIS;
spyOn(inappRatingProvider, 'requestReview').and.returnValue(Promise.resolve());
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_SESSIONS_KEY}`)
.and.returnValue(Promise.resolve(IN_APP_REVIEW_NECESSARY_SESSIONS - 1));
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_LAST_RATING_KEY}`)
.and.returnValue(Promise.resolve(nowMinusCooldownDays));
await inappRatingProvider.startInAppReviewIfFeasible();
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_SESSIONS_KEY}`)
.and.returnValue(Promise.resolve(IN_APP_REVIEW_NECESSARY_SESSIONS));
storageProviderSpy.get
.withArgs(`${IN_APP_REVIEW_SETTINGS_KEY}.${IN_APP_REVIEW_LAST_RATING_KEY}`)
.and.returnValue(Promise.resolve(nowMinusCooldownDays + ONE_DAY_IN_MILLIS));
await inappRatingProvider.startInAppReviewIfFeasible();
expect(inappRatingProvider.requestReview).toHaveBeenCalledTimes(0);
});
});

View File

@@ -1,120 +0,0 @@
import {Injectable} from '@angular/core';
import {InAppReview} from '@capacitor-community/in-app-review';
import {StorageProvider} from '../../storage/storage.provider';
export const IN_APP_REVIEW_COOLDOWN_DAYS = 365;
export const IN_APP_REVIEW_NECESSARY_SESSIONS = 3;
export const IN_APP_REVIEW_SETTINGS_KEY = 'inapp-rating';
export const IN_APP_REVIEW_SESSIONS_KEY = 'sessions';
export const IN_APP_REVIEW_LAST_RATING_KEY = 'last-rating';
export type IN_APP_REVIEW_KEYS = typeof IN_APP_REVIEW_SESSIONS_KEY | typeof IN_APP_REVIEW_LAST_RATING_KEY;
/**
* Provider for In-App Review
*/
@Injectable()
export class InAppReviewProvider {
requestReview: () => Promise<void>;
/**
* @param storageProvider TODO
*/
constructor(private readonly storageProvider: StorageProvider) {
this.requestReview = InAppReview.requestReview;
}
/**
*
*/
private inappRatingSettingStorageKey(key: string): string {
return `${IN_APP_REVIEW_SETTINGS_KEY}.${key}`;
}
/**
*
*/
private async getInAppReviewSetting<T>(
key: IN_APP_REVIEW_KEYS,
defaultValue: T,
): Promise<typeof defaultValue> {
try {
return await this.storageProvider.get<typeof defaultValue>(this.inappRatingSettingStorageKey(key));
} catch {
return defaultValue;
}
}
/**
*
*/
private async setInAppReviewSetting<T>(key: IN_APP_REVIEW_KEYS, value: T) {
return this.storageProvider.put<typeof value>(this.inappRatingSettingStorageKey(key), value);
}
/**
*
*/
private async setInAppReviewSessions(value: number) {
return this.setInAppReviewSetting(IN_APP_REVIEW_SESSIONS_KEY, value);
}
/**
*
*/
private async getInAppReviewSessions(): Promise<number> {
return this.getInAppReviewSetting(IN_APP_REVIEW_SESSIONS_KEY, 0);
}
/**
*
*/
private async setInAppReviewLastRating(value: Date) {
return this.setInAppReviewSetting(IN_APP_REVIEW_LAST_RATING_KEY, value.getTime());
}
/**
*
*/
private async getInAppReviewLastRating(): Promise<Date> {
return this.getInAppReviewSetting(IN_APP_REVIEW_LAST_RATING_KEY, 0).then(timestamp => {
return new Date(timestamp);
});
}
/**
* Increases session count to keep local info how often the app was used.
*/
public async increaseSessionCount(increment = 1): Promise<number> {
try {
const currentSessions = await this.getInAppReviewSessions();
await this.setInAppReviewSessions(currentSessions + increment);
return currentSessions + increment;
} catch {
return -1;
}
}
/**
* Invokes In App Review Flow/Views depending on the OS iff conditions are met.
*/
public async startInAppReviewIfFeasible(): Promise<boolean> {
try {
const currentSessions = await this.getInAppReviewSessions();
const lastRating = await this.getInAppReviewLastRating();
const dateDiffMillis = Math.abs(lastRating.getTime() - Date.now());
const dateDiffDays = Math.floor(dateDiffMillis / (1000 * 3600 * 24));
if (currentSessions < IN_APP_REVIEW_NECESSARY_SESSIONS || dateDiffDays < IN_APP_REVIEW_COOLDOWN_DAYS) {
return false;
}
await this.requestReview();
await this.setInAppReviewLastRating(new Date());
return true;
} catch {
return false;
}
}
}

View File

@@ -33,7 +33,7 @@
} }
<ion-card-content> <ion-card-content>
@if (!compactView) { @if (!compactView) {
<ion-note>{{ 'description' | thingTranslate: setting }}</ion-note> <ion-note>{{ 'description' | thingTranslate: setting | titlecase }}</ion-note>
} }
@if (isVisible) { @if (isVisible) {
<div> <div>

View File

@@ -55,7 +55,6 @@ import {
IonToolbar, IonToolbar,
} from '@ionic/angular/standalone'; } from '@ionic/angular/standalone';
import {IonIconDirective} from 'src/app/util/ion-icon/ion-icon.directive'; import {IonIconDirective} from 'src/app/util/ion-icon/ion-icon.directive';
import {InAppReviewProvider} from './in-app-review/in-app-review.provider';
const settingsRoutes: Routes = [{path: 'settings', component: SettingsPageComponent}]; const settingsRoutes: Routes = [{path: 'settings', component: SettingsPageComponent}];
@@ -102,13 +101,6 @@ const settingsRoutes: Routes = [{path: 'settings', component: SettingsPageCompon
IonInput, IonInput,
IonNote, IonNote,
], ],
providers: [ providers: [ScheduleSyncService, SettingsProvider, CalendarService, ScheduleProvider, ThingTranslatePipe],
ScheduleSyncService,
SettingsProvider,
InAppReviewProvider,
CalendarService,
ScheduleProvider,
ThingTranslatePipe,
],
}) })
export class SettingsModule {} export class SettingsModule {}

View File

@@ -304,8 +304,8 @@ describe('SettingsProvider', () => {
}, },
en: { en: {
description: description:
'The user group the app is going to use primarily.' + 'The user group the app is going to be used.' +
' This settings for example is getting used for the predefined price category of mensa meals.', 'This settings for example is getting used for the predefined price category of mensa meals.',
name: 'Group', name: 'Group',
}, },
}, },

View File

@@ -106,6 +106,7 @@ describe('StorageProvider', () => {
}); });
it('should put multiple values into the storage', async () => { it('should put multiple values into the storage', async () => {
// @ts-expect-error no need to return anything for this case
spyOn(storageProvider, 'put').and.callFake(() => Promise.resolve()); spyOn(storageProvider, 'put').and.callFake(() => Promise.resolve());
await storageProvider.putMultiple(sampleEntries); await storageProvider.putMultiple(sampleEntries);

View File

@@ -120,9 +120,8 @@ export class StorageProvider {
* Puts a value of type T into the storage using provided key * Puts a value of type T into the storage using provided key
* @param key Unique identifier * @param key Unique identifier
* @param value Resource to store under the key * @param value Resource to store under the key
* @returns Returns a promise that resolves when the key and value are set
*/ */
async put<T>(key: string, value: T) { async put<T>(key: string, value: T): Promise<T> {
return this.storage.set(key, value); return this.storage.set(key, value);
} }

View File

@@ -150,7 +150,7 @@ const iconMap = new Map<string, MaterialSymbol>([
[menuSharp, SCIcon.menu], [menuSharp, SCIcon.menu],
[searchOutline, SCIcon.search], [searchOutline, SCIcon.search],
[searchSharp, SCIcon.search], [searchSharp, SCIcon.search],
[chevronExpand, SCIcon.expand_all], [chevronExpand, SCIcon.expand_more],
[caretDownSharp, SCIcon.expand_more], [caretDownSharp, SCIcon.expand_more],
[close, SCIcon.close], [close, SCIcon.close],
[closeSharp, SCIcon.close], [closeSharp, SCIcon.close],

File diff suppressed because one or more lines are too long

View File

@@ -500,7 +500,7 @@
"view": { "view": {
"today": "Heute" "today": "Heute"
}, },
"recurring": "Wochen&shy;ansicht", "recurring": "Wochen&shy;übersicht",
"calendar": "Kalender", "calendar": "Kalender",
"single": "Einzel&shy;termine", "single": "Einzel&shy;termine",
"addEventPage": { "addEventPage": {

View File

@@ -500,7 +500,7 @@
"view": { "view": {
"today": "Today" "today": "Today"
}, },
"recurring": "Weekly View", "recurring": "Week Overview",
"calendar": "Calendar", "calendar": "Calendar",
"single": "Single Events", "single": "Single Events",
"addEventPage": { "addEventPage": {

View File

@@ -62,7 +62,7 @@ export const profilePageSections: SCSection[] = [
links: [ links: [
{ {
name: 'Favorites', name: 'Favorites',
icon: SCIcon.star, icon: SCIcon.grade,
link: ['/favorites'], link: ['/favorites'],
translations: { translations: {
de: { de: {

View File

@@ -17,13 +17,14 @@ $icon-size: 22px;
app-root ion-searchbar[class*='sc-ion-searchbar-'] { app-root ion-searchbar[class*='sc-ion-searchbar-'] {
--border-radius: var(--border-radius-default); --border-radius: var(--border-radius-default);
--background: var(--ion-item-background) !important; --background: var(--ion-item-background) !important;
--box-shadow: none;
height: 38px; height: 38px;
padding-top: 0; padding-top: 0;
padding-bottom: 0; padding-bottom: 0;
&.filterable { &.filterable {
--box-shadow: none;
position: relative; position: relative;
padding-right: 0; padding-right: 0;
padding-left: 0; padding-left: 0;

View File

@@ -1,11 +1,5 @@
# @openstapps/app-builder-image # @openstapps/app-builder-image
## 4.0.3
### Patch Changes
- 3a274a3a: Upgrade to Capacitor 7 and Anuglar 18
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -11,7 +11,7 @@ ENV ANDROID_APIS="android-34" \
NODE_VERSION="22.x" \ NODE_VERSION="22.x" \
NPM_VERSION="^10.0.0" \ NPM_VERSION="^10.0.0" \
IONIC_VERSION="^7.0.0" \ IONIC_VERSION="^7.0.0" \
CAPACITOR_VERSION="^7.0.0" \ CAPACITOR_VERSION="^6.0.0" \
CORDOVA_RES_VERSION="latest" \ CORDOVA_RES_VERSION="latest" \
### Configure download URLs ### Configure download URLs
ANDROID_SDK_TOOLS_DOWNLOAD_URL="https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip" \ ANDROID_SDK_TOOLS_DOWNLOAD_URL="https://dl.google.com/android/repository/commandlinetools-linux-13114758_latest.zip" \

View File

@@ -1,6 +1,6 @@
{ {
"name": "@openstapps/app-builder-image", "name": "@openstapps/app-builder-image",
"version": "4.0.3", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -34,7 +34,7 @@
"@changesets/cli": "2.26.1", "@changesets/cli": "2.26.1",
"deepmerge": "4.3.1", "deepmerge": "4.3.1",
"dotenv-cli": "7.2.1", "dotenv-cli": "7.2.1",
"glob": "10.5.0", "glob": "10.3.10",
"http-server": "14.1.1", "http-server": "14.1.1",
"junit-report-merger": "6.0.3", "junit-report-merger": "6.0.3",
"merge-cobertura": "1.0.1", "merge-cobertura": "1.0.1",

View File

@@ -1,23 +1,5 @@
# @openstapps/api-cli # @openstapps/api-cli
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/api@4.0.2
## 4.0.1
### Patch Changes
- Updated dependencies [b40ba7ad]
- @openstapps/api@4.0.1
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/api-cli", "name": "@openstapps/api-cli",
"description": "CLI client for @openstapps/api", "description": "CLI client for @openstapps/api",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/api.git", "repository": "git@gitlab.com:openstapps/api.git",

View File

@@ -1,24 +1,5 @@
# @openstapps/api-plugin # @openstapps/api-plugin
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/core@4.0.2
- @openstapps/core-tools@4.0.2
- @openstapps/api@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
- Updated dependencies [b40ba7ad]
- @openstapps/api@4.0.1
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/api-plugin", "name": "@openstapps/api-plugin",
"description": "Node.js library to interact with the StApps backend service", "description": "Node.js library to interact with the StApps backend service",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/api.git", "repository": "git@gitlab.com:openstapps/api.git",
@@ -36,14 +36,14 @@
"@openstapps/core": "workspace:*", "@openstapps/core": "workspace:*",
"@openstapps/core-tools": "workspace:*", "@openstapps/core-tools": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"@types/body-parser": "1.19.6", "@types/body-parser": "1.19.2",
"@types/express": "4.17.17", "@types/express": "4.17.17",
"@types/json-schema": "7.0.15", "@types/json-schema": "7.0.15",
"@types/morgan": "1.9.10", "@types/morgan": "1.9.4",
"body-parser": "1.20.3", "body-parser": "1.20.2",
"express": "4.21.2", "express": "4.18.2",
"json-schema": "0.4.0", "json-schema": "0.4.0",
"morgan": "1.10.1" "morgan": "1.10.0"
}, },
"devDependencies": { "devDependencies": {
"@openstapps/eslint-config": "workspace:*", "@openstapps/eslint-config": "workspace:*",

View File

@@ -1,18 +1,5 @@
# @openstapps/api # @openstapps/api
## 4.0.2
### Patch Changes
- @openstapps/core@4.0.2
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
- @openstapps/core@4.0.0
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/api", "name": "@openstapps/api",
"description": "Node.js library to interact with the StApps backend service", "description": "Node.js library to interact with the StApps backend service",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/api.git", "repository": "git@gitlab.com:openstapps/api.git",
@@ -58,7 +58,7 @@
"tsup": "8.5.0", "tsup": "8.5.0",
"typedoc": "0.25.12", "typedoc": "0.25.12",
"typescript": "5.4.2", "typescript": "5.4.2",
"undici": "6.21.3" "undici": "5.22.1"
}, },
"peerDependencies": { "peerDependencies": {
"@openstapps/core": "workspace:*" "@openstapps/core": "workspace:*"

View File

@@ -1,13 +1,5 @@
# @openstapps/core-tools # @openstapps/core-tools
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
- @openstapps/easy-ast@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/core-tools", "name": "@openstapps/core-tools",
"description": "Tools to convert and validate StAppsCore", "description": "Tools to convert and validate StAppsCore",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/core-tools.git", "repository": "git@gitlab.com:openstapps/core-tools.git",
@@ -55,7 +55,7 @@
"del": "6.1.1", "del": "6.1.1",
"flatted": "3.2.7", "flatted": "3.2.7",
"fs-extra": "10.1.0", "fs-extra": "10.1.0",
"glob": "10.5.0", "glob": "10.3.10",
"got": "12.6.0", "got": "12.6.0",
"humanize-string": "3.0.0", "humanize-string": "3.0.0",
"json-schema": "0.4.0", "json-schema": "0.4.0",

View File

@@ -1,11 +1,5 @@
# @openstapps/core # @openstapps/core
## 4.0.2
### Patch Changes
- @openstapps/core-tools@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/core", "name": "@openstapps/core",
"description": "StAppsCore - Generalized model of data", "description": "StAppsCore - Generalized model of data",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/core.git", "repository": "git@gitlab.com:openstapps/core.git",

View File

@@ -1,12 +1,5 @@
# @openstapps/easy-ast # @openstapps/easy-ast
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

View File

@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/easy-ast", "name": "@openstapps/easy-ast",
"description": "Tool to easily handle TypeScript AST", "description": "Tool to easily handle TypeScript AST",
"version": "4.0.2", "version": "4.0.0",
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
"repository": "git@gitlab.com:openstapps/core-tools.git", "repository": "git@gitlab.com:openstapps/core-tools.git",
@@ -25,7 +25,7 @@
"dependencies": { "dependencies": {
"@openstapps/collection-utils": "workspace:*", "@openstapps/collection-utils": "workspace:*",
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"glob": "10.5.0", "glob": "10.3.10",
"typescript": "5.4.2" "typescript": "5.4.2"
}, },
"devDependencies": { "devDependencies": {

View File

@@ -1,6 +1,5 @@
{ {
"extension": ["ts"], "extension": ["ts"],
"node-option": ["no-experimental-strip-types"],
"require": "ts-node/register", "require": "ts-node/register",
"reporter": "mocha-junit-reporter", "reporter": "mocha-junit-reporter",
"reporter-option": ["mochaFile=coverage/report-junit.xml"], "reporter-option": ["mochaFile=coverage/report-junit.xml"],

View File

@@ -1,11 +1,5 @@
# @openstapps/es-mapping-generator # @openstapps/es-mapping-generator
## 4.0.1
### Patch Changes
- b40ba7ad: Updated Elasticsearch dependency
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes

Some files were not shown because too many files have changed in this diff Show More