From 25161d4afaaab8daa639186dbfed6e38bd5afecd Mon Sep 17 00:00:00 2001 From: Moaz Dawalibi Date: Sat, 21 Sep 2024 14:43:27 +0300 Subject: [PATCH] complete setting page --- src/Components/Switch/Switch.tsx | 24 ++++++++++ .../Ui/Buttons/EditSettingButton.tsx | 18 ++++++++ .../Ui/Buttons/SecuritySettingButton.tsx | 13 ++++++ .../ValidationField/View/SelectField.tsx | 1 - .../utils/translatedOptions.ts | 1 - src/Layout/Dashboard/LayoutModel.tsx | 4 -- src/Pages/Admin/Reseller/show/Page.tsx | 2 +- .../Form/FileSetting/AttachmentForm.tsx | 3 +- .../Form/FileSetting/PersonalDetailsForm.tsx | 1 - .../Form/FileSetting/TitleDetailsForm.tsx | 1 - src/Pages/Admin/Setting/Form/Notification.tsx | 1 - .../Admin/Setting/Form/SecuritySetting.tsx | 25 +++++------ .../Form/SecuritySetting/EmailAddress.tsx | 27 ++++++++++++ .../SecuritySetting/Model/EditEmailModel.tsx | 36 +++++++++++++++ .../SecuritySetting/Model/EditPhoneModel.tsx | 36 +++++++++++++++ .../Form/SecuritySetting/Model/ModelForm.tsx | 27 ++++++++++++ .../Form/SecuritySetting/Model/formUtil.ts | 31 +++++++++++++ .../Form/SecuritySetting/SecurityCard.tsx | 5 +-- .../Form/SecuritySetting/SecurityData.tsx | 24 ++++++---- .../Form/SecuritySetting/VerifyPhone.tsx | 26 +++++++++++ src/Pages/Admin/Setting/Form/SettingTabs.tsx | 10 ++--- src/Pages/Admin/Setting/Page.tsx | 5 +-- src/Routes.tsx | 16 +++---- src/Styles/Pages/setting.scss | 44 +++++++++++++++++++ src/enums/Model.ts | 8 ++++ src/enums/abilities.ts | 5 ++- src/translate/ar.json | 7 ++- src/utils/hasAbilityFn.ts | 15 +++++++ 28 files changed, 355 insertions(+), 61 deletions(-) create mode 100644 src/Components/Switch/Switch.tsx create mode 100644 src/Components/Ui/Buttons/EditSettingButton.tsx create mode 100644 src/Components/Ui/Buttons/SecuritySettingButton.tsx create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/EmailAddress.tsx create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditEmailModel.tsx create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditPhoneModel.tsx create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/Model/ModelForm.tsx create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/Model/formUtil.ts create mode 100644 src/Pages/Admin/Setting/Form/SecuritySetting/VerifyPhone.tsx diff --git a/src/Components/Switch/Switch.tsx b/src/Components/Switch/Switch.tsx new file mode 100644 index 0000000..8fb7f1e --- /dev/null +++ b/src/Components/Switch/Switch.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { Switch } from 'antd'; +export interface SwitchProps { + onChange?: (checked: any, event: any) => any; + checked?: boolean; + } +const onSwitchChange = (checked: boolean) => { + console.log(`switch to ${checked}`); +}; + +const SwitchButton = ({onChange,checked}:SwitchProps) => { + return( + + onChange ? onChange(checked, event) : onSwitchChange(checked) + } + // checked={checked} + /> + ) +} + +export default SwitchButton; \ No newline at end of file diff --git a/src/Components/Ui/Buttons/EditSettingButton.tsx b/src/Components/Ui/Buttons/EditSettingButton.tsx new file mode 100644 index 0000000..fba86f1 --- /dev/null +++ b/src/Components/Ui/Buttons/EditSettingButton.tsx @@ -0,0 +1,18 @@ +import { Button } from 'antd' +import { useTranslation } from 'react-i18next' +import { CiEdit } from "react-icons/ci"; + +const EditSettingButton = ({buttonName,onClick}:{buttonName?:string,onClick?:() => void}) => { + const {t} = useTranslation(); + + return ( +
+ +
+ ) +} + +export default EditSettingButton \ No newline at end of file diff --git a/src/Components/Ui/Buttons/SecuritySettingButton.tsx b/src/Components/Ui/Buttons/SecuritySettingButton.tsx new file mode 100644 index 0000000..598ea69 --- /dev/null +++ b/src/Components/Ui/Buttons/SecuritySettingButton.tsx @@ -0,0 +1,13 @@ +import { Button } from 'antd' +import { useTranslation } from 'react-i18next' + +const SecuritySettingButton = ({name,danger = false}:{name:string,danger?:boolean}) => { + const {t} = useTranslation(); + return ( +
+ +
+ ) +} + +export default SecuritySettingButton \ No newline at end of file diff --git a/src/Components/ValidationField/View/SelectField.tsx b/src/Components/ValidationField/View/SelectField.tsx index ec957e3..2737020 100644 --- a/src/Components/ValidationField/View/SelectField.tsx +++ b/src/Components/ValidationField/View/SelectField.tsx @@ -28,7 +28,6 @@ const SelectField = ({ formik.setFieldValue(name, value); }; const options = translateOptions(option, t); - console.log(options); return (
diff --git a/src/Components/ValidationField/utils/translatedOptions.ts b/src/Components/ValidationField/utils/translatedOptions.ts index 66c2619..8d0bd4c 100644 --- a/src/Components/ValidationField/utils/translatedOptions.ts +++ b/src/Components/ValidationField/utils/translatedOptions.ts @@ -1,5 +1,4 @@ export const translateOptions = (options: any, t: any) => { - console.log(options); return options?.map((opt: any) => ({ ...opt, diff --git a/src/Layout/Dashboard/LayoutModel.tsx b/src/Layout/Dashboard/LayoutModel.tsx index 249ac3d..597ea72 100644 --- a/src/Layout/Dashboard/LayoutModel.tsx +++ b/src/Layout/Dashboard/LayoutModel.tsx @@ -81,10 +81,6 @@ const LayoutModel = ({ formik.resetForm(); } }, [isOpen]); - - console.log(formik.initialValues); - console.log(formik?.values); - return
diff --git a/src/Pages/Admin/Reseller/show/Page.tsx b/src/Pages/Admin/Reseller/show/Page.tsx index f487ce4..507d4ad 100644 --- a/src/Pages/Admin/Reseller/show/Page.tsx +++ b/src/Pages/Admin/Reseller/show/Page.tsx @@ -32,8 +32,8 @@ const TableHeader = () => { const handleOpenModel = () =>{ handel_open_model(ModalEnum?.RE_SELLER_COLLECTION_ADD); - } + const deleteMutation = useDeleteReseller(); return (
diff --git a/src/Pages/Admin/Setting/Form/FileSetting/AttachmentForm.tsx b/src/Pages/Admin/Setting/Form/FileSetting/AttachmentForm.tsx index 246aabb..8dc8b1a 100644 --- a/src/Pages/Admin/Setting/Form/FileSetting/AttachmentForm.tsx +++ b/src/Pages/Admin/Setting/Form/FileSetting/AttachmentForm.tsx @@ -1,6 +1,5 @@ -import React from "react"; import { useTranslation } from "react-i18next"; -import { FaImage, FaStore } from "react-icons/fa"; +import {FaStore } from "react-icons/fa"; import ImageBoxField from "./ImageBoxField/ImageBoxField"; const AttachmentForm = () => { diff --git a/src/Pages/Admin/Setting/Form/FileSetting/PersonalDetailsForm.tsx b/src/Pages/Admin/Setting/Form/FileSetting/PersonalDetailsForm.tsx index f97a36c..6e009c5 100644 --- a/src/Pages/Admin/Setting/Form/FileSetting/PersonalDetailsForm.tsx +++ b/src/Pages/Admin/Setting/Form/FileSetting/PersonalDetailsForm.tsx @@ -2,7 +2,6 @@ import { useTranslation } from "react-i18next"; import { FaStore } from "react-icons/fa"; import ValidationField from "../../../../../Components/ValidationField/ValidationField"; import { statusType } from "../../../../../config/statusType"; -import { Col } from "antd"; const PersonalDetailsForm = () => { const [t] = useTranslation(); diff --git a/src/Pages/Admin/Setting/Form/FileSetting/TitleDetailsForm.tsx b/src/Pages/Admin/Setting/Form/FileSetting/TitleDetailsForm.tsx index 08ccd21..8c8a093 100644 --- a/src/Pages/Admin/Setting/Form/FileSetting/TitleDetailsForm.tsx +++ b/src/Pages/Admin/Setting/Form/FileSetting/TitleDetailsForm.tsx @@ -2,7 +2,6 @@ import { useTranslation } from "react-i18next"; import { FaStore } from "react-icons/fa"; import ValidationField from "../../../../../Components/ValidationField/ValidationField"; import { nationalities } from "../../../../../types/App"; -import { CiEdit } from "react-icons/ci"; const TitleDetailsForm = () => { const [t] = useTranslation(); diff --git a/src/Pages/Admin/Setting/Form/Notification.tsx b/src/Pages/Admin/Setting/Form/Notification.tsx index cca9a0d..e014d30 100644 --- a/src/Pages/Admin/Setting/Form/Notification.tsx +++ b/src/Pages/Admin/Setting/Form/Notification.tsx @@ -1,4 +1,3 @@ -import React from 'react' import TabHeader from './TabHeader' import NotificationCard from './Notification/NotificationCard' import { NotificationData } from '../../../../faker/item' diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting.tsx index 8e05ed3..7e2fc7a 100644 --- a/src/Pages/Admin/Setting/Form/SecuritySetting.tsx +++ b/src/Pages/Admin/Setting/Form/SecuritySetting.tsx @@ -1,7 +1,5 @@ -import React from 'react' import TabHeader from './TabHeader' import SecurityCard from './SecuritySetting/SecurityCard' -import { Button } from 'antd' import { SecurityData } from './SecuritySetting/SecurityData' import { SettingType } from '../../../../types/Setting' @@ -9,19 +7,18 @@ const SecuritySetting = () => { return (
+ name='security_setting' + description='upload_your_photo_and_personal_data_here' + > -
- {SecurityData?.map((e:SettingType)=>( - - ))} - -
+
+ {SecurityData?.map((e:SettingType)=>( + + ))} +
) } diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/EmailAddress.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/EmailAddress.tsx new file mode 100644 index 0000000..d3732a1 --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/EmailAddress.tsx @@ -0,0 +1,27 @@ +import EditSettingButton from '../../../../../Components/Ui/Buttons/EditSettingButton' +import { useTranslation } from 'react-i18next' +import { FaCheck } from 'react-icons/fa6'; +import useModalHandler from '../../../../../utils/useModalHandler'; +import { ModalEnum } from '../../../../../enums/Model'; +import { canEditEmail } from '../../../../../utils/hasAbilityFn'; +import EditEmailModel from './Model/EditEmailModel'; + +const EmailAddress = () => { + const {t} = useTranslation(); + const { handel_open_model } = useModalHandler(); + + const handleOpenModel = () =>{ + handel_open_model(ModalEnum?.Email_EDIT); + } + + return ( +
+ {canEditEmail && } + + {t("input.verify")} +

{t("admin@example.com")}

+
+ ) +} + +export default EmailAddress \ No newline at end of file diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditEmailModel.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditEmailModel.tsx new file mode 100644 index 0000000..3fd515f --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditEmailModel.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import { getInitialValuesEmail, getValidationSchemaEmail } from "./formUtil"; +import { ModalEnum } from "../../../../../../enums/Model"; +import LayoutModel from "../../../../../../Layout/Dashboard/LayoutModel"; +import {EmailForm} from "./ModelForm"; +import { QueryStatusEnum } from "../../../../../../enums/QueryStatus"; +import { useObjectToEdit } from "../../../../../../zustand/ObjectToEditState"; +import { useUpdateReseller } from "../../../../../../api/reseller"; + +const EditModel: React.FC = () => { + const { mutate, status } = useUpdateReseller(); + const { objectToEdit } = useObjectToEdit((state) => state); + + const handleSubmit = (values: any) => { + mutate({ + ...values, + }); + }; + return ( + <> + + + + + ); +}; + +export default EditModel; diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditPhoneModel.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditPhoneModel.tsx new file mode 100644 index 0000000..dec1818 --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/EditPhoneModel.tsx @@ -0,0 +1,36 @@ +import React from "react"; +import { getInitialValuesPhone, getValidationSchemaPhone } from "./formUtil"; +import { ModalEnum } from "../../../../../../enums/Model"; +import LayoutModel from "../../../../../../Layout/Dashboard/LayoutModel"; +import {PhoneForm} from "./ModelForm"; +import { QueryStatusEnum } from "../../../../../../enums/QueryStatus"; +import { useObjectToEdit } from "../../../../../../zustand/ObjectToEditState"; +import { useUpdateReseller } from "../../../../../../api/reseller"; + +const EditModel: React.FC = () => { + const { mutate, status } = useUpdateReseller(); + const { objectToEdit } = useObjectToEdit((state) => state); + + const handleSubmit = (values: any) => { + mutate({ + ...values, + }); + }; + return ( + <> + + + + + ); +}; + +export default EditModel; diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/Model/ModelForm.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/ModelForm.tsx new file mode 100644 index 0000000..45e21b5 --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/ModelForm.tsx @@ -0,0 +1,27 @@ +import { Col, Row } from "reactstrap"; +import ValidationField from "../../../../../../Components/ValidationField/ValidationField"; + +export const PhoneForm = () => { + return ( + + + + + + ); +}; + +PhoneForm; + + +export const EmailForm = () => { + return ( + + + + + + ); +}; + +EmailForm; diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/Model/formUtil.ts b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/formUtil.ts new file mode 100644 index 0000000..f0df5bc --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/Model/formUtil.ts @@ -0,0 +1,31 @@ +import * as Yup from "yup"; +export const getInitialValuesPhone = (objectToEdit: any): any => { + return { + id: objectToEdit?.id ?? null, + phone_number: objectToEdit?.phone_number ?? null, + + }; +}; + +export const getValidationSchemaPhone = () => { + return Yup.object().shape({ + phone_number: Yup.string().required("validation.required"), + + }); +}; + + +export const getInitialValuesEmail = (objectToEdit: any): any => { + return { + id: objectToEdit?.id ?? null, + email_address: objectToEdit?.email_address ?? null, + + }; +}; + +export const getValidationSchemaEmail = () => { + return Yup.object().shape({ + email_address: Yup.string().required("validation.required"), + + }); +}; diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityCard.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityCard.tsx index c9d1eef..a1318ce 100644 --- a/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityCard.tsx +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityCard.tsx @@ -1,13 +1,10 @@ import { useTranslation } from "react-i18next" -import ValidationField from "../../../../../Components/ValidationField/ValidationField"; -import { ReactElement } from "react"; import { SettingType } from "../../../../../types/Setting"; const SecurityCard = ({ name, description, - children -}:SettingType) => { + children}:SettingType) => { const {t} = useTranslation(); diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityData.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityData.tsx index 87b4433..ed8eb4b 100644 --- a/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityData.tsx +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/SecurityData.tsx @@ -1,46 +1,52 @@ -import { Button } from "antd"; import { SettingType } from "../../../../../types/Setting"; +import SwitchButton from "../../../../../Components/Switch/Switch" +import SecuritySettingButton from "../../../../../Components/Ui/Buttons/SecuritySettingButton"; +import VerifyPhone from "./VerifyPhone"; +import EmailAddress from "./EmailAddress"; export const SecurityData:SettingType[] = [ { name:"password", description:"Set a unique password to protect the account", - children:, + children:, }, { name:"two_factors", description:"Receive codes via SMS or email every time you log in", - // children:, + children:, }, { name:"verify_phone_number", description:"The phone number associated with the account", - // children:, + children:, }, { name:"email_address", description:"The email address associated with the account", - // children:, + children:, }, { name:"device_management", description:"Devices associated with the account", - children:, + children:, }, { name:"account_activity", description:"account_activities", - children:, + children:, + }, { name:"deactivate_the_account", description:"This will close your account. Your account will be interactive when you log in again", - children:, + children:, + }, { name:"delete_account", description:"Your account will be permanently deleted", - children:, + children:, + }, ] diff --git a/src/Pages/Admin/Setting/Form/SecuritySetting/VerifyPhone.tsx b/src/Pages/Admin/Setting/Form/SecuritySetting/VerifyPhone.tsx new file mode 100644 index 0000000..5b91085 --- /dev/null +++ b/src/Pages/Admin/Setting/Form/SecuritySetting/VerifyPhone.tsx @@ -0,0 +1,26 @@ +import EditSettingButton from '../../../../../Components/Ui/Buttons/EditSettingButton' +import { t } from 'i18next' +import { FaCheck } from 'react-icons/fa6' +import useModalHandler from '../../../../../utils/useModalHandler'; +import { ModalEnum } from '../../../../../enums/Model'; +import { canEditPhone } from '../../../../../utils/hasAbilityFn'; +import EditPhoneModel from './Model/EditPhoneModel'; + +const VerifyPhone = () => { + const { handel_open_model } = useModalHandler(); + + const handleOpenModel = () => { + handel_open_model(ModalEnum?.PHONE_EDIT); + } + + return ( +
+ {canEditPhone && } + + {t("input.verify")} +

{t("0965289543")}

+
+ ) +} + +export default VerifyPhone \ No newline at end of file diff --git a/src/Pages/Admin/Setting/Form/SettingTabs.tsx b/src/Pages/Admin/Setting/Form/SettingTabs.tsx index 5095be5..42f595a 100644 --- a/src/Pages/Admin/Setting/Form/SettingTabs.tsx +++ b/src/Pages/Admin/Setting/Form/SettingTabs.tsx @@ -1,13 +1,11 @@ -import React, { useState } from 'react'; +import React, { lazy, useState } from 'react'; import type { TabsProps } from 'antd'; import { Tabs } from 'antd'; import { useTranslation } from 'react-i18next'; -import { CgProfile } from "react-icons/cg"; import { useWindowResize } from '../../../../Hooks/useWindowResize'; -import Card from '../../../ReSeller/Notifications/Card'; -import FileSetting from './FileSetting'; -import SecuritySetting from './SecuritySetting'; -import Notification from './Notification'; +const FileSetting = lazy(() => import("./FileSetting")); +const SecuritySetting = lazy(() => import("./SecuritySetting")); +const Notification = lazy(() => import("./Notification")); type TabPosition = 'left' | 'right' | 'top' | 'bottom'; diff --git a/src/Pages/Admin/Setting/Page.tsx b/src/Pages/Admin/Setting/Page.tsx index 6fe837f..8f3bde5 100644 --- a/src/Pages/Admin/Setting/Page.tsx +++ b/src/Pages/Admin/Setting/Page.tsx @@ -1,8 +1,5 @@ -import { FaPlus } from "react-icons/fa"; -import useModalHandler from "../../../utils/useModalHandler"; -import { ModalEnum } from "../../../enums/Model"; import { useTranslation } from "react-i18next"; -import { lazy, Suspense } from "react"; +import { Suspense } from "react"; import { Spin } from "antd"; import useSetPageTitle from "../../../Hooks/useSetPageTitle"; import PageHeader from "../../../Layout/Dashboard/PageHeader"; diff --git a/src/Routes.tsx b/src/Routes.tsx index 815d7af..c8c15e7 100644 --- a/src/Routes.tsx +++ b/src/Routes.tsx @@ -339,14 +339,14 @@ export const CrudRoute: TCrudRoute[] = [ abilities_value: ABILITIES_VALUES_ENUM.INDEX, prevPath: 0, }, - { - header: "page_header.setting", - element: , - path: `/${ABILITIES_ENUM?.SETTING}`, - abilities: ABILITIES_ENUM?.SETTING, - abilities_value: ABILITIES_VALUES_ENUM.INDEX, - prevPath: 0, - }, + // { + // header: "page_header.setting", + // element: , + // path: `/${ABILITIES_ENUM?.SETTING}`, + // abilities: ABILITIES_ENUM?.SETTING, + // abilities_value: ABILITIES_VALUES_ENUM.INDEX, + // prevPath: 0, + // }, //// RE_SELLER { header: "page_header.notifications", diff --git a/src/Styles/Pages/setting.scss b/src/Styles/Pages/setting.scss index 630f51f..9660a5a 100644 --- a/src/Styles/Pages/setting.scss +++ b/src/Styles/Pages/setting.scss @@ -150,4 +150,48 @@ border: 2px solid var(--warning) !important; background: var(--warning) !important; } +} + + +.setting_edit_button{ + @include Flex; + background: #F2F4F8; + border: none; + color: #515B73; + svg{ + font-size: 20px; + } + &:hover{ + background: #F2F4F8 !important; + border: none !important; + color: #515B73 !important; + scale: 1 !important; + } +} + +.setting_email_address, +.setting_verify_phone{ + display: flex; align-items: center;flex-direction: row-reverse !important; + > span{ + @include Flex; + gap: 5px; + font-size: 10px; + padding: 8px ; + direction: ltr; + color: #1ABE17; + background: #E7F9E7; + border-radius: 8px; + cursor: pointer; + svg{ + font-size: 10px; + } + } + p{ + color: var(--value); + font-size: 14px !important; + } +} + +.switch_button{ + background: var(--primary) !important; } \ No newline at end of file diff --git a/src/enums/Model.ts b/src/enums/Model.ts index 8480f8c..fbef421 100644 --- a/src/enums/Model.ts +++ b/src/enums/Model.ts @@ -215,4 +215,12 @@ export enum ModalEnum { /// sales Sales_ADD = "Sales.add", + + /// phone + + PHONE_EDIT = "Phone.edit", + + /// email + + Email_EDIT = "Email.edit", } diff --git a/src/enums/abilities.ts b/src/enums/abilities.ts index fe335e8..7666ff8 100644 --- a/src/enums/abilities.ts +++ b/src/enums/abilities.ts @@ -56,8 +56,9 @@ export enum ABILITIES_ENUM { Profile_RE_SELLER = "profile_re_seller" , Sales = "sales", Collections = "collections", - SETTING = "setting" - + SETTING = "setting", + Email = "email", + Phone = "phone" //// } diff --git a/src/translate/ar.json b/src/translate/ar.json index 18cff13..17879a2 100644 --- a/src/translate/ar.json +++ b/src/translate/ar.json @@ -380,7 +380,9 @@ "managers":"مدراء", "manager":"مدير", "sale":"عملية بيع", - "collections": "التحصيلات" + "collections": "التحصيلات", + "phone_number":"رقم الهاتف", + "email_address":"عنوان البريد الإلكتروني" }, "education_class_actions": { "Student_Records": "سجلات الطلاب", @@ -508,7 +510,8 @@ "empty":"", "role":"الدور", "submit_password":"تأكيد كلمة المرور", - "join_date":"تاريخ الانضمام" + "join_date":"تاريخ الانضمام", + "verify":"التحقق" }, "select": { "enums": { diff --git a/src/utils/hasAbilityFn.ts b/src/utils/hasAbilityFn.ts index 6cc137b..664c5f6 100644 --- a/src/utils/hasAbilityFn.ts +++ b/src/utils/hasAbilityFn.ts @@ -736,3 +736,18 @@ export const canDeleteSales = hasAbility( ABILITIES_ENUM.Sales, ABILITIES_VALUES_ENUM.DELETE, ); + + +/// Phone + +export const canEditPhone = hasAbility( + ABILITIES_ENUM.Phone, + ABILITIES_VALUES_ENUM.UPDATE, +); + +/// Email + +export const canEditEmail = hasAbility( + ABILITIES_ENUM.Email, + ABILITIES_VALUES_ENUM.UPDATE, +); \ No newline at end of file