fhirsmith 0.8.4 → 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,7 +5,25 @@ 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
8
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)
9
27
 
10
28
  ## [v0.8.4] - 2026-04-01
11
29
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "fhirsmith",
3
- "version": "0.8.4",
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
@@ -919,6 +919,14 @@ class CodeSystemFactoryProvider {
919
919
  async close() {
920
920
 
921
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
+ }
922
930
  }
923
931
 
924
932
  module.exports = {
@@ -401,20 +401,24 @@ class SnomedServices {
401
401
  }
402
402
 
403
403
 
404
- filterIn(id) {
404
+ filterIn(idList) {
405
405
  const result = new SnomedFilterContext();
406
- const conceptResult = this.concepts.findConcept(id);
406
+ let members = [];
407
+ for (let id of idList.split(',')) {
408
+ const conceptResult = this.concepts.findConcept(id);
407
409
 
408
- if (!conceptResult.found) {
409
- throw new Error(`The SNOMED CT Concept ${id} is not known`);
410
- }
410
+ if (!conceptResult.found) {
411
+ throw new Error(`The SNOMED CT Concept ${id} is not known`);
412
+ }
411
413
 
412
- const refSetIndex = this.getConceptRefSet(conceptResult.index, false);
413
- if (refSetIndex === 0) {
414
- throw new Error(`The SNOMED CT Concept ${id} is not a reference set`);
414
+ const refSetIndex = this.getConceptRefSet(conceptResult.index, false);
415
+ if (refSetIndex === 0) {
416
+ members.push(conceptResult.index);
417
+ } else {
418
+ members.push(...this.refSetMembers.getMembers(refSetIndex));
419
+ }
415
420
  }
416
-
417
- result.members = this.refSetMembers.getMembers(refSetIndex) || [];
421
+ result.members = members;
418
422
  return result;
419
423
  }
420
424
 
@@ -894,6 +898,17 @@ class SnomedProvider extends BaseCSServices {
894
898
  if (id !== 0n && ['=', 'is-a', 'descendent-of', 'in', 'generalizes', 'child-of'].includes(op)) {
895
899
  return this.sct.conceptExists(value);
896
900
  }
901
+ if (op === 'in' && value.includes(',')) {
902
+ let ok = true;
903
+ for (const idStr of value.split(',')) {
904
+ const id = this.sct.stringToIdOrZero(idStr);
905
+ if (id === 0n) {
906
+ ok = false;
907
+ break;
908
+ }
909
+ }
910
+ return ok;
911
+ }
897
912
  }
898
913
  if (prop === 'inactive') {
899
914
  return op === '=' && ['true', 'false'].includes(value);
@@ -927,7 +942,7 @@ class SnomedProvider extends BaseCSServices {
927
942
 
928
943
  if (prop === 'concept') {
929
944
  const id = this.sct.stringToIdOrZero(value);
930
- if (id === 0n) {
945
+ if (id === 0n && op !== 'in') {
931
946
  throw new Error(`Invalid concept ID: ${value}`);
932
947
  }
933
948
 
@@ -953,7 +968,7 @@ class SnomedProvider extends BaseCSServices {
953
968
  return null;
954
969
  }
955
970
  case 'in': {
956
- filterContext.filters.push(this.sct.filterIn(id));
971
+ filterContext.filters.push(this.sct.filterIn(value));
957
972
  return null;
958
973
  }
959
974
  default:
@@ -1621,6 +1636,11 @@ class SnomedServicesFactory extends CodeSystemFactoryProvider {
1621
1636
  return null;
1622
1637
  }
1623
1638
  }
1639
+
1640
+ webSource() {
1641
+ return this.version();
1642
+ }
1643
+
1624
1644
  }
1625
1645
 
1626
1646
  function getEditionName(edition) {
@@ -126,9 +126,12 @@
126
126
  </div>
127
127
 
128
128
  <!-- JS and analytics only. -->
129
- <script src="/assets/js/respond.min.js"/>
130
- <script src="/assets/js/fhir.js"/>
129
+ <script src="/assets/js/respond.min.js"> </script>
130
+ <script src="/assets/js/fhir.js"> </script>
131
+ <script src="/assets/js/clipboard.min.js"> </script>
132
+ <script src="/assets/js/clipboard-btn.js"> </script>
131
133
 
132
134
  </body>
133
135
 
134
136
  </html>
137
+
@@ -141,8 +141,8 @@ class Renderer {
141
141
  this.renderMetadataLastUpdated(res, tbl);
142
142
  this.renderMetadataSource(res, tbl);
143
143
  this.renderProperty(tbl, 'TEST_PLAN_LANG', res.language);
144
- this.renderProperty(tbl, 'GENERAL_DEFINING_URL', res.url);
145
- this.renderProperty(tbl, 'GENERAL_VER', res.version);
144
+ this.renderPropertyCopy(tbl, 'GENERAL_DEFINING_URL', res.url);
145
+ this.renderPropertyCopy(tbl, 'GENERAL_VER', res.version);
146
146
  this.renderProperty(tbl, 'GENERAL_NAME', res.name);
147
147
  this.renderProperty(tbl, 'GENERAL_TITLE', res.title);
148
148
  this.renderProperty(tbl, 'GENERAL_STATUS', res.status);
@@ -150,9 +150,10 @@ class Renderer {
150
150
  this.renderPropertyMD(tbl, 'GENERAL_PURPOSE', res.purpose);
151
151
  this.renderProperty(tbl, 'CANON_REND_PUBLISHER', res.publisher);
152
152
  this.renderProperty(tbl, 'CANON_REND_COMMITTEE', Extensions.readString(res, 'http://hl7.org/fhir/StructureDefinition/structuredefinition-wg'));
153
- this.renderProperty(tbl, 'GENERAL_COPYRIGHT', res.copyright);
153
+ this.renderPropertyCopy(tbl, 'GENERAL_COPYRIGHT', res.copyright);
154
154
  this.renderProperty(tbl, 'EXT_FMM_LEVEL', Extensions.readString(res, 'http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm'));
155
155
  this.renderProperty(tbl, 'PAT_PERIOD', res.effectivePeriod);
156
+ this.renderPropertyLink(tbl, 'WEB_SOURCE', Extensions.readString(res, 'http://hl7.org/fhir/StructureDefinition/web-source'));
156
157
 
157
158
  // capability statement things
158
159
  this.renderProperty(tbl, 'Kind', res.kind);
@@ -253,15 +254,32 @@ class Renderer {
253
254
  }
254
255
  }
255
256
 
256
- async renderPropertyLink(tbl, msgId, value) {
257
+ renderPropertyCopy(tbl, msgId, value) {
257
258
  if (value) {
258
259
  let tr = tbl.tr();
259
260
  tr.td().b().tx(this.translate(msgId));
260
- const linkinfo = await this.linkResolver.resolveURL(this.opContext, value);
261
- if (linkinfo) {
262
- tr.td().ah(linkinfo.link).tx(linkinfo.description);
261
+ if (value instanceof Object) {
262
+ tr.td().tx("todo");
263
263
  } else {
264
- tr.td().tx(value);
264
+ let td = tr.td();
265
+ let span = td.span("copy-text");
266
+ span.tx(value);
267
+ let btn = span.button();
268
+ btn.attr("class", "btn-copy");
269
+ btn.attr("data-clipboard-text", value);
270
+ btn.attr("data-original-title", this.translate('GENERAL_COPY'));
271
+ }
272
+ }
273
+ }
274
+
275
+ renderPropertyLink(tbl, msgId, value) {
276
+ if (value) {
277
+ let tr = tbl.tr();
278
+ tr.td().b().tx(this.translate(msgId));
279
+ if (value instanceof Object) {
280
+ tr.td().tx("todo");
281
+ } else {
282
+ tr.td().ah(value).tx(value);
265
283
  }
266
284
  }
267
285
  }
@@ -12,7 +12,7 @@ sources:
12
12
  - internal:hgvs
13
13
  - ucum:tx/data/ucum-essence.xml
14
14
  - loinc:loinc-2.77-a.db
15
- - loinc!:loinc-2.81-b.db
15
+ - loinc!:Loinc_2.82.db
16
16
  - rxnorm:rxnorm_03022026.db
17
17
  - ndc:ndc-20211101.db
18
18
  - unii:unii_20240622.db
@@ -90,11 +90,15 @@ class ReadWorker extends TerminologyWorker {
90
90
  resourceType: "CodeSystem",
91
91
  id: "x-" + cs.id(),
92
92
  url: cs.system(),
93
+ version: cs.version(),
93
94
  name: cs.name(),
94
95
  status: "active",
95
96
  description: "This is a place holder for the code system which is fully supported through internal means (not by this code system)",
96
97
  content: "not-present"
97
98
  }
99
+ if (cs.webSource()) {
100
+ json.extension = [{ url: "http://hl7.org/fhir/StructureDefinition/web-source", valueUrl : cs.webSource()}];
101
+ }
98
102
  if (cs.version()) {
99
103
  json.version = cs.version();
100
104
  }
@@ -149,57 +149,8 @@ class SearchWorker extends TerminologyWorker {
149
149
  // If no search params, return all
150
150
  const hasSearchParams = Object.keys(searchParams).length > 0;
151
151
 
152
- for (const [key, cs] of this.provider.codeSystems) {
153
- this.deadCheck('searchCodeSystems');
154
-
155
- if (key == cs.vurl) {
156
- const json = cs.jsonObj;
157
-
158
- if (!hasSearchParams) {
159
- matches.push(json);
160
- continue;
161
- }
162
-
163
- // Check each search parameter for partial match
164
- let isMatch = true;
165
- for (const [param, searchValue] of Object.entries(searchParams)) {
166
-
167
- // Map content-mode to content property
168
- const jsonProp = param === 'content-mode' ? 'content' : param;
169
-
170
- if (param === 'jurisdiction') {
171
- // Special handling for jurisdiction - array of CodeableConcept
172
- if (!this.matchJurisdiction(json.jurisdiction, searchValue)) {
173
- isMatch = false;
174
- break;
175
- }
176
- } else if (param === 'text') {
177
- const propValue = json.title + json.description;
178
- if (!this.matchValue(propValue, searchValue)) {
179
- isMatch = false;
180
- break;
181
- }
182
- } else if (param === 'url' || param === 'system') { // exact match
183
- const propValue = json.url;
184
- if (propValue !== searchValue) {
185
- isMatch = false;
186
- break;
187
- }
188
- } else {
189
- // Standard partial text match
190
- const propValue = json[jsonProp];
191
- if (!this.matchValue(propValue, searchValue)) {
192
- isMatch = false;
193
- break;
194
- }
195
- }
196
- }
197
-
198
- if (isMatch) {
199
- matches.push(json);
200
- }
201
- }
202
- }
152
+ this.searchCodeSystemResources(searchParams, hasSearchParams, matches);
153
+ this.searchCodeSystemProviders(searchParams, hasSearchParams, matches);
203
154
 
204
155
  return matches;
205
156
  }
@@ -473,6 +424,130 @@ class SearchWorker extends TerminologyWorker {
473
424
 
474
425
  return filtered;
475
426
  }
427
+
428
+ searchCodeSystemResources(searchParams, hasSearchParams, matches) {
429
+ for (const [key, cs] of this.provider.codeSystems) {
430
+ this.deadCheck('searchCodeSystems');
431
+
432
+ if (key == cs.vurl) {
433
+ const json = cs.jsonObj;
434
+
435
+ if (!hasSearchParams) {
436
+ matches.push(json);
437
+ continue;
438
+ }
439
+
440
+ // Check each search parameter for partial match
441
+ let isMatch = true;
442
+ for (const [param, searchValue] of Object.entries(searchParams)) {
443
+
444
+ // Map content-mode to content property
445
+ const jsonProp = param === 'content-mode' ? 'content' : param;
446
+
447
+ if (param === 'jurisdiction') {
448
+ // Special handling for jurisdiction - array of CodeableConcept
449
+ if (!this.matchJurisdiction(json.jurisdiction, searchValue)) {
450
+ isMatch = false;
451
+ break;
452
+ }
453
+ } else if (param === 'text') {
454
+ const propValue = json.title + json.description;
455
+ if (!this.matchValue(propValue, searchValue)) {
456
+ isMatch = false;
457
+ break;
458
+ }
459
+ } else if (param === 'url' || param === 'system') { // exact match
460
+ const propValue = json.url;
461
+ if (propValue !== searchValue) {
462
+ isMatch = false;
463
+ break;
464
+ }
465
+ } else {
466
+ // Standard partial text match
467
+ const propValue = json[jsonProp];
468
+ if (!this.matchValue(propValue, searchValue)) {
469
+ isMatch = false;
470
+ break;
471
+ }
472
+ }
473
+ }
474
+
475
+ if (isMatch) {
476
+ matches.push(json);
477
+ }
478
+ }
479
+ }
480
+ }
481
+
482
+ searchCodeSystemProviders(searchParams, hasSearchParams, matches) {
483
+ let seen = new Set();
484
+ for (const csp of this.provider.codeSystemFactories.values()) {
485
+ this.deadCheck('searchCodeSystems');
486
+
487
+ if (seen.has(csp.id())) {
488
+ continue;
489
+ }
490
+ seen.add(csp.id());
491
+
492
+ let json = {
493
+ resourceType: "CodeSystem",
494
+ id: "x-" + csp.id(),
495
+ url: csp.system(),
496
+ version: csp.version(),
497
+ name: csp.name(),
498
+ status: "active",
499
+ description: "This is a place holder for the code system which is fully supported through internal means (not by this code system)",
500
+ content: "not-present"
501
+ }
502
+ if (csp.webSource()) {
503
+ json.extension = [{ url: "http://hl7.org/fhir/StructureDefinition/web-source", valueUrl : csp.webSource()}];
504
+ }
505
+
506
+ if (!hasSearchParams) {
507
+ matches.push(json);
508
+ continue;
509
+ }
510
+
511
+ // Check each search parameter for partial match
512
+ let isMatch = true;
513
+ for (const [param, searchValue] of Object.entries(searchParams)) {
514
+
515
+ // Map content-mode to content property
516
+ const jsonProp = param === 'content-mode' ? 'content' : param;
517
+
518
+ if (param === 'jurisdiction') {
519
+ // Special handling for jurisdiction - array of CodeableConcept
520
+ if (!this.matchJurisdiction(json.jurisdiction, searchValue)) {
521
+ isMatch = false;
522
+ break;
523
+ }
524
+ } else if (param === 'text') {
525
+ const propValue = json.title + json.description;
526
+ if (!this.matchValue(propValue, searchValue)) {
527
+ isMatch = false;
528
+ break;
529
+ }
530
+ } else if (param === 'url' || param === 'system') { // exact match
531
+ const propValue = json.url;
532
+ if (propValue !== searchValue) {
533
+ isMatch = false;
534
+ break;
535
+ }
536
+ } else {
537
+ // Standard partial text match
538
+ const propValue = json[jsonProp];
539
+ if (!this.matchValue(propValue, searchValue)) {
540
+ isMatch = false;
541
+ break;
542
+ }
543
+ }
544
+ }
545
+
546
+ if (isMatch) {
547
+ matches.push(json);
548
+ }
549
+ }
550
+ }
476
551
  }
477
552
 
478
553
  module.exports = SearchWorker;
@@ -387,7 +387,7 @@ class TranslateWorker extends TerminologyWorker {
387
387
  }
388
388
  if (!explicit) {
389
389
  matchParts.push({
390
- name: 'sourceMap',
390
+ name: 'originMap',
391
391
  valueCanonical: cm.vurl
392
392
  });
393
393
  }
@@ -476,7 +476,7 @@ class TranslateWorker extends TerminologyWorker {
476
476
  }
477
477
  if (!explicit) {
478
478
  matchParts.push({
479
- name: 'sourceMap',
479
+ name: 'originMap',
480
480
  valueCanonical: cm.vurl
481
481
  });
482
482
  }
@@ -538,7 +538,7 @@ class TranslateWorker extends TerminologyWorker {
538
538
  }
539
539
  if (!explicit) {
540
540
  matchParts.push({
541
- name: 'sourceMap',
541
+ name: 'originMap',
542
542
  valueCanonical: cm.vurl
543
543
  });
544
544
  }