From 21c8e24ecaaef1e81e0c2ca37cbc342f600a0136 Mon Sep 17 00:00:00 2001 From: Andrey Antukh Date: Wed, 25 Jun 2014 16:30:00 +0200 Subject: [PATCH] Add initial version of register with validation. --- app/coffee/app.coffee | 1 + app/coffee/modules/auth.coffee | 83 ++++++++++++++++++- app/coffee/modules/base/confirm.coffee | 25 +++++- app/index.jade | 2 + app/partials/login.jade | 6 +- app/partials/register.jade | 19 +++++ .../views/modules/lightbox-generic-error.jade | 7 ++ app/partials/views/modules/login-form.jade | 5 +- app/partials/views/modules/register-form.jade | 12 ++- app/styles/modules/lightbox.scss | 20 +++++ app/styles/modules/register-form.scss | 2 +- gulpfile.coffee | 3 +- 12 files changed, 168 insertions(+), 17 deletions(-) create mode 100644 app/partials/register.jade create mode 100644 app/partials/views/modules/lightbox-generic-error.jade diff --git a/app/coffee/app.coffee b/app/coffee/app.coffee index 493d5c1d..98b9e214 100644 --- a/app/coffee/app.coffee +++ b/app/coffee/app.coffee @@ -26,6 +26,7 @@ configure = ($routeProvider, $locationProvider, $httpProvider, $provide, $compil $routeProvider.when("/project/:pslug/taskboard/:id", {templateUrl: "/partials/taskboard.html"}) $routeProvider.when("/login", {templateUrl: "/partials/login.html"}) + $routeProvider.when("/register", {templateUrl: "/partials/register.html"}) $routeProvider.otherwise({redirectTo: '/login'}) $locationProvider.html5Mode(true) diff --git a/app/coffee/modules/auth.coffee b/app/coffee/modules/auth.coffee index 51cf0989..e66c5427 100644 --- a/app/coffee/modules/auth.coffee +++ b/app/coffee/modules/auth.coffee @@ -54,6 +54,15 @@ class AuthService extends taiga.Service getToken: -> return @storage.get("token") + isAuthenticated: -> + if @.getUser() != null + return true + return false + + ################### + ## Http interface + ################### + login: (username, password) -> url = @urls.resolve("auth") @@ -69,10 +78,46 @@ class AuthService extends taiga.Service @.setUser(user) return user - isAuthenticated: -> - if @.getUser() != null - return true - return false + publicRegister: (data) -> + url = @urls.resolve("auth-register") + + data = _.clone(data, false) + data.type = "public" + + return @http.post(url, data).then (response) => + user = @model.make_model("users", response.data) + @.setToken(user.auth_token) + @.setUser(user) + return user + + # acceptInvitiationWithNewUser: (username, email, password, token) -> + # url = @urls.resolve("auth-register") + # data = _.extend(data, { + # username: username, + # password: password, + # token: token + # email: email + # existing: "off" + # } + # return @http.post(url, data).then (response) => + # user = @model.make_model("users", response.data) + # @.setToken(user.auth_token) + # @.setUser(user) + # return user + + # acceptInvitiationWithExistingUser: (username, password, token) -> + # url = @urls.resolve("auth-register") + # data = _.extend(data, { + # username: username, + # password: password, + # token: token, + # existing: "on" + # } + # return @http.post(url, data).then (response) => + # user = @model.make_model("users", response.data) + # @.setToken(user.auth_token) + # @.setUser(user) + # return user class AuthController extends taiga.Controller @@ -87,6 +132,36 @@ class AuthController extends taiga.Controller @location.path("/project/project-example-0/backlog") + +RegisterDirective = ($auth, $confirm) -> + link = ($scope, $el, $attrs) -> + $scope.data = {} + form = $el.find("form").checksley() + + submit = -> + if not form.validate() + return + + promise = $auth.publicRegister($scope.data) + promise.then (response) -> + # TODO: finish this. + console.log response + + promise.then null, (response) -> + if response.data._error_message + $confirm.error(response.data._error_message) + + $el.on "submit", (event) -> + event.preventDefault() + submit() + + $el.on "click", "a.button-register", (event) -> + event.preventDefault() + submit() + + return {link:link} + module = angular.module("taigaAuth", ["taigaResources"]) module.service("$tgAuth", AuthService) module.controller("AuthController", AuthController) +module.directive("tgRegister", ["$tgAuth", "$tgConfirm", RegisterDirective]) diff --git a/app/coffee/modules/base/confirm.coffee b/app/coffee/modules/base/confirm.coffee index 9dc5afd3..97118fe4 100644 --- a/app/coffee/modules/base/confirm.coffee +++ b/app/coffee/modules/base/confirm.coffee @@ -25,14 +25,17 @@ class ConfirmService extends taiga.Service @.$inject = ["$q"] constructor: (@q) -> - @.el = angular.element(".lightbox_confirm-delete") _.bindAll(@) hide: -> - @.el.addClass("hidden") - @.el.off(".confirm-dialog") + if @.el + @.el.addClass("hidden") + @.el.off(".confirm-dialog") + delete @.el ask: (title, subtitle) -> + @.el = angular.element(".lightbox_confirm-delete") + # Render content @.el.find("h2.title").html(title) @.el.find("span.subtitle").html(subtitle) @@ -52,6 +55,22 @@ class ConfirmService extends taiga.Service @.el.removeClass("hidden") return defered.promise + error: (message) -> + @.el = angular.element(".lightbox-generic-error") + + # Render content + @.el.find("h2.title").html(message) + defered = @q.defer() + + # Assign event handlers + @.el.on "click.confirm-dialog", "a.button-green", (event) => + event.preventDefault() + defered.resolve() + @.hide() + + @.el.removeClass("hidden") + return defered.promise + module = angular.module("taigaBase") module.service("$tgConfirm", ["$q", ConfirmService]) diff --git a/app/index.jade b/app/index.jade index f95e6dda..4f1be36e 100644 --- a/app/index.jade +++ b/app/index.jade @@ -13,5 +13,7 @@ html(lang="en", ng-app="taiga") div.master(ng-view="") div.hidden.lightbox.lightbox_confirm-delete include partials/views/modules/lightbox_confirm-delete + div.hidden.lightbox.lightbox-generic-error + include partials/views/modules/lightbox-generic-error script(src="/js/libs.js?v=#{v}") script(src="/js/app.js?v=#{v}") diff --git a/app/partials/login.jade b/app/partials/login.jade index a05117e4..cd13539c 100644 --- a/app/partials/login.jade +++ b/app/partials/login.jade @@ -17,6 +17,6 @@ block content a.icon.icon-delete(href="", title="Close message") include views/modules/login-form - include views/modules/register-form - include views/modules/forgot-form - include views/modules/reset-pass + // include views/modules/register-form + // include views/modules/forgot-form + // include views/modules/reset-pass diff --git a/app/partials/register.jade b/app/partials/register.jade new file mode 100644 index 00000000..350298d1 --- /dev/null +++ b/app/partials/register.jade @@ -0,0 +1,19 @@ +extends dummy-layout +//extends login-layout + +block head + title Taiga Project management web application with scrum in mind! + +block content + div.wrapper(ng-controller="AuthController as ctrl") + div.login-main + div.login-container + h1.logo + img(src="/images/logo.png", alt="TAIGA") + p.tagline Project management web application with scrum in mind! + p.login-error + span.title Ooops! Something went wrong! + span.text According to our Oompa Loompas, your username or password are incorrect. + a.icon.icon-delete(href="", title="Close message") + + include views/modules/register-form diff --git a/app/partials/views/modules/lightbox-generic-error.jade b/app/partials/views/modules/lightbox-generic-error.jade new file mode 100644 index 00000000..db878226 --- /dev/null +++ b/app/partials/views/modules/lightbox-generic-error.jade @@ -0,0 +1,7 @@ +a.close(href="", title="close") + span.icon.icon-delete +section + h2.title + div.delete-options + a.button.button-green(href="", title="Accept") + span Accept diff --git a/app/partials/views/modules/login-form.jade b/app/partials/views/modules/login-form.jade index f48a1bf0..bfe57491 100644 --- a/app/partials/views/modules/login-form.jade +++ b/app/partials/views/modules/login-form.jade @@ -1,5 +1,5 @@ div.login-form-container - form.login-form + form.login-form(ng-submit="ctrl.submit()") fieldset input(type="text", name="username", ng-model="form.username", placeholder="User name") fieldset.login-password @@ -9,8 +9,11 @@ div.login-form-container fieldset input.remember-me(type="checkbox", checked="checked", id="remember-me") label(for="remember-me") remember me on this computer + fieldset a.button.button-login.button-gray(href="", ng-click="ctrl.submit()", title="Log in") Enter + input(type="submit", class="hidden") + p.login-text span Not registered yet? a(href="", title="Register") create your free account here diff --git a/app/partials/views/modules/register-form.jade b/app/partials/views/modules/register-form.jade index eaf86509..bbbe11a6 100644 --- a/app/partials/views/modules/register-form.jade +++ b/app/partials/views/modules/register-form.jade @@ -1,13 +1,17 @@ -div.register-form-container +div.register-form-container(tg-register) form.register-form fieldset - input(type="text" placeholder="Pick a username") + input(type="text", placeholder="Pick a username", ng-model="data.username", + data-required="true") fieldset - input(type="text" placeholder="Your email") + input(type="text", placeholder="Your email", ng-model="data.email", data-required="true") fieldset - input(type="password" placeholder="Set a password") + input(type="password" placeholder="Set a password", ng-model="data.password", + data-required="true") fieldset a.button.button-register.button-gray(href="", title="Sign up") Sign up + input(type="submit", class="hidden") + p.register-text span By clicking "Sign up", you agree to our
a(href="", title="See terms of service") terms of service diff --git a/app/styles/modules/lightbox.scss b/app/styles/modules/lightbox.scss index 60e79ce6..c634873b 100644 --- a/app/styles/modules/lightbox.scss +++ b/app/styles/modules/lightbox.scss @@ -238,3 +238,23 @@ } } } + + +.lightbox-generic-error { + section { + flex-basis: 0; + flex-grow: 0; + flex-shrink: 0; + min-width: 420px; + width: 420px; + } + .delete-options { + @include table-flex(); + a { + @include table-flex-child(1, 0, 0); + padding: 8px 0; + text-align: center; + } + } +} + diff --git a/app/styles/modules/register-form.scss b/app/styles/modules/register-form.scss index 6d940cf0..773c7b44 100644 --- a/app/styles/modules/register-form.scss +++ b/app/styles/modules/register-form.scss @@ -1,3 +1,3 @@ .register-form-container { - display: none; + display: block; } diff --git a/gulpfile.coffee b/gulpfile.coffee index 248a4d8d..f02fd1af 100644 --- a/gulpfile.coffee +++ b/gulpfile.coffee @@ -53,7 +53,8 @@ paths = { "app/vendor/angular-animate/angular-animate.js", "app/vendor/i18next/i18next.js", "app/js/Sortable.js", - "app/vendor/moment/min/moment-with-langs.js" + "app/vendor/moment/min/moment-with-langs.js", + "app/vendor/checksley/checksley.js" ] }