diff --git a/OHIFViewer/.gitignore b/OHIFViewer/.gitignore
index 0d0d24eac..5bfa94c88 100644
--- a/OHIFViewer/.gitignore
+++ b/OHIFViewer/.gitignore
@@ -1,4 +1,6 @@
.idea
.meteor/local
.meteor/meteorite
-node_modules
\ No newline at end of file
+node_modules
+client/sha.js
+client/version.js
\ No newline at end of file
diff --git a/OHIFViewer/.meteor/packages b/OHIFViewer/.meteor/packages
index 95b9f1ccb..57884318f 100644
--- a/OHIFViewer/.meteor/packages
+++ b/OHIFViewer/.meteor/packages
@@ -16,7 +16,6 @@ jquery@1.11.10
tracker@1.2.0
logging@1.1.20
reload@1.2.0
-random@1.1.0
ejson@1.1.0
spacebars@1.0.12
check@1.3.1
@@ -25,6 +24,7 @@ reactive-var@1.0.11
reactive-dict@1.2.0
standard-minifier-css@1.4.1
standard-minifier-js@2.3.4
+shell-server@0.3.1
# OHIF Packages
ohif:polyfill
@@ -46,9 +46,7 @@ fortawesome:fontawesome
momentjs:moment@2.15.1
aldeed:simple-schema # Third party package to deal with schemas
aldeed:template-extension
-johdirr:meteor-git-rev
cultofcoders:persistent-session
-shell-server@0.3.1
underscore
meteortesting:mocha
react-template-helper
diff --git a/OHIFViewer/.meteor/versions b/OHIFViewer/.meteor/versions
index 10c1c80dd..cb19b5b8a 100644
--- a/OHIFViewer/.meteor/versions
+++ b/OHIFViewer/.meteor/versions
@@ -49,7 +49,6 @@ iron:controller@1.0.12
iron:core@1.0.11
iron:dynamic-template@1.0.12
iron:layout@1.0.12
-johdirr:meteor-git-rev@0.0.4
jquery@1.11.11
launch-screen@1.1.1
livedata@1.0.18
diff --git a/OHIFViewer/client/components/viewer/viewer.html b/OHIFViewer/client/components/viewer/viewer.html
index 38c84ba1b..d2db79ea1 100644
--- a/OHIFViewer/client/components/viewer/viewer.html
+++ b/OHIFViewer/client/components/viewer/viewer.html
@@ -4,11 +4,6 @@
{{>cineDialog}}
{{>layoutChooser}}
{{>annotationDialogs}}
-
-
- {{>ruleEntryDialog}}
- {{>settingEntryDialog}}
- {{>textEntryDialog}}
{{>toolbarSection (clone this state=state)}}
diff --git a/OHIFViewer/client/config.js b/OHIFViewer/client/config.js
index bee9e5103..44264fb85 100644
--- a/OHIFViewer/client/config.js
+++ b/OHIFViewer/client/config.js
@@ -1,6 +1,13 @@
import { Meteor } from 'meteor/meteor';
import { OHIF } from 'meteor/ohif:core';
import { cornerstoneWADOImageLoader } from 'meteor/ohif:cornerstone';
+import sha from './sha.js';
+import version from './version.js';
+
+OHIF.info = {
+ sha,
+ version
+};
Meteor.startup(function() {
const maxWebWorkers = Math.max(navigator.hardwareConcurrency - 1, 1);
diff --git a/OHIFViewer/package.json b/OHIFViewer/package.json
index b86f3954f..464eba243 100644
--- a/OHIFViewer/package.json
+++ b/OHIFViewer/package.json
@@ -18,6 +18,9 @@
"puppeteer": "^1.5.0"
},
"scripts": {
+ "version": "node -p -e \"'export default \\'' + require('./package.json').version + '\\';'\" > client/version.js",
+ "sha": "echo \"export default '\"$(git rev-parse HEAD)\"';\" > client/sha.js",
+ "details": "npm run version && npm run sha",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
diff --git a/Packages/ohif-core/both/utils/guid.js b/Packages/ohif-core/both/utils/guid.js
new file mode 100644
index 000000000..fcbc97008
--- /dev/null
+++ b/Packages/ohif-core/both/utils/guid.js
@@ -0,0 +1,13 @@
+/**
+ * Create a random GUID
+ *
+ * @return {string}
+ */
+export default function guid() {
+ function s4() {
+ return Math.floor((1 + Math.random()) * 0x10000)
+ .toString(16)
+ .substring(1);
+ }
+ return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4();
+}
diff --git a/Packages/ohif-core/both/utils/index.js b/Packages/ohif-core/both/utils/index.js
index 444f24e49..cdce7aa48 100644
--- a/Packages/ohif-core/both/utils/index.js
+++ b/Packages/ohif-core/both/utils/index.js
@@ -1,2 +1,8 @@
+import { OHIF } from 'meteor/ohif:core';
+
import './absoluteUrl';
import './objectPath';
+import guid from './guid';
+
+OHIF.utils = OHIF.utils || {}
+OHIF.utils.guid = guid;
diff --git a/Packages/ohif-hanging-protocols/both/classes/Protocol.js b/Packages/ohif-hanging-protocols/both/classes/Protocol.js
index 232db7ef1..52594266f 100644
--- a/Packages/ohif-hanging-protocols/both/classes/Protocol.js
+++ b/Packages/ohif-hanging-protocols/both/classes/Protocol.js
@@ -1,5 +1,4 @@
import { Meteor } from 'meteor/meteor';
-import { Random } from 'meteor/random';
import { OHIF } from 'meteor/ohif:core';
// Local imports
@@ -19,7 +18,7 @@ HP.Protocol = class Protocol {
*/
constructor(name) {
// Create a new UUID for this Protocol
- this.id = Random.id();
+ this.id = OHIF.utils.guid();
// Store a value which determines whether or not a Protocol is locked
// This is probably temporary, since we will eventually have role / user
@@ -133,7 +132,7 @@ HP.Protocol = class Protocol {
fromObject(input) {
// Check if the input already has an ID
// If so, keep it. It not, create a new UUID
- this.id = input.id || Random.id();
+ this.id = input.id || OHIF.utils.guid();
// Assign the input name to the Protocol
this.name = input.name;
diff --git a/Packages/ohif-hanging-protocols/both/classes/Rule.js b/Packages/ohif-hanging-protocols/both/classes/Rule.js
index 236242785..e9b7862a5 100644
--- a/Packages/ohif-hanging-protocols/both/classes/Rule.js
+++ b/Packages/ohif-hanging-protocols/both/classes/Rule.js
@@ -1,5 +1,4 @@
-import { Random } from 'meteor/random';
-
+import { OHIF } from 'meteor/ohif:core';
import { comparators } from '../lib/comparators';
const EQUALS_REGEXP = /^equals$/;
@@ -30,7 +29,7 @@ export class Rule {
*/
constructor(attribute, constraint, required, weight) {
// Create a new UUID for this Rule
- this.id = Random.id();
+ this.id = OHIF.utils.guid();
// Set the Rule's weight (defaults to 1)
this.weight = weight || 1;
@@ -69,7 +68,7 @@ export class Rule {
fromObject(input) {
// Check if the input already has an ID
// If so, keep it. It not, create a new UUID
- this.id = input.id || Random.id();
+ this.id = input.id || OHIF.utils.guid();
// Assign the specified input data to the Rule
this.required = input.required;
@@ -80,7 +79,7 @@ export class Rule {
/**
* Get the constraint info object for the current constraint
- * @return {Object\undefined} Constraint object or undefined if current constraint
+ * @return {Object\undefined} Constraint object or undefined if current constraint
* is not valid or not found in comparators list
*/
getConstraintInfo() {
@@ -141,7 +140,7 @@ export class Rule {
*/
getConstraintValidatorAndValue() {
let validatorAndValue = this._validatorAndValue;
-
+
// Check if validator and value are cached already
if (validatorAndValue !== void 0) {
return validatorAndValue;
diff --git a/Packages/ohif-hanging-protocols/both/classes/Stage.js b/Packages/ohif-hanging-protocols/both/classes/Stage.js
index 8c0952095..9be1e6724 100644
--- a/Packages/ohif-hanging-protocols/both/classes/Stage.js
+++ b/Packages/ohif-hanging-protocols/both/classes/Stage.js
@@ -1,4 +1,4 @@
-import { Random } from 'meteor/random';
+import { OHIF } from 'meteor/ohif:core';
/**
* A Stage is one step in the Display Set Sequence for a Hanging Protocol
@@ -10,7 +10,7 @@ import { Random } from 'meteor/random';
HP.Stage = class Stage {
constructor(ViewportStructure, name) {
// Create a new UUID for this Stage
- this.id = Random.id();
+ this.id = OHIF.utils.guid();
// Assign the name and ViewportStructure provided
this.name = name;
@@ -62,7 +62,7 @@ HP.Stage = class Stage {
fromObject(input) {
// Check if the input already has an ID
// If so, keep it. It not, create a new UUID
- this.id = input.id || Random.id();
+ this.id = input.id || OHIF.utils.guid();
// Assign the input name to the Stage
this.name = input.name;
@@ -84,4 +84,4 @@ HP.Stage = class Stage {
});
}
}
-};
\ No newline at end of file
+};
diff --git a/Packages/ohif-hanging-protocols/client/components/protocolEditor/protocolEditor.js b/Packages/ohif-hanging-protocols/client/components/protocolEditor/protocolEditor.js
index 1ae522a5a..5e224203e 100644
--- a/Packages/ohif-hanging-protocols/client/components/protocolEditor/protocolEditor.js
+++ b/Packages/ohif-hanging-protocols/client/components/protocolEditor/protocolEditor.js
@@ -1,7 +1,6 @@
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Session } from 'meteor/session';
-import { Random } from 'meteor/random';
import { $ } from 'meteor/jquery';
import { OHIF } from 'meteor/ohif:core';
@@ -14,7 +13,7 @@ function updateProtocolSelect() {
if (!ProtocolEngine) {
return;
}
-
+
// Loop through the available hanging protocols
// to create an array with the protocols that includes
// a property labelled 'text', so that Select2 has something
@@ -85,7 +84,7 @@ Template.protocolEditor.helpers({
// Make sure that the number of referenced priors is correct
ProtocolEngine.protocol.updateNumberOfPriorsReferenced();
-
+
// Otherwise, return the active Hanging Protocol
return ProtocolEngine.protocol;
},
@@ -147,7 +146,7 @@ Template.protocolEditor.helpers({
stage.viewports.push(viewport);
}
}
-
+
// Return the current Stage model for the active Protocol
return ProtocolEngine.getCurrentStageModel();
},
@@ -169,7 +168,7 @@ Template.protocolEditor.events({
protocol.name = 'New (created ' + moment().format('h:mm:ss a') + ')';
// Change the Protocol ID from the default value
- protocol.id = Random.id();
+ protocol.id = OHIF.utils.guid();
// Insert the protocol
HP.ProtocolStore.addProtocol(protocol);
@@ -321,7 +320,7 @@ Template.protocolEditor.events({
// and fire the callback function when finished.
openTextEntryDialog(title, instructions, currentValue, function(value) {
// Create a new ID for the protocol
- protocol.id = Random.id();
+ protocol.id = OHIF.utils.guid();
// Update the name with the entered text
protocol.name = value;
diff --git a/Packages/ohif-measurements/client/components/association/associationModal/associationModal.js b/Packages/ohif-measurements/client/components/association/associationModal/associationModal.js
index e1c8e22fc..3a532e4d3 100644
--- a/Packages/ohif-measurements/client/components/association/associationModal/associationModal.js
+++ b/Packages/ohif-measurements/client/components/association/associationModal/associationModal.js
@@ -1,7 +1,6 @@
import { Meteor } from 'meteor/meteor';
import { Template } from 'meteor/templating';
import { Blaze } from 'meteor/blaze';
-import { Random } from 'meteor/random';
import { moment } from 'meteor/momentjs:moment';
import { OHIF } from 'meteor/ohif:core';
import { _ } from 'meteor/underscore';
@@ -113,7 +112,7 @@ Template.dialogStudyAssociation.onCreated(() => {
// Create a new timepoint to represent the (baseline or follow-up) studies
let timepoint = {
timepointType: timepointType,
- timepointId: Random.id(),
+ timepointId: OHIF.utils.guid(),
studyInstanceUids: studyInstanceUids,
patientId: relatedStudies[0].patientId,
earliestDate: studyDates[0],
diff --git a/Packages/ohif-measurements/package.js b/Packages/ohif-measurements/package.js
index 220b754ed..080fc5e10 100644
--- a/Packages/ohif-measurements/package.js
+++ b/Packages/ohif-measurements/package.js
@@ -35,7 +35,6 @@ Package.onUse(function(api) {
api.use('ohif:select-tree');
api.use('ohif:log');
api.use('ohif:studies');
- api.use('ohif:hanging-protocols');
api.use('ohif:viewerbase');
// Client and server imports
diff --git a/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.html b/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.html
index 3b2b696f9..c528daf30 100644
--- a/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.html
+++ b/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.html
@@ -49,24 +49,16 @@
| Last Commit Hash |
-
- {{gitRev 'long'}}
+
+ {{gitSHA}}
|
- | Latest Tag |
+ Version |
-
- {{gitRev 'tag'}}
-
- |
-
-
- | Branch |
-
-
- {{gitRev 'branch'}}
+
+ {{gitVersion}}
|
diff --git a/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.js b/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.js
index d6393a190..e8d6bf2fd 100644
--- a/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.js
+++ b/Packages/ohif-viewerbase/client/components/basic/aboutModal/aboutModal.js
@@ -1,5 +1,15 @@
+import { OHIF } from 'meteor/ohif:core';
+
Template.aboutModal.helpers({
githubUrl() {
return 'https://github.com/OHIF/Viewers';
+ },
+
+ gitSHA() {
+ return OHIF.info.sha;
+ },
+
+ gitVersion() {
+ return OHIF.info.version;
}
});
diff --git a/Packages/ohif-viewerbase/client/lib/classes/ImageSet.js b/Packages/ohif-viewerbase/client/lib/classes/ImageSet.js
index 48f788ce4..e91494ad4 100644
--- a/Packages/ohif-viewerbase/client/lib/classes/ImageSet.js
+++ b/Packages/ohif-viewerbase/client/lib/classes/ImageSet.js
@@ -1,4 +1,4 @@
-import { Random } from 'meteor/random';
+import { OHIF } from 'meteor/ohif:core';
import { OHIFError } from './OHIFError';
const OBJECT = 'object';
@@ -30,7 +30,7 @@ export class ImageSet {
enumerable: false,
configurable: false,
writable: false,
- value: Random.id() // Unique ID of the instance
+ value: OHIF.utils.guid() // Unique ID of the instance
});
}
diff --git a/Packages/ohif-viewerbase/client/lib/classes/TypeSafeCollection.js b/Packages/ohif-viewerbase/client/lib/classes/TypeSafeCollection.js
index 556be08f8..b0577c1b4 100644
--- a/Packages/ohif-viewerbase/client/lib/classes/TypeSafeCollection.js
+++ b/Packages/ohif-viewerbase/client/lib/classes/TypeSafeCollection.js
@@ -1,4 +1,4 @@
-import { Random } from 'meteor/random';
+import { OHIF } from 'meteor/ohif:core';
import { ReactiveVar } from 'meteor/reactive-var';
/**
@@ -130,7 +130,7 @@ export class TypeSafeCollection {
let id = null,
found = this._elementWithPayload(payload, true);
if (!found) {
- id = Random.id();
+ id = OHIF.utils.guid();
this._elements(true).push({ id, payload });
this._invalidate();
this._trigger('insert', { id, data: payload });
diff --git a/Packages/ohif-viewerbase/client/lib/toolManager.js b/Packages/ohif-viewerbase/client/lib/toolManager.js
index b8c512fe1..e04f48c3b 100644
--- a/Packages/ohif-viewerbase/client/lib/toolManager.js
+++ b/Packages/ohif-viewerbase/client/lib/toolManager.js
@@ -1,5 +1,4 @@
import { Session } from 'meteor/session';
-import { Random } from 'meteor/random';
import { OHIF } from 'meteor/ohif:core';
import { cornerstone, cornerstoneTools } from 'meteor/ohif:cornerstone';
@@ -171,7 +170,7 @@ export const toolManager = {
activeTool[button] = toolName;
// Enable reactivity
- Session.set('ToolManagerActiveToolUpdated', Random.id());
+ Session.set('ToolManagerActiveToolUpdated', OHIF.utils.guid());
},
instantiateTools(element) {
diff --git a/Packages/ohif-viewerbase/client/lib/viewportUtils.js b/Packages/ohif-viewerbase/client/lib/viewportUtils.js
index 86e719da3..5ee1d8a47 100644
--- a/Packages/ohif-viewerbase/client/lib/viewportUtils.js
+++ b/Packages/ohif-viewerbase/client/lib/viewportUtils.js
@@ -1,5 +1,4 @@
import { Session } from 'meteor/session';
-import { Random } from 'meteor/random';
import { $ } from 'meteor/jquery';
import { _ } from 'meteor/underscore';
// Local Modules
@@ -222,7 +221,7 @@ const toggleCineDialog = () => {
const dialog = document.getElementById('cineDialog');
toggleDialog(dialog, stopAllClips);
- Session.set('UpdateCINE', Random.id());
+ Session.set('UpdateCINE', Math.random());
};
const toggleDownloadDialog = () => {
diff --git a/generateStaticSite.sh b/generateStaticSite.sh
index 0f2750971..60bfcbaa2 100755
--- a/generateStaticSite.sh
+++ b/generateStaticSite.sh
@@ -1,6 +1,6 @@
cd docs
npm -v
-node -v
+node -v
echo 'Installing Gitbook CLI'
npm install
@@ -21,4 +21,5 @@ meteor-build-client-fixed --version
curl https://install.meteor.com | /bin/sh
export PATH=$HOME/.meteor:$PATH
meteor npm install
-meteor-build-client-fixed ../../docs/_book/viewer -u $ROOT_URL --path './'
\ No newline at end of file
+meteor npm run details
+meteor-build-client-fixed ../../docs/_book/viewer -u $ROOT_URL --path './'