123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107 |
- // JavaScript source code
- (function () {
- if (typeof angular === 'undefined') {
- return;
- }
- angular.module('bsTable', [])
- .constant('uiBsTables', {bsTables: {}})
- .directive('bsTableControl', ['uiBsTables', function (uiBsTables) {
- var CONTAINER_SELECTOR = '.bootstrap-table';
- var SCROLLABLE_SELECTOR = '.fixed-table-body';
- var SEARCH_SELECTOR = '.search input';
- var bsTables = uiBsTables.bsTables;
- function getBsTable (el) {
- var result;
- $.each(bsTables, function (id, bsTable) {
- if (!bsTable.$el.closest(CONTAINER_SELECTOR).has(el).length) return;
- result = bsTable;
- return true;
- });
- return result;
- }
- $(window).resize(function () {
- $.each(bsTables, function (id, bsTable) {
- bsTable.$el.bootstrapTable('resetView');
- });
- });
- function onScroll () {
- var bsTable = this;
- var state = bsTable.$s.bsTableControl.state;
- bsTable.$s.$applyAsync(function () {
- state.scroll = bsTable.$el.bootstrapTable('getScrollPosition');
- });
- }
- $(document)
- .on('post-header.bs.table', CONTAINER_SELECTOR+' table', function (evt) { // bootstrap-table calls .off('scroll') in initHeader so reattach here
- var bsTable = getBsTable(evt.target);
- if (!bsTable) return;
- bsTable.$el
- .closest(CONTAINER_SELECTOR)
- .find(SCROLLABLE_SELECTOR)
- .on('scroll', onScroll.bind(bsTable));
- })
- .on('sort.bs.table', CONTAINER_SELECTOR+' table', function (evt, sortName, sortOrder) {
- var bsTable = getBsTable(evt.target);
- if (!bsTable) return;
- var state = bsTable.$s.bsTableControl.state;
- bsTable.$s.$applyAsync(function () {
- state.sortName = sortName;
- state.sortOrder = sortOrder;
- });
- })
- .on('page-change.bs.table', CONTAINER_SELECTOR+' table', function (evt, pageNumber, pageSize) {
- var bsTable = getBsTable(evt.target);
- if (!bsTable) return;
- var state = bsTable.$s.bsTableControl.state;
- bsTable.$s.$applyAsync(function () {
- state.pageNumber = pageNumber;
- state.pageSize = pageSize;
- });
- })
- .on('search.bs.table', CONTAINER_SELECTOR+' table', function (evt, searchText) {
- var bsTable = getBsTable(evt.target);
- if (!bsTable) return;
- var state = bsTable.$s.bsTableControl.state;
- bsTable.$s.$applyAsync(function () {
- state.searchText = searchText;
- });
- })
- .on('focus blur', CONTAINER_SELECTOR+' '+SEARCH_SELECTOR, function (evt) {
- var bsTable = getBsTable(evt.target);
- if (!bsTable) return;
- var state = bsTable.$s.bsTableControl.state;
- bsTable.$s.$applyAsync(function () {
- state.searchHasFocus = $(evt.target).is(':focus');
- });
- });
- return {
- restrict: 'EA',
- scope: {bsTableControl: '='},
- link: function ($s, $el) {
- var bsTable = bsTables[$s.$id] = {$s: $s, $el: $el};
- $s.instantiated = false;
- $s.$watch('bsTableControl.options', function (options) {
- if (!options) options = $s.bsTableControl.options = {};
- var state = $s.bsTableControl.state || {};
- if ($s.instantiated) $el.bootstrapTable('destroy');
- $el.bootstrapTable(angular.extend(angular.copy(options), state));
- $s.instantiated = true;
- // Update the UI for state that isn't settable via options
- if ('scroll' in state) $el.bootstrapTable('scrollTo', state.scroll);
- if ('searchHasFocus' in state) $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).focus(); // $el gets detached so have to recompute whole chain
- }, true);
- $s.$watch('bsTableControl.state', function (state) {
- if (!state) state = $s.bsTableControl.state = {};
- $el.trigger('directive-updated.bs.table', [state]);
- }, true);
- $s.$on('$destroy', function () {
- delete bsTables[$s.$id];
- });
- }
- };
- }])
- })();
|