Collect owner FA/EN names and clarify SSL status labels in super-admin.

Create business now requires both locales, and the businesses list shows FA and EN owner names when available.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-03 09:21:07 +03:30
co-authored by Cursor
parent 672091d1f5
commit 76d1cb7001
4 changed files with 68 additions and 15 deletions
@@ -462,6 +462,13 @@
line-height: 1.3; line-height: 1.3;
} }
.ownerNameEn {
font-size: 12px;
font-weight: 500;
color: var(--text-secondary);
line-height: 1.3;
}
.ownerPhone { .ownerPhone {
font-size: 11px; font-size: 11px;
font-weight: 500; font-weight: 500;
+53 -10
View File
@@ -217,6 +217,8 @@ export function BusinessesPage() {
const [createCategoryIds, setCreateCategoryIds] = useState<number[]>([]) const [createCategoryIds, setCreateCategoryIds] = useState<number[]>([])
const [createOwnerFirstName, setCreateOwnerFirstName] = useState('') const [createOwnerFirstName, setCreateOwnerFirstName] = useState('')
const [createOwnerLastName, setCreateOwnerLastName] = useState('') const [createOwnerLastName, setCreateOwnerLastName] = useState('')
const [createOwnerFirstNameEn, setCreateOwnerFirstNameEn] = useState('')
const [createOwnerLastNameEn, setCreateOwnerLastNameEn] = useState('')
const [createOwnerCell, setCreateOwnerCell] = useState('') const [createOwnerCell, setCreateOwnerCell] = useState('')
const [createOwnerPassword, setCreateOwnerPassword] = useState('') const [createOwnerPassword, setCreateOwnerPassword] = useState('')
const [createSubmitting, setCreateSubmitting] = useState(false) const [createSubmitting, setCreateSubmitting] = useState(false)
@@ -695,6 +697,8 @@ export function BusinessesPage() {
setCreateCategoryIds([]) setCreateCategoryIds([])
setCreateOwnerFirstName('') setCreateOwnerFirstName('')
setCreateOwnerLastName('') setCreateOwnerLastName('')
setCreateOwnerFirstNameEn('')
setCreateOwnerLastNameEn('')
setCreateOwnerCell('') setCreateOwnerCell('')
setCreateOwnerPassword('') setCreateOwnerPassword('')
setCreateError('') setCreateError('')
@@ -719,6 +723,8 @@ export function BusinessesPage() {
categoryIds: createCategoryIds, categoryIds: createCategoryIds,
ownerFirstName: createOwnerFirstName.trim(), ownerFirstName: createOwnerFirstName.trim(),
ownerLastName: createOwnerLastName.trim(), ownerLastName: createOwnerLastName.trim(),
ownerFirstNameEn: createOwnerFirstNameEn.trim(),
ownerLastNameEn: createOwnerLastNameEn.trim(),
ownerCellNumber, ownerCellNumber,
ownerPassword: createOwnerPassword, ownerPassword: createOwnerPassword,
}) })
@@ -782,6 +788,8 @@ export function BusinessesPage() {
createCategoryIds.length > 0 && createCategoryIds.length > 0 &&
createOwnerFirstName.trim().length >= 2 && createOwnerFirstName.trim().length >= 2 &&
createOwnerLastName.trim().length >= 2 && createOwnerLastName.trim().length >= 2 &&
createOwnerFirstNameEn.trim().length >= 2 &&
createOwnerLastNameEn.trim().length >= 2 &&
toE164CellNumber(createOwnerCell.trim()).length > 0 && toE164CellNumber(createOwnerCell.trim()).length > 0 &&
createOwnerPassword.length >= 8 createOwnerPassword.length >= 8
@@ -929,16 +937,16 @@ export function BusinessesPage() {
{b.sslEnabled ? ( {b.sslEnabled ? (
<span <span
className={styles.sslIcon} className={styles.sslIcon}
title="SSL enabled" title="SSL certificate valid"
aria-label="SSL enabled" aria-label="SSL certificate valid"
> >
<Lock size={16} className={styles.sslOk} aria-hidden="true" /> <Lock size={16} className={styles.sslOk} aria-hidden="true" />
</span> </span>
) : ( ) : (
<span <span
className={styles.sslIcon} className={styles.sslIcon}
title="SSL not enabled" title="SSL certificate missing or invalid"
aria-label="SSL not enabled" aria-label="SSL certificate missing or invalid"
> >
<AlertTriangle <AlertTriangle
size={16} size={16}
@@ -954,7 +962,12 @@ export function BusinessesPage() {
</td> </td>
<td className={styles.td}> <td className={styles.td}>
<div className={styles.ownerCell}> <div className={styles.ownerCell}>
<div className={styles.ownerName}>{b.ownerName ?? '—'}</div> <div className={`${styles.ownerName} faText`} dir="rtl" lang="fa">
{b.ownerName ?? '—'}
</div>
{b.ownerNameEn ? (
<div className={styles.ownerNameEn}>{b.ownerNameEn}</div>
) : null}
<div className={styles.ownerPhone}> <div className={styles.ownerPhone}>
{b.ownerCellNumber ? formatCellForDisplay(b.ownerCellNumber) : '—'} {b.ownerCellNumber ? formatCellForDisplay(b.ownerCellNumber) : '—'}
</div> </div>
@@ -1488,21 +1501,51 @@ export function BusinessesPage() {
</div> </div>
<div className={styles.field}> <div className={styles.field}>
<label htmlFor="create-owner-first-name">First name</label> <label htmlFor="create-owner-first-name-en">First name (EN)</label>
<input <input
id="create-owner-first-name" id="create-owner-first-name-en"
value={createOwnerFirstName} value={createOwnerFirstNameEn}
onChange={(e) => setCreateOwnerFirstName(e.target.value)} onChange={(e) => setCreateOwnerFirstNameEn(e.target.value)}
placeholder="First name"
disabled={createSubmitting} disabled={createSubmitting}
/> />
</div> </div>
<div className={styles.field}> <div className={styles.field}>
<label htmlFor="create-owner-last-name">Last name</label> <label htmlFor="create-owner-last-name-en">Last name (EN)</label>
<input
id="create-owner-last-name-en"
value={createOwnerLastNameEn}
onChange={(e) => setCreateOwnerLastNameEn(e.target.value)}
placeholder="Last name"
disabled={createSubmitting}
/>
</div>
<div className={styles.field}>
<label htmlFor="create-owner-first-name">First name (FA)</label>
<input
id="create-owner-first-name"
className="faText"
value={createOwnerFirstName}
onChange={(e) => setCreateOwnerFirstName(e.target.value)}
placeholder="نام"
dir="rtl"
lang="fa"
disabled={createSubmitting}
/>
</div>
<div className={styles.field}>
<label htmlFor="create-owner-last-name">Last name (FA)</label>
<input <input
id="create-owner-last-name" id="create-owner-last-name"
className="faText"
value={createOwnerLastName} value={createOwnerLastName}
onChange={(e) => setCreateOwnerLastName(e.target.value)} onChange={(e) => setCreateOwnerLastName(e.target.value)}
placeholder="نام خانوادگی"
dir="rtl"
lang="fa"
disabled={createSubmitting} disabled={createSubmitting}
/> />
</div> </div>
+5 -5
View File
@@ -493,16 +493,16 @@ export function WebsitesPage() {
{domain.sslEnabled ? ( {domain.sslEnabled ? (
<span <span
className={tableStyles.sslIcon} className={tableStyles.sslIcon}
title="SSL enabled" title="SSL certificate valid"
aria-label="SSL enabled" aria-label="SSL certificate valid"
> >
<Lock size={16} className={tableStyles.sslOk} aria-hidden="true" /> <Lock size={16} className={tableStyles.sslOk} aria-hidden="true" />
</span> </span>
) : ( ) : (
<span <span
className={tableStyles.sslIcon} className={tableStyles.sslIcon}
title="SSL not enabled" title="SSL certificate missing or invalid"
aria-label="SSL not enabled" aria-label="SSL certificate missing or invalid"
> >
<AlertTriangle <AlertTriangle
size={16} size={16}
@@ -512,7 +512,7 @@ export function WebsitesPage() {
</span> </span>
)} )}
<span className={tableStyles.subText}> <span className={tableStyles.subText}>
{domain.sslEnabled ? 'Enabled' : 'Disabled'} {domain.sslEnabled ? 'Valid' : 'Invalid'}
</span> </span>
</div> </div>
</td> </td>
+3
View File
@@ -19,6 +19,7 @@ export interface BusinessListItem {
domain: string | null domain: string | null
sslEnabled: boolean | null sslEnabled: boolean | null
ownerName: string | null ownerName: string | null
ownerNameEn: string | null
ownerCellNumber: string | null ownerCellNumber: string | null
isActive: boolean isActive: boolean
primaryColor: BusinessPrimaryColorId primaryColor: BusinessPrimaryColorId
@@ -94,6 +95,8 @@ export interface CreateBusinessPayload {
categoryIds: number[] categoryIds: number[]
ownerFirstName: string ownerFirstName: string
ownerLastName: string ownerLastName: string
ownerFirstNameEn: string
ownerLastNameEn: string
ownerCellNumber: string ownerCellNumber: string
ownerPassword: string ownerPassword: string
} }