From 70e381817024f217516e75cc0d089a8ec14fd1f3 Mon Sep 17 00:00:00 2001 From: Leon Hoppe Date: Fri, 30 Aug 2024 22:16:31 +0200 Subject: [PATCH] added pwa + dienstreise support --- angular.json | 7 +++++-- ngsw-config.json | 29 +++++++++++++++++++++++++++++ package-lock.json | 19 +++++++++++++++++++ package.json | 3 ++- src/app/time/time.page.html | 8 +++++--- src/app/time/time.page.scss | 5 +++-- src/app/time/time.page.ts | 28 +++++++++++++++++++++++++--- src/assets/icon/favicon.png | Bin 930 -> 14731 bytes src/global.scss | 4 ++++ src/index.html | 21 ++++++++++++--------- src/main.ts | 7 ++++++- src/manifest.webmanifest | 17 +++++++++++++++++ src/models/timeEntry.ts | 2 +- 13 files changed, 128 insertions(+), 22 deletions(-) create mode 100644 ngsw-config.json create mode 100644 src/manifest.webmanifest diff --git a/angular.json b/angular.json index e523c20..0c0b581 100644 --- a/angular.json +++ b/angular.json @@ -29,10 +29,13 @@ "glob": "**/*", "input": "src/assets", "output": "assets" - } + }, + "src/manifest.webmanifest" ], "styles": ["src/global.scss", "src/theme/variables.scss"], - "scripts": [] + "scripts": [], + "serviceWorker": true, + "ngswConfigPath": "ngsw-config.json" }, "configurations": { "production": { diff --git a/ngsw-config.json b/ngsw-config.json new file mode 100644 index 0000000..6c8ccf4 --- /dev/null +++ b/ngsw-config.json @@ -0,0 +1,29 @@ +{ + "$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": [ + "/**/*.(svg|cur|jpg|jpeg|png|apng|webp|avif|gif|otf|ttf|woff|woff2)" + ] + } + } + ] +} diff --git a/package-lock.json b/package-lock.json index 78ee481..daee4bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,7 @@ "@angular/platform-browser": "^18.0.0", "@angular/platform-browser-dynamic": "^18.0.0", "@angular/router": "^18.0.0", + "@angular/service-worker": "^18.0.0", "@capacitor/app": "6.0.1", "@capacitor/core": "6.1.2", "@capacitor/haptics": "6.0.1", @@ -648,6 +649,24 @@ "rxjs": "^6.5.3 || ^7.4.0" } }, + "node_modules/@angular/service-worker": { + "version": "18.2.2", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.2.2.tgz", + "integrity": "sha512-az0v0gNkAjOQ4DThDWfNJv2DkH63B4Vj/WnXd8pbY/C7Be6w3S1mN2y9vJClWAzUH/GSLQHnOrZJfnZtTc8M0w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "bin": { + "ngsw-config": "ngsw-config.js" + }, + "engines": { + "node": "^18.19.1 || ^20.11.1 || >=22.0.0" + }, + "peerDependencies": { + "@angular/common": "18.2.2", + "@angular/core": "18.2.2" + } + }, "node_modules/@babel/code-frame": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", diff --git a/package.json b/package.json index 8aaedf1..1f0c798 100644 --- a/package.json +++ b/package.json @@ -21,6 +21,7 @@ "@angular/platform-browser": "^18.0.0", "@angular/platform-browser-dynamic": "^18.0.0", "@angular/router": "^18.0.0", + "@angular/service-worker": "^18.0.0", "@capacitor/app": "6.0.1", "@capacitor/core": "6.1.2", "@capacitor/haptics": "6.0.1", @@ -61,4 +62,4 @@ "typescript": "~5.4.0" }, "description": "An Ionic project" -} +} \ No newline at end of file diff --git a/src/app/time/time.page.html b/src/app/time/time.page.html index aa69f48..0d6a615 100644 --- a/src/app/time/time.page.html +++ b/src/app/time/time.page.html @@ -6,7 +6,7 @@ - + Zeiterfassung @@ -27,7 +27,7 @@
- {{entry.type === 'login' ? "Eingestempelt" : "Ausgestempelt"}} + {{getTypeText(entry.type)}} {{entry.registeredAt.toLocaleTimeString()}} {{generateSeparatorText(data[index - 1], entry)}} @@ -37,7 +37,7 @@
{{currentAction === 'login' ? "Einstempeln" : "Ausstempeln"}} - +
@@ -70,6 +70,8 @@ Einstempeln Ausstempeln + Dienstreise starten + Dienstreise beenden
diff --git a/src/app/time/time.page.scss b/src/app/time/time.page.scss index 30736af..b5e867f 100644 --- a/src/app/time/time.page.scss +++ b/src/app/time/time.page.scss @@ -1,6 +1,6 @@ .button-container { - position: absolute; - bottom: 75px; + position: fixed; + bottom: 25px; left: 0; right: 0; display: flex; @@ -13,6 +13,7 @@ flex-direction: column; gap: 65px; margin: 20px; + padding-bottom: 75px; .entry { --inner-border-width: 0 0 0 0; diff --git a/src/app/time/time.page.ts b/src/app/time/time.page.ts index f9e5e0c..2f3859b 100644 --- a/src/app/time/time.page.ts +++ b/src/app/time/time.page.ts @@ -57,23 +57,45 @@ export class TimePage { return this.data.filter(entry => entry.registeredAt.getDay() === today); } + public getTypeText(type: TimeType): string { + switch (type) { + case "login": + return "Eingestempelt"; + + case "logout": + return "Ausgestempelt"; + + case "start-drive": + return "Dienstreise gestartet"; + + case "end-drive": + return "Dienstreise beendet"; + } + } + public generateSeparatorText(entry1: TimeEntry, entry2: TimeEntry): string { const difference = +entry2.registeredAt.getTime() - +entry1.registeredAt.getTime() - 3600000; const date = new Date(difference); - const text = entry1.type === 'login' ? "Arbeit " : "Pause "; + + let text = entry1.type === 'login' ? "Arbeit " : "Pause "; + if (entry1.type === 'start-drive' && entry2.type === 'end-drive') { + text = "Dienstreise"; + } + return text + `(${date.toLocaleTimeString()})`; } public addEntry(): void { + const animateIndex = this.shouldAnimate.length; this.shouldAnimate.push(true) - setTimeout(() => this.shouldAnimate[this.shouldAnimate.length - 1] = false, 5000); + setTimeout(() => this.shouldAnimate[animateIndex] = false, 2000); this.data.push({ registeredAt: new Date(Date.now()), type: this.currentAction }); this.saveData(); - this.currentAction = this.currentAction === 'login' ? 'logout' : 'login'; + this.updateCurrentAction(); } public removeEntry(index: number): void { diff --git a/src/assets/icon/favicon.png b/src/assets/icon/favicon.png index 51888a7bbdb59f04c29c548523eb2638c1c954f5..2b1c7399c819e876808af70d5c182b3fc95d8363 100644 GIT binary patch literal 14731 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 literal 930 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!x&nMcT-^(N+`Ik{1{5}NM-k9f zx+Ot=!3-}y{#<)Uok@}X^0T)Mjw~(h@l#Ir^NC7r=_#0-8E$a3RKVL~nc3p~*UxA# z4bjg_XJBBO<>}%W5^;EK_{&+V40u?Vtzk_Oy;*YMVqw~ozwz&rPG6d~>D#mR`SK=; zww9K@s-5|}%Dy=+ak|}>#qwwKGH>ZO4~|`P_r2LJy1RYqyXB`=?Mw?@F8Z!h{rcpz z^y94Mdt1KFIr?nR|NE2g?N}2vO^d(4;=OB>WP0Plul!REN;cgwUAJuA?C`^98NGCJ zuf=eS_OHmETd)0azdLJ6Z^FIm6*YNHw|4%lGf`stp1;dK$1sNYdj7ec{*dYEN(RM7|LFZWoy#R9733Kz`kee` zcsH&1+JCz2|7qRT%bgpNUdZ3E%i6T)I?vY6{p)ga_qlB<;GAPn(!{OF;x_wm_K%n( zW67=BbK}Hx+Mo2yW_)0K?|;#s9f!Uw=S;9NQ)S^>UOs1+lefL)nQKa6oJzg9f7^uT zr^QQJHL|;hJ!n29P`>r{pI$??E8ll+Vp%D3sqgGAQ?16Ir>}307i!n%dGB~BKleRm zV`}#;lUe7&`Rm%PqCLs%HOEe${KnWk%jlG>GM}cUf9>%Jt~^m(q1U%2$4$<)xHgTq zd0EM;Wjbazr!IcCcJ{`1i$kvS+;+RTmT^vJdf^@OKlARE7bo`3-BEDmtJB75>uhqr zB>Z2>{qec~lUw13i#jzoi~HY - + Zeiterfassung - + - - - - + + + + - + - - + + + + + diff --git a/src/main.ts b/src/main.ts index db355ec..debaf4d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,11 +4,16 @@ import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalo import { routes } from './app/app.routes'; import { AppComponent } from './app/app.component'; +import { isDevMode } from '@angular/core'; +import { provideServiceWorker } from '@angular/service-worker'; bootstrapApplication(AppComponent, { providers: [ { provide: RouteReuseStrategy, useClass: IonicRouteStrategy }, provideIonicAngular(), - provideRouter(routes, withPreloading(PreloadAllModules)), + provideRouter(routes, withPreloading(PreloadAllModules)), provideServiceWorker('ngsw-worker.js', { + enabled: !isDevMode(), + registrationStrategy: 'registerWhenStable:30000' + }), ], }); diff --git a/src/manifest.webmanifest b/src/manifest.webmanifest new file mode 100644 index 0000000..24c653d --- /dev/null +++ b/src/manifest.webmanifest @@ -0,0 +1,17 @@ +{ + "name": "Zeiterfassung", + "short_name": "Zeiterfassung", + "theme_color": "#121212", + "background_color": "#121212", + "display": "standalone", + "scope": "./", + "start_url": "./", + "icons": [ + { + "src": "assets/icon/favicon.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable any" + } + ] +} diff --git a/src/models/timeEntry.ts b/src/models/timeEntry.ts index ba137b2..5287cf4 100644 --- a/src/models/timeEntry.ts +++ b/src/models/timeEntry.ts @@ -3,4 +3,4 @@ export interface TimeEntry { type: TimeType; } -export type TimeType = 'login' | 'logout'; +export type TimeType = 'login' | 'logout' | 'start-drive' | 'end-drive';