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
302 changes: 302 additions & 0 deletions docs/jobs-page-frontend.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,302 @@
# Page Jobs - Documentation Frontend

## 📋 Vue d'ensemble

Cette implémentation front-end répond au ticket de création de la page "Jobs" pour le site .NET Cameroon. Elle offre une expérience complète de consultation et de soumission d'offres d'emploi.

## ✅ Fonctionnalités implémentées

### 1. Page principale `/jobs`
**Fichier**: `src\app\Components\Pages\Jobs.razor`

#### Caractéristiques:
- ✅ **Barre de recherche** avec filtrage en temps réel par:
- Mot-clé (titre, entreprise, compétences)
- Localisation (Douala, Yaoundé, Remote, International)
- Type de contrat (Full-time, Part-time, Contract, Freelance, Internship)

- ✅ **Affichage des filtres actifs** avec possibilité de les supprimer individuellement
- ✅ **Deux modes d'affichage**: Grid (grille) et List (liste)
- ✅ **Compteur de résultats**: Affiche le nombre d'offres trouvées
- ✅ **Message "Coming Soon"** quand aucune offre n'est disponible avec liens vers Discord et LinkedIn
- ✅ **Bouton "Post a Job"** dans le hero section et la section CTA
- ✅ **Cartes d'offres d'emploi** avec:
- Titre du poste
- Entreprise
- Type de contrat
- Localisation
- Date de publication
- Salaire (si disponible)
- Compétences requises
- Description courte
- Bouton "View Details"

#### Navigation:
- Accessible via le header (NavBar)
- Accessible via le footer
- Route: `/jobs`

---

### 2. Page de détails `/jobs/{jobId}`
**Fichier**: `src\app\Components\Pages\JobDetails.razor`

#### Caractéristiques:
- ✅ **Informations complètes** sur l'offre:
- Titre et entreprise
- Type, localisation, date de publication
- Salaire
- Description détaillée
- Responsabilités
- Exigences
- Avantages

- ✅ **Sidebar avec**:
- Bouton "Apply Now" (lien externe) ou "Send Application" (email)
- Date limite de candidature
- Email de contact
- Boutons de partage (LinkedIn, Twitter)
- Bouton "Copy Link"
- Informations sur l'entreprise

- ✅ **Section "Similar Opportunities"**: Affiche 3 offres similaires
- ✅ **Bouton retour** vers la liste des jobs
- ✅ **Page 404** si l'offre n'existe pas

#### Navigation:
- Depuis la page `/jobs` en cliquant sur "View Details"
- Route: `/jobs/{jobId}`

---

### 3. Formulaire de soumission `/jobs/submit`
**Fichier**: `src\app\Components\Pages\JobSubmit.razor`

#### Caractéristiques:
- ✅ **Formulaire complet** avec validation:

**Section 1 - Informations entreprise:**
- Nom de l'entreprise (requis)
- Site web (optionnel)
- Description (requis)

**Section 2 - Détails du poste:**
- Titre du poste (requis)
- Localisation (requis, liste déroulante)
- Type de contrat (requis, liste déroulante)
- Fourchette de salaire (optionnel)
- Description détaillée (requis, min 100 caractères)
- Compétences requises (requis, séparées par des virgules)
- Responsabilités (requis, une par ligne)
- Exigences (requis, une par ligne)
- Avantages (optionnel, un par ligne)

**Section 3 - Informations de candidature:**
- Email de contact (requis)
- URL de candidature (optionnel)
- Date limite (requis)

- ✅ **Validation des champs**:
- Champs obligatoires
- Email valide
- URL valide
- Description minimale de 100 caractères
- Acceptation des conditions d'utilisation

- ✅ **Messages d'erreur** clairs
- ✅ **État de soumission** avec spinner
- ✅ **Page de confirmation** après soumission réussie
- ✅ **Possibilité de soumettre une autre offre**
- ✅ **Bouton d'annulation**

#### Navigation:
- Depuis le hero section de `/jobs`
- Depuis la section CTA de `/jobs`
- Route: `/jobs/submit`

---

### 4. Composant réutilisable `JobCard`
**Fichier**: `src\app\Components\Components\JobCard.razor`

#### Caractéristiques:
- ✅ Composant Blazor réutilisable
- ✅ Paramètres configurables:
- Title (requis)
- Company (requis)
- Type, Location, PostedDate
- Salary, Skills, Description
- JobUrl ou OnClick callback
- AdditionalClasses pour personnalisation
- MaxSkillsToShow (par défaut 5)

- ✅ Affichage intelligent des compétences avec "+X more"
- ✅ Support des liens et des événements click

---

## 🎨 Design et UX

### Responsive Design
- ✅ **Mobile-first**: Layout adapté aux petits écrans
- ✅ **Breakpoints**:
- Mobile: 1 colonne
- Tablet (md): 2 colonnes
- Desktop (lg): 3 colonnes
- ✅ **Menu hamburger** sur mobile
- ✅ **Filtres adaptés** sur mobile (en colonne)

### Cohérence visuelle
- ✅ Utilise **Tailwind CSS** comme le reste du site
- ✅ Couleurs cohérentes avec la charte graphique:
- Primary: Bleu principal
- Secondary: Couleur secondaire
- Gray: Nuances de gris
- ✅ **Icons FontAwesome** partout
- ✅ **Animations** et transitions douces

### Accessibilité
- ✅ Labels pour tous les champs de formulaire
- ✅ Attributs ARIA appropriés
- ✅ Contraste des couleurs conforme
- ✅ Navigation au clavier possible

---

## 🔄 Intégration avec le site

### Navigation ajoutée
1. **Header (NavBar.razor)**:
- ✅ Lien "Jobs" dans la navigation desktop
- ✅ Lien "Jobs" dans le menu mobile

2. **Footer (Footer.razor)**:
- ✅ Lien "Jobs" dans la section navigation

### Meta tags SEO
- ✅ **Page Jobs**: Meta description, Open Graph, Twitter Card
- ✅ **Page Details**: Meta dynamiques selon l'offre
- ✅ **Page Submit**: Meta de base

---

## 📊 État actuel

### Données
- 🔄 **Mode démonstration**: Utilise des données d'exemple statiques
- 🔄 **Prêt pour l'API**: Structure en place pour intégrer un backend

### Filtrage
- ✅ **Fonctionnel en frontend**: Filtrage en temps réel sur les données locales
- ✅ **Recherche textuelle**: Par titre, entreprise, compétences
- ✅ **Filtres multiples**: Localisation + Type + Recherche

### Soumission
- ✅ **Validation complète** des formulaires
- 🔄 **Simulation d'API**: Utilise `Task.Delay` pour simuler l'envoi
- 🔄 **Prêt pour intégration**: Code commenté pour appel API réel

---

## 🚀 Prochaines étapes (Backend)

Pour rendre la page complètement fonctionnelle, il faudra :

### Phase 1 - Backend API
1. Créer le modèle `Job` dans `app.domain`
2. Créer `IJobService` dans `app.business`
3. Implémenter `JobService` dans `app.infrastructure`
4. Créer les endpoints API dans `app/Api/Jobs`
5. Ajouter Entity Framework DbSet

### Phase 2 - Intégration Frontend
1. Remplacer les données statiques par des appels API
2. Implémenter la recherche côté serveur
3. Connecter le formulaire de soumission à l'API
4. Ajouter la gestion des erreurs réseau

### Phase 3 - Administration
1. Créer les pages admin pour gérer les jobs
2. Ajouter la modération des offres
3. Implémenter les notifications email
4. Ajouter un dashboard admin

### Phase 4 - Fonctionnalités avancées
1. Système de candidature intégré
2. Profils recruteurs
3. Statistiques des offres
4. Alertes email pour les nouveaux jobs

---

## 📁 Fichiers créés

```
src\app\Components\Pages\
├── Jobs.razor # Page principale liste des jobs
├── JobDetails.razor # Page de détails d'une offre
└── JobSubmit.razor # Formulaire de soumission

src\app\Components\Components\
└── JobCard.razor # Composant réutilisable carte job

src\app\Components\Components\
├── NavBar.razor # Modifié: ajout lien Jobs
└── Footer.razor # Modifié: ajout lien Jobs

src\app.domain\Models\JobAggregate\Enums\
└── JobType.cs # Enum pour les types de contrat
```

---

## ✅ Critères de réussite du ticket

| Critère | Statut | Notes |
|---------|--------|-------|
| Page accessible depuis le menu principal | ✅ | Dans NavBar et Footer |
| Liste des offres avec toutes les infos | ✅ | Titre, entreprise, localisation, type, date, skills |
| Bouton "Postuler" ou "Voir détails" | ✅ | Lien vers page de détails |
| Filtrage par mot-clé | ✅ | Recherche temps réel |
| Filtrage par localisation | ✅ | Select avec options |
| Filtrage par type de contrat | ✅ | Select avec options |
| Formulaire de publication | ✅ | Formulaire complet avec validation |
| Champs obligatoires validés | ✅ | Validation frontend + messages d'erreur |
| Responsive mobile et desktop | ✅ | Mobile-first, breakpoints définis |
| Modération (prévu) | 🔄 | Structure prête, nécessite backend |
| Ajout/modification/suppression admin | 🔄 | Nécessite pages admin backend |

**Légende**: ✅ Implémenté | 🔄 En attente backend | ❌ Non fait

---

## 💡 Points d'amélioration futurs

1. **Internationalisation**: Ajouter les traductions FR/EN
2. **Sauvegarde des recherches**: Permettre de sauvegarder les critères
3. **Alertes email**: Notification pour les nouveaux jobs correspondants
4. **Système de favoris**: Sauvegarder les offres intéressantes
5. **Candidature directe**: Formulaire de candidature intégré
6. **Statistiques**: Nombre de vues, candidatures par offre
7. **Export PDF**: Générer PDF de l'offre
8. **Partage avancé**: WhatsApp, Telegram, etc.

---

## 🎯 Résumé

Cette implémentation front-end est **complète et fonctionnelle** pour la partie interface utilisateur. Elle offre une excellente expérience utilisateur avec :

- ✅ Navigation intuitive
- ✅ Recherche et filtrage performants
- ✅ Design responsive et moderne
- ✅ Validation des formulaires
- ✅ Messages d'état clairs
- ✅ Structure prête pour l'intégration backend

Le ticket peut être considéré comme **complété à 70%** pour la partie frontend, avec une base solide prête à recevoir le backend.

---

**Branch**: `feature/jobs-page`
**Statut**: ✅ Front-end complet - ⏳ Backend à implémenter
10 changes: 10 additions & 0 deletions src/app.domain/Models/JobAggregate/Enums/JobType.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
namespace app.domain.Models.JobAggregate.Enums;

public enum JobType
{
FullTime,
PartTime,
Contract,
Freelance,
Internship
}
6 changes: 6 additions & 0 deletions src/app/Components/Components/Footer.razor
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,12 @@
<li class="flex w-fit items-center hover:translate-x-2 transition-all">
<a data-enhance-nav="false" href="/events" class="py-1" aria-label="Events">@L["Footer_Events"]</a>
</li>
<li class="flex w-fit items-center hover:translate-x-2 transition-all">
<a data-enhance-nav="false" href="/jobs" class="py-1 flex items-center gap-2" aria-label="Jobs">
Jobs
<span class="text-[10px] py-1 px-2 rounded-full bg-primary text-white">Soon</span>
</a>
</li>
<li class="flex w-fit items-center hover:translate-x-2 transition-all">
<a data-enhance-nav="false" href="/" class="py-1" aria-label="About">@L["Footer_About"] <span class="ml-2 text-[10px] py-1 px-2 rounded-full bg-primary text-white">@L["Footer_Soon"]</span></a>
</li>
Expand Down
Loading
Loading