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 { ASSET_VERSION_CHANGES, assetVersionChangeLabel, assetVersionFieldLabel, } from '../features/assets/assetVersionPresentation'; import { getAssetVersion, listAssetTypes, listAssetVersions, } from '../lib/api'; import type { AssetInformationStatus, AssetType, AssetVersionChangeType, AssetVersionDetail, AssetVersionSummary, PageMeta, } from '../lib/api'; import { formatDate } from '../lib/format'; interface HistoryFilters { search: string; typeId: string; status: AssetInformationStatus | ''; changeType: AssetVersionChangeType | ''; from: string; to: string; } const emptyFilters: HistoryFilters = { search: '', typeId: '', status: '', changeType: '', from: '', to: '', }; export function HistoryPage() { const [versions, setVersions] = useState([]); const [types, setTypes] = useState([]); const [meta, setMeta] = useState({ page: 1, pageSize: 25, total: 0, totalPages: 0 }); const [draft, setDraft] = useState(emptyFilters); const [filters, setFilters] = useState(emptyFilters); 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(''); listAssetVersions({ page, pageSize: 25, search: filters.search, typeId: filters.typeId, status: filters.status, changeType: filters.changeType, from: filters.from ? `${filters.from}T00:00:00.000Z` : undefined, to: filters.to ? `${filters.to}T23:59:59.999Z` : undefined, }) .then((response) => { setVersions(response.data); setMeta(response.meta); }) .catch((requestError) => setError(errorMessage(requestError))) .finally(() => setLoading(false)); }, [filters, page]); const set = (key: K, value: HistoryFilters[K]) => { setDraft((current) => ({ ...current, [key]: value })); }; const apply = (event: FormEvent) => { event.preventDefault(); setPage(1); setFilters({ ...draft, search: draft.search.trim() }); }; const clear = () => { setDraft(emptyFilters); setFilters(emptyFilters); setPage(1); }; const open = async (version: AssetVersionSummary) => { setDetail(null); setDetailLoading(true); setError(''); try { setDetail(await getAssetVersion(version.assetId, version.versionNumber)); } catch (requestError) { setError(errorMessage(requestError)); } finally { setDetailLoading(false); } }; return
INVENTARIOS

Historial

Historial completo de cambios realizados sobre los inventarios.

{meta.total} versiones
{error && {error}} {loading ? : versions.length === 0 ? :
{meta.total} versiones registradasPágina {page} de {Math.max(meta.totalPages, 1)}
{versions.map((version) => )}
Fecha y horaRegistroVersiónCambioCamposUsuarioEstado
{formatDate(version.occurredAt)}{version.assetName}{version.assetCode} · {version.typeName}v{version.versionNumber}{version.isCurrent ? ' · actual' : ''}{assetVersionChangeLabel(version.changeType)}{version.source}
{version.changedFields.slice(0, 3).map((field) => {assetVersionFieldLabel(field)})}
{version.actorUsername ?? 'Sistema'}{assetStatusLabel(version.informationStatus)}
{meta.total ? `${(page - 1) * meta.pageSize + 1}–${Math.min(page * meta.pageSize, meta.total)} de ${meta.total}` : '0 resultados'}
} {(detailLoading || detail) && setDetail(null)} />}
; }