完善Excel数据集表单功能

This commit is contained in:
wodezy66 2020-08-29 16:27:50 +08:00
parent 3f8f2e550e
commit 300855cba2
8 changed files with 312 additions and 176 deletions

View File

@ -8,7 +8,6 @@
package org.datagear.analysis.support;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -17,7 +16,6 @@ import java.util.Map;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
@ -66,8 +64,8 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
protected static final RangeExpResolver RANGE_EXP_RESOLVER = RangeExpResolver
.valueOf(RangeExpResolver.RANGE_SPLITTER_CHAR, RangeExpResolver.RANGE_GROUP_SPLITTER_CHAR);
/** 此数据集所处的sheet索引号0计数) */
private int sheetIndex = 0;
/** 此数据集所处的sheet索引号1计数) */
private int sheetIndex = 1;
/** 作为名称行的行号 */
private int nameRow = -1;
@ -106,10 +104,9 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
}
/**
* 设置此数据集所处的sheet索引
* 设置此数据集所处的sheet
*
* @param sheetIndex
* 索引号{@code 0}计数
* @param sheetIndex sheet号{@code 1}计数
*/
public void setSheetIndex(int sheetIndex)
{
@ -286,13 +283,17 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
poifs = new POIFSFileSystem(file, true);
wb = new HSSFWorkbook(poifs.getRoot(), true);
Sheet sheet = wb.getSheetAt(getSheetIndex());
Sheet sheet = wb.getSheetAt(getSheetIndex() - 1);
return resolveResultForSheet(paramValues, sheet, properties);
}
catch (IOException e)
catch(DataSetException e)
{
throw new DataSetSourceParseException(e);
throw e;
}
catch(Throwable t)
{
throw new DataSetSourceParseException(t);
}
finally
{
@ -322,13 +323,17 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
pkg = OPCPackage.open(file, PackageAccess.READ);
wb = new XSSFWorkbook(pkg);
Sheet sheet = wb.getSheetAt(getSheetIndex());
Sheet sheet = wb.getSheetAt(getSheetIndex() - 1);
return resolveResultForSheet(paramValues, sheet, properties);
}
catch (IOException | InvalidFormatException e)
catch(DataSetException e)
{
throw new DataSetSourceParseException(e);
throw e;
}
catch(Throwable t)
{
throw new DataSetSourceParseException(t);
}
finally
{

View File

@ -101,6 +101,7 @@ duration.MS={0}\u6BEB\u79D2
#validation
validation.required=\u6B64\u9879\u5FC5\u586B
validation.integer=\u6B64\u9879\u4EC5\u53EF\u586B\u5199\u6574\u6570\u503C
validation.min=\u6B64\u9879\u5E94\u5927\u4E8E\u6216\u7B49\u4E8E{0}
validation.email=\u90AE\u7BB1\u683C\u5F0F\u6709\u8BEF
#error
@ -612,11 +613,17 @@ dataSet.json=JSON\u6587\u672C
dataSet.jsonFile=JSON\u6587\u4EF6
dataSet.jsonFileEncoding=JSON\u6587\u4EF6\u7F16\u7801
dataSet.excelFile=Excel\u6587\u4EF6
dataSet.excel.sheetIndex=\u6570\u636ESheet\u7D22\u5F15
dataSet.excel.nameRow=\u540D\u79F0\u884C\u53F7
dataSet.excel.sheetIndex=\u6570\u636ESheet\u53F7
dataSet.excel.sheetIndex.desc=\u6570\u636E\u6240\u5728\u7684Sheet\u53F7\uFF0C\u7B2C\u4E00\u4E2A\u4E3A1\uFF0C\u4F9D\u6B21\u7C7B\u63A8
dataSet.excel.nameRow=\u6807\u9898\u884C\u53F7
dataSet.excel.nameRow.desc=\u6807\u9898\u884C\u7684\u884C\u53F7\uFF0C\u5C06\u88AB\u89E3\u6790\u4E3A\u6570\u636E\u96C6\u5C5E\u6027\u800C\u975E\u6570\u636E
dataSet.excel.nameRow.none=\u65E0
dataSet.excel.nameRow.assign=\u6307\u5B9A
dataSet.excel.dataRowExp=\u6570\u636E\u884C\u8303\u56F4
dataSet.excel.dataRowExp.desc=\u6570\u636E\u884C\u8303\u56F4\uFF08\u9664\u540D\u79F0\u884C\u5916\uFF09\uFF0C\u4F8B\u5982\uFF1A"2, 3-5, 8-"\u8868\u793A\u7B2C2\u884C\u30013\u81F35\u884C\u3001\u5927\u4E8E\u7B49\u4E8E8\u884C\uFF0C\u4E0D\u586B\u8868\u793A\u4E0D\u9650
dataSet.excel.dataColumnExp=\u6570\u636E\u5217\u8303\u56F4
dataSet.excel.forceXls=\u5F3A\u5236\u4E3Axls\u6587\u4EF6
dataSet.excel.dataColumnExp.desc=\u6570\u636E\u5217\u8303\u56F4\uFF0C\u4F8B\u5982\uFF1A"A, B-D, E-"\u8868\u793A\u7B2CA\u5217\u3001B\u81F3D\u5217\u3001\u5927\u4E8E\u7B49\u4E8EE\u5217\uFF0C\u4E0D\u586B\u8868\u793A\u4E0D\u9650
dataSet.excel.forceXls=\u5F3A\u5236\u4E3Axls\u683C\u5F0F
dataSet.createUser=\u521B\u5EFA\u7528\u6237
dataSet.createTime=\u521B\u5EFA\u65F6\u95F4
dataSet.param=\u53C2\u6570
@ -630,6 +637,8 @@ dataSet.DataCategory.DIMENSION=\u7EF4\u5EA6
dataSet.DataCategory.SCALAR=\u91CF\u5EA6
dataSet.validation.previewRequired=\u8BF7\u5148\u6267\u884C\u9884\u89C8\u786E\u4FDD\u6570\u636E\u6B63\u786E
dataSet.validation.propertiesRequired=\u8BF7\u5B9A\u4E49\u6570\u636E\u96C6\u5C5E\u6027
dataSet.validation.excel.dataRowExp.regex=\u683C\u5F0F\u9519\u8BEF\uFF0C\u793A\u4F8B\uFF1A"2, 3-5, 8-"
dataSet.validation.excel.dataColumnExp.regex=\u683C\u5F0F\u9519\u8BEF\uFF0C\u793A\u4F8B\uFF1A"A, B-D, E-"
dataSet.auth.resouceTypeLabel=\u6570\u636E\u96C6
dataSet.DataSetParam.name=\u540D\u79F0
dataSet.DataSetParam.type=\u7C7B\u578B

View File

@ -2235,6 +2235,9 @@ table.dataTable tbody tr td select{
.page-form-dataSet .form-foot-placeholder{
height: 2.5em;
}
.page-form-dataSet-jsonFile .encoding-selectmenu-menu .ui-menu{
height: 10em;
}
.page-form-chart .chart-plugin{
display: inline-block;

View File

@ -30,7 +30,6 @@ readonly 是否只读操作允许为null
<input type="hidden" id="${pageId}-originalFileName" value="${(dataSet.fileName)!''?html}" />
<input type="hidden" name="fileName" value="${(dataSet.fileName)!''?html}" />
<input type="text" name="displayName" value="${(dataSet.displayName)!''?html}" class="file-display-name ui-widget ui-widget-content" readonly="readonly" />
<input type="hidden" id="${pageId}-workspaceEditor" value="${(dataSet.fileName)!''?html}" />
<#if !readonly>
<div class="fileinput-wrapper">
<div class="ui-widget ui-corner-all ui-button fileinput-button"><@spring.message code='upload' /><input type="file"></div>
@ -41,23 +40,41 @@ readonly 是否只读操作允许为null
</div>
<div class="form-item">
<div class="form-item-label">
<label><@spring.message code='dataSet.excel.sheetIndex' /></label>
<label title="<@spring.message code='dataSet.excel.sheetIndex.desc' />">
<@spring.message code='dataSet.excel.sheetIndex' />
</label>
</div>
<div class="form-item-value">
<input type="text" name="sheetIndex" value="${(dataSet.sheetIndex)!''?html}" class="ui-widget ui-widget-content" />
<input type="text" name="sheetIndex" value="${(dataSet.sheetIndex)!''?html}" class="ui-widget ui-widget-content" style="width:41%;" />
</div>
</div>
<div class="form-item">
<div class="form-item-label">
<label><@spring.message code='dataSet.excel.nameRow' /></label>
<label title="<@spring.message code='dataSet.excel.nameRow.desc' />">
<@spring.message code='dataSet.excel.nameRow' />
</label>
</div>
<div class="form-item-value">
<input type="text" name="nameRow" value="${(dataSet.nameRow)!''?html}" class="ui-widget ui-widget-content" />
<input type="hidden" name="nameRow" value="${(dataSet.nameRow)!''?html}" class="ui-widget ui-widget-content" />
<span class="nameRow-radios">
<label for="${pageId}-nameRow_0">
<@spring.message code='dataSet.excel.nameRow.none' />
</label>
<input type="radio" id="${pageId}-nameRow_0" name="nameRowRadio" value="0" />
<label for="${pageId}-nameRow_1">
<@spring.message code='dataSet.excel.nameRow.assign' />
</label>
<input type="radio" id="${pageId}-nameRow_1" name="nameRowRadio" value="1" />
</span>
&nbsp;
<input type="text" name="nameRowText" value="${(dataSet.nameRow)!''?html}" class="ui-widget ui-widget-content" style="width:4.1em;" />
</div>
</div>
<div class="form-item">
<div class="form-item-label">
<label><@spring.message code='dataSet.excel.dataRowExp' /></label>
<label title="<@spring.message code='dataSet.excel.dataRowExp.desc' />">
<@spring.message code='dataSet.excel.dataRowExp' />
</label>
</div>
<div class="form-item-value">
<input type="text" name="dataRowExp" value="${(dataSet.dataRowExp)!''?html}" class="ui-widget ui-widget-content" />
@ -65,7 +82,9 @@ readonly 是否只读操作允许为null
</div>
<div class="form-item">
<div class="form-item-label">
<label><@spring.message code='dataSet.excel.dataColumnExp' /></label>
<label title="<@spring.message code='dataSet.excel.dataColumnExp.desc' />">
<@spring.message code='dataSet.excel.dataColumnExp' />
</label>
</div>
<div class="form-item-value">
<input type="text" name="dataColumnExp" value="${(dataSet.dataColumnExp)!''?html}" class="ui-widget ui-widget-content" />
@ -76,7 +95,12 @@ readonly 是否只读操作允许为null
<label><@spring.message code='dataSet.excel.forceXls' /></label>
</div>
<div class="form-item-value">
<input type="text" name="forceXls" value="${((dataSet.forceXls)!true)?string('true', 'false')}" class="ui-widget ui-widget-content" />
<div id="${pageId}-forceXls">
<label for="${pageId}-forceXls-true"><@spring.message code='yes' /></label>
<input id="${pageId}-forceXls-true" type="radio" name="forceXls" value="true" />
<label for="${pageId}-forceXls-false"><@spring.message code='no' /></label>
<input id="${pageId}-forceXls-false" type="radio" name="forceXls" value="false" />
</div>
</div>
</div>
<#include "include/dataSet_form_html_wow.ftl" >
@ -104,66 +128,111 @@ readonly 是否只读操作允许为null
po.dataSetParams = <@writeJson var=dataSetParams />;
$.initButtons(po.element());
po.element(".nameRow-radios").controlgroup();
po.element("#${pageId}-forceXls").buttonset();
po.element("#${pageId}-forceXls-${((dataSet.forceXls)!true)?string('true', 'false')}").click();
po.initWorkspaceHeight();
po.initWorkspaceTabs();
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.fileNameEditorValue = function(value)
po.element("input[name='nameRowRadio']").on("change", function()
{
var $editor = po.element("#${pageId}-workspaceEditor");
var radioVal = $(this).val();
var $nameRow = po.element("input[name='nameRow']");
var $nameRowText = po.element("input[name='nameRowText']");
if(radioVal == "0")
{
$nameRow.val("0");
$nameRowText.hide();
}
else
{
var myVal = parseInt($nameRowText.val());
if(!myVal || myVal < 1)
$nameRowText.val("1");
$nameRowText.show();
}
});
po.nameRowValue = function(value)
{
var $nameRow = po.element("input[name='nameRow']");
var $nameRowText = po.element("input[name='nameRowText']");
if(value === undefined)
return $editor.val();
{
var radioVal = po.element("input[name='nameRowRadio']:checked").val();
if(radioVal == "0")
return $nameRow.val();
else
return $nameRowText.val();
}
else
$editor.val(value);
{
$nameRow.val(value);
$nameRowText.val(value);
po.element("input[name='nameRowRadio'][value='"+(value >= 1 ? 1 : 0)+"']").attr("checked", "checked").change();
}
};
po.nameRowValue(${(dataSet.nameRow)!"1"});
po.updatePreviewOptionsData = function()
{
var dataSet = po.previewOptions.data.dataSet;
dataSet.fileName = po.element("input[name='fileName']").val();
dataSet.sheetIndex = po.element("input[name='sheetIndex']").val();
dataSet.nameRow = po.nameRowValue();
dataSet.dataRowExp = po.element("input[name='dataRowExp']").val();
dataSet.dataColumnExp = po.element("input[name='dataColumnExp']").val();
dataSet.forceXls = po.element("input[name='forceXls']:checked").val();
po.previewOptions.data.originalFileName = po.element("#${pageId}-originalFileName").val();
};
<#if formAction == 'saveEditForExcel'>
//初始化预览数据为po.isPreviewValueModified判断逻辑提供支持
po.updatePreviewOptionsData();
//编辑操作默认为预览成功
po.previewSuccess(true);
</#if>
po.isPreviewValueModified = function()
{
return po.isFileNameModified();
};
po.isFileNameModified = function(inputValue, editorValue)
{
if(inputValue == undefined)
inputValue = po.element("input[name='fileName']").val();
if(editorValue == undefined)
editorValue = po.fileNameEditorValue();
var fileName = po.element("input[name='fileName']").val();
var sheetIndex = po.element("input[name='sheetIndex']").val();
var nameRow = po.nameRowValue();
var dataRowExp = po.element("input[name='dataRowExp']").val();
var dataColumnExp = po.element("input[name='dataColumnExp']").val();
var forceXls = po.element("input[name='forceXls']:checked").val();
return po.isModifiedIgnoreBlank(inputValue, editorValue);
var pd = po.previewOptions.data.dataSet;
return (pd.fileName != fileName) || (pd.sheetIndex != sheetIndex)
|| (pd.nameRow != nameRow) || (pd.dataRowExp != dataRowExp)
|| (pd.dataColumnExp != dataColumnExp) || (pd.forceXls != forceXls);
};
po.initWorkspaceTabs();
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.previewOptions.url = po.url("previewExcel");
po.previewOptions.beforePreview = function()
{
var fileName = po.fileNameEditorValue();
po.updatePreviewOptionsData();
if(!fileName)
if(!this.data.dataSet.fileName)
return false;
this.data.dataSet.fileName = fileName;
this.data.dataSet.sheetIndex = po.element("input[name='sheetIndex']").val();
this.data.dataSet.nameRow = po.element("input[name='nameRow']").val();
this.data.dataSet.dataRowExp = po.element("input[name='dataRowExp']").val();
this.data.dataSet.dataColumnExp = po.element("input[name='dataColumnExp']").val();
this.data.dataSet.forceXls = po.element("input[name='forceXls']").val();
this.data.originalFileName = po.element("#${pageId}-originalFileName").val();
};
po.previewOptions.beforeRefresh = function()
{
if(!this.data.dataSet || !this.data.dataSet.fileName)
if(!this.data.dataSet.fileName)
return false;
};
po.previewOptions.success = function(previewResponse)
{
po.element("input[name='fileName']").val(this.data.dataSet.fileName);
};
po.initPreviewOperations();
@ -176,8 +245,8 @@ readonly 是否只读操作允许为null
success : function(uploadResult, textStatus, jqXHR)
{
$.fileuploadsuccessHandlerForUploadInfo(po.fileUploadInfo(), false);
po.element("input[name='fileName']").val(uploadResult.fileName);
po.element("input[name='displayName']").val(uploadResult.displayName);
po.element("#${pageId}-workspaceEditor").val(uploadResult.fileName);
}
})
.bind('fileuploadadd', function (e, data)
@ -190,9 +259,29 @@ readonly 是否只读操作允许为null
$.fileuploadprogressallHandlerForUploadInfo(e, data, po.fileUploadInfo());
});
$.validator.addMethod("dataSetExcelFilePreviewRequired", function(value, element)
$.validator.addMethod("dataSetExcelPreviewRequired", function(value, element)
{
return !po.isFileNameModified();
return !po.isPreviewValueModified() && po.previewSuccess();
});
$.validator.addMethod("dataSetExcelDataRowExpRegex", function(value, element)
{
if(!value)
return true;
var regex = /[\d\-\,\s]$/g;
return regex.test(value);
});
$.validator.addMethod("dataSetExcelDataColumnExpRegex", function(value, element)
{
if(!value)
return true;
var regex = /([A-Z]|[\-\,\s])$/g;
return regex.test(value);
});
po.form().validate(
@ -201,7 +290,11 @@ readonly 是否只读操作允许为null
rules :
{
"name" : "required",
"displayName" : {"required": true, "dataSetExcelFilePreviewRequired": true, "dataSetPropertiesRequired": true}
"displayName" : {"required": true, "dataSetExcelPreviewRequired": true, "dataSetPropertiesRequired": true},
"sheetIndex": {"required": true, "integer": true, "min": 1},
"nameRowText": {"integer": true, "min": 1},
"dataRowExp": {"dataSetExcelDataRowExpRegex": true},
"dataColumnExp": {"dataSetExcelDataColumnExpRegex": true}
},
messages :
{
@ -209,15 +302,31 @@ readonly 是否只读操作允许为null
"displayName" :
{
"required": "<@spring.message code='validation.required' />",
"dataSetExcelFilePreviewRequired": "<@spring.message code='dataSet.validation.previewRequired' />",
"dataSetExcelPreviewRequired": "<@spring.message code='dataSet.validation.previewRequired' />",
"dataSetPropertiesRequired": "<@spring.message code='dataSet.validation.propertiesRequired' />"
}
},
"sheetIndex":
{
"required": "<@spring.message code='validation.required' />",
"integer": "<@spring.message code='validation.integer' />",
"min": "<@spring.message code='validation.min' />"
},
"nameRowText":
{
"integer": "<@spring.message code='validation.integer' />",
"min": "<@spring.message code='validation.min' />"
},
"dataRowExp": {"dataSetExcelDataRowExpRegex": "<@spring.message code='dataSet.validation.excel.dataRowExp.regex' />"},
"dataColumnExp": {"dataSetExcelDataColumnExpRegex": "<@spring.message code='dataSet.validation.excel.dataColumnExp.regex' />"}
},
submitHandler : function(form)
{
var formData = $.formToJson(form);
formData["properties"] = po.getFormDataSetProperties();
formData["params"] = po.getFormDataSetParams();
formData["nameRow"] = po.nameRowValue();
formData["nameRowRadio"] = undefined;
formData["nameRowText"] = undefined;
var originalFileName = po.element("#${pageId}-originalFileName").val();

View File

@ -30,7 +30,6 @@ readonly 是否只读操作允许为null
<input type="hidden" id="${pageId}-originalFileName" value="${(dataSet.fileName)!''?html}" />
<input type="hidden" name="fileName" value="${(dataSet.fileName)!''?html}" />
<input type="text" name="displayName" value="${(dataSet.displayName)!''?html}" class="file-display-name ui-widget ui-widget-content" readonly="readonly" />
<input type="hidden" id="${pageId}-workspaceEditor" value="${(dataSet.fileName)!''?html}" />
<#if !readonly>
<div class="fileinput-wrapper">
<div class="ui-widget ui-corner-all ui-button fileinput-button"><@spring.message code='upload' /><input type="file"></div>
@ -39,7 +38,7 @@ readonly 是否只读操作允许为null
</#if>
</div>
</div>
<div class="form-item">
<div class="form-item form-item-encoding">
<div class="form-item-label">
<label><@spring.message code='dataSet.jsonFileEncoding' /></label>
</div>
@ -78,66 +77,56 @@ readonly 是否只读操作允许为null
$.initButtons(po.element());
po.element("select[name='encoding']").selectmenu({ appendTo : po.element(), classes : { "ui-selectmenu-menu" : "encoding-selectmenu-menu" } });
po.initWorkspaceHeight();
po.initWorkspaceTabs();
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.fileNameEditorValue = function(value)
po.updatePreviewOptionsData = function()
{
var $editor = po.element("#${pageId}-workspaceEditor");
var dataSet = po.previewOptions.data.dataSet;
if(value === undefined)
return $editor.val();
else
$editor.val(value);
dataSet.fileName = po.element("input[name='fileName']").val();
dataSet.encoding = po.element("select[name='encoding']").val();
po.previewOptions.data.originalFileName = po.element("#${pageId}-originalFileName").val();
};
<#if formAction == 'saveEditForJsonFile'>
//初始化预览数据为po.isPreviewValueModified判断逻辑提供支持
po.updatePreviewOptionsData();
//编辑操作默认为预览成功
po.previewSuccess(true);
</#if>
po.isPreviewValueModified = function()
{
return po.isFileNameModified();
};
po.isFileNameModified = function(inputValue, editorValue)
{
if(inputValue == undefined)
inputValue = po.element("input[name='fileName']").val();
if(editorValue == undefined)
editorValue = po.fileNameEditorValue();
var fileName = po.element("input[name='fileName']").val();
var encoding = po.element("select[name='encoding']").val();
return po.isModifiedIgnoreBlank(inputValue, editorValue);
var pd = po.previewOptions.data.dataSet;
return (pd.fileName != fileName) || (pd.encoding != encoding);
};
po.initWorkspaceTabs();
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.previewOptions.url = po.url("previewJsonFile");
po.previewOptions.beforePreview = function()
{
var fileName = po.fileNameEditorValue();
po.updatePreviewOptionsData();
if(!fileName)
if(!this.data.dataSet.fileName)
return false;
this.data.dataSet.encoding = po.element("select[name='encoding']").val();
this.data.dataSet.fileName = fileName;
this.data.originalFileName = po.element("#${pageId}-originalFileName").val();
};
po.previewOptions.beforeRefresh = function()
{
if(!this.data.dataSet || !this.data.dataSet.fileName)
if(!this.data.dataSet.fileName)
return false;
};
po.previewOptions.success = function(previewResponse)
{
po.element("input[name='fileName']").val(this.data.dataSet.fileName);
};
po.initPreviewOperations();
po.fileUploadInfo = function(){ return this.element(".upload-file-info"); };
po.element(".fileinput-button").fileupload(
{
url : po.url("uploadFile"),
@ -145,8 +134,8 @@ readonly 是否只读操作允许为null
success : function(uploadResult, textStatus, jqXHR)
{
$.fileuploadsuccessHandlerForUploadInfo(po.fileUploadInfo(), false);
po.element("input[name='fileName']").val(uploadResult.fileName);
po.element("input[name='displayName']").val(uploadResult.displayName);
po.element("#${pageId}-workspaceEditor").val(uploadResult.fileName);
}
})
.bind('fileuploadadd', function (e, data)
@ -161,7 +150,7 @@ readonly 是否只读操作允许为null
$.validator.addMethod("dataSetJsonFilePreviewRequired", function(value, element)
{
return !po.isFileNameModified();
return !po.isPreviewValueModified() && po.previewSuccess();
});
po.form().validate(

View File

@ -60,21 +60,6 @@ readonly 是否只读操作允许为null
$.initButtons(po.element());
po.initWorkspaceHeight();
po.isPreviewValueModified = function()
{
return po.isValueModified();
};
po.isValueModified = function(textareaValue, editorValue)
{
if(textareaValue == undefined)
textareaValue = po.element("textarea[name='value']").val();
if(editorValue == undefined)
editorValue = po.jsonEditor.getValue();
return po.isModifiedIgnoreBlank(textareaValue, editorValue);
};
var languageTools = ace.require("ace/ext/language_tools");
var JsonMode = ace.require("ace/mode/json").Mode;
po.jsonEditor = ace.edit("${pageId}-workspaceEditor");
@ -82,40 +67,54 @@ readonly 是否只读操作允许为null
po.jsonEditor.setShowPrintMargin(false);
po.initWorkspaceEditor(po.jsonEditor, po.element("textarea[name='value']").val());
po.initWorkspaceTabs();
po.getAddPropertyName = function()
{
var selectionRange = po.jsonEditor.getSelectionRange();
return (po.jsonEditor.session.getTextRange(selectionRange) || "");
};
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.updatePreviewOptionsData = function()
{
var value = po.jsonEditor.getValue();
var dataSet = po.previewOptions.data.dataSet;
dataSet.value = value;
};
<#if formAction == 'saveEditForJsonValue'>
//初始化预览数据为po.isPreviewValueModified判断逻辑提供支持
po.updatePreviewOptionsData();
//编辑操作默认为预览成功
po.previewSuccess(true);
</#if>
po.isPreviewValueModified = function()
{
var value = po.jsonEditor.getValue();
var pd = po.previewOptions.data.dataSet;
return (pd.value != value);
};
po.previewOptions.url = po.url("previewJsonValue");
po.previewOptions.beforePreview = function()
{
var value = po.jsonEditor.getValue();
po.updatePreviewOptionsData();
if(!value)
if(!this.data.dataSet.value)
return false;
this.data.dataSet.value = value;
};
po.previewOptions.beforeRefresh = function()
{
if(!this.data.dataSet || !this.data.dataSet.value)
if(!this.data.dataSet.value)
return false;
};
po.previewOptions.success = function(previewResponse)
{
po.element("textarea[name='value']").val(this.data.dataSet.value);
po.jsonEditor.focus();
};
po.initPreviewOperations();
@ -127,7 +126,7 @@ readonly 是否只读操作允许为null
$.validator.addMethod("dataSetJsonValuePreviewRequired", function(value, element)
{
return !po.isValueModified(value);
return !po.isPreviewValueModified() && po.previewSuccess();
});
po.form().validate(
@ -153,6 +152,7 @@ readonly 是否只读操作允许为null
var formData = $.formToJson(form);
formData["properties"] = po.getFormDataSetProperties();
formData["params"] = po.getFormDataSetParams();
formData["value"] = po.jsonEditor.getValue();
$.postJson("${contextPath}/analysis/dataSet/${formAction}", formData,
function(response)

View File

@ -80,21 +80,6 @@ readonly 是否只读操作允许为null
po.getDataSetSchemaId = function(){ return po.element("input[name='schemaConnectionFactory.schema.id']").val(); };
po.isPreviewValueModified = function()
{
return po.isSqlModified();
};
po.isSqlModified = function(textareaValue, editorValue)
{
if(textareaValue == undefined)
textareaValue = po.element("textarea[name='sql']").val();
if(editorValue == undefined)
editorValue = po.sqlEditor.getValue();
return po.isModifiedIgnoreBlank(textareaValue, editorValue);
};
po.element(".select-schema-button").click(function()
{
var options =
@ -119,42 +104,57 @@ readonly 是否只读操作允许为null
po.initSqlEditor();
po.initWorkspaceEditor(po.sqlEditor, po.element("textarea[name='sql']").val());
po.initWorkspaceTabs();
po.getAddPropertyName = function()
{
var selectionRange = po.sqlEditor.getSelectionRange();
return (po.sqlEditor.session.getTextRange(selectionRange) || "");
};
po.initDataSetPropertiesTable(po.dataSetProperties);
po.initDataSetParamsTable(po.dataSetParams);
po.initPreviewParamValuePanel();
po.previewOptions.url = po.url("previewSql");
po.previewOptions.beforePreview = function()
po.updatePreviewOptionsData = function()
{
var schemaId = po.getDataSetSchemaId();
var sql = po.sqlEditor.getValue();
if(!schemaId || !sql)
return false;
var dataSet = po.previewOptions.data.dataSet;
this.data.dataSet.sql = sql;
this.data.schemaId = schemaId;
dataSet.sql = sql;
po.previewOptions.data.schemaId = schemaId;
};
<#if formAction == 'saveEditForSQL'>
//初始化预览数据为po.isPreviewValueModified判断逻辑提供支持
po.updatePreviewOptionsData();
//编辑操作默认为预览成功
po.previewSuccess(true);
</#if>
po.isPreviewValueModified = function()
{
var schemaId = po.getDataSetSchemaId();
var sql = po.sqlEditor.getValue();
var pd = po.previewOptions.data.dataSet;
return (pd.sql != sql) || (po.previewOptions.data.schemaId != schemaId);
};
po.previewOptions.url = po.url("previewSql");
po.previewOptions.beforePreview = function()
{
po.updatePreviewOptionsData();
if(!this.data.dataSet.sql || !this.data.schemaId)
return false;
};
po.previewOptions.beforeRefresh = function()
{
if(!this.data.dataSet || !this.data.dataSet.sql || !this.data.schemaId)
if(!this.data.dataSet.sql || !this.data.schemaId)
return false;
};
po.previewOptions.success = function(previewResponse)
{
po.element("textarea[name='sql']").val(this.data.dataSet.sql);
po.sqlEditor.focus();
};
po.initPreviewOperations();
@ -209,7 +209,7 @@ readonly 是否只读操作允许为null
$.validator.addMethod("dataSetSqlPreviewRequired", function(value, element)
{
return !po.isSqlModified(value);
return !po.isPreviewValueModified() && po.previewSuccess();
});
po.form().validate(
@ -237,6 +237,7 @@ readonly 是否只读操作允许为null
var formData = $.formToJson(form);
formData["properties"] = po.getFormDataSetProperties();
formData["params"] = po.getFormDataSetParams();
formData["sql"] = po.sqlEditor.getValue();
$.postJson("${contextPath}/analysis/dataSet/${formAction}", formData,
function(response)

View File

@ -28,6 +28,9 @@ po.previewOptions.url = "...";
po.isModifiedIgnoreBlank = function(sourceVal, targetVal)
{
sourceVal = (sourceVal || "");
targetVal = (targetVal || "");
sourceVal = sourceVal.replace(/\s/g, '');
targetVal = targetVal.replace(/\s/g, '');
@ -572,6 +575,15 @@ po.previewOptions.url = "...";
success: function(previewResponse){}
};
//获取、设置上一次预览是否成功
po.previewSuccess = function(success)
{
if(success === undefined)
return po._previewSuccess == true;
else
po._previewSuccess = success;
};
po.destroyPreviewResultTable = function()
{
var table = po.previewResultTableElement();
@ -581,11 +593,13 @@ po.previewOptions.url = "...";
table.empty();
}
};
po.initPreviewOperations = function()
{
po.element(".preview-result-table-wrapper .preview-button").click(function(event)
{
var previewValueModified = po.isPreviewValueModified();
if(po.previewOptions.beforePreview() == false)
return;
@ -606,7 +620,7 @@ po.previewOptions.url = "...";
po.previewOptions.data.dataSet.params = po.getFormDataSetParams();
po.previewOptions.data.paramValues = chartFactory.chartForm.getDataSetParamValueObj(this);
po.executePreview();
po.executePreview(previewValueModified);
}
});
}
@ -617,7 +631,7 @@ po.previewOptions.url = "...";
po.previewOptions.data.dataSet.params = [];
po.previewOptions.data.paramValues = {};
po.executePreview();
po.executePreview(previewValueModified);
}
});
@ -626,11 +640,11 @@ po.previewOptions.url = "...";
if(po.previewOptions.beforeRefresh() == false)
return;
po.executePreview();
po.executePreview(false);
});
};
po.executePreview = function()
po.executePreview = function(previewValueModified)
{
if(po.previewOptions.beforeRequest() == false)
return;
@ -650,9 +664,11 @@ po.previewOptions.url = "...";
data : po.previewOptions.data,
success : function(previewResponse)
{
po.previewSuccess(true);
//如果工作区内容已变更才更新属性,防止上次保存后的属性被刷新
//属性表单内容为空也更新,比如用户删除了所有属性时
if(po.isPreviewValueModified() || !po.hasFormDataSetProperty())
if(previewValueModified || !po.hasFormDataSetProperty())
po.updateFormDataSetProperties(previewResponse.properties);
var tableData = (previewResponse.result.data || []);
@ -712,6 +728,10 @@ po.previewOptions.url = "...";
po.previewOptions.success(previewResponse);
},
error: function()
{
po.previewSuccess(false);
},
complete: function()
{
$buttons.each(function()