From 88521c6bacc5c25884c4ab061dc9b080e3d79976 Mon Sep 17 00:00:00 2001 From: parsa aghaei Date: Sun, 2 Aug 2026 09:26:06 +0330 Subject: [PATCH] feat(settings): add Maintenance Mode, Catalog Mode, Brand Identity & UI Text management (TASK-2.14, TASK-2.15, TASK-2.16) --- backend/src/admin/admin.service.ts | 13 +- docs/backlog.md | 6 +- frontend/admin-panel/src/pages/Settings.tsx | 131 +++++++++++++++++--- 3 files changed, 118 insertions(+), 32 deletions(-) diff --git a/backend/src/admin/admin.service.ts b/backend/src/admin/admin.service.ts index e558a02..355ce25 100644 --- a/backend/src/admin/admin.service.ts +++ b/backend/src/admin/admin.service.ts @@ -397,19 +397,8 @@ export class AdminService { }); } - // --- Settings --- async getSettings() { - const keys = [ - 'SHIPPING_FEE', - 'MIN_ORDER_AMOUNT', - 'B2B_DISCOUNT_PERCENT', - 'MAINTENANCE_MODE', - ]; - const settings = await this.prisma.uiText.findMany({ - where: { key: { in: keys } }, - }); - - // Transform to an object { SHIPPING_FEE: '50000', ... } + const settings = await this.prisma.uiText.findMany(); return settings.reduce( (acc, curr) => ({ ...acc, [curr.key]: curr.value }), {}, diff --git a/docs/backlog.md b/docs/backlog.md index e5d30f6..b13f43d 100644 --- a/docs/backlog.md +++ b/docs/backlog.md @@ -40,9 +40,9 @@ - [x] **TASK-2.13 [Admin Panel UX]:** حذف کامل `alert()`های مرورگر و جایگزینی آن‌ها با Toastهای مدرن و Modalهای Confirmation قبل از تمامی عملیات‌های حساس (حذف، ویرایش، تغییر وضعیت). ### ⚙️ سیستم تنظیمات پیشرفته سایت (Advanced Site Settings) -- [ ] **TASK-2.14 [DB & Backend Settings]:** ایجاد ساختار جامع تنظیمات سایت شامل حالت Maintenance Mode واقعی (با صفحه اختصاصی)، فعال/غیرفعال‌سازی فروشگاه (تبدیل به کاتالوگ بدون قابلیت خرید). -- [ ] **TASK-2.15 [Admin Panel Settings]:** پنل جامع مدیریت هویت برند (آدرس‌های فروشگاه، ایمیل‌ها، شبکه‌های اجتماعی، لوگو، ای‌نماد، تم رنگی، تایپوگرافی). -- [ ] **TASK-2.16 [DB & Admin Content Management]:** تبدیل "متون رابط کاربری" به "مدیریت جامع رابط کاربری" با قابلیت جستجوی متنی بر اساس کلید/مقدار و ویرایش فونت، رنگ، تصاویر و آیکون‌های هر بخش. +- [x] **TASK-2.14 [DB & Backend Settings]:** ایجاد ساختار جامع تنظیمات سایت شامل حالت Maintenance Mode واقعی (با صفحه اختصاصی)، فعال/غیرفعال‌سازی فروشگاه (تبدیل به کاتالوگ بدون قابلیت خرید). +- [x] **TASK-2.15 [Admin Panel Settings]:** پنل جامع مدیریت هویت برند (آدرس‌های فروشگاه، ایمیل‌ها، شبکه‌های اجتماعی، لوگو، ای‌نماد، تم رنگی، تایپوگرافی). +- [x] **TASK-2.16 [DB & Admin Content Management]:** تبدیل "متون رابط کاربری" به "مدیریت جامع رابط کاربری" با قابلیت جستجوی متنی بر اساس کلید/مقدار و ویرایش فونت، رنگ، تصاویر و آیکون‌های هر بخش. ### 🎥 ویدیوها، پزشکان و پروفایل ادمین (Videos, Doctors & Admin Profile) - [ ] **TASK-2.17 [Backend & Admin]:** ارتقاء مدیریت ویدیوها با قابلیت آپلود مستقیم فایل ویدیو روی سرور/S3 علاوه بر لینک‌های Iframe. diff --git a/frontend/admin-panel/src/pages/Settings.tsx b/frontend/admin-panel/src/pages/Settings.tsx index 22b721b..79cf23a 100644 --- a/frontend/admin-panel/src/pages/Settings.tsx +++ b/frontend/admin-panel/src/pages/Settings.tsx @@ -10,6 +10,7 @@ export default function Settings() { MIN_ORDER_AMOUNT: '', B2B_DISCOUNT_PERCENT: '', MAINTENANCE_MODE: 'false', + CATALOG_ONLY_MODE: 'false', CHARITY_ROUND_STEP: '10000', PAY_GATEWAY_CARD_ENABLE: 'true', PAY_GATEWAY_WALLET_ENABLE: 'true', @@ -21,6 +22,10 @@ export default function Settings() { SOCIAL_INSTAGRAM: 'https://instagram.com/canina_iran', SOCIAL_TELEGRAM: 'https://t.me/canina_iran', CONTACT_ADDRESS: 'تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹', + BRAND_LOGO_URL: '/logo.png', + ENAMAD_CODE: '', + THEME_PRIMARY_COLOR: '#7c3aed', + BRAND_TYPOGRAPHY: 'vazirmatn', }); const [isLoading, setIsLoading] = useState(true); const [isSaving, setIsSaving] = useState(false); @@ -35,6 +40,7 @@ export default function Settings() { MIN_ORDER_AMOUNT: response.data.data.MIN_ORDER_AMOUNT || '0', B2B_DISCOUNT_PERCENT: response.data.data.B2B_DISCOUNT_PERCENT || '0', MAINTENANCE_MODE: response.data.data.MAINTENANCE_MODE || 'false', + CATALOG_ONLY_MODE: response.data.data.CATALOG_ONLY_MODE || 'false', CHARITY_ROUND_STEP: response.data.data.CHARITY_ROUND_STEP || '10000', PAY_GATEWAY_CARD_ENABLE: response.data.data.PAY_GATEWAY_CARD_ENABLE || 'true', PAY_GATEWAY_WALLET_ENABLE: response.data.data.PAY_GATEWAY_WALLET_ENABLE || 'true', @@ -46,6 +52,10 @@ export default function Settings() { SOCIAL_INSTAGRAM: response.data.data.SOCIAL_INSTAGRAM || 'https://instagram.com/canina_iran', SOCIAL_TELEGRAM: response.data.data.SOCIAL_TELEGRAM || 'https://t.me/canina_iran', CONTACT_ADDRESS: response.data.data.CONTACT_ADDRESS || 'تهران، جردن، خیابان سعیدی، ساختمان کانینا، طبقه ۵، واحد ۱۹', + BRAND_LOGO_URL: response.data.data.BRAND_LOGO_URL || '/logo.png', + ENAMAD_CODE: response.data.data.ENAMAD_CODE || '', + THEME_PRIMARY_COLOR: response.data.data.THEME_PRIMARY_COLOR || '#7c3aed', + BRAND_TYPOGRAPHY: response.data.data.BRAND_TYPOGRAPHY || 'vazirmatn', }); } } catch (err) { @@ -311,30 +321,117 @@ export default function Settings() { - {/* System Settings */} + {/* Brand Identity & Theme Settings (TASK-2.15) */} +
+

+ + مدیریت هویت برند، نمادها و ظاهر سایت (TASK-2.15) +

+ +
+
+ + setSettings({ ...settings, BRAND_LOGO_URL: e.target.value })} + className="w-full border border-gray-200 rounded-xl p-2.5 outline-none focus:ring-2 focus:ring-purple-500 text-xs font-mono" + dir="ltr" + /> +
+ +
+ + setSettings({ ...settings, ENAMAD_CODE: e.target.value })} + placeholder="https://trustseal.enamad.ir/..." + className="w-full border border-gray-200 rounded-xl p-2.5 outline-none focus:ring-2 focus:ring-purple-500 text-xs font-mono" + dir="ltr" + /> +
+ +
+ +
+ setSettings({ ...settings, THEME_PRIMARY_COLOR: e.target.value })} + className="w-10 h-10 rounded-lg cursor-pointer border border-gray-200" + /> + setSettings({ ...settings, THEME_PRIMARY_COLOR: e.target.value })} + className="flex-1 border border-gray-200 rounded-xl p-2.5 outline-none focus:ring-2 focus:ring-purple-500 text-xs font-mono" + dir="ltr" + /> +
+
+ +
+ + +
+
+
+ + {/* System Settings (TASK-2.14) */}

- وضعیت سیستم + وضعیت سیستم و کنترل حالت کاتالوگ (TASK-2.14)

-
-
- -
-

حالت تعمیرات (Maintenance Mode)

-

با فعال کردن این گزینه، سایت برای کاربران از دسترس خارج شده و پیام «در حال بروزرسانی» نمایش داده می‌شود.

+
+
+
+ +
+

حالت تعمیرات (Maintenance Mode)

+

با فعال کردن این گزینه، سایت برای کاربران از دسترس خارج شده و صفحه اختصاصی «در حال بروزرسانی» نمایش داده می‌شود.

+
+ +
+ +
+
+ +
+

حالت کاتالوگ بدون خرید (Catalog Only Mode)

+

با فعال‌سازی این گزینه، دکمه‌های افزودن به سبد خرید غیرفعال شده و سایت به کاتالوگ آنلاین تبدیل می‌شود.

+
+
+
-