Skip to content

Commit 6cef5c0

Browse files
Updating checkbox functionality for tfoot
1 parent 2552ba5 commit 6cef5c0

File tree

3 files changed

+41
-18
lines changed

3 files changed

+41
-18
lines changed

src/plugin/VDrilldownTable.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464
<template #[`headers`]="props">
6565
<HeadersSlot
6666
:key="level"
67-
:all-selected="props.allSelected"
6867
:colors="loadedDrilldown.colors"
6968
:density="loadedDrilldown.density"
7069
:items="loadedDrilldown.items"
@@ -151,7 +150,6 @@
151150
/>
152151
</template>
153152

154-
155153
<template
156154
v-if="slots['no-data']"
157155
#no-data
@@ -265,9 +263,12 @@
265263
:colors="loadedDrilldown.colors || null"
266264
:density="loadedDrilldown.density"
267265
:footers="loadedDrilldown.footers || []"
266+
:items="loadedDrilldown.items"
268267
:level="loadedDrilldown.level"
268+
:select-strategy="loadedDrilldown.selectStrategy"
269269
:show-select="loadedDrilldown.showSelect"
270270
:slot-props="{ ...props }"
271+
:table-model-value="loadedDrilldown.modelValue"
271272
>
272273
<!-- Pass on all scoped slots -->
273274
<template

src/plugin/slots/HeadersSlot.vue

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -113,18 +113,16 @@ const props = withDefaults(defineProps<HeaderSlotProps>(), {
113113
showSelect: false,
114114
});
115115
116+
const allSelectable = ref();
116117
const columns = computed<Column[]>(() => props.slotProps.columns);
117118
const iconOptions = inject<IconOptions>(Symbol.for('vuetify:icons'));
118119
const isAllSelected = ref<boolean>(false);
120+
const items = ref(props.items);
119121
const sortAscIcon = ref(props.sortAscIcon);
120122
const tableModelValue = computed(() => props.tableModelValue);
121123
const theme = useTheme();
122124
123125
124-
const items = ref(props.items);
125-
const allSelectable = ref();
126-
127-
128126
watch(() => props.items, (newItems) => {
129127
items.value = newItems;
130128
@@ -135,6 +133,7 @@ watch(() => props.items, (newItems) => {
135133
});
136134
});
137135
136+
138137
// -------------------------------------------------- Header Row //
139138
const headerRowClasses = computed<object>(() => {
140139
return useHeaderRowClasses({ level: props.level });

src/plugin/slots/TfootSlot.vue

Lines changed: 35 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@
2828
:style="cellStyles"
2929
>
3030
<v-checkbox
31-
v-model="isAllSelected"
31+
v-if="selectStrategy !== 'single'"
3232
:class="checkBoxClasses"
3333
:density="density"
3434
:focused="false"
3535
:indeterminate="isIndeterminate"
36+
:model-value="isAllSelected"
37+
@update:modelValue="selectAllBoxes"
3638
></v-checkbox>
3739
</th>
3840
<!-- Column Render `data-table-expand` -->
@@ -92,19 +94,30 @@ const emit = defineEmits([
9294
9395
const props = withDefaults(defineProps<TFootSlotProps>(), {});
9496
97+
const allSelectable = ref();
9598
const theme = useTheme();
9699
const isAllSelected = ref<boolean>(props.slotProps.allRowsSelected);
100+
const items = ref(props.items);
101+
const tableModelValue = computed(() => props.tableModelValue);
97102
98-
const allSelected = computed(() => props.slotProps.allRowsSelected || isAllSelected.value);
99103
const columns = computed<Column[] | Props['footers']>(() => {
100104
if (props.footers.length) {
101105
return props.footers;
102106
}
103107
104108
return props.slotProps.columns;
105109
});
106-
const someSelected = computed(() => props.slotProps.someSelected);
107-
const isIndeterminate = computed(() => someSelected.value && !props.slotProps.allRowsSelected);
110+
111+
112+
watch(() => props.items, (newItems) => {
113+
items.value = newItems;
114+
115+
allSelectable.value = newItems?.filter(item => item.selectable) ?? [];
116+
117+
allSelectable.value = newItems?.filter(item => {
118+
return item.selectable !== false;
119+
});
120+
});
108121
109122
110123
// -------------------------------------------------- Tfoot //
@@ -143,21 +156,31 @@ const cellStyles = computed<CSSProperties>(() => {
143156
144157
145158
// -------------------------------------------------- Select //
146-
watch(isAllSelected, (newVal) => {
147-
props.slotProps.selectAll(newVal);
148-
emit('click:selectAll', isAllSelected.value);
159+
const isIndeterminate = computed(() => {
160+
if (props.slotProps.allSelected || tableModelValue?.value?.length === 0) {
161+
return false;
162+
}
163+
164+
return true;
149165
});
150166
151-
watch(allSelected, (newVal) => {
152-
isAllSelected.value = newVal;
167+
watch(() => props.slotProps.allSelected, (newAllSelected) => {
168+
isAllSelected.value = newAllSelected as boolean;
153169
});
154170
155-
watch(someSelected, (newVal) => {
156-
if (!newVal) {
157-
isAllSelected.value = false;
171+
watch(() => props.slotProps.someSelected, () => {
172+
if (props.slotProps.allSelected) {
173+
return false;
158174
}
159175
});
160176
177+
function selectAllBoxes() {
178+
isAllSelected.value = !isAllSelected.value;
179+
props.slotProps.selectAll(isAllSelected.value);
180+
181+
emit('click:selectAll', isAllSelected.value);
182+
}
183+
161184
const checkBoxClasses = computed<object>(() => {
162185
return useCheckBoxClasses({ level: props.level });
163186
});

0 commit comments

Comments
 (0)