Source: party/register.js

/**
 * Form to register
 * @mixin party/register
 */

'use strict';

app.controller('party/register', [
  '$scope', 'pageService', 'user', 'token',
  function ($scope, page, user, token) {
    $scope.page = page;
    page.display.title = "Register";

    $scope.auth = {};

    var initStep = {
      create: function (step) {
        var form = $scope.registerForm = step.$scope.registerForm;
        form.data = {};
        form.sent = false;

        var validate = {};
        ['prename', 'sortname', 'email', 'affiliation'].forEach(function (f) {
          validate[f] = {
            tips: page.constants.message('party.edit.' + f + '.help')
          };
        });
        validate.email.errors = page.constants.message('register.email.error');
        form.validator.client(validate, true);
      },

      agreement: function (step) {
        $scope.registerForm.$setUnsubmitted();
        step.$scope.proceed = function () {
          $scope.registerForm.$setPristine(); // maybe should be $setSubmitted
          page.models.Login.register($scope.registerForm.data)
            .then(function () {
              $scope.registerForm.$setUnsubmitted();
              $scope.registerForm.sent = true;
              $scope.proceed();
            }, function (res) {
              $scope.registerForm.$setUnsubmitted();
              page.messages.addError({
                body: page.constants.message('error.generic'),
                report: res
              });
            });
        };
      },

      email: function (/*step*/) {
      },

      password: function (step) {
        var form = $scope.passwordForm = step.$scope.passwordForm;
        form.sent = false;
        form.data = {};

        form.save = function () {
          form.$setSubmitted();
          page.messages.clear(form);
          page.models.Login.passwordToken(token.id, form.data)
            .then(function () {
              form.$setUnsubmitted();
              form.validator.server({});

              page.messages.add({
                type: 'green',
                body: page.constants.message('reset.save.success', form.data.email),
                owner: form
              });
              form.sent = true;
              page.$location.url(page.router.register());
            }, function (res) {
              form.$setUnsubmitted();
              form.validator.server(res);
            });
        };

        form.validator.client({
          'once': {
            tips: page.constants.message('reset.once.help'),
          },
          'again': {
            tips: page.constants.message('reset.again.help'),
          },
        }, true);
      },

      agent: function (step) {
        var form = $scope.authSearchForm = step.$scope.authSearchForm;
        form.data = {};

        step.$scope.authSearchSelectFn = function (found) {
          $scope.auth.party = found;
          delete $scope.auth.query;
          $scope.proceed();
        };

        step.$scope.authSearchNotFoundFn = function (query) {
          delete $scope.auth.party;
          $scope.auth.query = query;
          $scope.auth.principal = form.principal;
          $scope.proceed();
        };
      },

      request: function (step) {
        var form = $scope.authApplyForm = step.$scope.authApplyForm;
        form.sent = false;
        step.$scope.authApplySuccessFn = function () {
          form.sent = true;
          updateUserAuth();
        };

        step.$scope.authApplyCancelFn = function () {
          delete $scope.auth.party;
          delete $scope.auth.query;
          $scope.proceed();
        };
      },

      pending: function () {
      }
    };

    $scope.registerStep = function (step) {
      initStep[step.name](step);
      if (step.name === 'pending')
        $scope.proceed();
    };

    function updateUserAuth() {
      user.get(['parents']).then(function () {
        $scope.proceed();
      }, function (res) {
        page.messages.addError({
          body: page.constants.message('register.authquery.error'),
          report: res,
        });
      });
    }

    $scope.proceed = function () {
      var s = {};
      if (!page.models.Login.isLoggedIn())
        if (!token)
          if (!$scope.registerForm.sent) {
            s.create = true;
            s.agreement = $scope.registerForm.$dirty && $scope.registerForm.$valid;
          } else
            s.email = true;
        else
          s.password = !$scope.passwordForm.sent;
      else if (!(user.parents && user.parents.length) && !$scope.authApplyForm.sent) {
        s.agent = true;
        s.request = $scope.auth.party || $scope.auth.query;
      } else if (!page.models.Login.isAuthorized())
        s.pending = true;

      var a;
      for (var si = $scope.steps.length-1; si >= 0; si --) {
        var step = $scope.steps[si];
        step.complete = !!a;
        if (!(step.disabled = !s[step.name]))
          a = a || step;
      }
      if (a)
        $scope.activateStep(a);
      else
        page.$location.url('/');
    };
  }
]);