diff --git a/frontend/app/angular.json b/frontend/app/angular.json index b2c7239b..3ce45bbb 100644 --- a/frontend/app/angular.json +++ b/frontend/app/angular.json @@ -40,14 +40,17 @@ "glob": "CHANGELOG.md", "input": ".", "output": "assets" - } + }, + "src/manifest.webmanifest" ], "styles": [ { "input": "src/global.scss", "inject": true } - ] + ], + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json" }, "configurations": { "production": { @@ -129,7 +132,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 2e29fc96..7093b3c8 100644 --- a/frontend/app/package.json +++ b/frontend/app/package.json @@ -59,6 +59,7 @@ "@angular/forms": "17.3.0", "@angular/platform-browser": "17.3.0", "@angular/router": "17.3.0", + "@angular/service-worker": "17.3.0", "@awesome-cordova-plugins/calendar": "6.6.0", "@awesome-cordova-plugins/core": "6.6.0", "@capacitor-community/screen-brightness": "6.0.0", @@ -99,7 +100,7 @@ "ionic-appauth": "0.9.0", "jsonpath-plus": "10.0.7", "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 80c0fcd6..e08b7b2c 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, HttpClientModule} 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 {IonicModule, IonicRouteStrategy, Platform} from '@ionic/angular'; @@ -71,6 +71,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); @@ -185,6 +186,12 @@ export function createTranslateLoader(http: HttpClient) { LoggerModule.forRoot({ level: environment.production ? NgxLoggerLevel.FATAL : NgxLoggerLevel.TRACE, }), + 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) { - - - +
+ + READ_MORE... + +
} diff --git a/frontend/app/src/app/modules/data/elements/title-card.component.scss b/frontend/app/src/app/modules/data/elements/title-card.component.scss index 4d04ccda..bd7602f8 100644 --- a/frontend/app/src/app/modules/data/elements/title-card.component.scss +++ b/frontend/app/src/app/modules/data/elements/title-card.component.scss @@ -52,3 +52,21 @@ ion-card { --color: var(--ion-color-primary-contrast); } } + +.read-more-container { + position: relative; + + display: flex; + justify-content: flex-end; + + margin-top: -24px; + + background: linear-gradient(to bottom, transparent, var(--ion-color-primary)); + + ion-button { + --background: var(--ion-color-primary-contrast); + --color: var(--ion-color-primary); + + height: 8px; + } +} diff --git a/frontend/app/src/app/modules/data/elements/title-card.component.ts b/frontend/app/src/app/modules/data/elements/title-card.component.ts index df529895..7121555d 100644 --- a/frontend/app/src/app/modules/data/elements/title-card.component.ts +++ b/frontend/app/src/app/modules/data/elements/title-card.component.ts @@ -18,8 +18,8 @@ import {SCThings} from '@openstapps/core'; import {SCIcon} from '../../../util/ion-icon/icon'; const AccordionButtonState = { - collapsed: SCIcon.expand_more, - expanded: SCIcon.expand_less, + collapsed: SCIcon.unfold_more, + expanded: SCIcon.unfold_less, }; @Component({ @@ -44,7 +44,7 @@ export class TitleCardComponent implements OnInit, OnChanges { descriptionLinesTotal: number; - descriptionPreviewLines = 3; + descriptionPreviewLines = 4; descriptionLinesToDisplay = 0; diff --git a/frontend/app/src/app/modules/profile/page/my-courses.html b/frontend/app/src/app/modules/profile/page/my-courses.html index e320c933..384dd1b5 100644 --- a/frontend/app/src/app/modules/profile/page/my-courses.html +++ b/frontend/app/src/app/modules/profile/page/my-courses.html @@ -26,7 +26,7 @@ '_EVENT' | translate: {count: myCoursesDay[1].length} }} - + @if (myCoursesDay[1].length === 0) { diff --git a/frontend/app/src/app/modules/schedule/page/calendar-view.html b/frontend/app/src/app/modules/schedule/page/calendar-view.html index 686d6192..9c0d2145 100644 --- a/frontend/app/src/app/modules/schedule/page/calendar-view.html +++ b/frontend/app/src/app/modules/schedule/page/calendar-view.html @@ -14,10 +14,10 @@ -->
- + - +
- + - + {{ 'settings.resetSettings' | translate }} - +
diff --git a/frontend/app/src/app/modules/storage/encrypted-storage.provider.ts b/frontend/app/src/app/modules/storage/encrypted-storage.provider.ts index 7a88e592..82a22f05 100644 --- a/frontend/app/src/app/modules/storage/encrypted-storage.provider.ts +++ b/frontend/app/src/app/modules/storage/encrypted-storage.provider.ts @@ -14,10 +14,12 @@ export class EncryptedStorageProvider { * @returns The value of the resource, if found */ async get(key: string): Promise { - if (!Capacitor.isNativePlatform()) return undefined; - try { - const jwt = JSON.parse((await SecureStoragePlugin.get({key: `stapps:key:${key}`})).value); + const jwt = JSON.parse( + await (Capacitor.isNativePlatform() + ? SecureStoragePlugin.get({key: `stapps:key:${key}`}).then(it => it.value) + : this.storageProvider.get(`stapps:key:${key}`)), + ); const aesKey = await crypto.subtle.importKey('jwk', jwt, {name: 'AES-GCM'}, true, [ 'encrypt', 'decrypt', @@ -48,8 +50,6 @@ export class EncryptedStorageProvider { * @returns A promise that resolves when the value is stored */ async set(key: string, value: T): Promise { - if (!Capacitor.isNativePlatform()) return undefined; - try { const compressionStream = new CompressionStream('gzip'); const writer = compressionStream.writable.getWriter(); @@ -63,11 +63,14 @@ export class EncryptedStorageProvider { 'decrypt', ]); + const exportedKey = JSON.stringify(await crypto.subtle.exportKey('jwk', aesKey)); await Promise.all([ - SecureStoragePlugin.set({ - key: `stapps:key:${key}`, - value: JSON.stringify(await crypto.subtle.exportKey('jwk', aesKey)), - }), + Capacitor.isNativePlatform() + ? SecureStoragePlugin.set({ + key: `stapps:key:${key}`, + value: exportedKey, + }) + : this.storageProvider.put(`stapps:key:${key}`, exportedKey), this.storageProvider.put(`encrypted:${key}:iv`, iv), ]); @@ -81,10 +84,10 @@ export class EncryptedStorageProvider { } async delete(key: string): Promise { - if (!Capacitor.isNativePlatform()) return; - await Promise.all([ - SecureStoragePlugin.remove({key: `stapps:key:${key}`}), + Capacitor.isNativePlatform() + ? SecureStoragePlugin.remove({key: `stapps:key:${key}`}) + : this.storageProvider.delete(`stapps:key:${key}`), this.storageProvider.delete(`encrypted:${key}:iv`), this.storageProvider.delete(`encrypted:${key}`), ]); diff --git a/frontend/app/src/assets/icons.min.woff2 b/frontend/app/src/assets/icons.min.woff2 index eb09213c..4f18716b 100644 Binary files a/frontend/app/src/assets/icons.min.woff2 and b/frontend/app/src/assets/icons.min.woff2 differ diff --git a/frontend/app/src/assets/icons/apple-touch-icon.png b/frontend/app/src/assets/icons/apple-touch-icon.png new file mode 100644 index 00000000..008cb255 Binary files /dev/null and b/frontend/app/src/assets/icons/apple-touch-icon.png differ diff --git a/frontend/app/src/assets/icons/icon_x128.png b/frontend/app/src/assets/icons/icon_x128.png new file mode 100644 index 00000000..f575187a Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x128.png differ diff --git a/frontend/app/src/assets/icons/icon_x192.png b/frontend/app/src/assets/icons/icon_x192.png new file mode 100644 index 00000000..12f35e7e Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x192.png differ diff --git a/frontend/app/src/assets/icons/icon_x384.png b/frontend/app/src/assets/icons/icon_x384.png new file mode 100644 index 00000000..41434b11 Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x384.png differ diff --git a/frontend/app/src/assets/icons/icon_x48.png b/frontend/app/src/assets/icons/icon_x48.png new file mode 100644 index 00000000..9709c2a3 Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x48.png differ diff --git a/frontend/app/src/assets/icons/icon_x512.png b/frontend/app/src/assets/icons/icon_x512.png new file mode 100644 index 00000000..c41fb872 Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x512.png differ diff --git a/frontend/app/src/assets/icons/icon_x72.png b/frontend/app/src/assets/icons/icon_x72.png new file mode 100644 index 00000000..327cf06b Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x72.png differ diff --git a/frontend/app/src/assets/icons/icon_x96.png b/frontend/app/src/assets/icons/icon_x96.png new file mode 100644 index 00000000..71841e44 Binary files /dev/null and b/frontend/app/src/assets/icons/icon_x96.png differ diff --git a/frontend/app/src/assets/icons/local_cafe_x192.png b/frontend/app/src/assets/icons/local_cafe_x192.png new file mode 100644 index 00000000..8f5aee2b Binary files /dev/null and b/frontend/app/src/assets/icons/local_cafe_x192.png differ diff --git a/frontend/app/src/assets/icons/map_x192.png b/frontend/app/src/assets/icons/map_x192.png new file mode 100644 index 00000000..5295b1e4 Binary files /dev/null and b/frontend/app/src/assets/icons/map_x192.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x128.png b/frontend/app/src/assets/icons/maskable_icon_x128.png new file mode 100644 index 00000000..fff4e58d Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x128.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x192.png b/frontend/app/src/assets/icons/maskable_icon_x192.png new file mode 100644 index 00000000..b8756e81 Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x192.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x384.png b/frontend/app/src/assets/icons/maskable_icon_x384.png new file mode 100644 index 00000000..47a02286 Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x384.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x48.png b/frontend/app/src/assets/icons/maskable_icon_x48.png new file mode 100644 index 00000000..dbaf06b7 Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x48.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x512.png b/frontend/app/src/assets/icons/maskable_icon_x512.png new file mode 100644 index 00000000..7adef79a Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x512.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x72.png b/frontend/app/src/assets/icons/maskable_icon_x72.png new file mode 100644 index 00000000..03b2d1ae Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x72.png differ diff --git a/frontend/app/src/assets/icons/maskable_icon_x96.png b/frontend/app/src/assets/icons/maskable_icon_x96.png new file mode 100644 index 00000000..15f0485f Binary files /dev/null and b/frontend/app/src/assets/icons/maskable_icon_x96.png differ diff --git a/frontend/app/src/assets/icons/school_x192.png b/frontend/app/src/assets/icons/school_x192.png new file mode 100644 index 00000000..53dfa9ab Binary files /dev/null and b/frontend/app/src/assets/icons/school_x192.png differ diff --git a/frontend/app/src/assets/icons/search_x192.png b/frontend/app/src/assets/icons/search_x192.png new file mode 100644 index 00000000..0ccf6478 Binary files /dev/null and b/frontend/app/src/assets/icons/search_x192.png differ diff --git a/frontend/app/src/assets/screenshots/canteens-wide.png b/frontend/app/src/assets/screenshots/canteens-wide.png new file mode 100644 index 00000000..c68242b2 Binary files /dev/null and b/frontend/app/src/assets/screenshots/canteens-wide.png differ diff --git a/frontend/app/src/assets/screenshots/canteens.png b/frontend/app/src/assets/screenshots/canteens.png new file mode 100644 index 00000000..5b9e8f42 Binary files /dev/null and b/frontend/app/src/assets/screenshots/canteens.png differ diff --git a/frontend/app/src/assets/screenshots/map-wide.png b/frontend/app/src/assets/screenshots/map-wide.png new file mode 100644 index 00000000..21b790de Binary files /dev/null and b/frontend/app/src/assets/screenshots/map-wide.png differ diff --git a/frontend/app/src/assets/screenshots/map.png b/frontend/app/src/assets/screenshots/map.png new file mode 100644 index 00000000..449be0ca Binary files /dev/null and b/frontend/app/src/assets/screenshots/map.png differ diff --git a/frontend/app/src/assets/screenshots/my-app-wide.png b/frontend/app/src/assets/screenshots/my-app-wide.png new file mode 100644 index 00000000..2f03c0ee Binary files /dev/null and b/frontend/app/src/assets/screenshots/my-app-wide.png differ diff --git a/frontend/app/src/assets/screenshots/my-app.png b/frontend/app/src/assets/screenshots/my-app.png new file mode 100644 index 00000000..65398f0a Binary files /dev/null and b/frontend/app/src/assets/screenshots/my-app.png differ diff --git a/frontend/app/src/assets/screenshots/overview-wide.png b/frontend/app/src/assets/screenshots/overview-wide.png new file mode 100644 index 00000000..995e53bc Binary files /dev/null and b/frontend/app/src/assets/screenshots/overview-wide.png differ diff --git a/frontend/app/src/assets/screenshots/overview.png b/frontend/app/src/assets/screenshots/overview.png new file mode 100644 index 00000000..14615cee Binary files /dev/null and b/frontend/app/src/assets/screenshots/overview.png differ diff --git a/frontend/app/src/assets/splash_screens/10.2__iPad_landscape.png b/frontend/app/src/assets/splash_screens/10.2__iPad_landscape.png new file mode 100644 index 00000000..29d06ddf Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.2__iPad_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/10.2__iPad_portrait.png b/frontend/app/src/assets/splash_screens/10.2__iPad_portrait.png new file mode 100644 index 00000000..80cf0423 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.2__iPad_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/10.5__iPad_Air_landscape.png b/frontend/app/src/assets/splash_screens/10.5__iPad_Air_landscape.png new file mode 100644 index 00000000..e548e59f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.5__iPad_Air_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/10.5__iPad_Air_portrait.png b/frontend/app/src/assets/splash_screens/10.5__iPad_Air_portrait.png new file mode 100644 index 00000000..24c01165 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.5__iPad_Air_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/10.9__iPad_Air_landscape.png b/frontend/app/src/assets/splash_screens/10.9__iPad_Air_landscape.png new file mode 100644 index 00000000..8884fd69 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.9__iPad_Air_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/10.9__iPad_Air_portrait.png b/frontend/app/src/assets/splash_screens/10.9__iPad_Air_portrait.png new file mode 100644 index 00000000..c6b0825b Binary files /dev/null and b/frontend/app/src/assets/splash_screens/10.9__iPad_Air_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_landscape.png b/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_landscape.png new file mode 100644 index 00000000..9a9d708f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_portrait.png b/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_portrait.png new file mode 100644 index 00000000..c7737d7c Binary files /dev/null and b/frontend/app/src/assets/splash_screens/11__iPad_Pro_M4_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png b/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png new file mode 100644 index 00000000..99c9394f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png b/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png new file mode 100644 index 00000000..c07257b6 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/11__iPad_Pro__10.5__iPad_Pro_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_landscape.png b/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_landscape.png new file mode 100644 index 00000000..35ef1cb5 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_portrait.png b/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_portrait.png new file mode 100644 index 00000000..03620fb2 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/12.9__iPad_Pro_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_landscape.png b/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_landscape.png new file mode 100644 index 00000000..4c1c9623 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_portrait.png b/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_portrait.png new file mode 100644 index 00000000..5b616c16 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/13__iPad_Pro_M4_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png b/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png new file mode 100644 index 00000000..f091f89a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png b/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png new file mode 100644 index 00000000..0c23fcab Binary files /dev/null and b/frontend/app/src/assets/splash_screens/4__iPhone_SE__iPod_touch_5th_generation_and_later_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_landscape.png b/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_landscape.png new file mode 100644 index 00000000..eee6c34a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_portrait.png b/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_portrait.png new file mode 100644 index 00000000..600b129b Binary files /dev/null and b/frontend/app/src/assets/splash_screens/8.3__iPad_Mini_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png b/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png new file mode 100644 index 00000000..a8d37c8f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png b/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png new file mode 100644 index 00000000..b0844858 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/9.7__iPad_Pro__7.9__iPad_mini__9.7__iPad_Air__9.7__iPad_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png new file mode 100644 index 00000000..1acbea09 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png new file mode 100644 index 00000000..9a630d42 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_11_Pro_Max__iPhone_XS_Max_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_landscape.png new file mode 100644 index 00000000..c9558f5b Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_portrait.png new file mode 100644 index 00000000..cb96064f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_11__iPhone_XR_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png new file mode 100644 index 00000000..8b055e3a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png new file mode 100644 index 00000000..cb1f418d Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_13_mini__iPhone_12_mini__iPhone_11_Pro__iPhone_XS__iPhone_X_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png new file mode 100644 index 00000000..cd254603 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png new file mode 100644 index 00000000..2638523c Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_14_Plus__iPhone_13_Pro_Max__iPhone_12_Pro_Max_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png new file mode 100644 index 00000000..9692719f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png new file mode 100644 index 00000000..8220fb6a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_14__iPhone_13_Pro__iPhone_13__iPhone_12_Pro__iPhone_12_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png new file mode 100644 index 00000000..c72d1ced Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png new file mode 100644 index 00000000..9b7ef619 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Plus__iPhone_15_Pro_Max__iPhone_15_Plus__iPhone_14_Pro_Max_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_landscape.png new file mode 100644 index 00000000..44a66521 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_portrait.png new file mode 100644 index 00000000..b8786b77 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_Max_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Pro_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_landscape.png new file mode 100644 index 00000000..32257d4a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16_Pro_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_portrait.png new file mode 100644 index 00000000..d12551dd Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16_Pro_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png new file mode 100644 index 00000000..6cd4d8d0 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png new file mode 100644 index 00000000..e80bc89a Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_16__iPhone_15_Pro__iPhone_15__iPhone_14_Pro_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png new file mode 100644 index 00000000..c71b991f Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png new file mode 100644 index 00000000..484c43a1 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_8_Plus__iPhone_7_Plus__iPhone_6s_Plus__iPhone_6_Plus_portrait.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png b/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png new file mode 100644 index 00000000..eeb67fbd Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_landscape.png differ diff --git a/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png b/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png new file mode 100644 index 00000000..d7da5f44 Binary files /dev/null and b/frontend/app/src/assets/splash_screens/iPhone_8__iPhone_7__iPhone_6s__iPhone_6__4.7__iPhone_SE_portrait.png differ diff --git a/frontend/app/src/config/profile-page-sections.ts b/frontend/app/src/config/profile-page-sections.ts index 6b5f9845..74d80b3e 100644 --- a/frontend/app/src/config/profile-page-sections.ts +++ b/frontend/app/src/config/profile-page-sections.ts @@ -62,7 +62,7 @@ export const profilePageSections: SCSection[] = [ links: [ { name: 'Favorites', - icon: SCIcon.grade, + icon: SCIcon.star, link: ['/favorites'], translations: { de: { diff --git a/frontend/app/src/index.html b/frontend/app/src/index.html index cf3ded06..8bc4010c 100644 --- a/frontend/app/src/index.html +++ b/frontend/app/src/index.html @@ -1,9 +1,9 @@ - + - StApps + Goethe-Uni - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/app/src/main.ts b/frontend/app/src/main.ts index c7b912ea..a9c1785c 100644 --- a/frontend/app/src/main.ts +++ b/frontend/app/src/main.ts @@ -12,6 +12,7 @@ * You should have received a copy of the GNU General Public License along with * this program. If not, see . */ +import '@capacitor/core'; import {enableProdMode} from '@angular/core'; import {platformBrowser} from '@angular/platform-browser'; import {AppModule} from './app/app.module'; diff --git a/frontend/app/src/manifest.webmanifest b/frontend/app/src/manifest.webmanifest new file mode 100644 index 00000000..9245a75e --- /dev/null +++ b/frontend/app/src/manifest.webmanifest @@ -0,0 +1,214 @@ +{ + "name": "Goethe-Uni", + "short_name": "Goethe-Uni", + "description": "Mit der Goethe-Uni App kannst dein Studium noch besser organisieren. Informationen über die Universität, Bibliotheken, Räumen, Veranstaltungen und Personen sind leicht über die Suche auffindbar.", + "theme_color": "#00618F", + "background_color": "#00618F", + "display": "standalone", + "display_override": ["standalone"], + "orientation": "portrait-primary", + "scope": "./", + "start_url": "./", + "categories": ["education"], + "prefer_related_applications": false, + "related_applications": [ + { + "platform": "play", + "id": "de.goetheuni" + } + ], + "shortcuts": [ + { + "name": "Suche", + "url": "/search", + "icons": [ + { + "src": "assets/icons/search_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + } + ] + }, + { + "name": "Mensa", + "url": "/canteen", + "icons": [ + { + "src": "assets/icons/local_cafe_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + } + ] + }, + { + "name": "Karte", + "url": "/map", + "icons": [ + { + "src": "assets/icons/map_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + } + ] + }, + { + "name": "Meine App", + "url": "/profile", + "icons": [ + { + "src": "assets/icons/school_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "monochrome any" + } + ] + } + ], + "icons": [ + { + "src": "assets/icons/maskable_icon_x48.png", + "sizes": "48x48", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/maskable_icon_x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "assets/icons/icon_x48.png", + "sizes": "48x48", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x72.png", + "sizes": "72x72", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x96.png", + "sizes": "96x96", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x128.png", + "sizes": "128x128", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x384.png", + "sizes": "384x384", + "type": "image/png", + "purpose": "any" + }, + { + "src": "assets/icons/icon_x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "any" + } + ], + "screenshots": [ + { + "src": "/assets/screenshots/overview.png", + "type": "image/png", + "sizes": "664x1440", + "form_factor": "narrow", + "label": "Übersicht" + }, + { + "src": "/assets/screenshots/canteens.png", + "type": "image/png", + "sizes": "664x1440", + "form_factor": "narrow", + "label": "Mensen" + }, + { + "src": "/assets/screenshots/map.png", + "type": "image/png", + "sizes": "664x1440", + "form_factor": "narrow", + "label": "Karte" + }, + { + "src": "/assets/screenshots/my-app.png", + "type": "image/png", + "sizes": "664x1440", + "form_factor": "narrow", + "label": "Meine App" + }, + { + "src": "/assets/screenshots/overview-wide.png", + "type": "image/png", + "sizes": "2304x1440", + "form_factor": "wide", + "label": "Übersicht" + }, + { + "src": "/assets/screenshots/canteens-wide.png", + "type": "image/png", + "sizes": "2304x1440", + "form_factor": "wide", + "label": "Mensen" + }, + { + "src": "/assets/screenshots/map-wide.png", + "type": "image/png", + "sizes": "2304x1440", + "form_factor": "wide", + "label": "Karte" + }, + { + "src": "/assets/screenshots/my-app-wide.png", + "type": "image/png", + "sizes": "2304x1440", + "form_factor": "wide", + "label": "Meine App" + } + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index debfce69..c04469c8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -722,6 +722,9 @@ importers: '@angular/router': specifier: 17.3.0 version: 17.3.0(@angular/common@17.3.0)(@angular/core@17.3.0)(@angular/platform-browser@17.3.0)(rxjs@7.8.1) + '@angular/service-worker': + specifier: 17.3.0 + version: 17.3.0(@angular/common@17.3.0)(@angular/core@17.3.0) '@awesome-cordova-plugins/calendar': specifier: 6.6.0 version: 6.6.0(@awesome-cordova-plugins/core@6.6.0)(rxjs@7.8.1) @@ -843,8 +846,8 @@ importers: specifier: 4.0.2 version: 4.0.2 material-symbols: - specifier: 0.17.1 - version: 0.17.1 + specifier: 0.27.2 + version: 0.27.2 moment: specifier: 2.30.1 version: 2.30.1 @@ -887,7 +890,7 @@ importers: version: 0.1703.0 '@angular-devkit/build-angular': specifier: 17.3.0 - version: 17.3.0(@angular/compiler-cli@17.3.0)(@types/node@18.15.3)(karma@6.4.3)(typescript@5.4.2) + version: 17.3.0(@angular/compiler-cli@17.3.0)(@angular/service-worker@17.3.0)(@types/node@18.15.3)(karma@6.4.3)(typescript@5.4.2) '@angular-devkit/core': specifier: 17.3.0 version: 17.3.0 @@ -2076,7 +2079,7 @@ packages: - chokidar dev: true - /@angular-devkit/build-angular@17.3.0(@angular/compiler-cli@17.3.0)(@types/node@18.15.3)(karma@6.4.3)(typescript@5.4.2): + /@angular-devkit/build-angular@17.3.0(@angular/compiler-cli@17.3.0)(@angular/service-worker@17.3.0)(@types/node@18.15.3)(karma@6.4.3)(typescript@5.4.2): resolution: {integrity: sha512-mC70mZK/liITM4VlGL6hmYPkVsZwAb+X3TxwodBl/g8p/sYijDhK/4QJHzmcHTxLYQQS6nS5CUcr9ARQFkGN2w==} engines: {node: ^18.13.0 || >=20.9.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: @@ -2122,6 +2125,7 @@ packages: '@angular-devkit/build-webpack': 0.1703.0(webpack-dev-server@4.15.1)(webpack@5.90.3) '@angular-devkit/core': 17.3.0 '@angular/compiler-cli': 17.3.0(@angular/compiler@17.3.0)(typescript@5.4.2) + '@angular/service-worker': 17.3.0(@angular/common@17.3.0)(@angular/core@17.3.0) '@babel/core': 7.24.0 '@babel/generator': 7.23.6 '@babel/helper-annotate-as-pure': 7.22.5 @@ -2602,6 +2606,18 @@ packages: tslib: 2.6.2 dev: false + /@angular/service-worker@17.3.0(@angular/common@17.3.0)(@angular/core@17.3.0): + resolution: {integrity: sha512-kpwuK3aaUrVm1T2YS4Vq7IFBAEW3H83Xyl9KVSpRbdUOEAJjG9hgiPBVz/iu0W1j0T9JkS2GJt/3vP3OW5Tkhg==} + engines: {node: ^18.13.0 || >=20.9.0} + hasBin: true + peerDependencies: + '@angular/common': 17.3.0 + '@angular/core': 17.3.0 + dependencies: + '@angular/common': 17.3.0(@angular/core@17.3.0)(rxjs@7.8.1) + '@angular/core': 17.3.0(rxjs@7.8.1)(zone.js@0.14.4) + tslib: 2.6.2 + /@awesome-cordova-plugins/calendar@6.6.0(@awesome-cordova-plugins/core@6.6.0)(rxjs@7.8.1): resolution: {integrity: sha512-NobAl4xvmq2zBeOnLI+pqRVpC66p7OpCwd3jzrQ26h8kqhr0o5wqaNcWN6WBjmgD+/AInVnLUzsziL2QpcmD7g==} peerDependencies: @@ -15822,8 +15838,8 @@ packages: hasBin: true dev: false - /material-symbols@0.17.1: - resolution: {integrity: sha512-1kJan8t3U3Fmuu/YPu2MVsL/ODSja71o+J7ODROQfMaCzzal0izY4SATafEKgXUXU+jL0zIiBQdyzsno7vXBvA==} + /material-symbols@0.27.2: + resolution: {integrity: sha512-3/p3V+UfAfeHrT2HMOBVGWyzsvpHZNxlJJ6jQ01XqqxCCQU+szIbrfpsXOHkZ5glMJi+IB/SMJIRt55l/gYWvQ==} dev: false /mathml-tag-names@2.1.3: