diff --git a/@rbv b/@rbv index 653879f9b..64bee3bc9 160000 --- a/@rbv +++ b/@rbv @@ -1 +1 @@ -Subproject commit 653879f9b8c8cc59876618091fa14265edf7ece8 +Subproject commit 64bee3bc986073e62a4d3ee6c94bd3d3d4231e1c diff --git a/src/main/java/com/rebuild/core/service/dashboard/charts/TableChart.java b/src/main/java/com/rebuild/core/service/dashboard/charts/TableChart.java index 336ac3f9d..f95354b91 100644 --- a/src/main/java/com/rebuild/core/service/dashboard/charts/TableChart.java +++ b/src/main/java/com/rebuild/core/service/dashboard/charts/TableChart.java @@ -17,6 +17,7 @@ import org.apache.commons.lang.StringUtils; import org.apache.commons.lang3.ArrayUtils; import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.MessageFormat; import java.util.ArrayList; import java.util.List; @@ -99,12 +100,36 @@ public class TableChart extends ChartData { sumsRow[i] = dataRaw.length; } } - for (int i = numericalIndexStart; i < colLength; i++) { - BigDecimal sum = new BigDecimal(0); - for (Object[] row : dataRaw) { - sum = sum.add(BigDecimal.valueOf(ObjectUtils.toDouble(row[i]))); + + for (int i = numericalIndexStart, j = 0; i < colLength; i++, j++) { + final Numerical N = getNumericals()[j]; + final FormatCalc FC = N.getFormatCalc(); + + BigDecimal sums = null; + if (FC == FormatCalc.MAX) { + // 最大 + for (Object[] row : dataRaw) { + BigDecimal b = BigDecimal.valueOf(ObjectUtils.toDouble(row[i])); + if (sums == null || sums.compareTo(b) < 0) sums = b; + } + } else if (FC == FormatCalc.MIN) { + // 最小 + for (Object[] row : dataRaw) { + BigDecimal b = BigDecimal.valueOf(ObjectUtils.toDouble(row[i])); + if (sums == null || sums.compareTo(b) > 0) sums = b; + } + } else { + sums = new BigDecimal(0); + // 求和 + for (Object[] row : dataRaw) { + sums = sums.add(BigDecimal.valueOf(ObjectUtils.toDouble(row[i]))); + } + // 均值 + if (FC == FormatCalc.AVG) { + sums = sums.divide(new BigDecimal(dataRaw.length), N.getScale(), RoundingMode.HALF_UP); + } } - sumsRow[i] = sum.doubleValue(); + sumsRow[i] = sums.doubleValue(); } dataRawNew[dataRaw.length] = sumsRow; diff --git a/src/main/java/com/rebuild/core/service/files/FilesHelper.java b/src/main/java/com/rebuild/core/service/files/FilesHelper.java index e62018033..49de9ed2e 100644 --- a/src/main/java/com/rebuild/core/service/files/FilesHelper.java +++ b/src/main/java/com/rebuild/core/service/files/FilesHelper.java @@ -120,7 +120,7 @@ public class FilesHelper { o[3] = user.equals(o[3]) || UserHelper.isAdmin(user); // v3.5.1 管理员可删除 o[5] = scopeSpecUsers; JSONObject folder = JSONUtils.toJSONObject( - new String[] { "id", "text", "private", "self", "parent", "specUsers" }, o); + new String[]{"id", "text", "private", "self", "parent", "specUsers"}, o); JSONArray children = getAccessableFolders(user, (ID) o[0]); if (!children.isEmpty()) { @@ -176,14 +176,15 @@ public class FilesHelper { } /** - * 是否允许操作文件(管理员与创建人允许) + * 是否允许操作文件(管理员与创建人允许)。 + * v4.2 可访问就可修改 * * @param user * @param fileId * @return */ public static boolean isFileManageable(ID user, ID fileId) { - return UserHelper.isAdmin(user) || UserHelper.isSelf(user, fileId); + return isFileAccessable(user, fileId); } /** diff --git a/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java b/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java index b0dc25345..175948265 100644 --- a/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java +++ b/src/main/java/com/rebuild/core/service/query/AdvFilterParser.java @@ -263,7 +263,7 @@ public class AdvFilterParser extends SetUser { String field = item.getString("field"); if (field.startsWith("&")) field = field.replace("&", NAME_FIELD_PREFIX); // fix: _$unthy - final boolean hasNameFlag = field.startsWith(NAME_FIELD_PREFIX); + boolean hasNameFlag = field.startsWith(NAME_FIELD_PREFIX); if (hasNameFlag) field = field.substring(1); Field lastFieldMeta = VF_ACU.equals(field) @@ -274,6 +274,12 @@ public class AdvFilterParser extends SetUser { return null; } + String op = item.getString("op"); + // 引用字段`重复`特殊处理 + if (hasNameFlag && ParseHelper.REP.equalsIgnoreCase(op)) { + hasNameFlag = false; + } + DisplayType dt = EasyMetaFactory.getDisplayType(lastFieldMeta); if (dt == DisplayType.CLASSIFICATION || (dt == DisplayType.PICKLIST && hasNameFlag) /* 快速查询 */) { field = NAME_FIELD_PREFIX + field; @@ -295,7 +301,7 @@ public class AdvFilterParser extends SetUser { final boolean isN2NUsers = dt == DisplayType.N2NREFERENCE && lastFieldMeta.getReferenceEntity().getEntityCode() == EntityHelper.User; - String op = item.getString("op"); + // v3.9 区间兼容 if (ParseHelper.BW.equals(op)) { String valueBegin = item.getString("value"); @@ -645,9 +651,10 @@ public class AdvFilterParser extends SetUser { StringUtils.join(value.split("\\|"), "', '")); } else if (ParseHelper.REP.equalsIgnoreCase(op)) { // `in` + int count = NumberUtils.toInt(value, 1); value = MessageFormat.format( - "( select {0} from {1} group by {0} having (count({0}) > {2}) )", - field, rootEntity.getName(), String.valueOf(NumberUtils.toInt(value, 1))); + "( select {0} from {1} group by {0} having (count({0}) {2} {3}) )", + field, rootEntity.getName(), count < 1 ? "=" : ">", Math.max(count, 1)); } if (StringUtils.isBlank(value)) { diff --git a/src/main/java/com/rebuild/core/support/general/QueryParser.java b/src/main/java/com/rebuild/core/support/general/QueryParser.java index 9298b692c..cb9b7a00a 100644 --- a/src/main/java/com/rebuild/core/support/general/QueryParser.java +++ b/src/main/java/com/rebuild/core/support/general/QueryParser.java @@ -185,63 +185,48 @@ public class QueryParser { // 过滤器 - List wheres = new ArrayList<>(); + List whereAnds = new ArrayList<>(); // Default String defaultFilter = dataListBuilder == null ? null : dataListBuilder.getDefaultFilter(); if (StringUtils.isNotBlank(defaultFilter)) { - wheres.add(defaultFilter); + whereAnds.add(defaultFilter); } // append: ProtocolFilter String protocolFilter = queryExpr.getString("protocolFilter"); if (StringUtils.isNotBlank(protocolFilter)) { - ProtocolFilterParser fp = new ProtocolFilterParser(protocolFilter); - if (queryExpr.containsKey("protocolFilter__varRecord")) { - fp.setVarRecord(queryExpr.getJSONObject("protocolFilter__varRecord")); - } - String where = fp.toSqlWhere(); - - // d 强制过滤明细切换支持 - if (StringUtils.isNotBlank(where) && protocolFilter.startsWith("via:014-") && entity.getMainEntity() != null) { - ConfigBean filter = AdvFilterManager.instance.getAdvFilter(ID.valueOf(protocolFilter.split(":")[1])); - String filterEntity = ((JSONObject) filter.getJSON("filter")).getString("entity"); - Entity filterEntityMeta = MetadataHelper.getEntity(filterEntity); - // 明细使用主实体的 - Entity me = entity.getMainEntity(); - if (filterEntityMeta.equals(me)) { - Field dtmField = MetadataHelper.getDetailToMainField(entity); - where = String.format("%s in (select %sId from %s where %s)", dtmField.getName(), me.getName(), me.getName(), where); - } - } - - if (StringUtils.isNotBlank(where)) { - if (CommonsUtils.DEVLOG) System.out.println("[dev] Parse protocolFilter : " + protocolFilter + " >> " + where); - wheres.add(where); - } + String w = parseProtocolFilter(protocolFilter); + if (w != null) whereAnds.add(w); + } + // append: protocolFilterAnd + String protocolFilterAnd = queryExpr.getString("protocolFilterAnd"); + if (StringUtils.isNotBlank(protocolFilterAnd)) { + String w = parseProtocolFilter(protocolFilterAnd); + if (w != null) whereAnds.add(w); } // append: AdvFilter String advFilter = queryExpr.getString("advFilter"); if (ID.isId(advFilter)) { String where = parseAdvFilter(ID.valueOf(advFilter)); - if (StringUtils.isNotBlank(where)) wheres.add(where); + if (StringUtils.isNotBlank(where)) whereAnds.add(where); } // append: QuickQuery JSONObject quickFilter = queryExpr.getJSONObject("filter"); if (quickFilter != null) { String where = new AdvFilterParser(quickFilter, entity).toSqlWhere(); - if (StringUtils.isNotBlank(where)) wheres.add(where); + if (StringUtils.isNotBlank(where)) whereAnds.add(where); } // v3.3 JSONObject quickFilterAnd = queryExpr.getJSONObject("filterAnd"); if (quickFilterAnd != null) { String where = new AdvFilterParser(quickFilterAnd, entity).toSqlWhere(); - if (StringUtils.isNotBlank(where)) wheres.add(where); + if (StringUtils.isNotBlank(where)) whereAnds.add(where); } - final String whereClause = wheres.isEmpty() ? "1=1" : StringUtils.join(wheres.iterator(), " and "); + final String whereClause = whereAnds.isEmpty() ? "1=1" : StringUtils.join(whereAnds.iterator(), " and "); fullSql.append(" where ").append(whereClause); // v4.0-b3 分组 @@ -369,4 +354,32 @@ public class QueryParser { return String.format("select %s from %s where ", StringUtils.join(counts, ","), entity.getName()); } + + /** + * @param protocolFilter + * @return + */ + private String parseProtocolFilter(String protocolFilter) { + ProtocolFilterParser fp = new ProtocolFilterParser(protocolFilter); + if (queryExpr.containsKey("protocolFilter__varRecord")) { + fp.setVarRecord(queryExpr.getJSONObject("protocolFilter__varRecord")); + } + String where = fp.toSqlWhere(); + + // d 强制过滤明细切换支持 + if (StringUtils.isNotBlank(where) && protocolFilter.startsWith("via:014-") && entity.getMainEntity() != null) { + ConfigBean filter = AdvFilterManager.instance.getAdvFilter(ID.valueOf(protocolFilter.split(":")[1])); + String filterEntity = ((JSONObject) filter.getJSON("filter")).getString("entity"); + Entity filterEntityMeta = MetadataHelper.getEntity(filterEntity); + // 明细使用主实体的 + Entity me = entity.getMainEntity(); + if (filterEntityMeta.equals(me)) { + Field dtmField = MetadataHelper.getDetailToMainField(entity); + where = String.format("%s in (select %sId from %s where %s)", dtmField.getName(), me.getName(), me.getName(), where); + } + } + + if (CommonsUtils.DEVLOG) System.out.println("[dev] Parse protocolFilter : " + protocolFilter + " >> " + where); + return where; + } } diff --git a/src/main/java/com/rebuild/web/admin/AdminVerfiyController.java b/src/main/java/com/rebuild/web/admin/AdminVerfiyController.java index 56ed51bf0..343bbbbfc 100644 --- a/src/main/java/com/rebuild/web/admin/AdminVerfiyController.java +++ b/src/main/java/com/rebuild/web/admin/AdminVerfiyController.java @@ -129,7 +129,7 @@ public class AdminVerfiyController extends BaseController { // 日志 if ("log".equalsIgnoreCase(type)) { File logFile = SysbaseHeartbeat.getLastLogbackFile(); - FileDownloader.setDownloadHeaders(response, logFile.getName(), false); + FileDownloader.setDownloadHeaders(response, logFile.getName(), true); FileDownloader.writeLocalFile(logFile, response); return; } diff --git a/src/main/java/com/rebuild/web/commons/FilePreviewer.java b/src/main/java/com/rebuild/web/commons/FilePreviewer.java index eaeb83131..1ff838d02 100644 --- a/src/main/java/com/rebuild/web/commons/FilePreviewer.java +++ b/src/main/java/com/rebuild/web/commons/FilePreviewer.java @@ -67,7 +67,7 @@ public class FilePreviewer extends BaseController { @GetMapping("/commons/file-editor") public ModelAndView ooEditor(HttpServletRequest request, HttpServletResponse response) throws IOException { - getRequestUser(request); + getRequestUser(request); // check return ooPreviewOrEditor(request, response, true); } @@ -141,15 +141,17 @@ public class FilePreviewer extends BaseController { ModelAndView mv = createModelAndView("/common/oo-preview"); mv.getModel().put(OnlyofficeServer.name(), OnlyOffice.getOoServer()); + String fileName = ((JSONObject) ps[0]).getString("title"); + // 编辑模式 if (editor) { ooConfig.put("type", "desktop"); - mv.getModel().put("title", Language.L("文档编辑")); + mv.getModel().put("title", fileName + " - " + Language.L("文档编辑")); } else { // https://api.onlyoffice.com/docs/docs-api/usage-api/config/#type String view = StringUtils.defaultIfBlank(getParameter(request, "view"), "embedded"); ooConfig.put("type", view); - mv.getModel().put("title", Language.L("文档预览")); + mv.getModel().put("title", fileName + " - " + Language.L("文档预览")); } if (Application.devMode()) System.out.println("[dev] " + JSONUtils.prettyPrint(ooConfig)); mv.getModel().put("_DocEditorConfig", ooConfig); diff --git a/src/main/java/com/rebuild/web/commons/MetadataGetting.java b/src/main/java/com/rebuild/web/commons/MetadataGetting.java index f31933e00..d91c22b9d 100644 --- a/src/main/java/com/rebuild/web/commons/MetadataGetting.java +++ b/src/main/java/com/rebuild/web/commons/MetadataGetting.java @@ -24,6 +24,7 @@ import com.rebuild.core.metadata.easymeta.DisplayType; import com.rebuild.core.metadata.easymeta.EasyField; import com.rebuild.core.metadata.easymeta.EasyMetaFactory; import com.rebuild.core.privileges.PrivilegesManager; +import com.rebuild.core.service.general.QuickCodeReindexTask; import com.rebuild.core.service.trigger.TriggerAction; import com.rebuild.web.BaseController; import com.rebuild.web.EntityParam; @@ -61,24 +62,27 @@ public class MetadataGetting extends BaseController { for (Entity e : MetadataSorter.sortEntities(usesNopriv ? null : user, usesBizz, usesDetail)) { JSONObject item = (JSONObject) EasyMetaFactory.valueOf(e).toJSON(); item.put("name", item.getString("entity")); - item.put("label", item.getString("entityLabel")); + String L42 = item.getString("entityLabel"); + item.put("label", L42); + item.put("quickCode", QuickCodeReindexTask.generateQuickCode(L42)); res.add(item); } return res; } @GetMapping("fields") - public JSON fields(HttpServletRequest request) { - Entity entity = MetadataHelper.getEntity(getParameterNotNull(request, "entity")); + public JSON fields(@EntityParam Entity entity, HttpServletRequest request) { // 返回引用实体的字段层级 int appendRefFields = getIntParameter(request, "deep"); + // 丰富字段信息 + boolean riching = getBoolParameter(request, "riching", true); // 根据不同的 referer 返回不同的字段列表 // 返回 ID 主键字段 String referer = getParameter(request, "referer"); int forceWith = "withid".equals(referer) ? 1 : 0; - return MetaFormatter.buildFieldsWithRefs(entity, appendRefFields, true, forceWith, field -> { + return MetaFormatter.buildFieldsWithRefs(entity, appendRefFields, riching, forceWith, field -> { if (!field.isQueryable()) return true; if (field instanceof Field) { diff --git a/src/main/java/com/rebuild/web/configuration/ListFieldsController.java b/src/main/java/com/rebuild/web/configuration/ListFieldsController.java index 42ef2e2f1..b142a3a68 100644 --- a/src/main/java/com/rebuild/web/configuration/ListFieldsController.java +++ b/src/main/java/com/rebuild/web/configuration/ListFieldsController.java @@ -27,6 +27,7 @@ import com.rebuild.core.metadata.easymeta.EasyMetaFactory; import com.rebuild.core.privileges.RoleService; import com.rebuild.core.privileges.UserHelper; import com.rebuild.core.privileges.bizz.ZeroEntry; +import com.rebuild.core.service.general.QuickCodeReindexTask; import com.rebuild.core.support.i18n.Language; import com.rebuild.utils.JSONUtils; import com.rebuild.utils.RbAssert; @@ -99,7 +100,9 @@ public class ListFieldsController extends BaseController implements ShareTo { List> fieldList = new ArrayList<>(); for (Field field : MetadataSorter.sortFields(entityMeta)) { if (canListField(field)) { - fieldList.add(DataListManager.instance.formatField(field)); + Map m = DataListManager.instance.formatField(field); + m.put("quickCode", QuickCodeReindexTask.generateQuickCode((String) m.get("label"))); + fieldList.add(m); } } @@ -121,7 +124,9 @@ public class ListFieldsController extends BaseController implements ShareTo { for (Field field2 : MetadataSorter.sortFields(refEntity)) { if (canListField(field2)) { - fieldList.add(DataListManager.instance.formatField(field2, field)); + Map m = DataListManager.instance.formatField(field2, field); + m.put("quickCode", QuickCodeReindexTask.generateQuickCode((String) m.get("label"))); + fieldList.add(m); if (deep3 && EasyMetaFactory.getDisplayType(field2) == DisplayType.REFERENCE) { refFieldsOf2.add(new Field[]{field, field2}); @@ -145,7 +150,9 @@ public class ListFieldsController extends BaseController implements ShareTo { for (Field field3 : MetadataSorter.sortFields(refEntity2)) { if (canListField(field3)) { - fieldList.add(DataListManager.instance.formatField(field3, parentField)); + Map m = DataListManager.instance.formatField(field3, parentField); + m.put("quickCode", QuickCodeReindexTask.generateQuickCode((String) m.get("label"))); + fieldList.add(m); } } } diff --git a/src/main/java/com/rebuild/web/general/MetaFormatter.java b/src/main/java/com/rebuild/web/general/MetaFormatter.java index 812025a2f..04b9d185d 100644 --- a/src/main/java/com/rebuild/web/general/MetaFormatter.java +++ b/src/main/java/com/rebuild/web/general/MetaFormatter.java @@ -20,6 +20,7 @@ import com.rebuild.core.metadata.easymeta.DisplayType; import com.rebuild.core.metadata.easymeta.EasyField; import com.rebuild.core.metadata.easymeta.EasyMetaFactory; import com.rebuild.core.metadata.impl.EasyFieldConfigProps; +import com.rebuild.core.service.general.QuickCodeReindexTask; import com.rebuild.core.support.i18n.Language; import com.rebuild.core.support.state.StateManager; import com.rebuild.utils.JSONUtils; @@ -71,6 +72,9 @@ public class MetaFormatter { field.getExtraAttr(EasyFieldConfigProps.DECIMAL_FORMAT)); } + String L42 = res.getString("label"); + res.put("quickCode", QuickCodeReindexTask.generateQuickCode(L42)); + return res; } @@ -101,10 +105,10 @@ public class MetaFormatter { * 获取字段列表 * * @param entity - * @param deep 几级 + * @param deep * @param riching * @param forceWith 1=ID, 2=approvalStepNode - * @param filter + * @param filter 过滤 * @return */ public static JSONArray buildFieldsWithRefs(Entity entity, int deep, boolean riching, int forceWith, Predicate filter) { @@ -203,11 +207,13 @@ public class MetaFormatter { return res; } - private static JSONObject buildField(EasyField field, String[] parentsField, boolean rich) { + private static JSONObject buildField(EasyField field, String[] parentField, boolean rich) { JSONObject item = rich ? buildRichField(field) : (JSONObject) field.toJSON(); - if (parentsField != null) { - item.put("name", parentsField[0] + "." + item.get("name")); - item.put("label", parentsField[1] + "." + item.get("label")); + if (parentField != null) { + item.put("name", parentField[0] + "." + item.get("name")); + String L42 = parentField[1] + "." + item.get("label"); + item.put("label", L42); + item.put("quickCode", QuickCodeReindexTask.generateQuickCode(L42)); } return item; } diff --git a/src/main/resources/web/admin/audit/login-logs.html b/src/main/resources/web/admin/audit/login-logs.html index 218aece11..c20f178ab 100644 --- a/src/main/resources/web/admin/audit/login-logs.html +++ b/src/main/resources/web/admin/audit/login-logs.html @@ -16,7 +16,7 @@
-
+
diff --git a/src/main/resources/web/admin/audit/recycle-bin.html b/src/main/resources/web/admin/audit/recycle-bin.html index 9d798f596..6391651ed 100644 --- a/src/main/resources/web/admin/audit/recycle-bin.html +++ b/src/main/resources/web/admin/audit/recycle-bin.html @@ -11,7 +11,7 @@
-
+
@@ -52,8 +52,6 @@ - - diff --git a/src/main/resources/web/admin/audit/revision-history.html b/src/main/resources/web/admin/audit/revision-history.html index 0656fdb0a..f7f88c129 100644 --- a/src/main/resources/web/admin/audit/revision-history.html +++ b/src/main/resources/web/admin/audit/revision-history.html @@ -52,7 +52,7 @@
-
+
diff --git a/src/main/resources/web/admin/bizuser/dept-list.html b/src/main/resources/web/admin/bizuser/dept-list.html index 05170cd68..52eb975cb 100644 --- a/src/main/resources/web/admin/bizuser/dept-list.html +++ b/src/main/resources/web/admin/bizuser/dept-list.html @@ -53,7 +53,7 @@ [[${bundle.L('部门')}]] -
+
diff --git a/src/main/resources/web/admin/bizuser/team-list.html b/src/main/resources/web/admin/bizuser/team-list.html index 887db2c44..d50f64cc3 100644 --- a/src/main/resources/web/admin/bizuser/team-list.html +++ b/src/main/resources/web/admin/bizuser/team-list.html @@ -11,7 +11,7 @@
-
+
diff --git a/src/main/resources/web/admin/bizuser/user-list.html b/src/main/resources/web/admin/bizuser/user-list.html index 028be001b..a8ba0a6b4 100644 --- a/src/main/resources/web/admin/bizuser/user-list.html +++ b/src/main/resources/web/admin/bizuser/user-list.html @@ -58,7 +58,7 @@ [[${bundle.L('部门')}]] -
+
diff --git a/src/main/resources/web/admin/integration/apis-manager.html b/src/main/resources/web/admin/integration/apis-manager.html index 92a37d9ab..b4244201f 100644 --- a/src/main/resources/web/admin/integration/apis-manager.html +++ b/src/main/resources/web/admin/integration/apis-manager.html @@ -114,8 +114,6 @@ - - diff --git a/src/main/resources/web/assets/css/charts.css b/src/main/resources/web/assets/css/charts.css index d00371676..94ba7845b 100644 --- a/src/main/resources/web/assets/css/charts.css +++ b/src/main/resources/web/assets/css/charts.css @@ -671,10 +671,8 @@ See LICENSE and COMMERCIAL in the project root for license information. } .tcs td.tcs-selected:not(.sel-from) { - /*border: 1px double #4887c7;*/ - /*background-color: rgba(51, 122, 183, 0.2) !important;*/ border: 1px double #4285f4; - background-color: #f5f8fd; + background-color: #f5f8fd !important; } .chart-box.CNMAP .chart-body { @@ -779,6 +777,15 @@ See LICENSE and COMMERCIAL in the project root for license information. /* gradient-backgrounds.css */ +.gradient-bg .tcs td.tcs-selected:not(.sel-from) { + background-color: rgba(255, 255, 255, 0.5) !important; +} + +.gradient-bg .table-bordered th, +.gradient-bg .table-bordered td { + border-color: rgba(0, 0, 0, 0.15); +} + .gradient-bg-1 { background: linear-gradient(126deg, #c471f5, #fa71cd); } diff --git a/src/main/resources/web/assets/css/list-page.css b/src/main/resources/web/assets/css/list-page.css index b03969f6c..aecdfbbf4 100644 --- a/src/main/resources/web/assets/css/list-page.css +++ b/src/main/resources/web/assets/css/list-page.css @@ -348,6 +348,7 @@ See LICENSE and COMMERCIAL in the project root for license information. width: 100%; height: 240px; background-color: #fff; + border-radius: 6px; } #asideCharts .chart-box .chart-body { @@ -367,7 +368,6 @@ See LICENSE and COMMERCIAL in the project root for license information. } #asideCharts .chart-box:hover .chart-oper a.J_source, -#asideCharts .chart-box:hover .chart-oper a.J_fullscreen, #asideCharts .chart-box:hover .chart-oper a.J_chart-edit, #asideCharts .chart-box:hover .chart-oper a.J_export { display: none !important; @@ -381,11 +381,28 @@ See LICENSE and COMMERCIAL in the project root for license information. position: fixed; top: 60px !important; left: 230px !important; - width: 100% !important; - height: 100% !important; + right: 0 !important; + bottom: 0 !important; z-index: 9999; background-color: #fff; padding: 20px; + margin: 0; + overflow: hidden; + transition: all 0.3s; +} + +#asideCharts .charts-wrap > div.fullscreen .chart-box { + height: 100%; +} + +@media (min-width: 768px) and (max-width: 1464px) { + #asideCharts .charts-wrap > div.fullscreen { + left: 200px !important; + } +} + +.rb-collapsible-sidebar-collapsed #asideCharts .charts-wrap > div.fullscreen { + left: 60px !important; } #asideCharts .charts-wrap .ui-sortable-helper { @@ -444,3 +461,21 @@ See LICENSE and COMMERCIAL in the project root for license information. margin-left: 0; } } + +.dataTables_wrapper .rb-datatable-header.v42 { + display: flex; + flex-wrap: wrap; + justify-content: space-between; + gap: 10px; +} + +.dataTables_wrapper .rb-datatable-header.v42 > div { + flex: none; + white-space: nowrap; + width: unset; + max-width: unset; +} + +.dataTables_wrapper .rb-datatable-header.v42 > div.right { + text-align: right; +} diff --git a/src/main/resources/web/assets/css/rb-page.css b/src/main/resources/web/assets/css/rb-page.css index 964dd583b..e116d6c05 100644 --- a/src/main/resources/web/assets/css/rb-page.css +++ b/src/main/resources/web/assets/css/rb-page.css @@ -3840,10 +3840,14 @@ a.user-show:not([href]) { } .page-aside.widgets { - z-index: 2; + z-index: 3; overflow: hidden; } +.page-aside.widgets + .main-content { + z-index: 2; +} + .page-aside.widgets .tab-container { min-width: 279px; overflow: hidden; diff --git a/src/main/resources/web/assets/js/admin/apis-manager.js b/src/main/resources/web/assets/js/admin/apis-manager.js index 340b0ac7e..c1a2d056c 100644 --- a/src/main/resources/web/assets/js/admin/apis-manager.js +++ b/src/main/resources/web/assets/js/admin/apis-manager.js @@ -264,9 +264,9 @@ class AppLogsViewer extends RbModal {
{$L('请求地址')}
{dataShow[3]}
{$L('请求数据')}
-
{dataShow[4] && }
+
{dataShow[4] && }
{$L('响应数据')}
-
{dataShow[5] && }
+
{dataShow[5] && }
) : ( diff --git a/src/main/resources/web/assets/js/admin/approval-design.js b/src/main/resources/web/assets/js/admin/approval-design.js index 19f63f46c..ffe90b7e5 100644 --- a/src/main/resources/web/assets/js/admin/approval-design.js +++ b/src/main/resources/web/assets/js/admin/approval-design.js @@ -545,10 +545,12 @@ class StartNodeConfig extends RbFormHandler {

{$L('符合条件的记录才可以使用/选择此流程')}

-
+ +
+
diff --git a/src/main/resources/web/assets/js/admin/recycle-bin.js b/src/main/resources/web/assets/js/admin/recycle-bin.js index f91fe1c5c..686363f87 100644 --- a/src/main/resources/web/assets/js/admin/recycle-bin.js +++ b/src/main/resources/web/assets/js/admin/recycle-bin.js @@ -169,7 +169,7 @@ CellRenders.renderSimple = function (v, s, k) { // ~~ 数据详情 class DlgDetails extends RbAlert { renderContent() { - return this.state.code && + return this.state.code && } componentDidMount() { diff --git a/src/main/resources/web/assets/js/admin/report-templates.js b/src/main/resources/web/assets/js/admin/report-templates.js index ee21823fa..2ed47c58c 100644 --- a/src/main/resources/web/assets/js/admin/report-templates.js +++ b/src/main/resources/web/assets/js/admin/report-templates.js @@ -35,7 +35,9 @@ class ReportList extends ConfigList { {taggedTitle(item[3])} ) : ( - taggedTitle(item[3]) + + {taggedTitle(item[3])} + )} {item[6] === 1 && EXCEL} {item[6] === 2 && {$L('EXCEL 列表')}} diff --git a/src/main/resources/web/assets/js/charts/chart-design.js b/src/main/resources/web/assets/js/charts/chart-design.js index 679cbbd2e..80cec28b6 100644 --- a/src/main/resources/web/assets/js/charts/chart-design.js +++ b/src/main/resources/web/assets/js/charts/chart-design.js @@ -191,7 +191,7 @@ $(document).ready(() => { // 背景色 function _removeClass($el) { $el.removeClass(function (index, className) { - return (className.match(/\bgradient-bg-\S+/g) || []).join(' ') + return (className.match(/gradient-bg(?:-\d+)?/g) || []).join(' ') }) return $el } @@ -207,7 +207,7 @@ $(document).ready(() => { renderRbcomp( { - _removeClass($('#chart-preview >.chart-box')).addClass(`gradient-bg-${colorIndex}`) + _removeClass($('#chart-preview >.chart-box')).addClass(`gradient-bg gradient-bg-${colorIndex}`) _removeClass($bs.find('>a:eq(1)')).addClass(`gradient-bg-${colorIndex}`) $bs.find('>a:eq(0)').attr('data-bgcolor', colorIndex) // check diff --git a/src/main/resources/web/assets/js/charts/charts.js b/src/main/resources/web/assets/js/charts/charts.js index 8705dce36..d8f433a19 100644 --- a/src/main/resources/web/assets/js/charts/charts.js +++ b/src/main/resources/web/assets/js/charts/charts.js @@ -109,12 +109,13 @@ class BaseChart extends React.Component { const $stack = $('.chart-grid>.grid-stack') if (!$stack[0]) { // in DataList - // $(this._$box).parent().toggleClass('fullscreen') + const $wrap = $(this._$box).parent() + $wrap.toggleClass('fullscreen') + this.resize() return } const $boxParent = $(this._$box).parents('.grid-stack-item') - if (this.state.fullscreen) { BaseChart.currentFullscreen = this if (!this.__chartStackHeight) this.__chartStackHeight = $stack.height() @@ -527,9 +528,14 @@ const reOptionMutliYAxis = function (option) { } const renderEChart = function (option, $target) { - const c = echarts.init(document.getElementById($target), 'light', { + $target = document.getElementById($target) + const c = echarts.init($target, 'light', { renderer: navigator.userAgent.match(/(iPhone|iPod|Android|ios|SymbianOS)/i) ? 'svg' : 'canvas', }) + // v4.2 禁用右键 + $target.addEventListener('contextmenu', function (e) { + e.preventDefault() + }) if (rb.env === 'dev') console.log(option) c.setOption(option) return c diff --git a/src/main/resources/web/assets/js/charts/dashboard.js b/src/main/resources/web/assets/js/charts/dashboard.js index d3a5c7b9a..261f5278c 100644 --- a/src/main/resources/web/assets/js/charts/dashboard.js +++ b/src/main/resources/web/assets/js/charts/dashboard.js @@ -355,7 +355,17 @@ class DlgAddChart extends RbFormHandler {
- (this._$entity = c)}> + {this.state._entities && + this.state._entities.map((item) => { + if ($isSysMask(item.label)) return null + return ( + + ) + })} +
@@ -375,16 +385,11 @@ class DlgAddChart extends RbFormHandler { componentDidMount() { $.get('/commons/metadata/entities?detail=true', (res) => { - const _data = res.data || [] - _data.forEach((item) => { - if (!$isSysMask(item.label)) { - $(``).appendTo(this._$entity) - } - }) - - this.__select2 = $(this._$entity).select2({ - allowClear: false, - placeholder: $L('选择数据来源'), + this.setState({ _entities: res.data || [] }, () => { + this.__select2 = $(this._$entity).select2({ + allowClear: false, + placeholder: $L('选择数据来源'), + }) }) }) } diff --git a/src/main/resources/web/assets/js/file-preview.js b/src/main/resources/web/assets/js/file-preview.js index fdf2365bb..3f17f0573 100644 --- a/src/main/resources/web/assets/js/file-preview.js +++ b/src/main/resources/web/assets/js/file-preview.js @@ -9,7 +9,7 @@ See LICENSE and COMMERCIAL in the project root for license information. // ~~ 图片/文档预览 const TYPE_TEXTS = ['.txt', '.xml', '.json', '.md', '.yml', '.css', '.js', '.htm', '.html', '.log', '.sql', '.conf', '.sh', '.bat', '.java', '.ini'] -const TYPE_DOCS = ['.doc', '.docx', '.rtf', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf'] +const TYPE_DOCS = ['.doc', '.docx', '.xls', '.xlsx', '.ppt', '.pptx', '.pdf'] // .rtf, .csv const TYPE_IMGS = ['.jpg', '.jpeg', '.gif', '.png', '.bmp', '.jfif', '.webp'] const TYPE_AUDIOS = ['.mp3', '.wma', '.m4a', '.flac', '.ogg', '.acc'] const TYPE_VIDEOS = ['.mp4', '.wmv', '.mov', '.avi', '.mkv', '.webm', '.m4v', '.mpg', '.mpge'] @@ -57,6 +57,11 @@ class RbPreview extends React.Component {
{fileName}
+ {this.props.id && this._isDoc(fileName) && ( + + + + )} {rb.fileSharable && ( @@ -388,11 +393,12 @@ class RbPreview extends React.Component { /** * @param {*} urls string or array of URL * @param {*} index + * @param {*} id */ - static create(urls, index) { + static create(urls, index, id) { if (!urls) return if (typeof urls === 'string') urls = [urls] - renderRbcomp() + renderRbcomp() } } diff --git a/src/main/resources/web/assets/js/files/files-docs.js b/src/main/resources/web/assets/js/files/files-docs.js index ca0f2c5ea..833473f2e 100644 --- a/src/main/resources/web/assets/js/files/files-docs.js +++ b/src/main/resources/web/assets/js/files/files-docs.js @@ -423,20 +423,30 @@ class FileEditDlg extends RbFormHandler { render() { const file = this.props.file + const isOffice = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx'].includes($fileExtName(file.fileName)) return ( (this._dlg = c)} disposeOnHide>
+ {isOffice && ( + + )}
(this._btns = c)}>