import * as icon from '@mdi/js'; import Head from 'next/head' import React from 'react' import axios from 'axios'; import type { ReactElement } from 'react' import LayoutAuthenticated from '../layouts/Authenticated' import SectionMain from '../components/SectionMain' import SectionTitleLineWithButton from '../components/SectionTitleLineWithButton' import BaseIcon from "../components/BaseIcon"; import { getPageTitle } from '../config' import Link from "next/link"; import { hasPermission } from "../helpers/userPermissions"; import { fetchWidgets } from '../stores/roles/rolesSlice'; import { WidgetCreator } from '../components/WidgetCreator/WidgetCreator'; import { SmartWidget } from '../components/SmartWidget/SmartWidget'; import { useAppDispatch, useAppSelector } from '../stores/hooks'; const Dashboard = () => { const dispatch = useAppDispatch(); const iconsColor = useAppSelector((state) => state.style.iconsColor); const corners = useAppSelector((state) => state.style.corners); const cardsStyle = useAppSelector((state) => state.style.cardsStyle); const loadingMessage = 'Loading...'; const [users, setUsers] = React.useState(loadingMessage); const [roles, setRoles] = React.useState(loadingMessage); const [permissions, setPermissions] = React.useState(loadingMessage); const [organizations, setOrganizations] = React.useState(loadingMessage); const [tenants, setTenants] = React.useState(loadingMessage); const [user_memberships, setUser_memberships] = React.useState(loadingMessage); const [tenant_locations, setTenant_locations] = React.useState(loadingMessage); const [ponds, setPonds] = React.useState(loadingMessage); const [species, setSpecies] = React.useState(loadingMessage); const [batches, setBatches] = React.useState(loadingMessage); const [feed_products, setFeed_products] = React.useState(loadingMessage); const [inventory_items, setInventory_items] = React.useState(loadingMessage); const [inventory_movements, setInventory_movements] = React.useState(loadingMessage); const [feeding_logs, setFeeding_logs] = React.useState(loadingMessage); const [water_quality_logs, setWater_quality_logs] = React.useState(loadingMessage); const [health_events, setHealth_events] = React.useState(loadingMessage); const [harvests, setHarvests] = React.useState(loadingMessage); const [marketplace_listings, setMarketplace_listings] = React.useState(loadingMessage); const [orders, setOrders] = React.useState(loadingMessage); const [order_items, setOrder_items] = React.useState(loadingMessage); const [payment_transactions, setPayment_transactions] = React.useState(loadingMessage); const [shipment_updates, setShipment_updates] = React.useState(loadingMessage); const [investments, setInvestments] = React.useState(loadingMessage); const [api_keys, setApi_keys] = React.useState(loadingMessage); const [webhook_endpoints, setWebhook_endpoints] = React.useState(loadingMessage); const [webhook_deliveries, setWebhook_deliveries] = React.useState(loadingMessage); const [email_notifications, setEmail_notifications] = React.useState(loadingMessage); const [audit_logs, setAudit_logs] = React.useState(loadingMessage); const [csv_jobs, setCsv_jobs] = React.useState(loadingMessage); const [widgetsRole, setWidgetsRole] = React.useState({ role: { value: '', label: '' }, }); const { currentUser } = useAppSelector((state) => state.auth); const { isFetchingQuery } = useAppSelector((state) => state.openAi); const { rolesWidgets, loading } = useAppSelector((state) => state.roles); const organizationId = currentUser?.organizations?.id; async function loadData() { const entities = ['users','roles','permissions','organizations','tenants','user_memberships','tenant_locations','ponds','species','batches','feed_products','inventory_items','inventory_movements','feeding_logs','water_quality_logs','health_events','harvests','marketplace_listings','orders','order_items','payment_transactions','shipment_updates','investments','api_keys','webhook_endpoints','webhook_deliveries','email_notifications','audit_logs','csv_jobs',]; const fns = [setUsers,setRoles,setPermissions,setOrganizations,setTenants,setUser_memberships,setTenant_locations,setPonds,setSpecies,setBatches,setFeed_products,setInventory_items,setInventory_movements,setFeeding_logs,setWater_quality_logs,setHealth_events,setHarvests,setMarketplace_listings,setOrders,setOrder_items,setPayment_transactions,setShipment_updates,setInvestments,setApi_keys,setWebhook_endpoints,setWebhook_deliveries,setEmail_notifications,setAudit_logs,setCsv_jobs,]; const requests = entities.map((entity, index) => { if(hasPermission(currentUser, `READ_${entity.toUpperCase()}`)) { return axios.get(`/${entity.toLowerCase()}/count`); } else { fns[index](null); return Promise.resolve({data: {count: null}}); } }); Promise.allSettled(requests).then((results) => { results.forEach((result, i) => { if (result.status === 'fulfilled') { fns[i](result.value.data.count); } else { fns[i](result.reason.message); } }); }); } async function getWidgets(roleId) { await dispatch(fetchWidgets(roleId)); } React.useEffect(() => { if (!currentUser) return; loadData().then(); setWidgetsRole({ role: { value: currentUser?.app_role?.id, label: currentUser?.app_role?.name } }); }, [currentUser]); React.useEffect(() => { if (!currentUser || !widgetsRole?.role?.value) return; getWidgets(widgetsRole?.role?.value || '').then(); }, [widgetsRole?.role?.value]); return ( <> {getPageTitle('Overview')} {''} {hasPermission(currentUser, 'CREATE_ROLES') && } {!!rolesWidgets.length && hasPermission(currentUser, 'CREATE_ROLES') && (

{`${widgetsRole?.role?.label || 'Users'}'s widgets`}

)}
{(isFetchingQuery || loading) && (
{' '} Loading widgets...
)} { rolesWidgets && rolesWidgets.map((widget) => ( ))}
{!!rolesWidgets.length &&
}
{hasPermission(currentUser, 'READ_USERS') &&
Users
{users}
} {hasPermission(currentUser, 'READ_ROLES') &&
Roles
{roles}
} {hasPermission(currentUser, 'READ_PERMISSIONS') &&
Permissions
{permissions}
} {hasPermission(currentUser, 'READ_ORGANIZATIONS') &&
Organizations
{organizations}
} {hasPermission(currentUser, 'READ_TENANTS') &&
Tenants
{tenants}
} {hasPermission(currentUser, 'READ_USER_MEMBERSHIPS') &&
User memberships
{user_memberships}
} {hasPermission(currentUser, 'READ_TENANT_LOCATIONS') &&
Tenant locations
{tenant_locations}
} {hasPermission(currentUser, 'READ_PONDS') &&
Ponds
{ponds}
} {hasPermission(currentUser, 'READ_SPECIES') &&
Species
{species}
} {hasPermission(currentUser, 'READ_BATCHES') &&
Batches
{batches}
} {hasPermission(currentUser, 'READ_FEED_PRODUCTS') &&
Feed products
{feed_products}
} {hasPermission(currentUser, 'READ_INVENTORY_ITEMS') &&
Inventory items
{inventory_items}
} {hasPermission(currentUser, 'READ_INVENTORY_MOVEMENTS') &&
Inventory movements
{inventory_movements}
} {hasPermission(currentUser, 'READ_FEEDING_LOGS') &&
Feeding logs
{feeding_logs}
} {hasPermission(currentUser, 'READ_WATER_QUALITY_LOGS') &&
Water quality logs
{water_quality_logs}
} {hasPermission(currentUser, 'READ_HEALTH_EVENTS') &&
Health events
{health_events}
} {hasPermission(currentUser, 'READ_HARVESTS') &&
Harvests
{harvests}
} {hasPermission(currentUser, 'READ_MARKETPLACE_LISTINGS') &&
Marketplace listings
{marketplace_listings}
} {hasPermission(currentUser, 'READ_ORDERS') &&
Orders
{orders}
} {hasPermission(currentUser, 'READ_ORDER_ITEMS') &&
Order items
{order_items}
} {hasPermission(currentUser, 'READ_PAYMENT_TRANSACTIONS') &&
Payment transactions
{payment_transactions}
} {hasPermission(currentUser, 'READ_SHIPMENT_UPDATES') &&
Shipment updates
{shipment_updates}
} {hasPermission(currentUser, 'READ_INVESTMENTS') &&
Investments
{investments}
} {hasPermission(currentUser, 'READ_API_KEYS') &&
Api keys
{api_keys}
} {hasPermission(currentUser, 'READ_WEBHOOK_ENDPOINTS') &&
Webhook endpoints
{webhook_endpoints}
} {hasPermission(currentUser, 'READ_WEBHOOK_DELIVERIES') &&
Webhook deliveries
{webhook_deliveries}
} {hasPermission(currentUser, 'READ_EMAIL_NOTIFICATIONS') &&
Email notifications
{email_notifications}
} {hasPermission(currentUser, 'READ_AUDIT_LOGS') &&
Audit logs
{audit_logs}
} {hasPermission(currentUser, 'READ_CSV_JOBS') &&
Csv jobs
{csv_jobs}
}
) } Dashboard.getLayout = function getLayout(page: ReactElement) { return {page} } export default Dashboard