fhirsmith 0.8.3 → 0.8.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,47 @@ All notable changes to the Health Intersections Node Server will be documented i
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [v0.8.5] - 2026-04-02
9
+
10
+ ### Added
11
+
12
+ - Add support for webSource extension
13
+ - Add support for SCT filter in (codes)
14
+
15
+ ### Changed
16
+
17
+ - Upgrade LOINC to 2.82
18
+ - Improve resource rendering -copy button + link
19
+
20
+ ### Fixed
21
+
22
+ - Add missing code systems from search
23
+
24
+ ### Tx Conformance Statement
25
+
26
+ FHIRsmith passed all 1497 HL7 terminology service tests (modes tx.fhir.org+omop+general+snomed, tests v1.9.1, runner v6.9.4)
27
+
28
+ ## [v0.8.4] - 2026-04-01
29
+
30
+ ### Added
31
+
32
+ - add .npmrc to defend against supply chain attacks
33
+
34
+ ### Changed
35
+
36
+ - Rework extension handling to make sure uzbek loinc works - load supplements from store
37
+
38
+ ### Fixed
39
+
40
+ - tx/expand: fix for bug where filter array is present but empty
41
+ - tx/SCT: support filters generalizes and child-of
42
+ - tx/SCT: fix bug evaluating property filters
43
+ - Fix version conversion issues
44
+
45
+ ### Tx Conformance Statement
46
+
47
+ FHIRsmith passed all 1497 HL7 terminology service tests (modes tx.fhir.org+omop+general+snomed, tests v1.9.1, runner v6.9.4)
48
+
8
49
  ## [v0.8.3] - 2026-03-31
9
50
 
10
51
  ### Changed
@@ -15,15 +56,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
15
56
  - Publisher: Allow non-admin users to delete non-approved tasks
16
57
 
17
58
  ### Fixed
18
-
59
+
19
60
  - Publisher: fix task logging
20
- - SHL: path fixes
61
+ - SHL: path fixes
21
62
 
22
63
  ### Tx Conformance Statement
23
64
 
24
65
  FHIRsmith passed all 1497 HL7 terminology service tests (modes tx.fhir.org+omop+general+snomed, tests v1.9.1, runner v6.9.4)
25
66
 
26
-
27
67
  ## [v0.8.2] - 2026-03-29
28
68
 
29
69
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fhirsmith",
3
- "version": "0.8.3",
3
+ "version": "0.8.5",
4
4
  "description": "A Node.js server that provides a collection of tools to serve the FHIR ecosystem",
5
5
  "main": "server.js",
6
6
  "engines": {
@@ -104,7 +104,10 @@
104
104
  "license": "BSD-3",
105
105
  "overrides": {
106
106
  "tar": "^7.5.7",
107
- "fast-xml-parser": "^5.3.4"
107
+ "fast-xml-parser": "^5.3.4",
108
+ "inquirer": {
109
+ "lodash": "4.18.1"
110
+ }
108
111
  },
109
112
  "bin": {
110
113
  "tx-import": "./tx/importers/tx-import.js",
@@ -0,0 +1,31 @@
1
+
2
+ // Tooltip
3
+ $('.btn-copy').tooltip({
4
+ trigger: 'hover',
5
+ placement: 'bottom'
6
+ });
7
+
8
+ function setTooltip(message) {
9
+ button = $(event.target)
10
+ oldMsg = button.tooltip().attr('data-original-title')
11
+ button.tooltip()
12
+ .attr('data-original-title', message)
13
+ .tooltip('show');
14
+ setTimeout(function() {
15
+ button.tooltip()
16
+ .attr('data-original-title', oldMsg)
17
+ .tooltip('hide');
18
+ }, 1000);
19
+ }
20
+
21
+ // Clipboard
22
+
23
+ var clipboard = new ClipboardJS('.btn-copy');
24
+
25
+ clipboard.on('success', function(e) {
26
+ setTooltip('Copied!');
27
+ });
28
+
29
+ clipboard.on('error', function(e) {
30
+ setTooltip('Failed :( - copy manually');
31
+ });
@@ -0,0 +1,7 @@
1
+ /*!
2
+ * clipboard.js v2.0.8
3
+ * https://clipboardjs.com/
4
+ *
5
+ * Licensed MIT © Zeno Rocha
6
+ */
7
+ !function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body},i="";return"string"==typeof t?(e=t,n="rtl"===document.documentElement.getAttribute("dir"),(o=document.createElement("textarea")).style.fontSize="12pt",o.style.border="0",o.style.padding="0",o.style.margin="0",o.style.position="absolute",o.style[n?"right":"left"]="-9999px",n=window.pageYOffset||document.documentElement.scrollTop,o.style.top="".concat(n,"px"),o.setAttribute("readonly",""),o.value=e,o=o,r.container.appendChild(o),i=c()(o),a("copy"),o.remove()):(i=c()(t),a("copy")),i};function r(t){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}var s=function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},e=t.action,n=void 0===e?"copy":e,o=t.container,e=t.target,t=t.text;if("copy"!==n&&"cut"!==n)throw new Error('Invalid "action" value, use either "copy" or "cut"');if(void 0!==e){if(!e||"object"!==r(e)||1!==e.nodeType)throw new Error('Invalid "target" value, use a valid Element');if("copy"===n&&e.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if("cut"===n&&(e.hasAttribute("readonly")||e.hasAttribute("disabled")))throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes')}return t?l(t,{container:o}):e?"cut"===n?f(e):l(e,{container:o}):void 0};function d(t){return(d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t})(t)}function p(t,e){for(var n=0;n<e.length;n++){var o=e[n];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(t,o.key,o)}}function y(t,e){return(y=Object.setPrototypeOf||function(t,e){return t.__proto__=e,t})(t,e)}function h(n){var o=function(){if("undefined"==typeof Reflect||!Reflect.construct)return!1;if(Reflect.construct.sham)return!1;if("function"==typeof Proxy)return!0;try{return Date.prototype.toString.call(Reflect.construct(Date,[],function(){})),!0}catch(t){return!1}}();return function(){var t,e=m(n);return t=o?(t=m(this).constructor,Reflect.construct(e,arguments,t)):e.apply(this,arguments),e=this,!(t=t)||"object"!==d(t)&&"function"!=typeof t?function(t){if(void 0!==t)return t;throw new ReferenceError("this hasn't been initialised - super() hasn't been called")}(e):t}}function m(t){return(m=Object.setPrototypeOf?Object.getPrototypeOf:function(t){return t.__proto__||Object.getPrototypeOf(t)})(t)}function v(t,e){t="data-clipboard-".concat(t);if(e.hasAttribute(t))return e.getAttribute(t)}var o=function(){!function(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),e&&y(t,e)}(r,i());var t,e,n,o=h(r);function r(t,e){var n;return function(t){if(!(t instanceof r))throw new TypeError("Cannot call a class as a function")}(this),(n=o.call(this)).resolveOptions(e),n.listenClick(t),n}return t=r,n=[{key:"copy",value:function(t){var e=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{container:document.body};return l(t,e)}},{key:"cut",value:function(t){return f(t)}},{key:"isSupported",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:["copy","cut"],t="string"==typeof t?[t]:t,e=!!document.queryCommandSupported;return t.forEach(function(t){e=e&&!!document.queryCommandSupported(t)}),e}}],(e=[{key:"resolveOptions",value:function(){var t=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{};this.action="function"==typeof t.action?t.action:this.defaultAction,this.target="function"==typeof t.target?t.target:this.defaultTarget,this.text="function"==typeof t.text?t.text:this.defaultText,this.container="object"===d(t.container)?t.container:document.body}},{key:"listenClick",value:function(t){var e=this;this.listener=u()(t,"click",function(t){return e.onClick(t)})}},{key:"onClick",value:function(t){var e=t.delegateTarget||t.currentTarget,t=s({action:this.action(e),container:this.container,target:this.target(e),text:this.text(e)});this.emit(t?"success":"error",{action:this.action,text:t,trigger:e,clearSelection:function(){e&&e.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(t){return v("action",t)}},{key:"defaultTarget",value:function(t){t=v("target",t);if(t)return document.querySelector(t)}},{key:"defaultText",value:function(t){return v("text",t)}},{key:"destroy",value:function(){this.listener.destroy()}}])&&p(t.prototype,e),n&&p(t,n),r}()},828:function(t){var e;"undefined"==typeof Element||Element.prototype.matches||((e=Element.prototype).matches=e.matchesSelector||e.mozMatchesSelector||e.msMatchesSelector||e.oMatchesSelector||e.webkitMatchesSelector),t.exports=function(t,e){for(;t&&9!==t.nodeType;){if("function"==typeof t.matches&&t.matches(e))return t;t=t.parentNode}}},438:function(t,e,n){var u=n(828);function i(t,e,n,o,r){var i=function(e,n,t,o){return function(t){t.delegateTarget=u(t.target,n),t.delegateTarget&&o.call(e,t)}}.apply(this,arguments);return t.addEventListener(n,i,r),{destroy:function(){t.removeEventListener(n,i,r)}}}t.exports=function(t,e,n,o,r){return"function"==typeof t.addEventListener?i.apply(null,arguments):"function"==typeof n?i.bind(null,document).apply(null,arguments):("string"==typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,function(t){return i(t,e,n,o,r)}))}},879:function(t,n){n.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},n.nodeList=function(t){var e=Object.prototype.toString.call(t);return void 0!==t&&("[object NodeList]"===e||"[object HTMLCollection]"===e)&&"length"in t&&(0===t.length||n.node(t[0]))},n.string=function(t){return"string"==typeof t||t instanceof String},n.fn=function(t){return"[object Function]"===Object.prototype.toString.call(t)}},370:function(t,e,n){var f=n(879),l=n(438);t.exports=function(t,e,n){if(!t&&!e&&!n)throw new Error("Missing required arguments");if(!f.string(e))throw new TypeError("Second argument must be a String");if(!f.fn(n))throw new TypeError("Third argument must be a Function");if(f.node(t))return c=e,a=n,(u=t).addEventListener(c,a),{destroy:function(){u.removeEventListener(c,a)}};if(f.nodeList(t))return o=t,r=e,i=n,Array.prototype.forEach.call(o,function(t){t.addEventListener(r,i)}),{destroy:function(){Array.prototype.forEach.call(o,function(t){t.removeEventListener(r,i)})}};if(f.string(t))return t=t,e=e,n=n,l(document.body,t,e,n);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList");var o,r,i,u,c,a}},817:function(t){t.exports=function(t){var e,n="SELECT"===t.nodeName?(t.focus(),t.value):"INPUT"===t.nodeName||"TEXTAREA"===t.nodeName?((e=t.hasAttribute("readonly"))||t.setAttribute("readonly",""),t.select(),t.setSelectionRange(0,t.value.length),e||t.removeAttribute("readonly"),t.value):(t.hasAttribute("contenteditable")&&t.focus(),n=window.getSelection(),(e=document.createRange()).selectNodeContents(t),n.removeAllRanges(),n.addRange(e),n.toString());return n}},279:function(t){function e(){}e.prototype={on:function(t,e,n){var o=this.e||(this.e={});return(o[t]||(o[t]=[])).push({fn:e,ctx:n}),this},once:function(t,e,n){var o=this;function r(){o.off(t,r),e.apply(n,arguments)}return r._=e,this.on(t,r,n)},emit:function(t){for(var e=[].slice.call(arguments,1),n=((this.e||(this.e={}))[t]||[]).slice(),o=0,r=n.length;o<r;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],r=[];if(o&&e)for(var i=0,u=o.length;i<u;i++)o[i].fn!==e&&o[i].fn._!==e&&r.push(o[i]);return r.length?n[t]=r:delete n[t],this}},t.exports=e,t.exports.TinyEmitter=e}},r={},o.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return o.d(e,{a:e}),e},o.d=function(t,e){for(var n in e)o.o(e,n)&&!o.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:e[n]})},o.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},o(686).default;function o(t){if(r[t])return r[t].exports;var e=r[t]={exports:{}};return n[t](e,e.exports,o),e.exports}var n,r});
package/static/fhir.css CHANGED
@@ -623,4 +623,23 @@ div.warning {
623
623
  background-color: #FFE6E6;
624
624
  border: 1px silver solid;
625
625
  padding: 5px;
626
- }
626
+ }
627
+
628
+
629
+ .copy-text .btn-copy{
630
+ visibility: hidden;
631
+ }
632
+
633
+ .copy-text:hover .btn-copy {
634
+ visibility: visible;
635
+ }
636
+
637
+ .btn-copy {
638
+ height: 14px;
639
+ width: 17px;
640
+ background-image: url('images/noun_copy to clipboard_1669410.png');
641
+ background-size: 22px;
642
+ padding: 0px 0px;
643
+ border-width: 0px;
644
+ background-color: transparent;
645
+ }
@@ -931,7 +931,7 @@ OP_OUT_SUMM = OperationOutcome ({0} Error(s), {1} Warning(s), {2} Hint(s))
931
931
  BUNDLE_SUMMARY = {0} Bundle, {1} Entries
932
932
  PROF_DRIV_SUMM_PROP = {0} = {1}
933
933
  PROF_DRIV_SUMM_NONE = {0}
934
- PROF_DRIV_SUMM = {0}: {1}
934
+ PROF_DRIV_SUMM = {0}: {1}
935
935
  BUNDLE_HEADER_DOCUMENT_CONTENTS = Additional Resources Included in Document
936
936
  DOCUMENT_SUMMARY = <param name="status"/> Document at <param name="date"/> by <param name="author"/> for <param name="subject"/> <if test="has-encounter = true"> in encounter <param name="encounter"/></if>
937
937
  DATA_REND_ATT_URL = {0} @ {1}
@@ -950,36 +950,36 @@ MATURITY_PUBLISHER = Publisher: {0}
950
950
  MATURITY_STATUS = Status
951
951
  MATURITY_MATURITY = Maturity Level: {0}
952
952
  MATURITY_STDS_STATUS = Standards Status: {0}
953
- DATA_REND_MORNING = Morning
954
- DATA_REND_MORNING_EARLY = Early Morning
955
- DATA_REND_MORNING_LATE = Late Morning
956
- DATA_REND_NOON = Noon
957
- DATA_REND_AFTERNOON = Afternoon
958
- DATA_REND_AFTERNOON_EARLY = Early Afternoon
959
- DATA_REND_AFTERNOON_LATE = Late Afternoon
960
- DATA_REND_EVENING = Evening
961
- DATA_REND_EVENING_EARLY = Early Evening
962
- DATA_REND_EVENING_LATE = Late Evening
963
- DATA_REND_NIGHT = Night
964
- DATA_REND_AFTER_SLEEP = After Sleep
965
- DATA_REND_IMMEDIATE = Immediate
953
+ DATA_REND_MORNING = Morning
954
+ DATA_REND_MORNING_EARLY = Early Morning
955
+ DATA_REND_MORNING_LATE = Late Morning
956
+ DATA_REND_NOON = Noon
957
+ DATA_REND_AFTERNOON = Afternoon
958
+ DATA_REND_AFTERNOON_EARLY = Early Afternoon
959
+ DATA_REND_AFTERNOON_LATE = Late Afternoon
960
+ DATA_REND_EVENING = Evening
961
+ DATA_REND_EVENING_EARLY = Early Evening
962
+ DATA_REND_EVENING_LATE = Late Evening
963
+ DATA_REND_NIGHT = Night
964
+ DATA_REND_AFTER_SLEEP = After Sleep
965
+ DATA_REND_IMMEDIATE = Immediate
966
966
  VALUE_SET_AR = Argentinian Edition
967
- VALUE_SET_AT = Austrian Edition
967
+ VALUE_SET_AT = Austrian Edition
968
968
  VALUE_SET_BE = Belgian Edition
969
- VALUE_SET_CA_EN = Canadian English Edition
970
- VALUE_SET_CA = Canadian Edition
971
- VALUE_SET_EE = Estonian Edition
969
+ VALUE_SET_CA_EN = Canadian English Edition
970
+ VALUE_SET_CA = Canadian Edition
971
+ VALUE_SET_EE = Estonian Edition
972
972
  VALUE_SET_FI = Finnish Edition
973
973
  VALUE_SET_DE = German Edition
974
974
  VALUE_SET_IE = Irish Edition
975
- VALUE_SET_NZ = New Zealand Edition
976
- VALUE_SET_NO = Norwegian Edition
975
+ VALUE_SET_NZ = New Zealand Edition
976
+ VALUE_SET_NO = Norwegian Edition
977
977
  VALUE_SET_KR = Republic of Korea Edition (South Korea)
978
- VALUE_ES_ES = Spanish National Edition
978
+ VALUE_ES_ES = Spanish National Edition
979
979
  VALUE_SET_CH = Swiss Edition
980
- VALUE_SET_UK_CLIN = UK Clinical Edition
981
- VALUE_SET_UY = Uruguay Edition
982
- VALUE_SET_US_ICD10CM = US Edition (with ICD-10-CM maps)
980
+ VALUE_SET_UK_CLIN = UK Clinical Edition
981
+ VALUE_SET_UY = Uruguay Edition
982
+ VALUE_SET_US_ICD10CM = US Edition (with ICD-10-CM maps)
983
983
  VALUE_SET_OTHER_DISPLAY = Other Display ({0})
984
984
  GENERAL_VALUE_BOUNDED = The value must be between {0} and {1} (or equal)
985
985
  GENERAL_VALUE_MAX = The value must be less or equal to {0}
@@ -1009,12 +1009,12 @@ SDT_RES = Resource
1009
1009
  SDT_DEF = Definition
1010
1010
  SDT_ORIGINAL_SOURCE = Original Source
1011
1011
  SDR_USAGE = Usages
1012
- SDR_DERIVED = Derived from this {0}
1012
+ SDR_DERIVED = Derived from this {0}
1013
1013
  SDR_DRAW_IN = Draw in Obligations & Additional Bindings from this {0}
1014
1014
  SDR_IMPOSE = Impose this profile {0}
1015
1015
  SDR_COMPLY = Comply with this profile {0}
1016
1016
  SDR_USE = Use this {0}
1017
- SDR_REFER = Refer to this {0}
1017
+ SDR_REFER = Refer to this {0}
1018
1018
  SDR_EXAMPLE = Examples for this {0}
1019
1019
  SDR_SEARCH= Search Parameters using this {0}
1020
1020
  SDR_CAPSTMT = CapabilityStatements using this {0}
@@ -1043,54 +1043,54 @@ SDR_FROM = From {0}
1043
1043
  SDR_SRC_FHIR = FHIR Std.
1044
1044
  SDR_SRC_IG = This IG
1045
1045
  SDR_CODE_FROM = (a valid code from {0})
1046
- SDR_ALL_ELEM = **ALL** elements
1047
- SDR_ALL_EXT = **ALL** extensions
1046
+ SDR_ALL_ELEM = **ALL** elements
1047
+ SDR_ALL_EXT = **ALL** extensions
1048
1048
  SDR_BP = best practice
1049
1049
  SDR_GUIDANCE_PFX = Guidance on how to interpret the contents of this table can be found
1050
1050
  SDR_GUIDANCE_HERE = here
1051
- SDR_GUIDANCE_SFX =
1051
+ SDR_GUIDANCE_SFX =
1052
1052
  SDR_OFF_URL = The official URL for this profile is
1053
1053
  SDR_FROM_ELEM = // from Element: <a href="{0}">extension</a>
1054
- SDR_MOD_SUPP = (this element modifies the meaning of other elements, and must be supported)
1055
- SDR_MOD = (this element modifies the meaning of other elements)
1054
+ SDR_MOD_SUPP = (this element modifies the meaning of other elements, and must be supported)
1055
+ SDR_MOD = (this element modifies the meaning of other elements)
1056
1056
  SDR_SUPP = (this element must be supported)
1057
1057
  SDR_ANY_ORDER = // sliced by {0} in any order
1058
1058
  SDR_SORTED = // sliced by {0} in the specified order {1}
1059
1059
  SDR_PRIM_VALUE = Primitive Value {0}
1060
- SDR_META_CH_NO = Unable to evaluate changes to metadata
1061
- SDR_META_CH_DET = The resource metadata has changed ({0})
1060
+ SDR_META_CH_NO = Unable to evaluate changes to metadata
1061
+ SDR_META_CH_DET = The resource metadata has changed ({0})
1062
1062
  SDR_CONT_CH_NO = Unable to evaluate changes to content
1063
- SDR_CONT_CH_DET_SD = The data elements list has changed
1063
+ SDR_CONT_CH_DET_SD = The data elements list has changed
1064
1064
  SDR_CONT_CH_DET_CS = The list of codes defined by the code system has changed
1065
- SDR_DEFN_CH_NO = Unable to evaluate changes to definitions
1066
- SDR_DEFN_CH_DET_SD = One or more text definitions, invariants or bindings have changed
1067
- SDR_DEFN_CH_DET_CS = One or more text definitions/displays have changed
1065
+ SDR_DEFN_CH_NO = Unable to evaluate changes to definitions
1066
+ SDR_DEFN_CH_DET_SD = One or more text definitions, invariants or bindings have changed
1067
+ SDR_DEFN_CH_DET_CS = One or more text definitions/displays have changed
1068
1068
  SDR_CONT_CH_DET_VS = The logical definition of the value set has changed
1069
1069
  SDR_DEFN_CH_DET_VS = One or more text definitions/displays have changed
1070
1070
  SDR_INTRP_CH_NO_VS = Unable to evaluate changes to the expansion
1071
1071
  SDR_INTRP_CH_DET_VS = The expansion has changed
1072
- SDR_CH_DET = New Content
1072
+ SDR_CH_DET = New Content
1073
1073
  SDR_CH_NO = No changes
1074
1074
  SDR_DRAFT = This is an draft extension definition; the committee is seeking implementation feedback, and the definition or contents of the extension may change in future versions
1075
- SDR_EXPERIMENTAL = This is an experimental extension definition; the definition is intended for testing purposes, education or evaluation, and the definition is not anticipated to be matured to a point where it is intended for genuine usage.
1075
+ SDR_EXPERIMENTAL = This is an experimental extension definition; the definition is intended for testing purposes, education or evaluation, and the definition is not anticipated to be matured to a point where it is intended for production use.
1076
1076
  SDR_EXT_DEPR = This extension is deprecated and should no longer be used
1077
1077
  SDR_EXT_ANY = This extension does not specify which elements it should be used on
1078
- SDR_EXT_ELEM = This extension may be used on the following element(s)
1078
+ SDR_EXT_ELEM = This extension may be used on the following element(s)
1079
1079
  SDR_EXT_MOD = This extension is a modifier extension.
1080
- SDR_EXT_ELEM_ID = Element ID
1081
- SDR_EXT_EXT = Extension
1080
+ SDR_EXT_ELEM_ID = Element ID
1081
+ SDR_EXT_EXT = Extension
1082
1082
  SDR_EXT_PATH = Path
1083
- SDR_EXT_CTXT_PATH = In addition, the extension can only be used when this FHIRPath expression is true
1084
- SDR_EXT_CTXT_PATHS = In addition, the extension can only be used when these FHIRPath expressions are true
1085
- SDR_EXT_VER_PFX = This extension is allowed for use with
1086
- SDR_EXT_VER_SFX = .
1087
- SDR_VER_TO_PFX = FHIR versions up to
1088
- SDR_VER_TO_SFX =
1089
- SDR_VER_FROM_PFX = FHIR versions
1083
+ SDR_EXT_CTXT_PATH = In addition, the extension can only be used when this FHIRPath expression is true
1084
+ SDR_EXT_CTXT_PATHS = In addition, the extension can only be used when these FHIRPath expressions are true
1085
+ SDR_EXT_VER_PFX = This extension is allowed for use with
1086
+ SDR_EXT_VER_SFX = .
1087
+ SDR_VER_TO_PFX = FHIR versions up to
1088
+ SDR_VER_TO_SFX =
1089
+ SDR_VER_FROM_PFX = FHIR versions
1090
1090
  SDR_VER_FROM_SFX = and after
1091
1091
  SDR_VER_RANGE_PFX = FHIR versions
1092
1092
  SDR_VER_RANGE_MID = to
1093
- SDR_VER_RANGE_SFX =
1093
+ SDR_VER_RANGE_SFX =
1094
1094
  SDR_EXT_UNCHANGED = The extension is unchanged in {0}
1095
1095
  SDR_EXT_CHANGED = The extension is represented a little differently in {0}
1096
1096
  VSR_LOGICAL = Logical Definition (CLD)
@@ -1105,7 +1105,7 @@ R44B_REFERS_TO = <a href="{0}">{1}}</a> refers to the canonical type at {2}
1105
1105
  R44B_HAS_TARGET = has target
1106
1106
  R44B_WRONG_MSG = Something went wrong with the cross-version analysis because
1107
1107
  R44B_USE_OK = This is an {0} IG. None of the features it uses are changed in {1}, so it can be used as is with {1} systems.
1108
- R44B_PACKAGE_REF = Packages for both <a href="{0}">R4 ({1}.r4)</a> and <a href=\"{2}\">R4B ({3}.r4b)</a> are available.
1108
+ R44B_PACKAGE_REF = Packages for both <a href="{0}">R4 ({1}.r4)</a> and <a href="{2}">R4B ({3}.r4b)</a> are available.
1109
1109
  R44B_NOT_COMP = This is an {0} IG that is not compatible with {1}" because
1110
1110
  R44B_NOT_IN = The following resources are not in the {0} version
1111
1111
  R44B_ONLY_IN = The following resources are only in the {0} version
@@ -1116,13 +1116,102 @@ VALUE_SET_NEEDS_SUPPL_one = This ValueSet requires the Code system Supplement
1116
1116
  VALUE_SET_NEEDS_SUPPL_other = This ValueSet requires the Code system Supplements
1117
1117
  SD_XIG_LINK = <p>You can also check for <a href="https://packages2.fhir.org/xig/{0}|current/StructureDefinition/{1}">usages in the FHIR IG Statistics</a></p>
1118
1118
  VS_VERSION_STATED = Version is explicitly stated to be {0}
1119
+ VS_VERSION_LATEST = Version is always the latest available, which is {0} at this time
1119
1120
  VS_VERSION_WILDCARD_BY_PACKAGE = Version is stated to be {0}, which means it is fixed to {1}, the version found through the package references
1120
1121
  VS_VERSION_WILDCARD = Version is stated to be {0}. When building this specification, the most recent matching version {1} has been used
1121
1122
  VS_VERSION_BY_PACKAGE = Version is not explicitly stated, which means it is fixed to {0}, the version found through the package references
1122
1123
  VS_VERSION_THIS_PACKAGE = Version is not explicitly stated, which means it is fixed to the version provided in this specification
1123
- VS_VERSION_FOUND = Version is not explicity stated. When building this specification, the most recent version {0} has been used
1124
- VS_VERSION_NONE = Version is not explicity stated, and the target {0} has no stated version either
1125
- VS_VERSION_NOTHING = Version is not explicity stated. No matching {0} found
1124
+ VS_VERSION_FOUND = Version is not explicitly stated. When building this specification, the most recent version {0} has been used
1125
+ VS_VERSION_NONE = Version is not explicitly stated, and the target {0} has no stated version either
1126
+ VS_VERSION_NOTHING = Version is not explicitly stated. No matching {0} found
1126
1127
  CS_VERSION_NOTHING_TEXT = Not Stated (use latest from terminology server)
1127
1128
  VS_VERSION_NOTHING_TEXT = Not State
1128
- STRUC_DEF_IMPLEMENTS = Interfaces Implemented
1129
+ STRUC_DEF_IMPLEMENTS = Interfaces Implemented
1130
+ PROV_REFERENCE = This {0} is referenced from the following provenance resources:
1131
+ CONF_SHALL = SHALL
1132
+ CONF_SHALLNOT = SHALL NOT
1133
+ CONF_SHOULD = SHOULD
1134
+ CONF_SHOULDNOT = SHOULD NOT
1135
+ CONF_MAY = MAY
1136
+ CONF_SHALL_PLURAL = SHALL
1137
+ CONF_SHALLNOT_PLURAL = SHALL NOT
1138
+ CONF_SHOULD_PLURAL = SHOULD
1139
+ CONF_SHOULDNOT_PLURAL = SHOULD NOT
1140
+ CONF_MAY_PLURAL = MAY
1141
+ CSREQ_TITLE = Narrative Conformance Statements
1142
+ CSREQ_DESC = Conformance statements found throughout the narrative of the IG consolidated into this computable resource for traceability purposes
1143
+ CSTABLE_HEAD_ID = Id
1144
+ CSTABLE_HEAD_EXPECT = Expectation
1145
+ CSTABLE_HEAD_COND = Conditional?
1146
+ CSTABLE_HEAD_ACTOR_one = Actor{1}
1147
+ CSTABLE_HEAD_ACTOR_other = Actors{1}
1148
+ CSTABLE_HEAD_CAT_one = Category{1}
1149
+ CSTABLE_HEAD_CAT_other = Categories{1}
1150
+ CSTABLE_HEAD_RULE = Rule
1151
+ CSTABLE_TITLE_ID = Filter to only statements with ids that contain the specified text
1152
+ CSTABLE_TITLE_EXPECT = Filter to only statements with one of the selected expectation type(s)
1153
+ CSTABLE_TITLE_COND = Filter to only statements that are conditional, not conditional, or no constraint
1154
+ CSTABLE_TITLE_ACTOR = Filter to only statements that apply to the specified actor(s)
1155
+ CSTABLE_TITLE_CAT = Filter to only statements that apply to the specified category(ies)
1156
+ CSTABLE_TITLE_RULE = Filter to only statements that contain the specified text
1157
+ CSTABLE_TITLE_CLEAR = Clear the Filter
1158
+ CSTABLE_COND_YES = Yes
1159
+ CSTABLE_COND_NO = No
1160
+ CSTABLE_COND_ANY = Any
1161
+ CSTABLE_CLEAR_FILTERS = Clear Filters
1162
+ CONSENT_DATE = Agreement Date
1163
+ CONSENT_PERIOD = Applicable Period
1164
+ CONSENT_HT_PERIOD = Period
1165
+ CONSENT_HT_DATA_PERIOD = Data from Period
1166
+ CONSENT_CATEGORY_one = Category
1167
+ CONSENT_CATEGORY_other = Categories
1168
+ CONSENT_SCOPE_one = Scope
1169
+ CONSENT_SCOPE_other = Scopes
1170
+ GENERAL_IDENTIFIER_one = Identifier
1171
+ GENERAL_IDENTIFIER_other = Identifiers
1172
+ CONSENT_PART_TBL_ROLE = Role
1173
+ CONSENT_PART_TBL_DETAILS = Details
1174
+ CONSENT_PART_TBL_PATIENT = Patient
1175
+ CONSENT_PART_TBL_PARTY = Party
1176
+ CONSENT_PART_TBL_GRANTOR = Grantor
1177
+ CONSENT_PART_TBL_GRANTEE = Grantee
1178
+ CONSENT_PART_TBL_MANAGER = Manager
1179
+ CONSENT_PART_TBL_CONTROLLER = Controller
1180
+ CONSENT_PART_TBL_PATIENT_DESC = Who the consent applies to
1181
+ CONSENT_PART_TBL_GRANTOR_DESC = Who is granting rights according to the policy and rules
1182
+ CONSENT_PART_TBL_PARTY_DESC = Who is agreeing to the policy and rules
1183
+ CONSENT_PART_TBL_GRANTEE_DESC = Who is agreeing to the policy and rules
1184
+ CONSENT_PART_TBL_MANAGER_DESC = Who manages the consent through its lifecycle.
1185
+ CONSENT_PART_TBL_CONTROLLER_DESC = Who controls/enforces the access according to the consent.
1186
+ CONSENT_BASIS_REGULATION_PREFIX_one = This consent is made under the regulation
1187
+ CONSENT_BASIS_REGULATION_PREFIX_other = This consent is made under the regulations
1188
+ CONSENT_BASIS_REGULATION_SUFFIX_MORE = and
1189
+ CONSENT_BASIS_REGULATION_SUFFIX = .
1190
+ CONSENT_BASIS_REGULATION_NONE = This consent is made under
1191
+ CONSENT_BASIS_POLICY_PREFIX_one = the policy
1192
+ CONSENT_BASIS_POLICY_PREFIX_other = the policies
1193
+ CONSENT_BASIS_POLICY_SUFFIX = .
1194
+ CONSENT_HTABLE_RULE = Rule
1195
+ CONSENT_HTABLE_RULE_DESC = Applicable Rule
1196
+ CONSENT_HTABLE_WHEN = Time Period
1197
+ CONSENT_HTABLE_WHEN_DESC = Applicable Period
1198
+ CONSENT_HTABLE_WHO = Who
1199
+ CONSENT_HTABLE_WHO_DESC = Applicable Parties
1200
+ CONSENT_HTABLE_WHAT = What
1201
+ CONSENT_HTABLE_WHAT_DESC = Applicable Data
1202
+ CONSENT_HTABLE_RULES = Rules
1203
+ CONSENT_HTABLE_RULES_DESC = Other Applicable Rules
1204
+ CONSENT_PERMIT = permit
1205
+ CONSENT_DENY = deny
1206
+ CONSENT_PERMIT_DESC = The subject has given their consent.
1207
+ CONSENT_DENY_DESC = The subject has NOT given their consent.
1208
+ CONSENT_PROVISION = Consent Provision
1209
+ CONSENT_HT_SEC_LABEL = Labled as
1210
+ CONSENT_HT_ACTION = For action
1211
+ CONSENT_HT_PURPOSE = Purpose
1212
+ CONSENT_HT_CLASS = Class
1213
+ CONSENT_HT_RESOURCE_TYPE = Resource Type
1214
+ CONSENT_HT_DOC_TYPE = Document Type
1215
+ CONSENT_HT_CODE = Code
1216
+ WEB_SOURCE = Web Source
1217
+ GENERAL_COPY = Click to Copy
package/tx/cs/cs-api.js CHANGED
@@ -221,10 +221,11 @@ class CodeSystemProvider {
221
221
  }
222
222
 
223
223
  /**
224
+ * @param {boolean} langPacks - whether to include language packs
224
225
  * @returns {string[]} all supplements in scope
225
226
  */
226
- listSupplements() {
227
- return this.supplements ? this.supplements.map(s => s.vurl) : [];
227
+ listSupplements(langPacks) {
228
+ return this.supplements ? this.supplements.filter(s => langPacks || !s.isLangPack()).map(s => s.vurl) : [];
228
229
  }
229
230
 
230
231
  /**
@@ -385,12 +386,15 @@ class CodeSystemProvider {
385
386
  const concept= supplement.getConceptByCode(code);
386
387
  if (concept) {
387
388
  if (concept.display) {
388
- displays.addDesignation(true, 'active', supplement.jsonObj.language, CodeSystem.makeUseForDisplay(), concept.display);
389
+ // sometimes the display is just repeated from the base code system
390
+ if (!displays.hasAnyDisplay(concept.display)) {
391
+ displays.addDesignation(true, 'active', supplement.jsonObj.language, CodeSystem.makeUseForDisplay(), concept.display).supplement = supplement;
392
+ }
389
393
  }
390
394
  if (concept.designation) {
391
395
  for (const d of concept.designation) {
392
396
  let status = Extensions.readString(d, "http://hl7.org/fhir/StructureDefinition/structuredefinition-standards-status");
393
- displays.addDesignation(false, status || 'active', d.language, d.use, d.value, d.extension?.length > 0 ? d.extension : []);
397
+ displays.addDesignation(false, status || 'active', d.language, d.use, d.value, d.extension?.length > 0 ? d.extension : []).supplement = supplement;
394
398
  }
395
399
  }
396
400
  }
@@ -854,6 +858,17 @@ class CodeSystemFactoryProvider {
854
858
  return [];
855
859
  }
856
860
 
861
+ /**
862
+ *
863
+ * @param supplements - the list of supplements to populate - fill with any supplements matching url(+version)
864
+ * @param url - url of code system
865
+ * @param version - version of codesystem
866
+ * @param {Map} statedSupplements - return language packs and supplements that are listed in stated supplements, by versioned URL
867
+ * @returns {Promise<void>}
868
+ */
869
+ async listSupplements(supplements, url, version, statedSupplements) {
870
+ // do nothing
871
+ }
857
872
  /**
858
873
  * see comments for registerSupplements()
859
874
  *
@@ -904,6 +919,14 @@ class CodeSystemFactoryProvider {
904
919
  async close() {
905
920
 
906
921
  }
922
+
923
+ /**
924
+ * if known, the right place to point to on the web for the code system
925
+ * @returns {String}
926
+ */
927
+ webSource() {
928
+ return undefined;
929
+ }
907
930
  }
908
931
 
909
932
  module.exports = {
package/tx/cs/cs-base.js CHANGED
@@ -41,6 +41,19 @@ class BaseCSServices extends CodeSystemProvider {
41
41
  return property;
42
42
  }
43
43
 
44
+ _addDateTimeProperty(params, type, name, value) {
45
+
46
+ const property = {
47
+ name: type,
48
+ part: [
49
+ {name: 'code', valueCode: name},
50
+ {name: 'value', valueDateTime: value}
51
+ ]
52
+ };
53
+ params.push(property);
54
+ return property;
55
+ }
56
+
44
57
  _addStringProperty(params, type, name, value, language = null) {
45
58
 
46
59
  const property = {