453 lines
24 KiB
TypeScript
453 lines
24 KiB
TypeScript
"use client";
|
|
|
|
import React, { useState } from "react";
|
|
import {
|
|
Tabs,
|
|
TabsContent,
|
|
TabsList,
|
|
TabsTrigger
|
|
} from "../ui/tabs";
|
|
import { Input } from "../ui/input";
|
|
import { Button } from "../ui/button";
|
|
import { Textarea } from "../ui/textarea";
|
|
import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "../ui/select";
|
|
import { Checkbox } from "../ui/checkbox";
|
|
import {
|
|
Card,
|
|
CardContent
|
|
} from "../ui/card";
|
|
import { Badge } from "../ui/badge";
|
|
import { X } from "lucide-react";
|
|
|
|
export function MissionsAdminPanel() {
|
|
const [selectedServices, setSelectedServices] = useState<string[]>([]);
|
|
const [selectedProfils, setSelectedProfils] = useState<string[]>([]);
|
|
|
|
return (
|
|
<div className="w-full">
|
|
<Card className="border shadow-sm bg-white">
|
|
<CardContent className="pt-6">
|
|
<Tabs defaultValue="general" className="w-full">
|
|
<TabsList className="mb-4 bg-gray-100">
|
|
<TabsTrigger value="general" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">General</TabsTrigger>
|
|
<TabsTrigger value="details" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">Details</TabsTrigger>
|
|
<TabsTrigger value="attachments" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">Attachments</TabsTrigger>
|
|
<TabsTrigger value="skills" className="data-[state=active]:bg-blue-600 data-[state=active]:text-white">Skills</TabsTrigger>
|
|
</TabsList>
|
|
|
|
<TabsContent value="general" className="space-y-6">
|
|
<div className="space-y-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Nom de la Mission</label>
|
|
<Input placeholder="Project title" className="bg-white border-gray-300" />
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Logo</label>
|
|
<div className="border border-dashed rounded-md p-6 text-center bg-gray-50">
|
|
<Button variant="outline" className="mb-2 bg-white text-gray-700 border-gray-300 hover:bg-gray-50">Browse</Button>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">ODD scope</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select ODD scope" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="odd-1">1. Pas de pauvreté</SelectItem>
|
|
<SelectItem value="odd-2">2. Faim "zéro"</SelectItem>
|
|
<SelectItem value="odd-3">3. Bonne santé et bien-être</SelectItem>
|
|
<SelectItem value="odd-4">4. Éducation de qualité</SelectItem>
|
|
<SelectItem value="odd-5">5. Égalité entre les sexes</SelectItem>
|
|
<SelectItem value="odd-6">6. Eau propre et assainissement</SelectItem>
|
|
<SelectItem value="odd-7">7. Énergie propre et d'un coût abordable</SelectItem>
|
|
<SelectItem value="odd-8">8. Travail décent et croissance économique</SelectItem>
|
|
<SelectItem value="odd-9">9. Industrie, innovation et infrastructure</SelectItem>
|
|
<SelectItem value="odd-10">10. Inégalités réduites</SelectItem>
|
|
<SelectItem value="odd-11">11. Villes et communautés durables</SelectItem>
|
|
<SelectItem value="odd-12">12. Consommation et production responsables</SelectItem>
|
|
<SelectItem value="odd-13">13. Mesures relatives à la lutte contre les changements climatiques</SelectItem>
|
|
<SelectItem value="odd-14">14. Vie aquatique</SelectItem>
|
|
<SelectItem value="odd-15">15. Vie terrestre</SelectItem>
|
|
<SelectItem value="odd-16">16. Paix, justice et institutions efficaces</SelectItem>
|
|
<SelectItem value="odd-17">17. Partenariats pour la réalisation des objectifs</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Niveau</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select niveau" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="a">A- Apprentissage</SelectItem>
|
|
<SelectItem value="b">B- Basique</SelectItem>
|
|
<SelectItem value="c">C- Complex</SelectItem>
|
|
<SelectItem value="s">S- Spécial</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Intention</label>
|
|
<div className="border rounded-md border-gray-300">
|
|
<div className="bg-gray-50 p-2 border-b flex items-center space-x-2">
|
|
<span className="text-gray-700">Paragraphe</span>
|
|
<div className="flex items-center space-x-1">
|
|
<Button variant="ghost" size="icon" className="h-8 w-8 text-gray-700">B</Button>
|
|
<Button variant="ghost" size="icon" className="h-8 w-8 text-gray-700">I</Button>
|
|
<Button variant="ghost" size="icon" className="h-8 w-8 text-gray-700">•</Button>
|
|
<Button variant="ghost" size="icon" className="h-8 w-8 text-gray-700">1.</Button>
|
|
<Button variant="ghost" size="icon" className="h-8 w-8 text-gray-700">"</Button>
|
|
</div>
|
|
</div>
|
|
<Textarea className="min-h-[200px] border-0 bg-white" />
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="details" className="space-y-6">
|
|
<div className="space-y-4">
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Type de mission</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select location type" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="remote">Remote</SelectItem>
|
|
<SelectItem value="onsite">On Site</SelectItem>
|
|
<SelectItem value="hybrid">Hybrid</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Donneur d'ordre</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select volunteer type" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="individual">Individual</SelectItem>
|
|
<SelectItem value="group">Group</SelectItem>
|
|
<SelectItem value="organization">Organization</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Projection</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select duration" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="short">Short Term (< 1 month)</SelectItem>
|
|
<SelectItem value="medium">Medium Term (1-3 months)</SelectItem>
|
|
<SelectItem value="long">Long Term (> 3 months)</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Services</label>
|
|
<div className="space-y-2">
|
|
<div className="flex flex-wrap gap-1 mb-2">
|
|
{selectedServices.map((service) => (
|
|
<Badge key={service} className="bg-blue-100 text-blue-800 hover:bg-blue-200 px-2 py-1">
|
|
{service}
|
|
<button
|
|
type="button"
|
|
onClick={() => setSelectedServices(selectedServices.filter(s => s !== service))}
|
|
className="ml-1 text-blue-600 hover:text-blue-800"
|
|
>
|
|
<X size={14} />
|
|
</button>
|
|
</Badge>
|
|
))}
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="gite"
|
|
checked={selectedServices.includes('Gite')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedServices([...selectedServices, 'Gite']);
|
|
} else {
|
|
setSelectedServices(selectedServices.filter(s => s !== 'Gite'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="gite" className="text-sm text-gray-700">Gite</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="artlab"
|
|
checked={selectedServices.includes('ArtLab')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedServices([...selectedServices, 'ArtLab']);
|
|
} else {
|
|
setSelectedServices(selectedServices.filter(s => s !== 'ArtLab'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="artlab" className="text-sm text-gray-700">ArtLab</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="calcul"
|
|
checked={selectedServices.includes('Calcul')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedServices([...selectedServices, 'Calcul']);
|
|
} else {
|
|
setSelectedServices(selectedServices.filter(s => s !== 'Calcul'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="calcul" className="text-sm text-gray-700">Calcul</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Participation</label>
|
|
<Select>
|
|
<SelectTrigger className="bg-white border-gray-300">
|
|
<SelectValue placeholder="Select participation" />
|
|
</SelectTrigger>
|
|
<SelectContent>
|
|
<SelectItem value="volontaire">Volontaire</SelectItem>
|
|
<SelectItem value="cooptation">Cooptation</SelectItem>
|
|
</SelectContent>
|
|
</Select>
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Location</label>
|
|
<Input placeholder="Enter location" className="bg-white border-gray-300" />
|
|
</div>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Language</label>
|
|
<Input placeholder="Enter language" className="bg-white border-gray-300" />
|
|
</div>
|
|
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Profils</label>
|
|
<div className="space-y-2">
|
|
<div className="flex flex-wrap gap-1 mb-2">
|
|
{selectedProfils.map((profil) => (
|
|
<Badge key={profil} className="bg-blue-100 text-blue-800 hover:bg-blue-200 px-2 py-1">
|
|
{profil}
|
|
<button
|
|
type="button"
|
|
onClick={() => setSelectedProfils(selectedProfils.filter(p => p !== profil))}
|
|
className="ml-1 text-blue-600 hover:text-blue-800"
|
|
>
|
|
<X size={14} />
|
|
</button>
|
|
</Badge>
|
|
))}
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="dataintelligence"
|
|
checked={selectedProfils.includes('DataIntelligence')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'DataIntelligence']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'DataIntelligence'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="dataintelligence" className="text-sm text-gray-700">DataIntelligence</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="expression"
|
|
checked={selectedProfils.includes('Expression')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'Expression']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'Expression'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="expression" className="text-sm text-gray-700">Expression</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="mediation"
|
|
checked={selectedProfils.includes('Mediation')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'Mediation']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'Mediation'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="mediation" className="text-sm text-gray-700">Mediation</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="investigation"
|
|
checked={selectedProfils.includes('Investigation')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'Investigation']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'Investigation'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="investigation" className="text-sm text-gray-700">Investigation</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="coding"
|
|
checked={selectedProfils.includes('Coding')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'Coding']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'Coding'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="coding" className="text-sm text-gray-700">Coding</label>
|
|
</div>
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox
|
|
id="lean"
|
|
checked={selectedProfils.includes('Lean')}
|
|
onCheckedChange={(checked) => {
|
|
if (checked) {
|
|
setSelectedProfils([...selectedProfils, 'Lean']);
|
|
} else {
|
|
setSelectedProfils(selectedProfils.filter(p => p !== 'Lean'));
|
|
}
|
|
}}
|
|
className="border-gray-300"
|
|
/>
|
|
<label htmlFor="lean" className="text-sm text-gray-700">Lean</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="attachments" className="space-y-6">
|
|
<div>
|
|
<label className="block text-sm font-medium mb-1 text-gray-700">Attachments</label>
|
|
<div className="border border-dashed rounded-md p-6 text-center bg-gray-50">
|
|
<Button variant="outline" className="mb-2 bg-white text-gray-700 border-gray-300 hover:bg-gray-50">Browse</Button>
|
|
<p className="text-sm text-gray-500">Upload file .pdf, .doc, .docx</p>
|
|
</div>
|
|
</div>
|
|
</TabsContent>
|
|
|
|
<TabsContent value="skills" className="space-y-6">
|
|
<div>
|
|
<div className="flex justify-between mb-4">
|
|
<h3 className="text-lg font-medium text-gray-700">Skills</h3>
|
|
<Button variant="outline" size="sm" className="bg-white text-gray-700 border-gray-300 hover:bg-gray-50">Select / Deselect All</Button>
|
|
</div>
|
|
|
|
<div className="grid grid-cols-1 md:grid-cols-3 gap-4">
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="photoshop" className="border-gray-300" />
|
|
<label htmlFor="photoshop" className="text-sm text-gray-700">Adobe Photoshop</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="xd" className="border-gray-300" />
|
|
<label htmlFor="xd" className="text-sm text-gray-700">Adobe XD</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="android" className="border-gray-300" />
|
|
<label htmlFor="android" className="text-sm text-gray-700">Android Developer</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="artist" className="border-gray-300" />
|
|
<label htmlFor="artist" className="text-sm text-gray-700">Artist</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="computer" className="border-gray-300" />
|
|
<label htmlFor="computer" className="text-sm text-gray-700">Computer</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="developer" className="border-gray-300" />
|
|
<label htmlFor="developer" className="text-sm text-gray-700">Developer</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="frontend" className="border-gray-300" />
|
|
<label htmlFor="frontend" className="text-sm text-gray-700">Front end Developer</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="ios" className="border-gray-300" />
|
|
<label htmlFor="ios" className="text-sm text-gray-700">iOS Developer</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="support" className="border-gray-300" />
|
|
<label htmlFor="support" className="text-sm text-gray-700">Support Agent</label>
|
|
</div>
|
|
|
|
<div className="flex items-center space-x-2">
|
|
<Checkbox id="writer" className="border-gray-300" />
|
|
<label htmlFor="writer" className="text-sm text-gray-700">Writer</label>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</TabsContent>
|
|
</Tabs>
|
|
|
|
<div className="mt-8 flex justify-end">
|
|
<Button className="bg-blue-600 hover:bg-blue-700 text-white">
|
|
Save & Preview
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" className="ml-2">
|
|
<line x1="5" y1="12" x2="19" y2="12"></line>
|
|
<polyline points="12 5 19 12 12 19"></polyline>
|
|
</svg>
|
|
</Button>
|
|
</div>
|
|
</CardContent>
|
|
</Card>
|
|
</div>
|
|
);
|
|
}
|