1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-09 20:52:56 +01:00

Cleaning up the templates

This commit is contained in:
Hillel Coren 2013-12-07 20:45:00 +02:00
parent 9053be4976
commit 616df18b06
30 changed files with 519 additions and 307 deletions

View File

@ -47,9 +47,9 @@ return array(
|
|
*/
'login_form' => 'login',
'login_form' => 'users.login',
'signup_form' => 'confide::signup',
'forgot_password_form' => 'confide::forgot_password',
'forgot_password_form' => 'users.forgot_password',
'reset_password_form' => 'confide::reset_password',
/*

View File

@ -31,6 +31,8 @@ class AccountController extends \BaseController {
$user = new User;
$user->password = $random;
$account->users()->save($user);
Session::forget(RECENTLY_VIEWED);
}
Auth::login($user, true);
@ -188,6 +190,7 @@ class AccountController extends \BaseController {
foreach ($row as $index => $value)
{
$field = $map[$index];
$value = trim($value);
if ($field == Client::$fieldName)
{
@ -387,7 +390,7 @@ class AccountController extends \BaseController {
$config = new stdClass;
foreach ($fields as $field => $details)
{
$config->$field = Input::get($gateway->id.'_'.$field);
$config->$field = trim(Input::get($gateway->id.'_'.$field));
}
$accountGateway->config = json_encode($config);
@ -417,21 +420,21 @@ class AccountController extends \BaseController {
else
{
$account = Account::findOrFail(Auth::user()->account_id);
$account->name = Input::get('name');
$account->address1 = Input::get('address1');
$account->address2 = Input::get('address2');
$account->city = Input::get('city');
$account->state = Input::get('state');
$account->postal_code = Input::get('postal_code');
$account->name = trim(Input::get('name'));
$account->address1 = trim(Input::get('address1'));
$account->address2 = trim(Input::get('address2'));
$account->city = trim(Input::get('city'));
$account->state = trim(Input::get('state'));
$account->postal_code = trim(Input::get('postal_code'));
$account->country_id = Input::get('country_id') ? Input::get('country_id') : null;
$account->timezone_id = Input::get('timezone_id') ? Input::get('timezone_id') : null;
$account->save();
$user = $account->users()->first();
$user->first_name = Input::get('first_name');
$user->last_name = Input::get('last_name');
$user->email = Input::get('email');
$user->phone = Input::get('phone');
$user->first_name = trim(Input::get('first_name'));
$user->last_name = trim(Input::get('last_name'));
$user->email = trim(Input::get('email'));
$user->phone = trim(Input::get('phone'));
$user->save();
if (Input::get('timezone_id')) {
@ -480,10 +483,10 @@ class AccountController extends \BaseController {
}
$user = Auth::user();
$user->first_name = Input::get('first_name');
$user->last_name = Input::get('last_name');
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->first_name = trim(Input::get('first_name'));
$user->last_name = trim(Input::get('last_name'));
$user->email = trim(Input::get('email'));
$user->password = trim(Input::get('password'));
$user->registered = true;
$user->save();

View File

@ -92,7 +92,7 @@ class ClientController extends \BaseController {
public function show($publicId)
{
$client = Client::scope($publicId)->with('contacts')->firstOrFail();
trackViewed($client->name);
trackViewed($client->name, ENTITY_CLIENT);
$data = array(
'client' => $client,
@ -149,14 +149,14 @@ class ClientController extends \BaseController {
$client = Client::createNew();
}
$client->name = Input::get('name');
$client->work_phone = Input::get('work_phone');
$client->address1 = Input::get('address1');
$client->address2 = Input::get('address2');
$client->city = Input::get('city');
$client->state = Input::get('state');
$client->notes = Input::get('notes');
$client->postal_code = Input::get('postal_code');
$client->name = trim(Input::get('name'));
$client->work_phone = trim(Input::get('work_phone'));
$client->address1 = trim(Input::get('address1'));
$client->address2 = trim(Input::get('address2'));
$client->city = trim(Input::get('city'));
$client->state = trim(Input::get('state'));
$client->notes = trim(Input::get('notes'));
$client->postal_code = trim(Input::get('postal_code'));
if (Input::get('country_id')) {
$client->country_id = Input::get('country_id');
}
@ -177,10 +177,10 @@ class ClientController extends \BaseController {
$record = Contact::createNew();
}
$record->email = $contact->email;
$record->first_name = $contact->first_name;
$record->last_name = $contact->last_name;
$record->phone = $contact->phone;
$record->email = trim($contact->email);
$record->first_name = trim($contact->first_name);
$record->last_name = trim($contact->last_name);
$record->phone = trim($contact->phone);
$record->is_primary = $isPrimary;
$isPrimary = false;

View File

@ -114,7 +114,7 @@ class CreditController extends \BaseController {
$credit->client_id = Input::get('client');
$credit->credit_date = toSqlDate(Input::get('credit_date'));
$credit->amount = Input::get('amount');
$credit->amount = floatval(Input::get('amount'));
$credit->save();
$message = $publicId ? 'Successfully updated credit' : 'Successfully created credit';

View File

@ -6,6 +6,6 @@ class HomeController extends BaseController {
public function showWelcome()
{
return View::make('home.index');
return View::make('splash');
}
}

View File

@ -73,6 +73,11 @@ class InvoiceController extends \BaseController {
$user = $invitation->user;
$invoice = $invitation->invoice;
if ($invoice->invoice_status_id < INVOICE_STATUS_VIEWED) {
$invoice->invoice_status_id = INVOICE_STATUS_VIEWED;
$invoice->save();
}
$now = Carbon::now()->toDateTimeString();
$invitation->viewed_date = $now;
@ -84,7 +89,12 @@ class InvoiceController extends \BaseController {
Activity::viewInvoice($invitation);
return View::make('invoices.view')->with('invoice', $invoice);
$data = array(
'invoice' => $invoice,
'invitation' => $invitation
);
return View::make('invoices.view', $data);
}
private function createGateway($accountGateway)
@ -119,9 +129,9 @@ class InvoiceController extends \BaseController {
);
$card = new CreditCard($data);
return [
'amount' => $invoice->getTotal(),
'amount' => $invoice->total,
'card' => $card,
'currency' => 'USD',
'returnUrl' => URL::to('complete'),
@ -131,13 +141,14 @@ class InvoiceController extends \BaseController {
public function show_payment($invitationKey)
{
$invoice = Invoice::with('invoice_items', 'client.account.account_gateways.gateway')->where('invitation_key', '=', $invitationKey)->firstOrFail();
$invitation = Invitation::with('invoice.invoice_items', 'invoice.client.account.account_gateways.gateway')->where('invitation_key', '=', $invitationKey)->firstOrFail();
$invoice = $invitation->invoice;
$accountGateway = $invoice->client->account->account_gateways[0];
$gateway = InvoiceController::createGateway($accountGateway);
try
{
$details = InvoiceController::getPaymentDetails($invoice);
$details = InvoiceController::getPaymentDetails($invoice);
$response = $gateway->purchase($details)->send();
$ref = $response->getTransactionReference();
@ -147,13 +158,17 @@ class InvoiceController extends \BaseController {
exit('Sorry, there was an error processing your payment. Please try again later.');
}
$payment = new Payment;
$payment = Payment::createNew();
$payment->invitation_id = $invitation->id;
$payment->invoice_id = $invoice->id;
$payment->account_id = $invoice->account_id;
$payment->contact_id = 0; // TODO_FIX
$payment->amount = $invoice->total;
$payment->client_id = $invoice->client_id;
//$payment->contact_id = 0; // TODO_FIX
$payment->transaction_reference = $ref;
$payment->save();
$invoice->balance = floatval($invoice->total) - floatval($paymount->amount);
if ($response->isSuccessful())
{
@ -180,7 +195,7 @@ class InvoiceController extends \BaseController {
$payerId = Request::query('PayerID');
$token = Request::query('token');
$payment = Payment::with('invoice.invoice_items')->where('transaction_reference','=',$token)->firstOrFail();
$payment = Payment::with('invitation', 'invoice.invoice_items')->where('transaction_reference','=',$token)->firstOrFail();
$invoice = Invoice::with('client.account.account_gateways.gateway')->where('id', '=', $payment->invoice_id)->firstOrFail();
$accountGateway = $invoice->client->account->account_gateways[0];
$gateway = InvoiceController::createGateway($accountGateway);
@ -195,11 +210,17 @@ class InvoiceController extends \BaseController {
{
$payment->payer_id = $payerId;
$payment->transaction_reference = $ref;
$payment->amount = $payment->invoice->getTotal();
$payment->save();
if ($payment->amount >= $invoice->amount) {
$invoice->invoice_status_id = INVOICE_STATUS_PAID;
} else {
$invoice->invoice_status_id = INVOICE_STATUS_PARTIAL;
}
$invoice->save();
Session::flash('message', 'Successfully applied payment');
return Redirect::to('view/' . $payment->invoice->key);
return Redirect::to('view/' . $payment->invitation->invitation_key);
}
else
{
@ -216,7 +237,7 @@ class InvoiceController extends \BaseController {
public function edit($publicId)
{
$invoice = Invoice::scope($publicId)->with('account.country', 'client', 'invoice_items')->firstOrFail();
trackViewed($invoice->invoice_number . ' - ' . $invoice->client->name);
trackViewed($invoice->invoice_number . ' - ' . $invoice->client->name, ENTITY_INVOICE);
$data = array(
'account' => $invoice->account,
@ -271,7 +292,7 @@ class InvoiceController extends \BaseController {
private function save($publicId = null)
{
$action = Input::get('action');
if ($action == 'archive' || $action == 'delete')
{
return InvoiceController::bulk();
@ -295,13 +316,13 @@ class InvoiceController extends \BaseController {
if ($clientPublicId == "-1")
{
$client = Client::createNew();
$client->name = Input::get('name');
$client->work_phone = Input::get('work_phone');
$client->address1 = Input::get('address1');
$client->address2 = Input::get('address2');
$client->city = Input::get('city');
$client->state = Input::get('state');
$client->postal_code = Input::get('postal_code');
$client->name = trim(Input::get('name'));
$client->work_phone = trim(Input::get('work_phone'));
$client->address1 = trim(Input::get('address1'));
$client->address2 = trim(Input::get('address2'));
$client->city = trim(Input::get('city'));
$client->state = trim(Input::get('state'));
$client->postal_code = trim(Input::get('postal_code'));
if (Input::get('country_id')) {
$client->country_id = Input::get('country_id');
}
@ -310,10 +331,10 @@ class InvoiceController extends \BaseController {
$contact = Contact::createNew();
$contact->is_primary = true;
$contact->first_name = Input::get('first_name');
$contact->last_name = Input::get('last_name');
$contact->phone = Input::get('phone');
$contact->email = Input::get('email');
$contact->first_name = trim(Input::get('first_name'));
$contact->last_name = trim(Input::get('last_name'));
$contact->phone = trim(Input::get('phone'));
$contact->email = trim(Input::get('email'));
$client->contacts()->save($contact);
}
else
@ -329,14 +350,17 @@ class InvoiceController extends \BaseController {
$invoice = Invoice::createNew();
}
$invoice->invoice_number = Input::get('invoice_number');
$invoice->invoice_number = trim(Input::get('invoice_number'));
$invoice->discount = 0;
$invoice->invoice_date = toSqlDate(Input::get('invoice_date'));
$invoice->due_date = toSqlDate(Input::get('due_date'));
$invoice->notes = Input::get('notes');
$client->invoices()->save($invoice);
$items = json_decode(Input::get('items'));
$total = 0;
foreach ($items as $item)
{
if (!isset($item->cost)) {
@ -346,6 +370,22 @@ class InvoiceController extends \BaseController {
$item->qty = 0;
}
$total += intval($item->qty) * floatval($item->cost);
}
if ($action == 'email' && $invoice->invoice_status_id == INVOICE_STATUS_DRAFT)
{
$invoice->invoice_status_id = INVOICE_STATUS_SENT;
$client->balance = $invoice->client->balance + $invoice->total;
$client->save();
}
$invoice->total = $total;
$invoice->save();
foreach ($items as $item)
{
if (!$item->cost && !$item->qty && !$item->product_key && !$item->notes)
{
continue;
@ -353,12 +393,12 @@ class InvoiceController extends \BaseController {
if ($item->product_key)
{
$product = Product::findProductByKey($item->product_key);
$product = Product::findProductByKey(trim($item->product_key));
if (!$product)
{
$product = Product::createNew();
$product->product_key = $item->product_key;
$product->product_key = trim($item->product_key);
}
/*
@ -372,14 +412,17 @@ class InvoiceController extends \BaseController {
$invoiceItem = InvoiceItem::createNew();
$invoiceItem->product_id = isset($product) ? $product->id : null;
$invoiceItem->product_key = $item->product_key;
$invoiceItem->notes = $item->notes;
$invoiceItem->cost = $item->cost;
$invoiceItem->qty = $item->qty;
$invoiceItem->product_key = trim($item->product_key);
$invoiceItem->notes = trim($item->notes);
$invoiceItem->cost = floatval($item->cost);
$invoiceItem->qty = intval($item->qty);
$invoice->invoice_items()->save($invoiceItem);
}
/*
*/
if ($action == 'email')
{
$data = array('link' => URL::to('view') . '/' . $invoice->invoice_key);

View File

@ -123,7 +123,7 @@ class PaymentController extends \BaseController
$payment->client_id = Input::get('client');
$payment->invoice_id = $invoiceId;
$payment->payment_date = toSqlDate(Input::get('payment_date'));
$payment->amount = Input::get('amount');
$payment->amount = floatval(Input::get('amount'));
$payment->save();
$message = $publicId ? 'Successfully updated payment' : 'Successfully created payment';

View File

@ -74,8 +74,6 @@ class UserController extends BaseController {
{
if( Confide::user() )
{
// If user is logged, redirect to internal
// page, change it to '/admin', '/dashboard' or something
return Redirect::to('/');
}
else
@ -94,7 +92,7 @@ class UserController extends BaseController {
'email' => Input::get( 'email' ), // May be the username too
'username' => Input::get( 'email' ), // so we have to pass both
'password' => Input::get( 'password' ),
'remember' => Input::get( 'remember' ),
'remember' => true,
);
// If you wish to only allow login from confirmed users, call logAttempt
@ -102,12 +100,16 @@ class UserController extends BaseController {
// logAttempt will check if the 'email' perhaps is the username.
// Get the value from the config file instead of changing the controller
if ( Confide::logAttempt( $input, Config::get('confide::signup_confirm') ) )
{
{
$account = Account::findOrFail(Auth::user()->account_id);
$account->last_login = Carbon::now()->toDateTimeString();
$account->save();
// Redirect the user to the URL they were trying to access before
// caught by the authentication filter IE Redirect::guest('user/login').
// Otherwise fallback to '/'
// Fix pull #145
return Redirect::intended('/'); // change it to '/admin', '/dashboard' or something
return Redirect::intended('/clients'); // change it to '/admin', '/dashboard' or something
}
else
{
@ -118,18 +120,20 @@ class UserController extends BaseController {
{
$err_msg = Lang::get('confide::confide.alerts.too_many_attempts');
}
/*
elseif( $user->checkUserExists( $input ) and ! $user->isConfirmed( $input ) )
{
$err_msg = Lang::get('confide::confide.alerts.not_confirmed');
}
*/
else
{
$err_msg = Lang::get('confide::confide.alerts.wrong_credentials');
}
return Redirect::action('UserController@login')
->withInput(Input::except('password'))
->with( 'error', $err_msg );
return Redirect::action('UserController@login')
->withInput(Input::except('password'))
->with( 'error', $err_msg );
}
}

View File

@ -293,6 +293,7 @@ class ConfideSetupUsersTable extends Migration {
$t->unsignedInteger('account_id');
$t->unsignedInteger('client_id');
$t->unsignedInteger('contact_id')->nullable();
$t->unsignedInteger('invitation_id')->nullable();
$t->unsignedInteger('user_id')->nullable();
$t->timestamps();
$t->softDeletes();

View File

@ -40,7 +40,7 @@ class Activity extends Eloquent
$activity = Activity::getBlank();
$activity->client_id = $client->id;
$activity->activity_type_id = ACTIVITY_TYPE_CREATE_CLIENT;
$activity->message = Auth::user()->getFullName() . ' created client ' . link_to('clients/'.$client->id, $client->name);
$activity->message = Auth::user()->getFullName() . ' created client ' . link_to('clients/'.$client->public_id, $client->name);
$activity->save();
}
@ -60,7 +60,7 @@ class Activity extends Eloquent
$activity->invoice_id = $invoice->id;
$activity->client_id = $invoice->client_id;
$activity->activity_type_id = ACTIVITY_TYPE_CREATE_INVOICE;
$activity->message = Auth::user()->getFullName() . ' created invoice ' . link_to('invoices/'.$invoice->id, $invoice->invoice_number);
$activity->message = Auth::user()->getFullName() . ' created invoice ' . link_to('invoices/'.$invoice->public_id, $invoice->invoice_number);
$activity->save();
}
@ -81,7 +81,7 @@ class Activity extends Eloquent
$activity->invoice_id = $invitation->invoice_id;
$activity->contact_id = $invitation->contact_id;
$activity->activity_type_id = ACTIVITY_TYPE_EMAIL_INVOICE;
//$activity->message = Auth::user()->getFullName() . ' emailed invoice ' . $invitation->invoice->number . ' to ' . $contact->getFullName();
$activity->message = Auth::user()->getFullName() . ' emailed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number) . ' to ' . $invitation->contact->getFullName();
$activity->save();
}
@ -127,7 +127,7 @@ class Activity extends Eloquent
$activity->invoice_id = $invoice->id;
$activity->client_id = $invoice->client_id;
$activity->activity_type_id = ACTIVITY_TYPE_ARCHIVE_PAYMENT;
$activity->message = Auth::user()->getFullName() . ' archived payment ' . $invoice->number;
$activity->message = Auth::user()->getFullName() . ' archived payment';
$activity->save();
}
@ -141,7 +141,7 @@ class Activity extends Eloquent
$activity->contact_id = $invitation->contact_id;
$activity->invoice_id = $invitation->invoice_id;
$activity->activity_type_id = ACTIVITY_TYPE_VIEW_INVOICE;
//$activity->message = $contact->getFullName() . ' viewed invoice ' . $invoice->number;
$activity->message = $invitation->contact->getFullName() . ' viewed invoice ' . link_to('invoices/'.$invitation->invoice->public_id, $invitation->invoice->invoice_number);
$activity->save();
}
}

View File

@ -24,6 +24,11 @@ class Client extends EntityModel
return $this->hasMany('Invoice');
}
public function payments()
{
return $this->hasMany('Payment');
}
public function contacts()
{
return $this->hasMany('Contact');

View File

@ -7,6 +7,11 @@ class Payment extends EntityModel
return $this->belongsTo('Invoice');
}
public function invitation()
{
return $this->belongsTo('Invitation');
}
public function client()
{
return $this->belongsTo('Client');

View File

@ -84,4 +84,9 @@ class User extends ConfideUser implements UserInterface, RemindableInterface, iP
return $fullName;
}
}
public function showGreyBackground()
{
return !$this->theme_id || in_array($this->theme_id, [2, 3, 5, 6, 7, 8, 10, 11, 12]);
}
}

View File

@ -24,6 +24,17 @@ Route::get('complete', 'InvoiceController@do_payment');
Route::post('signup/validate', 'AccountController@checkEmail');
Route::post('signup/submit', 'AccountController@submitSignup');
// Confide routes
Route::get('login', 'UserController@login');
Route::post('login', 'UserController@do_login');
//Route::get( 'user/confirm/{code}', 'UserController@confirm');
Route::get('forgot_password', 'UserController@forgot_password');
Route::post('forgot_password', 'UserController@do_forgot_password');
//Route::get('user/reset_password/{token}', 'UserController@reset_password');
//Route::post('user/reset_password', 'UserController@do_reset_password');
Route::get('logout', 'UserController@logout');
Route::filter('auth', function()
{
if (!Auth::check())
@ -62,18 +73,6 @@ Route::group(array('before' => 'auth'), function()
Route::get('reports', function() { return View::make('header'); });
});
// Confide routes
//Route::get( 'user/create', 'UserController@create');
//Route::post('user', 'UserController@store');
Route::get('login', 'UserController@login');
Route::post('login', 'UserController@do_login');
//Route::get( 'user/confirm/{code}', 'UserController@confirm');
//Route::get( 'user/forgot_password', 'UserController@forgot_password');
//Route::post('user/forgot_password', 'UserController@do_forgot_password');
//Route::get( 'user/reset_password/{token}', 'UserController@reset_password');
//Route::post('user/reset_password', 'UserController@do_reset_password');
Route::get('logout', 'UserController@logout');
@ -132,7 +131,8 @@ function timestampToDateTimeString($timestamp) {
if ($date->year < 1900) {
return '';
}
return $date->toFormattedDateTimeString();
return $date->format('l M jS, Y g:ia');
}
function timestampToDateString($timestamp) {
@ -206,7 +206,7 @@ function processedRequest($url)
function trackViewed($name)
function trackViewed($name, $type)
{
$url = Request::url();
$viewed = Session::get(RECENTLY_VIEWED);
@ -218,7 +218,7 @@ function trackViewed($name)
$object = new stdClass;
$object->url = $url;
$object->name = $name;
$object->name = ucwords($type) . ': ' . $name;
for ($i=0; $i<count($viewed); $i++)
{
@ -261,11 +261,18 @@ define("ACCOUNT_IMPORT", "import");
define("ACCOUNT_MAP", "import_map");
define("ACCOUNT_EXPORT", "export");
define("DEFAULT_INVOICE_NUMBER", "0001");
define("RECENTLY_VIEWED_LIMIT", 8);
define('INVOICE_STATUS_DRAFT', 1);
define('INVOICE_STATUS_SENT', 2);
define('INVOICE_STATUS_VIEWED', 3);
define('INVOICE_STATUS_PARTIAL', 4);
define('INVOICE_STATUS_PAID', 5);
interface iPerson
{
//public function getFullName();

View File

@ -1,8 +1,8 @@
@extends('accounts.nav')
@section('content')
@parent
@parent
<style type="text/css">
#logo {

View File

@ -1,7 +1,7 @@
@extends('header')
@section('content')
<ul class="nav nav-tabs nav nav-justified">
{{ HTML::nav_link('account/details', 'Details') }}
{{ HTML::nav_link('account/settings', 'Settings') }}

View File

@ -1,6 +1,6 @@
@extends('header')
@section('content')
@section('content')
<div class="pull-right">

View File

@ -1,40 +1,17 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<meta name="csrf-token" content="<?= csrf_token() ?>">
@extends('master')
<title>Invoice Ninja {{ isset($title) ? $title : '' }}</title>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
@section('head')
<meta name="csrf-token" content="<?= csrf_token() ?>">
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<!--
<script src="{{ asset('js/typeahead.js') }}" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="{{ asset('css/typeahead.js-bootstrap.css') }}"/>
-->
@if (Auth::check() && Auth::user()->theme_id)
<link rel="stylesheet" type="text/css" href="{{ asset('css/themes/'.Auth::user()->theme->name.'.min.css') }}"/>
@else
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
@endif
<script src="{{ asset('js/bootstrap.js') }}" type="text/javascript"></script>
<!-- <link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap-theme.min.css"> -->
{{-- Basset::show('bootstrapper.css') --}}
{{-- Basset::show('bootstrapper.js') --}}
<script src="{{ asset('js/bootstrap.js') }}" type="text/javascript"></script>
<script src="{{ asset('js/bootstrap-combobox.js') }}" type="text/javascript"></script>
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap-combobox.css') }}"/>
@ -56,9 +33,14 @@
<style type="text/css">
@if (!Auth::check() || Auth::user()->showGreyBackground())
body {
background-color: #EEEEEE;
}
@endif
body > div.container {
min-height: 600px;
min-height: 600px;
}
label.control-label {
@ -188,10 +170,12 @@
border-style: none !important;
}
/*
table.invoice-table tbody tr:hover {
background-color: #FFFFFF !important;
}
*/
.invoice-table td {
padding: 2px !important;
}
@ -217,27 +201,14 @@
</style>
</head>
<body>
@if (App::environment() != ENV_DEVELOPMENT)
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-46031341-1', 'sketch-out.com');
ga('send', 'pageview');
</script>
@endif
@stop
@section('body')
<div class="container">
<p/>
<div>
<span style="font-size:30px">Invoice Ninja</span>
<a href="{{ URL::to('/') }}" style="font-size:30px;color:black">Invoice Ninja</a>
<div style="float:right">
@if (Auth::check() && Auth::user()->registered)
{{ Auth::user()->email }} &nbsp;
@ -521,4 +492,5 @@
});
</script>
</html>
@stop

View File

@ -1,7 +1,7 @@
@extends('header')
@section('content')
<p>&nbsp;</p>
{{ Former::open($url)->method($method)->addClass('main_form')->rules(array(
@ -24,7 +24,7 @@
<div class="row">
<div class="col-md-6">
{{ Former::select('client')->addOption('', '')->fromQuery($clients, 'name', 'public_id')->select($client ? $client->public_id : '')
{{ Former::select('client')->addOption('', '')->fromQuery($clients, 'name', 'public_id')->select($client ? $client->public_id : '')->addGroupClass('client_select')
->help('<a style="cursor:pointer" data-toggle="modal" id="modalLink" onclick="showCreateNew()">Create new client</a>') }}
{{ Former::textarea('notes') }}
</div>
@ -77,7 +77,7 @@
<input data-bind="value: tax, valueUpdate: 'afterkeydown'"/>
</td>
-->
<td style="width:100px;background-color: #FFFFFF;text-align: right;padding-top:9px !important">
<td style="width:100px;text-align: right;padding-top:9px !important">
<span data-bind="text: total"></span>
</td>
<td style="width:20px; cursor:pointer" class="hide-border">
@ -116,11 +116,14 @@
<p>&nbsp;</p>
<div class="form-actions">
@if ($invoice)
<div style="display:none">
{{ Former::text('action') }}
<div style="display:none">
{{ Former::text('action') }}
@if ($invoice)
{{ Former::text('id') }}
</div>
@endif
</div>
@if ($invoice)
{{ DropdownButton::normal('Download PDF',
Navigation::links(
array(
@ -174,7 +177,7 @@
{{ Former::text('city') }}
{{ Former::text('state') }}
{{ Former::text('postal_code') }}
{{ Former::select('country_id')->addOption('','')->label('Country')
{{ Former::select('country_id')->addOption('','')->label('Country')->addGroupClass('country_select')
->fromQuery($countries, 'name', 'id')->select($client ? $client->country_id : '') }}
</div>
</div>
@ -242,17 +245,17 @@
var $input = $('select#client');
$input.combobox();
$('.combobox-container input.form-control').attr('name', 'client_combobox').on('change', function(e) {
$('.client_select input.form-control').on('change', function(e) {
refreshPDF();
}).on('keydown', function() {
$('#modalLink').text('Create new client');
});
enableHoverClick($('.combobox-container input.form-control'), $('.combobox-container input[name=client]'), '{{ URL::to('clients') }}');
//enableHoverClick($('.combobox-container input.form-control'), $('.combobox-container input[name=client]'), '{{ URL::to('clients') }}');
@if ($client)
$('input#invoice_number').focus();
@else
$('[name="client_combobox"]').focus();
//$('[name="client_combobox"]').focus();
@endif
/*
@ -277,7 +280,8 @@
});
function showCreateNew() {
if ($('.combobox-container input[name=client]').val() != '-1') {
console.log('showCreateNew: %s', $('input[name=client]').val());
if ($('input[name=client]').val() != '-1') {
$('#myModal input').val('');
$('#myModal #country_id').val('');
$('#nameError').css( "display", "none" );
@ -327,9 +331,6 @@
name: "{{ $account->country ? $account->country->name : '' }}"
}
},
client: {
name: $('[name="client_combobox"]').val()
},
@if (file_exists($account->getLogoPath()))
image: "{{ HTML::image_data($account->getLogoPath()) }}",
imageWidth: {{ $account->getLogoWidth() }},
@ -338,6 +339,26 @@
invoice_items: []
};
var clientId = $('input[name=client]').val();
console.log('clientId: %s', clientId);
console.log('mapped: %s', clientMap[clientId]);
if (clientId == '-1') {
var client = {
name: $('#name').val(),
address1: $('#address1').val(),
address2: $('#address2').val(),
city: $('#city').val(),
state: $('#state').val(),
postal_code: $('#postal_code').val(),
country: {
name: $('.country_select input[type=text]').val()
}
};
} else if (clientMap.hasOwnProperty(clientId)) {
var client = clientMap[clientId];
}
invoice.client = client;
for(var i=0; i<model.items().length; i++) {
var item = model.items()[i];
invoice.invoice_items.push({
@ -352,11 +373,17 @@
}
function refreshPDF() {
setTimeout(function() {
_refreshPDF();
}, 100);
}
function _refreshPDF() {
var invoice = createInvoiceModel();
var doc = generatePDF(invoice);
var string = doc.output('datauristring');
$('iframe').attr('src', string);
}
$('iframe').attr('src', string);
}
function onDownloadClick() {
var invoice = createInvoiceModel();
@ -388,12 +415,11 @@
if (!name) {
if (!name) $('#nameError').css( "display", "inline" );
} else {
$('.combobox-container input[name=client]').val('-1');
$('.combobox-container input.form-control').val(name);
$('.combobox-container').addClass('combobox-selected');
$('input[name=client]').val('-1');
$('.client_select input.form-control').val(name);
$('.client_select').addClass('combobox-selected');
$('#nameError').css( "display", "none" );
//$('#client_name').val('');
$('#modalLink').text('Edit client details');
$('#myModal').modal('hide');
$('input#invoice_number').focus();
@ -571,6 +597,13 @@
}
var products = {{ $products }};
var clients = {{ $clients }};
var clientMap = {};
for (var i=0; i<clients.length; i++) {
var client = clients[i];
clientMap[client.public_id] = client;
}
window.model = new InvoiceModel();
ko.applyBindings(model);

View File

@ -3,7 +3,7 @@
@section('content')
@if ($invoice->client->account->isGatewayConfigured())
{{ Button::primary_link(URL::to('payment/' . $invoice->invoice_key), 'Pay Now', array('class' => 'btn-lg pull-right')) }}
{{ Button::primary_link(URL::to('payment/' . $invitation->invitation_key), 'Pay Now', array('class' => 'btn-lg pull-right')) }}
<div class="clearfix"></div><p>&nbsp;</p>
@endif

View File

@ -1,20 +1,6 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="../../docs-assets/ico/favicon.png">
@extends('master')
<title></title>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
@section('content')
<style type="text/css">
body {
@ -59,18 +45,9 @@
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
{{ Basset::show('bootstrapper.css') }}
{{ Basset::show('bootstrapper.js') }}
</head>
<body>
<div class="container">
{{ Form::open(array('url' => 'login', 'class' => 'form-signin')) }}
{{ Form::open(array('url' => 'user/login', 'class' => 'form-signin')) }}
<h2 class="form-signin-heading">Please sign in</h2>
<p>
@ -85,6 +62,8 @@
<p>{{ Button::primary_submit('Sign In', array('class' => 'btn-lg'))->block() }}</p>
{{ link_to('user/forgot_password', 'Recover your password') }}
<!-- if there are login errors, show them here -->
@if ( Session::get('error') )
<div class="alert alert-error">{{{ Session::get('error') }}}</div>
@ -99,8 +78,5 @@
</div>
</body>
</html>
@stop

View File

@ -7,7 +7,7 @@
<meta name="description" content="">
<meta name="author" content="">
<title>Invoice Ninja</title>
<title>Invoice Ninja {{ isset($title) ? $title : '' }}</title>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
@ -15,9 +15,11 @@
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
{{-- Basset::show('bootstrapper.css') --}}
{{-- Basset::show('bootstrapper.js') --}}
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
<link rel="stylesheet" type="text/css" href="{{ asset('css/bootstrap.css') }}"/>
@yield('head')
</head>
<body>
@ -34,99 +36,8 @@
</script>
@endif
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Invoice Ninja</a>
</div>
<!--
<div class="navbar-collapse collapse">
{{ Form::open(array('url' => 'login', 'class' => 'navbar-form navbar-right')) }}
<div class="form-group">
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email')) }}
</div>
<div class="form-group">
{{ Form::password('password', array('placeholder' => 'Password')) }}
</div>
<button type="submit" class="btn btn-success">Sign in</button>
{{ Form::close() }}
-->
</div><!--/.navbar-collapse -->
</div>
</div>
<!-- Main jumbotron for a primary marketing message or call to action -->
<div class="jumbotron">
<div class="container">
<h1>Hello, world!</h1>
<p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
<p>
{{ Form::open(array('url' => 'get_started')) }}
{{ Form::hidden('guest_key') }}
{{ Button::lg_primary_submit('Get Started &raquo;') }}
{{ Form::close() }}
</p>
</div>
</div>
<div class="container">
<!-- Example row of columns -->
<div class="row">
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
</div>
<hr>
<footer>
<p>&copy; Company 2013</p>
</footer>
</div> <!-- /container -->
@yield('body')
</body>
<script type="text/javascript">
$(function() {
function isStorageSupported() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
}
if (isStorageSupported()) {
@if (Session::get('clearGuestKey'))
localStorage.setItem('guest_key', '');
@else
$('[name="guest_key"]').val(localStorage.getItem('guest_key'));
@endif
}
});
</script>
</html>
</html>

View File

@ -109,7 +109,6 @@
$input.combobox();
var $input = $('select#invoice').on('change', function(e) {
console.log('invoice change');
$clientCombobox = $('select#client');
var invoiceId = $('input[name=invoice]').val();
if (invoiceId) {

95
app/views/splash.blade.php Executable file
View File

@ -0,0 +1,95 @@
@extends('master')
@section('body')
<div class="navbar navbar-inverse navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">Invoice Ninja</a>
</div>
<div class="navbar-collapse collapse">
{{ Form::open(array('url' => 'login', 'class' => 'navbar-form navbar-right')) }}
<div class="form-group">
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email')) }}
</div>
<div class="form-group">
{{ Form::password('password', array('placeholder' => 'Password')) }}
</div>
<button type="submit" class="btn btn-success">Sign in</button>
{{ Form::close() }}
</div><!--/.navbar-collapse -->
</div>
</div>
<!-- Main jumbotron for a primary marketing message or call to action -->
<div class="jumbotron">
<div class="container">
<h1>Hello, world!</h1>
<p>This is a template for a simple marketing or informational website. It includes a large callout called a jumbotron and three supporting pieces of content. Use it as a starting point to create something more unique.</p>
<p>
{{ Form::open(array('url' => 'get_started')) }}
{{ Form::hidden('guest_key') }}
{{ Button::lg_primary_submit('Get Started &raquo;') }}
{{ Form::close() }}
</p>
</div>
</div>
<div class="container">
<!-- Example row of columns -->
<div class="row">
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec id elit non mi porta gravida at eget metus. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Etiam porta sem malesuada magna mollis euismod. Donec sed odio dui. </p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
<div class="col-md-4">
<h2>Heading</h2>
<p>Donec sed odio dui. Cras justo odio, dapibus ac facilisis in, egestas eget quam. Vestibulum id ligula porta felis euismod semper. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.</p>
<p><a class="btn btn-default" href="#" role="button">View details &raquo;</a></p>
</div>
</div>
<hr>
<footer>
<p>&copy; Company 2013</p>
</footer>
<script type="text/javascript">
$(function() {
function isStorageSupported() {
try {
return 'localStorage' in window && window['localStorage'] !== null;
} catch (e) {
return false;
}
}
if (isStorageSupported()) {
@if (Session::get('clearGuestKey'))
localStorage.setItem('guest_key', '');
@else
$('[name="guest_key"]').val(localStorage.getItem('guest_key'));
@endif
}
});
</script>
</div>
@stop

View File

108
app/views/users/login.blade.php Executable file
View File

@ -0,0 +1,108 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="">
<meta name="author" content="">
<link rel="shortcut icon" href="../../docs-assets/ico/favicon.png">
<title></title>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
background-color: #eee !important;
}
.form-signin {
max-width: 330px;
padding: 15px;
margin: 0 auto;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
font-size: 16px;
height: auto;
padding: 10px;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input[type="text"] {
margin-bottom: -1px;
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
.form-signin input[type="password"] {
margin-bottom: 10px;
border-top-left-radius: 0;
border-top-right-radius: 0;
}
</style>
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.js" type="text/javascript"></script>
{{ Basset::show('bootstrapper.css') }}
{{ Basset::show('bootstrapper.js') }}
</head>
<body>
<div class="container">
{{ Form::open(array('url' => 'login', 'class' => 'form-signin')) }}
<h2 class="form-signin-heading">Please sign in</h2>
<p>
{{ $errors->first('email') }}
{{ $errors->first('password') }}
</p>
<p>
{{ Form::text('email', Input::old('email'), array('placeholder' => 'Email address')) }}
{{ Form::password('password', array('placeholder' => 'Password')) }}
</p>
<p>{{ Button::primary_submit('Sign In', array('class' => 'btn-lg'))->block() }}</p>
{{ link_to('user/forgot_password', 'Recover your password') }}
<!-- if there are login errors, show them here -->
@if ( Session::get('error') )
<div class="alert alert-error">{{{ Session::get('error') }}}</div>
@endif
@if ( Session::get('notice') )
<div class="alert">{{{ Session::get('notice') }}}</div>
@endif
{{ Form::close() }}
</div>
</body>
</html>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,5 @@
function generatePDF(invoice) {
var clientName = invoice.client.name;
var invoiceNumber = invoice.invoice_number;
var issuedOn = invoice.invoice_date;
var amount = '$0.00';
@ -37,7 +36,25 @@ function generatePDF(invoice) {
var issuedOnX = headerRight - (doc.getStringUnitWidth(issuedOn) * doc.internal.getFontSize());
doc.setFontType("normal");
doc.text(marginLeft, headerTop, clientName);
if (invoice.client) {
var y = headerTop;
doc.text(marginLeft, y, invoice.client.name);
y += rowHeight;
doc.text(marginLeft, y, invoice.client.address1);
if (invoice.client.address2) {
y += rowHeight;
doc.text(marginLeft, y, invoice.client.address2);
}
if (invoice.client.city || invoice.client.state || invoice.client.postal_code) {
y += rowHeight;
doc.text(marginLeft, y, invoice.client.city + ', ' + invoice.client.state + ' ' + invoice.client.postal_code);
}
if (invoice.client.country) {
y += rowHeight;
doc.text(marginLeft, y, invoice.client.country.name);
}
}
doc.text(headerLeft, headerTop, 'Invoice #');
doc.text(invoiceNumberX, headerTop, invoiceNumber);
doc.text(headerLeft, headerTop + rowHeight, 'Invoice Date');
@ -134,16 +151,20 @@ function generatePDF(invoice) {
doc.text(tableLeft, y, invoice.account.country ? invoice.account.country.name : '');
var clientX = headerRight - (doc.getStringUnitWidth(invoice.client.name) * doc.internal.getFontSize());
if (invoice.client) {
var clientX = headerRight - (doc.getStringUnitWidth(invoice.client.name) * doc.internal.getFontSize());
}
var numberX = headerRight - (doc.getStringUnitWidth(invoice.invoice_number) * doc.internal.getFontSize());
var dateX = headerRight - (doc.getStringUnitWidth(issuedOn) * doc.internal.getFontSize());
var totalX = headerRight - (doc.getStringUnitWidth(total) * doc.internal.getFontSize());
y = 720;
doc.setFontType("bold");
doc.text(headerLeft, y, 'Client');
doc.setFontType("normal");
doc.text(clientX, y, invoice.client.name);
if (invoice.client) {
doc.setFontType("bold");
doc.text(headerLeft, y, 'Client');
doc.setFontType("normal");
doc.text(clientX, y, invoice.client.name);
}
y += 16;
doc.setFontType("bold");
@ -189,9 +210,6 @@ function formatMoney(num) {
/* Set the defaults for DataTables initialisation */
$.extend( true, $.fn.dataTable.defaults, {
"sDom": "t<'row-fluid'<'span6'i><'span6'p>>",