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

fix: list users views in users page #1453

Merged
merged 6 commits into from
Sep 25, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
12 changes: 10 additions & 2 deletions src/screens/APIUtils/APIUtils.res
Original file line number Diff line number Diff line change
Expand Up @@ -496,8 +496,16 @@ let useGetURL = () => {
| USER_MANAGEMENT_V2 => {
let userUrl = `user`
switch userRoleTypes {
| USER_LIST => `${userUrl}/user/v2/list`
| ROLE_LIST => `${userUrl}/role/v2/list`
| USER_LIST =>
switch queryParamerters {
| Some(queryParams) => `${userUrl}/user/v2/list?${queryParams}`
| None => `${userUrl}/user/v2/list`
}
| ROLE_LIST =>
switch queryParamerters {
| Some(queryParams) => `${userUrl}/role/v2/list?${queryParams}`
| None => `${userUrl}/role/v2/list`
}
| _ => ""
}
}
Expand Down
28 changes: 26 additions & 2 deletions src/screens/Hooks/OMPSwitchHooks.res
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,6 @@ let useInternalSwitch = () => {
let orgSwitch = useOrgSwitch()
let merchSwitch = useMerchantSwitch()
let profileSwitch = useProfileSwitch()
let showToast = ToastState.useShowToast()

let {userInfo: {orgId: currentOrgId}} = React.useContext(UserInfoProvider.defaultContext)

Expand All @@ -158,9 +157,34 @@ let useInternalSwitch = () => {
} catch {
| Exn.Error(e) => {
let err = Exn.message(e)->Option.getOr("Failed to switch!")
showToast(~message=err, ~toastType=ToastError)
Exn.raiseError(err)
}
}
}
}

let useOMPData = () => {
open OMPSwitchUtils
let merchantList = Recoil.useRecoilValueFromAtom(HyperswitchAtom.merchantListAtom)
let orgList = Recoil.useRecoilValueFromAtom(HyperswitchAtom.orgListAtom)
let profileList = Recoil.useRecoilValueFromAtom(HyperswitchAtom.profileListAtom)
let {userInfo} = React.useContext(UserInfoProvider.defaultContext)

let getList: unit => OMPSwitchTypes.ompList = _ => {
{
orgList,
merchantList,
profileList,
}
}

let getNameForId = entityType =>
switch entityType {
| #Organization => currentOMPName(orgList, userInfo.orgId)
| #Merchant => currentOMPName(merchantList, userInfo.merchantId)
| #Profile => currentOMPName(profileList, userInfo.profileId)
| _ => ""
}

(getList, getNameForId)
PritishBudhiraja marked this conversation as resolved.
Show resolved Hide resolved
}
6 changes: 6 additions & 0 deletions src/screens/OMPSwitch/OMPSwitchTypes.res
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,9 @@ type opmView = {
entity: UserInfoTypes.entity,
}
type ompViews = array<opmView>

type ompList = {
orgList: array<ompListTypes>,
merchantList: array<ompListTypes>,
profileList: array<ompListTypes>,
}
8 changes: 5 additions & 3 deletions src/screens/UserManagement/UserRevamp/ListRoles.res
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
@react.component
let make = () => {
let make = (~userModuleEntity: UserManagementTypes.userModuleTypes) => {
open APIUtils
open ListRolesTableEntity
let getURL = useGetURL()
Expand All @@ -18,7 +18,9 @@ let make = () => {
~entityName=USER_MANAGEMENT_V2,
~methodType=Get,
~userRoleTypes=ROLE_LIST,
~queryParamerters=Some("groups=true"),
~queryParamerters=userModuleEntity == #Default
? None
: Some(`entity_type=${(userModuleEntity :> string)->String.toLowerCase}`),
)
let res = await fetchDetails(userDataURL)
let rolesData = res->LogicUtils.getArrayDataFromJson(itemToObjMapperForRoles)
Expand All @@ -32,7 +34,7 @@ let make = () => {
React.useEffect(() => {
getRolesAvailable()->ignore
None
}, [])
}, [userModuleEntity])

<div className="relative mt-5 flex flex-col gap-6">
<PageLoaderWrapper screenState={screenStateRoles}>
Expand Down
9 changes: 6 additions & 3 deletions src/screens/UserManagement/UserRevamp/ListUsers.res
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
open ListUserTableEntity

@react.component
let make = () => {
let make = (~userModuleEntity: UserManagementTypes.userModuleTypes) => {
open APIUtils
open LogicUtils
let getURL = useGetURL()
Expand All @@ -21,6 +21,9 @@ let make = () => {
~entityName=USER_MANAGEMENT_V2,
~methodType=Get,
~userRoleTypes=USER_LIST,
~queryParamerters=userModuleEntity == #Default
? None
: Some(`entity_type=${(userModuleEntity :> string)->String.toLowerCase}`),
)
let res = await fetchDetails(userDataURL)
let userData = res->getArrayDataFromJson(itemToObjMapperForUser)
Expand All @@ -35,7 +38,7 @@ let make = () => {
React.useEffect(() => {
getUserData()->ignore
None
}, [])
}, [userModuleEntity])

let filterLogicForUsers = ReactDebounce.useDebounced(ob => {
let (searchText, arr) = ob
Expand All @@ -53,7 +56,7 @@ let make = () => {
}, ~wait=200)

<PageLoaderWrapper screenState={screenStateUsers}>
<div className="relative mt-5 w-full">
<div className="relative mt-5 w-full flex flex-col gap-12">
<div className="absolute right-0 z-10">
<ACLButton
access={userPermissionJson.usersManage}
Expand Down
56 changes: 56 additions & 0 deletions src/screens/UserManagement/UserRevamp/UserManagementHelper.res
Original file line number Diff line number Diff line change
Expand Up @@ -207,3 +207,59 @@ module SwitchMerchantForUserAction = {
/>
}
}

module UserOmpView = {
@react.component
let make = (
~views: array<UserManagementTypes.ompViewType>,
~userModuleEntity: UserManagementTypes.userModuleTypes,
~setUserModuleEntity,
) => {
let (_, getNameForId) = OMPSwitchHooks.useOMPData()

let cssBasedOnIndex = index => {
if index == 0 {
"rounded-l-md"
} else if index == views->Array.length - 1 {
"rounded-r-md"
} else {
""
}
}

let getName = entityType => {
let name = getNameForId(entityType)
name->String.length > 10
? name
->String.substring(~start=0, ~end=10)
->String.concat("...")
: name
}

let onChange = entity => {
setUserModuleEntity(_ => entity)
}

let labelBasedOnEntity: UserManagementTypes.ompViewType => string = value =>
switch value.entity {
| #Default => value.label
| _ => `${value.label} (${value.entity->getName})`
}

<div className="flex">
<div className="flex h-fit">
{views
->Array.mapWithIndex((value, index) => {
let selectedStyle = userModuleEntity == value.entity ? `bg-blue-200` : ""

<div
onClick={_ => onChange(value.entity)->ignore}
className={`text-sm py-2 px-3 ${selectedStyle} border text-blue-500 border-blue-500 ${index->cssBasedOnIndex} cursor-pointer`}>
{`${value->labelBasedOnEntity}`->React.string}
</div>
})
->React.array}
</div>
</div>
}
}
24 changes: 19 additions & 5 deletions src/screens/UserManagement/UserRevamp/UserManagementLanding.res
Original file line number Diff line number Diff line change
@@ -1,20 +1,34 @@
@react.component
let make = () => {
let {checkUserEntity} = React.useContext(UserInfoProvider.defaultContext)
let (
userModuleEntity: UserManagementTypes.userModuleTypes,
setUserModuleEntity,
) = React.useState(_ => #Default)

let tabList: array<Tabs.tab> = [
{
title: "Users",
renderContent: () => <ListUsers />,
renderContent: () => <ListUsers userModuleEntity />,
},
{
title: "Roles",
renderContent: () => <ListRoles />,
renderContent: () => <ListRoles userModuleEntity />,
},
]

<div className="flex flex-col overflow-y-scroll">
<PageUtils.PageHeading
title={"Team management"} subTitle="Manage user roles and invite members of your organisation"
/>
<div className="flex justify-between items-center">
<PageUtils.PageHeading
title={"Team management"}
subTitle="Manage user roles and invite members of your organisation"
/>
<UserManagementHelper.UserOmpView
views={UserManagementUtils.getUserManagementViewValues(~checkUserEntity)}
userModuleEntity
setUserModuleEntity
/>
</div>
<div className="relative">
<Tabs
tabs=tabList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,3 +78,10 @@ type allSelectionType = [#All_Merchants | #All_Profiles]
type userActionType = SwitchUser | ManageUser | NoActionAccess

type userStatusTypes = Active | InviteSent | None

type userModuleTypes = [UserInfoTypes.entity | #Default]

type ompViewType = {
label: string,
entity: userModuleTypes,
}
Original file line number Diff line number Diff line change
Expand Up @@ -145,3 +145,32 @@ let tabIndeToVariantMapper = index => {
| _ => RolesTab
}
}

let getUserManagementViewValues = (~checkUserEntity) => {
open UserManagementTypes

let org = {
label: "Organization",
entity: #Organization,
}
let merchant = {
label: "Merchant",
entity: #Merchant,
}
let profile = {
label: "Profile",
entity: #Profile,
}
let default = {
label: "My Team",
entity: #Default,
}

if checkUserEntity([#Organization]) {
[default, org, merchant, profile]
} else if checkUserEntity([#Merchant]) {
[default, merchant, profile]
} else {
[default]
}
}
Loading