EasyEntityConfigProps

This commit is contained in:
devezhao 2021-07-22 18:19:38 +08:00
parent c25a22a191
commit 4a821b8b64
10 changed files with 108 additions and 95 deletions

View file

@ -1,5 +1,5 @@
module.exports = {
printWidth: 160,
printWidth: 200,
singleQuote: true,
bracketSpacing: true,
proseWrap: 'preserve',

View file

@ -0,0 +1,24 @@
/*
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.core.metadata.impl;
/**
* @author devezhao
* @since 2021/7/22
*/
public class EasyEntityConfigProps {
/**
* 隐藏常用查询面板
*/
public static final String ADV_LIST_HIDE_FILTERS = "advListHideFilters";
/**
* 隐藏图表面板
*/
public static final String ADV_LIST_HIDE_CHARTS = "advListHideCharts";
}

View file

@ -243,6 +243,7 @@ public class MetaEntityController extends BaseController {
mv.getModel().put("entityLabel", entityMeta.getLabel());
mv.getModel().put("icon", entityMeta.getIcon());
mv.getModel().put("comments", entityMeta.getComments());
mv.getModel().put("entityCode", entityMeta.getRawMeta().getEntityCode());
return entityMeta;
}
}

View file

@ -15,11 +15,15 @@ import com.alibaba.fastjson.JSONObject;
import com.rebuild.core.Application;
import com.rebuild.core.configuration.general.DataListManager;
import com.rebuild.core.metadata.MetadataHelper;
import com.rebuild.core.metadata.easymeta.EasyEntity;
import com.rebuild.core.metadata.easymeta.EasyMetaFactory;
import com.rebuild.core.metadata.impl.EasyEntityConfigProps;
import com.rebuild.core.privileges.bizz.ZeroEntry;
import com.rebuild.core.support.general.DataListBuilder;
import com.rebuild.core.support.general.DataListBuilderImpl;
import com.rebuild.core.support.i18n.Language;
import com.rebuild.web.EntityController;
import org.apache.commons.lang.BooleanUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
@ -63,6 +67,15 @@ public class GeneralListController extends EntityController {
mv.getModel().put(ZeroEntry.AllowBatchUpdate.name(),
Application.getPrivilegesManager().allow(user, ZeroEntry.AllowBatchUpdate));
// 扩展配置
EasyEntity easyEntity = EasyMetaFactory.valueOf(useEntity);
String advListHideFilters = easyEntity.getExtraAttr(EasyEntityConfigProps.ADV_LIST_HIDE_FILTERS);
String advListHideCharts = easyEntity.getExtraAttr(EasyEntityConfigProps.ADV_LIST_HIDE_CHARTS);
mv.getModel().put(EasyEntityConfigProps.ADV_LIST_HIDE_FILTERS, advListHideFilters);
mv.getModel().put(EasyEntityConfigProps.ADV_LIST_HIDE_CHARTS, advListHideCharts);
mv.getModel().put("hideAside",
BooleanUtils.toBoolean(advListHideFilters) && BooleanUtils.toBoolean(advListHideCharts));
return mv;
}

View file

@ -58,7 +58,7 @@
<div class="form-group row">
<label class="col-md-12 col-xl-3 col-lg-4 col-form-label text-lg-right">[[${bundle.L('内部标识')}]]</label>
<div class="col-md-12 col-xl-6 col-lg-8">
<input class="form-control form-control-sm" type="text" readonly id="entityName" th:value="${entityName}" />
<input class="form-control form-control-sm" type="text" readonly id="entityName" th:value="${entityName + ' (' + entityCode + ')'}" />
</div>
</div>
<div class="form-group row">
@ -81,6 +81,19 @@
<textarea class="form-control form-control-sm row2x" id="comments" th:data-o="${comments}" th:placeholder="${bundle.L('可选')}">[[${comments}]]</textarea>
</div>
</div>
<div class="form-group row bosskey-show">
<label class="col-md-12 col-xl-3 col-lg-4 col-form-label text-lg-right pt-1">[[${bundle.L('高级配置')}]]</label>
<div class="col-md-12 col-xl-6 col-lg-8">
<label class="custom-control custom-control-sm custom-checkbox">
<input class="custom-control-input" type="checkbox" id="advListHideFilters" />
<span class="custom-control-label"> [[${bundle.L('隐藏列表页侧栏常用查询')}]]</span>
</label>
<label class="custom-control custom-control-sm custom-checkbox mb-1">
<input class="custom-control-input" type="checkbox" id="advListHideCharts" />
<span class="custom-control-label"> [[${bundle.L('隐藏列表页侧栏图表')}]]</span>
</label>
</div>
</div>
<div class="form-group row footer">
<div class="col-md-12 col-xl-6 col-lg-8 offset-xl-3 offset-lg-4">
<div class="J_action hide">

View file

@ -35,12 +35,12 @@ $(document).ready(function () {
const icon = $val('#entityIcon')
if (icon) data.icon = icon
const quickFields = $('#quickFields').val().join(',')
if (quickFields !== wpc.extConfig.quickFields) {
data.extConfig = {
quickFields: quickFields,
}
const extConfig = {
quickFields: $('#quickFields').val().join(','),
advListHideFilters: $val('#advListHideFilters'),
advListHideCharts: $val('#advListHideCharts'),
}
if (!$same(extConfig, wpc.extConfig)) data.extConfig = extConfig
data = $cleanMap(data)
if (Object.keys(data).length === 0) {
@ -144,4 +144,7 @@ $(document).ready(function () {
$('#quickFields').val(wpc.extConfig.quickFields.split(',')).trigger('change')
}
})
if (wpc.extConfig.advListHideFilters) $('#advListHideFilters').attr('checked', true)
if (wpc.extConfig.advListHideCharts) $('#advListHideCharts').attr('checked', true)
})

View file

@ -10,21 +10,7 @@ const wpc = window.__PageConfig
const __gExtConfig = {}
const SHOW_REPEATABLE = ['TEXT', 'DATE', 'DATETIME', 'EMAIL', 'URL', 'PHONE', 'REFERENCE', 'CLASSIFICATION']
const SHOW_DEFAULTVALUE = [
'TEXT',
'NTEXT',
'EMAIL',
'PHONE',
'URL',
'NUMBER',
'DECIMAL',
'DATE',
'DATETIME',
'BOOL',
'CLASSIFICATION',
'REFERENCE',
'N2NREFERENCE',
]
const SHOW_DEFAULTVALUE = ['TEXT', 'NTEXT', 'EMAIL', 'PHONE', 'URL', 'NUMBER', 'DECIMAL', 'DATE', 'DATETIME', 'BOOL', 'CLASSIFICATION', 'REFERENCE', 'N2NREFERENCE']
$(document).ready(function () {
const dt = wpc.fieldType
@ -235,9 +221,7 @@ const _handlePicklist = function (dt) {
})
if (res.data.length > 5) $('#picklist-items').parent().removeClass('autoh')
})
$('.J_picklist-edit').click(() =>
RbModal.create(`/p/admin/metadata/picklist-editor?entity=${wpc.entityName}&field=${wpc.fieldName}&multi=${dt === 'MULTISELECT'}`, $L('选项配置'))
)
$('.J_picklist-edit').click(() => RbModal.create(`/p/admin/metadata/picklist-editor?entity=${wpc.entityName}&field=${wpc.fieldName}&multi=${dt === 'MULTISELECT'}`, $L('选项配置')))
}
const _handleSeries = function () {
@ -329,9 +313,7 @@ const _handleClassification = function (useClassification) {
}
}
const $append = $(
`<button class="btn btn-secondary mw-auto" type="button" title="${$L('选择默认值')}"><i class="icon zmdi zmdi-search"></i></button>`
).appendTo('.J_defaultValue-append')
const $append = $(`<button class="btn btn-secondary mw-auto" type="button" title="${$L('选择默认值')}"><i class="icon zmdi zmdi-search"></i></button>`).appendTo('.J_defaultValue-append')
$.get(`/admin/metadata/classification/info?id=${useClassification}`, (res) => {
$('#useClassification a')
@ -367,13 +349,9 @@ const _handleReference = function (isN2N) {
if (advFilter) {
advFilter.show()
} else {
renderRbcomp(
<AdvFilter title={$L('附加过滤条件')} inModal={true} canNoFilters={true} entity={referenceEntity} filter={dataFilter} confirm={saveFilter} />,
null,
function () {
advFilter = this
}
)
renderRbcomp(<AdvFilter title={$L('附加过滤条件')} inModal={true} canNoFilters={true} entity={referenceEntity} filter={dataFilter} confirm={saveFilter} />, null, function () {
advFilter = this
})
}
})
@ -397,9 +375,7 @@ const _handleReference = function (isN2N) {
}
}
const $append = $(
`<button class="btn btn-secondary mw-auto" type="button" title="${$L('选择默认值')}"><i class="icon zmdi zmdi-search"></i></button>`
).appendTo('.J_defaultValue-append')
const $append = $(`<button class="btn btn-secondary mw-auto" type="button" title="${$L('选择默认值')}"><i class="icon zmdi zmdi-search"></i></button>`).appendTo('.J_defaultValue-append')
$dv.attr('readonly', true)
$append.click(() => _showSearcher())

View file

@ -59,7 +59,7 @@ class RbList extends React.Component {
<div>
<label className="custom-control custom-control-sm custom-checkbox">
<input className="custom-control-input" type="checkbox" onChange={(e) => this._toggleRows(e)} ref={(c) => (this._checkAll = c)} />
<span className="custom-control-label"></span>
<i className="custom-control-label" />
</label>
</div>
</th>
@ -69,12 +69,7 @@ class RbList extends React.Component {
const styles = { width: cWidth + 'px' }
const clazz = `unselect ${item.unsort ? '' : 'sortable'} ${idx === 0 && this.fixedColumns ? 'column-fixed column-fixed-2nd' : ''}`
return (
<th
key={'column-' + item.field}
style={styles}
className={clazz}
data-field={item.field}
onClick={(e) => !item.unsort && this._sortField(item.field, e)}>
<th key={'column-' + item.field} style={styles} className={clazz} data-field={item.field} onClick={(e) => !item.unsort && this._sortField(item.field, e)}>
<div style={styles}>
<span style={{ width: cWidth - 8 + 'px' }}>{item.label}</span>
<i className={'zmdi ' + (item.sort || '')} />
@ -83,7 +78,7 @@ class RbList extends React.Component {
</th>
)
})}
<th className="column-empty"></th>
<th className="column-empty" />
</tr>
</thead>
<tbody ref={(c) => (this._rblistBody = c)}>
@ -97,7 +92,7 @@ class RbList extends React.Component {
<div>
<label className="custom-control custom-control-sm custom-checkbox">
<input className="custom-control-input" type="checkbox" onChange={(e) => this._clickRow(e)} />
<span className="custom-control-label"></span>
<i className="custom-control-label" />
</label>
</div>
</td>
@ -105,7 +100,7 @@ class RbList extends React.Component {
{item.map((cell, index) => {
return that.renderCell(cell, index, lastPrimary)
})}
<td className="column-empty"></td>
<td className="column-empty" />
</tr>
)
})}
@ -610,12 +605,7 @@ CellRenders.addRender('URL', function (v, s, k) {
return (
<td key={k}>
<div style={s} title={v}>
<a
href={`${rb.baseUrl}/commons/url-safe?url=${$encode(v)}`}
className="column-url"
target="_blank"
rel="noopener noreferrer"
onClick={(e) => $stopEvent(e)}>
<a href={`${rb.baseUrl}/commons/url-safe?url=${$encode(v)}`} className="column-url" target="_blank" rel="noopener noreferrer" onClick={(e) => $stopEvent(e)}>
{v}
</a>
</div>
@ -744,7 +734,7 @@ class RbListPagination extends React.Component {
{this.state.pageNo > 1 && (
<li className="paginate_button page-item">
<a className="page-link" onClick={() => this.prev()}>
<span className="icon zmdi zmdi-chevron-left"></span>
<i className="icon zmdi zmdi-chevron-left" />
</a>
</li>
)}
@ -767,7 +757,7 @@ class RbListPagination extends React.Component {
{this.state.pageNo !== this.__pageTotal && (
<li className="paginate_button page-item">
<a className="page-link" onClick={() => this.next()}>
<span className="icon zmdi zmdi-chevron-right"></span>
<i className="icon zmdi zmdi-chevron-right" />
</a>
</li>
)}
@ -952,9 +942,7 @@ const AdvFilters = {
// 可修改
if (item.editable) {
const $action = $(
`<div class="action"><a title="${$L('修改')}"><i class="zmdi zmdi-edit"></i></a><a title="${$L('删除')}"><i class="zmdi zmdi-delete"></i></a></div>`
).appendTo($item)
const $action = $(`<div class="action"><a title="${$L('修改')}"><i class="zmdi zmdi-edit"></i></a><a title="${$L('删除')}"><i class="zmdi zmdi-delete"></i></a></div>`).appendTo($item)
$action.find('a:eq(0)').click(function () {
that.showAdvFilter(item.id)
@ -1080,9 +1068,7 @@ $(document).ready(() => {
const via = $urlp('via', location.hash)
if (via) {
wpc.protocolFilter = `via:${via}`
const $cleanVia = $(`<div class="badge filter-badge">${$L('当前数据已过滤')}<a class="close" title="${$L('查看全部数据')}">&times;</a></div>`).appendTo(
'.dataTables_filter'
)
const $cleanVia = $(`<div class="badge filter-badge">${$L('当前数据已过滤')}<a class="close" title="${$L('查看全部数据')}">&times;</a></div>`).appendTo('.dataTables_filter')
$cleanVia.find('a').click(() => {
wpc.protocolFilter = null
RbListPage.reload()
@ -1116,12 +1102,7 @@ class RbViewModal extends React.Component {
<div className="modal-dialog">
<div className="modal-content" style={{ width: this.mcWidth + 'px' }}>
<div className={'modal-body iframe rb-loading ' + (this.state.inLoad === true && 'rb-loading-active')}>
<iframe
ref={(c) => (this._iframe = c)}
className={this.state.isHide ? 'invisible' : ''}
src={this.state.showAfterUrl || 'about:blank'}
frameBorder="0"
scrolling="no"></iframe>
<iframe ref={(c) => (this._iframe = c)} className={this.state.isHide ? 'invisible' : ''} src={this.state.showAfterUrl || 'about:blank'} frameBorder="0" scrolling="no" />
<RbSpinner />
</div>
</div>
@ -1271,10 +1252,8 @@ const ChartsWidget = {
// eslint-disable-next-line no-undef
ECHART_BASE.grid = { left: 40, right: 20, top: 30, bottom: 20 }
$('.J_load-chart').click(() => {
if (this.chartLoaded !== true) this.loadWidget()
})
$('.J_add-chart').click(() => this.showChartSelect())
$('.J_load-charts').on('click', () => this.chartLoaded !== true && this.loadWidget())
$('.J_add-chart').on('click', () => this.showChartSelect())
$('.charts-wrap')
.sortable({
@ -1349,7 +1328,7 @@ $(document).ready(() => {
// ASIDE
if ($('#asideFilters, #asideWidgets').length > 0) {
$('.side-toggle').click(() => {
$('.side-toggle').on('click', () => {
const $el = $('.rb-aside').toggleClass('rb-aside-collapsed')
$.cookie('rb.asideCollapsed', $el.hasClass('rb-aside-collapsed'), { expires: 180 })
})
@ -1361,4 +1340,10 @@ $(document).ready(() => {
})()
ChartsWidget.init()
}
const $wtab = $('.page-aside.widgets .nav a:eq(0)')
if ($wtab.length > 0) {
$('.page-aside.widgets .ph-item.rb').remove()
$wtab.trigger('click')
}
})

View file

@ -6,28 +6,27 @@
<title th:text="${entityLabel}"></title>
</head>
<body>
<div class="rb-wrapper rb-fixed-sidebar rb-collapsible-sidebar rb-collapsible-sidebar-hide-logo rb-aside" th:classappend="${sideCollapsedClazz}">
<div class="rb-wrapper rb-fixed-sidebar rb-collapsible-sidebar rb-collapsible-sidebar-hide-logo" th:classappend="${sideCollapsedClazz + (hideAside ? '' : ' rb-aside')}">
<th:block th:replace="~{/_include/nav-top}" />
<th:block th:replace="~{/_include/nav-left(active=${'nav_entity-' + mainEntity})}" />
<div class="rb-content">
<aside class="page-aside widgets">
<aside class="page-aside widgets" th:if="${!hideAside}">
<a class="side-toggle" th:title="${bundle.L('展开/收缩')}"><i class="zmdi zmdi-arrow-left"></i></a>
<div class="tab-container">
<ul class="nav nav-tabs">
<li class="nav-item"><a class="nav-link active" href="#asideFilters" data-toggle="tab">[[${bundle.L('常用查询')}]]</a></li>
<li class="nav-item"><a class="nav-link J_load-chart" href="#asideWidgets" data-toggle="tab">[[${bundle.L('图表')}]]</a></li>
<li class="nav-item" th:if="${advListHideFilters != 'true'}"><a class="nav-link" href="#asideFilters" data-toggle="tab">[[${bundle.L('常用查询')}]]</a></li>
<li class="nav-item" th:if="${advListHideCharts != 'true'}"><a class="nav-link J_load-charts" href="#asideWidgets" data-toggle="tab">[[${bundle.L('图表')}]]</a></li>
</ul>
<div class="tab-content rb-scroller">
<div class="tab-pane active" id="asideFilters">
<div class="ph-item rb">
<div class="ph-col-12 p-0">
<div class="ph-row">
<div class="ph-col-12 big"></div>
<div class="ph-col-12 big"></div>
</div>
<div class="ph-item rb">
<div class="ph-col-12 p-0">
<div class="ph-row">
<div class="ph-col-12 big"></div>
<div class="ph-col-12 big"></div>
</div>
</div>
</div>
<div class="tab-pane" id="asideFilters"></div>
<div class="tab-pane" id="asideWidgets">
<div class="charts-wrap"></div>
<div class="text-center">

View file

@ -6,28 +6,27 @@
<title th:text="${entityLabel}"></title>
</head>
<body>
<div class="rb-wrapper rb-fixed-sidebar rb-collapsible-sidebar rb-collapsible-sidebar-hide-logo rb-aside" th:classappend="${sideCollapsedClazz}">
<div class="rb-wrapper rb-fixed-sidebar rb-collapsible-sidebar rb-collapsible-sidebar-hide-logo" th:classappend="${sideCollapsedClazz + (hideAside ? '' : ' rb-aside')}">
<th:block th:replace="~{/_include/nav-top}" />
<th:block th:replace="~{/_include/nav-left(active=${'nav_entity-' + entityName})}" />
<div class="rb-content">
<aside class="page-aside widgets">
<aside class="page-aside widgets" th:if="${!hideAside}">
<a class="side-toggle" th:title="${bundle.L('展开/收缩')}"><i class="zmdi zmdi-arrow-left"></i></a>
<div class="tab-container">
<ul class="nav nav-tabs">
<li class="nav-item"><a class="nav-link active" href="#asideFilters" data-toggle="tab">[[${bundle.L('常用查询')}]]</a></li>
<li class="nav-item"><a class="nav-link J_load-chart" href="#asideWidgets" data-toggle="tab">[[${bundle.L('图表')}]]</a></li>
<li class="nav-item" th:if="${advListHideFilters != 'true'}"><a class="nav-link" href="#asideFilters" data-toggle="tab">[[${bundle.L('常用查询')}]]</a></li>
<li class="nav-item" th:if="${advListHideCharts != 'true'}"><a class="nav-link J_load-charts" href="#asideWidgets" data-toggle="tab">[[${bundle.L('图表')}]]</a></li>
</ul>
<div class="tab-content rb-scroller">
<div class="tab-pane active" id="asideFilters">
<div class="ph-item rb">
<div class="ph-col-12 p-0">
<div class="ph-row">
<div class="ph-col-12 big"></div>
<div class="ph-col-12 big"></div>
</div>
<div class="ph-item rb">
<div class="ph-col-12 p-0">
<div class="ph-row">
<div class="ph-col-12 big"></div>
<div class="ph-col-12 big"></div>
</div>
</div>
</div>
<div class="tab-pane" id="asideFilters"></div>
<div class="tab-pane" id="asideWidgets">
<div class="charts-wrap"></div>
<div class="text-center">