Explorar o código

Merge remote-tracking branch 'origin/master'

Jason Rivard %!s(int64=7) %!d(string=hai) anos
pai
achega
e9760d1d14
Modificáronse 33 ficheiros con 417 adicións e 650 borrados
  1. 117 117
      client/package-lock.json
  2. 2 2
      client/package.json
  3. 1 1
      client/src/changepassword/random-change-password.component.html
  4. 0 2
      client/src/changepassword/random-change-password.controller.ts
  5. 1 1
      client/src/changepassword/success-change-password.component.html
  6. 0 2
      client/src/changepassword/success-change-password.controller.ts
  7. 17 10
      client/src/changepassword/type-change-password.component.html
  8. 38 15
      client/src/changepassword/type-change-password.component.scss
  9. 1 8
      client/src/changepassword/type-change-password.controller.ts
  10. 89 80
      client/src/helpdesk/helpdesk-detail.component.html
  11. 16 2
      client/src/helpdesk/helpdesk-detail.component.scss
  12. 17 33
      client/src/helpdesk/helpdesk-detail.component.ts
  13. 2 5
      client/src/helpdesk/helpdesk-search-cards.component.html
  14. 2 5
      client/src/helpdesk/helpdesk-search-table.component.html
  15. 5 1
      client/src/helpdesk/helpdesk-search.component.scss
  16. 1 1
      client/src/helpdesk/verifications-dialog.controller.ts
  17. 6 3
      client/src/helpdesk/verifications-dialog.template.html
  18. 2 5
      client/src/i18n/translations_en.json
  19. 7 13
      client/src/peoplesearch/orgchart-search.component.html
  20. 4 0
      client/src/peoplesearch/orgchart-search.component.scss
  21. 6 16
      client/src/peoplesearch/orgchart-search.component.ts
  22. 38 8
      client/src/peoplesearch/orgchart.component.scss
  23. 4 0
      client/src/peoplesearch/peoplesearch-cards.component.scss
  24. 4 0
      client/src/peoplesearch/peoplesearch-table.component.scss
  25. 6 0
      client/src/peoplesearch/peoplesearch.scss
  26. 12 15
      client/src/peoplesearch/person-card.component.html
  27. 0 270
      client/src/peoplesearch/person-card.component.scss
  28. 0 1
      client/src/peoplesearch/person-card.component.ts
  29. 5 5
      client/src/services/helpdesk-config.service.ts
  30. 2 2
      client/src/services/helpdesk.service.ts
  31. 10 4
      client/src/services/password.service.ts
  32. 0 22
      npm-debug.log
  33. 2 1
      server/src/main/webapp/public/resources/mobileStyle.css

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 117 - 117
client/package-lock.json


+ 2 - 2
client/package.json

@@ -20,8 +20,8 @@
     "dependencies": {},
     "dependencies": {},
     "devDependencies": {
     "devDependencies": {
         "@microfocus/ias-icons": "1.0.0-alpha",
         "@microfocus/ias-icons": "1.0.0-alpha",
-        "@microfocus/ng-ias": "1.0.0-alpha1",
-        "@microfocus/ux-ias": "1.0.0-alpha",
+        "@microfocus/ux-ias": "1.0.0-alpha.1",
+        "@microfocus/ng-ias": "1.0.0-alpha.2",
         "@types/angular": "1.6.42",
         "@types/angular": "1.6.42",
         "@types/angular-mocks": "1.5.11",
         "@types/angular-mocks": "1.5.11",
         "@types/angular-translate": "2.15.1",
         "@types/angular-translate": "2.15.1",

+ 1 - 1
client/src/changepassword/random-change-password.component.html

@@ -23,7 +23,7 @@
 <div class="ias-dialog random-change-password-dialog">
 <div class="ias-dialog random-change-password-dialog">
     <div class="ias-dialog-container">
     <div class="ias-dialog-container">
         <div class="ias-dialog-label">
         <div class="ias-dialog-label">
-            <div class="ias-title" ng-bind="('Title_ChangePassword' | translate) + ': ' + $ctrl.personUsername"></div>
+            <div class="ias-title" ng-bind="'Title_ChangePassword' | translate"></div>
         </div>
         </div>
 
 
         <div class="ias-dialog-content">
         <div class="ias-dialog-content">

+ 0 - 2
client/src/changepassword/random-change-password.controller.ts

@@ -29,13 +29,11 @@ export default class RandomChangePasswordController {
     static $inject = [
     static $inject = [
         'HelpDeskService',
         'HelpDeskService',
         'IasDialogService',
         'IasDialogService',
-        'personUsername',
         'personUserKey',
         'personUserKey',
         'translateFilter'
         'translateFilter'
     ];
     ];
     constructor(private HelpDeskService: IHelpDeskService,
     constructor(private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
                 private IasDialogService: any,
-                private personUsername: string,
                 private personUserKey: string,
                 private personUserKey: string,
                 private translateFilter: (id: string) => string) {
                 private translateFilter: (id: string) => string) {
     }
     }

+ 1 - 1
client/src/changepassword/success-change-password.component.html

@@ -23,7 +23,7 @@
 <div class="ias-dialog success-change-password-dialog">
 <div class="ias-dialog success-change-password-dialog">
     <div class="ias-dialog-container">
     <div class="ias-dialog-container">
         <div class="ias-dialog-label">
         <div class="ias-dialog-label">
-            <div class="ias-title" ng-bind="('Title_ChangePassword' | translate) + ' - ' + $ctrl.personUsername"></div>
+            <div class="ias-title" ng-bind="'Title_ChangePassword' | translate"></div>
         </div>
         </div>
 
 
         <div class="ias-dialog-content">
         <div class="ias-dialog-content">

+ 0 - 2
client/src/changepassword/success-change-password.controller.ts

@@ -43,7 +43,6 @@ export default class SuccessChangePasswordController {
         'ConfigService',
         'ConfigService',
         'HelpDeskService',
         'HelpDeskService',
         'IasDialogService',
         'IasDialogService',
-        'personUsername',
         'personUserKey',
         'personUserKey',
         'translateFilter'
         'translateFilter'
     ];
     ];
@@ -52,7 +51,6 @@ export default class SuccessChangePasswordController {
                 private configService: IHelpDeskConfigService,
                 private configService: IHelpDeskConfigService,
                 private HelpDeskService: IHelpDeskService,
                 private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
                 private IasDialogService: any,
-                private personUsername: string,
                 private personUserKey: string,
                 private personUserKey: string,
                 private translateFilter: (id: string) => string) {
                 private translateFilter: (id: string) => string) {
         this.password = changePasswordSuccessData.password;
         this.password = changePasswordSuccessData.password;

+ 17 - 10
client/src/changepassword/type-change-password.component.html

@@ -23,7 +23,7 @@
 <div class="ias-dialog type-change-password-dialog">
 <div class="ias-dialog type-change-password-dialog">
     <div class="ias-dialog-container">
     <div class="ias-dialog-container">
         <div class="ias-dialog-label">
         <div class="ias-dialog-label">
-            <div class="ias-title" ng-bind="('Title_ChangePassword' | translate) + ' - ' + $ctrl.personUsername"></div>
+            <div class="ias-title" ng-bind="'Title_ChangePassword' | translate"></div>
         </div>
         </div>
         <div class="ias-dialog-content">
         <div class="ias-dialog-content">
             <p ng-bind="$ctrl.message"></p>
             <p ng-bind="$ctrl.message"></p>
@@ -36,12 +36,15 @@
                         <input ng-model="$ctrl.password1" ng-show="$ctrl.passwordMasked" type="password">
                         <input ng-model="$ctrl.password1" ng-show="$ctrl.passwordMasked" type="password">
                     </td>
                     </td>
                     <td>
                     <td>
-                        <div ng-if="$ctrl.showStrengthMeter">
-                            <ias-icon icon="strength1" ng-show="$ctrl.strength===1"></ias-icon>
-                            <ias-icon icon="strength2" ng-show="$ctrl.strength===2"></ias-icon>
-                            <ias-icon icon="strength3" ng-show="$ctrl.strength===3"></ias-icon>
-                            <ias-icon icon="strength4" ng-show="$ctrl.strength===4"></ias-icon>
-                            <ias-icon icon="strength5" ng-show="$ctrl.strength===5"></ias-icon>
+                        <div class="strength-meter"
+                             ng-attr-title="{{ 'Display_StrengthMeter' | translate }}"
+                             ng-if="$ctrl.showStrengthMeter">
+                            <ias-icon class="strength-base" icon="strength5"></ias-icon>
+                            <ias-icon class="strength" icon="strength1" ng-show="$ctrl.strength===1"></ias-icon>
+                            <ias-icon class="strength" icon="strength2" ng-show="$ctrl.strength===2"></ias-icon>
+                            <ias-icon class="strength" icon="strength3" ng-show="$ctrl.strength===3"></ias-icon>
+                            <ias-icon class="strength" icon="strength4" ng-show="$ctrl.strength===4"></ias-icon>
+                            <ias-icon class="strength" icon="strength5" ng-show="$ctrl.strength===5"></ias-icon>
                         </div>
                         </div>
                     </td>
                     </td>
                 </tr>
                 </tr>
@@ -58,8 +61,12 @@
                         </div>
                         </div>
                     </td>
                     </td>
                     <td>
                     <td>
-                        <ias-icon icon="status_ok_thin" ng-show="$ctrl.matchStatus==='MATCH'"></ias-icon>
-                        <ias-icon icon="message_error_thick" ng-show="$ctrl.matchStatus==='NO_MATCH'"></ias-icon>
+                        <ias-icon icon="status_ok_thin"
+                                  ng-attr-title="{{ 'Display_MatchCondition' | translate }}"
+                                  ng-show="$ctrl.matchStatus==='MATCH'"></ias-icon>
+                        <ias-icon icon="message_error_thick"
+                                  ng-attr-title="{{ 'Display_MatchCondition' | translate }}"
+                                  ng-show="$ctrl.matchStatus==='NO_MATCH'"></ias-icon>
                     </td>
                     </td>
                 </tr>
                 </tr>
                 </tbody>
                 </tbody>
@@ -70,7 +77,7 @@
                         ng-disabled="!$ctrl.passwordAcceptable">{{ 'Button_ChangePassword' | translate }}
                         ng-disabled="!$ctrl.passwordAcceptable">{{ 'Button_ChangePassword' | translate }}
             </ias-button>
             </ias-button>
             <ias-button ng-click="$ctrl.onClickRandomPasswords()"
             <ias-button ng-click="$ctrl.onClickRandomPasswords()"
-                        ng-if="$ctrl.passwordUiMode === 'BOTH'">{{ 'Title_RandomPasswords' | translate }}
+                        ng-if="$ctrl.passwordUiMode === 'both'">{{ 'Title_RandomPasswords' | translate }}
             </ias-button>
             </ias-button>
         </div>
         </div>
 
 

+ 38 - 15
client/src/changepassword/type-change-password.component.scss

@@ -24,13 +24,18 @@
   &.type-change-password-dialog {
   &.type-change-password-dialog {
     .ias-dialog-content {
     .ias-dialog-content {
       table {
       table {
+        border: none;
+        margin-left: 0;
+        margin-right: 0;
+        width: auto;
+
         input {
         input {
           margin: 7px;
           margin: 7px;
           vertical-align: middle;
           vertical-align: middle;
         }
         }
 
 
         td {
         td {
-          min-width: 250px;
+          border: none;
         }
         }
 
 
         .ias-icon-message_error_thick {
         .ias-icon-message_error_thick {
@@ -41,24 +46,42 @@
           color: #37c26a;
           color: #37c26a;
         }
         }
 
 
-        .ias-icon-strength1 {
-          color: #e50000;
-        }
+        .strength-meter {
+          position: relative;
 
 
-        .ias-icon-strength2 {
-          color: #f17e12;
-        }
+          .ias-icon {
+            font-size: 35px;
+          }
 
 
-        .ias-icon-strength3 {
-          color: #ffd92d;
-        }
+          .strength {
+            position: absolute;
+            left: 0;
+            top: 0;
 
 
-        .ias-icon-strength4 {
-          color: #01a9e7;
-        }
+            &.ias-icon-strength1 {
+              color: #e50000;
+            }
 
 
-        .ias-icon-strength5 {
-          color: #37c26a;
+            &.ias-icon-strength2 {
+              color: #f17e12;
+            }
+
+            &.ias-icon-strength3 {
+              color: #ffd92d;
+            }
+
+            &.ias-icon-strength4 {
+              color: #01a9e7;
+            }
+
+            &.ias-icon-strength5 {
+              color: #37c26a;
+            }
+          }
+
+          .strength-base {
+            color: #dae1e1;
+          }
         }
         }
       }
       }
     }
     }

+ 1 - 8
client/src/changepassword/type-change-password.controller.ts

@@ -53,12 +53,10 @@ export default class TypeChangePasswordController {
         '$q',
         '$q',
         '$scope',
         '$scope',
         '$timeout',
         '$timeout',
-        '$window',
         'ConfigService',
         'ConfigService',
         'HelpDeskService',
         'HelpDeskService',
         'IasDialogService',
         'IasDialogService',
         'PasswordService',
         'PasswordService',
-        'personUsername',
         'personUserKey',
         'personUserKey',
         'PwmService',
         'PwmService',
         'translateFilter'
         'translateFilter'
@@ -67,12 +65,10 @@ export default class TypeChangePasswordController {
                 private $q: IQService,
                 private $q: IQService,
                 private $scope: IScope,
                 private $scope: IScope,
                 private $timeout: ITimeoutService,
                 private $timeout: ITimeoutService,
-                private $window: IWindowService,
                 private configService: IHelpDeskConfigService,
                 private configService: IHelpDeskConfigService,
                 private HelpDeskService: IHelpDeskService,
                 private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
                 private IasDialogService: any,
                 private passwordService: IPasswordService,
                 private passwordService: IPasswordService,
-                private personUsername: string,
                 private personUserKey: string,
                 private personUserKey: string,
                 private pwmService: IPwmService,
                 private pwmService: IPwmService,
                 private translateFilter: (id: string) => string) {
                 private translateFilter: (id: string) => string) {
@@ -142,16 +138,14 @@ export default class TypeChangePasswordController {
         if (this.pendingValidation) {
         if (this.pendingValidation) {
             return;
             return;
         }
         }
-
         this.pendingValidation = true;
         this.pendingValidation = true;
 
 
-
         this.passwordService.validatePassword(this.password1, this.password2, this.personUserKey)
         this.passwordService.validatePassword(this.password1, this.password2, this.personUserKey)
             .then(
             .then(
                 (data: IValidatePasswordData) => {
                 (data: IValidatePasswordData) => {
                     this.pendingValidation = false;
                     this.pendingValidation = false;
                     if (data.version !== 2) {
                     if (data.version !== 2) {
-                        // TODO: error message - '[ unexpected version string from server ]'
+                        throw new Error('[ unexpected version string from server ]');
                     }
                     }
 
 
                     this.passwordAcceptable = data.passed && data.match === 'MATCH';
                     this.passwordAcceptable = data.passed && data.match === 'MATCH';
@@ -181,7 +175,6 @@ export default class TypeChangePasswordController {
                     this.pendingValidation = false;
                     this.pendingValidation = false;
                     this.$log.error(result);
                     this.$log.error(result);
                     this.message = this.translateFilter('Display_CommunicationError');
                     this.message = this.translateFilter('Display_CommunicationError');
-
                 }
                 }
             );
             );
 
 

+ 89 - 80
client/src/helpdesk/helpdesk-detail.component.html

@@ -28,89 +28,98 @@
 
 
 <div class="help-desk-content">
 <div class="help-desk-content">
     <div>
     <div>
-        <ias-tabset>
-            <ias-tab id="Field_Profile" label="Profile">
-                <table class="details-table">
-                    <tbody>
-                    <tr ng-repeat="item in $ctrl.person.profileData">
-                        <td ng-bind="item.label"></td>
-                        <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
-                        <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
-                        <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </ias-tab>
-            <ias-tab id="Title_Status" label="Status">
-                <table class="details-table">
-                    <tbody>
-                    <tr ng-repeat="item in $ctrl.person.statusData">
-                        <td ng-bind="item.label"></td>
-                        <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
-                        <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
-                        <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </ias-tab>
-            <ias-tab ng-if="!!$ctrl.person.userHistory" id="Title_UserEventHistory" label="Password History">
-                <table class="details-table">
-                    <tbody>
-                    <tr ng-repeat="item in $ctrl.person.userHistory">
-                        <td ng-bind="item.timestamp | dateFilter"></td>
-                        <td ng-bind="item.label"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </ias-tab>
-            <ias-tab id="Title_PasswordPolicy" label="Password Policy">
-                <table class="details-table">
-                    <tbody>
-                    <tr>
-                        <td ng-bind="'Field_Policy' | translate"></td>
-                        <td ng-bind="$ctrl.person.passwordPolicyDN"></td>
-                    </tr>
-                    <tr>
-                        <td ng-bind="'Field_Profile' | translate"></td>
-                        <td ng-bind="$ctrl.person.passwordPolicyID"></td>
-                    </tr>
-                    <tr class="bottom-border">
-                        <td ng-bind="'Field_Display' | translate"></td>
-                        <td>
-                            <ul>
-                                <li ng-repeat="item in $ctrl.person.passwordRequirements" ng-bind="item"></li>
-                            </ul>
-                        </td>
-                    </tr>
-                    <tr ng-repeat="(key, item) in $ctrl.person.passwordPolicyRules">
-                        <td ng-bind="key"></td>
-                        <td ng-bind="item"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </ias-tab>
-            <ias-tab id="Title_SecurityResponses" label="Security Responses">
-                <table class="details-table">
-                    <tbody>
-                    <tr ng-repeat="item in $ctrl.person.helpdeskResponses">
-                        <td ng-bind="item.label"></td>
-                        <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
-                        <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
-                        <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
-                    </tr>
-                    </tbody>
-                </table>
-            </ias-tab>
-        </ias-tabset>
+        <div class="ias-tabset">
+            <div class="ias-tab" ias-toggle-active="ias-active" ias-toggle="profileTab">{{'Field_Profile' | translate}}</div>
+            <div class="ias-tab" ias-toggle-active="ias-active" ias-toggle="statusTab">{{'Title_Status' | translate}}</div>
+            <div class="ias-tab" ias-toggle-active="ias-active" ias-toggle="historyTab">{{'Title_UserEventHistory' | translate}}</div>
+            <div class="ias-tab" ias-toggle-active="ias-active" ias-toggle="passwordTab">{{'Title_PasswordPolicy' | translate}}</div>
+            <div class="ias-tab" ias-toggle-active="ias-active" ias-toggle="securityTab">{{'Title_SecurityResponses' | translate}}</div>
+        </div>
+
+        <ias-tab-pane toggle-group="detailsTabGroup" name="profileTab">
+            <table class="details-table">
+                <tbody>
+                <tr ng-repeat="item in $ctrl.person.profileData">
+                    <td ng-bind="item.label"></td>
+                    <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
+                    <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
+                    <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
+                </tr>
+                </tbody>
+            </table>
+        </ias-tab-pane>
+        <ias-tab-pane toggle-group="detailsTabGroup" name="statusTab">
+            <table class="details-table">
+                <tbody>
+                <tr ng-repeat="item in $ctrl.person.statusData">
+                    <td ng-bind="item.label"></td>
+                    <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
+                    <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
+                    <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
+                </tr>
+                </tbody>
+            </table>
+        </ias-tab-pane>
+        <ias-tab-pane toggle-group="detailsTabGroup" name="historyTab" ng-if="!!$ctrl.person.userHistory">
+            <table class="details-table">
+                <tbody>
+                <tr ng-repeat="item in $ctrl.person.userHistory">
+                    <td ng-bind="item.timestamp | dateFilter"></td>
+                    <td ng-bind="item.label"></td>
+                </tr>
+                </tbody>
+            </table>
+        </ias-tab-pane>
+        <ias-tab-pane toggle-group="detailsTabGroup" name="passwordTab">
+            <table class="details-table">
+                <tbody>
+                <tr>
+                    <td ng-bind="'Field_Policy' | translate"></td>
+                    <td ng-bind="$ctrl.person.passwordPolicyDN"></td>
+                </tr>
+                <tr>
+                    <td ng-bind="'Field_Profile' | translate"></td>
+                    <td ng-bind="$ctrl.person.passwordPolicyID"></td>
+                </tr>
+                <tr class="bottom-border">
+                    <td ng-bind="'Field_Display' | translate"></td>
+                    <td>
+                        <ul>
+                            <li ng-repeat="item in $ctrl.person.passwordRequirements" ng-bind="item"></li>
+                        </ul>
+                    </td>
+                </tr>
+                <tr ng-repeat="(key, item) in $ctrl.person.passwordPolicyRules">
+                    <td ng-bind="key"></td>
+                    <td ng-bind="item"></td>
+                </tr>
+                </tbody>
+            </table>
+        </ias-tab-pane>
+        <ias-tab-pane toggle-group="detailsTabGroup" name="securityTab">
+            <table class="details-table">
+                <tbody>
+                <tr ng-repeat="item in $ctrl.person.helpdeskResponses">
+                    <td ng-bind="item.label"></td>
+                    <td ng-bind="item.value | dateFilter" ng-if="item.type==='timestamp'"></td>
+                    <td ng-bind="item.value" ng-if="item.type==='string' || item.type==='number'"></td>
+                    <td ng-bind="value" ng-if="item.type==='multiString'" ng-repeat="value in item.values"></td>
+                </tr>
+                </tbody>
+            </table>
+        </ias-tab-pane>
     </div>
     </div>
 
 
     <div class="help-desk-buttons">
     <div class="help-desk-buttons">
-        <ias-button ng-click="$ctrl.gotoSearch()"
-                   ng-disabled="$ctrl.buttonDisabled('back')"
-                   ng-if="$ctrl.buttonVisible('back')">{{ 'Button_GoBack' | translate }}</ias-button>
-        <ias-button ng-click="$ctrl.refresh()"
-                   ng-disabled="$ctrl.buttonDisabled('refresh')"
-                   ng-if="$ctrl.buttonVisible('refresh')">{{ 'Display_CaptchaRefresh' | translate }}</ias-button>
+        <ias-button id="helpdesk-refresh-icon" class="ias-icon-button"
+                    ng-click="$ctrl.refresh()" ng-attr-title="{{ 'Display_CaptchaRefresh' | translate }}">
+            <ias-icon class="ias-selected" icon="reload_refresh_thin"></ias-icon>
+        </ias-button>
+        <ias-button id="helpdesk-go-back-icon" class="ias-icon-button"
+                    ng-click="$ctrl.gotoSearch()" ng-attr-title="{{ 'Button_GoBack' | translate }}">
+            <ias-icon class="ias-selected" icon="close_thin"></ias-icon>
+        </ias-button>
+
         <ias-button ng-click="$ctrl.changePassword()"
         <ias-button ng-click="$ctrl.changePassword()"
                    ng-disabled="$ctrl.buttonDisabled('changePassword')"
                    ng-disabled="$ctrl.buttonDisabled('changePassword')"
                    ng-if="$ctrl.buttonVisible('changePassword')">{{ 'Button_ChangePassword' | translate }}</ias-button>
                    ng-if="$ctrl.buttonVisible('changePassword')">{{ 'Button_ChangePassword' | translate }}</ias-button>

+ 16 - 2
client/src/helpdesk/helpdesk-detail.component.scss

@@ -21,8 +21,8 @@
  */
  */
 
 
 help-desk-detail {
 help-desk-detail {
-  .page-content-title {
-    margin-right: 20px;
+  #page-content-title {
+    margin-bottom: 0;
   }
   }
 
 
   .ias-tile {
   .ias-tile {
@@ -36,6 +36,20 @@ help-desk-detail {
     > .help-desk-buttons {
     > .help-desk-buttons {
       margin-left: 15px;
       margin-left: 15px;
 
 
+      > #helpdesk-go-back-icon {
+        position: absolute;
+        top: 50px;
+        margin-left: 115px;
+        width: 28px;
+      }
+
+      > #helpdesk-refresh-icon {
+        position: absolute;
+        top: 50px;
+        margin-left: 80px;
+        width: 28px;
+      }
+
       > .ias-button {
       > .ias-button {
         display: block;
         display: block;
         margin-bottom: 5px;
         margin-bottom: 5px;

+ 17 - 33
client/src/helpdesk/helpdesk-detail.component.ts

@@ -41,9 +41,6 @@ const STATUS_WAIT = 'wait';
 const STATUS_CONFIRM = 'confirm';
 const STATUS_CONFIRM = 'confirm';
 const STATUS_SUCCESS = 'success';
 const STATUS_SUCCESS = 'success';
 
 
-declare const PWM_HELPDESK: any;
-declare const PWM_VAR: any;
-
 @Component({
 @Component({
     stylesheetUrl: require('helpdesk/helpdesk-detail.component.scss'),
     stylesheetUrl: require('helpdesk/helpdesk-detail.component.scss'),
     templateUrl: require('helpdesk/helpdesk-detail.component.html')
     templateUrl: require('helpdesk/helpdesk-detail.component.html')
@@ -61,6 +58,7 @@ export default class HelpDeskDetailComponent {
         'IasDialogService',
         'IasDialogService',
         'PeopleService'
         'PeopleService'
     ];
     ];
+
     constructor(private $state: ui.IStateService,
     constructor(private $state: ui.IStateService,
                 private $stateParams: ui.IStateParamsService,
                 private $stateParams: ui.IStateParamsService,
                 private configService: IHelpDeskConfigService,
                 private configService: IHelpDeskConfigService,
@@ -93,28 +91,17 @@ export default class HelpDeskDetailComponent {
         this.configService.getPasswordUiMode()
         this.configService.getPasswordUiMode()
             .then((passwordUiMode) => {
             .then((passwordUiMode) => {
                 if (passwordUiMode) {
                 if (passwordUiMode) {
-                    if (document.title === 'PWM Development') {
-                        const pwUiMode: string = passwordUiMode.toUpperCase();
-                        if (pwUiMode === PASSWORD_UI_MODES.TYPE) {
-                            this.changePasswordType();
-                        }
-                        else if (pwUiMode === PASSWORD_UI_MODES.AUTOGEN) {
-                            this.changePasswordAutogen();
-                        }
-                        else if (pwUiMode === PASSWORD_UI_MODES.BOTH) {
-                            // TODO: Need to take into account both autogen and typing in this scenario
-                            this.changePasswordType();
-                        }
-                        else if (pwUiMode === PASSWORD_UI_MODES.RANDOM) {
-                            this.changePasswordRandom();
-                        }
+                    if (passwordUiMode === PASSWORD_UI_MODES.TYPE) {
+                        this.changePasswordType();
+                    }
+                    else if (passwordUiMode === PASSWORD_UI_MODES.AUTOGEN) {
+                        this.changePasswordAutogen();
+                    }
+                    else if (passwordUiMode === PASSWORD_UI_MODES.BOTH) {
+                        this.changePasswordType();
                     }
                     }
-                    else {
-                        // Until the new AngularJS version of "Change Password" is finished, we'll just call into the
-                        // old PWM JavaScript functions:
-                        PWM_VAR['helpdesk_obfuscatedDN'] = this.getUserKey();
-                        PWM_VAR['helpdesk_setting_PwUiMode'] = passwordUiMode;
-                        PWM_HELPDESK.initiateChangePasswordDialog();
+                    else if (passwordUiMode === PASSWORD_UI_MODES.RANDOM) {
+                        this.changePasswordRandom();
                     }
                     }
                 }
                 }
                 else {
                 else {
@@ -167,7 +154,6 @@ export default class HelpDeskDetailComponent {
                 controller: 'RandomChangePasswordController as $ctrl',
                 controller: 'RandomChangePasswordController as $ctrl',
                 templateUrl: randomChangePasswordTemplateUrl,
                 templateUrl: randomChangePasswordTemplateUrl,
                 locals: {
                 locals: {
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                     personUserKey: this.getUserKey()
                 }
                 }
             })
             })
@@ -182,7 +168,6 @@ export default class HelpDeskDetailComponent {
                 templateUrl: successChangePasswordTemplateUrl,
                 templateUrl: successChangePasswordTemplateUrl,
                 locals: {
                 locals: {
                     changePasswordSuccessData: data,
                     changePasswordSuccessData: data,
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                     personUserKey: this.getUserKey()
                 }
                 }
             })
             })
@@ -195,7 +180,6 @@ export default class HelpDeskDetailComponent {
                 controller: 'TypeChangePasswordController as $ctrl',
                 controller: 'TypeChangePasswordController as $ctrl',
                 templateUrl: typeChangePasswordTemplateUrl,
                 templateUrl: typeChangePasswordTemplateUrl,
                 locals: {
                 locals: {
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                     personUserKey: this.getUserKey()
                 }
                 }
             })          // TODO: right data type?
             })          // TODO: right data type?
@@ -225,8 +209,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'HelpDeskService',
                     'translateFilter',
                     'translateFilter',
                     ($scope: IScope | any,
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_HelpdeskClearOtpSecret');
                         $scope.title = translateFilter('Button_HelpdeskClearOtpSecret');
                         $scope.text = translateFilter('Confirm');
                         $scope.text = translateFilter('Confirm');
@@ -259,8 +243,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'HelpDeskService',
                     'translateFilter',
                     'translateFilter',
                     ($scope: IScope | any,
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_ClearResponses');
                         $scope.title = translateFilter('Button_ClearResponses');
                         $scope.text = translateFilter('Confirm');
                         $scope.text = translateFilter('Confirm');
@@ -401,8 +385,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'HelpDeskService',
                     'translateFilter',
                     'translateFilter',
                     ($scope: IScope | any,
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_Unlock');
                         $scope.title = translateFilter('Button_Unlock');
                         $scope.text = translateFilter('Confirm');
                         $scope.text = translateFilter('Confirm');

+ 2 - 5
client/src/helpdesk/helpdesk-search-cards.component.html

@@ -25,6 +25,8 @@
     <ias-search-box ng-model="$ctrl.query" ng-model-options="{debounce: $ctrl.inputDebounce}"
     <ias-search-box ng-model="$ctrl.query" ng-model-options="{debounce: $ctrl.inputDebounce}"
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
     </ias-search-box>
     </ias-search-box>
+    <ias-button class="verifications-button ias-cta" ng-if="$ctrl.verificationsEnabled"
+                ng-click="$ctrl.showVerifications()">{{ 'Button_Verifications' | translate }}</ias-button>
 
 
     <span class="ias-fill"></span>
     <span class="ias-fill"></span>
 
 
@@ -41,11 +43,6 @@
 </div>
 </div>
 
 
 <div class="search-info-container">
 <div class="search-info-container">
-    <div>
-        <ias-button class="verifications-button ias-cta" ng-if="$ctrl.verificationsEnabled"
-                    ng-click="$ctrl.showVerifications()">{{ 'Button_Verifications' | translate }}</ias-button>
-    </div>
-
     <div class="search-info" ng-class="{'loading': !$ctrl.getMessage()}"
     <div class="search-info" ng-class="{'loading': !$ctrl.getMessage()}"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          ng-bind="$ctrl.getMessage() || ('Display_PleaseWait' | translate)">
          ng-bind="$ctrl.getMessage() || ('Display_PleaseWait' | translate)">

+ 2 - 5
client/src/helpdesk/helpdesk-search-table.component.html

@@ -25,6 +25,8 @@
     <ias-search-box ng-model="$ctrl.query" ng-model-options="{debounce: $ctrl.inputDebounce}"
     <ias-search-box ng-model="$ctrl.query" ng-model-options="{debounce: $ctrl.inputDebounce}"
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
     </ias-search-box>
     </ias-search-box>
+    <ias-button class="verifications-button ias-cta" ng-if="$ctrl.verificationsEnabled"
+                ng-click="$ctrl.showVerifications()">{{ 'Button_Verifications' | translate }}</ias-button>
 
 
     <span class="ias-fill"></span>
     <span class="ias-fill"></span>
 
 
@@ -53,11 +55,6 @@
 </div>
 </div>
 
 
 <div class="search-info-container">
 <div class="search-info-container">
-    <div>
-        <ias-button class="verifications-button ias-cta" ng-if="$ctrl.verificationsEnabled"
-                    ng-click="$ctrl.showVerifications()">{{ 'Button_Verifications' | translate }}</ias-button>
-    </div>
-
     <div class="search-info" ng-class="{'loading': !$ctrl.getMessage()}"
     <div class="search-info" ng-class="{'loading': !$ctrl.getMessage()}"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          ng-bind="$ctrl.getMessage() || ('Display_PleaseWait' | translate)">
          ng-bind="$ctrl.getMessage() || ('Display_PleaseWait' | translate)">

+ 5 - 1
client/src/helpdesk/helpdesk-search.component.scss

@@ -22,7 +22,7 @@
 
 
 
 
 .verifications-button {
 .verifications-button {
-  margin-bottom: 15px;
+  margin: 5px 5px 5px 0;
 }
 }
 
 
 help-desk-search-cards,
 help-desk-search-cards,
@@ -31,6 +31,10 @@ help-desk-search-table {
   flex-flow: column nowrap;
   flex-flow: column nowrap;
   height: 100%;
   height: 100%;
 
 
+  #page-content-title {
+    margin-bottom: 0;
+  }
+
   > .people-search-component-content {
   > .people-search-component-content {
     flex: 1 1;
     flex: 1 1;
     overflow: auto;
     overflow: auto;

+ 1 - 1
client/src/helpdesk/verifications-dialog.controller.ts

@@ -123,7 +123,7 @@ export default class VerificationsDialogController {
             this.status = STATUS_WAIT;
             this.status = STATUS_WAIT;
             this.configService.getTokenSendMethod()
             this.configService.getTokenSendMethod()
                 .then((tokenSendMethod) => {
                 .then((tokenSendMethod) => {
-                    let choice = (tokenSendMethod === TOKEN_CHOICE) ? method : null;
+                    let choice = (tokenSendMethod === TOKEN_CHOICE) ? method.toLowerCase() : null;
                     return this.helpDeskService.sendVerificationToken(this.personUserKey, choice);
                     return this.helpDeskService.sendVerificationToken(this.personUserKey, choice);
                 })
                 })
                 .then((response: any) => {
                 .then((response: any) => {

+ 6 - 3
client/src/helpdesk/verifications-dialog.template.html

@@ -57,7 +57,10 @@
                     <div ng-switch-when="ATTRIBUTES">
                     <div ng-switch-when="ATTRIBUTES">
                         <div class="ias-input-container" ng-repeat="input in $ctrl.inputs">
                         <div class="ias-input-container" ng-repeat="input in $ctrl.inputs">
                             <label ng-attr-for="{{input.name}}" ng-bind="input.label"></label>
                             <label ng-attr-for="{{input.name}}" ng-bind="input.label"></label>
-                            <input ng-attr-id="{{input.name}}" type="text" ng-model="$ctrl.formData[input.name]">
+                            <input autocomplete="off"
+                                   ng-attr-id="{{input.name}}"
+                                   type="text"
+                                   ng-model="$ctrl.formData[input.name]">
                         </div>
                         </div>
                     </div>
                     </div>
                     <div ng-switch-when="EMAIL|SMS" ng-switch-when-separator="|">
                     <div ng-switch-when="EMAIL|SMS" ng-switch-when-separator="|">
@@ -67,7 +70,7 @@
                         </div>
                         </div>
                         <div class="ias-input-container">
                         <div class="ias-input-container">
                             <label>Token</label>
                             <label>Token</label>
-                            <input id="token" type="text" ng-model="$ctrl.formData.code">
+                            <input autocomplete="off" id="token" type="text" ng-model="$ctrl.formData.code">
                         </div>
                         </div>
 
 
                     </div>
                     </div>
@@ -75,7 +78,7 @@
                         <p ng-bind="'Display_HelpdeskOtpValidation' | translate"></p>
                         <p ng-bind="'Display_HelpdeskOtpValidation' | translate"></p>
                         <div class="ias-input-container">
                         <div class="ias-input-container">
                             <label>Code</label>
                             <label>Code</label>
-                            <input id="code" type="text" ng-model="$ctrl.formData.code">
+                            <input autocomplete="off" id="code" type="text" ng-model="$ctrl.formData.code">
                         </div>
                         </div>
                     </div>
                     </div>
 
 

+ 2 - 5
client/src/i18n/translations_en.json

@@ -22,13 +22,9 @@
   "Display_CaptchaRefresh": "Refresh",
   "Display_CaptchaRefresh": "Refresh",
   "Display_CheckingPassword": "Checking Password....",
   "Display_CheckingPassword": "Checking Password....",
   "Display_HelpdeskOtpValidation": "Instruct the user to load their mobile authentication app and share the current pass code.",
   "Display_HelpdeskOtpValidation": "Instruct the user to load their mobile authentication app and share the current pass code.",
+  "Display_MatchCondition": "Match Condition",
   "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_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_PasswordPrompt": "Please type your new password",
-  "Display_PasswordStrengthHigh": "Strength: <b>Strong</b>",
-  "Display_PasswordStrengthVeryHigh": "Strength: <b>Very Strong</b>",
-  "Display_PasswordStrengthLow": "Strength: <b>Weak</b>",
-  "Display_PasswordStrengthVeryLow": "Strength: <b>Very Weak</b>",
-  "Display_PasswordStrengthMedium": "Strength: <b>Good</b>",
   "Display_PleaseWait": "Loading...",
   "Display_PleaseWait": "Loading...",
   "Display_Random": "Random",
   "Display_Random": "Random",
   "Display_SearchResultsExceeded": "Search results exceeded maximum search size",
   "Display_SearchResultsExceeded": "Search results exceeded maximum search size",
@@ -55,6 +51,7 @@
   "Title_Management": "Management",
   "Title_Management": "Management",
   "Title_Organization": "Organization",
   "Title_Organization": "Organization",
   "Title_OrgChart": "Organizational Chart",
   "Title_OrgChart": "Organizational Chart",
+  "Title_PasswordPolicy": "Password Policy",
   "Title_PeopleSearch": "People Search",
   "Title_PeopleSearch": "People Search",
   "Title_PeopleSearchCard": "People Search Cards",
   "Title_PeopleSearchCard": "People Search Cards",
   "Title_PeopleSearchTable": "People Search Table",
   "Title_PeopleSearchTable": "People Search Table",

+ 7 - 13
client/src/peoplesearch/orgchart-search.component.html

@@ -22,19 +22,13 @@
 
 
 <div class="ias-header">
 <div class="ias-header">
     <h2 id="page-content-title" translate="Title_Organization">Organization</h2>
     <h2 id="page-content-title" translate="Title_Organization">Organization</h2>
-    <ias-search-box id="input" ng-model="$ctrl.query" ng-model-options="{debounce: $ctrl.inputDebounce}"
-                    placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
-    </ias-search-box>
-    <!--<mf-auto-complete search-text="$ctrl.query"-->
-                      <!--on-search-text-change="$ctrl.onSearchTextChange(value)"-->
-                      <!--search="$ctrl.autoCompleteSearch(query)"-->
-                      <!--input-debounce="$ctrl.inputDebounce"-->
-                      <!--item-selected="$ctrl.onAutoCompleteItemSelected(person)"-->
-                      <!--item="person">-->
-        <!--<content-template>-->
-            <!--<span ng-bind="person._displayName"></span>-->
-        <!--</content-template>-->
-    <!--</mf-auto-complete>-->
+    <ias-autocomplete placeholder="{{'Placeholder_Search' | translate}}"
+                      ias-debounce="$ctrl.inputDebounce"
+                      ias-items="person in $ctrl.autoCompleteSearch($query)"
+                      ias-on-item-selected="$ctrl.onAutoCompleteItemSelected($item)"
+                      ias-search-text="$ctrl.query">
+        <template><span ng-bind="person._displayName" class="single-line"></span></template>
+    </ias-autocomplete>
 
 
     <span class="ias-fill"></span>
     <span class="ias-fill"></span>
 
 

+ 4 - 0
client/src/peoplesearch/orgchart-search.component.scss

@@ -22,6 +22,10 @@
 
 
 
 
 org-chart-search {
 org-chart-search {
+  #page-content-title {
+    margin-bottom: 0;
+  }
+
   display: flex;
   display: flex;
   flex-flow: column nowrap;
   flex-flow: column nowrap;
   height: 100%;
   height: 100%;

+ 6 - 16
client/src/peoplesearch/orgchart-search.component.ts

@@ -44,8 +44,7 @@ export default class OrgChartSearchComponent {
     query: string;
     query: string;
     searchTextLocalStorageKey: string;
     searchTextLocalStorageKey: string;
 
 
-    static $inject = [ '$q',
-        '$scope',
+    static $inject = [
         '$state',
         '$state',
         '$stateParams',
         '$stateParams',
         'ConfigService',
         'ConfigService',
@@ -53,9 +52,7 @@ export default class OrgChartSearchComponent {
         'PeopleService',
         'PeopleService',
         'PwmService'
         'PwmService'
     ];
     ];
-    constructor(private $q: IQService,
-                private $scope: IScope,
-                private $state: angular.ui.IStateService,
+    constructor(private $state: angular.ui.IStateService,
                 private $stateParams: angular.ui.IStateParamsService,
                 private $stateParams: angular.ui.IStateParamsService,
                 private configService: IPeopleSearchConfigService,
                 private configService: IPeopleSearchConfigService,
                 private localStorageService: LocalStorageService,
                 private localStorageService: LocalStorageService,
@@ -63,10 +60,6 @@ export default class OrgChartSearchComponent {
                 private pwmService: IPwmService) {
                 private pwmService: IPwmService) {
         this.searchTextLocalStorageKey = this.localStorageService.keys.SEARCH_TEXT;
         this.searchTextLocalStorageKey = this.localStorageService.keys.SEARCH_TEXT;
         this.inputDebounce = this.pwmService.ajaxTypingWait;
         this.inputDebounce = this.pwmService.ajaxTypingWait;
-
-        $scope.$watch('$ctrl.query', () => {
-            this.onSearchTextChange();
-        });
     }
     }
 
 
     $onInit(): void {
     $onInit(): void {
@@ -124,6 +117,7 @@ export default class OrgChartSearchComponent {
     }
     }
 
 
     autoCompleteSearch(query: string): IPromise<IPerson[]> {
     autoCompleteSearch(query: string): IPromise<IPerson[]> {
+        this.storeSearchText(query);
         return this.peopleService.autoComplete(query);
         return this.peopleService.autoComplete(query);
     }
     }
 
 
@@ -132,14 +126,10 @@ export default class OrgChartSearchComponent {
     }
     }
 
 
     onAutoCompleteItemSelected(person: IPerson): void {
     onAutoCompleteItemSelected(person: IPerson): void {
+        this.storeSearchText(null);
         this.$state.go('orgchart.search', { personId: person.userKey, query: null });
         this.$state.go('orgchart.search', { personId: person.userKey, query: null });
     }
     }
 
 
-    onSearchTextChange(): void {
-        // this.query = value;
-        this.storeSearchText();
-    }
-
     private fetchOrgChartData(personId): IPromise<IOrgChartData> {
     private fetchOrgChartData(personId): IPromise<IOrgChartData> {
         return this.peopleService.getOrgChartData(personId, true);
         return this.peopleService.getOrgChartData(personId, true);
     }
     }
@@ -157,7 +147,7 @@ export default class OrgChartSearchComponent {
         return param || this.localStorageService.getItem(this.searchTextLocalStorageKey);
         return param || this.localStorageService.getItem(this.searchTextLocalStorageKey);
     }
     }
 
 
-    protected storeSearchText(): void {
-        this.localStorageService.setItem(this.searchTextLocalStorageKey, this.query || '');
+    protected storeSearchText(query): void {
+        this.localStorageService.setItem(this.searchTextLocalStorageKey, query || '');
     }
     }
 }
 }

+ 38 - 8
client/src/peoplesearch/orgchart.component.scss

@@ -27,6 +27,19 @@ $org-chart-text-color: #808080;
 
 
 $manager-connector-height: 16px;
 $manager-connector-height: 16px;
 
 
+.reports {
+  background-color: #dae1e1;
+  border-radius: 2px;
+  color: #434c50;
+  font-size: 14px;
+  height: 25px;
+  line-height: 25px;
+  position: absolute;
+  right: 3px;
+  text-align: center;
+  top: 3px;
+  min-width: 35px;
+}
 
 
 .assistant,
 .assistant,
 .manager {
 .manager {
@@ -50,6 +63,10 @@ $manager-connector-height: 16px;
       }
       }
     }
     }
 
 
+    > .reports {
+      right: 20px;
+    }
+
     > .ias-tile-content {
     > .ias-tile-content {
       background-color: white;
       background-color: white;
       display: block;
       display: block;
@@ -57,15 +74,15 @@ $manager-connector-height: 16px;
       text-align: center;
       text-align: center;
       width: 100%;
       width: 100%;
 
 
-      > .reports {
-        right: 20px;
-      }
-
       :nth-child(n + 3) {
       :nth-child(n + 3) {
         display: none;
         display: none;
       }
       }
     }
     }
   }
   }
+
+  .reports {
+    right: 20px;
+  }
 }
 }
 
 
 .self {
 .self {
@@ -233,14 +250,14 @@ org-chart {
         .manager {
         .manager {
           &:last-child {
           &:last-child {
             > .ias-tile {
             > .ias-tile {
+              > .reports {
+                display: none;
+              }
+
               > .ias-tile-content {
               > .ias-tile-content {
                 > .avatar {
                 > .avatar {
                   //background-image: url('../../images/icons/m_circle-horz-menu_thin.svg');
                   //background-image: url('../../images/icons/m_circle-horz-menu_thin.svg');
                 }
                 }
-
-                > .reports {
-                  display: none;
-                }
               }
               }
             }
             }
           }
           }
@@ -316,6 +333,14 @@ org-chart {
 }
 }
 
 
 [dir="rtl"] {
 [dir="rtl"] {
+  .assistant,
+  .manager {
+    .reports {
+      left: 20px;
+      right: auto;
+    }
+  }
+
   // (XS) Default display
   // (XS) Default display
   org-chart {
   org-chart {
     > .org-chart-section {
     > .org-chart-section {
@@ -333,6 +358,11 @@ org-chart {
           &[size="large"] {
           &[size="large"] {
             margin: 0 128px 0 0;
             margin: 0 128px 0 0;
           }
           }
+
+          .reports {
+            left: 3px;
+            right: initial;
+          }
         }
         }
 
 
         .org-chart-connector {
         .org-chart-connector {

+ 4 - 0
client/src/peoplesearch/peoplesearch-cards.component.scss

@@ -21,6 +21,10 @@
  */
  */
 
 
 people-search-cards {
 people-search-cards {
+  #page-content-title {
+    margin-bottom: 0;
+  }
+
   display: flex;
   display: flex;
   flex-flow: column nowrap;
   flex-flow: column nowrap;
   height: 100%;
   height: 100%;

+ 4 - 0
client/src/peoplesearch/peoplesearch-table.component.scss

@@ -22,6 +22,10 @@
 
 
 
 
 people-search-table {
 people-search-table {
+    #page-content-title {
+        margin-bottom: 0;
+    }
+
     display: flex;
     display: flex;
     flex-flow: column nowrap;
     flex-flow: column nowrap;
     height: 100%;
     height: 100%;

+ 6 - 0
client/src/peoplesearch/peoplesearch.scss

@@ -100,3 +100,9 @@ body {
     width: 1px;
     width: 1px;
   }
   }
 }
 }
+
+.single-line {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}

+ 12 - 15
client/src/peoplesearch/person-card.component.html

@@ -31,26 +31,23 @@
          ng-attr-title="{{$ctrl.person.numDirectReports}} {{ 'Title_DirectReports' | translate }}"></div>
          ng-attr-title="{{$ctrl.person.numDirectReports}} {{ 'Title_DirectReports' | translate }}"></div>
 
 
     <div class="ias-tile-content" ng-switch-when="small">
     <div class="ias-tile-content" ng-switch-when="small">
-        <h3 ng-bind="$ctrl.person.displayNames[0]"></h3>
-        <div ng-bind="$ctrl.person.displayNames[1]"></div>
+        <h3 class="single-line" ng-bind="$ctrl.person.displayNames[0]"
+            ng-attr-title="{{$ctrl.person.displayNames[0]}}"></h3>
+        <div class="single-line" ng-bind="$ctrl.person.displayNames[1]"
+             ng-attr-title="{{$ctrl.person.displayNames[1]}}"></div>
     </div>
     </div>
 
 
     <div class="ias-tile-content" ng-class="{'direct-reports': $ctrl.numDirectReportsVisible}" ng-switch-when="large">
     <div class="ias-tile-content" ng-class="{'direct-reports': $ctrl.numDirectReportsVisible}" ng-switch-when="large">
-        <h3 ng-bind="$ctrl.person.displayNames[0]"></h3>
-        <div ng-bind="$ctrl.person.displayNames[1]"></div>
-        <div ng-bind="$ctrl.person.displayNames[2]"></div>
-        <div ng-bind="$ctrl.person.displayNames[3]"></div>
-
-        <div ng-bind="$ctrl.person.displayNames[4]"></div>
-        <div ng-bind="$ctrl.person.displayNames[5]"></div>
-        <div ng-bind="$ctrl.person.displayNames[6]"></div>
-        <div ng-bind="$ctrl.person.displayNames[7]"></div>
+        <h3 class="single-line" ng-bind="$ctrl.person.displayNames[0]"
+            ng-attr-title="{{$ctrl.person.displayNames[0]}}"></h3>
+        <div class="single-line" ng-bind="displayName" ng-attr-title="{{displayName}}"
+            ng-repeat="displayName in $ctrl.person.displayNames.slice(1, 8)"></div>
     </div>
     </div>
 
 
     <div class="ias-tile-content" ng-class="{'direct-reports': $ctrl.numDirectReportsVisible}" ng-switch-default>
     <div class="ias-tile-content" ng-class="{'direct-reports': $ctrl.numDirectReportsVisible}" ng-switch-default>
-        <h3 ng-bind="$ctrl.person.displayNames[0]"></h3>
-        <div ng-bind="$ctrl.person.displayNames[1]"></div>
-        <div ng-bind="$ctrl.person.displayNames[2]"></div>
-        <div ng-bind="$ctrl.person.displayNames[3]"></div>
+        <h3 class="single-line" ng-bind="$ctrl.person.displayNames[0]"
+            ng-attr-title="{{$ctrl.person.displayNames[0]}}"></h3>
+        <div class="single-line" ng-bind="displayName" ng-attr-title="{{displayName}}"
+             ng-repeat="displayName in $ctrl.person.displayNames.slice(1, 4)"></div>
     </div>
     </div>
 </div>
 </div>

+ 0 - 270
client/src/peoplesearch/person-card.component.scss

@@ -1,270 +0,0 @@
-/*!
- * Password Management Servlets (PWM)
- * http://www.pwm-project.org
- *
- * Copyright (c) 2006-2009 Novell, Inc.
- * Copyright (c) 2009-2018 The PWM Project
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- */
-
-
-$text-color: #000000;
-$text-color-subtext: #808080;
-
-$person-card-bg-color: #eef2f2;
-$person-card-hover-bg-color: #f6f9f8;
-$person-card-border-color: #01a9e7;
-$person-card-height: 84px;
-$person-card-width: 272px;
-$person-card-avatar-size: 50px;
-$person-card-spacing: 10px;
-
-$person-card-large-avatar-size: 65px;
-
-person-card {
-  background: $person-card-bg-color;
-  border: 1px solid $person-card-bg-color;
-  border-radius: 3px;
-  box-sizing: border-box;
-  display: block;
-  height: $person-card-height;
-  padding: $person-card-spacing;
-  position: relative;
-  text-align: left;
-  vertical-align: top;
-  width: $person-card-width;
-
-  &[ng-click] {
-    cursor: pointer;
-
-    &:focus,
-    &:hover {
-      outline: none;
-    }
-
-    &:focus {
-      background-color: #fff6ce;
-      border-color: #ffd92d;
-    }
-
-    &:hover {
-      background-color: $person-card-hover-bg-color;
-      border-color: $person-card-border-color;
-    }
-  }
-
-  &[size="large"] {
-    background-color: #ffffff;
-    border: 3px solid #808080;
-    border-radius: 3px;
-    height: auto;
-    min-height: 96px;
-    width: 346px;
-    max-width: 100%;
-
-    > .person-card-content {
-      flex-flow: row nowrap;
-
-      > .avatar {
-        flex: 0 0 $person-card-large-avatar-size;
-        height: $person-card-large-avatar-size;
-        width: $person-card-large-avatar-size;
-        margin-bottom: 5px;
-      }
-    }
-  }
-
-  &[size="small"] {
-    border: none;
-    background-color: transparent;
-    height: 96px;
-    padding: 0;
-    width: 120px;
-
-    &[ng-click] {
-      &:focus,
-      &:hover {
-        background-color: transparent;
-      }
-
-      &:focus {
-        > .person-card-content {
-          > .avatar {
-            border-color: #ffd92d !important;
-          }
-        }
-      }
-
-      &:hover {
-        > .person-card-content {
-          > .avatar {
-            border-color: $person-card-border-color !important;
-          }
-        }
-      }
-    }
-
-    > .person-card-content {
-      display: block;
-      text-align: center;
-
-      > .avatar {
-        background-color: #808080;
-        border: 3px solid #808080;
-        border-radius: 100%;
-        height: $person-card-avatar-size;
-        margin: 0 auto;
-        width: $person-card-avatar-size;
-
-        > img {
-          border-radius: 100%;
-        }
-
-        &:hover {
-          border-color: $person-card-border-color;
-        }
-      }
-
-      > .details {
-        background-color: white;
-        margin-top: 8px;
-        width: 100%;
-
-        :first-child {
-          font-size: 13px;
-        }
-      }
-
-      > .reports {
-        right: 20px;
-      }
-    }
-  }
-
-  > .person-card-content {
-    display: flex;
-    flex-flow: row nowrap;
-    overflow: hidden;
-
-    > .avatar {
-      background: transparent url('../../images/user.png') no-repeat center center;
-      background-size: contain;
-      border-radius: 3px;
-      flex: 0 0 $person-card-avatar-size;
-      height: $person-card-avatar-size;
-      margin-right: $person-card-spacing;
-
-      img {
-        height: 100%;
-        width: 100%;
-      }
-    }
-
-    > .details {
-      flex: 1;
-      overflow: hidden;
-
-      &.direct-reports {
-        >:first-child {
-          margin-right: 28px;
-        }
-      }
-
-      > div {
-        line-height: 16px;
-        overflow: hidden;
-        text-overflow: ellipsis;
-        white-space: nowrap;
-      }
-
-      > :first-child {
-        color: $text-color;
-        font-size: 16px;
-        margin-bottom: 2px;
-      }
-
-      > :not(:first-child) {
-        color: $text-color-subtext;
-        font-size: 12px;
-      }
-
-      > .secondary-details {
-        padding-top: 8px;
-      }
-    }
-
-    > .reports {
-      background-color: #dae1e1;
-      border-radius: 2px;
-      color: #434c50;
-      font-size: 14px;
-      height: 25px;
-      line-height: 25px;
-      position: absolute;
-      right: 3px;
-      text-align: center;
-      top: 3px;
-      min-width: 35px;
-    }
-  }
-}
-
-[dir="rtl"] {
-  person-card {
-    text-align: right;
-
-    &[size="large"] {
-      > .person-card-content {
-        > .avatar {
-        }
-      }
-    }
-
-    &[size="small"] {
-      > .person-card-content {
-        > .avatar {
-          margin: 0 auto;
-        }
-
-        > .reports {
-          left: 20px;
-          right: auto;
-        }
-      }
-    }
-
-    > .person-card-content {
-      > .avatar {
-        margin-left: $person-card-spacing;
-        margin-right: 0;
-      }
-
-      > .details {
-        &.direct-reports {
-          >:first-child {
-            margin-left: 28px;
-            margin-right: 0;
-          }
-        }
-      }
-
-      > .reports {
-        left: 3px;
-        right: initial;
-      }
-    }
-  }
-}

+ 0 - 1
client/src/peoplesearch/person-card.component.ts

@@ -26,7 +26,6 @@ import { IPerson } from '../models/person.model';
 import { IPeopleService } from '../services/people.service';
 import { IPeopleService } from '../services/people.service';
 
 
 const templateUrl = require('peoplesearch/person-card.component.html');
 const templateUrl = require('peoplesearch/person-card.component.html');
-require('peoplesearch/person-card.component.scss');
 
 
 class PersonCardController {
 class PersonCardController {
     private details: any[]; // For large style cards
     private details: any[]; // For large style cards

+ 5 - 5
client/src/services/helpdesk-config.service.ts

@@ -39,11 +39,11 @@ const VERIFICATION_METHODS_CONFIG = 'verificationMethods';
 export const TOKEN_CHOICE = 'CHOICE_SMS_EMAIL';
 export const TOKEN_CHOICE = 'CHOICE_SMS_EMAIL';
 
 
 export const PASSWORD_UI_MODES = {
 export const PASSWORD_UI_MODES = {
-    NONE: 'NONE',
-    AUTOGEN: 'AUTOGEN',
-    RANDOM: 'RANDOM',
-    TYPE: 'TYPE',
-    BOTH: 'BOTH'
+    NONE: 'none',
+    AUTOGEN: 'autogen',
+    RANDOM: 'random',
+    TYPE: 'type',
+    BOTH: 'both'
 };
 };
 
 
 export const VERIFICATION_METHOD_NAMES = {
 export const VERIFICATION_METHOD_NAMES = {

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

@@ -192,8 +192,8 @@ export default class HelpDeskService implements IHelpDeskService {
         };
         };
         return this.pwmService
         return this.pwmService
             .httpRequest(url, { data: data })
             .httpRequest(url, { data: data })
-            .then((result: IRandomPasswordResponse) => {
-                return this.$q.resolve(result);
+            .then((result: { data: IRandomPasswordResponse }) => {
+                return this.$q.resolve(result.data);
             });
             });
     }
     }
 
 

+ 10 - 4
client/src/services/password.service.ts

@@ -21,7 +21,7 @@
  */
  */
 
 
 
 
-import {ILogService, IPromise, ITimeoutService, IWindowService} from 'angular';
+import {ILogService, IPromise, IQService, ITimeoutService, IWindowService} from 'angular';
 import {IPwmService} from './pwm.service';
 import {IPwmService} from './pwm.service';
 
 
 export interface IPasswordService {
 export interface IPasswordService {
@@ -40,8 +40,10 @@ export interface IValidatePasswordData {
 export default class PasswordService implements IPasswordService {
 export default class PasswordService implements IPasswordService {
     PWM_MAIN: any;
     PWM_MAIN: any;
 
 
-    static $inject = [ '$log', '$timeout', '$window', 'pwmService', 'translateFilter' ];
+    static $inject = ['$log', '$q', '$timeout', '$window', 'PwmService', 'translateFilter'];
+
     constructor(private $log: ILogService,
     constructor(private $log: ILogService,
+                private $q: IQService,
                 private $timeout: ITimeoutService,
                 private $timeout: ITimeoutService,
                 private $window: IWindowService,
                 private $window: IWindowService,
                 private pwmService: IPwmService,
                 private pwmService: IPwmService,
@@ -58,10 +60,14 @@ export default class PasswordService implements IPasswordService {
         let data = {
         let data = {
             password1: password1,
             password1: password1,
             password2: password2,
             password2: password2,
-            userDN: userKey
+            username: userKey
         };
         };
         let url: string = this.pwmService.getServerUrl('checkPassword');
         let url: string = this.pwmService.getServerUrl('checkPassword');
 
 
-        return this.pwmService.httpRequest(url, { data: data });
+        return this.pwmService
+            .httpRequest(url, {data: data})
+            .then((result: { data: IValidatePasswordData }) => {
+                return this.$q.resolve(result.data);
+            });
     }
     }
 }
 }

+ 0 - 22
npm-debug.log

@@ -1,22 +0,0 @@
-0 info it worked if it ends with ok
-1 verbose cli [ 'C:\\Program Files\\nodejs\\node.exe',
-1 verbose cli   'C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js',
-1 verbose cli   'start' ]
-2 info using npm@3.10.10
-3 info using node@v6.10.1
-4 verbose stack Error: ENOENT: no such file or directory, open 'D:\deps-dx\pwm\pwm\package.json'
-4 verbose stack     at Error (native)
-5 verbose cwd D:\deps-dx\pwm\pwm
-6 error Windows_NT 10.0.14393
-7 error argv "C:\\Program Files\\nodejs\\node.exe" "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "start"
-8 error node v6.10.1
-9 error npm  v3.10.10
-10 error path D:\deps-dx\pwm\pwm\package.json
-11 error code ENOENT
-12 error errno -4058
-13 error syscall open
-14 error enoent ENOENT: no such file or directory, open 'D:\deps-dx\pwm\pwm\package.json'
-15 error enoent ENOENT: no such file or directory, open 'D:\deps-dx\pwm\pwm\package.json'
-15 error enoent This is most likely not a problem with npm itself
-15 error enoent and is related to npm not being able to find a file.
-16 verbose exit [ -4058, true ]

+ 2 - 1
server/src/main/webapp/public/resources/mobileStyle.css

@@ -104,7 +104,8 @@ progress .wait {
 
 
 .dialogBody.orgChart { width: 100%; max-width: 100%; }
 .dialogBody.orgChart { width: 100%; max-width: 100%; }
 
 
-.peoplesearch-wrapper #centerbody.wide {
+.peoplesearch-wrapper #centerbody.wide,
+.helpdesk-wrapper #centerbody.wide {
     bottom: 80px;
     bottom: 80px;
     height: auto !important;
     height: auto !important;
     left: 0;
     left: 0;

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio