Merge branch 'main' of https://git.ieeeucsd.org/Webmaster/ieeeucsd-org
This commit is contained in:
commit
fb64e3421a
2 changed files with 28 additions and 35 deletions
|
@ -14,6 +14,11 @@ interface ResumeUser {
|
||||||
avatar?: string;
|
avatar?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function getResumeUrl(user: ResumeUser): string | undefined {
|
||||||
|
if (!user.resume) return undefined;
|
||||||
|
return `https://pocketbase.ieeeucsd.org/api/files/users/${user.id}/${user.resume}`;
|
||||||
|
}
|
||||||
|
|
||||||
export default function ResumeDetail() {
|
export default function ResumeDetail() {
|
||||||
const [user, setUser] = useState<ResumeUser | null>(null);
|
const [user, setUser] = useState<ResumeUser | null>(null);
|
||||||
const [loading, setLoading] = useState(false);
|
const [loading, setLoading] = useState(false);
|
||||||
|
@ -140,7 +145,7 @@ export default function ResumeDetail() {
|
||||||
<div className="bg-base-200 px-4 py-2 border-b border-base-300 flex justify-between items-center">
|
<div className="bg-base-200 px-4 py-2 border-b border-base-300 flex justify-between items-center">
|
||||||
<h3 className="font-medium">Resume</h3>
|
<h3 className="font-medium">Resume</h3>
|
||||||
<a
|
<a
|
||||||
href={user.resume}
|
href={getResumeUrl(user)}
|
||||||
target="_blank"
|
target="_blank"
|
||||||
rel="noopener noreferrer"
|
rel="noopener noreferrer"
|
||||||
className="btn btn-sm btn-primary"
|
className="btn btn-sm btn-primary"
|
||||||
|
@ -152,7 +157,15 @@ export default function ResumeDetail() {
|
||||||
{user.resume && user.resume.toLowerCase().endsWith('.pdf') ? (
|
{user.resume && user.resume.toLowerCase().endsWith('.pdf') ? (
|
||||||
<div className="aspect-[8.5/11] w-full">
|
<div className="aspect-[8.5/11] w-full">
|
||||||
<iframe
|
<iframe
|
||||||
src={`${user.resume}#toolbar=0&navpanes=0`}
|
src={`${getResumeUrl(user)}#toolbar=0&navpanes=0`}
|
||||||
|
className="w-full h-full border-0"
|
||||||
|
title={`${user.name}'s Resume`}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : user.resume && user.resume.toLowerCase().endsWith('.docx') ? (
|
||||||
|
<div className="aspect-[8.5/11] w-full">
|
||||||
|
<iframe
|
||||||
|
src={`https://view.officeapps.live.com/op/embed.aspx?src=${encodeURIComponent(getResumeUrl(user) ?? '')}`}
|
||||||
className="w-full h-full border-0"
|
className="w-full h-full border-0"
|
||||||
title={`${user.name}'s Resume`}
|
title={`${user.name}'s Resume`}
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -26,12 +26,12 @@ ChartJS.register(
|
||||||
|
|
||||||
// Define event types and their colors
|
// Define event types and their colors
|
||||||
const EVENT_TYPES = [
|
const EVENT_TYPES = [
|
||||||
{ name: 'Technical Workshop', color: 'rgba(54, 162, 235, 0.8)' },
|
{ name: 'Social', key: 'social', color: 'rgba(255, 99, 132, 0.8)' },
|
||||||
{ name: 'Social', color: 'rgba(255, 99, 132, 0.8)' },
|
{ name: 'Technical', key: 'technical', color: 'rgba(54, 162, 235, 0.8)' },
|
||||||
{ name: 'Professional Development', color: 'rgba(75, 192, 192, 0.8)' },
|
{ name: 'Outreach', key: 'outreach', color: 'rgba(255, 206, 86, 0.8)' },
|
||||||
{ name: 'Project Meeting', color: 'rgba(255, 206, 86, 0.8)' },
|
{ name: 'Professional', key: 'professional', color: 'rgba(75, 192, 192, 0.8)' },
|
||||||
{ name: 'Industry Talk', color: 'rgba(153, 102, 255, 0.8)' },
|
{ name: 'Projects', key: 'projects', color: 'rgba(153, 102, 255, 0.8)' },
|
||||||
{ name: 'Other', color: 'rgba(255, 159, 64, 0.8)' },
|
{ name: 'Other', key: 'other', color: 'rgba(255, 159, 64, 0.8)' },
|
||||||
];
|
];
|
||||||
|
|
||||||
export default function EventTypeDistribution() {
|
export default function EventTypeDistribution() {
|
||||||
|
@ -118,29 +118,12 @@ export default function EventTypeDistribution() {
|
||||||
return acc;
|
return acc;
|
||||||
}, {} as Record<string, number>);
|
}, {} as Record<string, number>);
|
||||||
|
|
||||||
|
// Count events by event_type field from schema
|
||||||
events.forEach(event => {
|
events.forEach(event => {
|
||||||
const eventName = event.event_name.toLowerCase();
|
const type = event.event_type && EVENT_TYPES.find(t => t.key === event.event_type) ? event.event_type : 'other';
|
||||||
const eventDesc = event.event_description.toLowerCase();
|
const typeObj = EVENT_TYPES.find(t => t.key === type);
|
||||||
|
if (typeObj) {
|
||||||
// Simple classification logic - in a real app, you'd have actual event types
|
eventTypeCount[typeObj.name]++;
|
||||||
if (eventName.includes('workshop') || eventDesc.includes('workshop')) {
|
|
||||||
eventTypeCount['Technical Workshop']++;
|
|
||||||
} else if (eventName.includes('social') || eventDesc.includes('social') ||
|
|
||||||
eventName.includes('mixer') || eventDesc.includes('mixer')) {
|
|
||||||
eventTypeCount['Social']++;
|
|
||||||
} else if (eventName.includes('professional') || eventDesc.includes('professional') ||
|
|
||||||
eventName.includes('resume') || eventDesc.includes('resume') ||
|
|
||||||
eventName.includes('career') || eventDesc.includes('career')) {
|
|
||||||
eventTypeCount['Professional Development']++;
|
|
||||||
} else if (eventName.includes('project') || eventDesc.includes('project') ||
|
|
||||||
eventName.includes('meeting') || eventDesc.includes('meeting')) {
|
|
||||||
eventTypeCount['Project Meeting']++;
|
|
||||||
} else if (eventName.includes('industry') || eventDesc.includes('industry') ||
|
|
||||||
eventName.includes('talk') || eventDesc.includes('talk') ||
|
|
||||||
eventName.includes('speaker') || eventDesc.includes('speaker')) {
|
|
||||||
eventTypeCount['Industry Talk']++;
|
|
||||||
} else {
|
|
||||||
eventTypeCount['Other']++;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -180,11 +163,8 @@ export default function EventTypeDistribution() {
|
||||||
tooltip: {
|
tooltip: {
|
||||||
callbacks: {
|
callbacks: {
|
||||||
label: function (context: any) {
|
label: function (context: any) {
|
||||||
const label = context.label || '';
|
// Only show the label, not the value
|
||||||
const value = context.raw || 0;
|
return context.label || '';
|
||||||
const total = context.dataset.data.reduce((a: number, b: number) => a + b, 0);
|
|
||||||
const percentage = Math.round((value / total) * 100);
|
|
||||||
return `${label}: ${value} (${percentage}%)`;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue