- New Service:
can
Methods:
can.addAction // accept: abilityName, actionName, actionFunction | return: can
/*
can.addAction('profile','email',()=>false);
if can be used like can('email to profile'); // --> false
*/
can.addActionAlias // accept: actionName, aliasName | return: can
/*
for case if action fn "read" equals "access", we can do it:
can.addActionAlias('read','access');
can('read profile') === can('access profile');
*/
can.addAbility // accept: abilityName, object -> list of actions | return: can
/*
we need to add some ability for profile, with restrictions to "read", "write", "print"
can.addAbility('profile',{
read: ()=>(return false),
write: ()=>(return false),
print: ()=>(return true)
});
if can be used like can('read profile');
*/
can.addAbilityAlias // accept: abilityName, aliasName | return: can
/*
aliasing for abilities
can.addAbilityAlias('wake up','come back');
can.addAbilityAlias('wake up','wake');
*/
can.setRestrictionAliases // accept: object -> list of non-semantic aliases | return: can
/*
use if for non-semantic restrictions, like
can('WakeUpAt7AM') -> we do this:
can.addAbility('work',{
wakeUp: ()=>false
});
can.setRestrictionAliases({
'WakeUpAt7AM': 'wake up for work'
});
can('WakeUpAt7AM') ==== can('wake up for work')
*/
can.getState // accept: actionName, aliasName | return: abilities, abilityAliases, actionAliases, restrictionsAliases
/*
notable for debugging
*/
can.can // accept: action key, params | return: true/false
/*
if we need to check some restriction, we can do it:
can('write interesting posts');
can('write interesting posts')
=== can('writeInteresting posts')
=== can('writeInteresting to posts')
=== can('write-interesting posts')
stopwords: "of", "in", "for", "to", "from", "on", if parser find one of whem, left part of string will be key
*/
can.cannot // accept: action key, params | return: true/false
/*
logical "NOT"
can.cannot('some expression') === !els.can('some expression');
*/
can.enableDebug // accept: - | return: can
/*
enable / disable logging
*/
can.disableDebug // accept: - | return: can
/*
enable / disable logging
*/
- New template filters:
can
,cannot
*Inspired by Ruby can-can
and Ember ember-can
/ https://github.com/minutebase/ember-can (http://ember-can.com/)
Usage inside html templates:
<section-loader data-is-loaded="isLoaded" ng-if="'play jazz' | cannot">
<h2>You not allowed to play jazz</h2>
</section-loader>
<section-loader data-is-loaded="isLoaded" ng-if="'play jazz' | can">
<h2>You allowed to play jazz!</h2>
</section-loader>
<section-loader data-is-loaded="isLoaded" ng-if="['edit user', userModel] | can">
<h2>You can manage this user</h2>
</section-loader>
<section-loader data-is-loaded="isLoaded" ng-if="userModel | can:'play jazz'">
<h2>You can play Jazz!</h2>
</section-loader>
<section-loader data-is-loaded="isLoaded" ng-if="userModel | can:'play jazz':instrument">
<h2>You can play Jazz! (Based on userModel and instrument)</h2>
</section-loader>
inside js:
can
.addAbility('jazz', { play: () => true })
.addAbility('jazz', { dance: () => true })
.addAbility('jazz', { play: () => true })
.addAbility('jazz', { playHard: () => true , danceHard:()=>true})
.addAbilityAlias('jazz', 'rock')
.addActionAlias('dance', 'slam');
can.can('play jazz') // -> true
can('play jazz') // -> true
can.cannot('play jazz') // -> false,