Ver Fonte

Merge remote-tracking branch 'origin/master'

Jason Rivard há 7 anos atrás
pai
commit
e9760d1d14
33 ficheiros alterados com 417 adições e 650 exclusões
  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

Diff do ficheiro suprimidas por serem muito extensas
+ 117 - 117
client/package-lock.json


+ 2 - 2
client/package.json

@@ -20,8 +20,8 @@
     "dependencies": {},
     "devDependencies": {
         "@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-mocks": "1.5.11",
         "@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-container">
         <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 class="ias-dialog-content">

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

@@ -29,13 +29,11 @@ export default class RandomChangePasswordController {
     static $inject = [
         'HelpDeskService',
         'IasDialogService',
-        'personUsername',
         'personUserKey',
         'translateFilter'
     ];
     constructor(private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
-                private personUsername: string,
                 private personUserKey: 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-container">
         <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 class="ias-dialog-content">

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

@@ -43,7 +43,6 @@ export default class SuccessChangePasswordController {
         'ConfigService',
         'HelpDeskService',
         'IasDialogService',
-        'personUsername',
         'personUserKey',
         'translateFilter'
     ];
@@ -52,7 +51,6 @@ export default class SuccessChangePasswordController {
                 private configService: IHelpDeskConfigService,
                 private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
-                private personUsername: string,
                 private personUserKey: string,
                 private translateFilter: (id: string) => string) {
         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-container">
         <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 class="ias-dialog-content">
             <p ng-bind="$ctrl.message"></p>
@@ -36,12 +36,15 @@
                         <input ng-model="$ctrl.password1" ng-show="$ctrl.passwordMasked" type="password">
                     </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>
                     </td>
                 </tr>
@@ -58,8 +61,12 @@
                         </div>
                     </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>
                 </tr>
                 </tbody>
@@ -70,7 +77,7 @@
                         ng-disabled="!$ctrl.passwordAcceptable">{{ 'Button_ChangePassword' | translate }}
             </ias-button>
             <ias-button ng-click="$ctrl.onClickRandomPasswords()"
-                        ng-if="$ctrl.passwordUiMode === 'BOTH'">{{ 'Title_RandomPasswords' | translate }}
+                        ng-if="$ctrl.passwordUiMode === 'both'">{{ 'Title_RandomPasswords' | translate }}
             </ias-button>
         </div>
 

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

@@ -24,13 +24,18 @@
   &.type-change-password-dialog {
     .ias-dialog-content {
       table {
+        border: none;
+        margin-left: 0;
+        margin-right: 0;
+        width: auto;
+
         input {
           margin: 7px;
           vertical-align: middle;
         }
 
         td {
-          min-width: 250px;
+          border: none;
         }
 
         .ias-icon-message_error_thick {
@@ -41,24 +46,42 @@
           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',
         '$scope',
         '$timeout',
-        '$window',
         'ConfigService',
         'HelpDeskService',
         'IasDialogService',
         'PasswordService',
-        'personUsername',
         'personUserKey',
         'PwmService',
         'translateFilter'
@@ -67,12 +65,10 @@ export default class TypeChangePasswordController {
                 private $q: IQService,
                 private $scope: IScope,
                 private $timeout: ITimeoutService,
-                private $window: IWindowService,
                 private configService: IHelpDeskConfigService,
                 private HelpDeskService: IHelpDeskService,
                 private IasDialogService: any,
                 private passwordService: IPasswordService,
-                private personUsername: string,
                 private personUserKey: string,
                 private pwmService: IPwmService,
                 private translateFilter: (id: string) => string) {
@@ -142,16 +138,14 @@ export default class TypeChangePasswordController {
         if (this.pendingValidation) {
             return;
         }
-
         this.pendingValidation = true;
 
-
         this.passwordService.validatePassword(this.password1, this.password2, this.personUserKey)
             .then(
                 (data: IValidatePasswordData) => {
                     this.pendingValidation = false;
                     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';
@@ -181,7 +175,6 @@ export default class TypeChangePasswordController {
                     this.pendingValidation = false;
                     this.$log.error(result);
                     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>
-        <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 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()"
                    ng-disabled="$ctrl.buttonDisabled('changePassword')"
                    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 {
-  .page-content-title {
-    margin-right: 20px;
+  #page-content-title {
+    margin-bottom: 0;
   }
 
   .ias-tile {
@@ -36,6 +36,20 @@ help-desk-detail {
     > .help-desk-buttons {
       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 {
         display: block;
         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_SUCCESS = 'success';
 
-declare const PWM_HELPDESK: any;
-declare const PWM_VAR: any;
-
 @Component({
     stylesheetUrl: require('helpdesk/helpdesk-detail.component.scss'),
     templateUrl: require('helpdesk/helpdesk-detail.component.html')
@@ -61,6 +58,7 @@ export default class HelpDeskDetailComponent {
         'IasDialogService',
         'PeopleService'
     ];
+
     constructor(private $state: ui.IStateService,
                 private $stateParams: ui.IStateParamsService,
                 private configService: IHelpDeskConfigService,
@@ -93,28 +91,17 @@ export default class HelpDeskDetailComponent {
         this.configService.getPasswordUiMode()
             .then((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 {
@@ -167,7 +154,6 @@ export default class HelpDeskDetailComponent {
                 controller: 'RandomChangePasswordController as $ctrl',
                 templateUrl: randomChangePasswordTemplateUrl,
                 locals: {
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                 }
             })
@@ -182,7 +168,6 @@ export default class HelpDeskDetailComponent {
                 templateUrl: successChangePasswordTemplateUrl,
                 locals: {
                     changePasswordSuccessData: data,
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                 }
             })
@@ -195,7 +180,6 @@ export default class HelpDeskDetailComponent {
                 controller: 'TypeChangePasswordController as $ctrl',
                 templateUrl: typeChangePasswordTemplateUrl,
                 locals: {
-                    personUsername: this.person.userDisplayName,
                     personUserKey: this.getUserKey()
                 }
             })          // TODO: right data type?
@@ -225,8 +209,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'translateFilter',
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_HelpdeskClearOtpSecret');
                         $scope.text = translateFilter('Confirm');
@@ -259,8 +243,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'translateFilter',
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_ClearResponses');
                         $scope.text = translateFilter('Confirm');
@@ -401,8 +385,8 @@ export default class HelpDeskDetailComponent {
                     'HelpDeskService',
                     'translateFilter',
                     ($scope: IScope | any,
-                              helpDeskService: IHelpDeskService,
-                              translateFilter: (id: string) => string) => {
+                     helpDeskService: IHelpDeskService,
+                     translateFilter: (id: string) => string) => {
                         $scope.status = STATUS_CONFIRM;
                         $scope.title = translateFilter('Button_Unlock');
                         $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}"
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
     </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>
 
@@ -41,11 +43,6 @@
 </div>
 
 <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()}"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          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}"
                     placeholder="{{'Placeholder_Search' | translate}}" auto-focus>
     </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>
 
@@ -53,11 +55,6 @@
 </div>
 
 <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()}"
          ng-if="$ctrl.loading || $ctrl.searchMessage || $ctrl.errorMessage"
          ng-bind="$ctrl.getMessage() || ('Display_PleaseWait' | translate)">

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

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

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

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

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

@@ -57,7 +57,10 @@
                     <div ng-switch-when="ATTRIBUTES">
                         <div class="ias-input-container" ng-repeat="input in $ctrl.inputs">
                             <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 ng-switch-when="EMAIL|SMS" ng-switch-when-separator="|">
@@ -67,7 +70,7 @@
                         </div>
                         <div class="ias-input-container">
                             <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>
@@ -75,7 +78,7 @@
                         <p ng-bind="'Display_HelpdeskOtpValidation' | translate"></p>
                         <div class="ias-input-container">
                             <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>
 

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

@@ -22,13 +22,9 @@
   "Display_CaptchaRefresh": "Refresh",
   "Display_CheckingPassword": "Checking Password....",
   "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_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_Random": "Random",
   "Display_SearchResultsExceeded": "Search results exceeded maximum search size",
@@ -55,6 +51,7 @@
   "Title_Management": "Management",
   "Title_Organization": "Organization",
   "Title_OrgChart": "Organizational Chart",
+  "Title_PasswordPolicy": "Password Policy",
   "Title_PeopleSearch": "People Search",
   "Title_PeopleSearchCard": "People Search Cards",
   "Title_PeopleSearchTable": "People Search Table",

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

@@ -22,19 +22,13 @@
 
 <div class="ias-header">
     <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>
 

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

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

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

@@ -44,8 +44,7 @@ export default class OrgChartSearchComponent {
     query: string;
     searchTextLocalStorageKey: string;
 
-    static $inject = [ '$q',
-        '$scope',
+    static $inject = [
         '$state',
         '$stateParams',
         'ConfigService',
@@ -53,9 +52,7 @@ export default class OrgChartSearchComponent {
         'PeopleService',
         '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 configService: IPeopleSearchConfigService,
                 private localStorageService: LocalStorageService,
@@ -63,10 +60,6 @@ export default class OrgChartSearchComponent {
                 private pwmService: IPwmService) {
         this.searchTextLocalStorageKey = this.localStorageService.keys.SEARCH_TEXT;
         this.inputDebounce = this.pwmService.ajaxTypingWait;
-
-        $scope.$watch('$ctrl.query', () => {
-            this.onSearchTextChange();
-        });
     }
 
     $onInit(): void {
@@ -124,6 +117,7 @@ export default class OrgChartSearchComponent {
     }
 
     autoCompleteSearch(query: string): IPromise<IPerson[]> {
+        this.storeSearchText(query);
         return this.peopleService.autoComplete(query);
     }
 
@@ -132,14 +126,10 @@ export default class OrgChartSearchComponent {
     }
 
     onAutoCompleteItemSelected(person: IPerson): void {
+        this.storeSearchText(null);
         this.$state.go('orgchart.search', { personId: person.userKey, query: null });
     }
 
-    onSearchTextChange(): void {
-        // this.query = value;
-        this.storeSearchText();
-    }
-
     private fetchOrgChartData(personId): IPromise<IOrgChartData> {
         return this.peopleService.getOrgChartData(personId, true);
     }
@@ -157,7 +147,7 @@ export default class OrgChartSearchComponent {
         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;
 
+.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,
 .manager {
@@ -50,6 +63,10 @@ $manager-connector-height: 16px;
       }
     }
 
+    > .reports {
+      right: 20px;
+    }
+
     > .ias-tile-content {
       background-color: white;
       display: block;
@@ -57,15 +74,15 @@ $manager-connector-height: 16px;
       text-align: center;
       width: 100%;
 
-      > .reports {
-        right: 20px;
-      }
-
       :nth-child(n + 3) {
         display: none;
       }
     }
   }
+
+  .reports {
+    right: 20px;
+  }
 }
 
 .self {
@@ -233,14 +250,14 @@ org-chart {
         .manager {
           &:last-child {
             > .ias-tile {
+              > .reports {
+                display: none;
+              }
+
               > .ias-tile-content {
                 > .avatar {
                   //background-image: url('../../images/icons/m_circle-horz-menu_thin.svg');
                 }
-
-                > .reports {
-                  display: none;
-                }
               }
             }
           }
@@ -316,6 +333,14 @@ org-chart {
 }
 
 [dir="rtl"] {
+  .assistant,
+  .manager {
+    .reports {
+      left: 20px;
+      right: auto;
+    }
+  }
+
   // (XS) Default display
   org-chart {
     > .org-chart-section {
@@ -333,6 +358,11 @@ org-chart {
           &[size="large"] {
             margin: 0 128px 0 0;
           }
+
+          .reports {
+            left: 3px;
+            right: initial;
+          }
         }
 
         .org-chart-connector {

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

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

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

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

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

@@ -100,3 +100,9 @@ body {
     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>
 
     <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 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 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>

+ 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';
 
 const templateUrl = require('peoplesearch/person-card.component.html');
-require('peoplesearch/person-card.component.scss');
 
 class PersonCardController {
     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 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 = {

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

@@ -192,8 +192,8 @@ export default class HelpDeskService implements IHelpDeskService {
         };
         return this.pwmService
             .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';
 
 export interface IPasswordService {
@@ -40,8 +40,10 @@ export interface IValidatePasswordData {
 export default class PasswordService implements IPasswordService {
     PWM_MAIN: any;
 
-    static $inject = [ '$log', '$timeout', '$window', 'pwmService', 'translateFilter' ];
+    static $inject = ['$log', '$q', '$timeout', '$window', 'PwmService', 'translateFilter'];
+
     constructor(private $log: ILogService,
+                private $q: IQService,
                 private $timeout: ITimeoutService,
                 private $window: IWindowService,
                 private pwmService: IPwmService,
@@ -58,10 +60,14 @@ export default class PasswordService implements IPasswordService {
         let data = {
             password1: password1,
             password2: password2,
-            userDN: userKey
+            username: userKey
         };
         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%; }
 
-.peoplesearch-wrapper #centerbody.wide {
+.peoplesearch-wrapper #centerbody.wide,
+.helpdesk-wrapper #centerbody.wide {
     bottom: 80px;
     height: auto !important;
     left: 0;

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff