Three asks after a walk-through of the dashboard:
1. Dashboard navigation was missing direct entry points to the two
catalog surfaces (Dự án, Khu Công Nghiệp) even though both exist at
/du-an and /khu-cong-nghiep. Users landing in the dashboard had to
go back out to the public header to reach them.
2. The "Tin đăng" (dashboard listings) page defaulted to a 3-column
grid which shows only a handful of properties per viewport. Scanning
many listings at once is easier as a vertical list of horizontal
rows.
3. The public /search results used the same 3-column grid via
PropertyCard. Asked to flip to list there too.
Changes
- (dashboard)/layout.tsx: new `catalogs` nav group with Building2 +
Factory icons pointing at /du-an and /khu-cong-nghiep. Primary
desktop nav also exposes both so they're reachable without opening
the hamburger. Uses existing `nav.projects` / `nav.industrialParks`
i18n keys plus a new `dashboard.catalogs` label in vi/en.
- (dashboard)/listings/page.tsx: default viewMode flipped from 'grid'
to 'list'. The list mode renders a horizontal row per listing
(thumbnail + title/location + price + badges + engagement counters)
inside an <ul>. Toggle button relabelled "Danh sách".
- components/search/search-results.tsx + property-card.tsx: add a
`layout?: 'card' | 'list'` prop to PropertyCard. When `list`, the
card renders as a horizontal row with 224px thumbnail on sm+,
stacked on mobile. SearchResults wraps items in a <ul><li> and asks
for list layout. Default card layout preserved so other callers
(compare, related, etc.) keep their vertical card view.
No API / DB changes. Typecheck clean for the touched surfaces.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
- Rewrite prisma/seed.ts to populate all 27 models with realistic
Vietnamese real estate data (8 users with login, 10 properties,
10 listings, orders, payments, reviews, notifications, etc.)
- Replace all emoji icons with Lucide React SVG icons across frontend
for consistent rendering, sizing, and accessibility
- Redesign dashboard nav: grouped sidebar with section headers,
primary/secondary split on desktop, icon-only secondary items
- Replace language switcher flag emoji with Globe icon
- Replace SVG theme toggle with Lucide Moon/Sun icons
- Fix API startup: graceful fallback for Sentry profiling, Google OAuth,
and Zalo OAuth when credentials are not configured
- Relax rate limiting in development mode (10k req/min)
- Fix listings API to include media[] array in search response
- Add optional chaining for property.media across frontend components
- Update OAuth strategy tests to match graceful fallback behavior
Co-Authored-By: Claude Opus 4 (1M context) <noreply@anthropic.com>
Update 12 page/layout files across auth, dashboard, listings, and search
routes to improve type safety, fix component imports, and align with
latest API changes.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Create a single `currency.ts` utility with `formatPrice`, `formatVND`,
`formatPricePerM2`, and `parseVND` to replace 9+ duplicated inline
formatters. This fixes inconsistent decimal handling (1.5M was truncated
to "1 triệu") and standardises price/m² display. Integrated across
property cards, listing detail, dashboard, analytics, payments, pricing,
and admin moderation pages with 19 new unit tests.
Co-Authored-By: Paperclip <noreply@paperclip.ing>
Add locale-prefixed routes for admin, auth, dashboard, and public pages.
Add error, loading, and not-found pages for locale context. Add language
switcher UI component for Vietnamese/English toggle.
Co-Authored-By: Paperclip <noreply@paperclip.ing>