Skip to content

Commit

Permalink
feat: history viewall
Browse files Browse the repository at this point in the history
  • Loading branch information
getrebuild committed Nov 30, 2023
1 parent 3bdcbd9 commit 19c87c5
Show file tree
Hide file tree
Showing 5 changed files with 169 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,15 +16,20 @@
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;
import org.springframework.web.bind.annotation.RequestMapping;
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
Expand All @@ -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<Object> 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<Object> 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<Object> 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;
}
}
17 changes: 17 additions & 0 deletions src/main/resources/web/admin/audit/revision-history.html
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
</style>
</head>
<body>
Expand Down
3 changes: 2 additions & 1 deletion src/main/resources/web/admin/integration/apis-manager.html
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
9 changes: 2 additions & 7 deletions src/main/resources/web/assets/js/admin/apis-manager.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ class AppLogsViewer extends RbModal {
<div className="search-logs position-relative">
<input
type="text"
placeholder={$L('查询')}
placeholder={$L('搜索')}
onKeyDown={(e) => {
if (e.keyCode === 13) {
this._loadNext(true, e.target.value)
Expand Down Expand Up @@ -202,12 +202,7 @@ class AppLogsViewer extends RbModal {
</div>
{this.state.showMore && (
<div className="text-center mt-3">
<a
href="###"
onClick={(e) => {
$stopEvent(e, true)
this._loadNext()
}}>
<a className="text-primary" onClick={() => this._loadNext()}>
{$L('加载更多')}
</a>
</div>
Expand Down
113 changes: 92 additions & 21 deletions src/main/resources/web/assets/js/admin/revision-history.js
Original file line number Diff line number Diff line change
Expand Up @@ -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 <div className="m-3 text-center text-muted">{$L('无变更详情')}</div>
if (this.state.viewAll) {
return <HistoryViewport id={this.props.id} />
}

return (
<table className="table table-fixed">
Expand All @@ -147,17 +148,63 @@ class DlgDetails extends RbAlert {
</tr>
</thead>
<tbody>
{_data.map((item) => {
<ContentsGroup contents={this.state.data} />
<tr>
<td colSpan="3" className="text-center pb-0">
<a className="text-primary" onClick={() => this.setState({ viewAll: true })}>
{$L('查看全部')}
</a>
</td>
</tr>
</tbody>
</table>
)
}

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 (
<div className="rb-loading rb-loading-active">
<RbSpinner />
<div style={{ minHeight: 132 }} />
</div>
)
}

return (
<table className="table table-fixed group">
<thead>
<tr>
<th width="25%">{$L('字段')}</th>
<th>{$L('变更前')}</th>
<th>{$L('变更后')}</th>
</tr>
</thead>
<tbody>
{this.state.dataList.map((item, idx) => {
return (
<tr key={item.field}>
<td>{item.field}</td>
<td>
<div>{this._formatValue(item.before)}</div>
</td>
<td>
<div>{this._formatValue(item.after)}</div>
</td>
</tr>
<RF key={idx}>
<tr className="group">
<td colSpan="3">
<h5>{WrapHtml($L('**%s** 由 %s %s', item[2].split(' UTC')[0], item[3], RevTypes[item[1]]))}</h5>
</td>
</tr>
<ContentsGroup contents={item[0]} />
</RF>
)
})}
</tbody>
Expand All @@ -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 <span className="text-muted">{$L('空')}</span>
}
}

// 排除相同
const notSame = (contents || []).filter((item) => !$same(item.after, item.before))
return (
<RF>
{(notSame || []).length === 0 ? (
<tr>
<td colSpan="3">
<div className="text-muted">{$L('无变更详情')}</div>
</td>
</tr>
) : (
notSame.map((item) => {
return (
<tr key={item.field}>
<td>{item.field}</td>
<td>
<div>{f(item.before)}</div>
</td>
<td>
<div>{f(item.after)}</div>
</td>
</tr>
)
})
)}
</RF>
)
}

0 comments on commit 19c87c5

Please sign in to comment.