Skip to content

Commit 8461964

Browse files
authored
Merge pull request #31 from projkov/30-history-side-panel
30 history side panel
2 parents 5d0c215 + 39ec958 commit 8461964

File tree

32 files changed

+813
-510
lines changed

32 files changed

+813
-510
lines changed

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"axios": "^1.7.2",
2020
"dotenv": "^16.4.5",
2121
"fhirpath": "^3.14.1",
22+
"js-yaml": "^4.1.0",
2223
"moment": "^2.30.1",
2324
"react": "^18.3.1",
2425
"react-dom": "^18.3.1",

src/App.css

Lines changed: 0 additions & 131 deletions
This file was deleted.

src/App.tsx

Lines changed: 7 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,77 +1,14 @@
11
import React from 'react';
2-
import './App.css';
3-
import { useFHIRPathUI } from './hooks';
4-
import Editor from '@monaco-editor/react';
5-
import { Allotment } from "allotment";
6-
import "allotment/dist/style.css";
7-
import { Play, ShareFat, FileArrowDown, Gear, Copy, Info, ClockCounterClockwise } from "@phosphor-icons/react";
8-
import Loader from './components/loader';
9-
import logo from './assets/logo.png';
10-
import { ToastContainer } from 'react-toastify';
11-
import 'react-toastify/dist/ReactToastify.css';
12-
import { ResultOutput } from './components/ResultOutput';
13-
import { DrawerButton } from './components/DrawerButton';
14-
import { SettingsContainer } from './containers/Settings';
15-
import { CredentialsContainer } from './containers/Credentials';
16-
import { HistoryContainer } from './containers/HistoryContainer';
17-
2+
import { AppHeader } from './containers/AppHeader';
3+
import { AppContainer } from './containers/AppContainer';
4+
import { AppContent } from './containers/AppContent';
185

196
const App: React.FC = () => {
20-
const { url, setUrl, handleUrlChange, handleFetch,
21-
resource, expression, setExpression, setResource,
22-
handleExecute, result, handleShare, isLoading, isExecuteActive, isGetResourceActive, isShareActive, handleShareResult, isShareResultActive, copyToClipboard } = useFHIRPathUI();
23-
247
return (
25-
<div className="App">
26-
{isLoading ? <Loader /> : null}
27-
<div className='header'>
28-
<img src={logo} alt="Logo" className='logo' />
29-
<div className='searchBlock'>
30-
<input className="input" type="url" value={url} onChange={handleUrlChange} placeholder='You can paste the URL to get the FHIR Resource' />
31-
</div>
32-
<div className="buttonsBlock">
33-
<button onClick={() => handleFetch(url)} disabled={!isGetResourceActive}><FileArrowDown fontSize={24} /></button>
34-
<button onClick={() => handleExecute(resource, expression)} disabled={!isExecuteActive}><Play fontSize={24} /></button>
35-
<DrawerButton
36-
content={
37-
<HistoryContainer
38-
setResource={setResource}
39-
setUrl={setUrl}
40-
setExpression={setExpression}
41-
copyToClickboard={copyToClipboard }
42-
/>
43-
}
44-
button={<button><ClockCounterClockwise fontSize={24} /></button>}
45-
title="History"
46-
size="large"
47-
/>
48-
<button onClick={handleShare} disabled={!isShareActive}><ShareFat fontSize={24} /></button>
49-
<button onClick={handleShareResult} disabled={!isShareResultActive}><Copy fontSize={24} /></button>
50-
<DrawerButton content={<SettingsContainer />} button={<button><Gear fontSize={24} /></button>} title="Settings" size="large" />
51-
<DrawerButton content={<CredentialsContainer />} button={<button><Info fontSize={24} /></button>} title="Credentials" />
52-
</div>
53-
</div>
54-
<div className='editor'>
55-
<Allotment defaultSizes={[550, 250]}>
56-
<div className='editorWrapper'>
57-
<Editor height="100vh" defaultLanguage="json" value={resource} onChange={(value) => setResource(value as string)} options={{ formatOnPaste: true, formatOnType: true }} />
58-
</div>
59-
<div style={{ height: '100vh' }}>
60-
<Allotment defaultSizes={[100, 300]} vertical>
61-
<div className='editorWrapper'>
62-
<Editor defaultLanguage="ruby" value={expression} onChange={(value) => setExpression(value as string)} options={{
63-
formatOnPaste: true, formatOnType: true, minimap: {
64-
enabled: false,
65-
},
66-
}} />
67-
</div>
68-
<ResultOutput resultItems={result} />
69-
</Allotment>
70-
</div>
71-
</Allotment>
72-
</div>
73-
<ToastContainer />
74-
</div>
8+
<AppContainer
9+
header={<AppHeader />}
10+
content={<AppContent />}
11+
/>
7512
);
7613
};
7714

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import Editor from '@monaco-editor/react';
2+
import "allotment/dist/style.css";
3+
import 'react-toastify/dist/ReactToastify.css';
4+
import { Button } from 'antd';
5+
import { FHIRPathUIEditorProps } from '../types';
6+
import { styles } from '../../../styles';
7+
8+
export function ExpressionContainer(props: FHIRPathUIEditorProps) {
9+
const { handleExecute, resource, expression, isExecuteActive, setExpression } = props;
10+
const onClick = () => handleExecute(resource, expression)
11+
const onChange = (value: string | undefined) => setExpression(value ?? "")
12+
const editorOptions = {
13+
formatOnPaste: true,
14+
formatOnType: true,
15+
minimap: {
16+
enabled: false,
17+
},
18+
}
19+
20+
return (
21+
<div style={styles.expressionEditorWrapper}>
22+
<div style={styles.contextActions}>
23+
<Button
24+
type="primary"
25+
onClick={onClick}
26+
disabled={!isExecuteActive}
27+
>
28+
Execute
29+
</Button>
30+
</div>
31+
<Editor
32+
defaultLanguage="ruby"
33+
value={expression}
34+
onChange={onChange}
35+
options={editorOptions}
36+
/>
37+
</div>
38+
)
39+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import Editor from '@monaco-editor/react';
2+
import { Input } from 'antd';
3+
import { FHIRPathUIEditorProps } from '../types';
4+
import { styles } from '../../../styles';
5+
6+
export function ResourceContainer(props: FHIRPathUIEditorProps) {
7+
const { url, handleUrlChange, handleFetch, resourceFormat, setResource, resource } = props;
8+
const onSearch = () => handleFetch(url);
9+
const onChange = (value: string | undefined) => setResource(value ?? "");
10+
const editorOptions = {
11+
formatOnPaste: true,
12+
formatOnType: true
13+
};
14+
15+
return (
16+
<div style={styles.resourceBlockWrapper}>
17+
<Input.Search
18+
addonBefore="GET"
19+
placeholder="You can paste the URL to get the FHIR Resource"
20+
allowClear
21+
enterButton="Request"
22+
size="middle"
23+
value={url}
24+
loading={props.isLoading}
25+
onChange={handleUrlChange}
26+
onSearch={onSearch}
27+
/>
28+
<Editor
29+
height="85vh"
30+
key={resourceFormat}
31+
defaultLanguage={resourceFormat}
32+
value={resource}
33+
onChange={onChange}
34+
options={editorOptions}
35+
/>
36+
</div>
37+
);
38+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
import "allotment/dist/style.css";
2+
import 'react-toastify/dist/ReactToastify.css';
3+
import { Button } from 'antd';
4+
import { FHIRPathUIEditorProps } from '../types';
5+
import { styles } from '../../../styles';
6+
import { List } from "antd";
7+
8+
export function ResultContainer(props: FHIRPathUIEditorProps) {
9+
return (
10+
<div style={{ padding: '16px' }}>
11+
<div style={styles.contextActions}>
12+
<Button
13+
type="primary"
14+
onClick={props.handleShareResult}
15+
disabled={!props.isShareResultActive}
16+
>
17+
Copy
18+
</Button>
19+
<Button
20+
type="primary"
21+
onClick={props.handleShare}
22+
disabled={!props.isShareActive}>
23+
Share
24+
</Button>
25+
</div>
26+
<List
27+
style={{ overflow: 'hidden' }}
28+
size="small"
29+
dataSource={props.result}
30+
renderItem={(item) => (
31+
<List.Item>
32+
<pre>{JSON.stringify(item, null, 2)}</pre>
33+
</List.Item>
34+
)}
35+
/>
36+
</div>
37+
)
38+
}

0 commit comments

Comments
 (0)