npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@tum-mri-aiim/ra-data-fhir

v1.1.0

Published

FHIR dataProvider for React-admin

Downloads

2

Readme

FHIR REST Data Provider For React-Admin

npm Build status Test coverage License: MIT

FHIR REST Data Provider for react-admin. React-admin is a frontend framework for building admin applications. This dataProvider enables using a FHIR Rest Server with React-admin. The dataProvider was tested using an LinuxForHealth (formerly IBM FHIR Server).

Installation

npm install --save @tum-mri-aiim/ra-data-fhir

Testing

npm test

Demo

Find a demo application using this data provider and a demo FHIR server setup here.

REST Dialect

| Method | API calls | | ------------------ | ------------------------------------------------------------------------------------ | | getList | GET {baseURL}/{res}?{param=value}* | | | GET {baseURL}/{res}?_summary=count&{param=value}* | | getOne | GET {baseURL}/{res}/{id} | | getMany | GET {baseURL}/{res}/_id={val1,val2,val3} | | getManyReference | GET {baseURL}/{res}?target=value&{param=value}* | | create | POST {baseURL}/{res} (id is returned by server in header) | | update | PUT {baseURL}/{res}/{id} | | updateMany | PUT {baseURL}/{res}/{id} (called multiple times) | | delete | DELETE {baseURL}/{res}/{id} | | deleteMany | DELETE {baseURL}/{res}/{id} (called multiple times) |

Usage

See our example demo application for more information.

import * as React from "react";
import { Admin, Resource, ListGuesser, ShowGuesser } from 'react-admin';
import dataProvider from 'ra-fhir';
import { EMPTY_FHIR_EXTENDER } from 'ra-fhir';
import { fetchUtils } from "react-admin";

const fetchJson = (url, options = {}) => {
    if (!options.headers) {
        options.headers = new Headers({ Accept: 'application/json' });
    }
    return fetchUtils.fetchJson(url, options);
}

const dp = dataProvider('rest', fetchJson, EMPTY_FHIR_EXTENDER);

const App = () => {
    return (
        <Admin  dataProvider={dp}>
              ....
        </Admin>
    )
};

export default App;

Adding Custom Headers

The provider function accepts an HTTP client function as second argument. By default, they use react-admin's fetchUtils.fetchJson() as HTTP client. It's similar to HTML5 fetch(), except it handles JSON decoding and HTTP error codes automatically.

That means that if you need to add custom headers to your requests, you just need to wrap the fetchJson() call inside your own function:

import { fetchUtils, Admin, Resource } from 'react-admin';
import postgrestRestProvider from '@promitheus/ra-data-postgrest';

const httpClient = (url, options = {}) => {
    if (!options.headers) {
        options.headers = new Headers({ Accept: 'application/json' });
    }
    // add your own headers here
    options.headers.set('X-Custom-Header', 'foobar');
    return fetchUtils.fetchJson(url, options);
};
const dataProvider = postgrestRestProvider('http://localhost:3000', httpClient);

render(
    <Admin dataProvider={dataProvider} title="Example Admin">
        ...
    </Admin>,
    document.getElementById('root')
);

Now all the requests to the REST API will contain the X-Custom-Header: foobar header.

Tip: The most common usage of custom headers is for authentication. fetchJson has built-on support for the Authorization token header:

const httpClient = (url, options = {}) => {
    options.user = {
        authenticated: true,
        token: 'SRTRDFVESGNJYTUKTYTHRG',
    };
    return fetchUtils.fetchJson(url, options);
};

Now all the requests to the REST API will contain the Authorization: SRTRDFVESGNJYTUKTYTHRG header.

Filter Operators

As FHIR allows several comparators, e.g. ne, gt, eq... The dataProvider is designed to enable you to specify the filter operator in your react filter component:

<Filter {...props}>
    <TextInput label="Search" source="name_ne" alwaysOn />
    <TextInput label="Search" source="age_gt" alwaysOn />
    // some more filters
</Filter>

One can simply append the comparator with an _ to the source. In this example the field name would be filtered with not equal whereas age would be filtered using greater than. According to the FHIR standard, if no prefix is present, the prefix eq is assumed.

FHIR Extender

The FHIR Extender can extend and minimize FHIR resources by adding or removing certain default attributes and values. In FHIR's resources, there are a lot of optional parameters. Thus, on the react-admin application side, these object attributes could potentially miss which could lead to a list full of non-uniform objects. The FHIR Extender solves this issue by extending the objects with defined key-value pairs.

import { fetchUtils } from "react-admin";
import { EMPTY_FHIR_EXTENDER } from "@tum-mri-aiim/ra-data-fhir";

/**
 * Enable extending
 * The Patient resource is extended if the keys are absent.
 * E.g. if there is no deceasedDateTime the default will always be 01.01.1800
 */
EMPTY_FHIR_EXTENDER.addDefault("Patient", {
    name: [],
    address: [],
    deceasedDateTime: "1800-01-01",
});

const dp = dataProvider("rest", fetchUtils.fetchJson, EMPTY_FHIR_EXTENDER);

In this example, the Patient ressource is configured, to guarantee the fields name, address and deceasedDateTime with default values are present after a request.

Beware that in the other direction (from the app to the server), the data will be minimized, i.e. a Patient which would be inserted with the date 1800-01-01 ends up having no date. Thus, one should wisely select default values.

FHIR Extender

Limitations

The present data provider is currently limited to run flawlessly in combination with the LinuxForHealth FHIR server (former IBM FRHIR Server). Compatibility with the HAPI FHIR server is only given for read operations. Other FHIR servers, such as Blaze, were not tested yet. Please fell free to contribute concerning this compatibility. In future, we'd love to be the library to be compatible with many FHIR servers.

The current version of FHIR Extender cannot handle nested structures. There, it is currently required to create custom components. We plan to tackle this issue in future.

License

This data provider is licensed under the MIT License.