|
24 | 24 | :style="cellStyles(column, true)" |
25 | 25 | > |
26 | 26 | <v-checkbox |
27 | | - v-model="isAllSelected" |
| 27 | + v-if="selectStrategy !== 'single'" |
28 | 28 | :class="checkBoxClasses" |
29 | 29 | :density="density" |
30 | 30 | :focused="false" |
31 | 31 | :indeterminate="isIndeterminate" |
| 32 | + :model-value="isAllSelected" |
| 33 | + @update:modelValue="selectAllBoxes" |
32 | 34 | ></v-checkbox> |
33 | 35 | </th> |
34 | 36 | <!-- Column Render `data-table-expand` --> |
@@ -111,17 +113,28 @@ const props = withDefaults(defineProps<HeaderSlotProps>(), { |
111 | 113 | showSelect: false, |
112 | 114 | }); |
113 | 115 |
|
| 116 | +const columns = computed<Column[]>(() => props.slotProps.columns); |
114 | 117 | const iconOptions = inject<IconOptions>(Symbol.for('vuetify:icons')); |
| 118 | +const isAllSelected = ref<boolean>(false); |
| 119 | +const sortAscIcon = ref(props.sortAscIcon); |
| 120 | +const tableModelValue = computed(() => props.tableModelValue); |
115 | 121 | const theme = useTheme(); |
116 | | -const isAllSelected = ref<boolean>(props.slotProps.allRowsSelected); |
117 | 122 |
|
118 | | -const allSelected = computed(() => props.slotProps.allRowsSelected || isAllSelected.value); |
119 | | -const columns = computed<Column[]>(() => props.slotProps.columns); |
120 | | -const someSelected = computed(() => props.slotProps.someSelected); |
121 | | -const isIndeterminate = computed(() => someSelected.value && !props.slotProps.allRowsSelected); |
122 | | -const sortAscIcon = ref(props.sortAscIcon); |
| 123 | +
|
| 124 | +const items = ref(props.items); |
| 125 | +const allSelectable = ref(); |
123 | 126 |
|
124 | 127 |
|
| 128 | +watch(() => props.items, (newItems) => { |
| 129 | + items.value = newItems; |
| 130 | +
|
| 131 | + allSelectable.value = newItems?.filter(item => item.selectable) ?? []; |
| 132 | +
|
| 133 | + allSelectable.value = newItems?.filter(item => { |
| 134 | + return item.selectable !== false; |
| 135 | + }); |
| 136 | +}); |
| 137 | +
|
125 | 138 | // -------------------------------------------------- Header Row // |
126 | 139 | const headerRowClasses = computed<object>(() => { |
127 | 140 | return useHeaderRowClasses({ level: props.level }); |
@@ -154,21 +167,31 @@ const cellStyles = (column: { width?: string | number; }, dataTableExpand = fals |
154 | 167 |
|
155 | 168 |
|
156 | 169 | // -------------------------------------------------- Select // |
157 | | -watch(isAllSelected, (newVal) => { |
158 | | - props.slotProps.selectAll(newVal); |
159 | | - emit('click:selectAll', isAllSelected.value); |
| 170 | +const isIndeterminate = computed(() => { |
| 171 | + if (props.slotProps.allSelected || tableModelValue?.value?.length === 0) { |
| 172 | + return false; |
| 173 | + } |
| 174 | +
|
| 175 | + return true; |
160 | 176 | }); |
161 | 177 |
|
162 | | -watch(allSelected, (newVal) => { |
163 | | - isAllSelected.value = newVal; |
| 178 | +watch(() => props.slotProps.allSelected, (newAllSelected) => { |
| 179 | + isAllSelected.value = newAllSelected as boolean; |
164 | 180 | }); |
165 | 181 |
|
166 | | -watch(someSelected, (newVal) => { |
167 | | - if (!newVal) { |
168 | | - isAllSelected.value = false; |
| 182 | +watch(() => props.slotProps.someSelected, () => { |
| 183 | + if (props.slotProps.allSelected) { |
| 184 | + return false; |
169 | 185 | } |
170 | 186 | }); |
171 | 187 |
|
| 188 | +function selectAllBoxes() { |
| 189 | + isAllSelected.value = !isAllSelected.value; |
| 190 | + props.slotProps.selectAll(isAllSelected.value); |
| 191 | +
|
| 192 | + emit('click:selectAll', isAllSelected.value); |
| 193 | +} |
| 194 | +
|
172 | 195 | const checkBoxClasses = computed<object>(() => { |
173 | 196 | return useCheckBoxClasses({ level: props.level }); |
174 | 197 | }); |
|
0 commit comments