Merge branch 'featrue/roles-permission' of https://github.com/bigcapitalhq/client into featrue/roles-permission

This commit is contained in:
elforjani13
2021-11-26 19:51:29 +02:00
10 changed files with 632 additions and 24 deletions

View File

@@ -14,6 +14,9 @@ export const AbilitySubject = {
Expense: 'Expense', Expense: 'Expense',
Cashflow: 'Cashflow', Cashflow: 'Cashflow',
Report: 'Report', Report: 'Report',
Preferences: 'Preferences',
ExchangeRate: 'ExchangeRate',
SubscriptionBilling: 'SubscriptionBilling'
}; };
export const Item_Abilities = { export const Item_Abilities = {
@@ -99,6 +102,7 @@ export const Manual_Journal_Abilities = {
Create: 'create', Create: 'create',
Edit: 'edit', Edit: 'edit',
Delete: 'delete', Delete: 'delete',
TransactionLocking: 'TransactionLocking'
}; };
export const Expense_Abilities = { export const Expense_Abilities = {
@@ -134,3 +138,18 @@ export const Report_Abilities = {
READ_INVENTORY_ITEM_DETAILS: 'read-inventory-item-details', READ_INVENTORY_ITEM_DETAILS: 'read-inventory-item-details',
READ_CASHFLOW_ACCOUNT_TRANSACTION: 'read-cashflow-account-transactions', READ_CASHFLOW_ACCOUNT_TRANSACTION: 'read-cashflow-account-transactions',
}; };
export const PreferencesAbility = {
Mutate: 'Mutate'
}
export const ExchangeRateAbility ={
View: 'view',
Create: 'create',
Delete: 'delete',
}
export const SubscriptionBillingAbility = {
View: 'view',
Payment: 'payment'
}

View File

@@ -1,10 +1,71 @@
import intl from 'react-intl-universal'; import intl from 'react-intl-universal';
import {
AbilitySubject,
Invoice_Abilities,
Customer_Abilities,
Vendor_Abilities,
Manual_Journal_Abilities,
Expense_Abilities,
} from '../common/abilityOption';
import { useAbilitiesFilter } from '../hooks';
export const getQuickNewActions = () => [ export const getQuickNewActions = () => [
{ path: 'invoices/new', name: intl.get('sale_invoice') }, {
{ path: 'bills/new', name: intl.get('purchase_invoice') }, path: 'invoices/new',
{ path: 'make-journal-entry', name: intl.get('manual_journal') }, name: intl.get('sale_invoice'),
{ path: 'expenses/new', name: intl.get('expense') }, permission: {
{ path: 'customers/new', name: intl.get('customer') }, subject: AbilitySubject.Invoice,
{ path: 'vendors/new', name: intl.get('vendor') }, ability: Invoice_Abilities.Create,
},
},
{
path: 'bills/new',
name: intl.get('purchase_invoice'),
permission: {
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.Create,
},
},
{
path: 'make-journal-entry',
name: intl.get('manual_journal'),
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.Create,
},
},
{
path: 'expenses/new',
name: intl.get('expense'),
permission: {
subject: AbilitySubject.Expense,
ability: Expense_Abilities.Create,
},
},
{
path: 'customers/new',
name: intl.get('customer'),
permission: {
subject: AbilitySubject.Customer,
ability: Customer_Abilities.Create,
},
},
{
path: 'vendors/new',
name: intl.get('vendor'),
permission: {
subject: AbilitySubject.Vendor,
ability: Vendor_Abilities.Vendor,
},
},
]; ];
/**
* Retrieve the dashboard quick new menu items.
*/
export const useGetQuickNewMenu = () => {
const quickNewMenu = getQuickNewActions();
const abilitiesFilter = useAbilitiesFilter();
return abilitiesFilter(quickNewMenu);
};

View File

@@ -15,7 +15,7 @@ export function DashboardAbilityProvider({ children }) {
} = useDashboardMeta(); } = useDashboardMeta();
// Ability instance. // Ability instance.
const ability = new Ability([]); const ability = new Ability(abilities);
return ( return (
<AbilityContext.Provider value={ability}> <AbilityContext.Provider value={ability}>

View File

@@ -7,7 +7,6 @@ import {
} from '../../hooks/query'; } from '../../hooks/query';
import { useSplashLoading } from '../../hooks/state'; import { useSplashLoading } from '../../hooks/state';
import { useWatch, useWatchImmediate, useWhen } from '../../hooks'; import { useWatch, useWatchImmediate, useWhen } from '../../hooks';
import { setCookie, getCookie } from '../../utils'; import { setCookie, getCookie } from '../../utils';
/** /**

View File

@@ -2,16 +2,19 @@ import React from 'react';
import SidebarContainer from 'components/Sidebar/SidebarContainer'; import SidebarContainer from 'components/Sidebar/SidebarContainer';
import SidebarHead from 'components/Sidebar/SidebarHead'; import SidebarHead from 'components/Sidebar/SidebarHead';
import SidebarMenu from 'components/Sidebar/SidebarMenu'; import SidebarMenu from 'components/Sidebar/SidebarMenu';
import { useGetSidebarMenu } from './utils';
import 'style/containers/Dashboard/Sidebar.scss'; import 'style/containers/Dashboard/Sidebar.scss';
export default function Sidebar({ dashboardContentRef }) { export default function Sidebar({ dashboardContentRef }) {
const menu = useGetSidebarMenu();
return ( return (
<SidebarContainer> <SidebarContainer>
<SidebarHead /> <SidebarHead />
<div className="sidebar__menu"> <div className="sidebar__menu">
<SidebarMenu /> <SidebarMenu menu={menu} />
</div> </div>
<div class="sidebar__version">0.0.1-beta version.</div> <div class="sidebar__version">0.0.1-beta version.</div>

View File

@@ -1,7 +1,7 @@
import React from 'react'; import React from 'react';
import { Menu, MenuDivider } from '@blueprintjs/core'; import { Menu, MenuDivider } from '@blueprintjs/core';
import { useHistory, useLocation } from 'react-router-dom'; import { useHistory, useLocation } from 'react-router-dom';
import sidebarMenuList from 'config/sidebarMenu';
import { Choose } from 'components'; import { Choose } from 'components';
import Icon from 'components/Icon'; import Icon from 'components/Icon';
import MenuItem from 'components/MenuItem'; import MenuItem from 'components/MenuItem';
@@ -24,7 +24,7 @@ function SidebarMenuItemSpace({ space }) {
return <div class="bp3-menu-spacer" style={{ height: `${space}px` }} />; return <div class="bp3-menu-spacer" style={{ height: `${space}px` }} />;
} }
function SidebarMenu({ isSubscriptionActive }) { function SidebarMenu({ menu, isSubscriptionActive }) {
const history = useHistory(); const history = useHistory();
const location = useLocation(); const location = useLocation();
@@ -93,7 +93,7 @@ function SidebarMenu({ isSubscriptionActive }) {
}); });
}; };
const filterItems = sidebarMenuList.filter( const filterItems = menu.filter(
(item) => isSubscriptionActive || item.enableBilling, (item) => isSubscriptionActive || item.enableBilling,
); );
const items = menuItemsMapper(filterItems); const items = menuItemsMapper(filterItems);

View File

@@ -0,0 +1,48 @@
import sidebarMenuList from 'config/sidebarMenu';
import { isArray, isEmpty } from 'lodash';
import { useAbilityContext } from 'hooks/utils';
export function useGetSidebarMenu() {
const ability = useAbilityContext();
return sidebarMenuList
.map((item) => {
const children = isArray(item.children)
? item.children.filter((childItem) => {
return isArray(childItem.permission)
? childItem.permission.some((perm) =>
ability.can(perm.ability, perm.subject),
)
: childItem?.permission?.ability && childItem?.permission?.subject
? ability.can(
childItem.permission.ability,
childItem.permission.subject,
)
: true;
})
: [];
return {
...item,
...(isArray(item.children)
? {
children,
}
: {}),
};
})
.filter((item) => {
return isArray(item.permission)
? item.permission.some((per) =>
ability.can(per.ability, per.subject),
)
: item?.permission?.ability && item?.permission?.subject
? ability.can(item.permission.ability, item.permission.subject)
: true;
})
.filter((item) =>
isEmpty(item.children) && !item.href && !item.label && !item.divider
? false
: true,
);
}

View File

@@ -1,5 +1,26 @@
import React from 'react'; import React from 'react';
import { FormattedMessage as T } from 'components'; import { FormattedMessage as T } from 'components';
import {
Report_Abilities,
AbilitySubject,
Item_Abilities,
Inventory_Adjustment_Abilities,
Estimate_Abilities,
Invoice_Abilities,
Receipt_Abilities,
Payment_Receive_Abilities,
Bill_Abilities,
Payment_Made_Abilities,
Customer_Abilities,
Vendor_Abilities,
Account_Abilities,
Manual_Journal_Abilities,
Expense_Abilities,
Cashflow_Abilities,
PreferencesAbility,
ExchangeRateAbility,
SubscriptionBillingAbility,
} from '../common/abilityOption';
export default [ export default [
{ {
@@ -11,6 +32,32 @@ export default [
{ {
text: <T id={'sales_inventory'} />, text: <T id={'sales_inventory'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Item,
ability: Item_Abilities.View,
},
{
subject: AbilitySubject.Inventory_Adjustment,
ability: Inventory_Adjustment_Abilities.View,
},
{
subject: AbilitySubject.Estimate,
ability: Estimate_Abilities.View,
},
{
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.View,
},
{
subject: AbilitySubject.Receipt,
ability: Receipt_Abilities.View,
},
{
subject: AbilitySubject.PaymentReceive,
ability: Payment_Receive_Abilities.View,
}
],
}, },
{ {
text: <T id={'items'} />, text: <T id={'items'} />,
@@ -18,37 +65,70 @@ export default [
{ {
text: <T id={'items'} />, text: <T id={'items'} />,
href: '/items', href: '/items',
permission: {
subject: AbilitySubject.Item,
ability: Item_Abilities.View,
},
}, },
{ {
text: <T id={'inventory_adjustments'} />, text: <T id={'inventory_adjustments'} />,
href: '/inventory-adjustments', href: '/inventory-adjustments',
permission: {
subject: AbilitySubject.Inventory_Adjustment,
ability: Inventory_Adjustment_Abilities.View,
},
}, },
{ {
text: <T id={'category_list'} />, text: <T id={'category_list'} />,
href: '/items/categories', href: '/items/categories',
permission: {
subject: AbilitySubject.Item,
ability: Item_Abilities.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Item,
ability: Item_Abilities.Create,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Item,
ability: Item_Abilities.Create,
},
],
}, },
{ {
text: <T id={'New inventory item'} />, text: <T id={'New inventory item'} />,
href: '/items/new', href: '/items/new',
permission: {
subject: AbilitySubject.Item,
ability: Item_Abilities.Create,
},
}, },
{ {
text: <T id={'New service'} />, text: <T id={'New service'} />,
href: '/items/new', href: '/items/new',
permission: {
subject: AbilitySubject.Item,
ability: Item_Abilities.Create,
},
}, },
{ {
text: <T id={'New item category'} />, text: <T id={'New item category'} />,
href: '/items/categories/new', href: '/items/categories/new',
permission: {
subject: AbilitySubject.Item,
ability: Item_Abilities.Create,
},
}, },
// {
// text: <T id={'New inventory adjustment'} />,
// },
], ],
}, },
{ {
@@ -57,43 +137,109 @@ export default [
{ {
text: <T id={'estimates'} />, text: <T id={'estimates'} />,
href: '/estimates', href: '/estimates',
newTabHref: '/estimates/new', permission: {
subject: AbilitySubject.Estimate,
ability: Estimate_Abilities.View,
},
}, },
{ {
text: <T id={'invoices'} />, text: <T id={'invoices'} />,
href: '/invoices', href: '/invoices',
newTabHref: '/invoices/new', permission: {
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.View,
},
}, },
{ {
text: <T id={'receipts'} />, text: <T id={'receipts'} />,
href: '/receipts', href: '/receipts',
permission: {
subject: AbilitySubject.Receipt,
ability: Receipt_Abilities.View,
},
}, },
{ {
text: <T id={'payment_receives'} />, text: <T id={'payment_receives'} />,
href: '/payment-receives', href: '/payment-receives',
permission: {
subject: AbilitySubject.PaymentReceive,
ability: Payment_Receive_Abilities.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Estimate,
ability: Estimate_Abilities.Create,
},
{
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.Create,
},
{
subject: AbilitySubject.Receipt,
ability: Receipt_Abilities.Create,
},
{
subject: AbilitySubject.PaymentReceive,
ability: Payment_Receive_Abilities.Create,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Estimate,
ability: Estimate_Abilities.Create,
},
{
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.Create,
},
{
subject: AbilitySubject.Receipt,
ability: Receipt_Abilities.Create,
},
{
subject: AbilitySubject.PaymentReceive,
ability: Payment_Receive_Abilities.Create,
},
],
}, },
{ {
text: <T id={'new_estimate'} />, text: <T id={'new_estimate'} />,
href: '/estimates/new', href: '/estimates/new',
permission: {
subject: AbilitySubject.Estimate,
ability: Estimate_Abilities.Create,
},
}, },
{ {
text: <T id={'new_invoice'} />, text: <T id={'new_invoice'} />,
href: '/invoices/new', href: '/invoices/new',
permission: {
subject: AbilitySubject.Invoice,
ability: Invoice_Abilities.Create,
},
}, },
{ {
text: <T id={'new_receipt'} />, text: <T id={'new_receipt'} />,
href: '/receipts/new', href: '/receipts/new',
permission: {
subject: AbilitySubject.Receipt,
ability: Receipt_Abilities.Create,
},
}, },
{ {
text: <T id={'new_payment_receive'} />, text: <T id={'new_payment_receive'} />,
href: '/payment-receives/new', href: '/payment-receives/new',
permission: {
subject: AbilitySubject.PaymentReceive,
ability: Payment_Receive_Abilities.Create,
},
}, },
], ],
}, },
@@ -103,27 +249,62 @@ export default [
{ {
text: <T id={'bills'} />, text: <T id={'bills'} />,
href: '/bills', href: '/bills',
newTabHref: '/bills/new', permission: {
subject: AbilitySubject.Bill,
ability: Bill_Abilities.View,
},
}, },
{ {
text: <T id={'payment_mades'} />, text: <T id={'payment_mades'} />,
href: '/payment-mades', href: '/payment-mades',
newTabHref: '/payment-mades/new', newTabHref: '/payment-mades/new',
permission: {
subject: AbilitySubject.PaymentMade,
ability: Payment_Made_Abilities.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Bill,
ability: Bill_Abilities.Create,
},
{
subject: AbilitySubject.PaymentMade,
ability: Payment_Made_Abilities.Create,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Bill,
ability: Bill_Abilities.Create,
},
{
subject: AbilitySubject.PaymentMade,
ability: Payment_Made_Abilities.Create,
},
],
}, },
{ {
text: <T id={'New purchase invoice'} />, text: <T id={'New purchase invoice'} />,
href: '/bills/new', href: '/bills/new',
permission: {
subject: AbilitySubject.Bill,
ability: Bill_Abilities.Create,
},
}, },
{ {
text: <T id={'new_payment_made'} />, text: <T id={'new_payment_made'} />,
href: '/payment-mades/new', href: '/payment-mades/new',
permission: {
subject: AbilitySubject.PaymentMade,
ability: Payment_Made_Abilities.Create,
},
}, },
], ],
}, },
@@ -133,33 +314,77 @@ export default [
{ {
text: <T id={'customers'} />, text: <T id={'customers'} />,
href: '/customers', href: '/customers',
newTabHref: '/customers/new', permission: {
subject: AbilitySubject.Customer,
ability: Customer_Abilities.View,
},
}, },
{ {
text: <T id={'vendors'} />, text: <T id={'vendors'} />,
href: '/vendors', href: '/vendors',
newTabHref: '/vendors/new', permission: {
subject: AbilitySubject.Vendor,
ability: Vendor_Abilities.Create,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Customer,
ability: Customer_Abilities.View,
},
{
subject: AbilitySubject.Vendor,
ability: Vendor_Abilities.View,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Customer,
ability: Customer_Abilities.View,
},
{
subject: AbilitySubject.Vendor,
ability: Vendor_Abilities.View,
},
],
}, },
{ {
text: <T id={'new_customer'} />, text: <T id={'new_customer'} />,
href: '/customers/new', href: '/customers/new',
permission: {
subject: AbilitySubject.Customer,
ability: Customer_Abilities.View,
},
}, },
{ {
text: <T id={'new_vendor'} />, text: <T id={'new_vendor'} />,
href: '/vendors/new', href: '/vendors/new',
permission: {
subject: AbilitySubject.Vendor,
ability: Vendor_Abilities.View,
},
}, },
], ],
}, },
{ {
text: <T id={'accounting'} />, text: <T id={'accounting'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Account,
ability: Account_Abilities.View,
},
{
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.View,
},
],
}, },
{ {
text: <T id={'financial'} />, text: <T id={'financial'} />,
@@ -167,29 +392,57 @@ export default [
{ {
text: <T id={'accounts_chart'} />, text: <T id={'accounts_chart'} />,
href: '/accounts', href: '/accounts',
permission: {
subject: AbilitySubject.Account,
ability: Account_Abilities.View,
},
}, },
{ {
text: <T id={'manual_journals'} />, text: <T id={'manual_journals'} />,
href: '/manual-journals', href: '/manual-journals',
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.View,
},
}, },
{ {
text: <T id={'sidebar.transactions_locaking'} />, text: <T id={'sidebar.transactions_locaking'} />,
href: '/transactions-locking', href: '/transactions-locking',
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.TransactionLocking,
},
}, },
{ {
text: <T id={'exchange_rate'} />, text: <T id={'exchange_rate'} />,
href: '/exchange-rates', href: '/exchange-rates',
permission: {
subject: AbilitySubject.ExchangeRate,
ability: ExchangeRateAbility.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.Create,
},
}, },
{ {
divider: true, divider: true,
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.Create,
},
}, },
{ {
text: <T id={'make_journal_entry'} />, text: <T id={'make_journal_entry'} />,
href: '/make-journal-entry', href: '/make-journal-entry',
permission: {
subject: AbilitySubject.ManualJournal,
ability: Manual_Journal_Abilities.Create,
},
}, },
], ],
}, },
@@ -199,29 +452,61 @@ export default [
{ {
text: <T id={'siebar.cashflow.label_cash_and_bank_accounts'} />, text: <T id={'siebar.cashflow.label_cash_and_bank_accounts'} />,
href: '/cashflow-accounts', href: '/cashflow-accounts',
permission: {
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
],
}, },
{ {
text: <T id={'cash_flow.label.add_money_in'} />, text: <T id={'cash_flow.label.add_money_in'} />,
href: '/cashflow-accounts', href: '/cashflow-accounts',
permission: {
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
}, },
{ {
text: <T id={'cash_flow.label.add_money_out'} />, text: <T id={'cash_flow.label.add_money_out'} />,
href: '/cashflow-accounts', href: '/cashflow-accounts',
permission: {
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
}, },
{ {
text: <T id={'cash_flow.label.add_cash_account'} />, text: <T id={'cash_flow.label.add_cash_account'} />,
href: '/cashflow-accounts', href: '/cashflow-accounts',
permission: {
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
}, },
{ {
text: <T id={'cash_flow.label.add_bank_account'} />, text: <T id={'cash_flow.label.add_bank_account'} />,
href: '/cashflow-accounts', href: '/cashflow-accounts',
permission: {
subject: AbilitySubject.Cashflow,
ability: Cashflow_Abilities.Create,
},
}, },
], ],
}, },
@@ -231,17 +516,33 @@ export default [
{ {
text: <T id={'expenses'} />, text: <T id={'expenses'} />,
href: '/expenses', href: '/expenses',
permission: {
subject: AbilitySubject.Expense,
ability: Expense_Abilities.View,
},
}, },
{ {
text: <T id={'New tasks'} />, text: <T id={'New tasks'} />,
label: true, label: true,
permission: {
subject: AbilitySubject.Expense,
ability: Expense_Abilities.Create,
},
}, },
{ {
divider: true, divider: true,
permission: {
subject: AbilitySubject.Expense,
ability: Expense_Abilities.Create,
},
}, },
{ {
text: <T id={'new_expense'} />, text: <T id={'new_expense'} />,
href: '/expenses/new', href: '/expenses/new',
permission: {
subject: AbilitySubject.Expense,
ability: Expense_Abilities.Create,
},
}, },
], ],
}, },
@@ -251,80 +552,216 @@ export default [
{ {
text: <T id={'balance_sheet'} />, text: <T id={'balance_sheet'} />,
href: '/financial-reports/balance-sheet', href: '/financial-reports/balance-sheet',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_BALANCE_SHEET,
},
}, },
{ {
text: <T id={'trial_balance_sheet'} />, text: <T id={'trial_balance_sheet'} />,
href: '/financial-reports/trial-balance-sheet', href: '/financial-reports/trial-balance-sheet',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_TRIAL_BALANCE_SHEET,
},
}, },
{ {
text: <T id={'journal'} />, text: <T id={'journal'} />,
href: '/financial-reports/journal-sheet', href: '/financial-reports/journal-sheet',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_JOURNAL,
},
}, },
{ {
text: <T id={'general_ledger'} />, text: <T id={'general_ledger'} />,
href: '/financial-reports/general-ledger', href: '/financial-reports/general-ledger',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_GENERAL_LEDGET,
},
}, },
{ {
text: <T id={'profit_loss_sheet'} />, text: <T id={'profit_loss_sheet'} />,
href: '/financial-reports/profit-loss-sheet', href: '/financial-reports/profit-loss-sheet',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_PROFIT_LOSS,
},
}, },
{ {
text: <T id={'cash_flow_statement'} />, text: <T id={'cash_flow_statement'} />,
href: '/financial-reports/cash-flow', href: '/financial-reports/cash-flow',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CASHFLOW_ACCOUNT_TRANSACTION,
},
}, },
{ {
text: <T id={'AR_Aging_Summary'} />, text: <T id={'AR_Aging_Summary'} />,
href: '/financial-reports/receivable-aging-summary', href: '/financial-reports/receivable-aging-summary',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_AR_AGING_SUMMARY,
},
}, },
{ {
text: <T id={'AP_Aging_Summary'} />, text: <T id={'AP_Aging_Summary'} />,
href: '/financial-reports/payable-aging-summary', href: '/financial-reports/payable-aging-summary',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_AP_AGING_SUMMARY,
},
}, },
{ {
text: <T id={'Sales/Purchases'} />, text: <T id={'Sales/Purchases'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_PURCHASES_BY_ITEMS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_SALES_BY_ITEMS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_TRANSACTIONS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_TRANSACTIONS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_SUMMARY_BALANCE,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_SUMMARY_BALANCE,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_PURCHASES_BY_ITEMS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_SALES_BY_ITEMS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_TRANSACTIONS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_TRANSACTIONS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_SUMMARY_BALANCE,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_SUMMARY_BALANCE,
},
],
}, },
{ {
text: <T id={'purchases_by_items'} />, text: <T id={'purchases_by_items'} />,
href: '/financial-reports/purchases-by-items', href: '/financial-reports/purchases-by-items',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_PURCHASES_BY_ITEMS,
},
}, },
{ {
text: <T id={'sales_by_items'} />, text: <T id={'sales_by_items'} />,
href: '/financial-reports/sales-by-items', href: '/financial-reports/sales-by-items',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_SALES_BY_ITEMS,
},
}, },
{ {
text: <T id={'customers_transactions'} />, text: <T id={'customers_transactions'} />,
href: '/financial-reports/transactions-by-customers', href: '/financial-reports/transactions-by-customers',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_TRANSACTIONS,
},
}, },
{ {
text: <T id={'vendors_transactions'} />, text: <T id={'vendors_transactions'} />,
href: '/financial-reports/transactions-by-vendors', href: '/financial-reports/transactions-by-vendors',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_TRANSACTIONS,
},
}, },
{ {
text: <T id={'customers_balance_summary'} />, text: <T id={'customers_balance_summary'} />,
href: '/financial-reports/customers-balance-summary', href: '/financial-reports/customers-balance-summary',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_CUSTOMERS_SUMMARY_BALANCE,
},
}, },
{ {
text: <T id={'vendors_balance_summary'} />, text: <T id={'vendors_balance_summary'} />,
href: '/financial-reports/vendors-balance-summary', href: '/financial-reports/vendors-balance-summary',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_VENDORS_SUMMARY_BALANCE,
},
}, },
{ {
text: <T id={'inventory'} />, text: <T id={'inventory'} />,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_ITEM_DETAILS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_VALUATION_SUMMARY,
},
],
}, },
{ {
divider: true, divider: true,
permission: [
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_ITEM_DETAILS,
},
{
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_VALUATION_SUMMARY,
},
],
}, },
{ {
text: <T id={'inventory_item_details'} />, text: <T id={'inventory_item_details'} />,
href: '/financial-reports/inventory-item-details', href: '/financial-reports/inventory-item-details',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_ITEM_DETAILS,
},
}, },
{ {
text: <T id={'inventory_valuation'} />, text: <T id={'inventory_valuation'} />,
href: '/financial-reports/inventory-valuation', href: '/financial-reports/inventory-valuation',
permission: {
subject: AbilitySubject.Report,
ability: Report_Abilities.READ_INVENTORY_VALUATION_SUMMARY,
},
}, },
], ],
}, },
@@ -332,14 +769,32 @@ export default [
text: <T id={'system'} />, text: <T id={'system'} />,
enableBilling: true, enableBilling: true,
label: true, label: true,
permission: [
{
subject: AbilitySubject.Preferences,
ability: PreferencesAbility.Mutate,
},
{
subject: AbilitySubject.SubscriptionBilling,
ability: SubscriptionBillingAbility.View,
},
],
}, },
{ {
text: <T id={'preferences'} />, text: <T id={'preferences'} />,
href: '/preferences', href: '/preferences',
permission: {
subject: AbilitySubject.Preferences,
ability: PreferencesAbility.Mutate,
},
}, },
{ {
text: <T id={'billing'} />, text: <T id={'billing'} />,
href: '/billing', href: '/billing',
enableBilling: true, enableBilling: true,
permission: {
subject: AbilitySubject.SubscriptionBilling,
ability: SubscriptionBillingAbility.View,
},
}, },
]; ];

View File

@@ -4,16 +4,21 @@ import { FormattedMessage as T } from 'components';
import { useHistory } from 'react-router-dom'; import { useHistory } from 'react-router-dom';
import { Icon } from 'components'; import { Icon } from 'components';
import { Position } from '@blueprintjs/core'; import { Position } from '@blueprintjs/core';
import { getQuickNewActions } from 'common/quickNewOptions';
import { Select } from '@blueprintjs/select'; import { Select } from '@blueprintjs/select';
import { useGetQuickNewMenu } from 'common/quickNewOptions';
/** /**
* Quick New Dropdown. * Quick New Dropdown.
*/ */
export default function QuickNewDropdown() { export default function QuickNewDropdown() {
const history = useHistory(); const history = useHistory();
const quickNewOptions = getQuickNewActions(); const quickNewOptions = useGetQuickNewMenu();
// Can't continue if there is no any quick new menu items to display.
if (quickNewOptions.length === 0) {
return null;
}
// Handle click quick new button. // Handle click quick new button.
const handleClickQuickNew = ({ path }) => { const handleClickQuickNew = ({ path }) => {
history.push(`/${path}`); history.push(`/${path}`);

View File

@@ -1,4 +1,22 @@
import React from 'react';
import { useAbility } from '@casl/react'; import { useAbility } from '@casl/react';
import { AbilityContext } from '../../components'; import { AbilityContext } from '../../components';
export const useAbilityContext = () => useAbility(AbilityContext); export const useAbilityContext = () => useAbility(AbilityContext);
/**
*
*/
export const useAbilitiesFilter = () => {
const ability = useAbilityContext();
return React.useCallback(
(items) => {
return items.filter((item) =>
ability.can(item.permission.ability, item.permission.subject),
);
},
[ability],
);
};