diff --git a/apps/business/src/components/ChangeUserAccessModal.module.css b/apps/business/src/components/ChangeUserAccessModal.module.css index 279037f..944d3ae 100644 --- a/apps/business/src/components/ChangeUserAccessModal.module.css +++ b/apps/business/src/components/ChangeUserAccessModal.module.css @@ -77,11 +77,12 @@ .roleBadge { display: inline-block; - margin-top: 4px; - padding: 2px 8px; + margin-top: 2px; + padding: 0 5px; border-radius: 999px; - font-size: 11px; + font-size: 9px; font-weight: 600; + line-height: 1.5; color: var(--primary); background: rgba(var(--primary-rgb) / 0.1); border: 1px solid rgba(var(--primary-rgb) / 0.18); diff --git a/apps/business/src/components/Header.module.css b/apps/business/src/components/Header.module.css index e67342b..f48668c 100644 --- a/apps/business/src/components/Header.module.css +++ b/apps/business/src/components/Header.module.css @@ -6,11 +6,11 @@ position: sticky; top: 0; z-index: 50; - background: color-mix(in srgb, #ffffff 42%, transparent); - backdrop-filter: saturate(180%) blur(var(--blur-glass, 28px)); - -webkit-backdrop-filter: saturate(180%) blur(var(--blur-glass, 28px)); + background: var(--glass-bg); + backdrop-filter: blur(20px); + -webkit-backdrop-filter: blur(20px); border-bottom: 1px solid var(--glass-border); - /* Keep sticky header on its own compositor layer so backdrop blur samples content beneath */ + isolation: isolate; transform: translateZ(0); } @@ -112,9 +112,19 @@ line-height: 1.2; } -.role { - font-size: 12px; - color: var(--text-muted); +.roleBadge { + display: inline-block; + margin-top: 2px; + padding: 1px 8px; + border-radius: 999px; + font-size: 10px; + font-weight: 600; + line-height: 1.4; + color: var(--primary); + background: rgba(var(--primary-rgb) / 0.1); + border: 1px solid rgba(var(--primary-rgb) / 0.18); + font-family: var(--font-ui); + width: fit-content; } .chevron { diff --git a/apps/business/src/components/Header.tsx b/apps/business/src/components/Header.tsx index 77ee411..e1f28be 100644 --- a/apps/business/src/components/Header.tsx +++ b/apps/business/src/components/Header.tsx @@ -4,6 +4,7 @@ import { Menu, Bell, MessageSquare, ChevronDown, User, Settings, KeyRound, LogOu import { LanguageSelect, PasswordResetModal, useLocale } from '@meshkee/dashboard-ui' import { useAuth } from '../context/AuthContext' import { useT } from '../i18n/useT' +import { getActiveBusinessId } from '../lib/businessContext' import { changePassword } from '../services/authService' import styles from './Header.module.css' @@ -40,13 +41,16 @@ export function Header() { const menuRef = useRef(null) const displayName = displayUserName(user, locale, t('app.userFallback')) - const roleLabel = - user?.roleLabel ?? - (user?.isSuperAdmin || user?.roles.includes('super_admin') - ? t('role.superAdmin') - : user?.businesses[0]?.isOwner - ? t('role.owner') - : user?.businesses[0]?.teamRole ?? t('role.staff')) + const isSuperAdmin = Boolean(user?.isSuperAdmin || user?.roles.includes('super_admin')) + const activeBusinessId = getActiveBusinessId() + const membership = + user?.businesses.find((b) => String(b.id) === String(activeBusinessId)) ?? + user?.businesses[0] + const adminBadgeLabel = isSuperAdmin + ? t('role.superAdmin') + : membership?.teamRole === 'admin' + ? t('role.admin') + : null useEffect(() => { if (!menuOpen) return @@ -112,7 +116,9 @@ export function Header() { >
{displayName} - {roleLabel} + {adminBadgeLabel ? ( + {adminBadgeLabel} + ) : null}
= { 'role.superAdmin': 'سوپرادمین', 'role.owner': 'صاحب کسب‌وکار', + 'role.admin': 'ادمین', 'role.staff': 'کارمند', 'nav.home': 'خانه', diff --git a/apps/business/src/pages/CustomersPage.module.css b/apps/business/src/pages/CustomersPage.module.css index 08d4bf0..b16ab3a 100644 --- a/apps/business/src/pages/CustomersPage.module.css +++ b/apps/business/src/pages/CustomersPage.module.css @@ -41,27 +41,23 @@ } .colName { - width: 18%; -} - -.colRole { - width: 16%; + width: 24%; } .colCell { - width: 13%; + width: 16%; } .colOrders { - width: 10%; -} - -.colTransactions { width: 12%; } +.colTransactions { + width: 14%; +} + .colDate { - width: 11%; + width: 12%; } .colActions { diff --git a/apps/business/src/pages/CustomersPage.tsx b/apps/business/src/pages/CustomersPage.tsx index 96e60b2..d5870c7 100644 --- a/apps/business/src/pages/CustomersPage.tsx +++ b/apps/business/src/pages/CustomersPage.tsx @@ -33,7 +33,7 @@ import accessStyles from '../components/ChangeUserAccessModal.module.css' import styles from './CustomersPage.module.css' const PAGE_SIZE = 24 -const COLUMN_COUNT = 7 +const COLUMN_COUNT = 6 function formatDate(value: string, locale: 'en' | 'fa') { const d = new Date(value) @@ -54,13 +54,11 @@ function formatTransactionTotal(total: number | null | undefined) { return formatIrtPrice(total) } -function accessBadgeKey(user: BusinessCustomerListItem): BusinessMessageKey { +/** Badge under name — owner / admin only. */ +function adminBadgeKey(user: BusinessCustomerListItem): BusinessMessageKey | null { if (user.isBusinessOwner) return 'customers.access.badge.owner' if (user.teamRole === 'admin') return 'customers.access.badge.admin' - if (user.teamRole === 'editor') return 'customers.access.badge.editor' - if (user.teamRole === 'viewer') return 'customers.access.badge.viewer' - if (user.businessMemberId) return 'customers.access.badge.manager' - return 'customers.access.customer' + return null } function teamRoleMessageKey(teamRole: string): BusinessMessageKey { @@ -322,41 +320,40 @@ export function CustomersPage() {
{ e.preventDefault(); applyFilters() }}> -
-
- -
-
- setDraftName(e.target.value)} - placeholder={t('customers.filter.name')} - aria-label={t('customers.filter.name')} - /> -
-
- setDraftCell(e.target.value)} - placeholder={t('customers.filter.cell')} - aria-label={t('customers.filter.cell')} - autoComplete="off" - /> -
+
+ setDraftName(e.target.value)} + placeholder={t('customers.filter.name')} + aria-label={t('customers.filter.name')} + />
-
+
+ setDraftCell(e.target.value)} + placeholder={t('customers.filter.cell')} + aria-label={t('customers.filter.cell')} + autoComplete="off" + /> +
+
+ +
+