From 013ec20e69a1f6d10fa100c0acca0b2f1709db23 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Sun, 31 Aug 2025 17:00:16 +0800 Subject: [PATCH 01/16] feat: gitee#ICVLAB --- .../service/dashboard/charts/TableChart.java | 35 ++++++++++++++++--- 1 file changed, 30 insertions(+), 5 deletions(-) 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; From cd5f8e5ff4bc22d12bc33fad11d8b55aa4ce1e7c Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Sun, 31 Aug 2025 18:18:51 +0800 Subject: [PATCH 02/16] feat: search by quickCode --- .../rebuild/web/commons/MetadataGetting.java | 12 ++++++--- .../configuration/ListFieldsController.java | 13 ++++++--- .../rebuild/web/general/MetaFormatter.java | 18 ++++++++----- .../web/assets/js/charts/dashboard.js | 27 +++++++++++-------- .../web/assets/js/general/list-fields.js | 5 ++-- .../web/assets/js/general/rb-advfilter.js | 4 +-- .../resources/web/assets/js/nav-settings.js | 6 +++-- src/main/resources/web/assets/js/rb-page.js | 13 ++++++--- src/main/resources/web/assets/js/sortable.js | 1 + .../resources/web/general/list-fields.html | 2 +- 10 files changed, 66 insertions(+), 35 deletions(-) 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/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/general/list-fields.js b/src/main/resources/web/assets/js/general/list-fields.js index 3cde0d959..35cb7aeca 100644 --- a/src/main/resources/web/assets/js/general/list-fields.js +++ b/src/main/resources/web/assets/js/general/list-fields.js @@ -32,7 +32,7 @@ $(document).ready(() => { $(_data.fieldList).each(function () { // eslint-disable-next-line no-undef - if (!$isSysMask(this.label)) render_unset([this.field, this.label]) + if (!$isSysMask(this.label)) render_unset([this.field, this.label, this.quickCode]) }) $(_data.configList).each(function () { const fkey = this.field @@ -119,7 +119,8 @@ $(document).ready(() => { const q = $trim(e.target.value).toLowerCase() $('.unset-list .dd-item').each(function () { const $item = $(this) - if (!q || $item.text().toLowerCase().includes(q) || $item.data('key').toLowerCase().includes(q)) { + const pinyin = $item.data('pinyin') + if (!q || $item.text().toLowerCase().includes(q) || $item.data('key').toLowerCase().includes(q) || (pinyin && pinyin.toLowerCase().includes(q))) { $item.removeClass('hide') } else { $item.addClass('hide') diff --git a/src/main/resources/web/assets/js/general/rb-advfilter.js b/src/main/resources/web/assets/js/general/rb-advfilter.js index e6eef68bf..2420285b2 100644 --- a/src/main/resources/web/assets/js/general/rb-advfilter.js +++ b/src/main/resources/web/assets/js/general/rb-advfilter.js @@ -381,7 +381,7 @@ class FilterItem extends React.Component { (this._filterOp = c)}> {this.selectOp().map((item) => { return ( - ) diff --git a/src/main/resources/web/assets/js/nav-settings.js b/src/main/resources/web/assets/js/nav-settings.js index 53a03a547..ceae39e09 100644 --- a/src/main/resources/web/assets/js/nav-settings.js +++ b/src/main/resources/web/assets/js/nav-settings.js @@ -23,7 +23,7 @@ $(document).ready(() => { $.get('/commons/metadata/entities?detail=true', (res) => { $(res.data).each(function () { if (!$isSysMask(this.label)) { - $(``).appendTo('.J_menuEntity optgroup:eq(0)') + $(``).appendTo('.J_menuEntity optgroup:eq(0)') } _entities[this.name] = this }) @@ -33,7 +33,9 @@ $(document).ready(() => { placeholder: $L('选择关联项'), allowClear: false, templateResult: function (res) { - const $span = $('').attr('title', res.text).text(res.text) + console.log(res) + const $span = $('').attr('title', res.text).text(res.text) + if (!res.children) $span.addClass('icon-append') // optgroup const found = _entities[res.id] if (found) $(``).appendTo($span) return $span diff --git a/src/main/resources/web/assets/js/rb-page.js b/src/main/resources/web/assets/js/rb-page.js index 841127c88..deced603f 100644 --- a/src/main/resources/web/assets/js/rb-page.js +++ b/src/main/resources/web/assets/js/rb-page.js @@ -1239,14 +1239,19 @@ var $select2MatcherAll = function (params, data) { return null } - function _matcher(item, s) { + // 匹配 + function _FN(item, s) { + console.log('_FN', item, s) s = s.toLowerCase() - return (item.text || '').toLowerCase().indexOf(s) > -1 || (item.id || '').toLowerCase().indexOf(s) > -1 + if ((item.text || '').toLowerCase().indexOf(s) > -1 || (item.id || '').toLowerCase().indexOf(s) > -1) return true + // v4.2 + var pinyin = $(item.element).data('pinyin') + return pinyin && pinyin.toLowerCase().indexOf(s) > -1 } if (data.children) { var ch = data.children.filter(function (item) { - return _matcher(item, params.term) + return _FN(item, params.term) }) if (ch.length === 0) return null @@ -1254,7 +1259,7 @@ var $select2MatcherAll = function (params, data) { data2.children = ch return data2 } else { - if (_matcher(data, params.term)) { + if (_FN(data, params.term, data.element)) { return data } } diff --git a/src/main/resources/web/assets/js/sortable.js b/src/main/resources/web/assets/js/sortable.js index 3f098c8f3..a4ea9c664 100644 --- a/src/main/resources/web/assets/js/sortable.js +++ b/src/main/resources/web/assets/js/sortable.js @@ -18,6 +18,7 @@ $(document).ready(function () { const render_unset = function (data, target) { const $item = $(`
  • ${data[1]}
  • `).appendTo(target || '.unset-list') + if (data[2]) $item.attr('data-pinyin', data[2]) $item.on('click', function () { render_item(data) $item.remove() diff --git a/src/main/resources/web/general/list-fields.html b/src/main/resources/web/general/list-fields.html index 341fd0e6c..673a05ae5 100644 --- a/src/main/resources/web/general/list-fields.html +++ b/src/main/resources/web/general/list-fields.html @@ -23,7 +23,7 @@ .sortable-box-title a.search-btn { position: absolute; font-size: 1.231rem; - margin-top: -2px; + margin-top: -1px; margin-left: 5px; } .sortable-box-title a.search-btn:hover { From 6c8176c238d0ce9453bd349402cfbe0e070ff747 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Mon, 1 Sep 2025 10:39:38 +0800 Subject: [PATCH 03/16] Update @rbv --- @rbv | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/@rbv b/@rbv index 653879f9b..8f0e04c31 160000 --- a/@rbv +++ b/@rbv @@ -1 +1 @@ -Subproject commit 653879f9b8c8cc59876618091fa14265edf7ece8 +Subproject commit 8f0e04c31603daa7893e7afb34f9a86b5e9348c3 From 883fbb823a3cbf4a74277b3f0cdeb2fe3d1cc509 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:58:03 +0800 Subject: [PATCH 04/16] Reset page number and add data-pinyin to options --- src/main/resources/web/assets/js/general/rb-datalist.common.js | 1 + src/main/resources/web/assets/js/general/rb-datalist.js | 1 + src/main/resources/web/assets/js/metadata/entity-advanced.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/resources/web/assets/js/general/rb-datalist.common.js b/src/main/resources/web/assets/js/general/rb-datalist.common.js index 9a401d0f2..b63b2e134 100644 --- a/src/main/resources/web/assets/js/general/rb-datalist.common.js +++ b/src/main/resources/web/assets/js/general/rb-datalist.common.js @@ -2347,6 +2347,7 @@ const CategoryWidget = { onItemClick={(query) => { if (!query || query[0] === CategoryWidget.__ALL) wpc.protocolFilter = null else wpc.protocolFilter = `category:${wpc.entity[0]}:${query.join('$$$$')}` + _RbList().pageNo = 1 RbListPage.reload() }} />, diff --git a/src/main/resources/web/assets/js/general/rb-datalist.js b/src/main/resources/web/assets/js/general/rb-datalist.js index 678b69fc7..48d27872a 100644 --- a/src/main/resources/web/assets/js/general/rb-datalist.js +++ b/src/main/resources/web/assets/js/general/rb-datalist.js @@ -312,6 +312,7 @@ $(document).ready(() => { // v4.1 AI window.attachAibotPageData = function (cb) { renderRbcomp( + // eslint-disable-next-line react/jsx-no-undef { const qe = RbListPage._RbList.getLastQueryEntry() diff --git a/src/main/resources/web/assets/js/metadata/entity-advanced.js b/src/main/resources/web/assets/js/metadata/entity-advanced.js index b119b85d9..6a9cf97a3 100644 --- a/src/main/resources/web/assets/js/metadata/entity-advanced.js +++ b/src/main/resources/web/assets/js/metadata/entity-advanced.js @@ -810,7 +810,7 @@ class CompCategoryItem extends React.Component { (this._filterField = c)}> {this.state.fields.map((item) => { return ( - ) From 41dbda6cb421283b9e5ec56ef0743966e043f3d6 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Mon, 1 Sep 2025 21:19:37 +0800 Subject: [PATCH 09/16] Update rb-page.js --- src/main/resources/web/assets/js/rb-page.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/resources/web/assets/js/rb-page.js b/src/main/resources/web/assets/js/rb-page.js index deced603f..333c3e99c 100644 --- a/src/main/resources/web/assets/js/rb-page.js +++ b/src/main/resources/web/assets/js/rb-page.js @@ -1241,7 +1241,6 @@ var $select2MatcherAll = function (params, data) { // 匹配 function _FN(item, s) { - console.log('_FN', item, s) s = s.toLowerCase() if ((item.text || '').toLowerCase().indexOf(s) > -1 || (item.id || '').toLowerCase().indexOf(s) > -1) return true // v4.2 From 7ec48fc54f152e5de8a8383aabbb143274744222 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Mon, 1 Sep 2025 23:50:39 +0800 Subject: [PATCH 10/16] Improve file management and code formatting features --- .../core/service/files/FilesHelper.java | 7 ++-- .../rebuild/web/commons/FilePreviewer.java | 6 ++-- .../web/admin/audit/recycle-bin.html | 2 -- .../web/admin/integration/apis-manager.html | 2 -- .../web/assets/js/admin/apis-manager.js | 4 +-- .../web/assets/js/admin/recycle-bin.js | 2 +- .../web/assets/js/admin/report-templates.js | 4 ++- .../web/assets/js/files/files-docs.js | 24 ++++++++++---- .../resources/web/assets/js/files/files.js | 2 +- .../resources/web/assets/js/rb-components.js | 27 ++++++++++------ src/main/resources/web/assets/js/rb-page.js | 32 +++++++++++-------- 11 files changed, 67 insertions(+), 45 deletions(-) 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/web/commons/FilePreviewer.java b/src/main/java/com/rebuild/web/commons/FilePreviewer.java index eaeb83131..a41d46ae3 100644 --- a/src/main/java/com/rebuild/web/commons/FilePreviewer.java +++ b/src/main/java/com/rebuild/web/commons/FilePreviewer.java @@ -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/resources/web/admin/audit/recycle-bin.html b/src/main/resources/web/admin/audit/recycle-bin.html index 9d798f596..c1ca89c3f 100644 --- a/src/main/resources/web/admin/audit/recycle-bin.html +++ b/src/main/resources/web/admin/audit/recycle-bin.html @@ -52,8 +52,6 @@ - - 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/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/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/files/files-docs.js b/src/main/resources/web/assets/js/files/files-docs.js index ca0f2c5ea..76fc371a8 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>
    - +
    (this._$fileName = c)} /> -

    - - {$L('在线编辑')} (LAB) - -

    + {isOffice && ( + + )}
    (this._btns = c)}> diff --git a/src/main/resources/web/general/dock-form.html b/src/main/resources/web/general/dock-form.html index 76e21fe98..499647dbc 100644 --- a/src/main/resources/web/general/dock-form.html +++ b/src/main/resources/web/general/dock-form.html @@ -9,7 +9,6 @@ position: relative; display: block; z-index: 1; - border-radius: 4px; margin-top: 44px; border-top: 2px solid var(--rb-theme-color); } diff --git a/src/main/resources/web/general/dock-view.html b/src/main/resources/web/general/dock-view.html index 55b28a013..4ade1826b 100644 --- a/src/main/resources/web/general/dock-view.html +++ b/src/main/resources/web/general/dock-view.html @@ -8,7 +8,6 @@ .iframe-wrap { margin-top: 44px; overflow: hidden; - border-radius: 4px; } .iframe-wrap iframe { position: relative; diff --git a/src/main/resources/web/general/record-list.html b/src/main/resources/web/general/record-list.html index c7d09ddbb..19021281a 100644 --- a/src/main/resources/web/general/record-list.html +++ b/src/main/resources/web/general/record-list.html @@ -61,7 +61,7 @@
    -
    +
    -
    +
    From 0b7bca398f4d0ceedcaae983076e5f19afa83a88 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Tue, 2 Sep 2025 13:36:49 +0800 Subject: [PATCH 13/16] be --- .../java/com/rebuild/web/commons/FilePreviewer.java | 2 +- src/main/resources/web/assets/js/file-preview.js | 12 +++++++++--- src/main/resources/web/assets/js/files/files-docs.js | 2 +- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/rebuild/web/commons/FilePreviewer.java b/src/main/java/com/rebuild/web/commons/FilePreviewer.java index a41d46ae3..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); } 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}
    From 032442e736cb29f4d252f259473a255a0d0246db Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Tue, 2 Sep 2025 14:35:08 +0800 Subject: [PATCH 14/16] Enhance REP operator handling in advanced filter --- .../core/service/query/AdvFilterParser.java | 15 +++++++++++---- .../web/assets/js/general/rb-advfilter.js | 4 ++-- 2 files changed, 13 insertions(+), 6 deletions(-) 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/resources/web/assets/js/general/rb-advfilter.js b/src/main/resources/web/assets/js/general/rb-advfilter.js index 496326e1b..261613dfb 100644 --- a/src/main/resources/web/assets/js/general/rb-advfilter.js +++ b/src/main/resources/web/assets/js/general/rb-advfilter.js @@ -442,8 +442,8 @@ class FilterItem extends React.Component { op = ['IN', 'NIN'] } - // v3.6-b4,v3.7 - if (['TEXT', 'PHONE', 'EMAIL', 'URL', 'DATE', 'DATETIME', 'TIME'].includes(fieldType)) op.push('REP') + // v3.6-b4, v3.7, v4.2 + if (['TEXT', 'PHONE', 'EMAIL', 'URL', 'DATE', 'DATETIME', 'TIME', 'REFERENCE', 'ANYREFERENCE'].includes(fieldType)) op.push('REP') if (this.isApprovalState()) op = ['IN', 'NIN'] else if (this.state.field === VF_ACU) op = ['IN', 'SFU', 'SFB', 'SFT'] // v3.7 准备废弃 From 2669e981e023869a184bbaeba293f146aa06cc56 Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Tue, 2 Sep 2025 16:17:42 +0800 Subject: [PATCH 15/16] Update rb-page.js --- src/main/resources/web/assets/js/rb-page.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/web/assets/js/rb-page.js b/src/main/resources/web/assets/js/rb-page.js index 361ee1660..a8e4b2efe 100644 --- a/src/main/resources/web/assets/js/rb-page.js +++ b/src/main/resources/web/assets/js/rb-page.js @@ -472,7 +472,7 @@ var _showNotification = function (state) { var _Notification = window.Notification || window.mozNotification || window.webkitNotification if (_Notification) { if (_Notification.permission === 'granted') { - var n = new _Notification($L('你有 %d 条未读消息', state), { + var n = new _Notification($L('你有 %d 条未读通知', state), { body: window.rb.appName, icon: rb.baseUrl + '/assets/img/icon-192x192.png', tag: 'rbNotification', From b33e2d123639b8422833809abd439e0a61fb44fc Mon Sep 17 00:00:00 2001 From: RB <42044143+getrebuild@users.noreply.github.com> Date: Tue, 2 Sep 2025 18:08:08 +0800 Subject: [PATCH 16/16] Update approval-design.js --- src/main/resources/web/assets/js/admin/approval-design.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) 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('符合条件的记录才可以使用/选择此流程')}

    -
    + +
    +