Browse Source

Merge pull request #75 from wenzhixin/master

Update my repo
Dennis Hernández 10 years ago
parent
commit
3b06ca830e

+ 88 - 36
dist/extensions/angular/bootstrap-table-angular.js

@@ -1,48 +1,100 @@
 // JavaScript source code
 (function () {
   angular.module('bsTable', []).directive('bsTableControl', function () {
-    var SEARCH_SELECTOR = '.search input';
     var CONTAINER_SELECTOR = '.bootstrap-table';
+    var SCROLLABLE_SELECTOR = '.fixed-table-body';
+    var SEARCH_SELECTOR = '.search input';
+    var 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: {options: '='},
+      scope: {bsTableControl: '='},
       link: function ($s, $el) {
-        var scroll;
-        var options;
-        $el
-          .on('sort.bs.table', function (evt, sortName, sortOrder) {
-            if (!options) return;
-            options.sortName = sortName;
-            options.sortOrder = sortOrder;
-          })
-          .on('page-change.bs.table', function (evt, pageNumber, pageSize) {
-            if (!options) return;
-            options.pageNumber = pageNumber;
-            options.pageSize = pageSize;
-          })
-          .on('search.bs.table', function (evt, searchText) {
-            if (!options) return;
-            options.searchText = searchText;
-          });
-        $s.$watch('options', function (newOptions) {
-          if (!newOptions) return;
+        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 || {};
 
-          var searchHasFocus = $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).is(':focus');
-          if (options) {
-            scroll = $el.bootstrapTable('getScrollPosition');
-            $el.bootstrapTable('destroy');
-          }
-          newOptions = angular.copy(newOptions);
-          if (options) angular.forEach(['sortName', 'sortOrder', 'pageNumber', 'pageSize', 'searchText'], function (key) {
-            if (key in options) newOptions[key] = options[key];
-          });
-          options = newOptions;
-          $el.bootstrapTable(options);
-          if (scroll) $el.bootstrapTable('scrollTo', scroll);
-          if (searchHasFocus) $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).focus(); // $el gets detached so have to recompute whole chain
+          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);
-        $(window).resize(function () {
-          if (options) $el.bootstrapTable('resetView');
+        $s.$on('$destroy', function () {
+          delete bsTables[$s.$id];
         });
       }
     };

File diff suppressed because it is too large
+ 2 - 2
dist/extensions/angular/bootstrap-table-angular.min.js


+ 10 - 1
docs/_i18n/en/documentation/column-options.md

@@ -135,7 +135,7 @@ The column options is defined in `jQuery.fn.bootstrapTable.columnDefaults`.
         <td>False to hide the columns item.</td>
     </tr>
     <tr>
-        <td>cardViewVisible</td>
+        <td>cardVisible</td>
         <td>data-card-visible</td>
         <td>Boolean</td>
         <td>true</td>
@@ -234,5 +234,14 @@ The column options is defined in `jQuery.fn.bootstrapTable.columnDefaults`.
         True to search data for this column.
         </td>
     </tr>
+    <tr>
+        <td>searchFormatter</td>
+        <td>data-search-formatter</td>
+        <td>Boolean</td>
+        <td>true</td>
+        <td>
+        True to search use formated data.
+        </td>
+    </tr>
 </tbody>
 </table>

+ 12 - 0
docs/_i18n/en/extensions/group-by.md

@@ -24,6 +24,18 @@ You must include the bootstrap-table-group-by.css file in order to get the appro
 * description: Set the field that you want to group the data.
 * default: ``
 
+### groupBySumGroup
+
+* type: Boolean
+* description: Set to True to include a sum row.
+* default: `false`
+
+### groupByInitExpanded
+
+* type: Boolean
+* description: Set to True to expand the first node of the table.
+* default: `false`
+
 ## Methods
 
 ### expandAll

+ 10 - 1
docs/_i18n/es/documentation/column-options.md

@@ -134,7 +134,7 @@ Las propiedades de la columna están definidas en `jQuery.fn.bootstrapTable.colu
         <td>False para ocultar el item de la columna.</td>
     </tr>
 	<tr>
-        <td>cardViewVisible</td>
+        <td>cardVisible</td>
         <td>data-card-visible</td>
         <td>Boolean</td>
         <td>true</td>
@@ -229,5 +229,14 @@ Las propiedades de la columna están definidas en `jQuery.fn.bootstrapTable.colu
         <td>true</td>
         <td>True para incluir la columna en la búsqueda.</td>
     </tr>
+    <tr>
+        <td>searchFormatter</td>
+        <td>data-search-formatter</td>
+        <td>Boolean</td>
+        <td>true</td>
+        <td>
+        True to search use formated data.
+        </td>
+    </tr>
     </tbody>
 </table>

+ 12 - 0
docs/_i18n/es/extensions/group-by.md

@@ -24,6 +24,18 @@ You must include the bootstrap-table-group-by.css file in order to get the appro
 * description: Set the field that you want to group the data.
 * default: ``
 
+### groupBySumGroup
+
+* type: Boolean
+* description: Set to True to include a sum row.
+* default: `false`
+
+### groupByInitExpanded
+
+* type: Boolean
+* description: Set to True to expand the first node of the table.
+* default: `false`
+
 ## Methods
 
 ### expandAll

+ 10 - 1
docs/_i18n/zh-cn/documentation/column-options.md

@@ -135,7 +135,7 @@ The column options is defined in `jQuery.fn.bootstrapTable.columnDefaults`.
         <td>False to hide the columns item.</td>
     </tr>
     <tr>
-        <td>cardViewVisible</td>
+        <td>cardVisible</td>
         <td>data-card-visible</td>
         <td>Boolean</td>
         <td>true</td>
@@ -234,5 +234,14 @@ The column options is defined in `jQuery.fn.bootstrapTable.columnDefaults`.
         True to search data for this column.
         </td>
     </tr>
+    <tr>
+        <td>searchFormatter</td>
+        <td>data-search-formatter</td>
+        <td>Boolean</td>
+        <td>true</td>
+        <td>
+        True to search use formated data.
+        </td>
+    </tr>
 </tbody>
 </table>

+ 12 - 0
docs/_i18n/zh-cn/extensions/group-by.md

@@ -24,6 +24,18 @@ You must include the bootstrap-table-group-by.css file in order to get the appro
 * description: Set the field that you want to group the data.
 * default: ``
 
+### groupBySumGroup
+
+* type: Boolean
+* description: Set to True to include a sum row.
+* default: `false`
+
+### groupByInitExpanded
+
+* type: Boolean
+* description: Set to True to expand the first node of the table.
+* default: `false`
+
 ## Methods
 
 ### expandAll

+ 88 - 36
docs/dist/extensions/angular/bootstrap-table-angular.js

@@ -1,48 +1,100 @@
 // JavaScript source code
 (function () {
   angular.module('bsTable', []).directive('bsTableControl', function () {
-    var SEARCH_SELECTOR = '.search input';
     var CONTAINER_SELECTOR = '.bootstrap-table';
+    var SCROLLABLE_SELECTOR = '.fixed-table-body';
+    var SEARCH_SELECTOR = '.search input';
+    var 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: {options: '='},
+      scope: {bsTableControl: '='},
       link: function ($s, $el) {
-        var scroll;
-        var options;
-        $el
-          .on('sort.bs.table', function (evt, sortName, sortOrder) {
-            if (!options) return;
-            options.sortName = sortName;
-            options.sortOrder = sortOrder;
-          })
-          .on('page-change.bs.table', function (evt, pageNumber, pageSize) {
-            if (!options) return;
-            options.pageNumber = pageNumber;
-            options.pageSize = pageSize;
-          })
-          .on('search.bs.table', function (evt, searchText) {
-            if (!options) return;
-            options.searchText = searchText;
-          });
-        $s.$watch('options', function (newOptions) {
-          if (!newOptions) return;
+        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 || {};
 
-          var searchHasFocus = $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).is(':focus');
-          if (options) {
-            scroll = $el.bootstrapTable('getScrollPosition');
-            $el.bootstrapTable('destroy');
-          }
-          newOptions = angular.copy(newOptions);
-          if (options) angular.forEach(['sortName', 'sortOrder', 'pageNumber', 'pageSize', 'searchText'], function (key) {
-            if (key in options) newOptions[key] = options[key];
-          });
-          options = newOptions;
-          $el.bootstrapTable(options);
-          if (scroll) $el.bootstrapTable('scrollTo', scroll);
-          if (searchHasFocus) $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).focus(); // $el gets detached so have to recompute whole chain
+          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);
-        $(window).resize(function () {
-          if (options) $el.bootstrapTable('resetView');
+        $s.$on('$destroy', function () {
+          delete bsTables[$s.$id];
         });
       }
     };

File diff suppressed because it is too large
+ 2 - 2
docs/dist/extensions/angular/bootstrap-table-angular.min.js


+ 20 - 14
src/bootstrap-table.js

@@ -450,6 +450,7 @@
         sortName: undefined,
         cellStyle: undefined,
         searchable: true,
+        searchFormatter: true,
         cardVisible: true
     };
 
@@ -640,7 +641,6 @@
             sorters: [],
             sortNames: [],
             cellStyles: [],
-            clickToSelects: [],
             searchables: []
         };
 
@@ -687,7 +687,6 @@
                     that.header.sorters[column.fieldIndex] = column.sorter;
                     that.header.sortNames[column.fieldIndex] = column.sortName;
                     that.header.cellStyles[column.fieldIndex] = column.cellStyle;
-                    that.header.clickToSelects[column.fieldIndex] = column.clickToSelect;
                     that.header.searchables[column.fieldIndex] = column.searchable;
 
                     if (!column.visible) {
@@ -1077,8 +1076,10 @@
                         j = $.inArray(key, that.header.fields);
 
                     // Fix #142: search use formated data
-                    value = calculateObjectValue(column,
-                        that.header.formatters[j], [value, item, i], value);
+                    if (column && column.searchFormatter) {
+                        value = calculateObjectValue(column,
+                            that.header.formatters[j], [value, item, i], value);
+                    }
 
                     var index = $.inArray(key, that.header.fields);
                     if (index !== -1 && that.header.searchables[index] && (typeof value === 'string' || typeof value === 'number')) {
@@ -1535,20 +1536,23 @@
             var $td = $(this),
                 $tr = $td.parent(),
                 item = that.data[$tr.data('index')],
-                cellIndex = $td[0].cellIndex,
-                $headerCell = that.$header.find('th:eq(' + cellIndex + ')'),
-                field = $headerCell.data('field'),
+                index = $td[0].cellIndex,
+                field = that.header.fields[that.options.detailView && !that.options.cardView ? index - 1 : index],
+                colomn = that.columns[getFieldIndex(that.columns, field)],
                 value = item[field];
 
+            if ($td.find('.detail-icon').length) {
+                return;
+            }
+
             that.trigger(e.type === 'click' ? 'click-cell' : 'dbl-click-cell', field, value, item, $td);
             that.trigger(e.type === 'click' ? 'click-row' : 'dbl-click-row', item, $tr);
+
             // if click to select - then trigger the checkbox/radio click
-            if (e.type === 'click' && that.options.clickToSelect) {
-                if (that.header.clickToSelects[$tr.children().index($(this))]) {
-                    var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
-                    if ($selectItem.length) {
-                        $selectItem[0].click(); // #144: .trigger('click') bug
-                    }
+            if (e.type === 'click' && that.options.clickToSelect && colomn.clickToSelect) {
+                var $selectItem = $tr.find(sprintf('[name="%s"]', that.options.selectItemName));
+                if ($selectItem.length) {
+                    $selectItem[0].click(); // #144: .trigger('click') bug
                 }
             }
         });
@@ -1747,7 +1751,9 @@
         $.each(this.data, function (i, row) {
             that.$selectAll.prop('checked', false);
             that.$selectItem.prop('checked', false);
-            row[that.header.stateField] = false;
+            if (that.header.stateField) {
+                row[that.header.stateField] = false;
+            }
         });
     };
 

+ 88 - 36
src/extensions/angular/bootstrap-table-angular.js

@@ -1,48 +1,100 @@
 // JavaScript source code
 (function () {
   angular.module('bsTable', []).directive('bsTableControl', function () {
-    var SEARCH_SELECTOR = '.search input';
     var CONTAINER_SELECTOR = '.bootstrap-table';
+    var SCROLLABLE_SELECTOR = '.fixed-table-body';
+    var SEARCH_SELECTOR = '.search input';
+    var 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: {options: '='},
+      scope: {bsTableControl: '='},
       link: function ($s, $el) {
-        var scroll;
-        var options;
-        $el
-          .on('sort.bs.table', function (evt, sortName, sortOrder) {
-            if (!options) return;
-            options.sortName = sortName;
-            options.sortOrder = sortOrder;
-          })
-          .on('page-change.bs.table', function (evt, pageNumber, pageSize) {
-            if (!options) return;
-            options.pageNumber = pageNumber;
-            options.pageSize = pageSize;
-          })
-          .on('search.bs.table', function (evt, searchText) {
-            if (!options) return;
-            options.searchText = searchText;
-          });
-        $s.$watch('options', function (newOptions) {
-          if (!newOptions) return;
+        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 || {};
 
-          var searchHasFocus = $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).is(':focus');
-          if (options) {
-            scroll = $el.bootstrapTable('getScrollPosition');
-            $el.bootstrapTable('destroy');
-          }
-          newOptions = angular.copy(newOptions);
-          if (options) angular.forEach(['sortName', 'sortOrder', 'pageNumber', 'pageSize', 'searchText'], function (key) {
-            if (key in options) newOptions[key] = options[key];
-          });
-          options = newOptions;
-          $el.bootstrapTable(options);
-          if (scroll) $el.bootstrapTable('scrollTo', scroll);
-          if (searchHasFocus) $el.closest(CONTAINER_SELECTOR).find(SEARCH_SELECTOR).focus(); // $el gets detached so have to recompute whole chain
+          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);
-        $(window).resize(function () {
-          if (options) $el.bootstrapTable('resetView');
+        $s.$on('$destroy', function () {
+          delete bsTables[$s.$id];
         });
       }
     };

+ 1 - 1
src/extensions/cookie/bootstrap-table-cookie.js

@@ -80,7 +80,7 @@
     };
 
     var calculateExpiration = function(cookieExpire) {
-        var time = cookieExpire.replace(/[0-9]/, ''); //s,mi,h,d,m,y
+        var time = cookieExpire.replace(/[0-9]*/, ''); //s,mi,h,d,m,y
         cookieExpire = cookieExpire.replace(/[A-Za-z]/, ''); //number
 
         switch (time.toLowerCase()) {