mirror of
https://github.com/getrebuild/rebuild.git
synced 2024-09-21 07:55:56 +08:00
新版配置
This commit is contained in:
parent
0aca21a36e
commit
c43d790cda
|
@ -77,7 +77,8 @@
|
|||
"RbAlert": true,
|
||||
"RbHighbar": true,
|
||||
"ApprovalSubmitForm": true,
|
||||
"LiteFormDlg": true
|
||||
"ConfigList": true,
|
||||
"ConfigFormDlg": true
|
||||
},
|
||||
"rules": {
|
||||
"strict": 0,
|
||||
|
|
|
@ -32,6 +32,8 @@ 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.List;
|
||||
|
||||
/**
|
||||
* TODO
|
||||
|
@ -55,15 +57,21 @@ public class DataReportControll extends BasePageControll {
|
|||
@RequestMapping("/data-reports/list")
|
||||
public void reportList(HttpServletRequest request, HttpServletResponse response) throws IOException {
|
||||
String belongEntity = getParameter(request, "entity");
|
||||
String sql = "select configId,name,belongEntity,belongEntity,isDisabled,modifiedOn from DataReportConfig";
|
||||
if (StringUtils.isNotBlank(belongEntity)) {
|
||||
sql += " where belongEntity = '" + StringEscapeUtils.escapeSql(belongEntity) + "'";
|
||||
}
|
||||
sql += " order by name, modifiedOn desc";
|
||||
String q = getParameter(request, "q");
|
||||
String sql = "select configId,belongEntity,belongEntity,name,isDisabled,modifiedOn from DataReportConfig" +
|
||||
" where (1=1) and (2=2) order by name, modifiedOn desc";
|
||||
|
||||
Object[][] array = Application.createQuery(sql).array();
|
||||
List<String> where = new ArrayList<>();
|
||||
if (StringUtils.isNotBlank(belongEntity)) {
|
||||
sql = sql.replace("(1=1)", "belongEntity = '" + StringEscapeUtils.escapeSql(belongEntity) + "'");
|
||||
}
|
||||
if (StringUtils.isNotBlank(q)) {
|
||||
sql = sql.replace("(2=2)", "name like '%" + StringEscapeUtils.escapeSql(q) + "%'");
|
||||
}
|
||||
|
||||
Object[][] array = Application.createQuery(sql).setLimit(500).array();
|
||||
for (Object[] o : array) {
|
||||
o[3] = EasyMeta.getLabel(MetadataHelper.getEntity((String) o[3]));
|
||||
o[2] = EasyMeta.getLabel(MetadataHelper.getEntity((String) o[2]));
|
||||
o[5] = CalendarUtils.getUTCDateTimeFormat().format(o[5]);
|
||||
}
|
||||
writeSuccess(response, array);
|
||||
|
|
|
@ -4,11 +4,6 @@
|
|||
<head>
|
||||
<%@ include file="/_include/Head.jsp"%>
|
||||
<title>报表模板</title>
|
||||
<style type="text/css">
|
||||
.syscfg h5{background-color:#eee;margin:0;padding:10px;}
|
||||
.syscfg .table td{padding:10px;}
|
||||
.syscfg .table td p{margin:0;color:#999;font-weight:normal;font-size:12px;}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="rb-wrapper rb-fixed-sidebar rb-collapsible-sidebar rb-collapsible-sidebar-hide-logo rb-color-header rb-aside">
|
||||
|
@ -34,6 +29,12 @@
|
|||
<div class="float-right pt-1">
|
||||
<button class=" btn btn-primary J_add" type="button"><i class="icon zmdi zmdi-plus"></i> 添加</button>
|
||||
</div>
|
||||
<div class="float-right pt-1 mr-3">
|
||||
<div class="input-group input-search">
|
||||
<input class="form-control" type="text" placeholder="查询" maxlength="40">
|
||||
<span class="input-group-btn"><button class="btn btn-secondary" type="button"><i class="icon zmdi zmdi-search"></i></button></span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="clearfix"></div>
|
||||
</div>
|
||||
<div class="main-content container-fluid pt-0">
|
||||
|
@ -72,6 +73,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<%@ include file="/_include/Foot.jsp"%>
|
||||
<script type="text/babel" src="${baseUrl}/assets/js/config-comps.jsx"></script>
|
||||
<script type="text/babel" src="${baseUrl}/assets/js/datas/data-reports.jsx"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -179,6 +179,7 @@ html.admin .admin-show.row {
|
|||
.input-search input {
|
||||
width: 220px;
|
||||
height: 2.8rem;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.input-search input {
|
||||
|
|
111
src/main/webapp/assets/js/config-comps.jsx
Normal file
111
src/main/webapp/assets/js/config-comps.jsx
Normal file
|
@ -0,0 +1,111 @@
|
|||
/* eslint-disable no-unused-vars */
|
||||
// 表单 DLG
|
||||
class ConfigFormDlg extends RbFormHandler {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<RbModal title={(this.props.id ? '修改' : '添加') + this.props.configName} ref={(c) => this._dlg = c} disposeOnHide={true}>
|
||||
<div className="form">
|
||||
{this.renderFrom()}
|
||||
<div className="form-group row footer">
|
||||
<div className="col-sm-7 offset-sm-3" ref={(c) => this._btns = c}>
|
||||
<button className="btn btn-primary" type="button" onClick={this.confirm}>确定</button>
|
||||
<a className="btn btn-link" onClick={this.hide}>取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</RbModal>
|
||||
)
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
if (this._entity) {
|
||||
$.get(`${rb.baseUrl}/commons/metadata/entities`, (res) => {
|
||||
this.setState({ entities: res.data }, () => {
|
||||
this.__select2 = $(this._entity).select2({
|
||||
placeholder: '选择实体',
|
||||
allowClear: false
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
renderFrom() {
|
||||
}
|
||||
confirm = () => {
|
||||
}
|
||||
}
|
||||
|
||||
// 列表 TABLE
|
||||
class ConfigList extends React.Component {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = { ...props }
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.loadData()
|
||||
// 搜索
|
||||
const btn = $('.input-search .btn').click(() => { this.loadData() })
|
||||
$('.input-search .form-control').keydown((e) => { if (e.which === 13) btn.trigger('click') })
|
||||
}
|
||||
|
||||
// 加载数据
|
||||
loadData(entity) {
|
||||
if (!this.requestUrl) {
|
||||
throw new Error('No `requestUrl` defined')
|
||||
}
|
||||
|
||||
entity = entity || this.__entity
|
||||
this.__entity = entity
|
||||
let q = $('.input-search input').val()
|
||||
|
||||
$.get(`${this.requestUrl}?entity=${entity || ''}&q=${$encode(q)}`, (res) => {
|
||||
this.setState({ data: res.data || [] }, () => {
|
||||
$('.rb-loading-active').removeClass('rb-loading-active')
|
||||
$('.dataTables_info').text(`共 ${this.state.data.length} 项`)
|
||||
|
||||
if (this.state.data.length === 0) $('.list-nodata').removeClass('hide')
|
||||
else $('.list-nodata').addClass('hide')
|
||||
|
||||
this.renderEntityTree()
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 渲染实体树
|
||||
renderEntityTree() {
|
||||
if (this.__treeRendered) return
|
||||
this.__treeRendered = true
|
||||
|
||||
const ues = {}
|
||||
$(this.state.data).each(function () {
|
||||
ues[this[1]] = this[2]
|
||||
})
|
||||
const dest = $('.dept-tree ul')
|
||||
for (let k in ues) {
|
||||
$(`<li data-entity="${k}"><a class="text-truncate">${ues[k]}</a></li>`).appendTo(dest)
|
||||
}
|
||||
|
||||
let that = this
|
||||
dest.find('li').click(function () {
|
||||
dest.find('li').removeClass('active')
|
||||
$(this).addClass('active')
|
||||
that.loadData($(this).data('entity'))
|
||||
})
|
||||
}
|
||||
|
||||
// 删除数据
|
||||
handleDelete(id) {
|
||||
$.post(`${rb.baseUrl}/app/entity/record-delete?id=${id}`, (res) => {
|
||||
if (res.error_code === 0) {
|
||||
RbHighbar.success('删除成功')
|
||||
setTimeout(() => location.reload(), 500)
|
||||
} else RbHighbar.error(res.error_msg)
|
||||
})
|
||||
}
|
||||
}
|
|
@ -1,74 +1,53 @@
|
|||
|
||||
$(document).ready(function () {
|
||||
$('.J_add').click(() => { renderRbcomp(<ReporEdit title="添加报表模板" />) })
|
||||
$('.J_add').click(() => { renderRbcomp(<ReporEdit configName="报表模板" />) })
|
||||
renderRbcomp(<ReportList />, 'dataList')
|
||||
})
|
||||
|
||||
class ReportList extends React.Component {
|
||||
class ReportList extends ConfigList {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
this.state = {}
|
||||
this.requestUrl = `${rb.baseUrl}/admin/datas/data-reports/list`
|
||||
}
|
||||
|
||||
render() {
|
||||
return <React.Fragment>
|
||||
{(this.state.list || []).map((item) => {
|
||||
{(this.state.data || []).map((item) => {
|
||||
return <tr key={'api-' + item[0]}>
|
||||
<td>{item[1]}</td>
|
||||
<td>{item[3] || item[2]}</td>
|
||||
<td>{item[3]}</td>
|
||||
<td>{item[2] || item[1]}</td>
|
||||
<td>{item[4] ? '否' : '是'}</td>
|
||||
<td>{item[5]}</td>
|
||||
<td className="actions">
|
||||
<a className="icon" onClick={() => this.delete(item[0])}><i className="zmdi zmdi-settings" /></a>
|
||||
<a className="icon" onClick={() => this.delete(item[0])}><i className="zmdi zmdi-delete" /></a>
|
||||
<a className="icon" onClick={() => this.handleEdit(item)}><i className="zmdi zmdi-settings" /></a>
|
||||
<a className="icon" onClick={() => this.handleDelete(item[0])}><i className="zmdi zmdi-delete" /></a>
|
||||
</td>
|
||||
</tr>
|
||||
})}
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
this.loadData()
|
||||
handleEdit(item) {
|
||||
renderRbcomp(<ReporEdit configName="报表模板" id={item[0]} name={item[3]} isDisabled={item[4]} />)
|
||||
}
|
||||
|
||||
loadData(entity) {
|
||||
$.get(`${rb.baseUrl}/admin/datas/data-reports/list?entity=${entity || ''}`, (res) => {
|
||||
this.setState({ list: res.data || [] }, () => {
|
||||
$('.rb-loading-active').removeClass('rb-loading-active')
|
||||
$('.dataTables_info').text(`共 ${this.state.list.length} 项`)
|
||||
|
||||
if (this.state.list.length === 0) $('.list-nodata').removeClass('hide')
|
||||
else $('.list-nodata').addClass('hide')
|
||||
|
||||
if (!this.__treeRendered) this.renderEntityTree()
|
||||
})
|
||||
})
|
||||
handleDelete(id) {
|
||||
let handle = super.handleDelete
|
||||
RbAlert.create('确认删除此报表模板?', {
|
||||
html: true,
|
||||
type: 'danger',
|
||||
confirmText: '删除',
|
||||
confirm: function () {
|
||||
this.disabled(true)
|
||||
handle(id)
|
||||
}
|
||||
|
||||
renderEntityTree() {
|
||||
this.__treeRendered = true
|
||||
const dest = $('.dept-tree ul')
|
||||
const ues = []
|
||||
$(this.state.list).each(function () {
|
||||
if (!ues.contains(this[2])) $('<li data-entity="' + this[2] + '"><a class="text-truncate">' + this[3] + '</a></li>').appendTo(dest)
|
||||
ues.push(this[2])
|
||||
})
|
||||
$('<li data-entity="$DISABLED$"><a class="text-truncate">已禁用的</a></li>').appendTo(dest)
|
||||
|
||||
let that = this
|
||||
dest.find('li').click(function () {
|
||||
dest.find('li').removeClass('active')
|
||||
$(this).addClass('active')
|
||||
that.loadData($(this).data('entity'))
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
class ReporEdit extends LiteFormDlg {
|
||||
class ReporEdit extends ConfigFormDlg {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
renderFrom() {
|
||||
return <React.Fragment>
|
||||
<div className="form-group row">
|
||||
|
@ -77,6 +56,8 @@ class ReporEdit extends LiteFormDlg {
|
|||
<input type="text" className="form-control form-control-sm" data-id="name" onChange={this.handleChange} value={this.state.name || ''} />
|
||||
</div>
|
||||
</div>
|
||||
{!this.props.id &&
|
||||
<React.Fragment>
|
||||
<div className="form-group row">
|
||||
<label className="col-sm-3 col-form-label text-sm-right">选择应用实体</label>
|
||||
<div className="col-sm-7">
|
||||
|
@ -99,10 +80,22 @@ class ReporEdit extends LiteFormDlg {
|
|||
</div>
|
||||
</React.Fragment>
|
||||
}
|
||||
|
||||
{this.props.id &&
|
||||
<div className="form-group row">
|
||||
<div className="col-sm-7 offset-sm-3">
|
||||
<label className="custom-control custom-control-sm custom-checkbox custom-control-inline mb-0">
|
||||
<input className="custom-control-input" type="checkbox" checked={this.state.isDisabled === true} data-id="isDisabled" onChange={this.handleChange} />
|
||||
<span className="custom-control-label">是否禁用</span>
|
||||
</label>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
</React.Fragment>
|
||||
}
|
||||
componentDidMount() {
|
||||
super.componentDidMount()
|
||||
|
||||
if (this.__upload) {
|
||||
let that = this
|
||||
$(this.__upload).html5Uploader({
|
||||
postUrl: rb.baseUrl + '/filex/upload?temp=yes',
|
||||
|
@ -121,15 +114,20 @@ class ReporEdit extends LiteFormDlg {
|
|||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
confirm = () => {
|
||||
let post = { name: this.state['name'] }
|
||||
if (!post.name) { RbHighbar.create('请输入报表名称'); return }
|
||||
if (this.props.id) {
|
||||
post.isDisabled = this.state.isDisabled
|
||||
} else {
|
||||
post.belongEntity = this.__select2.val()
|
||||
if (!post.belongEntity) { RbHighbar.create('请选择应用实体'); return }
|
||||
post.templateFile = this.state.templateFile
|
||||
if (!post.templateFile) { RbHighbar.create('请上传模板文件'); return }
|
||||
post.metadata = { entity: 'DataReportConfig' }
|
||||
}
|
||||
post.metadata = { entity: 'DataReportConfig', id: this.props.id }
|
||||
|
||||
this.disabled(true)
|
||||
$.post(rb.baseUrl + '/app/entity/record-save', JSON.stringify(post), (res) => {
|
||||
|
|
|
@ -458,48 +458,6 @@ const UserShow = function (props) {
|
|||
</a>)
|
||||
}
|
||||
|
||||
|
||||
// 轻量级表单
|
||||
class LiteFormDlg extends RbFormHandler {
|
||||
constructor(props) {
|
||||
super(props)
|
||||
}
|
||||
|
||||
render() {
|
||||
return (
|
||||
<RbModal title={this.props.title || ''} ref={(c) => this._dlg = c} disposeOnHide={true}>
|
||||
<div className="form">
|
||||
{this.renderFrom()}
|
||||
<div className="form-group row footer">
|
||||
<div className="col-sm-7 offset-sm-3" ref={(c) => this._btns = c}>
|
||||
<button className="btn btn-primary" type="button" onClick={this.confirm}>确定</button>
|
||||
<a className="btn btn-link" onClick={this.hide}>取消</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</RbModal>
|
||||
)
|
||||
}
|
||||
|
||||
componentDidMount() {
|
||||
if (this._entity) {
|
||||
$.get(`${rb.baseUrl}/commons/metadata/entities`, (res) => {
|
||||
this.setState({ entities: res.data }, () => {
|
||||
this.__select2 = $(this._entity).select2({
|
||||
placeholder: '选择实体',
|
||||
allowClear: false
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
renderFrom() {
|
||||
}
|
||||
confirm = () => {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* JSX 渲染
|
||||
* @param {*} jsx
|
||||
|
|
Loading…
Reference in a new issue