Compare commits

..

1 Commits

Author SHA1 Message Date
d4e15aa391 feat: pwa 2025-08-05 16:17:11 +02:00
172 changed files with 3133 additions and 4176 deletions

View File

@@ -0,0 +1,6 @@
---
"@openstapps/backend": patch
"@openstapps/logger": patch
---
Updated nodemailer 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,24 +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 ## 4.0.1
### Patch Changes ### Patch 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.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",

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,13 +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 ## 4.0.1
### Patch Changes ### Patch 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.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -1,14 +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 ## 4.0.1
### Patch Changes ### Patch 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.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -1,16 +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 ## 4.0.1
### Patch Changes ### Patch 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.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",

View File

@@ -1,21 +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 ## 4.0.1
### Patch Changes ### Patch 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,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

@@ -40,14 +40,16 @@
"glob": "CHANGELOG.md", "glob": "CHANGELOG.md",
"input": ".", "input": ".",
"output": "assets" "output": "assets"
} },
"src/manifest.webmanifest"
], ],
"styles": [ "styles": [
{ {
"input": "src/global.scss", "input": "src/global.scss",
"inject": true "inject": true
} }
] ],
"serviceWorker": "ngsw-config.json"
}, },
"configurations": { "configurations": {
"production": { "production": {
@@ -127,7 +129,8 @@
"glob": "**/*", "glob": "**/*",
"input": "src/assets", "input": "src/assets",
"output": "/assets" "output": "/assets"
} },
"src/manifest.webmanifest"
] ]
} }
}, },

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

@@ -26,7 +26,7 @@ describe('App', () => {
it('should have a proper title', () => { it('should have a proper title', () => {
cy.visit('/overview'); cy.visit('/overview');
cy.title().should('equal', 'StApps'); cy.title().should('equal', 'Goethe-Uni');
}); });
it('should have a proper working navigation', () => { it('should have a proper working navigation', () => {

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

@@ -0,0 +1,21 @@
{
"$schema": "./node_modules/@angular/service-worker/config/schema.json",
"index": "/index.html",
"assetGroups": [
{
"name": "app",
"installMode": "prefetch",
"resources": {
"files": ["/favicon.ico", "/index.html", "/manifest.webmanifest", "/*.css", "/*.js"]
}
},
{
"name": "assets",
"installMode": "lazy",
"updateMode": "prefetch",
"resources": {
"files": ["/assets/**", "/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)"]
}
}
]
}

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.1",
"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,56 +48,57 @@
"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",
"@angular/service-worker": "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.4",
"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.27.2",
"moment": "2.30.1", "moment": "2.30.1",
"ngx-date-fns": "11.0.0", "ngx-date-fns": "11.0.0",
"ngx-logger": "5.0.12", "ngx-logger": "5.0.12",
@@ -110,31 +111,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,10 +150,10 @@
"@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",

View File

@@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
version="1.1"
id="svg2"
width="1024"
height="1024"
viewBox="0 0 1024 1024"
sodipodi:docname="logo_pwa.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25)"
xml:space="preserve"
inkscape:export-filename="../src/assets/icons/icon-512x512.png"
inkscape:export-xdpi="48"
inkscape:export-ydpi="48"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"><defs
id="defs6" /><sodipodi:namedview
id="namedview4"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="true"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.49999772"
inkscape:cx="454.00207"
inkscape:cy="347.00158"
inkscape:window-width="1504"
inkscape:window-height="1729"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="g8" /><g
inkscape:groupmode="layer"
inkscape:label="Image"
id="g8"><rect
style="fill:#00b5cc;fill-opacity:1;stroke-width:1.10978"
id="rect2351"
width="379.77051"
height="379.77051"
x="143.85109"
y="141.62936"
ry="50.263741"
sodipodi:insensitive="true" /><rect
style="fill:#3be40b;fill-opacity:1;stroke-width:1.11352"
id="rect2353"
width="154.14215"
height="154.14215"
x="580.75684"
y="367.25772"
ry="25.690359"
sodipodi:insensitive="true" /><rect
style="fill:#c90e20;fill-opacity:1;stroke-width:1.10084"
id="rect2355"
width="306.05032"
height="306.05032"
x="580.75684"
y="578.53516"
ry="35.743107"
sodipodi:insensitive="true" /><rect
style="fill:#e4a20b;fill-opacity:1;stroke-width:1.11912"
id="rect2357"
width="232.33018"
height="232.33018"
x="291.29138"
y="578.53516"
ry="33.509159"
sodipodi:insensitive="true" /></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

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

@@ -15,7 +15,7 @@
import {CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData} from '@angular/common'; import {CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData} from '@angular/common';
import {HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import localeDe from '@angular/common/locales/de'; import localeDe from '@angular/common/locales/de';
import {APP_INITIALIZER, NgModule} from '@angular/core'; import {APP_INITIALIZER, NgModule, isDevMode} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser'; import {BrowserModule} from '@angular/platform-browser';
import {RouteReuseStrategy} from '@angular/router'; import {RouteReuseStrategy} from '@angular/router';
import {IonicRouteStrategy, Platform, provideIonicAngular, IonApp} from '@ionic/angular/standalone'; import {IonicRouteStrategy, Platform, provideIonicAngular, IonApp} from '@ionic/angular/standalone';
@@ -70,6 +70,7 @@ import {Capacitor} from '@capacitor/core';
import {SplashScreen} from '@capacitor/splash-screen'; import {SplashScreen} from '@capacitor/splash-screen';
import maplibregl from 'maplibre-gl'; import maplibregl from 'maplibre-gl';
import {Protocol} from 'pmtiles'; import {Protocol} from 'pmtiles';
import {ServiceWorkerModule} from '@angular/service-worker';
registerLocaleData(localeDe); registerLocaleData(localeDe);
@@ -182,6 +183,12 @@ export function createTranslateLoader(http: HttpClient) {
level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE, level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE,
}), }),
IonApp, IonApp,
ServiceWorkerModule.register('ngsw-worker.js', {
enabled: !isDevMode(),
// Register the ServiceWorker as soon as the application is stable
// or after 30 seconds (whichever comes first).
registrationStrategy: 'registerWhenStable:30000',
}),
], ],
providers: [ providers: [
{ {

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

@@ -33,7 +33,7 @@ export const DataIcons = {
'id card': SCIcon.badge, 'id card': SCIcon.badge,
'message': SCIcon.newspaper, 'message': SCIcon.newspaper,
'organization': SCIcon.business_center, 'organization': SCIcon.business_center,
'periodical': SCIcon.feed, 'periodical': SCIcon.news,
'person': SCIcon.person, 'person': SCIcon.person,
'point of interest': SCIcon.pin_drop, 'point of interest': SCIcon.pin_drop,
'publication event': SCIcon.campaign, 'publication event': SCIcon.campaign,

View File

@@ -42,9 +42,11 @@
} }
<!-- TODO see above --> <!-- TODO see above -->
@if (item.description && item.type !== 'job posting' && buttonShown) { @if (item.description && item.type !== 'job posting' && buttonShown) {
<ion-button expand="full" fill="clear" (click)="toggleDescriptionAccordion()"> <div class="read-more-container">
<ion-icon [name]="buttonState" size="large"></ion-icon> <ion-button shape="round" size="small" (click)="toggleDescriptionAccordion()">
</ion-button> READ_MORE...
</ion-button>
</div>
} }
</ion-card-content> </ion-card-content>
</ion-card> </ion-card>

View File

@@ -52,3 +52,21 @@ ion-card {
--color: var(--ion-color-primary-contrast); --color: var(--ion-color-primary-contrast);
} }
} }
.read-more-container {
position: relative;
display: flex;
justify-content: flex-end;
margin-top: -24px;
background: linear-gradient(to bottom, transparent, var(--ion-color-primary));
ion-button {
--background: var(--ion-color-primary-contrast);
--color: var(--ion-color-primary);
height: 8px;
}
}

View File

@@ -18,8 +18,8 @@ import {SCThings} from '@openstapps/core';
import {SCIcon} from '../../../util/ion-icon/icon'; import {SCIcon} from '../../../util/ion-icon/icon';
const AccordionButtonState = { const AccordionButtonState = {
collapsed: SCIcon.expand_more, collapsed: SCIcon.unfold_more,
expanded: SCIcon.expand_less, expanded: SCIcon.unfold_less,
}; };
@Component({ @Component({
@@ -44,7 +44,7 @@ export class TitleCardComponent implements OnInit, OnChanges {
descriptionLinesTotal: number; descriptionLinesTotal: number;
descriptionPreviewLines = 3; descriptionPreviewLines = 4;
descriptionLinesToDisplay = 0; descriptionLinesToDisplay = 0;

View File

@@ -383,7 +383,6 @@ 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: (baseElement: HTMLElement) => enterAnimation(baseElement, this.animationController), enterAnimation: (baseElement: HTMLElement) => enterAnimation(baseElement, this.animationController),
leaveAnimation: (baseElement: HTMLElement) => leaveAnimation(baseElement, this.animationController), leaveAnimation: (baseElement: HTMLElement) => leaveAnimation(baseElement, this.animationController),
componentProps: { componentProps: {

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

@@ -25,7 +25,7 @@ import {FilterContext, SortContext} from './context-type';
import {provideIonicAngular, ModalController} from '@ionic/angular/standalone'; import {provideIonicAngular, ModalController} from '@ionic/angular/standalone';
import {BehaviorSubject, of} from 'rxjs'; import {BehaviorSubject, of} from 'rxjs';
import {addIcons} from 'ionicons'; import {addIcons} from 'ionicons';
import {swapVertical, trash, menu} from 'ionicons/icons'; import {swapVertical, trash} from 'ionicons/icons';
describe('ContextMenuModalComponent', () => { describe('ContextMenuModalComponent', () => {
let fixture: ComponentFixture<ContextMenuModalComponent>; let fixture: ComponentFixture<ContextMenuModalComponent>;
@@ -37,7 +37,6 @@ describe('ContextMenuModalComponent', () => {
addIcons({ addIcons({
delete: trash, delete: trash,
sort: swapVertical, sort: swapVertical,
menu: menu,
}); });
beforeEach(async () => { beforeEach(async () => {

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

@@ -26,7 +26,7 @@
'_EVENT' | translate: {count: myCoursesDay[1].length} '_EVENT' | translate: {count: myCoursesDay[1].length}
}}</ion-label }}</ion-label
> >
<ion-icon class="ion-accordion-toggle-icon" name="expand_more"></ion-icon> <ion-icon class="ion-accordion-toggle-icon" name="keyboard_arrow_down"></ion-icon>
</ion-item> </ion-item>
<ion-list class="ion-padding" slot="content"> <ion-list class="ion-padding" slot="content">
@if (myCoursesDay[1].length === 0) { @if (myCoursesDay[1].length === 0) {

View File

@@ -14,10 +14,10 @@
--> -->
<div class="header"> <div class="header">
<ion-button fill="clear" class="left-button" (click)="mainSwiper.pageBackwards()"> <ion-button fill="clear" class="left-button" (click)="mainSwiper.pageBackwards()">
<ion-icon slot="icon-only" name="chevron_left"></ion-icon> <ion-icon slot="icon-only" name="chevron_backward"></ion-icon>
</ion-button> </ion-button>
<ion-button fill="clear" class="right-button" (click)="mainSwiper.pageForward()"> <ion-button fill="clear" class="right-button" (click)="mainSwiper.pageForward()">
<ion-icon slot="icon-only" name="chevron_right"></ion-icon> <ion-icon slot="icon-only" name="chevron_forward"></ion-icon>
</ion-button> </ion-button>
<infinite-swiper <infinite-swiper
class="header-swiper" class="header-swiper"

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

@@ -14,10 +14,10 @@
--> -->
<div class="header"> <div class="header">
<ion-button fill="clear" class="left-button" (click)="mainSwiper.swiperRef.slidePrev()"> <ion-button fill="clear" class="left-button" (click)="mainSwiper.swiperRef.slidePrev()">
<ion-icon slot="icon-only" name="chevron_left"></ion-icon> <ion-icon slot="icon-only" name="chevron_backward"></ion-icon>
</ion-button> </ion-button>
<ion-button fill="clear" class="right-button" (click)="mainSwiper.swiperRef.slideNext()"> <ion-button fill="clear" class="right-button" (click)="mainSwiper.swiperRef.slideNext()">
<ion-icon slot="icon-only" name="chevron_right"></ion-icon> <ion-icon slot="icon-only" name="chevron_forward"></ion-icon>
</ion-button> </ion-button>
<swiper <swiper
class="header-swiper" class="header-swiper"

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

@@ -54,7 +54,7 @@
<ion-button expand="block" (click)="presentResetAlert()" fill="outline"> <ion-button expand="block" (click)="presentResetAlert()" fill="outline">
{{ 'settings.resetSettings' | translate }} {{ 'settings.resetSettings' | translate }}
<ion-icon slot="start" name="device_reset"></ion-icon> <ion-icon slot="start" name="history"></ion-icon>
</ion-button> </ion-button>
</div> </div>
</ion-content> </ion-content>

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

@@ -14,10 +14,12 @@ export class EncryptedStorageProvider {
* @returns The value of the resource, if found * @returns The value of the resource, if found
*/ */
async get<T>(key: string): Promise<T | undefined> { async get<T>(key: string): Promise<T | undefined> {
if (!Capacitor.isNativePlatform()) return undefined;
try { try {
const jwt = JSON.parse((await SecureStoragePlugin.get({key: `stapps:key:${key}`})).value); const jwt = JSON.parse(
await (Capacitor.isNativePlatform()
? SecureStoragePlugin.get({key: `stapps:key:${key}`}).then(it => it.value)
: this.storageProvider.get<string>(`stapps:key:${key}`)),
);
const aesKey = await crypto.subtle.importKey('jwk', jwt, {name: 'AES-GCM'}, true, [ const aesKey = await crypto.subtle.importKey('jwk', jwt, {name: 'AES-GCM'}, true, [
'encrypt', 'encrypt',
'decrypt', 'decrypt',
@@ -48,8 +50,6 @@ export class EncryptedStorageProvider {
* @returns A promise that resolves when the value is stored * @returns A promise that resolves when the value is stored
*/ */
async set<T>(key: string, value: T): Promise<void> { async set<T>(key: string, value: T): Promise<void> {
if (!Capacitor.isNativePlatform()) return undefined;
try { try {
const compressionStream = new CompressionStream('gzip'); const compressionStream = new CompressionStream('gzip');
const writer = compressionStream.writable.getWriter(); const writer = compressionStream.writable.getWriter();
@@ -63,11 +63,14 @@ export class EncryptedStorageProvider {
'decrypt', 'decrypt',
]); ]);
const exportedKey = JSON.stringify(await crypto.subtle.exportKey('jwk', aesKey));
await Promise.all([ await Promise.all([
SecureStoragePlugin.set({ Capacitor.isNativePlatform()
key: `stapps:key:${key}`, ? SecureStoragePlugin.set({
value: JSON.stringify(await crypto.subtle.exportKey('jwk', aesKey)), key: `stapps:key:${key}`,
}), value: exportedKey,
})
: this.storageProvider.put(`stapps:key:${key}`, exportedKey),
this.storageProvider.put(`encrypted:${key}:iv`, iv), this.storageProvider.put(`encrypted:${key}:iv`, iv),
]); ]);
@@ -81,10 +84,10 @@ export class EncryptedStorageProvider {
} }
async delete(key: string): Promise<void> { async delete(key: string): Promise<void> {
if (!Capacitor.isNativePlatform()) return;
await Promise.all([ await Promise.all([
SecureStoragePlugin.remove({key: `stapps:key:${key}`}), Capacitor.isNativePlatform()
? SecureStoragePlugin.remove({key: `stapps:key:${key}`})
: this.storageProvider.delete(`stapps:key:${key}`),
this.storageProvider.delete(`encrypted:${key}:iv`), this.storageProvider.delete(`encrypted:${key}:iv`),
this.storageProvider.delete(`encrypted:${key}`), this.storageProvider.delete(`encrypted:${key}`),
]); ]);

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,12 +150,12 @@ 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.keyboard_arrow_down],
[caretDownSharp, SCIcon.expand_more], [caretDownSharp, SCIcon.keyboard_arrow_down],
[close, SCIcon.close], [close, SCIcon.close],
[closeSharp, SCIcon.close], [closeSharp, SCIcon.close],
[closeCircle, SCIcon.cancel], [closeCircle, SCIcon.cancel],
[ellipsisHorizontal, SCIcon.more_horiz], [ellipsisHorizontal, SCIcon.more_horiz],
['chevron-down-outline', SCIcon.expand_more], ['chevron-down-outline', SCIcon.keyboard_arrow_down],
['arrow_back', SCIcon.arrow_back], ['arrow_back', SCIcon.arrow_back],
]); ]);

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": {

Binary file not shown.

After

Width:  |  Height:  |  Size: 84 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 101 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 164 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 722 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 323 KiB

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