Reorder files
							parent
							
								
									6e261b147d
								
							
						
					
					
						commit
						91f8150bf7
					
				| @ -1,8 +1,10 @@ | |||||||
| export default function html(body: string): string { | export default function html(body: string): string { | ||||||
| 	return /* HTML */ `<!DOCTYPE html>
 | 	return /* HTML */ `<!DOCTYPE html>
 | ||||||
| 		<html> | 		<html> | ||||||
|  | 			<head> | ||||||
|  | 				<script src="/dist/bundle.js"></script> | ||||||
|  | 			</head> | ||||||
| 			<link href="/style.css" rel="stylesheet" type="text/css" /> | 			<link href="/style.css" rel="stylesheet" type="text/css" /> | ||||||
| 			${body} | 			${body} | ||||||
| 			<script src="/dist/bundle.js"></script> |  | ||||||
| 		</html>`;
 | 		</html>`;
 | ||||||
| } | } | ||||||
|  | |||||||
| @ -0,0 +1,20 @@ | |||||||
|  | import Router from "@koa/router"; | ||||||
|  | import { Context, Middlewares } from "sealious"; | ||||||
|  | import html from "../html"; | ||||||
|  | import { NewTask, TaskList } from "../views/tasks"; | ||||||
|  | 
 | ||||||
|  | const router = new Router(); | ||||||
|  | 
 | ||||||
|  | export async function MainView(context: Context) { | ||||||
|  | 	return html(/* HTML */ `<title>My ToDo App</title>
 | ||||||
|  | 		<body> | ||||||
|  | 			<h1>My ToDo App</h1> | ||||||
|  | 			${await TaskList(context)} ${NewTask()} | ||||||
|  | 		</body>`);
 | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | router.get("/", Middlewares.extractContext(), async (ctx) => { | ||||||
|  | 	ctx.body = await MainView(ctx.$context); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | export default router; | ||||||
| @ -0,0 +1,31 @@ | |||||||
|  | import Router from "@koa/router"; | ||||||
|  | import { Middlewares } from "sealious"; | ||||||
|  | import { MainView } from "./homepage"; | ||||||
|  | 
 | ||||||
|  | const router = new Router(); | ||||||
|  | 
 | ||||||
|  | router.post( | ||||||
|  | 	"/", | ||||||
|  | 	Middlewares.extractContext(), | ||||||
|  | 	Middlewares.parseBody(), | ||||||
|  | 	async (ctx) => { | ||||||
|  | 		await ctx.$app.collections.tasks | ||||||
|  | 			.make({ | ||||||
|  | 				title: ctx.$body.title as string, | ||||||
|  | 				done: false, | ||||||
|  | 			}) | ||||||
|  | 			.save(ctx.$context); | ||||||
|  | 		ctx.body = await MainView(ctx.$context); | ||||||
|  | 	} | ||||||
|  | ); | ||||||
|  | 
 | ||||||
|  | router.delete("/:task_id", Middlewares.extractContext(), async (ctx) => { | ||||||
|  | 	const task = await ctx.$app.collections.tasks.getByID( | ||||||
|  | 		ctx.$context, | ||||||
|  | 		ctx.params.task_id | ||||||
|  | 	); | ||||||
|  | 	await task.remove(ctx.$context); | ||||||
|  | 	ctx.body = await MainView(ctx.$context); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | export default router; | ||||||
| @ -0,0 +1,58 @@ | |||||||
|  | import { CollectionItem, Context } from "sealious"; | ||||||
|  | import frame from "../frame"; | ||||||
|  | 
 | ||||||
|  | export function Task(task: CollectionItem<any>) { | ||||||
|  | 	return frame( | ||||||
|  | 		`task-${task.id}`, | ||||||
|  | 		/* HTML */ `<li class="task">
 | ||||||
|  | 			<input | ||||||
|  | 				type="checkbox" | ||||||
|  | 				data-controller="task" | ||||||
|  | 				data-action="task#toggle" | ||||||
|  | 				data-id="${task.id}" | ||||||
|  | 				${task.get("done") ? "checked" : ""} | ||||||
|  | 			/> | ||||||
|  | 			${task.get("title")} | ||||||
|  | 			<form | ||||||
|  | 				method="DELETE" | ||||||
|  | 				action="/tasks/${task.id}" | ||||||
|  | 				data-turbo-frame="task-list" | ||||||
|  | 			> | ||||||
|  | 				<input class="delete-button" type="submit" value="🗑" /> | ||||||
|  | 			</form> | ||||||
|  | 		</li>` | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export async function TaskList(context: Context) { | ||||||
|  | 	const { items: tasks } = await context.app.collections.tasks | ||||||
|  | 		.list(context) | ||||||
|  | 		.fetch(); | ||||||
|  | 	return frame( | ||||||
|  | 		"task-list", | ||||||
|  | 		/* HTML */ ` | ||||||
|  | 			<ul> | ||||||
|  | 				${tasks.map(Task).join("\n")} | ||||||
|  | 			</ul> | ||||||
|  | 		` | ||||||
|  | 	); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export function NewTask() { | ||||||
|  | 	return frame( | ||||||
|  | 		"new-task", | ||||||
|  | 		/* HTML */ `<form
 | ||||||
|  | 			method="POST" | ||||||
|  | 			action="/tasks" | ||||||
|  | 			data-turbo-frame="task-list" | ||||||
|  | 		> | ||||||
|  | 			<input | ||||||
|  | 				id="new-task-title" | ||||||
|  | 				type="text" | ||||||
|  | 				placeholder="write an app" | ||||||
|  | 				name="title" | ||||||
|  | 			/> | ||||||
|  | 			<input type="submit" value="Add" /> | ||||||
|  | 		</form>` | ||||||
|  | 	); | ||||||
|  | } | ||||||
					Loading…
					
					
				
		Reference in New Issue