Skip to content
Snippets Groups Projects
Commit 801b674e authored by Aaron Dötsch's avatar Aaron Dötsch
Browse files

Implement sorting of categories and products

Categories now have an int property and they get sorted based on that, smallest first.
Products now get sorted by the amount how often they got bought.
parent 0d10d8b7
No related branches found
No related tags found
No related merge requests found
-- AlterTable
ALTER TABLE "Item" ADD COLUMN "bought" INTEGER NOT NULL DEFAULT 0;
-- AlterTable
ALTER TABLE "ItemCategory" ADD COLUMN "position" INTEGER NOT NULL DEFAULT 0;
...@@ -12,7 +12,7 @@ datasource db { ...@@ -12,7 +12,7 @@ datasource db {
model User { model User {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
email String @unique email String
name String name String
balance Int @default(0) balance Int @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
...@@ -43,6 +43,7 @@ model Transaction { ...@@ -43,6 +43,7 @@ model Transaction {
model ItemCategory { model ItemCategory {
id Int @id @default(autoincrement()) id Int @id @default(autoincrement())
name String name String
position Int @default(0)
createdAt DateTime @default(now()) createdAt DateTime @default(now())
items Item[] items Item[]
} }
...@@ -56,6 +57,7 @@ model Item { ...@@ -56,6 +57,7 @@ model Item {
createdAt DateTime @default(now()) createdAt DateTime @default(now())
image String? image String?
stock Int @default(0) stock Int @default(0)
bought Int @default(0)
available Boolean @default(true) available Boolean @default(true)
restocks Restock[] restocks Restock[]
transactions ItemTransaction[] transactions ItemTransaction[]
......
...@@ -52,12 +52,12 @@ export async function updateArticle(code, name, price, categoryId, image, availa ...@@ -52,12 +52,12 @@ export async function updateArticle(code, name, price, categoryId, image, availa
return db.item.update({where: {code}, data: {name, price, categoryId, image, available}}); return db.item.update({where: {code}, data: {name, price, categoryId, image, available}});
} }
export async function createCategory(name){ export async function createCategory(name, position){
return db.itemCategory.create({data: {name}}); return db.itemCategory.create({data: {name, position}});
} }
export async function updateCategory(id, name){ export async function updateCategory(id, name, position){
return db.itemCategory.update({where: {id}, data: {name}}); return db.itemCategory.update({where: {id}, data: {name, position}});
} }
export async function deleteCategory(id){ export async function deleteCategory(id){
......
...@@ -64,16 +64,18 @@ export const actions = { ...@@ -64,16 +64,18 @@ export const actions = {
const data = await event.request.formData(); const data = await event.request.formData();
const id = parseInt(data.get('id')); const id = parseInt(data.get('id'));
const name = data.get('name'); const name = data.get('name');
if(!id || !name) return { error: "Invalid form data" }; const position = parseInt(data.get('position'));
const category = await updateCategory(id, name); if(!id || !name || !Number.isInteger(position)) return { error: "Invalid form data" };
const category = await updateCategory(id, name, position);
delete category.createdAt; delete category.createdAt;
return {success: true, category}; return {success: true, category};
}, },
createCategory: async event => { createCategory: async event => {
const data = await event.request.formData(); const data = await event.request.formData();
const name = data.get('name'); const name = data.get('name');
if(!name) return { error: "Invalid form data" }; const position = parseInt(data.get('position'));
const category = await createCategory(name); if(!name || !Number.isInteger(position)) return { error: "Invalid form data" };
const category = await createCategory(name, position);
delete category.createdAt; delete category.createdAt;
return {success: true, category}; return {success: true, category};
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
import { enhance } from "$app/forms"; import { enhance } from "$app/forms";
import { addMessage, MessageType } from "$lib/messages"; import { addMessage, MessageType } from "$lib/messages";
export let name, id, canDelete; export let name, position, id, canDelete;
let edit = false; let edit = false;
function deleteCategory(){ function deleteCategory(){
fetch("/admin/category", { fetch("/admin/category", {
...@@ -25,6 +25,7 @@ ...@@ -25,6 +25,7 @@
return async ({result})=>{ return async ({result})=>{
if(result.type === "success"){ if(result.type === "success"){
name = result.data.category.name; name = result.data.category.name;
position = result.data.category.position;
form.reset(); form.reset();
edit = false; edit = false;
addMessage(MessageType.SUCCESS, "Kategorie wurde bearbeitet"); addMessage(MessageType.SUCCESS, "Kategorie wurde bearbeitet");
...@@ -35,12 +36,13 @@ ...@@ -35,12 +36,13 @@
}; };
}}> }}>
<input type="text" name="name" value={name} /> <input type="text" name="name" value={name} />
<input type="number" name="position" step="1" value={position} />
<input type="hidden" name="id" value={id} /> <input type="hidden" name="id" value={id} />
<button type="submit">Speichern</button> <button type="submit">Speichern</button>
<button type="button" on:click={()=>edit=false}>Abbrechen</button> <button type="button" on:click={()=>edit=false}>Abbrechen</button>
</form> </form>
{:else} {:else}
{name} {name} ({position})
<button type="button" on:click={()=>edit=true}>Bearbeiten</button> <button type="button" on:click={()=>edit=true}>Bearbeiten</button>
<button type="button" on:click={deleteCategory} disabled={!canDelete}>Löschen</button> <button type="button" on:click={deleteCategory} disabled={!canDelete}>Löschen</button>
{/if} {/if}
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
<ul> <ul>
{#each categories as category} {#each categories as category}
<li><CategoryItem bind:name={category.name} id={category.id} canDelete={products.filter(p=>p.categoryId==category.id)==0} /></li> <li><CategoryItem bind:name={category.name} bind:position={category.position} id={category.id} canDelete={products.filter(p=>p.categoryId==category.id)==0} /></li>
{/each} {/each}
<li> <li>
<form action="?/createCategory" method="post" use:enhance={({form, data, cancel})=>{ <form action="?/createCategory" method="post" use:enhance={({form, data, cancel})=>{
...@@ -24,6 +24,7 @@ ...@@ -24,6 +24,7 @@
}; };
}}> }}>
<input type="text" name="name" /> <input type="text" name="name" />
<input type="number" name="position" step="1" />
<button type="submit">Erstellen</button> <button type="submit">Erstellen</button>
</form> </form>
</li> </li>
......
...@@ -2,7 +2,7 @@ import { db } from "$lib/server/database"; ...@@ -2,7 +2,7 @@ import { db } from "$lib/server/database";
export async function getArticles(includeNotAvailable = false) { export async function getArticles(includeNotAvailable = false) {
if (includeNotAvailable) return db.item.findMany(); if (includeNotAvailable) return db.item.findMany();
else return db.item.findMany({ where: { available: true } }); else return db.item.findMany({ where: { available: true }, orderBy: { bought: "desc" } });
} }
export async function getArticle(code) { export async function getArticle(code) {
...@@ -10,7 +10,7 @@ export async function getArticle(code) { ...@@ -10,7 +10,7 @@ export async function getArticle(code) {
} }
export async function getCategories() { export async function getCategories() {
return db.itemCategory.findMany(); return db.itemCategory.findMany({ orderBy: { position: "asc" } });
} }
export async function getCategory(id) { export async function getCategory(id) {
......
...@@ -14,6 +14,7 @@ export async function buyArticles(userId, card, items, noBalance=false) { ...@@ -14,6 +14,7 @@ export async function buyArticles(userId, card, items, noBalance=false) {
where: { code: item.code }, where: { code: item.code },
data: { data: {
stock: { decrement: 1 }, stock: { decrement: 1 },
bought: { increment: 1 },
transactions: { transactions: {
create: { create: {
price: item.price, price: item.price,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment