mirror of
				https://github.com/simon987/sist2.git
				synced 2025-11-04 01:36:51 +00:00 
			
		
		
		
	Enable highlight in document info modal, remove /d/ endpoint
This commit is contained in:
		
							parent
							
								
									54df1dfcf7
								
							
						
					
					
						commit
						730e495bde
					
				
							
								
								
									
										2
									
								
								sist2-vue/dist/js/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								sist2-vue/dist/js/index.js
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@ -336,10 +336,6 @@ class Sist2Api {
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getDocInfo(docId: string) {
 | 
			
		||||
        return axios.get(`${this.baseUrl}d/${docId}`);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    getTags() {
 | 
			
		||||
        return this.esQuery({
 | 
			
		||||
            aggs: {
 | 
			
		||||
 | 
			
		||||
@ -1,11 +1,13 @@
 | 
			
		||||
<template>
 | 
			
		||||
  <Preloader v-if="loading"></Preloader>
 | 
			
		||||
  <div v-else-if="content" class="content-div">{{ content }}</div>
 | 
			
		||||
  <div v-else-if="content" class="content-div" v-html="content"></div>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script>
 | 
			
		||||
import Sist2Api from "@/Sist2Api";
 | 
			
		||||
import Preloader from "@/components/Preloader";
 | 
			
		||||
import Sist2Query from "@/Sist2Query";
 | 
			
		||||
import store from "@/store";
 | 
			
		||||
 | 
			
		||||
export default {
 | 
			
		||||
  name: "LazyContentDiv",
 | 
			
		||||
@ -18,10 +20,72 @@ export default {
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  mounted() {
 | 
			
		||||
    Sist2Api.getDocInfo(this.docId).then(src => {
 | 
			
		||||
      this.content = src.data.content;
 | 
			
		||||
    const query = Sist2Query.searchQuery();
 | 
			
		||||
 | 
			
		||||
    if (this.$store.state.optHighlight) {
 | 
			
		||||
 | 
			
		||||
      const fields = this.$store.state.fuzzy
 | 
			
		||||
          ? {"content.nGram": {}}
 | 
			
		||||
          : {content: {}};
 | 
			
		||||
 | 
			
		||||
      query.highlight = {
 | 
			
		||||
        pre_tags: ["<mark>"],
 | 
			
		||||
        post_tags: ["</mark>"],
 | 
			
		||||
        number_of_fragments: 0,
 | 
			
		||||
        fields,
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      if (!store.state.sist2Info.esVersionLegacy) {
 | 
			
		||||
        query.highlight.max_analyzed_offset = 999_999;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if ("function_score" in query.query) {
 | 
			
		||||
      query.query = query.query.function_score.query;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (!("must" in query.query.bool)) {
 | 
			
		||||
      query.query.bool.must = [];
 | 
			
		||||
    } else if (!Array.isArray(query.query.bool.must)) {
 | 
			
		||||
      query.query.bool.must = [query.query.bool.must];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    query.query.bool.must.push({match: {_id: this.docId}});
 | 
			
		||||
 | 
			
		||||
    delete query["sort"];
 | 
			
		||||
    delete query["aggs"];
 | 
			
		||||
    delete query["search_after"];
 | 
			
		||||
    delete query.query["function_score"];
 | 
			
		||||
 | 
			
		||||
    query._source = {
 | 
			
		||||
      includes: ["content", "name", "path", "extension"]
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    query.size = 1;
 | 
			
		||||
 | 
			
		||||
    Sist2Api.esQuery(query).then(resp => {
 | 
			
		||||
      this.loading = false;
 | 
			
		||||
    })
 | 
			
		||||
      if (resp.hits.hits.length === 1) {
 | 
			
		||||
        this.content = this.getContent(resp.hits.hits[0]);
 | 
			
		||||
      } else {
 | 
			
		||||
        console.log("FIXME: could not get content")
 | 
			
		||||
        console.log(resp)
 | 
			
		||||
      }
 | 
			
		||||
    });
 | 
			
		||||
  },
 | 
			
		||||
  methods: {
 | 
			
		||||
    getContent(doc) {
 | 
			
		||||
      if (!doc.highlight) {
 | 
			
		||||
        return doc._source.content;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (doc.highlight["content.nGram"]) {
 | 
			
		||||
        return doc.highlight["content.nGram"][0];
 | 
			
		||||
      }
 | 
			
		||||
      if (doc.highlight.content) {
 | 
			
		||||
        return doc.highlight.content[0];
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
</script>
 | 
			
		||||
 | 
			
		||||
@ -26,7 +26,6 @@ export default new Vuex.Store({
 | 
			
		||||
        sortMode: "score",
 | 
			
		||||
 | 
			
		||||
        fuzzy: false,
 | 
			
		||||
        size: 60,
 | 
			
		||||
 | 
			
		||||
        optLang: "en",
 | 
			
		||||
        optLangIsDefault: true,
 | 
			
		||||
@ -34,6 +33,7 @@ export default new Vuex.Store({
 | 
			
		||||
        optTheme: "light",
 | 
			
		||||
        optDisplay: "grid",
 | 
			
		||||
 | 
			
		||||
        optSize: 60,
 | 
			
		||||
        optHighlight: true,
 | 
			
		||||
        optTagOrOperator: false,
 | 
			
		||||
        optFuzzy: true,
 | 
			
		||||
@ -153,7 +153,7 @@ export default new Vuex.Store({
 | 
			
		||||
        setOptSuggestPath: (state, val) => state.optSuggestPath = val,
 | 
			
		||||
        setOptFragmentSize: (state, val) => state.optFragmentSize = val,
 | 
			
		||||
        setOptQueryMode: (state, val) => state.optQueryMode = val,
 | 
			
		||||
        setOptResultSize: (state, val) => state.size = val,
 | 
			
		||||
        setOptResultSize: (state, val) => state.optSize = val,
 | 
			
		||||
        setOptTagOrOperator: (state, val) => state.optTagOrOperator = val,
 | 
			
		||||
 | 
			
		||||
        setOptTreemapType: (state, val) => state.optTreemapType = val,
 | 
			
		||||
@ -353,7 +353,7 @@ export default new Vuex.Store({
 | 
			
		||||
        searchText: state => state.searchText,
 | 
			
		||||
        pathText: state => state.pathText,
 | 
			
		||||
        fuzzy: state => state.fuzzy,
 | 
			
		||||
        size: state => state.size,
 | 
			
		||||
        size: state => state.optSize,
 | 
			
		||||
        sortMode: state => state.sortMode,
 | 
			
		||||
        lastQueryResult: state => state.lastQueryResults,
 | 
			
		||||
        lastDoc: function (state): EsHit | null {
 | 
			
		||||
@ -391,7 +391,7 @@ export default new Vuex.Store({
 | 
			
		||||
        optTreemapColor: state => state.optTreemapColor,
 | 
			
		||||
        optLightboxLoadOnlyCurrent: state => state.optLightboxLoadOnlyCurrent,
 | 
			
		||||
        optLightboxSlideDuration: state => state.optLightboxSlideDuration,
 | 
			
		||||
        optResultSize: state => state.size,
 | 
			
		||||
        optResultSize: state => state.optSize,
 | 
			
		||||
        optHideLegacy: state => state.optHideLegacy,
 | 
			
		||||
        optUpdateMimeMap: state => state.optUpdateMimeMap,
 | 
			
		||||
        optUseDatePicker: state => state.optUseDatePicker,
 | 
			
		||||
 | 
			
		||||
@ -208,7 +208,7 @@ export default Vue.extend({
 | 
			
		||||
      this.$store.commit("setUiReachedScrollEnd", false);
 | 
			
		||||
    },
 | 
			
		||||
    async handleSearch(resp: EsResult) {
 | 
			
		||||
      if (resp.hits.hits.length == 0) {
 | 
			
		||||
      if (resp.hits.hits.length == 0 || resp.hits.hits.length < this.$store.state.optSize) {
 | 
			
		||||
        this.$store.commit("setUiReachedScrollEnd", true);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
@ -248,6 +248,8 @@ export default Vue.extend({
 | 
			
		||||
      this.$store.commit("setLastQueryResult", resp);
 | 
			
		||||
 | 
			
		||||
      this.docs.push(...resp.hits.hits);
 | 
			
		||||
 | 
			
		||||
      resp.hits.hits.forEach(hit => this.docIds.add(hit._id));
 | 
			
		||||
    },
 | 
			
		||||
    getDateRange(): Promise<{ min: number, max: number }> {
 | 
			
		||||
      return sist2.esQuery({
 | 
			
		||||
 | 
			
		||||
@ -359,42 +359,6 @@ void index_info(struct mg_connection *nc) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void document_info(struct mg_connection *nc, struct mg_http_message *hm) {
 | 
			
		||||
 | 
			
		||||
    if (hm->uri.len != SIST_DOC_ID_LEN + 2) {
 | 
			
		||||
        LOG_DEBUGF("serve.c", "Invalid document_info path: %.*s", (int) hm->uri.len, hm->uri.ptr)
 | 
			
		||||
        HTTP_REPLY_NOT_FOUND
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    char arg_doc_id[SIST_DOC_ID_LEN];
 | 
			
		||||
    memcpy(arg_doc_id, hm->uri.ptr + 3, SIST_DOC_ID_LEN);
 | 
			
		||||
    *(arg_doc_id + SIST_DOC_ID_LEN - 1) = '\0';
 | 
			
		||||
 | 
			
		||||
    cJSON *doc = elastic_get_document(arg_doc_id);
 | 
			
		||||
    cJSON *source = cJSON_GetObjectItem(doc, "_source");
 | 
			
		||||
 | 
			
		||||
    cJSON *index_id = cJSON_GetObjectItem(source, "index");
 | 
			
		||||
    if (index_id == NULL) {
 | 
			
		||||
        cJSON_Delete(doc);
 | 
			
		||||
        HTTP_REPLY_NOT_FOUND
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    index_t *idx = get_index_by_id(index_id->valuestring);
 | 
			
		||||
    if (idx == NULL) {
 | 
			
		||||
        cJSON_Delete(doc);
 | 
			
		||||
        HTTP_REPLY_NOT_FOUND
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    char *json_str = cJSON_PrintUnformatted(source);
 | 
			
		||||
    send_response_line(nc, 200, (int) strlen(json_str), "Content-Type: application/json");
 | 
			
		||||
    mg_send(nc, json_str, (int) strlen(json_str));
 | 
			
		||||
    free(json_str);
 | 
			
		||||
    cJSON_Delete(doc);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void file(struct mg_connection *nc, struct mg_http_message *hm) {
 | 
			
		||||
 | 
			
		||||
    if (hm->uri.len != SIST_DOC_ID_LEN + 2) {
 | 
			
		||||
@ -653,8 +617,6 @@ static void ev_router(struct mg_connection *nc, int ev, void *ev_data, UNUSED(vo
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            tag(nc, hm);
 | 
			
		||||
        } else if (mg_http_match_uri(hm, "/d/*")) {
 | 
			
		||||
            document_info(nc, hm);
 | 
			
		||||
        } else {
 | 
			
		||||
            HTTP_REPLY_NOT_FOUND
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										2
									
								
								src/web/static_generated.c
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								src/web/static_generated.c
									
									
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user