# توثيق الإصلاحات الكارثية لنظام الخرائط والمناطق (Zones & Maps)

هذا الملف يوثق بدقة متناهية كل مهمة يتم إنجازها، مع الكود الفعلي الذي تم تعديله خطوة بخطوة.

---

## المهمة 1: معالجة ثغرة "الحدود الأبدية" (Undeletable Boundaries)

**تاريخ التنفيذ:** 2026-08-16

**وصف المشكلة بدقة:**
عندما يقوم المستخدم بمسح الرسمة من الخريطة بالكامل، يتم إرسال قيمة فارغة من الخريطة. الشرط القديم `if (!empty($data['boundaries']))` لم يكن يحتوي على `else` للتعامل مع الخلو التام للقيمة، مما أدى إلى تجاهل مسح البيانات من الداتابيز.

**الملفات التي تم تعديلها:**
1. `app/Filament/Resources/Zones/Pages/CreateZone.php`
2. `app/Filament/Resources/Zones/Pages/EditZone.php`

**الكود الفعلي الذي تم تنفيذه:**
تم إضافة `else` الخارجية لضمان تفريغ الحقل إذا تم مسحه.

```php
        if (!empty($data['boundaries'])) {
            $geometryJson = SpatialValidator::extractGeometry($data['boundaries']);
            
            // ... (باقي كود التحقق) ...
            
            } else {
                $data['boundaries'] = null;
            }
        } else {
            // ✅ الإضافة الجديدة: مسح الإحداثيات إجبارياً إذا كانت فارغة تماماً
            $data['boundaries'] = null;
        }
```

---

## المهمة 2: إصلاح اختفاء الرسومات تحت الخريطة (Z-Index/Pane Inversion)

**تاريخ التنفيذ:** 2026-08-16

**وصف المشكلة بدقة:**
كانت الخريطة الأساسية (Google Maps) تأخذ `z-index` عالي وتخفي الرسومات (المضلع وحدود المدينة) تحتها لأنها كانت تُرسم في الـ `overlayPane` الافتراضي وتغطي على ما دونها.

**الملفات التي تم تعديلها:**
1. `resources/views/filament/forms/components/leaflet-polygon.blade.php`

**الكود الفعلي الذي تم تنفيذه:**
تم إضافة 3 طبقات `Panes` مخصصة، وتمرير `baseTilesPane` لطبقة الخريطة بحيث تبقى الخريطة دائماً في الخلفية (200) والرسومات في المقدمة (450).

```javascript
            {{-- Force tile layer behind everything --}}
            this.map.createPane('baseTilesPane');
            this.map.getPane('baseTilesPane').style.zIndex = 200;

            {{-- Drawing pane - always on top --}}
            this.map.createPane('drawingPane');
            this.map.getPane('drawingPane').style.zIndex = 450;

            {{-- Reference pane - between tiles and drawings --}}
            this.map.createPane('referencePane');
            this.map.getPane('referencePane').style.zIndex = 420;

            {{-- Base Map: Google Maps (Arabic) - Best for Street Names and Deep Zoom --}}
            L.tileLayer('https://mt1.google.com/vt/lyrs=m&hl=ar&x={x}&y={y}&z={z}', {
                pane: 'baseTilesPane',
                attribution: 'Map data &copy; <a href=\'https://www.google.com/maps\'>Google</a>',
                maxZoom: 22,
                maxNativeZoom: 20
            }).addTo(this.map);
```

---

## المهمة 3: إصلاح انعدام التغذية البصرية أثناء الرسم (Invisible Drawing)

**تاريخ التنفيذ:** 2026-08-16

**وصف المشكلة بدقة:**
كان المضلع يظهر شفافاً أثناء الرسم لأن اللون كان يصل فارغاً (أو غير مكتمل المزامنة) من Livewire. أيضاً كان مستوى الشفافية (`fillOpacity`) خفيفاً مما يجعل رؤية الرسم صعبة.

**الملفات التي تم تعديلها:**
1. `resources/views/filament/forms/components/leaflet-polygon.blade.php`

**الكود الفعلي الذي تم تنفيذه:**
1. تم بناء Fallback صلب للون الافتراضي في `getZoneColor()`.
2. تم زيادة `fillOpacity` إلى `0.4`.
3. تم التأكيد على إعطاء الـ `pane: 'drawingPane'` لأداة الرسم.

```javascript
        getZoneColor() {
            let c = this.color;
            // حماية صلبة: لو اللون مش موجود أو مجرد # أو فارغ، رجع اللون الافتراضي
            if (!c || typeof c !== 'string' || c.trim() === '' || c.trim() === '#') {
                return '#3B82F6';
            }
            return c;
        },

        // وتعديل كل shapeOptions و setStyle ليكون:
        pane: 'drawingPane',
        fillOpacity: 0.4
```

---

## المهمة 4: إزالة الدائرة الوهمية المضللة (Fake Circle)

**تاريخ التنفيذ:** 2026-08-16

**وصف المشكلة بدقة:**
كان يتم رسم دائرة وهمية بقطر 5 كيلومتر حول مركز أي مدينة، وهذا مضلل جغرافياً لأن نطاقات المدن ليست دوائر بمساحة 5كم ثابتة.

**الملفات التي تم تعديلها:**
1. `resources/views/filament/forms/components/leaflet-polygon.blade.php`

**الكود الفعلي الذي تم تنفيذه:**
1. تم استبدال الكود الخاص بـ `L.circle` (الذي كان يمثل الدائرة الـ 5كم) بـ `L.circleMarker`، وهي عبارة عن نقطة صغيرة بنصف قطر ثابت (8 بكسل) تمثل فقط المركز كمرجع للمستخدم.
2. تم تمرير `pane: 'referencePane'` لها وكذلك تم تعديل الـ GeoJSON الخاص بحدود المدينة (Boundaries) ليأخذ نفس الـ Pane ليظل أسفل الرسم دائماً بدلاً من الـ `shadowPane` الافتراضي.

```javascript
                        // City center marker (lightweight, non-misleading)
                        let cityCenterMarker = L.circleMarker([lat, lng], {
                            pane: 'referencePane',
                            radius: 8,
                            color: '#EF4444',
                            fillColor: '#EF4444',
                            fillOpacity: 0.6,
                            weight: 2,
                            interactive: false
                        }).addTo(this.cityReferenceLayer);

                        if (city.name) {
                            cityCenterMarker.bindTooltip('مركز ' + city.name, {
                                permanent: true,
                                direction: 'top',
                                className: 'leaflet-draw-tooltip'
                            }).openTooltip();
                        }
```

---

## المهمة 5: تفعيل أداة المستطيل (Rectangle Tool)

**تاريخ التنفيذ:** 2026-08-16

**وصف المشكلة بدقة:**
كانت أداة رسم المستطيل معطلة (`rectangle: false`)، مما يُجبر المستخدم على رسم أي منطقة بنظام النقطة بنقطة (Polygon) وهذا مُرهق لبعض المناطق المربعة أو المستطيلة. أداة المستطيل في `Leaflet.draw` تنتج `GeoJSON Polygon` بشكل تلقائي، لذلك هي متوافقة 100% مع الـ Backend الخاص بنا ولا تتطلب أي تغيير في الخلفية.

**الملفات التي تم تعديلها:**
1. `resources/views/filament/forms/components/leaflet-polygon.blade.php`

**الكود الفعلي الذي تم تنفيذه:**
تم تفعيل أداة الـ `rectangle` وتمرير نفس خصائص الـ `shapeOptions` الخاصة بالمضلع لها (بما فيها `pane: 'drawingPane'`).

```javascript
            {{-- Drawing controls: polygon & rectangle --}}
            var drawControl = new L.Control.Draw({
                edit: {
                    featureGroup: this.drawnItems
                },
                draw: {
                    polygon: {
                        shapeOptions: {
                            pane: 'drawingPane',
                            color: currentColor,
                            fillColor: currentColor,
                            fillOpacity: 0.4,
                            weight: 2
                        }
                    },
                    polyline: false,
                    rectangle: {
                        shapeOptions: {
                            pane: 'drawingPane',
                            color: currentColor,
                            fillColor: currentColor,
                            fillOpacity: 0.4,
                            weight: 2
                        }
                    },
                    circle: false,
                    marker: false,
                    circlemarker: false
                }
            });
```

---

## الإصلاح الجذري: حل مشكلة اختفاء الرسومات نهائياً (Nuclear CSS Fix)

**تاريخ التنفيذ:** 2026-08-16

**سبب هذا الإصلاح:**
بعد تطبيق المهام 1-5، تبين أن الرسومات (المضلعات) لا تزال مختفية تحت الخريطة رغم إنشاء Custom Panes. السبب الجذري:
1. **مكتبة `Leaflet.draw` تتجاهل خاصية `pane` في `shapeOptions` تماماً** — ترسم دائماً في `overlayPane` الافتراضي.
2. **تعيين `layer.options.pane` بعد إنشاء الطبقة لا ينقلها** — الـ Pane يتحدد عند الإضافة الأولى للخريطة فقط.
3. **CSS من Filament يطغى على z-index** الافتراضي لطبقات Leaflet.

**الحل الجذري:**
- **حذف كل Custom Panes** (`baseTilesPane`, `drawingPane`, `referencePane`) — لأنها لا تعمل مع Leaflet.draw.
- **حذف كل إشارات `pane:`** من `shapeOptions`, `L.geoJSON`, `L.tileLayer`, `L.circleMarker`.
- **فرض ترتيب الطبقات بـ CSS `!important`** لتتغلب على أي CSS خارجي من Filament.

**الكود الفعلي الذي تم تنفيذه:**

```css
/* Force Leaflet pane z-index hierarchy - overrides Filament/external CSS */
.leaflet-tile-pane { z-index: 200 !important; }
.leaflet-overlay-pane { z-index: 400 !important; }
.leaflet-shadow-pane { z-index: 500 !important; }
.leaflet-marker-pane { z-index: 600 !important; }
.leaflet-tooltip-pane { z-index: 650 !important; }
.leaflet-popup-pane { z-index: 700 !important; }
.leaflet-overlay-pane svg { z-index: 400 !important; }
.leaflet-overlay-pane canvas { z-index: 400 !important; }
```

**التأثير:**
- الـ TileLayer (خريطة جوجل) → `tilePane` بـ z-index `200` → **دائماً في الخلف**
- المضلعات والرسومات → `overlayPane` بـ z-index `400` → **دائماً فوق الخريطة**
- الـ Edit Handles → `markerPane` بـ z-index `600` → **فوق كل شيء**
- الـ Tooltips → `tooltipPane` بـ z-index `650` → **أعلى طبقة نصية**

---

