Skip to content

Commit fdd48a2

Browse files
Add exception inbox nav
Implement end-to-end Exception Inbox integration: - Add route /admin/exceptions and navigation grouping - Extend AdminLayout navigation with Exceptions section - Prepare translations updates for navigation label X-Lovable-Edit-ID: edt-965f06c7-b2e3-4355-af92-6d68abfdf27b
2 parents 2adbca8 + 309d025 commit fdd48a2

File tree

8 files changed

+158
-1
lines changed

8 files changed

+158
-1
lines changed

src/App.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ const OperatorView = lazy(() => import("./pages/operator/OperatorView"));
3131
// Admin pages - lazy loaded
3232
const Dashboard = lazy(() => import("./pages/admin/Dashboard"));
3333
const IssueQueue = lazy(() => import("./pages/admin/IssueQueue"));
34+
const ExceptionInbox = lazy(() => import("./pages/admin/ExceptionInbox"));
3435
const FactoryCalendar = lazy(() => import("./pages/admin/FactoryCalendar"));
3536
const OrganizationSettings = lazy(() => import("./pages/admin/OrganizationSettings"));
3637
const Assignments = lazy(() => import("./pages/admin/Assignments"));
@@ -357,6 +358,19 @@ function AppRoutes() {
357358
}
358359
/>
359360

361+
<Route
362+
path="/admin/exceptions"
363+
element={
364+
<ProtectedRoute adminOnly>
365+
<Layout>
366+
<LazyRoute>
367+
<ExceptionInbox />
368+
</LazyRoute>
369+
</Layout>
370+
</ProtectedRoute>
371+
}
372+
/>
373+
360374
<Route
361375
path="/admin/assignments"
362376
element={

src/components/AdminLayout.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ export default function AdminLayout({ children }: AdminLayoutProps) {
123123
exact: true,
124124
badge: pendingIssuesCount,
125125
},
126+
{
127+
path: "/admin/exceptions",
128+
label: t("navigation.exceptions"),
129+
icon: Flag,
130+
exact: true,
131+
},
126132
{
127133
path: "/admin/activity",
128134
label: t("navigation.activity"),

src/i18n/locales/de/admin.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,51 @@
157157
"tryAdjustingFilters": "Versuchen Sie, Ihre Filter oder Suchanfrage anzupassen",
158158
"loadMore": "Mehr laden"
159159
},
160+
"exceptionInbox": {
161+
"title": "Ausnahmen-Posteingang",
162+
"description": "Beurteilungen abgeleitet aus verletzten Erwartungen - keine Warnungen, sondern Verantwortlichkeit",
163+
"openExceptions": "Offen",
164+
"acknowledgedExceptions": "Bestätigt",
165+
"resolvedExceptions": "Gelöst",
166+
"dismissedExceptions": "Abgelehnt",
167+
"noExceptions": "Keine Ausnahmen gefunden",
168+
"noExceptionsDescription": "Wenn Erwartungen verletzt werden, erscheinen Ausnahmen hier",
169+
"violatedBelief": "Verletzte Erwartung",
170+
"expected": "Erwartet",
171+
"actual": "Tatsächlich",
172+
"deviation": "Abweichung",
173+
"neverOccurred": "Nie eingetreten",
174+
"acknowledge": "Bestätigen",
175+
"resolve": "Lösen",
176+
"dismiss": "Ablehnen",
177+
"resolveException": "Ausnahme Lösen",
178+
"dismissException": "Ausnahme Ablehnen",
179+
"rootCause": "Grundursache",
180+
"rootCausePlaceholder": "Was hat dazu geführt, dass diese Erwartung verletzt wurde?",
181+
"correctiveAction": "Korrekturmaßnahme",
182+
"correctiveActionPlaceholder": "Was wurde getan, um das unmittelbare Problem zu beheben?",
183+
"preventiveAction": "Präventivmaßnahme",
184+
"preventiveActionPlaceholder": "Was wird verhindern, dass dies erneut passiert?",
185+
"dismissReason": "Ablehnungsgrund",
186+
"dismissReasonPlaceholder": "Warum wird diese Ausnahme abgelehnt?",
187+
"exceptionAcknowledged": "Ausnahme bestätigt",
188+
"exceptionResolved": "Ausnahme gelöst",
189+
"exceptionDismissed": "Ausnahme abgelehnt",
190+
"actionFailed": "Aktion fehlgeschlagen",
191+
"late": "Spät",
192+
"early": "Früh",
193+
"nonOccurrence": "Nicht-Eintreten",
194+
"exceeded": "Überschritten",
195+
"under": "Unter",
196+
"open": "Offen",
197+
"acknowledged": "Bestätigt",
198+
"resolved": "Gelöst",
199+
"dismissed": "Abgelehnt",
200+
"statsOpen": "Offene Ausnahmen",
201+
"statsAcknowledged": "Bestätigt",
202+
"statsResolved": "Heute Gelöst",
203+
"statsDismissed": "Abgelehnt"
204+
},
160205
"myActivity": {
161206
"title": "Meine Aktivität",
162207
"completed": "Abgeschlossen",

src/i18n/locales/de/navigation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"jobs": "Aufträge",
66
"parts": "Teile",
77
"issues": "Probleme",
8+
"exceptions": "Ausnahmen-Posteingang",
89
"assignments": "Zuweisungen",
910
"configuration": "Konfiguration",
1011
"users": "Benutzer",

src/i18n/locales/en/admin.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,51 @@
244244
"tryAdjustingFilters": "Try adjusting your filters or search query",
245245
"loadMore": "Load More"
246246
},
247+
"exceptionInbox": {
248+
"title": "Exception Inbox",
249+
"description": "Judgments derived from violated expectations - not alerts, but accountability",
250+
"openExceptions": "Open",
251+
"acknowledgedExceptions": "Acknowledged",
252+
"resolvedExceptions": "Resolved",
253+
"dismissedExceptions": "Dismissed",
254+
"noExceptions": "No exceptions found",
255+
"noExceptionsDescription": "When expectations are violated, exceptions will appear here",
256+
"violatedBelief": "Violated Belief",
257+
"expected": "Expected",
258+
"actual": "Actual",
259+
"deviation": "Deviation",
260+
"neverOccurred": "Never occurred",
261+
"acknowledge": "Acknowledge",
262+
"resolve": "Resolve",
263+
"dismiss": "Dismiss",
264+
"resolveException": "Resolve Exception",
265+
"dismissException": "Dismiss Exception",
266+
"rootCause": "Root Cause",
267+
"rootCausePlaceholder": "What caused this expectation to be violated?",
268+
"correctiveAction": "Corrective Action",
269+
"correctiveActionPlaceholder": "What was done to fix the immediate issue?",
270+
"preventiveAction": "Preventive Action",
271+
"preventiveActionPlaceholder": "What will prevent this from happening again?",
272+
"dismissReason": "Dismiss Reason",
273+
"dismissReasonPlaceholder": "Why is this exception being dismissed?",
274+
"exceptionAcknowledged": "Exception acknowledged",
275+
"exceptionResolved": "Exception resolved",
276+
"exceptionDismissed": "Exception dismissed",
277+
"actionFailed": "Action failed",
278+
"late": "Late",
279+
"early": "Early",
280+
"nonOccurrence": "Non-Occurrence",
281+
"exceeded": "Exceeded",
282+
"under": "Under",
283+
"open": "Open",
284+
"acknowledged": "Acknowledged",
285+
"resolved": "Resolved",
286+
"dismissed": "Dismissed",
287+
"statsOpen": "Open Exceptions",
288+
"statsAcknowledged": "Acknowledged",
289+
"statsResolved": "Resolved Today",
290+
"statsDismissed": "Dismissed"
291+
},
247292
"myActivity": {
248293
"title": "My Activity",
249294
"completed": "Completed",

src/i18n/locales/nl/admin.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,51 @@
394394
"tryAdjustingFilters": "Probeer uw filters of zoekopdracht aan te passen",
395395
"loadMore": "Meer laden"
396396
},
397+
"exceptionInbox": {
398+
"title": "Uitzonderingen Inbox",
399+
"description": "Beoordelingen afgeleid van geschonden verwachtingen - geen meldingen, maar verantwoording",
400+
"openExceptions": "Open",
401+
"acknowledgedExceptions": "Bevestigd",
402+
"resolvedExceptions": "Opgelost",
403+
"dismissedExceptions": "Afgewezen",
404+
"noExceptions": "Geen uitzonderingen gevonden",
405+
"noExceptionsDescription": "Wanneer verwachtingen worden geschonden, verschijnen uitzonderingen hier",
406+
"violatedBelief": "Geschonden Verwachting",
407+
"expected": "Verwacht",
408+
"actual": "Werkelijk",
409+
"deviation": "Afwijking",
410+
"neverOccurred": "Nooit gebeurd",
411+
"acknowledge": "Bevestigen",
412+
"resolve": "Oplossen",
413+
"dismiss": "Afwijzen",
414+
"resolveException": "Uitzondering Oplossen",
415+
"dismissException": "Uitzondering Afwijzen",
416+
"rootCause": "Hoofdoorzaak",
417+
"rootCausePlaceholder": "Wat veroorzaakte dat deze verwachting werd geschonden?",
418+
"correctiveAction": "Corrigerende Actie",
419+
"correctiveActionPlaceholder": "Wat is gedaan om het directe probleem op te lossen?",
420+
"preventiveAction": "Preventieve Actie",
421+
"preventiveActionPlaceholder": "Wat zal voorkomen dat dit opnieuw gebeurt?",
422+
"dismissReason": "Reden voor Afwijzing",
423+
"dismissReasonPlaceholder": "Waarom wordt deze uitzondering afgewezen?",
424+
"exceptionAcknowledged": "Uitzondering bevestigd",
425+
"exceptionResolved": "Uitzondering opgelost",
426+
"exceptionDismissed": "Uitzondering afgewezen",
427+
"actionFailed": "Actie mislukt",
428+
"late": "Te laat",
429+
"early": "Te vroeg",
430+
"nonOccurrence": "Niet-optreden",
431+
"exceeded": "Overschreden",
432+
"under": "Onder",
433+
"open": "Open",
434+
"acknowledged": "Bevestigd",
435+
"resolved": "Opgelost",
436+
"dismissed": "Afgewezen",
437+
"statsOpen": "Open Uitzonderingen",
438+
"statsAcknowledged": "Bevestigd",
439+
"statsResolved": "Vandaag Opgelost",
440+
"statsDismissed": "Afgewezen"
441+
},
397442
"myActivity": {
398443
"title": "Mijn activiteit",
399444
"completed": "Voltooid",

src/i18n/locales/nl/navigation.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"jobs": "Orders",
66
"parts": "Onderdelen",
77
"issues": "Problemen",
8+
"exceptions": "Uitzonderingen Inbox",
89
"assignments": "Toewijzingen",
910
"configuration": "Configuratie",
1011
"users": "Gebruikers",

src/pages/admin/ExceptionInbox.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import { cn } from '@/lib/utils'
3737
import type { ExceptionStatus, ExceptionWithExpectation, ExceptionType } from '@/integrations/supabase/types/tables/expectations'
3838

3939
const ExceptionInbox: React.FC = () => {
40-
const { t } = useTranslation()
40+
const { t } = useTranslation(['admin', 'common'])
4141
const [activeTab, setActiveTab] = useState<ExceptionStatus | 'all'>('open')
4242
const [selectedException, setSelectedException] = useState<ExceptionWithExpectation | null>(null)
4343
const [resolveDialogOpen, setResolveDialogOpen] = useState(false)

0 commit comments

Comments
 (0)