history in right side on view

This commit is contained in:
devezhao 2021-01-09 17:08:25 +08:00
parent e97e5e6590
commit e6cb818cf8
18 changed files with 351 additions and 162 deletions

View file

@ -104,6 +104,7 @@ module.exports = {
$fromNow: true,
$expired: true,
$L: true,
$LF: true,
$isTrue: true,
$fieldIsCompatible: true,
$unhideDropdown: true

View file

@ -1,66 +0,0 @@
/*
Copyright (c) REBUILD <https://getrebuild.com/> and/or its owners. All rights reserved.
rebuild is dual-licensed under commercial and open source licenses (GPLv3).
See LICENSE and COMMERCIAL in the project root for license information.
*/
package com.rebuild.web.general;
import cn.devezhao.persist4j.Entity;
import cn.devezhao.persist4j.Field;
import cn.devezhao.persist4j.engine.ID;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.api.RespBody;
import com.rebuild.core.configuration.ConfigBean;
import com.rebuild.core.configuration.general.AutoFillinManager;
import com.rebuild.core.configuration.general.TransformManager;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.service.general.transform.RecordTransfomer;
import com.rebuild.web.BaseController;
import com.rebuild.web.EntityParam;
import com.rebuild.web.IdParam;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* 表单功能扩展
*
* @author devezhao zhaofang123@gmail.com
* @since 2019/05/20
*/
@RestController
@RequestMapping("/app/entity/extras/")
public class FormExtrasController extends BaseController {
// 获取表单回填数据
@RequestMapping("fillin-value")
public JSON getFillinValue(@EntityParam Entity entity, @IdParam(name = "source") ID sourceRecord,
HttpServletRequest request) {
String field = getParameterNotNull(request, "field");
Field useField = entity.getField(field);
return AutoFillinManager.instance.getFillinValue(useField, sourceRecord);
}
// 记录转换
@RequestMapping("transform")
public RespBody transform(HttpServletRequest request) {
ID transid = getIdParameterNotNull(request, "transid");
ID sourceRecord = getIdParameterNotNull(request, "source");
ConfigBean config = TransformManager.instance.getTransformConfig(transid, null);
Entity targetEntity = MetadataHelper.getEntity(config.getString("target"));
RecordTransfomer transfomer = new RecordTransfomer(targetEntity, (JSONObject) config.getJSON("config"));
if (!transfomer.checkFilter(sourceRecord)) {
return RespBody.error(getLang(request, "TransformNotAllow"), 400);
}
ID newId = transfomer.transform(sourceRecord);
return RespBody.ok(newId);
}
}

View file

@ -12,19 +12,13 @@ import cn.devezhao.commons.web.ServletUtils;
import cn.devezhao.persist4j.Entity;
import cn.devezhao.persist4j.engine.ID;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONAware;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.api.RespBody;
import com.rebuild.core.Application;
import com.rebuild.core.configuration.general.FormBuilderContextHolder;
import com.rebuild.core.configuration.general.FormsBuilder;
import com.rebuild.core.configuration.general.TransformManager;
import com.rebuild.core.configuration.general.ViewAddonsManager;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.privileges.UserHelper;
import com.rebuild.core.privileges.bizz.User;
import com.rebuild.core.support.i18n.I18nUtils;
import com.rebuild.utils.JSONUtils;
import com.rebuild.web.EntityController;
import com.rebuild.web.IdParam;
import org.springframework.web.bind.annotation.*;
@ -33,9 +27,6 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* 表单/视图
@ -115,64 +106,6 @@ public class GeneralModelController extends EntityController {
return FormsBuilder.instance.buildView(entity, getRequestUser(request), id);
}
@GetMapping("record-meta")
public JSONAware fetchRecordMeta(@IdParam ID id) {
final Entity entity = MetadataHelper.getEntity(id.getEntityCode());
String sql = "select createdOn,modifiedOn from %s where %s = '%s'";
if (MetadataHelper.hasPrivilegesField(entity)) {
sql = sql.replace(",modifiedOn", ",modifiedOn,owningUser");
}
sql = String.format(sql, entity.getName(), entity.getPrimaryField().getName(), id);
Object[] recordMeta = Application.createQueryNoFilter(sql).unique();
if (recordMeta == null) {
return RespBody.errorl("RecordNotExists");
}
recordMeta[0] = I18nUtils.formatDate((Date) recordMeta[0]);
recordMeta[1] = I18nUtils.formatDate((Date) recordMeta[1]);
String[] owning = null;
List<String[]> sharingList = null;
if (recordMeta.length == 3) {
User user = Application.getUserStore().getUser((ID) recordMeta[2]);
String dept = user.getOwningDept() == null ? null : user.getOwningDept().getName();
owning = new String[]{user.getIdentity().toString(), user.getFullName(), dept};
Object[][] shareTo = Application.createQueryNoFilter(
"select shareTo from ShareAccess where belongEntity = ? and recordId = ?")
.setParameter(1, entity.getName())
.setParameter(2, id)
.setLimit(9) // 最多显示9个
.array();
sharingList = new ArrayList<>();
for (Object[] st : shareTo) {
sharingList.add(new String[]{st[0].toString(), UserHelper.getName((ID) st[0])});
}
}
return JSONUtils.toJSONObject(
new String[] { "createdOn", "modifiedOn", "owningUser", "sharingList" },
new Object[] { recordMeta[0], recordMeta[1], owning, sharingList });
}
@GetMapping("record-lastModified")
public JSONAware fetchRecordLastModified(@IdParam ID id) {
final Entity entity = MetadataHelper.getEntity(id.getEntityCode());
String sql = String.format("select modifiedOn from %s where %s = '%s'",
entity.getName(), entity.getPrimaryField().getName(), id);
Object[] recordMeta = Application.createQueryNoFilter(sql).unique();
if (recordMeta == null) {
return RespBody.errorl("RecordNotExists");
}
return JSONUtils.toJSONObject(
new String[] { "lastModified"},
new Object[] { ((Date) recordMeta[0]).getTime() });
}
// 打印视图
@GetMapping("print")
public ModelAndView printPreview(@PathVariable String entity, @IdParam ID recordId, HttpServletRequest request) {

View file

@ -0,0 +1,164 @@
/*
Copyright (c) REBUILD <https://getrebuild.com/> and/or its owners. All rights reserved.
rebuild is dual-licensed under commercial and open source licenses (GPLv3).
See LICENSE and COMMERCIAL in the project root for license information.
*/
package com.rebuild.web.general;
import cn.devezhao.persist4j.Entity;
import cn.devezhao.persist4j.Field;
import cn.devezhao.persist4j.engine.ID;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONAware;
import com.alibaba.fastjson.JSONObject;
import com.rebuild.api.RespBody;
import com.rebuild.core.Application;
import com.rebuild.core.configuration.ConfigBean;
import com.rebuild.core.configuration.general.AutoFillinManager;
import com.rebuild.core.configuration.general.TransformManager;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.privileges.UserHelper;
import com.rebuild.core.privileges.bizz.User;
import com.rebuild.core.service.general.transform.RecordTransfomer;
import com.rebuild.core.support.i18n.I18nUtils;
import com.rebuild.core.support.i18n.Language;
import com.rebuild.utils.JSONUtils;
import com.rebuild.web.BaseController;
import com.rebuild.web.EntityParam;
import com.rebuild.web.IdParam;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
/**
* 表单/视图 功能扩展
*
* @author devezhao zhaofang123@gmail.com
* @since 2019/05/20
*/
@RestController
@RequestMapping("/app/entity/extras/")
public class ModelExtrasController extends BaseController {
// 获取表单回填数据
@RequestMapping("fillin-value")
public JSON getFillinValue(@EntityParam Entity entity, @IdParam(name = "source") ID sourceRecord,
HttpServletRequest request) {
String field = getParameterNotNull(request, "field");
Field useField = entity.getField(field);
return AutoFillinManager.instance.getFillinValue(useField, sourceRecord);
}
// 记录转换
@RequestMapping("transform")
public RespBody transform(HttpServletRequest request) {
ID transid = getIdParameterNotNull(request, "transid");
ID sourceRecord = getIdParameterNotNull(request, "source");
ConfigBean config = TransformManager.instance.getTransformConfig(transid, null);
Entity targetEntity = MetadataHelper.getEntity(config.getString("target"));
RecordTransfomer transfomer = new RecordTransfomer(targetEntity, (JSONObject) config.getJSON("config"));
if (!transfomer.checkFilter(sourceRecord)) {
return RespBody.error(getLang(request, "TransformNotAllow"), 400);
}
ID newId = transfomer.transform(sourceRecord);
return RespBody.ok(newId);
}
@GetMapping("record-last-modified")
public JSONAware fetchRecordLastModified(@IdParam ID id) {
final Entity entity = MetadataHelper.getEntity(id.getEntityCode());
String sql = String.format("select modifiedOn from %s where %s = '%s'",
entity.getName(), entity.getPrimaryField().getName(), id);
Object[] recordMeta = Application.createQueryNoFilter(sql).unique();
if (recordMeta == null) {
return RespBody.errorl("RecordNotExists");
}
return JSONUtils.toJSONObject(
new String[] { "lastModified" },
new Object[] { ((Date) recordMeta[0]).getTime() });
}
@GetMapping("record-meta")
public JSONAware fetchRecordMeta(@IdParam ID id) {
final Entity entity = MetadataHelper.getEntity(id.getEntityCode());
String sql = "select createdOn,modifiedOn from %s where %s = '%s'";
if (MetadataHelper.hasPrivilegesField(entity)) {
sql = sql.replace(",modifiedOn", ",modifiedOn,owningUser");
}
sql = String.format(sql, entity.getName(), entity.getPrimaryField().getName(), id);
Object[] recordMeta = Application.createQueryNoFilter(sql).unique();
if (recordMeta == null) {
return RespBody.errorl("RecordNotExists");
}
recordMeta[0] = I18nUtils.formatDate((Date) recordMeta[0]);
recordMeta[1] = I18nUtils.formatDate((Date) recordMeta[1]);
String[] owning = null;
List<String[]> sharingList = null;
if (recordMeta.length == 3) {
User user = Application.getUserStore().getUser((ID) recordMeta[2]);
String dept = user.getOwningDept() == null ? null : user.getOwningDept().getName();
owning = new String[]{user.getIdentity().toString(), user.getFullName(), dept};
Object[][] shareTo = Application.createQueryNoFilter(
"select shareTo from ShareAccess where belongEntity = ? and recordId = ?")
.setParameter(1, entity.getName())
.setParameter(2, id)
.setLimit(9) // 最多显示9个
.array();
sharingList = new ArrayList<>();
for (Object[] st : shareTo) {
sharingList.add(new String[]{st[0].toString(), UserHelper.getName((ID) st[0])});
}
}
return JSONUtils.toJSONObject(
new String[] { "createdOn", "modifiedOn", "owningUser", "sharingList" },
new Object[] { recordMeta[0], recordMeta[1], owning, sharingList });
}
private static final Map<Integer, String> REV_TYPE_LANGS = new HashMap<>();
static {
REV_TYPE_LANGS.put(1, "Create");
REV_TYPE_LANGS.put(2, "Delete");
REV_TYPE_LANGS.put(4, "Update");
REV_TYPE_LANGS.put(16, "Assign");
REV_TYPE_LANGS.put(32, "Share");
REV_TYPE_LANGS.put(64, "UnShare");
}
@GetMapping("record-history")
public JSONAware fetchRecordHistory(@IdParam ID id) {
Object[][] array = Application.createQueryNoFilter(
"select revisionType,revisionOn,revisionBy from RevisionHistory where recordId = ? order by revisionOn desc")
.setParameter(1, id)
.setLimit(100)
.array();
for (Object[] o : array) {
String type = REV_TYPE_LANGS.get(o[0]);
o[0] = Language.L(StringUtils.defaultString(type, "Unknown"));
o[1] = I18nUtils.formatDate((Date) o[1]);
o[2] = new Object[] { o[2], UserHelper.getName((ID) o[2]) };
}
return JSONUtils.toJSONObjectArray(
new String[] { "revisionType", "revisionOn", "revisionBy" },
array);
}
}

View file

@ -1291,6 +1291,9 @@
"UploadLogoTips": "Please upload a dark and white LOGO, transparent background, width and height 268 × 54",
"FieldNotApply": "Field (type) is not applicable",
"AutoTransformOnce": "Transform only once (after the transform, it will not be transformed even if the conditions are met)",
"ViewHistory": "Modification History",
"ViewHistoryContent": "**%s** $ACTION$ by $USER$",
"Unknown": "Unknown",
"s.__": "STATE",
"s.ApprovalState.DRAFT": "Draft",

View file

@ -1291,6 +1291,9 @@
"UploadLogoTips": "请分别上传深色与白色 LOGO透明背景宽高为 268 × 54",
"FieldNotApply": "字段 (类型) 不适用",
"AutoTransformOnce": "只转换一次 (转换后即使符合条件也不再转换)",
"ViewHistory": "修改历史",
"ViewHistoryContent": "**%s** 由 $USER$ $ACTION$",
"Unknown": "未知",
"s.__": "状态",
"s.ApprovalState.DRAFT": "草稿",

View file

@ -1291,6 +1291,9 @@
"UploadLogoTips": "請分別上傳深色與白色 LOGO透明背景寬高為 268 × 54",
"FieldNotApply": "字段 (類型) 不適用",
"AutoTransformOnce": "只轉換一次 (轉換後即使符合條件也不再轉換)",
"ViewHistory": "修改歷史",
"ViewHistoryContent": "**%s** 由 $USER$ $ACTION$",
"Unknown": "未知",
"s.__": "狀態",
"s.ApprovalState.DRAFT": "草稿",

View file

@ -38,6 +38,19 @@
</div>
</div>
</div>
<div class="view-date">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewDate')}]]</legend></fieldset>
</div>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.createdOn')}]]</dt>
<dd class="col-12 col-lg-8 J_createdOn"></dd>
</dl>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.modifiedOn')}]]</dt>
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
</div>
</div>
</div>

View file

@ -38,6 +38,19 @@
</div>
</div>
</div>
<div class="view-date">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewDate')}]]</legend></fieldset>
</div>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.createdOn')}]]</dt>
<dd class="col-12 col-lg-8 J_createdOn"></dd>
</dl>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.modifiedOn')}]]</dt>
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
</div>
</div>
</div>

View file

@ -43,6 +43,19 @@
<button class="btn btn-secondary J_add-detail" type="button"><i class="icon zmdi zmdi-account-add"></i> [[${bundle.L('AddMember')}]]</button>
</div>
</div>
<div class="view-date">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewDate')}]]</legend></fieldset>
</div>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.createdOn')}]]</dt>
<dd class="col-12 col-lg-8 J_createdOn"></dd>
</dl>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.modifiedOn')}]]</dt>
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
</div>
</div>
</div>

View file

@ -51,6 +51,19 @@
</div>
</div>
</div>
<div class="view-date">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewDate')}]]</legend></fieldset>
</div>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.createdOn')}]]</dt>
<dd class="col-12 col-lg-8 J_createdOn"></dd>
</dl>
<dl class="row">
<dt class="col-12 col-lg-4">[[${bundle.L('f.modifiedOn')}]]</dt>
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
</div>
</div>
</div>

View file

@ -216,7 +216,7 @@ body {
}
.view-operating > div.view-user {
margin-bottom: 0 !important;
margin-bottom: 5px !important;
}
.view-date .col-lg-4,
@ -249,6 +249,7 @@ body {
.view-user .row ul > li {
margin-bottom: 0;
margin-right: 7px;
line-height: 1;
}
.view-user .row ul > li:last-child {
@ -261,6 +262,10 @@ body {
min-height: 36.5px;
}
.view-user .user-show {
line-height: 1;
}
.sharing-list ul {
margin: 10px 0 21px 10px;
}
@ -474,3 +479,44 @@ body {
.feeds-list.inview .feeds > .content .rich-content > .appends {
font-size: 12px;
}
.view-history .view-history-items {
padding: 0;
margin: 0;
position: relative;
}
.view-history .view-history-items::before {
content: '';
position: absolute;
top: 4px;
bottom: 20px;
width: 2px;
background: #ddd;
left: 6px;
}
.view-history .view-history-items > li {
position: relative;
padding-left: 24px;
height: 28px;
color: #777;
}
.view-history .view-history-items > li::before {
content: '';
position: absolute;
top: 4px;
left: 2px;
width: 10px;
height: 10px;
background-color: #ddd;
border-radius: 50px;
}
.view-history .view-history-items > li b:first-child {
font-weight: normal;
min-width: 60px;
display: inline-block;
}

View file

@ -163,7 +163,7 @@ class DlgEnableUser extends RbModalHandler {
</div>
<div className="form-group row">
<label className="col-sm-3 col-form-label text-sm-right">
{$L('AppendRoles')} ({$L('Optional')}) <sup className="rbv">V</sup>
{$L('AppendRoles')} ({$L('Optional')}) <sup className="rbv"></sup>
</label>
<div className="col-sm-7">
<UserSelector hideUser={true} hideDepartment={true} hideTeam={true} defaultValue={this.props.roleAppends} ref={(c) => (this._roleAppends = c)} />

View file

@ -127,7 +127,7 @@ class RbFormModal extends React.Component {
checkDrityData() {
if (!this.__lastModified || !this.state.id) return
$.get(`/app/entity/record-lastModified?id=${this.state.id}`, (res) => {
$.get(`/app/entity/extras/record-last-modified?id=${this.state.id}`, (res) => {
if (res.error_code === 0) {
if (res.data.lastModified !== this.__lastModified) {
// this.setState({ alertMessage: <p>记录已由其他用户编辑过<a onClick={() => this.__refresh()}>点击此处</a>查看最新数据</p> })

View file

@ -739,22 +739,31 @@ var _$unthy = function (text) {
}
/**
* 获取语言
* 获取语言PH_KEY
*/
var $L = function () {
var args = arguments.length === 1 ? arguments[0].split(',') : arguments
var lang = _$L(args[0])
return _$L(args, true)
}
/**
* 获取语言PH_VALUE
*/
var $LF = function () {
var args = arguments.length === 1 ? arguments[0].split(',') : arguments
return _$L(args, false)
}
var _$L = function (args, isPhKey) {
var lang = _getLang(args[0])
if (args.length < 2) return lang
for (var i = 1; i < args.length; i++) {
if (args[i]) {
var phLang = _$L(args[i])
lang = lang.replace('{' + (i - 1) + '}', phLang)
}
var phKey = isPhKey ? '{' + (i - 1) + '}' : '%s'
var phLang = isPhKey ? _getLang(args[i]) : args[i]
lang = lang.replace(phKey, phLang)
}
return lang
}
var _$L = function (key) {
var _getLang = function (key) {
var lang = (window._LANGBUNDLE || {})[key]
if (!lang) {
console.warn('Missing lang-key `' + key + '`')

View file

@ -73,7 +73,7 @@ class RbViewForm extends React.Component {
// 脏数据检查
checkDrityData(handle) {
if (!this.__lastModified || !this.state.id) return
$.get(`/app/entity/record-lastModified?id=${this.state.id}`, (res) => {
$.get(`/app/entity/extras/record-last-modified?id=${this.state.id}`, (res) => {
if (res.error_code === 0) {
if (res.data.lastModified !== this.__lastModified) {
handle && handle.showLoading()
@ -485,13 +485,16 @@ const RbViewPage = {
if (ep.S !== true) $('.J_share').remove()
}
// Clean
// Clean buttons
that.cleanViewActionButton()
that.initRecordMeta()
that.initHistory()
},
// 元数据
initRecordMeta() {
$.get(`/app/entity/record-meta?id=${this.__id}`, (res) => {
$.get(`/app/entity/extras/record-meta?id=${this.__id}`, (res) => {
// 如果出错就清空操作区
if (res.error_code !== 0) {
$('.view-operating').empty()
@ -500,24 +503,24 @@ const RbViewPage = {
for (let k in res.data) {
const v = res.data[k]
if (!v) return
const $el = $('.J_' + k)
if ($el.length === 0) return
if (!v) continue
const $el = $(`.J_${k}`)
if ($el.length === 0) continue
if (k === 'owningUser') {
renderRbcomp(<UserShow id={v[0]} name={v[1]} showName={true} deptName={v[2]} onClick={() => this.clickViewUser(v[0])} />, $el[0])
} else if (k === 'sharingList') {
const list = $('<ul class="list-unstyled list-inline mb-0"></ul>').appendTo('.J_sharingList')
const _this = this
const $list = $('<ul class="list-unstyled list-inline mb-0"></ul>').appendTo($('.J_sharingList').empty())
const that = this
$(v).each(function () {
const $v = this
const item = $('<li class="list-inline-item"></li>').appendTo(list)
renderRbcomp(<UserShow id={$v[0]} name={$v[1]} onClick={() => _this.clickViewUser($v[0])} />, item[0])
const _this = this
const $item = $('<li class="list-inline-item"></li>').appendTo($list)
renderRbcomp(<UserShow id={_this[0]} name={_this[1]} onClick={() => that.clickViewUser(_this[0])} />, $item[0])
})
if (this.__ep && this.__ep.S === true) {
const item_op = $('<li class="list-inline-item"></li>').appendTo(list)[0]
if (v.length === 0)
const $op = $('<li class="list-inline-item"></li>').appendTo($list)[0]
if (v.length === 0) {
renderRbcomp(
<UserShow
name={$L('AddSome,Share')}
@ -526,19 +529,21 @@ const RbViewPage = {
$('.J_share').trigger('click')
}}
/>,
item_op
$op
)
else renderRbcomp(<UserShow name={$L('SomeManage,ShareUsers')} icon="zmdi zmdi-more" onClick={() => DlgShareManager.create(this.__id)} />, item_op)
} else {
renderRbcomp(<UserShow name={$L('SomeManage,ShareUsers')} icon="zmdi zmdi-more" onClick={() => DlgShareManager.create(this.__id)} />, $op)
}
} else if (v.length > 0) {
const item_op = $('<li class="list-inline-item"></li>').appendTo(list)[0]
renderRbcomp(<UserShow name={$L('ViewSome,ShareUsers')} icon="zmdi zmdi-more" onClick={() => DlgShareManager.create(this.__id, false)} />, item_op)
const $op = $('<li class="list-inline-item"></li>').appendTo($list)[0]
renderRbcomp(<UserShow name={$L('ViewSome,ShareUsers')} icon="zmdi zmdi-more" onClick={() => DlgShareManager.create(this.__id, false)} />, $op)
} else {
$('.J_sharingList').parent().remove()
}
} else if (k === 'createdOn' || k === 'modifiedOn') {
renderRbcomp(<DateShow date={v} />, $el[0])
} else {
$('<span>' + v + '</span>').appendTo($el)
$(`<span>${v}</span>`).appendTo($el.empty())
}
}
@ -547,6 +552,31 @@ const RbViewPage = {
})
},
// 修改历史
initHistory() {
const $into = $('.view-history .view-history-items')
if ($into.length === 0) return
$.get(`/app/entity/extras/record-history?id=${this.__id}`, (res) => {
if (res.error_code !== 0) return
$into.empty()
res.data.forEach((item, idx) => {
const content = $LF('ViewHistoryContent', $fromNow(item.revisionOn)).replace('$USER$', item.revisionBy[1]).replace('$ACTION$', item.revisionType)
const $item = $(`<li>${content}</li>`).appendTo($into)
$item.find('b:eq(0)').attr('title', item.revisionOn)
if (idx > 9) $item.addClass('hide')
})
if (res.data.length > 10) {
$into.after(`<a href="javascript:;" class="J_mores">${$L('LoadMore')}</a>`)
$('.view-history .J_mores').click(function () {
$into.find('li.hide').removeClass('hide')
$(this).addClass('hide')
})
}
})
},
// 相关项
// 列表
@ -702,7 +732,6 @@ const RbViewPage = {
$(document).ready(function () {
if (wpc.entity) {
RbViewPage.init(wpc.recordId, wpc.entity, wpc.privileges)
RbViewPage.initRecordMeta()
if (wpc.viewTabs) RbViewPage.initVTabs(wpc.viewTabs)
if (wpc.viewAdds) RbViewPage.initVAdds(wpc.viewAdds)
}

View file

@ -57,6 +57,12 @@
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
<div class="view-history">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewHistory')}]]</legend></fieldset>
</div>
<ul class="view-history-items list-unstyled"></ul>
</div>
</div>
</div>
</div>

View file

@ -93,6 +93,12 @@
<dd class="col-12 col-lg-8 J_modifiedOn"></dd>
</dl>
</div>
<div class="view-history">
<div class="form-line">
<fieldset><legend>[[${bundle.L('ViewHistory')}]]</legend></fieldset>
</div>
<ul class="view-history-items list-unstyled"></ul>
</div>
</div>
</div>
</div>