import type { ComputedRef } from 'vue' import { useListSelection } from '../composables/useListSelection' export interface UseSampleSelectorSelectionOptions { selected: () => string[] samples: () => string[] emitSelected: (samples: string[]) => void } export interface UseSampleSelectorSelectionReturn { isAllSelected: ComputedRef toggleSelectAll: () => void toggleSample: (sample: string) => void toggleSamplesSelection: (samples: string[]) => void isFullySelected: (samples: string[]) => boolean isPartiallySelected: (samples: string[]) => boolean } /** * Selection state for the sample selector. Works on plain sample arrays rather * than group names, so any level of the group hierarchy can drive it by handing * over the samples beneath that node. */ export function useSampleSelectorSelection( options: UseSampleSelectorSelectionOptions, ): UseSampleSelectorSelectionReturn { const sampleSelection = useListSelection({ selected: options.selected, items: options.samples, }) function emitSelection(samples: string[]) { options.emitSelected(samples) } function toggleSelectAll() { emitSelection(sampleSelection.toggleAll()) } function toggleSample(sample: string) { emitSelection(sampleSelection.toggleValue(sample)) } function toggleSamplesSelection(samples: string[]) { emitSelection(sampleSelection.toggleValues(samples)) } function isFullySelected(samples: string[]): boolean { return sampleSelection.isFullySelected(samples) } function isPartiallySelected(samples: string[]): boolean { return sampleSelection.isPartiallySelected(samples) } return { isAllSelected: sampleSelection.isAllSelected, toggleSelectAll, toggleSample, toggleSamplesSelection, isFullySelected, isPartiallySelected, } }