78 lines
2.2 KiB
TypeScript
78 lines
2.2 KiB
TypeScript
|
|
import { create } from 'zustand';
|
||
|
|
import type { SearchRequest } from '../../api/schema';
|
||
|
|
|
||
|
|
interface ExecutionSearchState {
|
||
|
|
status: string[];
|
||
|
|
timeFrom: string;
|
||
|
|
timeTo: string;
|
||
|
|
durationMin: number | null;
|
||
|
|
durationMax: number | null;
|
||
|
|
text: string;
|
||
|
|
offset: number;
|
||
|
|
limit: number;
|
||
|
|
|
||
|
|
setStatus: (statuses: string[]) => void;
|
||
|
|
toggleStatus: (s: string) => void;
|
||
|
|
setTimeFrom: (v: string) => void;
|
||
|
|
setTimeTo: (v: string) => void;
|
||
|
|
setDurationMin: (v: number | null) => void;
|
||
|
|
setDurationMax: (v: number | null) => void;
|
||
|
|
setText: (v: string) => void;
|
||
|
|
setOffset: (v: number) => void;
|
||
|
|
clearAll: () => void;
|
||
|
|
toSearchRequest: () => SearchRequest;
|
||
|
|
}
|
||
|
|
|
||
|
|
export const useExecutionSearch = create<ExecutionSearchState>((set, get) => ({
|
||
|
|
status: ['COMPLETED', 'FAILED'],
|
||
|
|
timeFrom: '',
|
||
|
|
timeTo: '',
|
||
|
|
durationMin: null,
|
||
|
|
durationMax: null,
|
||
|
|
text: '',
|
||
|
|
offset: 0,
|
||
|
|
limit: 25,
|
||
|
|
|
||
|
|
setStatus: (statuses) => set({ status: statuses, offset: 0 }),
|
||
|
|
toggleStatus: (s) =>
|
||
|
|
set((state) => ({
|
||
|
|
status: state.status.includes(s)
|
||
|
|
? state.status.filter((x) => x !== s)
|
||
|
|
: [...state.status, s],
|
||
|
|
offset: 0,
|
||
|
|
})),
|
||
|
|
setTimeFrom: (v) => set({ timeFrom: v, offset: 0 }),
|
||
|
|
setTimeTo: (v) => set({ timeTo: v, offset: 0 }),
|
||
|
|
setDurationMin: (v) => set({ durationMin: v, offset: 0 }),
|
||
|
|
setDurationMax: (v) => set({ durationMax: v, offset: 0 }),
|
||
|
|
setText: (v) => set({ text: v, offset: 0 }),
|
||
|
|
setOffset: (v) => set({ offset: v }),
|
||
|
|
clearAll: () =>
|
||
|
|
set({
|
||
|
|
status: ['COMPLETED', 'FAILED', 'RUNNING'],
|
||
|
|
timeFrom: '',
|
||
|
|
timeTo: '',
|
||
|
|
durationMin: null,
|
||
|
|
durationMax: null,
|
||
|
|
text: '',
|
||
|
|
offset: 0,
|
||
|
|
}),
|
||
|
|
|
||
|
|
toSearchRequest: (): SearchRequest => {
|
||
|
|
const s = get();
|
||
|
|
const statusStr = s.status.length > 0 && s.status.length < 3
|
||
|
|
? s.status.join(',')
|
||
|
|
: undefined;
|
||
|
|
return {
|
||
|
|
status: statusStr ?? undefined,
|
||
|
|
timeFrom: s.timeFrom ? new Date(s.timeFrom).toISOString() : undefined,
|
||
|
|
timeTo: s.timeTo ? new Date(s.timeTo).toISOString() : undefined,
|
||
|
|
durationMin: s.durationMin,
|
||
|
|
durationMax: s.durationMax,
|
||
|
|
text: s.text || undefined,
|
||
|
|
offset: s.offset,
|
||
|
|
limit: s.limit,
|
||
|
|
};
|
||
|
|
},
|
||
|
|
}));
|