Add shared empty states, customer product filters, and SSO handoff across dashboards.

Standardize list empty UI, searchable country fields, customer-products filter row, password/login polish, and one-time business dashboard handoff from the customer app.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-19 19:46:57 +03:30
co-authored by Cursor
parent 832ac32a09
commit f8a9a28346
55 changed files with 1264 additions and 907 deletions
@@ -1,8 +1,9 @@
import { useEffect, useState } from 'react'
import { useNavigate } from 'react-router-dom'
import { FileStack, FileText, Pencil, Plus, Settings as SettingsIcon, Trash2 } from 'lucide-react'
import { FileStack, FileText, Pencil, Plus, Trash2 } from 'lucide-react'
import { Breadcrumbs } from '../components/Breadcrumbs'
import { ConfirmDeleteModal } from '../components/ConfirmDeleteModal'
import { EmptyTableRow } from '../components/EmptyState'
import { Modal } from '../components/Modal'
import { PageTitle } from '../components/PageTitle'
import { isEmptyRichText, richTextToPlain } from '../components/RichTextEditor'
@@ -256,14 +257,13 @@ export function InvoiceTemplatesPage() {
</thead>
<tbody>
{!loading && invoiceTemplates.length === 0 ? (
<tr>
<td className={tableStyles.td} colSpan={5}>
<div className={styles.emptyState}>
<SettingsIcon size={20} />
<span>{t('invoiceTemplates.emptyTemplates')}</span>
</div>
</td>
</tr>
<EmptyTableRow
colSpan={5}
icon={FileStack}
message={t('invoiceTemplates.emptyTemplates')}
actionLabel={t('invoiceTemplates.addTemplate')}
actionTo="/invoices/templates/new"
/>
) : null}
{invoiceTemplates.map((template) => (
<tr key={template.id}>
@@ -364,14 +364,13 @@ export function InvoiceTemplatesPage() {
</thead>
<tbody>
{!loading && itemTemplates.length === 0 ? (
<tr>
<td className={tableStyles.td} colSpan={6}>
<div className={styles.emptyState}>
<SettingsIcon size={20} />
<span>{t('invoiceTemplates.emptyItems')}</span>
</div>
</td>
</tr>
<EmptyTableRow
colSpan={6}
icon={FileText}
message={t('invoiceTemplates.emptyItems')}
actionLabel={t('invoiceTemplates.addItem')}
onAction={openCreateItem}
/>
) : null}
{itemTemplates.map((template) => (
<tr key={template.id}>