bootstrap-table-angular.js 3.8 KB

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