mirror of
https://github.com/bigcapitalhq/bigcapital.git
synced 2026-02-22 07:40:32 +00:00
feat: add estimate ability.
This commit is contained in:
@@ -14,8 +14,12 @@ import { useEstimateDetailDrawerContext } from './EstimateDetailDrawerProvider';
|
|||||||
import withDialogActions from 'containers/Dialog/withDialogActions';
|
import withDialogActions from 'containers/Dialog/withDialogActions';
|
||||||
import withAlertsActions from 'containers/Alert/withAlertActions';
|
import withAlertsActions from 'containers/Alert/withAlertActions';
|
||||||
import withDrawerActions from 'containers/Drawer/withDrawerActions';
|
import withDrawerActions from 'containers/Drawer/withDrawerActions';
|
||||||
|
import {
|
||||||
|
Estimate_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../common/abilityOption';
|
||||||
|
|
||||||
import { Icon, FormattedMessage as T, MoreMenuItems } from 'components';
|
import { Icon, FormattedMessage as T, MoreMenuItems, Can } from 'components';
|
||||||
|
|
||||||
import { compose } from 'utils';
|
import { compose } from 'utils';
|
||||||
|
|
||||||
@@ -59,27 +63,33 @@ function EstimateDetailActionsBar({
|
|||||||
return (
|
return (
|
||||||
<DashboardActionsBar>
|
<DashboardActionsBar>
|
||||||
<NavbarGroup>
|
<NavbarGroup>
|
||||||
<Button
|
<Can I={Estimate_Abilities.Edit} a={AbilitySubject.Estimate}>
|
||||||
className={Classes.MINIMAL}
|
<Button
|
||||||
icon={<Icon icon="pen-18" />}
|
className={Classes.MINIMAL}
|
||||||
text={<T id={'edit_estimate'} />}
|
icon={<Icon icon="pen-18" />}
|
||||||
onClick={handleEditEstimate}
|
text={<T id={'edit_estimate'} />}
|
||||||
/>
|
onClick={handleEditEstimate}
|
||||||
<NavbarDivider />
|
/>
|
||||||
<Button
|
<NavbarDivider />
|
||||||
className={Classes.MINIMAL}
|
</Can>
|
||||||
icon={<Icon icon="print-16" />}
|
<Can I={Estimate_Abilities.View} a={AbilitySubject.Estimate}>
|
||||||
text={<T id={'print'} />}
|
<Button
|
||||||
onClick={handlePrintEstimate}
|
className={Classes.MINIMAL}
|
||||||
/>
|
icon={<Icon icon="print-16" />}
|
||||||
<Button
|
text={<T id={'print'} />}
|
||||||
className={Classes.MINIMAL}
|
onClick={handlePrintEstimate}
|
||||||
icon={<Icon icon={'trash-16'} iconSize={16} />}
|
/>
|
||||||
text={<T id={'delete'} />}
|
</Can>
|
||||||
intent={Intent.DANGER}
|
<Can I={Estimate_Abilities.Delete} a={AbilitySubject.Estimate}>
|
||||||
onClick={handleDeleteEstimate}
|
<Button
|
||||||
/>
|
className={Classes.MINIMAL}
|
||||||
<NavbarDivider />
|
icon={<Icon icon={'trash-16'} iconSize={16} />}
|
||||||
|
text={<T id={'delete'} />}
|
||||||
|
intent={Intent.DANGER}
|
||||||
|
onClick={handleDeleteEstimate}
|
||||||
|
/>
|
||||||
|
<NavbarDivider />
|
||||||
|
</Can>
|
||||||
<MoreMenuItems
|
<MoreMenuItems
|
||||||
payload={{
|
payload={{
|
||||||
onNotifyViaSMS: handleNotifyViaSMS,
|
onNotifyViaSMS: handleNotifyViaSMS,
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import {
|
|||||||
import { useHistory } from 'react-router-dom';
|
import { useHistory } from 'react-router-dom';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
|
Can,
|
||||||
FormattedMessage as T,
|
FormattedMessage as T,
|
||||||
AdvancedFilterPopover,
|
AdvancedFilterPopover,
|
||||||
If,
|
If,
|
||||||
@@ -28,6 +29,10 @@ import withSettings from 'containers/Settings/withSettings';
|
|||||||
|
|
||||||
import { useEstimatesListContext } from './EstimatesListProvider';
|
import { useEstimatesListContext } from './EstimatesListProvider';
|
||||||
import { useRefreshEstimates } from 'hooks/query/estimates';
|
import { useRefreshEstimates } from 'hooks/query/estimates';
|
||||||
|
import {
|
||||||
|
Estimate_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../../common/abilityOption';
|
||||||
|
|
||||||
import { compose } from 'utils';
|
import { compose } from 'utils';
|
||||||
|
|
||||||
@@ -87,12 +92,14 @@ function EstimateActionsBar({
|
|||||||
onChange={handleTabChange}
|
onChange={handleTabChange}
|
||||||
/>
|
/>
|
||||||
<NavbarDivider />
|
<NavbarDivider />
|
||||||
<Button
|
<Can I={Estimate_Abilities.Create} a={AbilitySubject.Estimate}>
|
||||||
className={Classes.MINIMAL}
|
<Button
|
||||||
icon={<Icon icon={'plus'} />}
|
className={Classes.MINIMAL}
|
||||||
text={<T id={'new_estimate'} />}
|
icon={<Icon icon={'plus'} />}
|
||||||
onClick={onClickNewEstimate}
|
text={<T id={'new_estimate'} />}
|
||||||
/>
|
onClick={onClickNewEstimate}
|
||||||
|
/>
|
||||||
|
</Can>
|
||||||
<AdvancedFilterPopover
|
<AdvancedFilterPopover
|
||||||
advancedFilterProps={{
|
advancedFilterProps={{
|
||||||
conditions: estimatesFilterRoles,
|
conditions: estimatesFilterRoles,
|
||||||
|
|||||||
@@ -2,6 +2,10 @@ import React from 'react';
|
|||||||
import { Intent, Tag, Menu, MenuItem, MenuDivider } from '@blueprintjs/core';
|
import { Intent, Tag, Menu, MenuItem, MenuDivider } from '@blueprintjs/core';
|
||||||
import intl from 'react-intl-universal';
|
import intl from 'react-intl-universal';
|
||||||
import clsx from 'classnames';
|
import clsx from 'classnames';
|
||||||
|
import {
|
||||||
|
Estimate_Abilities,
|
||||||
|
AbilitySubject,
|
||||||
|
} from '../../../../common/abilityOption';
|
||||||
|
|
||||||
import { CLASSES } from '../../../../common/classes';
|
import { CLASSES } from '../../../../common/classes';
|
||||||
import {
|
import {
|
||||||
@@ -11,6 +15,7 @@ import {
|
|||||||
Choose,
|
Choose,
|
||||||
Icon,
|
Icon,
|
||||||
If,
|
If,
|
||||||
|
Can,
|
||||||
} from 'components';
|
} from 'components';
|
||||||
import { safeCallback } from 'utils';
|
import { safeCallback } from 'utils';
|
||||||
|
|
||||||
@@ -68,63 +73,74 @@ export function ActionsMenu({
|
|||||||
text={intl.get('view_details')}
|
text={intl.get('view_details')}
|
||||||
onClick={safeCallback(onViewDetails, original)}
|
onClick={safeCallback(onViewDetails, original)}
|
||||||
/>
|
/>
|
||||||
<MenuDivider />
|
<Can I={Estimate_Abilities.Edit} a={AbilitySubject.Estimate}>
|
||||||
<MenuItem
|
<MenuDivider />
|
||||||
icon={<Icon icon="pen-18" />}
|
|
||||||
text={intl.get('edit_estimate')}
|
|
||||||
onClick={safeCallback(onEdit, original)}
|
|
||||||
/>
|
|
||||||
<MenuItem
|
|
||||||
icon={<Icon icon="convert_to" />}
|
|
||||||
text={intl.get('convert_to_invoice')}
|
|
||||||
onClick={safeCallback(onConvert, original)}
|
|
||||||
/>
|
|
||||||
<If condition={!original.is_delivered}>
|
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={<Icon icon={'check'} iconSize={18} />}
|
icon={<Icon icon="pen-18" />}
|
||||||
text={intl.get('mark_as_delivered')}
|
text={intl.get('edit_estimate')}
|
||||||
onClick={safeCallback(onDeliver, original)}
|
onClick={safeCallback(onEdit, original)}
|
||||||
/>
|
/>
|
||||||
</If>
|
<MenuItem
|
||||||
<Choose>
|
icon={<Icon icon="convert_to" />}
|
||||||
<Choose.When condition={original.is_delivered && original.is_approved}>
|
text={intl.get('convert_to_invoice')}
|
||||||
<MenuItem
|
onClick={safeCallback(onConvert, original)}
|
||||||
icon={<Icon icon={'close-black'} />}
|
/>
|
||||||
text={intl.get('mark_as_rejected')}
|
|
||||||
onClick={safeCallback(onReject, original)}
|
<If condition={!original.is_delivered}>
|
||||||
/>
|
|
||||||
</Choose.When>
|
|
||||||
<Choose.When condition={original.is_delivered && original.is_rejected}>
|
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={<Icon icon={'check'} iconSize={18} />}
|
icon={<Icon icon={'check'} iconSize={18} />}
|
||||||
text={intl.get('mark_as_approved')}
|
text={intl.get('mark_as_delivered')}
|
||||||
onClick={safeCallback(onApprove, original)}
|
onClick={safeCallback(onDeliver, original)}
|
||||||
/>
|
/>
|
||||||
</Choose.When>
|
</If>
|
||||||
<Choose.When condition={original.is_delivered}>
|
<Choose>
|
||||||
<MenuItem
|
<Choose.When
|
||||||
icon={<Icon icon={'check'} iconSize={18} />}
|
condition={original.is_delivered && original.is_approved}
|
||||||
text={intl.get('mark_as_approved')}
|
>
|
||||||
onClick={safeCallback(onApprove, original)}
|
<MenuItem
|
||||||
/>
|
icon={<Icon icon={'close-black'} />}
|
||||||
<MenuItem
|
text={intl.get('mark_as_rejected')}
|
||||||
icon={<Icon icon={'close-black'} />}
|
onClick={safeCallback(onReject, original)}
|
||||||
text={intl.get('mark_as_rejected')}
|
/>
|
||||||
onClick={safeCallback(onReject, original)}
|
</Choose.When>
|
||||||
/>
|
<Choose.When
|
||||||
</Choose.When>
|
condition={original.is_delivered && original.is_rejected}
|
||||||
</Choose>
|
>
|
||||||
<MenuItem
|
<MenuItem
|
||||||
icon={<Icon icon={'print-16'} iconSize={16} />}
|
icon={<Icon icon={'check'} iconSize={18} />}
|
||||||
text={intl.get('print')}
|
text={intl.get('mark_as_approved')}
|
||||||
onClick={safeCallback(onPrint, original)}
|
onClick={safeCallback(onApprove, original)}
|
||||||
/>
|
/>
|
||||||
<MenuItem
|
</Choose.When>
|
||||||
text={intl.get('delete_estimate')}
|
<Choose.When condition={original.is_delivered}>
|
||||||
intent={Intent.DANGER}
|
<MenuItem
|
||||||
onClick={safeCallback(onDelete, original)}
|
icon={<Icon icon={'check'} iconSize={18} />}
|
||||||
icon={<Icon icon="trash-16" iconSize={16} />}
|
text={intl.get('mark_as_approved')}
|
||||||
/>
|
onClick={safeCallback(onApprove, original)}
|
||||||
|
/>
|
||||||
|
<MenuItem
|
||||||
|
icon={<Icon icon={'close-black'} />}
|
||||||
|
text={intl.get('mark_as_rejected')}
|
||||||
|
onClick={safeCallback(onReject, original)}
|
||||||
|
/>
|
||||||
|
</Choose.When>
|
||||||
|
</Choose>
|
||||||
|
</Can>
|
||||||
|
<Can I={Estimate_Abilities.View} a={AbilitySubject.Estimate}>
|
||||||
|
<MenuItem
|
||||||
|
icon={<Icon icon={'print-16'} iconSize={16} />}
|
||||||
|
text={intl.get('print')}
|
||||||
|
onClick={safeCallback(onPrint, original)}
|
||||||
|
/>
|
||||||
|
</Can>
|
||||||
|
<Can I={Estimate_Abilities.Delete} a={AbilitySubject.Estimate}>
|
||||||
|
<MenuItem
|
||||||
|
text={intl.get('delete_estimate')}
|
||||||
|
intent={Intent.DANGER}
|
||||||
|
onClick={safeCallback(onDelete, original)}
|
||||||
|
icon={<Icon icon="trash-16" iconSize={16} />}
|
||||||
|
/>
|
||||||
|
</Can>
|
||||||
</Menu>
|
</Menu>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user