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

Perms based Rendering #10526

Open
wants to merge 29 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
fe8cd5e
adding perm constants
Jacobjeevan Feb 8, 2025
617440a
perms for patient details v1
Jacobjeevan Feb 8, 2025
05b72ee
scheduling and users perms v1
Jacobjeevan Feb 8, 2025
14fa87d
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 10, 2025
d1b5b7e
more perms
Jacobjeevan Feb 10, 2025
9eba900
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 10, 2025
43d757b
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 11, 2025
f75320b
encounter perms and more
Jacobjeevan Feb 11, 2025
c04b2d4
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 12, 2025
2fe7fb7
perms for patientcard v1, treatment summary, encounter right sidebar
Jacobjeevan Feb 12, 2025
2d927a7
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 13, 2025
9866587
switch to encounter perms for encounter related pages
Jacobjeevan Feb 14, 2025
9d7bbb0
Patient level perms
Jacobjeevan Feb 17, 2025
1dbf403
Perms: override with userPerms only if objPerms aren't present
Jacobjeevan Feb 17, 2025
c6c5466
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 17, 2025
2f68fac
org perms
Jacobjeevan Feb 17, 2025
f49e2d7
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 18, 2025
81f79c6
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 18, 2025
7e18f6d
rm edit facility on list page + minor edits
Jacobjeevan Feb 19, 2025
da66af9
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 20, 2025
40b07b3
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 26, 2025
6d639eb
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 26, 2025
cb67337
switch from user perms
Jacobjeevan Feb 27, 2025
643529a
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Feb 27, 2025
48aed50
add perms check for dashboard
Jacobjeevan Mar 4, 2025
742f5ce
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Mar 4, 2025
b709061
org badge
Jacobjeevan Mar 4, 2025
ff30120
add superuser check back for dash; facilityData perms
Jacobjeevan Mar 5, 2025
6b38f31
Merge branch 'develop' into issues/10435-perms
Jacobjeevan Mar 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions public/locale/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -708,6 +708,7 @@
"create_questionnaire": "Create Questionnaire",
"create_resource_request": "Create Request",
"create_schedule_template": "Create Schedule Template",
"create_summaries": "Create Summaries",
"create_tag": "Create Tag",
"create_template": "Create Template",
"create_user": "Create User",
Expand Down Expand Up @@ -963,6 +964,7 @@
"encounter_notes__all_discussions": "All Discussions",
"encounter_notes__all_discussions_description": "View and manage encounternotes discussion threads",
"encounter_notes__be_first_to_send": "Be the first to send a message",
"encounter_notes__cannot_start_discussion_old_encounter": "You cannot start a new discussion for this encounter as it is {{encounterStatus}}.",
"encounter_notes__choose_template": "Choose a template or enter a custom title",
"encounter_notes__create_discussion": "Create a new discussion thread to organize your conversation topics.",
"encounter_notes__discussions": "Discussions",
Expand Down Expand Up @@ -1900,6 +1902,8 @@
"quick_access": "Quick Access",
"quick_actions": "Quick Actions",
"quick_actions_description": "Schedule an appointment or create a new encounter",
"quick_actions_description_create_appointment": "Schedule an appointment",
"quick_actions_description_create_encounter": "Create a new encounter",
"ration_card__APL": "APL",
"ration_card__BPL": "BPL",
"ration_card__NO_CARD": "Non-card holder",
Expand Down Expand Up @@ -2104,6 +2108,7 @@
"search_medication": "Search Medication",
"search_medications": "Search Medications",
"search_medicine": "Search Medicine",
"search_only_patient_page_text": "Search for existing patients using their phone number",
"search_organizations": "Search Organizations",
"search_patient_page_text": "Search for existing patients using their phone number or create a new patient record",
"search_patients": "Search Patients",
Expand Down
7 changes: 0 additions & 7 deletions src/Utils/permissions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,3 @@ export const showUserPasswordReset = (
export const showAvatarEdit = (authUser: UserModel, targetUser: UserBase) => {
return authUser.username === targetUser.username || authUser.is_superuser;
};

export const editUserPermissions = (
authUser: UserModel,
targetUser: UserBase,
) => {
return authUser.username === targetUser.username;
};
350 changes: 350 additions & 0 deletions src/common/Permissions.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,350 @@
// Patient Permissions
export const PERMISSION_CREATE_PATIENT = "can_create_patient";
export const PERMISSION_WRITE_PATIENT = "can_write_patient";
export const PERMISSION_LIST_PATIENTS = "can_list_patients";
export const PERMISSION_VIEW_CLINICAL_DATA = "can_view_clinical_data";
export const PERMISSION_VIEW_QUESTIONNAIRE_RESPONSES =
"can_view_questionnaire_responses";
export const PERMISSION_SUBMIT_PATIENT_QUESTIONNAIRE =
"can_submit_patient_questionnaire";

// Encounter Permissions
export const PERMISSION_CREATE_ENCOUNTER = "can_create_encounter";
export const PERMISSION_LIST_ENCOUNTERS = "can_list_encounter";
export const PERMISSION_WRITE_ENCOUNTER = "can_write_encounter";
export const PERMISSION_READ_ENCOUNTER = "can_read_encounter";
export const PERMISSION_SUBMIT_ENCOUNTER_QUESTIONNAIRE =
"can_submit_encounter_questionnaire";

// Facility Organization Permissions
export const PERMISSION_CREATE_FACILITY_ORGANIZATION =
"can_create_facility_organization";
export const PERMISSION_CREATE_FACILITY_ORGANIZATION_ROOT =
"can_create_facility_organization_root";
export const PERMISSION_VIEW_FACILITY_ORGANIZATION =
"can_view_facility_organization";
export const PERMISSION_DELETE_FACILITY_ORGANIZATION =
"can_delete_facility_organization";
export const PERMISSION_MANAGE_FACILITY_ORGANIZATION =
"can_manage_facility_organization";
export const PERMISSION_LIST_FACILITY_ORGANIZATION_USERS =
"can_list_facility_organization_users";
export const PERMISSION_MANAGE_FACILITY_ORGANIZATION_USERS =
"can_manage_facility_organization_users";

// Facility Permissions
export const PERMISSION_CREATE_FACILITY = "can_create_facility";
export const PERMISSION_READ_FACILITY = "can_read_facility";
export const PERMISSION_UPDATE_FACILITY = "can_update_facility";

// Location Permissions
export const PERMISSION_LIST_FACILITY_LOCATIONS = "can_list_facility_locations";
export const PERMISSION_WRITE_FACILITY_LOCATIONS =
"can_write_facility_locations";
export const PERMISSION_LIST_FACILITY_LOCATION_ORGANIZATIONS =
"can_list_facility_location_organizations";
export const PERMISSION_CREATE_FACILITY_LOCATION_ORGANIZATIONS =
"can_create_facility_location_organizations";

// Organization Permissions
export const PERMISSION_VIEW_ORGANIZATION = "can_view_organization";
export const PERMISSION_CREATE_ORGANIZATION = "can_create_organization";
export const PERMISSION_DELETE_ORGANIZATION = "can_delete_organization";
export const PERMISSION_MANAGE_ORGANIZATION = "can_manage_organization";
export const PERMISSION_MANAGE_ORGANIZATION_USERS =
"can_manage_organization_users";
export const PERMISSION_LIST_ORGANIZATION_USERS = "can_list_organization_users";

// Questionnaire Permissions
export const PERMISSION_WRITE_QUESTIONNAIRE = "can_write_questionnaire";
export const PERMISSION_ARCHIVE_QUESTIONNAIRE = "can_archive_questionnaire";
export const PERMISSION_READ_QUESTIONNAIRE = "can_read_questionnaire";
export const PERMISSION_SUBMIT_QUESTIONNAIRE = "can_submit_questionnaire";
export const PERMISSION_MANAGE_QUESTIONNAIRE = "can_manage_questionnaire";

// Appointment Permissions
export const PERMISSION_LIST_USER_BOOKING = "can_list_user_booking";
export const PERMISSION_WRITE_USER_BOOKING = "can_write_user_booking";
export const PERMISSION_CREATE_APPOINTMENT = "can_create_appointment";

// Schedule Permissions
export const PERMISSION_WRITE_USER_SCHEDULE = "can_write_user_schedule";
export const PERMISSION_LIST_USER_SCHEDULE = "can_list_user_schedule";

// User Permissions
export const PERMISSION_CREATE_USER = "can_create_user";
export const PERMISSION_LIST_USER = "can_list_user";

export interface Permissions {
// Patient Permissions
/** Permission slug: "can_create_patient" */
canCreatePatient: boolean;
/** Permission slug: "can_write_patient" */
canWritePatient: boolean;
/** Permission slug: "can_list_patients" */
canViewPatients: boolean;
/** Permission slug: "can_view_clinical_data" */
canViewClinicalData: boolean;
/** Permission slug: "can_view_questionnaire_responses" */
canViewPatientQuestionnaireResponses: boolean;
/** Permission slug: "can_submit_patient_questionnaire" */
canSubmitPatientQuestionnaireResponses: boolean;

// Encounter Permissions
/** Permission slug: "can_create_encounter" */
canCreateEncounter: boolean;
/** Permission slug: "can_list_encounter" */
canListEncounters: boolean;
/** Permission slug: "can_write_encounter" */
canWriteEncounter: boolean;
/** Permission slug: "can_read_encounter" */
canViewEncounter: boolean;
/** Permission slug: "can_submit_encounter_questionnaire" */
canSubmitEncounterQuestionnaire: boolean;

// Facility Organization Permissions
/** Permission slug: "can_create_facility_organization" */
canCreateFacilityOrganization: boolean;
/** Permission slug: "can_create_facility_organization_root" */
canCreateFacilityOrganizationRoot: boolean;
/** Permission slug: "can_view_facility_organization" */
canViewFacilityOrganizations: boolean;
/** Permission slug: "can_delete_facility_organization" */
canDeleteFacilityOrganization: boolean;
/** Permission slug: "can_manage_facility_organization" */
canManageFacilityOrganization: boolean;
/** Permission slug: "can_list_facility_organization_users" */
canListFacilityOrganizationUsers: boolean;
/** Permission slug: "can_manage_facility_organization_users" */
canManageFacilityOrganizationUsers: boolean;

// Facility Permissions
/** Permission slug: "can_create_facility" */
canCreateFacility: boolean;
/** Permission slug: "can_read_facility" */
canReadFacility: boolean;
/** Permission slug: "can_update_facility" */
canUpdateFacility: boolean;

// Location Permissions
/** Permission slug: "can_list_facility_locations" */
canListFacilityLocations: boolean;
/** Permission slug: "can_write_facility_locations" */
canWriteFacilityLocation: boolean;
/** Permission slug: "can_list_facility_location_organizations" */
canListFacilityLocationOrganizations: boolean;
/** Permission slug: "can_create_facility_location_organizations" */
canCreateFacilityLocationOrganizations: boolean;

// Organization Permissions
/** Permission slug: "can_view_organization" */
canViewOrganizations: boolean;
/** Permission slug: "can_create_organization" */
canCreateOrganization: boolean;
/** Permission slug: "can_delete_organization" */
canDeleteOrganization: boolean;
/** Permission slug: "can_manage_organization" */
canManageOrganization: boolean;
/** Permission slug: "can_manage_organization_users" */
canManageOrganizationUsers: boolean;
/** Permission slug: "can_list_organization_users" */
canListOrganizationUsers: boolean;

// Questionnaire Permissions
/** Permission slug: "can_write_questionnaire" */
canWriteQuestionnaire: boolean;
/** Permission slug: "can_archive_questionnaire" */
canArchiveQuestionnaire: boolean;
/** Permission slug: "can_read_questionnaire" */
canReadQuestionnaire: boolean;
/** Permission slug: "can_submit_questionnaire" */
canSubmitQuestionnaire: boolean;
/** Permission slug: "can_manage_questionnaire" */
canManageQuestionnaire: boolean;

// Appointment Permissions
/** Permission slug: "can_list_user_booking" */
canViewAppointments: boolean;
/** Permission slug: "can_write_user_booking" */
canUpdateAppointment: boolean;
/** Permission slug: "can_create_appointment" */
canCreateAppointment: boolean;

// Schedule Permissions
/** Permission slug: "can_write_user_schedule" */
canWriteSchedule: boolean;
/** Permission slug: "can_list_user_schedule" */
canViewSchedule: boolean;

// User Permissions
/** Permission slug: "can_create_user" */
canCreateUser: boolean;
/** Permission slug: "can_list_user" */
canListUsers: boolean;
}

export type HasPermissionFn = (
permission: string,
permissions: string[],
) => boolean;

export function getPermissions(
hasPermission: HasPermissionFn,
permissions: string[],
): Permissions {
return {
// Patients
canCreatePatient: hasPermission(PERMISSION_CREATE_PATIENT, permissions),
canWritePatient: hasPermission(PERMISSION_WRITE_PATIENT, permissions),
canViewPatients: hasPermission(PERMISSION_LIST_PATIENTS, permissions),
canViewClinicalData: hasPermission(
PERMISSION_VIEW_CLINICAL_DATA,
permissions,
),
canViewPatientQuestionnaireResponses: hasPermission(
PERMISSION_VIEW_QUESTIONNAIRE_RESPONSES,
permissions,
),
canSubmitPatientQuestionnaireResponses: hasPermission(
PERMISSION_SUBMIT_PATIENT_QUESTIONNAIRE,
permissions,
),

// Encounters
canCreateEncounter: hasPermission(PERMISSION_CREATE_ENCOUNTER, permissions),
canListEncounters: hasPermission(PERMISSION_LIST_ENCOUNTERS, permissions),
canWriteEncounter: hasPermission(PERMISSION_WRITE_ENCOUNTER, permissions),
canViewEncounter: hasPermission(PERMISSION_READ_ENCOUNTER, permissions),
canSubmitEncounterQuestionnaire: hasPermission(
PERMISSION_SUBMIT_ENCOUNTER_QUESTIONNAIRE,
permissions,
),

// Facility Organizations
canCreateFacilityOrganization: hasPermission(
PERMISSION_CREATE_FACILITY_ORGANIZATION,
permissions,
),
canCreateFacilityOrganizationRoot: hasPermission(
PERMISSION_CREATE_FACILITY_ORGANIZATION_ROOT,
permissions,
),
canViewFacilityOrganizations: hasPermission(
PERMISSION_VIEW_FACILITY_ORGANIZATION,
permissions,
),
canDeleteFacilityOrganization: hasPermission(
PERMISSION_DELETE_FACILITY_ORGANIZATION,
permissions,
),
canManageFacilityOrganization: hasPermission(
PERMISSION_MANAGE_FACILITY_ORGANIZATION,
permissions,
),
canListFacilityOrganizationUsers: hasPermission(
PERMISSION_LIST_FACILITY_ORGANIZATION_USERS,
permissions,
),
canManageFacilityOrganizationUsers: hasPermission(
PERMISSION_MANAGE_FACILITY_ORGANIZATION_USERS,
permissions,
),

// Facility
canCreateFacility: hasPermission(PERMISSION_CREATE_FACILITY, permissions),
canReadFacility: hasPermission(PERMISSION_READ_FACILITY, permissions),
canUpdateFacility: hasPermission(PERMISSION_UPDATE_FACILITY, permissions),

// Locations
canListFacilityLocations: hasPermission(
PERMISSION_LIST_FACILITY_LOCATIONS,
permissions,
),
canWriteFacilityLocation: hasPermission(
PERMISSION_WRITE_FACILITY_LOCATIONS,
permissions,
),
canListFacilityLocationOrganizations: hasPermission(
PERMISSION_LIST_FACILITY_LOCATION_ORGANIZATIONS,
permissions,
),
canCreateFacilityLocationOrganizations: hasPermission(
PERMISSION_CREATE_FACILITY_LOCATION_ORGANIZATIONS,
permissions,
),

// Organizations
canViewOrganizations: hasPermission(
PERMISSION_VIEW_ORGANIZATION,
permissions,
),
canCreateOrganization: hasPermission(
PERMISSION_CREATE_ORGANIZATION,
permissions,
),
canDeleteOrganization: hasPermission(
PERMISSION_DELETE_ORGANIZATION,
permissions,
),
canManageOrganization: hasPermission(
PERMISSION_MANAGE_ORGANIZATION,
permissions,
),
canManageOrganizationUsers: hasPermission(
PERMISSION_MANAGE_ORGANIZATION_USERS,
permissions,
),
canListOrganizationUsers: hasPermission(
PERMISSION_LIST_ORGANIZATION_USERS,
permissions,
),

// Questionnaire
canWriteQuestionnaire: hasPermission(
PERMISSION_WRITE_QUESTIONNAIRE,
permissions,
),
canArchiveQuestionnaire: hasPermission(
PERMISSION_ARCHIVE_QUESTIONNAIRE,
permissions,
),
canReadQuestionnaire: hasPermission(
PERMISSION_READ_QUESTIONNAIRE,
permissions,
),
canSubmitQuestionnaire: hasPermission(
PERMISSION_SUBMIT_QUESTIONNAIRE,
permissions,
),
canManageQuestionnaire: hasPermission(
PERMISSION_MANAGE_QUESTIONNAIRE,
permissions,
),

// Appointments
canViewAppointments: hasPermission(
PERMISSION_LIST_USER_BOOKING,
permissions,
),
canUpdateAppointment: hasPermission(
PERMISSION_WRITE_USER_BOOKING,
permissions,
),
canCreateAppointment: hasPermission(
PERMISSION_CREATE_APPOINTMENT,
permissions,
),

// Schedules and Availability
canWriteSchedule: hasPermission(
PERMISSION_WRITE_USER_SCHEDULE,
permissions,
),
canViewSchedule: hasPermission(PERMISSION_LIST_USER_SCHEDULE, permissions),

// User
canCreateUser: hasPermission(PERMISSION_CREATE_USER, permissions),
// Currently listed, but not used in BE
canListUsers: hasPermission(PERMISSION_LIST_USER, permissions),
};
}
Loading
Loading