diff --git a/frontend/app/angular.json b/frontend/app/angular.json
index 62b16534..7af7d057 100644
--- a/frontend/app/angular.json
+++ b/frontend/app/angular.json
@@ -40,14 +40,16 @@
"glob": "CHANGELOG.md",
"input": ".",
"output": "assets"
- }
+ },
+ "src/manifest.webmanifest"
],
"styles": [
{
"input": "src/global.scss",
"inject": true
}
- ]
+ ],
+ "serviceWorker": "ngsw-config.json"
},
"configurations": {
"production": {
@@ -127,7 +129,8 @@
"glob": "**/*",
"input": "src/assets",
"output": "/assets"
- }
+ },
+ "src/manifest.webmanifest"
]
}
},
diff --git a/frontend/app/cypress/integration/app.spec.ts b/frontend/app/cypress/integration/app.spec.ts
index 3f5d09f0..487813ab 100644
--- a/frontend/app/cypress/integration/app.spec.ts
+++ b/frontend/app/cypress/integration/app.spec.ts
@@ -26,7 +26,7 @@ describe('App', () => {
it('should have a proper title', () => {
cy.visit('/overview');
- cy.title().should('equal', 'StApps');
+ cy.title().should('equal', 'Goethe-Uni');
});
it('should have a proper working navigation', () => {
diff --git a/frontend/app/ngsw-config.json b/frontend/app/ngsw-config.json
new file mode 100644
index 00000000..b4f5aa44
--- /dev/null
+++ b/frontend/app/ngsw-config.json
@@ -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)"]
+ }
+ }
+ ]
+}
diff --git a/frontend/app/package.json b/frontend/app/package.json
index d2fa6afe..e9f30d2c 100644
--- a/frontend/app/package.json
+++ b/frontend/app/package.json
@@ -55,6 +55,7 @@
"@angular/forms": "17.3.12",
"@angular/platform-browser": "17.3.12",
"@angular/router": "17.3.12",
+ "@angular/service-worker": "17.3.12",
"@awesome-cordova-plugins/calendar": "6.6.0",
"@awesome-cordova-plugins/core": "6.6.0",
"@capacitor-community/screen-brightness": "6.0.0",
@@ -97,7 +98,7 @@
"ionicons": "7.4.0",
"jsonpath-plus": "10.3.0",
"maplibre-gl": "4.0.2",
- "material-symbols": "0.17.1",
+ "material-symbols": "0.27.2",
"moment": "2.30.1",
"ngx-date-fns": "11.0.0",
"ngx-logger": "5.0.12",
diff --git a/frontend/app/resources/logo_pwa.svg b/frontend/app/resources/logo_pwa.svg
new file mode 100644
index 00000000..cc119dcf
--- /dev/null
+++ b/frontend/app/resources/logo_pwa.svg
@@ -0,0 +1,73 @@
+
+
+
+
diff --git a/frontend/app/src/app/app.module.ts b/frontend/app/src/app/app.module.ts
index 857a3712..7c4c8e59 100644
--- a/frontend/app/src/app/app.module.ts
+++ b/frontend/app/src/app/app.module.ts
@@ -15,7 +15,7 @@
import {CommonModule, LocationStrategy, PathLocationStrategy, registerLocaleData} from '@angular/common';
import {HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi} from '@angular/common/http';
import localeDe from '@angular/common/locales/de';
-import {APP_INITIALIZER, NgModule} from '@angular/core';
+import {APP_INITIALIZER, NgModule, isDevMode} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';
import {RouteReuseStrategy} from '@angular/router';
import {IonicRouteStrategy, Platform, provideIonicAngular, IonApp} from '@ionic/angular/standalone';
@@ -70,6 +70,7 @@ import {Capacitor} from '@capacitor/core';
import {SplashScreen} from '@capacitor/splash-screen';
import maplibregl from 'maplibre-gl';
import {Protocol} from 'pmtiles';
+import {ServiceWorkerModule} from '@angular/service-worker';
registerLocaleData(localeDe);
@@ -182,6 +183,12 @@ export function createTranslateLoader(http: HttpClient) {
level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE,
}),
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: [
{
diff --git a/frontend/app/src/app/modules/data/data-icon.config.ts b/frontend/app/src/app/modules/data/data-icon.config.ts
index 5cef5965..f25c60a0 100644
--- a/frontend/app/src/app/modules/data/data-icon.config.ts
+++ b/frontend/app/src/app/modules/data/data-icon.config.ts
@@ -33,7 +33,7 @@ export const DataIcons = {
'id card': SCIcon.badge,
'message': SCIcon.newspaper,
'organization': SCIcon.business_center,
- 'periodical': SCIcon.feed,
+ 'periodical': SCIcon.news,
'person': SCIcon.person,
'point of interest': SCIcon.pin_drop,
'publication event': SCIcon.campaign,
diff --git a/frontend/app/src/app/modules/data/elements/favorite-button.component.html b/frontend/app/src/app/modules/data/elements/favorite-button.component.html
index a7d2b0b6..e971872d 100644
--- a/frontend/app/src/app/modules/data/elements/favorite-button.component.html
+++ b/frontend/app/src/app/modules/data/elements/favorite-button.component.html
@@ -19,6 +19,6 @@
[size]="24"
[fill]="(isFavorite$ | async) || false"
[class.selected]="isFavorite$ | async"
- name="grade"
+ name="star"
>
diff --git a/frontend/app/src/app/modules/data/elements/rating.html b/frontend/app/src/app/modules/data/elements/rating.html
index 3648a393..adb7d8eb 100644
--- a/frontend/app/src/app/modules/data/elements/rating.html
+++ b/frontend/app/src/app/modules/data/elements/rating.html
@@ -31,7 +31,7 @@
slot="icon-only"
[size]="32"
color="medium"
- name="grade"
+ name="star"
>
}
diff --git a/frontend/app/src/app/modules/data/elements/title-card.component.html b/frontend/app/src/app/modules/data/elements/title-card.component.html
index abcca218..7d86041a 100644
--- a/frontend/app/src/app/modules/data/elements/title-card.component.html
+++ b/frontend/app/src/app/modules/data/elements/title-card.component.html
@@ -42,9 +42,11 @@
}
@if (item.description && item.type !== 'job posting' && buttonShown) {
-