From 18b07733860da3945d80643a7166bcbc9dbbae30 Mon Sep 17 00:00:00 2001 From: xuliangzhan Date: Wed, 19 Jan 2022 21:23:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=A4=8D=E9=80=89=E6=A1=86?= =?UTF-8?q?=E7=A6=81=E7=94=A8=E6=97=B6=E6=98=BE=E7=A4=BA=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 +- packages/table/src/cell.js | 10 ++++------ packages/table/src/methods.js | 33 +++++++++++++++++++++++++++++---- styles/base/checked.scss | 5 +++++ 4 files changed, 39 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 845f8674b..088906e5f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vxe-table", - "version": "3.4.14-beta.0", + "version": "3.4.14-beta.1", "description": "一个基于 vue 的 PC 端表格组件,支持增删改查、虚拟列表、虚拟树、懒加载、快捷菜单、数据校验、树形结构、打印导出、表单渲染、数据分页、弹窗、自定义模板、渲染器、贼灵活的配置项、扩展接口等...", "scripts": { "serve": "vue-cli-service serve", diff --git a/packages/table/src/cell.js b/packages/table/src/cell.js index 4bc4cdc40..d85894e12 100644 --- a/packages/table/src/cell.js +++ b/packages/table/src/cell.js @@ -352,25 +352,23 @@ export const Cell = { */ renderCheckboxHeader (h, params) { const { $table, column, isHidden } = params - const { isIndeterminate: isAllCheckboxIndeterminate, isAllCheckboxDisabled } = $table + const { isAllSelected: isAllCheckboxSelected, isIndeterminate: isAllCheckboxIndeterminate, isAllCheckboxDisabled } = $table const { slots } = column const headerSlot = slots ? slots.header : null const titleSlot = slots ? slots.title : null const checkboxOpts = $table.checkboxOpts const headerTitle = column.getTitle() - let isChecked = false let on if (!isHidden) { - isChecked = isAllCheckboxDisabled ? false : $table.isAllSelected on = { click (evnt) { if (!isAllCheckboxDisabled) { - $table.triggerCheckAllEvent(evnt, !isChecked) + $table.triggerCheckAllEvent(evnt, !isAllCheckboxSelected) } } } } - const checkboxParams = { ...params, checked: isChecked, disabled: isAllCheckboxDisabled, indeterminate: isAllCheckboxIndeterminate } + const checkboxParams = { ...params, checked: isAllCheckboxSelected, disabled: isAllCheckboxDisabled, indeterminate: isAllCheckboxIndeterminate } if (headerSlot) { return renderTitleContent(h, checkboxParams, $table.callSlot(headerSlot, checkboxParams, h)) } @@ -384,7 +382,7 @@ export const Cell = { return renderTitleContent(h, checkboxParams, [ h('span', { class: ['vxe-cell--checkbox', { - 'is--checked': isChecked, + 'is--checked': isAllCheckboxSelected, 'is--disabled': isAllCheckboxDisabled, 'is--indeterminate': isAllCheckboxIndeterminate }], diff --git a/packages/table/src/methods.js b/packages/table/src/methods.js index 4282d081e..c53b40efc 100644 --- a/packages/table/src/methods.js +++ b/packages/table/src/methods.js @@ -2964,14 +2964,28 @@ const Methods = { const { afterFullData, selection, treeIndeterminates, checkboxOpts, treeConfig } = this const { checkField, halfField, checkStrictly, checkMethod } = checkboxOpts if (!checkStrictly) { + const disableRows = [] + const checkRows = [] + let isAllResolve = false let isAllSelected = false let isIndeterminate = false if (checkField) { - isAllSelected = afterFullData.length && afterFullData.every( + isAllResolve = afterFullData.every( checkMethod - ? (row) => !checkMethod({ row }) || XEUtils.get(row, checkField) + ? (row) => { + if (!checkMethod({ row })) { + disableRows.push(row) + return true + } + if (XEUtils.get(row, checkField)) { + checkRows.push(row) + return true + } + return false + } : row => XEUtils.get(row, checkField) ) + isAllSelected = isAllResolve && afterFullData.length !== disableRows.length if (treeConfig) { if (halfField) { isIndeterminate = !isAllSelected && afterFullData.some(row => XEUtils.get(row, checkField) || XEUtils.get(row, halfField) || treeIndeterminates.indexOf(row) > -1) @@ -2986,11 +3000,22 @@ const Methods = { } } } else { - isAllSelected = afterFullData.length && afterFullData.every( + isAllResolve = afterFullData.every( checkMethod - ? (row) => !checkMethod({ row }) || selection.indexOf(row) > -1 + ? (row) => { + if (!checkMethod({ row })) { + disableRows.push(row) + return true + } + if (selection.indexOf(row) > -1) { + checkRows.push(row) + return true + } + return false + } : row => selection.indexOf(row) > -1 ) + isAllSelected = isAllResolve && afterFullData.length !== disableRows.length if (treeConfig) { isIndeterminate = !isAllSelected && afterFullData.some(row => treeIndeterminates.indexOf(row) > -1 || selection.indexOf(row) > -1) } else { diff --git a/styles/base/checked.scss b/styles/base/checked.scss index f6477bcb8..1386bb884 100644 --- a/styles/base/checked.scss +++ b/styles/base/checked.scss @@ -170,5 +170,10 @@ border-color: $vxe-primary-disabled-color; } } + .vxe-checkbox--indeterminate-icon { + &:after { + background-color: $vxe-primary-disabled-color; + } + } } }