Add display frames and improve create-page page management.

Store phone/tablet/photo-frame shells with catalogs, append pages from extra images or PDFs, and reorder drafts with drag-and-drop.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-08-20 14:20:16 +03:30
co-authored by Cursor
parent 16cd3197ef
commit c236b0f621
23 changed files with 1069 additions and 134 deletions
+1
View File
@@ -31,6 +31,7 @@ describe("catalog repo", () => {
const found = repo.getById("abc12xyz90");
expect(found).toEqual(created);
expect(found?.flipMs).toBe(1000);
expect(found?.frame).toBe("none");
expect(found?.deleteToken).toBe("token-token-token-token-12");
});
+15
View File
@@ -26,6 +26,7 @@ function form(pages: File[], extra: Record<string, string> = {}) {
data.set("title", extra.title ?? "");
data.set("effect", extra.effect ?? "magazine");
if (extra.flipMs) data.set("flipMs", extra.flipMs);
if (extra.frame) data.set("frame", extra.frame);
for (const page of pages) data.append("pages", page);
return data;
}
@@ -56,6 +57,7 @@ describe("catalog HTTP API", () => {
expect(publicBody.title).toBe("نمونه");
expect(publicBody.pageCount).toBe(2);
expect(publicBody.flipMs).toBe(1000);
expect(publicBody.frame).toBe("none");
expect(publicBody.deleteToken).toBeUndefined();
expect(JSON.stringify(publicBody)).not.toContain("delete");
});
@@ -73,6 +75,19 @@ describe("catalog HTTP API", () => {
expect((await pub.json()).flipMs).toBe(1800);
});
it("stores a catalog frame", async () => {
const app = await testApp();
const created = await app.request("/api/catalogs", {
method: "POST",
body: form([jpegFile()], { frame: "phone" }),
headers: { "x-forwarded-for": "10.0.0.21" },
});
expect(created.status).toBe(201);
const { id } = await created.json();
const pub = await app.request(`/api/catalogs/${id}`);
expect((await pub.json()).frame).toBe("phone");
});
it("clamps flip duration to the allowed range", async () => {
const app = await testApp();
const tooFast = await app.request("/api/catalogs", {