Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OH2-255 Revise and align permissions for CORE, API and UI #538

Merged
merged 9 commits into from
Jan 9, 2024
1,132 changes: 566 additions & 566 deletions api/oh.yaml

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/components/accessories/admission/PatientAdmission.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { CurrentAdmission } from "../currentAdmission/CurrentAdmission";
const PatientAdmission: FC = () => {
const { t } = useTranslation();
const dispatch = useDispatch();
const canCreate = usePermission("admission.create");
const canCreate = usePermission("admissions.create");
const infoBoxRef = useRef<HTMLDivElement>(null);
const [shouldResetForm, setShouldResetForm] = useState(false);
const [creationMode, setCreationMode] = useState(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const PatientAdmissionTable: FunctionComponent<IOwnProps> = ({
handleEdit,
}) => {
const { t } = useTranslation();
const canUpdate = usePermission("admission.update");
const canUpdate = usePermission("admissions.update");

const header = ["admDate", "disDate"];
const dateFields = ["admDate", "disDate"];
Expand Down
6 changes: 3 additions & 3 deletions src/components/accessories/appHeader/AppHeader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ const AppHeader: FunctionComponent<TProps> = ({
};
const navigate = useNavigate();

const canAccessPatient = usePermission("patient.access");
const canAccessVisit = usePermission("visit.access");
const canAccessLaboratory = usePermission("laboratory.access");
const canAccessPatient = usePermission("patients.access");
const canAccessVisit = usePermission("opds.access");
const canAccessLaboratory = usePermission("laboratories.access");
const canAccessDashboard = usePermission("dashboard.access");

return (
Expand Down
20 changes: 10 additions & 10 deletions src/components/accessories/dashboard/layouts/consts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,16 +31,16 @@ export const DASHBOARDS: TDashboardComponent[] = [
*/
export const DASHBOARDS_PERMISSIONS: Record<TDashboardComponent, TPermission> =
{
admissionByAgeType: "admission.read",
admissionBySex: "admission.read",
admissionByType: "admission.read",
admissionByWard: "admission.read",
dischargeByAgeType: "discharges.read",
dischargeBySex: "discharges.read",
dischargeByType: "discharges.read",
dischargeByWard: "discharges.read",
opdByAgeType: "opd.read",
opdBySex: "opd.read",
admissionBySex: "admissions.read",
admissionByAgeType: "admissions.read",
admissionByType: "admissions.read",
admissionByWard: "admissions.read",
dischargeBySex: "admissions.read",
dischargeByAgeType: "admissions.read",
dischargeByType: "admissions.read",
dischargeByWard: "admissions.read",
opdByAgeType: "opds.read",
opdBySex: "opds.read",
};

export const defaultLayoutConfig: Layouts = {
Expand Down
224 changes: 112 additions & 112 deletions src/components/accessories/laboratory/EditLaboratoryContent.tsx
Original file line number Diff line number Diff line change
@@ -1,112 +1,112 @@
import { Button } from "@material-ui/core";
import { Cancel } from "@material-ui/icons";
import React, { FC, useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";
import { useDispatch, useSelector } from "react-redux";
import { useParams, useNavigate } from "react-router";
import { IState } from "../../../types";
import { initialFields } from "./consts";
import "./styles.scss";
import { useEffect } from "react";
import { updateLabFields } from "../../../libraries/formDataHandling/functions";
import {
createLabReset,
getLabWithRowsByCode,
getLabWithRowsByCodeReset,
updateLabReset,
} from "../../../state/laboratories/actions";
import { getExams } from "../../../state/exams/actions";
import ExamForm from "./examForm/ExamForm";
import { getPatientThunk } from "../../../state/patients/actions";
import { Permission } from "../../../libraries/permissionUtils/Permission";
export const EditLaboratoryContent: FC = () => {
const { t } = useTranslation();
const dispatch = useDispatch();
const { id } = useParams<{ id: string | undefined }>();
const navigate = useNavigate();
const creationMode = useMemo(() => (id ? false : true), [id]);
const labWithRows = useSelector(
(state: IState) => state.laboratories.getLabWithRowsByCode.data
);
const labToEdit = labWithRows?.laboratoryDTO;
useEffect(() => {
if (id) {
dispatch(getLabWithRowsByCode(parseInt(id)));
}
}, [id, dispatch]);
useEffect(() => {
if (labToEdit?.patientCode) {
dispatch(getPatientThunk(labToEdit.patientCode.toString()));
}
}, [labWithRows, dispatch, labToEdit?.patientCode]);
const handleReset = useCallback(() => {
dispatch(getLabWithRowsByCodeReset());
navigate(0);
}, [dispatch, navigate]);
const patient = useSelector(
(state: IState) => state.patients.selectedPatient.data
);
const open = useMemo(() => {
return creationMode
? true
: labWithRows?.laboratoryDTO?.code !== undefined &&
patient?.code !== undefined;
}, [creationMode, labWithRows, patient]);
const formFields = useMemo(() => {
return creationMode
? initialFields
: updateLabFields(initialFields, labToEdit ?? {});
}, [creationMode, labToEdit]);
useEffect(() => {
dispatch(getExams());
}, [dispatch]);
const handleBack = useCallback(() => {
if (creationMode) {
dispatch(createLabReset());
} else {
dispatch(updateLabReset());
}
navigate(-1);
}, [navigate, dispatch, creationMode]);
return (
<>
<div className="lab__header">
<div className="lab__title">{t("nav.laboratory")}</div>
<div className="lab__actions">
<Button
onClick={handleBack}
type="button"
variant="contained"
color="primary"
>
<Cancel fontSize="small" />
{t("common.discard")}
</Button>
</div>
</div>
<Permission require={creationMode ? "exam.create" : "exam.update"}>
{open && (
<ExamForm
fields={formFields}
handleReset={handleReset}
creationMode={creationMode}
labWithRowsToEdit={labWithRows ?? {}}
/>
)}
</Permission>
</>
);
};
import { Button } from "@material-ui/core";
import { Cancel } from "@material-ui/icons";
import React, { FC, useCallback, useMemo } from "react";
import { useTranslation } from "react-i18next";
import { useDispatch, useSelector } from "react-redux";
import { useParams, useNavigate } from "react-router";
import { IState } from "../../../types";
import { initialFields } from "./consts";
import "./styles.scss";
import { useEffect } from "react";
import { updateLabFields } from "../../../libraries/formDataHandling/functions";
import {
createLabReset,
getLabWithRowsByCode,
getLabWithRowsByCodeReset,
updateLabReset,
} from "../../../state/laboratories/actions";
import { getExams } from "../../../state/exams/actions";
import ExamForm from "./examForm/ExamForm";
import { getPatientThunk } from "../../../state/patients/actions";
import { Permission } from "../../../libraries/permissionUtils/Permission";

export const EditLaboratoryContent: FC = () => {
const { t } = useTranslation();
const dispatch = useDispatch();
const { id } = useParams<{ id: string | undefined }>();
const navigate = useNavigate();

const creationMode = useMemo(() => (id ? false : true), [id]);

const labWithRows = useSelector(
(state: IState) => state.laboratories.getLabWithRowsByCode.data
);

const labToEdit = labWithRows?.laboratoryDTO;

useEffect(() => {
if (id) {
dispatch(getLabWithRowsByCode(parseInt(id)));
}
}, [id, dispatch]);

useEffect(() => {
if (labToEdit?.patientCode) {
dispatch(getPatientThunk(labToEdit.patientCode.toString()));
}
}, [labWithRows, dispatch, labToEdit?.patientCode]);

const handleReset = useCallback(() => {
dispatch(getLabWithRowsByCodeReset());
navigate(0);
}, [dispatch, navigate]);

const patient = useSelector(
(state: IState) => state.patients.selectedPatient.data
);

const open = useMemo(() => {
return creationMode
? true
: labWithRows?.laboratoryDTO?.code !== undefined &&
patient?.code !== undefined;
}, [creationMode, labWithRows, patient]);

const formFields = useMemo(() => {
return creationMode
? initialFields
: updateLabFields(initialFields, labToEdit ?? {});
}, [creationMode, labToEdit]);

useEffect(() => {
dispatch(getExams());
}, [dispatch]);

const handleBack = useCallback(() => {
if (creationMode) {
dispatch(createLabReset());
} else {
dispatch(updateLabReset());
}
navigate(-1);
}, [navigate, dispatch, creationMode]);

return (
<>
<div className="lab__header">
<div className="lab__title">{t("nav.laboratory")}</div>
<div className="lab__actions">
<Button
onClick={handleBack}
type="button"
variant="contained"
color="primary"
>
<Cancel fontSize="small" />
{t("common.discard")}
</Button>
</div>
</div>
<Permission require={creationMode ? "exams.create" : "exams.update"}>
{open && (
<ExamForm
fields={formFields}
handleReset={handleReset}
creationMode={creationMode}
labWithRowsToEdit={labWithRows ?? {}}
/>
)}
</Permission>
</>
);
};
12 changes: 6 additions & 6 deletions src/components/accessories/laboratory/Exams.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -135,13 +135,13 @@ export const Exams: FC = () => {
const errorMessage = useSelector((state: IState) =>
state.laboratories.searchLabs.error?.message
? state.laboratories.searchLabs.error?.message
: "common.somethingwrong"
: t("common.somethingwrong")
);

const updateLabErrorMsg = useSelector((state: IState) =>
state.laboratories.updateLab.error?.message
? state.laboratories.updateLab.error?.message
: "common.somethingwrong"
: t("common.somethingwrong")
);

let status = useSelector(
Expand All @@ -156,7 +156,7 @@ export const Exams: FC = () => {
if (changeStatus === "SUCCESS") {
dispatch(searchLabs({ ...filter, paged: true }));
}
}, [changeStatus, dispatch, filter]);
}, [changeStatus]);

/**
* I commented the following lignes because they were causing issue with filter.
Expand All @@ -180,7 +180,7 @@ export const Exams: FC = () => {
/>
)}
{status !== "LOADING" && (
<Permission require="exam.read">
<Permission require="exams.read">
<ExamFilterForm
onSubmit={onSubmit}
fields={fields}
Expand All @@ -190,11 +190,11 @@ export const Exams: FC = () => {
<InfoBox type="info" message={t("common.emptydata")} />
)}
{status === "FAIL" && (
<InfoBox type="error" message={t(errorMessage)} />
<InfoBox type="error" message={errorMessage} />
)}
{changeStatus === "FAIL" && (
<div ref={infoBoxRef} className="info-box-container">
<InfoBox type="error" message={t(updateLabErrorMsg)} />
<InfoBox type="error" message={updateLabErrorMsg} />
</div>
)}
{status === "SUCCESS" && (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -252,7 +252,7 @@ export const ExamFilterForm: FC<IExamFilterProps> = ({
<form className="filterLabForm__form" onSubmit={formik.handleSubmit}>
<div className="filterLabForm__section">
<div className="filterLabForm__section_content">
<Permission require="patient.read">
<Permission require="patients.read">
<div className="fullWidth filterLabForm__item">
<PatientPicker
theme={"regular"}
Expand Down
4 changes: 2 additions & 2 deletions src/components/accessories/laboratory/table/ExamTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ export const ExamTable: FC<IExamTableProps> = ({
}) => {
const { t } = useTranslation();
const dispatch = useDispatch();
const canUpdate = usePermission("exam.update");
const canDelete = usePermission("exam.delete");
const canUpdate = usePermission("exams.update");
const canDelete = usePermission("exams.delete");
const deleteStatus = useSelector<IState, any>(
(state: IState) => state.laboratories.deleteLab.status
);
Expand Down
6 changes: 3 additions & 3 deletions src/components/accessories/opds/Opds.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -65,7 +65,7 @@ export const Opds: FC = () => {
switch (status) {
case "FAIL":
return (
<Permission require="opd.read">
<Permission require="opds.read">
<OpdFilterForm
onSubmit={onSubmit}
fields={fields}
Expand All @@ -84,7 +84,7 @@ export const Opds: FC = () => {

case "SUCCESS_EMPTY":
return (
<Permission require="opd.read">
<Permission require="opds.read">
<OpdFilterForm
onSubmit={onSubmit}
fields={fields}
Expand All @@ -96,7 +96,7 @@ export const Opds: FC = () => {

case "SUCCESS":
return (
<Permission require="opd.read">
<Permission require="opds.read">
<OpdFilterForm
onSubmit={onSubmit}
fields={fields}
Expand Down
2 changes: 1 addition & 1 deletion src/components/accessories/opds/filter/OpdFilterForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -469,7 +469,7 @@ export const OpdFilterForm: FC<IOpdFilterProps> = ({
{t("opd.patient")}
</div>
<div className="filterOpdForm__section_content">
<Permission require="patient.read">
<Permission require="patients.read">
<div className="filterOpdForm__item">
<PatientPicker
theme={"regular"}
Expand Down
Loading
Loading