From 1bc9e0db025a388adc92349b33b5b1ddb2a5556d Mon Sep 17 00:00:00 2001 From: Gauthier Roebroeck Date: Tue, 28 Oct 2025 12:09:34 +0800 Subject: [PATCH] known duplicates --- next-ui/package-lock.json | 20 +- next-ui/package.json | 1 + next-ui/src/App.vue | 1 + next-ui/src/api/images.ts | 5 + .../src/assets/mock-thumbnail-landscape.jpg | Bin 0 -> 86981 bytes next-ui/src/colada/page-hashes.ts | 67 +++ next-ui/src/components.d.ts | 4 + .../src/components/dialog/DialogSimple.vue | 67 +++ .../dialog/DialogSimpleInstance.vue | 39 ++ .../components/pageHash/KnownTable.stories.ts | 73 +++ .../src/components/pageHash/KnownTable.vue | 442 ++++++++++++++++++ .../components/pageHash/MatchTable.stories.ts | 58 +++ .../src/components/pageHash/MatchTable.vue | 151 ++++++ next-ui/src/mocks/api/handlers.ts | 2 + next-ui/src/mocks/api/handlers/history.ts | 12 - next-ui/src/mocks/api/handlers/page-hashes.ts | 85 ++++ next-ui/src/mocks/api/pageable.ts | 41 +- .../src/pages/media/duplicate-pages/known.vue | 7 +- next-ui/src/stores/dialogs.ts | 19 +- next-ui/src/types/PageHashAction.ts | 27 ++ next-ui/src/utils/utils.ts | 8 + 21 files changed, 1109 insertions(+), 20 deletions(-) create mode 100644 next-ui/src/assets/mock-thumbnail-landscape.jpg create mode 100644 next-ui/src/colada/page-hashes.ts create mode 100644 next-ui/src/components/dialog/DialogSimple.vue create mode 100644 next-ui/src/components/dialog/DialogSimpleInstance.vue create mode 100644 next-ui/src/components/pageHash/KnownTable.stories.ts create mode 100644 next-ui/src/components/pageHash/KnownTable.vue create mode 100644 next-ui/src/components/pageHash/MatchTable.stories.ts create mode 100644 next-ui/src/components/pageHash/MatchTable.vue create mode 100644 next-ui/src/mocks/api/handlers/page-hashes.ts create mode 100644 next-ui/src/types/PageHashAction.ts diff --git a/next-ui/package-lock.json b/next-ui/package-lock.json index 9fd401fd..b32d0b8e 100644 --- a/next-ui/package-lock.json +++ b/next-ui/package-lock.json @@ -14,6 +14,7 @@ "@pinia/colada-plugin-delay": "^0.1.0", "@vueuse/core": "^13.9.0", "core-js": "^3.45.1", + "filesize": "^11.0.13", "marked": "^16.3.0", "openapi-fetch": "^0.14.1", "pinia": "^3.0.3", @@ -370,6 +371,16 @@ } } }, + "node_modules/@chromatic-com/storybook/node_modules/filesize": { + "version": "10.1.6", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", + "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">= 10.4.0" + } + }, "node_modules/@chromatic-com/storybook/node_modules/strip-ansi": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", @@ -6271,13 +6282,12 @@ } }, "node_modules/filesize": { - "version": "10.1.6", - "resolved": "https://registry.npmjs.org/filesize/-/filesize-10.1.6.tgz", - "integrity": "sha512-sJslQKU2uM33qH5nqewAwVB2QgR6w1aMNsYUp3aN5rMRyXEwJGmZvaWzeJFNTOXWlHQyBFCWrdj3fV/fsTOX8w==", - "dev": true, + "version": "11.0.13", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-11.0.13.tgz", + "integrity": "sha512-mYJ/qXKvREuO0uH8LTQJ6v7GsUvVOguqxg2VTwQUkyTPXXRRWPdjuUPVqdBrJQhvci48OHlNGRnux+Slr2Rnvw==", "license": "BSD-3-Clause", "engines": { - "node": ">= 10.4.0" + "node": ">= 10.8.0" } }, "node_modules/fill-range": { diff --git a/next-ui/package.json b/next-ui/package.json index aa9db548..5d3155dc 100644 --- a/next-ui/package.json +++ b/next-ui/package.json @@ -34,6 +34,7 @@ "@pinia/colada-plugin-delay": "^0.1.0", "@vueuse/core": "^13.9.0", "core-js": "^3.45.1", + "filesize": "^11.0.13", "marked": "^16.3.0", "openapi-fetch": "^0.14.1", "pinia": "^3.0.3", diff --git a/next-ui/src/App.vue b/next-ui/src/App.vue index 98e5f2b1..b28df0bc 100644 --- a/next-ui/src/App.vue +++ b/next-ui/src/App.vue @@ -5,6 +5,7 @@ + diff --git a/next-ui/src/api/images.ts b/next-ui/src/api/images.ts index 22431a5c..7fb7518f 100644 --- a/next-ui/src/api/images.ts +++ b/next-ui/src/api/images.ts @@ -10,6 +10,11 @@ export function bookThumbnailUrl(bookId?: string): string | undefined { return undefined } +export function bookPageThumbnailUrl(bookId?: string, page?: number): string | undefined { + if (bookId && page) return `${API_BASE_URL}/api/v1/books/${bookId}/pages/${page}/thumbnail` + return undefined +} + export function pageHashKnownThumbnailUrl(hash?: string): string | undefined { if (hash) return `${API_BASE_URL}/api/v1/page-hashes/${hash}/thumbnail` return undefined diff --git a/next-ui/src/assets/mock-thumbnail-landscape.jpg b/next-ui/src/assets/mock-thumbnail-landscape.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4596d28da6f7296d8f99927772a7c05a8d07e2e3 GIT binary patch literal 86981 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

R7Dz#`)dn6&g=-QqXNy`CS;r^t(DVeLSDe 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�h)S!`5#;*3| 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 JM*jfc|Jm(gd~pB( literal 0 HcmV?d00001 diff --git a/next-ui/src/colada/page-hashes.ts b/next-ui/src/colada/page-hashes.ts new file mode 100644 index 00000000..cca77bfe --- /dev/null +++ b/next-ui/src/colada/page-hashes.ts @@ -0,0 +1,67 @@ +import { defineQueryOptions } from '@pinia/colada' +import { komgaClient } from '@/api/komga-client' +import type { PageHashAction } from '@/types/PageHashAction' + +export const pageHashesKnownQuery = defineQueryOptions( + ({ + actions, + page, + size, + sort, + }: { + actions?: string[] + page?: number + size?: number + sort?: string[] + }) => ({ + key: ['page-hashes-known', { actions: actions, page: page, size: size, sort: sort }], + query: () => + komgaClient + .GET('/api/v1/page-hashes', { + params: { + query: { + page: page, + size: size, + sort: sort, + action: actions as PageHashAction[], + }, + }, + }) + // unwrap the openapi-fetch structure on success + .then((res) => res.data), + placeholderData: (previousData: any) => previousData, // eslint-disable-line @typescript-eslint/no-explicit-any + }), +) + +export const pageHashMatchesQuery = defineQueryOptions( + ({ + pageHash, + page, + size, + sort, + }: { + pageHash: string + page?: number + size?: number + sort?: string[] + }) => ({ + key: ['page-hash-matches', pageHash, { page: page, size: size, sort: sort }], + query: () => + komgaClient + .GET('/api/v1/page-hashes/{pageHash}', { + params: { + path: { + pageHash: pageHash, + }, + query: { + page: page, + size: size, + sort: sort, + }, + }, + }) + // unwrap the openapi-fetch structure on success + .then((res) => res.data), + placeholderData: (previousData: any) => previousData, // eslint-disable-line @typescript-eslint/no-explicit-any + }), +) diff --git a/next-ui/src/components.d.ts b/next-ui/src/components.d.ts index e79c5dc6..1f0ce80c 100644 --- a/next-ui/src/components.d.ts +++ b/next-ui/src/components.d.ts @@ -23,6 +23,8 @@ declare module 'vue' { DialogConfirmInstance: typeof import('./components/dialog/ConfirmInstance.vue')['default'] DialogFileNamePicker: typeof import('./components/dialog/FileNamePicker.vue')['default'] DialogSeriesPicker: typeof import('./components/dialog/SeriesPicker.vue')['default'] + DialogSimple: typeof import('./components/dialog/DialogSimple.vue')['default'] + DialogSimpleInstance: typeof import('./components/dialog/DialogSimpleInstance.vue')['default'] EmptyStateNetworkError: typeof import('./components/EmptyStateNetworkError.vue')['default'] FormattedMessage: typeof import('./components/FormattedMessage.ts')['default'] HelloWorld: typeof import('./components/HelloWorld.vue')['default'] @@ -47,6 +49,8 @@ declare module 'vue' { LayoutAppDrawerMenuMedia: typeof import('./components/layout/app/drawer/menu/Media.vue')['default'] LayoutAppDrawerMenuServer: typeof import('./components/layout/app/drawer/menu/Server.vue')['default'] LocaleSelector: typeof import('./components/LocaleSelector.vue')['default'] + PageHashKnownTable: typeof import('./components/pageHash/KnownTable.vue')['default'] + PageHashMatchTable: typeof import('./components/pageHash/MatchTable.vue')['default'] ReleaseCard: typeof import('./components/release/Card.vue')['default'] RemoteFileList: typeof import('./components/RemoteFileList.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] diff --git a/next-ui/src/components/dialog/DialogSimple.vue b/next-ui/src/components/dialog/DialogSimple.vue new file mode 100644 index 00000000..769a373b --- /dev/null +++ b/next-ui/src/components/dialog/DialogSimple.vue @@ -0,0 +1,67 @@ + + + diff --git a/next-ui/src/components/dialog/DialogSimpleInstance.vue b/next-ui/src/components/dialog/DialogSimpleInstance.vue new file mode 100644 index 00000000..71371876 --- /dev/null +++ b/next-ui/src/components/dialog/DialogSimpleInstance.vue @@ -0,0 +1,39 @@ + + + + + diff --git a/next-ui/src/components/pageHash/KnownTable.stories.ts b/next-ui/src/components/pageHash/KnownTable.stories.ts new file mode 100644 index 00000000..97d8fa71 --- /dev/null +++ b/next-ui/src/components/pageHash/KnownTable.stories.ts @@ -0,0 +1,73 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' + +import KnownTable from './KnownTable.vue' +import { delay, http } from 'msw' +import { response401Unauthorized } from '@/mocks/api/handlers' +import { httpTyped } from '@/mocks/api/httpTyped' +import { mockPage } from '@/mocks/api/pageable' +import { PageRequest } from '@/types/PageRequest' +import DialogSimpleInstance from '@/components/dialog/DialogSimpleInstance.vue' +import SnackQueue from '@/components/SnackQueue.vue' + +const meta = { + component: KnownTable, + subcomponents: { SnackQueue }, + render: (args: object) => ({ + components: { KnownTable, DialogSimpleInstance, SnackQueue }, + setup() { + return { args } + }, + template: '', + }), + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + }, + args: {}, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = { + args: {}, +} + +export const NoData: Story = { + parameters: { + msw: { + handlers: [ + httpTyped.get('/api/v1/page-hashes', ({ response }) => + response(200).json(mockPage([], new PageRequest())), + ), + ], + }, + }, +} + +export const Loading: Story = { + parameters: { + msw: { + handlers: [http.all('*/api/*', async () => await delay(2_000))], + }, + }, +} + +export const Error: Story = { + parameters: { + msw: { + handlers: [http.all('*/api/v1/page-hashes', response401Unauthorized)], + }, + }, +} + +export const ErrorOnDeletion: Story = { + parameters: { + msw: { + handlers: [ + httpTyped.post('/api/v1/page-hashes/{pageHash}/delete-all', ({ response }) => + response.untyped(response401Unauthorized()), + ), + ], + }, + }, +} diff --git a/next-ui/src/components/pageHash/KnownTable.vue b/next-ui/src/components/pageHash/KnownTable.vue new file mode 100644 index 00000000..70a4c7e7 --- /dev/null +++ b/next-ui/src/components/pageHash/KnownTable.vue @@ -0,0 +1,442 @@ + + + + diff --git a/next-ui/src/components/pageHash/MatchTable.stories.ts b/next-ui/src/components/pageHash/MatchTable.stories.ts new file mode 100644 index 00000000..8b5474f3 --- /dev/null +++ b/next-ui/src/components/pageHash/MatchTable.stories.ts @@ -0,0 +1,58 @@ +import type { Meta, StoryObj } from '@storybook/vue3-vite' + +import MatchTable from './MatchTable.vue' +import { delay, http } from 'msw' +import { response401Unauthorized } from '@/mocks/api/handlers' +import { httpTyped } from '@/mocks/api/httpTyped' +import { mockPage } from '@/mocks/api/pageable' +import { PageRequest } from '@/types/PageRequest' + +const meta = { + component: MatchTable, + render: (args: object) => ({ + components: { MatchTable }, + setup() { + return { args } + }, + template: '', + }), + parameters: { + // More on how to position stories at: https://storybook.js.org/docs/configure/story-layout + }, + args: { + modelValue: 'hash1', + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = {} + +export const NoData: Story = { + parameters: { + msw: { + handlers: [ + httpTyped.get('/api/v1/page-hashes/{pageHash}', ({ response }) => + response(200).json(mockPage([], new PageRequest())), + ), + ], + }, + }, +} + +export const Loading: Story = { + parameters: { + msw: { + handlers: [http.all('*/api/*', async () => await delay(2_000))], + }, + }, +} + +export const Error: Story = { + parameters: { + msw: { + handlers: [http.all('*/api/v1/page-hashes/*', response401Unauthorized)], + }, + }, +} diff --git a/next-ui/src/components/pageHash/MatchTable.vue b/next-ui/src/components/pageHash/MatchTable.vue new file mode 100644 index 00000000..4c645ac7 --- /dev/null +++ b/next-ui/src/components/pageHash/MatchTable.vue @@ -0,0 +1,151 @@ + + + + diff --git a/next-ui/src/mocks/api/handlers.ts b/next-ui/src/mocks/api/handlers.ts index 33ad28b8..5f13cb8c 100644 --- a/next-ui/src/mocks/api/handlers.ts +++ b/next-ui/src/mocks/api/handlers.ts @@ -13,6 +13,7 @@ import { booksHandlers } from '@/mocks/api/handlers/books' import { filesystemHandlers } from '@/mocks/api/handlers/filesystem' import { transientBooksHandlers } from '@/mocks/api/handlers/transient-books' import { readListsHandlers } from '@/mocks/api/handlers/readlists' +import { pageHashesHandlers } from '@/mocks/api/handlers/page-hashes' export const handlers = [ ...actuatorHandlers, @@ -22,6 +23,7 @@ export const handlers = [ ...filesystemHandlers, ...historyHandlers, ...librariesHandlers, + ...pageHashesHandlers, ...readListsHandlers, ...referentialHandlers, ...releasesHandlers, diff --git a/next-ui/src/mocks/api/handlers/history.ts b/next-ui/src/mocks/api/handlers/history.ts index 00b7a01b..24074d50 100644 --- a/next-ui/src/mocks/api/handlers/history.ts +++ b/next-ui/src/mocks/api/handlers/history.ts @@ -1,8 +1,6 @@ import { httpTyped } from '@/mocks/api/httpTyped' import { mockPage } from '@/mocks/api/pageable' import { PageRequest } from '@/types/PageRequest' -import { http, HttpResponse } from 'msw' -import mockThumbnailUrl from '@/assets/mock-thumbnail.jpg' export const historyBookImported = { id: 'H1', @@ -112,14 +110,4 @@ export const historyHandlers = [ ), ), ), - http.get('*/api/v1/page-hashes/*/thumbnail', async () => { - // Get an ArrayBuffer from reading the file from disk or fetching it. - const buffer = await fetch(mockThumbnailUrl).then((response) => response.arrayBuffer()) - - return HttpResponse.arrayBuffer(buffer, { - headers: { - 'content-type': 'image/jpg', - }, - }) - }), ] diff --git a/next-ui/src/mocks/api/handlers/page-hashes.ts b/next-ui/src/mocks/api/handlers/page-hashes.ts new file mode 100644 index 00000000..9471ce2b --- /dev/null +++ b/next-ui/src/mocks/api/handlers/page-hashes.ts @@ -0,0 +1,85 @@ +import { httpTyped } from '@/mocks/api/httpTyped' +import { mockPage } from '@/mocks/api/pageable' +import { PageRequest } from '@/types/PageRequest' +import type { components } from '@/generated/openapi/komga' +import { HttpResponse } from 'msw' +import mockThumbnailUrl from '@/assets/mock-thumbnail.jpg' +import mockThumbnailLandscapeUrl from '@/assets/mock-thumbnail-landscape.jpg' + +export function mockPageHashesKnown(count: number): components['schemas']['PageHashKnownDto'][] { + return [...Array(count).keys()].map((index) => { + const created = new Date(`19${String(index).slice(-2).padStart(2, '0')}-05-10`) + return { + hash: `HASH${index}`, + size: 1234 * (index + 1), + action: index % 3 === 0 ? 'DELETE_AUTO' : index % 3 === 1 ? 'DELETE_MANUAL' : 'IGNORE', + deleteCount: index % 3 === 0 ? 5 : index % 3 === 1 ? 2 : 0, + matchCount: index * 2, + created: created, + lastModified: created, + } + }) +} + +export function mockPageHashMatches(count: number): components['schemas']['PageHashMatchDto'][] { + return [...Array(count).keys()].map((index) => { + return { + bookId: `BOOK${index + 1}`, + url: '/books/Super Duck/Super_Duck_001__MLJ___Fall_1944___c2c___titansfan_editor_.cbz', + pageNumber: 25 + index, + fileName: `Page_${25 + index}.jpg`, + fileSize: 1234 * (index + 1), + mediaType: 'image/jpeg', + } + }) +} + +export const pageHashesHandlers = [ + httpTyped.get('/api/v1/page-hashes', ({ query, response }) => { + let data = mockPageHashesKnown(50) + const actions = query.getAll('action') + if (actions.length > 0) data = data.filter((it) => actions.includes(it.action)) + return response(200).json( + mockPage( + data, + new PageRequest(Number(query.get('page')), Number(query.get('size')), query.getAll('sort')), + ), + ) + }), + httpTyped.get('/api/v1/page-hashes/{pageHash}', ({ params, query, response }) => { + const hash = params.pageHash + const data = mockPageHashMatches(Number(hash.substring(4)) * 2) + return response(200).json( + mockPage( + data, + new PageRequest(Number(query.get('page')), Number(query.get('size')), query.getAll('sort')), + ), + ) + }), + httpTyped.put('/api/v1/page-hashes', ({ response }) => { + return response(202).empty() + }), + httpTyped.post('/api/v1/page-hashes/{pageHash}/delete-all', ({ response }) => { + return response(202).empty() + }), + httpTyped.get('/api/v1/page-hashes/{pageHash}/thumbnail', async ({ params, response }) => { + const hash = params.pageHash + + // use landscape image for some images + const landscape = Number(hash.slice(-1)) % 2 === 0 + + // Get an ArrayBuffer from reading the file from disk or fetching it. + const buffer = await fetch(landscape ? mockThumbnailLandscapeUrl : mockThumbnailUrl).then( + (response) => response.arrayBuffer(), + ) + + return response.untyped( + HttpResponse.arrayBuffer(buffer, { + status: 200, + headers: { + 'content-type': 'image/jpg', + }, + }), + ) + }), +] diff --git a/next-ui/src/mocks/api/pageable.ts b/next-ui/src/mocks/api/pageable.ts index f30f304b..76073593 100644 --- a/next-ui/src/mocks/api/pageable.ts +++ b/next-ui/src/mocks/api/pageable.ts @@ -4,12 +4,18 @@ export function mockPage(data: T[], pageRequest: PageRequest) { const page = Number(pageRequest.page) || 0 const size = Number(pageRequest.size) || 20 const unpaged = pageRequest.unpaged || false + const sort = pageRequest.sort const start = page * size const slice = unpaged ? data : data.slice(start, start + size) + let sortedSlice = slice + if (sort) { + sortedSlice = slice.sort(orderBy(parseSort(sort))) + } + return { - content: slice, + content: sortedSlice, pageable: { pageNumber: page, pageSize: size, @@ -37,3 +43,36 @@ export function mockPage(data: T[], pageRequest: PageRequest) { empty: slice.length > 0, } } + +function parseSort(sorts: string[]): OrderBy[] { + return sorts.map((sort) => { + const components = sort.split(',') + return { + property: components[0]!, + direction: components[1] === 'desc' ? 'desc' : 'asc', + } + }) +} + +type OrderBy = { + property: string + direction?: 'desc' | 'asc' +} + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +const orderBy = (items: OrderBy[]) => (a: any, b: any) => { + const sortDirection: Record = { asc: 1, desc: -1 } + const sortCollator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }) + const totalOrders = items.length + + for (let index = 0; index < totalOrders; index++) { + const { property, direction = 'desc' } = items[index]! + const directionInt = sortDirection[direction]! + const compare = sortCollator.compare(a[property], b[property]) + + if (compare < 0) return directionInt + if (compare > 0) return -directionInt + } + + return 0 +} diff --git a/next-ui/src/pages/media/duplicate-pages/known.vue b/next-ui/src/pages/media/duplicate-pages/known.vue index c5ee65c0..8cdb8926 100644 --- a/next-ui/src/pages/media/duplicate-pages/known.vue +++ b/next-ui/src/pages/media/duplicate-pages/known.vue @@ -1,5 +1,10 @@