(squash) init

feat: filters, settings, backups

fix: ts compile errors

feat: new dashboard, webp previews and settings

feat: use webp for pdfs

feat: use webp

fix: analyze resets old data

fix: switch to corsproxy

fix: switch to free cors

fix: max upload limit

fix: currency conversion

feat: transaction export

fix: currency conversion

feat: refactor settings actions

feat: new loader

feat: README + LICENSE

doc: update readme

doc: update readme

doc: update readme

doc: update screenshots

ci: bump prisma
This commit is contained in:
Vasily Zubarev
2025-03-13 00:30:47 +01:00
commit 0b98a2c307
153 changed files with 17271 additions and 0 deletions

131
app/settings/actions.ts Normal file
View File

@@ -0,0 +1,131 @@
"use server"
import { createCategory, deleteCategory, updateCategory } from "@/data/categories"
import { createCurrency, deleteCurrency, updateCurrency } from "@/data/currencies"
import { createField, deleteField, updateField } from "@/data/fields"
import { createProject, deleteProject, updateProject } from "@/data/projects"
import { updateSettings } from "@/data/settings"
import { settingsFormSchema } from "@/forms/settings"
import { codeFromName } from "@/lib/utils"
import { revalidatePath } from "next/cache"
import { redirect } from "next/navigation"
export async function saveSettingsAction(prevState: any, formData: FormData) {
const validatedForm = settingsFormSchema.safeParse(Object.fromEntries(formData))
if (!validatedForm.success) {
return { success: false, error: validatedForm.error.message }
}
for (const key in validatedForm.data) {
await updateSettings(key, validatedForm.data[key as keyof typeof validatedForm.data] || "")
}
revalidatePath("/settings")
redirect("/settings")
// return { success: true }
}
export async function addProjectAction(data: { name: string; llm_prompt?: string; color?: string }) {
const project = await createProject({
code: codeFromName(data.name),
name: data.name,
llm_prompt: data.llm_prompt || null,
color: data.color || "#000000",
})
revalidatePath("/settings/projects")
return project
}
export async function editProjectAction(code: string, data: { name: string; llm_prompt?: string; color?: string }) {
const project = await updateProject(code, {
name: data.name,
llm_prompt: data.llm_prompt,
color: data.color,
})
revalidatePath("/settings/projects")
return project
}
export async function deleteProjectAction(code: string) {
await deleteProject(code)
revalidatePath("/settings/projects")
}
export async function addCurrencyAction(data: { code: string; name: string }) {
const currency = await createCurrency({
code: data.code,
name: data.name,
})
revalidatePath("/settings/currencies")
return currency
}
export async function editCurrencyAction(code: string, data: { name: string }) {
const currency = await updateCurrency(code, { name: data.name })
revalidatePath("/settings/currencies")
return currency
}
export async function deleteCurrencyAction(code: string) {
await deleteCurrency(code)
revalidatePath("/settings/currencies")
}
export async function addCategoryAction(data: { name: string; llm_prompt?: string; color?: string }) {
const category = await createCategory({
code: codeFromName(data.name),
name: data.name,
llm_prompt: data.llm_prompt,
color: data.color,
})
revalidatePath("/settings/categories")
return category
}
export async function editCategoryAction(code: string, data: { name: string; llm_prompt?: string; color?: string }) {
const category = await updateCategory(code, {
name: data.name,
llm_prompt: data.llm_prompt,
color: data.color,
})
revalidatePath("/settings/categories")
return category
}
export async function deleteCategoryAction(code: string) {
await deleteCategory(code)
revalidatePath("/settings/categories")
}
export async function addFieldAction(data: { name: string; type: string; llm_prompt?: string; isRequired?: boolean }) {
const field = await createField({
code: codeFromName(data.name),
name: data.name,
type: data.type,
llm_prompt: data.llm_prompt,
isRequired: data.isRequired,
isExtra: true,
})
revalidatePath("/settings/fields")
return field
}
export async function editFieldAction(
code: string,
data: { name: string; type: string; llm_prompt?: string; isRequired?: boolean }
) {
const field = await updateField(code, {
name: data.name,
type: data.type,
llm_prompt: data.llm_prompt,
isRequired: data.isRequired,
})
revalidatePath("/settings/fields")
return field
}
export async function deleteFieldAction(code: string) {
await deleteField(code)
revalidatePath("/settings/fields")
}