Disable checkbox for channels without streams

This commit is contained in:
freearhey 2023-12-06 22:09:05 +03:00
parent 1b54c7e9b4
commit 10c802f97f
4 changed files with 24 additions and 8 deletions

View file

@ -65,6 +65,7 @@
} }
$: isSelected = !!$selected.find(c => c.id === channel.id) $: isSelected = !!$selected.find(c => c.id === channel.id)
$: isDisabled = channel.streams === 0
</script> </script>
{#if $downloadMode} {#if $downloadMode}
@ -72,7 +73,7 @@
transition:fade={{ duration: 200 }} transition:fade={{ duration: 200 }}
class="w-14 h-14 shrink-0 flex items-center absolute -left-14" class="w-14 h-14 shrink-0 flex items-center absolute -left-14"
> >
<Checkbox selected={isSelected} on:change={onCheckboxChange} /> <Checkbox selected={isSelected} disabled={isDisabled} on:change={onCheckboxChange} />
</div> </div>
{/if} {/if}
<div <div

View file

@ -5,6 +5,7 @@
export let selected = false export let selected = false
export let indeterminate = false export let indeterminate = false
export let disabled = false
function toggle(state) { function toggle(state) {
dispatch('change', { state }) dispatch('change', { state })
@ -39,6 +40,16 @@
/> />
</svg> </svg>
</button> </button>
{:else if disabled}
<button
class="w-12 h-12 rounded-full text-gray-200 dark:text-gray-700 transition-colors duration-200 flex items-center justify-center"
aria-label="Disabled"
{disabled}
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-6 h-6">
<circle cx="12" cy="12" r="3" />
</svg>
</button>
{:else} {:else}
<button <button
class="w-12 h-12 rounded-full text-gray-200 hover:text-gray-400 dark:text-gray-700 dark:hover:text-gray-600 transition-colors duration-200 flex items-center justify-center" class="w-12 h-12 rounded-full text-gray-200 hover:text-gray-400 dark:text-gray-700 dark:hover:text-gray-600 transition-colors duration-200 flex items-center justify-center"

View file

@ -22,7 +22,9 @@
channels.forEach(channel => { channels.forEach(channel => {
selected.update(arr => { selected.update(arr => {
if (event.detail.state) { if (event.detail.state) {
arr.push(channel) if (channel.streams > 0) {
arr.push(channel)
}
} else { } else {
arr = arr.filter(c => c.id !== channel.id) arr = arr.filter(c => c.id !== channel.id)
} }

View file

@ -2,10 +2,12 @@
import OutlineButton from '~/components/OutlineButton.svelte' import OutlineButton from '~/components/OutlineButton.svelte'
import { selected, filteredChannels } from '~/store' import { selected, filteredChannels } from '~/store'
$: isAllSelected = $selected.length === $filteredChannels.length $: hasStreams = $filteredChannels.filter(c => c.streams > 0)
$: isAllSelected = $selected.length === hasStreams.length
function selectAll() { function selectAll() {
selected.set($filteredChannels) selected.set(hasStreams)
} }
function deselectAll() { function deselectAll() {
@ -14,7 +16,7 @@
</script> </script>
{#if isAllSelected} {#if isAllSelected}
<OutlineButton on:click={deselectAll} aria-label="Deselect All ({$selected.length})"> <OutlineButton on:click={deselectAll} aria-label="Deselect All">
<span class="text-gray-500 dark:text-white"> <span class="text-gray-500 dark:text-white">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -29,10 +31,10 @@
/> />
</svg> </svg>
</span> </span>
<span class="hidden md:inline">Deselect All ({$selected.length})</span> <span class="hidden md:inline">Deselect All</span>
</OutlineButton> </OutlineButton>
{:else} {:else}
<OutlineButton on:click={selectAll} aria-label="Select All ({$filteredChannels.length})"> <OutlineButton on:click={selectAll} aria-label="Select All">
<span class="text-gray-500 dark:text-white"> <span class="text-gray-500 dark:text-white">
<svg <svg
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
@ -48,6 +50,6 @@
</svg> </svg>
</span> </span>
<span class="hidden md:inline">Select All ({$filteredChannels.length})</span> <span class="hidden md:inline">Select All</span>
</OutlineButton> </OutlineButton>
{/if} {/if}