diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ActivityDefinitionHtmlGenerator.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ActivityDefinitionHtmlGenerator.java new file mode 100644 index 000000000..153099036 --- /dev/null +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ActivityDefinitionHtmlGenerator.java @@ -0,0 +1,194 @@ +package dev.dsf.fhir.adapter; + +import java.io.IOException; +import java.io.OutputStreamWriter; +import java.net.URI; +import java.util.List; +import java.util.Optional; + +import org.hl7.fhir.r4.model.ActivityDefinition; +import org.hl7.fhir.r4.model.CanonicalType; +import org.hl7.fhir.r4.model.Coding; +import org.hl7.fhir.r4.model.Extension; +import org.hl7.fhir.r4.model.Identifier; +import org.hl7.fhir.r4.model.Resource; +import org.hl7.fhir.r4.model.StringType; +import org.hl7.fhir.r4.model.Type; + +public class ActivityDefinitionHtmlGenerator extends ResourceHtmlGenerator implements HtmlGenerator +{ + private static final String EXTENSION_PROCESS_AUTHORIZATION = "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"; + private static final String EXTENSION_PROCESS_AUTHORIZATION_TASK_PROFILE = "task-profile"; + private static final String EXTENSION_PROCESS_AUTHORIZATION_MESSAGE_NAME = "message-name"; + private static final String EXTENSION_PROCESS_AUTHORIZATION_REQUESTER = "requester"; + private static final String EXTENSION_PROCESS_AUTHORIZATION_RECIPIENT = "recipient"; + + @Override + public Class getResourceType() + { + return ActivityDefinition.class; + } + + @Override + public void writeHtml(URI resourceUri, ActivityDefinition resource, OutputStreamWriter out) throws IOException + { + out.write("
\n"); + + out.write( + "
\n"); + out.write("
\n"); + + writeMeta(resource, out); + writeRow("Status", (resource.hasStatus() ? resource.getStatus().toCode() : ""), out); + + writeSectionHeader("Activity Definition", out); + + if (resource.hasUrl()) + writeRow("Process", resource.getUrl() + (resource.hasVersion() ? " | " + resource.getVersion() : ""), out); + + if (resource.hasTitle()) + writeRow("Title", resource.getTitle(), out); + + if (resource.hasSubtitle()) + writeRow("Subtitle", resource.getSubtitle(), out); + + if (resource.hasDescription()) + writeRow("Description", resource.getDescription(), out); + + if (resource.hasPublisher()) + writeRow("Publisher", resource.getPublisher(), out); + + if (resource.hasDate()) + writeRow("Date", format(resource.getDate(), DATE_FORMAT), out); + + List processAuthorizations = resource.getExtension().stream() + .filter(e -> EXTENSION_PROCESS_AUTHORIZATION.equals(e.getUrl())).toList(); + + if (!processAuthorizations.isEmpty()) + { + for (int i = 0; i < processAuthorizations.size(); i++) + { + writeProcessAuthorizationRow(processAuthorizations.get(i), + "Authorization" + (processAuthorizations.size() > 1 ? " " + (i + 1) : ""), out); + } + } + + out.write("
\n"); + } + + private void writeProcessAuthorizationRow(Extension extension, String header, OutputStreamWriter out) + throws IOException + { + Optional taskProfile = extension.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION_TASK_PROFILE) + .stream().filter(e -> e.getValue() instanceof CanonicalType) + .map(e -> String.join(" | ", ((CanonicalType) e.getValue()).getValue().split("\\|"))).findFirst(); + + Optional messageName = extension.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION_MESSAGE_NAME) + .stream().filter(e -> e.getValue() instanceof StringType) + .map(e -> ((StringType) e.getValue()).getValue()).findFirst(); + + if (taskProfile.isPresent() || messageName.isPresent()) + { + writeSectionHeader(header, out); + out.write("
\n"); + + if (messageName.isPresent()) + { + writeRowWithAdditionalRowClasses("Message-Name", messageName.get(), + taskProfile.isPresent() ? "flex-element-33 flex-element-margin" : "flex-element-100", out); + } + + if (taskProfile.isPresent()) + { + writeRowWithAdditionalRowClasses("Task Profile", taskProfile.get(), + messageName.isPresent() ? "flex-element-67" : "flex-element-100", out); + } + + out.write("
\n"); + } + + List requester = extension.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION_REQUESTER).stream() + .filter(e -> e.getValue() instanceof Coding).map(e -> ((Coding) e.getValue())).toList(); + writeAuthorizationFor(requester, "Requester", out); + + List recipient = extension.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION_RECIPIENT).stream() + .filter(e -> e.getValue() instanceof Coding).map(e -> ((Coding) e.getValue())).toList(); + writeAuthorizationFor(recipient, "Recipient", out); + } + + private void writeAuthorizationFor(List authorization, String header, OutputStreamWriter out) + throws IOException + { + for (int i = 0; i < authorization.size(); i++) + { + out.write("
\n"); + out.write("

" + header + (authorization.size() > 1 ? " " + (i + 1) : "") + "

\n"); + + Coding authorizationCode = authorization.get(i); + writeRowWithAdditionalRowClasses("Authorization Type", + authorizationCode.getSystem() + " | " + authorizationCode.getCode() + "", "nested-row", out); + + writeCoding("Practitioner", authorizationCode, + "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-practitioner", out); + writeIdentifier("Organization", authorizationCode, + "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization", out); + + List authorizationOrganizationPractitioner = authorizationCode.getExtensionsByUrl( + "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-organization-practitioner"); + for (Extension extension : authorizationOrganizationPractitioner) + { + writeIdentifier("Organization", extension, "organization", out); + writeCoding("Practitioner Role", extension, "practitioner-role", out); + } + + List authorizationParentOrganizationRole = authorizationCode.getExtensionsByUrl( + "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role"); + for (Extension extension : authorizationParentOrganizationRole) + { + writeIdentifier("Parent Organization", extension, "parent-organization", out); + writeCoding("Organization Role", extension, "organization-role", out); + } + + List authorizationParentOrganizationPractitionerRole = authorizationCode.getExtensionsByUrl( + "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization-parent-organization-role-practitioner"); + for (Extension extension : authorizationParentOrganizationPractitionerRole) + { + writeIdentifier("Parent Organization", extension, "parent-organization", out); + writeCoding("Organization Role", extension, "organization-role", out); + writeCoding("Practitioner Role", extension, "practitioner-role", out); + } + + out.write("
\n"); + } + } + + private void writeCoding(String label, Type type, String url, OutputStreamWriter out) throws IOException + { + Optional coding = type.getExtension().stream().filter(e -> url.equals(e.getUrl())) + .filter(e -> e.getValue() instanceof Coding).map(e -> ((Coding) e.getValue())).findFirst(); + + if (coding.isPresent()) + { + writeRowWithAdditionalRowClasses(label, + coding.get().getSystem() + " | " + coding.get().getCode() + "", "nested-row", out); + } + } + + private void writeIdentifier(String label, Type type, String url, OutputStreamWriter out) throws IOException + { + Optional identifier = type.getExtension().stream().filter(e -> url.equals(e.getUrl())) + .filter(e -> e.getValue() instanceof Identifier).map(e -> ((Identifier) e.getValue())).findFirst(); + + if (identifier.isPresent()) + { + writeRowWithAdditionalRowClasses(label, + identifier.get().getSystem() + " | " + identifier.get().getValue() + "", "nested-row", out); + } + } + + @Override + public boolean isResourceSupported(URI resourceUri, Resource resource) + { + return resource != null && resource instanceof ActivityDefinition; + } +} diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/OrganizationHtmlGenerator.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/OrganizationHtmlGenerator.java index 293beef5d..bfa5101e8 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/OrganizationHtmlGenerator.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/OrganizationHtmlGenerator.java @@ -131,15 +131,15 @@ private void writeRowWithContacts(List contacts, OutputStreamWrite if (eMail.isPresent() || phone.isPresent()) { - out.write("
\n"); + out.write("
\n"); if (eMail.isPresent()) writeRowWithAdditionalRowClasses("eMail", eMail.get().getValue(), - phone.isPresent() ? "contact-element-50 contact-element-margin" : "contact-element-100", out); + phone.isPresent() ? "flex-element-50 flex-element-margin" : "flex-element-100", out); if (phone.isPresent()) writeRowWithAdditionalRowClasses("Phone", phone.get().getValue(), - eMail.isPresent() ? "contact-element-50" : "contact-element-100", out); + eMail.isPresent() ? "flex-element-50" : "flex-element-100", out); out.write("
\n"); } diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceHtmlGenerator.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceHtmlGenerator.java index d367f1ac2..8db5804d2 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceHtmlGenerator.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/ResourceHtmlGenerator.java @@ -2,26 +2,12 @@ import java.io.IOException; import java.io.OutputStreamWriter; -import java.net.MalformedURLException; -import java.net.URL; import java.util.List; import org.hl7.fhir.r4.model.Resource; public abstract class ResourceHtmlGenerator extends AbstractHtmlAdapter { - protected String getServerBaseUrlPath(String serverBaseUrl) - { - try - { - return new URL(serverBaseUrl).getPath(); - } - catch (MalformedURLException e) - { - throw new RuntimeException(e); - } - } - protected void writeMeta(Resource resource, OutputStreamWriter out) throws IOException { writeSectionHeader("Meta", out); @@ -31,13 +17,15 @@ protected void writeMeta(Resource resource, OutputStreamWriter out) throws IOExc { List profiles = resource.getMeta().getProfile().stream() .map(p -> p.getValue().replaceAll("\\|", " \\| ")).toList(); - writeRowWithListAndAdditionalRowClasses("Profiles", profiles, "profiles", out); + writeRowWithListAndAdditionalRowClasses("Profiles", profiles, + resource.getMeta().hasLastUpdated() ? "flex-element-67 flex-element-margin" : "flex-element-100", + out); } if (resource.getMeta().hasLastUpdated()) { writeRowWithAdditionalRowClasses("Last Updated", formatLastUpdated(resource, DATE_TIME_DISPLAY_FORMAT), - "last-updated", out); + resource.getMeta().hasProfile() ? "flex-element-33 flex-element-margin" : "flex-element-100", out); } out.write("
\n"); diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchBundleHtmlGenerator.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchBundleHtmlGenerator.java index e1599729d..8e28bbfe0 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchBundleHtmlGenerator.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/adapter/SearchBundleHtmlGenerator.java @@ -15,6 +15,7 @@ import org.glassfish.jersey.uri.UriComponent; import org.hl7.fhir.instance.model.api.IIdType; +import org.hl7.fhir.r4.model.ActivityDefinition; import org.hl7.fhir.r4.model.Bundle; import org.hl7.fhir.r4.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r4.model.Bundle.BundleLinkComponent; @@ -50,26 +51,31 @@ public class SearchBundleHtmlGenerator extends AbstractHtmlAdapter implements Ht private static final String CODE_SYSTEM_BPMN_MESSAGE_MESSAGE_NAME = "message-name"; private static final String CODE_SYSTEM_BPMN_MESSAGE_BUSINESS_KEY = "business-key"; private static final String CODE_SYSTEM_ORGANIZATION_ROLE = "http://dsf.dev/fhir/CodeSystem/organization-role"; + private static final String EXTENSION_PROCESS_AUTHORIZATION = "http://dsf.dev/fhir/StructureDefinition/extension-process-authorization"; + private static final String EXTENSION_PROCESS_AUTHORIZATION_MESSAGE_NAME = "message-name"; private static final String NAMING_SYSTEM_ENDPOINT_IDENTIFIER = "http://dsf.dev/sid/endpoint-identifier"; private static final String NAMING_SYSTEM_ORGANIZATION_IDENTIFIER = "http://dsf.dev/sid/organization-identifier"; private static final String NAMING_SYSTEM_TASK_IDENTIFIER = "http://dsf.dev/sid/task-identifier"; - private final String taskRessourcePath; - private final String questionnaireResponseRessourcePath; + private final String activityDefinitionResourcePath; + private final String endpointResourcePath; private final String organizationResourcePath; private final String organizationAffiliationResourcePath; - private final String endpointResourcePath; + private final String questionnaireResponseRessourcePath; + private final String taskRessourcePath; private final int defaultPageCount; public SearchBundleHtmlGenerator(String serverBaseUrl, int defaultPageCount) { String serverBaseUrlPath = getServerBaseUrlPath(serverBaseUrl); - taskRessourcePath = serverBaseUrlPath + "/" + ResourceType.Task.name(); - questionnaireResponseRessourcePath = serverBaseUrlPath + "/" + ResourceType.QuestionnaireResponse.name(); + + activityDefinitionResourcePath = serverBaseUrlPath + "/" + ResourceType.ActivityDefinition.name(); + endpointResourcePath = serverBaseUrlPath + "/" + ResourceType.Endpoint.name(); organizationResourcePath = serverBaseUrlPath + "/" + ResourceType.Organization.name(); organizationAffiliationResourcePath = serverBaseUrlPath + "/" + ResourceType.OrganizationAffiliation.name(); - endpointResourcePath = serverBaseUrlPath + "/" + ResourceType.Endpoint.name(); + questionnaireResponseRessourcePath = serverBaseUrlPath + "/" + ResourceType.QuestionnaireResponse.name(); + taskRessourcePath = serverBaseUrlPath + "/" + ResourceType.Task.name(); this.defaultPageCount = defaultPageCount; } @@ -96,11 +102,12 @@ public Class getResourceType() public boolean isResourceSupported(URI resourceUri, Resource resource) { return resource != null && resource instanceof Bundle - && (taskRessourcePath.equals(resourceUri.getPath()) - || questionnaireResponseRessourcePath.equals(resourceUri.getPath()) + && (activityDefinitionResourcePath.equals(resourceUri.getPath()) + || endpointResourcePath.equals(resourceUri.getPath()) || organizationResourcePath.equals(resourceUri.getPath()) || organizationAffiliationResourcePath.equals(resourceUri.getPath()) - || endpointResourcePath.equals(resourceUri.getPath())); + || questionnaireResponseRessourcePath.equals(resourceUri.getPath()) + || taskRessourcePath.equals(resourceUri.getPath())); } @Override @@ -213,28 +220,30 @@ private int getCount(URI uri) private String getHeader(URI uri) { - if (taskRessourcePath.equals(uri.getPath())) - return getTaskHeader(); - else if (questionnaireResponseRessourcePath.equals(uri.getPath())) - return getQuestionnaireResponseHeader(); + if (activityDefinitionResourcePath.equals(uri.getPath())) + return getActivityDefinitionHeader(); + else if (endpointResourcePath.equals(uri.getPath())) + return getEndpointHeader(); else if (organizationResourcePath.equals(uri.getPath())) return getOrganizationHeader(); else if (organizationAffiliationResourcePath.equals(uri.getPath())) return getOrganizationAffiliationHeader(); - else if (endpointResourcePath.equals(uri.getPath())) - return getEndpointHeader(); + else if (questionnaireResponseRessourcePath.equals(uri.getPath())) + return getQuestionnaireResponseHeader(); + else if (taskRessourcePath.equals(uri.getPath())) + return getTaskHeader(); else throw new IllegalArgumentException("Unexpected resource path: " + uri.getPath()); } - private String getTaskHeader() + private String getActivityDefinitionHeader() { - return "IDStatusProcessMessage-NameRequesterBusiness-Key / IdentifierLast Updated"; + return "IDStatusTitleProcessMessage-NamesLast Updated"; } - private String getQuestionnaireResponseHeader() + private String getEndpointHeader() { - return "IDStatusQuestionnaireBusiness-KeyLast Updated"; + return "IDStatusIdentifierNameAddressManaging OrganizationLast Updated"; } private String getOrganizationHeader() @@ -247,23 +256,30 @@ private String getOrganizationAffiliationHeader() return "IDActiveParent OrganizationParticipating OrganizationRoleEndpointLast Updated"; } - private String getEndpointHeader() + private String getQuestionnaireResponseHeader() { - return "IDStatusIdentifierNameAddressManaging OrganizationLast Updated"; + return "IDStatusQuestionnaireBusiness-KeyLast Updated"; + } + + private String getTaskHeader() + { + return "IDStatusProcessMessage-NameRequesterBusiness-Key / IdentifierLast Updated"; } private String getRow(Resource resource) { - if (resource instanceof Task t) - return getTaskRow(t); - else if (resource instanceof QuestionnaireResponse qr) - return getQuestionnaireResponseRow(qr); + if (resource instanceof ActivityDefinition a) + return getActivityDefinitionRow(a); + else if (resource instanceof Endpoint e) + return getEndpointRow(e); else if (resource instanceof Organization o) return getOrganizationRow(o); else if (resource instanceof OrganizationAffiliation oa) return getOrganizationAffiliationRow(oa); - else if (resource instanceof Endpoint e) - return getEndpointRow(e); + else if (resource instanceof QuestionnaireResponse qr) + return getQuestionnaireResponseRow(qr); + else if (resource instanceof Task t) + return getTaskRow(t); else throw new IllegalArgumentException("Unexpected resource type: " + resource.getResourceType().name()); } @@ -315,6 +331,38 @@ private String createResourceLink(Reference reference) } } + private String getActivityDefinitionRow(ActivityDefinition resource) + { + String domain = "", processName = "", processVersion = ""; + if (resource.getUrl() != null && !resource.getUrl().isBlank()) + { + Matcher matcher = INSTANTIATES_CANONICAL_PATTERN + .matcher(resource.getUrl() + (resource.hasVersion() ? "|" + resource.getVersion() : "")); + if (matcher.matches()) + { + domain = matcher.group("domain"); + processName = matcher.group("processName"); + processVersion = matcher.group("processVersion"); + } + } + + List messageNames = resource.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION).stream() + .flatMap(e -> e.getExtensionsByUrl(EXTENSION_PROCESS_AUTHORIZATION_MESSAGE_NAME).stream()) + .filter(e -> e.getValue() instanceof StringType).map(e -> ((StringType) e.getValue()).getValue()) + .toList(); + + String combinedMessageNames = (messageNames.size() > 2) + ? String.join(", ", messageNames.subList(0, 2)) + ", ..." + : String.join(", ", messageNames); + + return "" + + createResourceLink(resource) + "" + + (resource.hasStatus() ? resource.getStatus().toCode() : "") + "" + + (resource.hasTitle() ? resource.getTitle() : "") + "" + domain + " | " + processName + " | " + + processVersion + "" + combinedMessageNames + "" + + formatLastUpdated(resource, DATE_TIME_DISPLAY_FORMAT) + ""; + } + private String getTaskRow(Task resource) { String domain = "", processName = "", processVersion = ""; diff --git a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/spring/config/AdapterConfig.java b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/spring/config/AdapterConfig.java index bffd47ccb..a8ac4e3e7 100755 --- a/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/spring/config/AdapterConfig.java +++ b/dsf-fhir/dsf-fhir-server/src/main/java/dev/dsf/fhir/spring/config/AdapterConfig.java @@ -6,6 +6,7 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import dev.dsf.fhir.adapter.ActivityDefinitionHtmlGenerator; import dev.dsf.fhir.adapter.EndpointHtmlGenerator; import dev.dsf.fhir.adapter.FhirAdapter; import dev.dsf.fhir.adapter.HtmlFhirAdapter; @@ -34,9 +35,11 @@ public FhirAdapter fhirAdapter() public HtmlFhirAdapter htmlFhirAdapter() { return new HtmlFhirAdapter(propertiesConfig.getServerBaseUrl(), fhirConfig.fhirContext(), - List.of(new EndpointHtmlGenerator(), new OrganizationHtmlGenerator(), - new OrganizationAffiliationHtmlGenerator(), new QuestionnaireResponseHtmlGenerator(), - new TaskHtmlGenerator(), new SearchBundleHtmlGenerator(propertiesConfig.getServerBaseUrl(), - propertiesConfig.getDefaultPageCount()))); + List.of(new ActivityDefinitionHtmlGenerator(), new EndpointHtmlGenerator(), + new OrganizationHtmlGenerator(), new OrganizationAffiliationHtmlGenerator(), + new QuestionnaireResponseHtmlGenerator(), + new SearchBundleHtmlGenerator(propertiesConfig.getServerBaseUrl(), + propertiesConfig.getDefaultPageCount()), + new TaskHtmlGenerator())); } } diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/static/bookmarks.js b/dsf-fhir/dsf-fhir-server/src/main/resources/static/bookmarks.js index 36aa73d86..204375847 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/resources/static/bookmarks.js +++ b/dsf-fhir/dsf-fhir-server/src/main/resources/static/bookmarks.js @@ -130,7 +130,7 @@ function getBasePath() { function getInitialBookmarks() { return { '_misc': ['metadata'], - 'ActivityDefinition': ['ActivityDefinition'], + 'ActivityDefinition': ['ActivityDefinition', "ActivityDefinition?_sort=status,url,version"], 'CodeSystem': ['CodeSystem'], 'Endpoint': ['Endpoint'], 'NamingSystem': ['NamingSystem'], diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/static/dsf.css b/dsf-fhir/dsf-fhir-server/src/main/resources/static/dsf.css index 1014f020f..a35313ec4 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/resources/static/dsf.css +++ b/dsf-fhir/dsf-fhir-server/src/main/resources/static/dsf.css @@ -505,15 +505,6 @@ pre.lang-html { flex-direction: row } -.profiles { - margin-right: 0.7em; - width: 67%; -} - -.last-updated { - width: 33%; -} - .row-list { padding-inline-start: 25px; margin-top: 0.15em; @@ -574,25 +565,49 @@ div.row-text { background: var(--color-row-border-draft); } -.contact { +.row[status="draft"]:first-child { + background: var(--color-row-border-draft); +} + +.flex-element { display: flex; flex-direction: row; } -.contact-element-100 { +.flex-element-100 { width: 100%; margin-right: 0em; } -.contact-element-50 { +.flex-element-67 { + width: 67%; +} + +.flex-element-50 { width: 50%; margin-right: 0em; } -.contact-element-margin { +.flex-element-33 { + width: 33%; +} + +.flex-element-margin { margin-right: 0.7em; } +.authorization { + padding-bottom: 0.25em !important; +} + +.authorization>h3 +{ + margin-top: 0; + margin-bottom: 0; + padding: 1em 1em 0.75em 0.25em; + font-size: 1em; +} + @media print { body { margin: 0; diff --git a/dsf-fhir/dsf-fhir-server/src/main/resources/static/form.css b/dsf-fhir/dsf-fhir-server/src/main/resources/static/form.css index 7597e90e3..7ebcca221 100644 --- a/dsf-fhir/dsf-fhir-server/src/main/resources/static/form.css +++ b/dsf-fhir/dsf-fhir-server/src/main/resources/static/form.css @@ -19,6 +19,13 @@ fieldset#form-fieldset { background-color: var(--color-row-background); } +.row>.nested-row { + border-radius: 5px; + padding: 0 1em 1em 0.5em; + margin-bottom: 0.7em; + background-color: var(--color-row-background-deep); +} + .row-extension-0 { margin-top: 12px; padding: 0 0 12px 12px; @@ -196,7 +203,7 @@ form .row-info a:hover { label { display: block; - padding: 12px 12px 12px 0; + padding: 1em 1em 1em 0; font-weight: regular; } @@ -395,7 +402,7 @@ button.submit { .row-label { color: var(--color-input-text); - padding: 12px 0 6px 6px; + padding: 1em 0 0.25em 0.4em; font-weight: bold; font-size: small; position: relative;