import { SearchableSelect } from '../components/SearchableSelect'; import { useEffect, useState } from 'react'; import type { FormEvent } from 'react'; import { Link } from 'react-router'; import { Alert, EmptyState, LoadingBlock, errorMessage } from '../components/Feedback'; import { Icon } from '../components/Icon'; import { AssetCenterTabs } from '../features/assets/AssetCenterTabs'; import { assetStatusLabel, ASSET_STATUSES } from '../features/assets/assetPresentation'; import { AssetVersionDrawer } from '../features/assets/AssetVersionDrawer'; import { assetVersionChangeLabel } from '../features/assets/assetVersionPresentation'; import { getTemporalAsset, listAssetTypes, listTemporalAssets } from '../lib/api'; import type { AssetInformationStatus, AssetType, PageMeta, TemporalAssetDetail, TemporalAssetSummary, } from '../lib/api'; import { formatDate } from '../lib/format'; function localDateTime(date: Date): string { const local = new Date(date.getTime() - date.getTimezoneOffset() * 60_000); return local.toISOString().slice(0, 16); } interface TemporalFilters { search: string; typeId: string; status: AssetInformationStatus | ''; } const emptyFilters: TemporalFilters = { search: '', typeId: '', status: '' }; export function TemporalAssetsPage() { const initialDate = new Date(); const [draftAt, setDraftAt] = useState(localDateTime(initialDate)); const [at, setAt] = useState(initialDate.toISOString()); const [draft, setDraft] = useState(emptyFilters); const [filters, setFilters] = useState(emptyFilters); const [assets, setAssets] = useState([]); const [types, setTypes] = useState([]); const [meta, setMeta] = useState({ page: 1, pageSize: 25, total: 0, totalPages: 0 }); const [page, setPage] = useState(1); const [loading, setLoading] = useState(true); const [error, setError] = useState(''); const [detail, setDetail] = useState(null); const [detailLoading, setDetailLoading] = useState(false); useEffect(() => { listAssetTypes().then(setTypes).catch(() => undefined); }, []); useEffect(() => { setLoading(true); setError(''); listTemporalAssets({ at, page, pageSize: 25, ...filters }) .then((response) => { setAssets(response.data); setMeta(response.meta); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [at, filters, page]); const apply = (event: FormEvent) => { event.preventDefault(); const selected = new Date(draftAt); if (Number.isNaN(selected.getTime())) { setError('Seleccioná una fecha y hora válida.'); return; } setPage(1); setAt(selected.toISOString()); setFilters({ ...draft, search: draft.search.trim() }); }; const reset = () => { const now = new Date(); setDraftAt(localDateTime(now)); setAt(now.toISOString()); setDraft(emptyFilters); setFilters(emptyFilters); setPage(1); }; const open = async (asset: TemporalAssetSummary) => { setDetail(null); setDetailLoading(true); setError(''); try { setDetail(await getTemporalAsset(asset.assetId, at)); } catch (requestError) { setError(errorMessage(requestError)); } finally { setDetailLoading(false); } }; return
INVENTARIOS

Registros

Reconstruí cómo se encontraban los inventarios en una fecha y hora.

{meta.total} registros

Vista histórica exacta. Los resultados provienen de snapshots inmutables; no reemplazan ni modifican los datos actuales.

Inventarios reconstruidos al {formatDate(at)}Las vigencias terminan cuando se registra la versión siguiente.
{error && {error}} {loading ? : assets.length === 0 ? :
{meta.total} registro{meta.total === 1 ? '' : 's'} reconstruido{meta.total === 1 ? '' : 's'}Página {page} de {Math.max(meta.totalPages, 1)}
{assets.map((asset) => )}
Registro históricoTipoEstadoVersión aplicableVigente desdeVigente hastaCambio
{asset.assetName}{asset.assetCode}{asset.typeName}{assetStatusLabel(asset.informationStatus)}v{asset.versionNumber}{asset.isCurrent ? ' · actual' : ''}{formatDate(asset.occurredAt)}{asset.effectiveUntil ? formatDate(asset.effectiveUntil) : 'Continúa vigente'}{assetVersionChangeLabel(asset.changeType)}
{meta.total ? `${(page - 1) * meta.pageSize + 1}–${Math.min(page * meta.pageSize, meta.total)} de ${meta.total}` : '0 resultados'}
} {(detailLoading || detail) && setDetail(null)} />}
; }