mirror of
https://github.com/getrebuild/rebuild.git
synced 2024-09-20 07:25:54 +08:00
history in right side on view
This commit is contained in:
parent
e97e5e6590
commit
e6cb818cf8
|
@ -104,6 +104,7 @@ module.exports = {
|
|||
$fromNow: true,
|
||||
$expired: true,
|
||||
$L: true,
|
||||
$LF: true,
|
||||
$isTrue: true,
|
||||
$fieldIsCompatible: true,
|
||||
$unhideDropdown: true
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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) {
|
||||
|
|
164
src/main/java/com/rebuild/web/general/ModelExtrasController.java
Normal file
164
src/main/java/com/rebuild/web/general/ModelExtrasController.java
Normal 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);
|
||||
}
|
||||
}
|
|
@ -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",
|
||||
|
|
|
@ -1291,6 +1291,9 @@
|
|||
"UploadLogoTips": "请分别上传深色与白色 LOGO,透明背景,宽高为 268 × 54",
|
||||
"FieldNotApply": "字段 (类型) 不适用",
|
||||
"AutoTransformOnce": "只转换一次 (转换后即使符合条件也不再转换)",
|
||||
"ViewHistory": "修改历史",
|
||||
"ViewHistoryContent": "**%s** 由 $USER$ $ACTION$",
|
||||
"Unknown": "未知",
|
||||
|
||||
"s.__": "状态",
|
||||
"s.ApprovalState.DRAFT": "草稿",
|
||||
|
|
|
@ -1291,6 +1291,9 @@
|
|||
"UploadLogoTips": "請分別上傳深色與白色 LOGO,透明背景,寬高為 268 × 54",
|
||||
"FieldNotApply": "字段 (類型) 不適用",
|
||||
"AutoTransformOnce": "只轉換一次 (轉換後即使符合條件也不再轉換)",
|
||||
"ViewHistory": "修改歷史",
|
||||
"ViewHistoryContent": "**%s** 由 $USER$ $ACTION$",
|
||||
"Unknown": "未知",
|
||||
|
||||
"s.__": "狀態",
|
||||
"s.ApprovalState.DRAFT": "草稿",
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)} />
|
||||
|
|
|
@ -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> })
|
||||
|
|
|
@ -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 + '`')
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
Loading…
Reference in a new issue