mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-18 13:50:31 +00:00
feat: add item & inventory adjustment ability.
This commit is contained in:
@@ -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',
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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],
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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} />}
|
||||||
|
|||||||
@@ -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}>
|
|
||||||
<MenuDivider />
|
|
||||||
<Can
|
<Can
|
||||||
I={InventoryAdjustment.Create}
|
I={Inventory_Adjustment_Abilities.Create}
|
||||||
a={AbilitySubject.InventoryAdjustment}
|
a={AbilitySubject.Inventory_Adjustment}
|
||||||
>
|
>
|
||||||
|
<MenuDivider />
|
||||||
|
<If condition={!original.is_published}>
|
||||||
<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')}
|
||||||
|
|||||||
@@ -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}
|
||||||
|
|||||||
@@ -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)}
|
||||||
/>
|
/>
|
||||||
|
<Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
|
||||||
<MenuDivider />
|
<MenuDivider />
|
||||||
<Can I={ItemAbility.Edit} a={AbilitySubject.Item}>
|
|
||||||
<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>
|
||||||
|
<Can I={Item_Abilities.View} a={AbilitySubject.Item}>
|
||||||
<If condition={original.active}>
|
<If condition={original.active}>
|
||||||
<Can I={ItemAbility.View} a={AbilitySubject.Item}>
|
|
||||||
<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>
|
||||||
|
<Can I={Item_Abilities.Edit} a={AbilitySubject.Item}>
|
||||||
<If condition={!original.active}>
|
<If condition={!original.active}>
|
||||||
<Can I={ItemAbility.View} a={AbilitySubject.Item}>
|
|
||||||
<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>
|
||||||
<If condition={original.type === 'inventory'}>
|
</Can>
|
||||||
<Can
|
<Can
|
||||||
I={InventoryAdjustment.Create}
|
I={Inventory_Adjustment_Abilities.Edit}
|
||||||
a={AbilitySubject.InventoryAdjustment}
|
a={AbilitySubject.Inventory_Adjustment}
|
||||||
>
|
>
|
||||||
|
<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 I={ItemAbility.Delete} a={AbilitySubject.Item}>
|
</Can>
|
||||||
|
<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} />}
|
||||||
|
|||||||
Reference in New Issue
Block a user