import http from './client' import type { BatchDeleteResult, PageQuery, PageResult } from './types' /** Mirrors `app.schemas.template_field_library.TemplateFieldLibraryRead`. */ export interface TemplateFieldLibrary { id: number /** Display name, numbering included — e.g. `1. Introduction`. */ name: string /** Heading depth: 1 for `1.`, 2 for `1.1`. A rendering hint, not a parent. */ level: number /** Points. Fractional, because 五号 = 10.5pt. */ font_size: number /** Canonical RGB as `#RRGGBB`. */ font_color: string created_at: string updated_at: string } /** Body for creating or updating a library field. */ export interface TemplateFieldLibraryPayload { name: string level: number font_size: number font_color: string } export interface TemplateFieldLibraryQuery extends PageQuery { level?: number | null } /** The API caps `page_size` at 500; 200 keeps responses modest while looping. */ const LIBRARY_PAGE_SIZE = 200 export async function listTemplateFieldLibrary( query: TemplateFieldLibraryQuery = {}, ): Promise> { // Drop empty filters so the URL stays clean and the backend sees "no filter" // rather than `keyword=`. const params: Record = {} if (query.keyword) params.keyword = query.keyword if (query.level != null) params.level = query.level if (query.page) params.page = query.page if (query.page_size) params.page_size = query.page_size const { data } = await http.get>( '/template-field-library', { params }, ) return data } /** * Fetch the entire library, following pagination. * * The template form needs every field, not one page, so that a field placed * deep in the library can still be shown by name in an existing selection. */ export async function fetchAllTemplateFieldLibrary(keyword?: string): Promise { const all: TemplateFieldLibrary[] = [] let page = 1 for (;;) { const result = await listTemplateFieldLibrary({ keyword, page, page_size: LIBRARY_PAGE_SIZE, }) all.push(...result.items) if (page >= result.pages || result.items.length === 0) { return all } page += 1 } } export async function createTemplateFieldLibrary( payload: TemplateFieldLibraryPayload, ): Promise { const { data } = await http.post('/template-field-library', payload) return data } export async function updateTemplateFieldLibrary( id: number, payload: Partial, ): Promise { const { data } = await http.patch(`/template-field-library/${id}`, payload) return data } export async function deleteTemplateFieldLibrary(id: number): Promise { await http.delete(`/template-field-library/${id}`) } export async function batchDeleteTemplateFieldLibrary( ids: number[], ): Promise { const { data } = await http.post('/template-field-library/batch-delete', { ids, }) return data }