From 19c87c5843d90a10cda10ddee2d6fd400823120c Mon Sep 17 00:00:00 2001 From: RB Date: Thu, 30 Nov 2023 23:10:31 +0800 Subject: [PATCH] feat: history viewall --- .../audit/RevisionHistoryController.java | 79 ++++++++---- .../web/admin/audit/revision-history.html | 17 +++ .../web/admin/integration/apis-manager.html | 3 +- .../web/assets/js/admin/apis-manager.js | 9 +- .../web/assets/js/admin/revision-history.js | 113 ++++++++++++++---- 5 files changed, 169 insertions(+), 52 deletions(-) diff --git a/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryController.java b/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryController.java index 552ffb7c4..0c56a264c 100644 --- a/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryController.java +++ b/src/main/java/com/rebuild/web/admin/audit/RevisionHistoryController.java @@ -16,7 +16,9 @@ import com.rebuild.core.metadata.MetadataHelper; import com.rebuild.core.metadata.easymeta.EasyField; import com.rebuild.core.metadata.easymeta.EasyMetaFactory; +import com.rebuild.core.support.i18n.I18nUtils; import com.rebuild.core.support.i18n.Language; +import com.rebuild.utils.JSONUtils; import com.rebuild.web.EntityController; import com.rebuild.web.IdParam; import org.springframework.web.bind.annotation.GetMapping; @@ -24,7 +26,10 @@ import org.springframework.web.bind.annotation.RestController; import org.springframework.web.servlet.ModelAndView; +import java.util.ArrayList; +import java.util.Date; import java.util.Iterator; +import java.util.List; /** * @author devezhao @@ -39,42 +44,70 @@ public ModelAndView page() { return createModelAndView("/admin/audit/revision-history"); } - @RequestMapping("revision-history/details") + @GetMapping("revision-history/details") public JSON details(@IdParam ID revisionId) { Object[] rev = Application.createQueryNoFilter( "select revisionContent,belongEntity from RevisionHistory where revisionId = ?") .setParameter(1, revisionId) .unique(); - JSONArray contents = JSON.parseArray((String) rev[0]); - // 补充字段名称 + JSONArray contents = JSON.parseArray((String) rev[0]); if (MetadataHelper.containsEntity((String) rev[1])) { - Entity entity = MetadataHelper.getEntity((String) rev[1]); + paddingFieldsName(contents, MetadataHelper.getEntity((String) rev[1])); + } - for (Iterator iter = contents.iterator(); iter.hasNext(); ) { - JSONObject item = (JSONObject) iter.next(); - String fieldName = item.getString("field"); + return contents; + } - if (entity.containsField(fieldName)) { - EasyField easyField = EasyMetaFactory.valueOf(entity.getField(fieldName)); - // 排除不可查询字段 - if (!easyField.isQueryable()) { - iter.remove(); - continue; - } + @GetMapping("revision-history/details-list") + public JSON detailsList(@IdParam ID revisionId) { + Object[] o = Application.getQueryFactory().uniqueNoFilter(revisionId, "recordId,belongEntity"); + if (o == null) return JSONUtils.EMPTY_ARRAY; - fieldName = easyField.getLabel(); + Object[][] array = Application.createQueryNoFilter( + "select revisionContent,revisionType,revisionOn,revisionBy.fullName from RevisionHistory where recordId = ? order by autoId desc") + .setParameter(1, o[0]) + .array(); + + List list = new ArrayList<>(); + if (MetadataHelper.containsEntity((String) o[1])) { + Entity entity = MetadataHelper.getEntity((String) o[1]); + + for (Object[] item : array) { + JSONArray contents = JSON.parseArray((String) item[0]); + paddingFieldsName(contents, entity); + + item[0] = contents; + item[2] = I18nUtils.formatDate((Date) item[2]); + list.add(item); + } + } + return (JSON) JSON.toJSON(list); + } + + // 补充字段名称 + private void paddingFieldsName(JSONArray contents, Entity entity) { + for (Iterator iter = contents.iterator(); iter.hasNext(); ) { + JSONObject item = (JSONObject) iter.next(); + String fieldName = item.getString("field"); + + if (entity.containsField(fieldName)) { + EasyField easyField = EasyMetaFactory.valueOf(entity.getField(fieldName)); + // 排除不可查询字段 + if (!easyField.isQueryable()) { + iter.remove(); + continue; + } + + fieldName = easyField.getLabel(); + } else { + if ("SHARETO".equalsIgnoreCase(fieldName)) { + fieldName = Language.L("共享用户"); } else { - if ("SHARETO".equalsIgnoreCase(fieldName)) { - fieldName = Language.L("共享用户"); - } else { - fieldName = "[" + fieldName.toUpperCase() + "]"; - } + fieldName = "[" + fieldName.toUpperCase() + "]"; } - item.put("field", fieldName); } + item.put("field", fieldName); } - - return contents; } } diff --git a/src/main/resources/web/admin/audit/revision-history.html b/src/main/resources/web/admin/audit/revision-history.html index 667e0ef7a..fe45efbc3 100644 --- a/src/main/resources/web/admin/audit/revision-history.html +++ b/src/main/resources/web/admin/audit/revision-history.html @@ -14,6 +14,23 @@ overflow: hidden; text-overflow: ellipsis; } + .table tr.group > td { + padding: 0; + } + .table tr.group > td > h5 { + padding: 8px 10px; + margin: 0; + background-color: #dee2e6; + border-radius: 0; + } + .table tr.group > td > h5, + .table tr.group > td > h5 * { + color: #444; + font-weight: normal; + } + .table.group > thead > tr > th { + border-bottom-width: 0; + } diff --git a/src/main/resources/web/admin/integration/apis-manager.html b/src/main/resources/web/admin/integration/apis-manager.html index 0c50c5d09..7ca133d32 100644 --- a/src/main/resources/web/admin/integration/apis-manager.html +++ b/src/main/resources/web/admin/integration/apis-manager.html @@ -39,11 +39,12 @@ appearance: none !important; outline: none !important; border: 0 none; - padding: 5px 8px; + padding: 6px 8px; width: 100%; border-radius: 2px; display: block; border-bottom: 1px solid rgba(0, 0, 0, 0.125); + line-height: 1; } .search-logs > input:focus { background-color: #ddd; 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 7936655c2..542f822ca 100644 --- a/src/main/resources/web/assets/js/admin/apis-manager.js +++ b/src/main/resources/web/assets/js/admin/apis-manager.js @@ -171,7 +171,7 @@ class AppLogsViewer extends RbModal {
{ if (e.keyCode === 13) { this._loadNext(true, e.target.value) @@ -202,12 +202,7 @@ class AppLogsViewer extends RbModal {
{this.state.showMore && (
- { - $stopEvent(e, true) - this._loadNext() - }}> + this._loadNext()}> {$L('加载更多')}
diff --git a/src/main/resources/web/assets/js/admin/revision-history.js b/src/main/resources/web/assets/js/admin/revision-history.js index 8b05f9b12..e080d7667 100644 --- a/src/main/resources/web/assets/js/admin/revision-history.js +++ b/src/main/resources/web/assets/js/admin/revision-history.js @@ -134,8 +134,9 @@ CellRenders.renderSimple = function (v, s, k) { // ~~ 变更详情 class DlgDetails extends RbAlert { renderContent() { - const _data = (this.state.data || []).filter((item) => !$same(item.after, item.before)) - if (_data.length === 0) return
{$L('无变更详情')}
+ if (this.state.viewAll) { + return + } return ( @@ -147,17 +148,63 @@ class DlgDetails extends RbAlert { - {_data.map((item) => { + + + + + +
+ this.setState({ viewAll: true })}> + {$L('查看全部')} + +
+ ) + } + + componentDidMount() { + $.get(`/admin/audit/revision-history/details?id=${this.props.id}`, (res) => { + super.componentDidMount() + this.setState({ data: res.data || [] }) + }) + } +} + +class HistoryViewport extends React.Component { + constructor(props) { + super(props) + this.state = { ...props } + } + + render() { + if (!this.state.dataList) { + return ( +
+ +
+
+ ) + } + + return ( + + + + + + + + + + {this.state.dataList.map((item, idx) => { return ( - - - - - + + + + + + ) })} @@ -166,22 +213,46 @@ class DlgDetails extends RbAlert { } componentDidMount() { - $.get(`/admin/audit/revision-history/details?id=${this.props.id}`, (res) => { - if (res.data.length === 0) { - RbHighbar.create($L('无变更详情')) - this.hide() - } else { - super.componentDidMount() - this.setState({ data: res.data }) - } + $.get(`/admin/audit/revision-history/details-list?id=${this.props.id}`, (res) => { + this.setState({ dataList: res.data || [] }) }) } +} - _formatValue(v) { +function ContentsGroup({ contents }) { + const f = function (v) { if (v) { return typeof v === 'object' ? v.join(', ') : v } else { return {$L('空')} } } + + // 排除相同 + const notSame = (contents || []).filter((item) => !$same(item.after, item.before)) + return ( + + {(notSame || []).length === 0 ? ( + + + + ) : ( + notSame.map((item) => { + return ( + + + + + + ) + }) + )} + + ) }
{$L('字段')}{$L('变更前')}{$L('变更后')}
{item.field} -
{this._formatValue(item.before)}
-
-
{this._formatValue(item.after)}
-
+
{WrapHtml($L('**%s** 由 %s %s', item[2].split(' UTC')[0], item[3], RevTypes[item[1]]))}
+
+
{$L('无变更详情')}
+
{item.field} +
{f(item.before)}
+
+
{f(item.after)}
+