Skip to content

Commit f40eee8

Browse files
committed
fix(next/web): search pagination
1 parent 7eb75a2 commit f40eee8

File tree

2 files changed

+21
-92
lines changed

2 files changed

+21
-92
lines changed

next/web/src/App/Admin/Tickets/index.tsx

Lines changed: 7 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,10 @@ import { useEffect, useState } from 'react';
22
import { Route, Routes } from 'react-router-dom';
33
import _ from 'lodash';
44

5-
import {
6-
useSearchTicketCustomField,
7-
useSearchTickets,
8-
useTickets,
9-
UseTicketsOptions,
10-
} from '@/api/ticket';
5+
import { useSearchTickets, useTickets, UseTicketsOptions } from '@/api/ticket';
116
import { usePage, usePageSize } from '@/utils/usePage';
127
import { Topbar, useOrderBy } from './Topbar';
138
import {
14-
FieldFilters,
159
FilterForm,
1610
Filters,
1711
LocalFiltersProvider,
@@ -27,7 +21,6 @@ import {
2721
useTicketSwitchType,
2822
} from './useTicketSwitchType';
2923
import { useViewTickets } from '@/api/view';
30-
import { decodeDateRange } from '@/utils/date-range';
3124
import { useTicketTableColumn } from './hooks/useTicketTableColumns';
3225

3326
const DEFAULT_PAGE_SIZE = 20;
@@ -51,8 +44,6 @@ function useSmartSearchTickets({
5144
const isFieldSearch = filters.type === 'field' && !isProcessableSearch;
5245
const isKeywordSearch = filters.type === 'normal' && !!filters.keyword && !isProcessableSearch;
5346

54-
const dateRange = filters.createdAt && decodeDateRange(filters.createdAt);
55-
5647
const useTicketResult = useTickets({
5748
filters: _.omit(filters, ['type', 'fieldId', 'fieldValue']),
5849
...options,
@@ -62,12 +53,14 @@ function useSmartSearchTickets({
6253
},
6354
});
6455

65-
const useSearchTicketsResult = useSearchTickets((filters as NormalFilters).keyword!, {
66-
filters: _.omit(filters, ['keyword', 'type', 'fieldId', 'fieldValue']) as NormalFilters,
56+
const useSearchTicketsResult = useSearchTickets({
57+
filters: (isKeywordSearch
58+
? _.omit(filters, ['type', 'fieldId', 'fieldValue'])
59+
: _.pick(filters, ['createdAt', 'fieldId', 'fieldValue'])) as NormalFilters,
6760
...options,
6861
queryOptions: {
6962
...queryOptions,
70-
enabled: isKeywordSearch,
63+
enabled: isKeywordSearch || isFieldSearch,
7164
},
7265
});
7366

@@ -79,28 +72,11 @@ function useSmartSearchTickets({
7972
},
8073
});
8174

82-
const { fieldId, fieldValue } = filters as FieldFilters;
83-
84-
const useFieldSearchResult = useSearchTicketCustomField(
85-
{
86-
fieldId,
87-
fieldValue,
88-
createdAt: dateRange ? [dateRange.from, dateRange.to] : undefined,
89-
orderKey: options.orderKey,
90-
orderType: options.orderType,
91-
},
92-
{
93-
enabled: isFieldSearch,
94-
}
95-
);
96-
9775
return {
9876
...(isProcessableSearch
9977
? useProcessableTicketsResult
100-
: isKeywordSearch
78+
: isKeywordSearch || isFieldSearch
10179
? useSearchTicketsResult
102-
: isFieldSearch
103-
? useFieldSearchResult
10480
: useTicketResult),
10581
mode: isProcessableSearch ? 'view' : isKeywordSearch || isFieldSearch ? 'search' : 'normal',
10682
};

next/web/src/api/ticket.ts

Lines changed: 14 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ export interface FetchTicketFilters {
6060
tagValue?: string;
6161
privateTagKey?: string;
6262
privateTagValue?: string;
63-
fieldName?: string;
63+
fieldId?: string;
6464
fieldValue?: string;
65+
keyword?: string;
6566
where?: Record<string, any>;
6667
}
6768

@@ -74,8 +75,9 @@ export function encodeTicketFilters(filters: FetchTicketFilters) {
7475
tagValue: filters.tagValue,
7576
privateTagKey: filters.privateTagKey,
7677
privateTagValue: filters.privateTagValue,
77-
fieldName: filters.fieldName,
78+
fieldId: filters.fieldId,
7879
fieldValue: filters.fieldValue,
80+
keyword: filters.keyword,
7981
};
8082
if (filters.assigneeId) {
8183
params.assigneeId = castArray(filters.assigneeId).join(',');
@@ -158,19 +160,15 @@ async function fetchTickets({
158160
return { tickets: data, totalCount: parseInt(headers['x-total-count']) };
159161
}
160162

161-
async function searchTickets(
162-
keyword: string,
163-
{
164-
page = 1,
165-
pageSize = 10,
166-
orderKey = 'createdAt',
167-
orderType = 'desc',
168-
filters = {},
169-
}: FetchTicketsOptions = {}
170-
) {
163+
async function searchTickets({
164+
page = 1,
165+
pageSize = 10,
166+
orderKey = 'createdAt',
167+
orderType = 'desc',
168+
filters = {},
169+
}: FetchTicketsOptions = {}) {
171170
const params: any = {
172171
...encodeTicketFilters(filters),
173-
keyword,
174172
page,
175173
pageSize,
176174
orderBy: `${orderKey}-${orderType}`,
@@ -270,13 +268,10 @@ export function useTickets({ queryOptions, ...options }: UseTicketsOptions = {})
270268
};
271269
}
272270

273-
export function useSearchTickets(
274-
keyword: string,
275-
{ queryOptions, ...options }: UseTicketsOptions = {}
276-
) {
271+
export function useSearchTickets({ queryOptions, ...options }: UseTicketsOptions = {}) {
277272
const { data, ...rest } = useQuery({
278-
queryKey: ['searchTicketsResult', keyword, options],
279-
queryFn: () => searchTickets(keyword, options),
273+
queryKey: ['searchTicketsResult', options],
274+
queryFn: () => searchTickets(options),
280275
...queryOptions,
281276
});
282277

@@ -323,48 +318,6 @@ export function useOperateTicket(
323318
});
324319
}
325320

326-
interface SearchTicketCustomFieldOptions {
327-
fieldId?: string;
328-
fieldValue?: string;
329-
createdAt?: [Date | undefined, Date | undefined];
330-
orderKey?: string;
331-
orderType?: string;
332-
}
333-
334-
async function searchTicketCustomField({
335-
fieldId,
336-
fieldValue,
337-
createdAt,
338-
orderKey = 'createdAt',
339-
orderType = 'desc',
340-
}: SearchTicketCustomFieldOptions) {
341-
const res = await http.get<TicketSchema[]>('/api/2/tickets/search/v2', {
342-
params: {
343-
fieldId,
344-
fieldValue,
345-
createdAt: createdAt?.map((d) => (d ? d.toISOString() : '*')).join('..'),
346-
orderBy: `${orderKey}-${orderType}`,
347-
},
348-
});
349-
return { tickets: res.data, totalCount: Number(res.headers['x-total-count']) };
350-
}
351-
352-
export function useSearchTicketCustomField(
353-
searchOptions: SearchTicketCustomFieldOptions,
354-
options?: UseQueryOptions<FetchTicketsResult, Error>
355-
) {
356-
const { data, ...rest } = useQuery({
357-
queryKey: ['searchTicketCustomField', searchOptions],
358-
queryFn: () => searchTicketCustomField(searchOptions),
359-
...options,
360-
});
361-
362-
return {
363-
...rest,
364-
data: data?.tickets,
365-
totalCount: data?.totalCount,
366-
};
367-
}
368321
type exportType = 'json' | 'csv';
369322
interface ExportParams extends FetchTicketsOptions {
370323
type: exportType;

0 commit comments

Comments
 (0)