@insureco/docman 1.0.0 → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-DBVEE4WX.js +457 -0
- package/dist/chunk-DBVEE4WX.js.map +1 -0
- package/dist/client-CdjgCtrw.d.cts +100 -0
- package/dist/client-nlarq_ao.d.ts +100 -0
- package/dist/index.cjs +19 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -95
- package/dist/index.d.ts +3 -95
- package/dist/index.js +3 -435
- package/dist/index.js.map +1 -1
- package/dist/mock.cjs +8 -0
- package/dist/mock.cjs.map +1 -1
- package/dist/mock.d.cts +2 -1
- package/dist/mock.d.ts +2 -1
- package/dist/mock.js +8 -0
- package/dist/mock.js.map +1 -1
- package/dist/{types-xbeSIrNB.d.cts → types-DvQ8gX3k.d.cts} +1 -1
- package/dist/{types-xbeSIrNB.d.ts → types-DvQ8gX3k.d.ts} +1 -1
- package/dist/ui/index.cjs +1938 -0
- package/dist/ui/index.cjs.map +1 -0
- package/dist/ui/index.d.cts +122 -0
- package/dist/ui/index.d.ts +122 -0
- package/dist/ui/index.js +1441 -0
- package/dist/ui/index.js.map +1 -0
- package/package.json +24 -8
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/ui/index.ts","../../src/ui/context.tsx","../../src/errors.ts","../../src/client.ts","../../src/ui/hooks/useDocmanClient.ts","../../src/ui/hooks/usePdfTemplates.ts","../../src/ui/hooks/useHtmlTemplates.ts","../../src/ui/hooks/useTemplateGroups.ts","../../src/ui/hooks/useDocuments.ts","../../src/ui/components/PdfTemplateList.tsx","../../src/ui/shared/LoadingSpinner.tsx","../../src/ui/shared/ErrorAlert.tsx","../../src/ui/shared/EmptyState.tsx","../../src/ui/shared/Pagination.tsx","../../src/ui/components/PdfTemplateUploader.tsx","../../src/ui/components/HtmlTemplateList.tsx","../../src/ui/components/HtmlTemplateEditor.tsx","../../src/ui/components/TemplateGroupList.tsx","../../src/ui/components/DocumentList.tsx","../../src/ui/components/DocumentGenerator.tsx","../../src/ui/components/OperationsPanel.tsx"],"sourcesContent":["// Provider + context\nexport { DocmanProvider } from './context.js'\nexport type { DocmanProviderProps } from './context.js'\n\n// Hooks\nexport { useDocmanClient } from './hooks/useDocmanClient.js'\nexport { usePdfTemplates } from './hooks/usePdfTemplates.js'\nexport type { UsePdfTemplatesOptions, UsePdfTemplatesReturn } from './hooks/usePdfTemplates.js'\nexport { useHtmlTemplates } from './hooks/useHtmlTemplates.js'\nexport type { UseHtmlTemplatesOptions, UseHtmlTemplatesReturn } from './hooks/useHtmlTemplates.js'\nexport { useTemplateGroups } from './hooks/useTemplateGroups.js'\nexport type { UseTemplateGroupsReturn } from './hooks/useTemplateGroups.js'\nexport { useDocuments } from './hooks/useDocuments.js'\nexport type { UseDocumentsReturn } from './hooks/useDocuments.js'\n\n// Components\nexport { PdfTemplateList } from './components/PdfTemplateList.js'\nexport type { PdfTemplateListProps } from './components/PdfTemplateList.js'\nexport { PdfTemplateUploader } from './components/PdfTemplateUploader.js'\nexport type { PdfTemplateUploaderProps } from './components/PdfTemplateUploader.js'\nexport { HtmlTemplateList } from './components/HtmlTemplateList.js'\nexport type { HtmlTemplateListProps } from './components/HtmlTemplateList.js'\nexport { HtmlTemplateEditor } from './components/HtmlTemplateEditor.js'\nexport type { HtmlTemplateEditorProps } from './components/HtmlTemplateEditor.js'\nexport { TemplateGroupList } from './components/TemplateGroupList.js'\nexport type { TemplateGroupListProps } from './components/TemplateGroupList.js'\nexport { DocumentList } from './components/DocumentList.js'\nexport type { DocumentListProps } from './components/DocumentList.js'\nexport { DocumentGenerator } from './components/DocumentGenerator.js'\nexport type { DocumentGeneratorProps } from './components/DocumentGenerator.js'\nexport { OperationsPanel } from './components/OperationsPanel.js'\nexport type { OperationsPanelProps } from './components/OperationsPanel.js'\n","'use client'\n\nimport { createContext, useContext, useMemo, type ReactNode } from 'react'\nimport { DocmanClient } from '../client.js'\n\ninterface DocmanContextValue {\n readonly client: DocmanClient\n}\n\nconst DocmanContext = createContext<DocmanContextValue | null>(null)\n\nexport interface DocmanProviderProps {\n /**\n * Base URL for docman API calls.\n *\n * In docman-web set this to \"/api/docman\" — the Next.js proxy route adds\n * the Bearer token server-side so secrets never reach the browser.\n *\n * In other consumers you can point this directly at DOCMAN_URL if your\n * host handles auth injection (e.g. a server-side wrapper).\n */\n readonly baseUrl: string\n readonly children: ReactNode\n}\n\nexport function DocmanProvider({ baseUrl, children }: DocmanProviderProps) {\n const client = useMemo(() => new DocmanClient({ baseUrl }), [baseUrl])\n\n return (\n <DocmanContext.Provider value={{ client }}>\n {children}\n </DocmanContext.Provider>\n )\n}\n\nexport function useDocmanContext(): DocmanContextValue {\n const ctx = useContext(DocmanContext)\n if (!ctx) {\n throw new Error('useDocmanContext must be used inside <DocmanProvider>')\n }\n return ctx\n}\n","export class DocmanError extends Error {\n constructor(\n message: string,\n public readonly statusCode: number,\n public readonly code?: string,\n public readonly details?: Record<string, unknown>,\n ) {\n super(message)\n this.name = 'DocmanError'\n }\n}\n","import { DocmanError } from './errors.js'\nimport type {\n DocmanClientConfig,\n HtmlTemplate,\n CreateHtmlTemplateOptions,\n UpdateHtmlTemplateOptions,\n HtmlTemplateListQuery,\n PdfTemplate,\n PdfField,\n CreatePdfTemplateOptions,\n UpdatePdfTemplateOptions,\n PdfTemplateListQuery,\n TemplateGroup,\n CreateTemplateGroupOptions,\n UpdateTemplateGroupOptions,\n DocmanDocument,\n DocumentVersion,\n GenerateOptions,\n GenerateResult,\n ListQuery,\n ListResult,\n ListMeta,\n PageRange,\n SplitPart,\n} from './types.js'\n\n// ─── Internal ────────────────────────────────────────────\n\n/**\n * DOM's BlobPart requires ArrayBuffer (not SharedArrayBuffer).\n * Node.js Buffer is always backed by ArrayBuffer in practice, so this cast is safe.\n */\nfunction toUint8(b: Buffer | Uint8Array): Uint8Array<ArrayBuffer> {\n return b as unknown as Uint8Array<ArrayBuffer>\n}\n\nconst DEFAULT_RETRIES = 2\nconst DEFAULT_TIMEOUT_MS = 15_000\nconst TOKEN_BUFFER_SECONDS = 30\n\ninterface ApiEnvelope<T> {\n readonly success: boolean\n readonly data?: T\n readonly error?: { code: string; message: string } | string\n readonly meta?: ListMeta\n}\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms))\n}\n\nfunction backoff(attempt: number): number {\n const base = Math.min(1000 * 2 ** attempt, 5_000)\n return base * (0.5 + Math.random() * 0.5)\n}\n\nfunction isTokenExpired(token: string, bufferSeconds = TOKEN_BUFFER_SECONDS): boolean {\n try {\n const parts = token.split('.')\n if (parts.length !== 3) return true\n const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString()) as { exp?: number }\n const now = Math.floor(Date.now() / 1000)\n return (payload.exp ?? 0) <= now + bufferSeconds\n } catch {\n return true\n }\n}\n\nfunction extractError(envelope: ApiEnvelope<unknown>): { code: string; message: string } {\n const err = envelope.error\n if (typeof err === 'object' && err !== null) return err\n return { code: 'REQUEST_ERROR', message: err ?? 'Request failed' }\n}\n\n// ─── DocmanClient ─────────────────────────────────────────\n\nexport class DocmanClient {\n private readonly baseUrl: string\n private readonly accessTokenFn?: () => Promise<string>\n private readonly internalKey?: string\n private readonly retries: number\n private readonly timeoutMs: number\n private cachedToken: string | null = null\n\n constructor(config: DocmanClientConfig) {\n this.baseUrl = config.baseUrl.replace(/\\/$/, '')\n this.accessTokenFn = config.accessTokenFn\n this.internalKey = config.internalKey\n this.retries = config.retries ?? DEFAULT_RETRIES\n this.timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS\n }\n\n /**\n * Create a client from environment variables.\n *\n * Reads DOCMAN_URL (injected automatically when you declare docman as an\n * internalDependency in catalog-info.yaml). Auth priority:\n * 1. BIO_CLIENT_ID + BIO_CLIENT_SECRET → client_credentials token\n * 2. INTERNAL_SERVICE_KEY → internal key header\n * 3. No auth → local dev / testing\n *\n * catalog-info.yaml:\n * spec:\n * internalDependencies:\n * - service: docman\n * port: 3000\n */\n static fromEnv(): DocmanClient {\n const baseUrl = process.env.DOCMAN_URL\n if (!baseUrl) {\n throw new DocmanError(\n 'DOCMAN_URL is not set. Add docman as an internalDependency in catalog-info.yaml',\n 500,\n 'CONFIG_ERROR',\n )\n }\n\n const clientId = process.env.BIO_CLIENT_ID\n const clientSecret = process.env.BIO_CLIENT_SECRET\n const bioIdUrl = process.env.BIO_ID_URL ?? 'https://bio.tawa.insureco.io'\n\n if (clientId && clientSecret) {\n return new DocmanClient({\n baseUrl,\n accessTokenFn: async () => {\n const res = await fetch(`${bioIdUrl}/api/oauth/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n grant_type: 'client_credentials',\n client_id: clientId,\n client_secret: clientSecret,\n }),\n })\n if (!res.ok) {\n throw new DocmanError('Failed to obtain Bio-ID access token', res.status, 'AUTH_ERROR')\n }\n const data = await res.json() as { access_token: string }\n return data.access_token\n },\n })\n }\n\n const internalKey = process.env.INTERNAL_SERVICE_KEY\n if (internalKey) {\n return new DocmanClient({ baseUrl, internalKey })\n }\n\n return new DocmanClient({ baseUrl })\n }\n\n // ─── Auth ────────────────────────────────────────────────\n\n private async authHeaders(): Promise<Record<string, string>> {\n if (this.accessTokenFn) {\n if (!this.cachedToken || isTokenExpired(this.cachedToken)) {\n this.cachedToken = await this.accessTokenFn()\n }\n return { Authorization: `Bearer ${this.cachedToken}` }\n }\n\n if (this.internalKey) {\n return { 'X-Internal-Key': this.internalKey }\n }\n\n return {}\n }\n\n // ─── Core fetch ──────────────────────────────────────────\n\n private async rawFetch<T>(\n method: string,\n path: string,\n body?: unknown,\n attempt = 0,\n ): Promise<ApiEnvelope<T>> {\n const headers = await this.authHeaders()\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeoutMs)\n\n let response: Response\n try {\n response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers: body !== undefined\n ? { ...headers, 'Content-Type': 'application/json' }\n : headers,\n body: body !== undefined ? JSON.stringify(body) : undefined,\n signal: controller.signal,\n })\n } catch (err) {\n clearTimeout(timer)\n if (attempt < this.retries) {\n await sleep(backoff(attempt))\n return this.rawFetch<T>(method, path, body, attempt + 1)\n }\n throw new DocmanError(`Network error: ${(err as Error).message}`, 0, 'NETWORK_ERROR')\n } finally {\n clearTimeout(timer)\n }\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(backoff(attempt))\n return this.rawFetch<T>(method, path, body, attempt + 1)\n }\n\n const envelope = await response.json() as ApiEnvelope<T>\n\n if (!response.ok || !envelope.success) {\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n return envelope\n }\n\n private async fetchData<T>(method: string, path: string, body?: unknown): Promise<T> {\n const envelope = await this.rawFetch<T>(method, path, body)\n return envelope.data as T\n }\n\n private async fetchList<T>(path: string): Promise<ListResult<T>> {\n const envelope = await this.rawFetch<T[]>('GET', path)\n return {\n data: envelope.data ?? [],\n meta: envelope.meta ?? { total: 0, page: 1, limit: 20 },\n }\n }\n\n private buildQuery<T extends object>(params: T): string {\n const pairs = Object.entries(params)\n .filter(([, v]) => v !== undefined)\n .map(([k, v]) => `${encodeURIComponent(k)}=${encodeURIComponent(String(v))}`)\n return pairs.length > 0 ? `?${pairs.join('&')}` : ''\n }\n\n /** Fetch with FormData body (multipart), return raw binary buffer. */\n private async fetchBinary(\n method: string,\n path: string,\n formData: FormData,\n attempt = 0,\n ): Promise<Buffer> {\n const headers = await this.authHeaders()\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeoutMs)\n\n let response: Response\n try {\n response = await fetch(`${this.baseUrl}${path}`, {\n method,\n headers,\n body: formData,\n signal: controller.signal,\n })\n } catch (err) {\n clearTimeout(timer)\n if (attempt < this.retries) {\n await sleep(backoff(attempt))\n return this.fetchBinary(method, path, formData, attempt + 1)\n }\n throw new DocmanError(`Network error: ${(err as Error).message}`, 0, 'NETWORK_ERROR')\n } finally {\n clearTimeout(timer)\n }\n\n if (response.status >= 500 && attempt < this.retries) {\n await sleep(backoff(attempt))\n return this.fetchBinary(method, path, formData, attempt + 1)\n }\n\n if (!response.ok) {\n const envelope = await response.json() as ApiEnvelope<never>\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n return Buffer.from(await response.arrayBuffer())\n }\n\n /** POST multipart form and parse the JSON response envelope. */\n private async fetchMultipartJson<T>(path: string, formData: FormData): Promise<T> {\n const headers = await this.authHeaders()\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: 'POST',\n headers,\n body: formData,\n })\n\n const envelope = await response.json() as ApiEnvelope<T>\n if (!response.ok || !envelope.success) {\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n return envelope.data as T\n }\n\n /** PUT multipart form and parse the JSON response envelope. */\n private async putMultipartJson<T>(path: string, formData: FormData): Promise<T> {\n const headers = await this.authHeaders()\n\n const response = await fetch(`${this.baseUrl}${path}`, {\n method: 'PUT',\n headers,\n body: formData,\n })\n\n const envelope = await response.json() as ApiEnvelope<T>\n if (!response.ok || !envelope.success) {\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n return envelope.data as T\n }\n\n // ─── HTML Templates ──────────────────────────────────────\n\n async createHtmlTemplate(options: CreateHtmlTemplateOptions): Promise<HtmlTemplate> {\n return this.fetchData<HtmlTemplate>('POST', '/templates/html', options)\n }\n\n async listHtmlTemplates(query: HtmlTemplateListQuery = {}): Promise<ListResult<HtmlTemplate>> {\n return this.fetchList<HtmlTemplate>(`/templates/html${this.buildQuery(query)}`)\n }\n\n async getHtmlTemplate(id: string): Promise<HtmlTemplate> {\n return this.fetchData<HtmlTemplate>('GET', `/templates/html/${encodeURIComponent(id)}`)\n }\n\n async updateHtmlTemplate(id: string, options: UpdateHtmlTemplateOptions): Promise<HtmlTemplate> {\n return this.fetchData<HtmlTemplate>('PUT', `/templates/html/${encodeURIComponent(id)}`, options)\n }\n\n async deleteHtmlTemplate(id: string): Promise<HtmlTemplate> {\n return this.fetchData<HtmlTemplate>('DELETE', `/templates/html/${encodeURIComponent(id)}`)\n }\n\n // ─── PDF Templates ───────────────────────────────────────\n\n /**\n * Upload a PDF form template.\n * @param file Raw PDF bytes (Buffer or Uint8Array)\n * @param options Name, description, and optional coordinates/isSystem flags\n */\n async uploadPdfTemplate(\n file: Buffer | Uint8Array,\n options: CreatePdfTemplateOptions = {},\n ): Promise<PdfTemplate> {\n const form = new FormData()\n const filename = options.name ?? 'template.pdf'\n form.append('file', new Blob([toUint8(file)], { type: 'application/pdf' }), filename)\n if (options.name) form.append('name', options.name)\n if (options.description) form.append('description', options.description)\n if (options.coordinates) form.append('coordinates', JSON.stringify(options.coordinates))\n if (options.isSystem !== undefined) form.append('isSystem', String(options.isSystem))\n\n return this.fetchMultipartJson<PdfTemplate>('/templates/pdf', form)\n }\n\n async listPdfTemplates(query: PdfTemplateListQuery = {}): Promise<ListResult<PdfTemplate>> {\n return this.fetchList<PdfTemplate>(`/templates/pdf${this.buildQuery(query)}`)\n }\n\n async getPdfTemplate(id: string): Promise<PdfTemplate> {\n return this.fetchData<PdfTemplate>('GET', `/templates/pdf/${encodeURIComponent(id)}`)\n }\n\n async getPdfTemplateFields(id: string): Promise<readonly PdfField[]> {\n return this.fetchData<PdfField[]>('GET', `/templates/pdf/${encodeURIComponent(id)}/fields`)\n }\n\n async getPdfTemplateDownloadUrl(id: string): Promise<string> {\n const data = await this.fetchData<{ url: string }>('GET', `/templates/pdf/${encodeURIComponent(id)}/download`)\n return data.url\n }\n\n /**\n * Update a PDF template's metadata, and optionally replace the PDF file.\n * @param file If provided, replaces the stored PDF and re-extracts form fields\n */\n async updatePdfTemplate(\n id: string,\n options: UpdatePdfTemplateOptions,\n file?: Buffer | Uint8Array,\n ): Promise<PdfTemplate> {\n if (file) {\n const form = new FormData()\n form.append('file', new Blob([toUint8(file)], { type: 'application/pdf' }), 'template.pdf')\n if (options.name) form.append('name', options.name)\n if (options.description) form.append('description', options.description)\n if (options.coordinates) form.append('coordinates', JSON.stringify(options.coordinates))\n\n return this.putMultipartJson<PdfTemplate>(`/templates/pdf/${encodeURIComponent(id)}`, form)\n }\n\n return this.fetchData<PdfTemplate>('PUT', `/templates/pdf/${encodeURIComponent(id)}`, options)\n }\n\n async deletePdfTemplate(id: string): Promise<PdfTemplate> {\n return this.fetchData<PdfTemplate>('DELETE', `/templates/pdf/${encodeURIComponent(id)}`)\n }\n\n // ─── Template Groups ─────────────────────────────────────\n\n async createTemplateGroup(options: CreateTemplateGroupOptions): Promise<TemplateGroup> {\n return this.fetchData<TemplateGroup>('POST', '/template-groups', options)\n }\n\n async listTemplateGroups(query: ListQuery = {}): Promise<ListResult<TemplateGroup>> {\n return this.fetchList<TemplateGroup>(`/template-groups${this.buildQuery(query)}`)\n }\n\n async getTemplateGroup(id: string): Promise<TemplateGroup> {\n return this.fetchData<TemplateGroup>('GET', `/template-groups/${encodeURIComponent(id)}`)\n }\n\n async updateTemplateGroup(id: string, options: UpdateTemplateGroupOptions): Promise<TemplateGroup> {\n return this.fetchData<TemplateGroup>('PUT', `/template-groups/${encodeURIComponent(id)}`, options)\n }\n\n async deleteTemplateGroup(id: string): Promise<void> {\n await this.fetchData<{ deleted: boolean }>('DELETE', `/template-groups/${encodeURIComponent(id)}`)\n }\n\n // ─── Document Generation ─────────────────────────────────\n\n /**\n * Generate a document and store it in S3.\n * Returns a presigned download URL and a public share URL.\n */\n async generate(options: GenerateOptions): Promise<GenerateResult> {\n return this.fetchData<GenerateResult>('POST', '/documents/generate', {\n templateIds: options.templateIds,\n templateData: options.data,\n name: options.name,\n description: options.description,\n })\n }\n\n /**\n * Generate a document and stream the PDF buffer directly.\n * Nothing is stored — useful for previews or on-the-fly delivery.\n */\n async generatePassthrough(options: GenerateOptions): Promise<Buffer> {\n const headers = await this.authHeaders()\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), this.timeoutMs)\n\n let response: Response\n try {\n response = await fetch(`${this.baseUrl}/documents/generate/passthrough`, {\n method: 'POST',\n headers: { ...headers, 'Content-Type': 'application/json' },\n body: JSON.stringify({\n templateIds: options.templateIds,\n templateData: options.data,\n name: options.name,\n description: options.description,\n }),\n signal: controller.signal,\n })\n } catch (err) {\n clearTimeout(timer)\n throw new DocmanError(`Network error: ${(err as Error).message}`, 0, 'NETWORK_ERROR')\n } finally {\n clearTimeout(timer)\n }\n\n if (!response.ok) {\n const envelope = await response.json() as ApiEnvelope<never>\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n return Buffer.from(await response.arrayBuffer())\n }\n\n async listDocuments(query: ListQuery = {}): Promise<ListResult<DocmanDocument>> {\n return this.fetchList<DocmanDocument>(`/documents${this.buildQuery(query)}`)\n }\n\n async getDocument(id: string): Promise<DocmanDocument> {\n return this.fetchData<DocmanDocument>('GET', `/documents/${encodeURIComponent(id)}`)\n }\n\n /** Get a presigned S3 download URL for a stored document (1-hour TTL). */\n async downloadUrl(id: string): Promise<string> {\n const data = await this.fetchData<{ url: string }>('GET', `/documents/${encodeURIComponent(id)}/download`)\n return data.url\n }\n\n async getVersions(id: string): Promise<readonly DocumentVersion[]> {\n return this.fetchData<DocumentVersion[]>('GET', `/documents/${encodeURIComponent(id)}/versions`)\n }\n\n /** Re-render a stored document using the original template data. */\n async regenerate(id: string): Promise<GenerateResult> {\n return this.fetchData<GenerateResult>('POST', `/documents/${encodeURIComponent(id)}/regenerate`)\n }\n\n // ─── PDF Operations ──────────────────────────────────────\n\n /**\n * Merge two or more PDF buffers into a single PDF.\n * Returns the merged PDF as a Buffer.\n */\n async merge(buffers: readonly (Buffer | Uint8Array)[]): Promise<Buffer> {\n if (buffers.length < 2) {\n throw new DocmanError('At least 2 PDF buffers are required for merge', 400, 'VALIDATION_ERROR')\n }\n const form = new FormData()\n for (const buf of buffers) {\n form.append('files', new Blob([toUint8(buf)], { type: 'application/pdf' }), 'file.pdf')\n }\n return this.fetchBinary('POST', '/operations/merge', form)\n }\n\n /**\n * Split a PDF into parts by page ranges.\n * Returns an array of SplitPart with buffer, range, and size info.\n */\n async split(buffer: Buffer | Uint8Array, ranges: readonly PageRange[]): Promise<readonly SplitPart[]> {\n if (ranges.length === 0) {\n throw new DocmanError('At least 1 page range is required', 400, 'VALIDATION_ERROR')\n }\n\n const form = new FormData()\n form.append('file', new Blob([toUint8(buffer)], { type: 'application/pdf' }), 'file.pdf')\n form.append('ranges', JSON.stringify(ranges))\n\n const headers = await this.authHeaders()\n const response = await fetch(`${this.baseUrl}/operations/split`, {\n method: 'POST',\n headers,\n body: form,\n })\n\n if (!response.ok) {\n const envelope = await response.json() as ApiEnvelope<never>\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n const contentType = response.headers.get('content-type') ?? ''\n\n if (contentType.includes('application/json')) {\n type SplitResponse = {\n success: true\n data: Array<{ index: number; range: PageRange; base64: string; sizeBytes: number }>\n }\n const json = await response.json() as SplitResponse\n return json.data.map((part) => ({\n index: part.index,\n range: part.range,\n buffer: Buffer.from(part.base64, 'base64'),\n sizeBytes: part.sizeBytes,\n }))\n }\n\n // Single range — binary response\n const buf = Buffer.from(await response.arrayBuffer())\n return [{ index: 0, range: ranges[0], buffer: buf, sizeBytes: buf.length }]\n }\n\n /**\n * Batch-introspect PDF form fields for multiple templates.\n * Returns a map of templateId → field list.\n */\n async introspectFields(templateIds: readonly string[]): Promise<Record<string, readonly PdfField[]>> {\n return this.fetchData<Record<string, readonly PdfField[]>>(\n 'POST',\n '/templates/pdf/fields',\n { templateIds },\n )\n }\n\n /** Get the page count of a PDF buffer. */\n async pageCount(buffer: Buffer | Uint8Array): Promise<number> {\n const form = new FormData()\n form.append('file', new Blob([toUint8(buffer)], { type: 'application/pdf' }), 'file.pdf')\n\n const headers = await this.authHeaders()\n const response = await fetch(`${this.baseUrl}/operations/page-count`, {\n method: 'POST',\n headers,\n body: form,\n })\n\n if (!response.ok) {\n const envelope = await response.json() as ApiEnvelope<never>\n const { code, message } = extractError(envelope)\n throw new DocmanError(message, response.status, code)\n }\n\n const json = await response.json() as { success: true; data: { pages: number } }\n return json.data.pages\n }\n}\n","'use client'\n\nimport { useDocmanContext } from '../context.js'\nimport type { DocmanClient } from '../../client.js'\n\nexport function useDocmanClient(): DocmanClient {\n return useDocmanContext().client\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useDocmanClient } from './useDocmanClient.js'\nimport type { PdfTemplate, ListResult } from '../../types.js'\n\nexport interface UsePdfTemplatesOptions {\n readonly page?: number\n readonly limit?: number\n readonly archived?: boolean\n}\n\nexport interface UsePdfTemplatesReturn {\n readonly result: ListResult<PdfTemplate> | null\n readonly loading: boolean\n readonly error: string | null\n readonly refresh: () => void\n}\n\nexport function usePdfTemplates(options: UsePdfTemplatesOptions = {}): UsePdfTemplatesReturn {\n const client = useDocmanClient()\n const [result, setResult] = useState<ListResult<PdfTemplate> | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(null)\n\n client.listPdfTemplates({\n page: options.page ?? 1,\n limit: options.limit ?? 20,\n archived: options.archived ?? false,\n })\n .then((res) => {\n if (!cancelled) {\n setResult(res)\n setLoading(false)\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setError(err.message)\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [client, options.page, options.limit, options.archived, tick])\n\n return { result, loading, error, refresh }\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useDocmanClient } from './useDocmanClient.js'\nimport type { HtmlTemplate, ListResult } from '../../types.js'\n\nexport interface UseHtmlTemplatesOptions {\n readonly page?: number\n readonly limit?: number\n readonly archived?: boolean\n}\n\nexport interface UseHtmlTemplatesReturn {\n readonly result: ListResult<HtmlTemplate> | null\n readonly loading: boolean\n readonly error: string | null\n readonly refresh: () => void\n}\n\nexport function useHtmlTemplates(options: UseHtmlTemplatesOptions = {}): UseHtmlTemplatesReturn {\n const client = useDocmanClient()\n const [result, setResult] = useState<ListResult<HtmlTemplate> | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(null)\n\n client.listHtmlTemplates({\n page: options.page ?? 1,\n limit: options.limit ?? 20,\n archived: options.archived ?? false,\n })\n .then((res) => {\n if (!cancelled) {\n setResult(res)\n setLoading(false)\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setError(err.message)\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [client, options.page, options.limit, options.archived, tick])\n\n return { result, loading, error, refresh }\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useDocmanClient } from './useDocmanClient.js'\nimport type { TemplateGroup, ListResult } from '../../types.js'\n\nexport interface UseTemplateGroupsReturn {\n readonly result: ListResult<TemplateGroup> | null\n readonly loading: boolean\n readonly error: string | null\n readonly refresh: () => void\n}\n\nexport function useTemplateGroups(page = 1, limit = 20): UseTemplateGroupsReturn {\n const client = useDocmanClient()\n const [result, setResult] = useState<ListResult<TemplateGroup> | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(null)\n\n client.listTemplateGroups({ page, limit })\n .then((res) => {\n if (!cancelled) {\n setResult(res)\n setLoading(false)\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setError(err.message)\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [client, page, limit, tick])\n\n return { result, loading, error, refresh }\n}\n","'use client'\n\nimport { useState, useEffect, useCallback } from 'react'\nimport { useDocmanClient } from './useDocmanClient.js'\nimport type { DocmanDocument, ListResult } from '../../types.js'\n\nexport interface UseDocumentsReturn {\n readonly result: ListResult<DocmanDocument> | null\n readonly loading: boolean\n readonly error: string | null\n readonly refresh: () => void\n}\n\nexport function useDocuments(page = 1, limit = 20): UseDocumentsReturn {\n const client = useDocmanClient()\n const [result, setResult] = useState<ListResult<DocmanDocument> | null>(null)\n const [loading, setLoading] = useState(true)\n const [error, setError] = useState<string | null>(null)\n const [tick, setTick] = useState(0)\n\n const refresh = useCallback(() => setTick((t) => t + 1), [])\n\n useEffect(() => {\n let cancelled = false\n setLoading(true)\n setError(null)\n\n client.listDocuments({ page, limit })\n .then((res) => {\n if (!cancelled) {\n setResult(res)\n setLoading(false)\n }\n })\n .catch((err: Error) => {\n if (!cancelled) {\n setError(err.message)\n setLoading(false)\n }\n })\n\n return () => { cancelled = true }\n }, [client, page, limit, tick])\n\n return { result, loading, error, refresh }\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { usePdfTemplates } from '../hooks/usePdfTemplates.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport { EmptyState } from '../shared/EmptyState.js'\nimport { Pagination } from '../shared/Pagination.js'\nimport { PdfTemplateUploader } from './PdfTemplateUploader.js'\nimport type { PdfTemplate } from '../../types.js'\n\nexport interface PdfTemplateListProps {\n readonly onUploadSuccess?: (template: PdfTemplate) => void\n readonly showUploadButton?: boolean\n readonly pageSize?: number\n readonly className?: string\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport function PdfTemplateList({\n onUploadSuccess,\n showUploadButton = true,\n pageSize = 20,\n className,\n}: PdfTemplateListProps): ReactNode {\n const client = useDocmanClient()\n const [page, setPage] = useState(1)\n const [showUploader, setShowUploader] = useState(false)\n const [deleting, setDeleting] = useState<string | null>(null)\n const [deleteError, setDeleteError] = useState<string | null>(null)\n\n const { result, loading, error, refresh } = usePdfTemplates({ page, limit: pageSize })\n\n async function handleDelete(template: PdfTemplate) {\n if (!confirm(`Archive \"${template.name}\"? It will no longer appear in the list.`)) return\n setDeleteError(null)\n setDeleting(template._id)\n try {\n await client.deletePdfTemplate(template._id)\n refresh()\n } catch (err) {\n setDeleteError((err as Error).message)\n } finally {\n setDeleting(null)\n }\n }\n\n function handleUploadSuccess(template: PdfTemplate) {\n setShowUploader(false)\n refresh()\n onUploadSuccess?.(template)\n }\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">PDF Templates</h2>\n {showUploadButton && !showUploader && (\n <button className=\"docman-btn docman-btn-primary\" onClick={() => setShowUploader(true)}>\n + Upload Template\n </button>\n )}\n </div>\n\n {showUploader && (\n <div style={{ marginBottom: 'var(--docman-space-lg)' }}>\n <PdfTemplateUploader\n onSuccess={handleUploadSuccess}\n onCancel={() => setShowUploader(false)}\n />\n </div>\n )}\n\n {deleteError && <ErrorAlert message={deleteError} />}\n\n {loading && <LoadingSpinner />}\n {!loading && error && <ErrorAlert message={error} />}\n\n {!loading && !error && result && (\n result.data.length === 0\n ? (\n <EmptyState\n icon=\"📋\"\n title=\"No PDF templates yet\"\n description=\"Upload a PDF form to get started.\"\n action={showUploadButton && !showUploader\n ? <button className=\"docman-btn docman-btn-primary\" onClick={() => setShowUploader(true)}>Upload Template</button>\n : undefined\n }\n />\n )\n : (\n <>\n <div className=\"docman-table-wrap\">\n <table className=\"docman-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Fields</th>\n <th>Pages</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {result.data.map((t) => (\n <tr key={t._id}>\n <td>\n <div style={{ fontWeight: 500 }}>{t.name}</div>\n {t.description && (\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)' }}>\n {t.description}\n </div>\n )}\n </td>\n <td>\n <span className=\"docman-badge docman-badge-info\">{t.fields.length} fields</span>\n </td>\n <td>{t.pages}</td>\n <td style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.8rem' }}>\n {new Date(t.createdAt).toLocaleDateString()}\n </td>\n <td style={{ textAlign: 'right' }}>\n <button\n className=\"docman-btn docman-btn-danger docman-btn-sm\"\n onClick={() => handleDelete(t)}\n disabled={deleting === t._id}\n >\n {deleting === t._id ? 'Archiving…' : 'Archive'}\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n\n <Pagination\n page={page}\n total={result.meta.total}\n limit={pageSize}\n onPageChange={setPage}\n />\n </>\n )\n )}\n </div>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\n\ninterface LoadingSpinnerProps {\n readonly label?: string\n}\n\nexport function LoadingSpinner({ label = 'Loading…' }: LoadingSpinnerProps): ReactNode {\n return (\n <div className=\"docman-loading\">\n <span className=\"docman-spinner\" aria-hidden=\"true\" />\n <span>{label}</span>\n </div>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\n\ninterface ErrorAlertProps {\n readonly message: string\n}\n\nexport function ErrorAlert({ message }: ErrorAlertProps): ReactNode {\n return (\n <div className=\"docman-error\" role=\"alert\">\n {message}\n </div>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\n\ninterface EmptyStateProps {\n readonly icon?: string\n readonly title: string\n readonly description?: string\n readonly action?: ReactNode\n}\n\nexport function EmptyState({ icon = '📄', title, description, action }: EmptyStateProps): ReactNode {\n return (\n <div className=\"docman-empty\">\n <div className=\"docman-empty-icon\" aria-hidden=\"true\">{icon}</div>\n <div className=\"docman-empty-title\">{title}</div>\n {description && <div className=\"docman-empty-desc\">{description}</div>}\n {action && <div style={{ marginTop: 'var(--docman-space-md)' }}>{action}</div>}\n </div>\n )\n}\n","'use client'\n\nimport type { ReactNode } from 'react'\n\ninterface PaginationProps {\n readonly page: number\n readonly total: number\n readonly limit: number\n readonly onPageChange: (page: number) => void\n}\n\nexport function Pagination({ page, total, limit, onPageChange }: PaginationProps): ReactNode {\n const totalPages = Math.ceil(total / limit)\n const start = (page - 1) * limit + 1\n const end = Math.min(page * limit, total)\n\n if (totalPages <= 1) return null\n\n return (\n <div className=\"docman-pagination\">\n <span className=\"docman-pagination-info\">\n {start}–{end} of {total}\n </span>\n <div className=\"docman-pagination-controls\">\n <button\n className=\"docman-btn docman-btn-secondary docman-btn-sm\"\n onClick={() => onPageChange(page - 1)}\n disabled={page <= 1}\n >\n Previous\n </button>\n <button\n className=\"docman-btn docman-btn-secondary docman-btn-sm\"\n onClick={() => onPageChange(page + 1)}\n disabled={page >= totalPages}\n >\n Next\n </button>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, useRef, type ReactNode, type ChangeEvent, type DragEvent } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport type { PdfTemplate } from '../../types.js'\n\nexport interface PdfTemplateUploaderProps {\n readonly onSuccess?: (template: PdfTemplate) => void\n readonly onCancel?: () => void\n readonly className?: string\n}\n\nexport function PdfTemplateUploader({ onSuccess, onCancel, className }: PdfTemplateUploaderProps): ReactNode {\n const client = useDocmanClient()\n const inputRef = useRef<HTMLInputElement>(null)\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [file, setFile] = useState<File | null>(null)\n const [dragging, setDragging] = useState(false)\n const [uploading, setUploading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n function handleFileChange(e: ChangeEvent<HTMLInputElement>) {\n const f = e.target.files?.[0] ?? null\n setFile(f)\n if (f && !name) setName(f.name.replace(/\\.pdf$/i, ''))\n }\n\n function handleDrop(e: DragEvent<HTMLDivElement>) {\n e.preventDefault()\n setDragging(false)\n const f = e.dataTransfer.files[0]\n if (f?.type === 'application/pdf') {\n setFile(f)\n if (!name) setName(f.name.replace(/\\.pdf$/i, ''))\n }\n }\n\n async function handleSubmit() {\n if (!file) {\n setError('Please select a PDF file.')\n return\n }\n if (!name.trim()) {\n setError('Please enter a template name.')\n return\n }\n\n setError(null)\n setUploading(true)\n\n try {\n const buffer = await file.arrayBuffer()\n const template = await client.uploadPdfTemplate(new Uint8Array(buffer), {\n name: name.trim(),\n description: description.trim() || undefined,\n })\n onSuccess?.(template)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setUploading(false)\n }\n }\n\n return (\n <div className={`docman-ui docman-card ${className ?? ''}`}>\n <h3 style={{ marginTop: 0, marginBottom: 'var(--docman-space-lg)' }}>Upload PDF Template</h3>\n\n {error && <ErrorAlert message={error} />}\n\n <div\n className={`docman-dropzone ${dragging ? 'docman-dropzone-active' : ''}`}\n onClick={() => inputRef.current?.click()}\n onDragOver={(e) => { e.preventDefault(); setDragging(true) }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n aria-label=\"Click or drag to upload a PDF file\"\n >\n <div style={{ fontSize: '2rem' }}>📎</div>\n {file\n ? <div style={{ fontWeight: 500, marginTop: 'var(--docman-space-sm)' }}>{file.name}</div>\n : <div className=\"docman-dropzone-text\">Click to select or drag a PDF here</div>\n }\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/pdf\"\n style={{ display: 'none' }}\n onChange={handleFileChange}\n />\n </div>\n\n <div style={{ marginTop: 'var(--docman-space-lg)' }}>\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"pdf-upload-name\">Name *</label>\n <input\n id=\"pdf-upload-name\"\n className=\"docman-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Template name\"\n />\n </div>\n\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"pdf-upload-desc\">Description</label>\n <input\n id=\"pdf-upload-desc\"\n className=\"docman-input\"\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional description\"\n />\n </div>\n </div>\n\n <div style={{ display: 'flex', gap: 'var(--docman-space-sm)', justifyContent: 'flex-end' }}>\n {onCancel && (\n <button className=\"docman-btn docman-btn-secondary\" onClick={onCancel} disabled={uploading}>\n Cancel\n </button>\n )}\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={handleSubmit}\n disabled={uploading || !file}\n >\n {uploading ? 'Uploading…' : 'Upload Template'}\n </button>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { useHtmlTemplates } from '../hooks/useHtmlTemplates.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport { EmptyState } from '../shared/EmptyState.js'\nimport { Pagination } from '../shared/Pagination.js'\nimport { HtmlTemplateEditor } from './HtmlTemplateEditor.js'\nimport type { HtmlTemplate } from '../../types.js'\n\nexport interface HtmlTemplateListProps {\n readonly onCreateSuccess?: (template: HtmlTemplate) => void\n readonly showCreateButton?: boolean\n readonly pageSize?: number\n readonly className?: string\n}\n\nexport function HtmlTemplateList({\n onCreateSuccess,\n showCreateButton = true,\n pageSize = 20,\n className,\n}: HtmlTemplateListProps): ReactNode {\n const client = useDocmanClient()\n const [page, setPage] = useState(1)\n const [creating, setCreating] = useState(false)\n const [editingId, setEditingId] = useState<string | null>(null)\n const [deleting, setDeleting] = useState<string | null>(null)\n const [deleteError, setDeleteError] = useState<string | null>(null)\n\n const { result, loading, error, refresh } = useHtmlTemplates({ page, limit: pageSize })\n\n async function handleDelete(template: HtmlTemplate) {\n if (!confirm(`Archive \"${template.name}\"?`)) return\n setDeleteError(null)\n setDeleting(template._id)\n try {\n await client.deleteHtmlTemplate(template._id)\n refresh()\n } catch (err) {\n setDeleteError((err as Error).message)\n } finally {\n setDeleting(null)\n }\n }\n\n function handleSaveSuccess(template: HtmlTemplate) {\n setCreating(false)\n setEditingId(null)\n refresh()\n onCreateSuccess?.(template)\n }\n\n if (editingId) {\n return (\n <HtmlTemplateEditor\n templateId={editingId}\n onSave={handleSaveSuccess}\n onCancel={() => setEditingId(null)}\n className={className}\n />\n )\n }\n\n if (creating) {\n return (\n <HtmlTemplateEditor\n onSave={handleSaveSuccess}\n onCancel={() => setCreating(false)}\n className={className}\n />\n )\n }\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">HTML Templates</h2>\n {showCreateButton && (\n <button className=\"docman-btn docman-btn-primary\" onClick={() => setCreating(true)}>\n + New Template\n </button>\n )}\n </div>\n\n {deleteError && <ErrorAlert message={deleteError} />}\n {loading && <LoadingSpinner />}\n {!loading && error && <ErrorAlert message={error} />}\n\n {!loading && !error && result && (\n result.data.length === 0\n ? (\n <EmptyState\n icon=\"🖊️\"\n title=\"No HTML templates yet\"\n description=\"Create a Handlebars HTML template to generate PDF documents.\"\n action={showCreateButton\n ? <button className=\"docman-btn docman-btn-primary\" onClick={() => setCreating(true)}>New Template</button>\n : undefined\n }\n />\n )\n : (\n <>\n <div className=\"docman-table-wrap\">\n <table className=\"docman-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Variables</th>\n <th>Orientation</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {result.data.map((t) => (\n <tr key={t._id}>\n <td>\n <div style={{ fontWeight: 500 }}>{t.name}</div>\n {t.description && (\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)' }}>\n {t.description}\n </div>\n )}\n </td>\n <td>\n {t.variables.length > 0\n ? t.variables.map((v) => (\n <span key={v} className=\"docman-badge docman-badge-info\" style={{ marginRight: '4px' }}>\n {`{{${v}}}`}\n </span>\n ))\n : <span style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.8rem' }}>none</span>\n }\n </td>\n <td>{t.landscape ? 'Landscape' : 'Portrait'}</td>\n <td style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.8rem' }}>\n {new Date(t.createdAt).toLocaleDateString()}\n </td>\n <td style={{ textAlign: 'right', display: 'flex', gap: 'var(--docman-space-xs)', justifyContent: 'flex-end' }}>\n <button\n className=\"docman-btn docman-btn-secondary docman-btn-sm\"\n onClick={() => setEditingId(t._id)}\n >\n Edit\n </button>\n <button\n className=\"docman-btn docman-btn-danger docman-btn-sm\"\n onClick={() => handleDelete(t)}\n disabled={deleting === t._id}\n >\n {deleting === t._id ? 'Archiving…' : 'Archive'}\n </button>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <Pagination page={page} total={result.meta.total} limit={pageSize} onPageChange={setPage} />\n </>\n )\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect, type ReactNode } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport type { HtmlTemplate } from '../../types.js'\n\nexport interface HtmlTemplateEditorProps {\n readonly templateId?: string\n readonly initialHtml?: string\n readonly onSave?: (template: HtmlTemplate) => void\n readonly onCancel?: () => void\n readonly className?: string\n}\n\nconst DEFAULT_HTML = `<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <style>\n body { font-family: sans-serif; padding: 40px; }\n h1 { color: #1e293b; }\n </style>\n</head>\n<body>\n <h1>Hello, {{firstName}}!</h1>\n <p>Welcome to {{orgName}}.</p>\n</body>\n</html>`\n\nexport function HtmlTemplateEditor({\n templateId,\n initialHtml,\n onSave,\n onCancel,\n className,\n}: HtmlTemplateEditorProps): ReactNode {\n const client = useDocmanClient()\n const [name, setName] = useState('')\n const [description, setDescription] = useState('')\n const [html, setHtml] = useState(initialHtml ?? DEFAULT_HTML)\n const [landscape, setLandscape] = useState(false)\n const [loading, setLoading] = useState(!!templateId)\n const [saving, setSaving] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n useEffect(() => {\n if (!templateId) return\n let cancelled = false\n setLoading(true)\n\n client.getHtmlTemplate(templateId)\n .then((t) => {\n if (cancelled) return\n setName(t.name)\n setDescription(t.description ?? '')\n setHtml(t.html)\n setLandscape(t.landscape)\n setLoading(false)\n })\n .catch((err: Error) => {\n if (cancelled) return\n setError(err.message)\n setLoading(false)\n })\n\n return () => { cancelled = true }\n }, [client, templateId])\n\n async function handleSave() {\n if (!name.trim()) {\n setError('Please enter a template name.')\n return\n }\n setError(null)\n setSaving(true)\n\n try {\n const template = templateId\n ? await client.updateHtmlTemplate(templateId, {\n name: name.trim(),\n description: description.trim() || undefined,\n html,\n landscape,\n })\n : await client.createHtmlTemplate({\n name: name.trim(),\n description: description.trim() || undefined,\n html,\n landscape,\n })\n onSave?.(template)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setSaving(false)\n }\n }\n\n if (loading) return <LoadingSpinner />\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">{templateId ? 'Edit HTML Template' : 'New HTML Template'}</h2>\n </div>\n\n {error && <ErrorAlert message={error} />}\n\n <div style={{ display: 'grid', gridTemplateColumns: '280px 1fr', gap: 'var(--docman-space-lg)', alignItems: 'start' }}>\n <div>\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"html-tmpl-name\">Name *</label>\n <input\n id=\"html-tmpl-name\"\n className=\"docman-input\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"Template name\"\n />\n </div>\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"html-tmpl-desc\">Description</label>\n <input\n id=\"html-tmpl-desc\"\n className=\"docman-input\"\n type=\"text\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n placeholder=\"Optional description\"\n />\n </div>\n <div className=\"docman-field\" style={{ display: 'flex', alignItems: 'center', gap: 'var(--docman-space-sm)' }}>\n <input\n id=\"html-tmpl-landscape\"\n type=\"checkbox\"\n checked={landscape}\n onChange={(e) => setLandscape(e.target.checked)}\n />\n <label htmlFor=\"html-tmpl-landscape\" className=\"docman-label\" style={{ margin: 0 }}>\n Landscape orientation\n </label>\n </div>\n\n <div style={{ display: 'flex', flexDirection: 'column', gap: 'var(--docman-space-sm)', marginTop: 'var(--docman-space-lg)' }}>\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={handleSave}\n disabled={saving}\n >\n {saving ? 'Saving…' : 'Save Template'}\n </button>\n {onCancel && (\n <button className=\"docman-btn docman-btn-secondary\" onClick={onCancel} disabled={saving}>\n Cancel\n </button>\n )}\n </div>\n </div>\n\n <div className=\"docman-split\">\n <div>\n <label className=\"docman-label\">HTML (Handlebars supported)</label>\n <textarea\n className=\"docman-textarea\"\n style={{ minHeight: '420px', fontFamily: 'var(--docman-font-mono)', fontSize: '0.8rem' }}\n value={html}\n onChange={(e) => setHtml(e.target.value)}\n spellCheck={false}\n />\n </div>\n <div>\n <label className=\"docman-label\">Live Preview</label>\n <iframe\n className=\"docman-preview-frame\"\n srcDoc={html}\n title=\"Template preview\"\n sandbox=\"allow-same-origin\"\n />\n </div>\n </div>\n </div>\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport { useTemplateGroups } from '../hooks/useTemplateGroups.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport { EmptyState } from '../shared/EmptyState.js'\nimport { Pagination } from '../shared/Pagination.js'\nimport type { TemplateGroup } from '../../types.js'\n\nexport interface TemplateGroupListProps {\n readonly onSelect?: (group: TemplateGroup) => void\n readonly pageSize?: number\n readonly className?: string\n}\n\nexport function TemplateGroupList({ onSelect, pageSize = 20, className }: TemplateGroupListProps): ReactNode {\n const [page, setPage] = useState(1)\n const { result, loading, error } = useTemplateGroups(page, pageSize)\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">Template Groups</h2>\n </div>\n\n {loading && <LoadingSpinner />}\n {!loading && error && <ErrorAlert message={error} />}\n\n {!loading && !error && result && (\n result.data.length === 0\n ? (\n <EmptyState\n icon=\"📁\"\n title=\"No template groups yet\"\n description=\"Template groups combine multiple PDF and HTML templates into a single document bundle.\"\n />\n )\n : (\n <>\n <div className=\"docman-checkbox-grid\">\n {result.data.map((g) => (\n <div\n key={g._id}\n className=\"docman-checkbox-card\"\n onClick={() => onSelect?.(g)}\n role={onSelect ? 'button' : undefined}\n tabIndex={onSelect ? 0 : undefined}\n onKeyDown={(e) => e.key === 'Enter' && onSelect?.(g)}\n style={{ cursor: onSelect ? 'pointer' : 'default' }}\n >\n <div style={{ fontSize: '1.5rem' }}>📁</div>\n <div>\n <div style={{ fontWeight: 600, fontSize: '0.875rem' }}>{g.name}</div>\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)', marginTop: '2px' }}>\n {g.templates.length} template{g.templates.length !== 1 ? 's' : ''}\n </div>\n <div style={{ display: 'flex', gap: '4px', flexWrap: 'wrap', marginTop: 'var(--docman-space-xs)' }}>\n {g.templates.map((t, i) => (\n <span key={i} className={`docman-badge ${t.templateType === 'pdf' ? 'docman-badge-info' : 'docman-badge-success'}`}>\n {t.templateType.toUpperCase()}\n </span>\n ))}\n </div>\n </div>\n </div>\n ))}\n </div>\n <Pagination page={page} total={result.meta.total} limit={pageSize} onPageChange={setPage} />\n </>\n )\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState, type ReactNode } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { useDocuments } from '../hooks/useDocuments.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport { EmptyState } from '../shared/EmptyState.js'\nimport { Pagination } from '../shared/Pagination.js'\n\nexport interface DocumentListProps {\n readonly pageSize?: number\n readonly className?: string\n}\n\nfunction formatBytes(bytes: number): string {\n if (bytes < 1024) return `${bytes} B`\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`\n}\n\nexport function DocumentList({ pageSize = 20, className }: DocumentListProps): ReactNode {\n const client = useDocmanClient()\n const [page, setPage] = useState(1)\n const [downloading, setDownloading] = useState<string | null>(null)\n const [downloadError, setDownloadError] = useState<string | null>(null)\n\n const { result, loading, error } = useDocuments(page, pageSize)\n\n async function handleDownload(id: string, name: string) {\n setDownloadError(null)\n setDownloading(id)\n try {\n const url = await client.downloadUrl(id)\n const a = document.createElement('a')\n a.href = url\n a.download = `${name}.pdf`\n a.click()\n } catch (err) {\n setDownloadError((err as Error).message)\n } finally {\n setDownloading(null)\n }\n }\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">Documents</h2>\n </div>\n\n {downloadError && <ErrorAlert message={downloadError} />}\n {loading && <LoadingSpinner />}\n {!loading && error && <ErrorAlert message={error} />}\n\n {!loading && !error && result && (\n result.data.length === 0\n ? (\n <EmptyState\n icon=\"📄\"\n title=\"No documents yet\"\n description=\"Generate your first document using the Generate tab.\"\n />\n )\n : (\n <>\n <div className=\"docman-table-wrap\">\n <table className=\"docman-table\">\n <thead>\n <tr>\n <th>Name</th>\n <th>Pages</th>\n <th>Size</th>\n <th>Version</th>\n <th>Created</th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n {result.data.map((doc) => (\n <tr key={doc._id}>\n <td>\n <div style={{ fontWeight: 500 }}>{doc.name}</div>\n {doc.description && (\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)' }}>\n {doc.description}\n </div>\n )}\n </td>\n <td>{doc.pages}</td>\n <td style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.8rem' }}>\n {formatBytes(doc.sizeBytes)}\n </td>\n <td>\n <span className=\"docman-badge docman-badge-info\">v{doc.version}</span>\n </td>\n <td style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.8rem' }}>\n {new Date(doc.createdAt).toLocaleDateString()}\n </td>\n <td style={{ textAlign: 'right', display: 'flex', gap: 'var(--docman-space-xs)', justifyContent: 'flex-end' }}>\n <button\n className=\"docman-btn docman-btn-secondary docman-btn-sm\"\n onClick={() => handleDownload(doc._id, doc.name)}\n disabled={downloading === doc._id}\n >\n {downloading === doc._id ? 'Fetching…' : 'Download'}\n </button>\n <a\n href={`/d/${doc.shareToken}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"docman-btn docman-btn-secondary docman-btn-sm\"\n >\n Share\n </a>\n </td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n <Pagination page={page} total={result.meta.total} limit={pageSize} onPageChange={setPage} />\n </>\n )\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState, useEffect, type ReactNode, type ChangeEvent } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { usePdfTemplates } from '../hooks/usePdfTemplates.js'\nimport { useHtmlTemplates } from '../hooks/useHtmlTemplates.js'\nimport { LoadingSpinner } from '../shared/LoadingSpinner.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\nimport type { PdfField, GenerateResult } from '../../types.js'\n\nexport interface DocumentGeneratorProps {\n readonly initialTemplateIds?: readonly string[]\n readonly onSuccess?: (result: GenerateResult) => void\n readonly className?: string\n}\n\ntype Step = 'select' | 'fields' | 'generate'\n\ninterface FieldValues {\n [key: string]: string\n}\n\nfunction StepIndicator({ current }: { current: Step }): ReactNode {\n const steps: { key: Step; label: string }[] = [\n { key: 'select', label: 'Select templates' },\n { key: 'fields', label: 'Fill in data' },\n { key: 'generate', label: 'Done' },\n ]\n const order: Step[] = ['select', 'fields', 'generate']\n const currentIdx = order.indexOf(current)\n\n return (\n <div className=\"docman-steps\">\n {steps.map(({ key, label }, i) => (\n <div\n key={key}\n className={`docman-step ${i === currentIdx ? 'docman-step-active' : ''} ${i < currentIdx ? 'docman-step-done' : ''}`}\n >\n <span className=\"docman-step-num\">{i < currentIdx ? '✓' : i + 1}</span>\n <span>{label}</span>\n {i < steps.length - 1 && (\n <span style={{ color: 'var(--docman-color-border)', margin: '0 4px' }}>→</span>\n )}\n </div>\n ))}\n </div>\n )\n}\n\nexport function DocumentGenerator({ initialTemplateIds, onSuccess, className }: DocumentGeneratorProps): ReactNode {\n const client = useDocmanClient()\n\n // Step 1: template selection\n const [step, setStep] = useState<Step>(initialTemplateIds ? 'fields' : 'select')\n const [selectedIds, setSelectedIds] = useState<string[]>(initialTemplateIds ? [...initialTemplateIds] : [])\n\n // Step 2: field introspection + form data\n const [fields, setFields] = useState<Record<string, readonly PdfField[]>>({})\n const [htmlVariables, setHtmlVariables] = useState<string[]>([])\n const [fieldValues, setFieldValues] = useState<FieldValues>({})\n const [introspecting, setIntrospecting] = useState(false)\n const [introspectError, setIntrospectError] = useState<string | null>(null)\n\n // Document name / description\n const [docName, setDocName] = useState('')\n const [docDescription, setDocDescription] = useState('')\n\n // Step 3: generation result\n const [generating, setGenerating] = useState(false)\n const [generateError, setGenerateError] = useState<string | null>(null)\n const [result, setResult] = useState<GenerateResult | null>(null)\n\n // Template lists for selection\n const { result: pdfResult, loading: pdfLoading } = usePdfTemplates({ limit: 100 })\n const { result: htmlResult, loading: htmlLoading } = useHtmlTemplates({ limit: 100 })\n\n // When we move to the fields step, introspect PDF fields + collect HTML variables\n useEffect(() => {\n if (step !== 'fields' || selectedIds.length === 0) return\n\n const pdfIds = selectedIds.filter((id) => pdfResult?.data.some((t) => t._id === id))\n const htmlTemplates = htmlResult?.data.filter((t) => selectedIds.includes(t._id)) ?? []\n\n const vars = htmlTemplates.flatMap((t) => t.variables)\n setHtmlVariables([...new Set(vars)])\n\n if (pdfIds.length === 0) {\n setFields({})\n return\n }\n\n setIntrospecting(true)\n setIntrospectError(null)\n\n client.introspectFields(pdfIds)\n .then((f) => {\n setFields(f)\n setIntrospecting(false)\n })\n .catch((err: Error) => {\n setIntrospectError(err.message)\n setIntrospecting(false)\n })\n }, [step, selectedIds, client, pdfResult, htmlResult])\n\n function toggleTemplate(id: string) {\n setSelectedIds((prev) =>\n prev.includes(id) ? prev.filter((x) => x !== id) : [...prev, id]\n )\n }\n\n function handleFieldChange(key: string, value: string) {\n setFieldValues((prev) => ({ ...prev, [key]: value }))\n }\n\n async function handleGenerate() {\n if (!docName.trim()) {\n setGenerateError('Please enter a document name.')\n return\n }\n setGenerateError(null)\n setGenerating(true)\n\n try {\n const templateData: Record<string, unknown> = {}\n for (const [k, v] of Object.entries(fieldValues)) {\n templateData[k] = v\n }\n\n const generated = await client.generate({\n templateIds: selectedIds,\n data: templateData,\n name: docName.trim(),\n description: docDescription.trim() || undefined,\n })\n\n setResult(generated)\n setStep('generate')\n onSuccess?.(generated)\n } catch (err) {\n setGenerateError((err as Error).message)\n } finally {\n setGenerating(false)\n }\n }\n\n function reset() {\n setStep('select')\n setSelectedIds([])\n setFields({})\n setHtmlVariables([])\n setFieldValues({})\n setDocName('')\n setDocDescription('')\n setResult(null)\n setGenerateError(null)\n }\n\n const allPdfFields = Object.values(fields).flat()\n const allFieldKeys = [\n ...new Set([\n ...allPdfFields.map((f) => f.name),\n ...htmlVariables,\n ]),\n ]\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">Generate Document</h2>\n </div>\n\n <StepIndicator current={step} />\n\n {/* ── Step 1: Select templates ── */}\n {step === 'select' && (\n <div>\n {(pdfLoading || htmlLoading) && <LoadingSpinner label=\"Loading templates…\" />}\n\n {!pdfLoading && !htmlLoading && (\n <>\n {(pdfResult?.data.length ?? 0) === 0 && (htmlResult?.data.length ?? 0) === 0 && (\n <div className=\"docman-error\">\n No templates found. Upload a PDF template or create an HTML template first.\n </div>\n )}\n\n {(pdfResult?.data.length ?? 0) > 0 && (\n <>\n <h3 style={{ margin: '0 0 var(--docman-space-sm)' }}>PDF Templates</h3>\n <div className=\"docman-checkbox-grid\" style={{ marginBottom: 'var(--docman-space-lg)' }}>\n {pdfResult!.data.map((t) => (\n <label\n key={t._id}\n className={`docman-checkbox-card ${selectedIds.includes(t._id) ? 'docman-checkbox-card-selected' : ''}`}\n style={{ cursor: 'pointer' }}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(t._id)}\n onChange={() => toggleTemplate(t._id)}\n style={{ marginTop: '2px' }}\n />\n <div>\n <div style={{ fontWeight: 600, fontSize: '0.875rem' }}>{t.name}</div>\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)' }}>\n {t.fields.length} fields · {t.pages} page{t.pages !== 1 ? 's' : ''}\n </div>\n </div>\n </label>\n ))}\n </div>\n </>\n )}\n\n {(htmlResult?.data.length ?? 0) > 0 && (\n <>\n <h3 style={{ margin: '0 0 var(--docman-space-sm)' }}>HTML Templates</h3>\n <div className=\"docman-checkbox-grid\" style={{ marginBottom: 'var(--docman-space-lg)' }}>\n {htmlResult!.data.map((t) => (\n <label\n key={t._id}\n className={`docman-checkbox-card ${selectedIds.includes(t._id) ? 'docman-checkbox-card-selected' : ''}`}\n style={{ cursor: 'pointer' }}\n >\n <input\n type=\"checkbox\"\n checked={selectedIds.includes(t._id)}\n onChange={() => toggleTemplate(t._id)}\n style={{ marginTop: '2px' }}\n />\n <div>\n <div style={{ fontWeight: 600, fontSize: '0.875rem' }}>{t.name}</div>\n <div style={{ fontSize: '0.8rem', color: 'var(--docman-color-text-secondary)' }}>\n {t.variables.length} variables · {t.landscape ? 'Landscape' : 'Portrait'}\n </div>\n </div>\n </label>\n ))}\n </div>\n </>\n )}\n\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={() => setStep('fields')}\n disabled={selectedIds.length === 0}\n >\n Continue with {selectedIds.length} template{selectedIds.length !== 1 ? 's' : ''} →\n </button>\n </div>\n </>\n )}\n </div>\n )}\n\n {/* ── Step 2: Fill in data ── */}\n {step === 'fields' && (\n <div>\n {introspecting && <LoadingSpinner label=\"Detecting form fields…\" />}\n {introspectError && <ErrorAlert message={introspectError} />}\n {generateError && <ErrorAlert message={generateError} />}\n\n {!introspecting && (\n <>\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"gen-name\">Document name *</label>\n <input\n id=\"gen-name\"\n className=\"docman-input\"\n type=\"text\"\n value={docName}\n onChange={(e) => setDocName(e.target.value)}\n placeholder=\"e.g. Quote for Acme Corp\"\n />\n </div>\n\n <div className=\"docman-field\">\n <label className=\"docman-label\" htmlFor=\"gen-desc\">Description</label>\n <input\n id=\"gen-desc\"\n className=\"docman-input\"\n type=\"text\"\n value={docDescription}\n onChange={(e) => setDocDescription(e.target.value)}\n placeholder=\"Optional\"\n />\n </div>\n\n {allFieldKeys.length > 0 && (\n <>\n <h3 style={{ margin: 'var(--docman-space-lg) 0 var(--docman-space-sm)' }}>Template fields</h3>\n <div style={{ display: 'grid', gridTemplateColumns: 'repeat(auto-fill, minmax(260px, 1fr))', gap: 'var(--docman-space-md)' }}>\n {allFieldKeys.map((key) => {\n const pdfField = allPdfFields.find((f) => f.name === key)\n const isCheckbox = pdfField?.type === 'checkbox'\n return (\n <div key={key} className=\"docman-field\" style={{ margin: 0 }}>\n <label className=\"docman-label\" htmlFor={`field-${key}`}>\n {key}\n {pdfField?.required && <span style={{ color: 'var(--docman-color-danger)' }}> *</span>}\n </label>\n {isCheckbox\n ? (\n <select\n id={`field-${key}`}\n className=\"docman-select\"\n value={fieldValues[key] ?? ''}\n onChange={(e: ChangeEvent<HTMLSelectElement>) => handleFieldChange(key, e.target.value)}\n >\n <option value=\"\">— select —</option>\n <option value=\"Yes\">Yes</option>\n <option value=\"No\">No</option>\n </select>\n )\n : (\n <input\n id={`field-${key}`}\n className=\"docman-input\"\n type=\"text\"\n value={fieldValues[key] ?? ''}\n onChange={(e) => handleFieldChange(key, e.target.value)}\n placeholder={key}\n />\n )\n }\n </div>\n )\n })}\n </div>\n </>\n )}\n\n {allFieldKeys.length === 0 && (\n <div style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.875rem', margin: 'var(--docman-space-md) 0' }}>\n No form fields detected. Enter a document name and generate.\n </div>\n )}\n\n <div style={{ display: 'flex', gap: 'var(--docman-space-sm)', justifyContent: 'flex-end', marginTop: 'var(--docman-space-lg)' }}>\n <button className=\"docman-btn docman-btn-secondary\" onClick={() => setStep('select')} disabled={generating}>\n ← Back\n </button>\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={handleGenerate}\n disabled={generating}\n >\n {generating ? 'Generating…' : 'Generate Document'}\n </button>\n </div>\n </>\n )}\n </div>\n )}\n\n {/* ── Step 3: Result ── */}\n {step === 'generate' && result && (\n <div className=\"docman-card\" style={{ textAlign: 'center' }}>\n <div style={{ fontSize: '3rem', marginBottom: 'var(--docman-space-sm)' }}>✅</div>\n <h3 style={{ margin: '0 0 var(--docman-space-sm)' }}>Document generated!</h3>\n <p style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.875rem', margin: '0 0 var(--docman-space-lg)' }}>\n {result.pages} page{result.pages !== 1 ? 's' : ''} · {(result.sizeBytes / 1024).toFixed(1)} KB\n </p>\n <div style={{ display: 'flex', gap: 'var(--docman-space-sm)', justifyContent: 'center', flexWrap: 'wrap' }}>\n <a\n href={result.downloadUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"docman-btn docman-btn-primary\"\n >\n Download PDF\n </a>\n <a\n href={result.publicUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"docman-btn docman-btn-secondary\"\n >\n Share link\n </a>\n <button className=\"docman-btn docman-btn-secondary\" onClick={reset}>\n Generate another\n </button>\n </div>\n </div>\n )}\n </div>\n )\n}\n","'use client'\n\nimport { useState, useRef, type ReactNode, type ChangeEvent } from 'react'\nimport { useDocmanClient } from '../hooks/useDocmanClient.js'\nimport { ErrorAlert } from '../shared/ErrorAlert.js'\n\nexport interface OperationsPanelProps {\n readonly className?: string\n}\n\ntype Tab = 'merge' | 'split'\n\nfunction toUint8(b: Uint8Array): Uint8Array<ArrayBuffer> {\n return b as unknown as Uint8Array<ArrayBuffer>\n}\n\nfunction downloadBlob(blob: Blob, filename: string) {\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = filename\n a.click()\n URL.revokeObjectURL(url)\n}\n\nfunction MergeTab(): ReactNode {\n const client = useDocmanClient()\n const [files, setFiles] = useState<File[]>([])\n const [merging, setMerging] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n function handleFilesChange(e: ChangeEvent<HTMLInputElement>) {\n const selected = Array.from(e.target.files ?? [])\n setFiles((prev) => [...prev, ...selected])\n }\n\n function removeFile(index: number) {\n setFiles((prev) => prev.filter((_, i) => i !== index))\n }\n\n async function handleMerge() {\n if (files.length < 2) {\n setError('Please select at least 2 PDF files to merge.')\n return\n }\n setError(null)\n setMerging(true)\n try {\n const buffers = await Promise.all(files.map((f) => f.arrayBuffer().then((b) => new Uint8Array(b))))\n const merged = await client.merge(buffers)\n downloadBlob(new Blob([toUint8(merged)], { type: 'application/pdf' }), 'merged.pdf')\n setFiles([])\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setMerging(false)\n }\n }\n\n return (\n <div>\n <p style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.875rem', marginTop: 0 }}>\n Combine multiple PDFs into a single file in the order listed below.\n </p>\n\n {error && <ErrorAlert message={error} />}\n\n <div\n className=\"docman-dropzone\"\n onClick={() => inputRef.current?.click()}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n aria-label=\"Click to add PDF files\"\n >\n <div>+ Add PDF files</div>\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/pdf\"\n multiple\n style={{ display: 'none' }}\n onChange={handleFilesChange}\n />\n </div>\n\n {files.length > 0 && (\n <div style={{ marginTop: 'var(--docman-space-md)' }}>\n {files.map((f, i) => (\n <div\n key={i}\n style={{\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: 'var(--docman-space-sm) var(--docman-space-md)',\n border: '1px solid var(--docman-color-border)',\n borderRadius: 'var(--docman-radius-md)',\n marginBottom: 'var(--docman-space-sm)',\n background: 'var(--docman-color-surface)',\n }}\n >\n <span style={{ fontSize: '0.875rem' }}>{i + 1}. {f.name}</span>\n <button className=\"docman-btn docman-btn-danger docman-btn-sm\" onClick={() => removeFile(i)}>\n Remove\n </button>\n </div>\n ))}\n </div>\n )}\n\n <div style={{ marginTop: 'var(--docman-space-lg)', display: 'flex', justifyContent: 'flex-end' }}>\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={handleMerge}\n disabled={merging || files.length < 2}\n >\n {merging ? 'Merging…' : `Merge ${files.length} files`}\n </button>\n </div>\n </div>\n )\n}\n\nfunction SplitTab(): ReactNode {\n const client = useDocmanClient()\n const [file, setFile] = useState<File | null>(null)\n const [pages, setPages] = useState('')\n const [splitting, setSplitting] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const inputRef = useRef<HTMLInputElement>(null)\n\n async function handleSplit() {\n if (!file) {\n setError('Please select a PDF file.')\n return\n }\n if (!pages.trim()) {\n setError('Please enter a page selection (e.g. \"1-3,5,7-9\").')\n return\n }\n setError(null)\n setSplitting(true)\n\n try {\n const buffer = new Uint8Array(await file.arrayBuffer())\n\n // Parse \"1-3,5,7-9\" into ranges\n const ranges = pages.split(',').map((part) => {\n const [start, end] = part.trim().split('-').map(Number)\n return { start, end: end ?? start }\n })\n\n const parts = await client.split(buffer, ranges)\n\n for (const part of parts) {\n const name = parts.length === 1\n ? `split-p${part.range.start}-${part.range.end}.pdf`\n : `split-part-${part.index + 1}.pdf`\n downloadBlob(new Blob([toUint8(part.buffer)], { type: 'application/pdf' }), name)\n }\n\n setPages('')\n setFile(null)\n } catch (err) {\n setError((err as Error).message)\n } finally {\n setSplitting(false)\n }\n }\n\n return (\n <div>\n <p style={{ color: 'var(--docman-color-text-secondary)', fontSize: '0.875rem', marginTop: 0 }}>\n Extract pages from a PDF. Enter page ranges like <code>1-3,5,7-9</code>.\n </p>\n\n {error && <ErrorAlert message={error} />}\n\n <div\n className=\"docman-dropzone\"\n onClick={() => inputRef.current?.click()}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => e.key === 'Enter' && inputRef.current?.click()}\n aria-label=\"Click to select a PDF file\"\n >\n {file ? <div style={{ fontWeight: 500 }}>{file.name}</div> : <div>Click to select a PDF</div>}\n <input\n ref={inputRef}\n type=\"file\"\n accept=\"application/pdf\"\n style={{ display: 'none' }}\n onChange={(e) => setFile(e.target.files?.[0] ?? null)}\n />\n </div>\n\n <div className=\"docman-field\" style={{ marginTop: 'var(--docman-space-md)' }}>\n <label className=\"docman-label\" htmlFor=\"split-pages\">Page selection</label>\n <input\n id=\"split-pages\"\n className=\"docman-input\"\n type=\"text\"\n value={pages}\n onChange={(e) => setPages(e.target.value)}\n placeholder=\"e.g. 1-3,5,7-9\"\n />\n </div>\n\n <div style={{ display: 'flex', justifyContent: 'flex-end' }}>\n <button\n className=\"docman-btn docman-btn-primary\"\n onClick={handleSplit}\n disabled={splitting || !file}\n >\n {splitting ? 'Splitting…' : 'Split & Download'}\n </button>\n </div>\n </div>\n )\n}\n\nexport function OperationsPanel({ className }: OperationsPanelProps): ReactNode {\n const [tab, setTab] = useState<Tab>('merge')\n\n return (\n <div className={`docman-ui ${className ?? ''}`}>\n <div className=\"docman-header\">\n <h2 className=\"docman-title\">PDF Operations</h2>\n </div>\n\n <div className=\"docman-tabs\">\n <button\n className={`docman-tab ${tab === 'merge' ? 'docman-tab-active' : ''}`}\n onClick={() => setTab('merge')}\n >\n Merge\n </button>\n <button\n className={`docman-tab ${tab === 'split' ? 'docman-tab-active' : ''}`}\n onClick={() => setTab('split')}\n >\n Split\n </button>\n </div>\n\n <div className=\"docman-card\">\n {tab === 'merge' ? <MergeTab /> : <SplitTab />}\n </div>\n </div>\n )\n}\n"],"mappings":"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","names":["import_react","import_react","import_react","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_jsx_runtime","toUint8"]}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { D as DocmanClient } from '../client-CdjgCtrw.cjs';
|
|
4
|
+
import { h as ListResult, j as PdfTemplate, H as HtmlTemplate, m as TemplateGroup, c as DocmanDocument, e as GenerateResult } from '../types-DvQ8gX3k.cjs';
|
|
5
|
+
|
|
6
|
+
interface DocmanProviderProps {
|
|
7
|
+
/**
|
|
8
|
+
* Base URL for docman API calls.
|
|
9
|
+
*
|
|
10
|
+
* In docman-web set this to "/api/docman" — the Next.js proxy route adds
|
|
11
|
+
* the Bearer token server-side so secrets never reach the browser.
|
|
12
|
+
*
|
|
13
|
+
* In other consumers you can point this directly at DOCMAN_URL if your
|
|
14
|
+
* host handles auth injection (e.g. a server-side wrapper).
|
|
15
|
+
*/
|
|
16
|
+
readonly baseUrl: string;
|
|
17
|
+
readonly children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
declare function DocmanProvider({ baseUrl, children }: DocmanProviderProps): react_jsx_runtime.JSX.Element;
|
|
20
|
+
|
|
21
|
+
declare function useDocmanClient(): DocmanClient;
|
|
22
|
+
|
|
23
|
+
interface UsePdfTemplatesOptions {
|
|
24
|
+
readonly page?: number;
|
|
25
|
+
readonly limit?: number;
|
|
26
|
+
readonly archived?: boolean;
|
|
27
|
+
}
|
|
28
|
+
interface UsePdfTemplatesReturn {
|
|
29
|
+
readonly result: ListResult<PdfTemplate> | null;
|
|
30
|
+
readonly loading: boolean;
|
|
31
|
+
readonly error: string | null;
|
|
32
|
+
readonly refresh: () => void;
|
|
33
|
+
}
|
|
34
|
+
declare function usePdfTemplates(options?: UsePdfTemplatesOptions): UsePdfTemplatesReturn;
|
|
35
|
+
|
|
36
|
+
interface UseHtmlTemplatesOptions {
|
|
37
|
+
readonly page?: number;
|
|
38
|
+
readonly limit?: number;
|
|
39
|
+
readonly archived?: boolean;
|
|
40
|
+
}
|
|
41
|
+
interface UseHtmlTemplatesReturn {
|
|
42
|
+
readonly result: ListResult<HtmlTemplate> | null;
|
|
43
|
+
readonly loading: boolean;
|
|
44
|
+
readonly error: string | null;
|
|
45
|
+
readonly refresh: () => void;
|
|
46
|
+
}
|
|
47
|
+
declare function useHtmlTemplates(options?: UseHtmlTemplatesOptions): UseHtmlTemplatesReturn;
|
|
48
|
+
|
|
49
|
+
interface UseTemplateGroupsReturn {
|
|
50
|
+
readonly result: ListResult<TemplateGroup> | null;
|
|
51
|
+
readonly loading: boolean;
|
|
52
|
+
readonly error: string | null;
|
|
53
|
+
readonly refresh: () => void;
|
|
54
|
+
}
|
|
55
|
+
declare function useTemplateGroups(page?: number, limit?: number): UseTemplateGroupsReturn;
|
|
56
|
+
|
|
57
|
+
interface UseDocumentsReturn {
|
|
58
|
+
readonly result: ListResult<DocmanDocument> | null;
|
|
59
|
+
readonly loading: boolean;
|
|
60
|
+
readonly error: string | null;
|
|
61
|
+
readonly refresh: () => void;
|
|
62
|
+
}
|
|
63
|
+
declare function useDocuments(page?: number, limit?: number): UseDocumentsReturn;
|
|
64
|
+
|
|
65
|
+
interface PdfTemplateListProps {
|
|
66
|
+
readonly onUploadSuccess?: (template: PdfTemplate) => void;
|
|
67
|
+
readonly showUploadButton?: boolean;
|
|
68
|
+
readonly pageSize?: number;
|
|
69
|
+
readonly className?: string;
|
|
70
|
+
}
|
|
71
|
+
declare function PdfTemplateList({ onUploadSuccess, showUploadButton, pageSize, className, }: PdfTemplateListProps): ReactNode;
|
|
72
|
+
|
|
73
|
+
interface PdfTemplateUploaderProps {
|
|
74
|
+
readonly onSuccess?: (template: PdfTemplate) => void;
|
|
75
|
+
readonly onCancel?: () => void;
|
|
76
|
+
readonly className?: string;
|
|
77
|
+
}
|
|
78
|
+
declare function PdfTemplateUploader({ onSuccess, onCancel, className }: PdfTemplateUploaderProps): ReactNode;
|
|
79
|
+
|
|
80
|
+
interface HtmlTemplateListProps {
|
|
81
|
+
readonly onCreateSuccess?: (template: HtmlTemplate) => void;
|
|
82
|
+
readonly showCreateButton?: boolean;
|
|
83
|
+
readonly pageSize?: number;
|
|
84
|
+
readonly className?: string;
|
|
85
|
+
}
|
|
86
|
+
declare function HtmlTemplateList({ onCreateSuccess, showCreateButton, pageSize, className, }: HtmlTemplateListProps): ReactNode;
|
|
87
|
+
|
|
88
|
+
interface HtmlTemplateEditorProps {
|
|
89
|
+
readonly templateId?: string;
|
|
90
|
+
readonly initialHtml?: string;
|
|
91
|
+
readonly onSave?: (template: HtmlTemplate) => void;
|
|
92
|
+
readonly onCancel?: () => void;
|
|
93
|
+
readonly className?: string;
|
|
94
|
+
}
|
|
95
|
+
declare function HtmlTemplateEditor({ templateId, initialHtml, onSave, onCancel, className, }: HtmlTemplateEditorProps): ReactNode;
|
|
96
|
+
|
|
97
|
+
interface TemplateGroupListProps {
|
|
98
|
+
readonly onSelect?: (group: TemplateGroup) => void;
|
|
99
|
+
readonly pageSize?: number;
|
|
100
|
+
readonly className?: string;
|
|
101
|
+
}
|
|
102
|
+
declare function TemplateGroupList({ onSelect, pageSize, className }: TemplateGroupListProps): ReactNode;
|
|
103
|
+
|
|
104
|
+
interface DocumentListProps {
|
|
105
|
+
readonly pageSize?: number;
|
|
106
|
+
readonly className?: string;
|
|
107
|
+
}
|
|
108
|
+
declare function DocumentList({ pageSize, className }: DocumentListProps): ReactNode;
|
|
109
|
+
|
|
110
|
+
interface DocumentGeneratorProps {
|
|
111
|
+
readonly initialTemplateIds?: readonly string[];
|
|
112
|
+
readonly onSuccess?: (result: GenerateResult) => void;
|
|
113
|
+
readonly className?: string;
|
|
114
|
+
}
|
|
115
|
+
declare function DocumentGenerator({ initialTemplateIds, onSuccess, className }: DocumentGeneratorProps): ReactNode;
|
|
116
|
+
|
|
117
|
+
interface OperationsPanelProps {
|
|
118
|
+
readonly className?: string;
|
|
119
|
+
}
|
|
120
|
+
declare function OperationsPanel({ className }: OperationsPanelProps): ReactNode;
|
|
121
|
+
|
|
122
|
+
export { DocmanProvider, type DocmanProviderProps, DocumentGenerator, type DocumentGeneratorProps, DocumentList, type DocumentListProps, HtmlTemplateEditor, type HtmlTemplateEditorProps, HtmlTemplateList, type HtmlTemplateListProps, OperationsPanel, type OperationsPanelProps, PdfTemplateList, type PdfTemplateListProps, PdfTemplateUploader, type PdfTemplateUploaderProps, TemplateGroupList, type TemplateGroupListProps, type UseDocumentsReturn, type UseHtmlTemplatesOptions, type UseHtmlTemplatesReturn, type UsePdfTemplatesOptions, type UsePdfTemplatesReturn, type UseTemplateGroupsReturn, useDocmanClient, useDocuments, useHtmlTemplates, usePdfTemplates, useTemplateGroups };
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { D as DocmanClient } from '../client-nlarq_ao.js';
|
|
4
|
+
import { h as ListResult, j as PdfTemplate, H as HtmlTemplate, m as TemplateGroup, c as DocmanDocument, e as GenerateResult } from '../types-DvQ8gX3k.js';
|
|
5
|
+
|
|
6
|
+
interface DocmanProviderProps {
|
|
7
|
+
/**
|
|
8
|
+
* Base URL for docman API calls.
|
|
9
|
+
*
|
|
10
|
+
* In docman-web set this to "/api/docman" — the Next.js proxy route adds
|
|
11
|
+
* the Bearer token server-side so secrets never reach the browser.
|
|
12
|
+
*
|
|
13
|
+
* In other consumers you can point this directly at DOCMAN_URL if your
|
|
14
|
+
* host handles auth injection (e.g. a server-side wrapper).
|
|
15
|
+
*/
|
|
16
|
+
readonly baseUrl: string;
|
|
17
|
+
readonly children: ReactNode;
|
|
18
|
+
}
|
|
19
|
+
declare function DocmanProvider({ baseUrl, children }: DocmanProviderProps): react_jsx_runtime.JSX.Element;
|
|
20
|
+
|
|
21
|
+
declare function useDocmanClient(): DocmanClient;
|
|
22
|
+
|
|
23
|
+
interface UsePdfTemplatesOptions {
|
|
24
|
+
readonly page?: number;
|
|
25
|
+
readonly limit?: number;
|
|
26
|
+
readonly archived?: boolean;
|
|
27
|
+
}
|
|
28
|
+
interface UsePdfTemplatesReturn {
|
|
29
|
+
readonly result: ListResult<PdfTemplate> | null;
|
|
30
|
+
readonly loading: boolean;
|
|
31
|
+
readonly error: string | null;
|
|
32
|
+
readonly refresh: () => void;
|
|
33
|
+
}
|
|
34
|
+
declare function usePdfTemplates(options?: UsePdfTemplatesOptions): UsePdfTemplatesReturn;
|
|
35
|
+
|
|
36
|
+
interface UseHtmlTemplatesOptions {
|
|
37
|
+
readonly page?: number;
|
|
38
|
+
readonly limit?: number;
|
|
39
|
+
readonly archived?: boolean;
|
|
40
|
+
}
|
|
41
|
+
interface UseHtmlTemplatesReturn {
|
|
42
|
+
readonly result: ListResult<HtmlTemplate> | null;
|
|
43
|
+
readonly loading: boolean;
|
|
44
|
+
readonly error: string | null;
|
|
45
|
+
readonly refresh: () => void;
|
|
46
|
+
}
|
|
47
|
+
declare function useHtmlTemplates(options?: UseHtmlTemplatesOptions): UseHtmlTemplatesReturn;
|
|
48
|
+
|
|
49
|
+
interface UseTemplateGroupsReturn {
|
|
50
|
+
readonly result: ListResult<TemplateGroup> | null;
|
|
51
|
+
readonly loading: boolean;
|
|
52
|
+
readonly error: string | null;
|
|
53
|
+
readonly refresh: () => void;
|
|
54
|
+
}
|
|
55
|
+
declare function useTemplateGroups(page?: number, limit?: number): UseTemplateGroupsReturn;
|
|
56
|
+
|
|
57
|
+
interface UseDocumentsReturn {
|
|
58
|
+
readonly result: ListResult<DocmanDocument> | null;
|
|
59
|
+
readonly loading: boolean;
|
|
60
|
+
readonly error: string | null;
|
|
61
|
+
readonly refresh: () => void;
|
|
62
|
+
}
|
|
63
|
+
declare function useDocuments(page?: number, limit?: number): UseDocumentsReturn;
|
|
64
|
+
|
|
65
|
+
interface PdfTemplateListProps {
|
|
66
|
+
readonly onUploadSuccess?: (template: PdfTemplate) => void;
|
|
67
|
+
readonly showUploadButton?: boolean;
|
|
68
|
+
readonly pageSize?: number;
|
|
69
|
+
readonly className?: string;
|
|
70
|
+
}
|
|
71
|
+
declare function PdfTemplateList({ onUploadSuccess, showUploadButton, pageSize, className, }: PdfTemplateListProps): ReactNode;
|
|
72
|
+
|
|
73
|
+
interface PdfTemplateUploaderProps {
|
|
74
|
+
readonly onSuccess?: (template: PdfTemplate) => void;
|
|
75
|
+
readonly onCancel?: () => void;
|
|
76
|
+
readonly className?: string;
|
|
77
|
+
}
|
|
78
|
+
declare function PdfTemplateUploader({ onSuccess, onCancel, className }: PdfTemplateUploaderProps): ReactNode;
|
|
79
|
+
|
|
80
|
+
interface HtmlTemplateListProps {
|
|
81
|
+
readonly onCreateSuccess?: (template: HtmlTemplate) => void;
|
|
82
|
+
readonly showCreateButton?: boolean;
|
|
83
|
+
readonly pageSize?: number;
|
|
84
|
+
readonly className?: string;
|
|
85
|
+
}
|
|
86
|
+
declare function HtmlTemplateList({ onCreateSuccess, showCreateButton, pageSize, className, }: HtmlTemplateListProps): ReactNode;
|
|
87
|
+
|
|
88
|
+
interface HtmlTemplateEditorProps {
|
|
89
|
+
readonly templateId?: string;
|
|
90
|
+
readonly initialHtml?: string;
|
|
91
|
+
readonly onSave?: (template: HtmlTemplate) => void;
|
|
92
|
+
readonly onCancel?: () => void;
|
|
93
|
+
readonly className?: string;
|
|
94
|
+
}
|
|
95
|
+
declare function HtmlTemplateEditor({ templateId, initialHtml, onSave, onCancel, className, }: HtmlTemplateEditorProps): ReactNode;
|
|
96
|
+
|
|
97
|
+
interface TemplateGroupListProps {
|
|
98
|
+
readonly onSelect?: (group: TemplateGroup) => void;
|
|
99
|
+
readonly pageSize?: number;
|
|
100
|
+
readonly className?: string;
|
|
101
|
+
}
|
|
102
|
+
declare function TemplateGroupList({ onSelect, pageSize, className }: TemplateGroupListProps): ReactNode;
|
|
103
|
+
|
|
104
|
+
interface DocumentListProps {
|
|
105
|
+
readonly pageSize?: number;
|
|
106
|
+
readonly className?: string;
|
|
107
|
+
}
|
|
108
|
+
declare function DocumentList({ pageSize, className }: DocumentListProps): ReactNode;
|
|
109
|
+
|
|
110
|
+
interface DocumentGeneratorProps {
|
|
111
|
+
readonly initialTemplateIds?: readonly string[];
|
|
112
|
+
readonly onSuccess?: (result: GenerateResult) => void;
|
|
113
|
+
readonly className?: string;
|
|
114
|
+
}
|
|
115
|
+
declare function DocumentGenerator({ initialTemplateIds, onSuccess, className }: DocumentGeneratorProps): ReactNode;
|
|
116
|
+
|
|
117
|
+
interface OperationsPanelProps {
|
|
118
|
+
readonly className?: string;
|
|
119
|
+
}
|
|
120
|
+
declare function OperationsPanel({ className }: OperationsPanelProps): ReactNode;
|
|
121
|
+
|
|
122
|
+
export { DocmanProvider, type DocmanProviderProps, DocumentGenerator, type DocumentGeneratorProps, DocumentList, type DocumentListProps, HtmlTemplateEditor, type HtmlTemplateEditorProps, HtmlTemplateList, type HtmlTemplateListProps, OperationsPanel, type OperationsPanelProps, PdfTemplateList, type PdfTemplateListProps, PdfTemplateUploader, type PdfTemplateUploaderProps, TemplateGroupList, type TemplateGroupListProps, type UseDocumentsReturn, type UseHtmlTemplatesOptions, type UseHtmlTemplatesReturn, type UsePdfTemplatesOptions, type UsePdfTemplatesReturn, type UseTemplateGroupsReturn, useDocmanClient, useDocuments, useHtmlTemplates, usePdfTemplates, useTemplateGroups };
|