feat: add item & inventory adjustment ability.

This commit is contained in:
elforjani13
2021-11-23 19:29:58 +02:00
parent e5d02043ad
commit fca4dedeac
7 changed files with 124 additions and 47 deletions

View File

@@ -1,17 +1,80 @@
export const AbilitySubject = { export const AbilitySubject = {
Item: 'Item', Item: 'Item',
InventoryAdjustment: 'InventoryAdjustment', Inventory_Adjustment: 'Inventory_Adjustment',
Estimate: 'Estimate',
Invoice: 'Invoice',
Receipt: 'Receipt',
PaymentReceive: 'PaymentReceive',
Bill: 'Bill',
PaymentMade: 'PaymentMade',
Customer: 'Customer',
Vendor: 'Vendor',
}; };
export const ItemAbility = { export const Item_Abilities = {
View: 'view', View: 'view',
Create: 'create', Create: 'create',
Edit: 'edit', Edit: 'edit',
Delete: 'delete', Delete: 'delete',
}; };
export const InventoryAdjustment = { export const Inventory_Adjustment_Abilities = {
View: 'view',
Create: 'create', Create: 'create',
View: 'view',
Delete: 'delete',
};
export const SaleEstimate = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const SaleInvoice = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
BadDebt: 'bad-debt',
};
export const SaleReceipt = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const PaymentReceive = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const Bill = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const PaymentMade = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const CustomerAbilities = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete',
};
export const VendorAbilities = {
View: 'view',
Create: 'create',
Edit: 'edit',
Delete: 'delete', Delete: 'delete',
}; };

View File

@@ -3,9 +3,15 @@ import { Ability } from '@casl/ability';
import { createContextualCan } from '@casl/react'; import { createContextualCan } from '@casl/react';
import { import {
ItemAbility, Item_Abilities,
AbilitySubject, AbilitySubject,
InventoryAdjustment, Inventory_Adjustment_Abilities,
SaleEstimate,
SaleInvoice,
SaleReceipt,
PaymentReceive,
Bill,
PaymentMade,
} from '../common/abilityOption'; } from '../common/abilityOption';
export const AbilityContext = React.createContext(); export const AbilityContext = React.createContext();
@@ -14,8 +20,12 @@ export const Can = createContextualCan(AbilityContext.Consumer);
const AbilityContextProvider = (props) => { const AbilityContextProvider = (props) => {
const ability = new Ability([ const ability = new Ability([
{ {
subject: [AbilitySubject.Item], subject: [AbilitySubject.PaymentMade],
action: [ItemAbility.Create, ItemAbility.Edit], action: [PaymentMade.Edit],
},
{
subject: [AbilitySubject.Bill],
action: [Bill.Create],
}, },
]); ]);

View File

@@ -9,7 +9,7 @@ import withAlertsActions from 'containers/Alert/withAlertActions';
import { Icon, FormattedMessage as T, Can } from 'components'; import { Icon, FormattedMessage as T, Can } from 'components';
import { import {
InventoryAdjustment, Inventory_Adjustment_Abilities,
AbilitySubject, AbilitySubject,
} from '../../../common/abilityOption'; } from '../../../common/abilityOption';
@@ -30,7 +30,10 @@ function InventoryAdjustmentDetailActionsBar({
}; };
return ( return (
<Can I={InventoryAdjustment.Delete} a={AbilitySubject.InventoryAdjustment}> <Can
I={Inventory_Adjustment_Abilities.Delete}
a={AbilitySubject.Inventory_Adjustment}
>
<DashboardActionsBar> <DashboardActionsBar>
<NavbarGroup> <NavbarGroup>
<Button <Button

View File

@@ -10,7 +10,7 @@ import {
import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar'; import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar';
import { useItemDetailDrawerContext } from './ItemDetailDrawerProvider'; import { useItemDetailDrawerContext } from './ItemDetailDrawerProvider';
import { ItemAbility, AbilitySubject } from '../../../common/abilityOption'; import { Item_Abilities, AbilitySubject } from '../../../common/abilityOption';
import withAlertsActions from 'containers/Alert/withAlertActions'; import withAlertsActions from 'containers/Alert/withAlertActions';
import withDrawerActions from 'containers/Drawer/withDrawerActions'; import withDrawerActions from 'containers/Drawer/withDrawerActions';
@@ -48,7 +48,7 @@ function ItemDetailActionsBar({
return ( return (
<DashboardActionsBar> <DashboardActionsBar>
<NavbarGroup> <NavbarGroup>
<Can I={ItemAbility.Edit} a={AbilitySubject.Item}> <Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
<Button <Button
className={Classes.MINIMAL} className={Classes.MINIMAL}
icon={<Icon icon="pen-18" />} icon={<Icon icon="pen-18" />}
@@ -58,7 +58,7 @@ function ItemDetailActionsBar({
<NavbarDivider /> <NavbarDivider />
</Can> </Can>
<Can I={ItemAbility.Delete} a={AbilitySubject.Item}> <Can I={Item_Abilities.Delete} a={AbilitySubject.Item}>
<Button <Button
className={Classes.MINIMAL} className={Classes.MINIMAL}
icon={<Icon icon={'trash-16'} iconSize={16} />} icon={<Icon icon={'trash-16'} iconSize={16} />}

View File

@@ -17,7 +17,7 @@ import { isNumber } from 'lodash';
import { Icon, Money, If } from 'components'; import { Icon, Money, If } from 'components';
import { isBlank, safeCallback } from 'utils'; import { isBlank, safeCallback } from 'utils';
import { import {
InventoryAdjustment, Inventory_Adjustment_Abilities,
AbilitySubject, AbilitySubject,
} from '../../common/abilityOption'; } from '../../common/abilityOption';
@@ -106,22 +106,23 @@ export const ActionsMenu = ({
text={intl.get('view_details')} text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, original)} onClick={safeCallback(onViewDetails, original)}
/> />
<If condition={!original.is_published}>
<Can
I={Inventory_Adjustment_Abilities.Create}
a={AbilitySubject.Inventory_Adjustment}
>
<MenuDivider /> <MenuDivider />
<Can <If condition={!original.is_published}>
I={InventoryAdjustment.Create}
a={AbilitySubject.InventoryAdjustment}
>
<MenuItem <MenuItem
icon={<Icon icon={'arrow-to-top'} size={16} />} icon={<Icon icon={'arrow-to-top'} size={16} />}
text={intl.get('publish_adjustment')} text={intl.get('publish_adjustment')}
onClick={safeCallback(onPublish, original)} onClick={safeCallback(onPublish, original)}
/> />
</Can> </If>
</If> </Can>
<Can <Can
I={InventoryAdjustment.Delete} I={Inventory_Adjustment_Abilities.Delete}
a={AbilitySubject.InventoryAdjustment} a={AbilitySubject.Inventory_Adjustment}
> >
<MenuItem <MenuItem
text={intl.get('delete_adjustment')} text={intl.get('delete_adjustment')}

View File

@@ -31,7 +31,7 @@ import withSettings from '../Settings/withSettings';
import { compose } from 'utils'; import { compose } from 'utils';
import withSettingsActions from '../Settings/withSettingsActions'; import withSettingsActions from '../Settings/withSettingsActions';
import { ItemAbility, AbilitySubject } from '../../common/abilityOption'; import { Item_Abilities, AbilitySubject } from '../../common/abilityOption';
/** /**
* Items actions bar. * Items actions bar.
@@ -104,7 +104,7 @@ function ItemsActionsBar({
/> />
<NavbarDivider /> <NavbarDivider />
<Can I={ItemAbility.Create} a={AbilitySubject.Item}> <Can I={Item_Abilities.Create} a={AbilitySubject.Item}>
<Button <Button
className={Classes.MINIMAL} className={Classes.MINIMAL}
icon={<Icon icon="plus" />} icon={<Icon icon="plus" />}
@@ -153,7 +153,7 @@ function ItemsActionsBar({
onChange={handleTableRowSizeChange} onChange={handleTableRowSizeChange}
/> />
<NavbarDivider /> <NavbarDivider />
<Can I={ItemAbility.View} a={AbilitySubject.Item}> <Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
<Switch <Switch
labelElement={<T id={'inactive'} />} labelElement={<T id={'inactive'} />}
defaultChecked={itemsInactiveMode} defaultChecked={itemsInactiveMode}

View File

@@ -15,9 +15,9 @@ import { isNumber } from 'lodash';
import { FormattedMessage as T, Icon, Money, If, Can } from 'components'; import { FormattedMessage as T, Icon, Money, If, Can } from 'components';
import { isBlank, safeCallback } from 'utils'; import { isBlank, safeCallback } from 'utils';
import { import {
ItemAbility,
InventoryAdjustment,
AbilitySubject, AbilitySubject,
Item_Abilities,
Inventory_Adjustment_Abilities,
} from '../../common/abilityOption'; } from '../../common/abilityOption';
/** /**
@@ -95,52 +95,52 @@ export function ItemsActionMenuList({
text={<T id={'view_details'} />} text={<T id={'view_details'} />}
onClick={safeCallback(onViewDetails, original)} onClick={safeCallback(onViewDetails, original)}
/> />
<MenuDivider /> <Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
<Can I={ItemAbility.Edit} a={AbilitySubject.Item}> <MenuDivider />
<MenuItem <MenuItem
icon={<Icon icon="pen-18" />} icon={<Icon icon="pen-18" />}
text={intl.get('edit_item')} text={intl.get('edit_item')}
onClick={safeCallback(onEditItem, original)} onClick={safeCallback(onEditItem, original)}
/> />
</Can> </Can>
<Can I={ItemAbility.Create} a={AbilitySubject.Item}> <Can I={Item_Abilities.Create} a={AbilitySubject.Item}>
<MenuItem <MenuItem
icon={<Icon icon="duplicate-16" />} icon={<Icon icon="duplicate-16" />}
text={intl.get('duplicate')} text={intl.get('duplicate')}
onClick={safeCallback(onDuplicate, original)} onClick={safeCallback(onDuplicate, original)}
/> />
</Can> </Can>
<If condition={original.active}> <Can I={Item_Abilities.View} a={AbilitySubject.Item}>
<Can I={ItemAbility.View} a={AbilitySubject.Item}> <If condition={original.active}>
<MenuItem <MenuItem
text={intl.get('inactivate_item')} text={intl.get('inactivate_item')}
icon={<Icon icon="pause-16" iconSize={16} />} icon={<Icon icon="pause-16" iconSize={16} />}
onClick={safeCallback(onInactivateItem, original)} onClick={safeCallback(onInactivateItem, original)}
/> />
</Can> </If>
</If> </Can>
<If condition={!original.active}> <Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
<Can I={ItemAbility.View} a={AbilitySubject.Item}> <If condition={!original.active}>
<MenuItem <MenuItem
text={intl.get('activate_item')} text={intl.get('activate_item')}
icon={<Icon icon="play-16" iconSize={16} />} icon={<Icon icon="play-16" iconSize={16} />}
onClick={safeCallback(onActivateItem, original)} onClick={safeCallback(onActivateItem, original)}
/> />
</Can> </If>
</If> </Can>
<If condition={original.type === 'inventory'}> <Can
<Can I={Inventory_Adjustment_Abilities.Edit}
I={InventoryAdjustment.Create} a={AbilitySubject.Inventory_Adjustment}
a={AbilitySubject.InventoryAdjustment} >
> <If condition={original.type === 'inventory'}>
<MenuItem <MenuItem
text={intl.get('make_adjustment')} text={intl.get('make_adjustment')}
icon={<Icon icon={'swap-vert'} iconSize={16} />} icon={<Icon icon={'swap-vert'} iconSize={16} />}
onClick={safeCallback(onMakeAdjustment, original)} onClick={safeCallback(onMakeAdjustment, original)}
/> />
</Can> </If>
</If> </Can>
<Can I={ItemAbility.Delete} a={AbilitySubject.Item}> <Can I={Item_Abilities.Delete} a={AbilitySubject.Item}>
<MenuItem <MenuItem
text={intl.get('delete_item')} text={intl.get('delete_item')}
icon={<Icon icon="trash-16" iconSize={16} />} icon={<Icon icon="trash-16" iconSize={16} />}