Skip to content

Commit 27904a9

Browse files
authored
Merge pull request #42 from Finsemble/49664-app-metadata
49664 app metadata
2 parents fa2a5f8 + cca9384 commit 27904a9

17 files changed

+386
-152
lines changed

toolbox/fdc3-workbench/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,8 @@
55
"homepage": ".",
66
"dependencies": {
77
"@apidevtools/json-schema-ref-parser": "^9.0.9",
8-
"@finos/fdc3": "^1.2.0",
8+
"fdc3-1.2": "npm:@finos/[email protected]",
9+
"fdc3-2.0": "npm:@finos/fdc3@~2.0.0-beta.3",
910
"@fontsource/roboto": "^4.4.5",
1011
"@fontsource/source-code-pro": "^4.5.0",
1112
"@material-ui/core": "^4.11.4",

toolbox/fdc3-workbench/src/App.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@ import { ContextCreate } from "./components/ContextCreate";
1717
import { Intents } from "./components/Intents";
1818
import { AppChannels } from "./components/AppChannels";
1919
import snackbarStore from "./store/SnackbarStore";
20+
import fdc3 from "./utility/Fdc3Api";
2021
import "./App.css";
21-
import { fdc3Ready } from "@finos/fdc3";
2222

2323
const mainTheme = createTheme({
2424
palette: {
@@ -185,7 +185,7 @@ export const App = observer(() => {
185185
useEffect(() => {
186186
(async () => {
187187
try {
188-
await fdc3Ready(5000);
188+
await fdc3.fdc3Ready(5000);
189189
setFdc3Available(true);
190190
} catch (e) {}
191191
})();

toolbox/fdc3-workbench/src/components/AppChannels.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,13 @@ import { Button, IconButton, Tooltip, Typography, Grid, TextField } from "@mater
44
import { observer } from "mobx-react";
55
import FileCopyIcon from "@material-ui/icons/FileCopy";
66
import Autocomplete, { createFilterOptions } from "@material-ui/lab/Autocomplete";
7-
import contextStore, { ContextType } from "../store/ContextStore";
7+
import contextStore from "../store/ContextStore";
88
import appChannelStore from "../store/AppChannelStore";
99
import { codeExamples } from "../fixtures/codeExamples";
1010
import { TemplateTextField } from "./common/TemplateTextField";
1111
import { copyToClipboard } from "./common/CopyToClipboard";
1212
import { ContextTemplates } from "./ContextTemplates";
13+
import { ContextType } from "../utility/Fdc3Api";
1314

1415
const useStyles = makeStyles((theme: Theme) =>
1516
createStyles({

toolbox/fdc3-workbench/src/components/Channels.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,9 @@ import channelStore from "../store/ChannelStore";
1818
import { codeExamples } from "../fixtures/codeExamples";
1919
import { copyToClipboard } from "./common/CopyToClipboard";
2020
import { ContextLinking } from "./ContextLinking";
21-
import contextStore, { ContextType } from "../store/ContextStore";
21+
import contextStore from "../store/ContextStore";
2222
import { ContextTemplates } from "./ContextTemplates";
23+
import { ContextType } from "../utility/Fdc3Api";
2324

2425
const useStyles = makeStyles((theme: Theme) =>
2526
createStyles({

toolbox/fdc3-workbench/src/components/ContextCreate.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,13 @@ import { Button, Grid, Typography, Tooltip, IconButton, Table, TableBody, TableR
55
import FileCopyIcon from "@material-ui/icons/FileCopy";
66
import FileCopyOutlinedIcon from "@material-ui/icons/FileCopyOutlined";
77
import DeleteOutlinedIcon from '@material-ui/icons/DeleteOutlined';
8-
import contextStore, { ContextType, ContextItem } from "../store/ContextStore";
8+
import contextStore, { ContextItem } from "../store/ContextStore";
99
import systemLogStore from "../store/SystemLogStore";
1010
import { JsonInput } from "./common/JsonInput";
1111
import { DialogModal } from "./common/DialogModal";
1212
import { TemplateTextField } from "./common/TemplateTextField";
1313
import { copyToClipboard } from "./common/CopyToClipboard";
14+
import { ContextType } from "../utility/Fdc3Api";
1415

1516
interface OptionType {
1617
title: string;

toolbox/fdc3-workbench/src/components/Header.tsx

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
import React, { useEffect, useState } from "react";
22
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
33
import { AppBar, Toolbar, Tooltip, Typography } from "@material-ui/core";
4-
import * as fdc3 from "@finos/fdc3";
54
import WarningIcon from "@material-ui/icons/Warning";
5+
import fdc3, {ImplementationMetadata} from "../utility/Fdc3Api";
66

77
declare global {
88
interface Window { fdc3Version: string; }
99
}
1010

11-
interface ImplementationMetadata extends fdc3.ImplementationMetadata {
12-
appMetaData?: any
13-
}
14-
1511
const useStyles = makeStyles((theme: Theme) =>
1612
createStyles({
1713
root: {
@@ -70,9 +66,9 @@ const useStyles = makeStyles((theme: Theme) =>
7066

7167
export const Header = (props: { fdc3Available: boolean }) => {
7268
const classes = useStyles();
73-
const [appInfo, setAppInfo] = useState<ImplementationMetadata>();
69+
const [appInfo, setAppInfo] = useState<any>();
7470
const params = new URLSearchParams(window.location.search);
75-
const warningText = `Your FDC3 version (${window.fdc3Version}) doesn't match the version of the FDC3 Workbench you are using (${appInfo?.appMetaData?.version})`
71+
const warningText = `Your FDC3 version (${window.fdc3Version}) doesn't match the version of the FDC3 Workbench you are using (${appInfo?.appMetadata?.version})`
7672
const supportedVersion = ['2.0', '1.2'];
7773

7874
useEffect(() => {
@@ -81,11 +77,12 @@ export const Header = (props: { fdc3Available: boolean }) => {
8177
const updateInfo = async () => {
8278
try {
8379
let implInfo: ImplementationMetadata = await fdc3.getInfo();
80+
8481
let displayInfo = {
8582
fdc3Version: "not specified",
8683
provider: "not specified",
8784
providerVersion: "not specified",
88-
appMetaData: {
85+
appMetadata: {
8986
appId: "not specified",
9087
version: "not specified"
9188
}
@@ -96,10 +93,12 @@ export const Header = (props: { fdc3Available: boolean }) => {
9693
}
9794
if (implInfo.provider) {displayInfo.provider = implInfo.provider; }
9895
if (implInfo.providerVersion) {displayInfo.providerVersion = implInfo.providerVersion; }
99-
if (implInfo.appMetaData) {displayInfo.appMetaData = {
100-
appId: implInfo.appMetaData.appId,
101-
version: implInfo.appMetaData.version
102-
}}
96+
if (implInfo.appMetadata) {
97+
displayInfo.appMetadata = {
98+
appId: implInfo.appMetadata.appId,
99+
version: implInfo.appMetadata.version
100+
}
101+
}
103102
setAppInfo(displayInfo);
104103
} catch (e) {
105104
console.error("Failed to retrieve FDC3 implementation info",e);
@@ -138,7 +137,7 @@ export const Header = (props: { fdc3Available: boolean }) => {
138137
<tr>
139138
<th scope="row">FDC3 Version</th>
140139
{appInfo?.fdc3Version ?
141-
appInfo.appMetaData?.version.includes(appInfo.fdc3Version) ?
140+
appInfo.appMetadata?.version.includes(appInfo.fdc3Version) ?
142141
<td>{appInfo.fdc3Version}</td> :
143142
<td className={classes.warningText}>{appInfo.fdc3Version}
144143
<Tooltip title={warningText} aria-label={warningText}>
@@ -158,7 +157,7 @@ export const Header = (props: { fdc3Available: boolean }) => {
158157
</tr>
159158
<tr>
160159
<th scope="row">My AppId</th>
161-
<td className={classes.appid}>{appInfo?.appMetaData?.appId ? appInfo.appMetaData.appId : "unknown"}</td>
160+
<td className={classes.appid}>{appInfo?.appMetadata?.appId ? appInfo.appMetadata.appId : "unknown"}</td>
162161
</tr>
163162
</tbody>
164163
</table>
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import React, { useEffect, useState } from "react";
2+
import { observer } from "mobx-react";
3+
import { TextField } from "@material-ui/core";
4+
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
5+
6+
const useStyles = makeStyles((theme: Theme) =>
7+
createStyles({
8+
textField: {
9+
marginTop: theme.spacing(2),
10+
width: "100%",
11+
},
12+
input: {
13+
fontSize: "14px",
14+
color: "rgba(0, 0, 0, 0.6)",
15+
},
16+
"& .Mui-disabled": {
17+
borderColor: theme.palette.text.primary,
18+
},
19+
})
20+
);
21+
22+
export const IntentResolutionField = observer(({data}: {data: any}) => {
23+
const classes = useStyles();
24+
const [resolutionResult, setResolutionResult] = useState<any>("pending...");
25+
let results =
26+
`Resolved by:\n
27+
\tappId: ${data.source.appId}\n
28+
\tinstanceId: ${data.source.instanceId}\n
29+
Results: ${resolutionResult}`;
30+
31+
32+
const displayIntentResults = async () => {
33+
try {
34+
if(resolutionResult.hasOwnProperty('getResult')) {
35+
const result = await resolutionResult.getResult();
36+
//detect whether the result is Context or a Channel
37+
if (result && result.broadcast) {
38+
//render channel
39+
} else if (result){
40+
resolutionResult.resultContext = JSON.stringify(result, null, 2);
41+
} else {
42+
}
43+
setResolutionResult(result);
44+
}
45+
} catch(error) {
46+
console.error(`${resolutionResult.source} returned a result error: ${error}`);
47+
}
48+
}
49+
50+
useEffect(() => {
51+
results = `Resolved by:\n
52+
appId: ${data.source.appId}\n
53+
instanceId: ${data.source.instanceId}\n
54+
Results: ${resolutionResult}`;
55+
}, [resolutionResult])
56+
57+
displayIntentResults();
58+
59+
return (
60+
<TextField
61+
disabled
62+
label={"RESULT CONTEXT"}
63+
InputLabelProps={{
64+
shrink: true,
65+
}}
66+
contentEditable={false}
67+
fullWidth
68+
multiline
69+
variant="outlined"
70+
size="small"
71+
value={results}
72+
InputProps={{
73+
classes: {
74+
input: classes.input,
75+
},
76+
}}
77+
/>)
78+
});

toolbox/fdc3-workbench/src/components/Intents.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import React, { useEffect, useState } from "react";
2-
import * as fdc3 from "@finos/fdc3";
2+
import fdc3, {AppIntent, AppMetadata, Context, IntentResolution} from "../utility/Fdc3Api";
33
import { toJS } from "mobx";
44
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
55
import {
@@ -21,7 +21,7 @@ import intentStore from "../store/IntentStore";
2121
import { codeExamples } from "../fixtures/codeExamples";
2222
import { TemplateTextField } from "./common/TemplateTextField";
2323
import { copyToClipboard } from "./common/CopyToClipboard";
24-
import { AppIntent, AppMetadata, Context } from "@finos/fdc3";
24+
import { IntentResolutionField } from "./IntentResolutionField";
2525

2626
// interface copied from lib @material-ui/lab/Autocomplete
2727
interface FilterOptionsState<T> {
@@ -138,23 +138,25 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any })
138138
const [raiseIntentContext, setRaiseIntentContext] = useState<Context | null>(null);
139139
const [raiseIntentWithContextContext, setRaiseIntentWithContextContext] = useState<Context | null>(null);
140140
const [intentError, setIntentError] = useState<string | false>(false);
141+
const [intentResolution, setIntentResolution] = useState<IntentResolution | undefined>()
141142
const intentListenersOptions: ListenerOptionType[] = intentStore.intentsList;
142143

143-
const handleRaiseIntent = () => {
144+
const handleRaiseIntent = async () => {
144145
if (!intentValue) {
145146
setRaiseIntentError("enter intent name");
146147
} else if (!raiseIntentContext) {
147148
setRaiseIntentError("enter context name");
148149
} else if (targetApp && intentTargets) {
149150
let targetObject = intentTargets.find((target) => target.appId === targetApp || target.name === targetApp);
150151
if (targetObject) {
151-
intentStore.raiseIntent(intentValue.value, raiseIntentContext, targetObject);
152+
setIntentResolution(await intentStore.raiseIntent(intentValue.value, raiseIntentContext, targetObject));
152153
setRaiseIntentError("");
153154
}
154155
} else {
155-
intentStore.raiseIntent(intentValue.value, raiseIntentContext);
156+
setIntentResolution(await intentStore.raiseIntent(intentValue.value, raiseIntentContext));
156157
setRaiseIntentError("");
157158
}
159+
158160
};
159161

160162
const handleRaiseIntentForContext = () => {
@@ -363,6 +365,7 @@ export const Intents = observer(({ handleTabChange }: { handleTabChange: any })
363365
))}
364366
</Select>
365367
</FormControl>
368+
{intentResolution?.source && <IntentResolutionField data={intentResolution} />}
366369
</Grid>
367370
</Grid>
368371
<Grid item className={classes.controls}>

toolbox/fdc3-workbench/src/components/Workbench/AppChannelListeners.tsx

Lines changed: 24 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import appChannelStore from "../../store/AppChannelStore";
44
import { AccordionList, AccordionListItem } from "../common/AccordionList";
55
import { TextField } from "@material-ui/core";
66
import { createStyles, makeStyles, Theme } from "@material-ui/core/styles";
7+
import { ReceivedField } from "./ReceivedField";
78

89
const useStyles = makeStyles((theme: Theme) =>
910
createStyles({
@@ -22,28 +23,31 @@ export const AppChannelListeners = observer(() => {
2223

2324
let contextListeners: AccordionListItem[] = [];
2425

25-
appChannelStore.appChannelListeners.forEach(({ id, channelId, type, lastReceivedContext }) => {
26+
appChannelStore.appChannelListeners.forEach(({ id, channelId, type, lastReceivedContext, metaData }) => {
2627
const receivedContextListenerValue = lastReceivedContext ? JSON.stringify(lastReceivedContext, undefined, 4) : "";
2728
const contextField = (
28-
<TextField
29-
disabled
30-
label={"LAST RECEIVED CONTEXT"}
31-
className={classes.textField}
32-
InputLabelProps={{
33-
shrink: true,
34-
}}
35-
contentEditable={false}
36-
fullWidth
37-
multiline
38-
variant="outlined"
39-
size="small"
40-
value={receivedContextListenerValue}
41-
InputProps={{
42-
classes: {
43-
input: classes.input,
44-
},
45-
}}
46-
/>
29+
<div>
30+
<TextField
31+
disabled
32+
label={"LAST RECEIVED CONTEXT"}
33+
className={classes.textField}
34+
InputLabelProps={{
35+
shrink: true,
36+
}}
37+
contentEditable={false}
38+
fullWidth
39+
multiline
40+
variant="outlined"
41+
size="small"
42+
value={receivedContextListenerValue}
43+
InputProps={{
44+
classes: {
45+
input: classes.input,
46+
},
47+
}}
48+
/>
49+
{window.fdc3Version === '2.0' && <ReceivedField metaData={metaData} />}
50+
</div>
4751
);
4852

4953
contextListeners.push({ id, textPrimary: `${channelId}: ${type}`, afterEachElement: contextField});

0 commit comments

Comments
 (0)