소스 검색

为在线表单查询设计器中下拉框组件添加数据集绑定功能

master
jacky6024 7 년 전
부모
커밋
d2916d6530
  1. 2
      ureport2-console/src/main/java/com/bstek/ureport/console/html/HtmlPreviewServletAction.java
  2. 14
      ureport2-console/src/main/resources/ureport-asserts/js/searchform.bundle.js
  3. 4
      ureport2-core/src/main/java/com/bstek/ureport/build/Context.java
  4. 5
      ureport2-core/src/main/java/com/bstek/ureport/definition/ReportDefinition.java
  5. 11
      ureport2-core/src/main/java/com/bstek/ureport/definition/searchform/RenderContext.java
  6. 68
      ureport2-core/src/main/java/com/bstek/ureport/definition/searchform/SelectInputComponent.java
  7. 4
      ureport2-core/src/main/java/com/bstek/ureport/export/ExportManagerImpl.java
  8. 8
      ureport2-core/src/main/java/com/bstek/ureport/parser/impl/searchform/SelectInputParser.java
  9. 1
      ureport2-core/src/main/resources/ureport2.xsd
  10. 3
      ureport2-js/src/form/FormBuilder.js
  11. 16
      ureport2-js/src/form/instance/SelectInstance.js
  12. 87
      ureport2-js/src/form/property/SelectProperty.js

2
ureport2-console/src/main/java/com/bstek/ureport/console/html/HtmlPreviewServletAction.java

@ -307,7 +307,7 @@ public class HtmlPreviewServletAction extends RenderPageServletAction {
htmlReport.setContent(html);
htmlReport.setTotalPage(report.getPages().size());
htmlReport.setStyle(reportDefinition.getStyle());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData(report.getContext().getDatasetMap()));
htmlReport.setReportAlign(report.getPaper().getHtmlReportAlign().name());
htmlReport.setHtmlIntervalRefreshValue(report.getPaper().getHtmlIntervalRefreshValue());
}else{

14
ureport2-console/src/main/resources/ureport-asserts/js/searchform.bundle.js

File diff suppressed because one or more lines are too long

4
ureport2-core/src/main/java/com/bstek/ureport/build/Context.java

@ -230,6 +230,10 @@ public class Context {
throw new DatasetUndefinitionException(name);
}
public Map<String, Dataset> getDatasetMap() {
return datasetMap;
}
public List<Cell> nextUnprocessedCells(){
if(unprocessedCellsMap.size()==0){
return null;

5
ureport2-core/src/main/java/com/bstek/ureport/definition/ReportDefinition.java

@ -24,6 +24,7 @@ import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.codehaus.jackson.annotate.JsonIgnore;
import com.bstek.ureport.build.Dataset;
import com.bstek.ureport.definition.datasource.DatasourceDefinition;
import com.bstek.ureport.definition.searchform.RenderContext;
import com.bstek.ureport.definition.searchform.SearchForm;
@ -215,11 +216,11 @@ public class ReportDefinition implements Serializable{
return sb.toString();
}
public SearchFormData buildSearchFormData(){
public SearchFormData buildSearchFormData(Map<String,Dataset> datasetMap){
if(searchForm==null){
return null;
}
RenderContext context=new RenderContext();
RenderContext context=new RenderContext(datasetMap);
SearchFormData data=new SearchFormData();
data.setFormPosition(searchForm.getFormPosition());
data.setHtml(searchForm.toHtml(context));

11
ureport2-core/src/main/java/com/bstek/ureport/definition/searchform/RenderContext.java

@ -18,15 +18,23 @@ package com.bstek.ureport.definition.searchform;
import java.util.HashMap;
import java.util.Map;
import com.bstek.ureport.build.Dataset;
/**
* @author Jacky.gao
* @since 2017年10月23日
*/
public class RenderContext {
private int id=0;
private Map<String,Dataset> datasetMap;
private Map<Component,String> componentMap=new HashMap<Component,String>();
private Map<String,Object> metadata=new HashMap<String,Object>();
public RenderContext(Map<String,Dataset> datasetMap) {
this.datasetMap=datasetMap;
}
public Dataset getDataset(String datasetName) {
return datasetMap.get(datasetName);
}
public String buildComponentId(Component component){
if(componentMap.containsKey(component)){
return componentMap.get(component);
@ -41,5 +49,4 @@ public class RenderContext {
public void putMetadata(String key,Object value){
metadata.put(key, value);
}
}

68
ureport2-core/src/main/java/com/bstek/ureport/definition/searchform/SelectInputComponent.java

@ -17,25 +17,85 @@ package com.bstek.ureport.definition.searchform;
import java.util.List;
import org.apache.commons.lang3.StringUtils;
import com.bstek.ureport.Utils;
import com.bstek.ureport.build.Dataset;
import com.bstek.ureport.exception.DatasetUndefinitionException;
/**
* @author Jacky.gao
* @since 2017年10月23日
*/
public class SelectInputComponent extends InputComponent {
private boolean useDataset;
private String dataset;
private String labelField;
private String valueField;
private List<Option> options;
@Override
String inputHtml(RenderContext context) {
StringBuilder sb=new StringBuilder();
sb.append("<select style=\"padding:3px;height:28px\" id='"+context.buildComponentId(this)+"' name='"+getBindParameter()+"' class='form-control'>");
for(Option option:options){
sb.append("<option value='"+option.getValue()+"'>"+option.getLabel()+"</option>");
sb.append("<select style=\"padding:3px;height:28px\" id='"+context.buildComponentId(this)+"' name='"+getBindParameter()+"' class='form-control'>");
if(useDataset && StringUtils.isNotBlank(dataset)){
Dataset ds=context.getDataset(dataset);
if(ds==null){
throw new DatasetUndefinitionException(dataset);
}
for(Object obj:ds.getData()){
Object label=Utils.getProperty(obj, labelField);
Object value=Utils.getProperty(obj, valueField);
sb.append("<option value='"+value+"'>"+label+"</option>");
}
}else{
for(Option option:options){
sb.append("<option value='"+option.getValue()+"'>"+option.getLabel()+"</option>");
}
}
sb.append("</select>");
return sb.toString();
}
@Override
public String initJs(RenderContext context) {
return "";
String name=getBindParameter();
StringBuilder sb=new StringBuilder();
sb.append("formElements.push(");
sb.append("function(){");
sb.append("if(''==='"+name+"'){");
sb.append("alert('列表框未绑定查询参数名,不能进行查询操作!');");
sb.append("throw '列表框未绑定查询参数名,不能进行查询操作!'");
sb.append("}");
sb.append("return {");
sb.append("\""+name+"\":");
sb.append("$('#"+context.buildComponentId(this)+"').val()");
sb.append("}");
sb.append("}");
sb.append(");");
return sb.toString();
}
public boolean isUseDataset() {
return useDataset;
}
public String getDataset() {
return dataset;
}
public void setDataset(String dataset) {
this.dataset = dataset;
}
public String getLabelField() {
return labelField;
}
public void setLabelField(String labelField) {
this.labelField = labelField;
}
public String getValueField() {
return valueField;
}
public void setValueField(String valueField) {
this.valueField = valueField;
}
public void setUseDataset(boolean useDataset) {
this.useDataset = useDataset;
}
public void setOptions(List<Option> options) {
this.options = options;

4
ureport2-core/src/main/java/com/bstek/ureport/export/ExportManagerImpl.java

@ -50,7 +50,7 @@ public class ExportManagerImpl implements ExportManager {
String content=htmlProducer.produce(report);
htmlReport.setContent(content);
htmlReport.setStyle(reportDefinition.getStyle());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData(report.getContext().getDatasetMap()));
htmlReport.setReportAlign(report.getPaper().getHtmlReportAlign().name());
htmlReport.setChartDatas(report.getContext().getChartDataMap().values());
htmlReport.setHtmlIntervalRefreshValue(report.getPaper().getHtmlIntervalRefreshValue());
@ -76,7 +76,7 @@ public class ExportManagerImpl implements ExportManager {
HtmlReport htmlReport=new HtmlReport();
htmlReport.setContent(content);
htmlReport.setStyle(reportDefinition.getStyle());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData());
htmlReport.setSearchFormData(reportDefinition.buildSearchFormData(report.getContext().getDatasetMap()));
htmlReport.setPageIndex(pageIndex);
htmlReport.setTotalPage(pageData.getTotalPages());
htmlReport.setReportAlign(report.getPaper().getHtmlReportAlign().name());

8
ureport2-core/src/main/java/com/bstek/ureport/parser/impl/searchform/SelectInputParser.java

@ -18,6 +18,7 @@ package com.bstek.ureport.parser.impl.searchform;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Element;
import com.bstek.ureport.definition.searchform.LabelPosition;
@ -36,6 +37,13 @@ public class SelectInputParser implements FormParser<SelectInputComponent> {
select.setLabel(element.attributeValue("label"));
select.setType(element.attributeValue("type"));
select.setLabelPosition(LabelPosition.valueOf(element.attributeValue("label-position")));
String useDataset=element.attributeValue("use-dataset");
if(StringUtils.isNotBlank(useDataset)){
select.setUseDataset(Boolean.valueOf(useDataset));
select.setDataset(element.attributeValue("dataset"));
select.setLabelField(element.attributeValue("label-field"));
select.setValueField(element.attributeValue("value-field"));
}
List<Option> options=new ArrayList<Option>();
for(Object obj:element.elements()){
if(obj==null || !(obj instanceof Element)){

1
ureport2-core/src/main/resources/ureport2.xsd

@ -123,6 +123,7 @@
<sequence>
<element name="option" type="tns:input-option" maxOccurs="unbounded" minOccurs="1"></element>
</sequence>
<attribute name="useDataset" type="boolean"></attribute>
</extension>
</complexContent>
</complexType>

3
ureport2-js/src/form/FormBuilder.js

@ -57,14 +57,17 @@ export default class FormBuilder{
datasources=[];
}
let params=[];
let datasetMap=new Map();
for(let ds of datasources){
const datasets=ds.datasets || [];
for(let dataset of datasets){
const parameters=dataset.parameters || [];
params=params.concat(parameters);
datasetMap.set(dataset.name,dataset.fields);
}
}
this.reportParameters=params;
this.datasetMap=datasetMap;
const form=reportDef.searchForm || {};
if(form){
this.formPosition=form.formPosition;

16
ureport2-js/src/form/instance/SelectInstance.js

@ -53,6 +53,10 @@ export default class SelectInstance extends Instance{
for(var i=0;i<options.length;i++){
this.addOption(options[i]);
}
this.useDataset=json.useDataset;
this.dataset=json.dataset;
this.labelField=json.labelField;
this.valueField=json.valueField;
}
toJson(){
const json={
@ -61,6 +65,10 @@ export default class SelectInstance extends Instance{
labelPosition:this.labelPosition,
bindParameter:this.bindParameter,
type:SelectInstance.TYPE,
useDataset:this.useDataset,
dataset:this.dataset,
labelField:this.labelField,
valueField:this.valueField,
options:[]
};
for(let option of this.options){
@ -69,8 +77,12 @@ export default class SelectInstance extends Instance{
return json;
}
toXml(){
let xml=`<input-select label="${this.label}" type="${SelectInstance.TYPE}" label-position="${this.labelPosition || 'top'}" bind-parameter="${this.bindParameter || ''}">`;
for(let option of this.options){
let xml=`<input-select label="${this.label}" type="${SelectInstance.TYPE}" label-position="${this.labelPosition || 'top'}" bind-parameter="${this.bindParameter || ''}"`;
if(this.useDataset){
xml+=` use-dataset="${this.useDataset}" dataset="${this.dataset}" label-field="${this.labelField}" value-field="${this.valueField}"`;
}
xml+='>';
for(let option of this.options || []){
xml+=`<option label="${option.label}" value="${option.value}"></option>`;
}
xml+=`</input-select>`;

87
ureport2-js/src/form/property/SelectProperty.js

@ -13,9 +13,90 @@ export default class SelectProperty extends Property{
this.col.append(this.optionFormGroup);
}
refreshValue(editor){
Property.prototype.refreshValue.call(this,editor);
super.refreshValue(editor);
this.optionFormGroup.empty();
this.optionFormGroup.append($("<label>选项(若显示值与实际值不同,则用“,”分隔,如“是,true”等)</label>"));
const group=$(`<div class="form-group"><label>数据来源</label></div>`);
const datasourceSelect=$(`<select class="form-control">
<option value="dataset">数据集</option>
<option value="simple">固定值</option>
</select>`);
group.append(datasourceSelect);
this.optionFormGroup.append(group);
this.simpleOptionGroup=$(`<div class="form-group"></div>`);
this.optionFormGroup.append(this.simpleOptionGroup);
this.datasetGroup=$(`<div class="form-group"></div>`);
this.optionFormGroup.append(this.datasetGroup);
const _this=this;
datasourceSelect.change(function(){
if($(this).val()==='dataset'){
editor.useDataset=true;
_this.datasetGroup.show();
_this.simpleOptionGroup.hide();
}else{
editor.useDataset=false;
_this.datasetGroup.hide();
_this.simpleOptionGroup.show();
}
});
const datasetGroup=$(`<div class="form-group"><label>数据集</label></div>`);
this.datasetGroup.append(datasetGroup);
const datasetSelect=$(`<select class="form-control"></select>`);
datasetGroup.append(datasetSelect);
let dsName=null;
for(let datasetName of formBuilder.datasetMap.keys()){
datasetSelect.append(`<option>${datasetName}</option>`);
dsName=datasetName;
}
if(editor.dataset){
dsName=editor.dataset;
}else{
editor.dataset=dsName;
}
datasetSelect.val(dsName);
let fields=formBuilder.datasetMap.get(dsName);
if(!fields)fields=[];
const labelGroup=$(`<div class="form-group"><label>显示值字段名</label></div>`);
this.datasetGroup.append(labelGroup);
const labelSelect=$(`<select class="form-control"></select>`);
labelGroup.append(labelSelect);
const valueGroup=$(`<div class="form-group"><label>实际值字段名</label></div>`);
this.datasetGroup.append(valueGroup);
const valueSelect=$(`<select class="form-control"></select>`);
labelSelect.change(function(){
editor.labelField=$(this).val();
});
valueSelect.change(function(){
editor.valueField=$(this).val();
});
let targetField=null;
for(let field of fields){
labelSelect.append(`<option>${field.name}</option>`);
valueSelect.append(`<option>${field.name}</option>`);
targetField=field.name;
}
if(editor.labelField){
targetField=editor.labelField;
}else{
editor.labelField=targetField;
}
labelSelect.val(targetField);
if(editor.valueField){
targetField=editor.valueField;
}else{
editor.valueField=targetField;
}
valueSelect.val(targetField);
valueGroup.append(valueSelect);
if(editor.useDataset){
datasourceSelect.val('dataset');
this.datasetGroup.show();
this.simpleOptionGroup.hide();
}else{
this.datasetGroup.hide();
this.simpleOptionGroup.show();
datasourceSelect.val('simple');
}
this.simpleOptionGroup.append($("<label>固定值选项(若显示值与实际值不同,则用“,”分隔,如“是,true”等)</label>"));
var self=this;
$.each(editor.options,function(index,option){
self.addOptionEditor(option);
@ -61,6 +142,6 @@ export default class SelectProperty extends Property{
self.addOptionEditor(newOption);
});
addon.append(add);
this.optionFormGroup.append(inputGroup);
this.simpleOptionGroup.append(inputGroup);
}
}
불러오는 중...
취소
저장