浏览代码

Merge remote-tracking branch 'origin/master'

Jason Rivard 7 年之前
父节点
当前提交
751490643b

+ 17 - 0
client/src/components/changepassword/type-change-password.component.scss

@@ -87,3 +87,20 @@
     }
   }
 }
+
+[dir="rtl"] {
+  .ias-dialog {
+    &.type-change-password-dialog {
+      .ias-dialog-content {
+        table {
+          .strength-meter {
+            .strength {
+              left: auto;
+              right: 0;
+            }
+          }
+        }
+      }
+    }
+  }
+}

+ 1 - 1
client/src/i18n/translations_en.json

@@ -24,6 +24,7 @@
   "Display_HelpdeskOtpValidation": "Instruct the user to load their mobile authentication app and share the current pass code.",
   "Display_InvalidVerification": "Viewing details only available after a user has been successfully verified",
   "Display_MatchCondition": "Match Condition",
+  "Display_NoResponses": "User does not have responses",
   "Display_PasswordGeneration": "The following passwords have been randomly generated for you.  These passwords are based on real words to make them easier to remember, but have been modified to make them difficult to guess.",
   "Display_PasswordPrompt": "Please type your new password",
   "Display_PleaseWait": "Loading...",
@@ -45,7 +46,6 @@
   "Long_Title_VerificationSend": "Before this user can be selected, the user's identity must be verified.  Please select a verification method.",
   "Placeholder_Search": "Search",
   "Title_ChangePassword": "Change Password",
-  "Title_Details": "Details",
   "Title_DirectReports": "Direct Report(s)",
   "Title_HelpDesk": "Help Desk",
   "Title_HelpDeskCard": "Help Desk Cards",

+ 9 - 2
client/src/modules/helpdesk/helpdesk-detail.component.html

@@ -51,10 +51,17 @@
                     ng-disabled="$ctrl.buttonDisabled('unlock')"
                     ng-if="$ctrl.buttonVisible('unlock')">{{ 'Button_Unlock' | translate }}
         </ias-button>
+
         <ias-button ng-click="$ctrl.clearResponses()"
-                    ng-disabled="$ctrl.buttonDisabled('clearResponses')"
-                    ng-if="$ctrl.buttonVisible('clearResponses')">{{ 'Button_ClearResponses' | translate }}
+                    ng-if="$ctrl.buttonVisible('clearResponses') && !$ctrl.buttonDisabled('clearResponses')">
+            {{ 'Button_ClearResponses' | translate }}
+        </ias-button>
+        <ias-button disabled
+                    ng-attr-title="{{ 'Display_NoResponses' | translate }}"
+                    ng-if="$ctrl.buttonVisible('clearResponses') && $ctrl.buttonDisabled('clearResponses')">
+            {{ 'Button_ClearResponses' | translate }}
         </ias-button>
+
         <ias-button ng-click="$ctrl.clearOtpSecret()"
                     ng-disabled="$ctrl.buttonDisabled('clearOtpSecret')"
                     ng-if="$ctrl.buttonVisible('clearOtpSecret')">{{ 'Button_HelpdeskClearOtpSecret' | translate }}

+ 39 - 1
client/src/modules/helpdesk/helpdesk-detail.component.scss

@@ -146,6 +146,7 @@ help-desk-detail {
     }
 
     > .help-desk-content {
+      flex: 1 1px;
       flex-wrap: nowrap;
       height: 100%;
       margin-top: 15px;
@@ -160,6 +161,7 @@ help-desk-detail {
         flex-shrink: 0;
         height: 100%;
         overflow: auto;
+        padding-right: 17px;
       }
 
       > .tabset-container {
@@ -173,6 +175,7 @@ help-desk-detail {
         }
 
         .tab-panes {
+          flex: 1 1px;
           overflow: auto;
 
           > .ias-tab-pane {
@@ -218,8 +221,43 @@ help-desk-detail {
       }
     }
   }
+
+  @media (min-width: 1050px) {
+    help-desk-detail {
+      > .help-desk-content {
+        > .help-desk-buttons {
+          padding-left: 17px;
+          padding-right: 0;
+        }
+      }
+    }
+  }
+}
+
+// Unlike IE, Edge, and Firefox, Chrome and Safari do not need extra space for the button scrollbar when the buttons
+// extend below the bottom of the page
+@media (min-width: 1050px) {
+  [data-browsertype=webkit] {
+    help-desk-detail {
+      > .help-desk-content {
+        > .help-desk-buttons {
+          padding-right: 0;
+        }
+      }
+    }
+
+    &[dir="rtl"] {
+      help-desk-detail {
+        > .help-desk-content {
+          > .help-desk-buttons {
+            padding-left: 0;
+          }
+        }
+      }
+    }
+  }
 }
 
 .ias-tab-pane.ias-open {
-  display: block;
+  display: block;   // Can remove once https://github.com/MicroFocus/ux-ias/issues/18 (2nd comment) is resolved
 }

+ 11 - 11
client/src/modules/helpdesk/helpdesk-detail.component.ts

@@ -25,7 +25,7 @@ import {Component} from '../../component';
 import {IHelpDeskService, ISuccessResponse} from '../../services/helpdesk.service';
 import {IScope, ui} from 'angular';
 import {noop} from 'angular';
-import {IButtonInfo, IHelpDeskConfigService, PASSWORD_UI_MODES} from '../../services/helpdesk-config.service';
+import {IActionButton, IHelpDeskConfigService, PASSWORD_UI_MODES} from '../../services/helpdesk-config.service';
 import {IPerson} from '../../models/person.model';
 import {IChangePasswordSuccess} from '../../components/changepassword/success-change-password.controller';
 
@@ -46,7 +46,7 @@ const PROFILE_TAB_NAME = 'profileTab';
     templateUrl: require('modules/helpdesk/helpdesk-detail.component.html')
 })
 export default class HelpDeskDetailComponent {
-    customButtons: {[key: string]: IButtonInfo};
+    customButtons: {[key: string]: IActionButton};
     person: any;
     personCard: IPerson;
     photosEnabled: boolean;
@@ -69,6 +69,14 @@ export default class HelpDeskDetailComponent {
     }
 
     $onInit(): void {
+        this.configService.getCustomButtons().then((customButtons: {[key: string]: IActionButton}) => {
+            this.customButtons = customButtons;
+        });
+
+        this.configService.photosEnabled().then((photosEnabled: boolean) => {
+            this.photosEnabled = photosEnabled;
+        });
+
         this.initialize();
     }
 
@@ -265,7 +273,7 @@ export default class HelpDeskDetailComponent {
             });
     }
 
-    clickCustomButton(button: IButtonInfo): void {
+    clickCustomButton(button: IActionButton): void {
         // Custom buttons are never disabled
 
         let userKey = this.getUserKey();
@@ -351,14 +359,6 @@ export default class HelpDeskDetailComponent {
     initialize(): void {
         const personId = this.getUserKey();
 
-        this.configService.photosEnabled().then((photosEnabled: boolean) => {
-            this.photosEnabled = photosEnabled;
-        }); // TODO: always necessary?
-
-        this.configService.getCustomButtons().then((customButtons: {[key: string]: IButtonInfo}) => {
-            this.customButtons = customButtons;
-        });
-
         this.helpDeskService.getPersonCard(personId).then((personCard: IPerson) => {
             this.personCard = personCard;
         });

+ 1 - 1
client/src/modules/helpdesk/helpdesk-search-base.component.ts

@@ -141,7 +141,7 @@ export default abstract class HelpDeskSearchBaseComponent {
                         this.setSearchMessage('Display_SearchResultsNone');
                     }
 
-                    return this.$q.resolve(searchResult);
+                    return searchResult;
                 }.bind(this),
                 function(error) {
                     this.setErrorMessage(error);

+ 29 - 4
client/src/modules/helpdesk/helpdesk-search.component.scss

@@ -21,10 +21,6 @@
  */
 
 
-.verifications-button {
-  margin: 5px 5px 5px 0;
-}
-
 help-desk-search-cards,
 help-desk-search-table {
   display: flex;
@@ -35,6 +31,14 @@ help-desk-search-table {
     margin-bottom: 0;
   }
 
+  .ias-search {
+    margin-right: 10px;
+  }
+
+  .verifications-button {
+    margin: 5px 5px 5px 0;
+  }
+
   > .people-search-component-content {
     flex: 1 1;
     overflow: auto;
@@ -59,3 +63,24 @@ help-desk-search-table {
   height: 25px;
   width: 25px;
 }
+
+[dir="rtl"] {
+  help-desk-search-cards,
+  help-desk-search-table {
+    .ias-search {
+      margin-left: 10px;
+      margin-right: 0;
+    }
+
+    .verifications-button {
+      margin: 5px 0 5px 5px;
+    }
+  }
+
+  .aligned-input {
+    .ias-button {
+      margin-left: 5px;
+      margin-right: 0;
+    }
+  }
+}

+ 1 - 1
client/src/modules/peoplesearch/peoplesearch-base.component.ts

@@ -186,7 +186,7 @@ abstract class PeopleSearchBaseComponent {
                         self.setSearchMessage('Display_SearchResultsNone');
                     }
 
-                    return this.$q.resolve(searchResult);
+                    return searchResult;
                 },
                 (error) => {
                     self.setErrorMessage(error);

+ 18 - 8
client/src/modules/peoplesearch/peoplesearch.scss

@@ -26,6 +26,8 @@ body, html {
 }
 
 body {
+  background-color: transparent;  // Can remove once https://github.com/MicroFocus/ux-ias/issues/22 is resolved
+
   > ui-view {
     box-sizing: border-box;
     display: block;
@@ -69,14 +71,6 @@ body {
   color: #01a9e7;
 }
 
-[dir="rtl"] {
-  .people-search-component {
-    .search-info-container {
-      text-align: right;
-    }
-  }
-}
-
 .ias-avatar {
   background: transparent url('../../../images/user.png') no-repeat center center;
   background-size: contain;
@@ -115,3 +109,19 @@ body {
     }
   }
 }
+
+
+[dir="rtl"] {
+  .ias-search {
+    >.ias-icon-button {
+      right: auto;         // Can remove once https://github.com/MicroFocus/ux-ias/issues/18 is fixed
+    }
+  }
+
+  .help-desk-search-component,
+  .people-search-component {
+    .search-info-container {
+      text-align: right;
+    }
+  }
+}

+ 6 - 3
client/src/services/base-config.service.ts

@@ -23,6 +23,7 @@
 import {IHttpService, ILogService, IPromise, IQService} from 'angular';
 import {IPwmService} from './pwm.service';
 
+const COLUMN_CONFIG = 'searchColumns';
 const PHOTO_ENABLED = 'enablePhoto';
 
 export interface IConfigService {
@@ -39,7 +40,9 @@ export abstract class ConfigBaseService implements IConfigService {
                 protected pwmService: IPwmService) {
     }
 
-    abstract getColumnConfig(): IPromise<any>;
+    getColumnConfig(): IPromise<any> {
+        return this.getValue(COLUMN_CONFIG);
+    }
 
     private getEndpointValue(endpoint: string, key: string): IPromise<any> {
         return this.$http
@@ -49,7 +52,7 @@ export abstract class ConfigBaseService implements IConfigService {
                     return this.handlePwmError(response);
                 }
 
-                return this.$q.resolve(response.data['data'][key]);
+                return response.data['data'][key];
             }, this.handleHttpError);
     }
 
@@ -71,6 +74,6 @@ export abstract class ConfigBaseService implements IConfigService {
 
     photosEnabled(): IPromise<boolean> {
         return this.getValue(PHOTO_ENABLED)
-            .then(null, () => { return this.$q.resolve(true); }); // On error use default
+            .then(null, () => { return true; }); // On error use default
     }
 }

+ 2 - 2
client/src/services/helpdesk-config.service.dev.ts

@@ -25,7 +25,7 @@ import { IPromise, IQService } from 'angular';
 import {ConfigBaseService} from './base-config.service.dev';
 import {IConfigService} from './base-config.service';
 import {
-    IButtonInfo,
+    IActionButton,
     IHelpDeskConfigService, IVerificationMap, PASSWORD_UI_MODES, TOKEN_CHOICE, VERIFICATION_METHOD_LABELS,
     VERIFICATION_METHOD_NAMES
 } from './helpdesk-config.service';
@@ -51,7 +51,7 @@ export default class HelpDeskConfigService extends ConfigBaseService implements
         });
     }
 
-    getCustomButtons(): IPromise<{[key: string]: IButtonInfo}> {
+    getCustomButtons(): IPromise<{[key: string]: IActionButton}> {
         return this.$q.resolve({
             'Clone User': {
                 name: 'Clone User',

+ 1 - 0
client/src/services/helpdesk-config.service.test-data.ts

@@ -1,3 +1,4 @@
+
 /*
  * Password Management Servlets (PWM)
  * http://www.pwm-project.org

+ 8 - 14
client/src/services/helpdesk-config.service.ts

@@ -27,7 +27,6 @@ import PwmService from './pwm.service';
 import {ConfigBaseService, IConfigService} from './base-config.service';
 
 const CLEAR_RESPONSES_CONFIG = 'clearResponses';
-const COLUMN_CONFIG = 'searchColumns';
 const CUSTOM_BUTTON_CONFIG = 'actions';
 const MASK_PASSWORDS_CONFIG = 'maskPasswords';
 const PASSWORD_UI_MODE_CONFIG = 'pwUiMode';
@@ -61,10 +60,6 @@ export const VERIFICATION_METHOD_LABELS = {
     OTP: 'Button_OTP'
 };
 
-export interface IActionButtons {
-    [key: string]: {name: string, description: string};
-}
-
 interface IVerificationResponse {
     optional: string[];
     required: string[];
@@ -72,14 +67,14 @@ interface IVerificationResponse {
 
 export type IVerificationMap = {name: string, label: string}[];
 
-export interface IButtonInfo {
+export interface IActionButton {
     description: string;
     name: string;
 }
 
 export interface IHelpDeskConfigService extends IConfigService {
     getClearResponsesSetting(): IPromise<string>;
-    getCustomButtons(): IPromise<{[key: string]: IButtonInfo}>;
+    getCustomButtons(): IPromise<{[key: string]: IActionButton}>;
     getPasswordUiMode(): IPromise<string>;
     getTokenSendMethod(): IPromise<string>;
     getVerificationAttributes(): IPromise<IVerificationMap>;
@@ -99,11 +94,7 @@ export default class HelpDeskConfigService extends ConfigBaseService implements
         return this.getValue(CLEAR_RESPONSES_CONFIG);
     }
 
-    getColumnConfig(): IPromise<any> {
-        return this.getValue(COLUMN_CONFIG);
-    }
-
-    getCustomButtons(): IPromise<{[key: string]: IButtonInfo}> {
+    getCustomButtons(): IPromise<{[key: string]: IActionButton}> {
         return this.getValue(CUSTOM_BUTTON_CONFIG);
     }
 
@@ -133,9 +124,12 @@ export default class HelpDeskConfigService extends ConfigBaseService implements
         ]);
 
         return promise.then((result) => {
-            let availableMethods: string[] = result[0].required;
+            let availableMethods: string[];
             if (options && options.includeOptional) {
-                availableMethods = Array.from(new Set([].concat(result[0].required, result[0].optional)));
+                availableMethods = result[0].optional;
+            }
+            else {
+                availableMethods = result[0].required;
             }
 
             let tokenSendMethod: string = result[1];

+ 14 - 14
client/src/services/helpdesk.service.ts

@@ -116,7 +116,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: any) => {
-                return this.$q.resolve(result.data);
+                return result.data;
             });
     }
 
@@ -127,7 +127,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -138,7 +138,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, {})
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -150,7 +150,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -161,7 +161,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, {})
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -177,7 +177,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, {})
             .then((result: any) => {
-                return this.$q.resolve(result.data);
+                return result.data;
             });
     }
 
@@ -188,7 +188,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, {})
             .then((result: any) => {
-                return this.$q.resolve(result.data);
+                return result.data;
             });
     }
 
@@ -201,7 +201,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: { data: IRandomPasswordResponse }) => {
-                return this.$q.resolve(result.data);
+                return result.data;
             });
     }
 
@@ -219,7 +219,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: any) => {
-                return this.$q.resolve(result.data.records);
+                return result.data.records;
             });
     }
 
@@ -240,7 +240,7 @@ export default class HelpDeskService implements IHelpDeskService {
             .then((result: any) => {
                 let receivedData: any = result.data;
                 let searchResult: SearchResult = new SearchResult(receivedData);
-                return this.$q.resolve(searchResult);
+                return searchResult;
             });
     }
 
@@ -255,7 +255,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: IVerificationTokenResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -272,7 +272,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, { data: data })
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -283,7 +283,7 @@ export default class HelpDeskService implements IHelpDeskService {
         return this.pwmService
             .httpRequest(url, {})
             .then((result: ISuccessResponse) => {
-                return this.$q.resolve(result);
+                return result;
             });
     }
 
@@ -311,7 +311,7 @@ export default class HelpDeskService implements IHelpDeskService {
                     this.localStorageService.keys.VERIFICATION_STATE,
                     validationStatus.verificationState
                 );
-                return this.$q.resolve(validationStatus);
+                return validationStatus;
             });
     }
 

+ 1 - 1
client/src/services/password.service.ts

@@ -67,7 +67,7 @@ export default class PasswordService implements IPasswordService {
         return this.pwmService
             .httpRequest(url, {data: data})
             .then((result: { data: IValidatePasswordData }) => {
-                return this.$q.resolve(result.data);
+                return result.data;
             });
     }
 }

+ 3 - 3
client/src/services/people.service.dev.ts

@@ -70,10 +70,10 @@ export default class PeopleService implements IPeopleService {
                 people = people.sort((person1, person2) => person1._displayName.localeCompare(person2._displayName));
 
                 if (people && people.length > 10) {
-                    return this.$q.resolve(people.slice(0, 10));
+                    return people.slice(0, 10);
                 }
 
-                return this.$q.resolve(people);
+                return people;
             });
     }
 
@@ -119,7 +119,7 @@ export default class PeopleService implements IPeopleService {
     getNumberOfDirectReports(personId: string): IPromise<number> {
         return this.getDirectReports(personId)
             .then((directReports: IPerson[]) => {
-                return this.$q.resolve(directReports.length);
+                return directReports.length;
             });
     }
 

+ 9 - 9
client/src/services/people.service.ts

@@ -69,10 +69,10 @@ export default class PeopleService implements IPeopleService {
                 let people = searchResult.people;
 
                 if (people && people.length > 10) {
-                    return this.$q.resolve(people.slice(0, 10));
+                    return people.slice(0, 10);
                 }
 
-                return this.$q.resolve(people);
+                return people;
             });
     }
 
@@ -85,13 +85,13 @@ export default class PeopleService implements IPeopleService {
                 people.push(person);
             }
 
-            return this.$q.resolve(people);
+            return people;
         });
     }
 
     getNumberOfDirectReports(id: string): IPromise<number> {
         return this.getDirectReports(id).then((people: IPerson[]) => {
-            return this.$q.resolve(people.length);
+            return people.length;
         });
     }
 
@@ -109,7 +109,7 @@ export default class PeopleService implements IPeopleService {
                     return this.getManagerRecursive(orgChartData.manager.userKey, people, managementChainLimit);
                 }
 
-                return this.$q.resolve(people);
+                return people;
             });
     }
 
@@ -143,12 +143,12 @@ export default class PeopleService implements IPeopleService {
                     const children = responseData['children'].map((child: any) => <IPerson>(child));
                     const self = <IPerson>(responseData['self']);
 
-                    return this.$q.resolve({
+                    return {
                         manager: manager,
                         children: children,
                         self: self,
                         assistant: assistant
-                    });
+                    };
                 },
                 this.handleHttpError.bind(this));
     }
@@ -171,7 +171,7 @@ export default class PeopleService implements IPeopleService {
                 }
 
                 let person: IPerson = <IPerson>(response.data['data']);
-                return this.$q.resolve(person);
+                return person;
             },
             this.handleHttpError.bind(this));
 
@@ -206,7 +206,7 @@ export default class PeopleService implements IPeopleService {
                 let receivedData: any = response.data['data'];
                 let searchResult: SearchResult = new SearchResult(receivedData);
 
-                return this.$q.resolve(searchResult);
+                return searchResult;
             },
             this.handleHttpError.bind(this));
 

+ 1 - 6
client/src/services/peoplesearch-config.service.ts

@@ -26,7 +26,6 @@ import IPwmService from './pwm.service';
 import PwmService from './pwm.service';
 import {ConfigBaseService, IConfigService} from './base-config.service';
 
-const COLUMN_CONFIG = 'searchColumns';
 const ORGCHART_ENABLED = 'orgChartEnabled';
 const ORGCHART_MAX_PARENTS = 'orgChartMaxParents';
 const ORGCHART_SHOW_CHILD_COUNT = 'orgChartShowChildCount';
@@ -46,17 +45,13 @@ export default class PeopleSearchConfigService
         super($http, $log, $q, pwmService);
     }
 
-    getColumnConfig(): IPromise<any> {
-        return this.getValue(COLUMN_CONFIG);
-    }
-
     getOrgChartMaxParents(): IPromise<number> {
         return this.getValue(ORGCHART_MAX_PARENTS);
     }
 
     orgChartEnabled(): IPromise<boolean> {
         return this.getValue(ORGCHART_ENABLED)
-            .then(null, () => { return this.$q.resolve(true); }); // On error use default
+            .then(null, () => { return true; }); // On error use default
     }
 
     orgChartShowChildCount(): IPromise<boolean> {

+ 1 - 1
client/src/services/pwm.service.ts

@@ -116,7 +116,7 @@ export default class PwmService implements IPwmService {
 
                 // Since we can't make assumptions about the structure, we just need to return the whole response.data
                 // payload:
-                return this.$q.resolve(response.data);
+                return <T>response.data;
             });
 
         return promise;

+ 4 - 0
server/src/main/java/password/pwm/i18n/Display.java

@@ -111,10 +111,12 @@ public enum Display implements PwmDisplayBundle
     Display_Login,
     Display_LoginPasswordOnly,
     Display_Logout,
+    Display_MatchCondition,
     Display_Minute,
     Display_Minutes,
     Display_NewUser,
     Display_NewUserProfile,
+    Display_NoResponses,
     Display_PasswordExpired,
     Display_PasswordGeneration,
     Display_PasswordNoExpire,
@@ -278,6 +280,8 @@ public enum Display implements PwmDisplayBundle
     Title_GuestRegistration,
     Title_GuestUpdate,
     Title_Helpdesk,
+    Title_HelpDeskCard,
+    Title_HelpDeskTable,
     Title_LocaleSelect,
     Title_Login,
     Title_Logout,

+ 4 - 0
server/src/main/resources/password/pwm/i18n/Display.properties

@@ -107,6 +107,7 @@ Display_Login=
 Display_LoginPasswordOnly=Please enter your password below.  Your current password is required to access this application.
 Display_Logout=You are now signed out.
 Display_LogoutPublic=Your session has timed out due to inactivity.
+Display_MatchCondition=Match Condition
 Display_Minute=minute
 Display_Minutes=minutes
 Display_NAAF_PASSWORD=Please provide your NAAF authentication password.
@@ -121,6 +122,7 @@ Display_NAAF_HOTP=Please enter your HOTP value.
 Display_NAAF_VOICE=The voice verification process has started.  Please continue when complete.
 Display_NewUser=To register a new account, please complete the following form.
 Display_NewUserProfile=To register a new account, please select a profile.
+Display_NoResponses=User does not have responses
 Display_PasswordExpired=Your password has expired.  You must set a new password now.
 Display_PasswordGeneration=The following passwords have been randomly generated for you.  These passwords are based on real words to make them easier to remember, but have been modified to make them difficult to guess.
 Display_PasswordNoExpire=Your password does not expire.
@@ -296,6 +298,8 @@ Title_ForgottenUsername=Forgotten User Name
 Title_GuestRegistration=Guest Registration
 Title_GuestUpdate=Update Guest User
 Title_Helpdesk=Help Desk
+Title_HelpDeskCard=Help Desk Cards
+Title_HelpDeskTable=Help Desk Table
 Title_LocaleSelect=Locale Selection
 Title_Login=Please Sign in
 Title_Logout=Sign out