Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 54 additions & 21 deletions src/components/admin/ActivitiesEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,20 @@ import { Plus, Trash, Edit, Save } from "lucide-react";
import { Card } from "@/components/ui/card";

// Default activity data structure
const defaultActivities = [

interface Activity {
id: string
title: string
shortDescription: string
description: string
duration: string
frequency: string
participants: string
tags: string[]
}

const defaultActivities: Activity[] = [

{
id: "1",
title: "Robotics Workshop",
Expand All @@ -24,8 +37,10 @@ const defaultActivities = [

const ActivitiesEditor = () => {
const { toast } = useToast();
const [activities, setActivities] = useState(defaultActivities);
const [newActivity, setNewActivity] = useState({

const [activities, setActivities] = useState<Activity[]>(defaultActivities);
const [newActivity, setNewActivity] = useState<Activity>({

id: "",
title: "",
shortDescription: "",
Expand Down Expand Up @@ -84,9 +99,11 @@ const ActivitiesEditor = () => {

const handleUpdateActivity = () => {
if (!editingId) return;

setActivities(prev =>
prev.map(activity =>


setActivities(prev =>
prev.map(activity =>

activity.id === editingId ? newActivity : activity
)
);
Expand All @@ -103,12 +120,15 @@ const ActivitiesEditor = () => {
});
};

const handleEditActivity = (activity) => {

const handleEditActivity = (activity: Activity) => {

setNewActivity(activity);
setEditingId(activity.id);
};

const handleRemoveActivity = (id) => {
const handleRemoveActivity = (id: string) => {

setActivities(prev => prev.filter(activity => activity.id !== id));
if (editingId === id) {
setEditingId(null);
Expand All @@ -135,7 +155,9 @@ const ActivitiesEditor = () => {
}
};

const handleRemoveTag = (index) => {

const handleRemoveTag = (index: number) => {

setNewActivity(prev => ({
...prev,
tags: prev.tags.filter((_, i) => i !== index)
Expand Down Expand Up @@ -251,8 +273,10 @@ const ActivitiesEditor = () => {
<Button onClick={handleUpdateActivity} className="flex-1">
<Save className="h-4 w-4 mr-2" /> Update Activity
</Button>
<Button
variant="outline"

<Button
variant="outline"

onClick={() => {
setEditingId(null);
setNewActivity({
Expand Down Expand Up @@ -280,7 +304,8 @@ const ActivitiesEditor = () => {

<div className="space-y-4">
<h3 className="text-lg font-medium">Current Activities</h3>



{activities.length === 0 ? (
<p className="text-gray-500 italic">No activities added yet.</p>
) : (
Expand All @@ -296,10 +321,12 @@ const ActivitiesEditor = () => {
<div className="p-4 space-y-4">
<p className="text-sm font-medium">Short Description:</p>
<p className="text-sm text-gray-600 mb-2">{activity.shortDescription}</p>



<p className="text-sm font-medium">Full Description:</p>
<p className="text-sm text-gray-600 mb-2">{activity.description}</p>



<div className="grid grid-cols-3 gap-4">
<div>
<p className="text-sm font-medium">Duration:</p>
Expand All @@ -314,7 +341,9 @@ const ActivitiesEditor = () => {
<p className="text-sm text-gray-600">{activity.participants}</p>
</div>
</div>




{activity.tags && activity.tags.length > 0 && (
<div>
<p className="text-sm font-medium">Tags:</p>
Expand All @@ -327,17 +356,20 @@ const ActivitiesEditor = () => {
</div>
</div>
)}



<div className="flex gap-2 justify-end">
<Button
size="sm"
<Button
size="sm"

variant="outline"
onClick={() => handleEditActivity(activity)}
>
<Edit className="h-4 w-4 mr-1" /> Edit
</Button>
<Button
size="sm"
<Button
size="sm"

variant="destructive"
onClick={() => handleRemoveActivity(activity.id)}
>
Expand All @@ -350,7 +382,8 @@ const ActivitiesEditor = () => {
))}
</Accordion>
)}



<Button onClick={handleSaveAll} className="w-full mt-4">
<Save className="h-4 w-4 mr-2" /> Save All Changes
</Button>
Expand Down
83 changes: 60 additions & 23 deletions src/components/admin/TeamEditor.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,22 @@ import { Plus, Trash, Edit, Save, User } from "lucide-react";
import { Card } from "@/components/ui/card";

// Default team members data structure
const defaultTeamMembers = [


interface Team {
id: string
firstName: string
lastName: string
role: string
bio: string
imageUrl: string
email: string
github: string
linkedin: string
}

const defaultTeamMembers: Team[] = [

{
id: "1",
firstName: "John",
Expand All @@ -25,8 +40,10 @@ const defaultTeamMembers = [

const TeamEditor = () => {
const { toast } = useToast();
const [teamMembers, setTeamMembers] = useState(defaultTeamMembers);
const [newMember, setNewMember] = useState({

const [teamMembers, setTeamMembers] = useState<Team[]>(defaultTeamMembers);
const [newMember, setNewMember] = useState<Team>({

id: "",
firstName: "",
lastName: "",
Expand Down Expand Up @@ -86,9 +103,11 @@ const TeamEditor = () => {

const handleUpdateMember = () => {
if (!editingId) return;

setTeamMembers(prev =>
prev.map(member =>


setTeamMembers(prev =>
prev.map(member =>

member.id === editingId ? newMember : member
)
);
Expand All @@ -106,12 +125,16 @@ const TeamEditor = () => {
});
};

const handleEditMember = (member) => {

const handleEditMember = (member: Team) => {

setNewMember(member);
setEditingId(member.id);
};

const handleRemoveMember = (id) => {

const handleRemoveMember = (id: string) => {

setTeamMembers(prev => prev.filter(member => member.id !== id));
if (editingId === id) {
setEditingId(null);
Expand Down Expand Up @@ -227,8 +250,9 @@ const TeamEditor = () => {
<Button onClick={handleUpdateMember} className="flex-1">
<Save className="h-4 w-4 mr-2" /> Update Member
</Button>
<Button
variant="outline"

<Button
variant="outline"
onClick={() => {
setEditingId(null);
setNewMember({
Expand Down Expand Up @@ -257,7 +281,9 @@ const TeamEditor = () => {

<div className="space-y-4">
<h3 className="text-lg font-medium">Current Team Members</h3>




{teamMembers.length === 0 ? (
<p className="text-gray-500 italic">No team members added yet.</p>
) : (
Expand All @@ -277,16 +303,20 @@ const TeamEditor = () => {
<div className="p-4 space-y-4">
<div className="flex gap-4">
{member.imageUrl && (
<img
src={member.imageUrl}
alt={`${member.firstName} ${member.lastName}`}

<img
src={member.imageUrl}
alt={`${member.firstName} ${member.lastName}`}

className="w-24 h-24 object-cover rounded-full"
/>
)}
<div className="flex-1">
<p className="text-sm font-medium">Bio:</p>
<p className="text-sm text-gray-600 mb-2">{member.bio || "No bio provided"}</p>




<div className="grid grid-cols-1 md:grid-cols-2 gap-2">
<div>
<p className="text-sm font-medium">Email:</p>
Expand All @@ -300,7 +330,9 @@ const TeamEditor = () => {
)}
</p>
</div>




<div>
<p className="text-sm font-medium">GitHub:</p>
<p className="text-sm text-gray-600 truncate">
Expand All @@ -313,7 +345,8 @@ const TeamEditor = () => {
)}
</p>
</div>



<div>
<p className="text-sm font-medium">LinkedIn:</p>
<p className="text-sm text-gray-600 truncate">
Expand All @@ -329,17 +362,21 @@ const TeamEditor = () => {
</div>
</div>
</div>



<div className="flex gap-2 justify-end">
<Button
size="sm"
<Button
size="sm"

variant="outline"
onClick={() => handleEditMember(member)}
>
<Edit className="h-4 w-4 mr-1" /> Edit
</Button>
<Button
size="sm"

<Button
size="sm"

variant="destructive"
onClick={() => handleRemoveMember(member.id)}
>
Expand All @@ -352,7 +389,7 @@ const TeamEditor = () => {
))}
</Accordion>
)}

<Button onClick={handleSaveAll} className="w-full mt-4">
<Save className="h-4 w-4 mr-2" /> Save All Changes
</Button>
Expand Down
Loading