From a59120d1552f9ccdbf5010230d7e0e917e473faf Mon Sep 17 00:00:00 2001 From: datagear Date: Sun, 13 Jan 2019 21:39:22 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=A1=A8=E6=A0=BC=EF=BC=9A?= =?UTF-8?q?=E5=AE=8C=E5=96=84serverSide=E6=A8=A1=E5=BC=8F=E7=BC=96?= =?UTF-8?q?=E8=BE=91=E6=95=B0=E6=8D=AE=E4=BF=9D=E5=AD=98=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/DataController.java | 89 +++++++++++ .../include/data_page_obj_edit_grid_js.jsp | 146 +++++++++++++++--- 2 files changed, 212 insertions(+), 23 deletions(-) diff --git a/datagear-web/src/main/java/org/datagear/web/controller/DataController.java b/datagear-web/src/main/java/org/datagear/web/controller/DataController.java index ad3301c8..f2ad24e3 100644 --- a/datagear-web/src/main/java/org/datagear/web/controller/DataController.java +++ b/datagear-web/src/main/java/org/datagear/web/controller/DataController.java @@ -14,8 +14,10 @@ import java.io.OutputStream; import java.io.Serializable; import java.sql.Connection; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -563,6 +565,93 @@ public class DataController extends AbstractSchemaModelController return "/data/data_form"; } + @RequestMapping(value = "/{schemaId}/{tableName}/saveEditCell", produces = CONTENT_TYPE_JSON) + @ResponseBody + public ResponseEntity saveEditCell(HttpServletRequest request, HttpServletResponse response, + org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId, + @PathVariable("tableName") String tableName) throws Throwable + { + final Object updateDatasParam = getParamMap(request, "updateDatas"); + final Object updatePropertyNamessParam = getParamMap(request, "updatePropertyNamess"); + final Object updatePropertyValuessParam = getParamMap(request, "updatePropertyValuess"); + final Object addDatasParam = getParamMap(request, "addDatas"); + final Object deleteDatasParam = getParamMap(request, "deleteDatas"); + + final String[][] updatePropertyNamess = (updateDatasParam == null ? null + : getClassDataConverter().convertToArray(updatePropertyNamessParam, String[].class)); + + final Object[][] updatePropertyValueParamss = (updateDatasParam == null ? null + : getClassDataConverter().convertToArray(updatePropertyValuessParam, Object[].class)); + + ResponseEntity responseEntity = new ReturnExecutor>(request, + response, springModel, schemaId, tableName, false) + { + @Override + protected ResponseEntity execute(HttpServletRequest request, HttpServletResponse response, + org.springframework.ui.Model springModel, Schema schema, Model model) throws Throwable + { + Object[] updateDatas = modelDataConverter.convertToArray(updateDatasParam, model); + PropertyPathInfo[][] updatePropertyPathInfoss = null; + Object[][] updatePropertyValuess = null; + + if (updateDatas != null && updateDatas.length > 0) + { + updatePropertyPathInfoss = new PropertyPathInfo[updatePropertyNamess.length][]; + updatePropertyValuess = new Object[updatePropertyNamess.length][]; + + for (int i = 0; i < updateDatas.length; i++) + { + String[] updatePropertyNames = updatePropertyNamess[i]; + Object[] updatePropertyValueParams = updatePropertyValueParamss[i]; + + PropertyPathInfo[] updatePropertyPathInfos = new PropertyPathInfo[updatePropertyNames.length]; + Object[] updatePropertyValues = new Object[updatePropertyNames.length]; + + for (int j = 0; j < updatePropertyNames.length; j++) + { + updatePropertyPathInfos[j] = ModelUtils.toPropertyPathInfoConcrete(model, + PropertyPath.valueOf(updatePropertyNames[j]), updateDatas[i]); + + Property tailProperty = updatePropertyPathInfos[j].getPropertyTail(); + Model tailModel = updatePropertyPathInfos[j].getModelTail(); + + if (tailProperty.isArray()) + updatePropertyValues[j] = modelDataConverter + .convertToArray(updatePropertyValueParams[j], tailModel); + else if (tailProperty.isCollection()) + updatePropertyValues[j] = modelDataConverter.convertToCollection( + updatePropertyValueParams[j], tailModel, tailProperty.getCollectionType()); + else + updatePropertyValues[j] = modelDataConverter.convert(updatePropertyValueParams[j], + tailModel); + } + + updatePropertyPathInfoss[i] = updatePropertyPathInfos; + updatePropertyValuess[i] = updatePropertyValues; + } + } + + Object[] addDatas = modelDataConverter.convertToArray(addDatasParam, model); + Object[] deleteDatas = modelDataConverter.convertToArray(deleteDatasParam, model); + + // TODO 保存 + + ResponseEntity responseEntity = buildOperationMessageSaveSuccessResponseEntity( + request); + + Map responseDatas = new HashMap(); + responseDatas.put("updatePropertyValuess", updatePropertyValuess); + responseDatas.put("addDatas", addDatas); + + responseEntity.getBody().setData(responseDatas); + + return responseEntity; + } + }.execute(); + + return responseEntity; + } + @RequestMapping("/{schemaId}/{tableName}/selectPropValue") public String selectPropValue(HttpServletRequest request, HttpServletResponse response, org.springframework.ui.Model springModel, @PathVariable("schemaId") String schemaId, diff --git a/datagear-web/src/main/webapp/WEB-INF/jsp/data/include/data_page_obj_edit_grid_js.jsp b/datagear-web/src/main/webapp/WEB-INF/jsp/data/include/data_page_obj_edit_grid_js.jsp index f0e55ba7..5e3876b0 100644 --- a/datagear-web/src/main/webapp/WEB-INF/jsp/data/include/data_page_obj_edit_grid_js.jsp +++ b/datagear-web/src/main/webapp/WEB-INF/jsp/data/include/data_page_obj_edit_grid_js.jsp @@ -874,14 +874,7 @@ WebUtils.setPageId(request, gridPageId); //恢复表格数据为初始值 po.restoreEditCell = function(editDataTable, editCells, addRows, deleteRows, confirmCount, confirmCallback, cancelCallback) { - var count = 0; - - if(editCells) - count += editCells.indexes().length; - if(addRows) - count += addRows.indexes().length; - if(deleteRows) - count += deleteRows.indexes().length; + var count = po.getEditCellCount(editDataTable, editCells, addRows, deleteRows); var _confirmCallback = function() { @@ -970,14 +963,7 @@ WebUtils.setPageId(request, gridPageId); var addRows = editDataTable.rows(".add-row"); var deleteRows = editDataTable.rows(".delete-row"); - var count = 0; - - if(modifiedCells) - count += modifiedCells.indexes().length; - if(addRows) - count += addRows.indexes().length; - if(deleteRows) - count += deleteRows.indexes().length; + var count = po.getEditCellCount(editDataTable, modifiedCells, addRows, deleteRows); if(count <= 0) return; @@ -1009,14 +995,14 @@ WebUtils.setPageId(request, gridPageId); dataTable.draw(); - po.clearEditGrid(editDataTable, modifiedCells, addRows, deleteRows); + po.clearEditGrid(editDataTable, modifiedCells, null, addRows, null, deleteRows); po.afterSaveClientEditCell(editDataTable, editTableDatas); } else { - po.clearEditGrid(editDataTable, modifiedCells, addRows, deleteRows); - po.afterSaveServerSideEditCell(editDataTable, modifiedCells, addRows, deleteRows); + var ajaxOptions = po.buildAjaxSaveEditCellOptions(editDataTable, modifiedCells, addRows, deleteRows); + $.ajax(ajaxOptions); } }; @@ -1037,17 +1023,127 @@ WebUtils.setPageId(request, gridPageId); _confirmCallback(); }; - //将表格中的编辑单元格、添加行置为已保存,删除标记为删除的行 - po.clearEditGrid = function(editDataTable, modifiedCells, addRows, deleteRows) + po.buildAjaxSaveEditCellOptions = function(editDataTable, modifiedCells, addRows, deleteRows) { - modifiedCells.every(function(index) + var updateDatas = []; + var updatePropertyNamess = []; + var updatePropertyValuess = []; + var addDatas = $.makeArray(addRows.data()); + var deleteDatas = []; + + var modifiedRowIndexesMap = $.getDataTableRowIndexesMap(modifiedCells.indexes()); + var editDataTableSettings = editDataTable.settings(); + for(var rowIndex in modifiedRowIndexesMap) { + var myModifiedCellIndexes = modifiedRowIndexesMap[rowIndex]; + + if(!myModifiedCellIndexes || myModifiedCellIndexes.length < 1) + continue; + + var row = editDataTable.row(rowIndex); + var $row = $(row.node()); + + if($row.hasClass("add-row") || $row.hasClass("delete-row")) + continue; + + updateDatas.push(po.originalRowData(editDataTable, rowIndex)); + + var updatePropertyNames = []; + var updatePropertyValues = []; + + for(var i = 0; i