feat(ai): add AI trace tracking and admin panel
- Add AiTrace model to Prisma schema with relations to User - Implement AiTraceService with CRUD operations for AI traces - Add new admin panel for AI traces with filtering and detail views - Integrate trace persistence in receipt import flow - Add API endpoints for listing and retrieving AI traces - Update Flutter admin UI with new AI tab and navigation - Add new domain models for AI traces and details - Add migration for AiTrace table creation BREAKING CHANGE: None
This commit is contained in:
@@ -1,36 +1,42 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'admin_database_panel.dart';
|
||||
import 'admin_users_panel.dart';
|
||||
|
||||
enum AdminViewTab { users, database }
|
||||
|
||||
extension AdminViewTabX on AdminViewTab {
|
||||
static AdminViewTab fromQuery(String? value) {
|
||||
return switch (value) {
|
||||
'database' => AdminViewTab.database,
|
||||
_ => AdminViewTab.users,
|
||||
};
|
||||
}
|
||||
|
||||
String get queryValue => this == AdminViewTab.database ? 'database' : 'users';
|
||||
}
|
||||
|
||||
class AdminScreen extends StatelessWidget {
|
||||
final AdminViewTab initialTab;
|
||||
|
||||
const AdminScreen({super.key, this.initialTab = AdminViewTab.users});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final activePanel = switch (initialTab) {
|
||||
AdminViewTab.users => const AdminUsersPanel(embedded: true),
|
||||
AdminViewTab.database => const AdminDatabasePanel(embedded: true),
|
||||
};
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.fromLTRB(12, 8, 12, 8),
|
||||
child: activePanel,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
import 'package:flutter/material.dart';
|
||||
import 'admin_ai_panel.dart';
|
||||
import 'admin_database_panel.dart';
|
||||
import 'admin_users_panel.dart';
|
||||
|
||||
enum AdminViewTab { users, database, ai }
|
||||
|
||||
extension AdminViewTabX on AdminViewTab {
|
||||
static AdminViewTab fromQuery(String? value) {
|
||||
return switch (value) {
|
||||
'database' => AdminViewTab.database,
|
||||
'ai' => AdminViewTab.ai,
|
||||
_ => AdminViewTab.users,
|
||||
};
|
||||
}
|
||||
|
||||
String get queryValue => switch (this) {
|
||||
AdminViewTab.users => 'users',
|
||||
AdminViewTab.database => 'database',
|
||||
AdminViewTab.ai => 'ai',
|
||||
};
|
||||
}
|
||||
|
||||
class AdminScreen extends StatelessWidget {
|
||||
final AdminViewTab initialTab;
|
||||
|
||||
const AdminScreen({super.key, this.initialTab = AdminViewTab.users});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
final activePanel = switch (initialTab) {
|
||||
AdminViewTab.users => const AdminUsersPanel(embedded: true),
|
||||
AdminViewTab.database => const AdminDatabasePanel(embedded: true),
|
||||
AdminViewTab.ai => const AdminAiPanel(embedded: true),
|
||||
};
|
||||
|
||||
return Padding(
|
||||
padding: const EdgeInsets.fromLTRB(12, 8, 12, 8),
|
||||
child: activePanel,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user