Skip to content

Commit 3f6ec38

Browse files
chpollinclaude
andcommitted
fix: konvolut-badges + projekt-seite mit quellenbeschreibung und tektonik
- Hauptbestand: alle Top-Level-Eintraege als 'Konvolut' gebadet (archivische Realitaet) - Plakate und Tontraeger behalten Einzeltyp-Badges - Konvolute starten expanded (Children sichtbar) - Projekt-Seite neu: Quellenbeschreibung (Teilnachlass), Tektonik (3 Bestandsgruppen, Konvolut-Charakter, Erschliessungsstand), Erfassung (Schichten-Modell), Modellierung (Pipeline + Verweis auf Modell-Seite) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent cbb3c9f commit 3f6ec38

File tree

3 files changed

+115
-46
lines changed

3 files changed

+115
-46
lines changed

docs/css/pages.css

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,18 @@
137137
color: var(--color-text-primary);
138138
}
139139

140+
/* Cross-page links */
141+
.page__link {
142+
color: var(--color-kug-blau);
143+
text-decoration: none;
144+
font-weight: var(--weight-semibold);
145+
transition: opacity var(--transition-fast);
146+
}
147+
148+
.page__link:hover {
149+
opacity: 0.7;
150+
}
151+
140152
/* Note / Prototyp */
141153
.page__note {
142154
font-size: var(--text-sm);

docs/js/views/archiv-bestand.js

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -299,11 +299,15 @@ function renderRows(items) {
299299
el('td', { className: 'archiv-col-typ' },
300300
item.isKonvolut
301301
? el('span', { className: 'badge badge--konvolut-struct' }, `Konvolut (${childCount})`)
302-
: docLabel && docType !== 'konvolut'
303-
? el('span', { className: `badge badge--${docType || ''}` }, docLabel)
304-
: !item.isKonvolut
305-
? el('span', { className: 'badge badge--unclassified' }, 'Nicht klassifiziert')
306-
: el('span')
302+
: item.isChild
303+
? (docLabel && docType !== 'konvolut'
304+
? el('span', { className: `badge badge--${docType || ''}` }, docLabel)
305+
: el('span', { className: 'badge badge--unclassified' }, 'Nicht klassifiziert'))
306+
: isStandaloneKonvolut(r)
307+
? el('span', { className: 'badge badge--konvolut-struct' }, 'Konvolut')
308+
: (docLabel
309+
? el('span', { className: `badge badge--${docType || ''}` }, docLabel)
310+
: el('span', { className: 'badge badge--unclassified' }, 'Nicht klassifiziert'))
307311
),
308312
el('td', { className: 'archiv-col-datum' },
309313
el('span', { className: `archiv-datum ${isUndated ? 'archiv-datum--undated' : ''}` }, displayDate)
@@ -346,6 +350,14 @@ function naturalSort(a, b) {
346350
return a.localeCompare(b, undefined, { numeric: true, sensitivity: 'base' });
347351
}
348352

353+
/** Top-level Hauptbestand records are archival units (Konvolute), not single items.
354+
* Plakate (NIM/PL_) and Tonträger (NIM_TT_) are actual single items. */
355+
function isStandaloneKonvolut(record) {
356+
const sig = record['rico:identifier'] || '';
357+
if (sig.includes('/PL_') || sig.includes('_TT_')) return false;
358+
return true;
359+
}
360+
349361
/**
350362
* For child records with duplicate titles within a Konvolut,
351363
* return a short distinguishing hint from the first verknüpfung.

docs/js/views/projekt.js

Lines changed: 86 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* M³GIM Projekt Page — Datenmodell, Erfassung, Erschließungsstand.
2+
* M³GIM Projekt Page — Quellenbeschreibung, Tektonik, Erfassung, Modellierung.
33
*/
44

55
import { el, clear } from '../utils/dom.js';
@@ -13,115 +13,160 @@ export function renderProjekt(store, container) {
1313
}).length;
1414
const pct = Math.round(linkedCount / store.allRecords.length * 100);
1515

16+
// Count Konvolute with children (erschlossene Konvolute)
17+
const erschlosseneKonvolute = store.konvolute.size;
18+
let erschlosseneEinzelstuecke = 0;
19+
for (const [, children] of store.konvolutChildren) {
20+
erschlosseneEinzelstuecke += children.filter(cid => !store.folioIds.has(cid)).length;
21+
}
22+
1623
const page = el('article', { className: 'page' },
1724

1825
el('header', { className: 'page__header' },
1926
el('h1', { className: 'page__title' }, 'Projekt'),
2027
el('p', { className: 'page__lead' },
21-
'Wie die Daten im Teilnachlass Malaniuk erfasst, strukturiert und visualisiert werden.'
28+
'Der Teilnachlass der Mezzosopranistin Ira Malaniuk (1919\u20132009) an der Kunstuniversit\u00e4t Graz \u2014 ' +
29+
'Quellen, Tektonik und Erschlie\u00dfungsprozess.'
2230
),
2331
),
2432

25-
// Schichten-Modell
33+
// Quellenbeschreibung
2634
el('section', { className: 'page__section' },
27-
el('h2', {}, 'Schichten-Modell der Erschließung'),
35+
el('h2', {}, 'Der Teilnachlass'),
2836
el('p', {},
29-
'Die Erfassung folgt einem dreistufigen Schichten-Modell. Jede Schicht baut auf der vorherigen auf:'
37+
'Das Universit\u00e4tsarchiv der Kunstuniversit\u00e4t Graz (UAKUG) bewahrt einen Teilnachlass der ' +
38+
'ukrainisch-\u00f6sterreichischen Mezzosopranistin Ira Malaniuk unter der Signatur UAKUG/NIM. ' +
39+
'Die Materialien dokumentieren eine internationale Opernkarriere, die von Lemberg \u00fcber Z\u00fcrich und M\u00fcnchen ' +
40+
'bis nach Wien, Bayreuth, Buenos Aires und London f\u00fchrte.'
3041
),
31-
el('dl', { className: 'page__layers' },
32-
el('dt', {}, 'Schicht 1 — Metadaten'),
33-
el('dd', {},
34-
'Grundlegende Beschreibung jedes Objekts: Signatur, Titel, Dokumenttyp, Datierung, Umfang. ' +
35-
'Dies entspricht der klassischen archivischen Verzeichnung.'
36-
),
37-
el('dt', {}, 'Schicht 2 — Verknüpfungen'),
38-
el('dd', {},
39-
'Verbindung der Objekte mit Personen, Organisationen, Orten und Werken. ' +
40-
'Jede Verknüpfung erhält eine Rolle (z.\u00a0B. Absender, Aufführungsort, erwähntes Werk). ' +
41-
'Aktuell haben ' + linkedCount + ' von ' + store.allRecords.length + ' Objekten (' + pct + '%) mindestens eine Verknüpfung.'
42-
),
43-
el('dt', {}, 'Schicht 3 — Interpretation'),
44-
el('dd', {},
45-
'Kontextualisierung und wissenschaftliche Einordnung: Mobilitätskategorien, ' +
46-
'biografische Zuordnung, Netzwerkanalyse. Diese Schicht wird in den Visualisierungen sichtbar.'
47-
),
42+
el('p', {},
43+
'Der Bestand umfasst Programme, Korrespondenzen, Vertr\u00e4ge, Rezensionen, Plakate, Urkunden, ' +
44+
'Fotografien und pers\u00f6nliche Dokumente aus dem Zeitraum 1934 bis 2009. ' +
45+
'Er ist eine zentrale Quelle f\u00fcr die Erforschung k\u00fcnstlerischer Mobilit\u00e4t im 20.\u00a0Jahrhundert.'
4846
),
4947
),
5048

51-
// Bestandsgruppen
49+
// Tektonik
5250
el('section', { className: 'page__section' },
53-
el('h2', {}, 'Bestandsgruppen'),
51+
el('h2', {}, 'Tektonik'),
5452
el('p', {},
55-
'Der Teilnachlass UAKUG/NIM gliedert sich in drei Bestandsgruppen:'
53+
'Der Teilnachlass gliedert sich in drei Bestandsgruppen mit insgesamt ' +
54+
store.allRecords.length + ' Archiveinheiten:'
5655
),
5756
el('table', { className: 'page__table' },
5857
el('thead', {},
5958
el('tr', {},
60-
el('th', {}, 'Gruppe'),
61-
el('th', {}, 'Objekte'),
59+
el('th', {}, 'Bestandsgruppe'),
60+
el('th', {}, 'Einheiten'),
6261
el('th', {}, 'Signaturschema'),
62+
el('th', {}, 'Materialien'),
6363
),
6464
),
6565
el('tbody', {},
6666
el('tr', {},
6767
el('td', {}, 'Hauptbestand'),
6868
el('td', {}, '255'),
6969
el('td', { className: 'mono' }, 'UAKUG/NIM_XXX'),
70+
el('td', {}, 'Programme, Korrespondenzen, Vertr\u00e4ge, Rezensionen, Urkunden, Sammlungen'),
7071
),
7172
el('tr', {},
7273
el('td', {}, 'Plakate'),
7374
el('td', {}, '26'),
7475
el('td', { className: 'mono' }, 'UAKUG/NIM/PL_XX'),
76+
el('td', {}, 'Opern- und Konzertplakate (1940er\u20131960er Jahre)'),
7577
),
7678
el('tr', {},
77-
el('td', {}, 'Tonträger'),
79+
el('td', {}, 'Tontr\u00e4ger'),
7880
el('td', {}, '1'),
7981
el('td', { className: 'mono' }, 'UAKUG/NIM_TT_01'),
82+
el('td', {}, 'Audioaufnahmen'),
8083
),
8184
),
8285
),
8386
el('p', {},
84-
'Drei Objekte sind Konvolute (NIM_003, NIM_004, NIM_007), die jeweils mehrere Einzelstücke enthalten. ' +
85-
'Die Konvolut-Hierarchie wird im Archiv-Tab durch einrückbare Kindzeilen dargestellt.'
87+
'Jede Archiveinheit im Hauptbestand ist ein Konvolut \u2014 ein physischer Umschlag oder eine Mappe, ' +
88+
'die mehrere Einzeldokumente enthalten kann. Die Titel auf den Konvoluten stammen h\u00e4ufig ' +
89+
'von handschriftlichen Aufschriften auf den Umschl\u00e4gen selbst.'
90+
),
91+
el('p', {},
92+
'Bei ' + erschlosseneKonvolute + ' Konvoluten (NIM_003, NIM_004, NIM_007) wurden die ' +
93+
erschlosseneEinzelstuecke + ' enthaltenen Einzelst\u00fccke bereits detailliert erfasst. ' +
94+
'Die \u00fcbrigen Konvolute sind bisher nur auf der Ebene der Archiveinheit beschrieben \u2014 ' +
95+
'ihre interne Zusammensetzung wird im Rahmen der laufenden Erschlie\u00dfung erg\u00e4nzt.'
96+
),
97+
),
98+
99+
// Erfassung
100+
el('section', { className: 'page__section' },
101+
el('h2', {}, 'Erfassung'),
102+
el('p', {},
103+
'Die Erschlie\u00dfung erfolgt durch Studierende und Mitarbeiter:innen der KUG Graz ' +
104+
'in einem kollaborativen Google-Spreadsheet. Die Erfassung folgt einem dreistufigen Schichten-Modell:'
105+
),
106+
el('dl', { className: 'page__layers' },
107+
el('dt', {}, 'Schicht 1 \u2014 Metadaten'),
108+
el('dd', {},
109+
'Grundlegende Beschreibung jeder Archiveinheit: Signatur, Titel, Dokumenttyp, Datierung, Sprache, Umfang. ' +
110+
'Dies entspricht der klassischen archivischen Verzeichnung.'
111+
),
112+
el('dt', {}, 'Schicht 2 \u2014 Verkn\u00fcpfungen'),
113+
el('dd', {},
114+
'Verbindung der Objekte mit Personen, Organisationen, Orten und Werken. ' +
115+
'Jede Verkn\u00fcpfung erh\u00e4lt eine Rolle (z.\u00a0B. Absender, Auff\u00fchrungsort, erw\u00e4hntes Werk). ' +
116+
'Aktuell haben ' + linkedCount + ' von ' + store.allRecords.length + ' Objekten (' + pct + '\u2009%) mindestens eine Verkn\u00fcpfung.'
117+
),
118+
el('dt', {}, 'Schicht 3 \u2014 Interpretation'),
119+
el('dd', {},
120+
'Kontextualisierung und wissenschaftliche Einordnung: Mobilit\u00e4tskategorien, ' +
121+
'biografische Zuordnung, Netzwerkanalyse. Diese Schicht wird in den Visualisierungen sichtbar.'
122+
),
86123
),
87124
),
88125

89-
// Pipeline
126+
// Modellierung
90127
el('section', { className: 'page__section' },
91-
el('h2', {}, 'Daten-Pipeline'),
128+
el('h2', {}, 'Modellierung'),
92129
el('p', {},
93-
'Die Daten werden in Google Sheets erfasst und über eine vierstufige Python-Pipeline verarbeitet:'
130+
'Die erfassten Daten werden \u00fcber eine automatisierte Pipeline in ein strukturiertes Format \u00fcberf\u00fchrt:'
94131
),
95132
el('ol', { className: 'page__pipeline' },
96133
el('li', {},
97134
el('strong', {}, 'Exploration'),
98-
' Analyse der Rohdaten, Erkennung von Strukturproblemen'
135+
' \u2014 Analyse der Rohdaten, Erkennung von Strukturproblemen'
99136
),
100137
el('li', {},
101138
el('strong', {}, 'Validierung'),
102-
' Normalisierung, Pflichtfeld-Prüfung, Cross-Table-Checks'
139+
' \u2014 Normalisierung, Pflichtfeld-Pr\u00fcfung, Cross-Table-Checks'
103140
),
104141
el('li', {},
105142
el('strong', {}, 'Transformation'),
106-
' Konvertierung zu JSON-LD nach RiC-O 1.1 mit m3gim-Erweiterungen'
143+
' \u2014 Konvertierung zu JSON-LD nach dem internationalen Archivstandard RiC-O 1.1 mit projektspezifischen m3gim-Erweiterungen'
107144
),
108145
el('li', {},
109146
el('strong', {}, 'View-Generierung'),
110-
' Erzeugung optimierter Datenstrukturen für jede Visualisierung'
147+
' \u2014 Erzeugung optimierter Datenstrukturen f\u00fcr jede Visualisierung'
111148
),
112149
),
150+
el('p', {},
151+
'Das resultierende Datenmodell beschreibt Archiveinheiten, ihre Verkn\u00fcpfungen zu Personen, Orten, ' +
152+
'Institutionen und Werken sowie die semantischen Rollen dieser Beziehungen. ' +
153+
'Eine detaillierte Beschreibung der Ontologie, Verkn\u00fcpfungstypen und Identifikatoren findet sich auf der '
154+
),
155+
el('p', {},
156+
el('a', { href: '#modell', className: 'page__link' }, '\u2192 Seite \u201eDatenmodell\u201c')
157+
),
113158
),
114159

115160
// Abwesenheits-Semantik
116161
el('section', { className: 'page__section' },
117162
el('h2', {}, 'Leere Felder und Abwesenheit'),
118163
el('p', {},
119-
'Ein leeres Feld bedeutet: „In dieser Quelle nicht ermittelbar." ' +
120-
'Es ist keine Aussage darüber, ob die Information existiert nur, dass sie aus dem vorliegenden Material nicht abgeleitet werden kann.'
164+
'Ein leeres Feld bedeutet: \u201eIn dieser Quelle nicht ermittelbar.\u201c ' +
165+
'Es ist keine Aussage dar\u00fcber, ob die Information existiert \u2014 nur, dass sie aus dem vorliegenden Material nicht abgeleitet werden kann.'
121166
),
122167
el('p', {},
123-
'Objekte ohne Datum werden als „o.\u00a0D." (ohne Datum) angezeigt. ' +
124-
'Objekte ohne Verknüpfungen befinden sich typischerweise noch in Schicht 1 der Erschließung.'
168+
'Objekte ohne Datum werden als \u201eo.\u00a0D.\u201c (ohne Datum) angezeigt. ' +
169+
'Objekte ohne Verkn\u00fcpfungen befinden sich typischerweise noch in Schicht\u00a01 der Erschlie\u00dfung.'
125170
),
126171
),
127172
);

0 commit comments

Comments
 (0)