Compare commits

..
Author SHA1 Message Date
TheaninovaandRainer Killinger d4e15aa391 feat: pwa 2025-08-05 16:17:11 +02:00
543 changed files with 12516 additions and 11766 deletions
+6
View File
@@ -0,0 +1,6 @@
---
"@openstapps/backend": patch
"@openstapps/logger": patch
---
Updated nodemailer dependency
+2 -2
View File
@@ -120,6 +120,6 @@ audit:
script: script:
- pnpm audit --prod --audit-level critical - pnpm audit --prod --audit-level critical
rules: rules:
- if: $CI_COMMIT_BRANCH == 'main'
allow_failure: false
- !reference [.limit_pipelines, rules] - !reference [.limit_pipelines, rules]
# - if: $CI_COMMIT_BRANCH == 'main'
# allow_failure: false
-7
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",
-28
View File
@@ -1,33 +1,5 @@
# @openstapps/backend # @openstapps/backend
## 4.0.5
### Patch Changes
- Updated dependencies [86004881]
- Updated dependencies [09ad903a]
- @openstapps/core-tools@4.0.5
- @openstapps/core@4.0.5
## 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
+28 -1
View File
@@ -29,6 +29,19 @@ const menus = [
}, },
}, },
}, },
{
icon: 'local_library',
route: '/hebis-search',
title: 'library catalog',
translations: {
de: {
title: 'Bibliothekskatalog',
},
en: {
title: 'library catalog',
},
},
},
{ {
icon: 'inventory_2', icon: 'inventory_2',
route: '/catalog', route: '/catalog',
@@ -99,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: {
@@ -124,6 +137,20 @@ const menus = [
}, },
}, },
}, },
{
authProvider: 'paia',
icon: 'badge',
route: '/library-account',
title: 'library account',
translations: {
de: {
title: 'Bibliothekskonto',
},
en: {
title: 'library account',
},
},
},
{ {
icon: 'settings', icon: 'settings',
route: '/settings', route: '/settings',
@@ -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'],
+29
View File
@@ -32,6 +32,25 @@ const config = {
userinfo: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile', userinfo: 'https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile',
}, },
}, },
paia: {
client: {
clientId: '',
scopes: '',
url: 'https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php',
},
endpoints: {
authorization:
'https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php',
endSession: 'https://ubffm.hds.hebis.de/Shibboleth.sso/Logout',
mapping: {
id: '$.email',
name: '$.name',
role: '$.type',
},
token: 'https://hds.hebis.de/paia/auth/login',
userinfo: 'https://hds.hebis.de/paia/core',
},
},
}, },
app: { app: {
...defaultApp, ...defaultApp,
@@ -41,6 +60,16 @@ const config = {
authProvider: 'default', authProvider: 'default',
url: 'https://his-self-service.rz.uni-frankfurt.de', url: 'https://his-self-service.rz.uni-frankfurt.de',
}, },
daia: {
url: 'https://daia.hebis.de/DAIA2/UB_Frankfurt',
},
hebisProxy: {
url: 'https://proxy.ub.uni-frankfurt.de/login?qurl=',
},
paia: {
authProvider: 'paia',
url: 'https://hds.hebis.de/paia/core',
},
/** TODO: idCards: { /** TODO: idCards: {
authProvider: 'default', authProvider: 'default',
url: 'TODO', url: 'TODO',
+4 -4
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.5", "version": "4.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
@@ -53,7 +53,7 @@
"@types/geojson": "1.0.6", "@types/geojson": "1.0.6",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"@types/node-cron": "3.0.7", "@types/node-cron": "3.0.7",
"@types/nodemailer": "8.0.2", "@types/nodemailer": "6.4.7",
"@types/promise-queue": "2.2.0", "@types/promise-queue": "2.2.0",
"@types/uuid": "8.3.4", "@types/uuid": "8.3.4",
"body-parser": "1.20.3", "body-parser": "1.20.3",
@@ -69,7 +69,7 @@
"nock": "13.3.1", "nock": "13.3.1",
"node-cache": "5.1.2", "node-cache": "5.1.2",
"node-cron": "3.0.2", "node-cron": "3.0.2",
"nodemailer": "8.0.11", "nodemailer": "6.9.9",
"prom-client": "14.1.1", "prom-client": "14.1.1",
"promise-queue": "2.2.5", "promise-queue": "2.2.5",
"uuid": "8.3.2" "uuid": "8.3.2"
@@ -100,7 +100,7 @@
"supertest": "6.3.3", "supertest": "6.3.3",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
@@ -15,7 +15,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Logger, SMTP} from '@openstapps/logger'; import {Logger, SMTP} from '@openstapps/logger';
import {SendMailOptions} from 'nodemailer'; import {MailOptions} from 'nodemailer/lib/sendmail-transport';
import Queue from 'promise-queue'; import Queue from 'promise-queue';
/** /**
* A queue that can send mails in serial * A queue that can send mails in serial
@@ -36,7 +36,7 @@ export class MailQueue {
* the transport gets ready this mails are getting pushed in to * the transport gets ready this mails are getting pushed in to
* the normal queue. * the normal queue.
*/ */
dryQueue: SendMailOptions[]; dryQueue: MailOptions[];
/** /**
* A queue that saves mails, that are being sent in series * A queue that saves mails, that are being sent in series
@@ -68,7 +68,7 @@ export class MailQueue {
* Adds a mail into the queue so it gets send when the queue is ready * Adds a mail into the queue so it gets send when the queue is ready
* @param mail Information required for sending a mail * @param mail Information required for sending a mail
*/ */
private async addToQueue(mail: SendMailOptions) { private async addToQueue(mail: MailOptions) {
return this.queue.add<string>(() => this.transport.sendMail(mail)); return this.queue.add<string>(() => this.transport.sendMail(mail));
} }
@@ -99,7 +99,7 @@ export class MailQueue {
* Push a mail into the queue so it gets send when the queue is ready * Push a mail into the queue so it gets send when the queue is ready
* @param mail Information required for sending a mail * @param mail Information required for sending a mail
*/ */
public async push(mail: SendMailOptions) { public async push(mail: MailOptions) {
if (this.transport.isVerified()) { if (this.transport.isVerified()) {
await this.addToQueue(mail); await this.addToQueue(mail);
} else { } else {
@@ -19,7 +19,7 @@ import sinon from 'sinon';
import {MailQueue} from '../../src/notification/mail-queue.js'; import {MailQueue} from '../../src/notification/mail-queue.js';
import {expect} from 'chai'; import {expect} from 'chai';
import Queue from 'promise-queue'; import Queue from 'promise-queue';
import {SendMailOptions} from 'nodemailer'; import {MailOptions} from 'nodemailer/lib/sendmail-transport';
import {getTransport, TRANSPORT_SEND_RESPONSE} from '../common.js'; import {getTransport, TRANSPORT_SEND_RESPONSE} from '../common.js';
describe('MailQueue', async function () { describe('MailQueue', async function () {
@@ -54,7 +54,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'};
for (let i = 0; i < numberOfMails; i++) { for (let i = 0; i < numberOfMails; i++) {
await mailQueue.push(mail); await mailQueue.push(mail);
} }
@@ -70,7 +70,7 @@ describe('MailQueue', async function () {
const queueAddStub = sandbox.stub(Queue.prototype, 'add'); const queueAddStub = sandbox.stub(Queue.prototype, 'add');
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(getTransport(false)); const mailQueue = new MailQueue(getTransport(false));
const mail: SendMailOptions = {}; const mail: MailOptions = {};
mailQueue.push(mail); mailQueue.push(mail);
expect(queueAddStub.called).to.be.false; expect(queueAddStub.called).to.be.false;
@@ -81,7 +81,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'};
// fake that transport is verified // fake that transport is verified
transport.isVerified = () => true; transport.isVerified = () => true;
mailQueue.push(mail); mailQueue.push(mail);
@@ -97,7 +97,7 @@ describe('MailQueue', async function () {
const transport = getTransport(false); const transport = getTransport(false);
// @ts-expect-error not assignable // @ts-expect-error not assignable
const mailQueue = new MailQueue(transport); const mailQueue = new MailQueue(transport);
const mail: SendMailOptions = {from: 'Foo', subject: 'Foo Subject'}; const mail: MailOptions = {from: 'Foo', subject: 'Foo Subject'};
// fake that transport is verified // fake that transport is verified
transport.isVerified = () => true; transport.isVerified = () => true;
await mailQueue.push(mail); await mailQueue.push(mail);
-13
View File
@@ -1,18 +1,5 @@
# @openstapps/proxy # @openstapps/proxy
## 4.0.5
### Patch Changes
- 8ccbfac0: Bumping proxy version to rebuild image
## 4.0.2
### Patch Changes
- Updated dependencies [6b06de40]
- @openstapps/logger@4.0.2
## 4.0.0 ## 4.0.0
### Major Changes ### Major Changes
+2 -2
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.5", "version": "4.0.0",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "AGPL-3.0-only", "license": "AGPL-3.0-only",
@@ -51,7 +51,7 @@
"is-cidr": "4.0.2", "is-cidr": "4.0.2",
"mustache": "4.2.0", "mustache": "4.2.0",
"semver": "7.6.0", "semver": "7.6.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"devDependencies": { "devDependencies": {
"@openstapps/api-cli": "workspace:*", "@openstapps/api-cli": "workspace:*",
@@ -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
+1 -1
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",
@@ -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"/>
+1 -1
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"/>
-6
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
+3 -2
View File
@@ -22,7 +22,7 @@ const config = {
'plugin:unicorn/recommended', 'plugin:unicorn/recommended',
'prettier', 'prettier',
], ],
plugins: ['eslint-plugin-unicorn', 'eslint-plugin-jsdoc', '@stylistic/eslint-plugin'], plugins: ['eslint-plugin-unicorn', 'eslint-plugin-jsdoc'],
settings: { settings: {
jsdoc: { jsdoc: {
mode: 'typescript', mode: 'typescript',
@@ -76,7 +76,7 @@ const config = {
], ],
}, },
], ],
'@stylistic/lines-between-class-members': ['error', 'always'],
'@typescript-eslint/explicit-module-boundary-types': 'off', '@typescript-eslint/explicit-module-boundary-types': 'off',
'@typescript-eslint/no-unused-vars': [ '@typescript-eslint/no-unused-vars': [
'error', 'error',
@@ -85,6 +85,7 @@ const config = {
argsIgnorePattern: '^_', argsIgnorePattern: '^_',
}, },
], ],
'@typescript-eslint/lines-between-class-members': ['error', 'always'],
'@typescript-eslint/no-explicit-any': 'error', '@typescript-eslint/no-explicit-any': 'error',
'@typescript-eslint/no-non-null-assertion': 'off', '@typescript-eslint/no-non-null-assertion': 'off',
}, },
+4 -5
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",
@@ -19,12 +19,11 @@
"@openstapps/tsconfig": "workspace:*", "@openstapps/tsconfig": "workspace:*",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"eslint": "8.57.0", "eslint": "8.57.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"peerDependencies": { "peerDependencies": {
"@stylistic/eslint-plugin": "5.10.0", "@typescript-eslint/eslint-plugin": "7.2.0",
"@typescript-eslint/eslint-plugin": "8.39.1", "@typescript-eslint/parser": "7.2.0",
"@typescript-eslint/parser": "8.39.1",
"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",
+1 -2
View File
@@ -9,8 +9,7 @@ const config = {
trailingComma: 'all', trailingComma: 'all',
bracketSpacing: false, bracketSpacing: false,
arrowParens: 'avoid', arrowParens: 'avoid',
endOfLine: 'lf', endOfLine: 'lf'
htmlWhitespaceSensitivity: 'strict'
} }
module.exports = config; module.exports = config;
@@ -1,19 +1,5 @@
# @openstapps/projectmanagement # @openstapps/projectmanagement
## 4.0.5
### Patch Changes
- 86004881: Updated node-glob dependency
## 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
+3 -3
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.5", "version": "4.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -43,7 +43,7 @@
"@openstapps/logger": "workspace:*", "@openstapps/logger": "workspace:*",
"commander": "10.0.0", "commander": "10.0.0",
"date-fns": "3.6.0", "date-fns": "3.6.0",
"glob": "10.5.0", "glob": "10.3.10",
"mustache": "4.2.0" "mustache": "4.2.0"
}, },
"devDependencies": { "devDependencies": {
@@ -64,7 +64,7 @@
"mocha-junit-reporter": "2.2.0", "mocha-junit-reporter": "2.2.0",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
-17
View File
@@ -1,22 +1,5 @@
# @openstapps/minimal-connector # @openstapps/minimal-connector
## 4.0.5
### Patch Changes
- Updated dependencies [09ad903a]
- @openstapps/core@4.0.5
- @openstapps/api@4.0.5
## 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
+2 -2
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.5", "version": "4.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -55,7 +55,7 @@
"nock": "13.3.1", "nock": "13.3.1",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
-22
View File
@@ -1,27 +1,5 @@
# @openstapps/minimal-plugin # @openstapps/minimal-plugin
## 4.0.5
### Patch Changes
- Updated dependencies [86004881]
- Updated dependencies [09ad903a]
- @openstapps/core-tools@4.0.5
- @openstapps/core@4.0.5
- @openstapps/api-plugin@4.0.5
- @openstapps/api@4.0.5
## 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
+2 -2
View File
@@ -1,7 +1,7 @@
{ {
"name": "@openstapps/minimal-plugin", "name": "@openstapps/minimal-plugin",
"description": "Minimal Plugin", "description": "Minimal Plugin",
"version": "4.0.5", "version": "4.0.1",
"private": true, "private": true,
"type": "module", "type": "module",
"license": "GPL-3.0-only", "license": "GPL-3.0-only",
@@ -44,7 +44,7 @@
"@types/express": "4.17.17", "@types/express": "4.17.17",
"@types/node": "22.15.31", "@types/node": "22.15.31",
"tsup": "8.5.0", "tsup": "8.5.0",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"tsup": { "tsup": {
"entry": [ "entry": [
+3 -4
View File
@@ -19,7 +19,7 @@
"plugin:unicorn/recommended", "plugin:unicorn/recommended",
"prettier" "prettier"
], ],
"plugins": ["eslint-plugin-unicorn", "eslint-plugin-jsdoc", "@stylistic/eslint-plugin"], "plugins": ["eslint-plugin-unicorn", "eslint-plugin-jsdoc"],
"settings": { "settings": {
"jsdoc": { "jsdoc": {
"mode": "typescript" "mode": "typescript"
@@ -63,10 +63,9 @@
"argsIgnorePattern": "^_" "argsIgnorePattern": "^_"
} }
], ],
"@stylistic/lines-between-class-members": ["error", "always"], "@typescript-eslint/lines-between-class-members": ["error", "always"],
"@typescript-eslint/no-explicit-any": "error", "@typescript-eslint/no-explicit-any": "error",
"@angular-eslint/use-lifecycle-interface": "error", "@angular-eslint/use-lifecycle-interface": "error"
"@angular-eslint/prefer-standalone": "off"
} }
}, },
{ {
-26
View File
@@ -1,31 +1,5 @@
# @openstapps/app # @openstapps/app
## 4.0.5
### Patch Changes
- 09ad903a: Upgrade to Capacitor 8 and Anuglar 20
- 86004881: Updated node-glob dependency
- Updated dependencies [09ad903a]
- @openstapps/core@4.0.5
- @openstapps/api@4.0.5
## 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
-5
View File
@@ -94,8 +94,3 @@ capacitor-cordova-android-plugins
# Copied web assets # Copied web assets
app/src/main/assets/public app/src/main/assets/public
# Generated Config files
app/src/main/assets/capacitor.config.json
app/src/main/assets/capacitor.plugins.json
app/src/main/res/xml/config.xml
+3 -3
View File
@@ -1,8 +1,8 @@
apply plugin: 'com.android.application' apply plugin: 'com.android.application'
android { android {
namespace = "de.anyschool.app" namespace "de.anyschool.app"
compileSdk = rootProject.ext.compileSdkVersion compileSdk rootProject.ext.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "de.anyschool.app" applicationId "de.anyschool.app"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
@@ -13,7 +13,7 @@ android {
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
} }
} }
buildTypes { buildTypes {
@@ -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')
@@ -9,7 +9,7 @@
android:theme="@style/AppTheme" android:theme="@style/AppTheme"
android:usesCleartextTraffic="true"> android:usesCleartextTraffic="true">
<activity <activity
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode|navigation|density" android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout"
android:exported="true" android:exported="true"
android:label="@string/title_activity_main" android:label="@string/title_activity_main"
android:launchMode="singleTask" android:launchMode="singleTask"
@@ -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"
@@ -7,6 +7,5 @@
<item name="android:statusBarColor">@color/colorPrimary</item> <item name="android:statusBarColor">@color/colorPrimary</item>
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
</resources> </resources>
@@ -7,7 +7,6 @@
<item name="colorPrimary">@color/colorPrimary</item> <item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item> <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item> <item name="colorAccent">@color/colorAccent</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
<style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar"> <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.DayNight.NoActionBar">
@@ -18,7 +17,6 @@
<item name="android:windowBackground">@color/colorPrimary</item> <item name="android:windowBackground">@color/colorPrimary</item>
<item name="android:navigationBarColor">@color/colorBackground</item> <item name="android:navigationBarColor">@color/colorBackground</item>
<item name="android:windowLightNavigationBar" tools:targetApi="27">true</item> <item name="android:windowLightNavigationBar" tools:targetApi="27">true</item>
<item name="android:windowOptOutEdgeToEdgeEnforcement" tools:targetApi="35">true</item>
</style> </style>
+2 -2
View File
@@ -7,8 +7,8 @@ buildscript {
mavenCentral() mavenCentral()
} }
dependencies { dependencies {
classpath 'com.android.tools.build:gradle:8.13.0' classpath 'com.android.tools.build:gradle:8.2.1'
classpath 'com.google.gms:google-services:4.4.4' 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
+19 -22
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@8.5.2_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.1.1_@capacitor+core@8.5.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@8.0.4_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.3_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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@8.2.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.5_@capacitor+core@8.5.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@8.3.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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.13.0_@capacitor+core@8.5.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')
Binary file not shown.
@@ -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.14.3-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
+15 -22
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,8 +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\n' "$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
@@ -114,7 +114,7 @@ case "$( uname )" in #(
NONSTOP* ) nonstop=true ;; NONSTOP* ) nonstop=true ;;
esac esac
CLASSPATH="\\\"\\\"" CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM. # Determine the Java command to use to start the JVM.
@@ -133,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.
@@ -147,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
@@ -155,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
@@ -200,20 +197,16 @@ 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, 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" \
-classpath "$CLASSPATH" \ -classpath "$CLASSPATH" \
-jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ org.gradle.wrapper.GradleWrapperMain \
"$@" "$@"
# Stop when "xargs" is not available. # Stop when "xargs" is not available.
+12 -14
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,22 +57,22 @@ 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
:execute :execute
@rem Setup the command line @rem Setup the command line
set CLASSPATH= set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell
+13 -13
View File
@@ -1,16 +1,16 @@
ext { ext {
minSdkVersion = 24 minSdkVersion = 22
compileSdkVersion = 36 compileSdkVersion = 34
targetSdkVersion = 36 targetSdkVersion = 34
androidxActivityVersion = '1.11.0' androidxActivityVersion = '1.8.0'
androidxAppCompatVersion = '1.7.1' androidxAppCompatVersion = '1.6.1'
androidxCoordinatorLayoutVersion = '1.3.0' androidxCoordinatorLayoutVersion = '1.2.0'
androidxCoreVersion = '1.17.0' androidxCoreVersion = '1.12.0'
androidxFragmentVersion = '1.8.9' androidxFragmentVersion = '1.6.2'
coreSplashScreenVersion = '1.2.0' coreSplashScreenVersion = '1.0.1'
androidxWebkitVersion = '1.14.0' androidxWebkitVersion = '1.9.0'
junitVersion = '4.13.2' junitVersion = '4.13.2'
androidxJunitVersion = '1.3.0' androidxJunitVersion = '1.1.5'
androidxEspressoCoreVersion = '3.7.0' androidxEspressoCoreVersion = '3.5.1'
cordovaAndroidVersion = '14.0.1' cordovaAndroidVersion = '10.1.1'
} }
+5 -36
View File
@@ -41,23 +41,15 @@
"input": ".", "input": ".",
"output": "assets" "output": "assets"
}, },
{ "src/manifest.webmanifest"
"glob": "maplibre-gl-worker.mjs",
"input": "node_modules/maplibre-gl/dist",
"output": "/"
},
{
"glob": "maplibre-gl-shared.mjs",
"input": "node_modules/maplibre-gl/dist",
"output": "/"
}
], ],
"styles": [ "styles": [
{ {
"input": "src/global.scss", "input": "src/global.scss",
"inject": true "inject": true
} }
] ],
"serviceWorker": "ngsw-config.json"
}, },
"configurations": { "configurations": {
"production": { "production": {
@@ -137,7 +129,8 @@
"glob": "**/*", "glob": "**/*",
"input": "src/assets", "input": "src/assets",
"output": "/assets" "output": "/assets"
} },
"src/manifest.webmanifest"
] ]
} }
}, },
@@ -205,30 +198,6 @@
}, },
"@ionic/angular-toolkit:page": { "@ionic/angular-toolkit:page": {
"styleext": "scss" "styleext": "scss"
},
"@schematics/angular:component": {
"type": "component"
},
"@schematics/angular:directive": {
"type": "directive"
},
"@schematics/angular:service": {
"type": "service"
},
"@schematics/angular:guard": {
"typeSeparator": "."
},
"@schematics/angular:interceptor": {
"typeSeparator": "."
},
"@schematics/angular:module": {
"typeSeparator": "."
},
"@schematics/angular:pipe": {
"typeSeparator": "."
},
"@schematics/angular:resolver": {
"typeSeparator": "."
} }
} }
} }
@@ -175,6 +175,16 @@
"hisometry": { "hisometry": {
"authProvider": "default", "authProvider": "default",
"url": "https://his-self-service.rz.uni-frankfurt.de" "url": "https://his-self-service.rz.uni-frankfurt.de"
},
"daia": {
"url": "https://daia.hebis.de/DAIA2/UB_Frankfurt"
},
"hebisProxy": {
"url": "https://proxy.ub.uni-frankfurt.de/login?qurl="
},
"paia": {
"authProvider": "paia",
"url": "https://hds.hebis.de/paia/core"
} }
}, },
"plugins": { "plugins": {
@@ -183,6 +193,9 @@
}, },
"feedback": { "feedback": {
"urlPath": "/feedback" "urlPath": "/feedback"
},
"hebis-plugin": {
"urlPath": "/hebissearch"
} }
} }
}, },
@@ -216,6 +229,19 @@
} }
} }
}, },
{
"icon": "local_library",
"route": "/hebis-search",
"title": "library catalog",
"translations": {
"de": {
"title": "Bibliothekskatalog"
},
"en": {
"title": "library catalog"
}
}
},
{ {
"icon": "inventory_2", "icon": "inventory_2",
"route": "/catalog", "route": "/catalog",
@@ -273,7 +299,7 @@
"icon": "school", "icon": "school",
"items": [ "items": [
{ {
"icon": "star", "icon": "grade",
"route": "/favorites", "route": "/favorites",
"title": "favorites", "title": "favorites",
"translations": { "translations": {
@@ -298,6 +324,20 @@
} }
} }
}, },
{
"authProvider": "paia",
"icon": "badge",
"route": "/library-account",
"title": "library account",
"translations": {
"de": {
"title": "Bibliothekskonto"
},
"en": {
"title": "library account"
}
}
},
{ {
"icon": "settings", "icon": "settings",
"route": "/settings", "route": "/settings",
@@ -433,6 +473,24 @@
"token": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/accessToken", "token": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/accessToken",
"userinfo": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile" "userinfo": "https://cas.rz.uni-frankfurt.de/cas/oauth2.0/profile"
} }
},
"paia": {
"client": {
"clientId": "",
"scopes": "",
"url": "https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php"
},
"endpoints": {
"authorization": "https://hds.hebis.de/Shibboleth.sso/UBFFM?target=https://hds.hebis.de/ubffm/paia_login_stub.php",
"endSession": "https://ubffm.hds.hebis.de/Shibboleth.sso/Logout",
"mapping": {
"id": "$.email",
"name": "$.name",
"role": "$.type"
},
"token": "https://hds.hebis.de/paia/auth/login",
"userinfo": "https://hds.hebis.de/paia/core"
}
} }
}, },
"backend": { "backend": {
+1 -1
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', () => {
@@ -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 () {
@@ -41,8 +41,8 @@ describe('favorites', function () {
}); });
cy.get('stapps-favorite-button').click(); cy.get('stapps-favorite-button').click();
cy.get('stapps-favorite-button > ion-button > ion-icon') cy.get('stapps-favorite-button > ion-button > ion-icon')
.invoke('attr', 'class') .invoke('attr', 'ng-reflect-fill')
.should('eq', 'selected'); .should('eq', 'true');
}); });
cy.visit('/favorites'); cy.visit('/favorites');
cy.get('stapps-data-list-item').within(() => { cy.get('stapps-data-list-item').within(() => {
@@ -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();
+2 -2
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',
-3
View File
@@ -1,6 +1,5 @@
App/build App/build
App/Pods App/Pods
App/output
App/App/public App/App/public
DerivedData DerivedData
xcuserdata xcuserdata
@@ -8,5 +7,3 @@ xcuserdata
# Cordova plugins for Capacitor # Cordova plugins for Capacitor
capacitor-cordova-ios-plugins capacitor-cordova-ios-plugins
# Generated Config files
App/App/capacitor.config.json
@@ -14,8 +14,7 @@
504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; };
504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; };
50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; };
9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9582B6842FE996800072D4E8 /* SceneDelegate.swift */; }; 88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7C462D51B10BE605A8502F2C /* Pods_App.framework */; };
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; };
/* End PBXBuildFile section */ /* End PBXBuildFile section */
/* Begin PBXFileReference section */ /* Begin PBXFileReference section */
@@ -28,10 +27,10 @@
504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; }; 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = "<group>"; };
9582B6842FE996800072D4E8 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = "<group>"; }; 7C462D51B10BE605A8502F2C /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; };
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; E2D249FB277CB255005492AC /* App.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = App.entitlements; sourceTree = "<group>"; };
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; }; EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; };
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = "<group>"; }; EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = "<group>"; };
/* End PBXFileReference section */ /* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */ /* Begin PBXFrameworksBuildPhase section */
@@ -39,28 +38,20 @@
isa = PBXFrameworksBuildPhase; isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, 88B0D35EB4B7888A415041EE /* Pods_App.framework in Frameworks */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
/* End PBXFrameworksBuildPhase section */ /* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */ /* Begin PBXGroup section */
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = {
isa = PBXGroup;
children = (
AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */,
);
name = Frameworks;
sourceTree = "<group>";
};
504EC2FB1FED79650016851F = { 504EC2FB1FED79650016851F = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
504EC3061FED79650016851F /* App */, 504EC3061FED79650016851F /* App */,
504EC3051FED79650016851F /* Products */, 504EC3051FED79650016851F /* Products */,
7F8756D8B27F46E3366F6CEA /* Pods */, 93DA7B5AF35933F9EF51EE34 /* Pods */,
27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, 819423158BC1FAAD85B02762 /* Frameworks */,
); );
sourceTree = "<group>"; sourceTree = "<group>";
}; };
@@ -75,7 +66,7 @@
504EC3061FED79650016851F /* App */ = { 504EC3061FED79650016851F /* App */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
9582B6842FE996800072D4E8 /* SceneDelegate.swift */, E2D249FB277CB255005492AC /* App.entitlements */,
50379B222058CBB4000EE86E /* capacitor.config.json */, 50379B222058CBB4000EE86E /* capacitor.config.json */,
504EC3071FED79650016851F /* AppDelegate.swift */, 504EC3071FED79650016851F /* AppDelegate.swift */,
504EC30B1FED79650016851F /* Main.storyboard */, 504EC30B1FED79650016851F /* Main.storyboard */,
@@ -88,13 +79,22 @@
path = App; path = App;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
7F8756D8B27F46E3366F6CEA /* Pods */ = { 819423158BC1FAAD85B02762 /* Frameworks */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, 7C462D51B10BE605A8502F2C /* Pods_App.framework */,
AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, );
name = Frameworks;
sourceTree = "<group>";
};
93DA7B5AF35933F9EF51EE34 /* Pods */ = {
isa = PBXGroup;
children = (
EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */,
EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */,
); );
name = Pods; name = Pods;
path = Pods;
sourceTree = "<group>"; sourceTree = "<group>";
}; };
/* End PBXGroup section */ /* End PBXGroup section */
@@ -104,11 +104,12 @@
isa = PBXNativeTarget; isa = PBXNativeTarget;
buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */;
buildPhases = ( buildPhases = (
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, 947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */,
504EC3001FED79650016851F /* Sources */, 504EC3001FED79650016851F /* Sources */,
504EC3011FED79650016851F /* Frameworks */, 504EC3011FED79650016851F /* Frameworks */,
504EC3021FED79650016851F /* Resources */, 504EC3021FED79650016851F /* Resources */,
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */,
2D217985258DD775FC9B6A72 /* [CP] Copy Pods Resources */,
); );
buildRules = ( buildRules = (
); );
@@ -125,8 +126,8 @@
504EC2FC1FED79650016851F /* Project object */ = { 504EC2FC1FED79650016851F /* Project object */ = {
isa = PBXProject; isa = PBXProject;
attributes = { attributes = {
LastSwiftUpdateCheck = 0920; LastSwiftUpdateCheck = 920;
LastUpgradeCheck = 0920; LastUpgradeCheck = 920;
TargetAttributes = { TargetAttributes = {
504EC3031FED79650016851F = { 504EC3031FED79650016851F = {
CreatedOnToolsVersion = 9.2; CreatedOnToolsVersion = 9.2;
@@ -144,8 +145,6 @@
Base, Base,
); );
mainGroup = 504EC2FB1FED79650016851F; mainGroup = 504EC2FB1FED79650016851F;
packageReferences = (
);
productRefGroup = 504EC3051FED79650016851F /* Products */; productRefGroup = 504EC3051FED79650016851F /* Products */;
projectDirPath = ""; projectDirPath = "";
projectRoot = ""; projectRoot = "";
@@ -172,16 +171,35 @@
/* End PBXResourcesBuildPhase section */ /* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */
6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { 2D217985258DD775FC9B6A72 /* [CP] Copy Pods Resources */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
); );
inputPaths = (
);
name = "[CP] Copy Pods Resources";
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-resources.sh\"\n";
showEnvVarsInLog = 0;
};
947055B15D65E7FC3ADB1FEB /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = ( inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock", "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock", "${PODS_ROOT}/Manifest.lock",
); );
name = "[CP] Check Pods Manifest.lock"; name = "[CP] Check Pods Manifest.lock";
outputFileListPaths = (
);
outputPaths = ( outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt",
); );
@@ -190,7 +208,7 @@
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0; showEnvVarsInLog = 0;
}; };
9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { F40DBF7576173B02228B7A71 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase; isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
@@ -213,7 +231,6 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
504EC3081FED79650016851F /* AppDelegate.swift in Sources */, 504EC3081FED79650016851F /* AppDelegate.swift in Sources */,
9582B6852FE996820072D4E8 /* SceneDelegate.swift in Sources */,
); );
runOnlyForDeploymentPostprocessing = 0; runOnlyForDeploymentPostprocessing = 0;
}; };
@@ -287,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 = 15.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;
@@ -338,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 = 15.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";
@@ -348,7 +365,7 @@
}; };
504EC3171FED79650016851F /* Debug */ = { 504EC3171FED79650016851F /* Debug */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; baseConfigurationReference = EA601541CA9010D807358964 /* Pods-App.debug.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
@@ -356,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 = 15.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;
@@ -370,7 +387,7 @@
}; };
504EC3181FED79650016851F /* Release */ = { 504EC3181FED79650016851F /* Release */ = {
isa = XCBuildConfiguration; isa = XCBuildConfiguration;
baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; baseConfigurationReference = EB81CB8CD78E2A93A8154B20 /* Pods-App.release.xcconfig */;
buildSettings = { buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
CODE_SIGN_ENTITLEMENTS = App/App.entitlements; CODE_SIGN_ENTITLEMENTS = App/App.entitlements;
@@ -378,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 = 15.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)";
+2 -11
View File
@@ -10,7 +10,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch. // Override point for customization after application launch.
let fetchManager = TSBackgroundFetch.sharedInstance(); let fetchManager = TSBackgroundFetch.sharedInstance();
fetchManager.didFinishLaunching(); fetchManager?.didFinishLaunching();
return true return true
} }
@@ -18,7 +18,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) { func application(_ application: UIApplication, performFetchWithCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
print("BackgroundFetchPlugin AppDelegate received fetch event"); print("BackgroundFetchPlugin AppDelegate received fetch event");
let fetchManager = TSBackgroundFetch.sharedInstance(); let fetchManager = TSBackgroundFetch.sharedInstance();
fetchManager.perform(completionHandler: completionHandler, applicationState: application.applicationState); fetchManager?.perform(completionHandler: completionHandler, applicationState: application.applicationState);
} }
func applicationWillResignActive(_ application: UIApplication) { func applicationWillResignActive(_ application: UIApplication) {
@@ -56,13 +56,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate {
return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler)
} }
func application(_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
let config = UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
config.delegateClass = SceneDelegate.self
return config
}
} }
@@ -1,14 +1,14 @@
{ {
"images" : [ "images": [
{ {
"filename" : "AppIcon-512@2x.png", "idiom": "universal",
"idiom" : "universal", "size": "1024x1024",
"platform" : "ios", "filename": "AppIcon-512@2x.png",
"size" : "1024x1024" "platform": "ios"
} }
], ],
"info" : { "info": {
"author" : "xcode", "author": "xcode",
"version" : 1 "version": 1
} }
} }
@@ -1,6 +1,6 @@
{ {
"info" : { "info": {
"version" : 1, "version": 1,
"author" : "xcode" "author": "xcode"
} }
} }
+3 -25
View File
@@ -44,29 +44,9 @@
<string>Calendar access is needed to sync your schedule with the device</string> <string>Calendar access is needed to sync your schedule with the device</string>
<key>NSLocationWhenInUseUsageDescription</key> <key>NSLocationWhenInUseUsageDescription</key>
<string>Location services are used to enable all map and search features</string> <string>Location services are used to enable all map and search features</string>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<false/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>$(PRODUCT_MODULE_NAME).SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
<key>UIBackgroundModes</key> <key>UIBackgroundModes</key>
<array> <array>
<string>fetch</string> <string>fetch</string>
<string>processing</string>
</array> </array>
<key>UILaunchStoryboardName</key> <key>UILaunchStoryboardName</key>
<string>LaunchScreen</string> <string>LaunchScreen</string>
@@ -81,17 +61,15 @@
<key>UISupportedInterfaceOrientations</key> <key>UISupportedInterfaceOrientations</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string> <string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string>
</array> </array>
<key>UISupportedInterfaceOrientations~ipad</key> <key>UISupportedInterfaceOrientations~ipad</key>
<array> <array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
<string>UIInterfaceOrientationLandscapeLeft</string> <string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationLandscapeRight</string> <string>UIInterfaceOrientationLandscapeRight</string>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array> </array>
<key>UIViewControllerBasedStatusBarAppearance</key> <key>UIViewControllerBasedStatusBarAppearance</key>
<true/> <false/>
</dict> </dict>
</plist> </plist>
@@ -1,24 +0,0 @@
import UIKit
import Capacitor
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = scene as? UIWindowScene else { return }
window = UIWindow(windowScene: windowScene)
window?.rootViewController = CAPBridgeViewController()
window?.makeKeyAndVisible()
SceneDelegateProxy.shared.scene(scene, willConnectTo: session, options: connectionOptions)
}
func scene(_ scene: UIScene, openURLContexts URLContexts: Set<UIOpenURLContext>) {
SceneDelegateProxy.shared.scene(scene, openURLContexts: URLContexts)
}
func scene(_ scene: UIScene, continue userActivity: NSUserActivity) {
SceneDelegateProxy.shared.scene(scene, continue: userActivity)
}
}
+22 -23
View File
@@ -1,6 +1,6 @@
require_relative '../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.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, '15.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@8.5.2_@capacitor+core@8.5.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@8.5.2_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.1.1_@capacitor+core@8.5.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@8.0.4_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.3_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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@8.2.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.5_@capacitor+core@8.5.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@8.3.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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.13.0_@capacitor+core@8.5.2/node_modules/capacitor-secure-storage-plugin'
pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins' pod 'CordovaPlugins', :path => '../capacitor-cordova-ios-plugins'
end end
+83 -101
View File
@@ -1,161 +1,143 @@
PODS: PODS:
- Capacitor (8.5.2): - Capacitor (6.2.1):
- CapacitorCordova - CapacitorCordova
- CapacitorApp (8.1.1): - CapacitorApp (6.0.0):
- Capacitor - Capacitor
- CapacitorBrowser (8.0.4): - CapacitorBrowser (6.0.1):
- Capacitor - Capacitor
- CapacitorClipboard (8.0.1): - CapacitorClipboard (6.0.0):
- Capacitor - Capacitor
- CapacitorCommunityInAppReview (8.0.0): - CapacitorCommunityScreenBrightness (6.0.0):
- Capacitor - Capacitor
- CapacitorCommunityScreenBrightness (8.0.0): - CapacitorCordova (6.2.1)
- CapacitorDevice (6.0.0):
- Capacitor - Capacitor
- CapacitorCordova (8.5.2) - CapacitorDialog (6.0.0):
- CapacitorDevice (8.0.3):
- Capacitor - Capacitor
- CapacitorDialog (8.0.1): - CapacitorFilesystem (6.0.0):
- Capacitor - Capacitor
- CapacitorFilesystem (8.1.3): - CapacitorGeolocation (6.0.0):
- Capacitor - Capacitor
- IONFilesystemLib (~> 1.1.1) - CapacitorHaptics (6.0.0):
- CapacitorGeolocation (8.2.2):
- Capacitor - Capacitor
- IONGeolocationLib (= 2.1.0) - CapacitorKeyboard (6.0.1):
- CapacitorHaptics (8.0.2):
- Capacitor - Capacitor
- CapacitorKeyboard (8.0.5): - CapacitorLocalNotifications (6.0.0):
- Capacitor - Capacitor
- CapacitorLocalNotifications (8.3.1): - CapacitorNetwork (6.0.1):
- Capacitor - Capacitor
- CapacitorNetwork (8.0.1): - CapacitorPreferences (6.0.1):
- Capacitor - Capacitor
- CapacitorPreferences (8.0.1): - CapacitorScreenOrientation (6.0.1):
- Capacitor - Capacitor
- CapacitorScreenOrientation (8.0.1): - CapacitorSecureStoragePlugin (0.10.0):
- Capacitor
- CapacitorSecureStoragePlugin (0.13.0):
- Capacitor - Capacitor
- SwiftKeychainWrapper - SwiftKeychainWrapper
- CapacitorShare (8.0.2): - CapacitorShare (6.0.1):
- Capacitor - Capacitor
- CapacitorSplashScreen (8.0.2): - CapacitorSplashScreen (6.0.1):
- Capacitor - Capacitor
- CordovaPlugins (8.5.2): - CordovaPlugins (6.2.1):
- CapacitorCordova - CapacitorCordova
- IONFilesystemLib (1.1.4)
- IONGeolocationLib (2.1.0)
- SwiftKeychainWrapper (4.0.1) - SwiftKeychainWrapper (4.0.1)
- TransistorsoftCapacitorBackgroundFetch (8.1.3): - TransistorsoftCapacitorBackgroundFetch (6.0.0):
- Capacitor - Capacitor
- TSBackgroundFetch (~> 4.1.0)
- TSBackgroundFetch (4.1.1)
DEPENDENCIES: DEPENDENCIES:
- "Capacitor (from `../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.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@8.1.1_@capacitor+core@8.5.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@8.0.4_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.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@8.5.2_@capacitor+core@8.5.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@8.0.3_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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@8.2.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.5_@capacitor+core@8.5.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@8.3.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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.13.0_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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
- TSBackgroundFetch
EXTERNAL SOURCES: EXTERNAL SOURCES:
Capacitor: Capacitor:
:path: "../../../../node_modules/.pnpm/@capacitor+ios@8.5.2_@capacitor+core@8.5.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@8.1.1_@capacitor+core@8.5.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@8.0.4_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.0_@capacitor+core@8.5.2/node_modules/@capacitor-community/in-app-review"
CapacitorCommunityScreenBrightness: CapacitorCommunityScreenBrightness:
:path: "../../../../node_modules/.pnpm/@capacitor-community+screen-brightness@8.0.0_@capacitor+core@8.5.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@8.5.2_@capacitor+core@8.5.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@8.0.3_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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@8.2.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.5_@capacitor+core@8.5.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@8.3.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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@8.0.1_@capacitor+core@8.5.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.13.0_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.0.2_@capacitor+core@8.5.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@8.1.3_@capacitor+core@8.5.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: 89067779e14fb7ea56af07b4817f45d1f0c2a269 Capacitor: c95400d761e376be9da6be5a05f226c0e865cebf
CapacitorApp: 305bd13c44f6f9d164e2ee66a4faa956ed8c0e06 CapacitorApp: 30145f2ea2311e4f3744472119ec87d2ddf4c0a7
CapacitorBrowser: 752e0208aa07c7aa63d1f7cde895a3e9519b2656 CapacitorBrowser: 6c0e04dc80556a966ebc2269ac72f09d83eec1ce
CapacitorClipboard: c75fdaa6e622111119f35e7914ecfc67b05efecb CapacitorClipboard: c1cb27fea166aab5c99bda605d3bc768cf00eabe
CapacitorCommunityInAppReview: 4492bdd34aad4d27ed87949376022cc93b294ea1 CapacitorCommunityScreenBrightness: 95d4c839fc8e925dcf75ffee66f62a00f560f146
CapacitorCommunityScreenBrightness: e4075e1181f7e88259edb8b1e3b9a209e1144d45 CapacitorCordova: 8d93e14982f440181be7304aa9559ca631d77fff
CapacitorCordova: 5bec5648cbd09a176ce34ce5e7b6cdabb2c8a327 CapacitorDevice: 38ad323d74e3a86b56253680538ac23a2c9b4a68
CapacitorDevice: 708e742b60a61572cd593e44c809592e8f31da14 CapacitorDialog: bd99f63c9788a137263b2d75e718b1fc4d9f70c3
CapacitorDialog: 854c5dac405081cae697c177ca43bcaa95ae67bf CapacitorFilesystem: 9c2cc1e89d3b8b91503b316e9f6c2915c9bf9419
CapacitorFilesystem: b2bbd84bb91c177906c9dbc252864cb71ab9957b CapacitorGeolocation: 86f82a32b238ff79d5be6fc0943f2866965d3f1b
CapacitorGeolocation: 327f18983c8f8a55e191fcf7dee80b9294f1ab78 CapacitorHaptics: 0cea833e6a8bf489dd6acaaebf6d953b90086c59
CapacitorHaptics: 296f771ecd89c7a1bd92a7b6826a7d268e2e70f5 CapacitorKeyboard: f38d730356be5569d72eb87ad9c8166947728c36
CapacitorKeyboard: b6b0744890cdb1d9a96e2cafcc9253fdcc55de3b CapacitorLocalNotifications: d051c73ec8bf38807214f5b905ee6426e13756f8
CapacitorLocalNotifications: e0747a329ddde3074d52dc74a003688af90e42be CapacitorNetwork: 7ff188197e880d8485f280492b54d3202e9f3a61
CapacitorNetwork: 8812ce60d11fb63d8f2e4ba51a49b2e59892ebe2 CapacitorPreferences: 97d529423bb7c1196455e9a1b6dd1074625c78bd
CapacitorPreferences: cca2021f386efb75947c850334447d9ff22b14f1 CapacitorScreenOrientation: f3a0744a56f673929d18bd0d9a5ef5f5595e7352
CapacitorScreenOrientation: 6c3c84223ea1dd44aaa7184e2b416dd1192270d0 CapacitorSecureStoragePlugin: 545b51d782d35e61a39231ecf99a966b060a2cbb
CapacitorSecureStoragePlugin: d083ff28d9ba5bc74924b9bcf9754ea605016b63 CapacitorShare: ec1bcbc16696696133740ac876192c0480ca3018
CapacitorShare: 2fde721d06a6f83ff5c7578e6a91b190d341ac6a CapacitorSplashScreen: d2d8fe9541d7bebdf735839b89edf6e762cea969
CapacitorSplashScreen: 7bf61c2001557ff9e195e601c6b87344480d3c65 CordovaPlugins: b40548c03c597049ef851a7014da5ac8f155d914
CordovaPlugins: 3508a47f9d91d1c38fa7ff41afa75e7226c9407b
IONFilesystemLib: e6610c2b260d15e4b9cb9d5e37a87095479b669e
IONGeolocationLib: 6a7b6f76063fb1b01cfb14fae7d0f526e3c9b271
SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c SwiftKeychainWrapper: 807ba1d63c33a7d0613288512399cd1eda1e470c
TransistorsoftCapacitorBackgroundFetch: 3fd1ea4cd2f6e8f512d366261b162c68b362e59a TransistorsoftCapacitorBackgroundFetch: dfa73a0fd038bc1986255360e4b20165a4a0f066
TSBackgroundFetch: 18918b6449a1e3f01eb0f5b44d6d79ce6160a5a5
PODFILE CHECKSUM: 47c2431c6197a6e8fdf2ace4f969ed028a0e002f PODFILE CHECKSUM: 601bc3c09529fe24d68110bc709379698476efe1
COCOAPODS: 1.16.2 COCOAPODS: 1.16.2
+21
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)"]
}
}
]
}
+80 -80
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.5", "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,139 +48,139 @@
"test:integration": "sh integration-test.sh" "test:integration": "sh integration-test.sh"
}, },
"dependencies": { "dependencies": {
"@angular/animations": "20.3.31", "@angular/animations": "17.3.12",
"@angular/cdk": "20.2.14", "@angular/cdk": "17.3.10",
"@angular/common": "20.3.31", "@angular/common": "17.3.12",
"@angular/core": "20.3.31", "@angular/core": "17.3.12",
"@angular/forms": "20.3.31", "@angular/forms": "17.3.12",
"@angular/platform-browser": "20.3.31", "@angular/platform-browser": "17.3.12",
"@angular/router": "20.3.31", "@angular/router": "17.3.12",
"@awesome-cordova-plugins/calendar": "8.1.0", "@angular/service-worker": "17.3.12",
"@awesome-cordova-plugins/core": "8.1.0", "@awesome-cordova-plugins/calendar": "6.6.0",
"@capacitor-community/in-app-review": "8.0.0", "@awesome-cordova-plugins/core": "6.6.0",
"@capacitor-community/screen-brightness": "8.0.0", "@capacitor-community/screen-brightness": "6.0.0",
"@capacitor/app": "8.1.1", "@capacitor/app": "6.0.0",
"@capacitor/browser": "8.0.4", "@capacitor/browser": "6.0.1",
"@capacitor/clipboard": "8.0.1", "@capacitor/clipboard": "6.0.0",
"@capacitor/core": "8.5.2", "@capacitor/core": "6.2.1",
"@capacitor/device": "8.0.3", "@capacitor/device": "6.0.0",
"@capacitor/dialog": "8.0.1", "@capacitor/dialog": "6.0.0",
"@capacitor/filesystem": "8.1.3", "@capacitor/filesystem": "6.0.0",
"@capacitor/geolocation": "8.2.2", "@capacitor/geolocation": "6.0.0",
"@capacitor/haptics": "8.0.2", "@capacitor/haptics": "6.0.0",
"@capacitor/keyboard": "8.0.5", "@capacitor/keyboard": "6.0.1",
"@capacitor/local-notifications": "8.3.1", "@capacitor/local-notifications": "6.0.0",
"@capacitor/network": "8.0.1", "@capacitor/network": "6.0.1",
"@capacitor/preferences": "8.0.1", "@capacitor/preferences": "6.0.1",
"@capacitor/screen-orientation": "8.0.1", "@capacitor/screen-orientation": "6.0.1",
"@capacitor/share": "8.0.2", "@capacitor/share": "6.0.1",
"@capacitor/splash-screen": "8.0.2", "@capacitor/splash-screen": "6.0.1",
"@ionic/angular": "8.8.19", "@ionic-native/core": "5.36.0",
"@ionic/angular-server": "8.8.19", "@ionic/angular": "8.6.1",
"@ionic/angular-server": "8.6.1",
"@ionic/storage-angular": "4.0.0", "@ionic/storage-angular": "4.0.0",
"@maplibre/ngx-maplibre-gl": "22.1.0", "@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": "8.1.3", "@transistorsoft/capacitor-background-fetch": "6.0.0",
"@types/dom-view-transitions": "1.0.6", "@types/dom-view-transitions": "1.0.4",
"capacitor-secure-storage-plugin": "0.13.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.6", "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.1.0", "ionicons": "7.4.0",
"jsonpath-plus": "10.3.0", "jsonpath-plus": "10.3.0",
"maplibre-gl": "6.4.1", "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",
"ngx-markdown": "18.1.0", "ngx-markdown": "17.2.1",
"ngx-moment": "6.0.2", "ngx-moment": "6.0.2",
"opening_hours": "3.8.0", "opening_hours": "3.8.0",
"pmtiles": "3.0.3", "pmtiles": "3.0.3",
"prettier": "3.1.1", "prettier": "3.1.1",
"rxjs": "7.8.2", "rxjs": "7.8.1",
"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.16.2" "zone.js": "0.14.4"
}, },
"devDependencies": { "devDependencies": {
"@angular-devkit/architect": "0.2003.37", "@angular-devkit/architect": "0.1703.17",
"@angular-devkit/build-angular": "20.3.37", "@angular-devkit/build-angular": "17.3.17",
"@angular-devkit/core": "20.3.37", "@angular-devkit/core": "17.3.17",
"@angular-devkit/schematics": "20.3.37", "@angular-devkit/schematics": "17.3.17",
"@angular-eslint/builder": "20.7.0", "@angular-eslint/builder": "17.5.3",
"@angular-eslint/eslint-plugin": "20.7.0", "@angular-eslint/eslint-plugin": "17.5.3",
"@angular-eslint/eslint-plugin-template": "20.7.0", "@angular-eslint/eslint-plugin-template": "17.5.3",
"@angular-eslint/schematics": "20.7.0", "@angular-eslint/schematics": "17.5.3",
"@angular-eslint/template-parser": "20.7.0", "@angular-eslint/template-parser": "17.5.3",
"@angular/cli": "20.3.37", "@angular/cli": "17.3.17",
"@angular/compiler": "20.3.31", "@angular/compiler": "17.3.12",
"@angular/compiler-cli": "20.3.31", "@angular/compiler-cli": "17.3.12",
"@angular/language-server": "20.3.0", "@angular/language-server": "17.3.2",
"@angular/language-service": "20.3.31", "@angular/language-service": "17.3.12",
"@angular/platform-browser-dynamic": "20.3.31", "@angular/platform-browser-dynamic": "17.3.12",
"@capacitor/android": "8.5.2", "@capacitor/android": "6.2.1",
"@capacitor/assets": "3.0.5", "@capacitor/assets": "3.0.4",
"@capacitor/cli": "8.5.2", "@capacitor/cli": "6.2.1",
"@capacitor/ios": "8.5.2", "@capacitor/ios": "6.2.1",
"@compodoc/compodoc": "1.2.1", "@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.1", "@ionic/cli": "7.2.0",
"@openstapps/prettier-config": "workspace:*", "@openstapps/prettier-config": "workspace:*",
"@openstapps/tsconfig": "workspace:*", "@openstapps/tsconfig": "workspace:*",
"@stylistic/eslint-plugin": "5.10.0", "@types/fontkit": "2.0.7",
"@types/fontkit": "2.0.9",
"@types/geojson": "1.0.6", "@types/geojson": "1.0.6",
"@types/glob": "8.1.0", "@types/glob": "8.1.0",
"@types/jasmine": "5.1.4", "@types/jasmine": "5.1.4",
"@types/jasminewd2": "2.0.13", "@types/jasminewd2": "2.0.13",
"@types/jsonpath": "0.2.0", "@types/jsonpath": "0.2.0",
"@types/karma": "6.3.9", "@types/karma": "6.3.8",
"@types/karma-coverage": "2.0.3", "@types/karma-coverage": "2.0.3",
"@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": "8.39.1", "@typescript-eslint/eslint-plugin": "7.2.0",
"@typescript-eslint/parser": "8.39.1", "@typescript-eslint/parser": "7.2.0",
"cordova-res": "0.15.4", "cordova-res": "0.15.4",
"cypress": "15.0.0", "cypress": "14.5.0",
"eslint": "8.57.0", "eslint": "8.57.0",
"eslint-plugin-jsdoc": "48.2.1", "eslint-plugin-jsdoc": "48.2.1",
"eslint-plugin-prettier": "5.1.3", "eslint-plugin-prettier": "5.1.3",
"eslint-plugin-unicorn": "51.0.1", "eslint-plugin-unicorn": "51.0.1",
"fast-deep-equal": "3.1.3", "fast-deep-equal": "3.1.3",
"fontkit": "2.0.4", "fontkit": "2.0.2",
"glob": "10.5.0", "glob": "10.3.10",
"http-server": "14.1.1", "http-server": "14.1.1",
"is-docker": "2.2.1", "is-docker": "2.2.1",
"jasmine-core": "5.1.2", "jasmine-core": "5.1.2",
"jasmine-spec-reporter": "7.0.0", "jasmine-spec-reporter": "7.0.0",
"junit-report-merger": "6.0.3", "junit-report-merger": "6.0.3",
"karma": "6.4.4", "karma": "6.4.3",
"karma-chrome-launcher": "3.2.0", "karma-chrome-launcher": "3.2.0",
"karma-coverage": "2.2.1", "karma-coverage": "2.2.1",
"karma-jasmine": "5.1.0", "karma-jasmine": "5.1.0",
"karma-junit-reporter": "2.0.1", "karma-junit-reporter": "2.0.1",
"karma-mocha-reporter": "2.2.5", "karma-mocha-reporter": "2.2.5",
"license-checker": "25.0.1", "license-checker": "25.0.1",
"stylelint": "17.14.1", "stylelint": "16.3.1",
"stylelint-config-clean-order": "10.0.0", "stylelint-config-clean-order": "5.4.1",
"stylelint-config-prettier-scss": "1.0.0", "stylelint-config-prettier-scss": "1.0.0",
"stylelint-config-recommended-scss": "17.0.1", "stylelint-config-recommended-scss": "14.0.0",
"stylelint-config-standard-scss": "17.0.0", "stylelint-config-standard-scss": "13.0.0",
"surge": "0.23.1", "surge": "0.23.1",
"ts-node": "10.9.2", "ts-node": "10.9.2",
"typescript": "5.9.3" "typescript": "5.4.2"
}, },
"cordova": { "cordova": {
"plugins": {}, "plugins": {},
+73
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

@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {HttpClient} from '@angular/common/http'; import {HttpClient} from '@angular/common/http';
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import { import {
SCAcademicEvent, SCAcademicEvent,
SCArticle, SCArticle,
@@ -395,9 +395,7 @@ export class SampleThings {
*/ */
http: HttpClient; http: HttpClient;
constructor() { constructor(http: HttpClient) {
const http = inject(HttpClient);
this.http = http; this.http = http;
} }
@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse} from '@angular/common/http'; import {HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpErrorResponse} from '@angular/common/http';
import {Observable, throwError} from 'rxjs'; import {Observable, throwError} from 'rxjs';
import {NGXLogger} from 'ngx-logger'; import {NGXLogger} from 'ngx-logger';
@@ -21,7 +21,7 @@ import {catchError} from 'rxjs/operators';
@Injectable() @Injectable()
export class ServiceHandlerInterceptor implements HttpInterceptor { export class ServiceHandlerInterceptor implements HttpInterceptor {
private readonly logger = inject(NGXLogger); constructor(private readonly logger: NGXLogger) {}
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> { intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
return next.handle(request).pipe( return next.handle(request).pipe(
@@ -26,7 +26,6 @@ const routes: Routes = [{path: '', redirectTo: '/overview', pathMatch: 'full'}];
RouterModule.forRoot(routes, { RouterModule.forRoot(routes, {
preloadingStrategy: PreloadAllModules, preloadingStrategy: PreloadAllModules,
errorHandler: error => { errorHandler: error => {
console.error(error);
// Handle unknown routes, at the moment this can only be done via window.location // Handle unknown routes, at the moment this can only be done via window.location
if (error.message.includes('Cannot match any routes')) { if (error.message.includes('Cannot match any routes')) {
window.location.href = '/overview'; window.location.href = '/overview';
+6 -4
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>;
@@ -72,7 +70,6 @@ describe('AppComponent', () => {
configProvider.getAnyValue = jasmine.createSpy().and.callFake(function () { configProvider.getAnyValue = jasmine.createSpy().and.callFake(function () {
return sampleAuthConfiguration; return sampleAuthConfiguration;
}); });
inAppReviewProvider = jasmine.createSpyObj('InAppReviewProvider', ['init']);
ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']); ngxLogger = jasmine.createSpyObj('NGXLogger', ['log', 'error', 'warn']);
storageProvider = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']); storageProvider = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put']);
simpleBrowser = jasmine.createSpyObj('SimpleBrowser', ['open']); simpleBrowser = jasmine.createSpyObj('SimpleBrowser', ['open']);
@@ -88,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},
@@ -109,5 +105,11 @@ describe('AppComponent', () => {
it('should initialize the app', async () => { it('should initialize the app', async () => {
TestBed.createComponent(AppComponent); TestBed.createComponent(AppComponent);
expect(platformSpy.ready).toHaveBeenCalled(); expect(platformSpy.ready).toHaveBeenCalled();
// await platformReadySpy;
// TODO: https://capacitorjs.com/docs/guides/mocking-plugins
// expect(splashScreenSpy.hide).toHaveBeenCalled();
}); });
// TODO: add more tests!
}); });
+15 -25
View File
@@ -12,12 +12,11 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {AfterContentInit, Component, NgZone, inject} from '@angular/core'; import {AfterContentInit, Component, NgZone} from '@angular/core';
import {Router} from '@angular/router'; 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';
@@ -32,27 +31,8 @@ import {SplashScreen} from '@capacitor/splash-screen';
@Component({ @Component({
selector: 'app-root', selector: 'app-root',
templateUrl: 'app.component.html', templateUrl: 'app.component.html',
standalone: false,
}) })
export class AppComponent implements AfterContentInit { export class AppComponent implements AfterContentInit {
private readonly platform = inject(Platform);
private readonly settingsProvider = inject(SettingsProvider);
private readonly inAppReviewProvider = inject(InAppReviewProvider);
private readonly router = inject(Router);
private readonly zone = inject(NgZone);
private readonly authHelper = inject(AuthHelperService);
private readonly toastController = inject(ToastController);
private readonly scheduleSyncService = inject(ScheduleSyncService);
private readonly versionService = inject(AppVersionService);
/** /**
* TODO * TODO
*/ */
@@ -72,7 +52,16 @@ export class AppComponent implements AfterContentInit {
*/ */
ommitedEventSources = ['ion-input', 'ion-searchbar']; ommitedEventSources = ['ion-input', 'ion-searchbar'];
constructor() { constructor(
private readonly platform: Platform,
private readonly settingsProvider: SettingsProvider,
private readonly router: Router,
private readonly zone: NgZone,
private readonly authHelper: AuthHelperService,
private readonly toastController: ToastController,
private readonly scheduleSyncService: ScheduleSyncService,
private readonly versionService: AppVersionService,
) {
void this.initializeApp(); void this.initializeApp();
} }
@@ -97,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();
} }
} }
@@ -130,8 +117,11 @@ export class AppComponent implements AfterContentInit {
private async authNotificationsInit() { private async authNotificationsInit() {
this.authHelper this.authHelper
.getProvider() .getProvider('default')
.events$.subscribe(action => this.showMessage(this.authHelper.getAuthMessage('default', action))); .events$.subscribe(action => this.showMessage(this.authHelper.getAuthMessage('default', action)));
this.authHelper
.getProvider('paia')
.events$.subscribe(action => this.showMessage(this.authHelper.getAuthMessage('paia', action)));
} }
private async showMessage(message?: string) { private async showMessage(message?: string) {
+18 -4
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, inject} 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';
@@ -33,6 +33,7 @@ import {CatalogModule} from './modules/catalog/catalog.module';
import {ConfigProvider} from './modules/config/config.provider'; import {ConfigProvider} from './modules/config/config.provider';
import {DashboardModule} from './modules/dashboard/dashboard.module'; import {DashboardModule} from './modules/dashboard/dashboard.module';
import {DataModule} from './modules/data/data.module'; import {DataModule} from './modules/data/data.module';
import {HebisModule} from './modules/hebis/hebis.module';
import {MapModule} from './modules/map/map.module'; import {MapModule} from './modules/map/map.module';
import {MenuModule} from './modules/menu/menu.module'; import {MenuModule} from './modules/menu/menu.module';
import {NewsModule} from './modules/news/news.module'; import {NewsModule} from './modules/news/news.module';
@@ -52,12 +53,14 @@ import {FeedbackModule} from './modules/feedback/feedback.module';
import {DebugDataCollectorService} from './modules/data/debug-data-collector.service'; import {DebugDataCollectorService} from './modules/data/debug-data-collector.service';
import {AuthModule} from './modules/auth/auth.module'; import {AuthModule} from './modules/auth/auth.module';
import {BackgroundModule} from './modules/background/background.module'; import {BackgroundModule} from './modules/background/background.module';
import {LibraryModule} from './modules/library/library.module';
import {StorageProvider} from './modules/storage/storage.provider'; import {StorageProvider} from './modules/storage/storage.provider';
import {AssessmentsModule} from './modules/assessments/assessments.module'; import {AssessmentsModule} from './modules/assessments/assessments.module';
import {ServiceHandlerInterceptor} from './_helpers/service-handler.interceptor'; import {ServiceHandlerInterceptor} from './_helpers/service-handler.interceptor';
import {RoutingStackService} from './util/routing-stack.service'; import {RoutingStackService} from './util/routing-stack.service';
import {SCLanguageCode, SCSettingValue} from '@openstapps/core'; import {SCLanguageCode, SCSettingValue} from '@openstapps/core';
import {DefaultAuthService} from './modules/auth/default-auth.service'; import {DefaultAuthService} from './modules/auth/default-auth.service';
import {PAIAAuthService} from './modules/auth/paia/paia-auth.service';
import {NavigationModule} from './modules/menu/navigation/navigation.module'; import {NavigationModule} from './modules/menu/navigation/navigation.module';
import {browserFactory, SimpleBrowser} from './util/browser.factory'; import {browserFactory, SimpleBrowser} from './util/browser.factory';
import {getDateFnsLocale} from './translation/dfns-locale'; import {getDateFnsLocale} from './translation/dfns-locale';
@@ -65,8 +68,9 @@ import {setDefaultOptions} from 'date-fns';
import {DateFnsConfigurationService} from 'ngx-date-fns'; import {DateFnsConfigurationService} from 'ngx-date-fns';
import {Capacitor} from '@capacitor/core'; import {Capacitor} from '@capacitor/core';
import {SplashScreen} from '@capacitor/splash-screen'; import {SplashScreen} from '@capacitor/splash-screen';
import * as 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);
@@ -83,11 +87,11 @@ export function initializerFactory(
translateService: TranslateService, translateService: TranslateService,
_routingStackService: RoutingStackService, _routingStackService: RoutingStackService,
defaultAuthService: DefaultAuthService, defaultAuthService: DefaultAuthService,
paiaAuthService: PAIAAuthService,
dateFnsConfigurationService: DateFnsConfigurationService, dateFnsConfigurationService: DateFnsConfigurationService,
) { ) {
return async () => { return async () => {
try { try {
maplibregl.setWorkerUrl(new URL('maplibre-gl-worker.mjs', document.baseURI).href);
maplibregl.addProtocol('pmtiles', new Protocol().tile); maplibregl.addProtocol('pmtiles', new Protocol().tile);
initLogger(logger); initLogger(logger);
await storageProvider.init(); await storageProvider.init();
@@ -112,6 +116,7 @@ export function initializerFactory(
dateFnsConfigurationService.setLocale(dateFnsLocale); dateFnsConfigurationService.setLocale(dateFnsLocale);
await defaultAuthService.init(); await defaultAuthService.init();
await paiaAuthService.init();
} catch (error) { } catch (error) {
logger.warn(error); logger.warn(error);
} }
@@ -150,8 +155,10 @@ export function createTranslateLoader(http: HttpClient) {
CommonModule, CommonModule,
DashboardModule, DashboardModule,
DataModule, DataModule,
HebisModule,
JobModule, JobModule,
FavoritesModule, FavoritesModule,
LibraryModule,
ProfilePageModule, ProfilePageModule,
FeedbackModule, FeedbackModule,
MapModule, MapModule,
@@ -176,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: [
{ {
@@ -202,6 +215,7 @@ export function createTranslateLoader(http: HttpClient) {
TranslateService, TranslateService,
RoutingStackService, RoutingStackService,
DefaultAuthService, DefaultAuthService,
PAIAAuthService,
DateFnsConfigurationService, DateFnsConfigurationService,
], ],
useFactory: initializerFactory, useFactory: initializerFactory,
@@ -216,5 +230,5 @@ export function createTranslateLoader(http: HttpClient) {
], ],
}) })
export class AppModule { export class AppModule {
debugDataCollectorService = inject(DebugDataCollectorService); constructor(public debugDataCollectorService: DebugDataCollectorService) {}
} }
@@ -21,7 +21,6 @@ import {ConfigProvider} from '../config/config.provider';
templateUrl: 'about-changelog.html', templateUrl: 'about-changelog.html',
styleUrls: ['about-changelog.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'], styleUrls: ['about-changelog.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class AboutChangelogComponent { export class AboutChangelogComponent {
config = inject(ConfigProvider); config = inject(ConfigProvider);
@@ -20,7 +20,6 @@ import {License} from './about-licenses.component';
selector: 'about-license-modal', selector: 'about-license-modal',
templateUrl: 'about-license-modal.html', templateUrl: 'about-license-modal.html',
styleUrls: ['about-license-modal.scss'], styleUrls: ['about-license-modal.scss'],
standalone: false,
}) })
export class AboutLicenseModalComponent { export class AboutLicenseModalComponent {
@Input() license: License; @Input() license: License;
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, OnInit, inject} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {ModalController} from '@ionic/angular/standalone'; import {ModalController} from '@ionic/angular/standalone';
import {AboutLicenseModalComponent} from './about-license-modal.component'; import {AboutLicenseModalComponent} from './about-license-modal.component';
import licensesFile from 'src/assets/about/licenses.json'; import licensesFile from 'src/assets/about/licenses.json';
@@ -32,13 +32,12 @@ export interface License {
selector: 'about-changelog', selector: 'about-changelog',
templateUrl: 'about-licenses.html', templateUrl: 'about-licenses.html',
styleUrls: ['about-licenses.scss', './about-page/about-page.scss'], styleUrls: ['about-licenses.scss', './about-page/about-page.scss'],
standalone: false,
}) })
export class AboutLicensesComponent implements OnInit { export class AboutLicensesComponent implements OnInit {
private modalController = inject(ModalController);
licenses: License[]; licenses: License[];
constructor(private modalController: ModalController) {}
ngOnInit() { ngOnInit() {
this.licenses = this.loadLicenses(); this.licenses = this.loadLicenses();
} }
@@ -19,7 +19,6 @@ import {SCAboutPageContent} from '@openstapps/core';
selector: 'about-page-content', selector: 'about-page-content',
templateUrl: 'about-page-content.html', templateUrl: 'about-page-content.html',
styleUrls: ['about-page-content.scss'], styleUrls: ['about-page-content.scss'],
standalone: false,
}) })
export class AboutPageContentComponent { export class AboutPageContentComponent {
@Input() content: SCAboutPageContent; @Input() content: SCAboutPageContent;
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, OnInit, inject} from '@angular/core'; import {Component, OnInit} from '@angular/core';
import {ActivatedRoute} from '@angular/router'; import {ActivatedRoute} from '@angular/router';
import {SCAboutPage, SCAppConfiguration} from '@openstapps/core'; import {SCAboutPage, SCAppConfiguration} from '@openstapps/core';
import {ConfigProvider} from '../../config/config.provider'; import {ConfigProvider} from '../../config/config.provider';
@@ -25,13 +25,8 @@ import {Capacitor} from '@capacitor/core';
selector: 'about-page', selector: 'about-page',
templateUrl: 'about-page.html', templateUrl: 'about-page.html',
styleUrls: ['about-page.scss'], styleUrls: ['about-page.scss'],
standalone: false,
}) })
export class AboutPageComponent implements OnInit { export class AboutPageComponent implements OnInit {
private readonly route = inject(ActivatedRoute);
private readonly configProvider = inject(ConfigProvider);
content: SCAboutPage; content: SCAboutPage;
name = config.appName; name = config.appName;
@@ -40,6 +35,11 @@ export class AboutPageComponent implements OnInit {
version: string; version: string;
constructor(
private readonly route: ActivatedRoute,
private readonly configProvider: ConfigProvider,
) {}
async ngOnInit() { async ngOnInit() {
const route = this.route.snapshot.url.map(it => it.path).join('/'); const route = this.route.snapshot.url.map(it => it.path).join('/');
this.content = this.content =
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@use '../../../../theme/util/mixins'; @import '../../../../theme/util/mixins';
ion-text { ion-text {
margin-inline: var(--spacing-md); margin-inline: var(--spacing-md);
@@ -64,7 +64,7 @@ ion-text {
.about-changelog, .about-changelog,
.licenses-content, .licenses-content,
.page-content { .page-content {
@include mixins.border-radius-in-parallax(var(--border-radius-default)); @include border-radius-in-parallax(var(--border-radius-default));
display: flex; display: flex;
flex-direction: column; flex-direction: column;
@@ -76,7 +76,7 @@ ion-text {
background: var(--ion-item-background); background: var(--ion-item-background);
& > * { & > * {
@include mixins.border-radius-in-parallax(var(--border-radius-default)); @include border-radius-in-parallax(var(--border-radius-default));
position: relative; position: relative;
overflow: hidden; overflow: hidden;
@@ -21,7 +21,6 @@ import {ConfigProvider} from '../config/config.provider';
templateUrl: 'about-release-notes.html', templateUrl: 'about-release-notes.html',
styleUrls: ['about-release-notes.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'], styleUrls: ['about-release-notes.scss', './about-page/about-page.scss', 'release-notes-markdown.scss'],
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
standalone: false,
}) })
export class AboutReleaseNotesComponent { export class AboutReleaseNotesComponent {
config = inject(ConfigProvider); config = inject(ConfigProvider);
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
@use '../../../theme/util/mixins'; @import '../../../theme/util/mixins';
ion-button { ion-button {
--color: var(--ion-color-primary-contrast); --color: var(--ion-color-primary-contrast);
@@ -22,7 +22,7 @@ ion-button {
} }
.release-notes { .release-notes {
@include mixins.border-radius-in-parallax(var(--border-radius-default)); @include border-radius-in-parallax(var(--border-radius-default));
display: block; display: block;
margin: var(--spacing-md); margin: var(--spacing-md);
@@ -1,4 +1,4 @@
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {StorageProvider} from '../storage/storage.provider'; import {StorageProvider} from '../storage/storage.provider';
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {ModalController} from '@ionic/angular/standalone'; import {ModalController} from '@ionic/angular/standalone';
@@ -12,11 +12,11 @@ export const RELEASE_NOTES_SHOWN_KEY = 'release_notes_shown';
@Injectable({providedIn: 'root'}) @Injectable({providedIn: 'root'})
export class AppVersionService { export class AppVersionService {
private storage = inject(StorageProvider); constructor(
private storage: StorageProvider,
private config = inject(ConfigProvider); private config: ConfigProvider,
private modalController: ModalController,
private modalController = inject(ModalController); ) {}
/** /**
* Get the latest release notes that have not been presented yet * Get the latest release notes that have not been presented yet
@@ -20,7 +20,7 @@
} }
blockquote { blockquote {
border-left: 0.25em solid var(--ion-color-medium);
background: var(--ion-item-background); background: var(--ion-item-background);
border-left: 0.25em solid var(--ion-color-medium);
} }
} }
@@ -1,4 +1,4 @@
import {ChangeDetectionStrategy, Component, Input, inject} from '@angular/core'; import {ChangeDetectionStrategy, Component, Input} from '@angular/core';
import {SCAppVersionInfo} from '@openstapps/core'; import {SCAppVersionInfo} from '@openstapps/core';
import {MarkdownModule} from 'ngx-markdown'; import {MarkdownModule} from 'ngx-markdown';
import {ThingTranslateModule} from '../../translation/thing-translate.module'; import {ThingTranslateModule} from '../../translation/thing-translate.module';
@@ -17,6 +17,7 @@ import {UtilModule} from '../../util/util.module';
selector: 'stapps-release-notes', selector: 'stapps-release-notes',
templateUrl: 'release-notes.html', templateUrl: 'release-notes.html',
styleUrls: ['release-notes.scss', 'release-notes-markdown.scss'], styleUrls: ['release-notes.scss', 'release-notes-markdown.scss'],
standalone: true,
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
imports: [ imports: [
UtilModule, UtilModule,
@@ -31,7 +32,7 @@ import {UtilModule} from '../../util/util.module';
], ],
}) })
export class ReleaseNotesComponent { export class ReleaseNotesComponent {
readonly modalController = inject(ModalController);
@Input() versionInfos: SCAppVersionInfo[]; @Input() versionInfos: SCAppVersionInfo[];
constructor(readonly modalController: ModalController) {}
} }
@@ -1,11 +1,11 @@
@use '../../../theme/util/mixins'; @import '../../../theme/util/mixins';
ion-title { ion-title {
padding-block: var(--spacing-md); padding-block: var(--spacing-md);
} }
.content-card { .content-card {
@include mixins.border-radius-in-parallax(var(--border-radius-default)); @include border-radius-in-parallax(var(--border-radius-default));
display: block; display: block;
margin: var(--spacing-md); margin: var(--spacing-md);
@@ -12,7 +12,7 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {SCAssessment, SCUuid} from '@openstapps/core'; import {SCAssessment, SCUuid} from '@openstapps/core';
import {DefaultAuthService} from '../auth/default-auth.service'; import {DefaultAuthService} from '../auth/default-auth.service';
@@ -51,12 +51,6 @@ export function toAssessmentMap(data: SCAssessment[]): Record<SCUuid, SCAssessme
providedIn: 'root', providedIn: 'root',
}) })
export class AssessmentsProvider { export class AssessmentsProvider {
readonly configProvider = inject(ConfigProvider);
readonly defaultAuth = inject(DefaultAuthService);
readonly http = inject(HttpClient);
assessmentPath = 'assessments'; assessmentPath = 'assessments';
// usually this wouldn't be necessary, but the assessment service // usually this wouldn't be necessary, but the assessment service
@@ -70,6 +64,12 @@ export class AssessmentsProvider {
// 15 minutes // 15 minutes
cacheMaxAge = 15 * 60 * 1000; cacheMaxAge = 15 * 60 * 1000;
constructor(
readonly configProvider: ConfigProvider,
readonly defaultAuth: DefaultAuthService,
readonly http: HttpClient,
) {}
async getAssessment(uid: SCUuid, accessToken?: string | null, forceFetch = false): Promise<SCAssessment> { async getAssessment(uid: SCUuid, accessToken?: string | null, forceFetch = false): Promise<SCAssessment> {
await this.getAssessments(accessToken, forceFetch); await this.getAssessments(accessToken, forceFetch);
@@ -26,21 +26,18 @@ import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
selector: 'assessments-detail', selector: 'assessments-detail',
templateUrl: 'assessments-detail.html', templateUrl: 'assessments-detail.html',
styleUrls: ['assessments-detail.scss'], styleUrls: ['assessments-detail.scss'],
standalone: false,
}) })
export class AssessmentsDetailComponent implements OnInit { export class AssessmentsDetailComponent implements OnInit {
readonly route = inject(ActivatedRoute);
readonly assessmentsProvider = inject(AssessmentsProvider);
readonly dataRoutingService = inject(DataRoutingService);
readonly navController = inject(NavController);
readonly activatedRoute = inject(ActivatedRoute);
destroy$ = inject(DestroyRef); destroy$ = inject(DestroyRef);
constructor(
readonly route: ActivatedRoute,
readonly assessmentsProvider: AssessmentsProvider,
readonly dataRoutingService: DataRoutingService,
readonly navController: NavController,
readonly activatedRoute: ActivatedRoute,
) {}
@Input() dataPathAutoRouting = true; @Input() dataPathAutoRouting = true;
@ViewChild(DataDetailComponent) @ViewChild(DataDetailComponent)
@@ -21,7 +21,6 @@ import {Observable} from 'rxjs';
selector: 'assessments-data-list', selector: 'assessments-data-list',
templateUrl: './assessments-data-list.html', templateUrl: './assessments-data-list.html',
styleUrls: ['./assessments-data-list.scss'], styleUrls: ['./assessments-data-list.scss'],
standalone: false,
}) })
export class AssessmentsDataListComponent { export class AssessmentsDataListComponent {
/** /**
@@ -20,7 +20,6 @@ import {SCThings} from '@openstapps/core';
selector: 'assessments-list-item', selector: 'assessments-list-item',
templateUrl: 'assessments-list-item.html', templateUrl: 'assessments-list-item.html',
styleUrls: ['assessments-list-item.scss'], styleUrls: ['assessments-list-item.scss'],
standalone: false,
}) })
export class AssessmentsListItemComponent { export class AssessmentsListItemComponent {
/** /**
@@ -23,15 +23,8 @@ import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
selector: 'assessments-simple-data-list', selector: 'assessments-simple-data-list',
templateUrl: 'assessments-simple-data-list.html', templateUrl: 'assessments-simple-data-list.html',
styleUrls: ['assessments-simple-data-list.scss'], styleUrls: ['assessments-simple-data-list.scss'],
standalone: false,
}) })
export class AssessmentsSimpleDataListComponent implements OnInit { export class AssessmentsSimpleDataListComponent implements OnInit {
readonly dataRoutingService = inject(DataRoutingService);
readonly router = inject(Router);
readonly activatedRoute = inject(ActivatedRoute);
/** /**
* All SCThings to display * All SCThings to display
*/ */
@@ -53,6 +46,12 @@ export class AssessmentsSimpleDataListComponent implements OnInit {
destroy$ = inject(DestroyRef); destroy$ = inject(DestroyRef);
constructor(
readonly dataRoutingService: DataRoutingService,
readonly router: Router,
readonly activatedRoute: ActivatedRoute,
) {}
ngOnInit() { ngOnInit() {
this.dataRoutingService this.dataRoutingService
.itemSelectListener() .itemSelectListener()
@@ -20,7 +20,6 @@ import {SCThings} from '@openstapps/core';
selector: 'assessments-tree-list', selector: 'assessments-tree-list',
templateUrl: 'assessments-tree-list.html', templateUrl: 'assessments-tree-list.html',
styleUrls: ['assessments-tree-list.scss'], styleUrls: ['assessments-tree-list.scss'],
standalone: false,
}) })
export class AssessmentsTreeListComponent { export class AssessmentsTreeListComponent {
@Input() items?: Promise<SCThings[] | undefined>; @Input() items?: Promise<SCThings[] | undefined>;
@@ -29,21 +29,8 @@ import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
templateUrl: 'assessments-page.html', templateUrl: 'assessments-page.html',
styleUrls: ['assessments-page.scss'], styleUrls: ['assessments-page.scss'],
animations: [materialSharedAxisX], animations: [materialSharedAxisX],
standalone: false,
}) })
export class AssessmentsPageComponent implements OnInit, AfterViewInit { export class AssessmentsPageComponent implements OnInit, AfterViewInit {
readonly logger = inject(NGXLogger);
readonly assessmentsProvider = inject(AssessmentsProvider);
readonly dataProvider = inject(DataProvider);
readonly activatedRoute = inject(ActivatedRoute);
readonly dataRoutingService = inject(DataRoutingService);
readonly router = inject(Router);
assessments: Promise< assessments: Promise<
Record< Record<
string, string,
@@ -62,6 +49,15 @@ export class AssessmentsPageComponent implements OnInit, AfterViewInit {
destroy$ = inject(DestroyRef); destroy$ = inject(DestroyRef);
constructor(
readonly logger: NGXLogger,
readonly assessmentsProvider: AssessmentsProvider,
readonly dataProvider: DataProvider,
readonly activatedRoute: ActivatedRoute,
readonly dataRoutingService: DataRoutingService,
readonly router: Router,
) {}
ngAfterViewInit() { ngAfterViewInit() {
this.segmentView.value = this.sharedAxisChoreographer.currentValue; this.segmentView.value = this.sharedAxisChoreographer.currentValue;
} }
@@ -20,7 +20,6 @@ import {SCAssessment} from '@openstapps/core';
selector: 'assessment-base-info', selector: 'assessment-base-info',
templateUrl: 'assessment-base-info.html', templateUrl: 'assessment-base-info.html',
styleUrls: ['assessment-base-info.scss'], styleUrls: ['assessment-base-info.scss'],
standalone: false,
}) })
export class AssessmentBaseInfoComponent { export class AssessmentBaseInfoComponent {
_item: SCAssessment; _item: SCAssessment;
@@ -20,7 +20,6 @@ import {SCAssessment} from '@openstapps/core';
selector: 'assessment-detail', selector: 'assessment-detail',
templateUrl: 'assessment-detail.html', templateUrl: 'assessment-detail.html',
styleUrls: ['assessment-detail.scss'], styleUrls: ['assessment-detail.scss'],
standalone: false,
}) })
export class AssessmentDetailComponent { export class AssessmentDetailComponent {
@Input() item: SCAssessment; @Input() item: SCAssessment;
@@ -20,7 +20,6 @@ import {SCAssessment} from '@openstapps/core';
selector: 'stapps-assessment-list-item', selector: 'stapps-assessment-list-item',
templateUrl: './assessment-list-item.html', templateUrl: './assessment-list-item.html',
styleUrls: ['./assessment-list-item.scss'], styleUrls: ['./assessment-list-item.scss'],
standalone: false,
}) })
export class AssessmentListItemComponent { export class AssessmentListItemComponent {
@Input() item: SCAssessment; @Input() item: SCAssessment;
@@ -20,7 +20,6 @@ import {SCAssessment, SCCourseOfStudyWithoutReferences} from '@openstapps/core';
selector: 'course-of-study-assessment', selector: 'course-of-study-assessment',
templateUrl: 'course-of-study-assessment.html', templateUrl: 'course-of-study-assessment.html',
styleUrls: ['course-of-study-assessment.scss'], styleUrls: ['course-of-study-assessment.scss'],
standalone: false,
}) })
export class CourseOfStudyAssessmentComponent { export class CourseOfStudyAssessmentComponent {
@Input() courseOfStudy?: SCCourseOfStudyWithoutReferences | null; @Input() courseOfStudy?: SCCourseOfStudyWithoutReferences | null;
@@ -12,31 +12,28 @@
* You should have received a copy of the GNU General Public License along with * You should have received a copy of the GNU General Public License along with
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Component, inject} from '@angular/core'; import {Component} from '@angular/core';
import {NavController} from '@ionic/angular/standalone'; import {NavController} from '@ionic/angular/standalone';
import {Router} from '@angular/router'; import {Router} from '@angular/router';
import {AuthActions, IAuthAction} from 'ionic-appauth'; import {AuthActions, IAuthAction} from 'ionic-appauth';
import {AuthHelperService} from '../../auth-helper.service'; import {AuthHelperService} from '../../auth-helper.service';
import {takeUntilDestroyed} from '@angular/core/rxjs-interop'; import {takeUntilDestroyed} from '@angular/core/rxjs-interop';
import {Observable} from 'rxjs'; import {Observable} from 'rxjs';
import {IPAIAAuthAction} from '../../paia/paia-auth-action';
import {DefaultAuthService} from '../../default-auth.service'; import {DefaultAuthService} from '../../default-auth.service';
@Component({ @Component({
templateUrl: 'auth-callback-page.component.html', templateUrl: 'auth-callback-page.component.html',
styleUrls: ['auth-callback-page.component.scss'], styleUrls: ['auth-callback-page.component.scss'],
standalone: false,
}) })
export class AuthCallbackPageComponent { export class AuthCallbackPageComponent {
private navCtrl = inject(NavController); constructor(
private navCtrl: NavController,
private router = inject(Router); private router: Router,
private authHelper: AuthHelperService,
private authHelper = inject(AuthHelperService); private auth: DefaultAuthService,
) {
private auth = inject(DefaultAuthService); const events: Observable<IPAIAAuthAction | IAuthAction> = this.auth.events$;
constructor() {
const events: Observable<IAuthAction> = this.auth.events$;
events.pipe(takeUntilDestroyed()).subscribe((action: IAuthAction) => this.postCallback(action)); events.pipe(takeUntilDestroyed()).subscribe((action: IAuthAction) => this.postCallback(action));
this.auth.authorizationCallback(window.location.origin + this.router.url); this.auth.authorizationCallback(window.location.origin + this.router.url);
@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {CanActivate, NavigationExtras, Router, RouterStateSnapshot} from '@angular/router'; import {CanActivate, NavigationExtras, Router, RouterStateSnapshot} from '@angular/router';
import {ActivatedProtectedRouteSnapshot} from './protected.routes'; import {ActivatedProtectedRouteSnapshot} from './protected.routes';
import {AuthHelperService} from './auth-helper.service'; import {AuthHelperService} from './auth-helper.service';
@@ -22,9 +22,10 @@ import {AuthHelperService} from './auth-helper.service';
providedIn: 'root', providedIn: 'root',
}) })
export class AuthGuardService implements CanActivate { export class AuthGuardService implements CanActivate {
private authHelper = inject(AuthHelperService); constructor(
private authHelper: AuthHelperService,
private router = inject(Router); private router: Router,
) {}
public async canActivate(route: ActivatedProtectedRouteSnapshot, _state: RouterStateSnapshot) { public async canActivate(route: ActivatedProtectedRouteSnapshot, _state: RouterStateSnapshot) {
if (route.queryParamMap.get('token')) { if (route.queryParamMap.get('token')) {
@@ -32,16 +33,16 @@ export class AuthGuardService implements CanActivate {
} }
try { try {
await this.authHelper.getProvider().getValidToken(); await this.authHelper.getProvider(route.data.authProvider).getValidToken();
} catch { } catch {
const originNavigation = this.router.currentNavigation(); const originNavigation = this.router.getCurrentNavigation();
let extras: NavigationExtras = {}; let extras: NavigationExtras = {};
if (originNavigation) { if (originNavigation) {
const url = originNavigation.extractedUrl.toString(); const url = originNavigation.extractedUrl.toString();
extras = {queryParams: {origin_path: url}}; extras = {queryParams: {origin_path: url}};
} }
this.router.navigate(['profile'], extras); this.router.navigate(['profile'], extras);
await this.authHelper.getProvider().signIn(); await this.authHelper.getProvider(route.data.authProvider).signIn();
return false; return false;
} }
@@ -20,6 +20,7 @@ import {DefaultAuthService} from './default-auth.service';
import {Browser} from 'ionic-appauth'; import {Browser} from 'ionic-appauth';
import {Requestor, StorageBackend} from '@openid/appauth'; import {Requestor, StorageBackend} from '@openid/appauth';
import {TranslateService} from '@ngx-translate/core'; import {TranslateService} from '@ngx-translate/core';
import {PAIAAuthService} from './paia/paia-auth.service';
import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider'; import {StAppsWebHttpClient} from '../data/stapps-web-http-client.provider';
import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http'; import {provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import {SimpleBrowser} from '../../util/browser.factory'; import {SimpleBrowser} from '../../util/browser.factory';
@@ -30,6 +31,7 @@ describe('AuthHelperService', () => {
const storageProviderSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put', 'search']); const storageProviderSpy = jasmine.createSpyObj('StorageProvider', ['init', 'get', 'has', 'put', 'search']);
const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['setDefaultLang', 'use']); const translateServiceSpy = jasmine.createSpyObj('TranslateService', ['setDefaultLang', 'use']);
const defaultAuthServiceMock = jasmine.createSpyObj('DefaultAuthService', ['init', 'setupConfiguration']); const defaultAuthServiceMock = jasmine.createSpyObj('DefaultAuthService', ['init', 'setupConfiguration']);
const paiaAuthServiceMock = jasmine.createSpyObj('PAIAAuthService', ['init', 'setupConfiguration']);
const authHelperServiceMock = jasmine.createSpyObj('AuthHelperService', ['constructor']); const authHelperServiceMock = jasmine.createSpyObj('AuthHelperService', ['constructor']);
const simpleBrowserMock = jasmine.createSpyObj('SimpleBrowser', ['open']); const simpleBrowserMock = jasmine.createSpyObj('SimpleBrowser', ['open']);
const configProvider = jasmine.createSpyObj('ConfigProvider', { const configProvider = jasmine.createSpyObj('ConfigProvider', {
@@ -67,6 +69,10 @@ describe('AuthHelperService', () => {
provider: DefaultAuthService, provider: DefaultAuthService,
useValue: defaultAuthServiceMock, useValue: defaultAuthServiceMock,
}, },
{
provider: PAIAAuthService,
useValue: paiaAuthServiceMock,
},
{ {
provide: ConfigProvider, provide: ConfigProvider,
useValue: configProvider, useValue: configProvider,
@@ -13,7 +13,8 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {IPAIAAuthAction} from './paia/paia-auth-action';
import {AuthActions, IAuthAction} from 'ionic-appauth'; import {AuthActions, IAuthAction} from 'ionic-appauth';
import {TranslateService} from '@ngx-translate/core'; import {TranslateService} from '@ngx-translate/core';
import {JSONPath} from 'jsonpath-plus'; import {JSONPath} from 'jsonpath-plus';
@@ -26,6 +27,7 @@ import {
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {StorageProvider} from '../storage/storage.provider'; import {StorageProvider} from '../storage/storage.provider';
import {DefaultAuthService} from './default-auth.service'; import {DefaultAuthService} from './default-auth.service';
import {PAIAAuthService} from './paia/paia-auth.service';
import {SimpleBrowser} from '../../util/browser.factory'; import {SimpleBrowser} from '../../util/browser.factory';
import {AlertController} from '@ionic/angular/standalone'; import {AlertController} from '@ionic/angular/standalone';
@@ -35,21 +37,17 @@ const AUTH_ORIGIN_PATH = 'stapps.auth.origin_path';
providedIn: 'root', providedIn: 'root',
}) })
export class AuthHelperService { export class AuthHelperService {
private translateService = inject(TranslateService);
private configProvider = inject(ConfigProvider);
private storageProvider = inject(StorageProvider);
private defaultAuth = inject(DefaultAuthService);
private browser = inject(SimpleBrowser);
private alertController = inject(AlertController);
userConfigurationMap: SCUserConfigurationMap; userConfigurationMap: SCUserConfigurationMap;
constructor() { constructor(
private translateService: TranslateService,
private configProvider: ConfigProvider,
private storageProvider: StorageProvider,
private defaultAuth: DefaultAuthService,
private paiaAuth: PAIAAuthService,
private browser: SimpleBrowser,
private alertController: AlertController,
) {
this.userConfigurationMap = this.userConfigurationMap =
( (
this.configProvider.getAnyValue('auth') as { this.configProvider.getAnyValue('auth') as {
@@ -58,7 +56,7 @@ export class AuthHelperService {
).default?.endpoints.mapping ?? {}; ).default?.endpoints.mapping ?? {};
} }
public getAuthMessage(provider: SCAuthorizationProviderType, action: IAuthAction) { public getAuthMessage(provider: SCAuthorizationProviderType, action: IAuthAction | IPAIAAuthAction) {
let message: string | undefined; let message: string | undefined;
switch (action.action) { switch (action.action) {
case AuthActions.SignInSuccess: { case AuthActions.SignInSuccess: {
@@ -110,11 +108,16 @@ export class AuthHelperService {
return originPath; return originPath;
} }
getProvider<B extends SCAuthorizationProviderType>(
providerType: B,
): B extends 'paia' ? PAIAAuthService : DefaultAuthService;
/** /**
* Provides appropriate auth service instance based on type (string) parameter * Provides appropriate auth service instance based on type (string) parameter
*/ */
getProvider(): DefaultAuthService { getProvider(providerType: SCAuthorizationProviderType): DefaultAuthService | PAIAAuthService {
return this.defaultAuth; return providerType === 'paia'
? (this.paiaAuth as PAIAAuthService)
: (this.defaultAuth as DefaultAuthService);
} }
/** /**
@@ -122,7 +125,7 @@ export class AuthHelperService {
* @param providerType Type of the provider (e.g. 'default' or 'paia') * @param providerType Type of the provider (e.g. 'default' or 'paia')
*/ */
async endBrowserSession(providerType: SCAuthorizationProviderType) { async endBrowserSession(providerType: SCAuthorizationProviderType) {
const endSessionEndpoint = (await this.getProvider().configuration).endSessionEndpoint; const endSessionEndpoint = (await this.getProvider(providerType).configuration).endSessionEndpoint;
if (endSessionEndpoint) { if (endSessionEndpoint) {
const alert: HTMLIonAlertElement = await this.alertController.create({ const alert: HTMLIonAlertElement = await this.alertController.create({
@@ -17,12 +17,19 @@ import {RouterModule, Routes} from '@angular/router';
import {NgModule} from '@angular/core'; import {NgModule} from '@angular/core';
import {authPaths} from './auth-paths'; import {authPaths} from './auth-paths';
import {AuthCallbackPageComponent} from './auth-callback/page/auth-callback-page.component'; import {AuthCallbackPageComponent} from './auth-callback/page/auth-callback-page.component';
import {DefaultAuthService} from './default-auth.service';
import {PAIAAuthService} from './paia/paia-auth.service';
const authRoutes: Routes = [ const authRoutes: Routes = [
{ {
path: authPaths.default.redirect_path, path: authPaths.default.redirect_path,
component: AuthCallbackPageComponent, component: AuthCallbackPageComponent,
}, },
{
path: authPaths.paia.redirect_path,
component: AuthCallbackPageComponent,
providers: [{provide: DefaultAuthService, useExisting: PAIAAuthService}],
},
]; ];
/** /**
@@ -11,6 +11,7 @@ import {AuthRoutingModule} from './auth-routing.module';
import {TranslateModule} from '@ngx-translate/core'; import {TranslateModule} from '@ngx-translate/core';
import {AuthCallbackPageComponent} from './auth-callback/page/auth-callback-page.component'; import {AuthCallbackPageComponent} from './auth-callback/page/auth-callback-page.component';
import {DefaultAuthService} from './default-auth.service'; import {DefaultAuthService} from './default-auth.service';
import {PAIAAuthService} from './paia/paia-auth.service';
@NgModule({ @NgModule({
declarations: [AuthCallbackPageComponent], declarations: [AuthCallbackPageComponent],
@@ -31,6 +32,7 @@ import {DefaultAuthService} from './default-auth.service';
useClass: CapacitorBrowser, useClass: CapacitorBrowser,
}, },
DefaultAuthService, DefaultAuthService,
PAIAAuthService,
], ],
}) })
export class AuthModule {} export class AuthModule {}
@@ -26,7 +26,7 @@ import {AuthActionBuilder, Browser, DefaultBrowser, EndSessionHandler, UserInfoH
import {ConfigProvider} from '../config/config.provider'; import {ConfigProvider} from '../config/config.provider';
import {SCAuthorizationProvider} from '@openstapps/core'; import {SCAuthorizationProvider} from '@openstapps/core';
import {getClientConfig, getEndpointsConfig} from './auth.provider.methods'; import {getClientConfig, getEndpointsConfig} from './auth.provider.methods';
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {AuthService} from './auth.service'; import {AuthService} from './auth.service';
const TOKEN_RESPONSE_KEY = 'token_response'; const TOKEN_RESPONSE_KEY = 'token_response';
@@ -35,14 +35,6 @@ const TOKEN_RESPONSE_KEY = 'token_response';
providedIn: 'root', providedIn: 'root',
}) })
export class DefaultAuthService extends AuthService { export class DefaultAuthService extends AuthService {
protected browser: Browser;
protected storage: StorageBackend;
protected requestor: Requestor;
private readonly configProvider = inject(ConfigProvider);
public localConfiguration: AuthorizationServiceConfiguration; public localConfiguration: AuthorizationServiceConfiguration;
protected tokenHandler: TokenRequestHandler; protected tokenHandler: TokenRequestHandler;
@@ -53,16 +45,13 @@ export class DefaultAuthService extends AuthService {
protected endSessionHandler: EndSessionHandler; protected endSessionHandler: EndSessionHandler;
constructor() { constructor(
const browser = inject(Browser) ?? new DefaultBrowser(); protected browser: Browser = new DefaultBrowser(),
const storage = inject(StorageBackend) ?? new LocalStorageBackend(); protected storage: StorageBackend = new LocalStorageBackend(),
const requestor = inject(Requestor) ?? new JQueryRequestor(); protected requestor: Requestor = new JQueryRequestor(),
private readonly configProvider: ConfigProvider,
) {
super(browser, storage, requestor); super(browser, storage, requestor);
this.browser = browser;
this.storage = storage;
this.requestor = requestor;
} }
get configuration(): Promise<AuthorizationServiceConfiguration> { get configuration(): Promise<AuthorizationServiceConfiguration> {
@@ -13,10 +13,11 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {HttpClient} from '@angular/common/http';
import {Platform} from '@ionic/angular/standalone'; import {Platform} from '@ionic/angular/standalone';
import {CapacitorRequestor} from '../capacitor-requestor'; import {CapacitorRequestor} from '../capacitor-requestor';
import {NgHttpService} from '../ng-http.service'; import {NgHttpService} from '../ng-http.service';
export const httpFactory = (platform: Platform) => { export const httpFactory = (platform: Platform, httpClient: HttpClient) => {
return platform.is('capacitor') ? new CapacitorRequestor() : new NgHttpService(); return platform.is('capacitor') ? new CapacitorRequestor() : new NgHttpService(httpClient);
}; };
@@ -13,7 +13,7 @@
* this program. If not, see <https://www.gnu.org/licenses/>. * this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
import {Injectable, inject} from '@angular/core'; import {Injectable} from '@angular/core';
import {Requestor} from '@openid/appauth'; import {Requestor} from '@openid/appauth';
import {HttpClient, HttpHeaders} from '@angular/common/http'; import {HttpClient, HttpHeaders} from '@angular/common/http';
import {XhrSettings} from 'ionic-appauth/lib/cordova'; import {XhrSettings} from 'ionic-appauth/lib/cordova';
@@ -23,7 +23,7 @@ import {firstValueFrom, Observable} from 'rxjs';
providedIn: 'root', providedIn: 'root',
}) })
export class NgHttpService implements Requestor { export class NgHttpService implements Requestor {
private http = inject(HttpClient); constructor(private http: HttpClient) {}
public async xhr<T>(settings: XhrSettings): Promise<T> { public async xhr<T>(settings: XhrSettings): Promise<T> {
if (!settings.method) { if (!settings.method) {
@@ -0,0 +1,197 @@
/*
* 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/>.
*/
import {
StorageBackend,
BasicQueryStringUtils,
DefaultCrypto,
AuthorizationServiceConfiguration,
AuthorizationRequest,
StringMap,
AuthorizationError,
AuthorizationErrorJson,
BUILT_IN_PARAMETERS,
} from '@openid/appauth';
import {Browser} from 'ionic-appauth';
import {PAIAAuthorizationNotifier} from './paia-authorization-notifier';
import {PAIAAuthorizationRequestResponse} from './authorization-request-response';
import {PAIAAuthorizationResponse, PAIAAuthorizationResponseJson} from './paia-authorization-response';
/** key for authorization request. */
const authorizationRequestKey = (handle: string) => {
return `${handle}_appauth_authorization_request`;
};
/** key in local storage which represents the current authorization request. */
const AUTHORIZATION_REQUEST_HANDLE_KEY = 'appauth_current_authorization_request';
export const AUTHORIZATION_RESPONSE_KEY = 'auth_response';
export class PAIAAuthorizationRequestHandler {
notifier: PAIAAuthorizationNotifier;
constructor(
private browser: Browser,
private storage: StorageBackend,
public utils = new BasicQueryStringUtils(),
protected crypto = new Crypto(),
private generateRandom = new DefaultCrypto(),
) {}
public async performAuthorizationRequest(
configuration: AuthorizationServiceConfiguration,
request: AuthorizationRequest,
): Promise<void> {
const handle = this.generateRandom.generateRandom(10);
await this.storage.setItem(AUTHORIZATION_REQUEST_HANDLE_KEY, handle);
await this.storage.setItem(authorizationRequestKey(handle), JSON.stringify(await request.toJson()));
const url = this.buildRequestUrl(configuration, request);
const returnedUrl: string | undefined = await this.browser.showWindow(url, request.redirectUri);
// callback may come from showWindow or via another method
if (returnedUrl !== undefined) {
await this.storage.setItem(AUTHORIZATION_RESPONSE_KEY, returnedUrl);
await this.completeAuthorizationRequestIfPossible();
}
}
protected async completeAuthorizationRequest(): Promise<PAIAAuthorizationRequestResponse> {
const handle = await this.storage.getItem(AUTHORIZATION_REQUEST_HANDLE_KEY);
if (!handle) {
throw new Error('Handle Not Available');
}
const request: AuthorizationRequest = this.getAuthorizationRequest(
await this.storage.getItem(authorizationRequestKey(handle)),
);
const queryParameters = this.getQueryParams(await this.storage.getItem(AUTHORIZATION_RESPONSE_KEY));
void this.removeItemsFromStorage(handle);
const state: string | undefined = queryParameters['state'];
const error: string | undefined = queryParameters['error'];
if (state !== request.state) {
throw new Error('State Does Not Match');
}
return <PAIAAuthorizationRequestResponse>{
request: request, // request
response: error ? undefined : this.getAuthorizationResponse(queryParameters),
error: error ? this.getAuthorizationError(queryParameters) : undefined,
};
}
private getAuthorizationRequest(authRequest: string | null): AuthorizationRequest {
if (authRequest == undefined) {
throw new Error('No Auth Request Available');
}
return new AuthorizationRequest(JSON.parse(authRequest));
}
private getAuthorizationError(queryParameters: StringMap): AuthorizationError {
const authorizationErrorJSON: AuthorizationErrorJson = {
error: queryParameters['error'],
error_description: queryParameters['error_description'],
error_uri: undefined,
state: queryParameters['state'],
};
return new AuthorizationError(authorizationErrorJSON);
}
private getAuthorizationResponse(queryParameters: StringMap): PAIAAuthorizationResponse {
const authorizationResponseJSON: PAIAAuthorizationResponseJson = {
code: queryParameters['code'],
patron: queryParameters['patron'],
// TODO: currently PAIA is not providing state
state: queryParameters['state'] ?? '',
};
return new PAIAAuthorizationResponse(authorizationResponseJSON);
}
private async removeItemsFromStorage(handle: string): Promise<void> {
await this.storage.removeItem(AUTHORIZATION_REQUEST_HANDLE_KEY);
await this.storage.removeItem(authorizationRequestKey(handle));
await this.storage.removeItem(AUTHORIZATION_RESPONSE_KEY);
}
private getQueryParams(authResponse: string | null): StringMap {
if (authResponse == undefined) {
return {};
} else {
const querySide: string = authResponse.split('#')[0];
const parts: string[] = querySide.split('?');
if (parts.length !== 2) throw new Error('Invalid auth response string');
const hash = parts[1];
return this.utils.parseQueryString(hash);
}
}
setAuthorizationNotifier(notifier: PAIAAuthorizationNotifier): PAIAAuthorizationRequestHandler {
this.notifier = notifier;
return this;
}
completeAuthorizationRequestIfPossible(): Promise<void> {
// call complete authorization if possible to see there might
// be a response that needs to be delivered.
console.log(`Checking to see if there is an authorization response to be delivered.`);
if (!this.notifier) {
console.log(`Notifier is not present on AuthorizationRequest handler.
No delivery of result will be possible`);
}
return this.completeAuthorizationRequest().then(result => {
if (!result) {
console.log(`No result is available yet.`);
}
if (result && this.notifier) {
this.notifier.onAuthorizationComplete(result.request, result.response, result.error);
}
});
}
/**
* A utility method to be able to build the authorization request URL.
*/
protected buildRequestUrl(configuration: AuthorizationServiceConfiguration, request: AuthorizationRequest) {
// build the query string
// coerce to any type for convenience
const requestMap: StringMap = {
redirect_uri: request.redirectUri,
client_id: request.clientId,
response_type: request.responseType,
state: request.state,
scope: request.scope,
};
// copy over extras
if (request.extras) {
for (const extra in request.extras) {
if (
request.extras.hasOwnProperty(extra) && // check before inserting to requestMap
!BUILT_IN_PARAMETERS.includes(extra)
) {
requestMap[extra] = request.extras[extra];
}
}
}
const query = this.utils.stringify(requestMap);
const baseUrl = configuration.authorizationEndpoint;
// required encoding (PAIA specific)
return `${baseUrl}?${encodeURIComponent(query)}`;
}
}

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