'use client'; import { useState, useEffect } from 'react'; import Header from '@/components/Header'; import { Save, EyeOff, ShieldCheck, Check, AlertCircle, XCircle } from 'lucide-react'; import { motion, AnimatePresence } from 'framer-motion'; export default function SettingsPage() { const [settings, setSettings] = useState({ blind_counting: false, correction_roles: ['ADMIN', 'SUPERVISOR'], uncounted_shelf_days: 10 }); const [loading, setLoading] = useState(true); const [saving, setSaving] = useState(false); const [toast, setToast] = useState({ show: false, message: '', isError: false }); const availableRoles = [ { id: 'ADMIN', label: 'مدیر کل' }, { id: 'SUPERVISOR', label: 'سرپرست انبار' }, { id: 'ACCOUNTANT', label: 'حسابدار' }, { id: 'COUNTER', label: 'انبارگردان' } ]; const showToast = (message, isError = false) => { setToast({ show: true, message, isError }); setTimeout(() => setToast({ show: false, message: '', isError: false }), 3000); }; useEffect(() => { fetchSettings(); }, []); const fetchSettings = async () => { try { const res = await fetch('/api/settings'); if (res.ok) { const data = await res.json(); setSettings(prev => ({ ...prev, ...data })); } } catch (error) { console.error(error); } finally { setLoading(false); } }; const handleSave = async () => { setSaving(true); try { const res = await fetch('/api/settings', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(settings) }); if (res.ok) { showToast('تنظیمات با موفقیت ذخیره شد'); } else { showToast('خطا در ذخیره تنظیمات', true); } } catch (error) { console.error(error); showToast('خطای شبکه', true); } finally { setSaving(false); } }; const toggleRole = (roleId) => { setSettings(prev => { const roles = prev.correction_roles || []; if (roles.includes(roleId)) { return { ...prev, correction_roles: roles.filter(r => r !== roleId) }; } else { return { ...prev, correction_roles: [...roles, roleId] }; } }); }; if (loading) { return (
); } return (
{/* Blind Counting Setting */}

شمارش کور (Blind Counting)

در صورت فعال بودن، انبارگردان‌ها موجودی فعلی سیستم را نمی‌بینند و مجبورند به جای تایید کورکورانه، کالاها را به صورت واقعی بشمارند.

{/* Elegant Switch Button */}
{/* Show Suggested Shelves Setting */}

پیشنهاد قفسه‌های شمارش‌نشده

در صورت فعال بودن، در صفحه داشبورد لیستی از قفسه‌هایی که مدتی شمارش نشده‌اند به کاربر پیشنهاد داده می‌شود.

{/* Enable Counting Modes */}

حالت‌های انبارگردانی

انبارگردانی قفسه‌ای

انبارگردانی کالایی

{/* Correction Roles Setting */}

دسترسی ثبت اصلاحیه

وقتی انبارگردانی یک قفسه بسته می‌شود، چه نقش‌هایی اجازه دارند درخواست اصلاحیه ثبت کنند؟

{availableRoles.map(role => { const isSelected = settings.correction_roles?.includes(role.id); return ( toggleRole(role.id)} className={`flex items-center justify-between p-3.5 rounded-[16px] border text-xs font-bold transition-all ${ isSelected ? 'border-indigo-500 bg-indigo-50 text-indigo-700 shadow-sm' : 'border-gray-200 bg-white text-gray-600 hover:border-gray-300 hover:bg-gray-50' }`} > {role.label}
); })}
{/* Uncounted Shelves Warning Days */}

هشدار قفسه‌های شمارش‌نشده

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

setSettings(s => ({ ...s, uncounted_shelf_days: Number(e.target.value) }))} className="w-20 bg-white border border-gray-200 rounded-[12px] px-3 py-2 text-center font-black text-gray-800 focus:outline-none focus:border-indigo-500 transition-colors" /> روز
{saving ? (
) : ( <> ذخیره تغییرات )}
{toast.show && ( {toast.isError ? : } {toast.message} )}
); }