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 // 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)

View File

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

View File

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

View File

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

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

View File

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

View File

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

View File

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

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.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');

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 // 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) {