mirror of
https://github.com/Gimanh/taskview-community.git
synced 2026-09-11 21:38:56 +00:00
@@ -166,7 +166,7 @@ watch(
|
||||
(id) => {
|
||||
if (!id) return
|
||||
store.fetchAllTasksAndLists(id).then(() => {
|
||||
layoutGraph(layoutDirection.value)
|
||||
applyFilters()
|
||||
})
|
||||
},
|
||||
{ immediate: true },
|
||||
|
||||
@@ -124,7 +124,8 @@ const initLoadTasksForEachColumn = async () => {
|
||||
}
|
||||
|
||||
watch(goalId, (lGoalId) => {
|
||||
kanbanStore.$reset()
|
||||
kanbanStore.statuses = []
|
||||
kanbanStore.tasksData = {}
|
||||
if (lGoalId) {
|
||||
kanbanStore.goalId = +lGoalId
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
import { computed, ref, watch } from 'vue'
|
||||
import { useRoute, useRouter } from 'vue-router'
|
||||
|
||||
export const useFiltersFromQuery = () => {
|
||||
const route = useRoute()
|
||||
const router = useRouter()
|
||||
|
||||
const parseIds = (raw: unknown): number[] => {
|
||||
if (typeof raw !== 'string' || !raw) return []
|
||||
return raw
|
||||
.split(',')
|
||||
.map((s) => Number(s))
|
||||
.filter((n) => Number.isFinite(n))
|
||||
}
|
||||
|
||||
const serializeIds = (ids: number[]): string | undefined =>
|
||||
ids.length ? ids.join(',') : undefined
|
||||
|
||||
const sameIds = (a: number[], b: number[]) =>
|
||||
a.length === b.length && a.every((v, i) => v === b[i])
|
||||
|
||||
const selectedListIds = ref<number[]>(parseIds(route.query.lists))
|
||||
const selectedAssigneeIds = ref<number[]>(parseIds(route.query.assignees))
|
||||
|
||||
watch([selectedListIds, selectedAssigneeIds], ([lists, assignees]) => {
|
||||
const next = { ...route.query }
|
||||
const listsStr = serializeIds(lists)
|
||||
const assigneesStr = serializeIds(assignees)
|
||||
if (listsStr) next.lists = listsStr
|
||||
else delete next.lists
|
||||
if (assigneesStr) next.assignees = assigneesStr
|
||||
else delete next.assignees
|
||||
router.replace({ query: next })
|
||||
})
|
||||
|
||||
watch(
|
||||
() => [route.query.lists, route.query.assignees] as const,
|
||||
([lists, assignees]) => {
|
||||
const nextLists = parseIds(lists)
|
||||
const nextAssignees = parseIds(assignees)
|
||||
if (!sameIds(nextLists, selectedListIds.value)) {
|
||||
selectedListIds.value = nextLists
|
||||
}
|
||||
if (!sameIds(nextAssignees, selectedAssigneeIds.value)) {
|
||||
selectedAssigneeIds.value = nextAssignees
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
const hasActiveFilters = computed(
|
||||
() => selectedListIds.value.length > 0 || selectedAssigneeIds.value.length > 0,
|
||||
)
|
||||
|
||||
return { selectedListIds, selectedAssigneeIds, hasActiveFilters }
|
||||
}
|
||||
@@ -58,6 +58,7 @@ import TvCollapseSidebarDesktop from '@/components/features/base/TvCollapseSideb
|
||||
import TvTaskDetailOverlay from '@/components/features/tasks/TvTaskDetailOverlay.vue'
|
||||
import TvKanbanFilters from '@/components/features/base/TvKanbanFilters.vue'
|
||||
import { useAppRouteInfo } from '@/composables/useAppRouteInfo'
|
||||
import { useFiltersFromQuery } from '@/composables/useFiltersFromQuery'
|
||||
import { useGoalsStore } from '@/stores/goals.store'
|
||||
import { useProjectDataLoader } from '@/composables/useProjectDataLoader'
|
||||
|
||||
@@ -66,9 +67,8 @@ const { projectId } = useAppRouteInfo()
|
||||
const goalsStore = useGoalsStore()
|
||||
const projectName = computed(() => goalsStore.goalMap.get(projectId.value)?.name ?? '')
|
||||
|
||||
const showFilters = ref(false)
|
||||
const selectedListIds = ref<number[]>([])
|
||||
const selectedAssigneeIds = ref<number[]>([])
|
||||
const { selectedListIds, selectedAssigneeIds, hasActiveFilters } = useFiltersFromQuery()
|
||||
const showFilters = ref(hasActiveFilters.value)
|
||||
|
||||
useProjectDataLoader(projectId)
|
||||
</script>
|
||||
|
||||
@@ -60,6 +60,7 @@ import TvCollapseSidebarDesktop from '@/components/features/base/TvCollapseSideb
|
||||
import TvTaskDetailOverlay from '@/components/features/tasks/TvTaskDetailOverlay.vue'
|
||||
import TvKanbanFilters from '@/components/features/base/TvKanbanFilters.vue'
|
||||
import { useAppRouteInfo } from '@/composables/useAppRouteInfo'
|
||||
import { useFiltersFromQuery } from '@/composables/useFiltersFromQuery'
|
||||
import { useProjectDataLoader } from '@/composables/useProjectDataLoader'
|
||||
import { useGoalsStore } from '@/stores/goals.store'
|
||||
import { useKanbanStore } from '@/stores/kanban.store'
|
||||
@@ -70,13 +71,12 @@ const goalsStore = useGoalsStore()
|
||||
const kanbanStore = useKanbanStore()
|
||||
const projectName = computed(() => goalsStore.goalMap.get(projectId.value)?.name ?? '')
|
||||
|
||||
const showFilters = ref(false)
|
||||
const selectedListIds = ref<number[]>([])
|
||||
const selectedAssigneeIds = ref<number[]>([])
|
||||
const { selectedListIds, selectedAssigneeIds, hasActiveFilters } = useFiltersFromQuery()
|
||||
const showFilters = ref(hasActiveFilters.value)
|
||||
|
||||
watch([selectedListIds, selectedAssigneeIds], ([listIds, assigneeIds]) => {
|
||||
kanbanStore.setFilters({ listIds, assigneeIds })
|
||||
})
|
||||
}, { immediate: true })
|
||||
|
||||
useProjectDataLoader(projectId)
|
||||
</script>
|
||||
|
||||
Reference in New Issue
Block a user