Skip to content

Commit fd92084

Browse files
Updating checkbox functionality
1 parent 9dc8bff commit fd92084

File tree

2 files changed

+45
-28
lines changed

2 files changed

+45
-28
lines changed

src/plugin/slots/HeadersSlot.vue

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@
2424
:style="cellStyles(column, true)"
2525
>
2626
<v-checkbox
27-
v-model="isAllSelected"
27+
v-if="selectStrategy !== 'single'"
2828
:class="checkBoxClasses"
2929
:density="density"
3030
:focused="false"
3131
:indeterminate="isIndeterminate"
32+
:model-value="isAllSelected"
33+
@update:modelValue="selectAllBoxes"
3234
></v-checkbox>
3335
</th>
3436
<!-- Column Render `data-table-expand` -->
@@ -111,17 +113,28 @@ const props = withDefaults(defineProps<HeaderSlotProps>(), {
111113
showSelect: false,
112114
});
113115
116+
const columns = computed<Column[]>(() => props.slotProps.columns);
114117
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);
115121
const theme = useTheme();
116-
const isAllSelected = ref<boolean>(props.slotProps.allRowsSelected);
117122
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();
123126
124127
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+
125138
// -------------------------------------------------- Header Row //
126139
const headerRowClasses = computed<object>(() => {
127140
return useHeaderRowClasses({ level: props.level });
@@ -154,21 +167,31 @@ const cellStyles = (column: { width?: string | number; }, dataTableExpand = fals
154167
155168
156169
// -------------------------------------------------- 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;
160176
});
161177
162-
watch(allSelected, (newVal) => {
163-
isAllSelected.value = newVal;
178+
watch(() => props.slotProps.allSelected, (newAllSelected) => {
179+
isAllSelected.value = newAllSelected as boolean;
164180
});
165181
166-
watch(someSelected, (newVal) => {
167-
if (!newVal) {
168-
isAllSelected.value = false;
182+
watch(() => props.slotProps.someSelected, () => {
183+
if (props.slotProps.allSelected) {
184+
return false;
169185
}
170186
});
171187
188+
function selectAllBoxes() {
189+
isAllSelected.value = !isAllSelected.value;
190+
props.slotProps.selectAll(isAllSelected.value);
191+
192+
emit('click:selectAll', isAllSelected.value);
193+
}
194+
172195
const checkBoxClasses = computed<object>(() => {
173196
return useCheckBoxClasses({ level: props.level });
174197
});

src/plugin/slots/ItemSlot.vue

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@
3939
name="item.data-table-select"
4040
/>
4141
<v-checkbox
42-
v-model="allSelected"
4342
class="d-flex v-simple-checkbox"
4443
:density="density"
45-
@click="emitClickRowCheckbox({
44+
:disabled="item.raw.selectable === false && itemSelectable === 'selectable'"
45+
:model-value="slotProps.isSelected([item])"
46+
@click.stop="emitClickRowCheckbox({
4647
columns,
4748
index,
4849
item,
@@ -54,7 +55,7 @@
5455
<!-- Column Render `data-table-expand` -->
5556
<td
5657
v-else-if="column.key === 'data-table-expand' || (column.key === 'data-table-expand' && showExpand)
57-
"
58+
"
5859
:class="cellClasses(column)"
5960
:colspan="column.colspan || 1"
6061
>
@@ -129,6 +130,7 @@ const item = computed(() => props.slotProps.item);
129130
const currentLevel = computed(() => props.slotProps.level);
130131
const toggleExpand = computed(() => props.slotProps.toggleExpand);
131132
const toggleSelect = computed(() => props.slotProps.toggleSelect);
133+
const itemSelectable = computed(() => props.itemSelectable);
132134
133135
134136
// -------------------------------------------------- Row //
@@ -176,18 +178,10 @@ function drilldownEvent(data: DrilldownEvent): void {
176178
177179
178180
// -------------------------------------------------- Select //
179-
const allSelected = ref<boolean>(false);
180-
181-
watch(() => props.slotProps.allRowsSelected, () => {
182-
allSelected.value = props.slotProps.allRowsSelected;
183-
});
184-
185181
function emitClickRowCheckbox(data: ClickRowCheckboxEvent): void {
186-
const { item, level, toggleSelect } = data as ClickRowCheckboxEvent;
182+
const { item, toggleSelect } = data as ClickRowCheckboxEvent;
187183
188-
if (level === props.level) {
189-
toggleSelect(item);
190-
}
184+
toggleSelect(item);
191185
192186
emit('click:row:checkbox', item);
193187
}

0 commit comments

Comments
 (0)