-
-
-
-
-
-
+const Required = () =>
*;
-
-
-
- {errors.password &&
{errors.password.message}}
-
- برای هر پرسنل حساب کاربری ساخته میشود: با همین شماره موبایل وارد پنل میشود و فقط
- داشبورد و سرویسهای خودش را میبیند.
-
+/** تیتر یک بخش از فرم — همان الگوی سایر فرمهای چندبخشی پنل. */
+function FormSection({ title, hint, children }: { title: string; hint?: string; children: React.ReactNode }) {
+ return (
+
+
+
{title}
+ {hint && {hint}}
-
+ {children}
+
+ );
+}
+
+function StaffFormFields({ form, mode }: { form: ReturnType
>; mode: 'create' | 'edit' }) {
+ const { register, formState: { errors } } = form;
+
+ return (
+ <>
+
+
+
+
+
+ {errors.full_name &&
{errors.full_name.message}
}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ پرسنل با همین شمارهٔ موبایل وارد پنل میشود و فقط داشبورد و سرویسهای خودش را میبیند.
+
+
+
+
+
+ {errors.phone &&
{errors.phone.message}
}
+
+
+
+
+ {errors.password
+ ?
{errors.password.message}
+ :
+ {mode === 'edit'
+ ? 'برای تغییر رمز، مقدار جدید را وارد کنید.'
+ : 'خالی بگذارید تا پرسنل خودش با «فراموشی رمز» تعیین کند.'}
+
}
+
+
+
+
+ >
);
}
diff --git a/assets/admin/styles.css b/assets/admin/styles.css
index 971e17b4..fc14afe7 100644
--- a/assets/admin/styles.css
+++ b/assets/admin/styles.css
@@ -579,6 +579,9 @@ body {
/* field-label utility */
.field-label { display: block; font-size: 12.5px; font-weight: 600; color: var(--text-2); margin-bottom: 5px; }
+/* پیام خطای اعتبارسنجی زیر ورودی — هر دو نام در صفحات موجود استفاده شدهاند */
+.err-text, .field-error { display: block; font-size: 11.5px; font-weight: 600; color: var(--danger); }
+
/* ── Buttons ─────────────────────────────────────────────────── */
.btn {
display: inline-flex; align-items: center; justify-content: center; gap: 8px;