diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/assets/scss/common/_global.scss b/assets/scss/common/_global.scss index 475ca6d..303871d 100644 --- a/assets/scss/common/_global.scss +++ b/assets/scss/common/_global.scss @@ -210,7 +210,11 @@ body { font-size: $font-size-base; } } - +.navbar-logo { + background-repeat:no-repeat; + max-height:60px; + max-width:223px +} .navbar a:hover, .navbar a:focus { text-decoration: none; @@ -269,7 +273,7 @@ body { .card-bar { border-top: 4px solid; - border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d); + border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #2e91d3); border-image-slice: 1; } diff --git a/assets/scss/common/_variables.scss b/assets/scss/common/_variables.scss index 4693833..fb50e5c 100644 --- a/assets/scss/common/_variables.scss +++ b/assets/scss/common/_variables.scss @@ -21,10 +21,11 @@ $purple: #5d2f86; $brown: #aa9c84; $blue-300: #8ed6fb; +$ml-blue: #2950a3; $pink-100: #fcfaff; $pink-500: #d32e9d; -$primary: $purple; +$primary: $ml-blue; $color-btn-bg: $pink-500; $color-btn-border: darken($pink-500, 5%); diff --git a/assets/scss/layouts/_header.scss b/assets/scss/layouts/_header.scss index a0b4a0a..94f18aa 100644 --- a/assets/scss/layouts/_header.scss +++ b/assets/scss/layouts/_header.scss @@ -140,7 +140,7 @@ button#doks-versions { .header-bar { border-top: 4px solid; - border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #d32e9d); + border-image-source: linear-gradient(90deg, $primary, #8ed6fb 50%, #2e91d3); border-image-slice: 1; } diff --git a/config/_default/menus/menus.en.toml b/config/_default/menus/menus.en.toml index 5e24b86..a0e19f4 100644 --- a/config/_default/menus/menus.en.toml +++ b/config/_default/menus/menus.en.toml @@ -65,17 +65,16 @@ parent = "get-started" [[social]] - name = "GitHub" - pre = "" - url = "https://github.com/h-enk/doks" - post = "v0.1.0" + name = "Bitbucket" + pre = "" + url = "https://bitbucket.org/medicalinformatics/mainzelliste/src/master/" weight = 10 -[[social]] - name = "Twitter" - pre = "" - url = "https://twitter.com/getdoks" - weight = 20 +#[[social]] +# name = "Twitter" +# pre = "" +# url = "https://twitter.com/getdoks" +# weight = 20 # [[footer]] # name = "Privacy" diff --git a/content/en/_index.md b/content/en/_index.md index 2e514e8..d967734 100644 --- a/content/en/_index.md +++ b/content/en/_index.md @@ -1,9 +1,10 @@ --- -title : "Modern Documentation Theme" -description: "Doks is a Hugo theme for building secure, fast, and SEO-ready documentation websites, which you can easily update and customize." -lead: "Doks is a Hugo theme for building secure, fast, and SEO-ready documentation websites, which you can easily update and customize." +title : "Mainzelliste" +description: "Die Mainzelliste ist ein webbasierter Pseudonymisierungsdienst, die die Erzeugung von Personenidentifikatoren (PID) aus identifizierenden Attributen (IDAT) erlaubt, dank Record-Linkage-Funktionalität auch bei wechselnder Qualität identifizierender Daten. Ihre Funktionen werden über eine REST-Schnittstelle bereitgestellt, die besonders flexible Integration durch andere Software ermöglicht." +lead: "Die Mainzelliste ist ein webbasierter Pseudonymisierungsdienst, die die Erzeugung von Personenidentifikatoren (PID) aus identifizierenden Attributen (IDAT) erlaubt, dank Record-Linkage-Funktionalität auch bei wechselnder Qualität identifizierender Daten. Ihre Funktionen werden über eine REST-Schnittstelle bereitgestellt, die besonders flexible Integration durch andere Software ermöglicht." date: 2020-10-06T08:47:36+00:00 lastmod: 2020-10-06T08:47:36+00:00 draft: false images: [] +version: 1.10.1 --- diff --git a/content/en/docs/prologue/getting-started.md b/content/en/docs/prologue/getting-started.md new file mode 100644 index 0000000..ec53c79 --- /dev/null +++ b/content/en/docs/prologue/getting-started.md @@ -0,0 +1,245 @@ +--- +title: "Getting Started" +description: "One page summary of how to start a new Doks project." +lead: "One page summary of how to start a new Doks project." +date: 2020-11-16T13:59:39+01:00 +lastmod: 2020-11-16T13:59:39+01:00 +draft: false +images: [] +menu: +docs: +parent: "prologue" +weight: 110 +toc: true +--- + +# Getting Started with Mainzelliste +The following steps will give you a first overview of how to run a Mainzelliste instance and perform +basic tasks. This is one of many ways to use the Mainzelliste; for more details and to understand +each API call below, please have the [API Documentation](https://bitbucket.org/medicalinformatics/mainzelliste/downloads/Mainzelliste_Schnittstelle_v3.1.0.pdf) ready. + +Mainzelliste comes packaged in a well-documented, versatile Docker container; find more info [at](.././docker.md). +For now, just run the mainzelliste with the default docker-compose config: +```shell +docker-compose up +``` + +You should now reach Mainzelliste at http://localhost:8080. Needless to say, not use real identifying data in the following steps. + +## Task 1: Add new Patient and generate Pseudonym +--- + +### 1. Create Mainzelliste Session +To authenticate, each request needs to provide a valid token (See [API Documentation](https://bitbucket.org/medicalinformatics/mainzelliste/downloads/Mainzelliste_Schnittstelle_v3.1.0.pdf)). +These tokens are in turn bundled into a Session. So first create a session with the following _cURL_ statement: +```bash +curl --location --request POST 'localhost:8080/sessions' \ +--header 'mainzellisteApiKey: changeThisApiKey' \ +--header 'mainzellisteApiVersion: 3.1' +``` +The returned session json object: +```json +{ + "sessionId": "{session-id}", + "uri": "http://localhost:8080/sessions/{session-id}/" +} +``` + +### 2. Create Mainzelliste addPatient Token +We would like to allow the bearer of the token to create up to 10 patient datasets and receive the +pseudonym of type “pid”. Use the `{session-id}` you created in the preview step as an url parameter +and run the following _cURL_ statement: +```bash +curl --location --request POST 'localhost:8080/sessions/{session-id}/tokens' \ +--header 'Content-Type: application/json' \ +--header 'mainzellisteApiKey: changeThisApiKey' \ +--header 'mainzellisteApiVersion: 3.1' \ +--data-raw '{ + "type": "addPatient", + "allowedUses": "10", + "data": { + "idtypes": ["pid"] + } +}' +``` +The returned token json object: +```json +{ + "id": "{token-id}", + "type": "addPatient", + "allowedUses": 10, + "remainingUses": 10, + "data": { + "idTypes": [ + "pid" + ] + }, + "uri": "http://localhost:8080/sessions/{session-id}/tokens/{token-id}" +} +``` + +### 3. Open Add Patient Form in Web browser +Open a web browser and use the `{token-id}` you created in the preview step as url parameter: +```url +http://localhost:8080/html/createPatient?tokenId={token-id} +``` +You will see a simple, built-in web form baked directly into Mainzelliste – one of many ways users can create pseudonyms. + +[//]: # (![Create Patient Form](./images/mainzelliste-createPatient-html.png){width=400}) + +### 4. Add Patient Identifying Data and Generate ID +Now enter the patient identifying data and submit the form. + +[//]: # (![Generated ID](./images/mainzelliste-createPatient-result-html.png){width=350}) + +:fireworks: Congratulations, you've just pseudonymized your first patient ! :fireworks: + +## Task 2: Add new Patient and control user navigation flow +--- + +The Mainzelliste API can accommodate a wide variety of use-cases. For example, as a developer of the +MDAT application, you can control what a user sees and what the web browser does after submitting +IDAT. We will now add a new patient just like in Task 1 but redirect the user after submission to a +specific webpage. + +### 1. Create Mainzelliste Session +Repeat [step 1 in task 1](#tutorial-1.1), or just re-use the existing session. + +### 2. Create Mainzelliste addPatient Token +The attribute `redirect` of the json object `data` allows you to configure a redirect url. Use the `{session-id}` you created in the preview step as an url parameter and run the following _cURL_ statement: +```bash +curl --location --request POST 'localhost:8080/sessions/{session-id}/tokens' \ +--header 'Content-Type: application/json' \ +--header 'mainzellisteApiKey: changeThisApiKey' \ +--header 'mainzellisteApiVersion: 3.1' \ +--data-raw '{ + "type": "addPatient", + "allowedUses": "10", + "data": { + "idtypes": ["pid"], + "redirect": "https://httpbin.org/get?pid={pid}&tid={tokenId}" + } +}' +``` +The returned token json object: +```json +{ + "id": "{token-id}", + "type": "addPatient", + "allowedUses": 10, + "remainingUses": 10, + "data": { + "redirect": "https://httpbin.org/get?pid={pid}&tid={tokenId}", + "idTypes": [ + "pid" + ] + }, + "uri": "http://localhost:8080/sessions/{session-id}/tokens/{token-id}" +} +``` + +### 3. Open Add Patient Form in Web browser +Same as [step 3 in task 1](#tutorial-1.3) + +### 4. Add Patient Identifying Data and Generate ID +Same as [step 4 in task 1](#tutorial-1.4) + +### 5. Print Result and Redirect the User +After pressing the submit button to print the result you will be redirected to the url you configured in step 2. + +[//]: # (![Generated ID with Print button](./images/mainzelliste-createPatient-print-result-html.png){width=350}) + +You can also hide the identifying data in the result page by setting the following configuration +variables (See [Configuration Handbook](https://bitbucket.org/medicalinformatics/mainzelliste/downloads/Mainzelliste__Konfigurationshandbuch_v1.8.pdf)): +```properties +result.printIdat = false +``` + +[//]: # (![Generated ID with Redirect button](./images/mainzelliste-createPatient-result-redirect-html.png){width=350}) + +Or you can hide the result screen altogether +```properties +result.show = false +``` + +## Task 3: Edit Patient identifying data +--- + +We will now edit an existing dataset. + +### 1. Create Mainzelliste Session +Repeat [step 1 in task 1](#tutorial-1.1), or just re-use the existing session. + +### 2. Create Mainzelliste editPatient Token +We want the bearer of the token to edit the IDAT of the dataset with pid “0003Y0WZ“. At the same +time, we want to hide the pseudonym. Use the `{session-id}` you created in the preview step as an +url parameter and run the following _cURL_ statement: + +```bash +curl --location --request POST 'localhost:8080/sessions/{session-id}/tokens' \ +--header 'Content-Type: application/json' \ +--header 'mainzellisteApiKey: changeThisApiKey' \ +--header 'mainzellisteApiVersion: 3.1' \ +--data-raw '{ + "type": "editPatient", + "data": { + "patientId": { + "idType": "pid", + "idString": "0003Y0WZ" + }, + "fields": [ + "vorname", + "nachname", + "geburtsname", + "plz", + "ort", + "geburtstag", + "geburtsmonat", + "geburtsjahr" + ] + } +}' +``` +The returned token json object: +```json +{ + "id": "{token-id}", + "type": "editPatient", + "allowedUses": 1, + "remainingUses": 1, + "data": { + "patientId": { + "idType": "pid", + "idString": "0003Y0WZ" + }, + "fields": [ + "vorname", + "nachname", + "geburtsname", + "plz", + "ort", + "geburtstag", + "geburtsmonat", + "geburtsjahr" + ] + }, + "uri": "http://localhost:8080/sessions/{session-id}/tokens/{token-id}" +} +``` + +### 3. Edit Patient Identifying data in Web browser +Open a web browser and use the `{token-id}` you created in the preview step as url parameter: +```url +http://localhost:8080/html/editPatient?tokenId={token-id} +``` +Edit the desired fields, then submit the page + +[//]: # (![Create Patient Form](./images/mainzelliste-editPatient-html.png){width=70%}) + +Congratulations, you have just explored some basic Mainzelliste functionality. But you have just +scratched the surface. Mainzelliste comes with a comprehensive API, allowing you to use it in a +myriad of pseudonymization schemes, attach your own applications, hide or show pseudonyms or build +advanced workflows such as selecting an existing patient or transparently loading IDAT into other applications. + +For more details, please look into the Mainzelliste documentation, in particular the +[API Documentation](https://bitbucket.org/medicalinformatics/mainzelliste/downloads/Mainzelliste_Schnittstelle_v3.1.0.pdf). diff --git a/content/en/docs/prologue/images/mainzelliste-createPatient-html.png b/content/en/docs/prologue/images/mainzelliste-createPatient-html.png new file mode 100644 index 0000000..ee9c688 Binary files /dev/null and b/content/en/docs/prologue/images/mainzelliste-createPatient-html.png differ diff --git a/content/en/docs/prologue/images/mainzelliste-createPatient-print-result-html.png b/content/en/docs/prologue/images/mainzelliste-createPatient-print-result-html.png new file mode 100644 index 0000000..87f9d77 Binary files /dev/null and b/content/en/docs/prologue/images/mainzelliste-createPatient-print-result-html.png differ diff --git a/content/en/docs/prologue/images/mainzelliste-createPatient-result-html.png b/content/en/docs/prologue/images/mainzelliste-createPatient-result-html.png new file mode 100644 index 0000000..3d839a0 Binary files /dev/null and b/content/en/docs/prologue/images/mainzelliste-createPatient-result-html.png differ diff --git a/content/en/docs/prologue/images/mainzelliste-createPatient-result-redirect-html.png b/content/en/docs/prologue/images/mainzelliste-createPatient-result-redirect-html.png new file mode 100644 index 0000000..dfb1d0f Binary files /dev/null and b/content/en/docs/prologue/images/mainzelliste-createPatient-result-redirect-html.png differ diff --git a/content/en/docs/prologue/images/mainzelliste-editPatient-html.png b/content/en/docs/prologue/images/mainzelliste-editPatient-html.png new file mode 100644 index 0000000..59dd09d Binary files /dev/null and b/content/en/docs/prologue/images/mainzelliste-editPatient-html.png differ diff --git a/layouts/index.html b/layouts/index.html index 9961563..ed5f88f 100644 --- a/layouts/index.html +++ b/layouts/index.html @@ -3,46 +3,61 @@

{{ .Title }}

+
-
-

{{ .Params.lead | safeHTML }}

- {{ i18n "get-started" }} -

Open-source MIT Licensed. GitHub v{{ $data := getJSON "/package.json" }}{{ $data.version }}

+
+

{{ .Params.lead | safeHTML }}

+
+ {{ i18n "get-started" }} +

Open-source AGPL v3 Licensed. Bitbucket v{{ .Params.version}}

+
+ {{ end }} {{ define "sidebar-prefooter" }} {{ if eq $.Site.Language.LanguageName "English" }}
-
+
-

Security aware

-

Get A+ scores on Mozilla Observatory out of the box. Easily change the default Security Headers to suit your needs.

+
+

ID Management

+
    +
  • +
      +
    • Erzeugung und Speicherung von Pseudonyme.
    • +
    • Pseudonymisierung 1., 2. und hohere Stufe
    • +
    • Durch symmetrisches Verfahren erzeugte nicht persistierte Pseundonyme
    • +
    • Geschützte Übertragung von Pseudonyme Dank asymetisches Verschlüsselung
    • +
    +
  • +
-

Fast by default ⚡️

-

Get 100 scores on Google Lighthouse by default. Doks removes unused css, prefetches links, and lazy loads images.

+ +

Dublettenerkennung

+

Dank ein fehlertolerantes Record Linkage von demographischen Daten können identifizierenden Daten (IDAT) aus unterschiedlichen Quellen auch bei wechselnde Qualität zum selben Person zugeordnet werden.

-

SEO-ready

-

Use sensible defaults for structured data, open graph, and Twitter cards. Or easily change the SEO settings to your liking.

+

Re-Identifizierung

+

Durchführen von Re-Identifizierungsanfragen.

-

Full text search

+

Audit Trail

Search your Doks site with FlexSearch. Easily customize index settings and search options to your liking.

-

Page layouts

-

Build pages with a landing page, blog, or documentation layout. Add custom sections and components to suit your needs.

+

sMCP

+

Abgleich von Patienten Stammdatensätze zwischen zwei Parteien ohne, dass Klartext-IDAT die Standorte zu verlassen.

-

Dark mode

-

Switch to a low-light UI with the click of a button. Change colors with variables to match your branding.

+

Flexibler Integration

+

Durch das Verwenden von Token, Weiterleiten, Callback und integrierten HTML-Seiten.

diff --git a/layouts/partials/head/structured-data.html b/layouts/partials/head/structured-data.html index 1f153a3..2f3d934 100644 --- a/layouts/partials/head/structured-data.html +++ b/layouts/partials/head/structured-data.html @@ -40,6 +40,9 @@ {{ with .Site.Params.schemaGitHub -}} , {{ . }} {{ end -}} + {{ with .Site.Params.schemaBitbucket -}} + , {{ . }} + {{ end -}} ], {{ if eq .Site.Params.schemaType "Organization" -}} "logo": { @@ -207,4 +210,4 @@ ] } - \ No newline at end of file + diff --git a/layouts/partials/header/header.html b/layouts/partials/header/header.html index 96e6fa5..41f5e4b 100644 --- a/layouts/partials/header/header.html +++ b/layouts/partials/header/header.html @@ -10,10 +10,8 @@