frontend: multi-page assets
ci / docker (backend, backend/Dockerfile, backend) (push) Successful in 26s
ci / docker (frontend, frontend/Dockerfile, frontend) (push) Successful in 56s

This commit is contained in:
2025-10-20 21:59:58 +02:00
parent 1859078cf4
commit 047b99e2aa
9 changed files with 841 additions and 124 deletions
+31 -6
View File
@@ -21,7 +21,7 @@ import {
matchPath,
} from 'react-router-dom';
import './styles.css';
import AssetManager, { getAssetFromVersion, resolveDocumentAssetUrl } from './asset_manager';
import AssetManager, { getAssetFromVersion, resolveDocumentAssetUrl, createAssetView } from './asset_manager';
import useApiError from './hooks/useApiError';
import SkeuomorphicWorkspace from './skeuomorphic_ws';
import DetailPanel from './detail/DetailPanel';
@@ -413,8 +413,27 @@ const AppLayout = () => {
const isAssetEquivalent = (lhs, rhs) => {
if (!lhs || !rhs) return false;
const lhsPrimaryMetadata = lhs?.objects?.[0]?.metadata || lhs?.metadata;
const rhsPrimaryMetadata = rhs?.objects?.[0]?.metadata || rhs?.metadata;
const lhsView = createAssetView(lhs);
const rhsView = createAssetView(rhs);
const lhsPrimaryMetadata = lhsView.getPrimaryMetadata() || lhs?.metadata;
const rhsPrimaryMetadata = rhsView.getPrimaryMetadata() || rhs?.metadata;
const lhsCardinality = lhsView.getCardinality() || lhs?.cardinality || null;
const rhsCardinality = rhsView.getCardinality() || rhs?.cardinality || null;
const lhsObjects = lhsView.getObjects();
const rhsObjects = rhsView.getObjects();
const objectsComparable = lhsObjects.length === rhsObjects.length
&& lhsObjects.every((entry, index) => {
const other = rhsObjects[index];
if (!other) return false;
if (entry.ordinal !== other.ordinal) return false;
if (entry.url && other.url && entry.url === other.url) {
return true;
}
if (!entry.url && !other.url) {
return JSON.stringify(entry.metadata || null) === JSON.stringify(other.metadata || null);
}
return entry.url === other.url;
});
return (
lhs.id === rhs.id &&
lhs.url === rhs.url &&
@@ -422,7 +441,9 @@ const AppLayout = () => {
lhsPrimaryMetadata?.height === rhsPrimaryMetadata?.height &&
lhs.mime_type === rhs.mime_type &&
lhs.asset_type === rhs.asset_type &&
lhs.created_at === rhs.created_at
lhs.created_at === rhs.created_at &&
lhsCardinality === rhsCardinality &&
objectsComparable
);
};
@@ -2354,13 +2375,17 @@ const AppLayout = () => {
);
const ensureAssetUrl = useCallback(
async (documentId, asset, { force = false } = {}) => {
async (documentId, asset, { force = false, start = null, limit = null } = {}) => {
if (!documentId || !asset?.id) {
return null;
}
try {
const entry = await assetManager.ensureAsset(documentId, asset, { force });
const entry = await assetManager.ensureAsset(documentId, asset, {
force,
start,
limit,
});
if (!entry) {
return null;