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

Commit 9d93c9b

Browse files
Merge pull request #52 from solace-iot-team/fix-meta-attributes
Fix meta attributes
2 parents 67f0c56 + df98902 commit 9d93c9b

13 files changed

+578
-93
lines changed

ReleaseNotes.md

+14-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,27 @@
22

33
Solace Async API Management.
44

5+
## Version 0.4.2
6+
7+
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.4.2
8+
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.4.0
9+
* [API-M Server](https://github.com/solace-iot-team/async-apim/tree/main/apim-server): 0.4.0
10+
* [API-M Connector OpenAPI](https://github.com/solace-iot-team/platform-api): 0.13.1
11+
12+
**Enhancements:**
13+
- **Attributes for Api Products**
14+
- separate editing of version & general attributes
15+
- version attributes change triggers creation of a new version
16+
- general attributes change happen on same version
17+
518
## Version 0.4.1
619

720
* [API-M Admin & Developer Portal](https://github.com/solace-iot-team/async-apim/tree/main/apim-portal): 0.4.1
821
* [API-M Server OpenAPI](https://github.com/solace-iot-team/async-apim/blob/main/apim-server/server/common/api.yml): 0.4.0
922
* [API-M Server](https://github.com/solace-iot-team/async-apim/tree/main/apim-server): 0.4.0
1023
* [API-M Connector OpenAPI](https://github.com/solace-iot-team/platform-api): 0.13.1
1124

12-
**Chnages:**
25+
**Changes:**
1326
- **Edit: Event Portal Event Api Products**
1427
- enabled editing for imported Event Api Products to facilitate testing
1528
- will be disabled again soon

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.4.1",
3+
"version": "0.4.2",
44
"description": "Solace Async API Management Portal",
55
"repository": {
66
"type": "git",

apim-portal/src/admin-portal/components/ManageApiProducts/DisplayApiProduct.tsx

+16-8
Original file line numberDiff line numberDiff line change
@@ -526,14 +526,22 @@ export const DisplayAdminPortalApiProduct: React.FC<IDisplayAdminPortalApiProduc
526526
tabPanels.push(
527527
<TabPanel header='Attributes'>
528528
<React.Fragment>
529-
<div className="p-text-bold">General Attributes:</div>
530-
<APDisplayApAttributeDisplayList
531-
apAttributeDisplayList={managedObject.apExternal_ApAttributeDisplayList}
532-
tableRowHeader_AttributeName="Attribute"
533-
tableRowHeader_AttributeValue="Value"
534-
emptyMessage="No attributes defined"
535-
className="p-ml-4"
536-
/>
529+
<div className="p-text-bold">Version Attributes:</div>
530+
<APDisplayApAttributeDisplayList
531+
apAttributeDisplayList={managedObject.apExternal_ApAttributeDisplayList}
532+
tableRowHeader_AttributeName="Attribute"
533+
tableRowHeader_AttributeValue="Value"
534+
emptyMessage="No attributes defined"
535+
className="p-ml-4 p-mt-2"
536+
/>
537+
<div className="p-text-bold p-mt-4">General Attributes:</div>
538+
<APDisplayApAttributeDisplayList
539+
apAttributeDisplayList={managedObject.apMetaInfo.apAttributeDisplayList}
540+
tableRowHeader_AttributeName="Attribute"
541+
tableRowHeader_AttributeValue="Value"
542+
emptyMessage="No attributes defined"
543+
className="p-ml-4 p-mt-2"
544+
/>
537545
{Config.getUseDevelTools() &&
538546
<React.Fragment>
539547
<Divider />

apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditAttributes.tsx renamed to apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditMetaAttributes.tsx

+7-10
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,12 @@ import APAdminPortalApiProductsDisplayService, { TAPAdminPortalApiProductDisplay
1010
import { ButtonLabel_Cancel, ButtonLabel_Save, EAction, E_CALL_STATE_ACTIONS } from "../ManageApiProductsCommon";
1111
import { TAPManagedAssetDisplay_Attributes } from "../../../../displayServices/APManagedAssetDisplayService";
1212
import { IAPApiProductDisplay } from "../../../../displayServices/APApiProductsDisplayService";
13-
import { EditNewAttributesForm } from "./EditNewAttributesForm";
14-
import { UserContext } from "../../../../components/APContextProviders/APUserContextProvider";
13+
import { EditNewMetaAttributesForm } from "./EditNewMetaAttributesForm";
1514

1615
import '../../../../components/APComponents.css';
1716
import "../ManageApiProducts.css";
1817

19-
export interface IEditAttributesProps {
18+
export interface IEditMetaAttributesProps {
2019
organizationId: string;
2120
apAdminPortalApiProductDisplay: TAPAdminPortalApiProductDisplay;
2221
onError: (apiCallState: TApiCallState) => void;
@@ -25,16 +24,15 @@ export interface IEditAttributesProps {
2524
onLoadingChange: (isLoading: boolean) => void;
2625
}
2726

28-
export const EditAttributes: React.FC<IEditAttributesProps> = (props: IEditAttributesProps) => {
29-
const ComponentName = 'EditAttributes';
27+
export const EditMetaAttributes: React.FC<IEditMetaAttributesProps> = (props: IEditMetaAttributesProps) => {
28+
const ComponentName = 'EditMetaAttributes';
3029

3130
type TManagedObject = TAPManagedAssetDisplay_Attributes;
3231

3332
const FormId = `ManageApiProducts_EditNewApiProduct_${ComponentName}`;
3433

3534
const [managedObject, setManagedObject] = React.useState<TManagedObject>();
3635
const [apiCallStatus, setApiCallStatus] = React.useState<TApiCallState | null>(null);
37-
const [userContext] = React.useContext(UserContext);
3836

3937
// * Api Calls *
4038

@@ -43,14 +41,13 @@ export const EditAttributes: React.FC<IEditAttributesProps> = (props: IEditAttri
4341
const logName = `${ComponentName}.${funcName}()`;
4442
let callState: TApiCallState = ApiCallState.getInitialCallState(E_CALL_STATE_ACTIONS.API_UPDATE_API_PRODUCT, `update api product: ${mo.apEntityId.displayName}`);
4543
try {
46-
await APAdminPortalApiProductsDisplayService.apiUpdate_ApApiProductDisplay({
44+
await APAdminPortalApiProductsDisplayService.apiUpdate_ApApiProductDisplay_Meta_Attributes({
4745
organizationId: props.organizationId,
4846
apApiProductDisplay: APAdminPortalApiProductsDisplayService.set_ApManagedAssetDisplay_Attributes({
4947
apManagedAssetDisplay: props.apAdminPortalApiProductDisplay,
5048
apManagedAssetDisplay_Attributes: mo
5149
}) as IAPApiProductDisplay,
52-
userId: userContext.apLoginUserDisplay.apEntityId.id,
53-
});
50+
});
5451
} catch(e: any) {
5552
APSClientOpenApi.logError(logName, e);
5653
callState = ApiCallState.addErrorToApiCallState(e, callState);
@@ -111,7 +108,7 @@ export const EditAttributes: React.FC<IEditAttributesProps> = (props: IEditAttri
111108
return (
112109
<div className="card p-mt-4">
113110
<div className="p-fluid">
114-
<EditNewAttributesForm
111+
<EditNewMetaAttributesForm
115112
formId={FormId}
116113
action={EAction.EDIT}
117114
apManagedAssetDisplay_Attributes={mo}

apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditNewAttributes.tsx

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import APAdminPortalApiProductsDisplayService, {
1010
TAPAdminPortalApiProductDisplay
1111
} from "../../../displayServices/APAdminPortalApiProductsDisplayService";
1212
import { TAPManagedAssetDisplay_Attributes } from "../../../../displayServices/APManagedAssetDisplayService";
13-
import { EditNewAttributesForm } from "./EditNewAttributesForm";
13+
import { EditNewVersionAttributesForm } from "./EditNewVersionAttributesForm";
1414
import { ButtonLabel_Back, ButtonLabel_Cancel, ButtonLabel_Next, EAction } from "../ManageApiProductsCommon";
1515

1616
import '../../../../components/APComponents.css';
@@ -89,7 +89,7 @@ export const EditNewAttributes: React.FC<IEditNewAttributesProps> = (props: IEdi
8989
return (
9090
<div className="card p-mt-4">
9191
<div className="p-fluid">
92-
<EditNewAttributesForm
92+
<EditNewVersionAttributesForm
9393
formId={formId}
9494
action={props.action}
9595
apManagedAssetDisplay_Attributes={mo}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,131 @@
1+
2+
import React from "react";
3+
import { useForm } from 'react-hook-form';
4+
5+
import { EAction} from "../ManageApiProductsCommon";
6+
import { TAPManagedAssetDisplay_Attributes } from "../../../../displayServices/APManagedAssetDisplayService";
7+
import { TAPAttributeDisplayList } from "../../../../displayServices/APAttributesDisplayService/APAttributesDisplayService";
8+
import { EditNewApAttributeListForm } from "../../../../components/APManageAttributes/EditNewApAttributeListForm";
9+
10+
import '../../../../components/APComponents.css';
11+
import "../ManageApiProducts.css";
12+
13+
export interface IEditNewMetaAttributesFormProps {
14+
action: EAction;
15+
formId: string;
16+
apManagedAssetDisplay_Attributes: TAPManagedAssetDisplay_Attributes;
17+
onSubmit: (apManagedAssetDisplay_Attributes: TAPManagedAssetDisplay_Attributes) => void;
18+
}
19+
20+
export const EditNewMetaAttributesForm: React.FC<IEditNewMetaAttributesFormProps> = (props: IEditNewMetaAttributesFormProps) => {
21+
const ComponentName = 'EditNewMetaAttributesForm';
22+
23+
type TManagedObject = TAPManagedAssetDisplay_Attributes;
24+
type TManagedObjectFormData = {
25+
meta_attribute_list: TAPAttributeDisplayList;
26+
};
27+
type TManagedObjectFormDataEnvelope = {
28+
formData: TManagedObjectFormData;
29+
}
30+
31+
const transform_ManagedObject_To_FormDataEnvelope = (mo: TManagedObject): TManagedObjectFormDataEnvelope => {
32+
const fd: TManagedObjectFormData = {
33+
meta_attribute_list: mo.apMeta_ApAttributeDisplayList,
34+
};
35+
return {
36+
formData: fd
37+
};
38+
}
39+
40+
const create_ManagedObject_From_FormEntities = ({formDataEnvelope}: {
41+
formDataEnvelope: TManagedObjectFormDataEnvelope;
42+
}): TManagedObject => {
43+
const mo: TManagedObject = props.apManagedAssetDisplay_Attributes;
44+
const fd: TManagedObjectFormData = formDataEnvelope.formData;
45+
mo.apMeta_ApAttributeDisplayList = fd.meta_attribute_list;
46+
return mo;
47+
}
48+
49+
const [managedObject] = React.useState<TManagedObject>(props.apManagedAssetDisplay_Attributes);
50+
const [managedObjectFormDataEnvelope, setManagedObjectFormDataEnvelope] = React.useState<TManagedObjectFormDataEnvelope>();
51+
// const [apiCallStatus, setApiCallStatus] = React.useState<TApiCallState | null>(null);
52+
const managedObjectUseForm = useForm<TManagedObjectFormDataEnvelope>();
53+
54+
const doInitialize = async () => {
55+
setManagedObjectFormDataEnvelope(transform_ManagedObject_To_FormDataEnvelope(managedObject));
56+
}
57+
58+
// * useEffect Hooks *
59+
60+
React.useEffect(() => {
61+
doInitialize();
62+
}, []); /* eslint-disable-line react-hooks/exhaustive-deps */
63+
64+
React.useEffect(() => {
65+
if(managedObjectFormDataEnvelope) managedObjectUseForm.setValue('formData', managedObjectFormDataEnvelope.formData);
66+
}, [managedObjectFormDataEnvelope]) /* eslint-disable-line react-hooks/exhaustive-deps */
67+
68+
const onSubmitManagedObjectForm = (newMofde: TManagedObjectFormDataEnvelope) => {
69+
// const funcName = 'onSubmitManagedObjectForm';
70+
// const logName = `${ComponentName}.${funcName}()`;
71+
// alert(`${logName}: newMofde = ${JSON.stringify(newMofde, null, 2)}`);
72+
props.onSubmit(create_ManagedObject_From_FormEntities({
73+
formDataEnvelope: newMofde,
74+
}));
75+
}
76+
77+
const onInvalidSubmitManagedObjectForm = () => {
78+
// placeholder
79+
}
80+
81+
const onChange_MetaAttributes = (apAttributeDisplayList: TAPAttributeDisplayList) => {
82+
const funcName = 'onChange_MetaAttributes';
83+
const logName = `${ComponentName}.${funcName}()`;
84+
if(managedObjectFormDataEnvelope === undefined) throw new Error(`${logName}: managedObjectFormDataEnvelope === undefined`);
85+
const newMofde: TManagedObjectFormDataEnvelope = {
86+
formData: {
87+
...managedObjectFormDataEnvelope.formData,
88+
meta_attribute_list: apAttributeDisplayList
89+
}
90+
};
91+
setManagedObjectFormDataEnvelope(newMofde);
92+
}
93+
94+
const renderManagedObjectForm = () => {
95+
const funcName = 'renderManagedObjectForm';
96+
const logName = `${ComponentName}.${funcName}()`;
97+
if(managedObjectFormDataEnvelope === undefined) throw new Error(`${logName}: managedObjectFormDataEnvelope === undefined`);
98+
const uniqueKey_MetaAttributes = ComponentName+'_EditNewApAttributeListForm_mo.apMeta_ApAttributeDisplayList';
99+
return (
100+
<div className="card p-mt-4">
101+
<div className="p-fluid">
102+
<form id={props.formId} onSubmit={managedObjectUseForm.handleSubmit(onSubmitManagedObjectForm, onInvalidSubmitManagedObjectForm)} className="p-fluid">
103+
{/* empty form, required for submit button */}
104+
</form>
105+
106+
<div className="p-field">
107+
{/* version attributes */}
108+
<div className="p-text-bold p-mb-3">General Attributes:</div>
109+
<EditNewApAttributeListForm
110+
key={uniqueKey_MetaAttributes}
111+
uniqueKeyPrefix={uniqueKey_MetaAttributes}
112+
apAttributeDisplayList={managedObjectFormDataEnvelope.formData.meta_attribute_list}
113+
attributeName_Name="Attribute Name"
114+
attributeValue_Name="Value"
115+
onChange={onChange_MetaAttributes}
116+
/>
117+
</div>
118+
</div>
119+
</div>
120+
);
121+
}
122+
123+
124+
return (
125+
<div className="manage-api-products">
126+
127+
{ managedObjectFormDataEnvelope && renderManagedObjectForm() }
128+
129+
</div>
130+
);
131+
}

apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditNewAttributesForm.tsx renamed to apim-portal/src/admin-portal/components/ManageApiProducts/EditNewApiProduct/EditNewVersionAttributesForm.tsx

+5-9
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,19 @@ import { EditNewApAttributeListForm } from "../../../../components/APManageAttri
1010
import '../../../../components/APComponents.css';
1111
import "../ManageApiProducts.css";
1212

13-
export interface IEditNewAttributesFormProps {
13+
export interface IEditNewVersionAttributesFormProps {
1414
action: EAction;
1515
formId: string;
1616
apManagedAssetDisplay_Attributes: TAPManagedAssetDisplay_Attributes;
1717
onSubmit: (apManagedAssetDisplay_Attributes: TAPManagedAssetDisplay_Attributes) => void;
1818
}
1919

20-
export const EditNewAttributesForm: React.FC<IEditNewAttributesFormProps> = (props: IEditNewAttributesFormProps) => {
21-
const ComponentName = 'EditNewAttributes';
20+
export const EditNewVersionAttributesForm: React.FC<IEditNewVersionAttributesFormProps> = (props: IEditNewVersionAttributesFormProps) => {
21+
const ComponentName = 'EditNewVersionAttributesForm';
2222

2323
type TManagedObject = TAPManagedAssetDisplay_Attributes;
2424
type TManagedObjectFormData = {
2525
external_attribute_list: TAPAttributeDisplayList;
26-
custom_attribute_list: TAPAttributeDisplayList;
2726
};
2827
type TManagedObjectFormDataEnvelope = {
2928
formData: TManagedObjectFormData;
@@ -32,7 +31,6 @@ export const EditNewAttributesForm: React.FC<IEditNewAttributesFormProps> = (pro
3231
const transform_ManagedObject_To_FormDataEnvelope = (mo: TManagedObject): TManagedObjectFormDataEnvelope => {
3332
const fd: TManagedObjectFormData = {
3433
external_attribute_list: mo.apExternal_ApAttributeDisplayList,
35-
custom_attribute_list: mo.apCustom_ApAttributeDisplayList,
3634
};
3735
return {
3836
formData: fd
@@ -45,7 +43,6 @@ export const EditNewAttributesForm: React.FC<IEditNewAttributesFormProps> = (pro
4543
const mo: TManagedObject = props.apManagedAssetDisplay_Attributes;
4644
const fd: TManagedObjectFormData = formDataEnvelope.formData;
4745
mo.apExternal_ApAttributeDisplayList = fd.external_attribute_list;
48-
mo.apCustom_ApAttributeDisplayList = fd.custom_attribute_list;
4946
return mo;
5047
}
5148

@@ -107,8 +104,8 @@ export const EditNewAttributesForm: React.FC<IEditNewAttributesFormProps> = (pro
107104
</form>
108105

109106
<div className="p-field">
110-
{/* external attributes */}
111-
<div className="p-text-bold p-mb-3">Custom Attributes:</div>
107+
{/* version attributes */}
108+
<div className="p-text-bold p-mb-3">Version Attributes:</div>
112109
<EditNewApAttributeListForm
113110
key={uniqueKey_ExternalAttributes}
114111
uniqueKeyPrefix={uniqueKey_ExternalAttributes}
@@ -118,7 +115,6 @@ export const EditNewAttributesForm: React.FC<IEditNewAttributesFormProps> = (pro
118115
onChange={onChange_ExternalAttributes}
119116
/>
120117
</div>
121-
122118
</div>
123119
</div>
124120
);

0 commit comments

Comments
 (0)