3cd2e83b25
- useProperties: added usePropertyById, usePropertyMatches, usePropertySignals hooks - propertyService.getProperties(), matchService.getMatchesForProperty(), futureSignalService.getSignalsForProperty() added - PropertyFilterBar: asset type chips, availability select, sort select, search - PropertyTable: sortable columns, row selection highlight, loading skeletons, empty/error states, Eye/Plus/Bookmark actions - PropertyCard: decision-object card with header, primary, matchability, data quality and action zones; card states (selected, compareSelected, stale, low-confidence) - PropertyDetailView: 7-tab detail panel (Übersicht, Hard Facts, Soft Factors, Matchability, Datenqualität, Quelle, Signale) with low-quality banner, missing field UX, data update CTA - PropertyDetailSkeleton: loading state - Properties page: two-panel layout (table + sliding detail panel) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
import { MockupPropertyProvider } from '../provider/MockupPropertyProvider'
|
|
import type { PropertyFilters } from '../provider/IPropertyProvider'
|
|
import type { CreatePropertyInput, UpdatePropertyInput } from '../domain/property'
|
|
import type { ListResponse, ItemResponse } from './types'
|
|
import type { Property } from '../domain/property'
|
|
|
|
const provider = MockupPropertyProvider
|
|
const ACTIVE_STATUSES: readonly string[] = ['AVAILABLE_NOW', 'AVAILABLE_SOON']
|
|
|
|
export const propertyService = {
|
|
async getAll(filters?: PropertyFilters): Promise<ListResponse<Property>> {
|
|
const data = await provider.getAll(filters)
|
|
return { data, meta: { total: data.length, page: 1, pageSize: data.length, hasMore: false } }
|
|
},
|
|
async getById(id: string): Promise<ItemResponse<Property | null>> {
|
|
const data = await provider.getById(id)
|
|
return { data }
|
|
},
|
|
async create(input: CreatePropertyInput): Promise<ItemResponse<Property>> {
|
|
const data = await provider.create(input)
|
|
return { data }
|
|
},
|
|
async update(id: string, input: UpdatePropertyInput): Promise<ItemResponse<Property>> {
|
|
const data = await provider.update(id, input)
|
|
return { data }
|
|
},
|
|
async remove(id: string): Promise<ItemResponse<void>> {
|
|
await provider.remove(id)
|
|
return { data: undefined }
|
|
},
|
|
|
|
async getDashboardPropertiesSummary(): Promise<{ total: number; active: number }> {
|
|
const data = await provider.getAll()
|
|
return {
|
|
total: data.length,
|
|
active: data.filter(p => ACTIVE_STATUSES.includes(p.availabilityStatus)).length,
|
|
}
|
|
},
|
|
|
|
async getProperties(filters?: PropertyFilters): Promise<ListResponse<Property>> {
|
|
const data = await provider.getAll(filters)
|
|
return { data, meta: { total: data.length, page: 1, pageSize: data.length, hasMore: false } }
|
|
},
|
|
}
|