diff --git a/src/Pages/Users.tsx b/src/Pages/Users.tsx
index aa9ef86..b5915d7 100644
--- a/src/Pages/Users.tsx
+++ b/src/Pages/Users.tsx
@@ -12,6 +12,7 @@ import { DeleteButtonForPopOver } from "../components/PopOverButtons/PopOverButt
import { getFaPermissions } from "../utils/getFaPermissions";
import { getFaProvince } from "../utils/getFaProvince";
import { getFaCityName } from "../utils/getFaCityName";
+import { Tooltip } from "../components/Tooltip/Tooltip";
const Users: React.FC = () => {
const { profile } = useUserProfileStore();
@@ -38,19 +39,32 @@ const Users: React.FC = () => {
)) || "-",
getFaProvince(item?.province || ""),
getFaCityName(item?.city || ""),
- item?.mobile === profile?.mobile ? (
-
- -
-
- ) : (
-
-
+
+
- ),
+
+
+ ,
];
});
setTableData(d);
diff --git a/src/partials/users/SubmitNewUser.tsx b/src/partials/users/SubmitNewUser.tsx
index 16cd6d5..62404a6 100644
--- a/src/partials/users/SubmitNewUser.tsx
+++ b/src/partials/users/SubmitNewUser.tsx
@@ -17,25 +17,42 @@ import {
zValidateAutoComplete,
} from "../../data/getFormTypeErrors";
+interface UserItem {
+ _id?: string;
+ Id?: string;
+ mobile?: string;
+ fullname?: string;
+ permissions?: string[];
+ province?: string;
+ city?: string;
+}
+
interface SubmitNewUserProps {
province: string;
onSuccess?: () => void;
+ item?: UserItem | null;
}
-const schema = z.object({
- mobile: zValidateMobile("موبایل"),
- password: zValidateString("کلمه عبور"),
- fullname: zValidateString("نام کامل"),
- permissions: zValidateAutoComplete("دسترسیها"),
- city: zValidateAutoComplete("شهر"),
-});
+const getSchema = (isEdit: boolean) =>
+ z.object({
+ mobile: zValidateMobile("موبایل"),
+ password: isEdit ? z.string().optional() : zValidateString("کلمه عبور"),
+ fullname: zValidateString("نام کامل"),
+ permissions: zValidateAutoComplete("دسترسیها"),
+ city: zValidateAutoComplete("شهر"),
+ });
-type FormValues = z.infer;
+type FormValues = z.infer>;
-export const SubmitNewUser: React.FC = ({ onSuccess }) => {
+export const SubmitNewUser: React.FC = ({
+ onSuccess,
+ item,
+}) => {
const { profile } = useUserProfileStore();
const showToast = useToast();
const { closeDrawer } = useDrawerStore();
+ const isEdit = !!item;
+ const schema = useMemo(() => getSchema(isEdit), [isEdit]);
const {
control,
@@ -44,20 +61,33 @@ export const SubmitNewUser: React.FC = ({ onSuccess }) => {
formState: { errors, isSubmitting },
} = useForm({
resolver: zodResolver(schema),
- defaultValues: {
- mobile: "",
- password: "",
- fullname: "",
- permissions: [],
- city: [],
- },
+ defaultValues: item
+ ? {
+ mobile: item.mobile ?? "",
+ password: "",
+ fullname: item.fullname ?? "",
+ permissions: Array.isArray(item.permissions) ? item.permissions : [],
+ city: item.city ? [item.city] : [],
+ }
+ : {
+ mobile: "",
+ password: "",
+ fullname: "",
+ permissions: [],
+ city: [],
+ },
});
- const submitUserMutation = useApiMutation({
+ const createUserMutation = useApiMutation({
api: "user",
method: "post",
});
+ const updateUserMutation = useApiMutation({
+ api: `user/${item?._id ?? item?.Id ?? ""}`,
+ method: "put",
+ });
+
const cityOptions = useMemo(() => {
return getCitiesOfProvinceInfo(profile?.province || "").map((item) => ({
key: item.en,
@@ -65,18 +95,23 @@ export const SubmitNewUser: React.FC = ({ onSuccess }) => {
}));
}, [profile?.province]);
+ const hasAdminPermission = profile?.permissions?.includes("admin");
+
const permissionOptions = useMemo(() => {
- return [
+ const options = [
{ key: "add", value: "ثبت کاربر" },
{ key: "submit", value: "ثبت بازرسی" },
];
- }, []);
+ if (hasAdminPermission) {
+ options.push({ key: "admin", value: "ادمین" });
+ }
+ return options;
+ }, [hasAdminPermission]);
const onSubmit = async (data: FormValues) => {
try {
- const payload = {
+ const basePayload = {
mobile: data.mobile,
- password: data.password,
fullname: data.fullname,
pic: "",
permissions: data.permissions as string[],
@@ -87,15 +122,34 @@ export const SubmitNewUser: React.FC = ({ onSuccess }) => {
: "",
};
- await submitUserMutation.mutateAsync(payload);
- showToast("کاربر با موفقیت ثبت شد", "success");
+ if (isEdit) {
+ const payload =
+ data.password && String(data.password).trim() !== ""
+ ? { ...basePayload, password: data.password }
+ : basePayload;
+ await updateUserMutation.mutateAsync(payload);
+ showToast("کاربر با موفقیت ویرایش شد", "success");
+ } else {
+ if (!data.password || String(data.password).trim() === "") {
+ showToast("کلمه عبور را وارد کنید", "error");
+ return;
+ }
+ const payload = { ...basePayload, password: data.password };
+ await createUserMutation.mutateAsync(payload);
+ showToast("کاربر با موفقیت ثبت شد", "success");
+ }
closeDrawer();
if (onSuccess) {
onSuccess();
}
} catch (error) {
console.error(error);
- showToast("مشکلی پیش آمده است، ممکن است کاربر تکراری باشد!", "error");
+ showToast(
+ isEdit
+ ? "مشکلی پیش آمده است!"
+ : "مشکلی پیش آمده است، ممکن است کاربر تکراری باشد!",
+ "error",
+ );
}
};
@@ -198,9 +252,13 @@ export const SubmitNewUser: React.FC = ({ onSuccess }) => {
type="submit"
variant="submit"
fullWidth
- disabled={isSubmitting || submitUserMutation.isPending}
+ disabled={
+ isSubmitting ||
+ createUserMutation.isPending ||
+ updateUserMutation.isPending
+ }
>
- ثبت کاربر
+ {isEdit ? "ذخیره تغییرات" : "ثبت کاربر"}
diff --git a/src/utils/getFaPermissions.ts b/src/utils/getFaPermissions.ts
index b3d5a07..b6c91c3 100644
--- a/src/utils/getFaPermissions.ts
+++ b/src/utils/getFaPermissions.ts
@@ -1,6 +1,9 @@
export function getFaPermissions(permission: string) {
let faPermission = "";
switch (permission) {
+ case "admin":
+ faPermission = "ادمین";
+ break;
case "users":
faPermission = "کاربران";
break;
@@ -28,9 +31,7 @@ export function getFaPermissions(permission: string) {
case "submit":
faPermission = "ثبت بازرسی";
break;
- case "admin":
- faPermission = "مدیر";
- break;
+
default:
faPermission = permission;
break;