Update local user table to new design

This commit will introduce a reusable data table component.
By creating a reusable component, we can ensure tables in the
GUI will look consistent and common table actions (sort, select row)
are shared.

- Created new components directory to store shared components
- Add password-confirmation directive
- Remove some error handling from API utils so it can be
  handled in the UI

TODO:
- Add show/hide toggle to password fields
- Enhance table component with icons
- Manual user unlock
- Batch table actions
- Role table

Signed-off-by: Yoshie Muranaka <yoshiemuranaka@gmail.com>
Change-Id: I03c95874d2942a2450a5da2f1d2a8bb895aa1746
diff --git a/app/users/controllers/user-accounts-controller.html b/app/users/controllers/user-accounts-controller.html
index 11cc85c..fd6a28c 100644
--- a/app/users/controllers/user-accounts-controller.html
+++ b/app/users/controllers/user-accounts-controller.html
@@ -1,129 +1,31 @@
 <loader loading="loading"></loader>
-<div id="user-accounts">
-
-  <div class="row column acnt-prop-header">
-    <h1>User account properties</h1>
-  </div>
-
-  <div class="col-sm-12">
-    <form class="row column user-manage__form">
-      <div class="col-sm-12">
-        <label class="col-md-1 control-label" for="lockoutTime"> User Lockout Time (sec) </label>
-        <div class="col-md-3 acnt-prop__input-wrapper">
-          <input type="number" id="lockoutTime" min="30" max="600" ng-model="properties.AccountLockoutDuration"/>
-        </div>
-      </div>
-      <div class="col-sm-12">
-        <label class="col-md-1 control-label" for="lockoutThreshold"> Failed Login Attempts </label>
-        <div class="col-md-3 acnt-prop__input-wrapper">
-          <input type="number" id="lockoutThreshold" min="3" max="10" ng-model="properties.AccountLockoutThreshold"/>
-        </div>
-      </div>
-      <div class="acnt-prop__submit-wrapper">
-          <button type="button" class="btn  btn-primary" ng-click="saveAllValues()">Save settings</button>
-      </div>
-    </form>
-  </div>
-
+<div class="local-users">
   <div class="row column">
-    <h1>User account information</h1>
-  </div>
-  <div class="table row column user-list__tbl" ng-show="users.length != 0">
-    <div class="table__head">
-      <div class="table__row">
-        <div class="table__cell"> Username </div>
-        <div class="table__cell"> Enabled </div>
-        <div class="table__cell"> Role </div>
-        <div class="table__cell"> Locked </div>
-        <div class="table__cell"> Action </div>
-      </div>
-    </div>
-    <div class="table__body">
-      <div class="table__row" ng-repeat="user in users">
-        <div class="table__cell"> {{user.UserName}} </div>
-        <div class="table__cell"> {{user.Enabled}} </div>
-        <div class="table__cell"> {{user.RoleId}} </div>
-        <div class="table__cell"> {{user.Locked}} </div>
-        <div class="table__cell">
-          <button type="button" class="btn  btn-primary" ng-disabled="isUserSelected" ng-click="setSelectedUser(user)">Edit</button>
-          <button type="button" class="btn btn-primary" ng-disabled="isUserSelected" ng-click="deleteUser(user.UserName)">Delete</button>
-        </div>
-      </div>
+    <div class="column small-12">
+      <h1 class="page-title">Local user management</h1>
     </div>
   </div>
-  <div class="table row column" ng-show="users.length == 0">
-    <span>No users exist in system</span>
+  <div class="row column">
+    <div class="column small-12">
+      <div class="local-users__actions">
+        <button ng-disabled="accountSettings === null"
+                ng-click="onClickAccountSettingsPolicy()"
+                class="btn btn-tertiary">
+          <icon file="icon-config.svg"></icon>
+          Account policy settings
+        </button>
+        <button ng-disabled="userRoles === null || localUsers.length >= 15"
+                ng-click="onClickAddUser()"
+                class="btn btn-primary">
+          <icon file="icon-plus.svg"></icon>
+          Add user
+        </button>
+      </div>
+      <bmc-table
+        model="tableModel"
+        emit-action="onEmitAction(value)"
+        class="local-users__table">
+      </bmc-table>
+    </div>
   </div>
-
-  <form role="form" name="user__form" class="user-manage__form">
-    <section class="row column" aria-label="user manage form" ng-class="{'submitted':submitted}">
-       <div class="column small-12 page-header">
-        <h2 class="inline">User account settings</h2>
-       </div>
-        <div class='col-sm-12'>
-          <label class="col-md-1 control-label" for="user-manage__username">UserName</label>
-          <div class="col-md-3">
-            <input type="text" name="UserName" id="user-manage__username" ng-model="selectedUser.UserName" has-error="doesUserExist()" required />
-            <div ng-messages="user__form.UserName.$error" class="form-error" ng-class="{'visible' : user__form.UserName.$touched || submitted}">
-              <p ng-message="required">Field is required</p>
-              <p ng-message="hasError">Username exists</p>
-            </div>
-          </div>
-        </div>
-        <div class='col-sm-12 inline'>
-          <label class="col-md-1 control-label" for="user-manage__passwd">Password</label>
-          <div class="col-md-3 user-manage__input-wrapper inline">
-            <input type="{{showpassword ? 'text' : 'password'}}" class="user-manage__new-password inline" name="Password" id="user-manage__passwd" ng-model="selectedUser.Password" ng-minlength="properties.MinPasswordLength" ng-maxlength="properties.MaxPasswordLength" required autocomplete="off"/>
-            <button ng-model="showpassword" ng-click="togglePassword = !togglePassword; showpassword = !showpassword;" class="btn btn-tertiary  password-toggle">
-              <span ng-hide="togglePassword">Show</span>
-              <span ng-show="togglePassword">Hide</span>
-            </button>
-            <div ng-messages="user__form.Password.$error" class="form-error" ng-class="{'visible' : user__form.Password.$touched || submitted}">
-              <p ng-message="required">Field is required</p>
-              <p ng-message="minlength">Must be at least {{properties.MinPasswordLength}} characters</p>
-              <p ng-message="maxlength">Must be {{properties.MaxPasswordLength}} characters or less</p>
-            </div>
-          </div>
-        </div>
-        <div class='col-sm-12'>
-          <label class="col-md-1 control-label" for="user-manage__verifypasswd">Retype Password</label>
-          <div class="col-md-3 user-manage__input-wrapper inline">
-            <input type="{{showpasswordVerify ? 'text' : 'password'}}" class="user-manage__verify-password inline" name="VerifyPassword" id="user-manage__verifypasswd" ng-model="selectedUser.VerifyPassword" has-error="selectedUser.VerifyPassword != selectedUser.Password" required autocomplete="off">
-            <button ng-model="showpasswordVerify" ng-click="toggleVerify = !toggleVerify; showpasswordVerify = !showpasswordVerify;" class="btn  btn-tertiary  password-toggle">
-              <span ng-hide="toggleVerify">Show</span>
-              <span ng-show="toggleVerify">Hide</span>
-            </button>
-            <div ng-messages="user__form.VerifyPassword.$error" class="form-error" ng-class="{'visible' : user__form.VerifyPassword.$touched || submitted}">
-              <p ng-message="required">Field is required</p>
-              <p ng-message="hasError">Passwords do not match</p>
-            </div>
-          </div>
-        </div>
-        <div class='col-sm-12'>
-          <label class="col-md-1 control-label" for="role">Role</label>
-          <div class="col-md-3 user-manage__input-wrapper inline">
-            <select ng-model="selectedUser.RoleId" id="role" name="role" class="inline" required>
-              <option ng-repeat="role in roles" class="inline">{{role}}</option>
-            </select>
-            <div ng-messages="user__form.role.$error" class="form-error" ng-class="{'visible' : user__form.role.$touched || submitted}">
-              <p ng-message="required">Field is required</p>
-            </div>
-          </div>
-        </div>
-        <div class='col-sm-12'>
-          <label class="col-md-1 control-label" for="user-manage__enabled">Enabled</label>
-          <div class="col-md-3 user-manage__input-wrapper inline">
-            <label class="control-check">
-              <input type="checkbox" name="Enabled" id="user-manage__enabled" ng-model="selectedUser.Enabled"/>
-                <span class="control__indicator"></span>
-            </label>
-          </div>
-        </div>
-        <div class="user-manage__submit-wrapper">
-            <button type="button" ng-click="submitted=true; user__form.$valid && createNewUser(); user__form.$setUntouched()" ng-show="!isUserSelected" class="btn btn-primary">Create user</button>
-            <button type="button" class="btn  btn-primary" ng-click="submitted=true; user__form.$valid && updateUserInfo(); user__form.$setUntouched()" ng-show="isUserSelected">Save</button>
-            <button type="button" class="btn  btn-primary" ng-if="isUserSelected" ng-click="cancel()">Cancel</button>
-        </div>
-    </section>
-  </form>
-</div>
+</div>
\ No newline at end of file