- Remove per-problem Exclude/Restore buttons from EditableProblemRow - Add bulk "Exclude Selected" and "Restore Selected" buttons to selection toolbar - Add toast notifications for approve success/failure - Close viewer and refresh page after successful approve to show updated session - Fix mutation to properly await res.json() before returning 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
263 lines
7.7 KiB
TypeScript
263 lines
7.7 KiB
TypeScript
// Script to generate subtraction worksheet examples for the blog post
|
|
// Shows different scaffolding levels for subtraction problems
|
|
|
|
import fs from "fs";
|
|
import path from "path";
|
|
import { generateWorksheetPreview } from "../src/app/create/worksheets/generatePreview";
|
|
|
|
// Output directory
|
|
const outputDir = path.join(
|
|
process.cwd(),
|
|
"public",
|
|
"blog",
|
|
"subtraction-examples",
|
|
);
|
|
|
|
// Ensure output directory exists
|
|
if (!fs.existsSync(outputDir)) {
|
|
fs.mkdirSync(outputDir, { recursive: true });
|
|
}
|
|
|
|
// Generate examples showing different subtraction scaffolding options
|
|
const examples = [
|
|
{
|
|
name: "subtraction-no-borrowing",
|
|
filename: "no-borrowing.svg",
|
|
description: "Simple subtraction (no borrowing needed)",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0, // No borrowing problems
|
|
pAnyStart: 0.0,
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "never" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-with-borrow-notation",
|
|
filename: "with-borrow-notation.svg",
|
|
description: "Subtraction with borrow notation boxes",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0, // Some borrowing
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-with-hints",
|
|
filename: "with-borrowing-hints.svg",
|
|
description: "Subtraction with borrow notation and hints",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0, // Some borrowing
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: true,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-multiple-borrows",
|
|
filename: "multiple-borrows.svg",
|
|
description: "Complex subtraction with multiple borrows",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 1.0, // All problems require borrowing
|
|
pAnyStart: 1.0,
|
|
digitRange: { min: 3, max: 3 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-single-borrow",
|
|
filename: "single-borrow-ones.svg",
|
|
description: "Single borrow in ones place only",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0, // Some borrowing
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-comparison-no-notation",
|
|
filename: "comparison-no-notation.svg",
|
|
description: "Borrowing problems WITHOUT notation boxes",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0,
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "never" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: false,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-comparison-with-notation",
|
|
filename: "comparison-with-notation.svg",
|
|
description: "Same problems WITH notation boxes",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0,
|
|
digitRange: { min: 2, max: 2 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "never" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
seed: 12345, // Same seed as above for identical problems
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-cascading-borrows",
|
|
filename: "cascading-borrows.svg",
|
|
description: "Cascading borrows across multiple places",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 1.0,
|
|
pAnyStart: 1.0,
|
|
digitRange: { min: 4, max: 4 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: false,
|
|
},
|
|
},
|
|
{
|
|
name: "subtraction-hints-detail",
|
|
filename: "hints-detail.svg",
|
|
description: "Detailed view of borrowing hints",
|
|
config: {
|
|
operator: "subtraction" as const,
|
|
pAllStart: 0.0,
|
|
pAnyStart: 1.0,
|
|
digitRange: { min: 3, max: 3 },
|
|
mode: "manual" as const,
|
|
displayRules: {
|
|
carryBoxes: "never" as const,
|
|
answerBoxes: "always" as const,
|
|
placeValueColors: "always" as const,
|
|
tenFrames: "never" as const,
|
|
problemNumbers: "always" as const,
|
|
cellBorders: "always" as const,
|
|
},
|
|
showBorrowNotation: true,
|
|
showBorrowingHints: true,
|
|
problemsPerPage: 2, // Fewer problems for detail
|
|
cols: 1,
|
|
},
|
|
},
|
|
] as const;
|
|
|
|
console.log("Generating subtraction example worksheets...\n");
|
|
|
|
for (const example of examples) {
|
|
console.log(`Generating ${example.description}...`);
|
|
|
|
const config = {
|
|
problemsPerPage: 4,
|
|
pages: 1,
|
|
cols: 2,
|
|
seed: 12345, // Fixed seed for consistent examples
|
|
...example.config, // Spread example config last so it can override defaults
|
|
};
|
|
|
|
try {
|
|
const result = generateWorksheetPreview(config);
|
|
|
|
if (!result.success || !result.pages || result.pages.length === 0) {
|
|
console.error(`Failed to generate ${example.name}:`, result.error);
|
|
console.error(`Details:`, result.details);
|
|
continue;
|
|
}
|
|
|
|
// Get the first page's SVG
|
|
const svg = result.pages[0];
|
|
|
|
// Save to file
|
|
const outputPath = path.join(outputDir, example.filename);
|
|
fs.writeFileSync(outputPath, svg, "utf-8");
|
|
|
|
console.log(` ✓ Saved to ${outputPath}`);
|
|
} catch (error) {
|
|
console.error(` ✗ Error generating ${example.name}:`, error);
|
|
}
|
|
}
|
|
|
|
console.log("\nDone! Subtraction example worksheets generated.");
|
|
console.log(`\nFiles saved to: ${outputDir}`);
|