Browse Source

Table: fix select-all checkbox is selected when all rows are not selectable.

furybean 8 years ago
parent
commit
0a54bd41f1
2 changed files with 55 additions and 3 deletions
  1. 13 3
      packages/table/src/table-store.js
  2. 42 0
      test/unit/specs/table.spec.js

+ 13 - 3
packages/table/src/table-store.js

@@ -313,21 +313,31 @@ TableStore.prototype.updateAllSelected = function() {
   };
 
   let isAllSelected = true;
+  let selectedCount = 0;
   for (let i = 0, j = data.length; i < j; i++) {
     const item = data[i];
     if (selectable) {
-      if (selectable.call(null, item, i) && !isSelected(item)) {
-        isAllSelected = false;
-        break;
+      const isRowSelectable = selectable.call(null, item, i);
+      if (isRowSelectable) {
+        if (!isSelected(item)) {
+          isAllSelected = false;
+          break;
+        } else {
+          selectedCount++;
+        }
       }
     } else {
       if (!isSelected(item)) {
         isAllSelected = false;
         break;
+      } else {
+        selectedCount++;
       }
     }
   }
 
+  if (selectedCount === 0) isAllSelected = false;
+
   states.isAllSelected = isAllSelected;
 };
 

+ 42 - 0
test/unit/specs/table.spec.js

@@ -623,6 +623,48 @@ describe('Table', () => {
       }, DELAY);
     });
 
+    it('selectable === false & check selectAll status', done => {
+      const vm = createVue({
+        template: `
+          <el-table :data="testData" @selection-change="change">
+            <el-table-column type="selection" :selectable="filterSelect" />
+            <el-table-column prop="name" label="name" />
+            <el-table-column prop="release" label="release" />
+            <el-table-column prop="director" label="director" />
+            <el-table-column prop="runtime" label="runtime" />
+          </el-table>
+        `,
+
+        created() {
+        },
+
+        data() {
+          return { selected: [], testData: null };
+        },
+
+        methods: {
+          change(rows) {
+            this.selected = rows;
+          },
+
+          filterSelect(row, index) {
+            return false;
+          }
+        }
+      }, true);
+
+      vm.testData = getTestData();
+
+      setTimeout(_ => {
+        expect(vm.$el.querySelector('.el-checkbox').__vue__.checked).to.be.false;
+        setTimeout(_ => {
+          expect(vm.selected).to.length(0);
+          destroyVM(vm);
+          done();
+        }, DELAY);
+      }, DELAY);
+    });
+
     it('emit selection-change after row has been removed', done => {
       const vm = createVue({
         template: `