Add DataViewer search bar integration
This commit is contained in:
parent
4f028f9835
commit
29b9023959
@ -3,7 +3,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \
|
|||||||
jsoncall.js myoperator.js scroll.js menu.js popup.js recorder.js \
|
jsoncall.js myoperator.js scroll.js menu.js popup.js recorder.js \
|
||||||
modal.js running.js llmout.js glbviewer.js \
|
modal.js running.js llmout.js glbviewer.js \
|
||||||
markdown_viewer.js audio.js toolbar.js tab.js \
|
markdown_viewer.js audio.js toolbar.js tab.js \
|
||||||
input.js registerfunction.js button.js accordion.js dataviewer.js \
|
input.js registerfunction.js button.js accordion.js searchbar.js dataviewer.js \
|
||||||
tree.js multiple_state_image.js dynamiccolumn.js form.js message.js conform.js \
|
tree.js multiple_state_image.js dynamiccolumn.js form.js message.js conform.js \
|
||||||
paging.js datagrid.js iframe.js cols.js echartsext.js \
|
paging.js datagrid.js iframe.js cols.js echartsext.js \
|
||||||
floaticonbar.js miniform.js wterm.js dynamicaccordion.js \
|
floaticonbar.js miniform.js wterm.js dynamicaccordion.js \
|
||||||
@ -11,7 +11,7 @@ SOURCES=" page_data_loader.js factory.js uitypesdef.js utils.js uitype.js \
|
|||||||
llm.js websocket.js datarow.js tabular.js continueaudio.js \
|
llm.js websocket.js datarow.js tabular.js continueaudio.js \
|
||||||
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
line.js pie.js bar.js gobang.js period.js iconbarpage.js \
|
||||||
keypress.js asr.js webspeech.js countdown.js progressbar.js \
|
keypress.js asr.js webspeech.js countdown.js progressbar.js \
|
||||||
qaframe.js svg.js videoplayer.js sctter.js radar.js kline.js \
|
qaframe.js svg.js videoplayer.js scatter.js radar.js kline.js \
|
||||||
heatmap.js map.js qr.js textfiles.js agent.js "
|
heatmap.js map.js qr.js textfiles.js agent.js "
|
||||||
echo ${SOURCES}
|
echo ${SOURCES}
|
||||||
cat ${SOURCES} > ../dist/bricks.js
|
cat ${SOURCES} > ../dist/bricks.js
|
||||||
|
|||||||
@ -17,6 +17,7 @@ bricks.DataViewer = class extends bricks.VBox {
|
|||||||
this.active_item = null;
|
this.active_item = null;
|
||||||
this.loading = false;
|
this.loading = false;
|
||||||
this.data_offset = 0;
|
this.data_offset = 0;
|
||||||
|
this.search_keyword = this.get_initial_search_keyword();
|
||||||
this.keyselectable = true;
|
this.keyselectable = true;
|
||||||
this.bind('row_check_changed', this.show_check_event_data.bind(this));
|
this.bind('row_check_changed', this.show_check_event_data.bind(this));
|
||||||
schedule_once(this.build_all.bind(this), 0.1);
|
schedule_once(this.build_all.bind(this), 0.1);
|
||||||
@ -30,6 +31,7 @@ bricks.DataViewer = class extends bricks.VBox {
|
|||||||
this.build_title_widget();
|
this.build_title_widget();
|
||||||
this.build_description_widget();
|
this.build_description_widget();
|
||||||
this.build_toolbar_widget();
|
this.build_toolbar_widget();
|
||||||
|
this.build_searchbar_widget();
|
||||||
this.build_records_area();
|
this.build_records_area();
|
||||||
await this.build_other();
|
await this.build_other();
|
||||||
this.check_changed_row = null;
|
this.check_changed_row = null;
|
||||||
@ -42,7 +44,7 @@ bricks.DataViewer = class extends bricks.VBox {
|
|||||||
async build_other(){
|
async build_other(){
|
||||||
}
|
}
|
||||||
async render(params) {
|
async render(params) {
|
||||||
params = params || {};
|
params = this.merge_search_params(params || {});
|
||||||
if (params == this.old_params){
|
if (params == this.old_params){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -76,6 +78,59 @@ bricks.DataViewer = class extends bricks.VBox {
|
|||||||
this.scrollpanel = new bricks.VScrollPanel({});
|
this.scrollpanel = new bricks.VScrollPanel({});
|
||||||
this.filler_widget.add_widget(this.scrollpanel);
|
this.filler_widget.add_widget(this.scrollpanel);
|
||||||
}
|
}
|
||||||
|
get_initial_search_keyword(){
|
||||||
|
if (!this.searchable){
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
if (this.search_value != null){
|
||||||
|
return this.search_value;
|
||||||
|
}
|
||||||
|
if (typeof this.searchable == 'object' && this.searchable.value != null){
|
||||||
|
return this.searchable.value;
|
||||||
|
}
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
build_searchbar_widget(){
|
||||||
|
if (!this.searchable){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var opts = {};
|
||||||
|
if (typeof this.searchable == 'object'){
|
||||||
|
opts = bricks.extend(opts, this.searchable);
|
||||||
|
}
|
||||||
|
opts.width = opts.width || this.search_width || '100%';
|
||||||
|
opts.placeholder = opts.placeholder || this.search_placeholder;
|
||||||
|
opts.value = opts.value || this.search_value || this.search_keyword || '';
|
||||||
|
opts.search_label = opts.search_label || this.search_label;
|
||||||
|
opts.clear_label = opts.clear_label || this.clear_label;
|
||||||
|
this.searchbar_w = new bricks.SearchBar(opts);
|
||||||
|
this.searchbar_w.bind('search', this.search_event_handle.bind(this));
|
||||||
|
this.add_widget(this.searchbar_w);
|
||||||
|
}
|
||||||
|
merge_search_params(params){
|
||||||
|
var merged = bricks.extend({}, params || {});
|
||||||
|
if (this.searchable){
|
||||||
|
var search_param = this.search_param || 'keyword';
|
||||||
|
if (this.search_keyword){
|
||||||
|
merged[search_param] = this.search_keyword;
|
||||||
|
} else {
|
||||||
|
delete merged[search_param];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return merged;
|
||||||
|
}
|
||||||
|
async search_event_handle(event){
|
||||||
|
var d = event.params || {};
|
||||||
|
this.search_keyword = d.keyword || '';
|
||||||
|
this.old_params = null;
|
||||||
|
this.select_row = null;
|
||||||
|
this.active_item = null;
|
||||||
|
this.data_offset = 0;
|
||||||
|
if (this.loader){
|
||||||
|
this.loader.pages = [];
|
||||||
|
}
|
||||||
|
await this.render({});
|
||||||
|
}
|
||||||
async renderPageData(data, page){
|
async renderPageData(data, page){
|
||||||
var pos;
|
var pos;
|
||||||
if (! this.loader.is_max_page(page)){
|
if (! this.loader.is_max_page(page)){
|
||||||
|
|||||||
110
bricks/searchbar.js
Normal file
110
bricks/searchbar.js
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
var bricks = window.bricks || {};
|
||||||
|
|
||||||
|
bricks.SearchBar = class extends bricks.HBox {
|
||||||
|
/*
|
||||||
|
options:
|
||||||
|
{
|
||||||
|
placeholder: input placeholder text,
|
||||||
|
value: initial keyword,
|
||||||
|
width: component width,
|
||||||
|
search_label: search button label,
|
||||||
|
clear_label: clear button label,
|
||||||
|
input_width: input width, default 100%
|
||||||
|
}
|
||||||
|
events:
|
||||||
|
search: {keyword: string}
|
||||||
|
*/
|
||||||
|
constructor(opts){
|
||||||
|
opts = opts || {};
|
||||||
|
if (!opts.width){
|
||||||
|
opts.width = '100%';
|
||||||
|
}
|
||||||
|
if (!opts.height){
|
||||||
|
opts.height = 'auto';
|
||||||
|
}
|
||||||
|
super(opts);
|
||||||
|
this.keyword = opts.value || '';
|
||||||
|
this.set_style('alignItems', 'center');
|
||||||
|
this.set_style('gap', opts.gap || '0.5rem');
|
||||||
|
this.build_input();
|
||||||
|
this.build_search_button();
|
||||||
|
this.build_clear_button();
|
||||||
|
}
|
||||||
|
build_input(){
|
||||||
|
var input_opts = {
|
||||||
|
name:this.opts.name || 'keyword',
|
||||||
|
value:this.keyword,
|
||||||
|
placeholder:this.opts.placeholder || '',
|
||||||
|
width:this.opts.input_width || '100%',
|
||||||
|
css:this.opts.input_css || 'input',
|
||||||
|
flexShrink:1
|
||||||
|
};
|
||||||
|
this.input_w = new bricks.UiStr(input_opts);
|
||||||
|
this.input_w.set_style('minWidth', this.opts.input_min_width || '0');
|
||||||
|
this.input_w.set_style('height', this.opts.input_height || 'auto');
|
||||||
|
this.input_w.set_style('padding', this.opts.input_padding || '0.5rem');
|
||||||
|
this.input_w.set_style('boxSizing', 'border-box');
|
||||||
|
this.input_w.bind('changed', this.input_changed.bind(this));
|
||||||
|
this.input_w.bind('blur', this.input_changed.bind(this));
|
||||||
|
this.input_w.dom_element.addEventListener('keydown', this.keydown_handle.bind(this));
|
||||||
|
this.add_widget(this.input_w);
|
||||||
|
}
|
||||||
|
build_search_button(){
|
||||||
|
this.search_button = new bricks.Button({
|
||||||
|
label:this.opts.search_label || 'Search',
|
||||||
|
orientation:'horizontal',
|
||||||
|
width:'auto',
|
||||||
|
height:'auto',
|
||||||
|
flexShrink:0
|
||||||
|
});
|
||||||
|
this.search_button.bind('click', this.do_search.bind(this));
|
||||||
|
this.add_widget(this.search_button);
|
||||||
|
}
|
||||||
|
build_clear_button(){
|
||||||
|
this.clear_button = new bricks.Button({
|
||||||
|
label:this.opts.clear_label || 'Clear',
|
||||||
|
orientation:'horizontal',
|
||||||
|
width:'auto',
|
||||||
|
height:'auto',
|
||||||
|
flexShrink:0
|
||||||
|
});
|
||||||
|
this.clear_button.bind('click', this.clear_search.bind(this));
|
||||||
|
this.add_widget(this.clear_button);
|
||||||
|
}
|
||||||
|
input_changed(event){
|
||||||
|
var d = event.params || {};
|
||||||
|
this.keyword = d[this.input_w.name] || '';
|
||||||
|
}
|
||||||
|
keydown_handle(event){
|
||||||
|
if (event.key == 'Enter'){
|
||||||
|
this.do_search(event);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
get_keyword(){
|
||||||
|
this.keyword = this.input_w.resultValue() || '';
|
||||||
|
return this.keyword;
|
||||||
|
}
|
||||||
|
set_keyword(keyword){
|
||||||
|
this.keyword = keyword || '';
|
||||||
|
this.input_w.setValue(this.keyword);
|
||||||
|
}
|
||||||
|
focus(){
|
||||||
|
this.input_w.focus();
|
||||||
|
}
|
||||||
|
do_search(event){
|
||||||
|
var keyword = this.get_keyword();
|
||||||
|
this.dispatch('search', {keyword:keyword});
|
||||||
|
if (event && event.stopPropagation){
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
clear_search(event){
|
||||||
|
this.set_keyword('');
|
||||||
|
this.dispatch('search', {keyword:''});
|
||||||
|
if (event && event.stopPropagation){
|
||||||
|
event.stopPropagation();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bricks.Factory.register('SearchBar', bricks.SearchBar);
|
||||||
Loading…
x
Reference in New Issue
Block a user