Skip to content

Commit

Permalink
Merge branch 'main' into create-side-profile-view
Browse files Browse the repository at this point in the history
  • Loading branch information
ciremusyoka committed Jun 5, 2024
2 parents f1ddbbe + 8434097 commit 32bb632
Show file tree
Hide file tree
Showing 29 changed files with 235 additions and 110 deletions.
2 changes: 1 addition & 1 deletion app/src/App/fhir-apps.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -343,7 +343,7 @@ const FHIRApps = () => {
exact
path={URL_TEAM_ASSIGNMENT}
{...teamAffiliationProps}
permissions={['OrganizationAffiliation.read']}
permissions={['OrganizationAffiliation.read', 'Location.read']}
component={FhirTeamAssignment}
/>
<PrivateComponent
Expand Down
2 changes: 1 addition & 1 deletion app/src/routes/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ export function getRoutes(roles: string[], t: TFunction, userRole: UserRole): Ro
children: [
{ title: t('Teams'), url: URL_TEAMS, key: 'TEAMS', permissions: ['Organization.read'] },
{
permissions: ['OrganizationAffiliation.read'],
permissions: ['OrganizationAffiliation.read', 'Location.read'],
title: t('Team Assignment'),
url: URL_TEAM_ASSIGNMENT,
key: 'team-assignment',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ export interface CareTeamFormProps {
fhirBaseURL: string;
practitioners: IPractitioner[];
organizations: IOrganization[];
disabled?: string[];
}

/**
Expand All @@ -37,7 +38,7 @@ export interface CareTeamFormProps {
* @param {object} props - component props
*/
const CareTeamForm: React.FC<CareTeamFormProps> = (props: CareTeamFormProps) => {
const { fhirBaseURL, initialValues, practitioners, organizations } = props;
const { fhirBaseURL, initialValues, practitioners, organizations, disabled } = props;
const [isSubmitting, setIsSubmitting] = useState<boolean>(false);
const history = useHistory();
const { t } = useTranslation();
Expand Down Expand Up @@ -123,6 +124,7 @@ const CareTeamForm: React.FC<CareTeamFormProps> = (props: CareTeamFormProps) =>
showSearch
options={practOptions}
filterOption={selectFilterFunction}
disabled={disabled?.includes(practitionerParticipants)}
/>
</Form.Item>

Expand All @@ -139,6 +141,7 @@ const CareTeamForm: React.FC<CareTeamFormProps> = (props: CareTeamFormProps) =>
showSearch
placeholder={t('Select a managing Organization')}
filterOption={selectFilterFunction}
disabled={disabled?.includes(managingOrganizations)}
/>
</Form.Item>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@ import {
import {
FHIR_CARE_TEAM,
FHIR_PRACTITIONERS,
managingOrganizations,
organizationResourceType,
practitionerParticipants,
practitionerResourceType,
ROUTE_PARAM_CARE_TEAM_ID,
} from '../../constants';
Expand All @@ -23,6 +25,7 @@ import { useTranslation } from '../../mls';
import { IPractitioner } from '@smile-cdr/fhirts/dist/FHIR-R4/interfaces/IPractitioner';
import { ICareTeam } from '@smile-cdr/fhirts/dist/FHIR-R4/interfaces/ICareTeam';
import { IOrganization } from '@smile-cdr/fhirts/dist/FHIR-R4/interfaces/IOrganization';
import { useUserRole } from '@opensrp/rbac';

// Interface for route params
interface RouteParams {
Expand All @@ -44,6 +47,7 @@ export type CreateEditCareTeamProps = EditCareTeamProps & RouteComponentProps<Ro

const CreateEditCareTeam: React.FC<CreateEditCareTeamProps> = (props: CreateEditCareTeamProps) => {
const { fhirBaseURL } = props;
const userRole = useUserRole();
const params = useParams<RouteParams>();
const careTeamId = params[ROUTE_PARAM_CARE_TEAM_ID];
const { t } = useTranslation();
Expand All @@ -60,21 +64,25 @@ const CreateEditCareTeam: React.FC<CreateEditCareTeamProps> = (props: CreateEdit
}
);

const hasReadOrgs = userRole.hasPermissions(['Organization.read']);
const organizations = useQuery(
organizationResourceType,
async () => loadAllResources(fhirBaseURL, organizationResourceType),
{
onError: () => sendErrorNotification(t('There was a problem fetching organizations')),
select: (res) => getResourcesFromBundle<IOrganization>(res),
enabled: hasReadOrgs,
}
);

const hasReadPractitioner = userRole.hasPermissions(['Practitioner.read']);
const fhirPractitioners = useQuery(
FHIR_PRACTITIONERS,
async () => loadAllResources(fhirBaseURL, practitionerResourceType, { active: true }),
{
onError: () => sendErrorNotification(t('There was a problem fetching practitioners')),
select: (res) => getResourcesFromBundle<IPractitioner>(res),
enabled: hasReadPractitioner,
}
);

Expand All @@ -92,11 +100,19 @@ const CreateEditCareTeam: React.FC<CreateEditCareTeamProps> = (props: CreateEdit

const buildInitialValues = getCareTeamFormFields(singleCareTeam.data as ICareTeam);

const disabledFields: string[] = [];
if (!hasReadOrgs) {
disabledFields.push(managingOrganizations);
}
if (!hasReadPractitioner) {
disabledFields.push(practitionerParticipants);
}
const careTeamFormProps = {
fhirBaseURL,
initialValues: buildInitialValues,
organizations: organizations.data ?? [],
practitioners: fhirPractitioners.data ?? [],
disabled: disabledFields,
};

return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ import { screen, render } from '@testing-library/react';
import userEvents from '@testing-library/user-event';
import { careTeam1, careTeam4201Edited, organizations } from './fixtures';
import flushPromises from 'flush-promises';
import { RoleContext } from '@opensrp/rbac';
import { superUserRole } from '@opensrp/react-utils';

jest.mock('fhirclient', () => {
return jest.requireActual('fhirclient/lib/entry/browser');
Expand Down Expand Up @@ -56,14 +58,16 @@ const AppWrapper = (props: any) => {
return (
<Provider store={store}>
<QueryClientProvider client={queryClient}>
<Switch>
<Route exact path="/add">
<CreateEditCareTeam {...props} />
</Route>
<Route exact path={`/add/:${ROUTE_PARAM_CARE_TEAM_ID}`}>
<CreateEditCareTeam {...props} />
</Route>
</Switch>
<RoleContext.Provider value={superUserRole}>
<Switch>
<Route exact path="/add">
<CreateEditCareTeam {...props} />
</Route>
<Route exact path={`/add/:${ROUTE_PARAM_CARE_TEAM_ID}`}>
<CreateEditCareTeam {...props} />
</Route>
</Switch>
</RoleContext.Provider>
</QueryClientProvider>
</Provider>
);
Expand Down
2 changes: 1 addition & 1 deletion packages/fhir-care-team/src/components/ListView/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -119,7 +119,7 @@ export const CareTeamList: React.FC<CareTeamListPropTypes> = (props: CareTeamLis
},
{
key: '2',
permissions: [],
permissions: ['CareTeam.read'],
label: (
<Button type="link" onClick={() => addParam(viewDetailsQuery, record.id)}>
View Details
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ import { ITask } from '@smile-cdr/fhirts/dist/FHIR-R4/interfaces/ITask';
import { ICarePlan } from '@smile-cdr/fhirts/dist/FHIR-R4/interfaces/ICarePlan';
import { Coding } from '@smile-cdr/fhirts/dist/FHIR-R4/classes/coding';
import { Button } from 'antd';
import { useUserRole } from '@opensrp/rbac';

/** Populated table tabs wrapper props */
export interface PopulatedTableTabsProps {
Expand All @@ -68,8 +69,14 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
) => {
const { fhirBaseURL, patientId } = props;
const { t } = useTranslation();
const userRole = useUserRole();

const { addParams, removeParam } = useSearchParams();
const hasCareTeamRead = userRole.hasPermissions(['CareTeam.read']);
const hasConditionRead = userRole.hasPermissions(['Condition.read']);
const hasTaskRead = userRole.hasPermissions(['Task.read']);
const hasImmunizationRead = userRole.hasPermissions(['Immunization.read']);
const hasEncounterRead = userRole.hasPermissions(['Encounter.read']);

const defaultTableData = {
resourceId: patientId,
Expand Down Expand Up @@ -158,10 +165,12 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
resourceType={carePlanResourceType}
title={t('Care plan')}
resourceFilters={defaultSearchParamsFactory(patientId)}
hasResourcePermissions={hasCareTeamRead}
/>
),
key: 'carePlan',
children: <TabsTable<ICarePlan> {...carePlanTableData} />,
disabled: !hasCareTeamRead,
},
{
label: (
Expand All @@ -170,10 +179,12 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
resourceType={conditionResourceType}
title={t('Condition')}
resourceFilters={defaultSearchParamsFactory(patientId)}
hasResourcePermissions={hasConditionRead}
/>
),
key: 'condition',
children: <TabsTable<ICondition> {...conditionTableData} />,
disabled: !hasConditionRead,
},
{
label: (
Expand All @@ -182,10 +193,12 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
resourceType={taskResourceType}
title={t('Task')}
resourceFilters={taskSearchParams(patientId)}
hasResourcePermissions={hasTaskRead}
/>
),
key: 'task',
children: <TabsTable<ITask> {...taskTableData} />,
disabled: !hasTaskRead,
},
{
label: (
Expand All @@ -194,10 +207,12 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
resourceType={immunizationResourceType}
title={t('Immunization')}
resourceFilters={immunizationSearchParams(patientId)}
hasResourcePermissions={hasImmunizationRead}
/>
),
key: 'immunization',
children: <TabsTable<IImmunization> {...immunizationTableData} />,
disabled: !hasImmunizationRead,
},
{
label: (
Expand All @@ -206,10 +221,12 @@ export const PopulatedTableTabs: React.FC<PopulatedTableTabsProps> = (
resourceType={encounterResourceType}
title={t('Patient encounter')}
resourceFilters={defaultSearchParamsFactory(patientId)}
hasResourcePermissions={hasEncounterRead}
/>
),
key: 'patientEncounter',
children: <TabsTable<IEncounter> {...patientEncounterTableData} />,
disabled: !hasEncounterRead,
},
],
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import nock from 'nock';
import { authenticateUser } from '@onaio/session-reducer';
import { patientResourceDetails } from '../../tests/fixtures';
import { last } from 'lodash';
import { RoleContext } from '@opensrp/rbac';
import { superUserRole } from '@opensrp/react-utils';

const { QueryClient, QueryClientProvider } = reactQuery;

Expand Down Expand Up @@ -87,7 +89,11 @@ const AppWrapper = (props: any) => {
<QueryClientProvider client={queryClient}>
<Switch>
<Route exact path={`${LIST_PATIENTS_URL}/:id`}>
{(routeProps) => <PopulatedTableTabs {...{ ...props, ...routeProps }} />}
{(routeProps) => (
<RoleContext.Provider value={superUserRole}>
<PopulatedTableTabs {...{ ...props, ...routeProps }} />
</RoleContext.Provider>
)}
</Route>
</Switch>
</QueryClientProvider>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import {
resourceEntriesCount,
} from '../PopulatedTableTabs/tests/fixtures';
import { last } from 'lodash';
import { RoleContext } from '@opensrp/rbac';
import { superUserRole } from '@opensrp/react-utils';

const { QueryClient, QueryClientProvider } = reactQuery;

Expand Down Expand Up @@ -86,7 +88,11 @@ const AppWrapper = (props: any) => {
<QueryClientProvider client={queryClient}>
<Switch>
<Route exact path={props.path}>
{(routeProps) => <PatientDetails {...{ ...props, ...routeProps }} />}
{(routeProps) => (
<RoleContext.Provider value={superUserRole}>
<PatientDetails {...{ ...props, ...routeProps }} />
</RoleContext.Provider>
)}
</Route>
</Switch>
</QueryClientProvider>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export function BaseListView<TableData extends ExtendableTableData = DefaultTabl
<Col className="main-content">
<div className="main-content__header">
<SearchForm data-testid="search-form" {...searchFormProps} />
<RbacCheck permissions={['Group.create']}>
<RbacCheck permissions={['Group.create', 'List.create', 'List.update']}>
{createButtonUrl ? (
<Button type="primary" onClick={() => history.push(createButtonUrl)}>
<PlusOutlined />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,8 @@ import userEvent from '@testing-library/user-event';
import * as notifications from '@opensrp/notifications';
import { photoUploadCharacteristicCode } from '../../../../helpers/utils';
import { cloneDeep } from 'lodash';
import { RoleContext } from '@opensrp/rbac';
import { superUserRole } from '@opensrp/react-utils';

jest.mock('@opensrp/notifications', () => ({
__esModule: true,
Expand Down Expand Up @@ -66,14 +68,16 @@ const AppWrapper = (props: any) => {
return (
<Provider store={store}>
<QueryClientProvider client={queryClient}>
<Switch>
<Route exact path="/add">
<CommodityAddEdit {...props} />
</Route>
<Route exact path="/add/:id">
<CommodityAddEdit {...props} />
</Route>
</Switch>
<RoleContext.Provider value={superUserRole}>
<Switch>
<Route exact path="/add">
<CommodityAddEdit {...props} />
</Route>
<Route exact path="/add/:id">
<CommodityAddEdit {...props} />
</Route>
</Switch>
</RoleContext.Provider>
</QueryClientProvider>
</Provider>
);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ export const DefaultCommodityList = (props: GroupListProps) => {
// eslint-disable-next-line react/display-name
render: (_: unknown, record: DefaultTableData) => (
<span className="d-flex align-items-center">
<RbacCheck permissions={['Group.update']}>
<RbacCheck permissions={['Group.update', 'List.create', 'List.update']}>
<>
<Link to={`${ADD_EDIT_COMMODITY_URL}/${record.id}`} className="m-0 p-1">
{t('Edit')}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export const EusmCommodityList = (props: GroupListProps) => {
// eslint-disable-next-line react/display-name
render: (_: unknown, record: TableData) => (
<span className="d-flex align-items-center">
<RbacCheck permissions={['Group.update']}>
<RbacCheck permissions={['Group.update', 'List.create', 'List.update']}>
<>
<Link to={`${ADD_EDIT_COMMODITY_URL}/${record.id}`} className="m-0 p-1">
{t('Edit')}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ import {
normalizeFileInputEvent,
SelectOption,
} from './utils';
import { useUserRole } from '@opensrp/rbac';

const { Item: FormItem } = Form;

Expand Down Expand Up @@ -83,6 +84,11 @@ function CommodityForm<
const { t } = useTranslation();
const goTo = (url = '#') => history.push(url);

const userRole = useUserRole();
if (!userRole.hasPermissions(['Binary.create'])) {
disabled.push(productImage);
}

const { mutate, isLoading } = useMutation(
(values: FormFields) => {
return mutationEffect(initialValues, values);
Expand Down Expand Up @@ -287,6 +293,7 @@ function CommodityForm<
multiple={false}
listType="picture-card"
maxCount={1}
disabled={disabled.includes(productImage)}
>
{!getFieldValue(productImage)?.length ? (
<button
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,7 @@ export const UserList = (props: OrganizationListProps) => {
<Col className="main-content">
<div className="main-content__header">
<SearchForm data-testid="search-form" {...searchFormProps} />
<RbacCheck permissions={['iam_user.create']}>
<RbacCheck permissions={['iam_user.create', 'Practitioner.create']}>
<Button type="primary" onClick={() => history.push(URL_USER_CREATE)}>
<PlusOutlined />
{t('Add User')}
Expand Down
Loading

0 comments on commit 32bb632

Please sign in to comment.