forked from p85126437/datagear
新增CSV文本、CSV文件数据集功能
This commit is contained in:
parent
c0a9e08e35
commit
7af35f459e
|
@ -48,6 +48,9 @@ import org.slf4j.LoggerFactory;
|
|||
* <p>
|
||||
* 通过{@linkplain #setNameRow(int)}可设置名称行。
|
||||
* </p>
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
@ -105,7 +108,8 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
|
|||
/**
|
||||
* 设置此数据集所处的sheet号。
|
||||
*
|
||||
* @param sheetIndex sheet号(以{@code 1}计数)
|
||||
* @param sheetIndex
|
||||
* sheet号(以{@code 1}计数)
|
||||
*/
|
||||
public void setSheetIndex(int sheetIndex)
|
||||
{
|
||||
|
@ -286,11 +290,11 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
|
|||
|
||||
return resolveResultForSheet(paramValues, sheet, properties);
|
||||
}
|
||||
catch(DataSetException e)
|
||||
catch (DataSetException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch(Throwable t)
|
||||
catch (Throwable t)
|
||||
{
|
||||
throw new DataSetSourceParseException(t);
|
||||
}
|
||||
|
@ -326,11 +330,11 @@ public abstract class AbstractExcelDataSet extends AbstractFmkTemplateDataSet im
|
|||
|
||||
return resolveResultForSheet(paramValues, sheet, properties);
|
||||
}
|
||||
catch(DataSetException e)
|
||||
catch (DataSetException e)
|
||||
{
|
||||
throw e;
|
||||
}
|
||||
catch(Throwable t)
|
||||
catch (Throwable t)
|
||||
{
|
||||
throw new DataSetSourceParseException(t);
|
||||
}
|
||||
|
|
|
@ -17,6 +17,9 @@ import org.datagear.util.FileUtil;
|
|||
|
||||
/**
|
||||
* 目录内CSV文件{@linkplain DataSet}。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
|
|
@ -18,6 +18,9 @@ import org.datagear.util.FileUtil;
|
|||
|
||||
/**
|
||||
* 目录内Excel文件{@linkplain DataSet}。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
|
|
@ -18,6 +18,9 @@ import org.datagear.util.FileUtil;
|
|||
|
||||
/**
|
||||
* 目录内JSON文件{@linkplain DataSet}。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
|
|
@ -12,6 +12,9 @@ import org.datagear.analysis.DataSetProperty;
|
|||
|
||||
/**
|
||||
* 简单CSV文件数据集。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
|
|
@ -15,6 +15,11 @@ import org.datagear.analysis.DataSetException;
|
|||
import org.datagear.analysis.DataSetProperty;
|
||||
|
||||
/**
|
||||
* 简单Excel数据集。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
|
|
|
@ -13,6 +13,9 @@ import org.datagear.analysis.DataSetProperty;
|
|||
|
||||
/**
|
||||
* 简单JSON文件数据集。
|
||||
* <p>
|
||||
* 注意:此类不支持<code>Freemarker</code>模板语言。
|
||||
* </p>
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
|
|
|
@ -0,0 +1,114 @@
|
|||
/*
|
||||
* Copyright (c) 2018 datagear.tech. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.datagear.management.domain;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.datagear.analysis.DataSetProperty;
|
||||
import org.datagear.analysis.support.CsvDirectoryFileDataSet;
|
||||
|
||||
/**
|
||||
* {@linkplain CsvDirectoryFileDataSet}实体。
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public class CsvFileDataSetEntity extends CsvDirectoryFileDataSet implements DirectoryFileDataSetEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 展示名 */
|
||||
private String displayName;
|
||||
|
||||
/** 创建用户 */
|
||||
private User createUser;
|
||||
|
||||
/** 创建时间 */
|
||||
private Date createTime;
|
||||
|
||||
/** 权限 */
|
||||
private int dataPermission = PERMISSION_NOT_LOADED;
|
||||
|
||||
public CsvFileDataSetEntity()
|
||||
{
|
||||
super();
|
||||
this.createTime = new Date();
|
||||
}
|
||||
|
||||
public CsvFileDataSetEntity(String id, String name, List<DataSetProperty> properties, File directory,
|
||||
String fileName, String displayName, User createUser)
|
||||
{
|
||||
super(id, name, properties, directory, fileName);
|
||||
this.displayName = displayName;
|
||||
this.createTime = new Date();
|
||||
this.createUser = createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDisplayName()
|
||||
{
|
||||
return displayName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDisplayName(String displayName)
|
||||
{
|
||||
this.displayName = displayName;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDataSetType()
|
||||
{
|
||||
return DataSetEntity.DATA_SET_TYPE_CsvFile;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataSetType(String dataSetType)
|
||||
{
|
||||
// XXX 什么也不做,不采用抛出异常的方式,便于统一底层SQL查询语句
|
||||
// throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getCreateUser()
|
||||
{
|
||||
return createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCreateUser(User createUser)
|
||||
{
|
||||
this.createUser = createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getCreateTime()
|
||||
{
|
||||
return createTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCreateTime(Date createTime)
|
||||
{
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDataPermission()
|
||||
{
|
||||
return dataPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataPermission(int dataPermission)
|
||||
{
|
||||
this.dataPermission = dataPermission;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,97 @@
|
|||
/*
|
||||
* Copyright (c) 2018 datagear.tech. All Rights Reserved.
|
||||
*/
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
package org.datagear.management.domain;
|
||||
|
||||
import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
import org.datagear.analysis.DataSetProperty;
|
||||
import org.datagear.analysis.support.CsvValueDataSet;
|
||||
|
||||
/**
|
||||
* {@linkplain CsvValueDataSet}实体。
|
||||
*
|
||||
* @author datagear@163.com
|
||||
*
|
||||
*/
|
||||
public class CsvValueDataSetEntity extends CsvValueDataSet implements DataSetEntity
|
||||
{
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/** 创建用户 */
|
||||
private User createUser;
|
||||
|
||||
/** 创建时间 */
|
||||
private Date createTime;
|
||||
|
||||
/** 权限 */
|
||||
private int dataPermission = PERMISSION_NOT_LOADED;
|
||||
|
||||
public CsvValueDataSetEntity()
|
||||
{
|
||||
super();
|
||||
this.createTime = new Date();
|
||||
}
|
||||
|
||||
public CsvValueDataSetEntity(String id, String name, List<DataSetProperty> properties, String value,
|
||||
User createUser)
|
||||
{
|
||||
super(id, name, properties, value);
|
||||
this.createTime = new Date();
|
||||
this.createUser = createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getDataSetType()
|
||||
{
|
||||
return DataSetEntity.DATA_SET_TYPE_CsvValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataSetType(String dataSetType)
|
||||
{
|
||||
// XXX 什么也不做,不采用抛出异常的方式,便于统一底层SQL查询语句
|
||||
// throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public User getCreateUser()
|
||||
{
|
||||
return createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCreateUser(User createUser)
|
||||
{
|
||||
this.createUser = createUser;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Date getCreateTime()
|
||||
{
|
||||
return createTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCreateTime(Date createTime)
|
||||
{
|
||||
this.createTime = createTime;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getDataPermission()
|
||||
{
|
||||
return dataPermission;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setDataPermission(int dataPermission)
|
||||
{
|
||||
this.dataPermission = dataPermission;
|
||||
}
|
||||
}
|
|
@ -34,8 +34,8 @@ public interface DataSetEntity extends DataSet, CreateUserEntity<String>, DataPe
|
|||
/** 数据集类型:Excel */
|
||||
String DATA_SET_TYPE_Excel = "Excel";
|
||||
|
||||
/** 数据集类型:CSV */
|
||||
String DATA_SET_TYPE_Csv = "Csv";
|
||||
/** 数据集类型:CSV值 */
|
||||
String DATA_SET_TYPE_CsvValue = "CsvValue";
|
||||
|
||||
/** 数据集类型:CSV文件 */
|
||||
String DATA_SET_TYPE_CsvFile = "CsvFile";
|
||||
|
|
|
@ -42,8 +42,8 @@ public class ExcelDataSetEntity extends ExcelDirectoryFileDataSet implements Dir
|
|||
this.createTime = new Date();
|
||||
}
|
||||
|
||||
public ExcelDataSetEntity(String id, String name, List<DataSetProperty> properties, File directory,
|
||||
String fileName, String displayName, User createUser)
|
||||
public ExcelDataSetEntity(String id, String name, List<DataSetProperty> properties, File directory, String fileName,
|
||||
String displayName, User createUser)
|
||||
{
|
||||
super(id, name, properties, directory, fileName);
|
||||
this.displayName = displayName;
|
||||
|
|
|
@ -17,6 +17,8 @@ import org.datagear.analysis.DataSet;
|
|||
import org.datagear.analysis.DataSetParam;
|
||||
import org.datagear.analysis.DataSetProperty;
|
||||
import org.datagear.connection.ConnectionSource;
|
||||
import org.datagear.management.domain.CsvFileDataSetEntity;
|
||||
import org.datagear.management.domain.CsvValueDataSetEntity;
|
||||
import org.datagear.management.domain.DataSetEntity;
|
||||
import org.datagear.management.domain.ExcelDataSetEntity;
|
||||
import org.datagear.management.domain.JsonFileDataSetEntity;
|
||||
|
@ -170,6 +172,10 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
success = addJsonFileDataSetEntity((JsonFileDataSetEntity) entity);
|
||||
else if (entity instanceof ExcelDataSetEntity)
|
||||
success = addExcelDataSetEntity((ExcelDataSetEntity) entity);
|
||||
else if (entity instanceof CsvValueDataSetEntity)
|
||||
success = addCsvValueDataSetEntity((CsvValueDataSetEntity) entity);
|
||||
else if (entity instanceof CsvFileDataSetEntity)
|
||||
success = addCsvFileDataSetEntity((CsvFileDataSetEntity) entity);
|
||||
}
|
||||
|
||||
if (success)
|
||||
|
@ -210,6 +216,22 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
return (updateMybatis("insertExcelDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
protected boolean addCsvValueDataSetEntity(CsvValueDataSetEntity entity)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("entity", entity);
|
||||
|
||||
return (updateMybatis("insertCsvValueDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
protected boolean addCsvFileDataSetEntity(CsvFileDataSetEntity entity)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("entity", entity);
|
||||
|
||||
return (updateMybatis("insertCsvFileDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected boolean update(DataSetEntity entity, Map<String, Object> params)
|
||||
{
|
||||
|
@ -228,6 +250,10 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
success = updateJsonFileDataSetEntity((JsonFileDataSetEntity) entity);
|
||||
else if (entity instanceof ExcelDataSetEntity)
|
||||
success = updateExcelDataSetEntity((ExcelDataSetEntity) entity);
|
||||
else if (entity instanceof CsvValueDataSetEntity)
|
||||
success = updateCsvValueDataSetEntity((CsvValueDataSetEntity) entity);
|
||||
else if (entity instanceof CsvFileDataSetEntity)
|
||||
success = updateCsvFileDataSetEntity((CsvFileDataSetEntity) entity);
|
||||
}
|
||||
|
||||
if (success)
|
||||
|
@ -268,6 +294,22 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
return (updateMybatis("updateExcelDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
protected boolean updateCsvValueDataSetEntity(CsvValueDataSetEntity entity)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("entity", entity);
|
||||
|
||||
return (updateMybatis("updateCsvValueDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
protected boolean updateCsvFileDataSetEntity(CsvFileDataSetEntity entity)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("entity", entity);
|
||||
|
||||
return (updateMybatis("updateCsvFileDataSetEntity", params) > 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getResourceType()
|
||||
{
|
||||
|
@ -314,6 +356,10 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
obj = getJsonFileDataSetEntityById(obj.getId());
|
||||
else if (DataSetEntity.DATA_SET_TYPE_Excel.equals(obj.getDataSetType()))
|
||||
obj = getExcelDataSetEntityById(obj.getId());
|
||||
else if (DataSetEntity.DATA_SET_TYPE_CsvValue.equals(obj.getDataSetType()))
|
||||
obj = getCsvValueDataSetEntityById(obj.getId());
|
||||
else if (DataSetEntity.DATA_SET_TYPE_CsvFile.equals(obj.getDataSetType()))
|
||||
obj = getCsvFileDataSetEntityById(obj.getId());
|
||||
|
||||
if (obj == null)
|
||||
return null;
|
||||
|
@ -378,6 +424,29 @@ public class DataSetEntityServiceImpl extends AbstractMybatisDataPermissionEntit
|
|||
return entity;
|
||||
}
|
||||
|
||||
protected CsvValueDataSetEntity getCsvValueDataSetEntityById(String id)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("id", id);
|
||||
|
||||
CsvValueDataSetEntity entity = selectOneMybatis("getCsvValueDataSetEntityById", params);
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
protected CsvFileDataSetEntity getCsvFileDataSetEntityById(String id)
|
||||
{
|
||||
Map<String, Object> params = buildParamMapWithIdentifierQuoteParameter();
|
||||
params.put("id", id);
|
||||
|
||||
CsvFileDataSetEntity entity = selectOneMybatis("getCsvFileDataSetEntityById", params);
|
||||
|
||||
if (entity != null)
|
||||
entity.setDirectory(getDataSetDirectory(id));
|
||||
|
||||
return entity;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void addDataPermissionParameters(Map<String, Object> params, User user)
|
||||
{
|
||||
|
|
|
@ -532,3 +532,28 @@ CREATE TABLE DATAGEAR_DATA_SET_EXCEL
|
|||
|
||||
ALTER TABLE DATAGEAR_DATA_SET_EXCEL ADD FOREIGN KEY (DS_ID) REFERENCES DATAGEAR_DATA_SET (DS_ID) ON DELETE CASCADE;
|
||||
|
||||
--2020-08-31
|
||||
--CSV值数据集
|
||||
CREATE TABLE DATAGEAR_DATA_SET_CSV_VALUE
|
||||
(
|
||||
DS_ID VARCHAR(50) NOT NULL,
|
||||
DS_VALUE VARCHAR(10000) NOT NULL,
|
||||
DS_NAME_ROW INTEGER,
|
||||
PRIMARY KEY (DS_ID)
|
||||
);
|
||||
|
||||
ALTER TABLE DATAGEAR_DATA_SET_CSV_VALUE ADD FOREIGN KEY (DS_ID) REFERENCES DATAGEAR_DATA_SET (DS_ID) ON DELETE CASCADE;
|
||||
|
||||
--2020-08-31
|
||||
--CSV文件数据集
|
||||
CREATE TABLE DATAGEAR_DATA_SET_CSV_FILE
|
||||
(
|
||||
DS_ID VARCHAR(50) NOT NULL,
|
||||
DS_FILE_NAME VARCHAR(100) NOT NULL,
|
||||
DS_DISPLAY_NAME VARCHAR(100) NOT NULL,
|
||||
DS_FILE_ENCODING VARCHAR(50),
|
||||
DS_NAME_ROW INTEGER,
|
||||
PRIMARY KEY (DS_ID)
|
||||
);
|
||||
|
||||
ALTER TABLE DATAGEAR_DATA_SET_CSV_FILE ADD FOREIGN KEY (DS_ID) REFERENCES DATAGEAR_DATA_SET (DS_ID) ON DELETE CASCADE;
|
||||
|
|
|
@ -60,6 +60,28 @@
|
|||
)
|
||||
</insert>
|
||||
|
||||
<insert id="insertCsvValueDataSetEntity">
|
||||
INSERT INTO DATAGEAR_DATA_SET_CSV_VALUE
|
||||
(
|
||||
DS_ID, DS_VALUE, DS_NAME_ROW
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
#{entity.id}, #{entity.value}, #{entity.nameRow}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<insert id="insertCsvFileDataSetEntity">
|
||||
INSERT INTO DATAGEAR_DATA_SET_CSV_FILE
|
||||
(
|
||||
DS_ID, DS_FILE_NAME, DS_FILE_ENCODING, DS_DISPLAY_NAME, DS_NAME_ROW
|
||||
)
|
||||
VALUES
|
||||
(
|
||||
#{entity.id}, #{entity.fileName}, #{entity.encoding}, #{entity.displayName}, #{entity.nameRow}
|
||||
)
|
||||
</insert>
|
||||
|
||||
<insert id="insertPropertyPO">
|
||||
INSERT INTO DATAGEAR_DATA_SET_PROP
|
||||
(
|
||||
|
@ -135,6 +157,24 @@
|
|||
DS_ID = #{entity.id}
|
||||
</update>
|
||||
|
||||
<update id="updateCsvValueDataSetEntity">
|
||||
UPDATE DATAGEAR_DATA_SET_CSV_VALUE SET
|
||||
DS_VALUE = #{entity.value},
|
||||
DS_NAME_ROW = #{entity.nameRow}
|
||||
WHERE
|
||||
DS_ID = #{entity.id}
|
||||
</update>
|
||||
|
||||
<update id="updateCsvFileDataSetEntity">
|
||||
UPDATE DATAGEAR_DATA_SET_CSV_FILE SET
|
||||
DS_FILE_NAME = #{entity.fileName},
|
||||
DS_FILE_ENCODING = #{entity.encoding},
|
||||
DS_DISPLAY_NAME = #{entity.displayName},
|
||||
DS_NAME_ROW = #{entity.nameRow}
|
||||
WHERE
|
||||
DS_ID = #{entity.id}
|
||||
</update>
|
||||
|
||||
<delete id="deleteById">
|
||||
DELETE FROM DATAGEAR_DATA_SET
|
||||
WHERE
|
||||
|
@ -225,6 +265,34 @@
|
|||
T1.${_iq_}id${_iq_} = T2.DS_ID
|
||||
</select>
|
||||
|
||||
<select id="getCsvValueDataSetEntityById" resultType="org.datagear.management.domain.CsvValueDataSetEntity">
|
||||
SELECT
|
||||
T1.*,
|
||||
T2.DS_VALUE AS ${_iq_}value${_iq_},
|
||||
T2.DS_NAME_ROW AS ${_iq_}nameRow${_iq_}
|
||||
FROM
|
||||
(SELECT * FROM (<include refid="queryView" />) T0 WHERE T0.${_iq_}id${_iq_} = #{id}) T1
|
||||
INNER JOIN
|
||||
DATAGEAR_DATA_SET_CSV_VALUE T2
|
||||
ON
|
||||
T1.${_iq_}id${_iq_} = T2.DS_ID
|
||||
</select>
|
||||
|
||||
<select id="getCsvFileDataSetEntityById" resultType="org.datagear.management.domain.CsvFileDataSetEntity">
|
||||
SELECT
|
||||
T1.*,
|
||||
T2.DS_FILE_NAME AS ${_iq_}fileName${_iq_},
|
||||
T2.DS_FILE_ENCODING AS ${_iq_}encoding${_iq_},
|
||||
T2.DS_DISPLAY_NAME AS ${_iq_}displayName${_iq_},
|
||||
T2.DS_NAME_ROW AS ${_iq_}nameRow${_iq_}
|
||||
FROM
|
||||
(SELECT * FROM (<include refid="queryView" />) T0 WHERE T0.${_iq_}id${_iq_} = #{id}) T1
|
||||
INNER JOIN
|
||||
DATAGEAR_DATA_SET_CSV_FILE T2
|
||||
ON
|
||||
T1.${_iq_}id${_iq_} = T2.DS_ID
|
||||
</select>
|
||||
|
||||
<select id="getPropertyPOs" resultType="org.datagear.management.service.impl.DataSetEntityServiceImpl$DataSetPropertyPO">
|
||||
SELECT
|
||||
PROP_DS_ID AS ${_iq_}dataSetId${_iq_},
|
||||
|
|
|
@ -21,12 +21,15 @@ import org.datagear.analysis.DataSet;
|
|||
import org.datagear.analysis.DataSetParam;
|
||||
import org.datagear.analysis.ResolvedDataSetResult;
|
||||
import org.datagear.analysis.support.AbstractFmkTemplateDataSet;
|
||||
import org.datagear.analysis.support.CsvValueDataSet;
|
||||
import org.datagear.analysis.support.DataSetFmkTemplateResolver;
|
||||
import org.datagear.analysis.support.DataSetParamValueConverter;
|
||||
import org.datagear.analysis.support.JsonValueDataSet;
|
||||
import org.datagear.analysis.support.SqlDataSet;
|
||||
import org.datagear.analysis.support.TemplateContext;
|
||||
import org.datagear.analysis.support.TemplateResolvedDataSetResult;
|
||||
import org.datagear.management.domain.CsvFileDataSetEntity;
|
||||
import org.datagear.management.domain.CsvValueDataSetEntity;
|
||||
import org.datagear.management.domain.DataSetEntity;
|
||||
import org.datagear.management.domain.DirectoryFileDataSetEntity;
|
||||
import org.datagear.management.domain.ExcelDataSetEntity;
|
||||
|
@ -231,6 +234,68 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping("/addForCsvValue")
|
||||
public String addForCsvValue(HttpServletRequest request, org.springframework.ui.Model model)
|
||||
{
|
||||
CsvValueDataSetEntity dataSet = new CsvValueDataSetEntity();
|
||||
dataSet.setNameRow(1);
|
||||
|
||||
model.addAttribute("dataSet", dataSet);
|
||||
model.addAttribute(KEY_TITLE_MESSAGE_KEY, "dataSet.addDataSet");
|
||||
model.addAttribute(KEY_FORM_ACTION, "saveAddForCsvValue");
|
||||
|
||||
return buildFormView(dataSet.getDataSetType());
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/saveAddForCsvValue", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResponseEntity<OperationMessage> saveAddForCsvValue(HttpServletRequest request, HttpServletResponse response,
|
||||
@RequestBody CsvValueDataSetEntity dataSet)
|
||||
{
|
||||
User user = WebUtils.getUser(request, response);
|
||||
|
||||
dataSet.setId(IDUtil.randomIdOnTime20());
|
||||
dataSet.setCreateUser(User.copyWithoutPassword(user));
|
||||
|
||||
checkSaveCsvValueDataSetEntity(dataSet);
|
||||
|
||||
this.dataSetEntityService.add(user, dataSet);
|
||||
|
||||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping("/addForCsvFile")
|
||||
public String addForCsvFile(HttpServletRequest request, org.springframework.ui.Model model)
|
||||
{
|
||||
CsvFileDataSetEntity dataSet = new CsvFileDataSetEntity();
|
||||
dataSet.setNameRow(1);
|
||||
|
||||
model.addAttribute("dataSet", dataSet);
|
||||
model.addAttribute("availableCharsetNames", getAvailableCharsetNames());
|
||||
model.addAttribute(KEY_TITLE_MESSAGE_KEY, "dataSet.addDataSet");
|
||||
model.addAttribute(KEY_FORM_ACTION, "saveAddForCsvFile");
|
||||
|
||||
return buildFormView(dataSet.getDataSetType());
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/saveAddForCsvFile", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResponseEntity<OperationMessage> saveAddForCsvFile(HttpServletRequest request, HttpServletResponse response,
|
||||
@RequestBody CsvFileDataSetEntity dataSet) throws Throwable
|
||||
{
|
||||
User user = WebUtils.getUser(request, response);
|
||||
|
||||
dataSet.setId(IDUtil.randomIdOnTime20());
|
||||
dataSet.setCreateUser(User.copyWithoutPassword(user));
|
||||
|
||||
checkSaveCsvFileDataSetEntity(dataSet);
|
||||
|
||||
this.dataSetEntityService.add(user, dataSet);
|
||||
copyToDirectoryFileDataSetEntityDirectoryIf(dataSet, "");
|
||||
|
||||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping("/edit")
|
||||
public String edit(HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model model,
|
||||
@RequestParam("id") String id)
|
||||
|
@ -248,7 +313,8 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
model.addAttribute(KEY_TITLE_MESSAGE_KEY, "dataSet.editDataSet");
|
||||
model.addAttribute(KEY_FORM_ACTION, "saveEditFor" + dataSet.getDataSetType());
|
||||
|
||||
if (DataSetEntity.DATA_SET_TYPE_JsonFile.equals(dataSet.getDataSetType()))
|
||||
if (DataSetEntity.DATA_SET_TYPE_JsonFile.equals(dataSet.getDataSetType())
|
||||
|| DataSetEntity.DATA_SET_TYPE_CsvFile.equals(dataSet.getDataSetType()))
|
||||
model.addAttribute("availableCharsetNames", getAvailableCharsetNames());
|
||||
|
||||
return buildFormView(dataSet.getDataSetType());
|
||||
|
@ -300,9 +366,9 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
|
||||
@RequestMapping(value = "/saveEditFor" + DataSetEntity.DATA_SET_TYPE_Excel, produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResponseEntity<OperationMessage> saveEditForExcel(HttpServletRequest request,
|
||||
HttpServletResponse response, @RequestBody ExcelDataSetEntity dataSet,
|
||||
@RequestParam("originalFileName") String originalFileName) throws Throwable
|
||||
public ResponseEntity<OperationMessage> saveEditForExcel(HttpServletRequest request, HttpServletResponse response,
|
||||
@RequestBody ExcelDataSetEntity dataSet, @RequestParam("originalFileName") String originalFileName)
|
||||
throws Throwable
|
||||
{
|
||||
User user = WebUtils.getUser(request, response);
|
||||
|
||||
|
@ -314,6 +380,36 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/saveEditFor" + DataSetEntity.DATA_SET_TYPE_CsvValue, produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResponseEntity<OperationMessage> saveEditForCsvValue(HttpServletRequest request,
|
||||
HttpServletResponse response, @RequestBody CsvValueDataSetEntity dataSet)
|
||||
{
|
||||
User user = WebUtils.getUser(request, response);
|
||||
|
||||
checkSaveCsvValueDataSetEntity(dataSet);
|
||||
|
||||
this.dataSetEntityService.update(user, dataSet);
|
||||
|
||||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/saveEditFor" + DataSetEntity.DATA_SET_TYPE_CsvFile, produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResponseEntity<OperationMessage> saveEditForCsvFile(HttpServletRequest request, HttpServletResponse response,
|
||||
@RequestBody CsvFileDataSetEntity dataSet, @RequestParam("originalFileName") String originalFileName)
|
||||
throws Throwable
|
||||
{
|
||||
User user = WebUtils.getUser(request, response);
|
||||
|
||||
checkSaveCsvFileDataSetEntity(dataSet);
|
||||
|
||||
this.dataSetEntityService.update(user, dataSet);
|
||||
copyToDirectoryFileDataSetEntityDirectoryIf(dataSet, originalFileName);
|
||||
|
||||
return buildOperationMessageSaveSuccessResponseEntity(request, dataSet);
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/uploadFile", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public Map<String, Object> uploadFile(HttpServletRequest request, HttpServletResponse response,
|
||||
|
@ -359,7 +455,8 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
model.addAttribute(KEY_TITLE_MESSAGE_KEY, "dataSet.viewDataSet");
|
||||
model.addAttribute(KEY_READONLY, true);
|
||||
|
||||
if (DataSetEntity.DATA_SET_TYPE_JsonFile.equals(dataSet.getDataSetType()))
|
||||
if (DataSetEntity.DATA_SET_TYPE_JsonFile.equals(dataSet.getDataSetType())
|
||||
|| DataSetEntity.DATA_SET_TYPE_CsvFile.equals(dataSet.getDataSetType()))
|
||||
model.addAttribute("availableCharsetNames", getAvailableCharsetNames());
|
||||
|
||||
return buildFormView(dataSet.getDataSetType());
|
||||
|
@ -511,8 +608,8 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
{
|
||||
JsonValueDataSet dataSet = preview.getDataSet();
|
||||
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter()
|
||||
.convert(preview.getParamValues(), dataSet.getParams());
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter().convert(preview.getParamValues(),
|
||||
dataSet.getParams());
|
||||
|
||||
TemplateResolvedDataSetResult result = dataSet.resolve(convertedParamValues);
|
||||
|
||||
|
@ -528,8 +625,8 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
JsonFileDataSetEntity dataSet = preview.getDataSet();
|
||||
setDirectoryFileDataSetDirectory(dataSet, preview.getOriginalFileName());
|
||||
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter()
|
||||
.convert(preview.getParamValues(), dataSet.getParams());
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter().convert(preview.getParamValues(),
|
||||
dataSet.getParams());
|
||||
|
||||
ResolvedDataSetResult result = dataSet.resolve(convertedParamValues);
|
||||
|
||||
|
@ -539,14 +636,44 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
@RequestMapping(value = "/previewExcel", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResolvedDataSetResult previewExcel(HttpServletRequest request, HttpServletResponse response,
|
||||
org.springframework.ui.Model springModel, @RequestBody ExcelDataSetEntityPreview preview)
|
||||
throws Throwable
|
||||
org.springframework.ui.Model springModel, @RequestBody ExcelDataSetEntityPreview preview) throws Throwable
|
||||
{
|
||||
ExcelDataSetEntity dataSet = preview.getDataSet();
|
||||
setDirectoryFileDataSetDirectory(dataSet, preview.getOriginalFileName());
|
||||
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter()
|
||||
.convert(preview.getParamValues(), dataSet.getParams());
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter().convert(preview.getParamValues(),
|
||||
dataSet.getParams());
|
||||
|
||||
ResolvedDataSetResult result = dataSet.resolve(convertedParamValues);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/previewCsvValue", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public TemplateResolvedDataSetResult previewCsvValue(HttpServletRequest request, HttpServletResponse response,
|
||||
org.springframework.ui.Model springModel, @RequestBody CsvValueDataSetPreview preview) throws Throwable
|
||||
{
|
||||
CsvValueDataSet dataSet = preview.getDataSet();
|
||||
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter().convert(preview.getParamValues(),
|
||||
dataSet.getParams());
|
||||
|
||||
TemplateResolvedDataSetResult result = dataSet.resolve(convertedParamValues);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
@RequestMapping(value = "/previewCsvFile", produces = CONTENT_TYPE_JSON)
|
||||
@ResponseBody
|
||||
public ResolvedDataSetResult previewCsvFile(HttpServletRequest request, HttpServletResponse response,
|
||||
org.springframework.ui.Model springModel, @RequestBody CsvFileDataSetEntityPreview preview) throws Throwable
|
||||
{
|
||||
CsvFileDataSetEntity dataSet = preview.getDataSet();
|
||||
setDirectoryFileDataSetDirectory(dataSet, preview.getOriginalFileName());
|
||||
|
||||
Map<String, Object> convertedParamValues = getDataSetParamValueConverter().convert(preview.getParamValues(),
|
||||
dataSet.getParams());
|
||||
|
||||
ResolvedDataSetResult result = dataSet.resolve(convertedParamValues);
|
||||
|
||||
|
@ -554,8 +681,7 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
}
|
||||
|
||||
protected boolean copyToDirectoryFileDataSetEntityDirectoryIf(DirectoryFileDataSetEntity entity,
|
||||
String originalFileName)
|
||||
throws IOException
|
||||
String originalFileName) throws IOException
|
||||
{
|
||||
String fileName = entity.getFileName();
|
||||
|
||||
|
@ -663,6 +789,25 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
throw new IllegalInputException();
|
||||
}
|
||||
|
||||
protected void checkSaveCsvValueDataSetEntity(CsvValueDataSetEntity dataSet)
|
||||
{
|
||||
checkSaveEntity(dataSet);
|
||||
|
||||
if (isEmpty(dataSet.getValue()))
|
||||
throw new IllegalInputException();
|
||||
}
|
||||
|
||||
protected void checkSaveCsvFileDataSetEntity(CsvFileDataSetEntity dataSet)
|
||||
{
|
||||
checkSaveEntity(dataSet);
|
||||
|
||||
if (isEmpty(dataSet.getFileName()))
|
||||
throw new IllegalInputException();
|
||||
|
||||
if (isEmpty(dataSet.getDisplayName()))
|
||||
throw new IllegalInputException();
|
||||
}
|
||||
|
||||
public static class AbstractDataSetPreview<T extends DataSet>
|
||||
{
|
||||
private T dataSet;
|
||||
|
@ -782,6 +927,52 @@ public class DataSetController extends AbstractSchemaConnController
|
|||
}
|
||||
}
|
||||
|
||||
public static class CsvValueDataSetPreview extends AbstractDataSetPreview<CsvValueDataSet>
|
||||
{
|
||||
private String value;
|
||||
|
||||
public CsvValueDataSetPreview()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
public CsvValueDataSetPreview(String value)
|
||||
{
|
||||
super();
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
public String getValue()
|
||||
{
|
||||
return value;
|
||||
}
|
||||
|
||||
public void setValue(String value)
|
||||
{
|
||||
this.value = value;
|
||||
}
|
||||
}
|
||||
|
||||
public static class CsvFileDataSetEntityPreview extends AbstractDataSetPreview<CsvFileDataSetEntity>
|
||||
{
|
||||
private String originalFileName;
|
||||
|
||||
public CsvFileDataSetEntityPreview()
|
||||
{
|
||||
super();
|
||||
}
|
||||
|
||||
public String getOriginalFileName()
|
||||
{
|
||||
return originalFileName;
|
||||
}
|
||||
|
||||
public void setOriginalFileName(String originalFileName)
|
||||
{
|
||||
this.originalFileName = originalFileName;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ResolveSqlParam
|
||||
{
|
||||
private String sql;
|
||||
|
|
|
@ -605,7 +605,7 @@ dataSet.name=\u540D\u79F0
|
|||
dataSet.dataSetType=\u7C7B\u578B
|
||||
dataSet.dataSetType.SQL=SQL
|
||||
dataSet.dataSetType.Excel=Excel
|
||||
dataSet.dataSetType.Csv=CSV
|
||||
dataSet.dataSetType.CsvValue=CSV
|
||||
dataSet.dataSetType.CsvFile=CSV\u6587\u4EF6
|
||||
dataSet.dataSetType.JsonValue=JSON
|
||||
dataSet.dataSetType.JsonFile=JSON\u6587\u4EF6
|
||||
|
@ -616,6 +616,9 @@ dataSet.json=JSON\u6587\u672C
|
|||
dataSet.jsonFile=JSON\u6587\u4EF6
|
||||
dataSet.jsonFileEncoding=JSON\u6587\u4EF6\u7F16\u7801
|
||||
dataSet.excelFile=Excel\u6587\u4EF6
|
||||
dataSet.csv=CSV\u6587\u672C
|
||||
dataSet.csvFile=CSV\u6587\u4EF6
|
||||
dataSet.csvFileEncoding=CSV\u6587\u4EF6\u7F16\u7801
|
||||
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
|
||||
|
@ -627,6 +630,10 @@ dataSet.excel.dataRowExp.desc=\u6570\u636E\u884C\u8303\u56F4\uFF08\u9664\u540D\u
|
|||
dataSet.excel.dataColumnExp=\u6570\u636E\u5217\u8303\u56F4
|
||||
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.csv.nameRow=\u6807\u9898\u884C\u53F7
|
||||
dataSet.csv.nameRow.desc=\u6807\u9898\u884C\u7684\u884C\u53F7\uFF0C\u5C06\u88AB\u89E3\u6790\u4E3A\u6570\u636E\u96C6\u5C5E\u6027\u800C\u975E\u6570\u636E
|
||||
dataSet.csv.nameRow.none=\u65E0
|
||||
dataSet.csv.nameRow.assign=\u6307\u5B9A
|
||||
dataSet.createUser=\u521B\u5EFA\u7528\u6237
|
||||
dataSet.createTime=\u521B\u5EFA\u65F6\u95F4
|
||||
dataSet.param=\u53C2\u6570
|
||||
|
|
|
@ -2235,7 +2235,7 @@ table.dataTable tbody tr td select{
|
|||
.page-form-dataSet .form-foot-placeholder{
|
||||
height: 2.5em;
|
||||
}
|
||||
.page-form-dataSet-jsonFile .encoding-selectmenu-menu .ui-menu{
|
||||
.page-form-dataSet .encoding-selectmenu-menu .ui-menu{
|
||||
height: 10em;
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,233 @@
|
|||
<#include "../../include/import_global.ftl">
|
||||
<#include "../../include/html_doctype.ftl">
|
||||
<#--
|
||||
titleMessageKey 标题标签I18N关键字,不允许null
|
||||
formAction 表单提交action,允许为null
|
||||
readonly 是否只读操作,允许为null
|
||||
-->
|
||||
<#assign formAction=(formAction!'#')>
|
||||
<#assign readonly=(readonly!false)>
|
||||
<#assign isAdd=(formAction == 'saveAdd')>
|
||||
<html>
|
||||
<head>
|
||||
<#include "../../include/html_head.ftl">
|
||||
<title><#include "../../include/html_title_app_name.ftl">
|
||||
<@spring.message code='${titleMessageKey}' /> - <@spring.message code='dataSet.dataSetType.CsvFile' />
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="${pageId}" class="page-form page-form-dataSet page-form-dataSet-CsvFile">
|
||||
<form id="${pageId}-form" action="#" method="POST">
|
||||
<div class="form-head"></div>
|
||||
<div class="form-content">
|
||||
<#include "include/dataSet_form_html_name.ftl">
|
||||
<div class="workspace">
|
||||
<div class="form-item">
|
||||
<div class="form-item-label">
|
||||
<label><@spring.message code='dataSet.csvFile' /></label>
|
||||
</div>
|
||||
<div class="form-item-value">
|
||||
<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" />
|
||||
<#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>
|
||||
<div class="upload-file-info"></div>
|
||||
</div>
|
||||
</#if>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item form-item-encoding">
|
||||
<div class="form-item-label">
|
||||
<label><@spring.message code='dataSet.csvFileEncoding' /></label>
|
||||
</div>
|
||||
<div class="form-item-value">
|
||||
<select name="encoding">
|
||||
<#list availableCharsetNames as item>
|
||||
<option value="${item}" <#if item == dataSet.encoding>selected="selected"</#if>>${item}</option>
|
||||
</#list>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<div class="form-item-label">
|
||||
<label title="<@spring.message code='dataSet.csv.nameRow.desc' />">
|
||||
<@spring.message code='dataSet.csv.nameRow' />
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-item-value">
|
||||
<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.csv.nameRow.none' />
|
||||
</label>
|
||||
<input type="radio" id="${pageId}-nameRow_0" name="nameRowRadio" value="0" />
|
||||
<label for="${pageId}-nameRow_1">
|
||||
<@spring.message code='dataSet.csv.nameRow.assign' />
|
||||
</label>
|
||||
<input type="radio" id="${pageId}-nameRow_1" name="nameRowRadio" value="1" />
|
||||
</span>
|
||||
|
||||
<input type="text" name="nameRowText" value="${(dataSet.nameRow)!''?html}" class="ui-widget ui-widget-content" style="width:4.1em;" />
|
||||
</div>
|
||||
</div>
|
||||
<#include "include/dataSet_form_html_wow.ftl" >
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-foot" style="text-align:center;">
|
||||
<#if !readonly>
|
||||
<input type="submit" value="<@spring.message code='save' />" class="recommended" />
|
||||
|
||||
<input type="reset" value="<@spring.message code='reset' />" />
|
||||
<#else>
|
||||
<div class="form-foot-placeholder"> </div>
|
||||
</#if>
|
||||
</div>
|
||||
</form>
|
||||
<#include "include/dataSet_form_html_preview_pvp.ftl" >
|
||||
</div>
|
||||
<#include "../../include/page_js_obj.ftl" >
|
||||
<#include "../../include/page_obj_form.ftl">
|
||||
<#include "include/dataSet_form_js.ftl">
|
||||
<#include "include/dataSet_form_js_nameRow.ftl">
|
||||
<script type="text/javascript">
|
||||
(function(po)
|
||||
{
|
||||
po.dataSetProperties = <@writeJson var=dataSetProperties />;
|
||||
po.dataSetParams = <@writeJson var=dataSetParams />;
|
||||
|
||||
$.initButtons(po.element());
|
||||
po.element("select[name='encoding']").selectmenu({ appendTo : po.element(), classes : { "ui-selectmenu-menu" : "encoding-selectmenu-menu" } });
|
||||
po.element(".nameRow-radios").controlgroup();
|
||||
po.initWorkspaceHeight();
|
||||
po.initWorkspaceTabs(true);
|
||||
po.initDataSetPropertiesTable(po.dataSetProperties);
|
||||
po.initDataSetParamsTable(po.dataSetParams);
|
||||
po.initPreviewParamValuePanel();
|
||||
po.initNameRowOperation(${(dataSet.nameRow)!"1"});
|
||||
|
||||
po.updatePreviewOptionsData = function()
|
||||
{
|
||||
var dataSet = po.previewOptions.data.dataSet;
|
||||
|
||||
dataSet.fileName = po.element("input[name='fileName']").val();
|
||||
dataSet.encoding = po.element("select[name='encoding']").val();
|
||||
dataSet.nameRow = po.nameRowValue();
|
||||
|
||||
po.previewOptions.data.originalFileName = po.element("#${pageId}-originalFileName").val();
|
||||
};
|
||||
|
||||
<#if formAction != 'saveAddForCsvFile'>
|
||||
//编辑、查看操作应初始化为已完成预览的状态
|
||||
po.updatePreviewOptionsData();
|
||||
po.previewSuccess(true);
|
||||
</#if>
|
||||
|
||||
po.isPreviewValueModified = function()
|
||||
{
|
||||
var fileName = po.element("input[name='fileName']").val();
|
||||
var encoding = po.element("select[name='encoding']").val();
|
||||
var nameRow = po.nameRowValue();
|
||||
|
||||
var pd = po.previewOptions.data.dataSet;
|
||||
|
||||
return (pd.fileName != fileName) || (pd.encoding != encoding)
|
||||
|| (pd.nameRow != nameRow) ;
|
||||
};
|
||||
|
||||
po.previewOptions.url = po.url("previewCsvFile");
|
||||
po.previewOptions.beforePreview = function()
|
||||
{
|
||||
po.updatePreviewOptionsData();
|
||||
|
||||
if(!this.data.dataSet.fileName)
|
||||
return false;
|
||||
};
|
||||
po.previewOptions.beforeRefresh = function()
|
||||
{
|
||||
if(!this.data.dataSet.fileName)
|
||||
return false;
|
||||
};
|
||||
|
||||
po.initPreviewOperations();
|
||||
|
||||
po.fileUploadInfo = function(){ return this.element(".upload-file-info"); };
|
||||
|
||||
po.element(".fileinput-button").fileupload(
|
||||
{
|
||||
url : po.url("uploadFile"),
|
||||
paramName : "file",
|
||||
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);
|
||||
}
|
||||
})
|
||||
.bind('fileuploadadd', function (e, data)
|
||||
{
|
||||
po.element("input[name='displayName']").val("");
|
||||
$.fileuploadaddHandlerForUploadInfo(e, data, po.fileUploadInfo());
|
||||
})
|
||||
.bind('fileuploadprogressall', function (e, data)
|
||||
{
|
||||
$.fileuploadprogressallHandlerForUploadInfo(e, data, po.fileUploadInfo());
|
||||
});
|
||||
|
||||
$.validator.addMethod("dataSetCsvFilePreviewRequired", function(value, element)
|
||||
{
|
||||
return !po.isPreviewValueModified() && po.previewSuccess();
|
||||
});
|
||||
|
||||
po.form().validate(
|
||||
{
|
||||
ignore : "",
|
||||
rules :
|
||||
{
|
||||
"name" : "required",
|
||||
"displayName" : {"required": true, "dataSetCsvFilePreviewRequired": true, "dataSetPropertiesRequired": true},
|
||||
"nameRowText": {"integer": true, "min": 1},
|
||||
},
|
||||
messages :
|
||||
{
|
||||
"name" : "<@spring.message code='validation.required' />",
|
||||
"displayName" :
|
||||
{
|
||||
"required": "<@spring.message code='validation.required' />",
|
||||
"dataSetCsvFilePreviewRequired": "<@spring.message code='dataSet.validation.previewRequired' />",
|
||||
"dataSetPropertiesRequired": "<@spring.message code='dataSet.validation.propertiesRequired' />"
|
||||
},
|
||||
"nameRowText":
|
||||
{
|
||||
"integer": "<@spring.message code='validation.integer' />",
|
||||
"min": "<@spring.message code='validation.min' />"
|
||||
}
|
||||
},
|
||||
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();
|
||||
|
||||
$.postJson("${contextPath}/analysis/dataSet/${formAction}?originalFileName="+originalFileName, formData,
|
||||
function(response)
|
||||
{
|
||||
po.pageParamCallAfterSave(true, response.data);
|
||||
});
|
||||
},
|
||||
errorPlacement : function(error, element)
|
||||
{
|
||||
error.appendTo(element.closest(".form-item-value"));
|
||||
}
|
||||
});
|
||||
})
|
||||
(${pageId});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,204 @@
|
|||
<#include "../../include/import_global.ftl">
|
||||
<#include "../../include/html_doctype.ftl">
|
||||
<#--
|
||||
titleMessageKey 标题标签I18N关键字,不允许null
|
||||
formAction 表单提交action,允许为null
|
||||
readonly 是否只读操作,允许为null
|
||||
-->
|
||||
<#assign formAction=(formAction!'#')>
|
||||
<#assign readonly=(readonly!false)>
|
||||
<#assign isAdd=(formAction == 'saveAdd')>
|
||||
<html>
|
||||
<head>
|
||||
<#include "../../include/html_head.ftl">
|
||||
<title><#include "../../include/html_title_app_name.ftl">
|
||||
<@spring.message code='${titleMessageKey}' /> - <@spring.message code='dataSet.dataSetType.CsvValue' />
|
||||
</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="${pageId}" class="page-form page-form-dataSet">
|
||||
<form id="${pageId}-form" action="#" method="POST">
|
||||
<div class="form-head"></div>
|
||||
<div class="form-content">
|
||||
<#include "include/dataSet_form_html_name.ftl">
|
||||
<div class="workspace">
|
||||
<div class="form-item">
|
||||
<div class="form-item-label">
|
||||
<label><@spring.message code='dataSet.csv' /></label>
|
||||
</div>
|
||||
<div class="form-item-value">
|
||||
<textarea name="value" class="ui-widget ui-widget-content" style="display:none;">${(dataSet.value)!''?html}</textarea>
|
||||
<div class="workspace-editor-wrapper ui-widget ui-widget-content">
|
||||
<div id="${pageId}-workspaceEditor" class="workspace-editor"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<#include "include/dataSet_form_html_wow.ftl" >
|
||||
</div>
|
||||
<div class="form-item">
|
||||
<div class="form-item-label">
|
||||
<label title="<@spring.message code='dataSet.csv.nameRow.desc' />">
|
||||
<@spring.message code='dataSet.csv.nameRow' />
|
||||
</label>
|
||||
</div>
|
||||
<div class="form-item-value">
|
||||
<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.csv.nameRow.none' />
|
||||
</label>
|
||||
<input type="radio" id="${pageId}-nameRow_0" name="nameRowRadio" value="0" />
|
||||
<label for="${pageId}-nameRow_1">
|
||||
<@spring.message code='dataSet.csv.nameRow.assign' />
|
||||
</label>
|
||||
<input type="radio" id="${pageId}-nameRow_1" name="nameRowRadio" value="1" />
|
||||
</span>
|
||||
|
||||
<input type="text" name="nameRowText" value="${(dataSet.nameRow)!''?html}" class="ui-widget ui-widget-content" style="width:4.1em;" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-foot" style="text-align:center;">
|
||||
<#if !readonly>
|
||||
<input type="submit" value="<@spring.message code='save' />" class="recommended" />
|
||||
|
||||
<input type="reset" value="<@spring.message code='reset' />" />
|
||||
<#else>
|
||||
<div class="form-foot-placeholder"> </div>
|
||||
</#if>
|
||||
</div>
|
||||
</form>
|
||||
<#include "include/dataSet_form_html_preview_pvp.ftl" >
|
||||
</div>
|
||||
<#include "../../include/page_js_obj.ftl" >
|
||||
<#include "../../include/page_obj_form.ftl">
|
||||
<#include "include/dataSet_form_js.ftl">
|
||||
<#include "include/dataSet_form_js_nameRow.ftl">
|
||||
<script type="text/javascript">
|
||||
(function(po)
|
||||
{
|
||||
po.dataSetProperties = <@writeJson var=dataSetProperties />;
|
||||
po.dataSetParams = <@writeJson var=dataSetParams />;
|
||||
|
||||
$.initButtons(po.element());
|
||||
po.element(".nameRow-radios").controlgroup();
|
||||
po.initWorkspaceHeight();
|
||||
|
||||
po.csvEditor = ace.edit("${pageId}-workspaceEditor");
|
||||
po.csvEditor.setShowPrintMargin(false);
|
||||
|
||||
po.initWorkspaceEditor(po.csvEditor, po.element("textarea[name='value']").val());
|
||||
po.initWorkspaceTabs();
|
||||
po.getAddPropertyName = function()
|
||||
{
|
||||
var selectionRange = po.csvEditor.getSelectionRange();
|
||||
return (po.csvEditor.session.getTextRange(selectionRange) || "");
|
||||
};
|
||||
po.initDataSetPropertiesTable(po.dataSetProperties);
|
||||
po.initDataSetParamsTable(po.dataSetParams);
|
||||
po.initPreviewParamValuePanel();
|
||||
po.initNameRowOperation(${(dataSet.nameRow)!"1"});
|
||||
|
||||
po.updatePreviewOptionsData = function()
|
||||
{
|
||||
var value = po.csvEditor.getValue();
|
||||
|
||||
var dataSet = po.previewOptions.data.dataSet;
|
||||
|
||||
dataSet.value = value;
|
||||
dataSet.nameRow = po.nameRowValue();
|
||||
};
|
||||
|
||||
<#if formAction != 'saveAddForCsvValue'>
|
||||
//编辑、查看操作应初始化为已完成预览的状态
|
||||
po.updatePreviewOptionsData();
|
||||
po.previewSuccess(true);
|
||||
</#if>
|
||||
|
||||
po.isPreviewValueModified = function()
|
||||
{
|
||||
var value = po.csvEditor.getValue();
|
||||
var nameRow = po.nameRowValue();
|
||||
|
||||
var pd = po.previewOptions.data.dataSet;
|
||||
|
||||
return (pd.value != value) || (pd.nameRow != nameRow);
|
||||
};
|
||||
|
||||
po.previewOptions.url = po.url("previewCsvValue");
|
||||
po.previewOptions.beforePreview = function()
|
||||
{
|
||||
po.updatePreviewOptionsData();
|
||||
|
||||
if(!this.data.dataSet.value)
|
||||
return false;
|
||||
};
|
||||
po.previewOptions.beforeRefresh = function()
|
||||
{
|
||||
if(!this.data.dataSet.value)
|
||||
return false;
|
||||
};
|
||||
|
||||
po.initPreviewOperations();
|
||||
|
||||
$.validator.addMethod("dataSetCsvValueRequired", function(value, element)
|
||||
{
|
||||
var value = po.csvEditor.getValue();
|
||||
return value.length > 0;
|
||||
});
|
||||
|
||||
$.validator.addMethod("dataSetCsvValuePreviewRequired", function(value, element)
|
||||
{
|
||||
return !po.isPreviewValueModified() && po.previewSuccess();
|
||||
});
|
||||
|
||||
po.form().validate(
|
||||
{
|
||||
ignore : "",
|
||||
rules :
|
||||
{
|
||||
"name" : "required",
|
||||
"value" : {"dataSetCsvValueRequired": true, "dataSetCsvValuePreviewRequired": true, "dataSetPropertiesRequired": true},
|
||||
"nameRowText": {"integer": true, "min": 1},
|
||||
},
|
||||
messages :
|
||||
{
|
||||
"name" : "<@spring.message code='validation.required' />",
|
||||
"value" :
|
||||
{
|
||||
"dataSetCsvValueRequired": "<@spring.message code='validation.required' />",
|
||||
"dataSetCsvValuePreviewRequired": "<@spring.message code='dataSet.validation.previewRequired' />",
|
||||
"dataSetPropertiesRequired": "<@spring.message code='dataSet.validation.propertiesRequired' />"
|
||||
},
|
||||
"nameRowText":
|
||||
{
|
||||
"integer": "<@spring.message code='validation.integer' />",
|
||||
"min": "<@spring.message code='validation.min' />"
|
||||
}
|
||||
},
|
||||
submitHandler : function(form)
|
||||
{
|
||||
var formData = $.formToJson(form);
|
||||
formData["properties"] = po.getFormDataSetProperties();
|
||||
formData["params"] = po.getFormDataSetParams();
|
||||
formData["value"] = po.csvEditor.getValue();
|
||||
formData["nameRow"] = po.nameRowValue();
|
||||
formData["nameRowRadio"] = undefined;
|
||||
formData["nameRowText"] = undefined;
|
||||
|
||||
$.postJson("${contextPath}/analysis/dataSet/${formAction}", formData,
|
||||
function(response)
|
||||
{
|
||||
po.pageParamCallAfterSave(true, response.data);
|
||||
});
|
||||
},
|
||||
errorPlacement : function(error, element)
|
||||
{
|
||||
error.appendTo(element.closest(".form-item-value"));
|
||||
}
|
||||
});
|
||||
})
|
||||
(${pageId});
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
|
@ -121,6 +121,7 @@ readonly 是否只读操作,允许为null
|
|||
<#include "../../include/page_js_obj.ftl" >
|
||||
<#include "../../include/page_obj_form.ftl">
|
||||
<#include "include/dataSet_form_js.ftl">
|
||||
<#include "include/dataSet_form_js_nameRow.ftl">
|
||||
<script type="text/javascript">
|
||||
(function(po)
|
||||
{
|
||||
|
@ -132,56 +133,11 @@ readonly 是否只读操作,允许为null
|
|||
po.element("#${pageId}-forceXls").buttonset();
|
||||
po.element("#${pageId}-forceXls-${((dataSet.forceXls)!true)?string('true', 'false')}").click();
|
||||
po.initWorkspaceHeight();
|
||||
po.initWorkspaceTabs();
|
||||
po.initWorkspaceTabs(true);
|
||||
po.initDataSetPropertiesTable(po.dataSetProperties);
|
||||
po.initDataSetParamsTable(po.dataSetParams);
|
||||
po.initPreviewParamValuePanel();
|
||||
|
||||
po.element("input[name='nameRowRadio']").on("change", function()
|
||||
{
|
||||
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)
|
||||
{
|
||||
var radioVal = po.element("input[name='nameRowRadio']:checked").val();
|
||||
|
||||
if(radioVal == "0")
|
||||
return $nameRow.val();
|
||||
else
|
||||
return $nameRowText.val();
|
||||
}
|
||||
else
|
||||
{
|
||||
$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.initNameRowOperation(${(dataSet.nameRow)!"1"});
|
||||
|
||||
po.updatePreviewOptionsData = function()
|
||||
{
|
||||
|
|
|
@ -77,7 +77,7 @@ 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.initWorkspaceTabs(true);
|
||||
po.initDataSetPropertiesTable(po.dataSetProperties);
|
||||
po.initDataSetParamsTable(po.dataSetParams);
|
||||
po.initPreviewParamValuePanel();
|
||||
|
|
|
@ -40,7 +40,7 @@ boolean readonly 是否只读操作,默认为false
|
|||
<ul class="add-button-list">
|
||||
<li addURL="addForSql"><div><@spring.message code='dataSet.dataSetType.SQL' /></div></li>
|
||||
<li addURL="addForExcel"><div><@spring.message code='dataSet.dataSetType.Excel' /></div></li>
|
||||
<li addURL="addForCsv"><div><@spring.message code='dataSet.dataSetType.Csv' /></div></li>
|
||||
<li addURL="addForCsvValue"><div><@spring.message code='dataSet.dataSetType.CsvValue' /></div></li>
|
||||
<li addURL="addForCsvFile"><div><@spring.message code='dataSet.dataSetType.CsvFile' /></div></li>
|
||||
<li addURL="addForJsonValue"><div><@spring.message code='dataSet.dataSetType.JsonValue' /></div></li>
|
||||
<li addURL="addForJsonFile"><div><@spring.message code='dataSet.dataSetType.JsonFile' /></div></li>
|
||||
|
@ -195,8 +195,8 @@ boolean readonly 是否只读操作,默认为false
|
|||
return "<@spring.message code='dataSet.dataSetType.SQL' />";
|
||||
else if("${DataSetEntity.DATA_SET_TYPE_Excel}" == data)
|
||||
return "<@spring.message code='dataSet.dataSetType.Excel' />";
|
||||
else if("${DataSetEntity.DATA_SET_TYPE_Csv}" == data)
|
||||
return "<@spring.message code='dataSet.dataSetType.Csv' />";
|
||||
else if("${DataSetEntity.DATA_SET_TYPE_CsvValue}" == data)
|
||||
return "<@spring.message code='dataSet.dataSetType.CsvValue' />";
|
||||
else if("${DataSetEntity.DATA_SET_TYPE_CsvFile}" == data)
|
||||
return "<@spring.message code='dataSet.dataSetType.CsvFile' />";
|
||||
else if("${DataSetEntity.DATA_SET_TYPE_JsonValue}" == data)
|
||||
|
|
|
@ -106,8 +106,10 @@ po.previewOptions.url = "...";
|
|||
</#if>
|
||||
};
|
||||
|
||||
po.initWorkspaceTabs = function()
|
||||
po.initWorkspaceTabs = function(disableParams)
|
||||
{
|
||||
disableParams = (disableParams == true ? true : false);
|
||||
|
||||
po.element(".workspace-operation-wrapper").tabs(
|
||||
{
|
||||
activate: function(event, ui)
|
||||
|
@ -132,8 +134,14 @@ po.previewOptions.url = "...";
|
|||
}
|
||||
}
|
||||
});
|
||||
|
||||
if(disableParams)
|
||||
{
|
||||
var paramsIndex = $(".workspace-operation-nav .operation-params", po.element(".workspace-operation-wrapper")).index();
|
||||
po.element(".workspace-operation-wrapper").tabs("disable", paramsIndex);
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//获取用于添加数据集属性的名
|
||||
po.getAddPropertyName = function()
|
||||
{
|
||||
|
|
|
@ -0,0 +1,70 @@
|
|||
<#--
|
||||
数据集表单页:标题行操作JS片段
|
||||
|
||||
依赖:
|
||||
page_js_obj.ftl
|
||||
|
||||
变量:
|
||||
-->
|
||||
<script type="text/javascript">
|
||||
(function(po)
|
||||
{
|
||||
po.initNameRowOperation = function(initValue, noneValue, minAssignValue)
|
||||
{
|
||||
if(initValue == null)
|
||||
initValue = 1;
|
||||
if(noneValue == null)
|
||||
noneValue = 0;
|
||||
if(minAssignValue == null)
|
||||
minAssignValue = 1;
|
||||
|
||||
po.element("input[name='nameRowRadio']").on("change", function()
|
||||
{
|
||||
var radioVal = $(this).val();
|
||||
var $nameRow = po.element("input[name='nameRow']");
|
||||
var $nameRowText = po.element("input[name='nameRowText']");
|
||||
|
||||
if(radioVal == (noneValue+""))
|
||||
{
|
||||
$nameRow.val(noneValue+"");
|
||||
$nameRowText.hide();
|
||||
}
|
||||
else
|
||||
{
|
||||
var myVal = parseInt($nameRowText.val());
|
||||
if(!myVal || myVal < minAssignValue)
|
||||
$nameRowText.val(minAssignValue+"");
|
||||
|
||||
$nameRowText.show();
|
||||
}
|
||||
});
|
||||
|
||||
po.nameRowValue = function(value)
|
||||
{
|
||||
var $nameRow = po.element("input[name='nameRow']");
|
||||
var $nameRowText = po.element("input[name='nameRowText']");
|
||||
|
||||
if(value === undefined)
|
||||
{
|
||||
var radioVal = po.element("input[name='nameRowRadio']:checked").val();
|
||||
|
||||
if(radioVal == (noneValue+""))
|
||||
return $nameRow.val();
|
||||
else
|
||||
return $nameRowText.val();
|
||||
}
|
||||
else
|
||||
{
|
||||
$nameRow.val(value);
|
||||
$nameRowText.val(value);
|
||||
|
||||
po.element("input[name='nameRowRadio'][value='"+(value >= minAssignValue ? minAssignValue : noneValue)+"']")
|
||||
.attr("checked", "checked").change();
|
||||
}
|
||||
};
|
||||
|
||||
po.nameRowValue(initValue);
|
||||
};
|
||||
})
|
||||
(${pageId});
|
||||
</script>
|
Loading…
Reference in New Issue