diff --git a/frontend.zip b/frontend.zip new file mode 100644 index 0000000000..5fdc9e8be5 Binary files /dev/null and b/frontend.zip differ diff --git a/frontend/public/data/heritage_custodian_ontology.mmd b/frontend/public/data/heritage_custodian_ontology.mmd index 6d353e1771..12744947a7 100644 --- a/frontend/public/data/heritage_custodian_ontology.mmd +++ b/frontend/public/data/heritage_custodian_ontology.mmd @@ -1,7 +1,7 @@ ```mermaid classDiagram %% Generated from LinkML manifest: /schemas/20251121/linkml/manifest.json -%% Manifest generated: 2026-02-20T11:59:56.167Z +%% Manifest generated: 2026-02-20T12:44:35.583Z direction LR class AbbreviatedTitle class AbbreviationVariant diff --git a/frontend/src/lib/linkml/linkml-schema-service.ts b/frontend/src/lib/linkml/linkml-schema-service.ts index d484d78773..5540b59344 100644 --- a/frontend/src/lib/linkml/linkml-schema-service.ts +++ b/frontend/src/lib/linkml/linkml-schema-service.ts @@ -309,7 +309,7 @@ export interface SlotImportInfo { }>; } -const SCHEMA_BASE_PATH = '/schemas/20251121/linkml'; +let schemaBasePath = '/schemas/20251121/linkml'; /** * Progress tracking for schema loading @@ -418,6 +418,33 @@ class LinkMLSchemaService { private progressCallbacks: Set = new Set(); private lastProgress: SchemaLoadingProgress | null = null; + setSchemaBasePath(nextBasePath: string): void { + const normalized = nextBasePath.replace(/\/$/, ''); + if (normalized === schemaBasePath) { + return; + } + + schemaBasePath = normalized; + this.reset(); + } + + getSchemaBasePath(): string { + return schemaBasePath; + } + + private reset(): void { + this.mainSchema = null; + this.classSchemas = new Map(); + this.classToFile = new Map(); + this.slotSchemas = new Map(); + this.enumSchemas = new Map(); + this.mergedPrefixes = { ...COMMON_PREFIXES }; + this.loading = null; + this.loaded = false; + this.manifest = null; + this.lastProgress = null; + } + /** * Subscribe to progress updates */ @@ -495,7 +522,7 @@ class LinkMLSchemaService { if (this.manifest) return this.manifest; try { - const response = await fetch(`${SCHEMA_BASE_PATH}/manifest.json`); + const response = await fetch(`${schemaBasePath}/manifest.json`); if (response.ok) { this.manifest = await response.json() as SchemaManifest; debugLog(`[LinkMLSchemaService] Loaded manifest.json (generated: ${this.manifest.generated})`); @@ -621,7 +648,7 @@ class LinkMLSchemaService { let slotFileNames: string[] = this._getFilesFromManifest('slot'); if (slotFileNames.length === 0) { try { - const slotManifestResponse = await fetch(`${SCHEMA_BASE_PATH}/modules/slots/manifest.json`); + const slotManifestResponse = await fetch(`${schemaBasePath}/modules/slots/manifest.json`); if (slotManifestResponse.ok) { const slotManifest = await slotManifestResponse.json(); slotFileNames = slotManifest.files || []; diff --git a/frontend/src/lib/linkml/schema-loader.ts b/frontend/src/lib/linkml/schema-loader.ts index 6e21da8e8d..9b53b567f1 100644 --- a/frontend/src/lib/linkml/schema-loader.ts +++ b/frontend/src/lib/linkml/schema-loader.ts @@ -110,8 +110,26 @@ export interface SchemaManifest { categories: SchemaCategory[]; } -const SCHEMA_BASE_PATH = '/schemas/20251121/linkml'; -const MANIFEST_PATH = `${SCHEMA_BASE_PATH}/manifest.json`; +let schemaBasePath = '/schemas/20251121/linkml'; + +function buildManifestPath(): string { + return `${schemaBasePath}/manifest.json`; +} + +export function setSchemaBasePath(nextBasePath: string): void { + const normalized = nextBasePath.replace(/\/$/, ''); + if (normalized === schemaBasePath) { + return; + } + + schemaBasePath = normalized; + cachedManifest = null; + manifestLoadPromise = null; +} + +export function getSchemaBasePath(): string { + return schemaBasePath; +} // Cache for the manifest let cachedManifest: SchemaManifest | null = null; @@ -134,7 +152,7 @@ export async function loadManifest(): Promise { // Start loading manifestLoadPromise = (async () => { try { - const response = await fetch(MANIFEST_PATH); + const response = await fetch(buildManifestPath()); if (!response.ok) { console.error(`Failed to load manifest: ${response.status}`); return null; @@ -196,7 +214,7 @@ export function getSchemaCategoriesSync(): SchemaCategory[] { */ export async function loadSchema(schemaPath: string): Promise { try { - const response = await fetch(`${SCHEMA_BASE_PATH}/${schemaPath}`); + const response = await fetch(`${schemaBasePath}/${schemaPath}`); if (!response.ok) { console.error(`Failed to load schema: ${schemaPath}`, response.status); return null; @@ -215,7 +233,7 @@ export async function loadSchema(schemaPath: string): Promise { try { - const response = await fetch(`${SCHEMA_BASE_PATH}/${schemaPath}`); + const response = await fetch(`${schemaBasePath}/${schemaPath}`); if (!response.ok) { console.error(`Failed to load schema: ${schemaPath}`, response.status); return null; diff --git a/schemas/20251121/linkml/modules/schemata_bronhouder.zip b/schemas/20251121/linkml/modules/schemata_bronhouder.zip new file mode 100644 index 0000000000..1487e90cb4 Binary files /dev/null and b/schemas/20251121/linkml/modules/schemata_bronhouder.zip differ