From e130564ee52894cd0aedbc4f787dcadf10af4144 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Mon, 9 Dec 2024 10:57:51 -0800 Subject: [PATCH 01/13] removed unused GraphHandler --- src/globals/graph-handler.ts | 811 ----------------------------------- 1 file changed, 811 deletions(-) delete mode 100644 src/globals/graph-handler.ts diff --git a/src/globals/graph-handler.ts b/src/globals/graph-handler.ts deleted file mode 100644 index c2a2960..0000000 --- a/src/globals/graph-handler.ts +++ /dev/null @@ -1,811 +0,0 @@ -// This is a first attempt at simplifying the data access from bbop graph to gocam graph -// This should be a separate library to ease the reuse throughout both GO and external applications - - -export class GraphHandler { - - EVIDENCE_PARENT = "ECO:0000000"; - BFO_PART_OF = "BFO:0000050"; - GO_BP = "GO:0008150"; - - // Derived from RO, Feb 16, 2021 - // Reference 1: https://www.ebi.ac.uk/ols/ontologies/ro/properties?iri=http%3A%2F%2Fpurl.obolibrary.org%2Fobo%2FRO_0002418&viewMode=All&siblings=false - // Reference 2: http://purl.obolibrary.org/obo/ro.obo - // Note: should dynamically load RO OBO/OWL to get those relations - RO_CAUSAL = { - "RO:0002418": "causally upstream of or within", - "RO:0002411": "causally upstream of", - "RO:0004046": "causally upstream of or within, negative effect", - "RO:0004047": "causally upstream of or within, positive effect", - "RO:0002012": "occurent part of", - "RO:0002010": "regulates in other organism", - "RO:0002305": "causally upstream of, negative effect", - "RO:0002304": "causally upstream of, positive effect", - "RO:0002412": "immediately causally upstream of", - "RO:0002211": "regulates", - "RO:0002414": "transitively provides input for", - "RO:0002212": "negatively regulates", - "RO:0002630": "directly negatively regulates", - "RO:0002408": "directly inhibits", - "RO:0002409": "indirectly inhibits", - "RO:0002213": "positively regulates", - "RO:0002629": "directly positively regulates", - "RO:0002406": "directly activates", - "RO:0002407": "indirectly activates", - "RO:0002413": "directly provides input for", - "RO:0002578": "directly regulates", - } - - - dbxrefs; - goApiUrl = "https://api.geneontology.org/api/search/entity/autocomplete/"; - - relations_enabled_by = ['http://purl.obolibrary.org/obo/RO_0002333', 'RO_0002333', 'RO:0002333']; - relations_collapsible = ["RO:0002333", "BFO:0000066", "RO:0002233", "RO:0002488", "RO:0002234"]; // 2233 : has input ; 2234 : has output - relations_nestable = {}; - - - bbopGraph = undefined; - bbopGraphBackup = undefined; // this is used to restore the graph if needed - - categories = undefined; - - - - constructor(graph) { - this.setBBOPGraph(graph); - } - - - /** - * Set the current BBOP graph - * @param graph BBOP graph of a GO-CAM - */ - setBBOPGraph(graph) { - this.bbopGraph = graph; - this.bbopGraphBackup = graph.clone(); - this.preprocess(graph); - } - - /** - * Return the current BBOP graph (low level data) - */ - getBBOPGraph() { - return this.bbopGraph; - } - - /** - * Used to restore the BBO graph (low level data) to its original value before manipulation - */ - resetBBOPGraph() { - this.setBBOPGraph(this.bbopGraphBackup); - } - - /** - * Set the dbxrefs object - * Used to map CURIE <-> resolvable Web URLs - */ - setDBXrefs(dbxrefs) { - this.dbxrefs = dbxrefs; - } - - /** - * Return the dbxrefs object currently loaded - * Used to map CURIE <-> resolvable Web URLs - */ - getDBXrefs() { - return this.dbxrefs; - } - - /** - * Fold a BBOP graph into a GO-CAM graph - * @param graph BBOP graph - * @param graphFold - * @param nest - */ - preprocess(graph, graphFold = "editor", nest = "no") { - - // Prepare graph - graph.unfold(); - if (graphFold == "evidence") { - graph.fold_evidence(); - } else if (graphFold == "editor") { - graph.fold_go_noctua(this.relations_collapsible) - } - - - // Get a list of all the singletons we start with. - var all_starting_singletons_by_id = {}; - var sings = graph.get_singleton_nodes(); - for (let sing of sings) { - all_starting_singletons_by_id[sing.id()] = true; - } - - - // Remove all of the undesireable rels. - var parent_trap = {}; - var note_sink = {}; // keep the reverse lookup info of parent_trap - if (nest && nest === 'yes') { - // console.log('adding nestable rels'); - this.relations_nestable["BFO:0000050"] = true; // part of - } - - for (let e of graph.all_edges()) { - if (this.relations_nestable.hasOwnProperty(e.predicate_id())) { - if (!parent_trap.hasOwnProperty(e.subject_id())) { - parent_trap[e.subject_id()] = []; - } - parent_trap[e.subject_id()].push(e.object_id()); - // Note the object for later checking. - note_sink[e.object_id()] = true; - } - // if(this.relations_strippable.hasOwnProperty(e.predicate_id())) { - // graph.remove_edge(e.subject_id(), - // e.object_id(), - // e.predicate_id()); - // } - } - - - // If it wasn't a singleton before we started, but is one now, - // remove it. In "nest" mode, only remove ones that are not - // going to be nested. - var eings = graph.get_singleton_nodes(); - for (let eing of eings) { - if (!all_starting_singletons_by_id.hasOwnProperty(eing.id())) { - if (nest && nest === 'yes' && note_sink[eing.id()]) { - // pass - } else { - graph.remove_node(eing.id()); - } - } - }; - - let cat_set = new Set(); - for (let enode of this.bbopGraph.all_nodes()) { - for (let in_type of enode.types()) { - cat_set.add(in_type.category()); - } - } - this.categories = Array.from(cat_set); - } - - - - /** - * Return all GO-CAM activity nodes using the GO-CAM activity object (not the bbop node) - */ - getAllActivities() { - let nodes = this.bbopGraph.all_nodes(); - let activities = nodes.filter(node => node.root_types().some(type => type.class_id() == "GO:0003674")) - let betterActivities = []; - for (let activity of activities) { - betterActivities.push(this.getActivity(activity.id())); - } - return betterActivities; - } - - /** - * Return a GO-CAM activity object - * @param nodeId gocam node id e.g. gomodel:568b0f9600000284/57ec3a7e00000119 - */ - getActivity(nodeId) { - - // If no id provided, no activity returned - if (!nodeId) { console.error("no id provided"); return undefined; } - - // If id is not from gomodel space (hardcoded bad), no activity returned - if (nodeId.substring(0, 8) != "gomodel:") { console.error("wrong id provided"); return undefined; } - - // if not couldn't be retrieved, no activity returned - let node = this.bbopGraph.get_node(nodeId); - if (!node) { console.error("could not get bbop graph node ", nodeId); return undefined; } - - - // nodes connected to this activity - let subgraph = node.subgraph(); - - // console.log("getActivity(", nodeId , "): ", subgraph); - - // this will detect the associated biological context - let standardTypes = node.types(); - let inferredTypes = node.get_unique_inferred_types(); - let geneProducts = [] - let biocontext = {}; - let hook_list = [] - if (subgraph) { - let connectedNodes = subgraph.all_nodes(); - for (let connected of connectedNodes) { - // don't treat if same node - if (node.id() == connected.id()) { continue; } - - let edges = subgraph.get_edges(node.id(), connected.id()); - for (let edge of edges) { - - // we are only interested in edges with enabled_by relation - if (!this.relations_enabled_by.includes(edge.predicate_id())) { continue } - - geneProducts.push({ - id: this.nodeIDs(connected)[0], - label: this.nodeLabels(connected)[0], - evidences: this.nodeEvidences(edge) - }); - } - } - - // Do it both ways--upstream and downstream. - this._folded_stack_gather(node, subgraph, 'standard', hook_list, biocontext); - this._folded_stack_gather(node, subgraph, 'reverse', hook_list, biocontext); - // convert to array - for (let key of Object.keys(biocontext)) { - biocontext[key] = Array.from(biocontext[key]); - } - } - - - // the graph must NOT be processed to remove part of as it was before - let partOf = []; - this.getNestedPartOfs(nodeId, partOf) - - - // var x_node = subgraph.get_node(entity_id); - // if(x_node) { - // var ev_node_anns = x_node.get_annotations_by_key('evidence'); - // // console.log("node evs: ", ev_node_anns); - // } - - let annotations = node.annotations(); - let annotationMap = {}; - for (let ann of annotations) { - let cs = new Set(); - if (ann.key() in annotationMap) { - cs = annotationMap[ann.key()] - } else { - annotationMap[ann.key()] = cs; - } - cs.add(ann.value()); - } - // convert to array - for (let key of Object.keys(annotationMap)) { - annotationMap[key] = Array.from(annotationMap[key]); - } - // console.log("node annotations: ", annotationMap); - - return { - nodeId: nodeId, - ids: standardTypes.map(elt => elt.class_id()), - labels: standardTypes.map(elt => elt.class_label()), - partOf: partOf, - biocontexts: biocontext, - geneProducts: geneProducts, - contributors: "contributor" in annotationMap ? annotationMap["contributor"] : [], - providedBy: "providedBy" in annotationMap ? annotationMap["providedBy"] : [], - date: "date" in annotationMap ? annotationMap["date"][0] : "N/A", - raw: { - node: node, - stdTypes: standardTypes, - infTypes: inferredTypes, - annotations: annotationMap, - } - } - } - - getNestedPartOfs(nodeId, partOfs: any[]) { - let edges = this.bbopGraph.get_edges_by_subject(nodeId); - for (let edge of edges) { - if (edge.predicate_id() == this.BFO_PART_OF) { - let object = this.bbopGraph.get_node(edge.object_id()); - if (object.root_types().some(elt => elt.class_id() == "GO:0008150")) { - - let keys = Object.keys(object._id2type) - for (let key of keys) { - let node = object._id2type[key]; - - // console.log("id2type: ", node); - if (node.class_id() == "GO:0008150") { continue; } - - let outEdges = this.bbopGraph.get_edges_by_subject(object.id()); - - if (outEdges && Array.isArray(outEdges) && outEdges.length === 0) { - partOfs.push({ - id: node.class_id(), - label: node.class_label(), - evidences: this.nodeEvidences(edge) - }) - } - - } - } - - //avoid overflow; low chances - if (partOfs.length < 10) { - this.getNestedPartOfs(object.id(), partOfs) - } - } - } - } - - /** - * This will return a list of activities enriched with additional meta data, such as gene taxon and URLs - * Note: require dbxrefs to be set - * @param activities : array of activities returned for instance by getAllActivities() - */ - async enrichActivities(activities) { - let enriched = []; - for (let activity of activities) { - enriched.push(this.enrichActivity(activity)); - } - return Promise.all(enriched); - } - - processesKey(array) { - let key = array.map(elt => elt.id).join(","); - // if not part of BP, state "Other processes" - if (key == "") { key = "Other processes" } - return key - } - - groupActivitiesByProcess(enrichedActivities) { - let map = new Map(); - for (let enr of enrichedActivities) { - let key = this.processesKey(enr.partOf); - // console.log("activity: ", enr , ": process: ", key); - let acts = []; - if (map.has(key)) { - acts = map.get(key); - } else { - map.set(key, acts); - } - acts.push(enr); - } - - let groupedActivities = []; - map.forEach((val, process) => { - let item = { - id: process.split(","), - url: (process.split(",") != "" && this.dbxrefs) ? - process.split(",").map(elt => { - let db = elt.split(":")[0]; - let id = elt.split(":")[1]; - return this.dbxrefs.getURL(db, undefined, id) - }) : "#", - label: val[0].partOf.map(elt => elt.label) == "" ? ["others processes"] : val[0].partOf.map(elt => elt.label), - activities: val - }; - groupedActivities.push(item); - }) - return groupedActivities; - } - - - /** - * This will return an activity enriched with additional meta data, such as gene taxon and URLs - * Note: require dbxrefs to be set - * @param activity : activity object returned by getActivity() - */ - async enrichActivity(activity) { - - for (let gp of activity.geneProducts) { - let metas = null;//await this.annotate(gp.id); - - // if no meta retrieved, continue - if (!metas) { continue; } - - // add hyperlink to gene - gp.url = metas.url; - - if (metas.taxon) { - let db = metas.taxon.split(":")[0]; - db = "taxon" // temp fix - let id = metas.taxon.split(":")[1]; - gp.taxonId = metas.taxon; - gp.taxonLabel = metas.taxon_label; - gp.taxonURL = this.dbxrefs.getURL(db, undefined, id); - } - } - - activity.urls = [] - for (let goid of activity.ids) { - let db = goid.split(":")[0]; - let id = goid.split(":")[1]; - activity.urls.push(this.dbxrefs.getURL(db, undefined, id)); - } - - return activity; - } - - getCausalActivities(activity, enrichedActivities) { - let connected = {}; - let edges = this.bbopGraph.get_edges_by_subject(activity.nodeId); - for (let edge of edges) { - - // console.log("edge: ", edge); - if (!this.RO_CAUSAL.hasOwnProperty(edge.predicate_id())) { - continue; - } - - let object = this.bbopGraph.get_node(edge.object_id()); - // console.log("object: ", object); - - let keys = Object.keys(object._id2type) - let isActivity = false; - for (let key of keys) { - let node = object._id2type[key]; - - if (node.class_id() == "GO:0003674") { - isActivity = true; - break; - } - - } - - if (isActivity) { - let relid = edge.predicate_id(); - let activities = []; - if (connected.hasOwnProperty(relid)) { - activities = connected[relid]; - } else { - connected[relid] = activities; - } - - activities.push({ - relationId: edge.id(), - relationLabel: edge._predicate_label, - relationURL: this.dbxrefs.getURL(relid.split(":")[0], undefined, relid.split(":")[1]), - activity: this.getActivityById(enrichedActivities, object.id()) - }); - } - } - - return connected; - } - - getActivityById(enrichedActivities, nodeId) { - for (let ea of enrichedActivities) { - if (ea.nodeId == nodeId) { - return ea; - } - } - return null; - } - - - - /** - * Return the URL, taxon and taxon URL for a gene CURIE - */ - async annotate(id) { - if (!id) { - console.error("asked to annotated null id: ", id); - return ""; - } - if (id.includes(":")) { - let category = "category=gene&"; - if (id.includes("GO:")) - category = "" - let url = this.goApiUrl + id + "?" + category + "rows=1"; - return await fetch(url) - .then(async function (data) { return data.json() }) - .then(data => { - let doc = data.docs[0]; - try { - let db = doc.id.split(":")[0]; - let dbid = doc.id.split(":")[1]; - - // Temporary fix for a long standing issue of MGI:MGI: curie - if (doc.id.includes("MGI:") && !doc.id.includes("MGI:MGI:")) { - dbid = "MGI:" + dbid; - } - - doc["url"] = this.dbxrefs.getURL(db, undefined, dbid); - } catch (error) { - console.error("asked to annotate ", id, " but doc ", doc, " does not have an id, can not resolve URL - data is: ", data); - } - return doc - }) - } - } - - - - - - - - - nodeEvidences(edge) { - // should always be there - should always have evidence, but just in case - if (!edge.referenced_subgraphs()) { - console.warn("edge ", edge, " does not have evidence !"); - return []; - } - - let evidences = []; - for (let rfs of edge.referenced_subgraphs()) { - let keys = Object.keys(rfs._nodes); - for (let key of keys) { - let node = rfs._nodes[key]; - - // normally 1 source, 1 with, multiple sources - let evidence = { source: "", url: "", with: "", evidences: [] } - for (let ann of node.annotations()) { - if (ann._properties.key == "source") { - evidence.source = ann._properties.value; - evidence.url = this.dbxrefs.getURL(evidence.source.split(":")[0], undefined, evidence.source.split(":")[1]); - } else if (ann._properties.key == "with") { - evidence.with = ann._properties.value; - } - } - - let evkeys = Object.keys(node._id2type); - for (let evkey of evkeys) { - let ev = node._id2type[evkey]; - if (ev.class_id() != this.EVIDENCE_PARENT) { - evidence.evidences.push({ id: ev.class_id(), label: ev.class_label() }); - } - } - evidences.push(evidence); - } - } - return evidences; - } - - nodeIDs(n) { - var retlist = []; - var bin = {}; - for (let in_type of n.types()) { - var cat = in_type.category(); - if (!bin[cat]) { bin[cat] = []; } - bin[cat].push(in_type); - } - for (let cat_id of this.categories) { - var accumulated_types = bin[cat_id]; - var cell_cache = []; - for (let atype of accumulated_types) { - var tt = atype.class_id(); - cell_cache.push(tt); - } - retlist.push(cell_cache.join("\n")); - }; - return retlist; - } - - nodeLabels(n) { - var retlist = []; - var bin = {}; - for (let in_type of n.types()) { - var cat = in_type.category(); - if (!bin[cat]) { bin[cat] = []; } - bin[cat].push(in_type); - } - for (let cat_id of this.categories) { - var accumulated_types = bin[cat_id]; - var cell_cache = []; - for (let atype of accumulated_types) { - var tt = atype.class_label(); - cell_cache.push(tt); - } - let val = cell_cache.join("\n"); - if (val.includes(" ")) { - let splits = val.split(" "); - splits.pop(); // remove the species - val = splits.join("\n"); - } - retlist.push(val); - }; - return retlist; - } - - nodeIDLabels(n) { - var retlist = []; - var bin = {}; - for (let in_type of n.types()) { - var cat = in_type.category(); - if (!bin[cat]) { bin[cat] = []; } - bin[cat].push(in_type); - } - for (let cat_id of this.categories) { - var accumulated_types = bin[cat_id]; - var ids = []; - var labels = []; - for (let atype of accumulated_types) { - ids.push(atype.class_id()); - labels.push(atype.class_label()); - } - retlist.push({ ids: ids.join("\n"), labels: labels.join("\n") }); - }; - return retlist; - } - - - - // Gather the stack to display, abstractly do go up or down - // the subgraph. - _folded_stack_gather(enode, subgraph, direction, hook_list, biocontext) { - - // First, get the parent/child sub-nodes. - var x_edges = []; - if (direction === 'standard') { - x_edges = subgraph.get_parent_edges(enode.id()); - } else { - x_edges = subgraph.get_child_edges(enode.id()); - } - - // for a specific aspect of the activity - for (let x_edge of x_edges) { - // Edge info. - var rel = x_edge.relation() || 'n/a'; - // TODO var rel_color = aid.color(rel); - // TODO var rel_readable = aid.readable(rel); - var rel_color = "red"; - var rel_readable = "readable_var"; - // If context aid doesn't work, see if it comes with a label. - if (rel_readable === rel && typeof (x_edge.label) === 'function') { - var label_rn = x_edge.label(); - if (label_rn !== rel) { - rel = label_rn; // use label - } - } else { - rel = rel_readable; // use context - } - - // collecting all the evidences for that aspect.... (seriously this business logic should be on the server side to avoid those kind of smelly/spaghetti code) - let gathered_evidences = { "pmid": [], "eco": [], "label": [], "url": [] } - var refsubgraphs = x_edge.referenced_subgraphs(); - for (var refsubgraph of refsubgraphs) { - var refevnodes = refsubgraph.get_nodes() - for (let nodeid of Object.keys(refevnodes)) { - let node = refsubgraph.get_node(nodeid); - let anns = node.annotations(); - for (let ann of anns) { - if (ann._properties["key"] == "source") { - let id = ann._properties["value"]; - gathered_evidences["pmid"].push(id); - if (id && id.includes(":")) { - gathered_evidences["url"].push(this.dbxrefs.getURL(id.split(":")[0], undefined, id.split(":")[1])) - } else { - // could not resolve - gathered_evidences["url"].push("#"); - } - } - } - let types = node.types(); - for (let type of types) { - gathered_evidences["eco"].push(type.class_id()); - gathered_evidences["label"].push(type.class_label()); - } - } - } - - var ev_edge_anns = x_edge.get_annotations_by_key('evidence'); - - // Get node. - var x_ent_id = null; - if (direction === 'standard') { - x_ent_id = x_edge.object_id(); - } else { - x_ent_id = x_edge.subject_id(); - } - - var x_node = subgraph.get_node(x_ent_id); - // console.log("CENTRAL NODE: ", x_ent_id, x_node); - // Try and extract proof of evidence. - if (x_node) { - var ev_node_anns = x_node.get_annotations_by_key('evidence'); - // console.log("utils : node annotation: ", ev_node_anns); - - // Add the edge/node combos to the table. - for (let x_type of x_node.types()) { - // - var elt_id = this.uuid(); - var edge_id = x_edge.id(); - let edge_label = this.glyph(x_edge.relation()).label; - hook_list.push([edge_id, elt_id]); - // console.log("XTYPE: ", x_type); - let relid = x_edge.relation(); - - let cs = new Set(); - if (relid in biocontext) { - cs = biocontext[relid]; - } else { - biocontext[relid] = cs; - } - - cs.add({ - relationId: edge_id, - relationLabel: edge_label, - relationURL: this.dbxrefs.getURL(relid.split(":")[0], undefined, relid.split(":")[1]), - evidences: gathered_evidences, - nodeId: elt_id, - termId: x_type.class_id(), - termLabel: x_type.class_label(), - termURL: this.dbxrefs.getURL(x_type.class_id().split(":")[0], undefined, x_type.class_id().split(":")[1]), - }); - - // In this case (which should be the only possible - // case), we'll capture the ID and pair it with an - // ID. - // _add_table_row(x_type, rel_color, rel + '(', - // ')E'); - - } - } - - } - } - - - /** - * From https://github.com/berkeleybop/bbop-core/blob/master/lib/core.js - * RFC 4122 v4 compliant UUID generator. - * From: http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523 - * - * @returns {string} string - */ - uuid() { - - // Replace x (and y) in string. - function replacer(c) { - var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); - return v.toString(16); - } - var target_str = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'; - return target_str.replace(/[xy]/g, replacer); - } - - glyph(relation) { - switch (relation) { - case "BFO:0000050": - return { lineStyle: "solid", glyph: null, label: "part of", color: '#add8e6' }; - case "BFO:0000051": - return { lineStyle: "solid", glyph: null, label: "has part", color: '#6495ED' }; - case "BFO:0000066": - return { lineStyle: "solid", glyph: null, label: "occurs in", color: '#66CDAA' }; - case "RO:0002211": - return { lineStyle: "dashed", glyph: null, label: "regulates", color: '#2F4F4F' }; - case "RO:0002212": - return { lineStyle: "dashed", glyph: "tee", label: "negatively regulates", color: '#FF0000' }; - case "RO:0002630": - return { lineStyle: "solid", glyph: "tee", label: "directly negatively regulates", color: '#FF0000' }; - case "RO:0002213": - return { lineStyle: "dashed", glyph: "triangle", label: "positively regulates", color: '#008000' }; - case "RO:0002629": - return { lineStyle: "solid", glyph: "triangle", label: "directly positively regulates", color: '#008000' }; - case "RO:0002233": - return { lineStyle: "solid", glyph: null, label: "has input", color: '#6495ED' }; - case "RO:0002234": - return { lineStyle: "solid", glyph: null, label: "has output", color: '#ED6495' }; - case "RO:0002331": - return { lineStyle: "solid", glyph: null, label: "involved in", color: '#E9967A' }; - case "RO:0002333": - return { lineStyle: "solid", glyph: null, label: "enabled by", color: '#B8860B' }; - case "RO:0002411": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of", color: '#483D8B' }; - case "RO:0002418": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of or within", color: '#483D8B' }; - - case "RO:0002408": - return { lineStyle: "solid", glyph: "tee", label: "directly inhibits", color: '#FF0000' }; - case "RO:0002406": - return { lineStyle: "solid", glyph: "triangle", label: "directly activates", color: '#008000' }; - - case "RO:0002305": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of, negative effect", color: '#FF0000' }; - case "RO:0004046": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of or within, negative effect", color: '#FF0000' }; - - case "RO:0002304": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of, positive effect", color: '#008000' }; - case "RO:0004047": - return { lineStyle: "dashed", glyph: null, label: "causally upstream of or within, positive effect", color: '#008000' }; - - case "annotation": - return { lineStyle: "solid", glyph: "diamond", label: "annotation", color: '#483D8B' }; - case "instance_of": - return { lineStyle: "solid", glyph: null, label: "activity", color: '#FFFAFA' }; - } - console.warn("No glyph found for relation '" + relation + "'"); - return { glyph: null, label: relation, color: "black" }; - } - -} From 832ce7913f66b4b2b64c96202a452ae09e49767f Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Mon, 9 Dec 2024 21:22:26 -0800 Subject: [PATCH 02/13] impreoved the legend to use svg. Relation data type check --- src/components/gocam-legend/gocam-legend.scss | 23 +++ src/components/gocam-legend/gocam-legend.tsx | 103 +++++----- src/components/gocam-viz/gocam-viz.tsx | 16 +- src/globals/constants.ts | 37 ---- src/globals/legend.ts | 21 ++ src/globals/relations.ts | 191 ++++++++++++++++++ src/globals/utils.ts | 172 ---------------- src/styled.html | 3 +- 8 files changed, 305 insertions(+), 261 deletions(-) create mode 100644 src/globals/legend.ts create mode 100644 src/globals/relations.ts diff --git a/src/components/gocam-legend/gocam-legend.scss b/src/components/gocam-legend/gocam-legend.scss index 24cbae0..9ad89c8 100644 --- a/src/components/gocam-legend/gocam-legend.scss +++ b/src/components/gocam-legend/gocam-legend.scss @@ -58,3 +58,26 @@ img { display: inline-block; margin-left: 0.5em; } + +.columns { + display: flex; + gap: 20px; + + .column { + flex: 1; + display: flex; + flex-direction: column; + gap: 10px; + } +} + +.item { + display: flex; + align-items: center; + gap: 5px; + height: 30px; + + svg { + flex-shrink: 0; + } +} diff --git a/src/components/gocam-legend/gocam-legend.tsx b/src/components/gocam-legend/gocam-legend.tsx index e82459e..dcc9a8d 100644 --- a/src/components/gocam-legend/gocam-legend.tsx +++ b/src/components/gocam-legend/gocam-legend.tsx @@ -1,38 +1,9 @@ import { Component, Host, h } from '@stencil/core'; -import { legend } from '../../globals/constants'; +import { RELATION_MAP, STYLES } from '../../globals/relations'; +import { LEGEND_COLUMNS } from '../../globals/legend'; -import direct_regulation from './assets/relation/direct_regulation.png'; -import indirect_regulation from './assets/relation/indirect_regulation.png'; -import positive_regulation from './assets/relation/positive_regulation.png'; -import negative_regulation from './assets/relation/negative_regulation.png'; -import provides_input_for from './assets/relation/provides_input_for.png'; -import neutral from './assets/relation/neutral.png'; -import input_of from './assets/relation/input_of.png'; -import has_output from './assets/relation/has_output.png'; -// Stencil's Assets feature[1] makes client applications jump through a lot of hoops[2] in order -// to get the assets served from the right location if they choose to the NPM package instead of -// a + + + + + wc-gocam-viz -- styled + + + + + + +
+ + +
+ + + + + + + \ No newline at end of file diff --git a/src/globals/legend.ts b/src/globals/legend.ts index b84126a..a6c9685 100644 --- a/src/globals/legend.ts +++ b/src/globals/legend.ts @@ -1,21 +1,21 @@ import { Relations } from "./relations"; export const LEGEND_COLUMNS = { - regulation: [ - Relations.DIRECTLY_POSITIVELY_REGULATES, // RO:0002629 - Relations.DIRECTLY_NEGATIVELY_REGULATES, // RO:0002630 - Relations.INDIRECTLY_POSITIVELY_REGULATES, // RO:0002409 - Relations.INDIRECTLY_NEGATIVELY_REGULATES // RO:0002407 - ], - input: [ - Relations.PROVIDES_INPUT_FOR, // RO:0002413 - Relations.REMOVES_INPUT_FOR, // RO:0012010 - Relations.HAS_INPUT, // RO:0002233 - Relations.HAS_OUTPUT // RO:0002234 - ], - upstream: [ - Relations.CONSTITUTIVELY_UPSTREAM_OF, // RO:0012009 - Relations.CAUSALLY_UPSTREAM_OF_POSITIVE_EFFECT, // RO:0002304 - Relations.CAUSALLY_UPSTREAM_OF_NEGATIVE_EFFECT // RO:0002305 - ] -}; \ No newline at end of file + regulation: { + [Relations.DIRECTLY_POSITIVELY_REGULATES]: 'direct positive regulation/activation', + [Relations.DIRECTLY_NEGATIVELY_REGULATES]: 'direct negative regulation/inhibition', + [Relations.INDIRECTLY_POSITIVELY_REGULATES]: 'indirect positive regulation', + [Relations.INDIRECTLY_NEGATIVELY_REGULATES]: 'indirect negative regulation' + }, + input: { + [Relations.PROVIDES_INPUT_FOR]: 'provides input for', + [Relations.REMOVES_INPUT_FOR]: 'removes input for', + [Relations.HAS_INPUT]: 'input of', + [Relations.HAS_OUTPUT]: 'has output' + }, + upstream: { + [Relations.CONSTITUTIVELY_UPSTREAM_OF]: 'constitutively upstream', + [Relations.CAUSALLY_UPSTREAM_OF_POSITIVE_EFFECT]: 'upstream positive effect', + [Relations.CAUSALLY_UPSTREAM_OF_NEGATIVE_EFFECT]: 'upstream negative effect' + } +}; diff --git a/src/styled.html b/src/styled.html index 29f95d6..ea45c99 100644 --- a/src/styled.html +++ b/src/styled.html @@ -56,8 +56,7 @@
- +
From 9d5bbf49068226b881b5f07cc8e917c499369989 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Tue, 10 Dec 2024 12:34:46 -0800 Subject: [PATCH 04/13] removed the legend assets not used --- src/components/gocam-legend/assets/legend.png | Bin 66420 -> 0 bytes src/components/gocam-legend/assets/legendv2.png | Bin 62745 -> 0 bytes .../assets/relation/direct_regulation.png | Bin 191 -> 0 bytes .../gocam-legend/assets/relation/has_output.png | Bin 477 -> 0 bytes .../assets/relation/indirect_regulation.png | Bin 200 -> 0 bytes .../gocam-legend/assets/relation/input_of.png | Bin 470 -> 0 bytes .../assets/relation/negative_regulation.png | Bin 447 -> 0 bytes .../gocam-legend/assets/relation/neutral.png | Bin 468 -> 0 bytes .../assets/relation/positive_regulation.png | Bin 851 -> 0 bytes .../assets/relation/provides_input_for.png | Bin 1918 -> 0 bytes 10 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/components/gocam-legend/assets/legend.png delete mode 100644 src/components/gocam-legend/assets/legendv2.png delete mode 100644 src/components/gocam-legend/assets/relation/direct_regulation.png delete mode 100644 src/components/gocam-legend/assets/relation/has_output.png delete mode 100644 src/components/gocam-legend/assets/relation/indirect_regulation.png delete mode 100644 src/components/gocam-legend/assets/relation/input_of.png delete mode 100644 src/components/gocam-legend/assets/relation/negative_regulation.png delete mode 100644 src/components/gocam-legend/assets/relation/neutral.png delete mode 100644 src/components/gocam-legend/assets/relation/positive_regulation.png delete mode 100644 src/components/gocam-legend/assets/relation/provides_input_for.png diff --git a/src/components/gocam-legend/assets/legend.png b/src/components/gocam-legend/assets/legend.png deleted file mode 100644 index bce52db1e6e2609ca0c290ad7eb0343ea8c1c0bf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66420 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 diff --git a/src/components/gocam-legend/assets/legendv2.png b/src/components/gocam-legend/assets/legendv2.png deleted file mode 100644 index fbf94e5353292039b4f75d0daec9caa247c5a131..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 62745 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 a{&7D{_IM#ZRmp|{2s~Z=T-G@yGywo~D4aY1 diff --git a/src/components/gocam-legend/assets/relation/direct_regulation.png b/src/components/gocam-legend/assets/relation/direct_regulation.png deleted file mode 100644 index 64c82caf9f56a3121e2cffbe91c03efa5ce6e621..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^-9XI8!3-odcF8XTQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`*#dk*T!D0bef^~C^UXlYOM?7@862M7NCR>>3p^r=85oQXfH0#*O4Mzj zpsA;eV~B_M+jARv4;V1C960~aJGyH{!~wkpi+9)ZnPx#1ZP1_K>z@;j|==^1poj54^T{0MF0Q*>tvJbWRvb>mhEJfc4O3W00004bW%=J z06>7hqg34t00009a7bBm001(;001(;0Vrfz+W-IoM@d9MRA@u(n%j=TFbqT+yZ`^q zB+DRC*c986Cw|Cz1i3y;tn|jgrZrL3^E_2W1RpM^{V83LhVRzVzNEn7+-6#Xg=zwY z8H>~!+TXE4?N?k+_+~aQzS-T>Ur|(WKvNs2VPMZ|z{|`!UoTj5=JjHk`MpSH=;Z^o znM4AkM21dY(l3N!ff4o$^zoA%Sv0Wp$j~LiD3AZHM8;Z{6dP-~#a#5Y++r^JX{n}I zAF?gxqO4fo`?r{nJ!4MFik019x0si*C-JJ+W8$!Gk_=5? TeFFQq00000NkvXXu0mjfDQMKw diff --git a/src/components/gocam-legend/assets/relation/indirect_regulation.png b/src/components/gocam-legend/assets/relation/indirect_regulation.png deleted file mode 100644 index e5ffc7c7c02ad62a1447eca4053540c27f464aec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 200 zcmeAS@N?(olHy`uVBq!ia0vp^-9XI8!3-odcF8XTQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1`IRkt`T!C~$LqmOi{kJ=JJ%Ajhk|4ie1_uWJo)sV^1s;*b3=BpGK$uY@ zCF(X%(8|-rF~r0BZJ#0^gMz?ew*U1e%bKnf2yHxN>OIRg^=aG3vrpP`x*fK;D%@6@ mkSlm%8%Ihs%cuF%o-nvR;;!B7r1%?X3WKMspUXO@geCwY96ewF diff --git a/src/components/gocam-legend/assets/relation/input_of.png b/src/components/gocam-legend/assets/relation/input_of.png deleted file mode 100644 index ad5a3009e770a82e561bb4f97af73b1321d38777..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 470 zcmeAS@N?(olHy`uVBq!ia0vp^(}CEYgBeKP;#+kBNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=MV4+aRt&TlV5|-w09{}-|9qVy$2~R3GxeOaA?@SIOHx5kk47*5n0T@ zU~~Y488uR(ZUfDB@N{tu$#8x<>mpyX0f#H=pa1!Bw;wEvE@^Gy=C|#Sj`7#?P%CtH zKBKhh{caB9*X=hi7+5L${EC(O^0s8ctXpeC)z7}UxN36pv8rFfoV8|)rwZKMFC~|7 z)Wd%+gJ#-=tjj+7ObgWgn7nhgZRc}HDlUH{d1A+g?8GBqG=v-OeLup=ab~%w{EW-m zRtD?CN)oPJ{HkbXV0*-o|IFMnmC(IWir!UQou+-sYF+cv_4H|%P<_2us;5sM`Lro; z>-*``drjZxiu|=d2o$Nv<2soj^w1tx diff --git a/src/components/gocam-legend/assets/relation/negative_regulation.png b/src/components/gocam-legend/assets/relation/negative_regulation.png deleted file mode 100644 index 2d906a090fa90dd92556bb92ac3faf5d2fda9aa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 447 zcmeAS@N?(olHy`uVBq!ia0vp^vw+y2gBeJwT+-PIq!^2X+?^QKos)S9^91;WxB}_ZV04Co;mt$s03e^aB*-tA!J*;#c8=dbE@y#9WHAGS(E$)< z)JTcC4K!ER)5S3)!};xXLq8S+0hWWz|Nf_^to*c*BZ_5R#hQCp=ASsP`+LHNGzopr09hr*uK)l5 diff --git a/src/components/gocam-legend/assets/relation/neutral.png b/src/components/gocam-legend/assets/relation/neutral.png deleted file mode 100644 index addc8fdda031acbf58feedd32835e0264e345d9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 468 zcmeAS@N?(olHy`uVBq!ia0vp^Q-Ro?gBeKP`(5=FNHG=%xjQkeJ16rJ$YDu$^mSxl z*x1kgCy^D%=MV4+aRt)*_wV1kcQ23xf>!C0+aRSSL4Lsu4h{Pkhuq}>@;M7UB8wRq zj1GV>qee;;P!Xe@r;B4qhV$E57x|hEI9zpq{J*~^DRSG<6$gqm`EC18^QenI6S-TI z>2hYz`!iQA@;|?{>zw}OqvyPs=V_EZEipLx`kLpAhpth-+iKP>U%=+Of9~Pr@Ap!U zUEQ**(MI>MN9~DAMJlQ)nVF`>n#%dIU-&tr)-9CUAlId=Fm=Jw(m4&)5?x$!)4~dw zd9@`(Ep*ljGDw73tP;E?-`>0;Q&l%6%&m%>JL;|J+FP59f-iSXn>sT!b@{TZR>n6X z|2L;)#Tf^9uAUWMd;Bd2%kyWiq@Rd+d$Ty)vuRgn-u>aSQr?EJgD0KdyZ!y`?#SOJ z$i*!in(<&^w$jokd^i7FANlUT;%Ckw^Qg!my|p%)?!v}PtwiT9E#rwjW8puy;=`ja z3)o5?o1XUE@oCn}k^-^EX18B1n7Ak8O6ilOi?kQ#Rx@T!_n8=NnH~iUUItHBKbLh* G2~7Yuj={eG diff --git a/src/components/gocam-legend/assets/relation/positive_regulation.png b/src/components/gocam-legend/assets/relation/positive_regulation.png deleted file mode 100644 index a1e2804532f03fb8b15052bdc172479b997c5f64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 851 zcmeAS@N?(olHy`uVBq!ia0vp^?m#TZ!3-ol-+vYYQjEnx?oJHr&dIz4a#+$GeH|GX zHuiJ>Nn{1e`3CrexB|t2prHYX8bU)ELPJ9x8XSz%jMIQglGV1s#JlVw1oX$TNC zn*$YxHkgDqT81^61T`6lG@FGqm<9pKMzi21v(P3W!!!(t8cf5QfXF)shy)4(4FT!` zlFc9~FxxD&)hx8dEUe8OM7DwukO5X~0x}A$7^(%Rs|AR_%G%7sTg}6PWV?Aphec$k zMP!#nR5uV=M)g=m_gd+s{m27`W?V^-UoZnB6B9Et3o9!t8#^Z_7q_UGgru~Lyn>RN zskx24v$LCrUtn-ldRA_3QBiSmNl8gXWmR2$b4yFt_D{=M}9!eow%9k&<~&kLcI``g0ZKkCzrj{#cXu?vbr}_soc0 zOix8;RJ^(OP^(8LDb6j+u(;!cf7NQ$j>(pWbCtjEIDYKnjQb1UJZ1Tw_mj`kUwUCs z&Y2Z_6RU5W-4&hSRr*5JF06TO(Di`z3kyF6m!7DM$=7o{y#3e5b;{j6$M3#g<#J^6 zl!HT z>cJaN?$@_361-lh8mKta=9T;513%1-N`!Ndo^yC;z4XdWndkX!eLnMe5|Y{G9x0O+ zYx^|!%TK27Uj-k^+?~(&FvagojcVDg!UT?U_ttHY=kB+)=z1x?c}+ZH==V#e5$Df< OlE0^`pUXO@geCyjvr`BF diff --git a/src/components/gocam-legend/assets/relation/provides_input_for.png b/src/components/gocam-legend/assets/relation/provides_input_for.png deleted file mode 100644 index a1ae3bf8deeb5f7fcf42b7e1e1ee00c4a561d6c8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1918 zcmV-^2Z8vBP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGr5dZ)e5dq33^FIIp2NOv|K~!i%?OADT z6lEALMh$pD0S`11;3pb2K}5U(4+JHOF){uy{_}`c6BA;HT0{In{6Qo_kbol8!p`pO z&R%Uruq`$=ASGS*n3cz=pJo>a*yvj`)w)RX=!)63nV_tli6eD{l0y^_j`|T z>;A_zMx)Yr)1FXhI(d7|(9@&baww3UX?I5InNV()%HG_pgAVz2a?AAry*qh_-W~mb zaz@uScSY*S$29}x7H8{taVhPIenzvgpN$@=*~rHB0h{njd*YjESNtuDLtc12ENopf ztf*bg+w75ii00*=bROx&y(~M2d|frbc=fa=_6E(#O}0qB*BZ>qjF33TcoP>HA$cCI z7w~HKr~B>Ue!ne{>7-fd8=WioXosTQOw80COmApbOC;ZZICV~8e5oOr7-treJ1IwK zH6_IFCbvx~^ls@f6DM!Cg|c3=FLj|M(yv&983hC?p~at8?BP5xr&t4hSrD?z;E_Ju z=kVV{%+(esm@Sw&+yav_3n_JS7GHYE9?WtkZ(=uY)&0)Iz2x?ap>qUZv4wMO=0N(4 zJ(N?&G;;BA30qY$!4(8kZ14<-7-jhQ_Y5a5AZBZaVZkDK1!9Im!^B|KhlR5RvtARQ z_=R#y>x^t_9(k-R7}(g$urNnpJk@iw#2J?;oHwDM&=y}R2U~dS0hjMVV!k%GLa-5& zyDS`dfj>P2F-Bnc#IHtHeA6cOJwP6xFbsV35m73HrdUtF-F*7bO6B~KyN8E<0XH_B=p$SB@ zhhP^7Dc%3IVoMVS zR(=gU)Qit**)EqD|6mRn&I7G8A zv93<3n?~d*g^`c0gl*K)CY==8qJwNXY({%jDDQ+aeuu9kZd`gId z6~amcvh_+LPbqE$!Kx}0VbQ~^{&djF$DSebl%f#BBo78$e5ev?O=PmX!rqA2>U)j* zr;0RNh+)t&agd%Kxujt4Sgqg>eQu%E;^GG>cYHCCrxeiBJq-QSMth`x8`NW4%OUi3KY)#$ z7C#n#lS}xx!5KX z+duX>o?h?16&vT~9)51wgg$a_mwUc7km znK*fq!4-W0kC_!k8M7_XdBo@7NAcLkK%y$KT^3|I#u+jZipL=C<1yYF*7dkEZ*peeG6VZfITbP)Ea9t#0pSN6F zuq%XuI3XndhBDzR+7)|RAIQ!mk53r1GqMQAX>JMUE>x0akXWwZaT9oWn&#slQKC45 z3{!oK7OWstvJj(!;PSpy7i_;TDOOtEbX2&DJXRJA&dB5DKpz91b_p}*q(y`K(X;R< z3a&YWC%O^C0Wn`26a~W-D+KdlkNS(@&7hhrtrgvF`nX@<+3UD>y z)bD|~o$;^%5{MVtpii55el9UvJD_0pQ2x)(oKie0>7>2!FLbWJ(tQp`RsKYU*tf{y z>uWFx$)l~1Y!1mo>LL}z8A)8kR&hW%lstoT%QHf1uhA>7-OZ)%B<5-h6D!Suvfv10 zn_~>0_+0OdEU86Ipt`$f7+lg*7Jp^~Y92c+yie4;A%|fCV7IPcJ zCEh*2g%*sLk*ki5j?i=yAAi-zCZ5~_ugS+X!%iq`D0g_V!4+R`4dp+!#|9g0;@~HC zG2Z}%bpzv--=|pdd93kjd2WA$06Yi1r$~HX5$fvx1H-Cj4f6wlD*ylh07*qoM6N<$ Ef<2ddcmMzZ From f6c6b084d7b613c7d0dce4ca1b3b4012adb1eff7 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Tue, 10 Dec 2024 12:42:28 -0800 Subject: [PATCH 05/13] remove accidental debug.html --- .gitignore | 3 ++ .prettierrc.json | 4 +- src/debug.html | 96 ------------------------------------------------ 3 files changed, 4 insertions(+), 99 deletions(-) delete mode 100644 src/debug.html diff --git a/.gitignore b/.gitignore index c3ea58a..bb21bdd 100644 --- a/.gitignore +++ b/.gitignore @@ -24,3 +24,6 @@ $RECYCLE.BIN/ Thumbs.db UserInterfaceState.xcuserstate .env + + +debug.html \ No newline at end of file diff --git a/.prettierrc.json b/.prettierrc.json index 2f5fc2e..e9ffda5 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -9,7 +9,5 @@ "singleQuote": true, "tabWidth": 2, "trailingComma": "all", - "useTabs": false, - "singleAttributePerLine": true, - "bracketSameLine": false + "useTabs": false } \ No newline at end of file diff --git a/src/debug.html b/src/debug.html deleted file mode 100644 index 29f95d6..0000000 --- a/src/debug.html +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - wc-gocam-viz -- styled - - - - - - -
- - -
- - - - - - - \ No newline at end of file From fff90fefc9e1e955418d3eb5e35486cc92c93a42 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Tue, 10 Dec 2024 12:56:48 -0800 Subject: [PATCH 06/13] ran build locally to regenerate the readme files --- src/components/gocam-legend/readme.md | 8 -------- src/components/gocam-viz/readme.md | 4 ++-- 2 files changed, 2 insertions(+), 10 deletions(-) diff --git a/src/components/gocam-legend/readme.md b/src/components/gocam-legend/readme.md index c280422..9bdd73c 100644 --- a/src/components/gocam-legend/readme.md +++ b/src/components/gocam-legend/readme.md @@ -5,14 +5,6 @@ -## Shadow Parts - -| Part | Description | -| ----------- | ----------------------- | -| `"header"` | The header | -| `"section"` | Group of legend entries | - - ## CSS Custom Properties | Name | Description | diff --git a/src/components/gocam-viz/readme.md b/src/components/gocam-viz/readme.md index ba6532b..92544a0 100644 --- a/src/components/gocam-viz/readme.md +++ b/src/components/gocam-viz/readme.md @@ -153,15 +153,15 @@ Type: `Promise` ### Depends on - [go-loading-spinner](../loading-spinner) -- [wc-gocam-legend](../gocam-legend) - [wc-genes-panel](../genes-panel) +- [wc-gocam-legend](../gocam-legend) ### Graph ```mermaid graph TD; wc-gocam-viz --> go-loading-spinner - wc-gocam-viz --> wc-gocam-legend wc-gocam-viz --> wc-genes-panel + wc-gocam-viz --> wc-gocam-legend style wc-gocam-viz fill:#f9f,stroke:#333,stroke-width:4px ``` From 64c525fb58930b2cc62a8b2f84f1233e303cafbd Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Wed, 11 Dec 2024 15:45:50 -0800 Subject: [PATCH 07/13] fixed the styling bugs --- src/components/gocam-legend/gocam-legend.scss | 5 +- src/components/gocam-legend/gocam-legend.tsx | 10 ++- src/components/gocam-legend/readme.md | 9 +++ src/components/gocam-viz/gocam-viz.scss | 20 ++---- src/components/gocam-viz/gocam-viz.tsx | 67 +++++++++---------- src/components/gocam-viz/readme.md | 3 +- 6 files changed, 60 insertions(+), 54 deletions(-) diff --git a/src/components/gocam-legend/gocam-legend.scss b/src/components/gocam-legend/gocam-legend.scss index c9db2fd..bafcb58 100644 --- a/src/components/gocam-legend/gocam-legend.scss +++ b/src/components/gocam-legend/gocam-legend.scss @@ -37,7 +37,6 @@ align-items: center; margin-bottom: 0.2em; gap: 0.25em; - height: 2em; svg { flex-shrink: 0; @@ -49,11 +48,11 @@ margin-left: 0.2em; } -.columns { +.sections { display: flex; gap: 0.25em; - .column { + .section { flex: 1; display: flex; flex-direction: column; diff --git a/src/components/gocam-legend/gocam-legend.tsx b/src/components/gocam-legend/gocam-legend.tsx index 37af683..810dfd8 100644 --- a/src/components/gocam-legend/gocam-legend.tsx +++ b/src/components/gocam-legend/gocam-legend.tsx @@ -3,7 +3,11 @@ import { RELATION_MAP, STYLES } from '../../globals/relations'; import { LEGEND_COLUMNS } from '../../globals/legend'; - +/** + * @part header - The header + * @part sections - Group of legend entries + * @part section - An individual legend entry + */ @Component({ tag: 'wc-gocam-legend', styleUrl: 'gocam-legend.scss', @@ -40,9 +44,9 @@ export class GocamLegend {
Relation Types
-
+
{Object.entries(LEGEND_COLUMNS).map(([columnName, relations]) => ( -
+
{Object.entries(relations).map(([relationId, label]) => { const config = RELATION_MAP[relationId]; return ( diff --git a/src/components/gocam-legend/readme.md b/src/components/gocam-legend/readme.md index 9bdd73c..354490a 100644 --- a/src/components/gocam-legend/readme.md +++ b/src/components/gocam-legend/readme.md @@ -5,6 +5,15 @@ +## Shadow Parts + +| Part | Description | +| ------------ | -------------------------- | +| `"header"` | The header | +| `"section"` | An individual legend entry | +| `"sections"` | Group of legend entries | + + ## CSS Custom Properties | Name | Description | diff --git a/src/components/gocam-viz/gocam-viz.scss b/src/components/gocam-viz/gocam-viz.scss index ebc3cc8..da235d7 100644 --- a/src/components/gocam-viz/gocam-viz.scss +++ b/src/components/gocam-viz/gocam-viz.scss @@ -96,6 +96,8 @@ --legend-border-width: 0; --legend-border-color: var(--border-color); --legend-padding: 0; + --legend-margin: 1rem 0 0 0; + @include standard-var-declarations(legend-header, $border-color: var(--border-color)); @include standard-var-declarations(process, $border-color: var(--border-color)); @@ -116,7 +118,8 @@ --function-nodes-padding: 0; display: flex; - align-items: flex-start; + align-items: stretch; + flex-direction: column; } .gocam-container { @@ -125,19 +128,9 @@ flex-direction: column; } -.gocam-top-section { +.gocam-graph-and-activities-container { display: flex; - flex: 1; - margin-bottom: 1rem; -} - -.gocam-legend-container { - width: 100%; - - wc-gocam-legend { - height: 100%; - width: 100%; - } + align-items: flex-start; } .panel { @@ -197,6 +190,7 @@ button { } wc-gocam-legend { + margin: var(--legend-margin); --border-width: var(--legend-border-width); --border-color: var(--legend-border-color); --padding: var(--legend-padding); diff --git a/src/components/gocam-viz/gocam-viz.tsx b/src/components/gocam-viz/gocam-viz.tsx index c3a333a..a286a8d 100644 --- a/src/components/gocam-viz/gocam-viz.tsx +++ b/src/components/gocam-viz/gocam-viz.tsx @@ -28,7 +28,8 @@ const GOMODEL_PREFIX = "gomodel:" * @part gene-product - A gene product name in process and activities list * @part function-label - A function term name in process and activities list * @part legend-header - The header of the legend - * @part legend-section - A group of entries in the legend + * @part legend-sections - A group of entries in the legend + * @part legend-section - An individual legend entry */ @Component({ tag: 'wc-gocam-viz', @@ -761,46 +762,44 @@ export class GoCamViz { return ( -
-
-
-
-
{this.cam?.title}
-
- - -
-
-
-
this.graphDiv = el}> - {this.loading && - - } -
+
+
+
+
{this.cam?.title}
+
+ +
-
-
- Processes and Activities -
-
- this.genesPanel = el} - > - +
+
this.graphDiv = el}> + {this.loading && + + }
- {this.showLegend && ( -
- +
+
+ Processes and Activities +
+
+ this.genesPanel = el} + > +
- )} +
+ {this.showLegend && ( +
+ +
+ )} ); } diff --git a/src/components/gocam-viz/readme.md b/src/components/gocam-viz/readme.md index 92544a0..7fcca95 100644 --- a/src/components/gocam-viz/readme.md +++ b/src/components/gocam-viz/readme.md @@ -80,7 +80,8 @@ Type: `Promise` | `"gocam-panel"` | The panel containing the GO-CAM graph and legend | | `"gocam-title"` | The GO-CAM title | | `"legend-header"` | The header of the legend | -| `"legend-section"` | A group of entries in the legend | +| `"legend-section"` | An individual legend entry | +| `"legend-sections"` | A group of entries in the legend | | `"process"` | A process group in the process and activities list | From d3be18c732b185b4bdff718825b3aa812c6a5183 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Wed, 11 Dec 2024 15:52:48 -0800 Subject: [PATCH 08/13] Removed the custon-tee styling attempt, since weare now using square instead --- src/components/gocam-viz/gocam-viz.tsx | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/components/gocam-viz/gocam-viz.tsx b/src/components/gocam-viz/gocam-viz.tsx index a286a8d..b88ff76 100644 --- a/src/components/gocam-viz/gocam-viz.tsx +++ b/src/components/gocam-viz/gocam-viz.tsx @@ -478,20 +478,6 @@ export class GoCamViz { { selector: 'edge', style: this.defaultEdgeStyle - }, - { - selector: 'edge', - style: { - ...this.defaultEdgeStyle, - 'arrow-shape': function (edge) { - return { - width: 3, - height: 3, - name: 'custom-tee-circle', - path: 'M 0,0 m -1,-1 l 2,0 l 0,2 l -2,0 z M 2,0 a 1,1 0 1,0 2,0 a 1,1 0 1,0 -2,0' - }; - } - } } ], From 3aebcb04a17e6b83ce44d4877fd38ee43cadd5f8 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Wed, 11 Dec 2024 17:47:58 -0800 Subject: [PATCH 09/13] fixed a bug of small molecule not diplaying, now using rootNode --- src/components/genes-panel/genes-panel.tsx | 10 +++++----- src/globals/@noctua.form/services/graph.service.ts | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/components/genes-panel/genes-panel.tsx b/src/components/genes-panel/genes-panel.tsx index 38d4a89..d1f7dd1 100644 --- a/src/components/genes-panel/genes-panel.tsx +++ b/src/components/genes-panel/genes-panel.tsx @@ -169,7 +169,7 @@ export class GenesPanel { renderActivity(activity: Activity) { const nodes = activity.nodes.filter((node: ActivityNode) => ( - node.type !== ActivityNodeType.GoMolecularFunction) + node.predicate?.edge?.id !== '' && node.predicate?.edge?.id !== noctuaFormConfig.edge.enabledBy.id) ); return ( @@ -177,14 +177,14 @@ export class GenesPanel { - {activity.mfNode && + {activity.rootNode &&
diff --git a/src/globals/@noctua.form/services/graph.service.ts b/src/globals/@noctua.form/services/graph.service.ts index aa67ce4..b8a5201 100644 --- a/src/globals/@noctua.form/services/graph.service.ts +++ b/src/globals/@noctua.form/services/graph.service.ts @@ -102,7 +102,7 @@ export class NoctuaGraphService { } - loadCam(cam: Cam, publish = true) { + loadCam(cam: Cam) { const self = this; const activities = self.graphToActivities(cam.graph); const molecules = self.graphToMolecules(cam.graph); From 5938b8025ec8a801e3457f23838af518a672be3a Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Wed, 11 Dec 2024 19:24:54 -0800 Subject: [PATCH 10/13] removed the dbxref lib and just made it inhouse (just took the same lib function) --- package-lock.json | 73 ++++------------- package.json | 3 +- src/components/gocam-viz/gocam-viz.tsx | 28 ++++--- .../@noctua.form/services/graph.service.ts | 21 +---- src/globals/constants.ts | 2 +- src/globals/dbxref.service.ts | 80 +++++++++++++++++++ 6 files changed, 118 insertions(+), 89 deletions(-) create mode 100644 src/globals/dbxref.service.ts diff --git a/package-lock.json b/package-lock.json index a09a1db..9235ad6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,6 @@ "version": "1.1.0-beta.0", "license": "BSD-3", "dependencies": { - "@geneontology/dbxrefs": "^1.0.16", "@stencil/core": "^4.1.0", "bbop-graph-noctua": "0.0.35", "cytoscape": "^3.16.1", @@ -17,6 +16,7 @@ "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-dagre": "^2.4.0", "graphlib": "^2.1.8", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "moment": "^2.30.1", "uuid": "^8.3.2" @@ -24,18 +24,10 @@ "devDependencies": { "@rollup/plugin-image": "^3.0.3", "@stencil/sass": "^3.0.5", + "@types/js-yaml": "^4.0.9", "rollup-plugin-node-polyfills": "^0.2.1" } }, - "node_modules/@geneontology/dbxrefs": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@geneontology/dbxrefs/-/dbxrefs-1.0.16.tgz", - "integrity": "sha512-zKvbcfs+LU4ZnUo00A5ae0V+FVMIM4ftxcfKtJWmtnLKwWy1sOn2y36HGcz/rEmLwd2zBApKJ0ojmgBH416Q5Q==", - "dependencies": { - "axios": "^0.21.1", - "js-yaml": "^4.0.0" - } - }, "node_modules/@rollup/plugin-image": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-image/-/plugin-image-3.0.3.tgz", @@ -116,19 +108,17 @@ "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, + "node_modules/@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "node_modules/axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "dependencies": { - "follow-redirects": "^1.10.0" - } - }, "node_modules/bbop-core": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/bbop-core/-/bbop-core-0.0.5.tgz", @@ -287,25 +277,6 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "node_modules/follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, "node_modules/graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", @@ -446,15 +417,6 @@ } }, "dependencies": { - "@geneontology/dbxrefs": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/@geneontology/dbxrefs/-/dbxrefs-1.0.16.tgz", - "integrity": "sha512-zKvbcfs+LU4ZnUo00A5ae0V+FVMIM4ftxcfKtJWmtnLKwWy1sOn2y36HGcz/rEmLwd2zBApKJ0ojmgBH416Q5Q==", - "requires": { - "axios": "^0.21.1", - "js-yaml": "^4.0.0" - } - }, "@rollup/plugin-image": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-image/-/plugin-image-3.0.3.tgz", @@ -502,19 +464,17 @@ "integrity": "sha512-2JwWnHK9H+wUZNorf2Zr6ves96WHoWDJIftkcxPKsS7Djta6Zu519LarhRNljPXkpsZR2ZMwNCPeW7omW07BJw==", "dev": true }, + "@types/js-yaml": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, - "axios": { - "version": "0.21.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz", - "integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==", - "requires": { - "follow-redirects": "^1.10.0" - } - }, "bbop-core": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/bbop-core/-/bbop-core-0.0.5.tgz", @@ -645,11 +605,6 @@ "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", "dev": true }, - "follow-redirects": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.1.tgz", - "integrity": "sha512-HWqDgT7ZEkqRzBvc2s64vSZ/hfOceEol3ac/7tKwzuvEyWx3/4UegXh5oBOIotkGsObyk3xznnSRVADBgWSQVg==" - }, "graphlib": { "version": "2.1.8", "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", diff --git a/package.json b/package.json index 54ba0bc..734e56d 100644 --- a/package.json +++ b/package.json @@ -22,7 +22,6 @@ "generate": "stencil generate" }, "dependencies": { - "@geneontology/dbxrefs": "^1.0.16", "@stencil/core": "^4.1.0", "bbop-graph-noctua": "0.0.35", "cytoscape": "^3.16.1", @@ -30,6 +29,7 @@ "cytoscape-cose-bilkent": "^4.1.0", "cytoscape-dagre": "^2.4.0", "graphlib": "^2.1.8", + "js-yaml": "^4.1.0", "lodash": "^4.17.21", "moment": "^2.30.1", "uuid": "^8.3.2" @@ -37,6 +37,7 @@ "devDependencies": { "@rollup/plugin-image": "^3.0.3", "@stencil/sass": "^3.0.5", + "@types/js-yaml": "^4.0.9", "rollup-plugin-node-polyfills": "^0.2.1" }, "repository": { diff --git a/src/components/gocam-viz/gocam-viz.tsx b/src/components/gocam-viz/gocam-viz.tsx index b88ff76..c87c496 100644 --- a/src/components/gocam-viz/gocam-viz.tsx +++ b/src/components/gocam-viz/gocam-viz.tsx @@ -2,7 +2,6 @@ import { Component, Host, Prop, Element, Event, EventEmitter, Watch, h } from '@ import { Listen, Method, State } from '@stencil/core'; import cytoscape from 'cytoscape'; import dagre from 'cytoscape-dagre'; -import * as dbxrefs from "@geneontology/dbxrefs"; import { Activity, ActivityType, Cam, ActivityNodeType, @@ -11,6 +10,7 @@ import { Triple } from '../../globals/@noctua.form'; import { glyph } from '../../globals/relations'; +import { DBXrefService } from '../../globals/dbxref.service'; @@ -71,8 +71,10 @@ export class GoCamViz { */ @State() error: boolean = false; + dbxrefService = new DBXrefService(); configService = new NoctuaFormConfigService(); - graphService = new NoctuaGraphService(this.configService) + + graphService = new NoctuaGraphService(this.configService, this.dbxrefService) // variables for bbop graph currentGraph = undefined; @@ -259,13 +261,6 @@ export class GoCamViz { } } - - relations_enabled_by = ['http://purl.obolibrary.org/obo/RO_0002333', 'RO_0002333', 'RO:0002333']; - relations_collapsible = ["RO:0002333", "BFO:0000066", "RO:0002233", "RO:0002488", "RO:0002234"]; // 2233 : has input ; 2234 : has output - // relations_collapsible = ["RO:0002333", "BFO:0000066", "RO:0002233", "RO:0002488", "RO:0002234"]; // 2233 : has input ; 2234 : has output - relations_nestable = {}; - - initCytoscape() { cytoscape.use(dagre); } @@ -274,8 +269,19 @@ export class GoCamViz { * Init the GO dbxrefs.yaml, in order to build URL meta */ async initDBXrefs() { - await dbxrefs.init(); - this.dbXrefsReady = true; + try { + await this.dbxrefService.init(); + while (!this.dbxrefService.isReady()) { + await new Promise(resolve => setTimeout(resolve, 100)); + } + if (this.dbxrefService.hasError()) { + throw new Error('Failed to initialize dbxrefs'); + } + this.dbXrefsReady = true; + } catch (error) { + console.error('Failed to initialize dbxrefs:', error); + this.dbXrefsReady = false; + } } /** diff --git a/src/globals/@noctua.form/services/graph.service.ts b/src/globals/@noctua.form/services/graph.service.ts index b8a5201..eff10cd 100644 --- a/src/globals/@noctua.form/services/graph.service.ts +++ b/src/globals/@noctua.form/services/graph.service.ts @@ -13,21 +13,17 @@ import { Triple } from './../models/activity/triple'; import { TermsSummary } from './../models/activity/summary'; import moment from 'moment'; import { graph as bbopGraph } from 'bbop-graph-noctua'; -import * as dbxrefs from "@geneontology/dbxrefs"; +import { DBXrefService } from '../../dbxref.service'; export class NoctuaGraphService { - curieUtil: any; - constructor( - public noctuaFormConfigService: NoctuaFormConfigService) { + public noctuaFormConfigService: NoctuaFormConfigService, + private dbXrefService: DBXrefService) { } - getTermURL(id: string) { - const self = this; - if (!id) { return "" } @@ -45,9 +41,8 @@ export class NoctuaGraphService { } else { const dbId = id.split(/:(.+)/, 2); if (dbId.length > 1) { - return dbxrefs.getURL(dbId[0], undefined, dbId[1]); + return this.dbXrefService.getURL(dbId[0], undefined, dbId[1]); } - } } @@ -65,7 +60,6 @@ export class NoctuaGraphService { } - getMetadata(responseData) { const self = this; const cam = new Cam() @@ -98,10 +92,8 @@ export class NoctuaGraphService { }) return cam; - } - loadCam(cam: Cam) { const self = this; const activities = self.graphToActivities(cam.graph); @@ -118,8 +110,6 @@ export class NoctuaGraphService { cam.updateActivityDisplayNumber(); } - - getNodeInfo(node) { const result: any = {}; @@ -134,7 +124,6 @@ export class NoctuaGraphService { return result; } - getNodeRootInfo(node): Entity[] { const result = node.root_types().map((srcType) => { const type = srcType.type() === 'complement' ? srcType.complement_class_expression() : srcType; @@ -222,7 +211,6 @@ export class NoctuaGraphService { return new ActivityNode(result); } - edgeComments(edge): string[] { const commentAnnotations = edge.get_annotations_by_key('comment'); @@ -230,7 +218,6 @@ export class NoctuaGraphService { return commentAnnotations.map(c => { return c.value(); }) - } edgeToEvidence(graph, edge): Evidence[] { diff --git a/src/globals/constants.ts b/src/globals/constants.ts index 8bb7cf3..ee2e44e 100644 --- a/src/globals/constants.ts +++ b/src/globals/constants.ts @@ -1 +1 @@ -export const curieUrl = "https://raw.githubusercontent.com/prefixcommons/biocontext/master/registry/go_context.jsonld"; +export const DB_XREFS_URL = 'https://current.geneontology.org/metadata/db-xrefs.json'; \ No newline at end of file diff --git a/src/globals/dbxref.service.ts b/src/globals/dbxref.service.ts new file mode 100644 index 0000000..2303704 --- /dev/null +++ b/src/globals/dbxref.service.ts @@ -0,0 +1,80 @@ +import { load as yamlLoad } from 'js-yaml'; +import { DB_XREFS_URL } from './constants'; + +interface EntityType { + type_name: string; + url_syntax: string; +} + +interface DBXref { + database: string; + synonyms?: string[]; + entity_types: EntityType[]; +} + +export class DBXrefService { + private url = DB_XREFS_URL; + private dbxrefs: DBXref[] | null = null; + private isInitialized = false; + private hasInitError = false; + + constructor() { + } + + public getURL(database: string, entityType: string | undefined, id: string): string | undefined { + if (!this.dbxrefs) { + throw new Error('Database not initialized. Call init() first'); + } + + let db = this.dbxrefs.filter(elt => + elt.database.toLowerCase() === database.toLowerCase() || + (elt.synonyms && elt.synonyms.includes(database)) + ); + + if (!db || db.length === 0) { + console.warn("@geneontology/dbxrefs: database ", database, " not found for requested id ", id); + return undefined; + } + + let entity; + if (entityType) { + entity = db[0].entity_types.filter(elt => elt.type_name.toLowerCase() === entityType.toLowerCase()); + } else { + entity = [db[0].entity_types[0]]; + } + + if (!entity || entity.length === 0) { + console.warn("@geneontology/dbxrefs: entity ", entityType, " not found in database ", database); + return undefined; + } + + entity = entity[0]; + return entity.url_syntax.replace("[example_id]", id); + } + + public async init(): Promise { + try { + const response = await fetch(this.url); + if (!response.ok) throw new Error(`HTTP error! status: ${response.status}`); + const text = await response.text(); + this.dbxrefs = yamlLoad(text) as DBXref[]; + this.isInitialized = true; + } catch (error) { + this.hasInitError = true; + this.isInitialized = true; + throw error; + } + } + + public isReady(): boolean { + return this.isInitialized; + } + + public hasError(): boolean { + return this.hasInitError; + } + + public getDBXrefs(): DBXref[] | null { + return this.dbxrefs; + } +} \ No newline at end of file From 25eafc88fda64a9ad274246a2a21f09aea470695 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Thu, 12 Dec 2024 10:36:44 -0800 Subject: [PATCH 11/13] fixed the styling and 'part' --- src/components/gocam-legend/gocam-legend.tsx | 6 +++--- src/components/gocam-viz/gocam-viz.scss | 11 +---------- 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/components/gocam-legend/gocam-legend.tsx b/src/components/gocam-legend/gocam-legend.tsx index 810dfd8..091fbcd 100644 --- a/src/components/gocam-legend/gocam-legend.tsx +++ b/src/components/gocam-legend/gocam-legend.tsx @@ -43,10 +43,10 @@ export class GocamLegend { -
Relation Types
-
+
Relation Types
+
{Object.entries(LEGEND_COLUMNS).map(([columnName, relations]) => ( -
+
{Object.entries(relations).map(([relationId, label]) => { const config = RELATION_MAP[relationId]; return ( diff --git a/src/components/gocam-viz/gocam-viz.scss b/src/components/gocam-viz/gocam-viz.scss index da235d7..d87c8c0 100644 --- a/src/components/gocam-viz/gocam-viz.scss +++ b/src/components/gocam-viz/gocam-viz.scss @@ -27,6 +27,7 @@ * * @prop --legend-border-color: Border color of legend container * @prop --legend-border-width: Border width of legend container + * @prop --legend-margin: Margin of legend container * @prop --legend-padding: Padding of legend container * * @prop --legend-header-background: Background of legend header @@ -116,16 +117,6 @@ @include standard-var-declarations(node, $border-color: var(--border-color), $padding: 0 1em 0 0); --function-nodes-padding: 0; - - display: flex; - align-items: stretch; - flex-direction: column; -} - -.gocam-container { - height: 100%; - display: flex; - flex-direction: column; } .gocam-graph-and-activities-container { From 690c102ae80cb3622af982e5c18f719536fc5e69 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Thu, 12 Dec 2024 11:04:28 -0800 Subject: [PATCH 12/13] fixed the traingle, now pointy and the provides input for glyph --- src/components/gocam-legend/gocam-legend.tsx | 17 +++++++++++------ src/components/gocam-viz/readme.md | 1 + 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/components/gocam-legend/gocam-legend.tsx b/src/components/gocam-legend/gocam-legend.tsx index 091fbcd..389d9b2 100644 --- a/src/components/gocam-legend/gocam-legend.tsx +++ b/src/components/gocam-legend/gocam-legend.tsx @@ -28,14 +28,19 @@ export class GocamLegend { markerWidth="12" markerHeight="4" orient="auto"> - - + + : - - {config.glyph === 'triangle' && } - {config.glyph === 'tee' && } + + {config.glyph === 'triangle' && } + {config.glyph === 'tee' && } {config.glyph === 'circle' && } {config.glyph === 'square' && } diff --git a/src/components/gocam-viz/readme.md b/src/components/gocam-viz/readme.md index 7fcca95..1d761e2 100644 --- a/src/components/gocam-viz/readme.md +++ b/src/components/gocam-viz/readme.md @@ -123,6 +123,7 @@ Type: `Promise` | `--legend-header-border-width` | Border width of legend header | | `--legend-header-color` | Text color of legend header | | `--legend-header-padding` | Padding of legend header | +| `--legend-margin` | Margin of legend container | | `--legend-padding` | Padding of legend container | | `--node-background` | Background of related node info in processes and activities panel | | `--node-border-color` | Border color of related node info in processes and activities panel | From d9f277b9ce469cf2d6caff17ca0b913f301e8a70 Mon Sep 17 00:00:00 2001 From: tmushayahama Date: Thu, 12 Dec 2024 12:10:08 -0800 Subject: [PATCH 13/13] reduced the code and used one marker def --- src/components/gocam-legend/gocam-legend.tsx | 44 +++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) diff --git a/src/components/gocam-legend/gocam-legend.tsx b/src/components/gocam-legend/gocam-legend.tsx index 389d9b2..edf15a5 100644 --- a/src/components/gocam-legend/gocam-legend.tsx +++ b/src/components/gocam-legend/gocam-legend.tsx @@ -1,4 +1,4 @@ -import { Component, Host, h } from '@stencil/core'; +import { Component, Fragment, Host, h } from '@stencil/core'; import { RELATION_MAP, STYLES } from '../../globals/relations'; import { LEGEND_COLUMNS } from '../../globals/legend'; @@ -20,30 +20,24 @@ export class GocamLegend { {Object.entries(RELATION_MAP).map(([id, config]) => ( - config.glyph === 'circle-triangle' ? - - - - - : - - {config.glyph === 'triangle' && } - {config.glyph === 'tee' && } - {config.glyph === 'circle' && } - {config.glyph === 'square' && } - + + {config.glyph === 'circle-triangle' && ( + + + + + )} + {config.glyph === 'triangle' && } + {config.glyph === 'tee' && } + {config.glyph === 'circle' && } + {config.glyph === 'square' && } + ))}