From b7d80d844db345db97b29a5d9bc69892410973a9 Mon Sep 17 00:00:00 2001 From: Sonny Date: Sun, 19 May 2024 16:40:34 +0200 Subject: [PATCH] feat: add delete link form and controller --- app/controllers/links_controller.ts | 23 +++++++++++++++ app/validators/link.ts | 14 +++++++-- inertia/components/common/form/_input.tsx | 2 +- inertia/components/form/form_link.tsx | 14 +++++++-- inertia/pages/collections/delete.tsx | 2 +- inertia/pages/links/delete.tsx | 35 +++++++++++++++++++++++ start/routes/link.ts | 5 +++- 7 files changed, 87 insertions(+), 8 deletions(-) create mode 100644 inertia/pages/links/delete.tsx diff --git a/app/controllers/links_controller.ts b/app/controllers/links_controller.ts index b448521..50dddaf 100644 --- a/app/controllers/links_controller.ts +++ b/app/controllers/links_controller.ts @@ -2,6 +2,7 @@ import CollectionsController from '#controllers/collections_controller'; import Link from '#models/link'; import { createLinkValidator, + deleteLinkValidator, updateLinkFavoriteStatusValidator, updateLinkValidator, } from '#validators/link'; @@ -88,6 +89,28 @@ export default class LinksController { return response.json({ status: 'ok' }); } + async showDeletePage({ auth, inertia, request, response }: HttpContext) { + const linkId = request.qs()?.linkId; + if (!linkId) { + return response.redirectToNamedRoute('dashboard'); + } + + const link = await this.getLinkById(linkId, auth.user!.id); + await link.load('collection'); + return inertia.render('links/delete', { link }); + } + + async delete({ request, auth, response }: HttpContext) { + const { params } = await request.validateUsing(deleteLinkValidator); + + const link = await this.getLinkById(params.id, auth.user!.id); + await link.delete(); + + return response.redirectToNamedRoute('dashboard', { + qs: { collectionId: link.id }, + }); + } + /** * Get link by id. * diff --git a/app/validators/link.ts b/app/validators/link.ts index 4048602..f4225f6 100644 --- a/app/validators/link.ts +++ b/app/validators/link.ts @@ -1,5 +1,9 @@ import vine from '@vinejs/vine'; +const params = vine.object({ + id: vine.string().trim(), +}); + export const createLinkValidator = vine.compile( vine.object({ name: vine.string().trim().minLength(1).maxLength(254), @@ -18,9 +22,13 @@ export const updateLinkValidator = vine.compile( favorite: vine.boolean(), collectionId: vine.string().trim(), - params: vine.object({ - id: vine.string().trim(), - }), + params, + }) +); + +export const deleteLinkValidator = vine.compile( + vine.object({ + params, }) ); diff --git a/inertia/components/common/form/_input.tsx b/inertia/components/common/form/_input.tsx index eabff00..c045eb0 100644 --- a/inertia/components/common/form/_input.tsx +++ b/inertia/components/common/form/_input.tsx @@ -15,7 +15,7 @@ const Input = styled.input(({ theme }) => ({ }, '&:disabled': { - opacity: 0.5, + opacity: 0.85, }, '&::placeholder': { diff --git a/inertia/components/form/form_link.tsx b/inertia/components/form/form_link.tsx index 78ddeee..dc6dcf6 100644 --- a/inertia/components/form/form_link.tsx +++ b/inertia/components/form/form_link.tsx @@ -22,6 +22,8 @@ interface FormLinkProps { data: FormLinkData; errors?: Record>; collections: Collection[]; + disableInputs?: boolean; + submitBtnDanger?: boolean; setData: (name: string, value: any) => void; handleSubmit: () => void; @@ -34,12 +36,14 @@ export default function FormLink({ data, errors, collections, + disableInputs = false, + submitBtnDanger = false, setData, handleSubmit, }: FormLinkProps) { const { t } = useTranslation('common'); - const collectionId = useSearchParam('collectionId') ?? collections[0].id; + const collectionId = useSearchParam('collectionId') ?? collections?.[0].id; const onSubmit = (event: FormEvent) => { event.preventDefault(); @@ -53,6 +57,7 @@ export default function FormLink({ canSubmit={canSubmit} disableHomeLink={disableHomeLink} collectionId={collectionId} + submitBtnDanger={submitBtnDanger} > @@ -72,6 +78,7 @@ export default function FormLink({ onChange={setData} value={data.url} errors={errors?.url} + disabled={disableInputs} required />