diff --git a/api/index_management/document.go b/api/index_management/document.go index 75754c77..7d4f2c97 100644 --- a/api/index_management/document.go +++ b/api/index_management/document.go @@ -17,6 +17,7 @@ type docReqBody struct { PageSize int `json:"pageSize"` Filter string `json:"filter"` Cluster string `json:"cluster"` + Keyword string `json:"keyword"` } func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) { @@ -93,10 +94,14 @@ func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http. } from := (pageIndex - 1) * pageSize filter := `{"match_all": {}}` + if reqBody.Keyword != "" { + filter = fmt.Sprintf(`{"query_string":{"query":"%s"}}`, reqBody.Keyword) + } if reqBody.Filter != "" { filter = reqBody.Filter } query := fmt.Sprintf(`{"from":%d, "size": %d, "query": %s}`, from, pageSize, filter) + fmt.Println(query) var reqBytes = []byte(query) resp, err := client.SearchWithRawQueryDSL(indexName, reqBytes) if err != nil { diff --git a/web/package.json b/web/package.json index b35eed9c..6332987c 100644 --- a/web/package.json +++ b/web/package.json @@ -8,6 +8,7 @@ "@antv/data-set": "^0.9.6", "@antv/g2-brush": "^0.0.2", "@babel/runtime": "^7.1.2", + "@monaco-editor/react": "^3.7.4", "@svgdotjs/svg.js": "^3.0.16", "antd": "^3.26.18", "antd-table-infinity": "^1.1.6", diff --git a/web/src/pages/DataManagement/Document.js b/web/src/pages/DataManagement/Document.js index c4d20be4..4a1b2828 100644 --- a/web/src/pages/DataManagement/Document.js +++ b/web/src/pages/DataManagement/Document.js @@ -1,7 +1,84 @@ -import React, { Component } from 'react'; +import React, { Component, createRef } from 'react'; +import router from 'umi/router'; import { connect } from 'dva'; import { Col, Form, Row,Select, Input, Card,Icon, Table, InputNumber, Popconfirm, - Divider,Button,Tooltip, Cascader } from 'antd'; + Divider,Button,Tooltip, Cascader, Modal } from 'antd'; +import Editor, {monaco} from '@monaco-editor/react'; + +import {createDependencyProposals} from './autocomplete'; + +function findParentIdentifier(textUntilPosition){ + let chars = textUntilPosition; + let length = chars.length; + let stack = []; + let targetIdx = -1; + for(let i = length-1; i>-1; i--){ + if(chars[i] == '}'){ + stack.push('}'); + }else if(chars[i] == '{'){ + if(stack.length == 0){ + targetIdx = i; + break; + } + stack.pop(); + } + } + let foundColon = false; + for(let i = targetIdx; i > -1; i--){ + if(chars[i] == ":"){ + targetIdx = i; + foundColon = true; + break; + } + } + if(!foundColon){ + return "" + } + let identifer = []; + let startFound = false; + for(let i = targetIdx; i > -1; i--){ + if((chars[i]>='a' && chars[i] <= 'z') || chars[i] == '_'){ + identifer.push(chars[i]); + startFound = true; + }else if(startFound){ + break; + } + } + return identifer.reverse().join(''); +} + +monaco.init().then((mi)=>{ + mi.languages.registerCompletionItemProvider('json', { + provideCompletionItems: function(model, position) { + // find out if we are completing a property in the 'dependencies' object. + var textUntilPosition = model.getValueInRange({startLineNumber: 1, startColumn: 1, endLineNumber: position.lineNumber, endColumn: position.column}); + + if(textUntilPosition.indexOf('{') < 0){ + return { suggestions: [] }; + } + + let key = findParentIdentifier(textUntilPosition); + //console.log(key); + // var match = textUntilPosition.match(/"match"\s*:\s*\{\s*("[^"]*"\s*:\s*"[^"]*"\s*,\s*)*([^"]*)?$/); + // if (!match) { + // return { suggestions: [] }; + // } + var word = model.getWordUntilPosition(position); + + var range = { + startLineNumber: position.lineNumber, + endLineNumber: position.lineNumber, + startColumn: word.startColumn, + endColumn: word.endColumn + }; + return { + suggestions: createDependencyProposals(key, range, mi) + }; + } + }); + +}) + const {Option} = Select; const EditableContext = React.createContext(); @@ -130,7 +207,7 @@ class EditableCell extends React.Component { dispatch({ type: 'document/addDocItem', payload: { - index: doclist.index, + index: doclist._index, data: row, } }) @@ -244,22 +321,37 @@ class EditableCell extends React.Component { @Form.create() class Doucment extends React.Component { state={ - bodyDisplay: 'none', + bodyDisplay: 'none', } - + // constructor(props){ + // super(props); + // this.filterGetter = createRef(); + // } + fetchData = (params) => { const {dispatch} = this.props; - dispatch({ + return dispatch({ type: 'document/fetchDocList', payload: params, }) } + + handleEditorDidMount = (_valueGetter) =>{ + this.filterGetter = _valueGetter; + } componentDidMount(){ + const {location } = this.props; + //console.log(match, location); + let index = location.query.index || 'infini-test'; + let cluster = location.query.cluster || 'single-es'; + this.indexEl.setState({ + value: [cluster, index] + }) this.fetchData({ pageSize: 10, pageIndex: 1, - index: 'infini-test', + index, }) } @@ -268,6 +360,21 @@ class Doucment extends React.Component { if(!document.data || document.data.length == 0 || document.isAddNew){ return; } + let {indices} = document; + let _index = indices[0]; + if(indices && indices.length > 1){ + console.log(this.indexSelEl); + let vals = this.indexSelEl.rcSelect.state.value; + if(vals.length == 0){ + Modal.error({ + title: '系统提示', + content: '请选择新建文档目标索引', + }); + return + }else{ + _index = vals[0]; + } + } let keys = Object.keys(document.data[0]) let newDoc = {}; for(let key of keys){ @@ -278,36 +385,45 @@ class Doucment extends React.Component { payload: { docItem: newDoc, extra: { - isAddNew: true + isAddNew: true, + _index } }, }) } handleSearchClick = (value)=>{ - const [cluster, index] = this.indexEl.state.value; - let targetIndex = index; - if(value != ""){ - targetIndex = value; + let [cluster, index] = this.indexEl.state.value; + let rewriteIndex = this.reindexEl.state.value; + if(typeof rewriteIndex !== 'undefined' && rewriteIndex !=""){ + index = rewriteIndex; } - console.log(targetIndex); + this.fetchData({ cluster, - index: targetIndex, + index: index, pageSize: 10, pageIndex: 1, - filter: this.filterEl.state.value, + //filter: this.filterEl.state.value, + filter: this.filterGetter(), + keyword: value, + }).then(()=>{ + if(this.hashChanged){ + router.push(`/data/doc?index=${index}`); + this.hashChanged = !this.hashChanged; + } }) + } - + renderNew = ()=>{ const {indices} = this.props.document; - if((indices && indices.length > 1)){ - return; - } + // if((indices && indices.length > 1)){ + // return; + // } return (