Add edit page functionality but not ui yet
This commit is contained in:
104
web/src/pages/recipe/[id]/edit.astro
Normal file
104
web/src/pages/recipe/[id]/edit.astro
Normal file
@@ -0,0 +1,104 @@
|
|||||||
|
---
|
||||||
|
import Base from "@layout/Base";
|
||||||
|
import { authPB } from "@data/pb";
|
||||||
|
|
||||||
|
const pb = await authPB()
|
||||||
|
const { id } = Astro.params
|
||||||
|
|
||||||
|
const rec = await pb.collection('recipes').getOne(id as string)
|
||||||
|
|
||||||
|
const templateHeaders = rec.cooklang
|
||||||
|
const recipeId = id as string
|
||||||
|
---
|
||||||
|
|
||||||
|
<script lang="ts" define:vars={{ recipeId }}>
|
||||||
|
document.addEventListener('DOMContentLoaded', () => {
|
||||||
|
document.querySelector('#btn-save').addEventListener('click', async () => {
|
||||||
|
try {
|
||||||
|
const cooklangTextarea = document.querySelector('#cooklang')
|
||||||
|
const cooklangContent = cooklangTextarea.value;
|
||||||
|
|
||||||
|
// Get the file input
|
||||||
|
const photoInput = document.querySelector('#photo')
|
||||||
|
const photoFile = photoInput?.files?.[0];
|
||||||
|
|
||||||
|
// Create FormData for the upload
|
||||||
|
const formData = new FormData();
|
||||||
|
formData.append('cooklang', cooklangContent);
|
||||||
|
|
||||||
|
if (photoFile) {
|
||||||
|
formData.append('images', photoFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the existing recipe using PATCH
|
||||||
|
const response = await fetch(`/api/collections/recipes/records/${recipeId}`, {
|
||||||
|
method: 'PATCH',
|
||||||
|
body: formData
|
||||||
|
});
|
||||||
|
|
||||||
|
if (response.ok) {
|
||||||
|
const result = await response.json();
|
||||||
|
// Redirect to the recipe page
|
||||||
|
window.location.href = `/recipe/${result.id}`;
|
||||||
|
} else {
|
||||||
|
const error = await response.text();
|
||||||
|
console.error('Update failed:', error);
|
||||||
|
alert('Failed to update recipe: ' + error);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
console.error('Error updating recipe:', error);
|
||||||
|
alert('Error updating recipe: ' + error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<Base>
|
||||||
|
<div class="flex flex-col md:flex-row mx-auto justify-center w-full lg:max-w-3/4 xl:max-w-2/3 2xl:max-w-1/2">
|
||||||
|
<div class="flex md:flex-1/3 flex-col sticky">
|
||||||
|
|
||||||
|
<div class="flex mb-2 items-center">
|
||||||
|
<p class="text-[28pt] mr-auto">Edit Recipe</p>
|
||||||
|
<button
|
||||||
|
id="btn-save"
|
||||||
|
class="px-3 py-2 bg-white/10 hover:bg-white/20 active:bg-white/30 transition-colors rounded-lg"
|
||||||
|
>
|
||||||
|
Save
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="relative">
|
||||||
|
<input
|
||||||
|
id="photo"
|
||||||
|
type="file"
|
||||||
|
accept="image/png,image/jpeg"
|
||||||
|
class="w-full bg-white/10 rounded-lg h-50
|
||||||
|
file:mr-4 file:py-2 file:px-4
|
||||||
|
file:rounded-lg file:border-0 file:hidden
|
||||||
|
before:content-['camera'] before:w-full before:h-full before:flex
|
||||||
|
before:items-center before:justify-center before:absolute
|
||||||
|
relative cursor-pointer
|
||||||
|
[&::-webkit-file-upload-button]:hidden"
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex mt-4 md:mt-16 md:flex-2/3 w-full flex-col md:ml-3">
|
||||||
|
|
||||||
|
<!-- Steps -->
|
||||||
|
|
||||||
|
<div class="bg-[#2a2b2c] rounded-lg mb-2 p-2">
|
||||||
|
<textarea
|
||||||
|
id="cooklang"
|
||||||
|
rows="13"
|
||||||
|
class="block w-full rounded-lg px-3 py-1 font-mono resize-none"
|
||||||
|
oninput="this.style.height = ''; this.style.height = this.scrollHeight + 'px'">{templateHeaders}</textarea>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<p class="text-sm italic text-white/40">Recipie uses <a class="underline" href="https://cooklang.org">Cooklang.</a> Visit the documentation to learn more.</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</Base>
|
||||||
Reference in New Issue
Block a user