import { BooleanRouteParam, DateRouteParam, NullableBooleanRouteParam, NumberRouteParam, RouteQueryParamsSchema, StringRouteParam, getLocationQueryForSchema, useRouteQueryParams } from '@prefecthq/vue-compositions' import debounce from 'lodash.debounce' import isEqual from 'lodash.isequal' import { Ref, reactive, ComputedRef, toRef, computed, toRefs, isReactive, watch } from 'vue' import { LocationQuery } from 'vue-router' import { BlockDocumentSortValuesSortParam } from '@/formatters/BlockDocumentSortValuesParam' import { DeploymentSortValuesSortParam } from '@/formatters/DeploymentSortValuesSortParam' import { DeploymentStatusRouteParam } from '@/formatters/DeploymentStatusRouteParam' import { DeploymentVersionInfoRouteParam } from '@/formatters/DeploymentVersionInfoRouteParam' import { FlowRunSortValuesSortParam } from '@/formatters/FlowRunSortValuesSortParam' import { FlowSortValuesSortParam } from '@/formatters/FlowSortValuesSortParam' import { OperatorRouteParam } from '@/formatters/OperatorRouteParam' import { TaskRunSortValuesSortParam } from '@/formatters/TaskRunSortValuesSortParam' import { BlockDocumentFilter, BlockDocumentsFilter, BlockSchemaFilter, BlockSchemasFilter, BlockTypeFilter, BlockTypesFilter, DeploymentFilter, DeploymentsFilter, DeploymentsPaginationFilter, DeploymentVersionIdFilter, DeploymentVersionInfoFilter, FlowFilter, FlowRunFilter, FlowRunsFilter, FlowRunsHistoryFilter, FlowRunsPaginationFilter, FlowsFilter, FlowsPaginationFilter, PaginationUnionFilter, StateFilter, TagFilter, TaskRunFilter, TaskRunsFilter, UnionFilter, VariableFilter, VariablesFilter, WithPage, WorkersFilter, WorkPoolFilter, WorkPoolQueueFilter, WorkPoolsFilter, WorkPoolWorkersPagination } from '@/models/Filters' import { defaultDeploymentSort, defaultFlowRunSort, defaultFlowSort, defaultTaskRunSort, defaultVariableSort, defaultWorkPoolWorkersSort } from '@/types' import { AnyRecord } from '@/types/any' import { MaybeReactive } from '@/types/reactivity' import { merge } from '@/utilities/object' import { dateFunctions } from '@/utilities/timezone' type AnySortableRecord = AnyRecord & { sort?: string } export type Filter = { [P in keyof Required]: [T[P]] extends [AnyRecord | undefined] ? Filter> : T[P] } export type FilterFunctions = { clear: () => void, set: (filters: T) => void, isDefaultFilter: ComputedRef, isCustomFilter: ComputedRef, } export type UseFilter = { filter: Filter, } & FilterFunctions function withFilterFunctions(filter: Filter, defaultValue?: T): UseFilter { const defaultValueCopy: T = JSON.parse(JSON.stringify(defaultValue ?? filter)) const clear = (): void => { merge(filter as T, defaultValueCopy) } const set = (newFilters: T): void => { merge(filter as T, newFilters) } const isDefaultFilter = computed(() => JSON.stringify(filter) === JSON.stringify(defaultValueCopy)) const isCustomFilter = computed(() => !isDefaultFilter.value) return { filter, clear, set, isDefaultFilter, isCustomFilter, } } function getDefaultValueWithDefaultSort(defaultValue: MaybeReactive, defaultSort: T['sort']): T { const { sort = defaultSort, ...rest } = isReactive(defaultValue) ? toRefs(defaultValue) : defaultValue return reactive({ ...rest, sort }) as T } function syncFilterWithFilterFromRoute(filter: Filter, query: Filter): void { merge(filter, query) watch(filter, () => { merge(query, filter) }) const updateFiltersFromQuery = debounce(() => { const equal = isEqual(filter, query) if (!equal) { merge(filter, query) } }, 100) watch(query, () => { updateFiltersFromQuery() }, { deep: true }) } function useFilterFromRoute(schema: RouteQueryParamsSchema, defaultValue: MaybeReactive, prefix?: string): UseFilter { const defaultValueReactive = reactive(defaultValue) as T const params = useRouteQueryParams(schema, defaultValueReactive, prefix) const filter = reactive(params) as Filter const response = withFilterFunctions(filter) return response } // eslint-disable-next-line max-params function useSortableFilterFromRoute( schema: RouteQueryParamsSchema, defaultValue: MaybeReactive, defaultSort: T['sort'], prefix?: string, ): UseFilter { const defaultValueReactive = getDefaultValueWithDefaultSort(defaultValue, defaultSort) return useFilterFromRoute(schema, defaultValueReactive, prefix) } export function useTagFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), name: toRef(defaultValueReactive, 'name'), anyName: toRef(defaultValueReactive, 'anyName'), isNull: toRef(defaultValueReactive, 'isNull'), }) return withFilterFunctions(filter) } const tagFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, name: [StringRouteParam], anyName: [StringRouteParam], isNull: BooleanRouteParam, } export function useDeploymentVersionIdFilter(defaultValue: MaybeReactive> = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), deploymentId: toRef(defaultValueReactive, 'deploymentId'), versionId: toRef(defaultValueReactive, 'versionId'), }) return withFilterFunctions(filter) } const deploymentVersionIdFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, deploymentId: StringRouteParam, versionId: [StringRouteParam], } export function useDeploymentVersionInfoFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), deploymentId: toRef(defaultValueReactive, 'deploymentId'), versionInfo: toRef(defaultValueReactive, 'versionInfo'), }) return withFilterFunctions(filter) } const deploymentVersionInfoFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, deploymentId: StringRouteParam, versionInfo: [DeploymentVersionInfoRouteParam], } export function useStateFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), name: toRef(defaultValueReactive, 'name'), type: toRef(defaultValueReactive, 'type'), }) return withFilterFunctions(filter) } const stateFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, type: [StringRouteParam], name: [StringRouteParam], } export function useFlowFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const tags = useTagFilter(defaultValueReactive.tags) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), tags: tags.filter, }) return withFilterFunctions(filter) } const flowFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], name: [StringRouteParam], nameLike: StringRouteParam, tags: tagFilterSchema, } export function useFlowRunFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const state = useStateFilter(defaultValueReactive.state) const tags = useTagFilter(defaultValueReactive.tags) const deploymentVersionId = useDeploymentVersionIdFilter(defaultValueReactive.deploymentVersionId) const deploymentVersionInfo = useDeploymentVersionInfoFilter(defaultValueReactive.deploymentVersionInfo) const filter: Filter = reactive({ deploymentId: toRef(defaultValueReactive, 'deploymentId'), deploymentIdNull: toRef(defaultValueReactive, 'deploymentIdNull'), deploymentIdOperator: toRef(defaultValueReactive, 'deploymentIdOperator'), deploymentVersionId: deploymentVersionId.filter, deploymentVersionInfo: deploymentVersionInfo.filter, expectedStartTimeAfter: toRef(defaultValueReactive, 'expectedStartTimeAfter'), expectedStartTimeBefore: toRef(defaultValueReactive, 'expectedStartTimeBefore'), flowVersion: toRef(defaultValueReactive, 'flowVersion'), id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), nextExpectedStartTimeAfter: toRef(defaultValueReactive, 'nextExpectedStartTimeAfter'), nextExpectedStartTimeBefore: toRef(defaultValueReactive, 'nextExpectedStartTimeBefore'), notId: toRef(defaultValueReactive, 'notId'), operator: toRef(defaultValueReactive, 'operator'), parentTaskRunId: toRef(defaultValueReactive, 'parentTaskRunId'), parentTaskRunIdNull: toRef(defaultValueReactive, 'parentTaskRunIdNull'), parentTaskRunIdOperator: toRef(defaultValueReactive, 'parentTaskRunIdOperator'), parentFlowRunId: toRef(defaultValueReactive, 'parentFlowRunId'), startTimeAfter: toRef(defaultValueReactive, 'startTimeAfter'), startTimeBefore: toRef(defaultValueReactive, 'startTimeBefore'), startTimeNull: toRef(defaultValueReactive, 'startTimeNull'), endTimeAfter: toRef(defaultValueReactive, 'endTimeAfter'), endTimeBefore: toRef(defaultValueReactive, 'endTimeBefore'), endTimeNull: toRef(defaultValueReactive, 'endTimeNull'), state: state.filter, tags: tags.filter, workQueueName: toRef(defaultValueReactive, 'workQueueName'), workQueueNameIsNull: toRef(defaultValueReactive, 'workQueueNameIsNull'), workQueueNameOperator: toRef(defaultValueReactive, 'workQueueNameOperator'), workQueueId: toRef(defaultValueReactive, 'workQueueId'), workQueueIdNull: toRef(defaultValueReactive, 'workQueueIdNull'), workQueueIdOperator: toRef(defaultValueReactive, 'workQueueIdOperator'), }) return withFilterFunctions(filter) } const flowRunFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], notId: [StringRouteParam], name: [StringRouteParam], nameLike: StringRouteParam, tags: tagFilterSchema, deploymentIdOperator: OperatorRouteParam, deploymentId: [StringRouteParam], deploymentIdNull: BooleanRouteParam, deploymentVersionId: deploymentVersionIdFilterSchema, deploymentVersionInfo: deploymentVersionInfoFilterSchema, workQueueNameOperator: OperatorRouteParam, workQueueName: [StringRouteParam], workQueueNameIsNull: BooleanRouteParam, workQueueIdOperator: OperatorRouteParam, workQueueId: [StringRouteParam], workQueueIdNull: BooleanRouteParam, state: stateFilterSchema, flowVersion: [StringRouteParam], expectedStartTimeBefore: DateRouteParam, expectedStartTimeAfter: DateRouteParam, nextExpectedStartTimeBefore: DateRouteParam, nextExpectedStartTimeAfter: DateRouteParam, startTimeBefore: DateRouteParam, startTimeAfter: DateRouteParam, startTimeNull: BooleanRouteParam, endTimeBefore: DateRouteParam, endTimeAfter: DateRouteParam, endTimeNull: BooleanRouteParam, parentTaskRunIdOperator: OperatorRouteParam, parentTaskRunId: [StringRouteParam], parentTaskRunIdNull: BooleanRouteParam, parentFlowRunId: [StringRouteParam], } export function useTaskRunFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const tags = useTagFilter(defaultValueReactive.tags) const state = useStateFilter(defaultValueReactive.state) const filter: Filter = reactive({ id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), operator: toRef(defaultValueReactive, 'operator'), startTimeAfter: toRef(defaultValueReactive, 'startTimeAfter'), startTimeBefore: toRef(defaultValueReactive, 'startTimeBefore'), startTimeNull: toRef(defaultValueReactive, 'startTimeNull'), expectedStartTimeAfter: toRef(defaultValueReactive, 'expectedStartTimeAfter'), expectedStartTimeBefore: toRef(defaultValueReactive, 'expectedStartTimeBefore'), expectedStartTimeNull: toRef(defaultValueReactive, 'expectedStartTimeNull'), state: state.filter, subFlowRunsExist: toRef(defaultValueReactive, 'subFlowRunsExist'), tags: tags.filter, flowRunId: toRef(defaultValueReactive, 'flowRunId'), flowRunIdOperator: toRef(defaultValueReactive, 'flowRunIdOperator'), flowRunIdNull: toRef(defaultValueReactive, 'flowRunIdNull'), }) return withFilterFunctions(filter) } const taskRunFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], name: [StringRouteParam], nameLike: StringRouteParam, tags: tagFilterSchema, state: stateFilterSchema, startTimeBefore: DateRouteParam, startTimeAfter: DateRouteParam, startTimeNull: BooleanRouteParam, expectedStartTimeBefore: DateRouteParam, expectedStartTimeAfter: DateRouteParam, expectedStartTimeNull: BooleanRouteParam, subFlowRunsExist: BooleanRouteParam, flowRunIdOperator: OperatorRouteParam, flowRunId: [StringRouteParam], flowRunIdNull: BooleanRouteParam, } export function useDeploymentFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const tags = useTagFilter(defaultValueReactive.tags) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), isScheduleActive: toRef(defaultValueReactive, 'isScheduleActive'), workQueueName: toRef(defaultValueReactive, 'workQueueName'), tags: tags.filter, workQueueId: toRef(defaultValueReactive, 'workQueueId'), status: toRef(defaultValueReactive, 'status'), flowOrDeploymentNameLike: toRef(defaultValueReactive, 'flowOrDeploymentNameLike'), paused: toRef(defaultValueReactive, 'paused'), }) return withFilterFunctions(filter) } const deploymentFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], name: [StringRouteParam], nameLike: StringRouteParam, isScheduleActive: BooleanRouteParam, workQueueName: [StringRouteParam], tags: tagFilterSchema, workQueueId: [StringRouteParam], status: [DeploymentStatusRouteParam], flowOrDeploymentNameLike: StringRouteParam, paused: BooleanRouteParam, } export function useWorkPoolFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), type: toRef(defaultValueReactive, 'type'), }) return withFilterFunctions(filter) } const workPoolFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], name: [StringRouteParam], type: [StringRouteParam], } export function useWorkPoolQueueFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), }) return withFilterFunctions(filter) } const workPoolQueueFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], name: [StringRouteParam], } export function useBlockTypeFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ nameLike: toRef(defaultValueReactive, 'nameLike'), slug: toRef(defaultValueReactive, 'slug'), }) return withFilterFunctions(filter) } const blockTypeFilterSchema: RouteQueryParamsSchema = { nameLike: StringRouteParam, slug: [StringRouteParam], } export function useBlockSchemaFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), blockTypeId: toRef(defaultValueReactive, 'blockTypeId'), blockCapabilities: toRef(defaultValueReactive, 'blockCapabilities'), version: toRef(defaultValueReactive, 'version'), }) return withFilterFunctions(filter) } const blockSchemaFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], blockTypeId: [StringRouteParam], blockCapabilities: [StringRouteParam], version: [StringRouteParam], } export function useBlockDocumentFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), id: toRef(defaultValueReactive, 'id'), isAnonymous: toRef(defaultValueReactive, 'isAnonymous'), blockTypeId: toRef(defaultValueReactive, 'blockTypeId'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), }) return withFilterFunctions(filter) } const blockDocumentFilterSchema: RouteQueryParamsSchema = { operator: OperatorRouteParam, id: [StringRouteParam], isAnonymous: NullableBooleanRouteParam, blockTypeId: [StringRouteParam], name: [StringRouteParam], nameLike: StringRouteParam, } export function useBlockTypesFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const blockTypes = useBlockTypeFilter(defaultValueReactive.blockTypes) const blockSchemas = useBlockSchemaFilter(defaultValueReactive.blockSchemas) const filter: Filter = reactive({ blockSchemas: blockSchemas.filter, blockTypes: blockTypes.filter, limit: toRef(defaultValueReactive, 'limit'), offset: toRef(defaultValueReactive, 'offset'), }) return withFilterFunctions(filter) } const blockTypesFilterSchema: RouteQueryParamsSchema = { blockTypes: blockTypeFilterSchema, blockSchemas: blockSchemaFilterSchema, limit: NumberRouteParam, offset: NumberRouteParam, } export function useBlockTypesFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useBlockTypesFilter(defaultValue) const { filter: query } = useFilterFromRoute(blockTypesFilterSchema, defaultValue, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useBlockSchemasFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const blockSchemas = useBlockSchemaFilter(defaultValueReactive.blockSchemas) const filter: Filter = reactive({ blockSchemas: blockSchemas.filter, limit: toRef(defaultValueReactive, 'limit'), offset: toRef(defaultValueReactive, 'offset'), }) return withFilterFunctions(filter) } const blockSchemasFilterSchema: RouteQueryParamsSchema = { blockSchemas: blockSchemaFilterSchema, limit: NumberRouteParam, offset: NumberRouteParam, } export function useBlockSchemasFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useBlockSchemasFilter(defaultValue) const { filter: query } = useFilterFromRoute(blockSchemasFilterSchema, defaultValue, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useBlockDocumentsFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const blockTypes = useBlockTypeFilter(defaultValueReactive.blockTypes) const blockSchemas = useBlockSchemaFilter(defaultValueReactive.blockSchemas) const blockDocuments = useBlockDocumentFilter(defaultValueReactive.blockDocuments) const filter: Filter = reactive({ blockTypes: blockTypes.filter, blockSchemas: blockSchemas.filter, blockDocuments: blockDocuments.filter, includeSecrets: toRef(defaultValueReactive, 'includeSecrets'), limit: toRef(defaultValueReactive, 'limit'), offset: toRef(defaultValueReactive, 'offset'), sort: toRef(defaultValueReactive, 'sort'), }) return withFilterFunctions(filter) } const blockDocumentsFilterSchema: RouteQueryParamsSchema = { blockTypes: blockTypeFilterSchema, blockSchemas: blockSchemaFilterSchema, blockDocuments: blockDocumentFilterSchema, limit: NumberRouteParam, offset: NumberRouteParam, includeSecrets: BooleanRouteParam, sort: BlockDocumentSortValuesSortParam, } export function useBlockDocumentsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useBlockDocumentsFilter(defaultValue) const { filter: query } = useFilterFromRoute(blockDocumentsFilterSchema, defaultValue, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useWorkPoolsFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const workPools = useWorkPoolFilter(defaultValueReactive.workPools) const filter: Filter = reactive({ offset: toRef(defaultValueReactive, 'offset'), limit: toRef(defaultValueReactive, 'limit'), workPools: workPools.filter, }) return withFilterFunctions(filter) } const workPoolsFilterSchema: RouteQueryParamsSchema = { workPools: workPoolFilterSchema, offset: NumberRouteParam, limit: NumberRouteParam, } export function useWorkPoolsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useWorkPoolsFilter(defaultValue) const { filter: query } = useFilterFromRoute(workPoolsFilterSchema, defaultValue, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } function useUnionFilter(defaultValue: MaybeReactive, defaultSort: Exclude): UseFilter { const defaultValueReactive = getDefaultValueWithDefaultSort(defaultValue, defaultSort) const flows = useFlowFilter(defaultValueReactive.flows) const flowRuns = useFlowRunFilter(defaultValueReactive.flowRuns) const taskRuns = useTaskRunFilter(defaultValueReactive.taskRuns) const deployments = useDeploymentFilter(defaultValueReactive.deployments) const workPools = useWorkPoolFilter(defaultValueReactive.workPools) const workPoolQueues = useWorkPoolQueueFilter(defaultValueReactive.workPoolQueues) const filter = reactive({ flows: flows.filter, flowRuns: flowRuns.filter, taskRuns: taskRuns.filter, deployments: deployments.filter, workPools: workPools.filter, workPoolQueues: workPoolQueues.filter, sort: toRef(defaultValueReactive, 'sort') as Ref, offset: toRef(defaultValueReactive, 'offset'), limit: toRef(defaultValueReactive, 'limit'), }) as Filter return withFilterFunctions(filter) } export function useFlowsFilter(defaultValue: MaybeReactive = {}): UseFilter { return useUnionFilter(defaultValue, defaultFlowSort) } export function useFlowRunsFilter(defaultValue: MaybeReactive = {}): UseFilter { return useUnionFilter(defaultValue, defaultFlowRunSort) } export function useTaskRunsFilter(defaultValue: MaybeReactive = {}): UseFilter { return useUnionFilter(defaultValue, defaultTaskRunSort) } export function useDeploymentsFilter(defaultValue: MaybeReactive = {}): UseFilter { return useUnionFilter(defaultValue, defaultDeploymentSort) } function usePaginationUnionFilter(defaultValue: MaybeReactive, defaultSort: Exclude): UseFilter> { const defaultValueReactive = getDefaultValueWithDefaultSort(defaultValue, defaultSort) const flows = useFlowFilter(defaultValueReactive.flows) const flowRuns = useFlowRunFilter(defaultValueReactive.flowRuns) const taskRuns = useTaskRunFilter(defaultValueReactive.taskRuns) const deployments = useDeploymentFilter(defaultValueReactive.deployments) const workPools = useWorkPoolFilter(defaultValueReactive.workPools) const workPoolQueues = useWorkPoolQueueFilter(defaultValueReactive.workPoolQueues) const page = toRef(defaultValueReactive, 'page') if (!page.value) { page.value = 1 } const filter = reactive({ flows: flows.filter, flowRuns: flowRuns.filter, taskRuns: taskRuns.filter, deployments: deployments.filter, workPools: workPools.filter, workPoolQueues: workPoolQueues.filter, sort: toRef(defaultValueReactive, 'sort') as Ref, limit: toRef(defaultValueReactive, 'limit'), page, }) as Filter> return withFilterFunctions(filter) } // eslint-disable-next-line max-params function usePaginationFilterFromRoute( schema: RouteQueryParamsSchema, defaultValue: MaybeReactive, defaultSort: T['sort'], prefix?: string, ): UseFilter> { defaultValue.page ??= 1 return useSortableFilterFromRoute(schema, defaultValue, defaultSort, prefix) as UseFilter> } const paginationUnionFilterSchema: Omit, 'sort'> = { flows: flowFilterSchema, flowRuns: flowRunFilterSchema, taskRuns: taskRunFilterSchema, deployments: deploymentFilterSchema, workPools: workPoolFilterSchema, workPoolQueues: workPoolQueueFilterSchema, page: NumberRouteParam, limit: NumberRouteParam, } export function useFlowsPaginationFilter(defaultValue: MaybeReactive = {}): UseFilter> { return usePaginationUnionFilter(defaultValue, defaultFlowSort) } export function useDeploymentsPaginationFilter(defaultValue: MaybeReactive = {}): UseFilter> { return usePaginationUnionFilter(defaultValue, defaultDeploymentSort) } export function useFlowRunsPaginationFilter(defaultValue: MaybeReactive = {}): UseFilter> { return usePaginationUnionFilter(defaultValue, defaultFlowRunSort) } const flowsPaginationFilterSchema: RouteQueryParamsSchema = { ...paginationUnionFilterSchema, sort: FlowSortValuesSortParam, } export function useFlowsPaginationFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter> { const response = useFlowsPaginationFilter(defaultValue) const { filter: query } = usePaginationFilterFromRoute(flowsPaginationFilterSchema, defaultValue, defaultFlowSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } const deploymentsPaginationFilterSchema: RouteQueryParamsSchema = { ...paginationUnionFilterSchema, sort: DeploymentSortValuesSortParam, } export function useDeploymentsPaginationFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter> { const response = useDeploymentsPaginationFilter(defaultValue) const { filter: query } = usePaginationFilterFromRoute(deploymentsPaginationFilterSchema, defaultValue, defaultDeploymentSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } const flowRunsPaginationFilterSchema: RouteQueryParamsSchema = { ...paginationUnionFilterSchema, sort: FlowRunSortValuesSortParam, } export function useFlowRunsPaginationFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter> { const response = useFlowRunsPaginationFilter(defaultValue) const { filter: query } = usePaginationFilterFromRoute(flowRunsPaginationFilterSchema, defaultValue, defaultFlowRunSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useVariableFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const tags = useTagFilter(defaultValueReactive.tags) const filter: Filter = reactive({ id: toRef(defaultValueReactive, 'id'), name: toRef(defaultValueReactive, 'name'), nameLike: toRef(defaultValueReactive, 'nameLike'), tags: tags.filter, }) return withFilterFunctions(filter) } export function useVariablesFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = getDefaultValueWithDefaultSort(defaultValue, defaultVariableSort) const filter: Filter = reactive({ variables: useVariableFilter(defaultValueReactive.variables).filter, offset: defaultValueReactive.offset, limit: defaultValueReactive.limit, sort: defaultValueReactive.sort, }) return withFilterFunctions(filter) } const unionFilterSchema: Omit, 'sort'> = { flows: flowFilterSchema, flowRuns: flowRunFilterSchema, taskRuns: taskRunFilterSchema, deployments: deploymentFilterSchema, workPools: workPoolFilterSchema, workPoolQueues: workPoolQueueFilterSchema, offset: NumberRouteParam, limit: NumberRouteParam, } const flowsFilterSchema: RouteQueryParamsSchema = { ...unionFilterSchema, sort: FlowSortValuesSortParam, } export function useFlowsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useFlowsFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(flowsFilterSchema, defaultValue, defaultFlowSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } const flowRunsFilterSchema: RouteQueryParamsSchema = { ...unionFilterSchema, sort: FlowRunSortValuesSortParam, } export function useFlowRunsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useFlowRunsFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(flowRunsFilterSchema, defaultValue, defaultFlowRunSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function getQueryForFlowRunsFilter(filter: FlowRunsFilter): LocationQuery { const query = getLocationQueryForSchema(flowRunsFilterSchema, filter) return query } const taskRunsFilterSchema: RouteQueryParamsSchema = { ...unionFilterSchema, sort: TaskRunSortValuesSortParam, } export function useTaskRunsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useTaskRunsFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(taskRunsFilterSchema, defaultValue, defaultTaskRunSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } const deploymentsFilterSchema: RouteQueryParamsSchema = { ...unionFilterSchema, sort: DeploymentSortValuesSortParam, } export function useDeploymentsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useDeploymentsFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(deploymentsFilterSchema, defaultValue, defaultDeploymentSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useRecentFlowRunsFilter(defaultValue: MaybeReactive): UseFilter { const { filter, ...extras } = useFlowRunsFilter(defaultValue) filter.flowRuns.expectedStartTimeAfter = dateFunctions.subDays(dateFunctions.startOfToday(), 7) filter.flowRuns.expectedStartTimeBefore = dateFunctions.addDays(dateFunctions.endOfToday(), 1) return { filter, ...extras, } } export function useRecentFlowRunsFilterFromRoute(defaultValue: MaybeReactive = {}, prefix?: string): UseFilter { const response = useRecentFlowRunsFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(flowRunsFilterSchema, defaultValue, defaultFlowRunSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useFlowRunsHistoryFilter(defaultValue: MaybeReactive): UseFilter { const defaultValueReactive = reactive(defaultValue) const { filter: flowRunsFilter } = useFlowRunsFilter(defaultValueReactive) const filter: Filter = reactive({ ...flowRunsFilter, historyEnd: toRef(defaultValueReactive, 'historyEnd'), historyStart: toRef(defaultValueReactive, 'historyStart'), historyIntervalSeconds: toRef(defaultValueReactive, 'historyIntervalSeconds'), }) return withFilterFunctions(filter) } const flowRunsHistoryFilterSchema: RouteQueryParamsSchema = { ...unionFilterSchema, historyEnd: DateRouteParam, historyStart: DateRouteParam, historyIntervalSeconds: NumberRouteParam, sort: FlowRunSortValuesSortParam, } export function useFlowRunsHistoryFilterFromRoute(defaultValue: MaybeReactive, prefix?: string): UseFilter { const response = useFlowRunsHistoryFilter(defaultValue) const { filter: query } = useSortableFilterFromRoute(flowRunsHistoryFilterSchema, defaultValue, defaultFlowRunSort, prefix) syncFilterWithFilterFromRoute(response.filter, query) return response } export function useWorkersFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = reactive(defaultValue) const filter: Filter = reactive({ operator: toRef(defaultValueReactive, 'operator'), lastHeartbeatTimeAfter: toRef(defaultValueReactive, 'lastHeartbeatTimeAfter'), lastHeartbeatTimeBefore: toRef(defaultValueReactive, 'lastHeartbeatTimeBefore'), status: toRef(defaultValueReactive, 'status'), name: toRef(defaultValueReactive, 'name'), }) return withFilterFunctions(filter) } export function useWorkPoolWorkerPaginationFilter(defaultValue: MaybeReactive = {}): UseFilter { const defaultValueReactive = getDefaultValueWithDefaultSort(defaultValue, defaultWorkPoolWorkersSort) const filter: Filter = reactive({ workers: useWorkersFilter(defaultValueReactive.workers).filter, limit: defaultValueReactive.limit, sort: defaultValueReactive.sort, page: defaultValueReactive.page, }) return withFilterFunctions(filter) }