| 776 |
lars |
1 |
// JavaScript source code
|
|
|
2 |
(function () {
|
|
|
3 |
if (typeof angular === 'undefined') {
|
|
|
4 |
return;
|
|
|
5 |
}
|
|
|
6 |
angular.module('bsTable', []).directive('bsTableControl', function () {
|
|
|
7 |
var CONTAINER_SELECTOR = '.bootstrap-table';
|
|
|
8 |
var SCROLLABLE_SELECTOR = '.fixed-table-body';
|
|
|
9 |
var SEARCH_SELECTOR = '.search input';
|
|
|
10 |
var bsTables = {};
|
|
|
11 |
function getBsTable (el) {
|
|
|
12 |
var result;
|
|
|
13 |
$.each(bsTables, function (id, bsTable) {
|
|
|
14 |
if (!bsTable.$el.closest(CONTAINER_SELECTOR).has(el).length) return;
|
|
|
15 |
result = bsTable;
|
|
|
16 |
return true;
|
|
|
17 |
});
|
|
|
18 |
return result;
|
|
|
19 |
}
|
|
|
20 |
|
|
|
21 |
$(window).resize(function () {
|
|
|
22 |
$.each(bsTables, function (id, bsTable) {
|
|
|
23 |
bsTable.$el.bootstrapTable('resetView');
|
|
|
24 |
});
|
|
|
25 |
});
|
|
|
26 |
function onScroll () {
|
|
|
27 |
var bsTable = this;
|
|
|
28 |
var state = bsTable.$s.bsTableControl.state;
|
|
|
29 |
bsTable.$s.$applyAsync(function () {
|
|
|
30 |
state.scroll = bsTable.$el.bootstrapTable('getScrollPosition');
|
|
|
31 |
});
|
|
|
32 |
}
|
|
|
33 |
$(document)
|
|
|
34 |
.on('post-header.bs.table', CONTAINER_SELECTOR+' table', function (evt) { // bootstrap-table calls .off('scroll') in initHeader so reattach here
|
|
|
35 |
var bsTable = getBsTable(evt.target);
|
|
|
36 |
if (!bsTable) return;
|
|
|
37 |
bsTable.$el
|
|
|
38 |
.closest(CONTAINER_SELECTOR)
|
|
|
39 |
.find(SCROLLABLE_SELECTOR)
|
|
|
40 |
.on('scroll', onScroll.bind(bsTable));
|
|
|
41 |
})
|
|
|
42 |
.on('sort.bs.table', CONTAINER_SELECTOR+' table', function (evt, sortName, sortOrder) {
|
|
|
43 |
var bsTable = getBsTable(evt.target);
|
|
|
44 |
if (!bsTable) return;
|
|
|
45 |
var state = bsTable.$s.bsTableControl.state;
|
|
|
46 |
bsTable.$s.$applyAsync(function () {
|
|
|
47 |
state.sortName = sortName;
|
|
|
48 |
state.sortOrder = sortOrder;
|
|
|
49 |
});
|
|
|
50 |
})
|
|
|
51 |
.on('page-change.bs.table', CONTAINER_SELECTOR+' table', function (evt, pageNumber, pageSize) {
|
|
|
52 |
var bsTable = getBsTable(evt.target);
|
|
|
53 |
if (!bsTable) return;
|
|
|
54 |
var state = bsTable.$s.bsTableControl.state;
|
|
|
55 |
bsTable.$s.$applyAsync(function () {
|
|
|
56 |
state.pageNumber = pageNumber;
|
|
|
57 |
state.pageSize = pageSize;
|
|
|
58 |
});
|
|
|
59 |
})
|
|
|
60 |
.on('search.bs.table', CONTAINER_SELECTOR+' table', function (evt, searchText) {
|
|
|
61 |
var bsTable = getBsTable(evt.target);
|
|
|
62 |
if (!bsTable) return;
|
|
|
63 |
var state = bsTable.$s.bsTableControl.state;
|
|
|
64 |
bsTable.$s.$applyAsync(function () {
|
|
|
65 |
state.searchText = searchText;
|
|
|
66 |
});
|
|
|
67 |
})
|
|
|
68 |
.on('focus blur', CONTAINER_SELECTOR+' '+SEARCH_SELECTOR, function (evt) {
|
|
|
69 |
var bsTable = getBsTable(evt.target);
|
|
|
70 |
if (!bsTable) return;
|
|
|
71 |
var state = bsTable.$s.bsTableControl.state;
|
|
|
72 |
bsTable.$s.$applyAsync(function () {
|
|
|
73 |
state.searchHasFocus = $(evt.target).is(':focus');
|
|
|
74 |
});
|
|
|
75 |
});
|
|
|
76 |
|
|
|
77 |
return {
|
|
|
78 |
restrict: 'EA',
|
|
|
79 |
scope: {bsTableControl: '='},
|
|
|
80 |
link: function ($s, $el) {
|
|
|
81 |
var bsTable = bsTables[$s.$id] = {$s: $s, $el: $el};
|
|
|
82 |
$s.instantiated = false;
|
|
|
83 |
$s.$watch('bsTableControl.options', function (options) {
|
|
|
84 |
if (!options) options = $s.bsTableControl.options = {};
|
|
|
85 |
var state = $s.bsTableControl.state || {};
|
|
|
86 |
|
|
|
87 |
if ($s.instantiated) $el.bootstrapTable('destroy');
|
|
|
88 |
$el.bootstrapTable(angular.extend(angular.copy(options), state));
|
|
|
89 |
$s.instantiated = true;
|
|
|
90 |
|
|
|
91 |
// Update the UI for state that isn't settable via options
|
|
|
92 |
if ('scroll' in state) $el.bootstrapTable('scrollTo', state.scroll);
|
|
|
93 |
if ('searchHasFocus' in state) $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).focus(); // $el gets detached so have to recompute whole chain
|
|
|
94 |
}, true);
|
|
|
95 |
$s.$watch('bsTableControl.state', function (state) {
|
|
|
96 |
if (!state) state = $s.bsTableControl.state = {};
|
|
|
97 |
$el.trigger('directive-updated.bs.table', [state]);
|
|
|
98 |
}, true);
|
|
|
99 |
$s.$on('$destroy', function () {
|
|
|
100 |
delete bsTables[$s.$id];
|
|
|
101 |
});
|
|
|
102 |
}
|
|
|
103 |
};
|
|
|
104 |
})
|
|
|
105 |
})();
|