Skip to content

Commit 618d499

Browse files
committed
Merge remote-tracking branch 'remotes/origin/master' into tools-module
2 parents ae3ad9e + ef1602d commit 618d499

File tree

136 files changed

+4467
-733
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

136 files changed

+4467
-733
lines changed

.editorconfig

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# EditorConfig is awesome: https://EditorConfig.org
2+
3+
# top-most EditorConfig file
4+
root = true
5+
6+
[*]
7+
indent_style = space
8+
indent_size = 2
9+
end_of_line = crlf
10+
charset = utf-8
11+
trim_trailing_whitespace = false
12+
insert_final_newline = false
13+
quote_type = single

.github/workflows/ci.yaml

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- uses: actions/checkout@v2
2424

2525
# Caches NPM dependencies, as long as the package-lock.json is not modified
26-
- uses: actions/cache@v2
26+
- uses: actions/cache@v4
2727
with:
2828
path: ~/.npm
2929
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -50,7 +50,7 @@ jobs:
5050
- uses: actions/checkout@v2
5151

5252
- name: Cache Docker layers
53-
uses: actions/cache@v2
53+
uses: actions/cache@v4
5454
with:
5555
path: /tmp/.buildx-cache
5656
key: ${{ runner.os }}-buildx-${{ github.sha }}

.github/workflows/release.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
node-version: 12
2424

2525
- name: NPM cache
26-
uses: actions/cache@v2
26+
uses: actions/cache@v4
2727
with:
2828
path: ~/.npm
2929
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

Dockerfile

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ RUN find . -type f "(" \
2626
| xargs -0 -n 1 gzip -kf
2727

2828
# Production Nginx image
29-
FROM docker.io/nginxinc/nginx-unprivileged:1.23.3-alpine@sha256:c748ba587e7436aaa8729b64d4e0412410a486f0c592f0eec100fb3804ff9afd
29+
FROM docker.io/nginxinc/nginx-unprivileged:1.27.2-alpine
3030

3131
LABEL org.opencontainers.image.title="OHDSI-Atlas"
3232
LABEL org.opencontainers.image.authors="Joris Borgdorff <[email protected]>, Lee Evans - www.ltscomputingllc.com, Shaun Turner<[email protected]>"

js/components/atlas-state.js

+5
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,28 @@ define(['knockout', 'lscache', 'services/job/jobDetail', 'assets/ohdsi.util', 'c
1313
state.vocabularyUrl = ko.observable(sessionStorage.vocabularyUrl);
1414
state.evidenceUrl = ko.observable(sessionStorage.evidenceUrl);
1515
state.resultsUrl = ko.observable(sessionStorage.resultsUrl);
16+
state.currentVocabularyVersion = ko.observable(sessionStorage.currentVocabularyVersion);
1617
state.vocabularyUrl.subscribe(value => updateKey('vocabularyUrl', value));
1718
state.evidenceUrl.subscribe(value => updateKey('evidenceUrl', value));
1819
state.resultsUrl.subscribe(value => updateKey('resultsUrl', value));
20+
state.currentVocabularyVersion.subscribe(value => updateKey('currentVocabularyVersion', value));
1921

2022
// This default values are stored during initialization
2123
// and used to reset after session finished
2224
state.defaultVocabularyUrl = ko.observable();
2325
state.defaultEvidenceUrl = ko.observable();
2426
state.defaultResultsUrl = ko.observable();
27+
state.defaultVocabularyVersion = ko.observable();
2528
state.defaultVocabularyUrl.subscribe((value) => state.vocabularyUrl(value));
2629
state.defaultEvidenceUrl.subscribe((value) => state.evidenceUrl(value));
2730
state.defaultResultsUrl.subscribe((value) => state.resultsUrl(value));
31+
state.defaultVocabularyVersion.subscribe((value) => state.currentVocabularyVersion(value));
2832

2933
state.resetCurrentDataSourceScope = function() {
3034
state.vocabularyUrl(state.defaultVocabularyUrl());
3135
state.evidenceUrl(state.defaultEvidenceUrl());
3236
state.resultsUrl(state.defaultResultsUrl());
37+
state.currentVocabularyVersion(state.defaultVocabularyVersion());
3338
}
3439

3540
state.sourceKeyOfVocabUrl = ko.computed(() => {

js/components/authorship.html

+9-11
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
11
<!-- ko if: createdBy && createdDate -->
22
<div data-bind="css: classes('container')">
3-
<span data-bind="text: createdText"></span>
4-
<span data-bind="visible: createdBy, text: ko.i18nformat('components.authorship.byCreated', 'by <%=createdBy%>', {createdBy: createdBy})"></span>
5-
<span data-bind="text: ko.i18n('components.authorship.on', 'on')"></span>
6-
<span data-bind="text: createdDate"></span><span data-bind="visible: modifiedDate">,</span>
7-
<span data-bind="visible: modifiedDate">
8-
<span data-bind="text: ko.i18n('components.authorship.modified', 'modified')"></span>
9-
<span data-bind="visible: createdBy, text: ko.i18nformat('components.authorship.byModified', 'by <%=modifiedBy%>', {modifiedBy: modifiedBy})"></span>
10-
<span data-bind="text: ko.i18n('components.authorship.on', 'on')"></span>
11-
<span data-bind="text: modifiedDate"></span>
12-
</span>
3+
<span data-bind="visible: createdBy,
4+
text: ko.i18nformat('components.authorship.createdLabel',
5+
'created by <%=createdBy%> on <%=cratedDate%>',
6+
{createdBy: createdBy, createdDate: createdDate})"></span><span data-bind="visible: modifiedDate">,</span>
7+
<span data-bind="visible: modifiedDate,
8+
text: ko.i18nformat('components.authorship.modifiedLabel',
9+
'modified by <%=modifiedBy%> on <%=modifiedDate%>',
10+
{modifiedBy: modifiedBy, modifiedDate: modifiedDate})"></span>
1311
</div>
14-
<!-- /ko -->
12+
<!-- /ko -->

js/components/cohortbuilder/CriteriaGroup.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ define(function (require, exports, module) {
2525

2626
if (data.DemographicCriteriaList && data.DemographicCriteriaList.length > 0) {
2727
data.DemographicCriteriaList.forEach(function (d) {
28-
self.DemographicCriteriaList.push(new DemographicCriteria(d));
28+
self.DemographicCriteriaList.push(new DemographicCriteria(d, conceptSets));
2929
});
3030
}
3131

js/components/cohortbuilder/CriteriaTypes/ConditionEra.js

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range', 'conceptpicker/InputTypes/Concept'], function (ko, Criteria, Range, Concept) {
1+
define(['knockout', './Criteria', '../InputTypes/Range', 'conceptpicker/InputTypes/Concept', '../InputTypes/ConceptSetSelection'], function (ko, Criteria, Range, Concept, ConceptSetSelection) {
22

33
function ConditionEra(data, conceptSets) {
44
var self = this;
@@ -35,6 +35,8 @@ define(['knockout', './Criteria', '../InputTypes/Range', 'conceptpicker/InputTyp
3535
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
3636
return new Concept(d);
3737
})));
38+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
39+
3840
}
3941

4042
ConditionEra.prototype = new Criteria();

js/components/cohortbuilder/CriteriaTypes/ConditionOccurrence.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text'], function (ko, Criteria, Range, Concept, Text) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text', '../InputTypes/ConceptSetSelection'
2+
], function (ko, Criteria, Range, Concept, Text,ConceptSetSelection) {
23

34
function ConditionOccurrence(data, conceptSets) {
45
var self = this;
@@ -29,11 +30,14 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
2930
return new Concept(d);
3031
})));
3132
self.ConditionTypeExclude = ko.observable(data.ConditionTypeExclude || null);
33+
self.ConditionTypeCS = ko.observable(data.ConditionTypeCS && new ConceptSetSelection(data.ConditionTypeCS, conceptSets));
34+
3235
self.StopReason = ko.observable(data.StopReason && new Text(data.StopReason));
3336
self.ConditionSourceConcept = ko.observable(data.ConditionSourceConcept != null ? ko.observable(data.ConditionSourceConcept) : null);
3437
self.ConditionStatus = ko.observable(data.ConditionStatus && ko.observableArray(data.ConditionStatus.map(function (d) {
3538
return new Concept(d);
3639
})));
40+
self.ConditionStatusCS = ko.observable(data.ConditionStatusCS && new ConceptSetSelection(data.ConditionStatusCS, conceptSets));
3741

3842
// Derived Fields
3943
self.First = ko.observable(data.First || null);
@@ -43,14 +47,17 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
4347
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
4448
return new Concept(d);
4549
})));
50+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
4651

4752
self.ProviderSpecialty = ko.observable(data.ProviderSpecialty && ko.observableArray(data.ProviderSpecialty.map(function (d) {
4853
return new Concept(d);
4954
})));
55+
self.ProviderSpecialtyCS = ko.observable(data.ProviderSpecialtyCS && new ConceptSetSelection(data.ProviderSpecialtyCS, conceptSets));
5056

5157
self.VisitType = ko.observable(data.VisitType && ko.observableArray(data.VisitType.map(function (d) {
5258
return new Concept(d);
5359
})));
60+
self.VisitTypeCS = ko.observable(data.VisitTypeCS && new ConceptSetSelection(data.VisitTypeCS, conceptSets));
5461

5562
}
5663

js/components/cohortbuilder/CriteriaTypes/Death.js

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text'], function (ko, Criteria, Range, Concept, Text) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/ConceptSetSelection'],
2+
function (ko, Criteria, Range, Concept, ConceptSetSelection) {
23

34
function Death(data, conceptSets) {
45
var self = this;
@@ -28,6 +29,8 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
2829
return new Concept(d);
2930
})));
3031
self.DeathTypeExclude = ko.observable(data.DeathTypeExclude || null);
32+
self.DeathTypeCS = ko.observable(data.DeathTypeCS && new ConceptSetSelection(data.DeathTypeCS, conceptSets));
33+
3134
self.DeathSourceConcept = ko.observable(data.DeathSourceConcept != null ? ko.observable(data.DeathSourceConcept) : null);
3235
// Derived Fields
3336
self.Age = ko.observable(data.Age && new Range(data.Age));
@@ -36,11 +39,8 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
3639
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
3740
return new Concept(d);
3841
})));
42+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
3943

40-
/* Do we still need prior enroll days inside the individual criteria?
41-
self.PriorEnrollDays = ko.observable((typeof data.PriorEnrollDays == "number") ? data.PriorEnrollDays : null);
42-
self.AfterEnrollDays = ko.observable((typeof data.AfterEnrollDays == "number") ? data.AfterEnrollDays : null);
43-
*/
4444
}
4545

4646
Death.prototype = new Criteria();

js/components/cohortbuilder/CriteriaTypes/DemographicCriteria.js

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
define(['knockout', '../InputTypes/Range', 'conceptpicker/InputTypes/Concept'], function (ko, Range, Concept) {
1+
define(['knockout', '../InputTypes/Range', 'conceptpicker/InputTypes/Concept', '../InputTypes/ConceptSetSelection'], function (ko, Range, Concept, ConceptSetSelection) {
22

33
function DemographicCriteria(data, conceptSets) {
44
var self = this;
@@ -9,14 +9,17 @@ define(['knockout', '../InputTypes/Range', 'conceptpicker/InputTypes/Concept'],
99
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
1010
return new Concept(d);
1111
})));
12+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
1213

1314
self.Race = ko.observable(data.Race && ko.observableArray(data.Race.map(function (d) {
1415
return new Concept(d);
1516
})));
17+
self.RaceCS = ko.observable(data.RaceCS && new ConceptSetSelection(data.RaceCS, conceptSets));
1618

1719
self.Ethnicity = ko.observable(data.Ethnicity && ko.observableArray(data.Ethnicity.map(function (d) {
1820
return new Concept(d);
1921
})));
22+
self.EthnicityCS = ko.observable(data.EthnicityCS && new ConceptSetSelection(data.EthnicityCS, conceptSets));
2023

2124

2225
self.OccurrenceStartDate = ko.observable(data.OccurrenceStartDate && new Range(data.OccurrenceStartDate));

js/components/cohortbuilder/CriteriaTypes/DeviceExposure.js

+7-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text'], function (ko, Criteria, Range, Concept, Text) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text', '../InputTypes/ConceptSetSelection'], function (ko, Criteria, Range, Concept, Text, ConceptSetSelection) {
22

33
function DeviceOccurence(data, conceptSets) {
44
var self = this;
@@ -29,6 +29,8 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
2929
return new Concept(d);
3030
})));
3131
self.DeviceTypeExclude = ko.observable(data.DeviceTypeExclude || null);
32+
self.DeviceTypeCS = ko.observable(data.DeviceTypeCS && new ConceptSetSelection(data.DeviceTypeCS, conceptSets));
33+
3234
self.UniqueDeviceId = ko.observable(data.UniqueDeviceId && new Text(data.StopReason));
3335
self.Quantity = ko.observable(data.Quantity && new Range(data.Quantity));
3436
self.DeviceSourceConcept = ko.observable(data.DeviceSourceConcept != null ? ko.observable(data.DeviceSourceConcept) : null);
@@ -41,18 +43,17 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
4143
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
4244
return new Concept(d);
4345
})));
46+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
4447

45-
/* Do we still need prior enroll days inside the individual criteria?
46-
self.PriorEnrollDays = ko.observable((typeof data.PriorEnrollDays == "number") ? data.PriorEnrollDays : null);
47-
self.AfterEnrollDays = ko.observable((typeof data.AfterEnrollDays == "number") ? data.AfterEnrollDays : null);
48-
*/
49-
5048
self.ProviderSpecialty = ko.observable(data.ProviderSpecialty && ko.observableArray(data.ProviderSpecialty.map(function (d) {
5149
return new Concept(d);
5250
})));
51+
self.ProviderSpecialtyCS = ko.observable(data.ProviderSpecialtyCS && new ConceptSetSelection(data.ProviderSpecialtyCS, conceptSets));
52+
5353
self.VisitType = ko.observable(data.VisitType && ko.observableArray(data.VisitType.map(function (d) {
5454
return new Concept(d);
5555
})));
56+
self.VisitTypeCS = ko.observable(data.VisitTypeCS && new ConceptSetSelection(data.VisitTypeCS, conceptSets));
5657

5758
}
5859

js/components/cohortbuilder/CriteriaTypes/DoseEra.js

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept'], function (ko, Criteria, Range, Concept) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/ConceptSetSelection'], function (ko, Criteria, Range, Concept, ConceptSetSelection) {
22

33
function DoseEra(data, conceptSets) {
44
var self = this;
@@ -26,6 +26,8 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
2626
self.Unit = ko.observable(data.Unit && ko.observableArray(data.Unit.map(function (d) {
2727
return new Concept(d);
2828
})));
29+
self.UnitCS = ko.observable(data.UnitCS && new ConceptSetSelection(data.UnitCS, conceptSets));
30+
2931
self.DoseValue = ko.observable(data.DoseValue && new Range(data.DoseValue));
3032
self.EraLength = ko.observable(data.EraLength && new Range(data.EraLength));
3133

@@ -38,6 +40,8 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
3840
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
3941
return new Concept(d);
4042
})));
43+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
44+
4145
}
4246

4347
DoseEra.prototype = new Criteria();

js/components/cohortbuilder/CriteriaTypes/DrugEra.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept'], function (ko, Criteria, Range, Concept) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/ConceptSetSelection'], function (ko, Criteria, Range, Concept, ConceptSetSelection) {
22

33
function DrugEra(data, conceptSets) {
44
var self = this;
@@ -36,6 +36,7 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
3636
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
3737
return new Concept(d);
3838
})));
39+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
3940
}
4041

4142
DrugEra.prototype = new Criteria();

js/components/cohortbuilder/CriteriaTypes/DrugExposure.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text'], function (ko, Criteria, Range, Concept, Text) {
1+
define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputTypes/Concept', '../InputTypes/Text','../InputTypes/ConceptSetSelection'
2+
], function (ko, Criteria, Range, Concept, Text, ConceptSetSelection) {
23

34
function DrugExposure(data, conceptSets) {
45
var self = this;
@@ -29,17 +30,20 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
2930
return new Concept(d);
3031
})));
3132
self.DrugTypeExclude = ko.observable(data.DrugTypeExclude || null);
33+
self.DrugTypeCS = ko.observable(data.DrugTypeCS && new ConceptSetSelection(data.DrugTypeCS, conceptSets));
3234
self.StopReason = ko.observable(data.StopReason && new Text(data.StopReason));
3335
self.Refills = ko.observable(data.Refills && new Range(data.Refills));
3436
self.Quantity = ko.observable(data.Quantity && new Range(data.Quantity));
3537
self.DaysSupply = ko.observable(data.DaysSupply && new Range(data.DaysSupply));
3638
self.RouteConcept = ko.observable(data.RouteConcept && ko.observableArray(data.RouteConcept.map(function (d) {
3739
return new Concept(d);
3840
})));
41+
self.RouteConceptCS = ko.observable(data.RouteConceptCS && new ConceptSetSelection(data.RouteConceptCS, conceptSets));
3942
self.EffectiveDrugDose = ko.observable(data.EffectiveDrugDose && new Range(data.EffectiveDrugDose));
4043
self.DoseUnit = ko.observable(data.DoseUnit && ko.observableArray(data.DoseUnit.map(function (d) {
4144
return new Concept(d);
4245
})));
46+
self.DoseUnitCS = ko.observable(data.DoseUnitCS && new ConceptSetSelection(data.DoseUnitCS, conceptSets));
4347
self.LotNumber = ko.observable(data.LotNumber && new Text(data.LotNumber));
4448
self.DrugSourceConcept = ko.observable(data.DrugSourceConcept != null ? ko.observable(data.DrugSourceConcept) : null);
4549

@@ -51,18 +55,17 @@ define(['knockout', './Criteria', '../InputTypes/Range','conceptpicker/InputType
5155
self.Gender = ko.observable(data.Gender && ko.observableArray(data.Gender.map(function (d) {
5256
return new Concept(d);
5357
})));
58+
self.GenderCS = ko.observable(data.GenderCS && new ConceptSetSelection(data.GenderCS, conceptSets));
5459

55-
/* Do we still need prior enroll days inside the individual criteria?
56-
self.PriorEnrollDays = ko.observable((typeof data.PriorEnrollDays == "number") ? data.PriorEnrollDays : null);
57-
self.AfterEnrollDays = ko.observable((typeof data.AfterEnrollDays == "number") ? data.AfterEnrollDays : null);
58-
*/
59-
6060
self.ProviderSpecialty = ko.observable(data.ProviderSpecialty && ko.observableArray(data.ProviderSpecialty.map(function (d) {
6161
return new Concept(d);
6262
})));
63+
self.ProviderSpecialtyCS = ko.observable(data.ProviderSpecialtyCS && new ConceptSetSelection(data.ProviderSpecialtyCS, conceptSets));
64+
6365
self.VisitType = ko.observable(data.VisitType && ko.observableArray(data.VisitType.map(function (d) {
6466
return new Concept(d);
6567
})));
68+
self.VisitTypeCS = ko.observable(data.VisitTypeCS && new ConceptSetSelection(data.VisitTypeCS, conceptSets));
6669

6770
}
6871

0 commit comments

Comments
 (0)