1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-08 20:22:42 +01:00

Working on sign up form

This commit is contained in:
Hillel Coren 2013-12-02 21:54:24 +02:00
parent dd088d8668
commit 06eb6ad240
8 changed files with 132 additions and 32 deletions

53
LICENSE
View File

@ -1,20 +1,39 @@
The MIT License (MIT) Attribution Assurance License
Copyright (c) 2013 by Hillel Coren
http://www.hillelcoren.com
Copyright (c) 2013 hillelcoren All Rights Reserved
ATTRIBUTION ASSURANCE LICENSE (adapted from the original BSD license)
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the conditions below are met.
These conditions require a modest attribution to InvoiceNinja.com. The hope
is that its promotional value may help justify the thousands of dollars in
otherwise billable time invested in writing this and other freely available,
open-source software.
Permission is hereby granted, free of charge, to any person obtaining a copy of 1. Redistributions of source code, in whole or part and with or without
this software and associated documentation files (the "Software"), to deal in modification (the "Code"), must prominently display "Powered by InvoiceNinja.com"
the Software without restriction, including without limitation the rights to in verifiable form with a link to said site.
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 2. Neither the name nor any trademark of the Author may be used to
the Software, and to permit persons to whom the Software is furnished to do so, endorse or promote products derived from this software without specific
subject to the following conditions: prior written permission.
3. Users are entirely responsible, to the exclusion of the Author and
any other persons, for compliance with (1) regulations set by owners or
administrators of employed equipment, (2) licensing terms of any other
software, and (3) local regulations regarding use, including those
regarding import, export, and use of encryption software.
The above copyright notice and this permission notice shall be included in all THIS FREE SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND
copies or substantial portions of the Software. ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS EVENT SHALL THE AUTHOR OR ANY CONTRIBUTOR BE LIABLE FOR
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN EFFECTS OF UNAUTHORIZED OR MALICIOUS NETWORK ACCESS;
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -29,10 +29,10 @@ class AccountController extends \BaseController {
$random = str_random(20); $random = str_random(20);
$user = new User; $user = new User;
$user->username = $random.'@gmail.com'; //$user->username = $random.'@gmail.com';
$user->password = $random; //$user->password = $random;
$user->email = $random.'@gmail.com'; //$user->email = $random.'@gmail.com';
$user->password_confirmation = $random; //$user->password_confirmation = $random;
$account->users()->save($user); $account->users()->save($user);
} }

View File

@ -115,10 +115,10 @@ class ConfideSetupUsersTable extends Migration {
$t->string('last_name'); $t->string('last_name');
$t->string('phone'); $t->string('phone');
$t->string('username'); $t->string('username');
$t->string('email'); $t->string('email')->unique();
$t->string('password'); $t->string('password');
$t->string('confirmation_code'); $t->string('confirmation_code');
$t->boolean('is_guest')->default(true); $t->boolean('registered')->default(false);
$t->boolean('confirmed')->default(false); $t->boolean('confirmed')->default(false);
$t->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade'); $t->foreign('account_id')->references('id')->on('accounts')->onDelete('cascade');

View File

@ -36,6 +36,7 @@ Route::group(array('before' => array('auth', 'csrf')), function()
Route::get('account/{section?}', 'AccountController@showSection'); Route::get('account/{section?}', 'AccountController@showSection');
Route::post('account/{section?}', 'AccountController@doSection'); Route::post('account/{section?}', 'AccountController@doSection');
Route::resource('clients', 'ClientController'); Route::resource('clients', 'ClientController');
Route::get('api/clients', array('as'=>'api.clients', 'uses'=>'ClientController@getDatatable')); Route::get('api/clients', array('as'=>'api.clients', 'uses'=>'ClientController@getDatatable'));
Route::get('api/activities/{client_id?}', array('as'=>'api.activities', 'uses'=>'ActivityController@getDatatable')); Route::get('api/activities/{client_id?}', array('as'=>'api.activities', 'uses'=>'ActivityController@getDatatable'));

View File

@ -19,9 +19,7 @@
{{ Former::populate($account); }} {{ Former::populate($account); }}
{{ Former::populateField('first_name', $account->users()->first()->first_name) }} {{ Former::populateField('first_name', $account->users()->first()->first_name) }}
{{ Former::populateField('last_name', $account->users()->first()->last_name) }} {{ Former::populateField('last_name', $account->users()->first()->last_name) }}
@if (!$account->users()->first()->is_guest)
{{ Former::populateField('email', $account->users()->first()->email) }} {{ Former::populateField('email', $account->users()->first()->email) }}
@endif
{{ Former::populateField('phone', $account->users()->first()->phone) }} {{ Former::populateField('phone', $account->users()->first()->phone) }}
<div class="row"> <div class="row">
@ -55,7 +53,7 @@
{{ Former::legend('Users') }} {{ Former::legend('Users') }}
{{ Former::text('first_name') }} {{ Former::text('first_name') }}
{{ Former::text('last_name') }} {{ Former::text('last_name') }}
{{ Former::text('email')->label('Email/Username') }} {{ Former::text('email') }}
{{ Former::text('phone') }} {{ Former::text('phone') }}
</div> </div>
</div> </div>

View File

@ -233,8 +233,13 @@
<div> <div>
<span style="font-size:30px">Invoice Ninja</span> <span style="font-size:30px">Invoice Ninja</span>
<div style="float:right;text-align:right"> <div style="float:right;text-align:right">
Logged in as Guest (<u>Sign up</u>) | {{ link_to('account/details', 'My Account') }} @if (Auth::user()->registered)
<p class="text-danger">This is a sample site, the data is erased</p>
@else
{{ Button::sm_primary('Sign up', array('data-toggle'=>'modal', 'data-target'=>'#signUpModal')); }} &nbsp;
{{ link_to('account/details', 'My Account'); }}
@endif
<p class="text-danger">This is a sample site, the data is erased.</p>
</div> </div>
</div> </div>
@ -292,11 +297,82 @@
</div> </div>
@if (!Auth::user()->registered)
<div class="modal fade" id="signUpModal" tabindex="-1" role="dialog" aria-labelledby="signUpModalLabel" aria-hidden="true">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="myModalLabel">Sign Up</h4>
</div>
<div style="padding-right:20px" onkeyup="validateSignUp()" onkeydown="checkForEnter(event)">
{{ Former::open(); }}
{{ Former::populate(Auth::user()) }}
{{ Former::text('first_name'); }}
{{ Former::text('last_name'); }}
{{ Former::text('email'); }}
{{ Former::password('password'); }}
{{ Former::close(); }}
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
<button type="button" class="btn btn-primary" onclick="submitSignUp()">Save</button>
</div>
</div>
</div>
</div>
@endif
</body> </body>
<script type="text/javascript"> <script type="text/javascript">
@if (!Auth::user()->registered)
function validateSignUp(showError)
{
var isValid = true;
$(['first_name','last_name','email','password']).each(function(i, field) {
var $input = $('#'+field),
val = $.trim($input.val());
var isValid = val && val.length > (field == 'password' ? 6 : 0);
if (isValid && field == 'email') {
isValid = isValidEmailAddress(val);
}
if (isValid) {
$input.closest('div.form-group').removeClass('has-error');
$input.closest('div.form-group').addClass('has-success');
} else {
isValid = false;
$input.closest('div.form-group').removeClass('has-success');
if (showError) {
$input.closest('div.form-group').addClass('has-error');
}
}
});
return isValid;
}
function submitSignUp()
{
if (!validateSignUp(true)) {
return;
}
}
function checkForEnter(event)
{
if (event.keyCode === 13){
event.preventDefault();
submitSignUp();
return false;
}
}
@endif
$(function() { $(function() {
@if (Auth::user()->is_guest) @if (Auth::user()->is_guest)
@ -305,6 +381,10 @@
} }
@endif @endif
@if (!Auth::user()->registered)
validateSignUp();
@endif
@yield('onReady') @yield('onReady')
}); });

View File

@ -358,5 +358,7 @@ function isStorageSupported() {
} }
} }
function isValidEmailAddress(emailAddress) {
var pattern = new RegExp(/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?$/i);
return pattern.test(emailAddress);
};