Skip to content

Commit

Permalink
列表3级字段
Browse files Browse the repository at this point in the history
  • Loading branch information
getrebuild committed Jan 22, 2025
1 parent 309aa4c commit d144680
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
import com.rebuild.utils.JSONUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.util.Assert;

import java.util.ArrayList;
import java.util.Comparator;
Expand Down Expand Up @@ -141,18 +142,35 @@ public JSON formatListFields(String entity, ID user, boolean filterNoPriviFields
}

String[] fieldPath = field.split("\\.");
Assert.isTrue(fieldPath.length <= 3, "Up to 3 levels of fields allowed");
Map<String, Object> formatted = null;
if (fieldPath.length == 1) {
formatted = formatField(lastField);
} else {

// 如果没有引用实体的读权限,则直接过滤掉字段
// 如没有引用实体的读权限,则过滤该字段

final boolean isLevel3 = fieldPath.length == 3;
Field parentField = entityMeta.getField(fieldPath[0]);
if (!filterNoPriviFields) {
formatted = formatField(lastField, parentField);
} else if (Application.getPrivilegesManager().allowRead(user, lastField.getOwnEntity().getEntityCode())) {
formatted = formatField(lastField, parentField);
Field[] parents;
if (isLevel3) {
parents = new Field[]{parentField, parentField.getReferenceEntity().getField(fieldPath[1])};
} else {
parents = new Field[]{parentField};
}

if (filterNoPriviFields) {
boolean lastFieldAllow = Application.getPrivilegesManager().allowRead(user, lastField.getOwnEntity().getEntityCode());
if (isLevel3) {
if (lastFieldAllow
&& Application.getPrivilegesManager().allowRead(user, parents[1].getOwnEntity().getEntityCode())) {
formatted = formatField(lastField, parents);
}
} else if (lastFieldAllow) {
formatted = formatField(lastField, parents);
}
} else {
formatted = formatField(lastField, parents);
}
}

Expand All @@ -179,7 +197,7 @@ public JSON formatListFields(String entity, ID user, boolean filterNoPriviFields
* @return
*/
public Map<String, Object> formatField(Field field) {
return formatField(field, null);
return formatField(field, new Field[0]);
}

/**
Expand All @@ -188,8 +206,25 @@ public Map<String, Object> formatField(Field field) {
* @return
*/
public Map<String, Object> formatField(Field field, Field parent) {
String parentField = parent == null ? "" : (parent.getName() + ".");
String parentLabel = parent == null ? "" : (EasyMetaFactory.getLabel(parent) + ".");
if (parent != null) return formatField(field, new Field[]{parent});
return formatField(field, new Field[0]);
}

/**
* @param field
* @param parents
* @return
*/
public Map<String, Object> formatField(Field field, Field[] parents) {
String parentField = "";
String parentLabel = "";
if (parents != null) {
for (Field f : parents) {
parentField += f.getName() + ".";
parentLabel += EasyMetaFactory.getLabel(f) + ".";
}
}

EasyField easyField = EasyMetaFactory.valueOf(field);
return JSONUtils.toJSONObject(
new String[]{"field", "label", "type"},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,25 +106,49 @@ public void gets(@PathVariable String entity,
}
}

// 明细关联字段
final Field dtmField = entityMeta.getMainEntity() == null ? null : MetadataHelper.getDetailToMainField(entityMeta);
// 3级字段
// FIXME 3级字段有问题,暂无法确定3级字段的权限
final boolean deep3 = getBoolParameter(request, "deep3");

// ~引用:2级
List<Field[]> refFieldsOf2 = new ArrayList<>();
// 明细关联字段
Field dtmField = entityMeta.getMainEntity() == null ? null : MetadataHelper.getDetailToMainField(entityMeta);
// 引用实体的字段
for (Field field : MetadataSorter.sortFields(entityMeta, DisplayType.REFERENCE)) {
// 过滤所属用户/所属部门等系统字段(除了明细引用(主实体)字段)
if (EasyMetaFactory.valueOf(field).isBuiltin() && (dtmField == null || !dtmField.equals(field))) {
continue;
if (EasyMetaFactory.valueOf(field).isBuiltin() && (dtmField == null || !dtmField.equals(field))) continue;
// 无权限的不返回
final Entity refEntity = field.getReferenceEntity();
if (!Application.getPrivilegesManager().allowRead(user, refEntity.getEntityCode())) continue;

for (Field field2 : MetadataSorter.sortFields(refEntity)) {
if (canListField(field2)) {
fieldList.add(DataListManager.instance.formatField(field2, field));

if (deep3 && EasyMetaFactory.getDisplayType(field2) == DisplayType.REFERENCE) {
refFieldsOf2.add(new Field[]{field, field2});
}
}
}
}
// ~引用:3级
for (Field[] parentField : refFieldsOf2) {
Field field2 = parentField[1];

Entity refEntity = field.getReferenceEntity();
// 明细关联字段
final Field dtmField2 = field2.getOwnEntity().getMainEntity() == null ? null
: MetadataHelper.getDetailToMainField(field2.getOwnEntity());

// 过滤所属用户/所属部门等系统字段(除了明细引用(主实体)字段)
if (EasyMetaFactory.valueOf(field2).isBuiltin() && (dtmField2 == null || !dtmField2.equals(field2))) continue;
// 无权限的不返回
if (!Application.getPrivilegesManager().allowRead(user, refEntity.getEntityCode())) {
continue;
}
final Entity refEntity2 = field2.getReferenceEntity();
if (!Application.getPrivilegesManager().allowRead(user, refEntity2.getEntityCode())) continue;

for (Field fieldOfRef : MetadataSorter.sortFields(refEntity)) {
if (canListField(fieldOfRef)) {
fieldList.add(DataListManager.instance.formatField(fieldOfRef, field));
for (Field field3 : MetadataSorter.sortFields(refEntity2)) {
if (canListField(field3)) {
fieldList.add(DataListManager.instance.formatField(field3, parentField));
}
}
}
Expand Down Expand Up @@ -152,6 +176,10 @@ public void gets(@PathVariable String entity,
writeSuccess(response, ret);
}

private boolean canListField(Field field) {
return field.isQueryable() && EasyMetaFactory.getDisplayType(field) != DisplayType.BARCODE;
}

@GetMapping("list-fields/alist")
public void getsList(@PathVariable String entity,
HttpServletRequest request, HttpServletResponse response) {
Expand All @@ -170,8 +198,4 @@ public void getsList(@PathVariable String entity,
Object[][] list = Application.createQueryNoFilter(sql).array();
writeSuccess(response, list);
}

private boolean canListField(Field field) {
return field.isQueryable() && EasyMetaFactory.getDisplayType(field) != DisplayType.BARCODE;
}
}
29 changes: 17 additions & 12 deletions src/main/resources/web/assets/js/general/list-fields.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ $(document).ready(() => {
let shareToComp
let cfgid = $urlp('id')

$.get(`${settingsUrl}?id=${cfgid || ''}`, (res) => {
$.get(`${settingsUrl}?id=${cfgid || ''}&deep3=false`, (res) => {
const _data = res.data || {}
cfgid = _data.configId || ''
_fieldCached = [..._data.fieldList, ..._data.configList]
Expand Down Expand Up @@ -112,17 +112,22 @@ $(document).ready(() => {
$('.sortable-box-title .search-btn').on('click', function () {
const $s = $(`<div class="search-input"><input type="text" placeholder="${$L('筛选字段')}" /></div>`).appendTo($(this).parent())
const $input = $s.find('input').on('input', (e) => {
$setTimeout(() => {
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)) {
$item.removeClass('hide')
} else {
$item.addClass('hide')
}
})
}, 200)
$setTimeout(
() => {
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)) {
$item.removeClass('hide')
} else {
$item.addClass('hide')
}
})
$('.sortable-box').perfectScrollbar('update')
},
200,
'sortable-box'
)
})

setTimeout(() => $input[0].focus(), 20)
Expand Down

0 comments on commit d144680

Please sign in to comment.