add field sort
This commit is contained in:
parent
75b4584e4f
commit
baf78677c5
|
@ -20,6 +20,8 @@ type docReqBody struct {
|
||||||
Filter string `json:"filter"`
|
Filter string `json:"filter"`
|
||||||
Cluster string `json:"cluster"`
|
Cluster string `json:"cluster"`
|
||||||
Keyword string `json:"keyword"`
|
Keyword string `json:"keyword"`
|
||||||
|
Sort string `json:"sort"`
|
||||||
|
SortDirection string `json:"sort_direction"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
|
func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http.Request, ps httprouter.Params) {
|
||||||
|
@ -94,6 +96,7 @@ func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http.
|
||||||
var (
|
var (
|
||||||
pageSize = 10
|
pageSize = 10
|
||||||
pageIndex = 1
|
pageIndex = 1
|
||||||
|
sort = ""
|
||||||
)
|
)
|
||||||
if reqBody.PageSize > 0 {
|
if reqBody.PageSize > 0 {
|
||||||
pageSize = reqBody.PageSize
|
pageSize = reqBody.PageSize
|
||||||
|
@ -109,7 +112,14 @@ func (handler APIHandler) HandleDocumentAction(w http.ResponseWriter, req *http.
|
||||||
if reqBody.Filter != "" {
|
if reqBody.Filter != "" {
|
||||||
filter = reqBody.Filter
|
filter = reqBody.Filter
|
||||||
}
|
}
|
||||||
query := fmt.Sprintf(`{"from":%d, "size": %d, "query": %s}`, from, pageSize, filter)
|
if sortField := strings.Trim(reqBody.Sort, " "); sortField != "" {
|
||||||
|
sortDirection := reqBody.SortDirection
|
||||||
|
if sortDirection != "desc" {
|
||||||
|
sortDirection = "asc"
|
||||||
|
}
|
||||||
|
sort = fmt.Sprintf(`"%s":{"order":"%s"}`, sortField, sortDirection)
|
||||||
|
}
|
||||||
|
query := fmt.Sprintf(`{"from":%d, "size": %d, "query": %s, "sort": [{%s}]}`, from, pageSize, filter, sort)
|
||||||
fmt.Println(indexName, query)
|
fmt.Println(indexName, query)
|
||||||
var reqBytes = []byte(query)
|
var reqBytes = []byte(query)
|
||||||
resp, err := client.SearchWithRawQueryDSL(indexName, reqBytes)
|
resp, err := client.SearchWithRawQueryDSL(indexName, reqBytes)
|
||||||
|
|
|
@ -60,6 +60,15 @@ export default {
|
||||||
'form.publicUsers.option.A': 'Colleague A',
|
'form.publicUsers.option.A': 'Colleague A',
|
||||||
'form.publicUsers.option.B': 'Colleague B',
|
'form.publicUsers.option.B': 'Colleague B',
|
||||||
'form.publicUsers.option.C': 'Colleague C',
|
'form.publicUsers.option.C': 'Colleague C',
|
||||||
|
'form.button.search': 'Search',
|
||||||
|
'form.button.new': 'New',
|
||||||
|
'form.button.edit': 'Edit',
|
||||||
|
'form.button.delete': 'Delete',
|
||||||
|
'form.button.cancel': 'Cancel',
|
||||||
|
'form.button.collapse': 'Collapse',
|
||||||
|
'form.button.advanced': 'Advanced',
|
||||||
|
'table.field.operation': 'Operation',
|
||||||
|
|
||||||
'component.globalHeader.search': 'Search',
|
'component.globalHeader.search': 'Search',
|
||||||
'component.globalHeader.search.example1': 'Search example 1',
|
'component.globalHeader.search.example1': 'Search example 1',
|
||||||
'component.globalHeader.search.example2': 'Search example 2',
|
'component.globalHeader.search.example2': 'Search example 2',
|
||||||
|
@ -89,6 +98,7 @@ export default {
|
||||||
'menu.data.snapshot': 'SNAPSHOT',
|
'menu.data.snapshot': 'SNAPSHOT',
|
||||||
'menu.data.rebuild': 'REBUILD',
|
'menu.data.rebuild': 'REBUILD',
|
||||||
'menu.data.export': 'IMPORT&EXPORT',
|
'menu.data.export': 'IMPORT&EXPORT',
|
||||||
|
'menu.data.query': 'DOCUMENT',
|
||||||
|
|
||||||
'menu.search': 'SEARCH',
|
'menu.search': 'SEARCH',
|
||||||
'menu.search.template': 'TEMPLATE',
|
'menu.search.template': 'TEMPLATE',
|
||||||
|
|
|
@ -66,6 +66,15 @@ export default {
|
||||||
'form.logstash.jdbcconf.placeholder':"请输入JDBC配置",
|
'form.logstash.jdbcconf.placeholder':"请输入JDBC配置",
|
||||||
'form.logstash.kafkaconf.label':"Logstash Kafka 配置",
|
'form.logstash.kafkaconf.label':"Logstash Kafka 配置",
|
||||||
'form.logstash.kafkaconf.placeholder':"请输入Kafka配置",
|
'form.logstash.kafkaconf.placeholder':"请输入Kafka配置",
|
||||||
|
'form.button.search': '搜索',
|
||||||
|
'form.button.new': '新建',
|
||||||
|
'form.button.edit': '编辑',
|
||||||
|
'form.button.delete': '删除',
|
||||||
|
'form.button.cancel': '取消',
|
||||||
|
'form.button.collapse': '收起',
|
||||||
|
'form.button.advanced': '高级',
|
||||||
|
'table.field.operation': '操作',
|
||||||
|
|
||||||
'component.globalHeader.search': '站内搜索',
|
'component.globalHeader.search': '站内搜索',
|
||||||
'component.globalHeader.search.example1': '搜索提示一',
|
'component.globalHeader.search.example1': '搜索提示一',
|
||||||
'component.globalHeader.search.example2': '搜索提示二',
|
'component.globalHeader.search.example2': '搜索提示二',
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import React, { Component, createRef } from 'react';
|
import React from 'react';
|
||||||
|
import { formatMessage, FormattedMessage } from 'umi/locale';
|
||||||
import router from 'umi/router';
|
import router from 'umi/router';
|
||||||
import { connect } from 'dva';
|
import { connect } from 'dva';
|
||||||
import { Col, Form, Row,Select, Input, Card,Icon, Table, InputNumber, Popconfirm,
|
import { Col, Form, Row,Select, Input, Card,Icon, Table, InputNumber, Popconfirm,
|
||||||
|
@ -120,7 +121,7 @@ class EditableCell extends React.Component {
|
||||||
let initialValue = '';
|
let initialValue = '';
|
||||||
if(editing){
|
if(editing){
|
||||||
if(type=='date'){
|
if(type=='date'){
|
||||||
initialValue = moment(record[dataIndex]);
|
initialValue = record[dataIndex] && moment(record[dataIndex]);
|
||||||
}else{
|
}else{
|
||||||
initialValue = record[dataIndex];
|
initialValue = record[dataIndex];
|
||||||
}
|
}
|
||||||
|
@ -169,21 +170,21 @@ class EditableCell extends React.Component {
|
||||||
onClick={() => this.save(form, record.id)}
|
onClick={() => this.save(form, record.id)}
|
||||||
style={{ marginRight: 8 }}
|
style={{ marginRight: 8 }}
|
||||||
>
|
>
|
||||||
Save
|
{formatMessage({id:'form.save'})}
|
||||||
</a>
|
</a>
|
||||||
)}
|
)}
|
||||||
</EditableContext.Consumer>
|
</EditableContext.Consumer>
|
||||||
<Popconfirm title="Sure to cancel?" onConfirm={() => this.cancel(record.id)}>
|
<Popconfirm title="Sure to cancel?" onConfirm={() => this.cancel(record.id)}>
|
||||||
<a>Cancel</a>
|
<a>{formatMessage({id:'form.button.cancel'})}</a>
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
</span>
|
</span>
|
||||||
) : (<div>
|
) : (<div>
|
||||||
<a disabled={editingKey !== ''} onClick={() => this.edit(record)}>
|
<a disabled={editingKey !== ''} onClick={() => this.edit(record)}>
|
||||||
Edit
|
{formatMessage({id:'form.button.edit'})}
|
||||||
</a>
|
</a>
|
||||||
<Divider type="vertical"/>
|
<Divider type="vertical"/>
|
||||||
<Popconfirm title="Sure to delete?" onConfirm={() => this.delete(record)}>
|
<Popconfirm title="Sure to delete?" onConfirm={() => this.delete(record)}>
|
||||||
<a>Delete</a>
|
<a>{formatMessage({id:'form.button.delete'})}</a>
|
||||||
</Popconfirm>
|
</Popconfirm>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
@ -268,34 +269,42 @@ class EditableCell extends React.Component {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
handlePageChange = (pageIndex)=>{
|
|
||||||
|
handleTableChange = (pagination, filters, sorter) =>{
|
||||||
|
//console.log(pagination, filters, sorter);
|
||||||
|
|
||||||
const {fetchData, doclist} = this.props;
|
const {fetchData, doclist} = this.props;
|
||||||
fetchData({
|
fetchData({
|
||||||
pageIndex: pageIndex,
|
pageIndex: pagination.current,
|
||||||
pageSize: doclist.pageSize,
|
pageSize: pagination.pageSize,
|
||||||
index: doclist.index,
|
index: doclist.index,
|
||||||
cluster: doclist.cluster,
|
cluster: doclist.cluster,
|
||||||
filter: doclist.filter,
|
filter: doclist.filter,
|
||||||
|
sort: (sorter.order && sorter.field) || '',
|
||||||
|
sort_direction: sorter.order == 'ascend' ? 'asc' : 'desc'
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
onShowSizeChange = (current, pageSize)=> {
|
isSortable = (type) => {
|
||||||
const {fetchData, doclist} = this.props;
|
return ['keyword', 'date', 'long', 'integer', 'short', 'byte', 'double', 'float', 'scaled_float'].includes(type)
|
||||||
fetchData({
|
|
||||||
pageIndex: current,
|
|
||||||
pageSize: pageSize,
|
|
||||||
index: doclist.index,
|
|
||||||
cluster: doclist.cluster,
|
|
||||||
filter: doclist.filter,
|
|
||||||
})
|
|
||||||
//console.log(current, pageSize);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
let {doclist} = this.props;
|
let {doclist} = this.props;
|
||||||
let columns = [];
|
let columns = [];
|
||||||
if(doclist.data && doclist.data.length > 0 ){
|
let keys = [];
|
||||||
for(let key in doclist.data[0]){
|
let sortObj = {};
|
||||||
|
if(doclist.mappings){
|
||||||
|
for(let mkey in doclist.mappings){
|
||||||
|
Object.keys(doclist.mappings[mkey].mappings.properties).forEach(key=>{
|
||||||
|
if(!keys.includes(key)){
|
||||||
|
keys.push(key);
|
||||||
|
sortObj[key] = this.isSortable(doclist.mappings[mkey].mappings.properties[key].type);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for(let key of keys){
|
||||||
if(["_index"].includes(key)){
|
if(["_index"].includes(key)){
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -303,6 +312,7 @@ class EditableCell extends React.Component {
|
||||||
title: key,
|
title: key,
|
||||||
dataIndex: key,
|
dataIndex: key,
|
||||||
ellipsis: true,
|
ellipsis: true,
|
||||||
|
sorter: sortObj[key],
|
||||||
render: (text)=>(<Tooltip placement="top" title={text}>{text}</Tooltip>),
|
render: (text)=>(<Tooltip placement="top" title={text}>{text}</Tooltip>),
|
||||||
onCell: record => ({
|
onCell: record => ({
|
||||||
record,
|
record,
|
||||||
|
@ -319,7 +329,7 @@ class EditableCell extends React.Component {
|
||||||
}
|
}
|
||||||
columns.push(col)
|
columns.push(col)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
columns.push(this.operField);
|
columns.push(this.operField);
|
||||||
//console.log(columns);
|
//console.log(columns);
|
||||||
|
|
||||||
|
@ -334,19 +344,17 @@ class EditableCell extends React.Component {
|
||||||
components={components}
|
components={components}
|
||||||
bordered
|
bordered
|
||||||
rowKey="id"
|
rowKey="id"
|
||||||
|
onChange={this.handleTableChange}
|
||||||
size="small"
|
size="small"
|
||||||
loading={doclist.isLoading}
|
loading={doclist.isLoading}
|
||||||
dataSource={doclist.data}
|
dataSource={doclist.data}
|
||||||
columns={columns}
|
columns={columns}
|
||||||
rowClassName="editable-row"
|
rowClassName="editable-row"
|
||||||
pagination={{
|
pagination={{
|
||||||
onChange: this.cancel,
|
|
||||||
showSizeChanger: true,
|
showSizeChanger: true,
|
||||||
onShowSizeChange: this.onShowSizeChange,
|
|
||||||
total: doclist.total? doclist.total.value: 0,
|
total: doclist.total? doclist.total.value: 0,
|
||||||
pageSize: doclist.pageSize,
|
pageSize: doclist.pageSize,
|
||||||
current: doclist.pageIndex,
|
current: doclist.pageIndex,
|
||||||
onChange: this.handlePageChange,
|
|
||||||
showTotal: (total, range) => `Total ${total} items`,
|
showTotal: (total, range) => `Total ${total} items`,
|
||||||
size: 'small',
|
size: 'small',
|
||||||
}}
|
}}
|
||||||
|
@ -470,11 +478,16 @@ class Doucment extends React.Component {
|
||||||
_index = vals[0];
|
_index = vals[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let keys = Object.keys(mappings[_index].mappings.properties)
|
let properties = mappings[_index].mappings.properties;
|
||||||
|
let keys = Object.keys(properties)
|
||||||
let newDoc = {id:"", _index};
|
let newDoc = {id:"", _index};
|
||||||
for(let key of keys){
|
for(let key of keys){
|
||||||
|
if(properties[key].type == 'date'){
|
||||||
|
newDoc[key] = null
|
||||||
|
}else{
|
||||||
newDoc[key] = ""
|
newDoc[key] = ""
|
||||||
}
|
}
|
||||||
|
}
|
||||||
dispatch({
|
dispatch({
|
||||||
type: 'document/_addNew',
|
type: 'document/_addNew',
|
||||||
payload: {
|
payload: {
|
||||||
|
@ -528,7 +541,7 @@ class Doucment extends React.Component {
|
||||||
return (<Select.Option key={item} label={item}>{item}</Select.Option>)
|
return (<Select.Option key={item} label={item}>{item}</Select.Option>)
|
||||||
})}
|
})}
|
||||||
</Select>) : ''}
|
</Select>) : ''}
|
||||||
<Button type="primary" icon="plus" onClick={this.handleNewClick}>新建</Button>
|
<Button type="primary" icon="plus" onClick={this.handleNewClick}>{formatMessage({ id: 'form.button.new' })}</Button>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -566,7 +579,7 @@ class Doucment extends React.Component {
|
||||||
placeholder="input search keyword"
|
placeholder="input search keyword"
|
||||||
disabled = {this.state.bodyDisplay != 'none'}
|
disabled = {this.state.bodyDisplay != 'none'}
|
||||||
/>
|
/>
|
||||||
<Button type="primary" onClick={this.handleSearchClick}>execute</Button>
|
<Button type="primary" onClick={this.handleSearchClick}>{formatMessage({ id: 'form.button.search' })}</Button>
|
||||||
</Input.Group>
|
</Input.Group>
|
||||||
</Col>
|
</Col>
|
||||||
<Col span={4}>
|
<Col span={4}>
|
||||||
|
@ -582,7 +595,7 @@ class Doucment extends React.Component {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}}>{this.state.bodyDisplay == 'none' ? '高级':'收起'}<Icon type="down" /></a>
|
}}>{this.state.bodyDisplay == 'none' ? formatMessage({id:'form.button.advanced'}): formatMessage({id:'form.button.collapse'})}<Icon type="down" /></a>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
<Row style={{display: this.state.bodyDisplay}} gutter={[16, { xs: 8, sm: 16, md: 24, lg: 32 }]}>
|
<Row style={{display: this.state.bodyDisplay}} gutter={[16, { xs: 8, sm: 16, md: 24, lg: 32 }]}>
|
||||||
|
@ -606,6 +619,7 @@ class Doucment extends React.Component {
|
||||||
<Col span={8}>
|
<Col span={8}>
|
||||||
<div style={{fontSize: 12, paddingLeft: 20}}>
|
<div style={{fontSize: 12, paddingLeft: 20}}>
|
||||||
<div style={{fontSize: 16, paddingBottom: 10, color: '#1890FF'}}>query example:</div>
|
<div style={{fontSize: 16, paddingBottom: 10, color: '#1890FF'}}>query example:</div>
|
||||||
|
<div style={{background:'rgb(245, 247, 250)', padding: 10}}>
|
||||||
<code dangerouslySetInnerHTML={{ __html: `{<br/> "bool":{<br/>
|
<code dangerouslySetInnerHTML={{ __html: `{<br/> "bool":{<br/>
|
||||||
"must": {<br/>
|
"must": {<br/>
|
||||||
"match":{ <br/>
|
"match":{ <br/>
|
||||||
|
@ -613,9 +627,9 @@ class Doucment extends React.Component {
|
||||||
}<br/>
|
}<br/>
|
||||||
}<br/>
|
}<br/>
|
||||||
}<br/>}` }}>
|
}<br/>}` }}>
|
||||||
|
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
</Card>
|
</Card>
|
||||||
|
|
|
@ -46,6 +46,12 @@ export default {
|
||||||
let res = yield call(getDocList, payload);
|
let res = yield call(getDocList, payload);
|
||||||
if(res.errno != "0"){
|
if(res.errno != "0"){
|
||||||
message.warn("加载数据失败")
|
message.warn("加载数据失败")
|
||||||
|
yield put({
|
||||||
|
type: 'saveData',
|
||||||
|
payload:{
|
||||||
|
isLoading: false,
|
||||||
|
}
|
||||||
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
let indices = Object.keys(res.payload.mappings); //indices state can remove
|
let indices = Object.keys(res.payload.mappings); //indices state can remove
|
||||||
|
|
|
@ -94,10 +94,10 @@ class Pro extends React.Component {
|
||||||
form.validateFields((err, fieldsValue) => {
|
form.validateFields((err, fieldsValue) => {
|
||||||
if (err) return;
|
if (err) return;
|
||||||
me.fetchData({
|
me.fetchData({
|
||||||
form: 0,
|
from: 0,
|
||||||
size: me.props.dict.search.size,
|
size: me.props.dict.search.size,
|
||||||
name: fieldsValue.name,
|
name: fieldsValue.name,
|
||||||
tags: fieldsValue.tags.join(',')
|
tags: fieldsValue.tags && fieldsValue.tags.join(',')
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue