mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-22 15:50:32 +00:00
feat: dashboard quick new access control.
This commit is contained in:
@@ -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);
|
||||||
|
};
|
||||||
|
|||||||
@@ -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}`);
|
||||||
|
|||||||
@@ -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],
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
Reference in New Issue
Block a user