From 32b91a9d43a9c45187409bab6be757b2d38df8ba Mon Sep 17 00:00:00 2001 From: Alexander Rind <1217527+alex-rind@users.noreply.github.com> Date: Tue, 25 Jun 2024 15:36:35 +0200 Subject: [PATCH 01/18] cleanup & update of simple statistics (in-progress) --- src/data/AlterCategories.ts | 106 ++++++++++++++++++------------------ src/de.ts | 32 ++++++----- 2 files changed, 71 insertions(+), 67 deletions(-) diff --git a/src/data/AlterCategories.ts b/src/data/AlterCategories.ts index e9096ae..a8b617c 100644 --- a/src/data/AlterCategories.ts +++ b/src/data/AlterCategories.ts @@ -15,18 +15,18 @@ export const CATEGORY_TRANSLATIONS: Record> = { de: "Sektor", en: "Sector", }, - "Kreis 3": { - de: "Kreis 3", - en: "Circle 3", - }, - "Kreis 3 + 2": { - de: "Kreis 3 + 2", - en: "Circle 3 + 2", - }, - "Kreis 3 + 2 + 1": { - de: "Kreis 3 + 2 + 1", - en: "Circle 3 + 2 + 1", - }, + // "Kreis 3": { + // de: "Kreis 3", + // en: "Circle 3", + // }, + // "Kreis 3 + 2": { + // de: "Kreis 3 + 2", + // en: "Circle 3 + 2", + // }, + // "Kreis 3 + 2 + 1": { + // de: "Kreis 3 + 2 + 1", + // en: "Circle 3 + 2 + 1", + // }, "prof. Hilfe": { de: "Prof. Hilfe", en: "Professional Help", @@ -39,22 +39,22 @@ export const CATEGORY_TRANSLATIONS: Record> = { de: "gesamtes Netzwerk", en: "Entire Network", }, - Geschlecht: { - de: "Geschlecht", - en: "Gender", - }, + // Geschlecht: { + // de: "Geschlecht", + // en: "Gender", + // }, Überblick: { de: "Überblick", en: "Overview", }, - "Horizont (kumulativ)": { - de: "Horizont (kumulativ)", - en: "Cumulative Horizon", - }, - Horizont: { - de: "Horizont", - en: "Horizon", - }, + // "Horizont (kumulativ)": { + // de: "Horizont (kumulativ)", + // en: "Cumulative Horizon", + // }, + // Horizont: { + // de: "Horizont", + // en: "Horizon", + // }, Familie: { de: "Familie", en: "Family", @@ -71,22 +71,22 @@ export const CATEGORY_TRANSLATIONS: Record> = { de: "prof. Helfer*innen", en: "Professional Helpers", }, - weiblich: { - de: "weiblich", - en: "Female", - }, - männlich: { - de: "männlich", - en: "Male", - }, - divers: { - de: "divers", - en: "Diverse", - }, - "nicht festgelegt": { - de: "nicht festgelegt", - en: "Not Specified", - }, + // weiblich: { + // de: "weiblich", + // en: "Female", + // }, + // männlich: { + // de: "männlich", + // en: "Male", + // }, + // divers: { + // de: "divers", + // en: "Diverse", + // }, + // "nicht festgelegt": { + // de: "nicht festgelegt", + // en: "Not Specified", + // }, }; export function sectorIndex(alter: Alter): number | null { @@ -132,6 +132,7 @@ const PROFI: AlterCategorization = { categories: ["prof. Hilfe", "Netzwerk ohne prof. Hilfe", "gesamtes Netzwerk"], }; +/* obsolete categorizations (since Jun 2024) const HORIZON_CUM: AlterCategorization = { label: "Horizont (kumulativ)", inCategory: (catIndex: number, a: Alter): boolean => @@ -152,6 +153,7 @@ const GENDER: AlterCategorization = { a.currentGender === Gender[catIndex], categories: ["weiblich", "männlich", "divers", "nicht festgelegt,"], }; +*/ // const AGE: AlterCategorization = { // label: "Alter", @@ -173,17 +175,13 @@ const ALL: AlterCategorization = { }; export function getAlterCategorization(key = ""): AlterCategorization { - return key === "sector" - ? SECTOR - : key === "profi" - ? PROFI - : key === "horizon" - ? HORIZON - : key === "horizon_cum" - ? HORIZON_CUM - : key === "gender" - ? GENDER - : ALL; + return key === "sector" ? SECTOR : key === "profi" ? PROFI : ALL; + // : key === "horizon" + // ? HORIZON + // : key === "horizon_cum" + // ? HORIZON_CUM + // : key === "gender" + // ? GENDER // : key === "age" // ? AGE } @@ -192,8 +190,8 @@ export const allAlterCategorizationKeys = [ "", "sector", "profi", - "horizon", - "horizon_cum", - "gender", + // "horizon", + // "horizon_cum", + // "gender", // "age", ]; diff --git a/src/de.ts b/src/de.ts index 12612d7..931bfaf 100644 --- a/src/de.ts +++ b/src/de.ts @@ -34,31 +34,37 @@ export default { horizon: "Horizont", horizoncumulative: "Horizont (kumulativ)", gender: "Geschlecht", - networksize: "Netzwerkgröße", + networksize: "Netzwerkgröße (+aktivierbare)", + sizebygender: "nach Geschlecht", + closeness: "Durchschn. Nähe (SD)", relationshipweight: "Beziehungsgewicht", - totaldensity: "Dichte gesamt", + totaldensity: "Dichte", categorydensity: "Dichte der Kategorie", stars: "Star(s)", categorystar: "Star(s) (pro Kategorie)", - bridges: "Brücken", - bridgepersons: "Brückenperson(en)", + // bridges: "Brücken", + // bridgepersons: "Brückenperson(en)", isolatedpersons: "Isolierte", - personswithoutedgetotheego: "Personen ohne Kante zur Ankerperson", + personswithoutedgetotheego: "Personen ohne Kante zum Ego", networkmsg: - "Anzahl der Kontakte im Netzwerk exklusive Ankerperson und exklusive Personen ohne Kante zur Ankerperson", + "Anzahl der Kontakte im Netzwerk exklusive des Egos und exklusive Personen ohne Kante zum Ego (bzw. inklusive aktivierbarer Personen; d.h. Menschen, nicht verstorben)", + closenessmsg: + "arithmetisches Mittel der Nähe der Kontakte zum Ego in 9 konzentrischen Ringen (9=nah … 1=entfernt)", relationshipmsg: "Summierte Nähe bzw. Distanz der Kontakte zur Ankerperson. Je höher die Kennzahl, umso näher stehen die Personen der Ankerperson.", densitymsg: - "Verhältnis der tatsächlich vorhandenen zu den theoretisch möglichen Verbindungen (exklusive der Verbindungen zwischen Anker- und Kontaktpersonen, inklusive Personen ohne Kante zur Ankerperson). Optional: Maßzahl liegt zwischen 0 (nur isolierte Kontakte) und 1 (jede Person im Netzwerk ist mit jeder anderen verbunden).", + "Verhältnis der tatsächlich vorhandenen zu den theoretisch möglichen Verbindungen (exklusive der Verbindungen zwischen Ego und Kontaktpersonen, inklusive Personen ohne Kante zum Ego). Kennzahl liegt zwischen 0 (nur isolierte Kontakte) und 1 (jede Person im Netzwerk ist mit jeder anderen verbunden).", + degreemsg: + "arithmetisches Mittel der Verbindungen von Kontaktpersonen (exklusive der Verbindungen zwischen Ego und Kontaktpersonen, inklusive Personen ohne Kante zum Ego)", starsmsg: - "Kontakt(e) mit den meisten Verbindungen im Netzwerk (neben der Ankerperson)", - bridgemsg: "Anzahl der Verbindungen zwischen den Sektoren im Netzwerk", - bridgesmsg2: - "Kontakt(e), die einzelne Sektoren im Netzwerk miteinander verbinden", + "Kontakt(e) mit den meisten Verbindungen im Netzwerk (exklusive Ego)", + // bridgemsg: "Anzahl der Verbindungen zwischen den Sektoren im Netzwerk", + // bridgesmsg2: + // "Kontakt(e), die einzelne Sektoren im Netzwerk miteinander verbinden", isolatedmsg: - "Kontakt(e), die ausschließlich mit der Ankerperson verbunden sind", + "Kontakt(e), die ausschließlich mit dem Ego verbunden sind", noedgemsg: - "Lebende Personen ohne aktualisierte Verbindung zur Ankerperson. Verbindungen mit anderen Personen im Netzwerk und damit indirekte Verbindung zur Ankerperson sind möglich.", + "Lebende Personen ohne aktualisierte Verbindung zum Ego. Verbindungen mit anderen Personen im Netzwerk und damit indirekte Verbindung zum Ego sind möglich.", //}, //viewOptions: { From 8ceed68a07fd73044f2ae2faf628916b0aa8d707 Mon Sep 17 00:00:00 2001 From: Alexander Rind <1217527+alex-rind@users.noreply.github.com> Date: Tue, 6 Aug 2024 11:28:50 +0200 Subject: [PATCH 02/18] make StatisticsPanel always visible (by default collapsed) --- src/assets/main.scss | 7 +++++++ src/components/SideMenu.vue | 10 ---------- src/components/StatisticsPanel.vue | 21 ++++++++++++--------- src/store/sessionModule.ts | 2 -- src/views/HomeView.vue | 3 +-- 5 files changed, 20 insertions(+), 23 deletions(-) diff --git a/src/assets/main.scss b/src/assets/main.scss index 40a12d8..2eb2dbe 100644 --- a/src/assets/main.scss +++ b/src/assets/main.scss @@ -44,6 +44,13 @@ $panel-shadow: none; border-right: 1px solid #dbdbdb; } +// equal height with or without large icon +.panel-heading { + padding-top: 0.6em; + padding-bottom: 0.2em; + min-height: 2.5em; +} + .clickAble { cursor: pointer; } diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 5d768f9..ad03f2d 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -104,15 +104,6 @@ {{ t("createPDF") }} - -


- - @@ -128,7 +128,6 @@ export default defineComponent({ egoEditMode, editEgoFinished, mapclick, - showStatistics: computed(() => store.state.session.statistics), }; }, }); From 0485616fd5f2118ce9993eb196dec17de33145a0 Mon Sep 17 00:00:00 2001 From: Alexander Rind <1217527+alex-rind@users.noreply.github.com> Date: Thu, 8 Aug 2024 17:57:14 +0200 Subject: [PATCH 03/18] renew simple network analysis based on expert inputs remove bridges, add degree, gender, horizon, connectable, std-devs --- src/components/StatisticsTable.vue | 47 +++--- src/components/StatisticsTableCategories.vue | 37 +---- src/data/Alter.ts | 7 + src/data/AlterCategories.ts | 14 +- src/data/NetworkAnalysis.ts | 144 ++++++++++--------- src/de.ts | 1 + src/en.ts | 7 + 7 files changed, 120 insertions(+), 137 deletions(-) diff --git a/src/components/StatisticsTable.vue b/src/components/StatisticsTable.vue index ff88019..84b0769 100644 --- a/src/components/StatisticsTable.vue +++ b/src/components/StatisticsTable.vue @@ -18,47 +18,33 @@ {{ networkSize }} - - {{ t("relationshipweight") }} + + {{ t("closeness") }} - {{ naehenSum }} + {{ naehen }} {{ t("totaldensity") }} - {{ - density.toLocaleString(undefined, { - minimumFractionDigits: 3, - maximumFractionDigits: 3, - }) - }} + {{ density.toFixed(3) }} - - {{ t("stars") }} + + {{ t("degree") }} - - {{ stars }} + + {{ degree }} - - {{ t("bridges") }} - - {{ bridgesCount }} - - - - {{ t("bridgepersons") }} + + {{ t("stars") }} - - {{ bridgePersons }} + + {{ stars }} @@ -140,7 +126,7 @@ export default defineComponent({ }); function makeComputedAlterGroup( - group: "stars" | "isolated" | "bridgePersons" | "alterZeroEdge" + group: "stars" | "isolated" | "alterZeroEdge" ) { return computed(() => { const alteri = networkAnalysis.value[group]; @@ -158,7 +144,7 @@ export default defineComponent({ } const clickCell = ( - group: "stars" | "isolated" | "bridgePersons" | "alterZeroEdge" + group: "stars" | "isolated" | "alterZeroEdge" ) => { const alteri = networkAnalysis.value[group]; if (alteri.length > 0) { @@ -171,13 +157,12 @@ export default defineComponent({ return { networkSize: computed(() => networkAnalysis.value.alterConnected), - naehenSum: computed(() => networkAnalysis.value.naehenSum), + naehen: computed(() => networkAnalysis.value.naehenAvg.toFixed(1) + " (" + networkAnalysis.value.naehenDev.toFixed(1) + ")"), density, + degree: computed(() => networkAnalysis.value.degreeAvg.toFixed(1) + " (" + networkAnalysis.value.degreeDev.toFixed(1) + ")"), stars, isolated: makeComputedAlterGroup("isolated"), alterZeroEdge: makeComputedAlterGroup("alterZeroEdge"), - bridgePersons: makeComputedAlterGroup("bridgePersons"), - bridgesCount: computed(() => networkAnalysis.value.bridges.length), clickCell, }; }, diff --git a/src/components/StatisticsTableCategories.vue b/src/components/StatisticsTableCategories.vue index 3d44056..9182d5b 100644 --- a/src/components/StatisticsTableCategories.vue +++ b/src/components/StatisticsTableCategories.vue @@ -26,7 +26,7 @@ {{ t("relationshipweight") }} - {{ naehenSum[i] }} + {{ naehen[i] }} @@ -54,27 +54,6 @@ {{ stars[i] }} - - - {{ t("bridges") }} - - - {{ bridgesCount[i] }} - - - - - {{ t("bridgepersons") }} - - - {{ bridgePersons[i] }} - - {{ t("isolatedpersons") }} @@ -212,7 +191,7 @@ export default defineComponent({ }); function makeComputedAlterGroup( - group: "stars" | "isolated" | "bridgePersons" | "alterZeroEdge" + group: "stars" | "isolated" | "alterZeroEdge" ) { return computed(() => { return categoryLabels.value.map((cat) => { @@ -234,7 +213,7 @@ export default defineComponent({ } const clickCell = ( - group: "stars" | "isolated" | "bridgePersons" | "alterZeroEdge", + group: "stars" | "isolated" | "alterZeroEdge", cat: string ) => { const alteri = getOrInit(networkAnalysis.value, cat)[group]; @@ -253,9 +232,9 @@ export default defineComponent({ getOrInit(networkAnalysis.value, cat).alterConnected.toFixed(0) ); }), - naehenSum: computed((): string[] => { + naehen: computed((): string[] => { return categoryLabels.value.map((cat) => - getOrInit(networkAnalysis.value, cat).naehenSum.toFixed(0) + getOrInit(networkAnalysis.value, cat).naehenAvg.toFixed(0) ); }), density, @@ -264,12 +243,6 @@ export default defineComponent({ stars, isolated: makeComputedAlterGroup("isolated"), alterZeroEdge: makeComputedAlterGroup("alterZeroEdge"), - bridgePersons: makeComputedAlterGroup("bridgePersons"), - bridgesCount: computed((): string[] => { - return categoryLabels.value.map((cat) => - getOrInit(networkAnalysis.value, cat).bridges.length.toFixed(0) - ); - }), clickCell, }; }, diff --git a/src/data/Alter.ts b/src/data/Alter.ts index a3c7b91..a7eebda 100644 --- a/src/data/Alter.ts +++ b/src/data/Alter.ts @@ -69,6 +69,13 @@ export function naehenScore(alter: Alter): number { return Math.max(9 - Math.floor((alter.distance * 9) / 100), 0); } +export function horizonKey(alter: Alter): string { + if (alter.distance < 33.33) return "horizon_close"; + else if (alter.distance < 66.67) return "horizon_middle"; + else return "horizon_far"; +} + + /** * check if the alter can be connected to the ego or another alter. * By definition it is not possible to have a connection to a deceased or non-human alter. diff --git a/src/data/AlterCategories.ts b/src/data/AlterCategories.ts index a8b617c..b415f81 100644 --- a/src/data/AlterCategories.ts +++ b/src/data/AlterCategories.ts @@ -103,13 +103,13 @@ export function sectorIndex(alter: Alter): number | null { } } -function horizonIndex(alter: Alter): number { - if (alter.distance <= 0) return 100; - else if (alter.distance < 33.33) return 0; - else if (alter.distance < 66.67) return 1; - else if (alter.distance < 100) return 2; - else return 100; -} +// function horizonIndex(alter: Alter): number { +// if (alter.distance <= 0) return 100; +// else if (alter.distance < 33.33) return 0; +// else if (alter.distance < 66.67) return 1; +// else if (alter.distance < 100) return 2; +// else return 100; +// } const SECTOR: AlterCategorization = { label: "Sektor", diff --git a/src/data/NetworkAnalysis.ts b/src/data/NetworkAnalysis.ts index 60e9116..3a91e29 100644 --- a/src/data/NetworkAnalysis.ts +++ b/src/data/NetworkAnalysis.ts @@ -1,21 +1,24 @@ -import { Alter, isConnectable, naehenScore } from "./Alter"; -import { AlterCategorization, sectorIndex } from "./AlterCategories"; -import { Connection } from "./Connection"; -import { NWK } from "./NWK"; +import { type Alter, horizonKey, isConnectable, naehenScore } from "./Alter"; +import { type AlterCategorization, sectorIndex } from "./AlterCategories"; +import type { NWK } from "./NWK"; export interface NetworkAnalysis { alterConnected: number; alterConnectable: number; intConnCount: number; - extConnCount: number; - naehenSum: number; + degreeAvg: number; + degreeDev: number; + naehenAvg: number; + naehenDev: number; stars: Array; maxDegree: number; isolated: Array; - bridgePersons: Array; - bridges: Array; alterZeroEdge: Array; + genderConnected: Map; + genderConnectable: Map; + horizonConnected: Map; + horizonConnectable: Map; } function initNetworkAnalysis(): NetworkAnalysis { @@ -23,15 +26,19 @@ function initNetworkAnalysis(): NetworkAnalysis { alterConnected: 0, alterConnectable: 0, intConnCount: 0, - extConnCount: 0, - naehenSum: 0, + degreeAvg: 0, + degreeDev: 0, + naehenAvg: 0, + naehenDev: 0, stars: [], maxDegree: 0, isolated: [], - bridgePersons: [], - bridges: [], alterZeroEdge: [], + genderConnected: new Map(), + genderConnectable: new Map(), + horizonConnected: new Map(), + horizonConnectable: new Map(), }; } @@ -51,7 +58,8 @@ interface AlterMetrics { alter: Alter; degree: number; sector: number; - bridgePerson: boolean; + naehe: number, + isolated: boolean, } /** @@ -72,43 +80,42 @@ export function analyseNWKbyCategory( alterMetrics.set(alter.id, { alter, degree: 0, + naehe: naehenScore(alter), sector: sec, - bridgePerson: false, + isolated: true, }); } const result = new Map(); - for (const conn of nwk.connections) { - const a1 = alterMetrics.get(conn.id1); - const a2 = alterMetrics.get(conn.id2); - if (!(a1 && a2)) continue; - - // (2) increase degree of each node - a1.degree++; - a2.degree++; - - // (3) mark bridge persons - if (a1.sector !== a2.sector) { - a1.bridgePerson = true; - a2.bridgePerson = true; - } - } - for (let i = 0; i < categories.categories.length; i++) { const analysis = getOrInit(result, categories.categories[i]); - // count alterZeroEdgeCount in this category - for (const alter of nwk.alteri) { + for (const conn of nwk.connections) { + const a1 = alterMetrics.get(conn.id1); + const a2 = alterMetrics.get(conn.id2); + if (!(a1 && a2)) continue; + + // they are not isolated (category irrelevant) + a1.isolated = false; + a2.isolated = false; + + // (9) count connections for density if ( - alter.edgeType == 0 && - categories.inCategory(i, alter) && - isConnectable(alter) + categories.inCategory(i, a1.alter) && + categories.inCategory(i, a2.alter) ) { - analysis.alterZeroEdge.push(alter); + // both sides of connection are in category + analysis.intConnCount++; + + // (2) increase degree of each node (only if both alters in same sector/category) + a1.degree++; + a2.degree++; } } - // TODO reconsider whether a zero edge alter can be star or bridgeperson + + let degreeSum = 0; + let naehenSum = 0; for (const [, am] of alterMetrics) { if (categories.inCategory(i, am.alter)) { @@ -124,57 +131,60 @@ export function analyseNWKbyCategory( analysis.stars.push(am.alter); } - // (6) collect isolated (must have edge to ego!) - if (am.degree == 0 && am.alter.edgeType >= 1) { - analysis.isolated.push(am.alter); + // count alterZeroEdgeCount in this category + if (am.alter.edgeType == 0) { + analysis.alterZeroEdge.push(am.alter); } - // (7) collect bridge persons - // to exclude connectable alteri #46 --> && am.alter.edgeType >= 1 - if (am.bridgePerson) { - analysis.bridgePersons.push(am.alter); + // (6) collect isolated (must have edge to ego!) + // degree cannot be used because it is only within category + if (am.isolated && am.alter.edgeType >= 1) { + analysis.isolated.push(am.alter); } // (8) increase networkSize & naehenSum analysis.alterConnectable++; + degreeSum += am.degree; + countByKey(analysis.genderConnectable, am.alter.currentGender); + countByKey(analysis.horizonConnectable, horizonKey(am.alter)); if (am.alter.edgeType >= 1) { analysis.alterConnected++; - analysis.naehenSum += naehenScore(am.alter); + countByKey(analysis.genderConnected, am.alter.currentGender); + countByKey(analysis.horizonConnected, horizonKey(am.alter)); + naehenSum += am.naehe; } } } - for (const conn of nwk.connections) { - const a1 = alterMetrics.get(conn.id1); - const a2 = alterMetrics.get(conn.id2); - if (!(a1 && a2)) continue; - - // (9) count connections for density - if ( - categories.inCategory(i, a1.alter) && - categories.inCategory(i, a2.alter) - ) { - // both sides of connection are in category - analysis.intConnCount++; + analysis.degreeAvg = degreeSum / analysis.alterConnectable; + analysis.naehenAvg = naehenSum / analysis.alterConnected; + degreeSum = 0; + naehenSum = 0; - // (3b) bridges count only if both sides are in the same category - // to exclude connectable alteri #46 --> && a1.edgeType >= 1 && a2.edgeType >= 1 - if (a1.sector !== a2.sector) { - analysis.bridges.push(conn); + for (const [, am] of alterMetrics) { + if (categories.inCategory(i, am.alter)) { + degreeSum += (am.degree - analysis.degreeAvg) ** 2; + if (am.alter.edgeType >= 1) { + naehenSum += (am.naehe - analysis.naehenAvg) ** 2; } - } else if ( - categories.inCategory(i, a1.alter) || - categories.inCategory(i, a2.alter) - ) { - // exactly one side of connection is in category - analysis.extConnCount++; } } + analysis.degreeDev = Math.sqrt(degreeSum / analysis.alterConnectable); + analysis.naehenDev = Math.sqrt(naehenSum / analysis.alterConnected); } return result; } +function countByKey(map: Map, key: string) { + const prev = map.get(key); + if (prev) { + map.set(key, prev + 1); + } else { + map.set(key, 1); + } +} + /** * * Based on Java class NetworkAnalysis by Nikolaus Kelis (v. 1.4.2) diff --git a/src/de.ts b/src/de.ts index 931bfaf..92ab153 100644 --- a/src/de.ts +++ b/src/de.ts @@ -40,6 +40,7 @@ export default { relationshipweight: "Beziehungsgewicht", totaldensity: "Dichte", categorydensity: "Dichte der Kategorie", + degree: "Durchschn. Degree (SD)", stars: "Star(s)", categorystar: "Star(s) (pro Kategorie)", // bridges: "Brücken", diff --git a/src/en.ts b/src/en.ts index eadda7c..d336214 100644 --- a/src/en.ts +++ b/src/en.ts @@ -35,9 +35,12 @@ export default { horizoncumulative: "Horizon (cumulative)", gender: "Gender", networksize: "Network size", + sizebygender: "by Gender", + closeness: "Avg. Closeness (SD)", relationshipweight: "Relationship weight", totaldensity: "Total density", categorydensity: "Category density", + degree: "Avg. Degree (SD)", categorystar: "Star (per category)", stars: "Star(s)", bridges: "Bridges", @@ -46,10 +49,14 @@ export default { personswithoutedgetotheego: "Person(s) without edge to the ego", networkmsg: "Number of contacts in the network without ego and without contacts that do not have an edge to the ego", + closenessmsg: + "arithmetic average of closeness of contacts to the ego in 9 contric rings (9=close … 1=distant)", relationshipmsg: "Summed proximity or distance of the contacts to the ego. The higher the indicator, the closer the contacts are to the ego.", densitymsg: "Ratio of the actually existing connections to the theoretically possible connections (excluding connections between ego and contacts, including contacts without edge to ego). Optional: Measurement is between 0 (isolated contacts only) and 1 (every person in the network is connected to everyone else).", + degreemsg: + "arithmetic average of connections of contact persons (eckluding connections to the ego, inclusive persons without edge to the ego)", starsmsg: "Contact(s) with most connections in the network (besides the ego)", bridgesmsg2: "Contact(s) connecting individual sectors in the network", From b1520a10b6d1fecfb79e68784690b8f66432b7d8 Mon Sep 17 00:00:00 2001 From: Alexander Rind <1217527+alex-rind@users.noreply.github.com> Date: Tue, 20 Aug 2024 07:17:41 +0200 Subject: [PATCH 04/18] overview stats with sizes by gender and horizont --- src/components/StatisticsTable.vue | 69 +++++++++++++++++++++++++++--- src/data/Alter.ts | 18 -------- src/data/AlterCategories.ts | 2 - src/data/Horizon.ts | 20 +++++++++ src/data/NetworkAnalysis.ts | 55 ++++++++++++++++-------- src/data/statisticsCSV.ts | 7 ++- src/de.ts | 4 ++ src/en.ts | 4 ++ 8 files changed, 133 insertions(+), 46 deletions(-) create mode 100644 src/data/Horizon.ts diff --git a/src/components/StatisticsTable.vue b/src/components/StatisticsTable.vue index 84b0769..9b697ac 100644 --- a/src/components/StatisticsTable.vue +++ b/src/components/StatisticsTable.vue @@ -17,6 +17,29 @@ {{ networkSize }} + + + {{ t("sizebygender") }} + {{ t("female") }} + {{ t("male") }} + {{ t("diverse") }} + {{ t("notspecified") }} + + +

 

+

{{ gSize }}

+ + + + + {{ t("sizebyhorizon") }} + {{ t(ho) }} + + +

 

+

{{ hSz }}

+ + {{ t("closeness") }} @@ -86,6 +109,7 @@ import { import { getAlterCategorization } from "@/data/AlterCategories"; import de from "@/de"; import en from "@/en"; +import { HORIZON_KEYS } from "@/data/Horizon"; export default defineComponent({ mixins: [de, en], @@ -143,9 +167,7 @@ export default defineComponent({ }); } - const clickCell = ( - group: "stars" | "isolated" | "alterZeroEdge" - ) => { + const clickCell = (group: "stars" | "isolated" | "alterZeroEdge") => { const alteri = networkAnalysis.value[group]; if (alteri.length > 0) { store.commit( @@ -156,10 +178,39 @@ export default defineComponent({ }; return { - networkSize: computed(() => networkAnalysis.value.alterConnected), - naehen: computed(() => networkAnalysis.value.naehenAvg.toFixed(1) + " (" + networkAnalysis.value.naehenDev.toFixed(1) + ")"), + networkSize: computed( + () => + networkAnalysis.value.alterConnected + + " (" + + networkAnalysis.value.alterConnectable + + ")" + ), + sizeByGender: computed(() => + networkAnalysis.value.genderConnected.map( + (g, i) => g + " (" + networkAnalysis.value.genderConnectable[i] + ")" + ) + ), + HORIZON_KEYS, + sizeByHorizon: computed(() => + networkAnalysis.value.horizonConnected.map( + (g, i) => g + " (" + networkAnalysis.value.horizonConnectable[i] + ")" + ) + ), + naehen: computed( + () => + networkAnalysis.value.naehenAvg.toFixed(1) + + " (" + + networkAnalysis.value.naehenDev.toFixed(1) + + ")" + ), density, - degree: computed(() => networkAnalysis.value.degreeAvg.toFixed(1) + " (" + networkAnalysis.value.degreeDev.toFixed(1) + ")"), + degree: computed( + () => + networkAnalysis.value.degreeAvg.toFixed(1) + + " (" + + networkAnalysis.value.degreeDev.toFixed(1) + + ")" + ), stars, isolated: makeComputedAlterGroup("isolated"), alterZeroEdge: makeComputedAlterGroup("alterZeroEdge"), @@ -173,4 +224,10 @@ export default defineComponent({ td:not([align]) { text-align: right; } + +th.sizeby > em { + display: block; + font-style: normal; + margin-left: 3em; +} diff --git a/src/data/Alter.ts b/src/data/Alter.ts index a7eebda..7342c13 100644 --- a/src/data/Alter.ts +++ b/src/data/Alter.ts @@ -58,24 +58,6 @@ export function hasOptionalChanges(alter: Alter) { ); } -/** - * get the "closeness" of an alter in 9 concentric rings around the ego. - * 9 = very close, ..., 0 = on or beyond the outer horizon. - * Based on Java class Position by Nikolaus Kelis (v. 1.4.2) - * @param alter - * @returns integer between 9 (close) and 0 (distant) - */ -export function naehenScore(alter: Alter): number { - return Math.max(9 - Math.floor((alter.distance * 9) / 100), 0); -} - -export function horizonKey(alter: Alter): string { - if (alter.distance < 33.33) return "horizon_close"; - else if (alter.distance < 66.67) return "horizon_middle"; - else return "horizon_far"; -} - - /** * check if the alter can be connected to the ego or another alter. * By definition it is not possible to have a connection to a deceased or non-human alter. diff --git a/src/data/AlterCategories.ts b/src/data/AlterCategories.ts index b415f81..46bc83b 100644 --- a/src/data/AlterCategories.ts +++ b/src/data/AlterCategories.ts @@ -1,6 +1,4 @@ import { Alter } from "./Alter"; -import { Gender } from "./Gender"; -import { Sectors } from "./Sectors"; type inCategoryType = (catIndex: number, a: Alter) => boolean; diff --git a/src/data/Horizon.ts b/src/data/Horizon.ts new file mode 100644 index 0000000..2aa89b6 --- /dev/null +++ b/src/data/Horizon.ts @@ -0,0 +1,20 @@ +import { Alter } from "./Alter"; + +export const HORIZON_KEYS = ["horizon_close", "horizon_middle", "horizon_far"]; + +export function horizonKey(alter: Alter): string { + if (alter.distance < 33.33) return HORIZON_KEYS[0]; + else if (alter.distance < 66.67) return HORIZON_KEYS[1]; + else return HORIZON_KEYS[2]; +} + +/** + * get the "closeness" of an alter in 9 concentric rings around the ego. + * 9 = very close, ..., 0 = on or beyond the outer horizon. + * Based on Java class Position by Nikolaus Kelis (v. 1.4.2) + * @param alter + * @returns integer between 9 (close) and 0 (distant) + */ +export function naehenScore(alter: Alter): number { + return Math.max(9 - Math.floor((alter.distance * 9) / 100), 0); +} diff --git a/src/data/NetworkAnalysis.ts b/src/data/NetworkAnalysis.ts index 3a91e29..ae8af28 100644 --- a/src/data/NetworkAnalysis.ts +++ b/src/data/NetworkAnalysis.ts @@ -1,5 +1,7 @@ -import { type Alter, horizonKey, isConnectable, naehenScore } from "./Alter"; +import { type Alter, isConnectable } from "./Alter"; +import { HORIZON_KEYS, horizonKey, naehenScore } from "./Horizon"; import { type AlterCategorization, sectorIndex } from "./AlterCategories"; +import { Gender } from "./Gender"; import type { NWK } from "./NWK"; export interface NetworkAnalysis { @@ -15,10 +17,10 @@ export interface NetworkAnalysis { maxDegree: number; isolated: Array; alterZeroEdge: Array; - genderConnected: Map; - genderConnectable: Map; - horizonConnected: Map; - horizonConnectable: Map; + genderConnected: Array; + genderConnectable: Array; + horizonConnected: Array; + horizonConnectable: Array; } function initNetworkAnalysis(): NetworkAnalysis { @@ -35,10 +37,10 @@ function initNetworkAnalysis(): NetworkAnalysis { maxDegree: 0, isolated: [], alterZeroEdge: [], - genderConnected: new Map(), - genderConnectable: new Map(), - horizonConnected: new Map(), - horizonConnectable: new Map(), + genderConnected: [], + genderConnectable: [], + horizonConnected: [], + horizonConnectable: [], }; } @@ -57,9 +59,9 @@ export function getOrInit( interface AlterMetrics { alter: Alter; degree: number; - sector: number; - naehe: number, - isolated: boolean, + // sector: number; + naehe: number; + isolated: boolean; } /** @@ -81,7 +83,7 @@ export function analyseNWKbyCategory( alter, degree: 0, naehe: naehenScore(alter), - sector: sec, + // sector: sec, isolated: true, }); } @@ -116,6 +118,10 @@ export function analyseNWKbyCategory( let degreeSum = 0; let naehenSum = 0; + const genderConnected = new Map(); + const genderConnectable = new Map(); + const horizonConnected = new Map(); + const horizonConnectable = new Map(); for (const [, am] of alterMetrics) { if (categories.inCategory(i, am.alter)) { @@ -142,15 +148,15 @@ export function analyseNWKbyCategory( analysis.isolated.push(am.alter); } - // (8) increase networkSize & naehenSum + // (8) increase networkSize & naehenSum & size-by-arrays analysis.alterConnectable++; degreeSum += am.degree; - countByKey(analysis.genderConnectable, am.alter.currentGender); - countByKey(analysis.horizonConnectable, horizonKey(am.alter)); + countByKey(genderConnectable, am.alter.currentGender); + countByKey(horizonConnectable, horizonKey(am.alter)); if (am.alter.edgeType >= 1) { analysis.alterConnected++; - countByKey(analysis.genderConnected, am.alter.currentGender); - countByKey(analysis.horizonConnected, horizonKey(am.alter)); + countByKey(genderConnected, am.alter.currentGender); + countByKey(horizonConnected, horizonKey(am.alter)); naehenSum += am.naehe; } } @@ -158,6 +164,12 @@ export function analyseNWKbyCategory( analysis.degreeAvg = degreeSum / analysis.alterConnectable; analysis.naehenAvg = naehenSum / analysis.alterConnected; + analysis.genderConnected = mapToArray(genderConnected, Gender); + analysis.genderConnectable = mapToArray(genderConnectable, Gender); + analysis.horizonConnected = mapToArray(horizonConnected, HORIZON_KEYS); + analysis.horizonConnectable = mapToArray(horizonConnectable, HORIZON_KEYS); + + // another iteration to calculate standard deviation degreeSum = 0; naehenSum = 0; @@ -185,6 +197,13 @@ function countByKey(map: Map, key: string) { } } +function mapToArray(map: Map, keys: string[]) { + return keys.map((k) => { + const value = map.get(k); + return value ? value : 0; + }); +} + /** * * Based on Java class NetworkAnalysis by Nikolaus Kelis (v. 1.4.2) diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index 11825ab..7fc96b1 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -39,7 +39,8 @@ export function statisticsCSV( output += "\nBeziehungsgewicht"; for (const label of categorization.categories) { - output += SEP + getOrInit(networkAnalysis, label).naehenSum.toFixed(0); + // TODO change to naehenAvg and naehenDev +// output += SEP + getOrInit(networkAnalysis, label).naehenSum.toFixed(0); } output += "\nDichte der Kategorie"; @@ -72,6 +73,7 @@ export function statisticsCSV( }) .reduce((prev, curr) => prev + SEP + curr, ""); + /* bridges were removed from simple statistics output += "\nBrücken"; for (const label of categorization.categories) { output += @@ -85,6 +87,7 @@ export function statisticsCSV( displayName, "bridgePersons" ).reduce((prev, curr) => prev + SEP + curr, ""); + */ output += "\nIsolierte"; output += makeComputedAlterGroup( @@ -110,7 +113,7 @@ function makeComputedAlterGroup( networkAnalysis: Map, categoryLabels: string[], displayName: (a: Alter) => string, - group: "stars" | "isolated" | "bridgePersons" | "alterZeroEdge" + group: "stars" | "isolated" | "alterZeroEdge" ) { return categoryLabels.map((cat) => { const analysis = getOrInit(networkAnalysis, cat); diff --git a/src/de.ts b/src/de.ts index 92ab153..0602f7f 100644 --- a/src/de.ts +++ b/src/de.ts @@ -36,6 +36,10 @@ export default { gender: "Geschlecht", networksize: "Netzwerkgröße (+aktivierbare)", sizebygender: "nach Geschlecht", + sizebyhorizon: "nach Horizont", + horizon_close: "nah", + horizon_middle: "mittel", + horizon_far: "entfernt", closeness: "Durchschn. Nähe (SD)", relationshipweight: "Beziehungsgewicht", totaldensity: "Dichte", diff --git a/src/en.ts b/src/en.ts index d336214..749ca49 100644 --- a/src/en.ts +++ b/src/en.ts @@ -36,6 +36,10 @@ export default { gender: "Gender", networksize: "Network size", sizebygender: "by Gender", + sizebyhorizon: "by Horizont", + horizon_close: "close", + horizon_middle: "middle", + horizon_far: "distant", closeness: "Avg. Closeness (SD)", relationshipweight: "Relationship weight", totaldensity: "Total density", From 80c378d28dbdbb07dc6ae0cecc68276d2dbb7098 Mon Sep 17 00:00:00 2001 From: Alexander Rind <1217527+alex-rind@users.noreply.github.com> Date: Tue, 20 Aug 2024 07:55:18 +0200 Subject: [PATCH 05/18] simple stats by sector and prof. help --- src/components/StatisticsTableCategories.vue | 91 +++++++++++++++++--- 1 file changed, 77 insertions(+), 14 deletions(-) diff --git a/src/components/StatisticsTableCategories.vue b/src/components/StatisticsTableCategories.vue index 9182d5b..0667bd3 100644 --- a/src/components/StatisticsTableCategories.vue +++ b/src/components/StatisticsTableCategories.vue @@ -17,15 +17,38 @@ --> - + {{ networkSize[i] }} - - {{ t("relationshipweight") }} + + {{ t("sizebygender") }} + {{ t("female") }} + {{ t("male") }} + {{ t("diverse") }} + {{ t("notspecified") }} - + +

 

+

{{ gSize }}

+ + + + + {{ t("sizebyhorizon") }} + {{ t(ho) }} + + +

 

+

{{ hSz }}

+ + + + + {{ t("closeness") }} + + {{ naehen[i] }} @@ -33,7 +56,7 @@ {{ t("categorydensity") }} - {{ density[i] }} + {{ density[i] }} + + + {{ t("degree") }} + + + {{ degree[i] }} + + {{ t("categorystar") }} @@ -101,6 +132,7 @@ import { } from "@/data/AlterCategories"; import de from "@/de"; import en from "@/en"; +import { HORIZON_KEYS } from "@/data/Horizon"; export default defineComponent({ mixins: [de, en], @@ -108,7 +140,7 @@ export default defineComponent({ t(prop: string) { return this[document.documentElement.lang][prop]; }, - translateCategoryKey(categoryKey: any) { + translateCategoryKey(categoryKey: string) { const lang = document.documentElement.lang; const translation = CATEGORY_TRANSLATIONS[categoryKey]; @@ -227,18 +259,43 @@ export default defineComponent({ return { categoryLabels, - networkSize: computed((): string[] => { - return categoryLabels.value.map((cat) => - getOrInit(networkAnalysis.value, cat).alterConnected.toFixed(0) - ); + networkSize: computed((): string[] => + categoryLabels.value.map((cat) => { + const analy = getOrInit(networkAnalysis.value, cat); + return analy.alterConnected + " (" + analy.alterConnectable + ")"; + }) + ), + sizeByGender: computed(() => { + return categoryLabels.value.map((cat) => { + const analy = getOrInit(networkAnalysis.value, cat); + return analy.genderConnected.map( + (g, i) => g + " (" + analy.genderConnectable[i] + ")" + ); + }); }), - naehen: computed((): string[] => { - return categoryLabels.value.map((cat) => - getOrInit(networkAnalysis.value, cat).naehenAvg.toFixed(0) - ); + HORIZON_KEYS, + sizeByHorizon: computed(() => { + return categoryLabels.value.map((cat) => { + const analy = getOrInit(networkAnalysis.value, cat); + return analy.horizonConnected.map( + (g, i) => g + " (" + analy.horizonConnectable[i] + ")" + ); + }); }), + naehen: computed((): string[] => + categoryLabels.value.map((cat) => { + const an = getOrInit(networkAnalysis.value, cat); + return an.naehenAvg.toFixed(1) + " (" + an.naehenDev.toFixed(1) + ")"; + }) + ), density, // extDensity, + degree: computed((): string[] => + categoryLabels.value.map((cat) => { + const an = getOrInit(networkAnalysis.value, cat); + return an.degreeAvg.toFixed(1) + " (" + an.degreeDev.toFixed(1) + ")"; + }) + ), stars, isolated: makeComputedAlterGroup("isolated"), @@ -261,4 +318,10 @@ td:not([align]) { th { font-weight: normal; } + +th.sizeby > em { + display: block; + font-style: normal; + margin-left: 2em; +} From 17b6a122226c3cb01050a776c55aba0a5ce34ace Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Tue, 20 Aug 2024 11:43:34 +0200 Subject: [PATCH 06/18] fixed alteri import with no position --- src/data/NWKRecord.ts | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/data/NWKRecord.ts b/src/data/NWKRecord.ts index c46b7a7..b680875 100644 --- a/src/data/NWKRecord.ts +++ b/src/data/NWKRecord.ts @@ -114,7 +114,8 @@ function parseNWKFile(nwkText: string): any { edgeType: 0, edgeTypeByUser: 0, angle: 0, - distance: 0 + distance: 0, + hasPosition: false, }); } break; @@ -132,6 +133,7 @@ function parseNWKFile(nwkText: string): any { alteri.edgeTypeByUser = edgeType; alteri.angle = polarCoords.angle; alteri.distance = polarCoords.distance; + alteri.hasPosition = true; } break; } @@ -144,6 +146,9 @@ function parseNWKFile(nwkText: string): any { break; } }); + //alteri ohne position werden verworfen + //weil easyNWK 1.5 so gelöschte alteri gespeichert hat + nwkData.alteri = nwkData.alteri.filter((a: {hasPosition: boolean}) => a.hasPosition); nwkData.version.nwk = { ego: nwkData.ego, @@ -189,4 +194,4 @@ function cartesianToPolar(x: number, y: number) { const angle = Math.atan2(centeredY, centeredX) * (180 / Math.PI); return { distance: distance, angle: angle }; -} +} \ No newline at end of file From 53200582c758af38392e6ebcd4b06f8b55c0ed1d Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Tue, 20 Aug 2024 16:28:08 +0200 Subject: [PATCH 07/18] started new csv format --- src/data/statisticsCSV.ts | 54 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index 7fc96b1..0567c7c 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -10,6 +10,14 @@ import { } from "@/data/NetworkAnalysis"; import { NWK } from "@/data/NWK"; import { Alter } from "./Alter"; +import { computed } from "vue"; +import { store } from "@/store"; + +const networkAnalysis = computed((): NetworkAnalysis => { + const categorization = getAlterCategorization(); + const analysis = analyseNWKbyCategory(store.state.nwk, categorization); + return getOrInit(analysis, categorization.categories[0]); +}); const SEP = ";"; @@ -106,6 +114,52 @@ export function statisticsCSV( ).reduce((prev, curr) => prev + SEP + curr, ""); } + output += "\n\n" + "test" + SEP + "test2" + "\n\n"; + + for (const cat of allAlterCategorizationKeys) { + // loop each tab of the statistics panel (below each other on single sheet) + const categorization = getAlterCategorization(cat); + const networkAnalysis = analyseNWKbyCategory(nwk, categorization); + + output += categorization.label + SEP; + output += "Netzwerkgröße (+aktivierbare)" + SEP; + output += "nach Geschlecht weiblich" + SEP; + output += "nach Geschlecht männlich" + SEP; + output += "nach Geschlecht divers" + SEP; + output += "nach Geschlecht nicht festgelegt" + SEP; + output += "nach Horizont nah" + SEP; + output += "nach Horizont mittel" + SEP; + output += "nach Horizont entfernt" + SEP; + output += "Durschschn. Nähe (SD)" + SEP; + output += "Dichte" + SEP; + output += "Durchschn. Degree (SD)" + SEP; + output += "Star(s)" + SEP; + output += "Isolierte" + SEP; + output += "Personen ohne Kante zum Ego" + SEP; + } + output += "\n"; + + for (const _ of allAlterCategorizationKeys) { + // loop each tab of the statistics panel (below each other on single sheet) + + + output += SEP; + output += networkAnalysis.value.alterConnected + " (" + networkAnalysis.value.alterConnectable + ")" + SEP; + + for (const [i, g] of networkAnalysis.value.genderConnected.entries()) { + output += g + " (" + networkAnalysis.value.genderConnectable[i] + ")" + SEP + } + for (const [i, g] of networkAnalysis.value.horizonConnected.entries()) { + output += g + " (" + networkAnalysis.value.horizonConnectable[i] + ")" + SEP + } + output += networkAnalysis.value.naehenAvg.toFixed(1) + " (" + networkAnalysis.value.naehenDev.toFixed(1) + ")" + SEP; + output += "Dichte" + SEP; + output += "Durchschn. Degree (SD)" + SEP; + output += "Star(s)" + SEP; + output += "Isolierte" + SEP; + output += "Personen ohne Kante zum Ego" + SEP; + } + return output; } From 05a5e8c2701ab4751f94fe2f0a69a76c80ce299d Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Wed, 21 Aug 2024 11:33:21 +0200 Subject: [PATCH 08/18] import without extra bool --- src/data/NWKRecord.ts | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/data/NWKRecord.ts b/src/data/NWKRecord.ts index b680875..60d2690 100644 --- a/src/data/NWKRecord.ts +++ b/src/data/NWKRecord.ts @@ -115,7 +115,6 @@ function parseNWKFile(nwkText: string): any { edgeTypeByUser: 0, angle: 0, distance: 0, - hasPosition: false, }); } break; @@ -133,7 +132,6 @@ function parseNWKFile(nwkText: string): any { alteri.edgeTypeByUser = edgeType; alteri.angle = polarCoords.angle; alteri.distance = polarCoords.distance; - alteri.hasPosition = true; } break; } @@ -148,7 +146,7 @@ function parseNWKFile(nwkText: string): any { }); //alteri ohne position werden verworfen //weil easyNWK 1.5 so gelöschte alteri gespeichert hat - nwkData.alteri = nwkData.alteri.filter((a: {hasPosition: boolean}) => a.hasPosition); + nwkData.alteri = nwkData.alteri.filter((a: {distance: number}) => a.distance > 0); nwkData.version.nwk = { ego: nwkData.ego, From ee2935cd0192b1214d3142b54b6914609020cc65 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Wed, 21 Aug 2024 16:24:00 +0200 Subject: [PATCH 09/18] ADD title,date and id and changed format --- src/components/SideMenu.vue | 2 +- src/data/statisticsCSV.ts | 263 +++++++++++++++--------------------- 2 files changed, 110 insertions(+), 155 deletions(-) diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index ad03f2d..b9d56cf 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -284,7 +284,7 @@ export default defineComponent({ "." + visibleNWKVersion.value?.date?.substring(0, 4) + ".csv", - statisticsCSV(store.state.nwk, store.getters["displayName"]) + statisticsCSV(store.state.nwk, visibleNWKVersion.value!.title, visibleNWKVersion.value!.date, visibleNWKVersion.value!.id) ); }, diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index 0567c7c..c57ad5e 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -5,181 +5,136 @@ import { import { analyseNWKbyCategory, calculateDensity, - getOrInit, NetworkAnalysis, } from "@/data/NetworkAnalysis"; import { NWK } from "@/data/NWK"; import { Alter } from "./Alter"; -import { computed } from "vue"; import { store } from "@/store"; -const networkAnalysis = computed((): NetworkAnalysis => { - const categorization = getAlterCategorization(); - const analysis = analyseNWKbyCategory(store.state.nwk, categorization); - return getOrInit(analysis, categorization.categories[0]); -}); - const SEP = ";"; - +let output = ""; +let isFirstTime = true; export function statisticsCSV( nwk: NWK, - displayName: (a: Alter) => string + title: string, + date: string, + id: number, ): string { - let output = "Auswertung" + SEP + nwk.ego.name; - for (const cat of allAlterCategorizationKeys) { - // loop each tab of the statistics panel (below each other on single sheet) const categorization = getAlterCategorization(cat); - const networkAnalysis = analyseNWKbyCategory(nwk, categorization); - - output += "\n\n" + categorization.label + "\n\n"; - - output += "Kennzahl"; - for (const label of categorization.categories) { - output += SEP + label; - } - - output += "\nNetzwerkgröße"; - for (const label of categorization.categories) { - output += - SEP + getOrInit(networkAnalysis, label).alterConnected.toFixed(0); - } - - output += "\nBeziehungsgewicht"; - for (const label of categorization.categories) { - // TODO change to naehenAvg and naehenDev -// output += SEP + getOrInit(networkAnalysis, label).naehenSum.toFixed(0); - } - - output += "\nDichte der Kategorie"; - for (const label of categorization.categories) { - const { alterConnectable, intConnCount } = getOrInit( - networkAnalysis, - label - ); - output += - SEP + - calculateDensity(alterConnectable, intConnCount).toLocaleString( - undefined, - { - minimumFractionDigits: 3, - maximumFractionDigits: 3, - } - ); + const networkAnalysisMap = analyseNWKbyCategory(nwk, categorization); + console.log(Array.from(networkAnalysisMap.entries())); + + if (isFirstTime) { + output += "Name" + SEP; + output += "Datum" + SEP; + output += "ID" + SEP; + output += "Netzwerksektor" + SEP; + output += "Netzwerkgröße" + SEP; + output += "Netzwerkgröße (+aktivierbare)" + SEP; + output += "nach Geschlecht weiblich" + SEP; + output += "nach Geschlecht weiblich (+aktivierbare)" + SEP; + output += "nach Geschlecht männlich" + SEP; + output += "nach Geschlecht männlich (+aktivierbare)" + SEP; + output += "nach Geschlecht divers" + SEP; + output += "nach Geschlecht divers (+aktivierbare)" + SEP; + output += "nach Geschlecht nicht festgelegt" + SEP; + output += "nach Geschlecht nicht festgelegt (+aktivierbare)" + SEP; + output += "nach Horizont nah" + SEP; + output += "nach Horizont nah (+aktivierbare)" + SEP; + output += "nach Horizont mittel" + SEP; + output += "nach Horizont mittel (+aktivierbare)" + SEP; + output += "nach Horizont entfernt" + SEP; + output += "nach Horizont entfernt (+aktivierbare)" + SEP; + output += "Durschschn. Nähe" + SEP; + output += "Durschschn. Nähe (SD)" + SEP; + output += "Dichte" + SEP; + output += "Durchschn. Degree" + SEP; + output += "Durchschn. Degree (SD)" + SEP; + output += "Star(s)" + SEP; + output += "Isolierte" + SEP; + output += "Personen ohne Kante zum Ego" + SEP; + output += "\n"; + isFirstTime = false; } - - output += "\nStar(s)"; - output += categorization.categories - .map((label) => { - const { stars, maxDegree } = getOrInit(networkAnalysis, label); - if (stars.length > 0 && maxDegree > 0) { - return stars.map((a) => displayName(a)).join(", "); - // + " (" + maxDegree + " Beziehungen)" - } else { - return "-"; - } - }) - .reduce((prev, curr) => prev + SEP + curr, ""); - - /* bridges were removed from simple statistics - output += "\nBrücken"; + for (const label of categorization.categories) { - output += - SEP + getOrInit(networkAnalysis, label).bridges.length.toFixed(0); + const networkAnalysis = networkAnalysisMap.get(label); + if (networkAnalysis) { + getDataForKeyFigures(networkAnalysis, title, date, id, categorization.label, label); + } + output += "\n"; } - - output += "\nBrückenperson(en)"; - output += makeComputedAlterGroup( - networkAnalysis, - categorization.categories, - displayName, - "bridgePersons" - ).reduce((prev, curr) => prev + SEP + curr, ""); - */ - - output += "\nIsolierte"; - output += makeComputedAlterGroup( - networkAnalysis, - categorization.categories, - displayName, - "isolated" - ).reduce((prev, curr) => prev + SEP + curr, ""); - - output += "\nPersonen ohne Kante zur Ankerperson"; - output += makeComputedAlterGroup( - networkAnalysis, - categorization.categories, - displayName, - "alterZeroEdge" - ).reduce((prev, curr) => prev + SEP + curr, ""); - } - - output += "\n\n" + "test" + SEP + "test2" + "\n\n"; - - for (const cat of allAlterCategorizationKeys) { - // loop each tab of the statistics panel (below each other on single sheet) - const categorization = getAlterCategorization(cat); - const networkAnalysis = analyseNWKbyCategory(nwk, categorization); - - output += categorization.label + SEP; - output += "Netzwerkgröße (+aktivierbare)" + SEP; - output += "nach Geschlecht weiblich" + SEP; - output += "nach Geschlecht männlich" + SEP; - output += "nach Geschlecht divers" + SEP; - output += "nach Geschlecht nicht festgelegt" + SEP; - output += "nach Horizont nah" + SEP; - output += "nach Horizont mittel" + SEP; - output += "nach Horizont entfernt" + SEP; - output += "Durschschn. Nähe (SD)" + SEP; - output += "Dichte" + SEP; - output += "Durchschn. Degree (SD)" + SEP; - output += "Star(s)" + SEP; - output += "Isolierte" + SEP; - output += "Personen ohne Kante zum Ego" + SEP; } output += "\n"; + return output; +} - for (const _ of allAlterCategorizationKeys) { - // loop each tab of the statistics panel (below each other on single sheet) - - - output += SEP; - output += networkAnalysis.value.alterConnected + " (" + networkAnalysis.value.alterConnectable + ")" + SEP; +function getDataForKeyFigures(networkAnalysis: NetworkAnalysis, title: string, date: string, id: number, categoryLabel: string, label: string) { + output += title + SEP; + output += date + SEP; + output += id + SEP; + output += categoryLabel + (label ? " " + label : "") + SEP; + output += networkAnalysis.alterConnectable + SEP; - for (const [i, g] of networkAnalysis.value.genderConnected.entries()) { - output += g + " (" + networkAnalysis.value.genderConnectable[i] + ")" + SEP - } - for (const [i, g] of networkAnalysis.value.horizonConnected.entries()) { - output += g + " (" + networkAnalysis.value.horizonConnectable[i] + ")" + SEP - } - output += networkAnalysis.value.naehenAvg.toFixed(1) + " (" + networkAnalysis.value.naehenDev.toFixed(1) + ")" + SEP; - output += "Dichte" + SEP; - output += "Durchschn. Degree (SD)" + SEP; - output += "Star(s)" + SEP; - output += "Isolierte" + SEP; - output += "Personen ohne Kante zum Ego" + SEP; + for (const [i, g] of networkAnalysis.genderConnected.entries()) { + output += g + SEP; + output += networkAnalysis.genderConnectable[i] + SEP; + } + for (const [i, g] of networkAnalysis.horizonConnected.entries()) { + output += g + SEP; + output += networkAnalysis.horizonConnectable[i] + SEP; } + output += networkAnalysis.naehenAvg.toString().replace('.', ',') + SEP; + output += networkAnalysis.naehenDev.toString().replace('.', ',') + SEP; + const density = calculateDensity(networkAnalysis.alterConnectable, networkAnalysis.intConnCount); + output += density.toString().replace('.', ',') + SEP; + output += networkAnalysis.degreeAvg.toString().replace(".", ",") + SEP; + output += networkAnalysis.degreeDev.toString().replace('.', ',') + SEP; + output += formatStars(networkAnalysis) + SEP; + output += formatIsolated(networkAnalysis.isolated) + SEP; + output += formatZeroEdge(networkAnalysis.alterZeroEdge) + SEP; +} - return output; +function formatStars(networkAnalysis: NetworkAnalysis): string { + const alteri = networkAnalysis.stars; + if (alteri.length > 0 && networkAnalysis.maxDegree > 0) { + return document.documentElement.lang == "de" + ? alteri.map((a) => store.getters["displayName"](a)).join(", ") + + " (" + + networkAnalysis.maxDegree + + " Beziehungen)" + : alteri.map((a) => store.getters["displayName"](a)).join(", ") + + " (" + + networkAnalysis.maxDegree + + " relations)"; + } else { + return document.documentElement.lang == "de" ? "keine" : "none"; + } } -function makeComputedAlterGroup( - networkAnalysis: Map, - categoryLabels: string[], - displayName: (a: Alter) => string, - group: "stars" | "isolated" | "alterZeroEdge" -) { - return categoryLabels.map((cat) => { - const analysis = getOrInit(networkAnalysis, cat); - if (analysis[group].length > 0) { - return ( - analysis[group].length + - " (" + - analysis[group].map((a) => displayName(a)).join(", ") + - ")" - ); - } else { - return "0"; - } - }); +function formatIsolated(alteri: Alter[]): string { + if (alteri.length > 0) { + return ( + alteri.length + + " (" + + alteri.map((a) => store.getters["displayName"](a)).join(", ") + + ")" + ); + } else { + return "0"; + } } + +function formatZeroEdge(alteri: Alter[]): string { + if (alteri.length > 0) { + return ( + alteri.length + + " (" + + alteri.map((a) => store.getters["displayName"](a)).join(", ") + + ")" + ); + } else { + return "0"; + } +} \ No newline at end of file From eda1a49cd34374c921f9db5e74cb57de1e531885 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Thu, 22 Aug 2024 09:27:39 +0200 Subject: [PATCH 10/18] changed format --- src/data/statisticsCSV.ts | 71 +++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 33 deletions(-) diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index c57ad5e..1ddbe2d 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -20,43 +20,48 @@ export function statisticsCSV( date: string, id: number, ): string { + + if (isFirstTime) { + output += "Name" + SEP; + output += "Datum" + SEP; + output += "ID" + SEP; + output += "Netzwerksektor" + SEP; + output += "Netzwerkgröße" + SEP; + output += "Netzwerkgröße (+aktivierbare)" + SEP; + output += "nach Geschlecht weiblich" + SEP; + output += "nach Geschlecht weiblich (+aktivierbare)" + SEP; + output += "nach Geschlecht männlich" + SEP; + output += "nach Geschlecht männlich (+aktivierbare)" + SEP; + output += "nach Geschlecht divers" + SEP; + output += "nach Geschlecht divers (+aktivierbare)" + SEP; + output += "nach Geschlecht nicht festgelegt" + SEP; + output += "nach Geschlecht nicht festgelegt (+aktivierbare)" + SEP; + output += "nach Horizont nah" + SEP; + output += "nach Horizont nah (+aktivierbare)" + SEP; + output += "nach Horizont mittel" + SEP; + output += "nach Horizont mittel (+aktivierbare)" + SEP; + output += "nach Horizont entfernt" + SEP; + output += "nach Horizont entfernt (+aktivierbare)" + SEP; + output += "Durschschn. Nähe" + SEP; + output += "Durschschn. Nähe (SD)" + SEP; + output += "Dichte" + SEP; + output += "Durchschn. Degree" + SEP; + output += "Durchschn. Degree (SD)" + SEP; + output += "Star(s)" + SEP; + output += "Isolierte" + SEP; + output += "Personen ohne Kante zum Ego" + SEP; + output += "\n"; + isFirstTime = false; + } + + for (const cat of allAlterCategorizationKeys) { const categorization = getAlterCategorization(cat); const networkAnalysisMap = analyseNWKbyCategory(nwk, categorization); - console.log(Array.from(networkAnalysisMap.entries())); + console.table(Array.from(networkAnalysisMap.entries())); + console.log(nwk) - if (isFirstTime) { - output += "Name" + SEP; - output += "Datum" + SEP; - output += "ID" + SEP; - output += "Netzwerksektor" + SEP; - output += "Netzwerkgröße" + SEP; - output += "Netzwerkgröße (+aktivierbare)" + SEP; - output += "nach Geschlecht weiblich" + SEP; - output += "nach Geschlecht weiblich (+aktivierbare)" + SEP; - output += "nach Geschlecht männlich" + SEP; - output += "nach Geschlecht männlich (+aktivierbare)" + SEP; - output += "nach Geschlecht divers" + SEP; - output += "nach Geschlecht divers (+aktivierbare)" + SEP; - output += "nach Geschlecht nicht festgelegt" + SEP; - output += "nach Geschlecht nicht festgelegt (+aktivierbare)" + SEP; - output += "nach Horizont nah" + SEP; - output += "nach Horizont nah (+aktivierbare)" + SEP; - output += "nach Horizont mittel" + SEP; - output += "nach Horizont mittel (+aktivierbare)" + SEP; - output += "nach Horizont entfernt" + SEP; - output += "nach Horizont entfernt (+aktivierbare)" + SEP; - output += "Durschschn. Nähe" + SEP; - output += "Durschschn. Nähe (SD)" + SEP; - output += "Dichte" + SEP; - output += "Durchschn. Degree" + SEP; - output += "Durchschn. Degree (SD)" + SEP; - output += "Star(s)" + SEP; - output += "Isolierte" + SEP; - output += "Personen ohne Kante zum Ego" + SEP; - output += "\n"; - isFirstTime = false; - } + for (const label of categorization.categories) { const networkAnalysis = networkAnalysisMap.get(label); From 538a85d208ee54eca9d05acf96814cbf65f4d932 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Thu, 22 Aug 2024 11:46:47 +0200 Subject: [PATCH 11/18] chnaged to NWKVersion and changed Filename --- src/components/SideMenu.vue | 11 +++-------- src/data/statisticsCSV.ts | 38 ++++++++++++++++++------------------- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index b9d56cf..96201c9 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -273,18 +273,13 @@ export default defineComponent({ ); }, exportCSV: () => { + const today = new Date(); downloadText( store.state.nwk.ego.name + " " + - visibleNWKVersion.value?.title + - " " + - visibleNWKVersion.value?.date?.substring(8, 10) + - "." + - visibleNWKVersion.value?.date?.substring(5, 7) + - "." + - visibleNWKVersion.value?.date?.substring(0, 4) + + today.toLocaleDateString("de-DE") + ".csv", - statisticsCSV(store.state.nwk, visibleNWKVersion.value!.title, visibleNWKVersion.value!.date, visibleNWKVersion.value!.id) + statisticsCSV(store.state.record.versions) ); }, diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index 1ddbe2d..e049d58 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -7,20 +7,18 @@ import { calculateDensity, NetworkAnalysis, } from "@/data/NetworkAnalysis"; -import { NWK } from "@/data/NWK"; import { Alter } from "./Alter"; import { store } from "@/store"; +import { NWKVersion } from "./NWKVersion"; const SEP = ";"; let output = ""; let isFirstTime = true; + export function statisticsCSV( - nwk: NWK, - title: string, - date: string, - id: number, + versions: NWKVersion[] ): string { - + if (isFirstTime) { output += "Name" + SEP; output += "Datum" + SEP; @@ -54,23 +52,23 @@ export function statisticsCSV( isFirstTime = false; } - - for (const cat of allAlterCategorizationKeys) { - const categorization = getAlterCategorization(cat); - const networkAnalysisMap = analyseNWKbyCategory(nwk, categorization); - console.table(Array.from(networkAnalysisMap.entries())); - console.log(nwk) - - - - for (const label of categorization.categories) { - const networkAnalysis = networkAnalysisMap.get(label); - if (networkAnalysis) { - getDataForKeyFigures(networkAnalysis, title, date, id, categorization.label, label); + for (const version of versions) { + if (version.id === store.state.record.currentVersion) { + for (const cat of allAlterCategorizationKeys) { + const categorization = getAlterCategorization(cat); + const networkAnalysisMap = analyseNWKbyCategory(version.nwk, categorization); + + for (const label of categorization.categories) { + const networkAnalysis = networkAnalysisMap.get(label); + if (networkAnalysis) { + getDataForKeyFigures(networkAnalysis, version.title, version.date, version.id, categorization.label, label); + } + output += "\n"; + } } - output += "\n"; } } + output += "\n"; return output; } From 4d9ca6140eaa5522a53593b1c3ad4c0a806aebc4 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Mon, 26 Aug 2024 08:03:04 +0200 Subject: [PATCH 12/18] ADD improvements --- src/data/statisticsCSV.ts | 71 +++++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 37 deletions(-) diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index e049d58..3899f62 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -13,47 +13,44 @@ import { NWKVersion } from "./NWKVersion"; const SEP = ";"; let output = ""; -let isFirstTime = true; export function statisticsCSV( versions: NWKVersion[] ): string { + output = ""; - if (isFirstTime) { - output += "Name" + SEP; - output += "Datum" + SEP; - output += "ID" + SEP; - output += "Netzwerksektor" + SEP; - output += "Netzwerkgröße" + SEP; - output += "Netzwerkgröße (+aktivierbare)" + SEP; - output += "nach Geschlecht weiblich" + SEP; - output += "nach Geschlecht weiblich (+aktivierbare)" + SEP; - output += "nach Geschlecht männlich" + SEP; - output += "nach Geschlecht männlich (+aktivierbare)" + SEP; - output += "nach Geschlecht divers" + SEP; - output += "nach Geschlecht divers (+aktivierbare)" + SEP; - output += "nach Geschlecht nicht festgelegt" + SEP; - output += "nach Geschlecht nicht festgelegt (+aktivierbare)" + SEP; - output += "nach Horizont nah" + SEP; - output += "nach Horizont nah (+aktivierbare)" + SEP; - output += "nach Horizont mittel" + SEP; - output += "nach Horizont mittel (+aktivierbare)" + SEP; - output += "nach Horizont entfernt" + SEP; - output += "nach Horizont entfernt (+aktivierbare)" + SEP; - output += "Durschschn. Nähe" + SEP; - output += "Durschschn. Nähe (SD)" + SEP; - output += "Dichte" + SEP; - output += "Durchschn. Degree" + SEP; - output += "Durchschn. Degree (SD)" + SEP; - output += "Star(s)" + SEP; - output += "Isolierte" + SEP; - output += "Personen ohne Kante zum Ego" + SEP; - output += "\n"; - isFirstTime = false; - } + output += "Name des Egos" + SEP; + output += "Name der Netzwerkkarte" + SEP; + output += "Datum" + SEP; + output += "ID" + SEP; + output += "Netzwerksektor" + SEP; + output += "Netzwerkgröße" + SEP; + output += "Netzwerkgröße (+aktivierbare)" + SEP; + output += "nach Geschlecht weiblich" + SEP; + output += "nach Geschlecht weiblich (+aktivierbare)" + SEP; + output += "nach Geschlecht männlich" + SEP; + output += "nach Geschlecht männlich (+aktivierbare)" + SEP; + output += "nach Geschlecht divers" + SEP; + output += "nach Geschlecht divers (+aktivierbare)" + SEP; + output += "nach Geschlecht nicht festgelegt" + SEP; + output += "nach Geschlecht nicht festgelegt (+aktivierbare)" + SEP; + output += "nach Horizont nah" + SEP; + output += "nach Horizont nah (+aktivierbare)" + SEP; + output += "nach Horizont mittel" + SEP; + output += "nach Horizont mittel (+aktivierbare)" + SEP; + output += "nach Horizont entfernt" + SEP; + output += "nach Horizont entfernt (+aktivierbare)" + SEP; + output += "Durschschn. Nähe" + SEP; + output += "Durschschn. Nähe (SD)" + SEP; + output += "Dichte" + SEP; + output += "Durchschn. Degree" + SEP; + output += "Durchschn. Degree (SD)" + SEP; + output += "Star(s)" + SEP; + output += "Isolierte" + SEP; + output += "Personen ohne Kante zum Ego" + SEP; + output += "\n"; for (const version of versions) { - if (version.id === store.state.record.currentVersion) { for (const cat of allAlterCategorizationKeys) { const categorization = getAlterCategorization(cat); const networkAnalysisMap = analyseNWKbyCategory(version.nwk, categorization); @@ -61,19 +58,19 @@ export function statisticsCSV( for (const label of categorization.categories) { const networkAnalysis = networkAnalysisMap.get(label); if (networkAnalysis) { - getDataForKeyFigures(networkAnalysis, version.title, version.date, version.id, categorization.label, label); + getDataForKeyFigures(networkAnalysis, version.nwk.ego.name, version.title, version.date, version.id, categorization.label, label); } output += "\n"; } } - } } output += "\n"; return output; } -function getDataForKeyFigures(networkAnalysis: NetworkAnalysis, title: string, date: string, id: number, categoryLabel: string, label: string) { +function getDataForKeyFigures(networkAnalysis: NetworkAnalysis, ego: string, title: string, date: string, id: number, categoryLabel: string, label: string) { + output += ego + SEP; output += title + SEP; output += date + SEP; output += id + SEP; From 4e11b779ddfe8d928c44a9616871a0fa2efbaef0 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Mon, 26 Aug 2024 11:18:58 +0200 Subject: [PATCH 13/18] ADD missing value --- src/data/statisticsCSV.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/data/statisticsCSV.ts b/src/data/statisticsCSV.ts index 3899f62..e76c6e0 100644 --- a/src/data/statisticsCSV.ts +++ b/src/data/statisticsCSV.ts @@ -76,6 +76,7 @@ function getDataForKeyFigures(networkAnalysis: NetworkAnalysis, ego: string, ti output += id + SEP; output += categoryLabel + (label ? " " + label : "") + SEP; output += networkAnalysis.alterConnectable + SEP; + output += networkAnalysis.alterConnected + SEP; for (const [i, g] of networkAnalysis.genderConnected.entries()) { output += g + SEP; From c69db44f915a5c12961d983d2e312b9914ad8b08 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Tue, 27 Aug 2024 08:41:24 +0200 Subject: [PATCH 14/18] changed to date to iso format --- src/components/SideMenu.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/SideMenu.vue b/src/components/SideMenu.vue index 96201c9..23af8f1 100644 --- a/src/components/SideMenu.vue +++ b/src/components/SideMenu.vue @@ -277,7 +277,7 @@ export default defineComponent({ downloadText( store.state.nwk.ego.name + " " + - today.toLocaleDateString("de-DE") + + today.toLocaleDateString("en-CA") + ".csv", statisticsCSV(store.state.record.versions) ); From 1b692cf15b31a67b57dc4b738d2d56b97aed8eb2 Mon Sep 17 00:00:00 2001 From: Eliasboss2006 Date: Tue, 27 Aug 2024 10:26:52 +0200 Subject: [PATCH 15/18] removing version button --- src/components/ComparisonOptionsPanel.vue | 11 --------- src/components/ComparisonSlider.vue | 6 +---- src/components/NetworkMap.vue | 8 +++---- src/store/sessionModule.ts | 29 ++--------------------- 4 files changed, 6 insertions(+), 48 deletions(-) diff --git a/src/components/ComparisonOptionsPanel.vue b/src/components/ComparisonOptionsPanel.vue index 5421e0e..b8a4031 100644 --- a/src/components/ComparisonOptionsPanel.vue +++ b/src/components/ComparisonOptionsPanel.vue @@ -70,13 +70,6 @@ {{ t("duplicateversion") }} - - store.state.session.nwkcomparison), - changeNWK: computed(() => store.state.session.nwkchange), }; }, }); diff --git a/src/components/NetworkMap.vue b/src/components/NetworkMap.vue index ec09688..89de5e0 100644 --- a/src/components/NetworkMap.vue +++ b/src/components/NetworkMap.vue @@ -2,7 +2,7 @@ {{ egoLabel }} - +