master
Bas Kloosterman 2 years ago
parent b7fbd4a50a
commit f757e7ce52
  1. 9
      his/app/src/App.js
  2. 20
      his/app/src/Connections.js
  3. 4
      his/app/src/Home.js
  4. 26
      his/app/src/Index.css
  5. 11
      his/app/src/ManageConnection.js
  6. 23
      his/app/src/Patients.js
  7. 27
      his/main.go
  8. 31
      his/openapiclient.go

@ -1,6 +1,7 @@
import React from "react";
import {
Link,
NavLink,
Outlet,
} from "react-router-dom";
import "./Index.css";
@ -8,9 +9,11 @@ const App = () => {
return (
<div>
<nav className="c-main-nav">
<p style={{padding: 5, marginRight: 50}}>MYHIS</p>
<Link to="patienten">Patienten</Link>
<Link to="connecties">Connecties</Link>
<p style={{marginRight: 50}}><Link to="/">MYHIS</Link></p>
<div className="c-main-nav__main">
<NavLink to="patienten">Patienten</NavLink>
<NavLink to="connecties">Verbindingen</NavLink>
</div>
</nav>
<div className="c-main-content">
<Outlet/>

@ -81,7 +81,8 @@ const Connections = () => {
return (
<div>
<Outlet/>
<Link to="/connecties/nieuw" className="c-button">Nieuwe connectie</Link>
<h1 className="t-page-header">Verbindingen</h1>
<Link to="/connecties/nieuw" className="c-button">Nieuwe verbinding</Link>
<table className="c-table">
<thead>
<tr>
@ -89,7 +90,7 @@ const Connections = () => {
<th>Systeem</th>
<th>Leverancier</th>
<th>Status</th>
<th>Actieve diensten</th>
<th>Diensten</th>
<th>Acties</th>
</tr>
</thead>
@ -100,11 +101,18 @@ const Connections = () => {
<td>{x.System ? x.System : 'Onbekend'}</td>
<td>{x.Supplier ? x.Supplier : 'Onbekend'}</td>
<td>{x.State == "pending" ? 'in afwachting' : 'actief'}</td>
<td>{x.Services.length ? x.Services.map((s) => {
return <span style={{marginRight: 10}} key={s.ID}>{s.Name}</span>
}) : '-'}</td>
<td>{
x.State == "pending" ? "" : (
x.Services.length ? x.Services.map((s) => {
return <span style={{marginRight: 10}} key={s.ID}>{s.Name}</span>
}) : <Link style={{marginRight: 10}} to={`/connecties/${x.ID}`}>Beschikbare diensten</Link>
)}</td>
<td>
{x.State == "pending" ? <Link to={`/connecties/${x.ID}/activeer`}>Activeer</Link> : <Link to={`/connecties/${x.ID}`}>Beheer</Link>}
{x.State == "pending" ? (
<Link to={`/connecties/${x.ID}/activeer`}>Afronden verbinding</Link>
) : (
x.Services.length ? <Link to={`/connecties/${x.ID}`}>Beheer</Link> : <Link to={`/connecties/${x.ID}`}>Activeer</Link>
)}
</td>
</tr>)
})}

@ -3,7 +3,9 @@ import "./Index.css";
const App = () => {
return (
<div></div>
<div>
<h1 className="t-page-header">Welkom bij MYHIS</h1>
</div>
);
};

@ -1,5 +1,5 @@
body {
font-family: helvetica;
font-family: Helvetica, Arial, sans-serif;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
@ -16,8 +16,20 @@ h2 {
box-shadow: 2px 2px 10px rgba(0,0,0,0.1);
}
.c-main-nav__main {
display: flex;
justify-content: space-between;
flex:1;
}
.c-main-nav a {display: block; padding: 5px; color: #137ad4; text-decoration: none}
.c-main-nav p a {color: black}
.c-main-nav .active {font-weight:bold; text-decoration: underline}
.t-page-header {
margin-bottom: 50px;
}
.c-table {
width: 100%;
}
@ -46,7 +58,7 @@ h2 {
font-size: 95%;
color: white;
background-color: #137ad4;
border: 0;
border: 1px solid #137ad4;
outline: 0;
cursor: pointer;
margin-bottom: 10px;
@ -54,6 +66,13 @@ h2 {
text-decoration: none;
}
.c-button--default {
background-color: white;
color: #137ad4;
}
.c-button--sm {
padding: 4px 8px;
font-size: 80%;
@ -106,7 +125,7 @@ h2 {
}
.c-form-row {
margin-bottom: 10px;
margin-bottom: 15px;
}
.c-input {
@ -117,6 +136,7 @@ h2 {
display: block;
outline: none;
font-size: 95%;
font-family: Helvetica, Arial, sans-serif;
}
input:disabled {

@ -65,6 +65,7 @@ const ManageConnection = () => {
return (
<div>
<Outlet/>
<h1 className="t-page-header">Verbinding</h1>
<table className="c-table">
<thead>
<tr>
@ -86,8 +87,8 @@ const ManageConnection = () => {
<th>Omschrijving</th>
<th>Aanmeldpolicy</th>
<th>Toestemmingspolicy</th>
<th>Status</th>
<th>Acties</th>
{!connection || connection.State == "pending" ? null : <th>Status</th>}
{!connection || connection.State == "pending" ? null : <th>Acties</th>}
</tr>
</thead>
<tbody>
@ -98,8 +99,8 @@ const ManageConnection = () => {
<td>{x.description}</td>
<td>{policy(x)}</td>
<td>{needConsent(x) ? 'expliciet' : 'verondersteld'}</td>
<td>{isActive(connection, x) ? 'actief' : 'inactief'}</td>
<td>{
{!connection || connection.State == "pending" ? null : (<td>{isActive(connection, x) ? 'actief' : 'inactief'}</td>)}
{!connection || connection.State == "pending" ? null : (<td>{
isActive(connection, x) ? (
<button
onClick={e => modService(false, connection, x)}
@ -117,7 +118,7 @@ const ManageConnection = () => {
Activeer
</button>
)
}</td>
}</td>)}
</tr>)
})
}

@ -4,7 +4,6 @@ import { Link, useParams, useLocation } from "react-router-dom";
import "./Index.css";
import { policy, needConsent } from "./ManageConnection";
import format from "date-fns/format";
import formatRelativeWithOptions from "date-fns/esm/fp/formatRelativeWithOptions/index";
const hasConsent = (patient, service) => {
let consent = patient.Consent.filter(x => x.ServiceID == service.ServiceID)[0]
@ -69,7 +68,7 @@ const DropDown = ({patient, services, updateSubscription, loading, saveConsent,
className="c-button c-button--sm"
onClick={e => e.preventDefault() || e.stopPropagation() || setOpen(true)}
>
Opties
Aanmelden
</a>
<div
className="c-dropdown__options"
@ -102,7 +101,7 @@ const DropDown = ({patient, services, updateSubscription, loading, saveConsent,
e.stopPropagation()
const enable = applyPolicy(e.target.checked, x)
updateSubscription(patient, x, enable)
enable && setConsentId([patient, x])
enable && needConsent(x) && setConsentId([patient, x])
}} name="" id=""
/> {x.Name} {needConsent(x) ? <ConsentLink saveConsent={saveConsent} setConsentId={setConsentId} patient={patient} service={x}/> : null}</span>
</label>
@ -166,7 +165,7 @@ export const ConsentModal = ({loading, close, service, patient, saveConsent, rem
<input className="c-input" disabled={!consent.EnableBrochure} onChange={x => setConsent(Object.assign({}, consent, {Brochureversion: x.target.value}))} value={consent.Brochureversion} type="text"/>
</div>
<div className="c-modal-buttons">
<button className="c-button" disabled={loading} onClick={async x => {
<button className="c-button c-button--default" disabled={loading} onClick={async x => {
await removeConsent(Object.assign({}, consent))
close()
}}>Toestemming intrekken</button>
@ -251,18 +250,23 @@ const Patients = () => {
return (
<div>
<table className="c-table">
<h1 className="t-page-header">Patienten</h1>
<table className="c-table" style={{width: "initial"}}>
<thead>
<tr>
<th style={{width: 200}}>Naam</th>
<th style={{width: 200}}>Geboortedatum</th>
<th style={{width: 200}}>BSN</th>
<th>Acties</th>
<th>Naam</th>
<th>Geboortedatum</th>
<th>BSN</th>
</tr>
</thead>
<tbody>
{patients.map(x => {
return (<tr key={x.ID}>
<td>{x.Name}</td>
<td>{x.Birthdate}</td>
<td>{x.ExternalId}</td>
<td>
{services.length ? <DropDown
updateSubscription={updateSubscription}
@ -273,9 +277,6 @@ const Patients = () => {
removeConsent={removeConsent}
/> : null}
</td>
<td>{x.Name}</td>
<td>{x.Birthdate}</td>
<td>{x.ExternalId}</td>
</tr>)
})}
</tbody>

@ -8,32 +8,23 @@ import (
"sync"
)
var srvaddr = "localhost:8888"
var patientIf = "localhost:8084"
var localAddr = "0.0.0.0:8084"
var externalAddr = "http://localhost:8084"
func main() {
stop := make(chan os.Signal, 1)
signal.Notify(stop, os.Interrupt)
wg := &sync.WaitGroup{}
// register(srvaddr)
// fmt.Println("Enter ref: ")
if os.Getenv("LOCAL_ADDR") != "" {
localAddr = os.Getenv("LOCAL_ADDR")
}
// // var then variable name then variable type
// var ref string
if os.Getenv("EXT_ADDR") != "" {
externalAddr = os.Getenv("EXT_ADDR")
}
// // Taking input from user
// fmt.Scanln(&ref)
// fmt.Println("Enter psk: ")
// var psk string
// fmt.Scanln(&psk)
// complete(srvaddr, ref, psk)
// listMeta(srvaddr)
// enableService(srvaddr, "wbx:visitelijst")
// subscribePatients(srvaddr, "wbx:visitelijst", patients)
// listSubscriptions(srvaddr, "wbx:visitelijst")
srv := NewServer(patientIf)
srv := NewServer(localAddr)
srv.LoadData("./data/data.db")
go func() {

@ -213,7 +213,7 @@ func (srv *HISServer) enableService(conn *model.Connection, service string, acti
Fetch: &openkv.ServiceConfig{
Protocol: "https://whiteboxsystems.nl/protospecs/whitebox-fetch/http",
Config: map[string]string{
"url": "http://localhost:8084/external/api",
"url": externalAddr + "/external/api",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,
@ -222,7 +222,30 @@ func (srv *HISServer) enableService(conn *model.Connection, service string, acti
Push: &openkv.ServiceConfig{
Protocol: "https://whiteboxsystems.nl/protospecs/whitebox-push/http",
Config: map[string]string{
"url": "http://localhost:8084/external/api",
"url": externalAddr + "/external/api",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,
},
},
})
} else if m, _ := regexp.MatchString("voorbeeld:*", service); m { // Kis
resp, err = client.ConfigService(context.Background(), &openkv.ConfigServiceRequest{
Service: service,
Enabled: active,
Fetch: &openkv.ServiceConfig{
Protocol: "https://whiteboxsystems.nl/protospecs/whitebox-fetch/http",
Config: map[string]string{
"url": externalAddr + "/external/api",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,
},
},
Push: &openkv.ServiceConfig{
Protocol: "https://whiteboxsystems.nl/protospecs/whitebox-push/http",
Config: map[string]string{
"url": externalAddr + "/external/api",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,
@ -236,7 +259,7 @@ func (srv *HISServer) enableService(conn *model.Connection, service string, acti
Fetch: &openkv.ServiceConfig{
Protocol: "https://hl7.org/fhir",
Config: map[string]string{
"url": "http://localhost:8084/external/fhir/Patient",
"url": externalAddr + "/external/fhir/Patient",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,
@ -245,7 +268,7 @@ func (srv *HISServer) enableService(conn *model.Connection, service string, acti
Push: &openkv.ServiceConfig{
Protocol: "https://hl7.org/fhir",
Config: map[string]string{
"url": "http://localhost:8084/external/fhir/Patient",
"url": externalAddr + "/external/fhir/Patient",
},
Auth: &openkv.AuthConfig{
Method: openkv.AuthMethod_APIToken,

Loading…
Cancel
Save