# تاریخچه تغییرات — PDF Form Generator

---

## نسخه ۱.۲.۰ — تاریخ انتشار: ۱۴۰۵/۰۲/۳۰ 

---

### ✅ امکانات جدید

#### ۱. کنترل عرض هر فیلد در فرم کاربر (`col_width`)
- هر فیلد در ویرایشگر فرم (هم پنل مدیریت، هم پنل کاربر) یک سلکتور عرض Bootstrap دارد.
- مقادیر قابل انتخاب: ۳/۱۲ (یک‌چهارم)، ۴/۱۲ (یک‌سوم)، ۶/۱۲ (نیمه)، ۸/۱۲ (دو‌سوم)، ۹/۱۲ (سه‌چهارم)، ۱۲/۱۲ (کل ردیف)
- مقدار پیش‌فرض: ۶/۱۲ (نیمه)
- فیلد textarea همیشه کل ردیف (`col-12`) — بقیه انواع فیلد (متن، کشویی، رادیویی، چک‌باکس و ...) از مقدار انتخابی استفاده می‌کنند.
- سه یا چهار فیلد با عرض ۴/۱۲ یا ۳/۱۲ در یک ردیف کنار هم نمایش می‌یابند.

#### ۲. دکمه‌های ↑↓ برای مرتب‌سازی فیلدها
- هر ردیف فیلد در ویرایشگر دو دکمه «↑» (بالا) و «↓» (پایین) دارد.
- علاوه بر قابلیت موجود drag-and-drop، این دکمه‌ها امکان جابه‌جایی سریع با کلیک را می‌دهند.
- هم در پنل مدیریت، هم در پنل کاربر موجود است.

#### ۳. دکمه‌های ↑↓ برای مرتب‌سازی بلوک‌های توضیحات
- هر بلوک توضیحات (Quill) نیز دکمه‌های «↑» و «↓» دارد.
- بلوک‌ها و فیلدها در یک صف مشترک مرتب‌سازی می‌شوند.

#### ۴. ویرایشگر متن غنی (Quill) — بارگذاری محلی
- ویرایشگر Quill نسخه ۱.۳.۷ به‌صورت محلی بارگذاری می‌شود.
- فایل‌های اضافه‌شده:
  - `public/assets/js/quill.min.js`
  - `public/assets/css/quill.snow.css`
- هیچ وابستگی به CDN خارجی وجود ندارد — نصب آفلاین کاملاً کار می‌کند.

#### ۵. بلوک‌های توضیحات غنی برای هر صفحه فرم
- در هر صفحه فرم می‌توان بلوک‌های متنی غنی با Quill اضافه کرد.
- هر بلوک دارای: عنوان اختیاری، رنگ‌پیکر، محتوای متن غنی (bold، italic، لینک، رنگ و ...)
- بلوک‌ها و فیلدها در صفحه fill_form بر اساس sort_order کنار هم نمایش می‌یابند.
- دکمه «+ افزودن توضیحات» برای هر صفحه.

#### ۶. ویرایشگر کامل فرم در پنل کاربر (`my_forms/edit.php`)
- صفحه ویرایش فرم در پنل کاربر کاملاً بازنویسی شد.
- کاملاً مشابه پنل مدیریت: صفحات چندگانه، فیلدها، بلوک‌های توضیحات، آپلود قالب PDF، نمایش فیلدهای شناسایی‌شده.
- دارای: col_width selector، دکمه‌های ↑↓، Quill editor، رنگ‌پیکر بلوک.
- کتابخانه فیلدها از «فیلدهای من» کاربر بارگذاری می‌شود.
- لینک به «کتابخانه قالب‌های من» و «فونت‌های من».

#### ۷. انواع فیلد جدید
- **کشویی (select)**: انتخاب از لیست با گزینه‌های JSON قابل تعریف
- **رادیویی (radio)**: انتخاب تکی از چند گزینه
- **چک‌باکس (checkbox)**: انتخاب چندگانه از گزینه‌ها
- همه در فرم fill_form نمایش داده می‌شوند و مقادیر در PDF ثبت می‌گردند.

#### ۸. منطق شرطی نمایش فیلد (`conditions`)
- هر فیلد می‌تواند بر اساس مقدار فیلد دیگری نمایش یا مخفی شود.
- عملگرها: برابر است با (`=`)، برابر نیست (`!=`)، شامل می‌شود (`contains`)
- عملیات: نمایش اگر (`show`) یا مخفی اگر (`hide`)
- تنظیم در کتابخانه فیلدها (پنل مدیریت و پنل کاربر)
- فیلدهای مخفی در fill_form اعتبارسنجی نمی‌شوند.

#### ۹. فرمت اعداد فارسی/انگلیسی
- هر فیلد متنی می‌تواند اعداد را به فرمت فارسی (۱۲۳۴) یا انگلیسی (1234) نمایش دهد.
- قابل تنظیم در کتابخانه فیلد.

#### ۱۰. صفحات چندگانه در فرم کاربر
- صفحات مرحله‌ای (multi-step) در fill_form با دکمه‌های «بعدی» و «قبلی».
- هر صفحه مستقلاً اعتبارسنجی می‌شود.

---

### 🔧 تغییرات و بهبودها

#### `public/assets/js/app.js`
- تابع `buildFieldRow()` به‌روز شد: سلکتور col_width و دکمه‌های ↑↓ به هر ردیف فیلد اضافه شد.
- تابع `addPage()` به‌روز شد: data-fields برای صفحات جدید و دکمه «+ افزودن توضیحات».
- تمام event handlerهای فیلد (اضافه/حذف/بالا/پایین) و بلوک (اضافه/حذف/بالا/پایین) در `setupFieldEditor()` یکپارچه شد.
- رابط `window._pdfInitQuill` برای مقداردهی Quill در بلوک‌های تازه‌اضافه‌شده.

#### `app/Views/admin/forms/edit.php`
- مسیر Quill از CDN به `/public/assets/css/quill.snow.css` و `/public/assets/js/quill.min.js` تغییر یافت.
- سلکتور col_width (عرض فیلد) به هر ردیف فیلد اضافه شد.
- دکمه‌های ↑↓ به ردیف‌های فیلد و بلوک‌ها اضافه شد.
- راهنمای صفحه (`$pageHelp`) کامل به‌روز شد.
- اسکریپت inline فقط شامل: مقداردهی Quill + `window._pdfInitQuill` + `syncAndRenumber` قبل از submit.
- handler تکراری `add-field-btn` از اسکریپت inline حذف شد (حالا فقط در app.js).

#### `app/Views/user/fill_form.php`
- مقدار `col_width` از دیتابیس خوانده و به کلاس Bootstrap اعمال می‌شود.
- فقط `textarea` به `col-12` force می‌شود؛ انواع دیگر (checkbox، radio، select و ...) از تنظیم col_width پیروی می‌کنند.
- بلوک‌های توضیحات و فیلدها بر اساس sort_order مشترک نمایش می‌یابند.

#### `app/Controllers/AdminController.php`
- `col_width` به UPDATE و INSERT فیلدها اضافه شد.
- مقادیر معتبر: `[3, 4, 6, 8, 9, 12]`، مقدار نامعتبر به ۶ تبدیل می‌شود.

#### `app/Controllers/UserFormController.php`
- `col_width` به هر سه حالت ذخیره‌سازی اضافه شد:
  - UPDATE دقیق (exact match)
  - UPDATE با جابه‌جایی صفحه
  - INSERT جدید

#### `app/Core/Schema.php`
- ستون `col_width INT DEFAULT 6` به جدول `form_fields` اضافه شد.

---

### 🐛 باگ‌های رفع‌شده

| شماره | توضیح | علت | رفع |
|-------|-------|-----|-----|
| ۱ | با کلیک «افزودن فیلد» دو فیلد ساخته می‌شد | هم app.js هم اسکریپت inline به `add-field-btn` گوش می‌دادند | handler از inline حذف، فقط در app.js |
| ۲ | دکمه‌های ↑↓ بلوک‌ها کار نمی‌کردند | مسیر CDN Quill اشتباه → اسکریپت inline کرش → هیچ handler اجرا نمی‌شد | Quill محلی + handler در app.js |
| ۳ | Quill در بلوک‌های موجود غیرفعال بود | مسیر asset اشتباه بود | مسیر به `/public/assets/...` اصلاح شد |
| ۴ | col_width در fill_form اعمال نمی‌شد (checkbox/radio همیشه full-width) | checkbox و radio به زور `col-12` می‌شدند | فقط textarea به col-12 محدود شد |
| ۵ | col_width در پنل کاربر ذخیره نمی‌شد | UPDATE/INSERT در UserFormController فاقد col_width | ستون به هر سه query اضافه شد |
| ۶ | پنل کاربر (my_forms/edit.php) خالی بود | فایل وجود داشت ولی محتوا نداشت | کاملاً بازنویسی و مشابه پنل ادمین |

---

### 🗃️ تغییرات پایگاه داده

**قبل از آپلود فایل‌ها، دستورات SQL زیر را اجرا کنید:**

```sql
-- ۱. اضافه کردن ستون عرض فیلد به جدول form_fields
ALTER TABLE `form_fields`
    ADD COLUMN IF NOT EXISTS `col_width` INT NOT NULL DEFAULT 6;
```

فایل کامل migration: `database/patch_v1_2_updates.sql`

---

### 📁 فایل‌های تغییریافته در این پچ

| فایل | نوع تغییر |
|------|-----------|
| `public/assets/js/app.js` | ویرایش اساسی |
| `public/assets/js/quill.min.js` | **جدید** — Quill 1.3.7 محلی |
| `public/assets/css/quill.snow.css` | **جدید** — استایل Quill محلی |
| `app/Views/admin/forms/edit.php` | ویرایش اساسی |
| `app/Views/user/fill_form.php` | ویرایش |
| `app/Views/user/my_forms/edit.php` | **بازنویسی کامل** |
| `app/Core/Schema.php` | اضافه کردن col_width |
| `app/Controllers/AdminController.php` | اضافه کردن col_width |
| `app/Controllers/UserFormController.php` | اضافه کردن col_width |
| `database/patch_v1_2_updates.sql` | migration جدید |

---

### ⚙️ راهنمای نصب پچ

1. از فایل‌های فعلی سرور **بکاپ بگیرید**.
2. دستور SQL مهاجرت را در پایگاه داده اجرا کنید:
   ```sql
   ALTER TABLE `form_fields` ADD COLUMN IF NOT EXISTS `col_width` INT NOT NULL DEFAULT 6;
   ```
3. فایل‌های پچ را روی فایل‌های موجود کپی کنید (overwrite).
4. کش مرورگر را پاک کنید (Ctrl+Shift+R).
5. وارد پنل مدیریت شوید و یک فرم را باز کنید تا صحت عملکرد را بررسی کنید.

---

*PDF Form Generator — نسخه ۱.۲.۰*
