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 './'