Add business workshop management UI with Jalali scheduling and shared dashboard polish.
Includes workshop list/edit/details, registrations modal, category tree, shared EmptyState/RichTextEditor/toasts, and fixes for the Jalali date picker and thumbnail field layout. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
co-authored by
Cursor
parent
89269dff04
commit
d5aca8bea7
@@ -3,6 +3,7 @@ import { useCallback, useEffect, useState } from 'react'
|
||||
import { MapPin, Pencil, Plus, Trash2 } from 'lucide-react'
|
||||
import { Breadcrumbs, useToast } from '@meshkee/dashboard-ui'
|
||||
import { AddressFormModal } from '../components/AddressFormModal'
|
||||
import { EmptyState } from '../components/EmptyState'
|
||||
import { Tooltip } from '../components/Tooltip'
|
||||
import { useT } from '../i18n/useT'
|
||||
import { ApiError, isAbortError } from '../lib/api'
|
||||
@@ -125,10 +126,12 @@ export function AddressesPage() {
|
||||
{loading && <p className={styles.status}>{t('addresses.loading')}</p>}
|
||||
|
||||
{!loading && addresses.length === 0 && (
|
||||
<div className={styles.empty}>
|
||||
<MapPin size={28} />
|
||||
<p>{t('addresses.empty')}</p>
|
||||
</div>
|
||||
<EmptyState
|
||||
icon={MapPin}
|
||||
message={t('addresses.empty')}
|
||||
actionLabel={t('addresses.add')}
|
||||
onAction={openCreateModal}
|
||||
/>
|
||||
)}
|
||||
|
||||
{!loading && addresses.length > 0 && (
|
||||
|
||||
@@ -2,6 +2,7 @@ import { PageTitle } from '../components/PageTitle'
|
||||
import { useEffect, useState } from 'react'
|
||||
import { Heart } from 'lucide-react'
|
||||
import { Breadcrumbs, Pagination, useToast } from '@meshkee/dashboard-ui'
|
||||
import { EmptyState } from '../components/EmptyState'
|
||||
import { FavoriteStoreItemCard } from '../components/FavoriteStoreItemCard'
|
||||
import { useT } from '../i18n/useT'
|
||||
import { ApiError, isAbortError } from '../lib/api'
|
||||
@@ -97,10 +98,7 @@ export function FavoritesPage() {
|
||||
{loading && <p className={styles.status}>{t('favorites.loading')}</p>}
|
||||
|
||||
{!loading && data?.items.length === 0 && (
|
||||
<div className={styles.empty}>
|
||||
<Heart size={32} />
|
||||
<p>{t('favorites.empty')}</p>
|
||||
</div>
|
||||
<EmptyState icon={Heart} message={t('favorites.empty')} layout="page" />
|
||||
)}
|
||||
|
||||
{!!data?.items.length && (
|
||||
|
||||
@@ -71,10 +71,10 @@
|
||||
}
|
||||
|
||||
.domain {
|
||||
font-size: 20px;
|
||||
font-size: 17px;
|
||||
font-weight: 700;
|
||||
color: var(--text-primary);
|
||||
line-height: 1.25;
|
||||
line-height: 1.3;
|
||||
}
|
||||
|
||||
.appName {
|
||||
|
||||
@@ -3,6 +3,7 @@ import { useEffect, useState } from 'react'
|
||||
import { Link, useNavigate } from 'react-router-dom'
|
||||
import { Package, Plus } from 'lucide-react'
|
||||
import { Breadcrumbs, Pagination, useToast } from '@meshkee/dashboard-ui'
|
||||
import { EmptyState } from '../components/EmptyState'
|
||||
import { UserProductCard } from '../components/UserProductCard'
|
||||
import { useT } from '../i18n/useT'
|
||||
import { ApiError, isAbortError } from '../lib/api'
|
||||
@@ -141,13 +142,12 @@ export function MyProductsPage() {
|
||||
{loading ? <p className={styles.status}>{t('myProducts.loading')}</p> : null}
|
||||
|
||||
{!loading && !error && products.length === 0 ? (
|
||||
<div className={styles.empty}>
|
||||
<Package size={32} />
|
||||
<p>{t('myProducts.empty')}</p>
|
||||
<Link to="/my-products/new" className={styles.emptyLink}>
|
||||
{t('myProducts.add')}
|
||||
</Link>
|
||||
</div>
|
||||
<EmptyState
|
||||
icon={Package}
|
||||
message={t('myProducts.empty')}
|
||||
actionLabel={t('myProducts.add')}
|
||||
actionTo="/my-products/new"
|
||||
/>
|
||||
) : null}
|
||||
|
||||
{!loading && products.length > 0 ? (
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { PageTitle } from '../components/PageTitle'
|
||||
import { useEffect, useMemo, useState } from 'react'
|
||||
import { Breadcrumbs, Pagination, useLocale } from '@meshkee/dashboard-ui'
|
||||
import { EmptyTableRow } from '../components/EmptyState'
|
||||
import { OrderItemsModal } from '../components/OrderItemsModal'
|
||||
import { OrderRow } from '../components/OrderRow'
|
||||
import { useT } from '../i18n/useT'
|
||||
@@ -131,11 +132,7 @@ export function OrdersPage() {
|
||||
)}
|
||||
|
||||
{!loading && data?.items.length === 0 && (
|
||||
<tr>
|
||||
<td className={styles.td} colSpan={COLUMN_COUNT}>
|
||||
{t('orders.empty')}
|
||||
</td>
|
||||
</tr>
|
||||
<EmptyTableRow colSpan={COLUMN_COUNT} message={t('orders.empty')} />
|
||||
)}
|
||||
|
||||
{!loading &&
|
||||
|
||||
Reference in New Issue
Block a user