add multi-page notepad and memos toolbox tool
All checks were successful
Deploy Sokko G / deploy (push) Successful in 16s

This commit is contained in:
Shinuwa 2026-08-25 12:03:11 +02:00
parent fcabbe8029
commit 6125336338
33 changed files with 3787 additions and 138 deletions

View file

@ -12,7 +12,7 @@ import { getMonthOccurrenceSegments, getWeekGridLayout, getWeekMinutePosition, l
import { appendChecklistItems, moveChecklistItem, moveChecklistItemToCategory, renameChecklistSection } from "../website/src/features/toolboxes/modules/checklistUtils.js";
import { formatUpdatedAt, isHtmlEmpty, queryBlockFormat, queryCommandState } from "../website/src/features/toolboxes/modules/notepadUtils.js";
import { getTimePatternRecurrenceMs, getTimePatternTargetMs } from "../website/src/features/toolboxes/modules/timerUtils.js";
import { compactModuleDataForStorage, createToolboxExportPayload, normalizeCalculatorData, normalizeChecklistData, normalizeCombosData, normalizeCountersData, normalizeEquipmentPlannerData, normalizeGoalTreeData, normalizeImageAnnotationData, normalizeLinksData, normalizeModuleOrder, normalizeNotepadData, normalizeTableData, normalizeTaskPlannerData, normalizeTimerData, normalizeToolbox, normalizeUrl, summarizeEquipmentPlannerData } from "../website/src/features/toolboxes/storage/toolboxStorage.js";
import { compactModuleDataForStorage, createToolboxExportPayload, normalizeCalculatorData, normalizeChecklistData, normalizeCombosData, normalizeCountersData, normalizeEquipmentPlannerData, normalizeGoalTreeData, normalizeImageAnnotationData, normalizeLinksData, normalizeMemosData, normalizeModuleOrder, normalizeNotepadData, normalizeTableData, normalizeTaskPlannerData, normalizeTimerData, normalizeToolbox, normalizeUrl, summarizeEquipmentPlannerData } from "../website/src/features/toolboxes/storage/toolboxStorage.js";
import { applyGroupedReorderOperation, completeGroupOrder, getBoundaryItemId, getGroupedEntries, moveGroupOrder, moveGroupOrderToEnd, moveGroupOrderToStart, moveItem, moveItemGroup } from "../website/src/hooks/useGroupedReorder.js";
function createTextImportContext() {
@ -20,6 +20,7 @@ function createTextImportContext() {
return {
uid: (prefix) => `${prefix}-${index += 1}`,
normalizeNotepadData,
normalizeMemosData,
normalizeChecklistData,
normalizeLinksData,
normalizeCountersData,
@ -124,6 +125,11 @@ test("text exchange round trips simple toolbox modules and resets checklist prog
const countersImport = importModuleText("counters", exportModuleText("counters", counters), context);
assert.equal(countersImport.ok, true);
assert.deepEqual(countersImport.data.counters.map((counter) => [counter.label, counter.value]), [["Win", 12], ["Loss", -2]]);
const memos = normalizeMemosData({ items: [{ id: "m1", text: "Route", color: "#f6c453" }, { id: "m2", text: "Potion", color: "#22d3ee" }] });
const memosImport = importModuleText("memos", exportModuleText("memos", memos), context);
assert.equal(memosImport.ok, true);
assert.deepEqual(memosImport.data.items.map((memo) => [memo.text, memo.color]), [["Route", "#f6c453"], ["Potion", "#22d3ee"]]);
});
test("notepad helpers keep empty html and invalid command states stable", () => {
@ -952,8 +958,8 @@ test("notepad data migrates text, sanitizes html and compacts drawings", () => {
drawingMode: "temporary",
drawings: { strokes: normalized.drawings.strokes }
});
assert.equal(compactTemporary.drawings, undefined);
assert.equal(compactTemporary.drawingMode, undefined);
assert.equal(compactTemporary.pages[0].drawings, undefined);
assert.equal(compactTemporary.pages[0].drawingMode, undefined);
const compactPermanent = compactModuleDataForStorage("notepad", {
html: "<p>Note</p>",
@ -962,9 +968,9 @@ test("notepad data migrates text, sanitizes html and compacts drawings", () => {
drawingMode: "permanent",
drawings: normalized.drawings
});
assert.equal(compactPermanent.updatedAt, undefined);
assert.equal(compactPermanent.drawingMode, "permanent");
assert.equal(compactPermanent.drawings.strokes.length, 1);
assert.equal(compactPermanent.pages[0].updatedAt, undefined);
assert.equal(compactPermanent.pages[0].drawingMode, "permanent");
assert.equal(compactPermanent.pages[0].drawings.strokes.length, 1);
});
test("image annotation storage keeps drawing strokes as percent coordinates", () => {