feat: username/password authentication for admin and merchant panels
CI/CD / CI · API (dotnet build + test) (push) Successful in 49s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 42s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m8s
CI/CD / CI · Admin Web (tsc) (push) Successful in 37s
CI/CD / CI · Website (tsc) (push) Successful in 46s
CI/CD / CI · Koja (tsc) (push) Successful in 49s
CI/CD / Deploy · all services (push) Has been cancelled
CI/CD / CI · API (dotnet build + test) (push) Successful in 49s
CI/CD / CI · Admin API (dotnet build) (push) Successful in 42s
CI/CD / CI · Dashboard (tsc) (push) Successful in 1m8s
CI/CD / CI · Admin Web (tsc) (push) Successful in 37s
CI/CD / CI · Website (tsc) (push) Successful in 46s
CI/CD / CI · Koja (tsc) (push) Successful in 49s
CI/CD / Deploy · all services (push) Has been cancelled
- Add PasswordHasher utility (PBKDF2/SHA-256, 100k iterations)
- Add Username + PasswordHash fields to Employee and SystemAdmin entities
- EF migration: AddPasswordLogin (nullable columns on both tables)
- Meezi.API: POST /api/auth/login (employee password login, CHOOSE_CAFE support)
- Meezi.API: PUT/DELETE /api/cafes/{id}/employees/{id}/credentials (Owner/Manager only)
- Meezi.Admin.API: POST /api/admin/auth/login + PUT /api/admin/auth/password
- Dashboard login page: OTP / Password tabs
- Admin login page: OTP / Password tabs
- HR screen: new Credentials tab for setting employee username/password
- PlatformDataSeeder: ensure system admin + integration settings in production
- Trial countdown banner: updated deadline to 1 Tir 1405 (Jun 22)
- i18n: fa/en/ar updated for all new UI strings
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -45,7 +45,14 @@
|
||||
"chooseCafe": "اختر المقهى",
|
||||
"chooseCafeSubtitle": "هذا الرقم لديه صلاحية على عدة مقاهٍ. اختر واحداً للمتابعة.",
|
||||
"createNewCafe": "إنشاء مقهى جديد",
|
||||
"createNewCafeHint": "هل تريد بدء مقهاك الخاص بهذا الرقم؟"
|
||||
"createNewCafeHint": "هل تريد بدء مقهاك الخاص بهذا الرقم؟",
|
||||
"tabOtp": "رمز مؤقت",
|
||||
"tabPassword": "كلمة المرور",
|
||||
"username": "اسم المستخدم",
|
||||
"usernamePlaceholder": "اسم المستخدم",
|
||||
"password": "كلمة المرور",
|
||||
"passwordPlaceholder": "كلمة المرور",
|
||||
"invalidCredentials": "اسم المستخدم أو كلمة المرور غير صحيحة."
|
||||
},
|
||||
"roles": {
|
||||
"owner": "المالك",
|
||||
@@ -386,7 +393,8 @@
|
||||
"attendance": "الحضور",
|
||||
"leave": "الإجازة",
|
||||
"payroll": "الرواتب",
|
||||
"access": "صلاحيات الفروع"
|
||||
"access": "صلاحيات الفروع",
|
||||
"credentials": "بيانات الدخول"
|
||||
},
|
||||
"myAttendance": "حضوري",
|
||||
"clockIn": "تسجيل دخول",
|
||||
@@ -396,7 +404,22 @@
|
||||
"paid": "مدفوع",
|
||||
"markPaid": "تسجيل الدفع",
|
||||
"employeeCount": "الموظفون",
|
||||
"monthYear": "شهر الرواتب"
|
||||
"monthYear": "شهر الرواتب",
|
||||
"credentials": {
|
||||
"title": "بيانات دخول الموظفين",
|
||||
"subtitle": "حدد اسم مستخدم وكلمة مرور لكل موظف حتى يتمكن من تسجيل الدخول دون رمز OTP.",
|
||||
"selectEmployee": "اختر موظفاً أولاً",
|
||||
"username": "اسم المستخدم",
|
||||
"usernamePlaceholder": "مثال: ali_barista",
|
||||
"password": "كلمة المرور (8 أحرف على الأقل)",
|
||||
"passwordPlaceholder": "كلمة مرور جديدة",
|
||||
"set": "حفظ بيانات الدخول",
|
||||
"remove": "حذف بيانات الدخول",
|
||||
"removeConfirm": "هل أنت متأكد؟ لن يتمكن الموظف من تسجيل الدخول بكلمة مرور بعد الآن.",
|
||||
"saved": "تم حفظ بيانات الدخول.",
|
||||
"removed": "تم حذف بيانات الدخول.",
|
||||
"usernameTaken": "اسم المستخدم هذا مستخدم بالفعل."
|
||||
}
|
||||
},
|
||||
"reviews": {
|
||||
"title": "تقييمات العملاء",
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
"chooseCafe": "Choose a café",
|
||||
"chooseCafeSubtitle": "This number has access to several cafés. Pick one to continue.",
|
||||
"createNewCafe": "Create a new café",
|
||||
"createNewCafeHint": "Want to start your own café with this number?"
|
||||
"createNewCafeHint": "Want to start your own café with this number?",
|
||||
"tabOtp": "One-time code",
|
||||
"tabPassword": "Password",
|
||||
"username": "Username",
|
||||
"usernamePlaceholder": "Username",
|
||||
"password": "Password",
|
||||
"passwordPlaceholder": "Password",
|
||||
"invalidCredentials": "Incorrect username or password."
|
||||
},
|
||||
"roles": {
|
||||
"owner": "Owner",
|
||||
@@ -405,7 +412,8 @@
|
||||
"attendance": "Attendance",
|
||||
"leave": "Leave",
|
||||
"payroll": "Payroll",
|
||||
"access": "Branch access"
|
||||
"access": "Branch access",
|
||||
"credentials": "Login credentials"
|
||||
},
|
||||
"myAttendance": "My attendance",
|
||||
"clockIn": "Clock in",
|
||||
@@ -415,7 +423,22 @@
|
||||
"paid": "Paid",
|
||||
"markPaid": "Mark paid",
|
||||
"employeeCount": "Employees",
|
||||
"monthYear": "Payroll month"
|
||||
"monthYear": "Payroll month",
|
||||
"credentials": {
|
||||
"title": "Employee login credentials",
|
||||
"subtitle": "Set a username and password for each employee so they can sign in without an OTP.",
|
||||
"selectEmployee": "Select an employee first",
|
||||
"username": "Username",
|
||||
"usernamePlaceholder": "e.g. ali_barista",
|
||||
"password": "Password (min 8 characters)",
|
||||
"passwordPlaceholder": "New password",
|
||||
"set": "Save credentials",
|
||||
"remove": "Remove credentials",
|
||||
"removeConfirm": "Are you sure? The employee will no longer be able to sign in with a password.",
|
||||
"saved": "Credentials saved.",
|
||||
"removed": "Credentials removed.",
|
||||
"usernameTaken": "This username is already taken."
|
||||
}
|
||||
},
|
||||
"reviews": {
|
||||
"title": "Customer reviews",
|
||||
|
||||
@@ -56,7 +56,14 @@
|
||||
"chooseCafe": "انتخاب کافه",
|
||||
"chooseCafeSubtitle": "این شماره به چند کافه دسترسی دارد. یکی را انتخاب کنید.",
|
||||
"createNewCafe": "ایجاد کافه جدید",
|
||||
"createNewCafeHint": "میخواهید کافه خودتان را با همین شماره راهاندازی کنید؟"
|
||||
"createNewCafeHint": "میخواهید کافه خودتان را با همین شماره راهاندازی کنید؟",
|
||||
"tabOtp": "کد یکبارمصرف",
|
||||
"tabPassword": "رمز عبور",
|
||||
"username": "نام کاربری",
|
||||
"usernamePlaceholder": "نام کاربری",
|
||||
"password": "رمز عبور",
|
||||
"passwordPlaceholder": "رمز عبور",
|
||||
"invalidCredentials": "نام کاربری یا رمز عبور اشتباه است."
|
||||
},
|
||||
"roles": {
|
||||
"owner": "مالک",
|
||||
@@ -405,7 +412,8 @@
|
||||
"attendance": "حضور و غیاب",
|
||||
"leave": "مرخصی",
|
||||
"payroll": "حقوق",
|
||||
"access": "دسترسی شعب"
|
||||
"access": "دسترسی شعب",
|
||||
"credentials": "رمز ورود"
|
||||
},
|
||||
"myAttendance": "حضور من",
|
||||
"clockIn": "ورود",
|
||||
@@ -415,7 +423,22 @@
|
||||
"paid": "پرداخت شده",
|
||||
"markPaid": "ثبت پرداخت",
|
||||
"employeeCount": "تعداد کارمندان",
|
||||
"monthYear": "ماه حقوق"
|
||||
"monthYear": "ماه حقوق",
|
||||
"credentials": {
|
||||
"title": "مدیریت رمز ورود کارمندان",
|
||||
"subtitle": "برای هر کارمند میتوانید نام کاربری و رمز عبور تعریف کنید تا بدون نیاز به کد OTP وارد شوند.",
|
||||
"selectEmployee": "ابتدا یک کارمند انتخاب کنید",
|
||||
"username": "نام کاربری",
|
||||
"usernamePlaceholder": "مثال: ali_barista",
|
||||
"password": "رمز عبور (حداقل ۸ کاراکتر)",
|
||||
"passwordPlaceholder": "رمز عبور جدید",
|
||||
"set": "ذخیره رمز ورود",
|
||||
"remove": "حذف رمز ورود",
|
||||
"removeConfirm": "آیا مطمئنید؟ کارمند دیگر نمیتواند با رمز عبور وارد شود.",
|
||||
"saved": "رمز ورود ذخیره شد.",
|
||||
"removed": "رمز ورود حذف شد.",
|
||||
"usernameTaken": "این نام کاربری قبلاً استفاده شده است."
|
||||
}
|
||||
},
|
||||
"reviews": {
|
||||
"title": "نظرات مشتریان",
|
||||
|
||||
Reference in New Issue
Block a user