Skip to content

Commit

Permalink
Add refresh on dialog client and add options on example (#448)
Browse files Browse the repository at this point in the history
  • Loading branch information
cregourd authored Sep 30, 2024
1 parent 017a2e0 commit 89b38df
Show file tree
Hide file tree
Showing 8 changed files with 143 additions and 9 deletions.
5 changes: 5 additions & 0 deletions .changeset/seven-ties-mate.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
"@premieroctet/next-admin": patch
---

add refresh on dialog action
19 changes: 19 additions & 0 deletions apps/example/actions/addTag.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"use server";
import { prisma } from "./../prisma";

const addTag = async (tag: string, selectedIds?: number[]) => {
await prisma.post.updateMany({
where: {
id: {
in: selectedIds,
},
},
data: {
tags: {
push: tag,
},
},
});
};

export default addTag;
65 changes: 65 additions & 0 deletions apps/example/components/PostAddTagDialogContent.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
"use client";
import { ClientActionDialogContentProps } from "@premieroctet/next-admin";
import { BaseInput, Button } from "@premieroctet/next-admin/components";
import { useState } from "react";
import addTag from "../actions/addTag";

type Props = ClientActionDialogContentProps<"User">;

const AddTagDialog = ({ data, onClose }: Props) => {
const [tag, setTag] = useState("");
const [isPending, setIsPending] = useState(false);

const handleSubmit = () => {
setIsPending(true);
addTag(
tag,
data?.map((d) => d.id)
)
.then(() => {
onClose?.({
type: "success",
message: "Tag added successfully",
});

})
.catch((e) => {
console.error(e);
onClose?.({
type: "error",
message: "An error occured",
});
})
.finally(() => {
setIsPending(false);
});
};

return (
<div className="flex flex-col gap-4">
<form className="flex flex-col gap-4">
<div className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle text-lg font-semibold">
Add a new tag
</div>
<BaseInput
type="text"
placeholder="Tag name"
className="col-span-4 row-start-3 md:col-span-2"
value={tag}
onChange={(e) => setTag(e.target.value)}
/>
</form>

<div className="flex justify-between">
<Button variant="primary" onClick={() => onClose?.()}>
Close
</Button>
<Button variant="default" loading={isPending} onClick={handleSubmit}>
Add Tag
</Button>
</div>
</div>
);
};

export default AddTagDialog;
44 changes: 35 additions & 9 deletions apps/example/components/UserDetailsDialogContent.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,17 +9,43 @@ const UserDetailsDialog = ({ data, onClose }: Props) => {
<div className="flex flex-col gap-8">
{data?.map((user) => (
<div className="flex flex-col gap-2" key={user.id}>
<h2 className="text-nextadmin-content-default dark:text-dark-nextadmin-content-default text-2xl font-semibold">
{user.email as string}
</h2>
<p className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle">
{user.name as string}
</p>
<p className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle">
{user.role as string}
</p>
<div className="flex flex-col gap-2">
<div className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle text-lg font-semibold">
User Information
</div>
<div className="text-nextadmin-content-subtle/50 dark:text-dark-nextadmin-content-subtle/50 text-sm font-medium">
Details about the current user.
</div>
</div>
<div className="grid gap-4 py-4">
<div className="grid grid-cols-4 items-center gap-4">
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle font-medium">
Name:
</span>
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle col-span-3 font-medium">
{user.name as string}
</span>
</div>
<div className="grid grid-cols-4 items-center gap-4">
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle font-medium">
Email:
</span>
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle col-span-3">
{user.email as string}
</span>
</div>
<div className="grid grid-cols-4 items-center gap-4">
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle font-medium">
Role:
</span>
<span className="text-nextadmin-content-subtle dark:text-dark-nextadmin-content-subtle col-span-3">
{user.role as string}
</span>
</div>
</div>
</div>
))}

<div className="flex">
<Button variant="default" onClick={() => onClose?.()}>
Close
Expand Down
4 changes: 4 additions & 0 deletions apps/example/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@
"publish": {
"title": "Publish post",
"success": "Post published successfully"
},
"add-tag": {
"title": "Add tag",
"success": "Tag added successfully"
}
},
"user": {
Expand Down
4 changes: 4 additions & 0 deletions apps/example/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,10 @@
"publish": {
"title": "Publier",
"success": "Article publié avec succès"
},
"add-tag": {
"title": "Ajouter un tag",
"success": "Tag ajouté avec succès"
}
},
"user": {
Expand Down
8 changes: 8 additions & 0 deletions apps/example/options.tsx
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import UserDetailsDialog from "@/components/UserDetailsDialogContent";
import AddTagDialog from "@/components/PostAddTagDialogContent";
import { NextAdminOptions } from "@premieroctet/next-admin";
import DatePicker from "./components/DatePicker";
import PasswordInput from "./components/PasswordInput";
Expand Down Expand Up @@ -222,6 +223,13 @@ export const options: NextAdminOptions = {
successMessage: "actions.post.publish.success",
errorMessage: "actions.post.publish.error",
},
{
type: "dialog",
icon: "TagIcon",
id: "add-tag",
title: "actions.post.add-tag.title",
component: <AddTagDialog />,
},
],
list: {
exports: [
Expand Down
3 changes: 3 additions & 0 deletions packages/next-admin/src/context/ClientActionDialogContext.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
useState,
} from "react";
import ClientActionDialog from "../components/ClientActionDialog";
import { useRouterInternal } from "../hooks/useRouterInternal";
import { ClientAction, MessageData, ModelName } from "../types";
import { useMessage } from "./MessageContext";

Expand All @@ -30,9 +31,11 @@ const ClientActionDialogProvider = ({ children }: PropsWithChildren) => {
useState<ClientActionDialogParams<any> | null>(null);

const { showMessage } = useMessage();
const { router } = useRouterInternal();

const onClose = (message?: MessageData) => {
setIsOpen(false);
router.refresh();
if (message) {
showMessage({
type: message.type,
Expand Down

0 comments on commit 89b38df

Please sign in to comment.