mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-22 07:40:32 +00:00
feat: add expense ability.
This commit is contained in:
@@ -1,14 +1,19 @@
|
|||||||
export const AbilitySubject = {
|
export const AbilitySubject = {
|
||||||
Item: 'Item',
|
Item: 'Item',
|
||||||
Inventory_Adjustment: 'Inventory_Adjustment',
|
Inventory_Adjustment: 'InventoryAdjustment',
|
||||||
Estimate: 'Estimate',
|
Estimate: 'SaleEstimate',
|
||||||
Invoice: 'Invoice',
|
Invoice: 'SaleInvoice',
|
||||||
Receipt: 'Receipt',
|
Receipt: 'SaleReceipt',
|
||||||
PaymentReceive: 'PaymentReceive',
|
PaymentReceive: 'PaymentReceive',
|
||||||
Bill: 'Bill',
|
Bill: 'Bill',
|
||||||
PaymentMade: 'PaymentMade',
|
PaymentMade: 'PaymentMade',
|
||||||
Customer: 'Customer',
|
Customer: 'Customer',
|
||||||
Vendor: 'Vendor',
|
Vendor: 'Vendor',
|
||||||
|
Account: 'Account',
|
||||||
|
ManualJournal: 'ManualJournal',
|
||||||
|
Expense: 'Expense',
|
||||||
|
Cashflow: 'Cashflow',
|
||||||
|
Report: 'Report',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Item_Abilities = {
|
export const Item_Abilities = {
|
||||||
@@ -24,14 +29,14 @@ export const Inventory_Adjustment_Abilities = {
|
|||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SaleEstimate = {
|
export const Estimate_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SaleInvoice = {
|
export const Invoice_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
@@ -39,42 +44,72 @@ export const SaleInvoice = {
|
|||||||
BadDebt: 'bad-debt',
|
BadDebt: 'bad-debt',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const SaleReceipt = {
|
export const Receipt_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const PaymentReceive = {
|
export const Payment_Receive_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const Bill = {
|
export const Bill_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
export const PaymentMade = {
|
export const Payment_Made_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
export const CustomerAbilities = {
|
|
||||||
|
export const Customer_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
export const VendorAbilities = {
|
|
||||||
|
export const Vendor_Abilities = {
|
||||||
View: 'view',
|
View: 'view',
|
||||||
Create: 'create',
|
Create: 'create',
|
||||||
Edit: 'edit',
|
Edit: 'edit',
|
||||||
Delete: 'delete',
|
Delete: 'delete',
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const Account_Abilities = {
|
||||||
|
View: 'view',
|
||||||
|
Create: 'create',
|
||||||
|
Edit: 'edit',
|
||||||
|
Delete: 'delete',
|
||||||
|
TransactionsLocking: 'TransactionsLocking',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Manual_Journal_Abilities = {
|
||||||
|
View: 'view',
|
||||||
|
Create: 'create',
|
||||||
|
Edit: 'edit',
|
||||||
|
Delete: 'delete',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Expense_Abilities = {
|
||||||
|
View: 'view',
|
||||||
|
Create: 'create',
|
||||||
|
Edit: 'edit',
|
||||||
|
Delete: 'delete',
|
||||||
|
};
|
||||||
|
|
||||||
|
export const Cashflow__Abilities = {
|
||||||
|
View: 'view',
|
||||||
|
Create: 'create',
|
||||||
|
Delete: 'delete',
|
||||||
|
};
|
||||||
|
|||||||
@@ -6,12 +6,15 @@ import {
|
|||||||
Item_Abilities,
|
Item_Abilities,
|
||||||
AbilitySubject,
|
AbilitySubject,
|
||||||
Inventory_Adjustment_Abilities,
|
Inventory_Adjustment_Abilities,
|
||||||
SaleEstimate,
|
Estimate_Abilities,
|
||||||
SaleInvoice,
|
Invoice_Abilities,
|
||||||
SaleReceipt,
|
Receipt_Abilities,
|
||||||
PaymentReceive,
|
PaymentReceive,
|
||||||
Bill,
|
Bill_Abilities,
|
||||||
PaymentMade,
|
Payment_Made_Abilities,
|
||||||
|
Customer_Abilities,
|
||||||
|
Vendor_Abilities,
|
||||||
|
Account_Abilities,
|
||||||
} from '../common/abilityOption';
|
} from '../common/abilityOption';
|
||||||
|
|
||||||
export const AbilityContext = React.createContext();
|
export const AbilityContext = React.createContext();
|
||||||
@@ -20,12 +23,12 @@ export const Can = createContextualCan(AbilityContext.Consumer);
|
|||||||
const AbilityContextProvider = (props) => {
|
const AbilityContextProvider = (props) => {
|
||||||
const ability = new Ability([
|
const ability = new Ability([
|
||||||
{
|
{
|
||||||
subject: [AbilitySubject.PaymentMade],
|
subject: [AbilitySubject.Account],
|
||||||
action: [PaymentMade.Edit],
|
action: [Account_Abilities.Create],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
subject: [AbilitySubject.Bill],
|
subject: [AbilitySubject.Invoice],
|
||||||
action: [Bill.Create],
|
action: [],
|
||||||
},
|
},
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
|||||||
@@ -8,8 +8,11 @@ import {
|
|||||||
Intent,
|
Intent,
|
||||||
NavbarDivider,
|
NavbarDivider,
|
||||||
} from '@blueprintjs/core';
|
} from '@blueprintjs/core';
|
||||||
import { FormattedMessage as T } from 'components';
|
import { Can, FormattedMessage as T } from 'components';
|
||||||
|
import {
|
||||||
|
Expense_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../common/abilityOption';
|
||||||
import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar';
|
import DashboardActionsBar from 'components/Dashboard/DashboardActionsBar';
|
||||||
import withAlertsActions from 'containers/Alert/withAlertActions';
|
import withAlertsActions from 'containers/Alert/withAlertActions';
|
||||||
import withDrawerActions from 'containers/Drawer/withDrawerActions';
|
import withDrawerActions from 'containers/Drawer/withDrawerActions';
|
||||||
@@ -44,6 +47,7 @@ function ExpenseDrawerActionBar({
|
|||||||
return (
|
return (
|
||||||
<DashboardActionsBar>
|
<DashboardActionsBar>
|
||||||
<NavbarGroup>
|
<NavbarGroup>
|
||||||
|
<Can I={Expense_Abilities.Edit} a={AbilitySubject.Expense}>
|
||||||
<Button
|
<Button
|
||||||
className={Classes.MINIMAL}
|
className={Classes.MINIMAL}
|
||||||
icon={<Icon icon="pen-18" />}
|
icon={<Icon icon="pen-18" />}
|
||||||
@@ -51,6 +55,8 @@ function ExpenseDrawerActionBar({
|
|||||||
onClick={handleEditExpense}
|
onClick={handleEditExpense}
|
||||||
/>
|
/>
|
||||||
<NavbarDivider />
|
<NavbarDivider />
|
||||||
|
</Can>
|
||||||
|
<Can I={Expense_Abilities.Delete} a={AbilitySubject.Expense}>
|
||||||
<Button
|
<Button
|
||||||
className={Classes.MINIMAL}
|
className={Classes.MINIMAL}
|
||||||
icon={<Icon icon="trash-16" iconSize={16} />}
|
icon={<Icon icon="trash-16" iconSize={16} />}
|
||||||
@@ -58,6 +64,7 @@ function ExpenseDrawerActionBar({
|
|||||||
intent={Intent.DANGER}
|
intent={Intent.DANGER}
|
||||||
onClick={handleDeleteExpense}
|
onClick={handleDeleteExpense}
|
||||||
/>
|
/>
|
||||||
|
</Can>
|
||||||
</NavbarGroup>
|
</NavbarGroup>
|
||||||
</DashboardActionsBar>
|
</DashboardActionsBar>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import withDialogActions from 'containers/Dialog/withDialogActions';
|
|||||||
|
|
||||||
import {
|
import {
|
||||||
If,
|
If,
|
||||||
|
Can,
|
||||||
DashboardRowsHeightButton,
|
DashboardRowsHeightButton,
|
||||||
DashboardActionViewsList,
|
DashboardActionViewsList,
|
||||||
DashboardFilterButton,
|
DashboardFilterButton,
|
||||||
@@ -22,6 +23,10 @@ import {
|
|||||||
FormattedMessage as T,
|
FormattedMessage as T,
|
||||||
} from 'components';
|
} from 'components';
|
||||||
|
|
||||||
|
import {
|
||||||
|
Expense_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../common/abilityOption';
|
||||||
import { useRefreshExpenses } from 'hooks/query/expenses';
|
import { useRefreshExpenses } from 'hooks/query/expenses';
|
||||||
import { useExpensesListContext } from './ExpensesListProvider';
|
import { useExpensesListContext } from './ExpensesListProvider';
|
||||||
|
|
||||||
@@ -92,13 +97,14 @@ function ExpensesActionsBar({
|
|||||||
onChange={handleTabChange}
|
onChange={handleTabChange}
|
||||||
/>
|
/>
|
||||||
<NavbarDivider />
|
<NavbarDivider />
|
||||||
|
<Can I={Expense_Abilities.Create} a={AbilitySubject.Expense}>
|
||||||
<Button
|
<Button
|
||||||
className={Classes.MINIMAL}
|
className={Classes.MINIMAL}
|
||||||
icon={<Icon icon="plus" />}
|
icon={<Icon icon="plus" />}
|
||||||
text={<T id={'new_expense'} />}
|
text={<T id={'new_expense'} />}
|
||||||
onClick={onClickNewExpense}
|
onClick={onClickNewExpense}
|
||||||
/>
|
/>
|
||||||
|
</Can>
|
||||||
<AdvancedFilterPopover
|
<AdvancedFilterPopover
|
||||||
advancedFilterProps={{
|
advancedFilterProps={{
|
||||||
conditions: expensesFilterConditions,
|
conditions: expensesFilterConditions,
|
||||||
|
|||||||
@@ -12,13 +12,17 @@ import {
|
|||||||
MenuDivider,
|
MenuDivider,
|
||||||
} from '@blueprintjs/core';
|
} from '@blueprintjs/core';
|
||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
|
import {
|
||||||
|
Expense_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../common/abilityOption';
|
||||||
import {
|
import {
|
||||||
FormatDateCell,
|
FormatDateCell,
|
||||||
FormattedMessage as T,
|
FormattedMessage as T,
|
||||||
Money,
|
Money,
|
||||||
Icon,
|
Icon,
|
||||||
If,
|
If,
|
||||||
|
Can,
|
||||||
} from 'components';
|
} from 'components';
|
||||||
import { safeCallback } from 'utils';
|
import { safeCallback } from 'utils';
|
||||||
|
|
||||||
@@ -54,6 +58,7 @@ export function ActionsMenu({
|
|||||||
text={intl.get('view_details')}
|
text={intl.get('view_details')}
|
||||||
onClick={safeCallback(onViewDetails, original)}
|
onClick={safeCallback(onViewDetails, original)}
|
||||||
/>
|
/>
|
||||||
|
<Can I={Expense_Abilities.Edit} a={AbilitySubject.Expense}>
|
||||||
<MenuDivider />
|
<MenuDivider />
|
||||||
<If condition={!original.is_published}>
|
<If condition={!original.is_published}>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
@@ -62,17 +67,22 @@ export function ActionsMenu({
|
|||||||
onClick={safeCallback(onPublish, original)}
|
onClick={safeCallback(onPublish, original)}
|
||||||
/>
|
/>
|
||||||
</If>
|
</If>
|
||||||
|
</Can>
|
||||||
|
<Can I={Expense_Abilities.Edit} a={AbilitySubject.Expense}>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={<Icon icon="pen-18" />}
|
icon={<Icon icon="pen-18" />}
|
||||||
text={intl.get('edit_expense')}
|
text={intl.get('edit_expense')}
|
||||||
onClick={safeCallback(onEdit, original)}
|
onClick={safeCallback(onEdit, original)}
|
||||||
/>
|
/>
|
||||||
|
</Can>
|
||||||
|
<Can I={Expense_Abilities.Delete} a={AbilitySubject.Expense}>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={<Icon icon="trash-16" iconSize={16} />}
|
icon={<Icon icon="trash-16" iconSize={16} />}
|
||||||
text={intl.get('delete_expense')}
|
text={intl.get('delete_expense')}
|
||||||
intent={Intent.DANGER}
|
intent={Intent.DANGER}
|
||||||
onClick={safeCallback(onDelete, original)}
|
onClick={safeCallback(onDelete, original)}
|
||||||
/>
|
/>
|
||||||
|
</Can>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user