diff --git a/src/components/GrampsjsDnaMatches.js b/src/components/GrampsjsDnaMatches.js new file mode 100644 index 00000000..6a9049bf --- /dev/null +++ b/src/components/GrampsjsDnaMatches.js @@ -0,0 +1,139 @@ +import {html, css, LitElement} from 'lit' + +import '@material/mwc-menu' +import '@material/mwc-list/mwc-list-item' + +import {sharedStyles} from '../SharedStyles.js' +import {GrampsjsTranslateMixin} from '../mixins/GrampsjsTranslateMixin.js' +import {personDisplayName} from '../util.js' + +class GrampsjsDnaMatches extends GrampsjsTranslateMixin(LitElement) { + static get styles() { + return [ + sharedStyles, + css` + .match { + border-top: 1px solid rgba(0, 0, 0, 0.1); + padding: 0 20px; + } + + .match:last-child { + border-bottom: 1px solid rgba(0, 0, 0, 0.1); + } + .head { + display: inline-block; + margin-right: 2em; + vertical-align: middle; + width: 10rem; + padding: 20px 0; + } + + .name { + font-weight: 350; + font-size: 17px; + } + + dl { + display: inline-block; + vertical-align: middle; + } + + dd { + font-size: 15px; + } + `, + ] + } + + static get properties() { + return { + data: {type: Array}, + person: {type: Object}, + } + } + + constructor() { + super() + this.data = [] + this.person = {} + } + + render() { + return html` + + ${this.data + .filter(match => match.segments && match.segments.length > 0) + .map(match => this._personCard(match))} +
+ ` + } + + _personCard(match) { + return html` +
+
+ + ${this._getNameFromHandle(match.handle)} +
+
+
+
${this._('Relationship')}
+
${match.relation || this._('Unknown')}
+
+
+
${this._('Shared DNA')}
+
+ ${match.segments.reduce( + (accumulator, currentValue) => accumulator + currentValue.cM, + 0 + )} + cM +
+
+
+
${this._('Shared Segments')}
+
${match.segments.length}
+
+
+
${this._('Largest Segment')}
+
+ ${match.segments.reduce( + (accumulator, currentValue) => + Math.max(accumulator, currentValue.cM), + 0 + )} + cM +
+
+
+
+ ` + } + + _getNameFromHandle(handle) { + const people = this.person?.extended?.people || [] + let person = people.filter(p => p.handle === handle) + if (person.length === 0) { + return '' + } + // eslint-disable-next-line prefer-destructuring + person = person[0] + return personDisplayName(person) + } + + _getGidFromHandle(handle) { + const people = this.person?.extended?.people || [] + let person = people.filter(p => p.handle === handle) + if (person.length === 0) { + return '' + } + // eslint-disable-next-line prefer-destructuring + person = person[0] + return person.gramps_id + } +} + +window.customElements.define('grampsjs-dna-matches', GrampsjsDnaMatches) diff --git a/src/lang/en.json b/src/lang/en.json index 70d2d5b6..2f3ada3e 100644 --- a/src/lang/en.json +++ b/src/lang/en.json @@ -125,5 +125,11 @@ "Edit event type": "Edit event type", "Edit place type": "Edit place type", "Text Recognition": "Text Recognition", - "Save as Note": "Save as Note" + "Save as Note": "Save as Note", + "DNA": "DNA", + "Matches": "Matches", + "Chromosome Browser": "Chromosome Browser", + "Shared DNA": "Shared DNA", + "Shared Segments": "Shared Segments", + "Largest Segment": "Largest Segment" } \ No newline at end of file diff --git a/src/views/GrampsjsViewPersonDna.js b/src/views/GrampsjsViewPersonDna.js index fc2cedd7..94fb4959 100644 --- a/src/views/GrampsjsViewPersonDna.js +++ b/src/views/GrampsjsViewPersonDna.js @@ -3,6 +3,7 @@ import {html, css} from 'lit' import {GrampsjsView} from './GrampsjsView.js' import {apiGet} from '../api.js' import '../components/GrampsjsChromosomeBrowser.js' +import '../components/GrampsjsDnaMatches.js' export class GrampsjsViewPersonDna extends GrampsjsView { static get styles() { @@ -12,6 +13,10 @@ export class GrampsjsViewPersonDna extends GrampsjsView { :host { margin: 0; } + + h3 { + margin: 1.2em 0; + } `, ] } @@ -37,6 +42,13 @@ export class GrampsjsViewPersonDna extends GrampsjsView { renderElements() { return html` +

${this._('Matches')}

+ +

${this._('Chromosome Browser')}