You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.7 KiB
TypeScript

import { Tasks } from "./../collections/collections";
import { tempstream } from "tempstream";
import { Context } from "koa";
import { Form, FormData, FormDataValue, Fields, Controls } from "@sealcode/sealgen";
import html from "../html";
import { TaskList } from "./common/tasks-view";
export const actionName = "Todo";
const fields = {
name: new Fields.CollectionField(true, Tasks.fields.title),
};
export const TodoShape = Fields.fieldsToShape(fields);
export default new (class TodoForm extends Form<typeof fields, void> {
defaultSuccessMessage = "Task has been successfully created";
fields = fields;
controls = [
new Controls.SimpleInput(fields.name, {
label: "Task name:",
type: "text",
placeholder: "Write an Matrix bot",
}),
new Controls.HTML("decoration", (fctx) => {
return `<input class="hidden-button" type="hidden" id="action" name="action" value="create" form="${fctx.form_id}" />`;
}),
];
async validateValues(
ctx: Context,
data: Record<string, FormDataValue>
): Promise<{ valid: boolean; error: string }> {
const { parsed: name } = await this.fields.name.getValue(ctx, data);
if ((name || "").length < 3) {
return {
valid: true,
error: "The name of the task must have at least 3 characters",
};
} else {
const filter: object = name ? { title: name } : {};
const tasks = await ctx.$app.collections.tasks
.list(ctx.$context)
.filter(filter)
.fetch();
if (tasks.empty) {
return { valid: true, error: "" };
}
return { valid: false, error: "Task with the same name already exists" };
}
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
async canAccess(ctx: Context) {
if (ctx.$context.session_id) {
return { canAccess: true, message: "" };
}
return { canAccess: false, message: "" };
}
async onSubmit(ctx: Context, data: FormData) {
const action: FormDataValue = data.raw_values.action;
switch (action) {
case "create": {
try {
await ctx.$app.collections.tasks.create(ctx.$context, {
title: String(data.raw_values.name),
done: false,
});
} catch (error) {
throw new Error();
}
console.debug(`task has been successfully created`);
break;
}
case "delete": {
const task = await ctx.$app.collections.tasks.getByID(
ctx.$context,
data.raw_values.taskId as string
);
await task.remove(ctx.$context);
console.debug(`task has been successfully removed`);
break;
}
default: {
console.debug("Wrong action");
break;
}
}
return;
}
async render(ctx: Context, data: FormData, show_field_errors: boolean) {
return html(
ctx,
"Todo",
tempstream`${await super.render(ctx, data, show_field_errors)}
${TaskList(ctx)}
`
);
}
})();