feat: add project ability.

This commit is contained in:
elforjani13
2022-08-30 19:18:19 +02:00
parent 7c6a85d1d4
commit d77fcb7c89
6 changed files with 86 additions and 50 deletions

View File

@@ -19,6 +19,7 @@ export const AbilitySubject = {
SubscriptionBilling: 'SubscriptionBilling', SubscriptionBilling: 'SubscriptionBilling',
CreditNote: 'CreditNote', CreditNote: 'CreditNote',
VendorCredit: 'VendorCredit', VendorCredit: 'VendorCredit',
Project:'Project'
}; };
export const ItemAction = { export const ItemAction = {
@@ -73,7 +74,7 @@ export const CreditNoteAction = {
Create: 'Create', Create: 'Create',
Edit: 'Edit', Edit: 'Edit',
Delete: 'Delete', Delete: 'Delete',
Refund: 'Refund' Refund: 'Refund',
}; };
export const VendorCreditAction = { export const VendorCreditAction = {
@@ -81,7 +82,7 @@ export const VendorCreditAction = {
Create: 'Create', Create: 'Create',
Edit: 'Edit', Edit: 'Edit',
Delete: 'Delete', Delete: 'Delete',
Refund: 'Refund' Refund: 'Refund',
}; };
export const BillAction = { export const BillAction = {
View: 'View', View: 'View',
@@ -141,6 +142,13 @@ export const CashflowAction = {
Delete: 'Delete', Delete: 'Delete',
}; };
export const ProjectAction = {
View: 'View',
Create: 'Create',
Edit: 'Edit',
Delete: 'Delete',
};
export const ReportsAction = { export const ReportsAction = {
ALL: 'all', ALL: 'all',
READ_BALANCE_SHEET: 'read-balance-sheet', READ_BALANCE_SHEET: 'read-balance-sheet',

View File

@@ -4,4 +4,5 @@ export const Features = {
Warehouses: 'warehouses', Warehouses: 'warehouses',
Branches: 'branches', Branches: 'branches',
ManualJournal: 'manualJournal', ManualJournal: 'manualJournal',
Projects:'Projects'
} }

View File

@@ -23,6 +23,7 @@ import {
ManualJournalAction, ManualJournalAction,
ExpenseAction, ExpenseAction,
CashflowAction, CashflowAction,
ProjectAction,
PreferencesAbility, PreferencesAbility,
SubscriptionBillingAbility, SubscriptionBillingAbility,
} from '@/constants/abilityOption'; } from '@/constants/abilityOption';
@@ -554,6 +555,10 @@ export const SidebarMenu = [
text: 'Projects', text: 'Projects',
href: '/projects', href: '/projects',
type: ISidebarMenuItemType.Link, type: ISidebarMenuItemType.Link,
permission: {
subject: AbilitySubject.Project,
ability: ProjectAction.View,
},
}, },
], ],
}, },
@@ -565,6 +570,10 @@ export const SidebarMenu = [
text: <T id={'projects.label.new_project'} />, text: <T id={'projects.label.new_project'} />,
type: ISidebarMenuItemType.Dialog, type: ISidebarMenuItemType.Dialog,
dialogName: 'project-form', dialogName: 'project-form',
permission: {
subject: AbilitySubject.Project,
ability: ProjectAction.Create,
},
}, },
{ {
text: <T id={'projects.label.new_time_entry'} />, text: <T id={'projects.label.new_time_entry'} />,

View File

@@ -8,6 +8,7 @@ import {
} from '@blueprintjs/core'; } from '@blueprintjs/core';
import { import {
Icon, Icon,
Can,
AdvancedFilterPopover, AdvancedFilterPopover,
DashboardActionViewsList, DashboardActionViewsList,
DashboardFilterButton, DashboardFilterButton,
@@ -15,6 +16,7 @@ import {
FormattedMessage as T, FormattedMessage as T,
DashboardActionsBar, DashboardActionsBar,
} from '@/components'; } from '@/components';
import { ProjectAction, AbilitySubject } from '@/constants/abilityOption';
import withProjects from './withProjects'; import withProjects from './withProjects';
import withProjectsActions from './withProjectsActions'; import withProjectsActions from './withProjectsActions';
@@ -75,12 +77,14 @@ function ProjectsActionsBar({
onChange={handleTabChange} onChange={handleTabChange}
/> />
<NavbarDivider /> <NavbarDivider />
<Button <Can I={ProjectAction.Create} a={AbilitySubject.Project}>
className={Classes.MINIMAL} <Button
icon={<Icon icon="plus" />} className={Classes.MINIMAL}
text={<T id={'projects.label.new_project'} />} icon={<Icon icon="plus" />}
onClick={handleNewProjectBtnClick} text={<T id={'projects.label.new_project'} />}
/> onClick={handleNewProjectBtnClick}
/>
</Can>
{/* AdvancedFilterPopover */} {/* AdvancedFilterPopover */}
<Button <Button

View File

@@ -1,6 +1,7 @@
import React from 'react'; import React from 'react';
import { Button, Intent } from '@blueprintjs/core'; import { Button, Intent } from '@blueprintjs/core';
import { EmptyStatus, FormattedMessage as T } from '@/components'; import { EmptyStatus, Can, FormattedMessage as T } from '@/components';
import { ProjectAction, AbilitySubject } from '@/constants/abilityOption';
import withDialogActions from '@/containers/Dialog/withDialogActions'; import withDialogActions from '@/containers/Dialog/withDialogActions';
import { compose } from '@/utils'; import { compose } from '@/utils';
@@ -24,16 +25,18 @@ function ProjectsEmptyStatus({
} }
action={ action={
<React.Fragment> <React.Fragment>
<Button <Can I={ProjectAction.Create} a={AbilitySubject.Project}>
intent={Intent.PRIMARY} <Button
large={true} intent={Intent.PRIMARY}
onClick={handleNewProjectClick} large={true}
> onClick={handleNewProjectClick}
<T id="projects.empty_status.action" /> >
</Button> <T id="projects.empty_status.action" />
<Button intent={Intent.NONE} large={true}> </Button>
<T id={'learn_more'} /> <Button intent={Intent.NONE} large={true}>
</Button> <T id={'learn_more'} />
</Button>
</Can>
</React.Fragment> </React.Fragment>
} }
/> />

View File

@@ -13,10 +13,12 @@ import {
import { import {
Icon, Icon,
FormatDate, FormatDate,
Can,
Choose, Choose,
If, If,
FormattedMessage as T, FormattedMessage as T,
} from '@/components'; } from '@/components';
import { ProjectAction, AbilitySubject } from '@/constants/abilityOption';
import { safeCallback, firstLettersArgs, calculateStatus } from '@/utils'; import { safeCallback, firstLettersArgs, calculateStatus } from '@/utils';
/** /**
@@ -81,37 +83,46 @@ export const ActionsMenu = ({
text={intl.get('view_details')} text={intl.get('view_details')}
onClick={safeCallback(onViewDetails, original)} onClick={safeCallback(onViewDetails, original)}
/> />
<MenuDivider /> <Can I={ProjectAction.Edit} a={AbilitySubject.Project}>
<MenuItem <MenuDivider />
icon={<Icon icon="pen-18" />} <MenuItem
text={intl.get('projects.action.edit_project')} icon={<Icon icon="pen-18" />}
onClick={safeCallback(onEdit, original)} text={intl.get('projects.action.edit_project')}
/> onClick={safeCallback(onEdit, original)}
<MenuItem />
icon={<Icon icon="plus" />} </Can>
text={intl.get('projects.action.new_task')} <Can I={ProjectAction.Create} a={AbilitySubject.Project}>
onClick={safeCallback(onNewTask, original)} <MenuItem
/> icon={<Icon icon="plus" />}
text={intl.get('projects.action.new_task')}
<MenuItem text={'Status'} icon={<Icon icon="plus" />}> onClick={safeCallback(onNewTask, original)}
<If condition={original.status !== 'InProgress'}> />
<MenuItem </Can>
text={'InProgress'} <Can I={ProjectAction.View} a={AbilitySubject.Project}>
onClick={safeCallback(onStatus, original)} <MenuItem text={'Status'} icon={<Icon icon="plus" />}>
/> <If condition={original.status !== 'InProgress'}>
</If> <MenuItem
<If condition={original.status !== 'Closed'}> text={'InProgress'}
<MenuItem text={'Closed'} onClick={safeCallback(onStatus, original)} /> onClick={safeCallback(onStatus, original)}
</If> />
</MenuItem> </If>
<If condition={original.status !== 'Closed'}>
<MenuDivider /> <MenuItem
<MenuItem text={'Closed'}
text={intl.get('projects.action.delete_project')} onClick={safeCallback(onStatus, original)}
icon={<Icon icon="trash-16" iconSize={16} />} />
intent={Intent.DANGER} </If>
onClick={safeCallback(onDelete, original)} </MenuItem>
/> </Can>
<Can I={ProjectAction.Delete} a={AbilitySubject.Project}>
<MenuDivider />
<MenuItem
text={intl.get('projects.action.delete_project')}
icon={<Icon icon="trash-16" iconSize={16} />}
intent={Intent.DANGER}
onClick={safeCallback(onDelete, original)}
/>
</Can>
</Menu> </Menu>
); );