107 lines
2.6 KiB
TypeScript
107 lines
2.6 KiB
TypeScript
import { type Ref } from 'vue'
|
|
|
|
import {
|
|
normalizeTargetsConfig,
|
|
type TargetsConfig,
|
|
} from '../src/services/targets'
|
|
|
|
interface DashboardSelectionDeps {
|
|
calendars: Ref<Array<{ id: string }>>
|
|
selected: Ref<string[]>
|
|
groupsById: Ref<Record<string, number>>
|
|
targetsWeek: Ref<Record<string, number>>
|
|
targetsMonth: Ref<Record<string, number>>
|
|
targetsConfig: Ref<TargetsConfig>
|
|
range: Ref<'week' | 'month'>
|
|
queueSave: (reload?: boolean) => void
|
|
userChangedSelection: Ref<boolean>
|
|
}
|
|
|
|
const MAX_TARGET = 10000
|
|
|
|
export function useDashboardSelection(deps: DashboardSelectionDeps) {
|
|
function isSelected(id: string): boolean {
|
|
return deps.selected.value.includes(id)
|
|
}
|
|
|
|
function setSelected(id: string, checked: boolean) {
|
|
const set = new Set(deps.selected.value)
|
|
if (checked) {
|
|
set.add(id)
|
|
} else {
|
|
set.delete(id)
|
|
}
|
|
deps.selected.value = Array.from(set)
|
|
}
|
|
|
|
function toggleCalendar(id: string) {
|
|
setSelected(id, !isSelected(id))
|
|
deps.userChangedSelection.value = true
|
|
deps.queueSave()
|
|
}
|
|
|
|
function selectAll(includeAll: boolean) {
|
|
deps.selected.value = includeAll
|
|
? deps.calendars.value.map((cal) => String(cal.id))
|
|
: []
|
|
}
|
|
|
|
function setGroup(id: string, raw: number) {
|
|
const n = Math.max(0, Math.min(9, Math.trunc(Number(raw) || 0)))
|
|
const current = deps.groupsById.value ?? {}
|
|
deps.groupsById.value = {
|
|
...current,
|
|
[id]: n,
|
|
}
|
|
deps.queueSave(false)
|
|
}
|
|
|
|
function clampTarget(value: number): number {
|
|
const round = Math.round(value * 100) / 100
|
|
return Math.min(MAX_TARGET, Math.max(0, round))
|
|
}
|
|
|
|
function setTarget(id: string, hours: any) {
|
|
const num = Number(hours)
|
|
if (!Number.isFinite(num) || num < 0) {
|
|
return
|
|
}
|
|
const main = clampTarget(num)
|
|
if (deps.range.value === 'month') {
|
|
const weekConverted = clampTarget(main / 4)
|
|
deps.targetsMonth.value = {
|
|
...(deps.targetsMonth.value || {}),
|
|
[id]: main,
|
|
}
|
|
deps.targetsWeek.value = {
|
|
...(deps.targetsWeek.value || {}),
|
|
[id]: weekConverted,
|
|
}
|
|
} else {
|
|
const monthConverted = clampTarget(main * 4)
|
|
deps.targetsWeek.value = {
|
|
...(deps.targetsWeek.value || {}),
|
|
[id]: main,
|
|
}
|
|
deps.targetsMonth.value = {
|
|
...(deps.targetsMonth.value || {}),
|
|
[id]: monthConverted,
|
|
}
|
|
}
|
|
deps.queueSave(false)
|
|
}
|
|
|
|
function updateTargetsConfig(next: TargetsConfig) {
|
|
deps.targetsConfig.value = normalizeTargetsConfig(next)
|
|
deps.queueSave(false)
|
|
}
|
|
|
|
return {
|
|
isSelected,
|
|
toggleCalendar,
|
|
setGroup,
|
|
setTarget,
|
|
updateTargetsConfig,
|
|
selectAll,
|
|
}
|
|
}
|