diff --git a/src/common/serverConfigs.js b/src/common/serverConfigs.js index 435cf0b5..f0f7ea43 100644 --- a/src/common/serverConfigs.js +++ b/src/common/serverConfigs.js @@ -8,9 +8,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -23,9 +25,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -37,9 +41,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -51,9 +57,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -66,9 +74,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -88,9 +98,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, @@ -102,9 +114,11 @@ export const SERVER_CONFIGS = [ operations: { source: [ '$cascade', + '$checksum' ], collection: [ '$cascade', + '$checksum' ], } }, diff --git a/src/components/common/OperationsDrawer.jsx b/src/components/common/OperationsDrawer.jsx index 53c1d20c..e425455c 100644 --- a/src/components/common/OperationsDrawer.jsx +++ b/src/components/common/OperationsDrawer.jsx @@ -12,7 +12,7 @@ import { FileCopy as CopyIcon, QueryStats as HierarchyIcon, } from '@mui/icons-material'; -import { get, map, includes, uniq, find, startCase, isString, isObject, merge, forEach, isEqual } from 'lodash'; +import { get, map, includes, uniq, find, startCase, isString, isObject, merge, forEach, isEqual, without } from 'lodash'; import { OperationsContext } from '../app/LayoutContext'; import { getFHIRServerConfigFromCurrentContext, getAppliedServerConfig, getServerConfigsForCurrentUser, copyURL, urlSearchParamsToObject @@ -96,7 +96,12 @@ const OperationsDrawer = () => { const onFHIRServerChange = event => setSelectedFHIRServerId(event.target.value) const fhirServers = getServerConfigsForCurrentUser() const getSelectedFHIRServer = () => find(fhirServers, {id: selectedFHIRServerId}) - const getOperations = () => uniq([...get(fhirServer, `operations.${fhirResource}`, []), ...get(getSelectedFHIRServer(), `operations.${fhirResource}`, []), ...get(currentServer, `operations.${containerResource}`, [])]) + const getOperations = () => { + let _operations = uniq([...get(fhirServer, `operations.${fhirResource}`, []), ...get(getSelectedFHIRServer(), `operations.${fhirResource}`, []), ...get(currentServer, `operations.${containerResource}`, [])]) + if(!window.CHECKSUMS_TOGGLE) + _operations = without(_operations, '$checksum') + return _operations + } const [byURL, setByURL] = React.useState(false) const [visualize, setVisualize] = React.useState(false) React.useEffect( @@ -156,6 +161,7 @@ const OperationsDrawer = () => { const [isFetching, setIsFetching] = React.useState(false); const [selectedFHIRServerId, setSelectedFHIRServerId] = React.useState(get(fhirServer, 'id', '')) const [cascadeParams, setCascadeParams] = React.useState({...DEFAULT_CASCADE_PARAMS}) + const [jsonStr, setJSONStr] = React.useState('') const onOperationChange = event => setOperation(event.target.value) const setValuesFromURL = () => { const [url, query] = window.location.hash.split('?') @@ -213,24 +219,44 @@ const OperationsDrawer = () => { setURL(null) } } else { - let queryParams = operation === '$cascade' ? cascadeParams : {} - service.URL += parentItem.version_url || parentItem.url - service.URL += `concepts/${code}/${operation}/` + const handleResponse = _response => { + setURL(_response?.request?.responseURL || _response?.config?.url) + setResponse(_response) + setIsFetching(false) + } const isCurrentServerSameAsSelected = currentServer.url === selectedFHIRServer.url - service.get(isCurrentServerSameAsSelected ? null : false, null, queryParams).then( - _response => { - setURL(_response?.request?.responseURL || _response?.config?.url) - setResponse(_response) + const isGlobalOperation = ['$checksum'].includes(operation) + if(isGlobalOperation) { + if(isJSONString(jsonStr)) { + service.URL += `/${operation}/` + service.post(JSON.parse(jsonStr), isCurrentServerSameAsSelected ? null : false, null, null, false).then(handleResponse) + } else { setIsFetching(false) + alertifyjs.error('Invalid JSON', 5) } - ) + } else { + let queryParams = operation === '$cascade' ? cascadeParams : {} + service.URL += parentItem.version_url || parentItem.url + service.URL += `concepts/${code}/${operation}/` + service.get(isCurrentServerSameAsSelected ? null : false, null, queryParams).then(handleResponse) + } + } + } + + const isJSONString = val => { + try { + val && JSON.parse(val); + } catch (e) { + return false; } + return true; } const onOpenInNewTab = () => window.open(url) const onCopyURLClick = () => copyURL(url) const is404 = get(response, 'status') === 404 || isEqual(response, {detail: 'Not found.'}) - const responseLabel = isFetching ? 'Response: (fetching...)' : `Response: (status: ${is404 ? 404 : get(response, 'status', 'null')})`; + const is400 = get(response, 'status') === 400 || response?.error || response?.errors + const responseLabel = isFetching ? 'Response: (fetching...)' : `Response: (status: ${is404 ? 404 : (is400 ? 400 : get(response, 'status', 'null'))})`; const isError = get(response, 'status') !== 200 && !isFetching const toggleByURL = _byURL => { if(_byURL && operation === '$cascade') @@ -240,8 +266,9 @@ const OperationsDrawer = () => { const getResponse = () => { let data = get(response, 'data') || get(response, 'error') + const isError = response?.error if(isString(data)) - return {response: data} + return isError ? {error: data} : {response: data} if(isObject(data)) return data return response @@ -299,6 +326,22 @@ const OperationsDrawer = () => { +
+ + Operation + + +
{ byURL ?
@@ -331,44 +374,32 @@ const OperationsDrawer = () => {
} - : -
-

- {fhirResourceDisplay} -

-
- -
-
- setVersion(event.target.value)} size='small' /> +
: ( + operation !== '$checksum' && +
+

+ {fhirResourceDisplay} +

+
+ +
+
+ setVersion(event.target.value)} size='small' /> +
+
+ ) + } + { + operation !== '$checksum' && +
+

+ Resource +

+
+ setCode(event.target.value)} size='small' /> +
-
} -
-

- Resource & Operation -

-
- setCode(event.target.value)} size='small' /> -
-
- - Operation - - -
-
{ operation === '$cascade' &&
@@ -378,6 +409,12 @@ const OperationsDrawer = () => {
} + { + operation === '$checksum' && +
+ setJSONStr(event.target.value)} /> +
+ }