import { computed, type Ref } from 'vue' export interface SelectableRow { id: number | string selected?: boolean [key: string]: unknown } export function useTableSelection(rows: Ref) { const toggle = (id: TRow['id']) => { const row = rows.value.find((r) => r.id === id) if (row) row.selected = !row.selected } const toggleAll = () => { const anyUnselected = rows.value.some((r) => !r.selected) rows.value.forEach((r) => { r.selected = anyUnselected }) } const clear = () => { rows.value.forEach((r) => { r.selected = false }) } const selectedIds = computed(() => rows.value.filter((r) => r.selected).map((r) => r.id)) const anyRowSelected = computed(() => selectedIds.value.length > 0) const allSelected = computed(() => rows.value.length > 0 && rows.value.every((r) => r.selected)) const someSelected = computed(() => anyRowSelected.value && !allSelected.value) return { toggle, toggleAll, clear, selectedIds, anyRowSelected, allSelected, someSelected, } }