bootstrap-table-angular.js 4.4 KB

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