mirror of
				https://gitlab.ub.uni-bielefeld.de/sfb1288inf/nopaque.git
				synced 2025-11-04 12:22:47 +00:00 
			
		
		
		
	Query Builder New Design
This commit is contained in:
		@@ -2,29 +2,27 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
 | 
			
		||||
    constructor() {
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
      this.positionalAttrList = {
 | 
			
		||||
        "emptyToken": {prettyText: "empty token", cqlOpening: "[", tokenValue:"", cqlClosing: "]"},
 | 
			
		||||
        "word": {prettyText: "word", cqlOpening: "[word=", tokenValue: "", cqlClosing: "]"},
 | 
			
		||||
        "lemma": {prettyText: "lemma", cqlOpening: "[lemma=", tokenValue:"", cqlClosing: "]"},
 | 
			
		||||
        "pos": {prettyText: "pos", cqlOpening: "[pos=", tokenValue:"",  cqlClosing: "]"},
 | 
			
		||||
        "simplePos": {prettyText: "simple_pos", cqlOpening: "[simple_pos=", tokenValue:"", cqlClosing: "]"}
 | 
			
		||||
      }  
 | 
			
		||||
 | 
			
		||||
      this.elements = {
 | 
			
		||||
        
 | 
			
		||||
        counter: 0,
 | 
			
		||||
        yourQueryContent: [],
 | 
			
		||||
        queryContent:[],
 | 
			
		||||
        closeQueryBuilder: document.querySelector("#close-query-builder"),
 | 
			
		||||
 | 
			
		||||
        //#region QueryBuilder Elements
 | 
			
		||||
        concordanceQueryBuilder: document.querySelector("#concordance-query-builder"),
 | 
			
		||||
        concordanceQueryBuilderButton: document.querySelector("#concordance-query-builder-button"),
 | 
			
		||||
        positionalAttrButton: document.querySelector('#positional-attr-button'),
 | 
			
		||||
        positionalAttrArea: document.querySelector('#positional-attr'),
 | 
			
		||||
        positionalAttr: document.querySelector("#token-attr"),
 | 
			
		||||
        structuralAttr: document.querySelector("#structural-attr"),
 | 
			
		||||
        structuralAttrButton: document.querySelector('#structural-attr-button'),
 | 
			
		||||
        structuralAttrArea: document.querySelector("#structural-attr"),
 | 
			
		||||
        queryContainer: document.querySelector('#query-container'),
 | 
			
		||||
        buttonPreparer: document.querySelector("#button-preparer"),
 | 
			
		||||
        yourQuery: document.querySelector("#your-query"),
 | 
			
		||||
        insertQueryButton: document.querySelector("#insert-query-button"),
 | 
			
		||||
        queryPreview: document.querySelector('#query-preview'),
 | 
			
		||||
        tokenQuery: document.querySelector("#token-query"),
 | 
			
		||||
        tokenBuilderContent: document.querySelector("#token-builder-content"),
 | 
			
		||||
        buildTokenButton: document.querySelector("#build-token-button"),
 | 
			
		||||
@@ -113,9 +111,14 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
        //#endregion Token Attributes
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      this.elements.closeQueryBuilder.addEventListener("click", () => {this.closeQueryBuilderModal();});
 | 
			
		||||
 | 
			
		||||
      this.elements.concordanceQueryBuilderButton.addEventListener("click", () => {this.clearAll();});
 | 
			
		||||
      this.elements.insertQueryButton.addEventListener("click", () => {this.insertQuery();});
 | 
			
		||||
 | 
			
		||||
      this.elements.positionalAttrButton.addEventListener("click", () => {this.showPositionalAttrArea();});
 | 
			
		||||
      this.elements.structuralAttrButton.addEventListener("click", () => {this.showStructuralAttrArea();});
 | 
			
		||||
 | 
			
		||||
      //#region Structural Attribute Event Listeners
 | 
			
		||||
      this.elements.sentence.addEventListener("click", () => {this.addSentence();});
 | 
			
		||||
      this.elements.entity.addEventListener("click", () => {this.addEntity();});
 | 
			
		||||
@@ -492,8 +495,21 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    tokenButtonfactory(dataType, prettyText, tokenText) {
 | 
			
		||||
        let chipColor = 'style="background-color:#';
 | 
			
		||||
        if (dataType === 'pos' || dataType === 'word' || dataType === 'lemma' || dataType === 'simplePos'){
 | 
			
		||||
            chipColor += 'EF60B4';
 | 
			
		||||
        }else if (dataType === "emptyToken"){
 | 
			
		||||
            chipColor += '43C6FC';
 | 
			
		||||
        }else if (dataType === "and" || dataType === "or"){
 | 
			
		||||
            chipColor += 'FFCC00';
 | 
			
		||||
        }else if (dataType === "incidenceModifier" || dataType === "betweenNM" || dataType === "exactlyN"){
 | 
			
		||||
            chipColor += '2FBBAB';
 | 
			
		||||
        }else {
 | 
			
		||||
            chipColor = '';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        tokenText = encodeURI(tokenText);
 | 
			
		||||
        this.elements.buttonPreparer.innerHTML += '<a class="btn-small waves-effect waves-light" style="margin-left:3px" data-type="' + dataType + '" data-tokentext="' + tokenText + '">' + prettyText + '</a>';
 | 
			
		||||
        this.elements.buttonPreparer.innerHTML += '<div class="chip"' + chipColor +'" data-type="' + dataType + '" data-tokentext="' + tokenText + '">' + prettyText + '<i class="material-icons close">close</i></div>';
 | 
			
		||||
        let tokenDummyButton = this.elements.buttonPreparer.querySelector(':first-child');
 | 
			
		||||
        tokenDummyButton.addEventListener("click", () => {this.deleteTokenAttr(tokenDummyButton);});
 | 
			
		||||
        this.elements.tokenQuery.appendChild(tokenDummyButton);
 | 
			
		||||
@@ -538,7 +554,7 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
        let emptyTokenCheck = false;
 | 
			
		||||
 | 
			
		||||
        for (let element of this.elements.tokenQuery.childNodes) {
 | 
			
		||||
            tokenQueryContent += ' ' + element.text + ' ';
 | 
			
		||||
            tokenQueryContent += ' ' + element.firstChild.data + ' ';
 | 
			
		||||
            tokenQueryText += ' ' + decodeURI(element.dataset.tokentext);
 | 
			
		||||
            if (element.dataset.type === "emptyToken"){
 | 
			
		||||
                emptyTokenCheck = true;
 | 
			
		||||
@@ -547,7 +563,7 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
 | 
			
		||||
        if (emptyTokenCheck === false){
 | 
			
		||||
            tokenQueryText = '[' + tokenQueryText + ']';
 | 
			
		||||
        }        
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.buttonfactory('token', tokenQueryContent, tokenQueryText);
 | 
			
		||||
        tokenQueryContent = '';
 | 
			
		||||
@@ -564,12 +580,66 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
 | 
			
		||||
    //#region General Functions
 | 
			
		||||
 | 
			
		||||
    closeQueryBuilderModal(){
 | 
			
		||||
        let instance = M.Modal.getInstance(this.elements.concordanceQueryBuilder);
 | 
			
		||||
        instance.close();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    showPositionalAttrArea(){
 | 
			
		||||
        this.elements.positionalAttrArea.classList.remove('hide');
 | 
			
		||||
        this.elements.structuralAttrArea.classList.add('hide');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    showStructuralAttrArea(){
 | 
			
		||||
        this.elements.positionalAttrArea.classList.add('hide');
 | 
			
		||||
        this.elements.structuralAttrArea.classList.remove('hide');
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    buttonfactory(dataType, prettyText, queryText) {
 | 
			
		||||
        let chipColor = 'style="background-color:#';
 | 
			
		||||
        if (dataType === 'start-sentence' || dataType === 'end-sentence'){
 | 
			
		||||
            chipColor += 'FD9720';
 | 
			
		||||
        }else if (dataType === "start-empty-entity" || dataType === "start-entity" || dataType === "end-entity"){
 | 
			
		||||
            chipColor += 'A6E22D';
 | 
			
		||||
        }else if (dataType === "text-annotation"){
 | 
			
		||||
            chipColor += '2FBBAB';
 | 
			
		||||
        }else if (dataType === "token"){
 | 
			
		||||
            chipColor += '28B3D1';
 | 
			
		||||
        }else {
 | 
			
		||||
            chipColor = '';
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        queryText = encodeURI(queryText);
 | 
			
		||||
        this.elements.buttonPreparer.innerHTML += '<a class="btn-small waves-effect waves-light" style="margin-left:3px" data-type="' + dataType + '" data-query="' + queryText + '">' + prettyText + '</a>';
 | 
			
		||||
        this.elements.buttonPreparer.innerHTML += '<div class="chip"' + chipColor +'" data-type="' +  dataType + '" data-query="' + queryText + '">' + prettyText + '<i class="material-icons close">close</i></div>';
 | 
			
		||||
        let dummyButton = this.elements.buttonPreparer.querySelector(':first-child');
 | 
			
		||||
        dummyButton.addEventListener("click", () => {this.deleteAttr(dummyButton);});
 | 
			
		||||
        this.elements.yourQuery.appendChild(dummyButton);
 | 
			
		||||
        this.elements.queryContainer.classList.remove("hide");
 | 
			
		||||
 | 
			
		||||
        this.queryPreviewBuilder();
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    queryPreviewBuilder(){
 | 
			
		||||
        
 | 
			
		||||
        this.elements.yourQueryContent = [];
 | 
			
		||||
        
 | 
			
		||||
        for (let element of this.elements.yourQuery.childNodes) {
 | 
			
		||||
            
 | 
			
		||||
            let queryElement = decodeURI(element.dataset.query);
 | 
			
		||||
            if (queryElement.includes("<")){
 | 
			
		||||
                queryElement = queryElement.replace("<", "<");
 | 
			
		||||
            }
 | 
			
		||||
            if (queryElement.includes(">")){
 | 
			
		||||
                queryElement = queryElement.replace(">", ">");
 | 
			
		||||
            }
 | 
			
		||||
            this.elements.yourQueryContent.push(queryElement);
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        let queryString = this.elements.yourQueryContent.join(' ');
 | 
			
		||||
        queryString += ";";
 | 
			
		||||
        this.elements.queryPreview.innerHTML = queryString;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    deleteAttr(attr) {
 | 
			
		||||
@@ -639,8 +709,10 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
        this.elements.counter -= 1;
 | 
			
		||||
        if(this.elements.counter === 0){
 | 
			
		||||
            this.elements.insertQueryButton.classList.add("disabled");
 | 
			
		||||
            
 | 
			
		||||
            this.elements.queryContainer.classList.add("hide");
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        this.queryPreviewBuilder();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    insertQuery() {
 | 
			
		||||
@@ -666,9 +738,12 @@ class ConcordanceQueryBuilder {
 | 
			
		||||
        this.elements.buildTokenButton.classList.add("disabled");
 | 
			
		||||
        this.elements.insertQueryButton.classList.add("disabled");
 | 
			
		||||
        this.elements.concordanceQueryBuilder.classList.remove('modal-close');
 | 
			
		||||
        this.elements.positionalAttrArea.classList.add('hide');
 | 
			
		||||
        this.elements.structuralAttrArea.classList.add('hide');
 | 
			
		||||
        this.hideEverything(); 
 | 
			
		||||
        this.buttonDisabler('start');
 | 
			
		||||
        this.elements.yourQuery.innerHTML = '';
 | 
			
		||||
        this.elements.queryContainer.classList.add("hide");
 | 
			
		||||
    }
 | 
			
		||||
    //#endregion General Functions
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user