fix: 🐛 set trash models on User

This commit is contained in:
Alexis Gousseau 2026-05-20 14:55:57 +02:00
parent 106508419e
commit 11329c4b3e
No known key found for this signature in database
GPG key ID: 7F3C786EE12DBB72
4 changed files with 146 additions and 63 deletions

View file

@ -10,15 +10,20 @@ import useTrans from "@/hooks/use-translations";
import { Actions, Methods } from "@/back/lib/enums";
import { AuthProp, SingleResource, UserModel } from "@/back/types/global";
export default function Create({ data }: { data: SingleResource }) {
export default function Create({
data,
modelName,
}: {
data: SingleResource;
modelName: string;
}) {
const { viewAny } = (usePage().props.auth as AuthProp).policies.users;
const modelName = usePage().props.modelName as string;
const userModel = data.data as UserModel;
const model = data.data as UserModel;
// Translations.
const transBackToList = useTrans("uwil-backend::back.crud_back_to_list");
const transTitle = useTrans(
route().current(`back.users.duplicate`)
route().current(`back.${modelName}.duplicate`)
? "uwil-backend::crud.helpers.duplication_model"
: "uwil-backend::crud.helpers.creation_model",
{
@ -35,7 +40,7 @@ export default function Create({ data }: { data: SingleResource }) {
viewAny && (
<div className="flex justify-end items-center gap-x-1.5">
<BtnOptionnalLinkWithTooltip
link={route("back.users.index")}
link={route(`back.${modelName}.index`)}
content={<ArrowLeftIcon />}
tooltipContent={<p>{transBackToList}</p>}
/>
@ -47,7 +52,7 @@ export default function Create({ data }: { data: SingleResource }) {
return (
<AuthenticatedLayout title={transTitle} beforeNode={beforeNode()}>
<Form
model={userModel}
model={model}
modelName={modelName}
modelRoute={modelName}
action={Actions.STORE}

View file

@ -12,14 +12,30 @@ import { Actions, Methods } from "@/back/lib/enums";
import Views from "@/back/lib/actions";
import { AuthProp, SingleResource, UserModel } from "@/back/types/global";
export default function Edit({ data }: { data: SingleResource }) {
export default function Edit({
data,
modelName,
}: {
data: SingleResource;
modelName: string;
}) {
const { viewAny } = (usePage().props.auth as AuthProp).policies.users;
const modelName = usePage().props.modelName as string;
const userModel = data.data as UserModel;
const actionModels = [Views.VISUALIZATION, Views.DUPLICATION, Views.DELETION];
const model = data.data as UserModel;
const actionModels = [
Views.VISUALIZATION,
Views.DUPLICATION,
Views.ARCHIVATION,
];
// Translations.
const transBackToList = useTrans("uwil-backend::back.crud_back_to_list");
const transTitle = useTrans("uwil-backend::crud.helpers.edition_model", {
params: {
model: useTrans(`uwil-backend::models.classes.${modelName}`, {
choice: 1,
}),
},
});
const beforeNode = () => {
return (
@ -36,24 +52,15 @@ export default function Edit({ data }: { data: SingleResource }) {
};
return (
<AuthenticatedLayout
title={useTrans("uwil-backend::crud.helpers.edition_model", {
params: {
model: useTrans(`uwil-backend::models.classes.${modelName}`, {
choice: 1,
}),
},
})}
beforeNode={beforeNode()}
>
<AuthenticatedLayout title={transTitle} beforeNode={beforeNode()}>
<ModelActions
actions={actionModels}
modelRoute="users"
model={userModel}
modelUpdatedAt={userModel.updated_at.toString()}
model={model}
modelUpdatedAt={model.updated_at.toString()}
/>
<Form
model={userModel}
model={model}
modelName={modelName}
modelRoute={modelName}
action={Actions.UPDATE}

View file

@ -1,5 +1,12 @@
// * Packages
import { CheckIcon, MailIcon, PlusIcon, XIcon } from "lucide-react";
import {
ArchiveIcon,
ArrowLeftIcon,
CheckIcon,
MailIcon,
PlusIcon,
XIcon,
} from "lucide-react";
import { route } from "ziggy-js";
import { Row } from "@tanstack/react-table";
// * Components shadcn
@ -11,6 +18,7 @@ import DataTable from "@/back/Components/Table/DataTable";
import DataTableSearch from "@/back/Components/Table/DataTableSearch";
import DataTableFilterButton from "@/back/Components/Table/DataTableFilterButton";
import BtnOptionnalLinkWithTooltip from "@/back/Components/BtnOptionnalLinkWithTooltip";
import SoftdeleteWarning from "@/back/Components/SoftdeleteWarning";
import Views from "@/back/lib/actions";
import { GetFormatedDate, GetTranslation } from "@/lib/utils";
import { AuthProp, Resource, UserModel } from "@/back/types/global";
@ -152,46 +160,99 @@ const getColumns = () => {
export default function Index({
userModels,
searchFields,
modelName,
}: {
userModels: Resource;
searchFields: string;
modelName: string;
}) {
const { auth } = usePage().props as unknown as {
auth: AuthProp;
};
const { create } = auth.policies.users;
const modelName = usePage().props.modelName as string;
const actionModels = [
Views.VISUALIZATION,
Views.EDITION,
Views.DUPLICATION,
Views.DELETION,
];
const { viewAny, viewTrash, create } = auth.policies.users;
const isArchiveRoute = route().current(`back.${modelName}.trash`);
const actionModels = isArchiveRoute
? [Views.RESTORATION, Views.FORCEDELETION]
: [
Views.VISUALIZATION,
Views.EDITION,
Views.DUPLICATION,
Views.ARCHIVATION,
];
const columns = getColumns();
// Translations.
const transModel = useTrans(`uwil-backend::models.classes.${modelName}`, {
choice: 2,
});
const transArchiveTitle = useTrans(
"uwil-backend::crud.helpers.archives_model",
{
params: { model: transModel },
},
);
const transTitle = str(isArchiveRoute ? transArchiveTitle : transModel)
.ucFirst()
.value();
const transCrudBackList = useTrans("uwil-backend::back.crud_back_to_list");
const transCrudAddEntry = useTrans("uwil-backend::back.crud_add_entry");
const transAccessTo = useTrans("uwil-backend::back.crud_access_to", {
params: {
target: useTrans("uwil-backend::back.archived_entries"),
},
});
const beforeNode = () => {
return (
isArchiveRoute &&
viewAny && (
<div className="flex justify-end items-center gap-x-1.5">
<BtnOptionnalLinkWithTooltip
link={route(`back.${modelName}.index`)}
content={<ArrowLeftIcon />}
tooltipContent={<p>{transCrudBackList}</p>}
/>
</div>
)
);
};
const afterNode = () => {
return (
create && (
<BtnOptionnalLinkWithTooltip
link={route(`back.${modelName}.create`)}
content={<PlusIcon />}
tooltipContent={<p>{transCrudAddEntry}</p>}
/>
!isArchiveRoute && (
<div className="flex justify-end items-center gap-x-1.5">
{viewTrash && (
<BtnOptionnalLinkWithTooltip
link={route(`back.${modelName}.trash`)}
content={<ArchiveIcon />}
tooltipContent={<p>{transAccessTo}</p>}
variant="outline"
/>
)}
{create && (
<BtnOptionnalLinkWithTooltip
link={route(`back.${modelName}.create`)}
content={<PlusIcon />}
tooltipContent={<p>{transCrudAddEntry}</p>}
/>
)}
</div>
)
);
};
return (
<AuthenticatedLayout
title={str(
useTrans(`uwil-backend::models.classes.${modelName}`, { choice: 2 }),
)
.ucFirst()
.value()}
title={transTitle}
beforeNode={beforeNode()}
afterNode={afterNode()}
>
<DataTableSearch modelRoute={modelName} searchFields={searchFields} />
{isArchiveRoute && <SoftdeleteWarning />}
<DataTableSearch
modelRoute={modelName}
searchFields={searchFields}
isArchiveRoute={isArchiveRoute}
/>
<DataTable
columns={columns}
modelRoute={modelName}

View file

@ -126,17 +126,34 @@ const getColumns = () => {
];
};
export default function Show({ data }: { data: SingleResource }) {
export default function Show({
data,
modelName,
}: {
data: SingleResource;
modelName: string;
}) {
const { auth } = usePage().props as unknown as {
auth: AuthProp;
};
const { viewAny } = auth.policies.users;
const userModel = data.data as UserModel;
const actionModels = [Views.EDITION, Views.DUPLICATION, Views.DELETION];
const model = data.data as UserModel;
const actionModels = [Views.EDITION, Views.DUPLICATION, Views.ARCHIVATION];
const columns = getColumns();
const transCrudBackList = useTrans("uwil-backend::back.crud_back_to_list");
// Translations.
const transTitle = useTrans(
"uwil-backend::crud.helpers.visualization_model",
{
params: {
model: useTrans(`uwil-backend::models.classes.${modelName}`, {
choice: 1,
}),
},
},
);
const transCrudBackToList = useTrans("uwil-backend::back.crud_back_to_list");
const beforeNode = () => {
return (
viewAny && (
@ -144,7 +161,7 @@ export default function Show({ data }: { data: SingleResource }) {
<BtnOptionnalLinkWithTooltip
link={route("back.users.index")}
content={<ArrowLeftIcon />}
tooltipContent={<p>{transCrudBackList}</p>}
tooltipContent={<p>{transCrudBackToList}</p>}
/>
</div>
)
@ -152,22 +169,15 @@ export default function Show({ data }: { data: SingleResource }) {
};
return (
<AuthenticatedLayout
title={useTrans("uwil-backend::crud.helpers.visualization_model", {
params: {
model: useTrans("uwil-backend::models.classes.users", { choice: 1 }),
},
})}
beforeNode={beforeNode()}
>
<AuthenticatedLayout title={transTitle} beforeNode={beforeNode()}>
<ModelActions
actions={actionModels}
modelRoute="users"
model={userModel}
modelUpdatedAt={userModel.updated_at.toString()}
modelRoute={modelName}
model={model}
modelUpdatedAt={model.updated_at.toString()}
/>
{/* @ts-expect-error Weird error type on cell. */}
<DetailsTable columns={columns} model={userModel} />
<DetailsTable columns={columns} model={model} />
</AuthenticatedLayout>
);
}