permisisions
deploy to danak / build_and_deploy (push) Has been cancelled

This commit is contained in:
hamid zarghami
2026-07-26 08:59:39 +03:30
parent 185961c162
commit 1990e73368
5 changed files with 36 additions and 11 deletions
+24 -1
View File
@@ -95,6 +95,21 @@ export enum PermissionEnum {
BLOGS_UPDATE = "blogs_update", BLOGS_UPDATE = "blogs_update",
BLOGS_DELETE = "blogs_delete", BLOGS_DELETE = "blogs_delete",
BLOG_CATEGORIES_CREATE = "blog_categories_create",
BLOG_CATEGORIES_READ = "blog_categories_read",
BLOG_CATEGORIES_UPDATE = "blog_categories_update",
BLOG_CATEGORIES_DELETE = "blog_categories_delete",
BLOG_COMMENTS_CREATE = "blog_comments_create",
BLOG_COMMENTS_READ = "blog_comments_read",
BLOG_COMMENTS_UPDATE = "blog_comments_update",
BLOG_COMMENTS_DELETE = "blog_comments_delete",
SLIDERS_CREATE = "sliders_create",
SLIDERS_READ = "sliders_read",
SLIDERS_UPDATE = "sliders_update",
SLIDERS_DELETE = "sliders_delete",
LEARNINGS_CREATE = "learnings_create", LEARNINGS_CREATE = "learnings_create",
LEARNINGS_READ = "learnings_read", LEARNINGS_READ = "learnings_read",
LEARNINGS_UPDATE = "learnings_update", LEARNINGS_UPDATE = "learnings_update",
@@ -170,7 +185,15 @@ export type CrudAction = "create" | "read" | "update" | "delete";
const CRUD_ACTIONS: readonly CrudAction[] = ["create", "read", "update", "delete"]; const CRUD_ACTIONS: readonly CrudAction[] = ["create", "read", "update", "delete"];
export const CONTENT_PERMISSION_RESOURCES = ["blogs", "learnings", "advertisements", "announcements"] as const; export const CONTENT_PERMISSION_RESOURCES = [
"blogs",
"blog_categories",
"blog_comments",
"sliders",
"learnings",
"advertisements",
"announcements",
] as const;
export const FINANCIAL_PERMISSION_RESOURCES = ["payments", "invoices", "transactions", "discounts", "bank_accounts"] as const; export const FINANCIAL_PERMISSION_RESOURCES = ["payments", "invoices", "transactions", "discounts", "bank_accounts"] as const;
export const SUPPORT_PERMISSION_RESOURCES = [ export const SUPPORT_PERMISSION_RESOURCES = [
"support_plan", "support_plan",
+3 -3
View File
@@ -104,10 +104,10 @@ const BlogCategory: FC = () => {
<Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} /> <Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} />
<Td text={t('')}> <Td text={t('')}>
<div className='flex gap-2 items-center'> <div className='flex gap-2 items-center'>
{canUpdate('blogs') && ( {canUpdate('blog_categories') && (
<UpdateCategory id={item.id} /> <UpdateCategory id={item.id} />
)} )}
{canDelete('blogs') && ( {canDelete('blog_categories') && (
<Trash size={20} color='red' onClick={() => { <Trash size={20} color='red' onClick={() => {
deleteBlogCategory.mutateAsync(item.id, { deleteBlogCategory.mutateAsync(item.id, {
onSuccess: () => { onSuccess: () => {
@@ -129,7 +129,7 @@ const BlogCategory: FC = () => {
</div> </div>
</div> </div>
</div> </div>
{canCreate('blogs') && ( {canCreate('blog_categories') && (
<div className='relative bg-white min-h-[calc(100vh-185px)] w-sidebar xl:block hidden py-10 px-5 h-fit rounded-3xl'> <div className='relative bg-white min-h-[calc(100vh-185px)] w-sidebar xl:block hidden py-10 px-5 h-fit rounded-3xl'>
<p className='text-md'>{t('blog.add_category')}</p> <p className='text-md'>{t('blog.add_category')}</p>
<div className='text-sm flex items-center justify-between mt-4'> <div className='text-sm flex items-center justify-between mt-4'>
+3 -1
View File
@@ -7,8 +7,10 @@ import moment from 'moment-jalaali'
import { CloseCircle, TickCircle } from 'iconsax-react' import { CloseCircle, TickCircle } from 'iconsax-react'
import { ErrorType } from '../../helpers/types' import { ErrorType } from '../../helpers/types'
import { toast } from '../../components/Toast'; import { toast } from '../../components/Toast';
import { usePermissions } from '../../hooks/usePermissions'
const Comments: FC = () => { const Comments: FC = () => {
const { t } = useTranslation('global') const { t } = useTranslation('global')
const { canUpdate } = usePermissions()
const getBlogComments = useGetBlogComments() const getBlogComments = useGetBlogComments()
const changeStatusComment = useChangeStatusComment() const changeStatusComment = useChangeStatusComment()
const handleChangeStatus = (id: string, status: string) => { const handleChangeStatus = (id: string, status: string) => {
@@ -49,7 +51,7 @@ const Comments: FC = () => {
<Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} /> <Td text={moment(item.createdAt).format('jYYYY/jMM/jDD')} />
<Td text=''> <Td text=''>
{ {
item.status === 'PENDING' && item.status === 'PENDING' && canUpdate('blog_comments') &&
<div className='flex items-center gap-2'> <div className='flex items-center gap-2'>
<TickCircle onClick={() => handleChangeStatus(item.id, 'APPROVED')} color='green' size={20} /> <TickCircle onClick={() => handleChangeStatus(item.id, 'APPROVED')} color='green' size={20} />
<CloseCircle onClick={() => handleChangeStatus(item.id, 'REJECTED')} color='red' size={20} /> <CloseCircle onClick={() => handleChangeStatus(item.id, 'REJECTED')} color='red' size={20} />
+3 -3
View File
@@ -37,7 +37,7 @@ const SliderList: FC = () => {
<div> <div>
{t('slider.list_slider')} {t('slider.list_slider')}
</div> </div>
{canCreate('blogs') && ( {canCreate('sliders') && (
<div> <div>
<Link to={Pages.sliders.create}> <Link to={Pages.sliders.create}>
<Button <Button
@@ -84,7 +84,7 @@ const SliderList: FC = () => {
<Td text={item.isActive ? t('slider.active') : t('slider.inactive')} /> <Td text={item.isActive ? t('slider.active') : t('slider.inactive')} />
<Td text={''}> <Td text={''}>
<div className='flex gap-2'> <div className='flex gap-2'>
{canUpdate('blogs') && ( {canUpdate('sliders') && (
<Link to={Pages.sliders.detail + item.id}> <Link to={Pages.sliders.detail + item.id}>
<Edit <Edit
className='size-5' className='size-5'
@@ -92,7 +92,7 @@ const SliderList: FC = () => {
/> />
</Link> </Link>
)} )}
{canDelete('blogs') && ( {canDelete('sliders') && (
<TrashWithConfrim <TrashWithConfrim
onDelete={() => handleDelete(item.id)} onDelete={() => handleDelete(item.id)}
isLoading={deleteSlider.isPending} isLoading={deleteSlider.isPending}
+3 -3
View File
@@ -39,13 +39,13 @@ const ContentSubMenu: FC = () => {
title={t("submenu.blog_comments")} title={t("submenu.blog_comments")}
isActive={isActive("/blog/comments")} isActive={isActive("/blog/comments")}
link={Pages.blog.comments} link={Pages.blog.comments}
activeName="blogs" activeName="blog_comments"
/> />
<SubMenuItem <SubMenuItem
title={t("submenu.blog_category")} title={t("submenu.blog_category")}
isActive={isActive("/blog/category")} isActive={isActive("/blog/category")}
link={Pages.blog.category} link={Pages.blog.category}
activeName="blogs" activeName="blog_categories"
/> />
<SubMenuItem <SubMenuItem
title={t("sidebar.ads")} title={t("sidebar.ads")}
@@ -69,7 +69,7 @@ const ContentSubMenu: FC = () => {
title={t("sidebar.sliders")} title={t("sidebar.sliders")}
isActive={isActive("sliders")} isActive={isActive("sliders")}
link={Pages.sliders.list} link={Pages.sliders.list}
activeName="blogs" activeName="sliders"
/> />
</div> </div>
</div> </div>