Skip to content

Commit 28dec82

Browse files
fix crud action permission
1 parent e4a8fa7 commit 28dec82

3 files changed

Lines changed: 82 additions & 72 deletions

File tree

fixture/adminizerConfig.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -418,7 +418,11 @@ const models: AdminpanelConfig["models"] = {
418418
}
419419
}
420420
},
421-
}
421+
},
422+
add: true,
423+
edit: false,
424+
view: true,
425+
remove: false
422426
},
423427
TestCatalog: {
424428
title: '',

src/assets/js/components/list-table.tsx

Lines changed: 74 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,6 @@ const ListTable = () => {
100100
}, [data])
101101

102102

103-
104103
const pagination = useMemo(() => {
105104
return generatePagination(
106105
data.recordsFiltered,
@@ -230,74 +229,81 @@ const ListTable = () => {
230229
cell: ({row}) => {
231230
return (
232231
<div className="text-center">
233-
<DropdownMenu>
234-
<DropdownMenuTrigger asChild className="cursor-pointer">
235-
<Button variant="outline" size="icon">
236-
<BetweenHorizontalStart/>
237-
</Button>
238-
</DropdownMenuTrigger>
239-
<DropdownMenuContent className="w-46" side="right" align="start">
240-
<DropdownMenuGroup>
241-
{page.props.header.crudActions?.editTitle && (
242-
<DropdownMenuItem asChild className="cursor-pointer">
243-
<Link href={`${page.props.header.entity.uri}/edit/${row.original.id}`} onClick={() => {
244-
localStorage.setItem('backUrl', window.location.pathname + window.location.search)
245-
}}>
246-
<Icon iconNode={Pencil}/>
247-
{page.props.header.crudActions.editTitle}
248-
</Link>
249-
</DropdownMenuItem>
250-
)}
251-
{page.props.header.crudActions?.viewsTitle && (
252-
<DropdownMenuItem asChild className="cursor-pointer">
253-
<Link href={`${page.props.header.entity.uri}/view/${row.original.id}`}>
254-
<Icon iconNode={Eye}/>
255-
{page.props.header.crudActions.viewsTitle}
256-
</Link>
257-
</DropdownMenuItem>
258-
)}
259-
{page.props.header.crudActions?.deleteTitle && (
260-
<DropdownMenuItem asChild className="cursor-pointer">
261-
<DeleteModal btnTitle={page.props.header.crudActions.deleteTitle}
262-
delModal={page.props.header.delModal}
263-
btnCLass="font-normal text-destructive hover:text-destructive w-full cursor-pointer justify-start"
264-
link={`${page.props.header.entity.uri}/remove/${row.original.id}?referTo=${encodeURIComponent(window.location.search)}`}/>
265-
</DropdownMenuItem>
266-
)}
267-
</DropdownMenuGroup>
268-
{page.props.header.inlineActions && page.props.header.inlineActions.length > 0 && (
269-
<>
270-
<DropdownMenuSeparator/>
271-
{page.props.header.inlineActions.map((action: Action) => (
272-
<DropdownMenuItem
273-
key={action.id}
274-
asChild
275-
className="cursor-pointer"
276-
>
277-
{action.type === 'blank' ? (
278-
<a target="_blank"
279-
href={action.link}
280-
>
281-
{action.icon && <MaterialIcon name={action.icon}
282-
className="!text-[18px] mr-2"/>}
283-
<span>{action.title}</span>
284-
</a>
285-
) : (
286-
<Link
287-
href={`${action.link}/${row.original.id}?id=${row.original.id}&entity=${page.props.header.entity.name}`}
288-
>
289-
{action.icon && <MaterialIcon name={action.icon}
290-
className="!text-[18px] mr-2"/>}
291-
<span>{action.title}</span>
292-
</Link>
293-
)}
294-
232+
{(['deleteTitle', 'viewsTitle', 'editTitle'] as const).some(key =>
233+
page.props.header.crudActions?.[key] && page.props.header.crudActions?.[key].trim() !== ''
234+
) &&
235+
<DropdownMenu>
236+
<DropdownMenuTrigger asChild className="cursor-pointer">
237+
<Button variant="outline" size="icon">
238+
<BetweenHorizontalStart/>
239+
</Button>
240+
</DropdownMenuTrigger>
241+
<DropdownMenuContent className="w-46" side="right" align="start">
242+
<DropdownMenuGroup>
243+
{page.props.header.crudActions?.editTitle && (
244+
<DropdownMenuItem asChild className="cursor-pointer">
245+
<Link
246+
href={`${page.props.header.entity.uri}/edit/${row.original.id}`}
247+
onClick={() => {
248+
localStorage.setItem('backUrl', window.location.pathname + window.location.search)
249+
}}>
250+
<Icon iconNode={Pencil}/>
251+
{page.props.header.crudActions.editTitle}
252+
</Link>
253+
</DropdownMenuItem>
254+
)}
255+
{page.props.header.crudActions?.viewsTitle && (
256+
<DropdownMenuItem asChild className="cursor-pointer">
257+
<Link
258+
href={`${page.props.header.entity.uri}/view/${row.original.id}`}>
259+
<Icon iconNode={Eye}/>
260+
{page.props.header.crudActions.viewsTitle}
261+
</Link>
295262
</DropdownMenuItem>
296-
))}
297-
</>
298-
)}
299-
</DropdownMenuContent>
300-
</DropdownMenu>
263+
)}
264+
{page.props.header.crudActions?.deleteTitle && (
265+
<DropdownMenuItem asChild className="cursor-pointer">
266+
<DeleteModal btnTitle={page.props.header.crudActions.deleteTitle}
267+
delModal={page.props.header.delModal}
268+
btnCLass="font-normal text-destructive hover:text-destructive w-full cursor-pointer justify-start"
269+
link={`${page.props.header.entity.uri}/remove/${row.original.id}?referTo=${encodeURIComponent(window.location.search)}`}/>
270+
</DropdownMenuItem>
271+
)}
272+
</DropdownMenuGroup>
273+
{page.props.header.inlineActions && page.props.header.inlineActions.length > 0 && (
274+
<>
275+
<DropdownMenuSeparator/>
276+
{page.props.header.inlineActions.map((action: Action) => (
277+
<DropdownMenuItem
278+
key={action.id}
279+
asChild
280+
className="cursor-pointer"
281+
>
282+
{action.type === 'blank' ? (
283+
<a target="_blank"
284+
href={action.link}
285+
>
286+
{action.icon && <MaterialIcon name={action.icon}
287+
className="!text-[18px] mr-2"/>}
288+
<span>{action.title}</span>
289+
</a>
290+
) : (
291+
<Link
292+
href={`${action.link}/${row.original.id}?id=${row.original.id}&entity=${page.props.header.entity.name}`}
293+
>
294+
{action.icon && <MaterialIcon name={action.icon}
295+
className="!text-[18px] mr-2"/>}
296+
<span>{action.title}</span>
297+
</Link>
298+
)}
299+
300+
</DropdownMenuItem>
301+
))}
302+
</>
303+
)}
304+
</DropdownMenuContent>
305+
</DropdownMenu>
306+
}
301307
</div>
302308
)
303309
}

src/helpers/inertiaListHelper.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,13 @@ export function inertiaListHelper(entity: Entity, req: ReqType, fields: Fields)
5555
if (entity.config.add && req.adminizer.accessRightsHelper.hasPermission(`create-${entity.name}-model`, req.user)) {
5656
props.crudActions.createTitle = req.i18n.__('create')
5757
}
58-
if (req.adminizer.accessRightsHelper.hasPermission(`update-${entity.name}-model`, req.user)) {
58+
if (entity.config.edit && req.adminizer.accessRightsHelper.hasPermission(`update-${entity.name}-model`, req.user)) {
5959
props.crudActions.editTitle = req.i18n.__('Edit')
6060
}
61-
if (req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
61+
if (entity.config.view && req.adminizer.accessRightsHelper.hasPermission(`read-${entity.name}-model`, req.user)) {
6262
props.crudActions.viewsTitle = req.i18n.__('View')
6363
}
64-
if (req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
64+
if (entity.config.remove && req.adminizer.accessRightsHelper.hasPermission(`delete-${entity.name}-model`, req.user)) {
6565
props.crudActions.deleteTitle = req.i18n.__('Delete')
6666
}
6767

0 commit comments

Comments
 (0)