Style and bug fixes related to active-entry and hipaaAuditLog integration

This commit is contained in:
Erik Ziegler 2016-02-15 14:36:01 +01:00
parent 3223da4358
commit 11e300f013
15 changed files with 186 additions and 65 deletions

View File

@ -1,6 +1,24 @@
// TODO: Move all of this into the LesionTracker package
html
height: 100%
width: 100%
min-height: 100%
min-width: 100%
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
height: calc(100% - 40px)

View File

@ -33,7 +33,7 @@ Router.route('/', function() {
// Check user is logged in
if (!Meteor.user() || !Meteor.userId()) {
this.render('entrySignIn', routerOptions);
} else{
} else {
this.render('worklist', routerOptions);
}
});
@ -42,7 +42,7 @@ Router.route('/worklist', function() {
// Check user is logged in
if (!Meteor.user() || !Meteor.userId()) {
this.render('entrySignIn', routerOptions);
} else{
} else {
this.render('worklist', routerOptions);
}
});

View File

@ -1,6 +1,6 @@
// REFACTOR: Move to ActiveRecord object
Session.set("defaultSignInMessage", "Improve your clinical practice with checklists.");
//Session.set("defaultSignInMessage", "Improve your clinical practice with checklists.");
//==================================================================================================
// ROUTER

View File

@ -45,13 +45,26 @@ Meteor.methods({
},
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) {
var emailAddress = failedAttemptsParameters[0];
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) {
return failedAttemptCount;
} else {

View File

@ -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';
}
});

View File

@ -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

View File

@ -0,0 +1,11 @@
Meteor.startup(function() {
// TODO: Configure some settings
HipaaAuditLog.configure({
classes: {
input: 'form-control',
select: 'form-control',
ribbon: ''
},
highlightColor: '#006289'
});
});

View File

@ -0,0 +1,2 @@
#hipaaLogPage
margin-top: 40px

View File

@ -1,26 +1,39 @@
<template name="lesionTrackerLayout">
<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">
<img src="/images/logo.png">
<h4 class="name">Open Health Imaging Foundation</h4>
</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>
{{> timeoutCountdownDialog}}
{{ >optionsButton }}
{{ >yield }}
</template>

View File

@ -1,6 +1,8 @@
Session.set('defaultSignInMessage', 'Tumor tracking in your browser.');
Template.lesionTrackerLayout.events({
'click #logoutButton': function() {
Meteor.logout(function(){
Meteor.logout(function() {
Router.go('/entrySignIn');
});
},
@ -10,7 +12,7 @@ Template.lesionTrackerLayout.events({
});
Template.lesionTrackerLayout.helpers({
'fullName': function() {
fullName: function() {
return Meteor.user().profile.fullName;
}
});
@ -18,27 +20,30 @@ Template.lesionTrackerLayout.helpers({
Template.lesionTrackerLayout.onCreated(function() {
// Show countdown dialog
var handle;
$(document).on('TriggerOpenTimeoutCountdownDialog', function (e, leftTime) {
$(document).on('TriggerOpenTimeoutCountdownDialog', function(e, leftTime) {
// TODO: Show modal dialog
handle = setInterval(function() {
leftTime --;
leftTime--;
// Set countdownDialogLeftTime session
Session.set("countdownDialogLeftTime", leftTime);
Session.set('countdownDialogLeftTime', leftTime);
// Show dialog
if ($("#timeoutCountdownDialog").css("display") == "none") {
$("#timeoutCountdownDialog").css("display", "block");
var dialog = $('#timeoutCountdownDialog');
if (dialog.css('display') === 'none') {
dialog.css('display', 'block');
}
}, 1000);
});
$(document).on('TriggerCloseTimeoutCountdownDialog', function (e) {
$("#timeoutCountdownDialog").css("display", "none");
$(document).on('TriggerCloseTimeoutCountdownDialog', function(e) {
var dialog = $('#timeoutCountdownDialog');
dialog.css('display', 'none');
if (handle) {
clearInterval(handle);
// Close the dialog
$("#timeoutCountdownDialog").css("display", "none");
dialog.css('display', 'none');
}
});
});
});

View File

@ -1,19 +1,18 @@
.logoContainer
position: absolute;
height: 40px;
top: 0;
right: 0;
color: white;
position: absolute
height: 40px
top: 0
right: 0
padding: 0 10px
color: white
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
width: 15%
#userProfile
#menu
position: relative
float: right
.nav-pills > li > a:hover, .nav .open > a, .nav .open > a:hover, .nav .open > a:focus
background-color: #eee
color: black
height: 100%
line-height: 40px
.dropdown-menu > li > a:hover
background-color: #eee
@ -22,7 +21,10 @@
margin-right: 5px
.dropdown-toggle
color: #C1C1C1
color: white
height: 100%
font-size: 12pt
font-family: "Sanchez"
.divider
height: 2px
@ -41,7 +43,7 @@
height: 30px
float: left
margin-right: 10px
margin-top: 5px;
margin-top: 5px
/* Media queries for iPhone6*/
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
height: 20px
@ -51,11 +53,11 @@
h4.name
float: left
margin: 10px 0;
margin: 10px 0
font-family: "Sanchez"
color: #C1C1C1
color: white
@media only screen and (min-device-width : 375px) and (max-device-width : 667px) and (orientation : portrait)
font-size: 0.3em
font-size: 0.3em
width: 50%;
width: 50%

View File

@ -1,12 +1,9 @@
<template name="optionsButton">
<div class="optionsButton">
<a type="button"
class="btn btn-default"
data-toggle="modal"
data-target="#optionsModal"
title="Trial Options">
<i class="fa fa-cog fa-lg"></i>
Trial Options
</a>
</div>
<a href="#"
data-toggle="modal"
data-target="#optionsModal"
title="Trial Options">
<i class="fa fa-cog fa-lg"></i>
Trial Options
</a>
</template>

View File

@ -1,6 +0,0 @@
// These settings are temporary!
.optionsButton
position: absolute
top: 3px
right: 350px
cursor: pointer

View File

@ -58,8 +58,14 @@ Package.onUse(function(api) {
api.addFiles('client/components/associationModal/associationModal.styl', '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.styl', 'client');
api.addFiles('client/components/optionsModal/optionsModal.html', 'client');
api.addFiles('client/components/optionsModal/optionsModal.styl', 'client');

View File

@ -24,6 +24,17 @@ getStudyMetadata = function(studyInstanceUid, doneCallback, failCallback) {
// If no study metadata is in the cache variable, we need to retrieve it from
// the server with a call.
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);
if (error) {