diff --git a/src/details/details.tsx b/src/details/details.tsx index fd83257..19c818d 100644 --- a/src/details/details.tsx +++ b/src/details/details.tsx @@ -12,20 +12,14 @@ import { mapToSource, } from '../util/gedcom_util'; import {AdditionalFiles} from './additional-files'; -import {Events} from './events'; +import {ALL_SUPPORTED_EVENT_TYPES, Events} from './events'; import {MultilineText} from './multiline-text'; import {Sources} from './sources'; import {TranslatedTag} from './translated-tag'; import {WrappedImage} from './wrapped-image'; const EXCLUDED_TAGS = [ - 'BIRT', - 'BAPM', - 'CHR', - 'EVEN', - 'CENS', - 'DEAT', - 'BURI', + ...ALL_SUPPORTED_EVENT_TYPES, 'NAME', 'SEX', 'FAMC', diff --git a/src/details/events.tsx b/src/details/events.tsx index 6f1ef62..e4d3b0c 100644 --- a/src/details/events.tsx +++ b/src/details/events.tsx @@ -18,6 +18,7 @@ import { mapToSource, pointerToId, resolveDate, + resolveType, Source, } from '../util/gedcom_util'; import {FileEntry} from './additional-files'; @@ -52,7 +53,8 @@ interface Props { } interface EventData { - type: string; + tag: string; + type?: string; date?: DateOrRange; age?: string; personLink?: GedcomEntry; @@ -64,25 +66,73 @@ interface EventData { indi: string; } -const EVENT_TAGS = [ - 'BIRT', +const BIRTH_EVENT_TAGS = ['BIRT']; +const INDI_EVENT_TAGS = [ + 'ADOP', 'BAPM', - 'CHR', - 'FAMS', - 'EVEN', + 'BARM', + 'BASM', + 'BLES', 'CENS', - 'DEAT', - 'BURI', + 'CHR', + 'CHRA', + 'CONF', + 'EDUC', + 'EMIG', + 'EVEN', + 'FAMS', + 'FCOM', + 'GRAD', + 'IMMI', + 'NATU', + 'ORDN', + 'OCCU', + 'PROP', + 'RESI', + 'RETI', + 'WILL', + '_DEG', + '_ELEC', + '_MDCL', + '_MILT', ]; -const FAMILY_EVENT_TAGS = ['MARR', 'DIV']; +const FAMILY_EVENT_TAGS = [ + 'ANUL', + 'CENS', + 'DIV', + 'DIVF', + 'ENGA', + 'EVEN', + 'MARB', + 'MARC', + 'MARL', + 'MARR', + 'MARS', +]; +const LIFE_EVENT_TAGS = [...INDI_EVENT_TAGS, ...FAMILY_EVENT_TAGS]; +const DEATH_EVENT_TAGS = ['DEAT']; +const AFTER_DEATH_EVENT_TAGS = ['BURI', 'CREM', 'PROB']; +const SORTED_EVENT_TYPE_GROUPS = [ + BIRTH_EVENT_TAGS, + LIFE_EVENT_TAGS, + DEATH_EVENT_TAGS, + AFTER_DEATH_EVENT_TAGS, +]; + +export const ALL_SUPPORTED_EVENT_TYPES = [ + ...BIRTH_EVENT_TAGS, + ...LIFE_EVENT_TAGS, + ...DEATH_EVENT_TAGS, + ...AFTER_DEATH_EVENT_TAGS, +]; function EventHeader(props: {event: EventData}) { const intl = useIntl(); return (
- +
{props.event.date ? (
@@ -93,6 +143,13 @@ function EventHeader(props: {event: EventData}) { ); } +function getEventTitle(event: EventData) { + if (event.tag === 'EVEN' && event.type) { + return event.type; + } + return event.tag; +} + function getSpouse(indi: string, familyEntry: GedcomEntry, gedcom: GedcomData) { const spouseReference = familyEntry.tree .filter((familySubEntry) => ['WIFE', 'HUSB'].includes(familySubEntry.tag)) @@ -110,13 +167,13 @@ function getAge( gedcom: GedcomData, intl: IntlShape, ): string | undefined { - if (eventEntry.tag !== 'DEAT') { + if (!DEATH_EVENT_TAGS.includes(eventEntry.tag)) { return undefined; } const deathDate = resolveDate(eventEntry); const birthDate = gedcom.indis[indi].tree - .filter((indiSubEntry) => indiSubEntry.tag === 'BIRT') + .filter((indiSubEntry) => BIRTH_EVENT_TAGS.includes(indiSubEntry.tag)) .map((birthEvent) => resolveDate(birthEvent)) .find((topolaDate) => topolaDate); @@ -176,10 +233,25 @@ function eventSources(entry: GedcomEntry, gedcom: GedcomData): Source[] { } function eventNotes(entry: GedcomEntry, gedcom: GedcomData): string[][] { - return entry.tree - .filter((subentry) => ['NOTE', 'TYPE'].includes(subentry.tag)) - .map((note) => dereference(note, gedcom, (gedcom) => gedcom.other)) - .map((note) => getData(note)); + const externalNotes = entry.tree + .filter((subEntry) => subEntry.tag === 'NOTE') + .map((note) => dereference(note, gedcom, (gedcom) => gedcom.other)); + + //for generic 'EVEN' tag 'TYPE is mandatory and is part of the header, for other types it can be worth it to display it as a note + const type = + entry.tag !== 'EVEN' + ? entry.tree.filter((subEntry) => subEntry.tag === 'TYPE') + : []; + + //entry.data contains event description, so it's also displayed in notes section + return ( + [entry, ...type, ...externalNotes] + .filter((entry) => !!entry.data) + /* In Gedcom 'Y' only indicates event occurred, but it doesn't contain any valuable information + like place, date or description, so it should be omitted when fetching entry data. */ + .filter((entry) => entry.data !== 'Y') + .map((note) => getData(note)) + ); } function toEvent( @@ -203,8 +275,9 @@ function toIndiEvent( const date = resolveDate(entry) || null; return [ { + tag: entry.tag, date: date ? getDate(date.data) : undefined, - type: entry.tag, + type: resolveType(entry), age: getAge(entry, indi, gedcom, intl), place: eventPlace(entry), images: eventImages(entry, gedcom), @@ -224,17 +297,18 @@ function toFamilyEvents( const family = dereference(entry, gedcom, (gedcom) => gedcom.fams); return flatMap(FAMILY_EVENT_TAGS, (tag) => family.tree.filter((entry) => entry.tag === tag), - ).map((familyMarriageEvent) => { - const date = resolveDate(familyMarriageEvent) || null; + ).map((familyEvent) => { + const date = resolveDate(familyEvent) || null; return { + tag: familyEvent.tag, date: date ? getDate(date.data) : undefined, - type: familyMarriageEvent.tag, + type: resolveType(familyEvent), personLink: getSpouse(indi, family, gedcom), - place: eventPlace(familyMarriageEvent), - images: eventImages(familyMarriageEvent, gedcom), - files: eventFiles(familyMarriageEvent, gedcom), - notes: eventNotes(familyMarriageEvent, gedcom), - sources: eventSources(familyMarriageEvent, gedcom), + place: eventPlace(familyEvent), + images: eventImages(familyEvent, gedcom), + files: eventFiles(familyEvent, gedcom), + notes: eventNotes(familyEvent, gedcom), + sources: eventSources(familyEvent, gedcom), indi: indi, }; }); @@ -267,9 +341,9 @@ function Event(props: {event: EventData}) { export function Events(props: Props) { const intl = useIntl(); - const events = flatMap(EVENT_TAGS, (tag) => + const events = flatMap(SORTED_EVENT_TYPE_GROUPS, (eventTypeGroup) => props.entries - .filter((entry) => entry.tag === tag) + .filter((entry) => eventTypeGroup.includes(entry.tag)) .map((eventEntry) => toEvent(eventEntry, props.gedcom, props.indi, intl)) .flatMap((events) => events) .sort((event1, event2) => compareDates(event1.date, event2.date)), diff --git a/src/details/translated-tag.tsx b/src/details/translated-tag.tsx index 3513ab2..dd6d233 100644 --- a/src/details/translated-tag.tsx +++ b/src/details/translated-tag.tsx @@ -3,27 +3,49 @@ import {FormattedMessage} from 'react-intl'; const TAG_DESCRIPTIONS = new Map([ ['ADOP', 'Adoption'], ['BAPM', 'Baptism'], + ['BARM', 'Bar Mitzvah'], + ['BASM', 'Bas Mitzvah'], ['BIRT', 'Birth'], + ['BLES', 'Blessing'], ['BURI', 'Burial'], ['CENS', 'Census'], ['CHR', 'Christening'], + ['CHRA', 'Adult christening'], + ['CONF', 'Confirmation'], ['CREM', 'Cremation'], ['DEAT', 'Death'], + ['DEG', 'Degree'], + ['DIV', 'Divorce'], + ['DIVF', 'Divorce filed'], ['EDUC', 'Education'], + ['ELEC', 'Elected'], ['EMAIL', 'E-mail'], ['EMIG', 'Emigration'], + ['ENGA', 'Engagement'], ['EVEN', 'Event'], ['FACT', 'Fact'], + ['FCOM', 'First communion'], + ['GRAD', 'Graduation'], ['IMMI', 'Immigration'], + ['MARB', 'Marriage bann'], + ['MARC', 'Marriage contract'], + ['MARL', 'Marriage license'], ['MARR', 'Marriage'], - ['DIV', 'Divorce'], + ['MARS', 'Marriage settlement'], + ['MDCL', 'Medical info'], ['MILT', 'Military services'], ['NATU', 'Naturalization'], - ['OCCU', 'Occupation'], - ['TITL', 'Title'], - ['WWW', 'WWW'], ['OBJE', 'Additional files'], + ['OCCU', 'Occupation'], + ['ORDN', 'Ordination'], + ['PROB', 'Probate'], + ['PROP', 'Property'], + ['RESI', 'Residence'], + ['RETI', 'Retirement'], ['SOUR', 'Sources'], + ['TITL', 'Title'], + ['WILL', 'Will'], + ['WWW', 'WWW'], ['birth', 'Birth name'], ['married', 'Married name'], ['maiden', 'Maiden name'], diff --git a/src/translations/pl.json b/src/translations/pl.json index 124e4a5..7c5350c 100644 --- a/src/translations/pl.json +++ b/src/translations/pl.json @@ -39,27 +39,54 @@ "select_wikitree_id.comment": "Wpisz identyfikator profilu {wikiTreeLink}. Przykłady: {example1}, {example2}", "select_wikitree_id.cancel": "Anuluj", "select_wikitree_id.load": "Otwórz", + "gedcom.ADOP": "Adopcja", "gedcom.BAPM": "Chrzest", + "gedcom.BARM": "Bar Micwa", + "gedcom.BASM": "Bat Micwa", "gedcom.BIRT": "Narodziny", + "gedcom.BLES": "Błogosławieństwo", "gedcom.BURI": "Pogrzeb", "gedcom.CENS": "Spis ludności", "gedcom.CHR": "Chrzest", + "gedcom.CHRA": "Chrzest dorosłych", + "gedcom.CONF": "Bierzmowanie", + "gedcom.CREM": "Kremacja", "gedcom.DEAT": "Śmierć", + "gedcom.DEG": "Stopień naukowy", + "gedcom.DIV": "Rozwód", + "gedcom.DIVF": "Wniesienie pozwu o rozwód", "gedcom.DSCR": "Opis", "gedcom.EDUC": "Wykształcenie", + "gedcom.ELEC": "Wybór na stanowisko", "gedcom.EMAIL": "E-mail", + "gedcom.EMIG": "Emigracja", + "gedcom.ENGA": "Zaręczyny", "gedcom.EVEN": "Wydarzenie", "gedcom.FACT": "Fakt", - "gedcom.MILT": "Służba wojskowa", - "gedcom.OCCU": "Zawód", - "gedcom.RIN": "ID", - "gedcom.TITL": "Tytuł", - "gedcom.WWW": "Strona WWW", - "gedcom.OBJE": "Dodatkowe pliki", - "gedcom.SOUR": "Źródła", - "gedcom._UPD": "Ostatnia aktualizacja", + "gedcom.FCOM": "Pierwsza komunia", + "gedcom.GRAD": "Ukończenie szkoły", + "gedcom.IMMI": "Imigracja", + "gedcom.MARB": "Zapowiedzi małżeńskie", + "gedcom.MARC": "Kontrakt małżeński", + "gedcom.MARL": "Licencja małżeńska", "gedcom.MARR": "Małżeństwo", - "gedcom.DIV": "Rozwód", + "gedcom.MARS": "Ugoda małżeńska", + "gedcom.MDCL": "Informacje medyczne", + "gedcom.MILT": "Służba wojskowa", + "gedcom.NATU": "Nadanie obywatelstwa", + "gedcom.OBJE": "Dodatkowe pliki", + "gedcom.OCCU": "Zawód", + "gedcom.ORDN": "Święcenia", + "gedcom.PROB": "Postępowanie spadkowe", + "gedcom.PROP": "Nieruchomość", + "gedcom.RESI": "Miejsce zamieszkania", + "gedcom.RETI": "Emerytura", + "gedcom.RIN": "ID", + "gedcom.SOUR": "Źródła", + "gedcom.TITL": "Tytuł", + "gedcom.WILL": "Testament", + "gedcom.WWW": "Strona WWW", + "gedcom._UPD": "Ostatnia aktualizacja", "gedcom.birth": "Nazwisko rodowe", "gedcom.married": "Nazwisko po małżeństwie", "gedcom.maiden": "Nazwisko panieńskie", diff --git a/src/util/gedcom_util.ts b/src/util/gedcom_util.ts index 819e4ca..ca69d95 100644 --- a/src/util/gedcom_util.ts +++ b/src/util/gedcom_util.ts @@ -332,6 +332,10 @@ export function resolveDate(entry: GedcomEntry) { return entry.tree.find((subEntry) => subEntry.tag === 'DATE'); } +export function resolveType(entry: GedcomEntry) { + return entry.tree.find((subEntry) => subEntry.tag === 'TYPE')?.data; +} + export function mapToSource( sourceEntryReference: GedcomEntry, gedcom: GedcomData,