diff --git a/src/app/components/apparatus-entry/apparatus-entry-detail/apparatus-entry-detail.component.ts b/src/app/components/apparatus-entry/apparatus-entry-detail/apparatus-entry-detail.component.ts index ea051df1e..31823d2e4 100644 --- a/src/app/components/apparatus-entry/apparatus-entry-detail/apparatus-entry-detail.component.ts +++ b/src/app/components/apparatus-entry/apparatus-entry-detail/apparatus-entry-detail.component.ts @@ -71,12 +71,10 @@ export class ApparatusEntryDetailComponent implements OnInit, OnDestroy { return result; }); + this.showLemma = !!this.data.lemma; if (this.witnessPanelService) { const isWitnessExcluded = this.data.isWitnessExcluded(this.witnessPanelService.witnessId); - this.showLemma = !!this.data.lemma && !isWitnessExcluded; - } - else{ - this.showLemma = false; + this.showLemma = !isWitnessExcluded; } } diff --git a/src/app/components/critical-apparatus/critical-apparatus.component.ts b/src/app/components/critical-apparatus/critical-apparatus.component.ts index a49cdb92e..68be187f3 100644 --- a/src/app/components/critical-apparatus/critical-apparatus.component.ts +++ b/src/app/components/critical-apparatus/critical-apparatus.component.ts @@ -4,6 +4,7 @@ import { EVTStatusService } from '../../services/evt-status.service'; import { combineLatest, map, Observable, tap } from 'rxjs'; import { ApparatusEntry } from 'src/app/models/evt-models'; import { HoverService } from 'src/app/services/hover.service'; +import { distinctBy } from 'src/app/utils/js-utils'; @Component({ selector: 'evt-critical-apparatus', @@ -12,20 +13,24 @@ import { HoverService } from 'src/app/services/hover.service'; }) export class CriticalApparatusComponent { @Input() pageID: string; - @ViewChildren('appDetails', { read: ElementRef}) appDetails!: QueryList; + @ViewChildren('appDetails', { read: ElementRef }) appDetails!: QueryList; private appClasses = ['app']; private apparatusInCurrentPage = this.evtStatusService.getPageElementsByClassList(this.appClasses) entries$: Observable<{ entry: ApparatusEntry, isSelected: boolean }[]> = combineLatest([ - this.apparatusInCurrentPage.pipe(map(data => data.flat())), + this.apparatusInCurrentPage.pipe( + map(data => data.flat()), + map(data => distinctBy(data, item => item.id)) + ), this.hoverService.selectedApparatusEntries$ ]).pipe( map(([appEntries, selectedAppEntries]) => { const apparatusEntries = appEntries as ApparatusEntry[]; - const apps = apparatusEntries.map(entry => { - const selectedApp = selectedAppEntries.find(app => app.additionalAttributes.exponentId === entry.additionalAttributes.exponentId); - return { entry, isSelected: !!selectedApp }; - }); + const apps = apparatusEntries + .map(entry => { + const selectedApp = selectedAppEntries.find(app => app.additionalAttributes.exponentId === entry.additionalAttributes.exponentId); + return { entry, isSelected: !!selectedApp }; + }); const orderedApps = apps.sort((a, b) => { const lengthComparison = a.entry.exponent.length - b.entry.exponent.length; if (lengthComparison !== 0) { diff --git a/src/app/services/xml-parsers/structure-xml-parser.service.ts b/src/app/services/xml-parsers/structure-xml-parser.service.ts index f9afb9500..6f61ebd03 100644 --- a/src/app/services/xml-parsers/structure-xml-parser.service.ts +++ b/src/app/services/xml-parsers/structure-xml-parser.service.ts @@ -327,6 +327,13 @@ export class StructureXmlParserService { const app = item as ApparatusEntry; if (!app) throw new Error("Invalid type " + app); + const callback = (content: any[]) => this.addApparatusExponents( + content, + onApparatusEntryReplaced, + getExponentLabel, + onShouldResetCounter); + this.addNestedApparatusExponents(app, callback); + const id = this.getExponentId(); const to = id; // the exponent itself as the To element let exponent: ApparatusEntryExponent = null; @@ -423,6 +430,27 @@ export class StructureXmlParserService { } } + private addNestedApparatusExponents(app: ApparatusEntry, callback: (content: any[]) => void) { + const contentValues: ContentValue[] = []; + this.populateValuesWithContent(app, contentValues); + for (const value of contentValues) { + callback(value.content); + } + } + + private populateValuesWithContent(obj: any, accumulator: ContentValue[]) { + const values = Object.values(obj) + .flatMap(x => x as any) + .filter(x => typeof (x) === 'object'); + for (let index = 0; index < values.length; index++) { + const value = values[index]; + if (value.content) { + accumulator.push(value); + this.populateValuesWithContent({ content: value.content }, accumulator); + } + } + } + private getExponentId(): string { const uuid = uuidv4(); return 'app-exponent-' + uuid; @@ -603,4 +631,8 @@ function getEditionOrigNode(el: XMLElement, doc: Document) { } return el; +} + +interface ContentValue { + content: any[] } \ No newline at end of file diff --git a/src/app/utils/js-utils.ts b/src/app/utils/js-utils.ts index 980f5d26a..ef1f51a12 100644 --- a/src/app/utils/js-utils.ts +++ b/src/app/utils/js-utils.ts @@ -116,3 +116,13 @@ export function interleave(items: T[], separator: T): T[] { } return result; } + +export function distinctBy(array: T[], keySelector: (item: T) => K): T[] { + const seen = new Set(); + return array.filter(item => { + const key = keySelector(item); + if (seen.has(key)) return false; + seen.add(key); + return true; + }) +} \ No newline at end of file