- {isBusinessOwner && hasPermission(currentUser, 'CREATE_BUSINESSES') && (
-
+ icon={icon.mdiStarFourPoints}
+ title={isBusinessOwner ? 'Beauty Studio Hub' : 'Network System Pulse'}
+ main
+ className="mb-8"
+ >
+ {isBusinessOwner && (
+
+
+
+
)}
-
- {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 &&
}
-
-
- {isBusinessOwner && myBusiness && (
-
-
-
-
-
- My Listing
-
-
- {myBusiness.name}
-
-
Edit Listing
-
-
-
-
-
+ {isBusinessOwner ? (
+
+ ) : (
+
+ {Object.keys(counts).map(entity => (
+
+
+
+
+
{entity.replace('_', ' ')}
+
{counts[entity]}
+
+
+
+
-
- )}
-
- {hasPermission(currentUser, 'READ_LEADS') &&
-
-
-
-
- {isBusinessOwner ? 'Service Requests' : 'Leads'}
-
-
- {leads}
-
-
-
-
-
-
-
- }
-
- {hasPermission(currentUser, 'READ_REVIEWS') &&
-
-
-
-
- Reviews
-
-
- {reviews}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_USERS') &&
-
-
-
-
- Users
-
-
- {users}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_ROLES') &&
-
-
-
-
- Roles
-
-
- {roles}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_PERMISSIONS') &&
-
-
-
-
- Permissions
-
-
- {permissions}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_REFRESH_TOKENS') &&
-
-
-
-
- Refresh tokens
-
-
- {refresh_tokens}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_CATEGORIES') &&
-
-
-
-
- Categories
-
-
- {categories}
-
-
-
-
-
-
-
- }
-
- {!isBusinessOwner && hasPermission(currentUser, 'READ_LOCATIONS') &&
-
-
-
-
- Locations
-
-
- {locations}
-
-
-
-
-
-
-
- }
-
- {hasPermission(currentUser, 'READ_BUSINESSES') &&
-
-
-
-
- Businesses
-
-
- {businesses}
-
-
-
-
-
-
-
- }
-
+
+
+ ))}
+
+ )}
>
)
@@ -436,4 +324,4 @@ Dashboard.getLayout = function getLayout(page: ReactElement) {
return
{page}
}
-export default Dashboard
\ No newline at end of file
+export default Dashboard;
\ No newline at end of file
diff --git a/frontend/src/pages/forgot.tsx b/frontend/src/pages/forgot.tsx
index 83b1f2c..41f239f 100644
--- a/frontend/src/pages/forgot.tsx
+++ b/frontend/src/pages/forgot.tsx
@@ -96,7 +96,7 @@ export default function Forgot() {
- Crafted Network™
+ Fix It Local™
Forgot Password?
@@ -138,7 +138,7 @@ export default function Forgot() {
- © 2026 Crafted Network™. All rights reserved.
+ © 2026 Fix It Local™. All rights reserved.
Privacy Policy
diff --git a/frontend/src/pages/index.tsx b/frontend/src/pages/index.tsx
index d04935d..2c4f6a4 100644
--- a/frontend/src/pages/index.tsx
+++ b/frontend/src/pages/index.tsx
@@ -53,7 +53,7 @@ export default function LandingPage() {
return (
-
Crafted Network™ | 21st Century Service Directory
+ Fix It Local™ | 21st Century Service Directory
diff --git a/frontend/src/pages/leads/leads-view.tsx b/frontend/src/pages/leads/leads-view.tsx
index 10b90b4..43984ce 100644
--- a/frontend/src/pages/leads/leads-view.tsx
+++ b/frontend/src/pages/leads/leads-view.tsx
@@ -1,4 +1,4 @@
-import React, { ReactElement, useEffect } from 'react';
+import React, { ReactElement, useEffect, useState } from 'react';
import Head from 'next/head'
import DatePicker from "react-datepicker";
import "react-datepicker/dist/react-datepicker.css";
@@ -14,8 +14,10 @@ import SectionMain from "../../components/SectionMain";
import CardBox from "../../components/CardBox";
import BaseButton from "../../components/BaseButton";
import BaseDivider from "../../components/BaseDivider";
-import {mdiChartTimelineVariant, mdiMessageReply} from "@mdi/js";
+import {mdiChartTimelineVariant, mdiMessageReply, mdiAccountMultiple, mdiCamera, mdiTimelineText, mdiInformation} from "@mdi/js";
import FormField from "../../components/FormField";
+import BaseIcon from "../../components/BaseIcon";
+import ImageField from "../../components/ImageField";
const LeadsView = () => {
@@ -27,12 +29,20 @@ const LeadsView = () => {
const { id } = router.query;
+ const [activeTab, setActiveTab] = useState('details');
+
useEffect(() => {
if (id) {
dispatch(fetch({ id }));
}
}, [dispatch, id]);
+ const tabs = [
+ { id: 'details', label: 'Details', icon: mdiInformation },
+ { id: 'photos', label: 'Photos', icon: mdiCamera },
+ { id: 'matches', label: 'Matches', icon: mdiAccountMultiple },
+ { id: 'events', label: 'Events', icon: mdiTimelineText },
+ ];
return (
<>
@@ -57,110 +67,211 @@ const LeadsView = () => {
/>
-
-
-
-
User
-
{leads?.user?.firstName} {leads?.user?.lastName}
-
-
-
Category
-
{leads?.category?.name ?? 'No data'}
-
-
-
-
Keyword
-
{leads?.keyword}
-
-
-
-
Urgency
-
{leads?.urgency ?? 'No data'}
-
-
-
-
Status
-
{leads?.status ?? 'No data'}
-
-
-
-
-
-
-
-
-
-
Contact Name
-
{leads?.contact_name}
-
-
-
-
Contact Phone
-
{leads?.contact_phone}
-
-
-
-
Contact Email
-
{leads?.contact_email}
-
-
-
-
-
-
-
-
-
- {leads.messages_lead && leads.messages_lead.length > 0 && (
- <>
- Message History
-
+ {tabs.map((tab) => (
+