upd
This commit is contained in:
@@ -13,6 +13,8 @@ export const itemsRouter = Router()
|
||||
* properties:
|
||||
* id:
|
||||
* type: integer
|
||||
* value:
|
||||
* type: string
|
||||
* PaginatedItems:
|
||||
* type: object
|
||||
* properties:
|
||||
|
||||
@@ -1,28 +1,54 @@
|
||||
export interface Item {
|
||||
id: number
|
||||
value: string
|
||||
}
|
||||
|
||||
export interface PaginatedResult {
|
||||
data: { id: number }[]
|
||||
data: Item[]
|
||||
total: number
|
||||
page: number
|
||||
limit: number
|
||||
hasMore: boolean
|
||||
}
|
||||
|
||||
const allItems: number[] = Array.from({ length: 1_000_000 }, (_, i) => i + 1)
|
||||
const CHARS = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
|
||||
|
||||
function randomString(): string {
|
||||
const len = 6 + Math.floor(Math.random() * 7)
|
||||
let result = ''
|
||||
for (let i = 0; i < len; i++) {
|
||||
result += CHARS[Math.floor(Math.random() * CHARS.length)]
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
const itemsById = new Map<number, string>()
|
||||
const allItemsOrder: number[] = []
|
||||
|
||||
for (let i = 1; i <= 1_000_000; i++) {
|
||||
itemsById.set(i, randomString())
|
||||
allItemsOrder.push(i)
|
||||
}
|
||||
|
||||
const selectedIds = new Set<number>()
|
||||
const orderedSelected: number[] = []
|
||||
|
||||
export function getItems(page: number, limit: number, search?: string): PaginatedResult {
|
||||
let filtered: number[]
|
||||
if (search) {
|
||||
filtered = allItems.filter(id => !selectedIds.has(id) && String(id).includes(search))
|
||||
const s = search.toLowerCase()
|
||||
filtered = allItemsOrder.filter(
|
||||
id => !selectedIds.has(id) && (String(id).includes(search) || itemsById.get(id)!.toLowerCase().includes(s)),
|
||||
)
|
||||
}
|
||||
else {
|
||||
filtered = allItems.filter(id => !selectedIds.has(id))
|
||||
filtered = allItemsOrder.filter(id => !selectedIds.has(id))
|
||||
}
|
||||
const total = filtered.length
|
||||
const start = (page - 1) * limit
|
||||
const slice = filtered.slice(start, start + limit)
|
||||
return {
|
||||
data: slice.map(id => ({ id })),
|
||||
data: slice.map(id => ({ id, value: itemsById.get(id)! })),
|
||||
total,
|
||||
page,
|
||||
limit,
|
||||
@@ -33,7 +59,11 @@ export function getItems(page: number, limit: number, search?: string): Paginate
|
||||
export function getSelectedItems(page: number, limit: number, search?: string): PaginatedResult {
|
||||
let filtered: number[]
|
||||
if (search) {
|
||||
filtered = orderedSelected.filter(id => String(id).includes(search))
|
||||
const s = search.toLowerCase()
|
||||
filtered = orderedSelected.filter((id) => {
|
||||
const value = itemsById.get(id)!
|
||||
return String(id).includes(search) || value.toLowerCase().includes(s)
|
||||
})
|
||||
}
|
||||
else {
|
||||
filtered = [...orderedSelected]
|
||||
@@ -42,7 +72,7 @@ export function getSelectedItems(page: number, limit: number, search?: string):
|
||||
const start = (page - 1) * limit
|
||||
const slice = filtered.slice(start, start + limit)
|
||||
return {
|
||||
data: slice.map(id => ({ id })),
|
||||
data: slice.map(id => ({ id, value: itemsById.get(id)! })),
|
||||
total,
|
||||
page,
|
||||
limit,
|
||||
@@ -51,13 +81,14 @@ export function getSelectedItems(page: number, limit: number, search?: string):
|
||||
}
|
||||
|
||||
export function addItem(id: number): boolean {
|
||||
if (allItems.includes(id) || selectedIds.has(id)) return false
|
||||
allItems.push(id)
|
||||
if (itemsById.has(id)) return false
|
||||
itemsById.set(id, randomString())
|
||||
allItemsOrder.push(id)
|
||||
return true
|
||||
}
|
||||
|
||||
export function selectItem(id: number): boolean {
|
||||
if (selectedIds.has(id)) return false
|
||||
if (selectedIds.has(id) || !itemsById.has(id)) return false
|
||||
selectedIds.add(id)
|
||||
orderedSelected.push(id)
|
||||
return true
|
||||
|
||||
Reference in New Issue
Block a user