sunlightcs 7 anos atrás
pai
commit
561af4aa19

+ 10 - 4
src/main/java/io/renren/common/utils/Query.java

@ -1,6 +1,7 @@
1 1
package io.renren.common.utils;
2 2
3 3
import io.renren.common.xss.SQLFilter;
4
import org.apache.commons.lang.StringUtils;
4 5
5 6
import java.util.LinkedHashMap;
6 7
import java.util.Map;
@ -30,10 +31,15 @@ public class Query extends LinkedHashMap<String, Object> {
30 31
        this.put("limit", limit);
31 32
32 33
        //防止SQL注入(因为sidx、order是通过拼接SQL实现排序的,会有SQL注入风险)
33
        String sidx = params.get("sidx").toString();
34
        String order = params.get("order").toString();
35
        this.put("sidx", SQLFilter.sqlInject(sidx));
36
        this.put("order", SQLFilter.sqlInject(order));
34
        String sidx = (String)params.get("sidx");
35
        String order = (String)params.get("order");
36
        if(StringUtils.isNotBlank(sidx)){
37
            this.put("sidx", SQLFilter.sqlInject(sidx));
38
        }
39
        if(StringUtils.isNotBlank(order)){
40
            this.put("order", SQLFilter.sqlInject(order));
41
        }
42
37 43
    }
38 44
39 45

+ 19 - 19
src/main/java/io/renren/modules/sys/controller/SysMenuController.java

@ -4,8 +4,6 @@ import io.renren.common.annotation.SysLog;
4 4
import io.renren.common.exception.RRException;
5 5
import io.renren.common.utils.Constant;
6 6
import io.renren.common.utils.Constant.MenuType;
7
import io.renren.common.utils.PageUtils;
8
import io.renren.common.utils.Query;
9 7
import io.renren.common.utils.R;
10 8
import io.renren.modules.sys.entity.SysMenuEntity;
11 9
import io.renren.modules.sys.service.ShiroService;
@ -13,11 +11,13 @@ import io.renren.modules.sys.service.SysMenuService;
13 11
import org.apache.commons.lang.StringUtils;
14 12
import org.apache.shiro.authz.annotation.RequiresPermissions;
15 13
import org.springframework.beans.factory.annotation.Autowired;
16
import org.springframework.web.bind.annotation.*;
14
import org.springframework.web.bind.annotation.PathVariable;
15
import org.springframework.web.bind.annotation.RequestBody;
16
import org.springframework.web.bind.annotation.RequestMapping;
17
import org.springframework.web.bind.annotation.RestController;
17 18
18 19
import java.util.HashMap;
19 20
import java.util.List;
20
import java.util.Map;
21 21
import java.util.Set;
22 22
23 23
/**
@ -40,15 +40,10 @@ public class SysMenuController extends AbstractController {
40 40
	 */
41 41
	@RequestMapping("/list")
42 42
	@RequiresPermissions("sys:menu:list")
43
	public R list(@RequestParam Map<String, Object> params){
44
		//查询列表数据
45
		Query query = new Query(params);
46
		List<SysMenuEntity> menuList = sysMenuService.queryList(query);
47
		int total = sysMenuService.queryTotal(query);
48
		
49
		PageUtils pageUtil = new PageUtils(menuList, total, query.getLimit(), query.getPage());
50
		
51
		return R.ok().put("page", pageUtil);
43
	public List<SysMenuEntity> list(){
44
		List<SysMenuEntity> menuList = sysMenuService.queryList(new HashMap<String, Object>());
45
46
		return menuList;
52 47
	}
53 48
	
54 49
	/**
@ -136,13 +131,18 @@ public class SysMenuController extends AbstractController {
136 131
	@SysLog("删除菜单")
137 132
	@RequestMapping("/delete")
138 133
	@RequiresPermissions("sys:menu:delete")
139
	public R delete(@RequestBody Long[] menuIds){
140
		for(Long menuId : menuIds){
141
			if(menuId.longValue() <= 30){
142
				return R.error("系统菜单,不能删除");
143
			}
134
	public R delete(long menuId){
135
		if(menuId <= 30){
136
			return R.error("系统菜单,不能删除");
137
		}
138
139
		//判断是否有子菜单或按钮
140
		List<SysMenuEntity> menuList = sysMenuService.queryListParentId(menuId);
141
		if(menuList.size() > 0){
142
			return R.error("请先删除子菜单或按钮");
144 143
		}
145
		sysMenuService.deleteBatch(menuIds);
144
145
		sysMenuService.deleteBatch(new Long[]{menuId});
146 146
		
147 147
		return R.ok();
148 148
	}

+ 6 - 0
src/main/java/io/renren/modules/sys/service/SysMenuService.java

@ -21,6 +21,12 @@ public interface SysMenuService {
21 21
	 * @param menuIdList  用户菜单ID
22 22
	 */
23 23
	List<SysMenuEntity> queryListParentId(Long parentId, List<Long> menuIdList);
24
25
	/**
26
	 * 根据父菜单,查询子菜单
27
	 * @param parentId 父菜单ID
28
	 */
29
	List<SysMenuEntity> queryListParentId(Long parentId);
24 30
	
25 31
	/**
26 32
	 * 获取不包含按钮的菜单列表

+ 6 - 1
src/main/java/io/renren/modules/sys/service/impl/SysMenuServiceImpl.java

@ -24,7 +24,7 @@ public class SysMenuServiceImpl implements SysMenuService {
24 24
	
25 25
	@Override
26 26
	public List<SysMenuEntity> queryListParentId(Long parentId, List<Long> menuIdList) {
27
		List<SysMenuEntity> menuList = sysMenuDao.queryListParentId(parentId);
27
		List<SysMenuEntity> menuList = queryListParentId(parentId);
28 28
		if(menuIdList == null){
29 29
			return menuList;
30 30
		}
@ -38,6 +38,11 @@ public class SysMenuServiceImpl implements SysMenuService {
38 38
		return userMenuList;
39 39
	}
40 40
41
	@Override
42
	public List<SysMenuEntity> queryListParentId(Long parentId) {
43
		return sysMenuDao.queryListParentId(parentId);
44
	}
45
41 46
	@Override
42 47
	public List<SysMenuEntity> queryNotButtonList() {
43 48
		return sysMenuDao.queryNotButtonList();

+ 1 - 0
src/main/resources/static/css/bootstrap-table.min.css

@ -0,0 +1 @@
1
.fixed-table-container .bs-checkbox,.fixed-table-container .no-records-found{text-align:center}.fixed-table-body thead th .th-inner,.table td,.table th{box-sizing:border-box}.bootstrap-table .table{margin-bottom:0!important;border-bottom:1px solid #ddd;border-collapse:collapse!important;border-radius:1px}.bootstrap-table .table:not(.table-condensed),.bootstrap-table .table:not(.table-condensed)>tbody>tr>td,.bootstrap-table .table:not(.table-condensed)>tbody>tr>th,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>td,.bootstrap-table .table:not(.table-condensed)>tfoot>tr>th,.bootstrap-table .table:not(.table-condensed)>thead>tr>td{padding:8px}.bootstrap-table .table.table-no-bordered>tbody>tr>td,.bootstrap-table .table.table-no-bordered>thead>tr>th{border-right:2px solid transparent}.bootstrap-table .table.table-no-bordered>tbody>tr>td:last-child{border-right:none}.fixed-table-container{position:relative;clear:both;border:1px solid #ddd;border-radius:4px;-webkit-border-radius:4px;-moz-border-radius:4px}.fixed-table-container.table-no-bordered{border:1px solid transparent}.fixed-table-footer,.fixed-table-header{overflow:hidden}.fixed-table-footer{border-top:1px solid #ddd}.fixed-table-body{overflow-x:auto;overflow-y:auto;height:100%}.fixed-table-container table{width:100%}.fixed-table-container thead th{height:0;padding:0;margin:0;border-left:1px solid #ddd}.fixed-table-container thead th:focus{outline:transparent solid 0}.fixed-table-container thead th:first-child{border-left:none;border-top-left-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px}.fixed-table-container tbody td .th-inner,.fixed-table-container thead th .th-inner{padding:8px;line-height:24px;vertical-align:top;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.fixed-table-container thead th .sortable{cursor:pointer;background-position:right;background-repeat:no-repeat;padding-right:30px}.fixed-table-container thead th .both{background-image:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC')}.fixed-table-container thead th .asc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==)}.fixed-table-container thead th .desc{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII=)}.fixed-table-container th.detail{width:30px}.fixed-table-container tbody td{border-left:1px solid #ddd}.fixed-table-container tbody tr:first-child td{border-top:none}.fixed-table-container tbody td:first-child{border-left:none}.fixed-table-container tbody .selected td{background-color:#f5f5f5}.fixed-table-container .bs-checkbox .th-inner{padding:8px 0}.fixed-table-container input[type=radio],.fixed-table-container input[type=checkbox]{margin:0 auto!important}.fixed-table-pagination .pagination-detail,.fixed-table-pagination div.pagination{margin-top:10px;margin-bottom:10px}.fixed-table-pagination div.pagination .pagination{margin:0}.fixed-table-pagination .pagination a{padding:6px 12px;line-height:1.428571429}.fixed-table-pagination .pagination-info{line-height:34px;margin-right:5px}.fixed-table-pagination .btn-group{position:relative;display:inline-block;vertical-align:middle}.fixed-table-pagination .dropup .dropdown-menu{margin-bottom:0}.fixed-table-pagination .page-list{display:inline-block}.fixed-table-toolbar .columns-left{margin-right:5px}.fixed-table-toolbar .columns-right{margin-left:5px}.fixed-table-toolbar .columns label{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.428571429}.fixed-table-toolbar .bs-bars,.fixed-table-toolbar .columns,.fixed-table-toolbar .search{position:relative;margin-top:0px;margin-bottom:0px;line-height:34px}.fixed-table-pagination li.disabled a{pointer-events:none;cursor:default}.fixed-table-loading{display:none;position:absolute;top:42px;right:0;bottom:0;left:0;z-index:99;background-color:#fff;text-align:center}.fixed-table-body .card-view .title{font-weight:700;display:inline-block;min-width:30%;text-align:left!important}.table td,.table th{vertical-align:middle}.fixed-table-toolbar .dropdown-menu{text-align:left;max-height:300px;overflow:auto}.fixed-table-toolbar .btn-group>.btn-group{display:inline-block;margin-left:-1px!important}.fixed-table-toolbar .btn-group>.btn-group>.btn{border-radius:0}.fixed-table-toolbar .btn-group>.btn-group:first-child>.btn{border-top-left-radius:4px;border-bottom-left-radius:4px}.fixed-table-toolbar .btn-group>.btn-group:last-child>.btn{border-top-right-radius:4px;border-bottom-right-radius:4px}.bootstrap-table .table>thead>tr>th{vertical-align:bottom;border-bottom:1px solid #ddd}.bootstrap-table .table thead>tr>th{padding:0;margin:0}.bootstrap-table .fixed-table-footer tbody>tr>td{padding:0!important}.bootstrap-table .fixed-table-footer .table{border-bottom:none;border-radius:0;padding:0!important}.bootstrap-table .pull-right .dropdown-menu{right:0;left:auto}p.fixed-table-scroll-inner{width:100%;height:200px}div.fixed-table-scroll-outer{top:0;left:0;visibility:hidden;width:200px;height:150px;overflow:hidden}.fixed-table-pagination:after,.fixed-table-toolbar:after{content:"";display:block;clear:both}

+ 175 - 172
src/main/resources/static/js/modules/sys/menu.js

@ -1,183 +1,186 @@
1
$(function () {
2
    $("#jqGrid").jqGrid({
3
        url: baseURL + 'sys/menu/list',
4
        datatype: "json",
5
        colModel: [			
6
			{ label: '菜单ID', name: 'menuId', index: "menu_id", width: 40, key: true },
7
			{ label: '菜单名称', name: 'name', width: 60 },
8
			{ label: '上级菜单', name: 'parentName', sortable: false, width: 60 },
9
			{ label: '菜单图标', name: 'icon', sortable: false, width: 50, formatter: function(value, options, row){
10
				return value == null ? '' : '<i class="'+value+' fa-lg"></i>';
11
			}},
12
			{ label: '菜单URL', name: 'url', width: 100 },
13
			{ label: '授权标识', name: 'perms', width: 100 },
14
			{ label: '类型', name: 'type', width: 50, formatter: function(value, options, row){
15
				if(value === 0){
16
					return '<span class="label label-primary">目录</span>';
17
				}
18
				if(value === 1){
19
					return '<span class="label label-success">菜单</span>';
20
				}
21
				if(value === 2){
22
					return '<span class="label label-warning">按钮</span>';
23
				}
24
			}},
25
			{ label: '排序号', name: 'orderNum', index: "order_num", width: 50}
26
        ],
27
		viewrecords: true,
28
        height: 385,
29
        rowNum: 10,
30
		rowList : [10,30,50],
31
        rownumbers: true, 
32
        rownumWidth: 25, 
33
        autowidth:true,
34
        multiselect: true,
35
        pager: "#jqGridPager",
36
        jsonReader : {
37
            root: "page.list",
38
            page: "page.currPage",
39
            total: "page.totalPage",
40
            records: "page.totalCount"
41
        },
42
        prmNames : {
43
            page:"page", 
44
            rows:"limit", 
45
            order: "order"
1
var setting = {
2
    data: {
3
        simpleData: {
4
            enable: true,
5
            idKey: "menuId",
6
            pIdKey: "parentId",
7
            rootPId: -1
46 8
        },
47
        gridComplete:function(){
48
        	//隐藏grid底部滚动条
49
        	$("#jqGrid").closest(".ui-jqgrid-bdiv").css({ "overflow-x" : "hidden" }); 
9
        key: {
10
            url:"nourl"
50 11
        }
51
    });
52
});
53
54
var setting = {
55
	data: {
56
		simpleData: {
57
			enable: true,
58
			idKey: "menuId",
59
			pIdKey: "parentId",
60
			rootPId: -1
61
		},
62
		key: {
63
			url:"nourl"
64
		}
65
	}
12
    }
66 13
};
67 14
var ztree;
68 15
69 16
var vm = new Vue({
70
	el:'#rrapp',
71
	data:{
72
		showList: true,
73
		title: null,
74
		menu:{
75
			parentName:null,
76
			parentId:0,
77
			type:1,
78
			orderNum:0
79
		}
80
	},
81
	methods: {
82
		getMenu: function(menuId){
83
			//加载菜单树
84
			$.get(baseURL + "sys/menu/select", function(r){
85
				ztree = $.fn.zTree.init($("#menuTree"), setting, r.menuList);
86
				var node = ztree.getNodeByParam("menuId", vm.menu.parentId);
87
				ztree.selectNode(node);
88
				
89
				vm.menu.parentName = node.name;
90
			})
91
		},
92
		add: function(){
93
			vm.showList = false;
94
			vm.title = "新增";
95
			vm.menu = {parentName:null,parentId:0,type:1,orderNum:0};
96
			vm.getMenu();
97
		},
98
		update: function () {
99
			var menuId = getSelectedRow();
100
			if(menuId == null){
101
				return ;
102
			}
103
			
104
			$.get(baseURL + "sys/menu/info/"+menuId, function(r){
105
				vm.showList = false;
17
    el:'#rrapp',
18
    data:{
19
        showList: true,
20
        title: null,
21
        menu:{
22
            parentName:null,
23
            parentId:0,
24
            type:1,
25
            orderNum:0
26
        }
27
    },
28
    methods: {
29
        getMenu: function(menuId){
30
            //加载菜单树
31
            $.get(baseURL + "sys/menu/select", function(r){
32
                ztree = $.fn.zTree.init($("#menuTree"), setting, r.menuList);
33
                var node = ztree.getNodeByParam("menuId", vm.menu.parentId);
34
                ztree.selectNode(node);
35
36
                vm.menu.parentName = node.name;
37
            })
38
        },
39
        add: function(){
40
            vm.showList = false;
41
            vm.title = "新增";
42
            vm.menu = {parentName:null,parentId:0,type:1,orderNum:0};
43
            vm.getMenu();
44
        },
45
        update: function () {
46
            var menuId = getMenuId();
47
            if(menuId == null){
48
                return ;
49
            }
50
51
            $.get(baseURL + "sys/menu/info/"+menuId, function(r){
52
                vm.showList = false;
106 53
                vm.title = "修改";
107 54
                vm.menu = r.menu;
108
                
55
109 56
                vm.getMenu();
110 57
            });
111
		},
112
		del: function () {
113
			var menuIds = getSelectedRows();
114
			if(menuIds == null){
115
				return ;
116
			}
117
			
118
			confirm('确定要删除选中的记录?', function(){
119
				$.ajax({
120
					type: "POST",
121
				    url: baseURL + "sys/menu/delete",
122
                    contentType: "application/json",
123
				    data: JSON.stringify(menuIds),
124
				    success: function(r){
125
				    	if(r.code === 0){
126
							alert('操作成功', function(){
127
								vm.reload();
128
							});
129
						}else{
130
							alert(r.msg);
131
						}
132
					}
133
				});
134
			});
135
		},
136
		saveOrUpdate: function (event) {
137
			var url = vm.menu.menuId == null ? "sys/menu/save" : "sys/menu/update";
138
			$.ajax({
139
				type: "POST",
140
			    url: baseURL + url,
58
        },
59
        del: function () {
60
            var menuId = getMenuId();
61
            if(menuId == null){
62
                return ;
63
            }
64
65
            confirm('确定要删除选中的记录?', function(){
66
                $.ajax({
67
                    type: "POST",
68
                    url: baseURL + "sys/menu/delete",
69
                    data: "menuId=" + menuId,
70
                    success: function(r){
71
                        if(r.code === 0){
72
                            alert('操作成功', function(){
73
                                vm.reload();
74
                            });
75
                        }else{
76
                            alert(r.msg);
77
                        }
78
                    }
79
                });
80
            });
81
        },
82
        saveOrUpdate: function (event) {
83
            var url = vm.menu.menuId == null ? "sys/menu/save" : "sys/menu/update";
84
            $.ajax({
85
                type: "POST",
86
                url: baseURL + url,
141 87
                contentType: "application/json",
142
			    data: JSON.stringify(vm.menu),
143
			    success: function(r){
144
			    	if(r.code === 0){
145
						alert('操作成功', function(){
146
							vm.reload();
147
						});
148
					}else{
149
						alert(r.msg);
150
					}
151
				}
152
			});
153
		},
154
		menuTree: function(){
155
			layer.open({
156
				type: 1,
157
				offset: '50px',
158
				skin: 'layui-layer-molv',
159
				title: "选择菜单",
160
				area: ['300px', '450px'],
161
				shade: 0,
162
				shadeClose: false,
163
				content: jQuery("#menuLayer"),
164
				btn: ['确定', '取消'],
165
				btn1: function (index) {
166
					var node = ztree.getSelectedNodes();
167
					//选择上级菜单
168
					vm.menu.parentId = node[0].menuId;
169
					vm.menu.parentName = node[0].name;
170
					
171
					layer.close(index);
172
	            }
173
			});
174
		},
175
		reload: function () {
176
			vm.showList = true;
177
			var page = $("#jqGrid").jqGrid('getGridParam','page');
178
			$("#jqGrid").jqGrid('setGridParam',{ 
179
                page:page
180
            }).trigger("reloadGrid");
181
		}
182
	}
183
});
88
                data: JSON.stringify(vm.menu),
89
                success: function(r){
90
                    if(r.code === 0){
91
                        alert('操作成功', function(){
92
                            vm.reload();
93
                        });
94
                    }else{
95
                        alert(r.msg);
96
                    }
97
                }
98
            });
99
        },
100
        menuTree: function(){
101
            layer.open({
102
                type: 1,
103
                offset: '50px',
104
                skin: 'layui-layer-molv',
105
                title: "选择菜单",
106
                area: ['300px', '450px'],
107
                shade: 0,
108
                shadeClose: false,
109
                content: jQuery("#menuLayer"),
110
                btn: ['确定', '取消'],
111
                btn1: function (index) {
112
                    var node = ztree.getSelectedNodes();
113
                    //选择上级菜单
114
                    vm.menu.parentId = node[0].menuId;
115
                    vm.menu.parentName = node[0].name;
116
117
                    layer.close(index);
118
                }
119
            });
120
        },
121
        reload: function () {
122
            vm.showList = true;
123
            Menu.table.refresh();
124
        }
125
    }
126
});
127
128
129
var Menu = {
130
    id: "menuTable",
131
    table: null,
132
    layerIndex: -1
133
};
134
135
/**
136
 * 初始化表格的列
137
 */
138
Menu.initColumn = function () {
139
    var columns = [
140
        {field: 'selectItem', radio: true},
141
        {title: '菜单ID', field: 'menuId', visible: false, align: 'center', valign: 'middle', width: '80px'},
142
        {title: '菜单名称', field: 'name', align: 'center', valign: 'middle', sortable: true, width: '180px'},
143
        {title: '上级菜单', field: 'parentName', align: 'center', valign: 'middle', sortable: true, width: '100px'},
144
        {title: '图标', field: 'icon', align: 'center', valign: 'middle', sortable: true, width: '80px', formatter: function(item, index){
145
            return item.icon == null ? '' : '<i class="'+item.icon+' fa-lg"></i>';
146
        }},
147
        {title: '类型', field: 'type', align: 'center', valign: 'middle', sortable: true, width: '100px', formatter: function(item, index){
148
            if(item.type === 0){
149
                return '<span class="label label-primary">目录</span>';
150
            }
151
            if(item.type === 1){
152
                return '<span class="label label-success">菜单</span>';
153
            }
154
            if(item.type === 2){
155
                return '<span class="label label-warning">按钮</span>';
156
            }
157
        }},
158
        {title: '排序号', field: 'orderNum', align: 'center', valign: 'middle', sortable: true, width: '100px'},
159
        {title: '菜单URL', field: 'url', align: 'center', valign: 'middle', sortable: true, width: '160px'},
160
        {title: '授权标识', field: 'perms', align: 'center', valign: 'middle', sortable: true}]
161
    return columns;
162
};
163
164
165
function getMenuId () {
166
    var selected = $('#menuTable').bootstrapTreeTable('getSelections');
167
    if (selected.length == 0) {
168
        alert("请选择一条记录");
169
        return false;
170
    } else {
171
        return selected[0].id;
172
    }
173
}
174
175
176
$(function () {
177
    var colunms = Menu.initColumn();
178
    var table = new TreeTable(Menu.id, baseURL + "sys/menu/list", colunms);
179
    table.setExpandColumn(2);
180
    table.setIdField("menuId");
181
    table.setCodeField("menuId");
182
    table.setParentCodeField("parentId");
183
    table.setExpandAll(false);
184
    table.init();
185
    Menu.table = table;
186
});

+ 8 - 0
src/main/resources/static/libs/bootstrap-table.min.js

@ -0,0 +1,8 @@
1
/*
2
* bootstrap-table - v1.11.1 - 2017-02-22
3
* https://github.com/wenzhixin/bootstrap-table
4
* Copyright (c) 2017 zhixin wen
5
* Licensed MIT License
6
*/
7
!function(a){"use strict";var b=null,c=function(a){var b=arguments,c=!0,d=1;return a=a.replace(/%s/g,function(){var a=b[d++];return"undefined"==typeof a?(c=!1,""):a}),c?a:""},d=function(b,c,d,e){var f="";return a.each(b,function(a,b){return b[c]===e?(f=b[d],!1):!0}),f},e=function(b,c){var d=-1;return a.each(b,function(a,b){return b.field===c?(d=a,!1):!0}),d},f=function(b){var c,d,e,f=0,g=[];for(c=0;c<b[0].length;c++)f+=b[0][c].colspan||1;for(c=0;c<b.length;c++)for(g[c]=[],d=0;f>d;d++)g[c][d]=!1;for(c=0;c<b.length;c++)for(d=0;d<b[c].length;d++){var h=b[c][d],i=h.rowspan||1,j=h.colspan||1,k=a.inArray(!1,g[c]);for(1===j&&(h.fieldIndex=k,"undefined"==typeof h.field&&(h.field=k)),e=0;i>e;e++)g[c+e][k]=!0;for(e=0;j>e;e++)g[c][k+e]=!0}},g=function(){if(null===b){var c,d,e=a("<p/>").addClass("fixed-table-scroll-inner"),f=a("<div/>").addClass("fixed-table-scroll-outer");f.append(e),a("body").append(f),c=e[0].offsetWidth,f.css("overflow","scroll"),d=e[0].offsetWidth,c===d&&(d=f[0].clientWidth),f.remove(),b=c-d}return b},h=function(b,d,e,f){var g=d;if("string"==typeof d){var h=d.split(".");h.length>1?(g=window,a.each(h,function(a,b){g=g[b]})):g=window[d]}return"object"==typeof g?g:"function"==typeof g?g.apply(b,e||[]):!g&&"string"==typeof d&&c.apply(this,[d].concat(e))?c.apply(this,[d].concat(e)):f},i=function(b,c,d){var e=Object.getOwnPropertyNames(b),f=Object.getOwnPropertyNames(c),g="";if(d&&e.length!==f.length)return!1;for(var h=0;h<e.length;h++)if(g=e[h],a.inArray(g,f)>-1&&b[g]!==c[g])return!1;return!0},j=function(a){return"string"==typeof a?a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&#039;").replace(/`/g,"&#x60;"):a},k=function(a){for(var b in a){var c=b.split(/(?=[A-Z])/).join("-").toLowerCase();c!==b&&(a[c]=a[b],delete a[b])}return a},l=function(a,b,c){var d=a;if("string"!=typeof b||a.hasOwnProperty(b))return c?j(a[b]):a[b];var e=b.split(".");for(var f in e)e.hasOwnProperty(f)&&(d=d&&d[e[f]]);return c?j(d):d},m=function(){return!!(navigator.userAgent.indexOf("MSIE ")>0||navigator.userAgent.match(/Trident.*rv\:11\./))},n=function(){Object.keys||(Object.keys=function(){var a=Object.prototype.hasOwnProperty,b=!{toString:null}.propertyIsEnumerable("toString"),c=["toString","toLocaleString","valueOf","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","constructor"],d=c.length;return function(e){if("object"!=typeof e&&("function"!=typeof e||null===e))throw new TypeError("Object.keys called on non-object");var f,g,h=[];for(f in e)a.call(e,f)&&h.push(f);if(b)for(g=0;d>g;g++)a.call(e,c[g])&&h.push(c[g]);return h}}())},o=function(b,c){this.options=c,this.$el=a(b),this.$el_=this.$el.clone(),this.timeoutId_=0,this.timeoutFooter_=0,this.init()};o.DEFAULTS={classes:"table table-hover",sortClass:void 0,locale:void 0,height:void 0,undefinedText:"-",sortName:void 0,sortOrder:"asc",sortStable:!1,striped:!1,columns:[[]],data:[],totalField:"total",dataField:"rows",method:"get",url:void 0,ajax:void 0,cache:!0,contentType:"application/json",dataType:"json",ajaxOptions:{},queryParams:function(a){return a},queryParamsType:"limit",responseHandler:function(a){return a},pagination:!1,onlyInfoPagination:!1,paginationLoop:!0,sidePagination:"client",totalRows:0,pageNumber:1,pageSize:10,pageList:[10,25,50,100],paginationHAlign:"right",paginationVAlign:"bottom",paginationDetailHAlign:"left",paginationPreText:"&lsaquo;",paginationNextText:"&rsaquo;",search:!1,searchOnEnterKey:!1,strictSearch:!1,searchAlign:"right",selectItemName:"btSelectItem",showHeader:!0,showFooter:!1,showColumns:!1,showPaginationSwitch:!1,showRefresh:!1,showToggle:!1,buttonsAlign:"right",smartDisplay:!0,escape:!1,minimumCountColumns:1,idField:void 0,uniqueId:void 0,cardView:!1,detailView:!1,detailFormatter:function(){return""},trimOnSearch:!0,clickToSelect:!1,singleSelect:!1,toolbar:void 0,toolbarAlign:"left",checkboxHeader:!0,sortable:!0,silentSort:!0,maintainSelected:!1,searchTimeOut:500,searchText:"",iconSize:void 0,buttonsClass:"default",iconsPrefix:"glyphicon",icons:{paginationSwitchDown:"glyphicon-collapse-down icon-chevron-down",paginationSwitchUp:"glyphicon-collapse-up icon-chevron-up",refresh:"glyphicon-refresh icon-refresh",toggle:"glyphicon-list-alt icon-list-alt",columns:"glyphicon-th icon-th",detailOpen:"glyphicon-plus icon-plus",detailClose:"glyphicon-minus icon-minus"},customSearch:a.noop,customSort:a.noop,rowStyle:function(){return{}},rowAttributes:function(){return{}},footerStyle:function(){return{}},onAll:function(){return!1},onClickCell:function(){return!1},onDblClickCell:function(){return!1},onClickRow:function(){return!1},onDblClickRow:function(){return!1},onSort:function(){return!1},onCheck:function(){return!1},onUncheck:function(){return!1},onCheckAll:function(){return!1},onUncheckAll:function(){return!1},onCheckSome:function(){return!1},onUncheckSome:function(){return!1},onLoadSuccess:function(){return!1},onLoadError:function(){return!1},onColumnSwitch:function(){return!1},onPageChange:function(){return!1},onSearch:function(){return!1},onToggle:function(){return!1},onPreBody:function(){return!1},onPostBody:function(){return!1},onPostHeader:function(){return!1},onExpandRow:function(){return!1},onCollapseRow:function(){return!1},onRefreshOptions:function(){return!1},onRefresh:function(){return!1},onResetView:function(){return!1}},o.LOCALES={},o.LOCALES["en-US"]=o.LOCALES.en={formatLoadingMessage:function(){return"Loading, please wait..."},formatRecordsPerPage:function(a){return c("%s rows per page",a)},formatShowingRows:function(a,b,d){return c("Showing %s to %s of %s rows",a,b,d)},formatDetailPagination:function(a){return c("Showing %s rows",a)},formatSearch:function(){return"Search"},formatNoMatches:function(){return"No matching records found"},formatPaginationSwitch:function(){return"Hide/Show pagination"},formatRefresh:function(){return"Refresh"},formatToggle:function(){return"Toggle"},formatColumns:function(){return"Columns"},formatAllRows:function(){return"All"}},a.extend(o.DEFAULTS,o.LOCALES["en-US"]),o.COLUMN_DEFAULTS={radio:!1,checkbox:!1,checkboxEnabled:!0,field:void 0,title:void 0,titleTooltip:void 0,"class":void 0,align:void 0,halign:void 0,falign:void 0,valign:void 0,width:void 0,sortable:!1,order:"asc",visible:!0,switchable:!0,clickToSelect:!0,formatter:void 0,footerFormatter:void 0,events:void 0,sorter:void 0,sortName:void 0,cellStyle:void 0,searchable:!0,searchFormatter:!0,cardVisible:!0,escape:!1},o.EVENTS={"all.bs.table":"onAll","click-cell.bs.table":"onClickCell","dbl-click-cell.bs.table":"onDblClickCell","click-row.bs.table":"onClickRow","dbl-click-row.bs.table":"onDblClickRow","sort.bs.table":"onSort","check.bs.table":"onCheck","uncheck.bs.table":"onUncheck","check-all.bs.table":"onCheckAll","uncheck-all.bs.table":"onUncheckAll","check-some.bs.table":"onCheckSome","uncheck-some.bs.table":"onUncheckSome","load-success.bs.table":"onLoadSuccess","load-error.bs.table":"onLoadError","column-switch.bs.table":"onColumnSwitch","page-change.bs.table":"onPageChange","search.bs.table":"onSearch","toggle.bs.table":"onToggle","pre-body.bs.table":"onPreBody","post-body.bs.table":"onPostBody","post-header.bs.table":"onPostHeader","expand-row.bs.table":"onExpandRow","collapse-row.bs.table":"onCollapseRow","refresh-options.bs.table":"onRefreshOptions","reset-view.bs.table":"onResetView","refresh.bs.table":"onRefresh"},o.prototype.init=function(){this.initLocale(),this.initContainer(),this.initTable(),this.initHeader(),this.initData(),this.initHiddenRows(),this.initFooter(),this.initToolbar(),this.initPagination(),this.initBody(),this.initSearchText(),this.initServer()},o.prototype.initLocale=function(){if(this.options.locale){var b=this.options.locale.split(/-|_/);b[0].toLowerCase(),b[1]&&b[1].toUpperCase(),a.fn.bootstrapTable.locales[this.options.locale]?a.extend(this.options,a.fn.bootstrapTable.locales[this.options.locale]):a.fn.bootstrapTable.locales[b.join("-")]?a.extend(this.options,a.fn.bootstrapTable.locales[b.join("-")]):a.fn.bootstrapTable.locales[b[0]]&&a.extend(this.options,a.fn.bootstrapTable.locales[b[0]])}},o.prototype.initContainer=function(){this.$container=a(['<div class="bootstrap-table">','<div class="fixed-table-toolbar"></div>',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination" style="clear: both;"></div>':"",'<div class="fixed-table-container">','<div class="fixed-table-header"><table></table></div>','<div class="fixed-table-body">','<div class="fixed-table-loading">',this.options.formatLoadingMessage(),"</div>","</div>",'<div class="fixed-table-footer"><table><tr></tr></table></div>',"bottom"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?'<div class="fixed-table-pagination"></div>':"","</div>","</div>"].join("")),this.$container.insertAfter(this.$el),this.$tableContainer=this.$container.find(".fixed-table-container"),this.$tableHeader=this.$container.find(".fixed-table-header"),this.$tableBody=this.$container.find(".fixed-table-body"),this.$tableLoading=this.$container.find(".fixed-table-loading"),this.$tableFooter=this.$container.find(".fixed-table-footer"),this.$toolbar=this.$container.find(".fixed-table-toolbar"),this.$pagination=this.$container.find(".fixed-table-pagination"),this.$tableBody.append(this.$el),this.$container.after('<div class="clearfix"></div>'),this.$el.addClass(this.options.classes),this.options.striped&&this.$el.addClass("table-striped"),-1!==a.inArray("table-no-bordered",this.options.classes.split(" "))&&this.$tableContainer.addClass("table-no-bordered")},o.prototype.initTable=function(){var b=this,c=[],d=[];if(this.$header=this.$el.find(">thead"),this.$header.length||(this.$header=a("<thead></thead>").appendTo(this.$el)),this.$header.find("tr").each(function(){var b=[];a(this).find("th").each(function(){"undefined"!=typeof a(this).data("field")&&a(this).data("field",a(this).data("field")+""),b.push(a.extend({},{title:a(this).html(),"class":a(this).attr("class"),titleTooltip:a(this).attr("title"),rowspan:a(this).attr("rowspan")?+a(this).attr("rowspan"):void 0,colspan:a(this).attr("colspan")?+a(this).attr("colspan"):void 0},a(this).data()))}),c.push(b)}),a.isArray(this.options.columns[0])||(this.options.columns=[this.options.columns]),this.options.columns=a.extend(!0,[],c,this.options.columns),this.columns=[],f(this.options.columns),a.each(this.options.columns,function(c,d){a.each(d,function(d,e){e=a.extend({},o.COLUMN_DEFAULTS,e),"undefined"!=typeof e.fieldIndex&&(b.columns[e.fieldIndex]=e),b.options.columns[c][d]=e})}),!this.options.data.length){var e=[];this.$el.find(">tbody>tr").each(function(c){var f={};f._id=a(this).attr("id"),f._class=a(this).attr("class"),f._data=k(a(this).data()),a(this).find(">td").each(function(d){for(var g,h,i=a(this),j=+i.attr("colspan")||1,l=+i.attr("rowspan")||1;e[c]&&e[c][d];d++);for(g=d;d+j>g;g++)for(h=c;c+l>h;h++)e[h]||(e[h]=[]),e[h][g]=!0;var m=b.columns[d].field;f[m]=a(this).html(),f["_"+m+"_id"]=a(this).attr("id"),f["_"+m+"_class"]=a(this).attr("class"),f["_"+m+"_rowspan"]=a(this).attr("rowspan"),f["_"+m+"_colspan"]=a(this).attr("colspan"),f["_"+m+"_title"]=a(this).attr("title"),f["_"+m+"_data"]=k(a(this).data())}),d.push(f)}),this.options.data=d,d.length&&(this.fromHtml=!0)}},o.prototype.initHeader=function(){var b=this,d={},e=[];this.header={fields:[],styles:[],classes:[],formatters:[],events:[],sorters:[],sortNames:[],cellStyles:[],searchables:[]},a.each(this.options.columns,function(f,g){e.push("<tr>"),0===f&&!b.options.cardView&&b.options.detailView&&e.push(c('<th class="detail" rowspan="%s"><div class="fht-cell"></div></th>',b.options.columns.length)),a.each(g,function(a,f){var g="",h="",i="",k="",l=c(' class="%s"',f["class"]),m=(b.options.sortOrder||f.order,"px"),n=f.width;if(void 0===f.width||b.options.cardView||"string"==typeof f.width&&-1!==f.width.indexOf("%")&&(m="%"),f.width&&"string"==typeof f.width&&(n=f.width.replace("%","").replace("px","")),h=c("text-align: %s; ",f.halign?f.halign:f.align),i=c("text-align: %s; ",f.align),k=c("vertical-align: %s; ",f.valign),k+=c("width: %s; ",!f.checkbox&&!f.radio||n?n?n+m:void 0:"36px"),"undefined"!=typeof f.fieldIndex){if(b.header.fields[f.fieldIndex]=f.field,b.header.styles[f.fieldIndex]=i+k,b.header.classes[f.fieldIndex]=l,b.header.formatters[f.fieldIndex]=f.formatter,b.header.events[f.fieldIndex]=f.events,b.header.sorters[f.fieldIndex]=f.sorter,b.header.sortNames[f.fieldIndex]=f.sortName,b.header.cellStyles[f.fieldIndex]=f.cellStyle,b.header.searchables[f.fieldIndex]=f.searchable,!f.visible)return;if(b.options.cardView&&!f.cardVisible)return;d[f.field]=f}e.push("<th"+c(' title="%s"',f.titleTooltip),f.checkbox||f.radio?c(' class="bs-checkbox %s"',f["class"]||""):l,c(' style="%s"',h+k),c(' rowspan="%s"',f.rowspan),c(' colspan="%s"',f.colspan),c(' data-field="%s"',f.field),">"),e.push(c('<div class="th-inner %s">',b.options.sortable&&f.sortable?"sortable both":"")),g=b.options.escape?j(f.title):f.title,f.checkbox&&(!b.options.singleSelect&&b.options.checkboxHeader&&(g='<input name="btSelectAll" type="checkbox" />'),b.header.stateField=f.field),f.radio&&(g="",b.header.stateField=f.field,b.options.singleSelect=!0),e.push(g),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</th>")}),e.push("</tr>")}),this.$header.html(e.join("")),this.$header.find("th[data-field]").each(function(){a(this).data(d[a(this).data("field")])}),this.$container.off("click",".th-inner").on("click",".th-inner",function(c){var d=a(this);return b.options.detailView&&d.closest(".bootstrap-table")[0]!==b.$container[0]?!1:void(b.options.sortable&&d.parent().data().sortable&&b.onSort(c))}),this.$header.children().children().off("keypress").on("keypress",function(c){if(b.options.sortable&&a(this).data().sortable){var d=c.keyCode||c.which;13==d&&b.onSort(c)}}),a(window).off("resize.bootstrap-table"),!this.options.showHeader||this.options.cardView?(this.$header.hide(),this.$tableHeader.hide(),this.$tableLoading.css("top",0)):(this.$header.show(),this.$tableHeader.show(),this.$tableLoading.css("top",this.$header.outerHeight()+1),this.getCaret(),a(window).on("resize.bootstrap-table",a.proxy(this.resetWidth,this))),this.$selectAll=this.$header.find('[name="btSelectAll"]'),this.$selectAll.off("click").on("click",function(){var c=a(this).prop("checked");b[c?"checkAll":"uncheckAll"](),b.updateSelected()})},o.prototype.initFooter=function(){!this.options.showFooter||this.options.cardView?this.$tableFooter.hide():this.$tableFooter.show()},o.prototype.initData=function(a,b){this.data="append"===b?this.data.concat(a):"prepend"===b?[].concat(a).concat(this.data):a||this.options.data,this.options.data="append"===b?this.options.data.concat(a):"prepend"===b?[].concat(a).concat(this.options.data):this.data,"server"!==this.options.sidePagination&&this.initSort()},o.prototype.initSort=function(){var b=this,d=this.options.sortName,e="desc"===this.options.sortOrder?-1:1,f=a.inArray(this.options.sortName,this.header.fields),g=0;return this.options.customSort!==a.noop?void this.options.customSort.apply(this,[this.options.sortName,this.options.sortOrder]):void(-1!==f&&(this.options.sortStable&&a.each(this.data,function(a,b){b.hasOwnProperty("_position")||(b._position=a)}),this.data.sort(function(c,g){b.header.sortNames[f]&&(d=b.header.sortNames[f]);var i=l(c,d,b.options.escape),j=l(g,d,b.options.escape),k=h(b.header,b.header.sorters[f],[i,j]);return void 0!==k?e*k:((void 0===i||null===i)&&(i=""),(void 0===j||null===j)&&(j=""),b.options.sortStable&&i===j&&(i=c._position,j=g._position),a.isNumeric(i)&&a.isNumeric(j)?(i=parseFloat(i),j=parseFloat(j),j>i?-1*e:e):i===j?0:("string"!=typeof i&&(i=i.toString()),-1===i.localeCompare(j)?-1*e:e))}),void 0!==this.options.sortClass&&(clearTimeout(g),g=setTimeout(function(){b.$el.removeClass(b.options.sortClass);var a=b.$header.find(c('[data-field="%s"]',b.options.sortName).index()+1);b.$el.find(c("tr td:nth-child(%s)",a)).addClass(b.options.sortClass)},250))))},o.prototype.onSort=function(b){var c="keypress"===b.type?a(b.currentTarget):a(b.currentTarget).parent(),d=this.$header.find("th").eq(c.index());return this.$header.add(this.$header_).find("span.order").remove(),this.options.sortName===c.data("field")?this.options.sortOrder="asc"===this.options.sortOrder?"desc":"asc":(this.options.sortName=c.data("field"),this.options.sortOrder="asc"===c.data("order")?"desc":"asc"),this.trigger("sort",this.options.sortName,this.options.sortOrder),c.add(d).data("order",this.options.sortOrder),this.getCaret(),"server"===this.options.sidePagination?void this.initServer(this.options.silentSort):(this.initSort(),void this.initBody())},o.prototype.initToolbar=function(){var b,d,e=this,f=[],g=0,i=0;this.$toolbar.find(".bs-bars").children().length&&a("body").append(a(this.options.toolbar)),this.$toolbar.html(""),("string"==typeof this.options.toolbar||"object"==typeof this.options.toolbar)&&a(c('<div class="bs-bars pull-%s"></div>',this.options.toolbarAlign)).appendTo(this.$toolbar).append(a(this.options.toolbar)),f=[c('<div class="columns columns-%s btn-group pull-%s">',this.options.buttonsAlign,this.options.buttonsAlign)],"string"==typeof this.options.icons&&(this.options.icons=h(null,this.options.icons)),this.options.showPaginationSwitch&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="paginationSwitch" aria-label="pagination Switch" title="%s">',this.options.formatPaginationSwitch()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.paginationSwitchDown),"</button>"),this.options.showRefresh&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="refresh" aria-label="refresh" title="%s">',this.options.formatRefresh()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.refresh),"</button>"),this.options.showToggle&&f.push(c('<button class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+'" type="button" name="toggle" aria-label="toggle" title="%s">',this.options.formatToggle()),c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.toggle),"</button>"),this.options.showColumns&&(f.push(c('<div class="keep-open btn-group" title="%s">',this.options.formatColumns()),'<button type="button" aria-label="columns" class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.columns),' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'),a.each(this.columns,function(a,b){if(!(b.radio||b.checkbox||e.options.cardView&&!b.cardVisible)){var d=b.visible?' checked="checked"':"";b.switchable&&(f.push(c('<li role="menuitem"><label><input type="checkbox" data-field="%s" value="%s"%s> %s</label></li>',b.field,a,d,b.title)),i++)}}),f.push("</ul>","</div>")),f.push("</div>"),(this.showToolbar||f.length>2)&&this.$toolbar.append(f.join("")),this.options.showPaginationSwitch&&this.$toolbar.find('button[name="paginationSwitch"]').off("click").on("click",a.proxy(this.togglePagination,this)),this.options.showRefresh&&this.$toolbar.find('button[name="refresh"]').off("click").on("click",a.proxy(this.refresh,this)),this.options.showToggle&&this.$toolbar.find('button[name="toggle"]').off("click").on("click",function(){e.toggleView()}),this.options.showColumns&&(b=this.$toolbar.find(".keep-open"),i<=this.options.minimumCountColumns&&b.find("input").prop("disabled",!0),b.find("li").off("click").on("click",function(a){a.stopImmediatePropagation()}),b.find("input").off("click").on("click",function(){var b=a(this);e.toggleColumn(a(this).val(),b.prop("checked"),!1),e.trigger("column-switch",a(this).data("field"),b.prop("checked"))})),this.options.search&&(f=[],f.push('<div class="pull-'+this.options.searchAlign+' search">',c('<input class="form-control'+c(" input-%s",this.options.iconSize)+'" type="text" placeholder="%s">',this.options.formatSearch()),"</div>"),this.$toolbar.append(f.join("")),d=this.$toolbar.find(".search input"),d.off("keyup drop blur").on("keyup drop blur",function(b){e.options.searchOnEnterKey&&13!==b.keyCode||a.inArray(b.keyCode,[37,38,39,40])>-1||(clearTimeout(g),g=setTimeout(function(){e.onSearch(b)},e.options.searchTimeOut))}),m()&&d.off("mouseup").on("mouseup",function(a){clearTimeout(g),g=setTimeout(function(){e.onSearch(a)},e.options.searchTimeOut)}))},o.prototype.onSearch=function(b){var c=a.trim(a(b.currentTarget).val());this.options.trimOnSearch&&a(b.currentTarget).val()!==c&&a(b.currentTarget).val(c),c!==this.searchText&&(this.searchText=c,this.options.searchText=c,this.options.pageNumber=1,this.initSearch(),this.updatePagination(),this.trigger("search",c))},o.prototype.initSearch=function(){var b=this;if("server"!==this.options.sidePagination){if(this.options.customSearch!==a.noop)return void this.options.customSearch.apply(this,[this.searchText]);var c=this.searchText&&(this.options.escape?j(this.searchText):this.searchText).toLowerCase(),d=a.isEmptyObject(this.filterColumns)?null:this.filterColumns;this.data=d?a.grep(this.options.data,function(b){for(var c in d)if(a.isArray(d[c])&&-1===a.inArray(b[c],d[c])||!a.isArray(d[c])&&b[c]!==d[c])return!1;return!0}):this.options.data,this.data=c?a.grep(this.data,function(d,f){for(var g=0;g<b.header.fields.length;g++)if(b.header.searchables[g]){var i,j=a.isNumeric(b.header.fields[g])?parseInt(b.header.fields[g],10):b.header.fields[g],k=b.columns[e(b.columns,j)];if("string"==typeof j){i=d;for(var l=j.split("."),m=0;m<l.length;m++)i=i[l[m]];k&&k.searchFormatter&&(i=h(k,b.header.formatters[g],[i,d,f],i))}else i=d[j];if("string"==typeof i||"number"==typeof i)if(b.options.strictSearch){if((i+"").toLowerCase()===c)return!0}else if(-1!==(i+"").toLowerCase().indexOf(c))return!0}return!1}):this.data}},o.prototype.initPagination=function(){if(!this.options.pagination)return void this.$pagination.hide();this.$pagination.show();var b,d,e,f,g,h,i,j,k,l=this,m=[],n=!1,o=this.getData(),p=this.options.pageList;if("server"!==this.options.sidePagination&&(this.options.totalRows=o.length),this.totalPages=0,this.options.totalRows){if(this.options.pageSize===this.options.formatAllRows())this.options.pageSize=this.options.totalRows,n=!0;else if(this.options.pageSize===this.options.totalRows){var q="string"==typeof this.options.pageList?this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").toLowerCase().split(","):this.options.pageList;a.inArray(this.options.formatAllRows().toLowerCase(),q)>-1&&(n=!0)}this.totalPages=~~((this.options.totalRows-1)/this.options.pageSize)+1,this.options.totalPages=this.totalPages}if(this.totalPages>0&&this.options.pageNumber>this.totalPages&&(this.options.pageNumber=this.totalPages),this.pageFrom=(this.options.pageNumber-1)*this.options.pageSize+1,this.pageTo=this.options.pageNumber*this.options.pageSize,this.pageTo>this.options.totalRows&&(this.pageTo=this.options.totalRows),m.push('<div class="pull-'+this.options.paginationDetailHAlign+' pagination-detail">','<span class="pagination-info">',this.options.onlyInfoPagination?this.options.formatDetailPagination(this.options.totalRows):this.options.formatShowingRows(this.pageFrom,this.pageTo,this.options.totalRows),"</span>"),!this.options.onlyInfoPagination){m.push('<span class="page-list">');var r=[c('<span class="btn-group %s">',"top"===this.options.paginationVAlign||"both"===this.options.paginationVAlign?"dropdown":"dropup"),'<button type="button" class="btn'+c(" btn-%s",this.options.buttonsClass)+c(" btn-%s",this.options.iconSize)+' dropdown-toggle" data-toggle="dropdown">','<span class="page-size">',n?this.options.formatAllRows():this.options.pageSize,"</span>",' <span class="caret"></span>',"</button>",'<ul class="dropdown-menu" role="menu">'];if("string"==typeof this.options.pageList){var s=this.options.pageList.replace("[","").replace("]","").replace(/ /g,"").split(",");p=[],a.each(s,function(a,b){p.push(b.toUpperCase()===l.options.formatAllRows().toUpperCase()?l.options.formatAllRows():+b)})}for(a.each(p,function(a,b){if(!l.options.smartDisplay||0===a||p[a-1]<l.options.totalRows){var d;d=n?b===l.options.formatAllRows()?' class="active"':"":b===l.options.pageSize?' class="active"':"",r.push(c('<li role="menuitem"%s><a href="#">%s</a></li>',d,b))}}),r.push("</ul></span>"),m.push(this.options.formatRecordsPerPage(r.join(""))),m.push("</span>"),m.push("</div>",'<div class="pull-'+this.options.paginationHAlign+' pagination">','<ul class="pagination'+c(" pagination-%s",this.options.iconSize)+'">','<li class="page-pre"><a href="#">'+this.options.paginationPreText+"</a></li>"),this.totalPages<5?(d=1,e=this.totalPages):(d=this.options.pageNumber-2,e=d+4,1>d&&(d=1,e=5),e>this.totalPages&&(e=this.totalPages,d=e-4)),this.totalPages>=6&&(this.options.pageNumber>=3&&(m.push('<li class="page-first'+(1===this.options.pageNumber?" active":"")+'">','<a href="#">',1,"</a>","</li>"),d++),this.options.pageNumber>=4&&(4==this.options.pageNumber||6==this.totalPages||7==this.totalPages?d--:m.push('<li class="page-first-separator disabled">','<a href="#">...</a>',"</li>"),e--)),this.totalPages>=7&&this.options.pageNumber>=this.totalPages-2&&d--,6==this.totalPages?this.options.pageNumber>=this.totalPages-2&&e++:this.totalPages>=7&&(7==this.totalPages||this.options.pageNumber>=this.totalPages-3)&&e++,b=d;e>=b;b++)m.push('<li class="page-number'+(b===this.options.pageNumber?" active":"")+'">','<a href="#">',b,"</a>","</li>");this.totalPages>=8&&this.options.pageNumber<=this.totalPages-4&&m.push('<li class="page-last-separator disabled">','<a href="#">...</a>',"</li>"),this.totalPages>=6&&this.options.pageNumber<=this.totalPages-3&&m.push('<li class="page-last'+(this.totalPages===this.options.pageNumber?" active":"")+'">','<a href="#">',this.totalPages,"</a>","</li>"),m.push('<li class="page-next"><a href="#">'+this.options.paginationNextText+"</a></li>","</ul>","</div>")}this.$pagination.html(m.join("")),this.options.onlyInfoPagination||(f=this.$pagination.find(".page-list a"),g=this.$pagination.find(".page-first"),h=this.$pagination.find(".page-pre"),i=this.$pagination.find(".page-next"),j=this.$pagination.find(".page-last"),k=this.$pagination.find(".page-number"),this.options.smartDisplay&&(this.totalPages<=1&&this.$pagination.find("div.pagination").hide(),(p.length<2||this.options.totalRows<=p[0])&&this.$pagination.find("span.page-list").hide(),this.$pagination[this.getData().length?"show":"hide"]()),this.options.paginationLoop||(1===this.options.pageNumber&&h.addClass("disabled"),this.options.pageNumber===this.totalPages&&i.addClass("disabled")),n&&(this.options.pageSize=this.options.formatAllRows()),f.off("click").on("click",a.proxy(this.onPageListChange,this)),g.off("click").on("click",a.proxy(this.onPageFirst,this)),h.off("click").on("click",a.proxy(this.onPagePre,this)),i.off("click").on("click",a.proxy(this.onPageNext,this)),j.off("click").on("click",a.proxy(this.onPageLast,this)),k.off("click").on("click",a.proxy(this.onPageNumber,this)))},o.prototype.updatePagination=function(b){b&&a(b.currentTarget).hasClass("disabled")||(this.options.maintainSelected||this.resetRows(),this.initPagination(),"server"===this.options.sidePagination?this.initServer():this.initBody(),this.trigger("page-change",this.options.pageNumber,this.options.pageSize))},o.prototype.onPageListChange=function(b){var c=a(b.currentTarget);return c.parent().addClass("active").siblings().removeClass("active"),this.options.pageSize=c.text().toUpperCase()===this.options.formatAllRows().toUpperCase()?this.options.formatAllRows():+c.text(),this.$toolbar.find(".page-size").text(this.options.pageSize),this.updatePagination(b),!1},o.prototype.onPageFirst=function(a){return this.options.pageNumber=1,this.updatePagination(a),!1},o.prototype.onPagePre=function(a){return this.options.pageNumber-1===0?this.options.pageNumber=this.options.totalPages:this.options.pageNumber--,this.updatePagination(a),!1},o.prototype.onPageNext=function(a){return this.options.pageNumber+1>this.options.totalPages?this.options.pageNumber=1:this.options.pageNumber++,this.updatePagination(a),!1},o.prototype.onPageLast=function(a){return this.options.pageNumber=this.totalPages,this.updatePagination(a),!1},o.prototype.onPageNumber=function(b){return this.options.pageNumber!==+a(b.currentTarget).text()?(this.options.pageNumber=+a(b.currentTarget).text(),this.updatePagination(b),!1):void 0},o.prototype.initRow=function(b,e){var f,g=this,i=[],k={},m=[],n="",o={},p=[];if(!(a.inArray(b,this.hiddenRows)>-1)){if(k=h(this.options,this.options.rowStyle,[b,e],k),k&&k.css)for(f in k.css)m.push(f+": "+k.css[f]);if(o=h(this.options,this.options.rowAttributes,[b,e],o))for(f in o)p.push(c('%s="%s"',f,j(o[f])));return b._data&&!a.isEmptyObject(b._data)&&a.each(b._data,function(a,b){"index"!==a&&(n+=c(' data-%s="%s"',a,b))}),i.push("<tr",c(" %s",p.join(" ")),c(' id="%s"',a.isArray(b)?void 0:b._id),c(' class="%s"',k.classes||(a.isArray(b)?void 0:b._class)),c(' data-index="%s"',e),c(' data-uniqueid="%s"',b[this.options.uniqueId]),c("%s",n),">"),this.options.cardView&&i.push(c('<td colspan="%s"><div class="card-views">',this.header.fields.length)),!this.options.cardView&&this.options.detailView&&i.push("<td>",'<a class="detail-icon" href="#">',c('<i class="%s %s"></i>',this.options.iconsPrefix,this.options.icons.detailOpen),"</a>","</td>"),a.each(this.header.fields,function(f,n){var o="",p=l(b,n,g.options.escape),q="",r="",s={},t="",u=g.header.classes[f],v="",w="",x="",y="",z=g.columns[f];if(!(g.fromHtml&&"undefined"==typeof p||!z.visible||g.options.cardView&&!z.cardVisible)){if(z.escape&&(p=j(p)),k=c('style="%s"',m.concat(g.header.styles[f]).join("; ")),b["_"+n+"_id"]&&(t=c(' id="%s"',b["_"+n+"_id"])),b["_"+n+"_class"]&&(u=c(' class="%s"',b["_"+n+"_class"])),b["_"+n+"_rowspan"]&&(w=c(' rowspan="%s"',b["_"+n+"_rowspan"])),b["_"+n+"_colspan"]&&(x=c(' colspan="%s"',b["_"+n+"_colspan"])),b["_"+n+"_title"]&&(y=c(' title="%s"',b["_"+n+"_title"])),s=h(g.header,g.header.cellStyles[f],[p,b,e,n],s),s.classes&&(u=c(' class="%s"',s.classes)),s.css){var A=[];for(var B in s.css)A.push(B+": "+s.css[B]);k=c('style="%s"',A.concat(g.header.styles[f]).join("; "))}q=h(z,g.header.formatters[f],[p,b,e],p),b["_"+n+"_data"]&&!a.isEmptyObject(b["_"+n+"_data"])&&a.each(b["_"+n+"_data"],function(a,b){"index"!==a&&(v+=c(' data-%s="%s"',a,b))}),z.checkbox||z.radio?(r=z.checkbox?"checkbox":r,r=z.radio?"radio":r,o=[c(g.options.cardView?'<div class="card-view %s">':'<td class="bs-checkbox %s">',z["class"]||""),"<input"+c(' data-index="%s"',e)+c(' name="%s"',g.options.selectItemName)+c(' type="%s"',r)+c(' value="%s"',b[g.options.idField])+c(' checked="%s"',q===!0||p||q&&q.checked?"checked":void 0)+c(' disabled="%s"',!z.checkboxEnabled||q&&q.disabled?"disabled":void 0)+" />",g.header.formatters[f]&&"string"==typeof q?q:"",g.options.cardView?"</div>":"</td>"].join(""),b[g.header.stateField]=q===!0||q&&q.checked):(q="undefined"==typeof q||null===q?g.options.undefinedText:q,o=g.options.cardView?['<div class="card-view">',g.options.showHeader?c('<span class="title" %s>%s</span>',k,d(g.columns,"field","title",n)):"",c('<span class="value">%s</span>',q),"</div>"].join(""):[c("<td%s %s %s %s %s %s %s>",t,u,k,v,w,x,y),q,"</td>"].join(""),g.options.cardView&&g.options.smartDisplay&&""===q&&(o='<div class="card-view"></div>')),i.push(o)}}),this.options.cardView&&i.push("</div></td>"),i.push("</tr>"),i.join(" ")}},o.prototype.initBody=function(b){var d=this,f=this.getData();this.trigger("pre-body",f),this.$body=this.$el.find(">tbody"),this.$body.length||(this.$body=a("<tbody></tbody>").appendTo(this.$el)),this.options.pagination&&"server"!==this.options.sidePagination||(this.pageFrom=1,this.pageTo=f.length);for(var g,i=a(document.createDocumentFragment()),j=this.pageFrom-1;j<this.pageTo;j++){
8
var k=f[j],m=this.initRow(k,j,f,i);g=g||!!m,m&&m!==!0&&i.append(m)}g||i.append('<tr class="no-records-found">'+c('<td colspan="%s">%s</td>',this.$header.find("th").length,this.options.formatNoMatches())+"</tr>"),this.$body.html(i),b||this.scrollTo(0),this.$body.find("> tr[data-index] > td").off("click dblclick").on("click dblclick",function(b){var f=a(this),g=f.parent(),h=d.data[g.data("index")],i=f[0].cellIndex,j=d.getVisibleFields(),k=j[d.options.detailView&&!d.options.cardView?i-1:i],m=d.columns[e(d.columns,k)],n=l(h,k,d.options.escape);if(!f.find(".detail-icon").length&&(d.trigger("click"===b.type?"click-cell":"dbl-click-cell",k,n,h,f),d.trigger("click"===b.type?"click-row":"dbl-click-row",h,g,k),"click"===b.type&&d.options.clickToSelect&&m.clickToSelect)){var o=g.find(c('[name="%s"]',d.options.selectItemName));o.length&&o[0].click()}}),this.$body.find("> tr[data-index] > td > .detail-icon").off("click").on("click",function(){var b=a(this),e=b.parent().parent(),g=e.data("index"),i=f[g];if(e.next().is("tr.detail-view"))b.find("i").attr("class",c("%s %s",d.options.iconsPrefix,d.options.icons.detailOpen)),d.trigger("collapse-row",g,i),e.next().remove();else{b.find("i").attr("class",c("%s %s",d.options.iconsPrefix,d.options.icons.detailClose)),e.after(c('<tr class="detail-view"><td colspan="%s"></td></tr>',e.find("td").length));var j=e.next().find("td"),k=h(d.options,d.options.detailFormatter,[g,i,j],"");1===j.length&&j.append(k),d.trigger("expand-row",g,i,j)}return d.resetView(),!1}),this.$selectItem=this.$body.find(c('[name="%s"]',this.options.selectItemName)),this.$selectItem.off("click").on("click",function(b){b.stopImmediatePropagation();var c=a(this),e=c.prop("checked"),f=d.data[c.data("index")];d.options.maintainSelected&&a(this).is(":radio")&&a.each(d.options.data,function(a,b){b[d.header.stateField]=!1}),f[d.header.stateField]=e,d.options.singleSelect&&(d.$selectItem.not(this).each(function(){d.data[a(this).data("index")][d.header.stateField]=!1}),d.$selectItem.filter(":checked").not(this).prop("checked",!1)),d.updateSelected(),d.trigger(e?"check":"uncheck",f,c)}),a.each(this.header.events,function(b,c){if(c){"string"==typeof c&&(c=h(null,c));var e=d.header.fields[b],f=a.inArray(e,d.getVisibleFields());d.options.detailView&&!d.options.cardView&&(f+=1);for(var g in c)d.$body.find(">tr:not(.no-records-found)").each(function(){var b=a(this),h=b.find(d.options.cardView?".card-view":"td").eq(f),i=g.indexOf(" "),j=g.substring(0,i),k=g.substring(i+1),l=c[g];h.find(k).off(j).on(j,function(a){var c=b.data("index"),f=d.data[c],g=f[e];l.apply(this,[a,g,f,c])})})}}),this.updateSelected(),this.resetView(),this.trigger("post-body",f)},o.prototype.initServer=function(b,c,d){var e,f=this,g={},i={searchText:this.searchText,sortName:this.options.sortName,sortOrder:this.options.sortOrder};this.options.pagination&&(i.pageSize=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize,i.pageNumber=this.options.pageNumber),(d||this.options.url||this.options.ajax)&&("limit"===this.options.queryParamsType&&(i={search:i.searchText,sort:i.sortName,order:i.sortOrder},this.options.pagination&&(i.offset=this.options.pageSize===this.options.formatAllRows()?0:this.options.pageSize*(this.options.pageNumber-1),i.limit=this.options.pageSize===this.options.formatAllRows()?this.options.totalRows:this.options.pageSize)),a.isEmptyObject(this.filterColumnsPartial)||(i.filter=JSON.stringify(this.filterColumnsPartial,null)),g=h(this.options,this.options.queryParams,[i],g),a.extend(g,c||{}),g!==!1&&(b||this.$tableLoading.show(),e=a.extend({},h(null,this.options.ajaxOptions),{type:this.options.method,url:d||this.options.url,data:"application/json"===this.options.contentType&&"post"===this.options.method?JSON.stringify(g):g,cache:this.options.cache,contentType:this.options.contentType,dataType:this.options.dataType,success:function(a){a=h(f.options,f.options.responseHandler,[a],a),f.load(a),f.trigger("load-success",a),b||f.$tableLoading.hide()},error:function(a){f.trigger("load-error",a.status,a),b||f.$tableLoading.hide()}}),this.options.ajax?h(this,this.options.ajax,[e],null):(this._xhr&&4!==this._xhr.readyState&&this._xhr.abort(),this._xhr=a.ajax(e))))},o.prototype.initSearchText=function(){if(this.options.search&&""!==this.options.searchText){var a=this.$toolbar.find(".search input");a.val(this.options.searchText),this.onSearch({currentTarget:a})}},o.prototype.getCaret=function(){var b=this;a.each(this.$header.find("th"),function(c,d){a(d).find(".sortable").removeClass("desc asc").addClass(a(d).data("field")===b.options.sortName?b.options.sortOrder:"both")})},o.prototype.updateSelected=function(){var b=this.$selectItem.filter(":enabled").length&&this.$selectItem.filter(":enabled").length===this.$selectItem.filter(":enabled").filter(":checked").length;this.$selectAll.add(this.$selectAll_).prop("checked",b),this.$selectItem.each(function(){a(this).closest("tr")[a(this).prop("checked")?"addClass":"removeClass"]("selected")})},o.prototype.updateRows=function(){var b=this;this.$selectItem.each(function(){b.data[a(this).data("index")][b.header.stateField]=a(this).prop("checked")})},o.prototype.resetRows=function(){var b=this;a.each(this.data,function(a,c){b.$selectAll.prop("checked",!1),b.$selectItem.prop("checked",!1),b.header.stateField&&(c[b.header.stateField]=!1)}),this.initHiddenRows()},o.prototype.trigger=function(b){var c=Array.prototype.slice.call(arguments,1);b+=".bs.table",this.options[o.EVENTS[b]].apply(this.options,c),this.$el.trigger(a.Event(b),c),this.options.onAll(b,c),this.$el.trigger(a.Event("all.bs.table"),[b,c])},o.prototype.resetHeader=function(){clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(a.proxy(this.fitHeader,this),this.$el.is(":hidden")?100:0)},o.prototype.fitHeader=function(){var b,d,e,f,h=this;if(h.$el.is(":hidden"))return void(h.timeoutId_=setTimeout(a.proxy(h.fitHeader,h),100));if(b=this.$tableBody.get(0),d=b.scrollWidth>b.clientWidth&&b.scrollHeight>b.clientHeight+this.$header.outerHeight()?g():0,this.$el.css("margin-top",-this.$header.outerHeight()),e=a(":focus"),e.length>0){var i=e.parents("th");if(i.length>0){var j=i.attr("data-field");if(void 0!==j){var k=this.$header.find("[data-field='"+j+"']");k.length>0&&k.find(":input").addClass("focus-temp")}}}this.$header_=this.$header.clone(!0,!0),this.$selectAll_=this.$header_.find('[name="btSelectAll"]'),this.$tableHeader.css({"margin-right":d}).find("table").css("width",this.$el.outerWidth()).html("").attr("class",this.$el.attr("class")).append(this.$header_),f=a(".focus-temp:visible:eq(0)"),f.length>0&&(f.focus(),this.$header.find(".focus-temp").removeClass("focus-temp")),this.$header.find("th[data-field]").each(function(){h.$header_.find(c('th[data-field="%s"]',a(this).data("field"))).data(a(this).data())});var l=this.getVisibleFields(),m=this.$header_.find("th");this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(b){var d=a(this),e=b;h.options.detailView&&!h.options.cardView&&(0===b&&h.$header_.find("th.detail").find(".fht-cell").width(d.innerWidth()),e=b-1);var f=h.$header_.find(c('th[data-field="%s"]',l[e]));f.length>1&&(f=a(m[d[0].cellIndex])),f.find(".fht-cell").width(d.innerWidth())}),this.$tableBody.off("scroll").on("scroll",function(){h.$tableHeader.scrollLeft(a(this).scrollLeft()),h.options.showFooter&&!h.options.cardView&&h.$tableFooter.scrollLeft(a(this).scrollLeft())}),h.trigger("post-header")},o.prototype.resetFooter=function(){var b=this,d=b.getData(),e=[];this.options.showFooter&&!this.options.cardView&&(!this.options.cardView&&this.options.detailView&&e.push('<td><div class="th-inner">&nbsp;</div><div class="fht-cell"></div></td>'),a.each(this.columns,function(a,f){var g,i="",j="",k=[],l={},m=c(' class="%s"',f["class"]);if(f.visible&&(!b.options.cardView||f.cardVisible)){if(i=c("text-align: %s; ",f.falign?f.falign:f.align),j=c("vertical-align: %s; ",f.valign),l=h(null,b.options.footerStyle),l&&l.css)for(g in l.css)k.push(g+": "+l.css[g]);e.push("<td",m,c(' style="%s"',i+j+k.concat().join("; ")),">"),e.push('<div class="th-inner">'),e.push(h(f,f.footerFormatter,[d],"&nbsp;")||"&nbsp;"),e.push("</div>"),e.push('<div class="fht-cell"></div>'),e.push("</div>"),e.push("</td>")}}),this.$tableFooter.find("tr").html(e.join("")),this.$tableFooter.show(),clearTimeout(this.timeoutFooter_),this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),this.$el.is(":hidden")?100:0))},o.prototype.fitFooter=function(){var b,c,d;return clearTimeout(this.timeoutFooter_),this.$el.is(":hidden")?void(this.timeoutFooter_=setTimeout(a.proxy(this.fitFooter,this),100)):(c=this.$el.css("width"),d=c>this.$tableBody.width()?g():0,this.$tableFooter.css({"margin-right":d}).find("table").css("width",c).attr("class",this.$el.attr("class")),b=this.$tableFooter.find("td"),void this.$body.find(">tr:first-child:not(.no-records-found) > *").each(function(c){var d=a(this);b.eq(c).find(".fht-cell").width(d.innerWidth())}))},o.prototype.toggleColumn=function(a,b,d){if(-1!==a&&(this.columns[a].visible=b,this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns)){var e=this.$toolbar.find(".keep-open input").prop("disabled",!1);d&&e.filter(c('[value="%s"]',a)).prop("checked",b),e.filter(":checked").length<=this.options.minimumCountColumns&&e.filter(":checked").prop("disabled",!0)}},o.prototype.getVisibleFields=function(){var b=this,c=[];return a.each(this.header.fields,function(a,d){var f=b.columns[e(b.columns,d)];f.visible&&c.push(d)}),c},o.prototype.resetView=function(a){var b=0;if(a&&a.height&&(this.options.height=a.height),this.$selectAll.prop("checked",this.$selectItem.length>0&&this.$selectItem.length===this.$selectItem.filter(":checked").length),this.options.height){var c=this.$toolbar.outerHeight(!0),d=this.$pagination.outerHeight(!0),e=this.options.height-c-d;this.$tableContainer.css("height",e+"px")}return this.options.cardView?(this.$el.css("margin-top","0"),this.$tableContainer.css("padding-bottom","0"),void this.$tableFooter.hide()):(this.options.showHeader&&this.options.height?(this.$tableHeader.show(),this.resetHeader(),b+=this.$header.outerHeight()):(this.$tableHeader.hide(),this.trigger("post-header")),this.options.showFooter&&(this.resetFooter(),this.options.height&&(b+=this.$tableFooter.outerHeight()+1)),this.getCaret(),this.$tableContainer.css("padding-bottom",b+"px"),void this.trigger("reset-view"))},o.prototype.getData=function(b){return!this.searchText&&a.isEmptyObject(this.filterColumns)&&a.isEmptyObject(this.filterColumnsPartial)?b?this.options.data.slice(this.pageFrom-1,this.pageTo):this.options.data:b?this.data.slice(this.pageFrom-1,this.pageTo):this.data},o.prototype.load=function(b){var c=!1;"server"===this.options.sidePagination?(this.options.totalRows=b[this.options.totalField],c=b.fixedScroll,b=b[this.options.dataField]):a.isArray(b)||(c=b.fixedScroll,b=b.data),this.initData(b),this.initSearch(),this.initPagination(),this.initBody(c)},o.prototype.append=function(a){this.initData(a,"append"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.prepend=function(a){this.initData(a,"prepend"),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.remove=function(b){var c,d,e=this.options.data.length;if(b.hasOwnProperty("field")&&b.hasOwnProperty("values")){for(c=e-1;c>=0;c--)d=this.options.data[c],d.hasOwnProperty(b.field)&&-1!==a.inArray(d[b.field],b.values)&&(this.options.data.splice(c,1),"server"===this.options.sidePagination&&(this.options.totalRows-=1));e!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))}},o.prototype.removeAll=function(){this.options.data.length>0&&(this.options.data.splice(0,this.options.data.length),this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.getRowByUniqueId=function(a){var b,c,d,e=this.options.uniqueId,f=this.options.data.length,g=null;for(b=f-1;b>=0;b--){if(c=this.options.data[b],c.hasOwnProperty(e))d=c[e];else{if(!c._data.hasOwnProperty(e))continue;d=c._data[e]}if("string"==typeof d?a=a.toString():"number"==typeof d&&(Number(d)===d&&d%1===0?a=parseInt(a):d===Number(d)&&0!==d&&(a=parseFloat(a))),d===a){g=c;break}}return g},o.prototype.removeByUniqueId=function(a){var b=this.options.data.length,c=this.getRowByUniqueId(a);c&&this.options.data.splice(this.options.data.indexOf(c),1),b!==this.options.data.length&&(this.initSearch(),this.initPagination(),this.initBody(!0))},o.prototype.updateByUniqueId=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){var e;d.hasOwnProperty("id")&&d.hasOwnProperty("row")&&(e=a.inArray(c.getRowByUniqueId(d.id),c.options.data),-1!==e&&a.extend(c.options.data[e],d.row))}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.insertRow=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("row")&&(this.data.splice(a.index,0,a.row),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0))},o.prototype.updateRow=function(b){var c=this,d=a.isArray(b)?b:[b];a.each(d,function(b,d){d.hasOwnProperty("index")&&d.hasOwnProperty("row")&&a.extend(c.options.data[d.index],d.row)}),this.initSearch(),this.initPagination(),this.initSort(),this.initBody(!0)},o.prototype.initHiddenRows=function(){this.hiddenRows=[]},o.prototype.showRow=function(a){this.toggleRow(a,!0)},o.prototype.hideRow=function(a){this.toggleRow(a,!1)},o.prototype.toggleRow=function(b,c){var d,e;b.hasOwnProperty("index")?d=this.getData()[b.index]:b.hasOwnProperty("uniqueId")&&(d=this.getRowByUniqueId(b.uniqueId)),d&&(e=a.inArray(d,this.hiddenRows),c||-1!==e?c&&e>-1&&this.hiddenRows.splice(e,1):this.hiddenRows.push(d),this.initBody(!0))},o.prototype.getHiddenRows=function(){var b=this,c=this.getData(),d=[];return a.each(c,function(c,e){a.inArray(e,b.hiddenRows)>-1&&d.push(e)}),this.hiddenRows=d,d},o.prototype.mergeCells=function(b){var c,d,e,f=b.index,g=a.inArray(b.field,this.getVisibleFields()),h=b.rowspan||1,i=b.colspan||1,j=this.$body.find(">tr");if(this.options.detailView&&!this.options.cardView&&(g+=1),e=j.eq(f).find(">td").eq(g),!(0>f||0>g||f>=this.data.length)){for(c=f;f+h>c;c++)for(d=g;g+i>d;d++)j.eq(c).find(">td").eq(d).hide();e.attr("rowspan",h).attr("colspan",i).show()}},o.prototype.updateCell=function(a){a.hasOwnProperty("index")&&a.hasOwnProperty("field")&&a.hasOwnProperty("value")&&(this.data[a.index][a.field]=a.value,a.reinit!==!1&&(this.initSort(),this.initBody(!0)))},o.prototype.getOptions=function(){return this.options},o.prototype.getSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]===!0})},o.prototype.getAllSelections=function(){var b=this;return a.grep(this.options.data,function(a){return a[b.header.stateField]})},o.prototype.checkAll=function(){this.checkAll_(!0)},o.prototype.uncheckAll=function(){this.checkAll_(!1)},o.prototype.checkInvert=function(){var b=this,c=b.$selectItem.filter(":enabled"),d=c.filter(":checked");c.each(function(){a(this).prop("checked",!a(this).prop("checked"))}),b.updateRows(),b.updateSelected(),b.trigger("uncheck-some",d),d=b.getSelections(),b.trigger("check-some",d)},o.prototype.checkAll_=function(a){var b;a||(b=this.getSelections()),this.$selectAll.add(this.$selectAll_).prop("checked",a),this.$selectItem.filter(":enabled").prop("checked",a),this.updateRows(),a&&(b=this.getSelections()),this.trigger(a?"check-all":"uncheck-all",b)},o.prototype.check=function(a){this.check_(!0,a)},o.prototype.uncheck=function(a){this.check_(!1,a)},o.prototype.check_=function(a,b){var d=this.$selectItem.filter(c('[data-index="%s"]',b)).prop("checked",a);this.data[b][this.header.stateField]=a,this.updateSelected(),this.trigger(a?"check":"uncheck",this.data[b],d)},o.prototype.checkBy=function(a){this.checkBy_(!0,a)},o.prototype.uncheckBy=function(a){this.checkBy_(!1,a)},o.prototype.checkBy_=function(b,d){if(d.hasOwnProperty("field")&&d.hasOwnProperty("values")){var e=this,f=[];a.each(this.options.data,function(g,h){if(!h.hasOwnProperty(d.field))return!1;if(-1!==a.inArray(h[d.field],d.values)){var i=e.$selectItem.filter(":enabled").filter(c('[data-index="%s"]',g)).prop("checked",b);h[e.header.stateField]=b,f.push(h),e.trigger(b?"check":"uncheck",h,i)}}),this.updateSelected(),this.trigger(b?"check-some":"uncheck-some",f)}},o.prototype.destroy=function(){this.$el.insertBefore(this.$container),a(this.options.toolbar).insertBefore(this.$el),this.$container.next().remove(),this.$container.remove(),this.$el.html(this.$el_.html()).css("margin-top","0").attr("class",this.$el_.attr("class")||"")},o.prototype.showLoading=function(){this.$tableLoading.show()},o.prototype.hideLoading=function(){this.$tableLoading.hide()},o.prototype.togglePagination=function(){this.options.pagination=!this.options.pagination;var a=this.$toolbar.find('button[name="paginationSwitch"] i');this.options.pagination?a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchDown):a.attr("class",this.options.iconsPrefix+" "+this.options.icons.paginationSwitchUp),this.updatePagination()},o.prototype.refresh=function(a){a&&a.url&&(this.options.url=a.url),a&&a.pageNumber&&(this.options.pageNumber=a.pageNumber),a&&a.pageSize&&(this.options.pageSize=a.pageSize),this.initServer(a&&a.silent,a&&a.query,a&&a.url),this.trigger("refresh",a)},o.prototype.resetWidth=function(){this.options.showHeader&&this.options.height&&this.fitHeader(),this.options.showFooter&&this.fitFooter()},o.prototype.showColumn=function(a){this.toggleColumn(e(this.columns,a),!0,!0)},o.prototype.hideColumn=function(a){this.toggleColumn(e(this.columns,a),!1,!0)},o.prototype.getHiddenColumns=function(){return a.grep(this.columns,function(a){return!a.visible})},o.prototype.getVisibleColumns=function(){return a.grep(this.columns,function(a){return a.visible})},o.prototype.toggleAllColumns=function(b){if(a.each(this.columns,function(a){this.columns[a].visible=b}),this.initHeader(),this.initSearch(),this.initPagination(),this.initBody(),this.options.showColumns){var c=this.$toolbar.find(".keep-open input").prop("disabled",!1);c.filter(":checked").length<=this.options.minimumCountColumns&&c.filter(":checked").prop("disabled",!0)}},o.prototype.showAllColumns=function(){this.toggleAllColumns(!0)},o.prototype.hideAllColumns=function(){this.toggleAllColumns(!1)},o.prototype.filterBy=function(b){this.filterColumns=a.isEmptyObject(b)?{}:b,this.options.pageNumber=1,this.initSearch(),this.updatePagination()},o.prototype.scrollTo=function(a){return"string"==typeof a&&(a="bottom"===a?this.$tableBody[0].scrollHeight:0),"number"==typeof a&&this.$tableBody.scrollTop(a),"undefined"==typeof a?this.$tableBody.scrollTop():void 0},o.prototype.getScrollPosition=function(){return this.scrollTo()},o.prototype.selectPage=function(a){a>0&&a<=this.options.totalPages&&(this.options.pageNumber=a,this.updatePagination())},o.prototype.prevPage=function(){this.options.pageNumber>1&&(this.options.pageNumber--,this.updatePagination())},o.prototype.nextPage=function(){this.options.pageNumber<this.options.totalPages&&(this.options.pageNumber++,this.updatePagination())},o.prototype.toggleView=function(){this.options.cardView=!this.options.cardView,this.initHeader(),this.initBody(),this.trigger("toggle",this.options.cardView)},o.prototype.refreshOptions=function(b){i(this.options,b,!0)||(this.options=a.extend(this.options,b),this.trigger("refresh-options",this.options),this.destroy(),this.init())},o.prototype.resetSearch=function(a){var b=this.$toolbar.find(".search input");b.val(a||""),this.onSearch({currentTarget:b})},o.prototype.expandRow_=function(a,b){var d=this.$body.find(c('> tr[data-index="%s"]',b));d.next().is("tr.detail-view")===(a?!1:!0)&&d.find("> td > .detail-icon").click()},o.prototype.expandRow=function(a){this.expandRow_(!0,a)},o.prototype.collapseRow=function(a){this.expandRow_(!1,a)},o.prototype.expandAllRows=function(b){if(b){var d=this.$body.find(c('> tr[data-index="%s"]',0)),e=this,f=null,g=!1,h=-1;if(d.next().is("tr.detail-view")?d.next().next().is("tr.detail-view")||(d.next().find(".detail-icon").click(),g=!0):(d.find("> td > .detail-icon").click(),g=!0),g)try{h=setInterval(function(){f=e.$body.find("tr.detail-view").last().find(".detail-icon"),f.length>0?f.click():clearInterval(h)},1)}catch(i){clearInterval(h)}}else for(var j=this.$body.children(),k=0;k<j.length;k++)this.expandRow_(!0,a(j[k]).data("index"))},o.prototype.collapseAllRows=function(b){if(b)this.expandRow_(!1,0);else for(var c=this.$body.children(),d=0;d<c.length;d++)this.expandRow_(!1,a(c[d]).data("index"))},o.prototype.updateFormatText=function(a,b){this.options[c("format%s",a)]&&("string"==typeof b?this.options[c("format%s",a)]=function(){return b}:"function"==typeof b&&(this.options[c("format%s",a)]=b)),this.initToolbar(),this.initPagination(),this.initBody()};var p=["getOptions","getSelections","getAllSelections","getData","load","append","prepend","remove","removeAll","insertRow","updateRow","updateCell","updateByUniqueId","removeByUniqueId","getRowByUniqueId","showRow","hideRow","getHiddenRows","mergeCells","checkAll","uncheckAll","checkInvert","check","uncheck","checkBy","uncheckBy","refresh","resetView","resetWidth","destroy","showLoading","hideLoading","showColumn","hideColumn","getHiddenColumns","getVisibleColumns","showAllColumns","hideAllColumns","filterBy","scrollTo","getScrollPosition","selectPage","prevPage","nextPage","togglePagination","toggleView","refreshOptions","resetSearch","expandRow","collapseRow","expandAllRows","collapseAllRows","updateFormatText"];a.fn.bootstrapTable=function(b){var c,d=Array.prototype.slice.call(arguments,1);return this.each(function(){var e=a(this),f=e.data("bootstrap.table"),g=a.extend({},o.DEFAULTS,e.data(),"object"==typeof b&&b);if("string"==typeof b){if(a.inArray(b,p)<0)throw new Error("Unknown method: "+b);if(!f)return;c=f[b].apply(f,d),"destroy"===b&&e.removeData("bootstrap.table")}f||e.data("bootstrap.table",f=new o(this,g))}),"undefined"==typeof c?this:c},a.fn.bootstrapTable.Constructor=o,a.fn.bootstrapTable.defaults=o.DEFAULTS,a.fn.bootstrapTable.columnDefaults=o.COLUMN_DEFAULTS,a.fn.bootstrapTable.locales=o.LOCALES,a.fn.bootstrapTable.methods=p,a.fn.bootstrapTable.utils={sprintf:c,getFieldIndex:e,compareObjects:i,calculateObjectValue:h,getItemField:l,objectKeys:n,isIEBrowser:m},a(function(){a('[data-toggle="table"]').bootstrapTable()})}(jQuery);

+ 4 - 1
src/main/resources/static/plugins/treegrid/jquery.treegrid.css

@ -10,5 +10,8 @@
10 10
.treegrid-table thead, .treegrid-table tbody tr {display:table;width:100%;table-layout:fixed;}
11 11
.treegrid-thead th{line-height:40px;border: 0 !important;background:#fff !important;border-radius: 4px;border-left:1px solid #e7eaec !important;border-bottom:2px solid #e7eaec !important;text-align: center;}
12 12
.treegrid-thead tr :first-child{border-left:0 !important}
13
.treegrid-tbody td{border: 0 !important;border-left:1px solid #e7eaec !important;border-bottom:1px solid #e7eaec !important;}
13
.treegrid-tbody td{border: 0 !important;border-left:1px solid #e7eaec !important;border-bottom:1px solid #e7eaec !important;overflow: hidden;
14
    white-space: nowrap;
15
    text-overflow: ellipsis;}
14 16
.treegrid-tbody tr :first-child{border-left:0 !important}
17

+ 243 - 238
src/main/resources/static/plugins/treegrid/jquery.treegrid.extension.js

@ -1,249 +1,254 @@
1 1
(function($) {
2
	"use strict";
2
    "use strict";
3 3
4
	$.fn.bootstrapTreeTable = function(options, param) {
5
		// 如果是调用方法
6
		if (typeof options == 'string') {
7
			return $.fn.bootstrapTreeTable.methods[options](this, param);
8
		}
4
    $.fn.bootstrapTreeTable = function(options, param) {
5
        // 如果是调用方法
6
        if (typeof options == 'string') {
7
            return $.fn.bootstrapTreeTable.methods[options](this, param);
8
        }
9 9
10
		// 如果是初始化组件
11
		options = $.extend({}, $.fn.bootstrapTreeTable.defaults, options || {});
12
		// 是否有radio或checkbox
13
		var hasSelectItem = false;
14
		var target = $(this);
15
		// 在外层包装一下div,样式用的bootstrap-table的
16
		var _main_div = $("<div class='fixed-table-container'></div>");
17
		target.before(_main_div);
18
		_main_div.append(target);
19
		target.addClass("table table-hover treegrid-table table-bordered");
20
		if (options.striped) {
21
			target.addClass('table-striped');
22
		}
23
		// 工具条在外层包装一下div,样式用的bootstrap-table的
24
		if(options.toolbar){
25
			var _tool_div = $("<div class='fixed-table-toolbar'></div>");
26
			var _tool_left_div = $("<div class='bs-bars pull-left'></div>");
27
			_tool_left_div.append($(options.toolbar));
28
			_tool_div.append(_tool_left_div);
29
			_main_div.before(_tool_div);
30
		}
31
		// 得到根节点
32
		target.getRootNodes = function(data) {
33
			// 指定Root节点值
34
			var _root = options.rootCodeValue?options.rootCodeValue:null
35
			var result = [];
36
			$.each(data, function(index, item) {
37
				// 这里兼容几种常见Root节点写法
38
				// 默认的几种判断
39
				var _defaultRootFlag = item[options.parentCode] == '0'
40
					|| item[options.parentCode] == 0
41
					|| item[options.parentCode] == null
42
					|| item[options.parentCode] == '';
43
				if (!item[options.parentCode] || (_root?(item[options.parentCode] == options.rootCodeValue):_defaultRootFlag)){
44
					result.push(item);
45
				}
46
				// 添加一个默认属性,用来判断当前节点有没有被显示
47
				item.isShow = false;
48
			});
49
			return result;
50
		};
51
		var j = 0;
52
		// 递归获取子节点并且设置子节点
53
		target.getChildNodes = function(data, parentNode, parentIndex, tbody) {
54
			$.each(data, function(i, item) {
55
				if (item[options.parentCode] == parentNode[options.code]) {
56
					var tr = $('<tr></tr>');
57
					var nowParentIndex = (parentIndex + (j++) + 1);
58
					tr.addClass('treegrid-' + nowParentIndex);
59
					tr.addClass('treegrid-parent-' + parentIndex);
60
					target.renderRow(tr,item);
61
					item.isShow = true;
62
					tbody.append(tr);
63
					target.getChildNodes(data, item, nowParentIndex, tbody)
10
        // 如果是初始化组件
11
        options = $.extend({}, $.fn.bootstrapTreeTable.defaults, options || {});
12
        // 是否有radio或checkbox
13
        var hasSelectItem = false;
14
        var target = $(this);
15
        // 在外层包装一下div,样式用的bootstrap-table的
16
        var _main_div = $("<div class='fixed-table-container'></div>");
17
        target.before(_main_div);
18
        _main_div.append(target);
19
        target.addClass("table table-hover treegrid-table table-bordered");
20
        if (options.striped) {
21
            target.addClass('table-striped');
22
        }
23
        // 工具条在外层包装一下div,样式用的bootstrap-table的
24
        if(options.toolbar){
25
            var _tool_div = $("<div class='fixed-table-toolbar'></div>");
26
            var _tool_left_div = $("<div class='bs-bars pull-left'></div>");
27
            _tool_left_div.append($(options.toolbar));
28
            _tool_div.append(_tool_left_div);
29
            _main_div.before(_tool_div);
30
        }
31
        // 得到根节点
32
        target.getRootNodes = function(data) {
33
            // 指定Root节点值
34
            var _root = options.rootCodeValue?options.rootCodeValue:null
35
            var result = [];
36
            $.each(data, function(index, item) {
37
                // 这里兼容几种常见Root节点写法
38
                // 默认的几种判断
39
                var _defaultRootFlag = item[options.parentCode] == '0'
40
                    || item[options.parentCode] == 0
41
                    || item[options.parentCode] == null
42
                    || item[options.parentCode] == '';
43
                if (!item[options.parentCode] || (_root?(item[options.parentCode] == options.rootCodeValue):_defaultRootFlag)){
44
                    result.push(item);
45
                }
46
                // 添加一个默认属性,用来判断当前节点有没有被显示
47
                item.isShow = false;
48
            });
49
            return result;
50
        };
51
        var j = 0;
52
        // 递归获取子节点并且设置子节点
53
        target.getChildNodes = function(data, parentNode, parentIndex, tbody) {
54
            $.each(data, function(i, item) {
55
                if (item[options.parentCode] == parentNode[options.code]) {
56
                    var tr = $('<tr></tr>');
57
                    var nowParentIndex = (parentIndex + (j++) + 1);
58
                    tr.addClass('treegrid-' + nowParentIndex);
59
                    tr.addClass('treegrid-parent-' + parentIndex);
60
                    target.renderRow(tr,item);
61
                    item.isShow = true;
62
                    tbody.append(tr);
63
                    target.getChildNodes(data, item, nowParentIndex, tbody)
64 64
65
				}
66
			});
67
		};
68
		// 绘制行
69
		target.renderRow = function(tr,item){
70
			$.each(options.columns, function(index, column) {
71
				// 判断有没有选择列
72
				if(index==0&&column.field=='selectItem'){
73
					hasSelectItem = true;
74
					var td = $('<td style="text-align:center;width:36px"></td>');
75
					if(column.radio){
76
						var _ipt = $('<input name="select_item" type="radio" value="'+item[options.id]+'"></input>');
77
						td.append(_ipt);
78
					} 
79
					if(column.checkbox){
80
						var _ipt = $('<input name="select_item" type="checkbox" value="'+item[options.id]+'"></input>');
81
						td.append(_ipt);
82
					} 
83
					tr.append(td);
84
				}else{
85
					var td = $('<td style="'+((column.width)?('width:'+column.width):'')+'"></td>');
86
					td.text(item[column.field]);
87
					tr.append(td);
88
				}
89
			});
90
		}
91
		// 加载数据
92
		target.load = function(parms){
93
			// 加载数据前先清空
94
			target.html("");
95
			// 构造表头
96
			var thr = $('<tr></tr>');
97
			$.each(options.columns, function(i, item) {
98
				var th = null;
99
				// 判断有没有选择列
100
				if(i==0&&item.field=='selectItem'){
101
					hasSelectItem = true;
102
					th = $('<th style="width:36px"></th>');
103
				}else{
104
					th = $('<th style="padding:10px;'+((item.width)?('width:'+item.width):'')+'"></th>');
105
				}
106
				th.text(item.title);
107
				thr.append(th);
108
			});
109
			var thead = $('<thead class="treegrid-thead"></thead>');
110
			thead.append(thr);
111
			target.append(thead);
112
			// 构造表体
113
			var tbody = $('<tbody class="treegrid-tbody"></tbody>');
114
			target.append(tbody);
115
			// 添加加载loading
116
			var _loading = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">正在努力地加载数据中,请稍候……</div></td></tr>'
117
			tbody.html(_loading);
118
			// 默认高度
119
			if(options.height){
120
				tbody.css("height",options.height);
121
			}
122
			$.ajax({
123
				type : options.type,
124
				url : options.url,
125
				data : parms?parms:options.ajaxParams,
126
				dataType : "JSON",
127
				success : function(data, textStatus, jqXHR) {
128
					// 加载完数据先清空
129
					tbody.html("");
130
					if(!data||data.length<=0){
131
						var _empty = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">没有找到匹配的记录</div></td></tr>'
132
						tbody.html(_empty);
133
						return;
134
					}
135
					var rootNode = target.getRootNodes(data);
136
					$.each(rootNode, function(i, item) {
137
						var tr = $('<tr></tr>');
138
						tr.addClass('treegrid-' + (j + "_" + i));
139
						target.renderRow(tr,item);
140
						item.isShow = true;
141
						tbody.append(tr);
142
						target.getChildNodes(data, item, (j + "_" + i), tbody);
143
					});
144
					// 下边的操作主要是为了查询时让一些没有根节点的节点显示
145
					$.each(data, function(i, item) {
146
						if(!item.isShow){
147
							var tr = $('<tr></tr>');
148
							tr.addClass('treegrid-' + (j + "_" + i));
149
							target.renderRow(tr,item);
150
							tbody.append(tr);
151
						}
152
					});
153
					target.append(tbody);
154
					// 初始化treegrid
155
					target.treegrid({
156
						treeColumn: options.expandColumn?options.expandColumn:(hasSelectItem?1:0),//如果有radio或checkbox默认第二列层级显示,当前是在用户未设置的提前下
157
						expanderExpandedClass : options.expanderExpandedClass,
158
						expanderCollapsedClass : options.expanderCollapsedClass
159
					});
160
					if (!options.expandAll) {
161
						target.treegrid('collapseAll');
162
					}
163
					//动态设置表头宽度
164
					thead.css("width", tbody.children(":first").css("width"));
165
					// 行点击选中事件
166
					target.find("tbody").find("tr").click(function(){
167
						if(hasSelectItem){
168
							var _ipt = $(this).find("input[name='select_item']");
169
							if(_ipt.attr("type")=="radio"){
170
								_ipt.prop('checked',true);
171
								target.find("tbody").find("tr").removeClass("treegrid-selected");
172
								$(this).addClass("treegrid-selected");
173
							}else{
174
								if(_ipt.prop('checked')){
175
									_ipt.prop('checked',false);
176
									$(this).removeClass("treegrid-selected");
177
								}else{
178
									_ipt.prop('checked',true);
179
									$(this).addClass("treegrid-selected");
180
								}
181
							}
182
						}
183
					});
184
				},
185
			    error:function(xhr,textStatus){
186
					var _errorMsg = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">'+xhr.responseText+'</div></td></tr>'
187
					tbody.html(_errorMsg);
188
					debugger;
189
			    },
190
			});
191
		}
192
		if (options.url) {
193
			target.load();
194
		} else {
195
			// 也可以通过defaults里面的data属性通过传递一个数据集合进来对组件进行初始化....有兴趣可以自己实现,思路和上述类似
196
		}
197
		
198
		return target;
199
	};
65
                }
66
            });
67
        };
68
        // 绘制行
69
        target.renderRow = function(tr,item){
70
            $.each(options.columns, function(index, column) {
71
                // 判断有没有选择列
72
                if(index==0&&column.field=='selectItem'){
73
                    hasSelectItem = true;
74
                    var td = $('<td style="text-align:center;width:36px"></td>');
75
                    if(column.radio){
76
                        var _ipt = $('<input name="select_item" type="radio" value="'+item[options.id]+'"></input>');
77
                        td.append(_ipt);
78
                    }
79
                    if(column.checkbox){
80
                        var _ipt = $('<input name="select_item" type="checkbox" value="'+item[options.id]+'"></input>');
81
                        td.append(_ipt);
82
                    }
83
                    tr.append(td);
84
                }else{
85
                    var td = $('<td style="'+((column.width)?('width:'+column.width):'')+'"></td>');
86
                    // 增加formatter渲染
87
                    if (column.formatter) {
88
                        td.html(column.formatter.call(this, item, index));
89
                    } else {
90
                        td.text(item[column.field]);
91
                    }
92
                    tr.append(td);
93
                }
94
            });
95
        }
96
        // 加载数据
97
        target.load = function(parms){
98
            // 加载数据前先清空
99
            target.html("");
100
            // 构造表头
101
            var thr = $('<tr></tr>');
102
            $.each(options.columns, function(i, item) {
103
                var th = null;
104
                // 判断有没有选择列
105
                if(i==0&&item.field=='selectItem'){
106
                    hasSelectItem = true;
107
                    th = $('<th style="width:36px"></th>');
108
                }else{
109
                    th = $('<th style="padding:10px;'+((item.width)?('width:'+item.width):'')+'"></th>');
110
                }
111
                th.text(item.title);
112
                thr.append(th);
113
            });
114
            var thead = $('<thead class="treegrid-thead"></thead>');
115
            thead.append(thr);
116
            target.append(thead);
117
            // 构造表体
118
            var tbody = $('<tbody class="treegrid-tbody"></tbody>');
119
            target.append(tbody);
120
            // 添加加载loading
121
            var _loading = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">正在努力地加载数据中,请稍候……</div></td></tr>'
122
            tbody.html(_loading);
123
            // 默认高度
124
            if(options.height){
125
                tbody.css("height",options.height);
126
            }
127
            $.ajax({
128
                type : options.type,
129
                url : options.url,
130
                data : parms?parms:options.ajaxParams,
131
                dataType : "JSON",
132
                success : function(data, textStatus, jqXHR) {
133
                    // 加载完数据先清空
134
                    tbody.html("");
135
                    if(!data||data.length<=0){
136
                        var _empty = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">没有记录</div></td></tr>'
137
                        tbody.html(_empty);
138
                        return;
139
                    }
140
                    var rootNode = target.getRootNodes(data);
141
                    $.each(rootNode, function(i, item) {
142
                        var tr = $('<tr></tr>');
143
                        tr.addClass('treegrid-' + (j + "_" + i));
144
                        target.renderRow(tr,item);
145
                        item.isShow = true;
146
                        tbody.append(tr);
147
                        target.getChildNodes(data, item, (j + "_" + i), tbody);
148
                    });
149
                    // 下边的操作主要是为了查询时让一些没有根节点的节点显示
150
                    $.each(data, function(i, item) {
151
                        if(!item.isShow){
152
                            var tr = $('<tr></tr>');
153
                            tr.addClass('treegrid-' + (j + "_" + i));
154
                            target.renderRow(tr,item);
155
                            tbody.append(tr);
156
                        }
157
                    });
158
                    target.append(tbody);
159
                    // 初始化treegrid
160
                    target.treegrid({
161
                        treeColumn: options.expandColumn?options.expandColumn:(hasSelectItem?1:0),//如果有radio或checkbox默认第二列层级显示,当前是在用户未设置的提前下
162
                        expanderExpandedClass : options.expanderExpandedClass,
163
                        expanderCollapsedClass : options.expanderCollapsedClass
164
                    });
165
                    if (!options.expandAll) {
166
                        target.treegrid('collapseAll');
167
                    }
168
                    //动态设置表头宽度
169
                    //thead.css("width", tbody.children(":first").css("width"));
170
                    // 行点击选中事件
171
                    target.find("tbody").find("tr").click(function(){
172
                        if(hasSelectItem){
173
                            var _ipt = $(this).find("input[name='select_item']");
174
                            if(_ipt.attr("type")=="radio"){
175
                                _ipt.prop('checked',true);
176
                                target.find("tbody").find("tr").removeClass("treegrid-selected");
177
                                $(this).addClass("treegrid-selected");
178
                            }else{
179
                                if(_ipt.prop('checked')){
180
                                    _ipt.prop('checked',false);
181
                                    $(this).removeClass("treegrid-selected");
182
                                }else{
183
                                    _ipt.prop('checked',true);
184
                                    $(this).addClass("treegrid-selected");
185
                                }
186
                            }
187
                        }
188
                    });
189
                },
190
                error:function(xhr,textStatus){
191
                    var _errorMsg = '<tr><td colspan="'+options.columns.length+'"><div style="display: block;text-align: center;">'+xhr.responseText+'</div></td></tr>'
192
                    tbody.html(_errorMsg);
193
                    debugger;
194
                },
195
            });
196
        }
197
        if (options.url) {
198
            target.load();
199
        } else {
200
            // 也可以通过defaults里面的data属性通过传递一个数据集合进来对组件进行初始化....有兴趣可以自己实现,思路和上述类似
201
        }
200 202
201
	// 组件方法封装........
202
	$.fn.bootstrapTreeTable.methods = {
203
		// 返回选中记录的id(返回的id由配置中的id属性指定)
204
		// 为了兼容bootstrap-table的写法,统一返回数组,这里只返回了指定的id
205
		getSelections : function(target, data) {
206
			// 所有被选中记录input
207
			var _ipt = target.find("tbody").find("tr").find("input[name='select_item']:checked");
208
			var chk_value =[]; 
209
			// 如果是radio
210
			if(_ipt.attr("type")=="radio"){
211
				chk_value.push({id:_ipt.val()}); 
212
			}else{
213
				_ipt.each(function(_i,_item){ 
214
					chk_value.push({id:$(_item).val()}); 
215
				}); 
216
			}
217
			return chk_value;
218
		},
219
		// 刷新记录
220
		refresh : function(target, parms) {
221
			if(parms){
222
				target.load(parms);
223
			}else{
203
        return target;
204
    };
205
206
    // 组件方法封装........
207
    $.fn.bootstrapTreeTable.methods = {
208
        // 返回选中记录的id(返回的id由配置中的id属性指定)
209
        // 为了兼容bootstrap-table的写法,统一返回数组,这里只返回了指定的id
210
        getSelections : function(target, data) {
211
            // 所有被选中的记录input
212
            var _ipt = target.find("tbody").find("tr").find("input[name='select_item']:checked");
213
            var chk_value =[];
214
            // 如果是radio
215
            if(_ipt.attr("type")=="radio"){
216
                chk_value.push({id:_ipt.val()});
217
            }else{
218
                _ipt.each(function(_i,_item){
219
                    chk_value.push({id:$(_item).val()});
220
                });
221
            }
222
            return chk_value;
223
        },
224
        // 刷新记录
225
        refresh : function(target, parms) {
226
            if(parms){
227
                target.load(parms);
228
            }else{
224 229
                target.load();
225
			}
226
		},
227
	// 组件的其他方法也可以进行类似封装........
228
	};
230
            }
231
        },
232
        // 组件的其他方法也可以进行类似封装........
233
    };
229 234
230
	$.fn.bootstrapTreeTable.defaults = {
231
		id : 'id',// 选取记录返回的值
232
		code : 'code',// 用于设置父子关系
233
		parentCode : 'parentId',// 用于设置父子关系
234
		rootCodeValue: null,//设置根节点code值----可指定根节点,默认为null,"",0,"0"
235
		data : [], // 构造table的数据集合
236
		type : "GET", // 请求数据的ajax类型
237
		url : null, // 请求数据的ajax的url
238
		ajaxParams : {}, // 请求数据的ajax的data属性
239
		expandColumn : null,// 在哪一列上面显示展开按钮
240
		expandAll : true, // 是否全部展开
241
		striped : false, // 是否各行渐变色
242
		columns : [],
235
    $.fn.bootstrapTreeTable.defaults = {
236
        id : 'menuId',// 选取记录返回的值
237
        code : 'menuId',// 用于设置父子关系
238
        parentCode : 'parentId',// 用于设置父子关系
239
        rootCodeValue: null,//设置根节点code值----可指定根节点,默认为null,"",0,"0"
240
        data : [], // 构造table的数据集合
241
        type : "GET", // 请求数据的ajax类型
242
        url : null, // 请求数据的ajax的url
243
        ajaxParams : {}, // 请求数据的ajax的data属性
244
        expandColumn : null,// 在哪一列上面显示展开按钮
245
        expandAll : true, // 是否全部展开
246
        striped : false, // 是否各行渐变色
247
        columns : [],
243 248
        toolbar: null,//顶部工具条
244 249
        height: 0,
245
		expanderExpandedClass : 'glyphicon glyphicon-chevron-down',// 展开的按钮的图标
246
		expanderCollapsedClass : 'glyphicon glyphicon-chevron-right'// 缩起的按钮的图标
250
        expanderExpandedClass : 'glyphicon glyphicon-chevron-down',// 展开的按钮的图标
251
        expanderCollapsedClass : 'glyphicon glyphicon-chevron-right'// 缩起的按钮的图标
247 252
248
	};
253
    };
249 254
})(jQuery);

+ 136 - 0
src/main/resources/static/plugins/treegrid/tree.table.js

@ -0,0 +1,136 @@
1
/**
2
 * 初始化 Tree Table 的封装
3
 *
4
 * @author cyf
5
 */
6
(function () {
7
    var TreeTable = function (tableId, url, columns) {
8
        this.btInstance = null;					//jquery和bootstrapTreeTable绑定的对象
9
        this.bstableId = tableId;
10
        this.url = url;
11
        this.method = "GET";
12
        this.columns = columns;
13
        this.data = {};// ajax的参数
14
        this.expandColumn = null;// 展开显示的列 
15
        this.id = 'menuId';// 选取记录返回的值
16
        this.code = 'menuId';// 用于设置父子关系
17
        this.parentCode = 'parentId';// 用于设置父子关系
18
        this.expandAll = false;// 是否默认全部展开
19
        this.toolbarId = tableId + "Toolbar";
20
        this.height = 430;
21
    };
22
23
    TreeTable.prototype = {
24
        /**
25
         * 初始化bootstrap table
26
         */
27
        init: function () {
28
            var tableId = this.bstableId;
29
            this.btInstance =
30
                $('#'+tableId).bootstrapTreeTable({
31
                    id: this.id,// 选取记录返回的值
32
                    code: this.code,// 用于设置父子关系
33
                    parentCode: this.parentCode,// 用于设置父子关系
34
                    rootCodeValue: this.rootCodeValue,//设置根节点code值----可指定根节点,默认为null,"",0,"0"
35
                    type: this.method, //请求数据的ajax类型
36
                    url: this.url,   //请求数据的ajax的url
37
                    ajaxParams: this.data, //请求数据的ajax的data属性
38
                    expandColumn: this.expandColumn,//在哪一列上面显示展开按钮,从0开始
39
                    striped: true,   //是否各行渐变色
40
                    expandAll: this.expandAll,  //是否全部展开
41
                    columns: this.columns,		//列数组
42
                    toolbar: "#" + this.toolbarId,//顶部工具条
43
                    height: this.height,
44
                });
45
            return this;
46
        },
47
48
        /**
49
         * 设置在哪一列上面显示展开按钮,从0开始
50
         */
51
        setExpandColumn: function (expandColumn) {
52
            this.expandColumn = expandColumn;
53
        },
54
        /**
55
         * 设置记录返回的id值
56
         */
57
        setIdField: function (id) {
58
            this.id = id;
59
        },
60
        /**
61
         * 设置记录分级的字段
62
         */
63
        setCodeField: function (code) {
64
            this.code = code;
65
        },
66
        /**
67
         * 设置记录分级的父级字段
68
         */
69
        setParentCodeField: function (parentCode) {
70
            this.parentCode = parentCode;
71
        },
72
        /**
73
         * 设置根节点code值----可指定根节点,默认为null,"",0,"0"
74
         */
75
        setRootCodeValue: function (rootCodeValue) {
76
            this.rootCodeValue = rootCodeValue;
77
        },
78
        /**
79
         * 设置是否默认全部展开
80
         */
81
        setExpandAll: function (expandAll) {
82
        	this.expandAll = expandAll;
83
        },
84
        /**
85
         * 设置表格高度
86
         */
87
        setHeight: function (height) {
88
        	this.height = height;
89
        },
90
        /**
91
         * 设置ajax post请求时候附带的参数
92
         */
93
        set: function (key, value) {
94
            if (typeof key == "object") {
95
                for (var i in key) {
96
                    if (typeof i == "function")
97
                        continue;
98
                    this.data[i] = key[i];
99
                }
100
            } else {
101
                this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value;
102
            }
103
            return this;
104
        },
105
106
        /**
107
         * 设置ajax get请求时候附带的参数
108
         */
109
        setData: function (data) {
110
            this.data = data;
111
            return this;
112
        },
113
114
        /**
115
         * 清空ajax post请求参数
116
         */
117
        clear: function () {
118
            this.data = {};
119
            return this;
120
        },
121
122
        /**
123
         * 刷新表格
124
         */
125
        refresh: function (parms) {
126
            if (typeof parms != "undefined") {
127
                this.btInstance.bootstrapTreeTable('refresh', parms.query);// 为了兼容bootstrap-table的写法
128
            } else {
129
                this.btInstance.bootstrapTreeTable('refresh');
130
            }
131
        }
132
    };
133
134
    window.TreeTable = TreeTable;
135
136
}());

+ 63 - 49
src/main/resources/views/modules/sys/menu.html

@ -1,23 +1,31 @@
1 1
<!DOCTYPE html>
2 2
<html>
3 3
<head>
4
<title>菜单管理</title>
5
<meta charset="UTF-8">
6
<meta http-equiv="X-UA-Compatible" content="IE=edge">
7
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
8
<link rel="stylesheet" href="../../css/bootstrap.min.css">
9
<link rel="stylesheet" href="../../css/font-awesome.min.css">
10
<link rel="stylesheet" href="../../plugins/jqgrid/ui.jqgrid-bootstrap.css">
11
<link rel="stylesheet" href="../../plugins/ztree/css/metroStyle/metroStyle.css">
12
<link rel="stylesheet" href="../../css/ootstrap-table.main.css">
13
<script src="../../libs/jquery.min.js"></script>
14
<script src="../../plugins/layer/layer.js"></script>
15
<script src="../../libs/bootstrap.min.js"></script>
16
<script src="../../libs/vue.min.js"></script>
17
<script src="../../plugins/jqgrid/grid.locale-cn.js"></script>
18
<script src="../../plugins/jqgrid/jquery.jqGrid.min.js"></script>
19
<script src="../../plugins/ztree/jquery.ztree.all.min.js"></script>
20
<script src="../../js/common.js"></script>
4
	<title>菜单管理</title>
5
	<meta charset="UTF-8">
6
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
7
	<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
8
	<link rel="stylesheet" href="../../css/bootstrap.min.css">
9
	<link rel="stylesheet" href="../../css/font-awesome.min.css">
10
	<link rel="stylesheet" href="../../plugins/jqgrid/ui.jqgrid-bootstrap.css">
11
	<link rel="stylesheet" href="../../plugins/ztree/css/metroStyle/metroStyle.css">
12
	<link rel="stylesheet" href="../../css/bootstrap-table.ootstrap-table.min.css">
13
	<link rel="stylesheet" href="../../css/main.css">
14
	<link rel="stylesheet" href="../../plugins/treegrid/jquery.treegrid.css">
15
16
	<script src="../../libs/jquery.min.js"></script>
17
	<script src="../../plugins/layer/layer.js"></script>
18
	<script src="../../libs/bootstrap.min.js"></script>
19
	<script src="../../libs/vue.min.js"></script>
20
	<script src="../../libs/bootstrap-table.min.js"></script>
21
	<script src="../../plugins/treegrid/jquery.treegrid.min.js"></script>
22
	<script src="../../plugins/treegrid/jquery.treegrid.bootstrap3.js"></script>
23
	<script src="../../plugins/treegrid/jquery.treegrid.extension.js"></script>
24
	<script src="../../plugins/treegrid/tree.table.js"></script>
25
	<script src="../../plugins/jqgrid/grid.locale-cn.js"></script>
26
	<script src="../../plugins/jqgrid/jquery.jqGrid.min.js"></script>
27
	<script src="../../plugins/ztree/jquery.ztree.all.min.js"></script>
28
	<script src="../../js/common.js"></script>
21 29
</head>
22 30
<body>
23 31
<div id="rrapp" v-cloak>
@ -27,64 +35,69 @@
27 35
			<a v-if="hasPermission('sys:menu:update')" class="btn btn-primary" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</a>
28 36
			<a v-if="hasPermission('sys:menu:delete')" class="btn btn-primary" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</a>
29 37
		</div>
30
	    <table id="jqGrid"></table>
31
	    <div id="jqGridPager"></div>
38
		<table id="menuTable" data-mobile-responsive="true" data-click-to-select="true">
39
			<thead>
40
			<tr>
41
				<th data-field="selectItem" data-checkbox="true"></th>
42
			</tr>
43
			</thead>
44
		</table>
32 45
	</div>
33
	
46
34 47
	<div v-show="!showList" class="panel panel-default">
35 48
		<div class="panel-heading">{{title}}</div>
36 49
		<form class="form-horizontal">
37 50
			<div class="form-group">
38
				<div class="col-sm-2 control-label">类型</div> 
51
				<div class="col-sm-2 control-label">类型</div>
39 52
				<label class="radio-inline">
40
				  <input type="radio" name="type" value="0" v-model="menu.type"/> 目录
53
					<input type="radio" name="type" value="0" v-model="menu.type"/> 目录
41 54
				</label>
42 55
				<label class="radio-inline">
43
				  <input type="radio" name="type" value="1" v-model="menu.type"/> 菜单
56
					<input type="radio" name="type" value="1" v-model="menu.type"/> 菜单
44 57
				</label>
45 58
				<label class="radio-inline">
46
				  <input type="radio" name="type" value="2" v-model="menu.type"/> 按钮
59
					<input type="radio" name="type" value="2" v-model="menu.type"/> 按钮
47 60
				</label>
48 61
			</div>
49 62
			<div class="form-group">
50
			   	<div class="col-sm-2 control-label">菜单名称</div>
51
			   	<div class="col-sm-10">
52
			      <input type="text" class="form-control" v-model="menu.name" placeholder="菜单名称或按钮名称"/>
53
			    </div>
63
				<div class="col-sm-2 control-label">菜单名称</div>
64
				<div class="col-sm-10">
65
					<input type="text" class="form-control" v-model="menu.name" placeholder="菜单名称或按钮名称"/>
66
				</div>
54 67
			</div>
55 68
			<div class="form-group">
56 69
				<div class="col-sm-2 control-label">上级菜单</div>
57
			   	<div class="col-sm-10">
58
			       <input type="text" class="form-control" style="cursor:pointer;" v-model="menu.parentName" @click="menuTree" readonly="readonly" placeholder="一级菜单"/>
59
			    </div>
70
				<div class="col-sm-10">
71
					<input type="text" class="form-control" style="cursor:pointer;" v-model="menu.parentName" @click="menuTree" readonly="readonly" placeholder="一级菜单"/>
72
				</div>
60 73
			</div>
61 74
			<div v-if="menu.type == 1" class="form-group">
62
			   	<div class="col-sm-2 control-label">菜单URL</div>
63
			   	<div class="col-sm-10">
64
			      <input type="text" class="form-control" v-model="menu.url" placeholder="菜单URL"/>
65
			    </div>
75
				<div class="col-sm-2 control-label">菜单URL</div>
76
				<div class="col-sm-10">
77
					<input type="text" class="form-control" v-model="menu.url" placeholder="菜单URL"/>
78
				</div>
66 79
			</div>
67 80
			<div v-if="menu.type == 1 || menu.type == 2" class="form-group">
68
			   	<div class="col-sm-2 control-label">授权标识</div>
69
			   	<div class="col-sm-10">
70
			      <input type="text" class="form-control" v-model="menu.perms" placeholder="多个用逗号分隔,如:user:list,user:create"/>
71
			    </div>
81
				<div class="col-sm-2 control-label">授权标识</div>
82
				<div class="col-sm-10">
83
					<input type="text" class="form-control" v-model="menu.perms" placeholder="多个用逗号分隔,如:user:list,user:create"/>
84
				</div>
72 85
			</div>
73 86
			<div v-if="menu.type != 2" class="form-group">
74
			   	<div class="col-sm-2 control-label">排序号</div>
75
			   	<div class="col-sm-10">
76
			      <input type="number" class="form-control" v-model="menu.orderNum" placeholder="排序号"/>
77
			    </div>
87
				<div class="col-sm-2 control-label">排序号</div>
88
				<div class="col-sm-10">
89
					<input type="number" class="form-control" v-model="menu.orderNum" placeholder="排序号"/>
90
				</div>
78 91
			</div>
79 92
			<div v-if="menu.type != 2" class="form-group">
80
			   	<div class="col-sm-2 control-label">图标</div>
81
			   	<div class="col-sm-10">
82
			      <input type="text" class="form-control" v-model="menu.icon" placeholder="菜单图标"/>
83
			      <code style="margin-top:4px;display: block;">获取图标:http://fontawesome.io/icons/</code>
84
			    </div>
93
				<div class="col-sm-2 control-label">图标</div>
94
				<div class="col-sm-10">
95
					<input type="text" class="form-control" v-model="menu.icon" placeholder="菜单图标"/>
96
					<code style="margin-top:4px;display: block;">获取图标:http://fontawesome.io/icons/</code>
97
				</div>
85 98
			</div>
86 99
			<div class="form-group">
87
				<div class="col-sm-2 control-label"></div> 
100
				<div class="col-sm-2 control-label"></div>
88 101
				<input type="button" class="btn btn-primary" @click="saveOrUpdate" value="确定"/>
89 102
				&nbsp;&nbsp;<input type="button" class="btn btn-warning" @click="reload" value="返回"/>
90 103
			</div>
@ -97,6 +110,7 @@
97 110
	<ul id="menuTree" class="ztree"></ul>
98 111
</div>
99 112
113
100 114
<script src="../../js/modules/sys/menu.js"></script>
101 115
</body>
102 116
</html>