Added Phase‑1 continuation work across deep links, offline moderation queue, and admin push.

resources/js/admin/mobile/lib.
  - Admin push is end‑to‑end: new backend model/migration/service/job + API endpoints, admin runtime config, push‑aware
    service worker, and a settings toggle via useAdminPushSubscription. Notifications now auto‑refresh on push.
  - New PHP/JS tests: admin push API feature test and queue/haptics unit tests
  Added admin-specific PWA icon assets and wired them into the admin manifest, service worker, and admin shell, plus a
  new “Device & permissions” card in mobile Settings with a persistent storage action and translations.
  Details: public/manifest.json, public/admin-sw.js, resources/views/admin.blade.php, new icons in public/; new hook
  resources/js/admin/mobile/hooks/useDevicePermissions.ts, helpers/tests in resources/js/admin/mobile/lib/
  devicePermissions.ts + resources/js/admin/mobile/lib/devicePermissions.test.ts, and Settings UI updates in resources/
  js/admin/mobile/SettingsPage.tsx with copy in resources/js/admin/i18n/locales/en/management.json and resources/js/
admin/i18n/locales/de/management.json.
This commit is contained in:
Codex Agent
2025-12-28 15:00:47 +01:00
parent 4ce409e918
commit b780d82d62
42 changed files with 2258 additions and 121 deletions

View File

@@ -1955,7 +1955,14 @@
"unfeatureSuccess": "Highlight entfernt",
"featureFailed": "Highlight konnte nicht geändert werden.",
"approveSuccess": "Foto freigegeben",
"approveFailed": "Freigabe fehlgeschlagen."
"approveFailed": "Freigabe fehlgeschlagen.",
"queued": "Aktion gespeichert. Wird synchronisiert, sobald du online bist.",
"queueTitle": "Änderungen warten auf Sync",
"queueOnline": "{{count}} Aktionen bereit zur Synchronisierung.",
"queueOffline": "{{count}} Aktionen gespeichert offline.",
"queueSync": "Sync",
"queueWaiting": "Offline",
"syncFailed": "Synchronisierung fehlgeschlagen. Bitte später erneut versuchen."
},
"mobileProfile": {
"title": "Profil",
@@ -1976,6 +1983,39 @@
"tenantBadge": "Tenant #{{id}}",
"notificationsTitle": "Benachrichtigungen",
"notificationsLoading": "Lade Einstellungen ...",
"pushTitle": "App Push",
"pushUnsupported": "Push-Benachrichtigungen werden auf diesem Gerät nicht unterstützt.",
"pushDenied": "Benachrichtigungen sind im Browser blockiert.",
"pushActive": "Push aktiv",
"pushInactive": "Push deaktiviert",
"pushLoading": "Lädt ...",
"deviceTitle": "Gerät & Berechtigungen",
"deviceDescription": "Halte die Admin-App schnell, offline-bereit und für Benachrichtigungen freigeschaltet.",
"deviceLoading": "Gerätestatus wird geprüft ...",
"deviceStorageAction": "Offline-Schutz aktivieren",
"deviceStorageError": "Offline-Schutz konnte nicht aktiviert werden.",
"deviceStatusValues": {
"granted": "Erlaubt",
"denied": "Blockiert",
"prompt": "Berechtigung nötig",
"unsupported": "Nicht unterstützt",
"persisted": "Geschützt",
"available": "Nicht geschützt"
},
"deviceStatus": {
"notifications": {
"label": "Benachrichtigungen",
"description": "Erlaubt Warnungen und Admin-Updates."
},
"camera": {
"label": "Kamera",
"description": "Für QR-Scans und schnelle Aufnahmen."
},
"storage": {
"label": "Offline-Speicher",
"description": "Schützt zwischengespeicherte Daten vor Löschung."
}
},
"pref": {}
},
"events": {

View File

@@ -1975,7 +1975,14 @@
"unfeatureSuccess": "Highlight removed",
"featureFailed": "Highlight could not be changed",
"approveSuccess": "Photo approved",
"approveFailed": "Approval failed."
"approveFailed": "Approval failed.",
"queued": "Action saved. Syncs when you are back online.",
"queueTitle": "Changes waiting to sync",
"queueOnline": "{{count}} actions ready to sync.",
"queueOffline": "{{count}} actions saved offline.",
"queueSync": "Sync",
"queueWaiting": "Offline",
"syncFailed": "Sync failed. Please try again later."
},
"mobileProfile": {
"title": "Profile",
@@ -1996,6 +2003,39 @@
"tenantBadge": "Tenant #{{id}}",
"notificationsTitle": "Notifications",
"notificationsLoading": "Loading settings ...",
"pushTitle": "App Push",
"pushUnsupported": "Push notifications are not supported on this device.",
"pushDenied": "Notifications are blocked in your browser.",
"pushActive": "Push active",
"pushInactive": "Push disabled",
"pushLoading": "Loading ...",
"deviceTitle": "Device & permissions",
"deviceDescription": "Keep the admin app fast, offline-ready, and allowed to send alerts.",
"deviceLoading": "Checking device status ...",
"deviceStorageAction": "Enable offline protection",
"deviceStorageError": "Offline storage could not be enabled.",
"deviceStatusValues": {
"granted": "Allowed",
"denied": "Blocked",
"prompt": "Needs permission",
"unsupported": "Not supported",
"persisted": "Protected",
"available": "Not protected"
},
"deviceStatus": {
"notifications": {
"label": "Notifications",
"description": "Allow alerts and admin updates."
},
"camera": {
"label": "Camera",
"description": "Needed for QR scans and quick capture."
},
"storage": {
"label": "Offline storage",
"description": "Protect cached data from eviction."
}
},
"pref": {}
},
"events": {