first commit
This commit is contained in:
41
resources/js/@layouts/plugins/casl.js
Normal file
41
resources/js/@layouts/plugins/casl.js
Normal file
@@ -0,0 +1,41 @@
|
||||
import { useAbility } from '@casl/vue'
|
||||
|
||||
/**
|
||||
* Returns ability result if ACL is configured or else just return true
|
||||
* We should allow passing string | undefined to can because for admin ability we omit defining action & subject
|
||||
*
|
||||
* Useful if you don't know if ACL is configured or not
|
||||
* Used in @core files to handle absence of ACL without errors
|
||||
*
|
||||
* @param {string} action CASL Actions // https://casl.js.org/v4/en/guide/intro#basics
|
||||
* @param {string} subject CASL Subject // https://casl.js.org/v4/en/guide/intro#basics
|
||||
*/
|
||||
export const can = (action, subject) => {
|
||||
const vm = getCurrentInstance()
|
||||
if (!vm)
|
||||
return false
|
||||
const localCan = vm.proxy && '$can' in vm.proxy
|
||||
|
||||
return localCan ? vm.proxy?.$can(action, subject) : true
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if user can view item based on it's ability
|
||||
* Based on item's action and subject & Hide group if all of it's children are hidden
|
||||
* @param {object} item navigation object item
|
||||
*/
|
||||
export const canViewNavMenuGroup = item => {
|
||||
const hasAnyVisibleChild = item.children.some(i => can(i.action, i.subject))
|
||||
|
||||
// If subject and action is defined in item => Return based on children visibility (Hide group if no child is visible)
|
||||
// Else check for ability using provided subject and action along with checking if has any visible child
|
||||
if (!(item.action && item.subject))
|
||||
return hasAnyVisibleChild
|
||||
|
||||
return can(item.action, item.subject) && hasAnyVisibleChild
|
||||
}
|
||||
export const canNavigate = to => {
|
||||
const ability = useAbility()
|
||||
|
||||
return to.matched.some(route => ability.can(route.meta.action, route.meta.subject))
|
||||
}
|
Reference in New Issue
Block a user