تیتر و توضیح بخشها (تیتر بخش خدمات، پروژههای شاخص، چرا آرامش و…) فقط
درجا ویرایش میشوند و تعریفشان در ENTITIES جا افتاده بود؛ isTranslatable
برایشان false برمیگشت و کلید تبدیل به title_en نمیشد — نتیجه اینکه
ویرایش روی صفحهٔ انگلیسی حتی با زبان ویرایش انگلیسی، متن فارسی را
بازنویسی میکرد و نسخهٔ انگلیسی بهظاهر هیچ تغییری نمیکرد.
قبلاً زبان ویرایش (editLang) کلید جداگانهای در نوار ادمین بود که با زبان صفحهٔ
در حال نمایش هیچ ارتباطی نداشت و پیشفرضش فارسی میماند؛ نتیجهاش این بود که
ویرایش درجا روی صفحههای /en به ستونهای فارسی میرفت و تغییرها «سمت دیگر»
یعنی سایت فارسی ظاهر میشدند.
- AdminBar: در حالت ویرایش، editLang با زبان URL همگام میشود (syncEditLang)؛
کلید دستی فقط برای ویرایش ستون زبان دیگر روی همین صفحه میماند.
- entities: تعریف status-labels اضافه شد — نبودش یعنی ویرایش برچسب وضعیت روی
صفحهٔ انگلیسی همیشه ستون فارسی را بازنویسی میکرد.
- بکاند: ستون role برای admin_users (admin/creator) + author_id برای مقالهها
- نقشگارد روی کل روتر مدیریتی: creator فقط لیست/ساخت/خواندن/ویرایش
پیشنویسهای «خودش» را میبیند؛ بقیهٔ مسیرهای مدیریتی ۴۰۳
- ساخت توسط creator همیشه پیشنویس است و ویرایشش هرگز منتشر نمیشود
(حتی تلاش برای publish در payload نادیده گرفته میشود)
- حذف/ترتیببندی/پیامها/خبرنامه/سایر بخشها برای creator ممنوع
- لاگین نقش را برمیگرداند؛ پنل: AdminBar نویسنده فقط «نوشتن مقاله» +
زبان ویرایش + رمز + خروج دارد؛ دکمههای انتشار/حذف مقاله فقط برای admin
- ورود creator مستقیم به صفحهٔ نوشتن مقاله هدایت میشود
- انیمیشن ورود هیرو تاخیر ۲.۱ تا ۲.۶ ثانیه داشت (بعد از بارگذاری JS+API هم
متن ۳ ثانیه نامرئی بود)؛ حالا ورود نرم با تاخیر ۰.۰۵-۰.۳۶ ثانیه
- SiteProvider: /api/site و /api/admin/articles پشت سر هم fetch میشدند و
setData منتظر هر دو میماند؛ حالا همزمان شروع میشوند
- ستون فهرست در دسکتاپ از ۱۷rem به ۲۱rem پهنتر شد تا تیترهای بلند جا شوند
- نوار اسکرول بومی مرورگر (با فلش) مخفی شد؛ اسکرول با چرخ ماوس/لمس سر جایش است
- /admin/projects/new و /admin/projects/:id — همهٔ فیلدها در یک صفحه با
ورودی دوزبانهٔ صریح (فارسی/English)، ذخیره، حذف
- GalleryField تازه: گالری چندتصویری فقط با آپلود به MinIO (حذف/جابهجایی/
افزودن چندفایلی) — فیلد «هر خط یک URL» دیگر استفاده نمیشود
- مدادِ کارت پروژه و دکمهٔ «افزودن پروژه» به صفحهٔ اختصاصی هدایت میشوند؛
دکمهٔ ویرایش روی صفحهٔ جزئیات هم لینک همان صفحه است
- دکمههای CTA: بازگشت به ButtonLink شیشهای (اصلی با دایرهٔ مسی، ثانویه مات)
- کارت شناور آمار (badge_value/badge_label) که UI v1 حذف کرده بود برگشت —
فیلدهایش در کشوی «تنظیمات هیرو» دوباره معنا دارند
- Button.tsx که قبلاً بازگردانده شده بود دوباره استفاده میشود
- دکمهٔ تغییر زبان: کپسول بزرگ دوزبانه → دکمهٔ کوچک آیکون+متن (طرح قبلی)
- ساختار صفحهٔ جزئیات پروژه: بازگشت به چیدمان قبلی (دیتابیسمحور بود و میماند)
- قالب پرسشوپاسخ: بازگشت به چیدمان دوستونه (تیتر کنار آکاردئون)
توجه: بخشی از UI v1 (fatemeh) عمداً برگردانده شده به درخواست تیم UI؛
بقیهٔ تغییرات آن کامیت سر جایش است. ویرایشپذیری دیتابیسمحور پروژهها
و دکمهٔ ویرایش، روی همین ساختار قدیمی دوباره اعمال شدهاند.
- page-heroes به فهرست موجودیتهای پنل اضافه شد و PageHero یک دکمهٔ واضح
«عنوان، سرآغاز و تصویر هیروی این صفحه» گرفت (پیشتر فقط ویرایش درجای
نامرئی روی خود متن بود).
- صفحهٔ پروژهها و صفحهٔ جزئیات پروژه حالا از دیتابیس خوانده میشوند
(فایل استاتیک projectsData فقط جانشین دیتابیس خالی/اسلاگهای قدیمی است) —
پیشتر ویرایش پنل روی این دو صفحه اصلاً نمایش داده نمیشد.
- روی لیست پروژهها دکمهٔ ویرایش/جابهجایی/حذف و «افزودن پروژه» اضافه شد و
روی صفحهٔ جزئیات هر پروژه دکمهٔ ویرایش همان پروژه.
- کپشن: قاعدهٔ وسطچینِ .article-body figcaption با قاعدههای [data-dir=...] برای
راست/چپچین بازنویسی میشد و عملاً وسطچین نمیشد؛ figcaption از آن فهرستها
برداشته شد. متن کپشن در ویرایشگر هم وسطچین شد تا با خروجی سایت یکی باشد.
- نام تصویر: نامی که پیش از بارگذاری نوشته میشود، حالا همان Alt تصویر میشود
(پیشتر نام فایل مبنا بود و باید دستی در جعبهٔ زیر تصویر اصلاح میشد).
- فهرست مطالب: H3 با ps-4 فقط ۴ پیکسل بیشتر از H2 تورفتگی داشت (عملاً نامرئی)؛
حالا ps-6 با فونت یک پله کوچکتر.
پیشنمایش خصوصی دو بار احراز هویت میخواست (Basic Auth لبه + ورود خود پنل) و
هر origin (www/apex/.ir) هم پرسش جداگانهای داشت؛ نتیجه سردرگمی تیم.
حالا روترهای /admin و /api میدلور preview-auth ندارند (noindex میماند) و
پنل با همان ورود خودش کار میکند؛ صفحات عمومی همچنان خصوصیاند.
docker compose مقادیر .env را خودش تفسیر میکند؛ هش htpasswd شامل $apr1$...
است و بدون کوتیشن، $apr1 و بخشهای بعدی بهعنوان متغیر خالی جایگزین میشدند
(برچسب تبدیل به preview:/OBoRS/... میشد) و پیشنمایش خصوصی هرگز رمز را
نمیپذیرفت. حالا env_set مقدارهای دارای $ را تککوتیشن میگذارد و env_get
کوتیشن را برمیدارد.
بدون آن، psycopg3 تاپل برمیگرداند و row["model"] خطای
«tuple indices must be integers or slices, not str» میداد؛ نتیجه:
«Initial index sync failed» و unavailable ماندن چت با وجود امبد موفق.
- content.py: ستون desc در SQL بدون کوتیشن بود و PostgreSQL آن را کلمهٔ کلیدی
میگیرد؛ نتیجه: «Initial index sync failed: syntax error at or near "desc"»
در استارت و غیرقابل استفاده ماندن چت تا reindex. حالا "desc" کوتیشن شده.
- Dockerfile: با اینکه سرور GPU ندارد، pip نسخهٔ CUDA تورچ را از PyPI میگرفت
(ایمیج ۹.۷GB با کتابخانههای nvidia). اول torch از ایندکس CPU نصب میشود.
نمونهٔ OpenPanel موجود (stats.*) با یک پروژهٔ دوم برای این سایت استفاده میشود؛
VITE_OPENPANEL_URL/VITE_OPENPANEL_CLIENT_ID در زمان بیلد تزریق میشوند و در
نبودشان همهچیز بیاثر است. API عمومی track() تغییر نکرده و مسیر Umami هم
برای عقبنشینی دستنخورده مانده.
- gen-env.sh: rand با دو آرگومان صدا زده میشد ولی فقط $1 را میخواند؛
openssl rand -hex بدون تعداد بایت خروجی خالی و کد ۰ میدهد، پس fallback
هرگز اجرا نمیشد و .env با رازهای خالی ساخته میشد. حالا تعداد بایت
رعایت میشود و اگر مقداری خالی بماند، اسکریپت با خطا متوقف میشود.
- preview-mode.sh: python روی اوبونتو ۲۴.۰۴ وجود ندارد (فقط python3).