diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 0000000..ab6c8aa --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,11 @@ +coverage: + status: + project: + default: + threshold: 5% + patch: off +comment: + layout: diff +parsers: + go: + partials_as_hits: true \ No newline at end of file diff --git a/migrations/7_search_view.go b/migrations/7_search_view.go new file mode 100644 index 0000000..8280fc9 --- /dev/null +++ b/migrations/7_search_view.go @@ -0,0 +1,49 @@ +package migrations + +import ( + "github.com/pocketbase/dbx" + "github.com/pocketbase/pocketbase/daos" +) + +const searchViewName = "ticket_search" + +const searchViewQuery = ` +SELECT + tickets.id, + tickets.name, + tickets.created, + tickets.description, + tickets.open, + tickets.type, + tickets.state, + users.name as owner_name, + group_concat(comments.message) as comment_messages, + group_concat(files.name) as file_names, + group_concat(links.name) as link_names, + group_concat(links.url) as link_urls, + group_concat(tasks.name) as task_names, + group_concat(timeline.message) as timeline_messages +FROM tickets +LEFT JOIN comments ON comments.ticket = tickets.id +LEFT JOIN files ON files.ticket = tickets.id +LEFT JOIN links ON links.ticket = tickets.id +LEFT JOIN tasks ON tasks.ticket = tickets.id +LEFT JOIN timeline ON timeline.ticket = tickets.id +LEFT JOIN users ON users.id = tickets.owner +GROUP BY tickets.id +` + +func searchViewUp(db dbx.Builder) error { + return daos.New(db).SaveCollection(internalView(searchViewName, searchViewQuery)) +} + +func searchViewDown(db dbx.Builder) error { + dao := daos.New(db) + + id, err := dao.FindCollectionByNameOrId(searchViewName) + if err != nil { + return err + } + + return dao.DeleteCollection(id) +} diff --git a/migrations/migrations.go b/migrations/migrations.go index c8650a9..7fbedc1 100644 --- a/migrations/migrations.go +++ b/migrations/migrations.go @@ -11,4 +11,5 @@ func Register() { migrations.Register(viewsUp, viewsDown, "1700000004_views.go") migrations.Register(reactionsUp, reactionsDown, "1700000005_reactions.go") migrations.Register(systemuserUp, systemuserDown, "1700000006_systemuser.go") + migrations.Register(searchViewUp, searchViewDown, "1700000007_search_view.go") } diff --git a/ui/src/components/ticket/TicketList.vue b/ui/src/components/ticket/TicketList.vue index f9b5169..10dd8fb 100644 --- a/ui/src/components/ticket/TicketList.vue +++ b/ui/src/components/ticket/TicketList.vue @@ -17,9 +17,8 @@ import { import { ScrollArea } from '@/components/ui/scroll-area' import { Separator } from '@/components/ui/separator' import { Tabs, TabsList, TabsTrigger } from '@/components/ui/tabs' -import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from '@/components/ui/tooltip' -import { Info, LoaderCircle, Search } from 'lucide-vue-next' +import { LoaderCircle, Search } from 'lucide-vue-next' import { useQuery } from '@tanstack/vue-query' import debounce from 'lodash.debounce' @@ -28,7 +27,7 @@ import { computed, ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { pb } from '@/lib/pocketbase' -import type { Ticket, Type } from '@/lib/types' +import type { SearchTicket, Type } from '@/lib/types' const router = useRouter() const route = useRoute() @@ -48,15 +47,13 @@ const filter = computed(() => { let raws: Array = [ 'name ~ {:search}', 'description ~ {:search}', - 'owner.name ~ {:search}', - 'owner.email ~ {:search}', - 'links_via_ticket.name ~ {:search}', - 'links_via_ticket.url ~ {:search}', - 'tasks_via_ticket.name ~ {:search}', - 'comments_via_ticket.message ~ {:search}', - 'files_via_ticket.name ~ {:search}', - 'timeline_via_ticket.message ~ {:search}', - 'state.severity ~ {:search}' + 'owner_name ~ {:search}', + 'comment_messages ~ {:search}', + 'file_names ~ {:search}', + 'link_names ~ {:search}', + 'link_urls ~ {:search}', + 'task_names ~ {:search}', + 'timeline_messages ~ {:search}' ] Object.keys(props.selectedType.schema.properties).forEach((key) => { @@ -96,12 +93,10 @@ const { refetch } = useQuery({ queryKey: ['tickets', filter.value], - queryFn: (): Promise> => - pb.collection('tickets').getList(page.value, perPage.value, { + queryFn: (): Promise> => + pb.collection('ticket_search').getList(page.value, perPage.value, { sort: '-created', - filter: filter.value, - expand: - 'type,owner,comments_via_ticket.author,files_via_ticket,timeline_via_ticket,links_via_ticket,tasks_via_ticket.owner' + filter: filter.value }) }) @@ -139,9 +134,9 @@ watch([tab, props.selectedType, page, perPage], () => refetch())
- All - Open - Closed + All + Open + Closed