Add business Finance hub with invoices and templates.

Ship invoice issue/list/templates under Finance, fix tenant theme reset and owner role badge, and show customers-joined charts by Persian months.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-11 15:17:03 +03:30
co-authored by Cursor
parent 722933dda9
commit 917b840ee5
44 changed files with 5136 additions and 105 deletions
+18 -3
View File
@@ -1,5 +1,6 @@
import { useEffect, useMemo, useState } from 'react'
import { MessageSquare, Pencil, Plus, RotateCcw, Search, Shield, Ticket, Trash2 } from 'lucide-react'
import { useNavigate } from 'react-router-dom'
import { MessageSquare, Pencil, Plus, Receipt, RotateCcw, Search, Shield, Ticket, Trash2 } from 'lucide-react'
import { useLocale } from '@meshkee/dashboard-ui'
import { AddCustomerModal } from '../components/AddCustomerModal'
import { Breadcrumbs } from '../components/Breadcrumbs'
@@ -70,6 +71,7 @@ function teamRoleMessageKey(teamRole: string): BusinessMessageKey {
export function CustomersPage() {
const t = useT()
const navigate = useNavigate()
const { locale } = useLocale()
const { user: authUser } = useAuth()
const { showToast } = useToast()
@@ -243,6 +245,10 @@ export function CustomersPage() {
}
}
function handleViewInvoices(customer: BusinessCustomerListItem) {
navigate(`/invoices?userId=${customer.id}`, { state: { presetCustomer: customer } })
}
function handleSendSms(customer: BusinessCustomerListItem) {
showToast(
t('customers.toast.smsSoon', { phone: formatCellForDisplay(customer.cellNumber) }),
@@ -352,8 +358,7 @@ export function CustomersPage() {
<option value="managers">{t('customers.filter.access.managers')}</option>
</select>
</div>
<div className={filterStyles.filterSpacerCol4} aria-hidden="true" />
<div className={`${filterStyles.filterActions} ${filterStyles.filterActionsCol1}`}>
<div className={`${filterStyles.filterActions} ${filterStyles.filterActionsEnd}`}>
<button
type="submit"
className={`${filterStyles.iconActionBtn} ${filterStyles.iconActionBtnPrimary}`}
@@ -532,6 +537,16 @@ export function CustomersPage() {
<Pencil size={15} />
</button>
</Tooltip>
<Tooltip label={t('customers.invoices')}>
<button
type="button"
className={styles.actionBtn}
onClick={() => handleViewInvoices(customer)}
aria-label={t('customers.invoices')}
>
<Receipt size={15} />
</button>
</Tooltip>
<Tooltip label={t('customers.sms')}>
<button
type="button"