Subversion-Projekte lars-tiefland.ci

Revision

Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
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
})();