Spaces:
Running
crrez un tb web permettant de voir tous le personnel de ce syndicat sous forme de donnes crud pour permettre de saisir et ajouter et sup et mettre ajour les donnes du personnel du syndicat de la sante par wilaya suivant le fichier word joint بناء علي اجتماع رؤساء النقابات المهنية والكتب التنفيذي للاتحاد العام للعمل و الصحة في موريتانيا المنعقد في مقره المركزي يوم السبت الموافق 11 أكتوبر 2025 تم إقرار هذا الدليل الانتخابي الشامل و الذي سنيشر بالطرق الادارية ويعمل به بعد ان تم اقراره:
Browse filesهيكلة حملة التمثيلية النقابية :
أولا اللجنة المركزية لإدارة للحملة
1. الأمين العام للاتحاد الدكتور محمد المصطفى ولد إبراهيم
2. نقابة الأطباء الأخصائيين الموريتانيين
دكتور محمد اميه
3. النقابة الوطنية لعمال قطاع العمل الاجتماعي محمد الحسن الدوا 42047024
4. نقابة مهنيي العمل الاجتماعي البي محمد الأمين البراكة 43439164
5. النقابة العامة لاسلاك إدارة الشغل محمد محمد السالك اغربط 46889697
6. النقابة الوطنية لعمال مؤسسات التامين و الضمان الصحي بموريتانيا احمد بوسالف 42246060
7- نقابة مهنيي الممرضين والقابلات في موريتانيا
النقيب عبد الرحمن ولد حمود
8- النقابة الوطنية لصيادلة موريتانيا-
النقيب : د.سيديا ولد أحمدوا
9- نقابة فنيّي التخدير والإنعاش بموريتانيا
النقيب سيدي عالي محمد مدان
10- نقابة الأطباء العاميين الموريتانيين
النقيب، د.محمد الأمين ولد محمد محمود
11- نقابة الأطباء والصيادلة واطباء الأسنان الموريتانيين
عن النقيب د.محمد ولد أبات .
12- النقابة الوطنية لفنيي تكنولوجيا صناعة الأسنان
النقيب- أحمد ولد منان.
13- النقابة الوطنية لفنيي المختبر الطبي
النقيب يسلم ولد محمد ولد الداه.
14- النقابة الوطنية لأطباء الأسنان في موريتانيا ،
رئيس المجلس الوطني للنقابة د.أحمد ولد العالم
15- نقابة المهندسين والتقنيين لبيوطبيين الموريتانيين
النقيب المهندس اسحاق محمد سيديا
16- نقابة لبيولوجيين الطبيين الموريتانيين
النقيب محمد سالم محمد باب اليدالي.
17- النقابة الموريتانية للموظفين والوكلاء العقدويين في قطاع الصحة
الأمينة العامة ليلى محمد سالم أحميدات
18- نقابة الفنيين العاليين في الصحة
الأمين العام: حمزة محمدن ماماه
19- نقابة المقيمين الطبيين
الأمين العام: الدكتور يحي محمد الأمين الطالب دحمان
20- الكونفدرالية الموريتانية للشغيلة عالين ولد العيد 44305631
ثانيا: إدارة الحملة
المدير العام للحملة اندوم مامادو 44149462
المدير المساعد: عيشه محمد ابياه
المدير المساعد: البي عبد البركة
مسؤولة التنظيم واللوجستيك: ازوينة بنت الفيل
نائب لجنة اللوجستيك:
اللجنة الإعلامية:
الرئيس: حماده حبيب الخليفة
نائب الرئيس: عبد العزيز اظمين
نواكشوط الغربية
المندوب الجهوي:البكاي السالك يمبابه
عضوا: الدكتور محمد الأمين محمد محمود
عضوا: الدكتورة عدولة عبد الله
عضوا: مينة مولود
عضوا: ياسين امبودج
عضوا: خليهنا الحسن
عضوا: هاوا مالك
عضوا: دكتور زكريا محمد
عضوا: دكتور السعد ونا
عضوا: محمد محمد بابو
عضوا: توت محفوظ
عضوا: تومن اعمر
عضوا : مريم صمبيت
عضوا : سيد رمضان
عضوا : محمد عبد الله سيد محمد
السبخة
القسم الاسم رقم الهاتف
المركز الصحي بالسبخة خدي همت با 47772814
عاشورا جاكانا 46563263
ماء العينين تكدي 22739526
لكصر
القسم الاسم رقم الهاتف
المركز الصحي بلكصر سيد محمد 46437910
هاوي محمد قابلة 49839527
مركز الامومة والطفولة
القسم الاسم رقم الهاتف
حمزة ماماه 26868385
دكتورة ميمونة محمد الأمين طبيبة نساء وتوليد 48283448
دكتور السعد النا 41682060
ميمونة احمد زروق قابلة 22181704
بيبي حبيبنا جدو 27932169
عزة مامين 46514247
محمد الحسن الكوري 36055596
داداه همن الصبار 36087838
محمد مكي
ابوه جبريل
تفرغ زينة
مركز الاستطباب الوطني
القسم الاسم رقم الهاتف
سيد محمد الزين 36323748
الهادي العيد 36471219
محمد سالم اليدالي 22410960
الهادي سيد محمد 36333647
السالم فالي 22223031
احمد محمد فال 20640606
أمنة الشيخ 22484887
كبير مولود صمب 46712293
اسنيد اسنيد 36670278
عاليون محمد 22115282
خليهنا الحسن 22958243
المصطفي محمد يحي 44331725
دكتورة خاصه عبدو العزيز 22466814
خادجة المان 37160425
الانكولوجيا
القسم الاسم رقم الهاتف
محفوظ 34415161
مركز استطباب الانكولوجيا سيد ولد عبيد 22687524
محمد سالم احمد 47684179
مركز امراض القلب
القسم الاسم رقم الهاتف
مركز امراض القلب اندوم مامادو 44149462
سيد محمد ابي 46403211
بمب ابيطات 46108510
محمدن مدو 48543474
لالة اتراوري 22163037
اباه بياتي 49070791
سيد محمد اغريبي 46817337
لالة الحاج 46848483
سيد محمد نقابة فنيي التخدير والانعاش 22221245
صو ابوبكرن 49253045
خدجة محمد 36891414
دكتور حمود بلاله 37797184
مركز نقل الدم
القسم الاسم رقم الهاتف
مكفولة محمد 22267389
الشيخ اميده 22267386
الشيخ امحيمد 22463963
انالله محمد بوسحاب 2267389
دكتور ما دمبا 44271618
مركز التخصصات
القسم الاسم رقم الهاتف
صال عبد العزيز 46457463
فاما امبي 46744557
دكتور إسحاق احمد سالم 26338633
المركز الوطني لتنشيط الاعضاء
القسم الاسم رقم الهاتف
سيدينا يمهلو 36626017
مؤسسة العون الطبي الاستعجالي
القسم الاسم رقم الهاتف
محمد أبشاره
عبد العزيز اظمين
محمد الملقب لمعدل 46497941
محمذن ميلود احمدو 41293780
يعقوب محمد سالم 41637882
المدرسة العليا لعلوم الصحة
القسم الاسم رقم الهاتف
امبيغية بنت محمد يسلم 22431445
دكتور عبد الله اليماني 31313407
سيدنا بله
المعهد الوطني لأمراض للكبد والفيروسات
القسم الاسم رقم الهاتف
كان مامادو 46506814
دكتورة مريم لام 46705355
خدجة بنت حرمة معاوية 48287169
الشيخ بوي محمد الشيخ اصغير 41212928
الشيخ احمد ابي احمد 36245995
نفيسة سيد محمد بله 46404120
نانه ايده اسويلم 49802455
امنة بلال اعبيد 37841582
هاوي عمر ساكانوكو 33385709
كاميك
القسم الاسم رقم الهاتف
محمد محمود النادي
دكتور ميلود جدو 47109302
البخاري مختارحامد 22117036
ام الحسن مزيد 48491749
سيد محمد احمدو 46477377
الطالب محمد جودة
اكنام
القسم الاسم رقم الهاتف
احمد بوسالف 42246060
التراد بايو 49494919
مريم اصنيبه 47000016
غوتل محمد 22806490
يحي عبد الدائم 26885058
الهيبة البشير 33674645
محمد عبد الله جدو 36314085
انواكشوط الجنوبية
إدارة الحملة:
محمد الذهبي الملقب بوندو 46591999
ام المؤمنين اممد 22460194
دكتور التراد الشيخ 44499660
دكتور الشيخ وداد 36105880
دكتور أطول عمرو محمد موسي 22363433
محمد يحي محمد الكوري نقابة المهندسين لبيو طبيين 26698464
ماها صال 46722285
تابت إبراهيم 20479090
امانه الزاوي 49154824
فاطمة الخليل 30608282
الزبير مولود 44471743
الميناء
القسم الاسم رقم الهاتف
المركز الصحي بالميناء بنتا صو
اميمه قابلة 47490372
20199162
عرفات
القسم الاسم رقم الهاتف
المركز الصحي عرفات محمد محمد المصطفي 26492749
القسم الاسم رقم الهاتف
مستشفي الصداقة ام المؤمنين اممد
22460194
احمد اخيارهم 33377799
عيش فال
جبريل محمد نقابة فنيي التخدير
دديا مختار السالم نقابة فنيي المخبر 41140
- personnel.html +399 -0
|
@@ -0,0 +1,399 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="fr">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="UTF-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 6 |
+
<title>Gestion du Personnel - Syndicat de la Santé</title>
|
| 7 |
+
<link rel="icon" type="image/x-icon" href="/static/favicon.ico">
|
| 8 |
+
<script src="https://cdn.tailwindcss.com"></script>
|
| 9 |
+
<script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script>
|
| 10 |
+
<script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.iife.min.js"></script>
|
| 11 |
+
<script src="https://unpkg.com/feather-icons"></script>
|
| 12 |
+
<script src="https://cdn.jsdelivr.net/npm/sweetalert2@11"></script>
|
| 13 |
+
<style>
|
| 14 |
+
.fade-in {
|
| 15 |
+
animation: fadeIn 0.5s ease-in;
|
| 16 |
+
}
|
| 17 |
+
@keyframes fadeIn {
|
| 18 |
+
from { opacity: 0; transform: translateY(10px); }
|
| 19 |
+
to { opacity: 1; transform: translateY(0); }
|
| 20 |
+
}
|
| 21 |
+
.table-row:hover {
|
| 22 |
+
background-color: #f8fafc;
|
| 23 |
+
transform: translateY(-1px);
|
| 24 |
+
transition: all 0.2s ease;
|
| 25 |
+
}
|
| 26 |
+
</style>
|
| 27 |
+
</head>
|
| 28 |
+
<body class="bg-gray-50">
|
| 29 |
+
<!-- Navigation -->
|
| 30 |
+
<nav class="bg-blue-800 text-white shadow-lg">
|
| 31 |
+
<div class="container mx-auto px-4 py-3">
|
| 32 |
+
<div class="flex justify-between items-center">
|
| 33 |
+
<div class="flex items-center space-x-2">
|
| 34 |
+
<i data-feather="users" class="w-6 h-6"></i>
|
| 35 |
+
<span class="text-xl font-bold">Syndicat de la Santé - Mauritanie</span>
|
| 36 |
+
</div>
|
| 37 |
+
<div class="space-x-4">
|
| 38 |
+
<a href="index.html" class="hover:text-blue-200 transition-colors">Accueil</a>
|
| 39 |
+
<a href="personnel.html" class="bg-blue-700 px-3 py-1 rounded-lg">Personnel</a>
|
| 40 |
+
</div>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</nav>
|
| 44 |
+
|
| 45 |
+
<!-- Header -->
|
| 46 |
+
<div class="bg-white shadow-sm">
|
| 47 |
+
<div class="container mx-auto px-4 py-6">
|
| 48 |
+
<h1 class="text-3xl font-bold text-gray-800 mb-2">Gestion du Personnel par Wilaya</h1>
|
| 49 |
+
<p class="text-gray-600">Système CRUD pour la gestion des données du personnel du syndicat</p>
|
| 50 |
+
</div>
|
| 51 |
+
</div>
|
| 52 |
+
|
| 53 |
+
<!-- Main Content -->
|
| 54 |
+
<div class="container mx-auto px-4 py-8">
|
| 55 |
+
<!-- Filters and Actions -->
|
| 56 |
+
<div class="mb-6 flex flex-col lg:flex-row gap-4 justify-between items-start lg:items-center">
|
| 57 |
+
<div class="flex flex-col sm:flex-row gap-3">
|
| 58 |
+
<select id="wilayaFilter" class="px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 59 |
+
<option value="">Toutes les wilayas</option>
|
| 60 |
+
<option value="nouakchott">Nouakchott</option>
|
| 61 |
+
<option value="hodh_chargui">Hodh Chargui</option>
|
| 62 |
+
<option value="hodh_gharbi">Hodh Gharbi</option>
|
| 63 |
+
<option value="assaba">Assaba</option>
|
| 64 |
+
<option value="gorgol">Gorgol</option>
|
| 65 |
+
<option value="guidimakha">Guidimakha</option>
|
| 66 |
+
<option value="tagant">Tagant</option>
|
| 67 |
+
<option value="brakna">Brakna</option>
|
| 68 |
+
<option value="trarza">Trarza</option>
|
| 69 |
+
<option value="adrar">Adrar</option>
|
| 70 |
+
<option value="dakhlet_nouadhibou">Dakhlet Nouadhibou</option>
|
| 71 |
+
<option value="inchiri">Inchiri</option>
|
| 72 |
+
</select>
|
| 73 |
+
<input type="text" id="searchInput" placeholder="Rechercher par nom, poste..." class="px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full sm:w-64">
|
| 74 |
+
</div>
|
| 75 |
+
<button onclick="openAddModal()" class="bg-green-600 hover:bg-green-700 text-white px-4 py-2 rounded-lg flex items-center gap-2 transition-colors">
|
| 76 |
+
<i data-feather="plus" class="w-4 h-4"></i>
|
| 77 |
+
Ajouter un membre
|
| 78 |
+
</button>
|
| 79 |
+
</div>
|
| 80 |
+
|
| 81 |
+
<!-- Personnel Table -->
|
| 82 |
+
<div class="bg-white rounded-lg shadow overflow-hidden fade-in">
|
| 83 |
+
<div class="overflow-x-auto">
|
| 84 |
+
<table class="min-w-full divide-y divide-gray-200">
|
| 85 |
+
<thead class="bg-gray-50">
|
| 86 |
+
<tr>
|
| 87 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
| 88 |
+
Nom & Prénom
|
| 89 |
+
</th>
|
| 90 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
| 91 |
+
Poste/Rôle
|
| 92 |
+
</th>
|
| 93 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
| 94 |
+
Wilaya
|
| 95 |
+
</th>
|
| 96 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
| 97 |
+
Téléphone
|
| 98 |
+
</th>
|
| 99 |
+
<th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">
|
| 100 |
+
Actions
|
| 101 |
+
</th>
|
| 102 |
+
</tr>
|
| 103 |
+
</thead>
|
| 104 |
+
<tbody id="personnelTable" class="bg-white divide-y divide-gray-200">
|
| 105 |
+
<!-- Data will be populated by JavaScript -->
|
| 106 |
+
</tbody>
|
| 107 |
+
</table>
|
| 108 |
+
</div>
|
| 109 |
+
</div>
|
| 110 |
+
|
| 111 |
+
<!-- Empty State -->
|
| 112 |
+
<div id="emptyState" class="hidden text-center py-12">
|
| 113 |
+
<i data-feather="users" class="w-16 h-16 text-gray-400 mx-auto mb-4"></i>
|
| 114 |
+
<h3 class="text-lg font-medium text-gray-900 mb-2">Aucun membre trouvé</h3>
|
| 115 |
+
<p class="text-gray-500 mb-4">Aucun membre ne correspond à vos critères de recherche.</p>
|
| 116 |
+
<button onclick="openAddModal()" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg inline-flex items-center gap-2">
|
| 117 |
+
<i data-feather="plus" class="w-4 h-4"></i>
|
| 118 |
+
Ajouter le premier membre
|
| 119 |
+
</button>
|
| 120 |
+
</div>
|
| 121 |
+
</div>
|
| 122 |
+
|
| 123 |
+
<!-- Add/Edit Modal -->
|
| 124 |
+
<div id="personnelModal" class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-50 hidden">
|
| 125 |
+
<div class="relative top-20 mx-auto p-5 border w-full max-w-2xl shadow-lg rounded-lg bg-white">
|
| 126 |
+
<div class="flex justify-between items-center mb-4">
|
| 127 |
+
<h3 id="modalTitle" class="text-xl font-bold text-gray-800">Ajouter un membre</h3>
|
| 128 |
+
<button onclick="closeModal()" class="text-gray-400 hover:text-gray-600">
|
| 129 |
+
<i data-feather="x" class="w-6 h-6"></i>
|
| 130 |
+
</button>
|
| 131 |
+
</div>
|
| 132 |
+
|
| 133 |
+
<form id="personnelForm" class="space-y-4">
|
| 134 |
+
<input type="hidden" id="editId">
|
| 135 |
+
|
| 136 |
+
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
| 137 |
+
<div>
|
| 138 |
+
<label for="nom" class="block text-sm font-medium text-gray-700 mb-1">Nom complet *</label>
|
| 139 |
+
<input type="text" id="nom" required class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 140 |
+
</div>
|
| 141 |
+
|
| 142 |
+
<div>
|
| 143 |
+
<label for="poste" class="block text-sm font-medium text-gray-700 mb-1">Poste/Rôle *</label>
|
| 144 |
+
<input type="text" id="poste" required class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 145 |
+
</div>
|
| 146 |
+
|
| 147 |
+
<div>
|
| 148 |
+
<label for="wilaya" class="block text-sm font-medium text-gray-700 mb-1">Wilaya *</label>
|
| 149 |
+
<select id="wilaya" required class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 150 |
+
<option value="">Sélectionner une wilaya</option>
|
| 151 |
+
<option value="nouakchott">Nouakchott</option>
|
| 152 |
+
<option value="hodh_chargui">Hodh Chargui</option>
|
| 153 |
+
<option value="hodh_gharbi">Hodh Gharbi</option>
|
| 154 |
+
<option value="assaba">Assaba</option>
|
| 155 |
+
<option value="gorgol">Gorgol</option>
|
| 156 |
+
<option value="guidimakha">Guidimakha</option>
|
| 157 |
+
<option value="tagant">Tagant</option>
|
| 158 |
+
<option value="brakna">Brakna</option>
|
| 159 |
+
<option value="trarza">Trarza</option>
|
| 160 |
+
<option value="adrar">Adrar</option>
|
| 161 |
+
<option value="dakhlet_nouadhibou">Dakhlet Nouadhibou</option>
|
| 162 |
+
<option value="inchiri">Inchiri</option>
|
| 163 |
+
</select>
|
| 164 |
+
</div>
|
| 165 |
+
|
| 166 |
+
<div>
|
| 167 |
+
<label for="telephone" class="block text-sm font-medium text-gray-700 mb-1">Téléphone</label>
|
| 168 |
+
<input type="tel" id="telephone" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 169 |
+
</div>
|
| 170 |
+
|
| 171 |
+
<div class="md:col-span-2">
|
| 172 |
+
<label for="email" class="block text-sm font-medium text-gray-700 mb-1">Email</label>
|
| 173 |
+
<input type="email" id="email" class="w-full px-3 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500">
|
| 174 |
+
</div>
|
| 175 |
+
</div>
|
| 176 |
+
|
| 177 |
+
<div class="flex justify-end space-x-3 pt-4">
|
| 178 |
+
<button type="button" onclick="closeModal()" class="px-4 py-2 text-gray-700 border border-gray-300 rounded-lg hover:bg-gray-50 transition-colors">
|
| 179 |
+
Annuler
|
| 180 |
+
</button>
|
| 181 |
+
<button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-lg transition-colors">
|
| 182 |
+
Enregistrer
|
| 183 |
+
</button>
|
| 184 |
+
</div>
|
| 185 |
+
</form>
|
| 186 |
+
</div>
|
| 187 |
+
</div>
|
| 188 |
+
|
| 189 |
+
<script>
|
| 190 |
+
// Sample data from the provided document
|
| 191 |
+
let personnelData = [
|
| 192 |
+
{ id: 1, nom: "الدكتور محمد المصطفى ولد إبراهيم", poste: "الأمين العام للاتحاد", wilaya: "nouakchott", telephone: "", email: "" },
|
| 193 |
+
{ id: 2, nom: "دكتور محمد اميه", poste: "نقابة الأطباء الأخصائيين الموريتانيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 194 |
+
{ id: 3, nom: "محمد الحسن الدوا", poste: "النقابة الوطنية لعمال قطاع العمل الاجتماعي", wilaya: "nouakchott", telephone: "42047024", email: "" },
|
| 195 |
+
{ id: 4, nom: "البي محمد الأمين البراكة", poste: "نقابة مهنيي العمل الاجتماعي", wilaya: "nouakchott", telephone: "43439164", email: "" },
|
| 196 |
+
{ id: 5, nom: "محمد محمد السالك اغربط", poste: "النقابة العامة لاسلاك إدارة الشغل", wilaya: "nouakchott", telephone: "46889697", email: "" },
|
| 197 |
+
{ id: 6, nom: "احمد بوسالف", poste: "النقابة الوطنية لعمال مؤسسات التامين و الضمان الصحي بموريتانيا", wilaya: "nouakchott", telephone: "42246060", email: "" },
|
| 198 |
+
{ id: 7, nom: "عبد الرحمن ولد حمود", poste: "نقابة مهنيي الممرضين والقابلات في موريتانيا", wilaya: "nouakchott", telephone: "", email: "" },
|
| 199 |
+
{ id: 8, nom: "د.سيديا ولد أحمدوا", poste: "النقابة الوطنية لصيادلة موريتانيا", wilaya: "nouakchott", telephone: "", email: "" },
|
| 200 |
+
{ id: 9, nom: "سيدي عالي محمد مدان", poste: "نقابة فنيّي التخدير والإنعاش بموريتانيا", wilaya: "nouakchott", telephone: "", email: "" },
|
| 201 |
+
{ id: 10, nom: "د.محمد الأمين ولد محمد محمود", poste: "نقابة الأطباء العاميين الموريتانيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 202 |
+
{ id: 11, nom: "د.محمد ولد أبات", poste: "نقابة الأطباء والصيادلة واطباء الأسنان الموريتانيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 203 |
+
{ id: 12, nom: "أحمد ولد منان", poste: "النقابة الوطنية لفنيي تكنولوجيا صناعة الأسنان", wilaya: "nouakchott", telephone: "", email: "" },
|
| 204 |
+
{ id: 13, nom: "يسلم ولد محمد ولد الداه", poste: "النقابة الوطنية لفنيي المختبر الطبي", wilaya: "nouakchott", telephone: "", email: "" },
|
| 205 |
+
{ id: 14, nom: "د.أحمد ولد العالم", poste: "النقابة الوطنية لأطباء الأسنان في موريتانيا", wilaya: "nouakchott", telephone: "", email: "" },
|
| 206 |
+
{ id: 15, nom: "المهندس اسحاق محمد سيديا", poste: "نقابة المهندسين والتقنيين لبيوطبيين الموريتانيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 207 |
+
{ id: 16, nom: "محمد سالم محمد باب اليدالي", poste: "نقابة لبيولوجيين الطبيين الموريتانيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 208 |
+
{ id: 17, nom: "ليلى محمد سالم أحميدات", poste: "النقابة الموريتانية للموظفين والوكلاء العقدويين في قطاع الصحة", wilaya: "nouakchott", telephone: "", email: "" },
|
| 209 |
+
{ id: 18, nom: "حمزة محمدن ماماه", poste: "نقابة الفنيين العاليين في الصحة", wilaya: "nouakchott", telephone: "", email: "" },
|
| 210 |
+
{ id: 19, nom: "الدكتور يحي محمد الأمين الطالب دحمان", poste: "نقابة المقيمين الطبيين", wilaya: "nouakchott", telephone: "", email: "" },
|
| 211 |
+
{ id: 20, nom: "عالين ولد العيد", poste: "الكونفدرالية الموريتانية للشغيلة", wilaya: "nouakchott", telephone: "44305631", email: "" },
|
| 212 |
+
{ id: 21, nom: "اندوم مامادو", poste: "المدير العام للحملة", wilaya: "nouakchott", telephone: "44149462", email: "" },
|
| 213 |
+
{ id: 22, nom: "خدي همت با", poste: "المركز الصحي بالسبخة", wilaya: "nouakchott", telephone: "47772814", email: "" },
|
| 214 |
+
{ id: 23, nom: "عاشورا جاكانا", poste: "المركز الصحي بالسبخة", wilaya: "nouakchott", telephone: "46563263", email: "" },
|
| 215 |
+
{ id: 24, nom: "ماء العينين تكدي", poste: "المركز الصحي بالسبخة", wilaya: "nouakchott", telephone: "22739526", email: "" }
|
| 216 |
+
];
|
| 217 |
+
|
| 218 |
+
// Load data from localStorage or use sample data
|
| 219 |
+
function loadPersonnelData() {
|
| 220 |
+
const saved = localStorage.getItem('personnelData');
|
| 221 |
+
if (saved) {
|
| 222 |
+
personnelData = JSON.parse(saved);
|
| 223 |
+
}
|
| 224 |
+
renderTable();
|
| 225 |
+
}
|
| 226 |
+
|
| 227 |
+
// Save data to localStorage
|
| 228 |
+
function savePersonnelData() {
|
| 229 |
+
localStorage.setItem('personnelData', JSON.stringify(personnelData));
|
| 230 |
+
}
|
| 231 |
+
|
| 232 |
+
// Render table with data
|
| 233 |
+
function renderTable() {
|
| 234 |
+
const tableBody = document.getElementById('personnelTable');
|
| 235 |
+
const emptyState = document.getElementById('emptyState');
|
| 236 |
+
|
| 237 |
+
const wilayaFilter = document.getElementById('wilayaFilter').value;
|
| 238 |
+
const searchTerm = document.getElementById('searchInput').value.toLowerCase();
|
| 239 |
+
|
| 240 |
+
const filteredData = personnelData.filter(person => {
|
| 241 |
+
const matchesWilaya = !wilayaFilter || person.wilaya === wilayaFilter;
|
| 242 |
+
const matchesSearch = !searchTerm ||
|
| 243 |
+
person.nom.toLowerCase().includes(searchTerm) ||
|
| 244 |
+
person.poste.toLowerCase().includes(searchTerm) ||
|
| 245 |
+
(person.telephone && person.telephone.includes(searchTerm));
|
| 246 |
+
return matchesWilaya && matchesSearch;
|
| 247 |
+
});
|
| 248 |
+
|
| 249 |
+
if (filteredData.length === 0) {
|
| 250 |
+
tableBody.innerHTML = '';
|
| 251 |
+
emptyState.classList.remove('hidden');
|
| 252 |
+
return;
|
| 253 |
+
}
|
| 254 |
+
|
| 255 |
+
emptyState.classList.add('hidden');
|
| 256 |
+
|
| 257 |
+
tableBody.innerHTML = filteredData.map(person => `
|
| 258 |
+
<tr class="table-row fade-in">
|
| 259 |
+
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium text-gray-900">${person.nom}</td>
|
| 260 |
+
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${person.poste}</td>
|
| 261 |
+
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">
|
| 262 |
+
${getWilayaName(person.wilaya)}
|
| 263 |
+
</td>
|
| 264 |
+
<td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">${person.telephone || 'Non renseigné'}</td>
|
| 265 |
+
<td class="px-6 py-4 whitespace-nowrap text-sm font-medium">
|
| 266 |
+
<div class="flex space-x-2">
|
| 267 |
+
<button onclick="editPersonnel(${person.id})" class="text-blue-600 hover:text-blue-900 flex items-center gap-1">
|
| 268 |
+
<i data-feather="edit" class="w-4 h-4"></i>
|
| 269 |
+
Modifier
|
| 270 |
+
</button>
|
| 271 |
+
<button onclick="deletePersonnel(${person.id})" class="text-red-600 hover:text-red-900 flex items-center gap-1">
|
| 272 |
+
<i data-feather="trash-2" class="w-4 h-4"></i>
|
| 273 |
+
Supprimer
|
| 274 |
+
</button>
|
| 275 |
+
</div>
|
| 276 |
+
</td>
|
| 277 |
+
</tr>
|
| 278 |
+
`).join('');
|
| 279 |
+
|
| 280 |
+
feather.replace();
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
// Get wilaya name
|
| 284 |
+
function getWilayaName(code) {
|
| 285 |
+
const wilayas = {
|
| 286 |
+
'nouakchott': 'نواكشوط',
|
| 287 |
+
'hodh_chargui': 'الحوض الشرقي',
|
| 288 |
+
'hodh_gharbi': 'الحوض الغربي',
|
| 289 |
+
'assaba': 'لعصابة',
|
| 290 |
+
'gorgol': 'غورغول',
|
| 291 |
+
'guidimakha': 'غيدي ماغا',
|
| 292 |
+
'tagant': 'تكانت',
|
| 293 |
+
'brakna': 'لبراكنة',
|
| 294 |
+
'trarza': 'اترارزة',
|
| 295 |
+
'adrar': 'آدرار',
|
| 296 |
+
'dakhlet_nouadhibou': 'داخلت انواذيبو',
|
| 297 |
+
'inchiri': 'انشيري'
|
| 298 |
+
};
|
| 299 |
+
return wilayas[code] || code;
|
| 300 |
+
}
|
| 301 |
+
|
| 302 |
+
// Open add modal
|
| 303 |
+
function openAddModal() {
|
| 304 |
+
document.getElementById('modalTitle').textContent = 'Ajouter un membre';
|
| 305 |
+
document.getElementById('personnelForm').reset();
|
| 306 |
+
document.getElementById('editId').value = '';
|
| 307 |
+
document.getElementById('personnelModal').classList.remove('hidden');
|
| 308 |
+
}
|
| 309 |
+
|
| 310 |
+
// Close modal
|
| 311 |
+
function closeModal() {
|
| 312 |
+
document.getElementById('personnelModal').classList.add('hidden');
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
// Edit personnel
|
| 316 |
+
function editPersonnel(id) {
|
| 317 |
+
const person = personnelData.find(p => p.id === id);
|
| 318 |
+
if (person) {
|
| 319 |
+
document.getElementById('modalTitle').textContent = 'Modifier un membre';
|
| 320 |
+
document.getElementById('nom').value = person.nom;
|
| 321 |
+
document.getElementById('poste').value = person.poste;
|
| 322 |
+
document.getElementById('wilaya').value = person.wilaya;
|
| 323 |
+
document.getElementById('telephone').value = person.telephone || '';
|
| 324 |
+
document.getElementById('email').value = person.email || '';
|
| 325 |
+
document.getElementById('editId').value = person.id;
|
| 326 |
+
document.getElementById('personnelModal').classList.remove('hidden');
|
| 327 |
+
}
|
| 328 |
+
}
|
| 329 |
+
|
| 330 |
+
// Delete personnel
|
| 331 |
+
function deletePersonnel(id) {
|
| 332 |
+
Swal.fire({
|
| 333 |
+
title: 'Êtes-vous sûr?',
|
| 334 |
+
text: "Cette action ne peut pas être annulée!",
|
| 335 |
+
icon: 'warning',
|
| 336 |
+
showCancelButton: true,
|
| 337 |
+
confirmButtonColor: '#d33',
|
| 338 |
+
cancelButtonColor: '#3085d6',
|
| 339 |
+
confirmButtonText: 'Oui, supprimer!',
|
| 340 |
+
cancelButtonText: 'Annuler'
|
| 341 |
+
}).then((result) => {
|
| 342 |
+
if (result.isConfirmed) {
|
| 343 |
+
personnelData = personnelData.filter(p => p.id !== id);
|
| 344 |
+
savePersonnelData();
|
| 345 |
+
renderTable();
|
| 346 |
+
Swal.fire(
|
| 347 |
+
'Supprimé!',
|
| 348 |
+
'Le membre a été supprimé.',
|
| 349 |
+
'success'
|
| 350 |
+
);
|
| 351 |
+
}
|
| 352 |
+
});
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
// Form submission
|
| 356 |
+
document.getElementById('personnelForm').addEventListener('submit', function(e) {
|
| 357 |
+
e.preventDefault();
|
| 358 |
+
|
| 359 |
+
const id = document.getElementById('editId').value;
|
| 360 |
+
const nom = document.getElementById('nom').value;
|
| 361 |
+
const poste = document.getElementById('poste').value;
|
| 362 |
+
const wilaya = document.getElementById('wilaya').value;
|
| 363 |
+
const telephone = document.getElementById('telephone').value;
|
| 364 |
+
const email = document.getElementById('email').value;
|
| 365 |
+
|
| 366 |
+
if (id) {
|
| 367 |
+
// Edit existing
|
| 368 |
+
const index = personnelData.findIndex(p => p.id == id);
|
| 369 |
+
personnelData[index] = { ...personnelData[index], nom, poste, wilaya, telephone, email };
|
| 370 |
+
} else {
|
| 371 |
+
// Add new
|
| 372 |
+
const newId = personnelData.length > 0 ? Math.max(...personnelData.map(p => p.id)) + 1 : 1;
|
| 373 |
+
personnelData.push({ id: newId, nom, poste, wilaya, telephone, email };
|
| 374 |
+
}
|
| 375 |
+
|
| 376 |
+
savePersonnelData();
|
| 377 |
+
renderTable();
|
| 378 |
+
closeModal();
|
| 379 |
+
|
| 380 |
+
Swal.fire({
|
| 381 |
+
icon: 'success',
|
| 382 |
+
title: id ? 'Membre modifié!' : 'Membre ajouté!',
|
| 383 |
+
showConfirmButton: false,
|
| 384 |
+
timer: 1500
|
| 385 |
+
});
|
| 386 |
+
});
|
| 387 |
+
|
| 388 |
+
// Event listeners for filters
|
| 389 |
+
document.getElementById('wilayaFilter').addEventListener('change', renderTable);
|
| 390 |
+
document.getElementById('searchInput').addEventListener('input', renderTable);
|
| 391 |
+
|
| 392 |
+
// Initialize
|
| 393 |
+
document.addEventListener('DOMContentLoaded', function() {
|
| 394 |
+
loadPersonnelData();
|
| 395 |
+
feather.replace();
|
| 396 |
+
});
|
| 397 |
+
</script>
|
| 398 |
+
</body>
|
| 399 |
+
</html>
|