xref: /openbmc/phosphor-webui/app/access-control/directives/username-validator.js (revision afc8a799627b71bba716e207cee8185852a6d390)
1*afc8a799Smiramurali23window.angular && (function(angular) {
2*afc8a799Smiramurali23  'use strict';
3*afc8a799Smiramurali23
4*afc8a799Smiramurali23  /**
5*afc8a799Smiramurali23   * Username validator
6*afc8a799Smiramurali23   *
7*afc8a799Smiramurali23   * Checks if entered username is a duplicate
8*afc8a799Smiramurali23   * Provide existingUsernames scope that should be an array of
9*afc8a799Smiramurali23   * existing usernames
10*afc8a799Smiramurali23   *
11*afc8a799Smiramurali23   * <input username-validator  existing-usernames="[]"/>
12*afc8a799Smiramurali23   *
13*afc8a799Smiramurali23   */
14*afc8a799Smiramurali23  angular.module('app.accessControl')
15*afc8a799Smiramurali23      .directive('usernameValidator', function() {
16*afc8a799Smiramurali23        return {
17*afc8a799Smiramurali23          restrict: 'A', require: 'ngModel', scope: {existingUsernames: '='},
18*afc8a799Smiramurali23              link: function(scope, element, attrs, controller) {
19*afc8a799Smiramurali23                if (scope.existingUsernames === undefined) {
20*afc8a799Smiramurali23                  return;
21*afc8a799Smiramurali23                }
22*afc8a799Smiramurali23                controller.$validators.duplicateUsername =
23*afc8a799Smiramurali23                    (modelValue, viewValue) => {
24*afc8a799Smiramurali23                      const enteredUsername = modelValue || viewValue;
25*afc8a799Smiramurali23                      const matchedExisting = scope.existingUsernames.find(
26*afc8a799Smiramurali23                          (username) => username === enteredUsername);
27*afc8a799Smiramurali23                      if (matchedExisting) {
28*afc8a799Smiramurali23                        return false;
29*afc8a799Smiramurali23                      } else {
30*afc8a799Smiramurali23                        return true;
31*afc8a799Smiramurali23                      }
32*afc8a799Smiramurali23                    };
33*afc8a799Smiramurali23                element.on('blur', () => {
34*afc8a799Smiramurali23                  controller.$validate();
35*afc8a799Smiramurali23                });
36*afc8a799Smiramurali23              }
37*afc8a799Smiramurali23        }
38*afc8a799Smiramurali23      });
39*afc8a799Smiramurali23})(window.angular);
40