From 2d665fab662119d306ef21be886c5001b5c868ac Mon Sep 17 00:00:00 2001 From: Oscar Date: Thu, 4 Jun 2026 13:58:24 +0300 Subject: [PATCH] upd --- .claude/settings.json | 5 ++ backend/src/routes/items.ts | 2 + backend/src/services/itemsStore.ts | 51 +++++++++++--- frontend/app/components/LeftPanel.vue | 25 ++++--- frontend/app/components/RightPanel.vue | 95 ++++++++++++++++++++------ frontend/app/composables/useItems.ts | 46 ++++++++++--- frontend/app/services/api.ts | 1 + 7 files changed, 174 insertions(+), 51 deletions(-) create mode 100644 .claude/settings.json diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..49907f5 --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,5 @@ +{ + "permissions": { + "defaultMode": "bypassPermissions" + } +} \ No newline at end of file diff --git a/backend/src/routes/items.ts b/backend/src/routes/items.ts index 6445bd0..518863b 100644 --- a/backend/src/routes/items.ts +++ b/backend/src/routes/items.ts @@ -13,6 +13,8 @@ export const itemsRouter = Router() * properties: * id: * type: integer + * value: + * type: string * PaginatedItems: * type: object * properties: diff --git a/backend/src/services/itemsStore.ts b/backend/src/services/itemsStore.ts index 32ec704..e398ebb 100644 --- a/backend/src/services/itemsStore.ts +++ b/backend/src/services/itemsStore.ts @@ -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() +const allItemsOrder: number[] = [] + +for (let i = 1; i <= 1_000_000; i++) { + itemsById.set(i, randomString()) + allItemsOrder.push(i) +} + const selectedIds = new Set() 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 diff --git a/frontend/app/components/LeftPanel.vue b/frontend/app/components/LeftPanel.vue index 6406bec..dc05e83 100644 --- a/frontend/app/components/LeftPanel.vue +++ b/frontend/app/components/LeftPanel.vue @@ -25,7 +25,7 @@ @@ -40,7 +40,8 @@ class="item-row" :style="{ '--i': Math.min(index, 14) }" > - {{ item.id }} + #{{ item.id }} + {{ item.value }}