Style and bug fixes related to active-entry and hipaaAuditLog integration
This commit is contained in:
parent
3223da4358
commit
11e300f013
@ -1,6 +1,24 @@
|
|||||||
// TODO: Move all of this into the LesionTracker package
|
// TODO: Move all of this into the LesionTracker package
|
||||||
|
html
|
||||||
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
min-height: 100%
|
||||||
|
min-width: 100%
|
||||||
|
|
||||||
|
|
||||||
body
|
body
|
||||||
background-color: #202020
|
height: 100%
|
||||||
|
width: 100%
|
||||||
|
|
||||||
|
min-height: 100%
|
||||||
|
min-width: 100%
|
||||||
|
|
||||||
|
/* Permalink - use to edit and share this gradient: http://colorzilla.com/gradient-editor/#000000+0,45484d+100 */
|
||||||
|
background: #000000; /* Old browsers */
|
||||||
|
background: -moz-linear-gradient(top, #000000 0%, #45484d 100%); /* FF3.6-15 */
|
||||||
|
background: -webkit-linear-gradient(top, #000000 0%,#45484d 100%); /* Chrome10-25,Safari5.1-6 */
|
||||||
|
background: linear-gradient(to bottom, #000000 0%,#45484d 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
|
||||||
|
|
||||||
.tab-content
|
.tab-content
|
||||||
height: calc(100% - 40px)
|
height: calc(100% - 40px)
|
||||||
|
|||||||
@ -33,7 +33,7 @@ Router.route('/', function() {
|
|||||||
// Check user is logged in
|
// Check user is logged in
|
||||||
if (!Meteor.user() || !Meteor.userId()) {
|
if (!Meteor.user() || !Meteor.userId()) {
|
||||||
this.render('entrySignIn', routerOptions);
|
this.render('entrySignIn', routerOptions);
|
||||||
} else{
|
} else {
|
||||||
this.render('worklist', routerOptions);
|
this.render('worklist', routerOptions);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -42,7 +42,7 @@ Router.route('/worklist', function() {
|
|||||||
// Check user is logged in
|
// Check user is logged in
|
||||||
if (!Meteor.user() || !Meteor.userId()) {
|
if (!Meteor.user() || !Meteor.userId()) {
|
||||||
this.render('entrySignIn', routerOptions);
|
this.render('entrySignIn', routerOptions);
|
||||||
} else{
|
} else {
|
||||||
this.render('worklist', routerOptions);
|
this.render('worklist', routerOptions);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
// REFACTOR: Move to ActiveRecord object
|
// REFACTOR: Move to ActiveRecord object
|
||||||
Session.set("defaultSignInMessage", "Improve your clinical practice with checklists.");
|
//Session.set("defaultSignInMessage", "Improve your clinical practice with checklists.");
|
||||||
|
|
||||||
//==================================================================================================
|
//==================================================================================================
|
||||||
// ROUTER
|
// ROUTER
|
||||||
|
|||||||
@ -45,13 +45,26 @@ Meteor.methods({
|
|||||||
},
|
},
|
||||||
|
|
||||||
getFailedAttemptsCount: function(emailAddress) {
|
getFailedAttemptsCount: function(emailAddress) {
|
||||||
return Meteor.users.findOne({"emails.address": emailAddress}).failedPasswordAttempts || 0;
|
// Check if the user actually exists, and if not, stop here
|
||||||
|
var currentUser = Meteor.users.findOne({"emails.address": emailAddress});
|
||||||
|
if (!currentUser) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
return currentUser.failedPasswordAttempts || 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
updateFailedAttempts: function(failedAttemptsParameters) {
|
updateFailedAttempts: function(failedAttemptsParameters) {
|
||||||
var emailAddress = failedAttemptsParameters[0];
|
var emailAddress = failedAttemptsParameters[0];
|
||||||
var failedAttemptsLimit = failedAttemptsParameters[1];
|
var failedAttemptsLimit = failedAttemptsParameters[1];
|
||||||
var failedAttemptCount = Meteor.users.findOne({"emails.address": emailAddress}).failedPasswordAttempts || 0;
|
|
||||||
|
// Check if the user actually exists, and if not, stop here
|
||||||
|
var currentUser = Meteor.users.findOne({"emails.address": emailAddress});
|
||||||
|
if (!currentUser) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var failedAttemptCount = currentUser.failedPasswordAttempts || 0;
|
||||||
if (failedAttemptCount == failedAttemptsLimit) {
|
if (failedAttemptCount == failedAttemptsLimit) {
|
||||||
return failedAttemptCount;
|
return failedAttemptCount;
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@ -0,0 +1,36 @@
|
|||||||
|
Meteor.startup(function() {
|
||||||
|
if (Meteor.isClient){
|
||||||
|
ActiveEntry.configure({
|
||||||
|
logo: {
|
||||||
|
url: '/images/logo.png',
|
||||||
|
displayed: true
|
||||||
|
},
|
||||||
|
signIn: {
|
||||||
|
displayFullName: true,
|
||||||
|
destination: '/worklist'
|
||||||
|
},
|
||||||
|
signUp: {
|
||||||
|
destination: '/worklist'
|
||||||
|
},
|
||||||
|
themeColors: {
|
||||||
|
primary: ''
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Meteor.isServer){
|
||||||
|
Accounts.emailTemplates.siteName = 'AwesomeSite';
|
||||||
|
Accounts.emailTemplates.from = 'AwesomeSite Admin <accounts@example.com>';
|
||||||
|
Accounts.emailTemplates.enrollAccount.subject = function(user) {
|
||||||
|
return 'Welcome to Awesome Town, ' + user.profile.name;
|
||||||
|
};
|
||||||
|
|
||||||
|
Accounts.emailTemplates.enrollAccount.text = function(user, url) {
|
||||||
|
return 'You have been selected to participate in building a better future!'
|
||||||
|
+ ' To activate your account, simply click the link below:\n\n'
|
||||||
|
+ url;
|
||||||
|
};
|
||||||
|
|
||||||
|
process.env.MAIL_URL = 'smtp://sandboxid.mailgun.org:mypassword@smtp.mailgun.org:587';
|
||||||
|
}
|
||||||
|
});
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
#entrySignIn.entryPage,
|
||||||
|
#entrySignUp.entryPage
|
||||||
|
.wrapper-auth
|
||||||
|
.title-auth
|
||||||
|
color: white
|
||||||
|
.entryLogo
|
||||||
|
margin-top: 50px
|
||||||
|
height: 50px
|
||||||
|
width: 50px
|
||||||
|
|
||||||
|
// TODO: Fix theming in active-entry so we don't have to do this
|
||||||
|
.entryPage .wrapper-auth .subtitle-auth
|
||||||
|
color: white !important
|
||||||
@ -0,0 +1,11 @@
|
|||||||
|
Meteor.startup(function() {
|
||||||
|
// TODO: Configure some settings
|
||||||
|
HipaaAuditLog.configure({
|
||||||
|
classes: {
|
||||||
|
input: 'form-control',
|
||||||
|
select: 'form-control',
|
||||||
|
ribbon: ''
|
||||||
|
},
|
||||||
|
highlightColor: '#006289'
|
||||||
|
});
|
||||||
|
});
|
||||||
@ -0,0 +1,2 @@
|
|||||||
|
#hipaaLogPage
|
||||||
|
margin-top: 40px
|
||||||
@ -1,26 +1,39 @@
|
|||||||
<template name="lesionTrackerLayout">
|
<template name="lesionTrackerLayout">
|
||||||
<div class="logoContainer">
|
<div class="logoContainer">
|
||||||
|
<div id="menu" class="row-fluid">
|
||||||
|
{{#if currentUser}}
|
||||||
|
<button type='button' class="btn btn-link dropdown-toggle" data-toggle="dropdown" id="userMenu">
|
||||||
|
{{fullName}} <span class="caret"></span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-right" aria-labelledby="userMenu">
|
||||||
|
<li>
|
||||||
|
<!-- TODO: Move this elsewhere in the Worklist? -->
|
||||||
|
{{ >optionsButton }}
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="audit" id="audit">
|
||||||
|
<i class="fa fa-list-ul"></i> View Audit Log
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="changePassword" id="changePassword">
|
||||||
|
<i class="fa fa-lock"></i> Change Password
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li class="divider"></li>
|
||||||
|
<li>
|
||||||
|
<a href="#" id="logoutButton">
|
||||||
|
<i class="fa fa-power-off"></i>Logout
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
{{/if}}
|
||||||
|
</div>
|
||||||
<a class="navbar-brand" href="http://ohif.org">
|
<a class="navbar-brand" href="http://ohif.org">
|
||||||
<img src="/images/logo.png">
|
<img src="/images/logo.png">
|
||||||
<h4 class="name">Open Health Imaging Foundation</h4>
|
<h4 class="name">Open Health Imaging Foundation</h4>
|
||||||
</a>
|
</a>
|
||||||
{{#if currentUser}}
|
|
||||||
<div id="userProfile" class="row-fluid">
|
|
||||||
<div class="dropdown clearfix">
|
|
||||||
<ul class="nav nav-pills pull-right">
|
|
||||||
<li class="dropdown"><a class="dropdown-toggle" data-toggle="dropdown" href="#">{{fullName}}<b class="caret"></b></a>
|
|
||||||
<ul class="dropdown-menu pull-right">
|
|
||||||
<li><a href="changePassword" id="changePassword"><i class="fa fa-lock"></i>Change Password</a></li>
|
|
||||||
<li class="divider"></li>
|
|
||||||
<li><a href="#" id="logoutButton"><i class="fa fa-power-off"></i>Logout</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{{/if}}
|
|
||||||
</div>
|
</div>
|
||||||
{{> timeoutCountdownDialog}}
|
{{> timeoutCountdownDialog}}
|
||||||
{{ >optionsButton }}
|
|
||||||
{{ >yield }}
|
{{ >yield }}
|
||||||
</template>
|
</template>
|
||||||
@ -1,6 +1,8 @@
|
|||||||
|
Session.set('defaultSignInMessage', 'Tumor tracking in your browser.');
|
||||||
|
|
||||||
Template.lesionTrackerLayout.events({
|
Template.lesionTrackerLayout.events({
|
||||||
'click #logoutButton': function() {
|
'click #logoutButton': function() {
|
||||||
Meteor.logout(function(){
|
Meteor.logout(function() {
|
||||||
Router.go('/entrySignIn');
|
Router.go('/entrySignIn');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
@ -10,7 +12,7 @@ Template.lesionTrackerLayout.events({
|
|||||||
});
|
});
|
||||||
|
|
||||||
Template.lesionTrackerLayout.helpers({
|
Template.lesionTrackerLayout.helpers({
|
||||||
'fullName': function() {
|
fullName: function() {
|
||||||
return Meteor.user().profile.fullName;
|
return Meteor.user().profile.fullName;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@ -18,26 +20,29 @@ Template.lesionTrackerLayout.helpers({
|
|||||||
Template.lesionTrackerLayout.onCreated(function() {
|
Template.lesionTrackerLayout.onCreated(function() {
|
||||||
// Show countdown dialog
|
// Show countdown dialog
|
||||||
var handle;
|
var handle;
|
||||||
$(document).on('TriggerOpenTimeoutCountdownDialog', function (e, leftTime) {
|
$(document).on('TriggerOpenTimeoutCountdownDialog', function(e, leftTime) {
|
||||||
// TODO: Show modal dialog
|
// TODO: Show modal dialog
|
||||||
handle = setInterval(function() {
|
handle = setInterval(function() {
|
||||||
leftTime --;
|
leftTime--;
|
||||||
// Set countdownDialogLeftTime session
|
// Set countdownDialogLeftTime session
|
||||||
Session.set("countdownDialogLeftTime", leftTime);
|
Session.set('countdownDialogLeftTime', leftTime);
|
||||||
|
|
||||||
// Show dialog
|
// Show dialog
|
||||||
if ($("#timeoutCountdownDialog").css("display") == "none") {
|
var dialog = $('#timeoutCountdownDialog');
|
||||||
$("#timeoutCountdownDialog").css("display", "block");
|
if (dialog.css('display') === 'none') {
|
||||||
|
dialog.css('display', 'block');
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
$(document).on('TriggerCloseTimeoutCountdownDialog', function (e) {
|
$(document).on('TriggerCloseTimeoutCountdownDialog', function(e) {
|
||||||
$("#timeoutCountdownDialog").css("display", "none");
|
var dialog = $('#timeoutCountdownDialog');
|
||||||
|
dialog.css('display', 'none');
|
||||||
if (handle) {
|
if (handle) {
|
||||||
clearInterval(handle);
|
clearInterval(handle);
|
||||||
// Close the dialog
|
// Close the dialog
|
||||||
$("#timeoutCountdownDialog").css("display", "none");
|
dialog.css('display', 'none');
|
||||||
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@ -1,19 +1,18 @@
|
|||||||
.logoContainer
|
.logoContainer
|
||||||
position: absolute;
|
position: absolute
|
||||||
height: 40px;
|
height: 40px
|
||||||
top: 0;
|
top: 0
|
||||||
right: 0;
|
right: 0
|
||||||
color: white;
|
padding: 0 10px
|
||||||
|
color: white
|
||||||
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
||||||
width: 15%
|
width: 15%
|
||||||
|
|
||||||
#userProfile
|
#menu
|
||||||
position: relative
|
position: relative
|
||||||
float: right
|
float: right
|
||||||
|
height: 100%
|
||||||
.nav-pills > li > a:hover, .nav .open > a, .nav .open > a:hover, .nav .open > a:focus
|
line-height: 40px
|
||||||
background-color: #eee
|
|
||||||
color: black
|
|
||||||
|
|
||||||
.dropdown-menu > li > a:hover
|
.dropdown-menu > li > a:hover
|
||||||
background-color: #eee
|
background-color: #eee
|
||||||
@ -22,7 +21,10 @@
|
|||||||
margin-right: 5px
|
margin-right: 5px
|
||||||
|
|
||||||
.dropdown-toggle
|
.dropdown-toggle
|
||||||
color: #C1C1C1
|
color: white
|
||||||
|
height: 100%
|
||||||
|
font-size: 12pt
|
||||||
|
font-family: "Sanchez"
|
||||||
|
|
||||||
.divider
|
.divider
|
||||||
height: 2px
|
height: 2px
|
||||||
@ -41,7 +43,7 @@
|
|||||||
height: 30px
|
height: 30px
|
||||||
float: left
|
float: left
|
||||||
margin-right: 10px
|
margin-right: 10px
|
||||||
margin-top: 5px;
|
margin-top: 5px
|
||||||
/* Media queries for iPhone6*/
|
/* Media queries for iPhone6*/
|
||||||
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
||||||
height: 20px
|
height: 20px
|
||||||
@ -51,11 +53,11 @@
|
|||||||
|
|
||||||
h4.name
|
h4.name
|
||||||
float: left
|
float: left
|
||||||
margin: 10px 0;
|
margin: 10px 0
|
||||||
font-family: "Sanchez"
|
font-family: "Sanchez"
|
||||||
color: #C1C1C1
|
color: white
|
||||||
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
|
||||||
font-size: 0.3em
|
font-size: 0.3em
|
||||||
font-size: 0.3em
|
font-size: 0.3em
|
||||||
width: 50%;
|
width: 50%
|
||||||
|
|
||||||
|
|||||||
@ -1,12 +1,9 @@
|
|||||||
<template name="optionsButton">
|
<template name="optionsButton">
|
||||||
<div class="optionsButton">
|
<a href="#"
|
||||||
<a type="button"
|
|
||||||
class="btn btn-default"
|
|
||||||
data-toggle="modal"
|
data-toggle="modal"
|
||||||
data-target="#optionsModal"
|
data-target="#optionsModal"
|
||||||
title="Trial Options">
|
title="Trial Options">
|
||||||
<i class="fa fa-cog fa-lg"></i>
|
<i class="fa fa-cog fa-lg"></i>
|
||||||
Trial Options
|
Trial Options
|
||||||
</a>
|
</a>
|
||||||
</div>
|
|
||||||
</template>
|
</template>
|
||||||
@ -1,6 +0,0 @@
|
|||||||
// These settings are temporary!
|
|
||||||
.optionsButton
|
|
||||||
position: absolute
|
|
||||||
top: 3px
|
|
||||||
right: 350px
|
|
||||||
cursor: pointer
|
|
||||||
@ -58,8 +58,14 @@ Package.onUse(function(api) {
|
|||||||
api.addFiles('client/components/associationModal/associationModal.styl', 'client');
|
api.addFiles('client/components/associationModal/associationModal.styl', 'client');
|
||||||
api.addFiles('client/components/associationModal/associationModal.js', 'client');
|
api.addFiles('client/components/associationModal/associationModal.js', 'client');
|
||||||
|
|
||||||
|
|
||||||
|
api.addFiles('client/components/activeEntry/activeEntry.styl', 'client');
|
||||||
|
api.addFiles('client/components/activeEntry/activeEntry.js', 'client');
|
||||||
|
|
||||||
|
api.addFiles('client/components/hipaaLogPage/hipaaLogPage.styl', 'client');
|
||||||
|
api.addFiles('client/components/hipaaLogPage/hipaaLogPage.js', 'client');
|
||||||
|
|
||||||
api.addFiles('client/components/optionsButton/optionsButton.html', 'client');
|
api.addFiles('client/components/optionsButton/optionsButton.html', 'client');
|
||||||
api.addFiles('client/components/optionsButton/optionsButton.styl', 'client');
|
|
||||||
|
|
||||||
api.addFiles('client/components/optionsModal/optionsModal.html', 'client');
|
api.addFiles('client/components/optionsModal/optionsModal.html', 'client');
|
||||||
api.addFiles('client/components/optionsModal/optionsModal.styl', 'client');
|
api.addFiles('client/components/optionsModal/optionsModal.styl', 'client');
|
||||||
|
|||||||
@ -24,6 +24,17 @@ getStudyMetadata = function(studyInstanceUid, doneCallback, failCallback) {
|
|||||||
// If no study metadata is in the cache variable, we need to retrieve it from
|
// If no study metadata is in the cache variable, we need to retrieve it from
|
||||||
// the server with a call.
|
// the server with a call.
|
||||||
Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) {
|
Meteor.call('GetStudyMetadata', studyInstanceUid, function(error, study) {
|
||||||
|
var hipaaEvent = {
|
||||||
|
eventType: "viewed",
|
||||||
|
userId: Meteor.userId(),
|
||||||
|
userName: Meteor.user().profile.fullName,
|
||||||
|
collectionName: "Study",
|
||||||
|
recordId: studyInstanceUid,
|
||||||
|
patientId: study.patientId,
|
||||||
|
patientName: study.patientName
|
||||||
|
};
|
||||||
|
HipaaLogger.logEvent(hipaaEvent);
|
||||||
|
|
||||||
log.info('worklistStudy getStudyMetadata: ' + studyInstanceUid);
|
log.info('worklistStudy getStudyMetadata: ' + studyInstanceUid);
|
||||||
|
|
||||||
if (error) {
|
if (error) {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user