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 +18 -0
- package/package.json +5 -2
- package/static/assets/js/clipboard-btn.js +31 -0
- package/static/assets/js/clipboard.min.js +7 -0
- package/static/fhir.css +20 -1
- package/static/images/noun_copy to clipboard_1669410.png +0 -0
- package/translations/rendering-phrases.properties +144 -55
- package/tx/cs/cs-api.js +8 -0
- package/tx/cs/cs-snomed.js +32 -12
- package/tx/html/tx-template.html +5 -2
- package/tx/library/renderer.js +26 -8
- package/tx/tx.fhir.org.yml +1 -1
- package/tx/workers/read.js +4 -0
- package/tx/workers/search.js +126 -51
- package/tx/workers/translate.js +3 -3
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.
|
|
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
|
+
}
|
|
Binary file
|
|
@@ -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
|
|
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
|
|
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
|
|
1124
|
-
VS_VERSION_NONE = Version is not
|
|
1125
|
-
VS_VERSION_NOTHING = Version is not
|
|
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 = {
|
package/tx/cs/cs-snomed.js
CHANGED
|
@@ -401,20 +401,24 @@ class SnomedServices {
|
|
|
401
401
|
}
|
|
402
402
|
|
|
403
403
|
|
|
404
|
-
filterIn(
|
|
404
|
+
filterIn(idList) {
|
|
405
405
|
const result = new SnomedFilterContext();
|
|
406
|
-
|
|
406
|
+
let members = [];
|
|
407
|
+
for (let id of idList.split(',')) {
|
|
408
|
+
const conceptResult = this.concepts.findConcept(id);
|
|
407
409
|
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
410
|
+
if (!conceptResult.found) {
|
|
411
|
+
throw new Error(`The SNOMED CT Concept ${id} is not known`);
|
|
412
|
+
}
|
|
411
413
|
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
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(
|
|
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) {
|
package/tx/html/tx-template.html
CHANGED
|
@@ -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
|
+
|
package/tx/library/renderer.js
CHANGED
|
@@ -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.
|
|
145
|
-
this.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
261
|
-
|
|
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()
|
|
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
|
}
|
package/tx/tx.fhir.org.yml
CHANGED
package/tx/workers/read.js
CHANGED
|
@@ -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
|
}
|
package/tx/workers/search.js
CHANGED
|
@@ -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
|
-
|
|
153
|
-
|
|
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;
|
package/tx/workers/translate.js
CHANGED
|
@@ -387,7 +387,7 @@ class TranslateWorker extends TerminologyWorker {
|
|
|
387
387
|
}
|
|
388
388
|
if (!explicit) {
|
|
389
389
|
matchParts.push({
|
|
390
|
-
name: '
|
|
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: '
|
|
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: '
|
|
541
|
+
name: 'originMap',
|
|
542
542
|
valueCanonical: cm.vurl
|
|
543
543
|
});
|
|
544
544
|
}
|