UNPKG

sparnatural

Version:

Visual client-side SPARQL query builder and knowledge graph exploration tool

124 lines (113 loc) 4 kB
import tippy from "tippy.js"; import ObjectPropertyTypeId from "./ObjectPropertyTypeId"; import ISparnaturalSpecification from "../../../../../spec-providers/ISparnaturalSpecification"; import CriteriaGroup from "../CriteriaGroup"; import HTMLComponent from "../../../../HtmlComponent"; import { SelectedVal } from "../../../..//SelectedVal"; import { TOOLTIP_CONFIG } from "../../../../../settings/defaultSettings"; /** * The property selection part of a criteria/line, encapsulating an ObjectPropertyTypeId **/ class ObjectPropertyGroup extends HTMLComponent { inputSelector: ObjectPropertyTypeId; // value which shows which object property got chosen by the config for subject and object objectPropVal: SelectedVal = { variable: null, type: null, }; ParentCriteriaGroup: CriteriaGroup; specProvider: ISparnaturalSpecification; startClassVal: SelectedVal; endClassVal: SelectedVal; temporaryLabel: string; constructor( ParentComponent: CriteriaGroup, specProvider: ISparnaturalSpecification, temporaryLabel: string ) { super("ObjectPropertyGroup", ParentComponent, null); this.ParentCriteriaGroup = ParentComponent; this.temporaryLabel = temporaryLabel; this.specProvider = specProvider; } render() { super.render(); this.#addEventListener(); return this; } /* renders the temporarly object property */ onStartClassGroupSelected(startClassVal: SelectedVal) { this.startClassVal = startClassVal; //this will set the temporary label since there hasn't been a Value chosen for EndClassGroup this.inputSelector = new ObjectPropertyTypeId( this, this.specProvider, this.temporaryLabel, this.startClassVal ).render(); } #addEventListener() { // event is caught here and then bubbles up to the CriteriaGroup this.html[0].addEventListener( "onObjectPropertyTypeIdSelected", (e: CustomEvent) => { e.stopImmediatePropagation(); if (e.detail === "" || !e.detail) throw Error('No value received on "onObjectPropertyGroupSelected"'); this.#createSparqlVar(e.detail); this.#valueWasSelected(); } ); } #createSparqlVar(type: string) { this.objectPropVal.type = type; this.html[0].dispatchEvent( new CustomEvent("getSparqlVarId", { bubbles: true, detail: (id: number) => { //callback this.objectPropVal.variable = `?${this.#getUriClassName(type)}_${id}` }}) ); } #valueWasSelected() { this.html[0].dispatchEvent( new CustomEvent("onObjectPropertyGroupSelected", { bubbles: true, detail: this.objectPropVal, }) ); var desc = this.specProvider.getProperty(this.objectPropVal.type).getTooltip(); if(desc) { $(this.ParentCriteriaGroup.ObjectPropertyGroup.html).find('.ObjectPropertyTypeId').attr('data-tippy-content', desc ) ; var tippySettings = Object.assign({}, TOOLTIP_CONFIG); tippySettings.placement = "top-start"; tippy('.ObjectPropertyGroup .ObjectPropertyTypeId[data-tippy-content]', tippySettings); } else { $(this.ParentCriteriaGroup.ObjectPropertyGroup.html).removeAttr('data-tippy-content') ; } } // get the classname of the uri #getUriClassName(uri:string){ if(uri.includes('#')) return uri.split('#').pop().replace(/[^\x00-\x7F]/g, "_").replace(/-/g, "_") return uri.split('/').pop().replace(/[^\x00-\x7F]/g, "_").replace(/-/g, "_") } getTypeSelected() { return this.objectPropVal.type; } getVarName() { return this.objectPropVal.variable; } /* This method is triggered when an Object is selected. For example: Museum isRelatedTo Country. As soon as Country is chosen this method gets called */ onEndClassGroupSelected(endClassVal: SelectedVal) { // this will update the temporarly label this.inputSelector.setEndClassVal(endClassVal); this.inputSelector.render(); } } export default ObjectPropertyGroup;