diff --git a/src/lib/common/services/pdf.service.js b/src/lib/common/services/pdf.service.js index 4cad5ca..0cc37ea 100644 --- a/src/lib/common/services/pdf.service.js +++ b/src/lib/common/services/pdf.service.js @@ -1,10 +1,9 @@ import * as pdfjsLib from 'pdfjs-dist'; -// Явно указываем путь к worker'у, чтобы избежать проблем с ?worker в PWA/Chromium -pdfjsLib.GlobalWorkerOptions.workerSrc = new URL( - 'pdfjs-dist/build/pdf.worker.min.mjs', - import.meta.url -).toString(); +// Используем ?url-импорт Vite — он корректно резолвится и в dev, и в prod +import workerUrl from 'pdfjs-dist/build/pdf.worker.min.mjs?url'; + +pdfjsLib.GlobalWorkerOptions.workerSrc = workerUrl; /** * Загрузка PDF документа @@ -39,7 +38,10 @@ export async function renderPageToImage(pdfDoc, pageNum, scale = 1.0) { canvas.style.width = `${Math.floor(viewport.width)}px`; canvas.style.height = `${Math.floor(viewport.height)}px`; - const transform = outputScale !== 1 ? [outputScale, 0, 0, outputScale, 0, 0] : undefined; + const transform = outputScale !== 1 + ? [outputScale, 0, 0, outputScale, 0, 0] + : undefined; + await page.render({ canvasContext: context, viewport, transform }).promise; return canvas.toDataURL('image/jpeg', 0.85); } diff --git a/src/lib/pages/print/PrintProgress.svelte b/src/lib/pages/print/PrintProgress.svelte index e143cd8..955989d 100644 --- a/src/lib/pages/print/PrintProgress.svelte +++ b/src/lib/pages/print/PrintProgress.svelte @@ -1,234 +1,305 @@
-
- -

Печать

-
-
- {#if store.job} - {#each store.job.files as f, i (i + '-' + f.name)} - {@const b = badge(f.name)} - {@const isLastDone = f.status === 'done' && !store.job.files.slice(i + 1).some(f => f.status === 'printing' || f.status === 'queued')} - {@const hasNextQueued = store.job.files.slice(i + 1).some(f => f.status === 'queued')} -
-
- {#if b}{b}{/if} - {f.name} - {STATUS_LABEL[f.status] ?? f.status} -
- - {#if f.status === 'awaiting_clear_output'} -
    -
  1. Уберите распечатанные листы из выходного лотка
  2. -
  3. Нажмите кнопку ниже для запуска двусторонней печати
  4. -
- {:else if f.status === 'awaiting_flip'} -
    -
  1. Не переворачивая, положите остальные листы в слот ручной подачи
  2. -
- {:else if isLastDone && hasNextQueued && !store.autoContinue} -
    -
  1. Возьмите готовый документ
  2. -
  3. Нажмите далее
  4. -
- {/if} - - {#if f.error} -

{f.error}

- {/if} -
- {/each} - {/if} -
- +
+
+ {#if b}{b}{/if} + {f.name} + + {STATUS_LABEL[f.status] ?? f.status} + +
+ + {#if f.status === 'awaiting_pickup'} +
    +
  1. Дождитесь завершения печати
  2. +
  3. Нажмите кнопку ниже для подтверждения
  4. +
+ {:else if f.status === 'awaiting_clear_output'} +
    +
  1. Уберите распечатанные листы из выходного лотка
  2. +
  3. Нажмите кнопку ниже для продолжения
  4. +
+ {:else if f.status === 'awaiting_flip'} +
    +
  1. Не переворачивая, положите листы в слот ручной подачи
  2. +
  3. Нажмите кнопку ниже для печати обратной стороны
  4. +
+ {/if} + + {#if f.error} +

{f.error}

+ {/if} +
+ {/each} + {/if} + + +
diff --git a/src/lib/pages/print/store.svelte.js b/src/lib/pages/print/store.svelte.js index 13c3d56..19a1a62 100644 --- a/src/lib/pages/print/store.svelte.js +++ b/src/lib/pages/print/store.svelte.js @@ -250,21 +250,20 @@ export function createPrintStore() { } } - async function refreshJob() { - if (!job) return; - try { - const res = await fetch(`/api/print/${job.job_id}`); - if (!res.ok) return; - job = await res.json(); - - // Автопродолжение срабатывает ТОЛЬКО для awaiting_pickup - if (job.phase === 'awaiting_pickup' && autoContinue) { - advanceJob(); - } - } catch (e) { - console.error('refresh error:', e); - } - } + async function refreshJob() { + if (!job) return; + try { + const res = await fetch(`/api/print/${job.job_id}`); + if (!res.ok) return; + job = await res.json(); + + if (job.phase === 'awaiting_pickup' && autoContinue) { + advanceJob(); + } + } catch (e) { + console.error('refresh error:', e); + } + } async function cancelJob() { if (!job) return; diff --git a/vite.config.js b/vite.config.js index 3a844bd..56ea7f4 100644 --- a/vite.config.js +++ b/vite.config.js @@ -23,7 +23,6 @@ export default defineConfig({ injectRegister: 'auto', workbox: { clientsClaim: true, - // Добавили mjs, чтобы pdf.worker.min.mjs попадал в precache Нужно для PDFJS globPatterns: ['**/*.{js,mjs,css,html,ico,png,svg,wasm}'], navigateFallbackDenylist: [/^\/api\/version/], runtimeCaching: [ @@ -41,7 +40,6 @@ export default defineConfig({ } } }, - // Fallback кэширование для worker-файлов, если они не попали в precache { urlPattern: /\/assets\/.*\.(mjs|js)$/, handler: 'CacheFirst', @@ -87,5 +85,17 @@ export default defineConfig({ rewrite: (path) => path.replace(/^\/api/, '') } } - } + }, + + build: { + target: 'esnext', + rollupOptions: { + output: { + format: 'es', + }, + }, + }, + worker: { + format: 'es', + }, })