Skip to content
This repository was archived by the owner on Feb 20, 2024. It is now read-only.

Commit 4b3dbe1

Browse files
Merge pull request #19 from solace-iot-team/feature-api-products
fixes in business group display and roles calculations
2 parents 0b7ac44 + bce2951 commit 4b3dbe1

File tree

17 files changed

+350
-108
lines changed

17 files changed

+350
-108
lines changed

ReleaseNotes.md

+12
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,18 @@
22

33
Solace Async API Management.
44

5+
## Version 0.1.0
6+
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.1.0
7+
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.1.0
8+
* [API-M Server](https://github.com/solace-iot-team/async-apim/tree/main/apim-server): 0.1.0
9+
* [API-M Connector OpenAPI](https://github.com/solace-iot-team/platform-api): 0.6.5
10+
11+
#### API-M Admin & Developer Portal
12+
13+
**Fixes:**
14+
- **Business Groups / login / member calculation**
15+
- various fixes in roles calculation & business group display
16+
517
## Version 0.0.37
618
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.0.37
719
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.0.19

apim-portal/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "async-apim-portal",
3-
"version": "0.0.37",
3+
"version": "0.1.0",
44
"description": "Solace Async API Management Portal",
55
"repository": {
66
"type": "git",

apim-portal/src/admin-portal/components/ManageOrganizationUsers/AddOrganizationUser/AddOrganizationUserRolesAndGroups.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -70,11 +70,13 @@ export const AddOrganizationUserRolesAndGroups: React.FC<IAddOrganizationUserRol
7070
}
7171

7272
const doInitialize = async () => {
73+
props.onLoadingChange(true);
7374
const apOrganizationUserDisplay: TAPOrganizationUserDisplay = await APOrganizationUsersDisplayService.create_ApOrganizationUserDisplay_From_ApSystemUserDisplay({
7475
organizationEntityId: props.organizationEntityId,
7576
apSystemUserDisplay: props.apSystemUserDisplay,
7677
});
7778
setManagedObject(apOrganizationUserDisplay);
79+
props.onLoadingChange(false);
7880
}
7981

8082
// * useEffect Hooks *

apim-portal/src/admin-portal/components/ManageOrganizationUsers/EditNewOrganizationUser/EditOrganizationUserMemberOfBusinessGroups.tsx

+6-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import { APDisplayOrganizationUserBusinessGroupRoles } from "../../../../compone
1515
import { TAPEntityId } from "../../../../utils/APEntityIdsService";
1616
import { Dialog } from "primereact/dialog";
1717
import { EditOrganizationUserBusinessGroupRoles, EEditOrganizationUserBusinessGroupRolesAction } from "./EditOrganizationUserBusinessGroupRoles";
18-
import { TAPTreeTableExpandedKeysType } from "../../../../displayServices/APBusinessGroupsDisplayService";
18+
import APBusinessGroupsDisplayService, { TAPTreeTableExpandedKeysType } from "../../../../displayServices/APBusinessGroupsDisplayService";
1919

2020
import '../../../../components/APComponents.css';
2121
import "../ManageOrganizationUsers.css";
@@ -112,6 +112,10 @@ export const EditOrganizationUserMemberOfBusinessGroups: React.FC<IEditOrganizat
112112
);
113113
}
114114

115+
const sourceByBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode): string => {
116+
return APBusinessGroupsDisplayService.getSourceDisplayString(node.data.apBusinessGroupDisplay);
117+
}
118+
115119
const rolesBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode): JSX.Element => {
116120
return (
117121
<APDisplayOrganizationUserBusinessGroupRoles
@@ -139,6 +143,7 @@ export const EditOrganizationUserMemberOfBusinessGroups: React.FC<IEditOrganizat
139143
onToggle={e => setExpandedKeys(e.value)}
140144
>
141145
<Column header="Name" field={field_Name} bodyStyle={{ verticalAlign: 'top' }} sortable expander />
146+
<Column header="Source" body={sourceByBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
142147
{/* <Column header="isToplevel?" body={topLevelBodyTemplate} bodyStyle={{verticalAlign: 'top'}} /> */}
143148
<Column header="Roles" body={rolesBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
144149
<Column body={actionBodyTemplate} bodyStyle={{verticalAlign: 'top', textAlign: 'right' }} />

apim-portal/src/admin-portal/components/ManageOrganizationUsers/EditNewOrganizationUser/ManageListOrganizationUserMemberOfBusinessGroups.tsx

+12-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import APMemberOfService, {
2020
TAPMemberOfBusinessGroupTreeTableNodeList
2121
} from "../../../../displayServices/APUsersDisplayService/APMemberOfService";
2222
import { APDisplayOrganizationUserBusinessGroupRoles } from "../../../../components/APDisplay/APDisplayOrganizationBusinessGroups/APDisplayOrganizationUserBusinessGroupRoles";
23-
import { TAPTreeTableExpandedKeysType } from "../../../../displayServices/APBusinessGroupsDisplayService";
23+
import APBusinessGroupsDisplayService, { TAPTreeTableExpandedKeysType } from "../../../../displayServices/APBusinessGroupsDisplayService";
2424

2525
import '../../../../components/APComponents.css';
2626
import "../ManageOrganizationUsers.css";
@@ -103,14 +103,14 @@ export const ManageListOrganizationUserMemberOfBusinessGroups: React.FC<IManageL
103103

104104
if(apUserDisplay !== undefined) {
105105
if(apUserDisplay.completeOrganizationBusinessGroupDisplayList === undefined) throw new Error(`${logName}: apUserDisplay.completeOrganizationBusinessGroupDisplayList`);
106-
const apMemberOfBusinessGroupTreeTableNodeList: TAPMemberOfBusinessGroupTreeTableNodeList = APMemberOfService.create_ApMemberOfBusinessGroupTreeTableNodeList({
106+
const _apMemberOfBusinessGroupTreeTableNodeList: TAPMemberOfBusinessGroupTreeTableNodeList = APMemberOfService.create_ApMemberOfBusinessGroupTreeTableNodeList({
107107
organizationEntityId: apUserDisplay.organizationEntityId,
108108
apMemberOfBusinessGroupDisplayList: apUserDisplay.memberOfOrganizationDisplay.apMemberOfBusinessGroupDisplayList,
109109
apOrganizationRoleEntityIdList: apUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList,
110110
completeApOrganizationBusinessGroupDisplayList: apUserDisplay.completeOrganizationBusinessGroupDisplayList,
111111
pruneBusinessGroupsNotAMemberOf: false
112112
});
113-
setApMemberOfBusinessGroupTreeTableNodeList(apMemberOfBusinessGroupTreeTableNodeList);
113+
setApMemberOfBusinessGroupTreeTableNodeList(_apMemberOfBusinessGroupTreeTableNodeList);
114114
}
115115
}, [apUserDisplay]); /* eslint-disable-line react-hooks/exhaustive-deps */
116116

@@ -151,6 +151,10 @@ export const ManageListOrganizationUserMemberOfBusinessGroups: React.FC<IManageL
151151
});
152152
}
153153

154+
const sourceByBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode): string => {
155+
return APBusinessGroupsDisplayService.getSourceDisplayString(node.data.apBusinessGroupDisplay);
156+
}
157+
154158
const rolesBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode): JSX.Element => {
155159
return (
156160
<APDisplayOrganizationUserBusinessGroupRoles
@@ -179,6 +183,10 @@ export const ManageListOrganizationUserMemberOfBusinessGroups: React.FC<IManageL
179183
}
180184

181185
const renderOrganizationBusinessGroupsTreeTable = (apMemberOfBusinessGroupTreeTableNodeList: TAPMemberOfBusinessGroupTreeTableNodeList): JSX.Element => {
186+
// const funcName = 'renderOrganizationBusinessGroupsTreeTable';
187+
// const logName = `${ComponentName}.${funcName}()`;
188+
// alert(`${logName}: rendering ...`)
189+
182190
if(apMemberOfBusinessGroupTreeTableNodeList.length === 0) return (
183191
<div><b>Business Groups</b>: None.</div>
184192
);
@@ -197,6 +205,7 @@ export const ManageListOrganizationUserMemberOfBusinessGroups: React.FC<IManageL
197205
onToggle={e => setExpandedKeys(e.value)}
198206
>
199207
<Column header="Name" field={field_Name} bodyStyle={{ verticalAlign: 'top' }} sortable expander />
208+
<Column header="Source" body={sourceByBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
200209
{/* <Column header="isToplevel?" body={topLevelBodyTemplate} bodyStyle={{verticalAlign: 'top'}} /> */}
201210
<Column header="Roles" body={rolesBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
202211
<Column body={actionBodyTemplate} bodyStyle={{verticalAlign: 'top', textAlign: 'right' }} />

apim-portal/src/components/APDisplay/APDisplayOrganizationBusinessGroups/APDisplayOrganizationUserBusinessGroups.tsx

+25-19
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,13 @@ import React from "react";
44
import { TreeTable } from "primereact/treetable";
55
import { Column } from "primereact/column";
66

7-
import APEntityIdsService from "../../../utils/APEntityIdsService";
87
import { APDisplayOrganizationUserBusinessGroupRoles } from "./APDisplayOrganizationUserBusinessGroupRoles";
98
import { TAPOrganizationUserDisplay } from "../../../displayServices/APUsersDisplayService/APOrganizationUsersDisplayService";
109
import APMemberOfService, {
1110
TAPMemberOfBusinessGroupTreeTableNode,
1211
TAPMemberOfBusinessGroupTreeTableNodeList
1312
} from "../../../displayServices/APUsersDisplayService/APMemberOfService";
14-
import { TAPTreeTableExpandedKeysType } from "../../../displayServices/APBusinessGroupsDisplayService";
13+
import APBusinessGroupsDisplayService, { TAPTreeTableExpandedKeysType } from "../../../displayServices/APBusinessGroupsDisplayService";
1514

1615
import "../../APComponents.css";
1716

@@ -48,14 +47,15 @@ export const APDisplayOrganizationUserBusinessGroups: React.FC<IAPDisplayOrganiz
4847
const logName = `${ComponentName}.${funcName}()`;
4948

5049
if(props.apOrganizationUserDisplay.completeOrganizationBusinessGroupDisplayList === undefined) throw new Error(`${logName}: apUserDisplay.completeOrganizationBusinessGroupDisplayList`);
51-
const apMemberOfBusinessGroupTreeTableNodeList: TAPMemberOfBusinessGroupTreeTableNodeList = APMemberOfService.create_ApMemberOfBusinessGroupTreeTableNodeList({
50+
const _apMemberOfBusinessGroupTreeTableNodeList: TAPMemberOfBusinessGroupTreeTableNodeList = APMemberOfService.create_ApMemberOfBusinessGroupTreeTableNodeList({
5251
organizationEntityId: props.apOrganizationUserDisplay.organizationEntityId,
5352
apMemberOfBusinessGroupDisplayList: props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apMemberOfBusinessGroupDisplayList,
5453
apOrganizationRoleEntityIdList: props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList,
5554
completeApOrganizationBusinessGroupDisplayList: props.apOrganizationUserDisplay.completeOrganizationBusinessGroupDisplayList,
56-
pruneBusinessGroupsNotAMemberOf: true
55+
// pruneBusinessGroupsNotAMemberOf: true
56+
pruneBusinessGroupsNotAMemberOf: false
5757
});
58-
setApMemberOfBusinessGroupTreeTableNodeList(apMemberOfBusinessGroupTreeTableNodeList);
58+
setApMemberOfBusinessGroupTreeTableNodeList(_apMemberOfBusinessGroupTreeTableNodeList);
5959
}, []); /* eslint-disable-line react-hooks/exhaustive-deps */
6060

6161
React.useEffect(()=> {
@@ -77,6 +77,9 @@ export const APDisplayOrganizationUserBusinessGroups: React.FC<IAPDisplayOrganiz
7777
/>
7878
);
7979
}
80+
const sourceByBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode): string => {
81+
return APBusinessGroupsDisplayService.getSourceDisplayString(node.data.apBusinessGroupDisplay);
82+
}
8083

8184
// const keyBodyTemplate = (node: TAPMemberOfBusinessGroupTreeTableNode) => {
8285
// return node.key;
@@ -102,31 +105,34 @@ export const APDisplayOrganizationUserBusinessGroups: React.FC<IAPDisplayOrganiz
102105
onToggle={e => setExpandedKeys(e.value)}
103106
>
104107
<Column header="Name" field={field_Name} bodyStyle={{ verticalAlign: 'top' }} sortable expander />
108+
{/* <Column header="Source" body={sourceByBodyTemplate} bodyStyle={{verticalAlign: 'top'}} field="apExternalReference.externalSystemDisplayName" sortable /> */}
109+
<Column header="Source" body={sourceByBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
105110
<Column header="Roles" body={rolesBodyTemplate} bodyStyle={{verticalAlign: 'top'}} />
106111
{/* <Column header="Key" body={keyBodyTemplate} bodyStyle={{verticalAlign: 'top'}} /> */}
107112
</TreeTable>
108113
</div>
109114

110115
{/* DEBUG */}
111-
{/* <p><b>apMemberOfBusinessGroupTreeNodeDisplayList=</b></p>
116+
{/* <p><b>treeTableNodeList=</b></p>
112117
<pre style={ { fontSize: '10px' }} >
113-
{JSON.stringify(apMemberOfBusinessGroupTreeNodeDisplayList, null, 2)}
118+
{JSON.stringify(treeTableNodeList, null, 2)}
114119
</pre> */}
115120

116121
</React.Fragment>
117122
);
118123
}
119124

120-
const renderOrganizationRoles = (): JSX.Element => {
121-
const organizationRolesDisplayString = props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList.length > 0
122-
? APEntityIdsService.getSortedDisplayNameList_As_String(props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList)
123-
: 'None.';
124-
return (
125-
<React.Fragment>
126-
<div><b>Organization Roles</b>: {organizationRolesDisplayString}</div>
127-
</React.Fragment>
128-
);
129-
}
125+
// now the root business group
126+
// const renderOrganizationRoles = (): JSX.Element => {
127+
// const organizationRolesDisplayString = props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList.length > 0
128+
// ? APEntityIdsService.getSortedDisplayNameList_As_String(props.apOrganizationUserDisplay.memberOfOrganizationDisplay.apOrganizationRoleEntityIdList)
129+
// : 'None.';
130+
// return (
131+
// <React.Fragment>
132+
// <div><b>Organization Roles</b>: {organizationRolesDisplayString}</div>
133+
// </React.Fragment>
134+
// );
135+
// }
130136

131137
const renderComponent = (): JSX.Element => {
132138
const funcName = 'renderComponent';
@@ -136,9 +142,9 @@ export const APDisplayOrganizationUserBusinessGroups: React.FC<IAPDisplayOrganiz
136142

137143
return (
138144
<React.Fragment>
139-
<div className="p-mt-2">
145+
{/* <div className="p-mt-2">
140146
{renderOrganizationRoles()}
141-
</div>
147+
</div> */}
142148
<div className="p-mt-2">{renderOrganizationBusinessGroupsTreeTable(apMemberOfBusinessGroupTreeTableNodeList)}</div>
143149
</React.Fragment>
144150
);

apim-portal/src/components/ManageBusinessGroupSelect/ManageBusinessGroupSelect.tsx

+18-8
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import "./ManageBusinessGroupSelect.css";
2626

2727
export interface IManageBusinessGroupSelectProps {
2828
apLoginUserDisplay: TAPLoginUserDisplay;
29-
apMemberOfBusinessGroupDisplayTreeNodeList: TAPMemberOfBusinessGroupDisplayTreeNodeList;
29+
apMemberOfBusinessGroupDisplayTreeNodeList: TAPMemberOfBusinessGroupDisplayTreeNodeList; /** not pruned */
3030
currentBusinessGroupEntityId: TAPEntityId;
3131
onSuccess: () => void;
3232
onLoadingChange: (isLoading: boolean) => void;
@@ -36,11 +36,12 @@ export const ManageBusinessGroupSelect: React.FC<IManageBusinessGroupSelectProps
3636
const ComponentName = 'ManageBusinessGroupSelect';
3737

3838
const [apiCallStatus, setApiCallStatus] = React.useState<TApiCallState | null>(null);
39-
/* eslint-disable @typescript-eslint/no-unused-vars */
39+
const [selectedBusinessGroupEntityId, setSelectedBusinessGroupEntityId] = React.useState<TAPEntityId>();
40+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
4041
const [authContext, dispatchAuthContextAction] = React.useContext(AuthContext);
41-
const [userContext, dispatchUserContextAction] = React.useContext(UserContext);
42-
/* eslint-enable @typescript-eslint/no-unused-vars */
43-
42+
/* eslint-disable-next-line @typescript-eslint/no-unused-vars */
43+
const [userContext, dispatchUserContextAction] = React.useContext(UserContext);
44+
4445
const apiUpdateSession = async({ organizationEntityId, userEntityId, businessGroupEntityId }: {
4546
organizationEntityId: TAPEntityId;
4647
userEntityId: TAPEntityId;
@@ -66,6 +67,11 @@ export const ManageBusinessGroupSelect: React.FC<IManageBusinessGroupSelectProps
6667
return callState;
6768
}
6869

70+
React.useEffect(() => {
71+
if(selectedBusinessGroupEntityId !== undefined) doSelectBusinessGroup(selectedBusinessGroupEntityId);
72+
}, [selectedBusinessGroupEntityId]); /* eslint-disable-line react-hooks/exhaustive-deps */
73+
74+
6975
const doApplyNewBusinessGroup = async(businessGroupEntityId: TAPEntityId) => {
7076
const funcName = 'doApplyNewBusinessGroup';
7177
const logName = `${ComponentName}.${funcName}()`;
@@ -77,8 +83,8 @@ export const ManageBusinessGroupSelect: React.FC<IManageBusinessGroupSelectProps
7783
businessGroupId: businessGroupEntityId.id
7884
});
7985

80-
// save session info
8186
if(userContext.runtimeSettings.currentOrganizationEntityId === undefined) throw new Error(`${logName}: userContext.runtimeSettings.currentOrganizationEntityId === undefined`);
87+
// save session info
8288
await apiUpdateSession({
8389
organizationEntityId: userContext.runtimeSettings.currentOrganizationEntityId,
8490
userEntityId: props.apLoginUserDisplay.apEntityId,
@@ -97,14 +103,18 @@ export const ManageBusinessGroupSelect: React.FC<IManageBusinessGroupSelectProps
97103
props.onSuccess();
98104
}
99105

100-
const onSelectBusinessGroup = (businessGroupEntityId: TAPEntityId) => {
106+
const doSelectBusinessGroup = (businessGroupEntityId: TAPEntityId) => {
101107
if(businessGroupEntityId.id === props.currentBusinessGroupEntityId.id) {
102108
// nothing to do, close me
103109
return props.onSuccess();
104110
}
105111
doApplyNewBusinessGroup(businessGroupEntityId);
106112
}
107113

114+
const onSelectBusinessGroup = (businessGroupEntityId: TAPEntityId) => {
115+
setSelectedBusinessGroupEntityId(businessGroupEntityId);
116+
}
117+
108118
const renderComponent = () => {
109119
return(
110120
<React.Fragment>
@@ -125,7 +135,7 @@ export const ManageBusinessGroupSelect: React.FC<IManageBusinessGroupSelectProps
125135

126136
<ApiCallStatusError apiCallStatus={apiCallStatus} />
127137

128-
{renderComponent()}
138+
{selectedBusinessGroupEntityId === undefined && renderComponent()}
129139

130140
</div>
131141
);

0 commit comments

Comments
 (0)