refactor pagination and FindFilter
This commit is contained in:
parent
31235b363c
commit
b1a4be4cf8
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "axp-ts",
|
"name": "axp-ts",
|
||||||
"version": "1.10.0",
|
"version": "1.11.0",
|
||||||
"description": "TypeScript helper library",
|
"description": "TypeScript helper library",
|
||||||
"author": "AntoXa PRO <info@antoxa.pro>",
|
"author": "AntoXa PRO <info@antoxa.pro>",
|
||||||
"homepage": "https://antoxahub.ru/antoxa/axp-ts",
|
"homepage": "https://antoxahub.ru/antoxa/axp-ts",
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
import type { TPagination } from './pagination'
|
import type { TPaginationQuery } from './pagination'
|
||||||
|
|
||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
import { isEqual } from '../utils'
|
import { isEqual } from '../utils'
|
||||||
@ -19,26 +19,30 @@ export const querySchema = cFieldsSchema
|
|||||||
export type TQuery = z.infer<typeof querySchema>
|
export type TQuery = z.infer<typeof querySchema>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Объект для преобразования фильтра в URL.
|
* Класс для работы с запросами (для удобства).
|
||||||
*/
|
*/
|
||||||
export type TFindFilter<T extends TQuery> = {
|
export type TFindFilter<T extends TQuery> = {
|
||||||
obj?: Omit<T, 'page' | 'limit' | 'sort'>
|
obj: Omit<T, 'page' | 'limit' | 'sort'>
|
||||||
pagination?: TPagination
|
pagination: TPaginationQuery
|
||||||
sort?: string
|
sort?: string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Класс для работы с запросами (для удобства).
|
||||||
|
*/
|
||||||
export class FindFilter<T extends TQuery> implements TFindFilter<T> {
|
export class FindFilter<T extends TQuery> implements TFindFilter<T> {
|
||||||
obj?: Omit<T, 'page' | 'limit' | 'sort'>
|
obj: Omit<T, 'page' | 'limit' | 'sort'>
|
||||||
pagination?: TPagination
|
pagination: TPaginationQuery
|
||||||
sort?: string
|
sort?: string
|
||||||
|
|
||||||
constructor(query?: T) {
|
constructor(query?: T) {
|
||||||
|
// Copy fiends.
|
||||||
let queryCopy: T = Object.assign({}, query)
|
let queryCopy: T = Object.assign({}, query)
|
||||||
|
|
||||||
// Pagination.
|
// Pagination.
|
||||||
this.setPagination(queryCopy)
|
this.pagination = new Pagination(queryCopy).getQuery()
|
||||||
if (this.pagination) {
|
// Delete pagination fields.
|
||||||
// Delete pagination props.
|
if (this.pagination as TPaginationQuery) {
|
||||||
const paginationKeys = Object.keys(this.pagination) as [keyof T]
|
const paginationKeys = Object.keys(this.pagination) as [keyof T]
|
||||||
for (const key of paginationKeys) {
|
for (const key of paginationKeys) {
|
||||||
if (queryCopy[key]) delete queryCopy[key]
|
if (queryCopy[key]) delete queryCopy[key]
|
||||||
@ -48,15 +52,15 @@ export class FindFilter<T extends TQuery> implements TFindFilter<T> {
|
|||||||
// Sort.
|
// Sort.
|
||||||
if (queryCopy.sort) {
|
if (queryCopy.sort) {
|
||||||
this.sort = queryCopy.sort
|
this.sort = queryCopy.sort
|
||||||
queryCopy.sort = undefined
|
delete queryCopy.sort
|
||||||
}
|
}
|
||||||
|
|
||||||
// Obj.
|
// Obj.
|
||||||
this.obj = queryCopy
|
this.obj = queryCopy
|
||||||
}
|
}
|
||||||
|
|
||||||
setPagination(pagination?: Partial<TPagination>) {
|
setPagination(pagination?: TPaginationQuery) {
|
||||||
this.pagination = new Pagination(pagination).toObject()
|
this.pagination = new Pagination(pagination).getQuery()
|
||||||
}
|
}
|
||||||
|
|
||||||
toObject(): TFindFilter<T> {
|
toObject(): TFindFilter<T> {
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
import { z } from 'zod'
|
import { z } from 'zod'
|
||||||
import { cFieldsSchema, fieldSchema } from '../forms'
|
import { cFieldsSchema, fieldSchema } from '../forms'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Модель данных для пагинайи.
|
||||||
|
*/
|
||||||
export const paginationSchema = cFieldsSchema
|
export const paginationSchema = cFieldsSchema
|
||||||
.pick({
|
.pick({
|
||||||
page: true,
|
page: true,
|
||||||
@ -17,10 +20,16 @@ export const paginationSchema = cFieldsSchema
|
|||||||
label: 'Кол-во всех страниц'
|
label: 'Кол-во всех страниц'
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
.describe('Пагинация')
|
.describe('Данные пагинации')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Модель данных для пагинайи.
|
||||||
|
*/
|
||||||
export type TPagination = z.infer<typeof paginationSchema>
|
export type TPagination = z.infer<typeof paginationSchema>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Модель данных для пагинайи для запросе.
|
||||||
|
*/
|
||||||
export const paginationQuerySchema = paginationSchema
|
export const paginationQuerySchema = paginationSchema
|
||||||
.pick({
|
.pick({
|
||||||
page: true,
|
page: true,
|
||||||
@ -29,19 +38,25 @@ export const paginationQuerySchema = paginationSchema
|
|||||||
.partial()
|
.partial()
|
||||||
.describe('Параметры разбиения на страницы')
|
.describe('Параметры разбиения на страницы')
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Модель данных для пагинайи для запросе.
|
||||||
|
*/
|
||||||
export type TPaginationQuery = z.infer<typeof paginationQuerySchema>
|
export type TPaginationQuery = z.infer<typeof paginationQuerySchema>
|
||||||
|
|
||||||
// Константы.
|
//
|
||||||
|
// Переделать.
|
||||||
|
//
|
||||||
const DEFAULTS = { page: 1, limit: 10, maxLimit: 100 }
|
const DEFAULTS = { page: 1, limit: 10, maxLimit: 100 }
|
||||||
|
|
||||||
export type TPaginationParseArg = number | string | undefined
|
export type TPaginationParseArg = number | string | undefined
|
||||||
|
|
||||||
export type TPaginationArguments = {
|
export type TPaginationArguments = {
|
||||||
page?: TPaginationParseArg
|
page?: TPaginationParseArg
|
||||||
limit?: TPaginationParseArg
|
limit?: TPaginationParseArg
|
||||||
total?: number
|
total?: number
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @todo Переделать логику.
|
||||||
|
*/
|
||||||
export class Pagination implements TPagination {
|
export class Pagination implements TPagination {
|
||||||
/**
|
/**
|
||||||
* Максимальный лимит элементов.
|
* Максимальный лимит элементов.
|
||||||
@ -121,4 +136,8 @@ export class Pagination implements TPagination {
|
|||||||
pages: this.pages
|
pages: this.pages
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
getQuery(): TPaginationQuery {
|
||||||
|
return { page: this.page, limit: this.limit }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user