diff --git a/LesionTracker/.meteor/packages b/LesionTracker/.meteor/packages
index 673416f8a..5e292945a 100644
--- a/LesionTracker/.meteor/packages
+++ b/LesionTracker/.meteor/packages
@@ -4,6 +4,8 @@
# 'meteor add' and 'meteor remove' will edit this file for you,
# but you can also edit it by hand.
+npm-bcrypt@0.8.7
+
meteor-base@1.0.4 # Packages every Meteor app needs to have
mobile-experience@1.0.4 # Packages for a great mobile UX
mongo@1.1.10 # The database Meteor supports right now
diff --git a/Packages/design/styles/components/selectTree.styl b/Packages/design/styles/components/selectTree.styl
index d47a988cf..39cbb7eb3 100644
--- a/Packages/design/styles/components/selectTree.styl
+++ b/Packages/design/styles/components/selectTree.styl
@@ -158,7 +158,6 @@ $gray6 = #303030
.select-tree-common
height: 100%
- overflow: hidden
padding-left: 6px
position: absolute
right: -100%
@@ -191,22 +190,34 @@ $gray6 = #303030
transform-origin(100% 50%)
transition(all 0.3s ease)
- .select-tree-common .content
- margin-left: calc(-100% - 6px)
- transition(all 0.3s ease 0.3s)
+ .select-tree-common
+ overflow: hidden
+ z-index: -1
+
+ .content
+ margin-left: calc(-100% - 6px)
+ transition(all 0.3s ease 0.3s)
&.started
&>.tree-content
transform(scale(1))
- .select-tree-common .content
- margin-left: 0
+ .select-tree-common
+ animation-name: selectTreeCommonOverflow
+ animation-delay: 0.3s
+ animation-duration: 0.3s
+ animation-iteration-count: 1
+ animation-direction: alternate
+ animation-fill-mode: forwards
+
+ .content
+ margin-left: 0
&.interacted
.select-tree-common
- overflow: visible
+ z-index: 1
.content
animation-name: selectTreeCommonCloseLeft
@@ -216,6 +227,15 @@ $gray6 = #303030
animation-timing-function: ease-out
animation-fill-mode: forwards
+@keyframes selectTreeCommonOverflow {
+ from {
+ overflow: hidden
+ }
+ to {
+ overflow: visible
+ }
+}
+
@keyframes selectTreeCommonCloseLeft {
from {
height: 37px
diff --git a/Packages/ohif-core/client/components/bootstrap/input/selectTree.html b/Packages/ohif-core/client/components/bootstrap/input/selectTree.html
index 2789a7c02..ac4859ea2 100644
--- a/Packages/ohif-core/client/components/bootstrap/input/selectTree.html
+++ b/Packages/ohif-core/client/components/bootstrap/input/selectTree.html
@@ -22,7 +22,7 @@
{{>selectTreeBreadcrumb component=this.component}}
{{/if}}
- {{#each item in (reactive this.items)}}
+ {{#each item in treeItems}}
{{>inputRadio
id=(concat this.storageKey '_' (encodeId item.value))
class=this.radioClass
diff --git a/Packages/ohif-core/client/components/bootstrap/input/selectTree.js b/Packages/ohif-core/client/components/bootstrap/input/selectTree.js
index 23e2c7bfb..5e065df73 100644
--- a/Packages/ohif-core/client/components/bootstrap/input/selectTree.js
+++ b/Packages/ohif-core/client/components/bootstrap/input/selectTree.js
@@ -1,12 +1,20 @@
import { OHIF } from 'meteor/ohif:core';
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
+import { ReactiveVar } from 'meteor/reactive-var';
import { _ } from 'meteor/underscore';
import { $ } from 'meteor/jquery';
// TODO: use npm dependency
import transition from 'meteor/ohif:core/client/lib/third-party/transition-to-from-auto';
+Template.selectTree.onCreated(() => {
+ const instance = Template.instance();
+
+ // Create a reactive variable to control the search
+ instance.searchTerm = new ReactiveVar('');
+});
+
Template.selectTree.onRendered(() => {
const instance = Template.instance();
const component = instance.$('.select-tree:first').data('component');
@@ -20,8 +28,19 @@ Template.selectTree.onRendered(() => {
$treeRoot.addClass('started');
// Update the component's viewport height
- instance.updateHeight = () => {
- const height = rootInstance.$('.tree-options:last').data('height');
+ instance.updateHeight = searchTerm => {
+ let height;
+
+ // Check if there's a search term
+ if (searchTerm) {
+ // Set the viewport height as same as listed options height
+ height = rootInstance.$('.tree-inputs').height();
+ } else {
+ // Set the viewport height as same as selected node's options height
+ height = rootInstance.$('.tree-options:last').data('height');
+ }
+
+ // Update the viewport's height
rootInstance.$('.tree-options:first').height(height);
};
@@ -49,9 +68,17 @@ Template.selectTree.onRendered(() => {
// Run this computation everytime the current node is changed
instance.data.currentNode.dep.depend();
+ // Run this computation everytime the search term is changed
+ const searchTerm = instance.searchTerm.get();
+
+ // Clean the current node selection if the user started the search
+ if (searchTerm) {
+ rootInstance.data.currentNode.set(null);
+ }
+
// Update the viewport height
Tracker.afterFlush(() => {
- instance.updateHeight();
+ instance.updateHeight(searchTerm);
instance.updateOpen();
});
});
@@ -73,6 +100,11 @@ Template.selectTree.events({
$(event.currentTarget).parent().addClass('interacted');
},
+ 'input .tree-search input'(event, instance) {
+ // Change the search term to update the tree items
+ instance.searchTerm.set($(event.currentTarget).val());
+ },
+
'change .select-tree:first>.tree-content>.tree-options>.tree-inputs>label>input'(event, instance) {
const component = instance.component;
const $target = $(event.target);
@@ -96,10 +128,13 @@ Template.selectTree.events({
// Change the active item
$label.addClass('active');
+ // Ckeck if there's a storageKey defined
const storageKey = instance.data.storageKey;
if (storageKey) {
+ // Get the current stored data
const storedData = _.extend({}, OHIF.user.getData(storageKey));
+ // Increment or create a counter for the clicked leaf
const itemKey = OHIF.string.encodeId($target.val());
if (storedData[itemKey]) {
storedData[itemKey]++;
@@ -107,8 +142,7 @@ Template.selectTree.events({
storedData[itemKey] = 1;
}
- console.warn('>>>>', storageKey, storedData, itemKey);
-
+ // Updata the stored data with the new count
OHIF.user.setData(storageKey, storedData);
}
@@ -160,3 +194,27 @@ Template.selectTree.events({
}
}
});
+
+Template.selectTree.helpers({
+ treeItems() {
+ const instance = Template.instance();
+
+ // Run this computation everytime the search term is changed
+ const searchTerm = instance.searchTerm.get();
+
+ // Get all the items
+ let items = instance.data.items;
+
+ // Check if the search term was informed
+ if (searchTerm) {
+ // Search the items by the give search term
+ items = OHIF.string.search(items, searchTerm, 'label');
+
+ // Filter only the tree leaves
+ items = _.filter(items, item => !item.items);
+ }
+
+ // Return the tree items
+ return items;
+ }
+});
diff --git a/Packages/ohif-core/client/lib/string.js b/Packages/ohif-core/client/lib/string.js
index 6ffdda68c..f6cfcf838 100644
--- a/Packages/ohif-core/client/lib/string.js
+++ b/Packages/ohif-core/client/lib/string.js
@@ -22,9 +22,11 @@ OHIF.string.search = (object, query, property=null, result=[]) => {
if (_.isString(value) && pattern.test(value)) {
// Add the current item to the result
result.push(item);
- } else if (_.isObject(value)) {
+ }
+
+ if (_.isObject(item)) {
// Search recursively the item if the current item is an object
- OHIF.string.search(value, query, property, result);
+ OHIF.string.search(item, query, property, result);
}
});
diff --git a/Packages/worklist/server/services/qido/studies.js b/Packages/worklist/server/services/qido/studies.js
index 13e42ed5f..58d9f9018 100644
--- a/Packages/worklist/server/services/qido/studies.js
+++ b/Packages/worklist/server/services/qido/studies.js
@@ -37,7 +37,7 @@ function filterToQIDOURL(server, filter) {
AccessionNumber: filter.accessionNumber,
StudyDescription: filter.studyDescription,
limit: filter.limit || 20,
- includefield: server.qidoSupportsIncludeField ? commaSeparatedFields : 'all'
+ includefield: server.qidoSupportsIncludeField ? 'all' : commaSeparatedFields
};
// build the StudyDate range parameter
@@ -45,7 +45,7 @@ function filterToQIDOURL(server, filter) {
var date = "".concat(dateToString(new Date(filter.studyDateFrom)), "-", dateToString(new Date(filter.studyDateTo)));
parameters.StudyDate = date;
}
-
+
return server.qidoRoot + '/studies?' + encodeQueryData(parameters);
}
@@ -84,7 +84,7 @@ function resultDataToStudies(resultData) {
modalities: DICOMWeb.getString(DICOMWeb.getModalities(study['00080060'], study['00080061']))
});
});
-
+
return studies;
}