@burdenoff/microfe-proserviceworld 2026.525.1 → 2026.624.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/proserviceworld/pages/AdminReportsPage.js +28 -28
- package/dist/proserviceworld/pages/AdminReportsPage.js.map +1 -1
- package/dist/proserviceworld/pages/AdminUsersPage.js +19 -19
- package/dist/proserviceworld/pages/AdminUsersPage.js.map +1 -1
- package/dist/proserviceworld/pages/AnalyticsPage.js +27 -27
- package/dist/proserviceworld/pages/AnalyticsPage.js.map +1 -1
- package/dist/proserviceworld/pages/BookingsPage.js +24 -24
- package/dist/proserviceworld/pages/BookingsPage.js.map +1 -1
- package/dist/proserviceworld/pages/DashboardPage.js +33 -33
- package/dist/proserviceworld/pages/DashboardPage.js.map +1 -1
- package/dist/proserviceworld/pages/DocumentsPage.js +29 -29
- package/dist/proserviceworld/pages/DocumentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/MessagesPage.js +15 -15
- package/dist/proserviceworld/pages/MessagesPage.js.map +1 -1
- package/dist/proserviceworld/pages/PaymentsPage.js +19 -19
- package/dist/proserviceworld/pages/PaymentsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProjectsPage.js +36 -36
- package/dist/proserviceworld/pages/ProjectsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProviderDetailPage.js +36 -36
- package/dist/proserviceworld/pages/ProviderDetailPage.js.map +1 -1
- package/dist/proserviceworld/pages/ProvidersPage.js +19 -19
- package/dist/proserviceworld/pages/ProvidersPage.js.map +1 -1
- package/dist/proserviceworld/pages/ReviewsPage.js +22 -22
- package/dist/proserviceworld/pages/ReviewsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServiceDetailsPage.js +35 -35
- package/dist/proserviceworld/pages/ServiceDetailsPage.js.map +1 -1
- package/dist/proserviceworld/pages/ServicesPage.js +14 -14
- package/dist/proserviceworld/pages/ServicesPage.js.map +1 -1
- package/dist/proserviceworld/pages/VerificationPage.js +23 -23
- package/dist/proserviceworld/pages/VerificationPage.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DashboardPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@burdenoff/fe-libs/ui';\nimport {\n Calendar,\n Star,\n DollarSign,\n TrendingUp,\n Users,\n CheckCircle,\n AlertCircle,\n Clock,\n BookOpen,\n BarChart3,\n Bell,\n Plus,\n Eye,\n MessageSquare,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport { tWithFallback } from '../utils/i18n';\n\ntype DashboardView = 'client' | 'provider' | 'admin' | 'team';\n\nexport function DashboardPage() {\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n const { bookings, providers, services, reviews, notifications } = useProServiceWorldStore();\n const [activeView, setActiveView] = useState<DashboardView>('client');\n\n const activeBookings = bookings.filter((b) => b.status === 'in_progress');\n const completedBookings = bookings.filter((b) => b.status === 'completed');\n const pendingBookings = bookings.filter((b) => b.status === 'pending');\n const totalSpent = bookings\n .filter((b) => b.paymentStatus === 'completed')\n .reduce((sum, b) => sum + b.budget, 0);\n const unreadNotifications = notifications.filter((n) => !n.read).length;\n\n const viewTabs: { id: DashboardView; label: string }[] = [\n { id: 'client', label: tr('proserviceworld.dashboard.views.client', 'Client') },\n { id: 'provider', label: tr('proserviceworld.dashboard.views.provider', 'Provider') },\n { id: 'admin', label: tr('proserviceworld.dashboard.views.admin', 'Admin') },\n { id: 'team', label: tr('proserviceworld.dashboard.views.team', 'Team') },\n ];\n const bookingStatusLabel = (status: string): string => {\n if (status === 'completed')\n return tr('proserviceworld.shared.bookingStatus.completed', 'completed');\n if (status === 'in_progress')\n return tr('proserviceworld.shared.bookingStatus.inProgress', 'in progress');\n if (status === 'pending') return tr('proserviceworld.shared.bookingStatus.pending', 'pending');\n return tr('proserviceworld.shared.bookingStatus.cancelled', 'cancelled');\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* View Selector */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {tr('proserviceworld.dashboard.title', 'Dashboard')}\n </h1>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.subtitle',\n 'Welcome back! Here is your activity overview.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex bg-muted rounded-lg p-1\">\n {viewTabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveView(tab.id)}\n className={`px-3 py-1.5 rounded text-sm font-medium transition-colors ${\n activeView === tab.id\n ? 'bg-background text-foreground shadow-sm'\n : 'text-muted-foreground hover:text-foreground'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {unreadNotifications > 0 && (\n <Button variant=\"outline\" size=\"sm\">\n <Bell className=\"h-4 w-4 mr-1\" />\n {unreadNotifications}\n </Button>\n )}\n </div>\n </div>\n\n {/* Client Dashboard */}\n {activeView === 'client' && (\n <div className=\"space-y-6\">\n {/* Welcome Card */}\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.client.welcomeTitle', 'Welcome back, Alex!')}\n </h2>\n <p className=\"text-muted-foreground mt-1\">\n {tr(\n 'proserviceworld.dashboard.client.welcomeSubtitle',\n 'Manage your services, bookings, and find new providers'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.client.actions.findServices', 'Find Services')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.activeBookings',\n 'Active Bookings'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-yellow-500\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.8</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.avgRatingGiven',\n 'Avg. Rating Given'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{completedBookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.completedProjects',\n 'Completed Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">${totalSpent.toLocaleString()}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('proserviceworld.dashboard.client.metrics.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Recent Bookings */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr(\n 'proserviceworld.dashboard.client.sections.recentBookings',\n 'Recent Bookings'\n )}\n </CardTitle>\n <Button variant=\"outline\" size=\"sm\">\n {tr('proserviceworld.shared.actions.viewAll', 'View All')}\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {bookings.slice(0, 5).map((booking) => (\n <div\n key={booking.id}\n className=\"flex items-center justify-between p-4 border rounded-lg\"\n >\n <div className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center\">\n <BookOpen className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <p className=\"font-medium\">{booking.title}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.client.booking.provider',\n 'Provider: {{name}}',\n {\n name: booking.providerName,\n }\n )}\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium text-sm\">${booking.budget.toLocaleString()}</p>\n <Badge\n variant={\n booking.status === 'completed'\n ? 'default'\n : booking.status === 'in_progress'\n ? 'secondary'\n : 'outline'\n }\n >\n {bookingStatusLabel(booking.status)}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Provider Dashboard */}\n {activeView === 'provider' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr(\n 'proserviceworld.dashboard.provider.welcomeTitle',\n 'Welcome back, Provider!'\n )}\n </h2>\n <p className=\"text-muted-foreground mt-1\">\n {tr(\n 'proserviceworld.dashboard.provider.welcomeSubtitle',\n 'Manage your services, bookings, and grow your business'\n )}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service')}\n </Button>\n <Button size=\"sm\">\n <Eye className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.editProfile', 'Edit Profile')}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-yellow-500\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.9</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.rating',\n 'Rating ({{count}} reviews)',\n {\n count: reviews.length,\n }\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.activeProjects',\n 'Active Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <TrendingUp className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">98%</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.completionRate',\n 'Completion Rate'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">$12,850</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('proserviceworld.dashboard.provider.metrics.thisMonth', 'This Month')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr('proserviceworld.dashboard.provider.sections.yourServices', 'Your Services')}\n </CardTitle>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Eye className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.shared.actions.viewAll', 'View All')}\n </Button>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service')}\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {services.slice(0, 3).map((service) => (\n <div key={service.id} className=\"border rounded-lg p-4\">\n <h4 className=\"font-medium mb-1\">{service.title}</h4>\n <p className=\"text-sm text-muted-foreground mb-2 line-clamp-2\">\n {service.description}\n </p>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {tr('proserviceworld.services.card.pricing.from', 'From ${{amount}}', {\n amount: service.pricing.basePrice.toLocaleString(),\n })}\n </span>\n <Badge variant=\"secondary\">\n {tr(\n 'proserviceworld.dashboard.provider.service.bookings',\n '{{count}} bookings',\n {\n count: service.totalBookings,\n }\n )}\n </Badge>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Admin Dashboard */}\n {activeView === 'admin' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.admin.title', 'Admin Dashboard')}\n </h2>\n <p className=\"text-muted-foreground mt-1\">\n {tr(\n 'proserviceworld.dashboard.admin.subtitle',\n 'Monitor platform activity and manage users'\n )}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.admin.actions.manageUsers', 'Manage Users')}\n </Button>\n <Button size=\"sm\">\n <BarChart3 className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.admin.actions.viewReports', 'View Reports')}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{providers.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalProviders',\n 'Total Providers'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <BookOpen className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{services.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalServices',\n 'Total Services'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalBookings',\n 'Total Bookings'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-yellow-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">$45,670</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('proserviceworld.dashboard.admin.metrics.totalRevenue', 'Total Revenue')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {tr(\n 'proserviceworld.dashboard.admin.sections.recentProviders',\n 'Recent Providers'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers.slice(0, 3).map((provider) => (\n <div key={provider.id} className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-primary/10 flex items-center justify-center\">\n <span className=\"text-primary font-medium\">{provider.name.charAt(0)}</span>\n </div>\n <div className=\"flex-1\">\n <p className=\"font-medium\">{provider.businessName}</p>\n <p className=\"text-sm text-muted-foreground\">{provider.specializations[0]}</p>\n </div>\n <div className=\"flex items-center text-sm\">\n <Star className=\"h-4 w-4 text-yellow-400 mr-1\" />\n {provider.rating.toFixed(1)}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.admin.sections.platformAlerts', 'Platform Alerts')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-start space-x-3\">\n <AlertCircle className=\"h-5 w-5 text-yellow-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.title',\n 'Pending Verifications'\n )}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.description',\n '3 providers awaiting verification'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <CheckCircle className=\"h-5 w-5 text-green-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.systemStatus.title',\n 'System Status'\n )}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.systemStatus.description',\n 'All systems operational'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <Bell className=\"h-5 w-5 text-blue-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr('proserviceworld.dashboard.admin.alerts.newReviews.title', 'New Reviews')}\n </p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.newReviews.description',\n '12 new reviews this week'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n )}\n\n {/* Team Member Dashboard */}\n {activeView === 'team' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.team.title', 'Welcome, Team Member!')}\n </h2>\n <p className=\"text-muted-foreground mt-1\">\n {tr(\n 'proserviceworld.dashboard.team.subtitle',\n 'Manage assigned tasks and projects'\n )}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Calendar className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.team.actions.myTasks', 'My Tasks')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">8</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.tasksCompleted',\n 'Tasks Completed'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Clock className=\"h-8 w-8 text-yellow-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{pendingBookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr('proserviceworld.dashboard.team.metrics.pendingTasks', 'Pending Tasks')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.9</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.performanceScore',\n 'Performance Score'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.activeProjects',\n 'Active Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.team.sections.recentActivity', 'Recent Activity')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"text-center py-8\">\n <MessageSquare className=\"h-12 w-12 mx-auto text-muted-foreground mb-4\" />\n <p className=\"text-muted-foreground\">\n {tr(\n 'proserviceworld.dashboard.team.sections.comingSoon',\n 'Team member features coming soon'\n )}\n </p>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DashboardPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DashboardPage.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { Card, CardContent, CardHeader, CardTitle, Button, Badge } from '@burdenoff/fe-libs/ui';\nimport {\n Calendar,\n Star,\n DollarSign,\n TrendingUp,\n Users,\n CheckCircle,\n AlertCircle,\n Clock,\n BookOpen,\n BarChart3,\n Bell,\n Plus,\n Eye,\n MessageSquare,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\nimport { tWithFallback } from '../utils/i18n';\n\ntype DashboardView = 'client' | 'provider' | 'admin' | 'team';\n\nexport function DashboardPage() {\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n const { bookings, providers, services, reviews, notifications } = useProServiceWorldStore();\n const [activeView, setActiveView] = useState<DashboardView>('client');\n\n const activeBookings = bookings.filter((b) => b.status === 'in_progress');\n const completedBookings = bookings.filter((b) => b.status === 'completed');\n const pendingBookings = bookings.filter((b) => b.status === 'pending');\n const totalSpent = bookings\n .filter((b) => b.paymentStatus === 'completed')\n .reduce((sum, b) => sum + b.budget, 0);\n const unreadNotifications = notifications.filter((n) => !n.read).length;\n\n const viewTabs: { id: DashboardView; label: string }[] = [\n { id: 'client', label: tr('proserviceworld.dashboard.views.client', 'Client') },\n { id: 'provider', label: tr('proserviceworld.dashboard.views.provider', 'Provider') },\n { id: 'admin', label: tr('proserviceworld.dashboard.views.admin', 'Admin') },\n { id: 'team', label: tr('proserviceworld.dashboard.views.team', 'Team') },\n ];\n const bookingStatusLabel = (status: string): string => {\n if (status === 'completed')\n return tr('proserviceworld.shared.bookingStatus.completed', 'completed');\n if (status === 'in_progress')\n return tr('proserviceworld.shared.bookingStatus.inProgress', 'in progress');\n if (status === 'pending') return tr('proserviceworld.shared.bookingStatus.pending', 'pending');\n return tr('proserviceworld.shared.bookingStatus.cancelled', 'cancelled');\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* View Selector */}\n <div className=\"flex items-center justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">\n {tr('proserviceworld.dashboard.title', 'Dashboard')}\n </h1>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.subtitle',\n 'Welcome back! Here is your activity overview.'\n )}\n </p>\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex bg-bg-sunken rounded-lg p-1\">\n {viewTabs.map((tab) => (\n <button\n key={tab.id}\n onClick={() => setActiveView(tab.id)}\n className={`px-3 py-1.5 rounded text-sm font-medium transition-colors ${\n activeView === tab.id\n ? 'bg-bg-surface text-text-primary shadow-sm'\n : 'text-text-secondary hover:text-text-primary'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n {unreadNotifications > 0 && (\n <Button variant=\"outline\" size=\"sm\">\n <Bell className=\"h-4 w-4 mr-1\" />\n {unreadNotifications}\n </Button>\n )}\n </div>\n </div>\n\n {/* Client Dashboard */}\n {activeView === 'client' && (\n <div className=\"space-y-6\">\n {/* Welcome Card */}\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.client.welcomeTitle', 'Welcome back, Alex!')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.client.welcomeSubtitle',\n 'Manage your services, bookings, and find new providers'\n )}\n </p>\n </div>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.client.actions.findServices', 'Find Services')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Quick Stats */}\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.activeBookings',\n 'Active Bookings'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-yellow-500\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.8</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.avgRatingGiven',\n 'Avg. Rating Given'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{completedBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.client.metrics.completedProjects',\n 'Completed Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">${totalSpent.toLocaleString()}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.client.metrics.totalSpent', 'Total Spent')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Recent Bookings */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr(\n 'proserviceworld.dashboard.client.sections.recentBookings',\n 'Recent Bookings'\n )}\n </CardTitle>\n <Button variant=\"outline\" size=\"sm\">\n {tr('proserviceworld.shared.actions.viewAll', 'View All')}\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {bookings.slice(0, 5).map((booking) => (\n <div\n key={booking.id}\n className=\"flex items-center justify-between p-4 border rounded-lg\"\n >\n <div className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center\">\n <BookOpen className=\"h-5 w-5 text-primary\" />\n </div>\n <div>\n <p className=\"font-medium\">{booking.title}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.client.booking.provider',\n 'Provider: {{name}}',\n {\n name: booking.providerName,\n }\n )}\n </p>\n </div>\n </div>\n <div className=\"text-right\">\n <p className=\"font-medium text-sm\">${booking.budget.toLocaleString()}</p>\n <Badge\n variant={\n booking.status === 'completed'\n ? 'default'\n : booking.status === 'in_progress'\n ? 'secondary'\n : 'outline'\n }\n >\n {bookingStatusLabel(booking.status)}\n </Badge>\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Provider Dashboard */}\n {activeView === 'provider' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr(\n 'proserviceworld.dashboard.provider.welcomeTitle',\n 'Welcome back, Provider!'\n )}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.provider.welcomeSubtitle',\n 'Manage your services, bookings, and grow your business'\n )}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service')}\n </Button>\n <Button size=\"sm\">\n <Eye className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.editProfile', 'Edit Profile')}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-yellow-500\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.9</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.rating',\n 'Rating ({{count}} reviews)',\n {\n count: reviews.length,\n }\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.activeProjects',\n 'Active Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <TrendingUp className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">98%</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.provider.metrics.completionRate',\n 'Completion Rate'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">$12,850</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.provider.metrics.thisMonth', 'This Month')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>\n {tr('proserviceworld.dashboard.provider.sections.yourServices', 'Your Services')}\n </CardTitle>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Eye className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.shared.actions.viewAll', 'View All')}\n </Button>\n <Button size=\"sm\">\n <Plus className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.provider.actions.addService', 'Add Service')}\n </Button>\n </div>\n </div>\n </CardHeader>\n <CardContent>\n <div className=\"grid gap-4 md:grid-cols-3\">\n {services.slice(0, 3).map((service) => (\n <div key={service.id} className=\"border rounded-lg p-4\">\n <h4 className=\"font-medium mb-1\">{service.title}</h4>\n <p className=\"text-sm text-text-secondary mb-2 line-clamp-2\">\n {service.description}\n </p>\n <div className=\"flex items-center justify-between\">\n <span className=\"text-sm font-medium\">\n {tr('proserviceworld.services.card.pricing.from', 'From ${{amount}}', {\n amount: service.pricing.basePrice.toLocaleString(),\n })}\n </span>\n <Badge variant=\"secondary\">\n {tr(\n 'proserviceworld.dashboard.provider.service.bookings',\n '{{count}} bookings',\n {\n count: service.totalBookings,\n }\n )}\n </Badge>\n </div>\n </div>\n ))}\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Admin Dashboard */}\n {activeView === 'admin' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.admin.title', 'Admin Dashboard')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.admin.subtitle',\n 'Monitor platform activity and manage users'\n )}\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\">\n <Users className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.admin.actions.manageUsers', 'Manage Users')}\n </Button>\n <Button size=\"sm\">\n <BarChart3 className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.admin.actions.viewReports', 'View Reports')}\n </Button>\n </div>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{providers.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalProviders',\n 'Total Providers'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <BookOpen className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{services.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalServices',\n 'Total Services'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Calendar className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{bookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.metrics.totalBookings',\n 'Total Bookings'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <DollarSign className=\"h-8 w-8 text-yellow-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">$45,670</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.admin.metrics.totalRevenue', 'Total Revenue')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <div className=\"grid gap-4 md:grid-cols-2\">\n <Card>\n <CardHeader>\n <CardTitle>\n {tr(\n 'proserviceworld.dashboard.admin.sections.recentProviders',\n 'Recent Providers'\n )}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {providers.slice(0, 3).map((provider) => (\n <div key={provider.id} className=\"flex items-center space-x-4\">\n <div className=\"h-10 w-10 rounded-full bg-action-primary-bg/10 flex items-center justify-center\">\n <span className=\"text-primary font-medium\">{provider.name.charAt(0)}</span>\n </div>\n <div className=\"flex-1\">\n <p className=\"font-medium\">{provider.businessName}</p>\n <p className=\"text-sm text-text-secondary\">{provider.specializations[0]}</p>\n </div>\n <div className=\"flex items-center text-sm\">\n <Star className=\"h-4 w-4 text-yellow-400 mr-1\" />\n {provider.rating.toFixed(1)}\n </div>\n </div>\n ))}\n </CardContent>\n </Card>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.admin.sections.platformAlerts', 'Platform Alerts')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-start space-x-3\">\n <AlertCircle className=\"h-5 w-5 text-yellow-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.title',\n 'Pending Verifications'\n )}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.pendingVerifications.description',\n '3 providers awaiting verification'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <CheckCircle className=\"h-5 w-5 text-green-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.systemStatus.title',\n 'System Status'\n )}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.systemStatus.description',\n 'All systems operational'\n )}\n </p>\n </div>\n </div>\n <div className=\"flex items-start space-x-3\">\n <Bell className=\"h-5 w-5 text-blue-500 mt-0.5\" />\n <div>\n <p className=\"font-medium text-sm\">\n {tr('proserviceworld.dashboard.admin.alerts.newReviews.title', 'New Reviews')}\n </p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.admin.alerts.newReviews.description',\n '12 new reviews this week'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n </div>\n )}\n\n {/* Team Member Dashboard */}\n {activeView === 'team' && (\n <div className=\"space-y-6\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center justify-between\">\n <div>\n <h2 className=\"text-xl font-bold\">\n {tr('proserviceworld.dashboard.team.title', 'Welcome, Team Member!')}\n </h2>\n <p className=\"text-text-secondary mt-1\">\n {tr(\n 'proserviceworld.dashboard.team.subtitle',\n 'Manage assigned tasks and projects'\n )}\n </p>\n </div>\n <Button variant=\"outline\" size=\"sm\">\n <Calendar className=\"h-4 w-4 mr-2\" />\n {tr('proserviceworld.dashboard.team.actions.myTasks', 'My Tasks')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n <div className=\"grid gap-4 md:grid-cols-4\">\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <CheckCircle className=\"h-8 w-8 text-green-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">8</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.tasksCompleted',\n 'Tasks Completed'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Clock className=\"h-8 w-8 text-yellow-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{pendingBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr('proserviceworld.dashboard.team.metrics.pendingTasks', 'Pending Tasks')}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Star className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">4.9</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.performanceScore',\n 'Performance Score'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"p-6\">\n <div className=\"flex items-center\">\n <Users className=\"h-8 w-8 text-blue-600\" />\n <div className=\"ml-4\">\n <p className=\"text-2xl font-bold\">{activeBookings.length}</p>\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.team.metrics.activeProjects',\n 'Active Projects'\n )}\n </p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n <Card>\n <CardHeader>\n <CardTitle>\n {tr('proserviceworld.dashboard.team.sections.recentActivity', 'Recent Activity')}\n </CardTitle>\n </CardHeader>\n <CardContent className=\"text-center py-8\">\n <MessageSquare className=\"h-12 w-12 mx-auto text-text-secondary mb-4\" />\n <p className=\"text-text-secondary\">\n {tr(\n 'proserviceworld.dashboard.team.sections.comingSoon',\n 'Team member features coming soon'\n )}\n </p>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|
|
@@ -62,7 +62,7 @@ function P() {
|
|
|
62
62
|
className: "text-2xl font-semibold",
|
|
63
63
|
children: "Documents"
|
|
64
64
|
}), /* @__PURE__ */ S("p", {
|
|
65
|
-
className: "text-sm text-
|
|
65
|
+
className: "text-sm text-text-secondary",
|
|
66
66
|
children: "Manage files, folders, and shared documents."
|
|
67
67
|
})] }), /* @__PURE__ */ C("div", {
|
|
68
68
|
className: "flex gap-2",
|
|
@@ -92,7 +92,7 @@ function P() {
|
|
|
92
92
|
className: "text-2xl font-bold",
|
|
93
93
|
children: p.length
|
|
94
94
|
}), /* @__PURE__ */ S("p", {
|
|
95
|
-
className: "text-xs text-
|
|
95
|
+
className: "text-xs text-text-secondary",
|
|
96
96
|
children: "Total Files"
|
|
97
97
|
})] })]
|
|
98
98
|
})
|
|
@@ -108,7 +108,7 @@ function P() {
|
|
|
108
108
|
className: "text-2xl font-bold",
|
|
109
109
|
children: P.length
|
|
110
110
|
}), /* @__PURE__ */ S("p", {
|
|
111
|
-
className: "text-xs text-
|
|
111
|
+
className: "text-xs text-text-secondary",
|
|
112
112
|
children: "Folders"
|
|
113
113
|
})] })]
|
|
114
114
|
})
|
|
@@ -124,7 +124,7 @@ function P() {
|
|
|
124
124
|
className: "text-2xl font-bold",
|
|
125
125
|
children: ee
|
|
126
126
|
}), /* @__PURE__ */ S("p", {
|
|
127
|
-
className: "text-xs text-
|
|
127
|
+
className: "text-xs text-text-secondary",
|
|
128
128
|
children: "Starred"
|
|
129
129
|
})] })]
|
|
130
130
|
})
|
|
@@ -140,7 +140,7 @@ function P() {
|
|
|
140
140
|
className: "text-2xl font-bold",
|
|
141
141
|
children: N(Q)
|
|
142
142
|
}), /* @__PURE__ */ S("p", {
|
|
143
|
-
className: "text-xs text-
|
|
143
|
+
className: "text-xs text-text-secondary",
|
|
144
144
|
children: "Total Size"
|
|
145
145
|
})] })]
|
|
146
146
|
})
|
|
@@ -151,9 +151,9 @@ function P() {
|
|
|
151
151
|
className: "flex items-center gap-2 text-sm",
|
|
152
152
|
children: [/* @__PURE__ */ S("button", {
|
|
153
153
|
onClick: () => K(null),
|
|
154
|
-
className: `font-medium ${G ? "text-
|
|
154
|
+
className: `font-medium ${G ? "text-text-secondary hover:text-text-primary" : "text-primary"}`,
|
|
155
155
|
children: "All Files"
|
|
156
|
-
}), $ && /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(i, { className: "h-4 w-4 text-
|
|
156
|
+
}), $ && /* @__PURE__ */ C(x, { children: [/* @__PURE__ */ S(i, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ S("span", {
|
|
157
157
|
className: "font-medium text-primary",
|
|
158
158
|
children: $.name
|
|
159
159
|
})] })]
|
|
@@ -162,7 +162,7 @@ function P() {
|
|
|
162
162
|
className: "flex flex-col gap-4 sm:flex-row sm:items-center",
|
|
163
163
|
children: [/* @__PURE__ */ C("div", {
|
|
164
164
|
className: "relative flex-1",
|
|
165
|
-
children: [/* @__PURE__ */ S(g, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-
|
|
165
|
+
children: [/* @__PURE__ */ S(g, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ S(k, {
|
|
166
166
|
placeholder: "Search documents...",
|
|
167
167
|
value: L,
|
|
168
168
|
onChange: (e) => R(e.target.value),
|
|
@@ -180,18 +180,18 @@ function P() {
|
|
|
180
180
|
"starred"
|
|
181
181
|
].map((e) => /* @__PURE__ */ S("button", {
|
|
182
182
|
onClick: () => B(e),
|
|
183
|
-
className: `rounded px-2 py-1 text-xs font-medium transition-colors ${z === e ? "bg-primary text-primary-
|
|
183
|
+
className: `rounded px-2 py-1 text-xs font-medium transition-colors ${z === e ? "bg-action-primary-bg text-action-primary-text" : "bg-bg-sunken text-text-secondary hover:bg-bg-sunken/80"}`,
|
|
184
184
|
children: e === "all" ? "All" : e === "starred" ? "Starred" : e.toUpperCase()
|
|
185
185
|
}, e))
|
|
186
186
|
}), /* @__PURE__ */ C("div", {
|
|
187
187
|
className: "flex rounded border",
|
|
188
188
|
children: [/* @__PURE__ */ S("button", {
|
|
189
189
|
onClick: () => I("grid"),
|
|
190
|
-
className: `p-1.5 ${F === "grid" ? "bg-primary text-primary-
|
|
190
|
+
className: `p-1.5 ${F === "grid" ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary"}`,
|
|
191
191
|
children: /* @__PURE__ */ S(d, { className: "h-4 w-4" })
|
|
192
192
|
}), /* @__PURE__ */ S("button", {
|
|
193
193
|
onClick: () => I("list"),
|
|
194
|
-
className: `p-1.5 ${F === "list" ? "bg-primary text-primary-
|
|
194
|
+
className: `p-1.5 ${F === "list" ? "bg-action-primary-bg text-action-primary-text" : "text-text-secondary"}`,
|
|
195
195
|
children: /* @__PURE__ */ S(m, { className: "h-4 w-4" })
|
|
196
196
|
})]
|
|
197
197
|
})]
|
|
@@ -214,25 +214,25 @@ function P() {
|
|
|
214
214
|
}
|
|
215
215
|
].map(({ field: e, label: t }) => /* @__PURE__ */ C("button", {
|
|
216
216
|
onClick: () => te(e),
|
|
217
|
-
className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${V === e ? "border-primary bg-primary/5 text-primary" : "text-
|
|
217
|
+
className: `flex items-center gap-1 rounded border px-3 py-1 text-xs ${V === e ? "border-primary bg-action-primary-bg/5 text-primary" : "text-text-secondary hover:bg-bg-sunken/50"}`,
|
|
218
218
|
children: [/* @__PURE__ */ S(r, { className: "h-3 w-3" }), t]
|
|
219
219
|
}, e))
|
|
220
220
|
}),
|
|
221
221
|
!G && /* @__PURE__ */ C("div", { children: [/* @__PURE__ */ S("h3", {
|
|
222
|
-
className: "mb-3 text-sm font-medium text-
|
|
222
|
+
className: "mb-3 text-sm font-medium text-text-secondary",
|
|
223
223
|
children: "Folders"
|
|
224
224
|
}), /* @__PURE__ */ S("div", {
|
|
225
225
|
className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-4",
|
|
226
226
|
children: P.map((e) => /* @__PURE__ */ C("button", {
|
|
227
227
|
onClick: () => K(e.id),
|
|
228
|
-
className: "flex items-center gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-
|
|
228
|
+
className: "flex items-center gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-bg-sunken/50",
|
|
229
229
|
children: [/* @__PURE__ */ S(l, { className: `h-8 w-8 ${M[e.color] ?? "text-gray-500"}` }), /* @__PURE__ */ C("div", {
|
|
230
230
|
className: "min-w-0 flex-1",
|
|
231
231
|
children: [/* @__PURE__ */ S("p", {
|
|
232
232
|
className: "truncate font-medium text-sm",
|
|
233
233
|
children: e.name
|
|
234
234
|
}), /* @__PURE__ */ C("p", {
|
|
235
|
-
className: "text-xs text-
|
|
235
|
+
className: "text-xs text-text-secondary",
|
|
236
236
|
children: [
|
|
237
237
|
e.documentsCount,
|
|
238
238
|
" files",
|
|
@@ -243,15 +243,15 @@ function P() {
|
|
|
243
243
|
}, e.id))
|
|
244
244
|
})] }),
|
|
245
245
|
/* @__PURE__ */ C("div", { children: [/* @__PURE__ */ C("h3", {
|
|
246
|
-
className: "mb-3 text-sm font-medium text-
|
|
246
|
+
className: "mb-3 text-sm font-medium text-text-secondary",
|
|
247
247
|
children: ["Files ", Z.length > 0 && `(${Z.length})`]
|
|
248
248
|
}), Z.length === 0 ? /* @__PURE__ */ S(T, { children: /* @__PURE__ */ S(E, {
|
|
249
|
-
className: "py-12 text-center text-
|
|
249
|
+
className: "py-12 text-center text-text-secondary",
|
|
250
250
|
children: "No files found. Try adjusting your filters."
|
|
251
251
|
}) }) : F === "grid" ? /* @__PURE__ */ S("div", {
|
|
252
252
|
className: "grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4",
|
|
253
253
|
children: Z.map((e) => /* @__PURE__ */ S(T, {
|
|
254
|
-
className: "hover:bg-
|
|
254
|
+
className: "hover:bg-bg-sunken/30 transition-colors",
|
|
255
255
|
children: /* @__PURE__ */ C(E, {
|
|
256
256
|
className: "pt-4",
|
|
257
257
|
children: [
|
|
@@ -259,7 +259,7 @@ function P() {
|
|
|
259
259
|
className: "flex items-start justify-between",
|
|
260
260
|
children: [/* @__PURE__ */ S(A[e.type] ?? s, { className: `h-10 w-10 ${j[e.type] ?? "text-gray-400"}` }), /* @__PURE__ */ C("div", {
|
|
261
261
|
className: "flex items-center gap-1",
|
|
262
|
-
children: [e.isStarred && /* @__PURE__ */ S(v, { className: "h-4 w-4 fill-yellow-400 text-yellow-400" }), e.sharedWith > 0 && /* @__PURE__ */ S(_, { className: "h-4 w-4 text-
|
|
262
|
+
children: [e.isStarred && /* @__PURE__ */ S(v, { className: "h-4 w-4 fill-yellow-400 text-yellow-400" }), e.sharedWith > 0 && /* @__PURE__ */ S(_, { className: "h-4 w-4 text-text-secondary" })]
|
|
263
263
|
})]
|
|
264
264
|
}),
|
|
265
265
|
/* @__PURE__ */ S("h4", {
|
|
@@ -267,11 +267,11 @@ function P() {
|
|
|
267
267
|
children: e.name
|
|
268
268
|
}),
|
|
269
269
|
/* @__PURE__ */ C("div", {
|
|
270
|
-
className: "mt-1 flex items-center gap-2 text-xs text-
|
|
270
|
+
className: "mt-1 flex items-center gap-2 text-xs text-text-secondary",
|
|
271
271
|
children: [/* @__PURE__ */ S("span", { children: N(e.size) }), /* @__PURE__ */ C("span", { children: ["v", e.version] })]
|
|
272
272
|
}),
|
|
273
273
|
/* @__PURE__ */ C("div", {
|
|
274
|
-
className: "mt-2 flex items-center gap-1 text-xs text-
|
|
274
|
+
className: "mt-2 flex items-center gap-1 text-xs text-text-secondary",
|
|
275
275
|
children: [
|
|
276
276
|
/* @__PURE__ */ S(a, { className: "h-3 w-3" }),
|
|
277
277
|
" ",
|
|
@@ -301,7 +301,7 @@ function P() {
|
|
|
301
301
|
children: /* @__PURE__ */ C("table", {
|
|
302
302
|
className: "w-full text-sm",
|
|
303
303
|
children: [/* @__PURE__ */ S("thead", { children: /* @__PURE__ */ C("tr", {
|
|
304
|
-
className: "border-b text-left text-
|
|
304
|
+
className: "border-b text-left text-text-secondary",
|
|
305
305
|
children: [
|
|
306
306
|
/* @__PURE__ */ S("th", {
|
|
307
307
|
className: "p-3",
|
|
@@ -329,7 +329,7 @@ function P() {
|
|
|
329
329
|
})
|
|
330
330
|
]
|
|
331
331
|
}) }), /* @__PURE__ */ S("tbody", { children: Z.map((e) => /* @__PURE__ */ C("tr", {
|
|
332
|
-
className: "border-b hover:bg-
|
|
332
|
+
className: "border-b hover:bg-bg-sunken/50",
|
|
333
333
|
children: [
|
|
334
334
|
/* @__PURE__ */ S("td", {
|
|
335
335
|
className: "p-3",
|
|
@@ -343,7 +343,7 @@ function P() {
|
|
|
343
343
|
}),
|
|
344
344
|
e.isStarred && /* @__PURE__ */ S(v, { className: "h-3 w-3 fill-yellow-400 text-yellow-400" }),
|
|
345
345
|
e.sharedWith > 0 && /* @__PURE__ */ C("span", {
|
|
346
|
-
className: "flex items-center gap-0.5 text-xs text-
|
|
346
|
+
className: "flex items-center gap-0.5 text-xs text-text-secondary",
|
|
347
347
|
children: [
|
|
348
348
|
/* @__PURE__ */ S(b, { className: "h-3 w-3" }),
|
|
349
349
|
" ",
|
|
@@ -362,11 +362,11 @@ function P() {
|
|
|
362
362
|
children: N(e.size)
|
|
363
363
|
}),
|
|
364
364
|
/* @__PURE__ */ S("td", {
|
|
365
|
-
className: "p-3 text-
|
|
365
|
+
className: "p-3 text-text-secondary",
|
|
366
366
|
children: e.modifiedAt
|
|
367
367
|
}),
|
|
368
368
|
/* @__PURE__ */ S("td", {
|
|
369
|
-
className: "p-3 text-
|
|
369
|
+
className: "p-3 text-text-secondary",
|
|
370
370
|
children: e.uploadedBy
|
|
371
371
|
}),
|
|
372
372
|
/* @__PURE__ */ S("td", {
|
|
@@ -407,13 +407,13 @@ function P() {
|
|
|
407
407
|
/* @__PURE__ */ C("div", {
|
|
408
408
|
className: "flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-8",
|
|
409
409
|
children: [
|
|
410
|
-
/* @__PURE__ */ S(y, { className: "h-10 w-10 text-
|
|
410
|
+
/* @__PURE__ */ S(y, { className: "h-10 w-10 text-text-secondary" }),
|
|
411
411
|
/* @__PURE__ */ S("p", {
|
|
412
412
|
className: "mt-2 text-sm font-medium",
|
|
413
413
|
children: "Drag & drop files here"
|
|
414
414
|
}),
|
|
415
415
|
/* @__PURE__ */ S("p", {
|
|
416
|
-
className: "text-xs text-
|
|
416
|
+
className: "text-xs text-text-secondary",
|
|
417
417
|
children: "or click to browse"
|
|
418
418
|
})
|
|
419
419
|
]
|
|
@@ -424,7 +424,7 @@ function P() {
|
|
|
424
424
|
className: "text-sm font-medium",
|
|
425
425
|
children: "Destination Folder"
|
|
426
426
|
}), /* @__PURE__ */ C("select", {
|
|
427
|
-
className: "w-full rounded border bg-
|
|
427
|
+
className: "w-full rounded border bg-bg-surface px-3 py-2 text-sm",
|
|
428
428
|
children: [/* @__PURE__ */ S("option", {
|
|
429
429
|
value: "",
|
|
430
430
|
children: "Root"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DocumentsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DocumentsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n FolderOpen,\n FileText,\n File,\n Image,\n Upload,\n Plus,\n Grid3x3,\n List,\n Star,\n Download,\n Share2,\n MoreHorizontal,\n ArrowUpDown,\n ChevronRight,\n FolderPlus,\n Users,\n Clock,\n HardDrive,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\n\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'size';\ntype FileFilter = 'all' | 'pdf' | 'docx' | 'txt' | 'image' | 'starred';\n\nconst fileTypeIcons: Record<string, typeof FileText> = {\n pdf: FileText,\n docx: File,\n doc: File,\n txt: FileText,\n image: Image,\n video: File,\n audio: File,\n other: File,\n};\n\nconst fileTypeColors: Record<string, string> = {\n pdf: 'text-red-500',\n docx: 'text-blue-500',\n doc: 'text-blue-500',\n txt: 'text-gray-500',\n image: 'text-green-500',\n video: 'text-purple-500',\n audio: 'text-orange-500',\n other: 'text-gray-400',\n};\n\nconst folderColors: Record<string, string> = {\n blue: 'text-blue-500',\n green: 'text-green-500',\n purple: 'text-purple-500',\n yellow: 'text-yellow-500',\n red: 'text-red-500',\n};\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function DocumentsPage() {\n const { documents, folders } = useProServiceWorldStore();\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [searchQuery, setSearchQuery] = useState('');\n const [fileFilter, setFileFilter] = useState<FileFilter>('all');\n const [sortBy, setSortBy] = useState<SortBy>('date');\n const [sortAsc, setSortAsc] = useState(false);\n const [selectedFolderId, setSelectedFolderId] = useState<string | null>(null);\n const [showUploadModal, setShowUploadModal] = useState(false);\n const [showCreateFolderModal, setShowCreateFolderModal] = useState(false);\n\n const filteredDocs = useMemo(() => {\n let result = [...documents];\n\n // Folder filter\n if (selectedFolderId) {\n result = result.filter((d) => d.folderId === selectedFolderId);\n }\n\n // Type filter\n if (fileFilter === 'starred') {\n result = result.filter((d) => d.isStarred);\n } else if (fileFilter !== 'all') {\n result = result.filter((d) => d.type === fileFilter);\n }\n\n // Search\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (d) => d.name.toLowerCase().includes(q) || d.tags.some((t) => t.toLowerCase().includes(q))\n );\n }\n\n // Sort\n result.sort((a, b) => {\n const cmp =\n sortBy === 'name'\n ? a.name.localeCompare(b.name)\n : sortBy === 'date'\n ? new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime()\n : b.size - a.size;\n return sortAsc ? -cmp : cmp;\n });\n\n return result;\n }, [documents, selectedFolderId, fileFilter, searchQuery, sortBy, sortAsc]);\n\n const totalSize = documents.reduce((s, d) => s + d.size, 0);\n const starredCount = documents.filter((d) => d.isStarred).length;\n const currentFolder = selectedFolderId ? folders.find((f) => f.id === selectedFolderId) : null;\n\n const handleSort = (field: SortBy) => {\n if (sortBy === field) setSortAsc(!sortAsc);\n else {\n setSortBy(field);\n setSortAsc(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Documents</h1>\n <p className=\"text-sm text-muted-foreground\">\n Manage files, folders, and shared documents.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowCreateFolderModal(true)}>\n <FolderPlus className=\"mr-2 h-4 w-4\" /> New Folder\n </Button>\n <Button size=\"sm\" onClick={() => setShowUploadModal(true)}>\n <Upload className=\"mr-2 h-4 w-4\" /> Upload\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <FileText className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{documents.length}</p>\n <p className=\"text-xs text-muted-foreground\">Total Files</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <FolderOpen className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{folders.length}</p>\n <p className=\"text-xs text-muted-foreground\">Folders</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Star className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{starredCount}</p>\n <p className=\"text-xs text-muted-foreground\">Starred</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <HardDrive className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{formatFileSize(totalSize)}</p>\n <p className=\"text-xs text-muted-foreground\">Total Size</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-2 text-sm\">\n <button\n onClick={() => setSelectedFolderId(null)}\n className={`font-medium ${!selectedFolderId ? 'text-primary' : 'text-muted-foreground hover:text-foreground'}`}\n >\n All Files\n </button>\n {currentFolder && (\n <>\n <ChevronRight className=\"h-4 w-4 text-muted-foreground\" />\n <span className=\"font-medium text-primary\">{currentFolder.name}</span>\n </>\n )}\n </div>\n\n {/* Search, Filters, View Toggle */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search documents...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-wrap gap-1\">\n {(['all', 'pdf', 'docx', 'txt', 'starred'] as FileFilter[]).map((filter) => (\n <button\n key={filter}\n onClick={() => setFileFilter(filter)}\n className={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n fileFilter === filter\n ? 'bg-primary text-primary-foreground'\n : 'bg-muted text-muted-foreground hover:bg-muted/80'\n }`}\n >\n {filter === 'all' ? 'All' : filter === 'starred' ? 'Starred' : filter.toUpperCase()}\n </button>\n ))}\n </div>\n <div className=\"flex rounded border\">\n <button\n onClick={() => setViewMode('grid')}\n className={`p-1.5 ${viewMode === 'grid' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground'}`}\n >\n <Grid3x3 className=\"h-4 w-4\" />\n </button>\n <button\n onClick={() => setViewMode('list')}\n className={`p-1.5 ${viewMode === 'list' ? 'bg-primary text-primary-foreground' : 'text-muted-foreground'}`}\n >\n <List className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Sort */}\n <div className=\"flex gap-2\">\n {[\n { field: 'name' as SortBy, label: 'Name' },\n { field: 'date' as SortBy, label: 'Date' },\n { field: 'size' as SortBy, label: 'Size' },\n ].map(({ field, label }) => (\n <button\n key={field}\n onClick={() => handleSort(field)}\n className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortBy === field\n ? 'border-primary bg-primary/5 text-primary'\n : 'text-muted-foreground hover:bg-muted/50'\n }`}\n >\n <ArrowUpDown className=\"h-3 w-3\" />\n {label}\n </button>\n ))}\n </div>\n\n {/* Folders section (only on root) */}\n {!selectedFolderId && (\n <div>\n <h3 className=\"mb-3 text-sm font-medium text-muted-foreground\">Folders</h3>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {folders.map((folder) => (\n <button\n key={folder.id}\n onClick={() => setSelectedFolderId(folder.id)}\n className=\"flex items-center gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-muted/50\"\n >\n <FolderOpen\n className={`h-8 w-8 ${folderColors[folder.color] ?? 'text-gray-500'}`}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-sm\">{folder.name}</p>\n <p className=\"text-xs text-muted-foreground\">\n {folder.documentsCount} files\n {folder.isPublic && ' - Public'}\n </p>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Files */}\n <div>\n <h3 className=\"mb-3 text-sm font-medium text-muted-foreground\">\n Files {filteredDocs.length > 0 && `(${filteredDocs.length})`}\n </h3>\n\n {filteredDocs.length === 0 ? (\n <Card>\n <CardContent className=\"py-12 text-center text-muted-foreground\">\n No files found. Try adjusting your filters.\n </CardContent>\n </Card>\n ) : viewMode === 'grid' ? (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {filteredDocs.map((doc) => {\n const TypeIcon = fileTypeIcons[doc.type] ?? File;\n return (\n <Card key={doc.id} className=\"hover:bg-muted/30 transition-colors\">\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start justify-between\">\n <TypeIcon\n className={`h-10 w-10 ${fileTypeColors[doc.type] ?? 'text-gray-400'}`}\n />\n <div className=\"flex items-center gap-1\">\n {doc.isStarred && (\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n )}\n {doc.sharedWith > 0 && <Share2 className=\"h-4 w-4 text-muted-foreground\" />}\n </div>\n </div>\n <h4 className=\"mt-3 truncate font-medium text-sm\">{doc.name}</h4>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-muted-foreground\">\n <span>{formatFileSize(doc.size)}</span>\n <span>v{doc.version}</span>\n </div>\n <div className=\"mt-2 flex items-center gap-1 text-xs text-muted-foreground\">\n <Clock className=\"h-3 w-3\" /> {doc.modifiedAt}\n </div>\n <div className=\"mt-3 flex gap-1\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1 text-xs\">\n <Download className=\"mr-1 h-3 w-3\" /> Download\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <MoreHorizontal className=\"h-3 w-3\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n ) : (\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-left text-muted-foreground\">\n <th className=\"p-3\">Name</th>\n <th className=\"p-3\">Type</th>\n <th className=\"p-3\">Size</th>\n <th className=\"p-3\">Modified</th>\n <th className=\"p-3\">Uploaded By</th>\n <th className=\"p-3 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {filteredDocs.map((doc) => {\n const TypeIcon = fileTypeIcons[doc.type] ?? File;\n return (\n <tr key={doc.id} className=\"border-b hover:bg-muted/50\">\n <td className=\"p-3\">\n <div className=\"flex items-center gap-2\">\n <TypeIcon\n className={`h-5 w-5 ${fileTypeColors[doc.type] ?? 'text-gray-400'}`}\n />\n <span className=\"font-medium\">{doc.name}</span>\n {doc.isStarred && (\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n )}\n {doc.sharedWith > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs text-muted-foreground\">\n <Users className=\"h-3 w-3\" /> {doc.sharedWith}\n </span>\n )}\n </div>\n </td>\n <td className=\"p-3 uppercase text-xs\">{doc.type}</td>\n <td className=\"p-3\">{formatFileSize(doc.size)}</td>\n <td className=\"p-3 text-muted-foreground\">{doc.modifiedAt}</td>\n <td className=\"p-3 text-muted-foreground\">{doc.uploadedBy}</td>\n <td className=\"p-3\">\n <div className=\"flex justify-end gap-1\">\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Share2 className=\"h-3 w-3\" />\n </Button>\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n\n {/* Upload Modal */}\n {showUploadModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"mx-4 w-full max-w-md\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Upload Files</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowUploadModal(false)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-8\">\n <Upload className=\"h-10 w-10 text-muted-foreground\" />\n <p className=\"mt-2 text-sm font-medium\">Drag & drop files here</p>\n <p className=\"text-xs text-muted-foreground\">or click to browse</p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Destination Folder</label>\n <select className=\"w-full rounded border bg-background px-3 py-2 text-sm\">\n <option value=\"\">Root</option>\n {folders.map((f) => (\n <option key={f.id} value={f.id}>\n {f.name}\n </option>\n ))}\n </select>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => setShowUploadModal(false)}\n >\n Cancel\n </Button>\n <Button className=\"flex-1\">Upload</Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Create Folder Modal */}\n {showCreateFolderModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"mx-4 w-full max-w-md\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Create Folder</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowCreateFolderModal(false)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Folder Name</label>\n <Input placeholder=\"Enter folder name...\" />\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => setShowCreateFolderModal(false)}\n >\n Cancel\n </Button>\n <Button className=\"flex-1\">Create</Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":";;;;;;AAqCA,IAAM,IAAiD;CACrD,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACR,EAEK,IAAyC;CAC7C,KAAK;CACL,MAAM;CACN,KAAK;CACL,KAAK;CACL,OAAO;CACP,OAAO;CACP,OAAO;CACP,OAAO;CACR,EAEK,IAAuC;CAC3C,MAAM;CACN,OAAO;CACP,QAAQ;CACR,QAAQ;CACR,KAAK;CACN;AAED,SAAS,EAAe,GAAuB;AAG7C,QAFI,IAAQ,OAAa,GAAG,EAAM,MAC9B,IAAQ,OAAO,OAAa,IAAI,IAAQ,MAAM,QAAQ,EAAE,CAAC,OACtD,IAAI,KAAS,OAAO,OAAO,QAAQ,EAAE,CAAC;;AAG/C,SAAgB,IAAgB;CAC9B,IAAM,EAAE,cAAW,eAAY,GAAyB,EAClD,CAAC,GAAU,KAAe,EAAmB,OAAO,EACpD,CAAC,GAAa,KAAkB,EAAS,GAAG,EAC5C,CAAC,GAAY,KAAiB,EAAqB,MAAM,EACzD,CAAC,GAAQ,KAAa,EAAiB,OAAO,EAC9C,CAAC,GAAS,KAAc,EAAS,GAAM,EACvC,CAAC,GAAkB,KAAuB,EAAwB,KAAK,EACvE,CAAC,GAAiB,KAAsB,EAAS,GAAM,EACvD,CAAC,GAAuB,KAA4B,EAAS,GAAM,EAEnE,IAAe,QAAc;EACjC,IAAI,IAAS,CAAC,GAAG,EAAU;AAe3B,MAZI,MACF,IAAS,EAAO,QAAQ,MAAM,EAAE,aAAa,EAAiB,GAI5D,MAAe,YACjB,IAAS,EAAO,QAAQ,MAAM,EAAE,UAAU,GACjC,MAAe,UACxB,IAAS,EAAO,QAAQ,MAAM,EAAE,SAAS,EAAW,GAIlD,EAAY,MAAM,EAAE;GACtB,IAAM,IAAI,EAAY,aAAa;AACnC,OAAS,EAAO,QACb,MAAM,EAAE,KAAK,aAAa,CAAC,SAAS,EAAE,IAAI,EAAE,KAAK,MAAM,MAAM,EAAE,aAAa,CAAC,SAAS,EAAE,CAAC,CAC3F;;AAcH,SAVA,EAAO,MAAM,GAAG,MAAM;GACpB,IAAM,IACJ,MAAW,SACP,EAAE,KAAK,cAAc,EAAE,KAAK,GAC5B,MAAW,SACT,IAAI,KAAK,EAAE,WAAW,CAAC,SAAS,GAAG,IAAI,KAAK,EAAE,WAAW,CAAC,SAAS,GACnE,EAAE,OAAO,EAAE;AACnB,UAAO,IAAU,CAAC,IAAM;IACxB,EAEK;IACN;EAAC;EAAW;EAAkB;EAAY;EAAa;EAAQ;EAAQ,CAAC,EAErE,IAAY,EAAU,QAAQ,GAAG,MAAM,IAAI,EAAE,MAAM,EAAE,EACrD,KAAe,EAAU,QAAQ,MAAM,EAAE,UAAU,CAAC,QACpD,IAAgB,IAAmB,EAAQ,MAAM,MAAM,EAAE,OAAO,EAAiB,GAAG,MAEpF,MAAc,MAAkB;AACpC,EAAI,MAAW,IAAO,EAAW,CAAC,EAAQ,IAExC,EAAU,EAAM,EAChB,EAAW,GAAM;;AAIrB,QACE,kBAAC,OAAD;EAAK,WAAU;YAAf;GAEE,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;KAAI,WAAU;eAAyB;KAAc,CAAA,EACrD,kBAAC,KAAD;KAAG,WAAU;eAAgC;KAEzC,CAAA,CACA,EAAA,CAAA,EACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD;MAAQ,SAAQ;MAAU,MAAK;MAAK,eAAe,EAAyB,GAAK;gBAAjF,CACE,kBAAC,GAAD,EAAY,WAAU,gBAAiB,CAAA,EAAA,cAChC;SACT,kBAAC,GAAD;MAAQ,MAAK;MAAK,eAAe,EAAmB,GAAK;gBAAzD,CACE,kBAAC,GAAD,EAAQ,WAAU,gBAAiB,CAAA,EAAA,UAC5B;QACL;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf;KACE,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAU,WAAU,yBAA0B,CAAA;QAC1C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAU;QAAW,CAAA,EACxD,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAe,CAAA,CACxD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAY,WAAU,2BAA4B,CAAA;QAC9C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAQ;QAAW,CAAA,EACtD,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAW,CAAA,CACpD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAM,WAAU,2BAA4B,CAAA;QACxC,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB;QAAiB,CAAA,EACpD,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAW,CAAA,CACpD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACP,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;MAAa,WAAU;gBACrB,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,OAAD;QAAK,WAAU;kBACb,kBAAC,GAAD,EAAW,WAAU,0BAA2B,CAAA;QAC5C,CAAA,EACN,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,KAAD;QAAG,WAAU;kBAAsB,EAAe,EAAU;QAAK,CAAA,EACjE,kBAAC,KAAD;QAAG,WAAU;kBAAgC;QAAc,CAAA,CACvD,EAAA,CAAA,CACF;;MACM,CAAA,EACT,CAAA;KACH;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,UAAD;KACE,eAAe,EAAoB,KAAK;KACxC,WAAW,eAAgB,IAAoC,gDAAjB;eAC/C;KAEQ,CAAA,EACR,KACC,kBAAA,GAAA,EAAA,UAAA,CACE,kBAAC,GAAD,EAAc,WAAU,iCAAkC,CAAA,EAC1D,kBAAC,QAAD;KAAM,WAAU;eAA4B,EAAc;KAAY,CAAA,CACrE,EAAA,CAAA,CAED;;GAGN,kBAAC,OAAD;IAAK,WAAU;cAAf,CACE,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,GAAD,EAAQ,WAAU,0EAA2E,CAAA,EAC7F,kBAAC,GAAD;MACE,aAAY;MACZ,OAAO;MACP,WAAW,MAAM,EAAe,EAAE,OAAO,MAAM;MAC/C,WAAU;MACV,CAAA,CACE;QACN,kBAAC,OAAD;KAAK,WAAU;eAAf,CACE,kBAAC,OAAD;MAAK,WAAU;gBACX;OAAC;OAAO;OAAO;OAAQ;OAAO;OAAU,CAAkB,KAAK,MAC/D,kBAAC,UAAD;OAEE,eAAe,EAAc,EAAO;OACpC,WAAW,2DACT,MAAe,IACX,uCACA;iBAGL,MAAW,QAAQ,QAAQ,MAAW,YAAY,YAAY,EAAO,aAAa;OAC5E,EATF,EASE,CACT;MACE,CAAA,EACN,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,UAAD;OACE,eAAe,EAAY,OAAO;OAClC,WAAW,SAAS,MAAa,SAAS,uCAAuC;iBAEjF,kBAAC,GAAD,EAAS,WAAU,WAAY,CAAA;OACxB,CAAA,EACT,kBAAC,UAAD;OACE,eAAe,EAAY,OAAO;OAClC,WAAW,SAAS,MAAa,SAAS,uCAAuC;iBAEjF,kBAAC,GAAD,EAAM,WAAU,WAAY,CAAA;OACrB,CAAA,CACL;QACF;OACF;;GAGN,kBAAC,OAAD;IAAK,WAAU;cACZ;KACC;MAAE,OAAO;MAAkB,OAAO;MAAQ;KAC1C;MAAE,OAAO;MAAkB,OAAO;MAAQ;KAC1C;MAAE,OAAO;MAAkB,OAAO;MAAQ;KAC3C,CAAC,KAAK,EAAE,UAAO,eACd,kBAAC,UAAD;KAEE,eAAe,GAAW,EAAM;KAChC,WAAW,4DACT,MAAW,IACP,6CACA;eANR,CASE,kBAAC,GAAD,EAAa,WAAU,WAAY,CAAA,EAClC,EACM;OAVF,EAUE,CACT;IACE,CAAA;GAGL,CAAC,KACA,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAiD;IAAY,CAAA,EAC3E,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAQ,KAAK,MACZ,kBAAC,UAAD;KAEE,eAAe,EAAoB,EAAO,GAAG;KAC7C,WAAU;eAHZ,CAKE,kBAAC,GAAD,EACE,WAAW,WAAW,EAAa,EAAO,UAAU,mBACpD,CAAA,EACF,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,KAAD;OAAG,WAAU;iBAAgC,EAAO;OAAS,CAAA,EAC7D,kBAAC,KAAD;OAAG,WAAU;iBAAb;QACG,EAAO;QAAe;QACtB,EAAO,YAAY;QAClB;SACA;QACC;OAdF,EAAO,GAcL,CACT;IACE,CAAA,CACF,EAAA,CAAA;GAIR,kBAAC,OAAD,EAAA,UAAA,CACE,kBAAC,MAAD;IAAI,WAAU;cAAd,CAA+D,UACtD,EAAa,SAAS,KAAK,IAAI,EAAa,OAAO,GACvD;OAEJ,EAAa,WAAW,IACvB,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cAA0C;IAEnD,CAAA,EACT,CAAA,GACL,MAAa,SACf,kBAAC,OAAD;IAAK,WAAU;cACZ,EAAa,KAAK,MAGf,kBAAC,GAAD;KAAmB,WAAU;eAC3B,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBALS,EAAc,EAAI,SAAS,GAKpC,EACE,WAAW,aAAa,EAAe,EAAI,SAAS,mBACpD,CAAA,EACF,kBAAC,OAAD;SAAK,WAAU;mBAAf,CACG,EAAI,aACH,kBAAC,GAAD,EAAM,WAAU,2CAA4C,CAAA,EAE7D,EAAI,aAAa,KAAK,kBAAC,GAAD,EAAQ,WAAU,iCAAkC,CAAA,CACvE;WACF;;OACN,kBAAC,MAAD;QAAI,WAAU;kBAAqC,EAAI;QAAU,CAAA;OACjE,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,QAAD,EAAA,UAAO,EAAe,EAAI,KAAK,EAAQ,CAAA,EACvC,kBAAC,QAAD,EAAA,UAAA,CAAM,KAAE,EAAI,QAAe,EAAA,CAAA,CACvB;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;;SAAE,EAAI;SAC/B;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SAAQ,SAAQ;SAAU,MAAK;SAAK,WAAU;mBAA9C,CACE,kBAAC,GAAD,EAAU,WAAU,gBAAiB,CAAA,EAAA,YAC9B;YACT,kBAAC,GAAD;SAAQ,SAAQ;SAAU,MAAK;mBAC7B,kBAAC,GAAD,EAAgB,WAAU,WAAY,CAAA;SAC/B,CAAA,CACL;;OACM;;KACT,EA9BI,EAAI,GA8BR,CAET;IACE,CAAA,GAEN,kBAAC,GAAD,EAAA,UACE,kBAAC,GAAD;IAAa,WAAU;cACrB,kBAAC,OAAD;KAAK,WAAU;eACb,kBAAC,SAAD;MAAO,WAAU;gBAAjB,CACE,kBAAC,SAAD,EAAA,UACE,kBAAC,MAAD;OAAI,WAAU;iBAAd;QACE,kBAAC,MAAD;SAAI,WAAU;mBAAM;SAAS,CAAA;QAC7B,kBAAC,MAAD;SAAI,WAAU;mBAAM;SAAS,CAAA;QAC7B,kBAAC,MAAD;SAAI,WAAU;mBAAM;SAAS,CAAA;QAC7B,kBAAC,MAAD;SAAI,WAAU;mBAAM;SAAa,CAAA;QACjC,kBAAC,MAAD;SAAI,WAAU;mBAAM;SAAgB,CAAA;QACpC,kBAAC,MAAD;SAAI,WAAU;mBAAiB;SAAY,CAAA;QACxC;UACC,CAAA,EACR,kBAAC,SAAD,EAAA,UACG,EAAa,KAAK,MAGf,kBAAC,MAAD;OAAiB,WAAU;iBAA3B;QACE,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,OAAD;UAAK,WAAU;oBAAf;WACE,kBALS,EAAc,EAAI,SAAS,GAKpC,EACE,WAAW,WAAW,EAAe,EAAI,SAAS,mBAClD,CAAA;WACF,kBAAC,QAAD;YAAM,WAAU;sBAAe,EAAI;YAAY,CAAA;WAC9C,EAAI,aACH,kBAAC,GAAD,EAAM,WAAU,2CAA4C,CAAA;WAE7D,EAAI,aAAa,KAChB,kBAAC,QAAD;YAAM,WAAU;sBAAhB;aACE,kBAAC,GAAD,EAAO,WAAU,WAAY,CAAA;;aAAE,EAAI;aAC9B;;WAEL;;SACH,CAAA;QACL,kBAAC,MAAD;SAAI,WAAU;mBAAyB,EAAI;SAAU,CAAA;QACrD,kBAAC,MAAD;SAAI,WAAU;mBAAO,EAAe,EAAI,KAAK;SAAM,CAAA;QACnD,kBAAC,MAAD;SAAI,WAAU;mBAA6B,EAAI;SAAgB,CAAA;QAC/D,kBAAC,MAAD;SAAI,WAAU;mBAA6B,EAAI;SAAgB,CAAA;QAC/D,kBAAC,MAAD;SAAI,WAAU;mBACZ,kBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,kBAAC,GAAD;WAAQ,SAAQ;WAAU,MAAK;qBAC7B,kBAAC,GAAD,EAAU,WAAU,WAAY,CAAA;WACzB,CAAA,EACT,kBAAC,GAAD;WAAQ,SAAQ;WAAU,MAAK;qBAC7B,kBAAC,GAAD,EAAQ,WAAU,WAAY,CAAA;WACvB,CAAA,CACL;;SACH,CAAA;QACF;SA/BI,EAAI,GA+BR,CAEP,EACI,CAAA,CACF;;KACJ,CAAA;IACM,CAAA,EACT,CAAA,CAEL,EAAA,CAAA;GAGL,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAA,UAAW,gBAAwB,CAAA,EACnC,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,EAAmB,GAAM;iBAAE;OAErE,CAAA,CACL;SACK,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB;OACE,kBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,kBAAC,GAAD,EAAQ,WAAU,mCAAoC,CAAA;SACtD,kBAAC,KAAD;UAAG,WAAU;oBAA2B;UAA0B,CAAA;SAClE,kBAAC,KAAD;UAAG,WAAU;oBAAgC;UAAsB,CAAA;SAC/D;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,SAAD;SAAO,WAAU;mBAAsB;SAA0B,CAAA,EACjE,kBAAC,UAAD;SAAQ,WAAU;mBAAlB,CACE,kBAAC,UAAD;UAAQ,OAAM;oBAAG;UAAa,CAAA,EAC7B,EAAQ,KAAK,MACZ,kBAAC,UAAD;UAAmB,OAAO,EAAE;oBACzB,EAAE;UACI,EAFI,EAAE,GAEN,CACT,CACK;WACL;;OACN,kBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,kBAAC,GAAD;SACE,SAAQ;SACR,WAAU;SACV,eAAe,EAAmB,GAAM;mBACzC;SAEQ,CAAA,EACT,kBAAC,GAAD;SAAQ,WAAU;mBAAS;SAAe,CAAA,CACtC;;OACM;QACT;;IACH,CAAA;GAIP,KACC,kBAAC,OAAD;IAAK,WAAU;cACb,kBAAC,GAAD;KAAM,WAAU;eAAhB,CACE,kBAAC,GAAD,EAAA,UACE,kBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,kBAAC,GAAD,EAAA,UAAW,iBAAyB,CAAA,EACpC,kBAAC,GAAD;OAAQ,SAAQ;OAAU,MAAK;OAAK,eAAe,EAAyB,GAAM;iBAAE;OAE3E,CAAA,CACL;SACK,CAAA,EACb,kBAAC,GAAD;MAAa,WAAU;gBAAvB,CACE,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,SAAD;QAAO,WAAU;kBAAsB;QAAmB,CAAA,EAC1D,kBAAC,GAAD,EAAO,aAAY,wBAAyB,CAAA,CACxC;UACN,kBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,kBAAC,GAAD;QACE,SAAQ;QACR,WAAU;QACV,eAAe,EAAyB,GAAM;kBAC/C;QAEQ,CAAA,EACT,kBAAC,GAAD;QAAQ,WAAU;kBAAS;QAAe,CAAA,CACtC;SACM;QACT;;IACH,CAAA;GAEJ"}
|
|
1
|
+
{"version":3,"file":"DocumentsPage.js","names":[],"sources":["../../../src/proserviceworld/pages/DocumentsPage.tsx"],"sourcesContent":["import { useState, useMemo } from 'react';\nimport {\n Badge,\n Button,\n Card,\n CardContent,\n CardHeader,\n CardTitle,\n Input,\n} from '@burdenoff/fe-libs/ui';\nimport {\n Search,\n FolderOpen,\n FileText,\n File,\n Image,\n Upload,\n Plus,\n Grid3x3,\n List,\n Star,\n Download,\n Share2,\n MoreHorizontal,\n ArrowUpDown,\n ChevronRight,\n FolderPlus,\n Users,\n Clock,\n HardDrive,\n} from 'lucide-react';\nimport { useProServiceWorldStore } from '../store/proserviceworldStore';\n\ntype ViewMode = 'grid' | 'list';\ntype SortBy = 'name' | 'date' | 'size';\ntype FileFilter = 'all' | 'pdf' | 'docx' | 'txt' | 'image' | 'starred';\n\nconst fileTypeIcons: Record<string, typeof FileText> = {\n pdf: FileText,\n docx: File,\n doc: File,\n txt: FileText,\n image: Image,\n video: File,\n audio: File,\n other: File,\n};\n\nconst fileTypeColors: Record<string, string> = {\n pdf: 'text-red-500',\n docx: 'text-blue-500',\n doc: 'text-blue-500',\n txt: 'text-gray-500',\n image: 'text-green-500',\n video: 'text-purple-500',\n audio: 'text-orange-500',\n other: 'text-gray-400',\n};\n\nconst folderColors: Record<string, string> = {\n blue: 'text-blue-500',\n green: 'text-green-500',\n purple: 'text-purple-500',\n yellow: 'text-yellow-500',\n red: 'text-red-500',\n};\n\nfunction formatFileSize(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n\nexport function DocumentsPage() {\n const { documents, folders } = useProServiceWorldStore();\n const [viewMode, setViewMode] = useState<ViewMode>('grid');\n const [searchQuery, setSearchQuery] = useState('');\n const [fileFilter, setFileFilter] = useState<FileFilter>('all');\n const [sortBy, setSortBy] = useState<SortBy>('date');\n const [sortAsc, setSortAsc] = useState(false);\n const [selectedFolderId, setSelectedFolderId] = useState<string | null>(null);\n const [showUploadModal, setShowUploadModal] = useState(false);\n const [showCreateFolderModal, setShowCreateFolderModal] = useState(false);\n\n const filteredDocs = useMemo(() => {\n let result = [...documents];\n\n // Folder filter\n if (selectedFolderId) {\n result = result.filter((d) => d.folderId === selectedFolderId);\n }\n\n // Type filter\n if (fileFilter === 'starred') {\n result = result.filter((d) => d.isStarred);\n } else if (fileFilter !== 'all') {\n result = result.filter((d) => d.type === fileFilter);\n }\n\n // Search\n if (searchQuery.trim()) {\n const q = searchQuery.toLowerCase();\n result = result.filter(\n (d) => d.name.toLowerCase().includes(q) || d.tags.some((t) => t.toLowerCase().includes(q))\n );\n }\n\n // Sort\n result.sort((a, b) => {\n const cmp =\n sortBy === 'name'\n ? a.name.localeCompare(b.name)\n : sortBy === 'date'\n ? new Date(b.modifiedAt).getTime() - new Date(a.modifiedAt).getTime()\n : b.size - a.size;\n return sortAsc ? -cmp : cmp;\n });\n\n return result;\n }, [documents, selectedFolderId, fileFilter, searchQuery, sortBy, sortAsc]);\n\n const totalSize = documents.reduce((s, d) => s + d.size, 0);\n const starredCount = documents.filter((d) => d.isStarred).length;\n const currentFolder = selectedFolderId ? folders.find((f) => f.id === selectedFolderId) : null;\n\n const handleSort = (field: SortBy) => {\n if (sortBy === field) setSortAsc(!sortAsc);\n else {\n setSortBy(field);\n setSortAsc(false);\n }\n };\n\n return (\n <div className=\"space-y-6 p-6\">\n {/* Header */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div>\n <h1 className=\"text-2xl font-semibold\">Documents</h1>\n <p className=\"text-sm text-text-secondary\">\n Manage files, folders, and shared documents.\n </p>\n </div>\n <div className=\"flex gap-2\">\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowCreateFolderModal(true)}>\n <FolderPlus className=\"mr-2 h-4 w-4\" /> New Folder\n </Button>\n <Button size=\"sm\" onClick={() => setShowUploadModal(true)}>\n <Upload className=\"mr-2 h-4 w-4\" /> Upload\n </Button>\n </div>\n </div>\n\n {/* Stats */}\n <div className=\"grid gap-4 sm:grid-cols-2 lg:grid-cols-4\">\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-blue-100 p-2 dark:bg-blue-950\">\n <FileText className=\"h-5 w-5 text-blue-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{documents.length}</p>\n <p className=\"text-xs text-text-secondary\">Total Files</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-purple-100 p-2 dark:bg-purple-950\">\n <FolderOpen className=\"h-5 w-5 text-purple-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{folders.length}</p>\n <p className=\"text-xs text-text-secondary\">Folders</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-yellow-100 p-2 dark:bg-yellow-950\">\n <Star className=\"h-5 w-5 text-yellow-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{starredCount}</p>\n <p className=\"text-xs text-text-secondary\">Starred</p>\n </div>\n </div>\n </CardContent>\n </Card>\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"flex items-center gap-3\">\n <div className=\"rounded-lg bg-green-100 p-2 dark:bg-green-950\">\n <HardDrive className=\"h-5 w-5 text-green-600\" />\n </div>\n <div>\n <p className=\"text-2xl font-bold\">{formatFileSize(totalSize)}</p>\n <p className=\"text-xs text-text-secondary\">Total Size</p>\n </div>\n </div>\n </CardContent>\n </Card>\n </div>\n\n {/* Breadcrumb */}\n <div className=\"flex items-center gap-2 text-sm\">\n <button\n onClick={() => setSelectedFolderId(null)}\n className={`font-medium ${!selectedFolderId ? 'text-primary' : 'text-text-secondary hover:text-text-primary'}`}\n >\n All Files\n </button>\n {currentFolder && (\n <>\n <ChevronRight className=\"h-4 w-4 text-text-secondary\" />\n <span className=\"font-medium text-primary\">{currentFolder.name}</span>\n </>\n )}\n </div>\n\n {/* Search, Filters, View Toggle */}\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center\">\n <div className=\"relative flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary\" />\n <Input\n placeholder=\"Search documents...\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n className=\"pl-10\"\n />\n </div>\n <div className=\"flex items-center gap-2\">\n <div className=\"flex flex-wrap gap-1\">\n {(['all', 'pdf', 'docx', 'txt', 'starred'] as FileFilter[]).map((filter) => (\n <button\n key={filter}\n onClick={() => setFileFilter(filter)}\n className={`rounded px-2 py-1 text-xs font-medium transition-colors ${\n fileFilter === filter\n ? 'bg-action-primary-bg text-action-primary-text'\n : 'bg-bg-sunken text-text-secondary hover:bg-bg-sunken/80'\n }`}\n >\n {filter === 'all' ? 'All' : filter === 'starred' ? 'Starred' : filter.toUpperCase()}\n </button>\n ))}\n </div>\n <div className=\"flex rounded border\">\n <button\n onClick={() => setViewMode('grid')}\n className={`p-1.5 ${viewMode === 'grid' ? 'bg-action-primary-bg text-action-primary-text' : 'text-text-secondary'}`}\n >\n <Grid3x3 className=\"h-4 w-4\" />\n </button>\n <button\n onClick={() => setViewMode('list')}\n className={`p-1.5 ${viewMode === 'list' ? 'bg-action-primary-bg text-action-primary-text' : 'text-text-secondary'}`}\n >\n <List className=\"h-4 w-4\" />\n </button>\n </div>\n </div>\n </div>\n\n {/* Sort */}\n <div className=\"flex gap-2\">\n {[\n { field: 'name' as SortBy, label: 'Name' },\n { field: 'date' as SortBy, label: 'Date' },\n { field: 'size' as SortBy, label: 'Size' },\n ].map(({ field, label }) => (\n <button\n key={field}\n onClick={() => handleSort(field)}\n className={`flex items-center gap-1 rounded border px-3 py-1 text-xs ${\n sortBy === field\n ? 'border-primary bg-action-primary-bg/5 text-primary'\n : 'text-text-secondary hover:bg-bg-sunken/50'\n }`}\n >\n <ArrowUpDown className=\"h-3 w-3\" />\n {label}\n </button>\n ))}\n </div>\n\n {/* Folders section (only on root) */}\n {!selectedFolderId && (\n <div>\n <h3 className=\"mb-3 text-sm font-medium text-text-secondary\">Folders</h3>\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-4\">\n {folders.map((folder) => (\n <button\n key={folder.id}\n onClick={() => setSelectedFolderId(folder.id)}\n className=\"flex items-center gap-3 rounded-lg border p-3 text-left transition-colors hover:bg-bg-sunken/50\"\n >\n <FolderOpen\n className={`h-8 w-8 ${folderColors[folder.color] ?? 'text-gray-500'}`}\n />\n <div className=\"min-w-0 flex-1\">\n <p className=\"truncate font-medium text-sm\">{folder.name}</p>\n <p className=\"text-xs text-text-secondary\">\n {folder.documentsCount} files\n {folder.isPublic && ' - Public'}\n </p>\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n\n {/* Files */}\n <div>\n <h3 className=\"mb-3 text-sm font-medium text-text-secondary\">\n Files {filteredDocs.length > 0 && `(${filteredDocs.length})`}\n </h3>\n\n {filteredDocs.length === 0 ? (\n <Card>\n <CardContent className=\"py-12 text-center text-text-secondary\">\n No files found. Try adjusting your filters.\n </CardContent>\n </Card>\n ) : viewMode === 'grid' ? (\n <div className=\"grid gap-3 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4\">\n {filteredDocs.map((doc) => {\n const TypeIcon = fileTypeIcons[doc.type] ?? File;\n return (\n <Card key={doc.id} className=\"hover:bg-bg-sunken/30 transition-colors\">\n <CardContent className=\"pt-4\">\n <div className=\"flex items-start justify-between\">\n <TypeIcon\n className={`h-10 w-10 ${fileTypeColors[doc.type] ?? 'text-gray-400'}`}\n />\n <div className=\"flex items-center gap-1\">\n {doc.isStarred && (\n <Star className=\"h-4 w-4 fill-yellow-400 text-yellow-400\" />\n )}\n {doc.sharedWith > 0 && <Share2 className=\"h-4 w-4 text-text-secondary\" />}\n </div>\n </div>\n <h4 className=\"mt-3 truncate font-medium text-sm\">{doc.name}</h4>\n <div className=\"mt-1 flex items-center gap-2 text-xs text-text-secondary\">\n <span>{formatFileSize(doc.size)}</span>\n <span>v{doc.version}</span>\n </div>\n <div className=\"mt-2 flex items-center gap-1 text-xs text-text-secondary\">\n <Clock className=\"h-3 w-3\" /> {doc.modifiedAt}\n </div>\n <div className=\"mt-3 flex gap-1\">\n <Button variant=\"outline\" size=\"sm\" className=\"flex-1 text-xs\">\n <Download className=\"mr-1 h-3 w-3\" /> Download\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <MoreHorizontal className=\"h-3 w-3\" />\n </Button>\n </div>\n </CardContent>\n </Card>\n );\n })}\n </div>\n ) : (\n <Card>\n <CardContent className=\"pt-4\">\n <div className=\"overflow-x-auto\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b text-left text-text-secondary\">\n <th className=\"p-3\">Name</th>\n <th className=\"p-3\">Type</th>\n <th className=\"p-3\">Size</th>\n <th className=\"p-3\">Modified</th>\n <th className=\"p-3\">Uploaded By</th>\n <th className=\"p-3 text-right\">Actions</th>\n </tr>\n </thead>\n <tbody>\n {filteredDocs.map((doc) => {\n const TypeIcon = fileTypeIcons[doc.type] ?? File;\n return (\n <tr key={doc.id} className=\"border-b hover:bg-bg-sunken/50\">\n <td className=\"p-3\">\n <div className=\"flex items-center gap-2\">\n <TypeIcon\n className={`h-5 w-5 ${fileTypeColors[doc.type] ?? 'text-gray-400'}`}\n />\n <span className=\"font-medium\">{doc.name}</span>\n {doc.isStarred && (\n <Star className=\"h-3 w-3 fill-yellow-400 text-yellow-400\" />\n )}\n {doc.sharedWith > 0 && (\n <span className=\"flex items-center gap-0.5 text-xs text-text-secondary\">\n <Users className=\"h-3 w-3\" /> {doc.sharedWith}\n </span>\n )}\n </div>\n </td>\n <td className=\"p-3 uppercase text-xs\">{doc.type}</td>\n <td className=\"p-3\">{formatFileSize(doc.size)}</td>\n <td className=\"p-3 text-text-secondary\">{doc.modifiedAt}</td>\n <td className=\"p-3 text-text-secondary\">{doc.uploadedBy}</td>\n <td className=\"p-3\">\n <div className=\"flex justify-end gap-1\">\n <Button variant=\"outline\" size=\"sm\">\n <Download className=\"h-3 w-3\" />\n </Button>\n <Button variant=\"outline\" size=\"sm\">\n <Share2 className=\"h-3 w-3\" />\n </Button>\n </div>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </CardContent>\n </Card>\n )}\n </div>\n\n {/* Upload Modal */}\n {showUploadModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"mx-4 w-full max-w-md\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Upload Files</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowUploadModal(false)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex flex-col items-center justify-center rounded-lg border-2 border-dashed p-8\">\n <Upload className=\"h-10 w-10 text-text-secondary\" />\n <p className=\"mt-2 text-sm font-medium\">Drag & drop files here</p>\n <p className=\"text-xs text-text-secondary\">or click to browse</p>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Destination Folder</label>\n <select className=\"w-full rounded border bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"\">Root</option>\n {folders.map((f) => (\n <option key={f.id} value={f.id}>\n {f.name}\n </option>\n ))}\n </select>\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => setShowUploadModal(false)}\n >\n Cancel\n </Button>\n <Button className=\"flex-1\">Upload</Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n\n {/* Create Folder Modal */}\n {showCreateFolderModal && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/50\">\n <Card className=\"mx-4 w-full max-w-md\">\n <CardHeader>\n <div className=\"flex items-center justify-between\">\n <CardTitle>Create Folder</CardTitle>\n <Button variant=\"outline\" size=\"sm\" onClick={() => setShowCreateFolderModal(false)}>\n Close\n </Button>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">Folder Name</label>\n <Input placeholder=\"Enter folder name...\" />\n </div>\n <div className=\"flex gap-2\">\n <Button\n variant=\"outline\"\n className=\"flex-1\"\n onClick={() => setShowCreateFolderModal(false)}\n >\n Cancel\n </Button>\n <Button className=\"flex-1\">Create</Button>\n </div>\n </CardContent>\n </Card>\n </div>\n )}\n </div>\n );\n}\n"],"mappings":"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"}
|