1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 08:21:34 +02:00

Merge pull request #1353 from joshuadwire/2017-02-login-styling

Login/Dashboard Styling
This commit is contained in:
Hillel Coren 2017-02-17 09:48:06 +02:00 committed by GitHub
commit 67f05cdcfb
56 changed files with 201856 additions and 967 deletions

View File

@ -797,7 +797,8 @@ class AccountController extends BaseController
{
$account = $request->user()->account;
$account->fill($request->all());
$account->subdomain = $request->subdomain;
$account->client_view_css = $request->client_view_css;
$account->subdomain = $request->subdomain;
$account->iframe_url = $request->iframe_url;
$account->save();

View File

@ -28,18 +28,9 @@ class AuthController extends Controller
*/
public function showLoginForm()
{
$data = [];
$contactKey = session('contact_key');
if ($contactKey) {
$contact = Contact::where('contact_key', '=', $contactKey)->first();
if ($contact && ! $contact->is_deleted) {
$account = $contact->account;
$data['account'] = $account;
$data['clientFontUrl'] = $account->getFontsUrl();
}
}
$data = [
'clientauth' => true,
];
return view('clientauth.login')->with($data);
}
@ -86,6 +77,6 @@ class AuthController extends Controller
*/
public function getSessionExpired()
{
return view('clientauth.sessionexpired');
return view('clientauth.sessionexpired')->with(['clientauth' => true]);
}
}

View File

@ -48,16 +48,11 @@ class PasswordController extends Controller
*/
public function showLinkRequestForm()
{
$data = [];
$data = [
'clientauth' => true,
];
$contactKey = session('contact_key');
if ($contactKey) {
$contact = Contact::where('contact_key', '=', $contactKey)->first();
if ($contact && ! $contact->is_deleted) {
$account = $contact->account;
$data['account'] = $account;
$data['clientFontUrl'] = $account->getFontsUrl();
}
} else {
if (!$contactKey) {
return \Redirect::to('/client/sessionexpired');
}
@ -115,7 +110,11 @@ class PasswordController extends Controller
return $this->getEmail();
}
$data = compact('token');
$data = array(
'token' => $token,
'clientauth' => true,
);
if ($key) {
$contact = Contact::where('contact_key', '=', $key)->first();
if ($contact && ! $contact->is_deleted) {
@ -130,10 +129,7 @@ class PasswordController extends Controller
}
}
if (! empty($account)) {
$data['account'] = $account;
$data['clientFontUrl'] = $account->getFontsUrl();
} else {
if ( empty($account)) {
return \Redirect::to('/client/sessionexpired');
}
}

View File

@ -59,9 +59,6 @@ class ClientPortalController extends BaseController
if (! $account->checkSubdomain(Request::server('HTTP_HOST'))) {
return response()->view('error', [
'error' => trans('texts.invoice_not_found'),
'hideHeader' => true,
'clientViewCSS' => $account->clientViewCSS(),
'clientFontUrl' => $account->getFontsUrl(),
]);
}
@ -134,7 +131,6 @@ class ClientPortalController extends BaseController
'account' => $account,
'showApprove' => $showApprove,
'showBreadcrumbs' => false,
'clientFontUrl' => $account->getFontsUrl(),
'invoice' => $invoice->hidePrivateFields(),
'invitation' => $invitation,
'invoiceLabels' => $account->getInvoiceLabels(),
@ -255,7 +251,6 @@ class ClientPortalController extends BaseController
'contact' => $contact,
'account' => $account,
'client' => $client,
'clientFontUrl' => $account->getFontsUrl(),
'gateway' => $account->getTokenGateway(),
'paymentMethods' => $customer ? $customer->payment_methods : false,
'transactionToken' => $paymentDriver ? $paymentDriver->createTransactionToken() : false,
@ -321,7 +316,6 @@ class ClientPortalController extends BaseController
'color' => $color,
'account' => $account,
'client' => $contact->client,
'clientFontUrl' => $account->getFontsUrl(),
'title' => trans('texts.recurring_invoices'),
'entityType' => ENTITY_RECURRING_INVOICE,
'columns' => Utils::trans(['frequency', 'start_date', 'end_date', 'invoice_total', 'auto_bill']),
@ -349,7 +343,6 @@ class ClientPortalController extends BaseController
'color' => $color,
'account' => $account,
'client' => $contact->client,
'clientFontUrl' => $account->getFontsUrl(),
'title' => trans('texts.invoices'),
'entityType' => ENTITY_INVOICE,
'columns' => Utils::trans(['invoice_number', 'invoice_date', 'invoice_total', 'balance_due', 'due_date']),
@ -394,7 +387,6 @@ class ClientPortalController extends BaseController
$data = [
'color' => $color,
'account' => $account,
'clientFontUrl' => $account->getFontsUrl(),
'entityType' => ENTITY_PAYMENT,
'title' => trans('texts.payments'),
'columns' => Utils::trans(['invoice', 'transaction_reference', 'method', 'payment_amount', 'payment_date', 'status']),
@ -479,7 +471,6 @@ class ClientPortalController extends BaseController
$data = [
'color' => $color,
'account' => $account,
'clientFontUrl' => $account->getFontsUrl(),
'title' => trans('texts.quotes'),
'entityType' => ENTITY_QUOTE,
'columns' => Utils::trans(['quote_number', 'quote_date', 'quote_total', 'due_date']),
@ -515,7 +506,6 @@ class ClientPortalController extends BaseController
$data = [
'color' => $color,
'account' => $account,
'clientFontUrl' => $account->getFontsUrl(),
'title' => trans('texts.credits'),
'entityType' => ENTITY_CREDIT,
'columns' => Utils::trans(['credit_date', 'credit_amount', 'credit_balance']),
@ -551,7 +541,6 @@ class ClientPortalController extends BaseController
$data = [
'color' => $color,
'account' => $account,
'clientFontUrl' => $account->getFontsUrl(),
'title' => trans('texts.documents'),
'entityType' => ENTITY_DOCUMENT,
'columns' => Utils::trans(['invoice_number', 'name', 'document_date', 'document_size']),
@ -760,8 +749,6 @@ class ClientPortalController extends BaseController
'contact' => $contact,
'color' => $account->primary_color ? $account->primary_color : '#0b4d78',
'client' => $client,
'clientViewCSS' => $account->clientViewCSS(),
'clientFontUrl' => $account->getFontsUrl(),
'paymentMethods' => $customer ? $customer->payment_methods : false,
'gateway' => $account->getTokenGateway(),
'title' => trans('texts.payment_methods'),

View File

@ -102,6 +102,46 @@ class Utils
return self::getResllerType() ? true : false;
}
public static function clientViewCSS()
{
$account = false;
if (Auth::check()) {
$account = Auth::user()->account;
} elseif ($contactKey = session('contact_key')) {
if ($contact = \App\Models\Contact::whereContactKey($contactKey)->first()) {
$account = $contact->account;
}
}
if ( !$account && ! self::isNinja()) {
// For self-hosted accounts, pick the first account
$account = \App\Models\Account::first();
}
return $account ? $account->clientViewCSS() : '';
}
public static function getAccountFontsUrl($protocol = '')
{
$account = false;
if (Auth::check()) {
$account = Auth::user()->account;
} elseif ($contactKey = session('contact_key')) {
if ($contact = \App\Models\Contact::whereContactKey($contactKey)->first()) {
$account = $contact->account;
}
}
if ( !$account && ! self::isNinja()) {
// For self-hosted accounts, pick the first account
$account = \App\Models\Account::first();
}
return $account ? $account->getFontsUrl($protocol) : false;
}
public static function isWhiteLabel()
{
$account = false;

View File

@ -166,7 +166,6 @@ class BasePaymentDriver
'currencyCode' => $this->client()->getCurrencyCode(),
'account' => $this->account(),
'sourceId' => $sourceId,
'clientFontUrl' => $this->account()->getFontsUrl(),
'tokenize' => $this->tokenize(),
'transactionToken' => $this->createTransactionToken(),
];

View File

@ -55,9 +55,13 @@ elixir(function(mix) {
'style.css',
'sidebar.css',
'colors.css',
'fonts.css'
'fonts.css',
], 'public/css/built.css');
mix.styles([
'login.css'
], 'public/css/built.login.css');
mix.styles([
bowerDir + '/bootstrap-daterangepicker/daterangepicker.css'
], 'public/css/daterangepicker.css');

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

13553
public/css/built.css vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

325
public/css/built.login.css vendored Normal file
View File

@ -0,0 +1,325 @@
.container {
padding-bottom: 50px;
}
hr.green {
background: #5ebb5e;
margin-top: 0px;
margin-bottom: 30px;
width: 55px;
height: 4px;
border: 0;
}
.alert li{
list-style: none;
}
/****** HEADER ********************************************************************/
.row.header {
background: #3c3b3b; /* Old browsers */
background: -moz-linear-gradient(top, #3c3b3b 0%, #2f2c2c 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, #3c3b3b 0%, #2f2c2c 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, #3c3b3b 0%, #2f2c2c 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#3c3b3b', endColorstr='#2f2c2c', GradientType=0); /* IE6-9 */
padding: 30px 55px;
margin-bottom: 95px;
}
.row.header .text-right {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 4px;
color: #fff;
}
@media only screen and (min-width: 64.063em) {
.row.header .col-md-6.col-xs-12.text-center {
text-align: left;
}
}
/****** FORM ********************************************************************/
.form-signin {
max-width: 400px;
padding: 15px;
margin: 0 auto;
font-weight: 200;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input:not(:last-child) {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input:not(:first-child) {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.form-signin input {
text-align: center;
}
.btn-block {
margin-top: 10px;
}
.form-signin h2 {
font-weight: 200;
font-size: 28px;
text-align: center;
}
.row.existing-accounts {
margin-top: 60px;
text-align: center;
font-weight: 200;
}
.row.existing-accounts .col-md-3.col-xs-6:nth-of-type(1), .row.existing-accounts .col-md-3.col-xs-6:nth-of-type(2) {
margin-bottom: 30px;
}
.row.existing-accounts a {
width: 100%;
font-size: 22px;
padding-left: 2px;
}
.row.meta {
font-size: 11px;
text-transform: uppercase;
color: #464545;
letter-spacing: 2px;
padding: 13px 0 0 0;
}
.row.meta .col-md-7, .row.meta .col-md-5 {
text-align: center;
}
.row.meta a {
color: #9b9c9b;
}
@media only screen and (min-width: 64.063em) {
.row.existing-accounts .col-md-3.col-xs-6:nth-of-type(1), .row.existing-accounts .col-md-3.col-xs-6:nth-of-type(2) {
margin-bottom: 0;
}
.row.meta .col-md-7 {
text-align: left;
}
.row.meta .col-md-5 {
text-align: right;
}
}
/****** SIGN UP ********************************************************************/
.row.sign-up {
margin-top: 100px;
text-align: center;
}
.row.sign-up h3 {
font-size: 26px;
font-weight: 200;
margin: 0;
}
.row.sign-up p {
font-size: 17px;
font-weight: 200;
}
.row.sign-up button {
width: 100%;
}
.row.sign-up .col-md-3 {
border-top: 1px solid #eee;
padding: 30px;
}
.row.sign-up .col-md-3:nth-child(2) {
border-left: 0;
padding-left: 30px;
}
@media only screen and (min-width: 64.063em) {
.row.sign-up {
text-align: left;
}
.row.sign-up .col-md-3 {
padding: 40px 0 30px 0
}
.row.sign-up .col-md-3:nth-child(2) {
border-left: 1px solid #eee;
padding-left: 70px;
}
}
/****** SIGN UP ********************************************************************/
.btn {
text-transform: uppercase;
letter-spacing: 3px;
border-radius: 3px;
font-size: 15px;
padding: 20px 0;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #474646 0%, #3d3d3d 100%);
background-image: -o-linear-gradient(top, #474646 0%, #3d3d3d 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#474646), to(#3d3d3d));
background-image: linear-gradient(to bottom, #474646 0%, #3d3d3d 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #3d3d3d;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #3d3d3d;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #3d3d3d;
border-color: #3d3d3d;
}
.btn-primary.green {
background-image: -webkit-linear-gradient(top, #62c362 0%, #5cb85c 100%);
background-image: -o-linear-gradient(top, #62c362 0%, #5cb85c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#62c362), to(#5cb85c));
background-image: linear-gradient(to bottom, #62c362 0%, #5cb85c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #5cb85c;
}
.btn-primary.green:hover,
.btn-primary.green:focus {
background-color: #5cb85c;
background-position: 0 -15px;
}
.btn-primary.green:active,
.btn-primary.green.active {
background-color: #5cb85c;
border-color: #5cb85c;
}
.btn-primary.blue {
background-image: -webkit-linear-gradient(top, #3e8ccc 0%, #377db6 100%);
background-image: -o-linear-gradient(top, #3e8ccc 0%, #377db6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3e8ccc), to(#377db6));
background-image: linear-gradient(to bottom, #3e8ccc 0%, #377db6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #377db6;
}
.btn-primary.blue:hover,
.btn-primary.blue:focus {
background-color: #377db6;
background-position: 0 -15px;
}
.btn-primary.blue:active,
.btn-primary.blue.active {
background-color: #377db6;
border-color: #377db6;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #3d3d3d;
background-image: none;
}
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.form-signin .form-control {
padding: 15px;
border: 1px solid #e8e8e8;
}
/*# sourceMappingURL=built.login.css.map */

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

69
public/css/login.css vendored Normal file
View File

@ -0,0 +1,69 @@
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-color: #337ab7;
}
.modal-header h4 {
margin:0;
color:#fff;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
.form-control {
display: block;
width: 100%;
height: 40px;
padding: 9px 12px;
font-size: 16px;
line-height: 1.42857143;
color: #000 !important;
background: #f9f9f9 !important;
background-image: none;
border: 1px solid #dfe0e1;
border-radius: 2px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
/*# sourceMappingURL=login.css.map */

1
public/css/login.css.map Normal file
View File

@ -0,0 +1 @@
{"version":3,"sources":["login.css"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"login.css","sourcesContent":["body {\n padding-top: 40px;\n padding-bottom: 40px;\n}\n.modal-header {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n background-color: #337ab7;\n}\n.modal-header h4 {\n margin:0;\n color:#fff;\n}\n.modal-header img {\n float: left;\n margin-right: 20px;\n}\n.form-signin {\n max-width: 400px;\n margin: 0 auto;\n background: #fff;\n}\np.link a {\n font-size: 11px;\n}\n.form-signin .inner {\n padding: 20px;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n border-left: 1px solid #ddd;\n border-right: 1px solid #ddd;\n border-bottom: 1px solid #ddd;\n}\n.form-signin .checkbox {\n font-weight: normal;\n}\n.form-signin .form-control {\n margin-bottom: 17px !important;\n}\n.form-signin .form-control:focus {\n z-index: 2;\n}\n\n.modal-header a:link,\n.modal-header a:visited,\n.modal-header a:hover,\n.modal-header a:active {\n text-decoration: none;\n color: white;\n}\n\n.form-control {\n display: block;\n width: 100%;\n height: 40px;\n padding: 9px 12px;\n font-size: 16px;\n line-height: 1.42857143;\n color: #000 !important;\n background: #f9f9f9 !important;\n background-image: none;\n border: 1px solid #dfe0e1;\n border-radius: 2px;\n -webkit-box-shadow: none;\n box-shadow: none;\n -webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;\n}"],"sourceRoot":"/source/"}

486
public/css/select2.css vendored

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="39.25" height="50.493" viewBox="28.925 23.771 39.25 50.493"><g fill="#FFF"><path d="M65.928 63.838h-7.156c-.564 0-1.022.457-1.022 1.021v7.157H31.174V26.019h34.754v37.819zm-6.133 6.731v-4.686h4.687l-4.687 4.686zm7.154-46.594H30.153c-.565 0-1.023.457-1.023 1.022v48.04c0 .564.458 1.022 1.023 1.022H58.77c.267 0 .528-.104.723-.3l8.178-8.176c.195-.196.297-.457.297-.724h.002V24.997c0-.565-.457-1.022-1.022-1.022"/><path d="M59.998 66.086v3.99l3.99-3.99h-3.99zm-.408 4.977v-5.385h5.385l-5.385 5.385zm-28.21.748h26.166v-6.952c0-.675.55-1.226 1.226-1.226h6.95v-37.41H31.38v45.588zm26.574.408H30.97V25.815h35.16v38.227h-7.357a.82.82 0 0 0-.819.817v7.36zm-27.801-48.04a.819.819 0 0 0-.818.818v48.04c0 .451.367.817.818.817H58.77a.815.815 0 0 0 .58-.239l8.176-8.178a.816.816 0 0 0 .238-.578l.003-.203V24.997a.819.819 0 0 0-.819-.818H30.153zM58.77 74.264H30.153c-.677 0-1.228-.551-1.228-1.227v-48.04c0-.677.551-1.226 1.228-1.226h36.796c.676 0 1.227.55 1.227 1.226v40.067h-.02c-.04.25-.158.482-.34.663l-8.176 8.177a1.22 1.22 0 0 1-.869.36"/><path d="M34.752 29.085h8.177v2.045h-8.177v-2.045"/><path d="M34.956 30.925h7.769V29.29h-7.769v1.635zm8.177.409h-8.586v-2.453h8.586v2.453M34.752 32.151H48.04v2.045H34.752V32.15"/><path d="M34.956 33.992h12.88v-1.635h-12.88v1.635zm13.288.408H34.547v-2.453h13.697V34.4M36.796 44.417h5.623v21.466h-5.623V44.417zm0-5.621h5.623v3.577h-5.623v-3.577zm7.666 11.754h15.843v4.089H44.462v-4.09zm0-6.133h15.843v4.089H44.462v-4.09zm0-5.621h15.843v3.577H44.462v-3.577zm-8.688 29.13h18.398v-2.043h-9.71v-9.2h15.843v4.089h2.045V37.774c0-.565-.457-1.022-1.022-1.022H35.774c-.565 0-1.022.457-1.022 1.022v29.13c0 .565.457 1.023 1.022 1.023"/><path d="M37 42.169h5.213V39H37v3.169zm5.623.409h-6.031V38.59h6.03v3.987zm2.044-.41h15.435V39H44.667v3.169zm15.843.41H44.258V38.59H60.51v3.987zm-15.843 5.724h15.435v-3.68H44.667v3.68zm15.843.409H44.258v-4.498H60.51v4.498zm-15.843 5.724h15.435v-3.68H44.667v3.68zm15.843.409H44.258v-4.498H60.51v4.498zM37 65.678h5.213V44.622H37v21.056zm5.623.408h-6.031V44.213h6.03v21.873zm-6.85-29.13a.819.819 0 0 0-.817.817v29.131c0 .451.367.818.818.818h18.195v-1.636h-9.711v-9.608H60.51v4.09h1.635V37.773a.818.818 0 0 0-.817-.818H35.774zM54.378 68.13H35.774c-.676 0-1.227-.551-1.227-1.227v-29.13c0-.677.55-1.227 1.227-1.227h25.554c.676 0 1.227.55 1.227 1.226v23.204h-2.453v-4.09H44.667v8.79h9.71v2.454"/><path d="M38.33 45.95h2.555v2.045H38.33V45.95"/><path d="M38.534 47.79h2.146v-1.635h-2.146v1.636zm2.555.409h-2.964v-2.452h2.964v2.452M38.33 52.084h2.555v2.043H38.33v-2.043"/><path d="M38.534 53.924h2.146v-1.637h-2.146v1.637zm2.555.408h-2.964v-2.453h2.964v2.453M38.33 58.217h2.555v2.043H38.33v-2.043"/><path d="M38.534 60.057h2.146V58.42h-2.146v1.637zm2.555.408h-2.964v-2.453h2.964v2.453M38.33 62.305h2.555v2.045H38.33v-2.045"/><path d="M38.534 64.145h2.146v-1.636h-2.146v1.636zm2.555.408h-2.964V62.1h2.964v2.452"/></g></svg>

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

10530
public/js/Chart.min.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

9559
public/js/d3.min.js vendored

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

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

5882
public/js/select2.min.js vendored

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

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

324
resources/assets/css/login.css vendored Normal file
View File

@ -0,0 +1,324 @@
.container {
padding-bottom: 50px;
}
hr.green {
background: #5ebb5e;
margin-top: 0px;
margin-bottom: 30px;
width: 55px;
height: 4px;
border: 0;
}
.alert li{
list-style: none;
}
/****** HEADER ********************************************************************/
.row.header {
background: #3c3b3b; /* Old browsers */
background: -moz-linear-gradient(top, #3c3b3b 0%, #2f2c2c 100%); /* FF3.6-15 */
background: -webkit-linear-gradient(top, #3c3b3b 0%, #2f2c2c 100%); /* Chrome10-25,Safari5.1-6 */
background: linear-gradient(to bottom, #3c3b3b 0%, #2f2c2c 100%); /* W3C, IE10+, FF16+, Chrome26+, Opera12+, Safari7+ */
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#3c3b3b', endColorstr='#2f2c2c', GradientType=0); /* IE6-9 */
padding: 30px 55px;
margin-bottom: 95px;
}
.row.header .text-right {
font-size: 13px;
text-transform: uppercase;
letter-spacing: 4px;
color: #fff;
}
@media only screen and (min-width: 64.063em) {
.row.header .col-md-6.col-xs-12.text-center {
text-align: left;
}
}
/****** FORM ********************************************************************/
.form-signin {
max-width: 400px;
padding: 15px;
margin: 0 auto;
font-weight: 200;
}
.form-signin .form-signin-heading,
.form-signin .checkbox {
margin-bottom: 10px;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
position: relative;
height: auto;
-webkit-box-sizing: border-box;
-moz-box-sizing: border-box;
box-sizing: border-box;
padding: 10px;
font-size: 16px;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-signin input:not(:last-child) {
margin-bottom: -1px;
border-bottom-right-radius: 0;
border-bottom-left-radius: 0;
}
.form-signin input:not(:first-child) {
border-top-left-radius: 0;
border-top-right-radius: 0;
}
.form-signin input {
text-align: center;
}
.btn-block {
margin-top: 10px;
}
.form-signin h2 {
font-weight: 200;
font-size: 28px;
text-align: center;
}
.row.existing-accounts {
margin-top: 60px;
text-align: center;
font-weight: 200;
}
.row.existing-accounts .col-md-3.col-xs-6:nth-of-type(1), .row.existing-accounts .col-md-3.col-xs-6:nth-of-type(2) {
margin-bottom: 30px;
}
.row.existing-accounts a {
width: 100%;
font-size: 22px;
padding-left: 2px;
}
.row.meta {
font-size: 11px;
text-transform: uppercase;
color: #464545;
letter-spacing: 2px;
padding: 13px 0 0 0;
}
.row.meta .col-md-7, .row.meta .col-md-5 {
text-align: center;
}
.row.meta a {
color: #9b9c9b;
}
@media only screen and (min-width: 64.063em) {
.row.existing-accounts .col-md-3.col-xs-6:nth-of-type(1), .row.existing-accounts .col-md-3.col-xs-6:nth-of-type(2) {
margin-bottom: 0;
}
.row.meta .col-md-7 {
text-align: left;
}
.row.meta .col-md-5 {
text-align: right;
}
}
/****** SIGN UP ********************************************************************/
.row.sign-up {
margin-top: 100px;
text-align: center;
}
.row.sign-up h3 {
font-size: 26px;
font-weight: 200;
margin: 0;
}
.row.sign-up p {
font-size: 17px;
font-weight: 200;
}
.row.sign-up button {
width: 100%;
}
.row.sign-up .col-md-3 {
border-top: 1px solid #eee;
padding: 30px;
}
.row.sign-up .col-md-3:nth-child(2) {
border-left: 0;
padding-left: 30px;
}
@media only screen and (min-width: 64.063em) {
.row.sign-up {
text-align: left;
}
.row.sign-up .col-md-3 {
padding: 40px 0 30px 0
}
.row.sign-up .col-md-3:nth-child(2) {
border-left: 1px solid #eee;
padding-left: 70px;
}
}
/****** SIGN UP ********************************************************************/
.btn {
text-transform: uppercase;
letter-spacing: 3px;
border-radius: 3px;
font-size: 15px;
padding: 20px 0;
}
.btn-primary {
background-image: -webkit-linear-gradient(top, #474646 0%, #3d3d3d 100%);
background-image: -o-linear-gradient(top, #474646 0%, #3d3d3d 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#474646), to(#3d3d3d));
background-image: linear-gradient(to bottom, #474646 0%, #3d3d3d 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #3d3d3d;
}
.btn-primary:hover,
.btn-primary:focus {
background-color: #3d3d3d;
background-position: 0 -15px;
}
.btn-primary:active,
.btn-primary.active {
background-color: #3d3d3d;
border-color: #3d3d3d;
}
.btn-primary.green {
background-image: -webkit-linear-gradient(top, #62c362 0%, #5cb85c 100%);
background-image: -o-linear-gradient(top, #62c362 0%, #5cb85c 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#62c362), to(#5cb85c));
background-image: linear-gradient(to bottom, #62c362 0%, #5cb85c 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #5cb85c;
}
.btn-primary.green:hover,
.btn-primary.green:focus {
background-color: #5cb85c;
background-position: 0 -15px;
}
.btn-primary.green:active,
.btn-primary.green.active {
background-color: #5cb85c;
border-color: #5cb85c;
}
.btn-primary.blue {
background-image: -webkit-linear-gradient(top, #3e8ccc 0%, #377db6 100%);
background-image: -o-linear-gradient(top, #3e8ccc 0%, #377db6 100%);
background-image: -webkit-gradient(linear, left top, left bottom, from(#3e8ccc), to(#377db6));
background-image: linear-gradient(to bottom, #3e8ccc 0%, #377db6 100%);
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
background-repeat: repeat-x;
border-color: #377db6;
}
.btn-primary.blue:hover,
.btn-primary.blue:focus {
background-color: #377db6;
background-position: 0 -15px;
}
.btn-primary.blue:active,
.btn-primary.blue.active {
background-color: #377db6;
border-color: #377db6;
}
.btn-primary.disabled,
.btn-primary[disabled],
fieldset[disabled] .btn-primary,
.btn-primary.disabled:hover,
.btn-primary[disabled]:hover,
fieldset[disabled] .btn-primary:hover,
.btn-primary.disabled:focus,
.btn-primary[disabled]:focus,
fieldset[disabled] .btn-primary:focus,
.btn-primary.disabled.focus,
.btn-primary[disabled].focus,
fieldset[disabled] .btn-primary.focus,
.btn-primary.disabled:active,
.btn-primary[disabled]:active,
fieldset[disabled] .btn-primary:active,
.btn-primary.disabled.active,
.btn-primary[disabled].active,
fieldset[disabled] .btn-primary.active {
background-color: #3d3d3d;
background-image: none;
}
.btn-default,
.btn-primary,
.btn-success,
.btn-info,
.btn-warning,
.btn-danger {
text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
-webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
}
.btn-default:active,
.btn-primary:active,
.btn-success:active,
.btn-info:active,
.btn-warning:active,
.btn-danger:active,
.btn-default.active,
.btn-primary.active,
.btn-success.active,
.btn-info.active,
.btn-warning.active,
.btn-danger.active {
-webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
}
.form-signin .form-control {
padding: 15px;
border: 1px solid #e8e8e8;
}

View File

@ -1,17 +1,28 @@
body {
font-family: 'Roboto', sans-serif;
font-size: 14px;
background-color: #f8f8f8;
background-color: #f0f0f0;
}
html {
overflow-y: scroll;
}
@media (min-width: 1400px) {
.container {
width: 1370px;
}
}
.navbar-header {
padding-top: 4px;
padding-bottom: 4px;
}
.navbar-brand {
height: 62px;
padding: 21px 15px;
}
.navbar li a {
padding-top: 18px;
font-weight: 500;
@ -25,8 +36,56 @@ html {
x-moz-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
x-webkit-box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
box-shadow: 0 0 10px 2px rgba(0,0,0,.05);
border-width: 0;
border-radius: 0;
}
.navbar-inverse .navbar-nav > li > a {
font-weight: 400;
text-transform: uppercase;
border-top: 2px solid transparent;
letter-spacing: 2px;
font-size: 14px;
color: #838181;
}
.navbar-inverse .navbar-nav > .active > a,
.navbar-inverse .navbar-nav > .active > a:hover,
.navbar-inverse .navbar-nav > .active > a:focus {
background: none;
border-top-color: #42d165;
}
@media (min-width: 768px) {
.navbar-nav > li > a {
padding: 24px 0 26px;
margin: 0 10px;
}
}
@media (min-width: 1200px) {
.navbar-nav > li > a {
margin: 0 25px;
}
}
@media (min-width: 1220px) and (max-width: 1399px) {
.navbar .container {
padding: 0;
}
}
@media (min-width: 1420px) {
.navbar .container {
padding: 0;
}
}
.navbar-nav > li > a:last-child {
margin-right: 0;
}
#footer {
text-align: center
}
@ -195,3 +254,43 @@ table td {
/* hide table sorting indicators */
table.data-table thead .sorting { background: url('') no-repeat center right; }
/* Make Success color match the Dashboard's green */
.label-success,
.progress-bar-success,
.btn-success,
.btn-success.disabled,
.btn-success[disabled],
fieldset[disabled] .btn-success,
.btn-success.disabled:hover,
.btn-success[disabled]:hover,
fieldset[disabled] .btn-success:hover,
.btn-success.disabled:focus,
.btn-success[disabled]:focus,
fieldset[disabled] .btn-success:focus,
.btn-success.disabled.focus,
.btn-success[disabled].focus,
fieldset[disabled] .btn-success.focus,
.btn-success.disabled:active,
.btn-success[disabled]:active,
fieldset[disabled] .btn-success:active,
.btn-success.disabled.active,
.btn-success[disabled].active,
fieldset[disabled] .btn-success.active {
background: #42d165;
}
.btn-success .badge {
color: #42d165;
}
.btn-success:hover,
.btn-success:focus,
.btn-success.focus,
.btn-success:active,
.btn-success.active,
.open > .dropdown-toggle.btn-success,
.label-success[href]:hover,
.label-success[href]:focus{
background-color: #38b254;
}

View File

@ -2359,6 +2359,16 @@ $LANG = array(
'reports_help' => 'Shift + Click to sort by multple columns, Ctrl + Click to clear the grouping.',
'this_year' => 'This Year',
// Updated login screen
'ninja_tagline' => 'Create. Send. Get Paid.',
'login_or_existing' => 'Or login with an existing account.',
'sign_up_now' => 'Sign Up Now',
'not_a_member_yet' => 'Not a member yet?',
'login_create_an_account' => 'Create an Account!',
'client_login' => 'Client Login',
// New Client Portal styling
'invoice_from' => 'Invoices From:',
);
return $LANG;

View File

@ -1,165 +1,91 @@
@extends('master')
@extends('login')
@section('head')
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/built.public.min.css') }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-color: #337ab7;
}
.modal-header h4 {
margin:0;
color:#fff;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
.form-control {
display: block;
width: 100%;
height: 40px;
padding: 9px 12px;
font-size: 16px;
line-height: 1.42857143;
color: #000 !important;
background: #f9f9f9 !important;
background-image: none;
border: 1px solid #dfe0e1;
border-radius: 2px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
</style>
@endsection
@section('body')
<div class="container">
@section('form')
@include('partials.warn_session', ['redirectTo' => '/logout?reason=inactivity'])
{!! Former::open('login')
->rules(['email' => 'required|email', 'password' => 'required'])
->addClass('form-signin') !!}
{{ Former::populateField('remember', 'true') }}
<div class="container">
<div class="modal-header">
@if (Utils::isWhiteLabel())
<h4>{{ trans('texts.account_login') }}</h4>
@else
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.account_login') }}</h4>
</a>
{!! Former::open('login')
->rules(['email' => 'required|email', 'password' => 'required'])
->addClass('form-signin') !!}
<h2 class="form-signin-heading">{{ trans('texts.account_login') }}</h2>
<hr class="green">
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
</div>
<div class="inner">
<p>
{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!}
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::hidden('remember')->raw() !!}
</p>
<p>{!! Button::success(trans('texts.login'))
->withAttributes(['id' => 'loginButton'])
->large()->submit()->block() !!}</p>
@if (Session::has('warning'))
<div class="alert alert-warning">{!! Session::get('warning') !!}</div>
@endif
@if (Input::get('new_company') && Utils::allowNewAccounts())
{!! Former::hidden('link_accounts')->value('true') !!}
<center><p>- {{ trans('texts.or') }} -</p></center>
<p>{!! Button::primary(trans('texts.new_company'))->asLinkTo(URL::to('/invoice_now?new_company=true&sign_up=true'))->large()->submit()->block() !!}</p><br/>
@elseif (Utils::isOAuthEnabled())
<center><p>- {{ trans('texts.or') }} -</p></center>
<div class="row">
@if (Session::has('message'))
<div class="alert alert-info">{!! Session::get('message') !!}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">
<li>{!! Session::get('error') !!}</li>
</div>
@endif
{{ Former::populateField('remember', 'true') }}
<div>
{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!}
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
</div>
{!! Former::hidden('remember')->raw() !!}
{!! Button::success(trans('texts.login'))
->withAttributes(['id' => 'loginButton', 'class' => 'green'])
->large()->submit()->block() !!}
@if (Utils::isOAuthEnabled())
<div class="row existing-accounts">
<p>{{ trans('texts.login_or_existing') }}</p>
@foreach (App\Services\AuthService::$providers as $provider)
<div class="col-md-6">
<a href="{{ URL::to('auth/' . $provider) }}" class="btn btn-primary btn-block social-login-button" id="{{ strtolower($provider) }}LoginButton">
<i class="fa fa-{{ strtolower($provider) }}"></i> &nbsp;
{{ $provider }}
</a><br/>
<div class="col-md-3 col-xs-6">
<a href="{{ URL::to('auth/' . $provider) }}" class="btn btn-primary btn-lg"
id="{{ strtolower($provider) }}LoginButton">
@if($provider == SOCIAL_GITHUB)
<i class="fa fa-github-alt"></i>
@else
<i class="fa fa-{{ strtolower($provider) }}"></i>
@endif
</a>
</div>
@endforeach
</div>
@endif
<p class="link">
{!! link_to('/recover_password', trans('texts.recover_password'), ['class' => 'pull-left']) !!}
{!! link_to(NINJA_WEB_URL.'/knowledgebase/', trans('texts.knowledge_base'), ['target' => '_blank', 'class' => 'pull-right']) !!}
</p>
<br/>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
@if (Session::has('warning'))
<div class="alert alert-warning">{!! Session::get('warning') !!}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{!! Session::get('message') !!}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger"><li>{!! Session::get('error') !!}</li></div>
@endif
</div>
@endif
<div class="row meta">
<div class="col-md-7 col-sm-12">
{!! link_to('/recover_password', trans('texts.recover_password')) !!}
</div>
<div class="col-md-5 col-sm-12">
{!! link_to(NINJA_WEB_URL.'/knowledgebase/', trans('texts.knowledge_base'), ['target' => '_blank']) !!}
</div>
</div>
{!! Former::close() !!}
<p/>
@if(Utils::allowNewAccounts())
<div class="row sign-up">
<div class="col-md-3 col-md-offset-3 col-xs-12">
<h3>{{trans('texts.not_a_member_yet')}}</h3>
<p>{{trans('texts.login_create_an_account')}}</p>
</div>
<div class="col-md-3 col-xs-12">
{!! Button::primary(trans('texts.sign_up_now'))->asLinkTo(URL::to('/invoice_now?sign_up=true'))->withAttributes(['class' => 'blue'])->large()->submit()->block() !!}
</div>
</div>
@endif
</div>

View File

@ -1,99 +1,12 @@
@extends('master')
@extends('login')
@section('head')
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/built.public.min.css') }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-color: #337ab7;
color: #FFf;
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-control {
display: block;
width: 100%;
height: 40px;
padding: 9px 12px;
font-size: 16px;
line-height: 1.42857143;
color: #000 !important;
background: #f9f9f9 !important;
background-image: none;
border: 1px solid #dfe0e1;
border-radius: 2px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
</style>
@stop
@section('body')
@section('form')
<div class="container">
{!! Former::open('recover_password')->rules(['email' => 'required|email'])->addClass('form-signin') !!}
<div class="modal-header">
@if (Utils::isWhiteLabel())
<h4>{{ trans('texts.password_recovery') }}</h4>
@else
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
</a>
<h4>Invoice Ninja | {{ trans('texts.password_recovery') }}</h4>
@endif
</div>
<div class="inner">
<p>
{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!}
</p>
<p>
{!! Button::success(trans('texts.send_email'))->large()->submit()->block() !!}
</p>
<h2 class="form-signin-heading">{{ trans('texts.password_recovery') }}</h2>
<hr class="green">
@if (count($errors->all()))
<div class="alert alert-danger">
@ -111,21 +24,25 @@
<!-- if there are login errors, show them here -->
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
<div>
{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!}
</div>
{!! Button::success(trans('texts.send_email'))->large()->submit()->withAttributes(['class' => 'green'])->block() !!}
{!! Former::close() !!}
</div>
</div>
<script type="text/javascript">
$(function() {

View File

@ -1,77 +1,6 @@
@extends('master')
@extends('login')
@section('head')
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/built.public.min.css') }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background-color: #337ab7;
color: #FFF;
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.form-control {
display: block;
width: 100%;
height: 40px;
padding: 9px 12px;
font-size: 16px;
line-height: 1.42857143;
color: #000 !important;
background: #f9f9f9 !important;
background-image: none;
border: 1px solid #dfe0e1;
border-radius: 2px;
-webkit-box-shadow: none;
box-shadow: none;
-webkit-transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
transition: border-color ease-in-out .15s,box-shadow ease-in-out .15s;
}
</style>
@stop
@section('body')
@section('form')
<div class="container">
{!! Former::open('/password/reset')->addClass('form-signin')->rules(array(
@ -79,22 +8,8 @@
'password_confirmation' => 'required',
)) !!}
<div class="modal-header">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.set_password') }}</h4></div>
<div class="inner">
<input type="hidden" name="token" value="{{{ $token }}}">
<p>
{!! Former::text('email')->placeholder(trans('texts.email'))->raw() !!}
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!}
</p>
<p>{!! Button::success(trans('texts.save'))->large()->submit()->block() !!}</p>
<h2 class="form-signin-heading">{{ trans('texts.set_password') }}</h2>
<hr class="green">
@if (count($errors->all()))
<div class="alert alert-danger">
@ -106,27 +21,34 @@
<!-- if there are login errors, show them here -->
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
<input type="hidden" name="token" value="{{{ $token }}}">
<div>
{!! Former::text('email')->placeholder(trans('texts.email'))->raw() !!}
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!}
</div>
<p>{!! Button::success(trans('texts.save'))->large()->submit()->withAttributes(['class' => 'green'])->block() !!}</p>
{!! Former::close() !!}
</div>
</div>
<script type="text/javascript">
$(function() {
$('#email').focus();
})
</script>
@stop
@endsection

View File

@ -1,120 +1,67 @@
@extends('public.header')
@extends('login')
@section('head')
@parent
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background:#222;
color:#fff
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
</style>
@endsection
@section('body')
<div class="container">
@section('form')
@include('partials.warn_session', ['redirectTo' => '/client/sessionexpired'])
{!! Former::open('client/login')
<div class="container">
{!! Former::open('client/login')
->rules(['password' => 'required'])
->addClass('form-signin') !!}
{{ Former::populateField('remember', 'true') }}
<div class="modal-header">
@if (!isset($account) || !$account->hasFeature(FEATURE_WHITE_LABEL))
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.account_login') }}</h4>
</a>
@else
<h4>{{ trans('texts.account_login') }}</h4>
<h2 class="form-signin-heading">{{ trans('texts.client_login') }}</h2>
<hr class="green">
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
</div>
<div class="inner">
<p>
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::hidden('remember')->raw() !!}
</p>
<p>{!! Button::success(trans('texts.login'))
->withAttributes(['id' => 'loginButton'])
->large()->submit()->block() !!}</p>
<p class="link">
{!! link_to('/client/recover_password', trans('texts.recover_password')) !!}
</p>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
@if (Session::has('warning'))
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@endif
@if (Session::has('message'))
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@endif
@if (Session::has('error'))
@if (Session::has('error'))
<div class="alert alert-danger"><li>{{ Session::get('error') }}</li></div>
@endif
@endif
{{ Former::populateField('remember', 'true') }}
<div>
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
</div>
{!! Former::hidden('remember')->raw() !!}
{!! Button::success(trans('texts.login'))
->withAttributes(['id' => 'loginButton', 'class' => 'green'])
->large()->submit()->block() !!}
<div class="row meta">
<div class="col-md-7 col-sm-12">
{!! link_to('/client/recover_password', trans('texts.recover_password')) !!}
</div>
</div>
{!! Former::close() !!}
</div>
@endsection
<script type="text/javascript">
$(function() {
if ($('#email').val()) {
$('#password').focus();
} else {
$('#email').focus();
}
})
</script>
@endsection

View File

@ -1,116 +1,44 @@
@extends('public.header')
@extends('login')
@section('head')
@parent
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background:#222;
color:#fff
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
@section('form')
@include('partials.warn_session', ['redirectTo' => '/client/sessionexpired'])
<div class="container">
{!! Former::open('client/recover_password')->addClass('form-signin') !!}
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
</style>
<h2 class="form-signin-heading">{{ trans('texts.password_recovery') }}</h2>
<hr class="green">
@stop
@section('body')
<div class="container">
{!! Former::open('client/recover_password')->addClass('form-signin') !!}
<div class="modal-header">
@if (!isset($account) || !$account->hasFeature(FEATURE_WHITE_LABEL))
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.password_recovery') }}</h4>
</a>
@else
<h4>{{ trans('texts.password_recovery') }}</h4>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
@if (session('status'))
<div class="alert alert-info">
{{ session('status') }}
</div>
@endif
<!-- if there are login errors, show them here -->
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
{!! Button::success(trans('texts.send_email'))
->withAttributes(['class' => 'green'])
->large()->submit()->block() !!}
{!! Former::close() !!}
</div>
<div class="inner">
<p>{!! Button::success(trans('texts.send_email'))->large()->submit()->block() !!}</p>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
@if (session('status'))
<div class="alert alert-info">
{{ session('status') }}
</div>
@endif
<!-- if there are login errors, show them here -->
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
{!! Former::close() !!}
</div>
</div>
<script type="text/javascript">
$(function() {
$('#email').focus();
})
</script>
@stop
@endsection

View File

@ -1,119 +1,52 @@
@extends('public.header')
@extends('login')
@section('head')
@parent
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background:#222;
color:#fff
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
@section('form')
<div class="container">
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
</style>
{!! Former::open('/client/password/reset')->addClass('form-signin')->rules(array(
'password' => 'required',
'password_confirmation' => 'required',
)) !!}
@stop
<h2 class="form-signin-heading">{{ trans('texts.set_password') }}</h2>
<hr class="green">
@section('body')
<div class="container">
{!! Former::open('/client/password/reset')->addClass('form-signin')->rules(array(
'password' => 'required',
'password_confirmation' => 'required',
)) !!}
<div class="modal-header">
@if (!isset($account) || !$account->hasFeature(FEATURE_WHITE_LABEL))
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.set_password') }}</h4>
</a>
@else
<h4>{{ trans('texts.set_password') }}</h4>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
</div>
<div class="inner">
<input type="hidden" name="token" value="{{{ $token }}}">
<input type="hidden" name="contact_key" value="{{{ $contact_key }}}">
<p>
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!}
</p>
<p>{!! Button::success(trans('texts.save'))->large()->submit()->block() !!}</p>
@if (count($errors->all()))
<div class="alert alert-danger">
@foreach ($errors->all() as $error)
<li>{{ $error }}</li>
@endforeach
</div>
@endif
<!-- if there are login errors, show them here -->
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('warning'))
<div class="alert alert-warning">{{ Session::get('warning') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('message'))
<div class="alert alert-info">{{ Session::get('message') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
@if (Session::has('error'))
<div class="alert alert-danger">{{ Session::get('error') }}</div>
@endif
<input type="hidden" name="token" value="{{{ $token }}}">
<input type="hidden" name="contact_key" value="{{{ $contact_key }}}">
{!! Former::close() !!}
</div>
<div>
{!! Former::password('password')->placeholder(trans('texts.password'))->raw() !!}
{!! Former::password('password_confirmation')->placeholder(trans('texts.confirm_password'))->raw() !!}
</div>
</div>
@stop
<p>{!! Button::success(trans('texts.save'))->large()->submit()->withAttributes(['class' => 'green'])->block() !!}</p>
{!! Former::close() !!}
</div>
<script type="text/javascript">
$(function () {
$('#password').focus();
})
</script>
@endsection

View File

@ -1,72 +1,8 @@
@extends('public.header')
@section('head')
@parent
<style type="text/css">
body {
padding-top: 40px;
padding-bottom: 40px;
}
.modal-header {
border-top-left-radius: 3px;
border-top-right-radius: 3px;
background:#222;
color:#fff
}
.modal-header h4 {
margin:0;
}
.modal-header img {
float: left;
margin-right: 20px;
}
.form-signin {
max-width: 400px;
margin: 0 auto;
background: #fff;
}
p.link a {
font-size: 11px;
}
.form-signin .inner {
padding: 20px;
border-bottom-right-radius: 3px;
border-bottom-left-radius: 3px;
border-left: 1px solid #ddd;
border-right: 1px solid #ddd;
border-bottom: 1px solid #ddd;
}
.form-signin .checkbox {
font-weight: normal;
}
.form-signin .form-control {
margin-bottom: 17px !important;
}
.form-signin .form-control:focus {
z-index: 2;
}
.modal-header a:link,
.modal-header a:visited,
.modal-header a:hover,
.modal-header a:active {
text-decoration: none;
color: white;
}
</style>
@endsection
@section('body')
<div class="container">
<div class="form-signin">
<div class="modal-header">
<h4>{{ trans('texts.session_expired') }}</h4>
</div>
<div class="inner">
<div class="alert alert-info">{{ trans('texts.client_session_expired_message') }}</div>
</div>
</div>
@extends('login')
@section('form')
<div class="form-signin">
<h2 class="form-signin-heading">{{ trans('texts.session_expired') }}</h2>
<hr class="green">
<div><center>{{ trans('texts.client_session_expired_message') }}</center></div>
</div>
@endsection
@endsection

View File

@ -3,7 +3,9 @@
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<!--[if !mso]><!-- -->
<link href="{{ isset($account) ? $account->getFontsUrl('http') : '' }}" rel="stylesheet" type="text/css" />
@if($fontsUrl = Utils::getAccountFontsUrl())
<link href="{{ $fontsUrl }}" rel="stylesheet" type="text/css" />
@endif
<!--<![endif]-->
</head>
<body style="color: #000000;{!! isset($account) ? $account->getBodyFontCss() : '' !!}font-size: 12px; -webkit-text-size-adjust: none; -ms-text-size-adjust: none; background: #F4F5F5; margin: 0; padding: 0;"

View File

@ -12,58 +12,246 @@
min-height: 700px;
}
div.row {
padding-top: 2em;
padding-bottom: 2em;
#main-row {
background: #fff;
line-height: 1.5;
position: relative;
margin-top: 50px;
margin-bottom: 50px;
}
#main-row > div {
padding: 25px;
position: static;
}
@media (max-width: 991px) {
#contact-details {
text-align: center;
}
}
@media (min-width: 992px) {
#main-row,
#account-row {
display: flex;
align-items: center;
}
#main-row {
margin-top: 100px;
margin-bottom: 100px;
}
}
#main-row h3 {
font-weight: 700;
color: #424343;
margin-top: 0;
margin-bottom: 30px;
}
#main-row,
#main-row a,
#account-row,
#account-row a {
color: #838181;
}
#main-row .amount-label {
color: #868787;
font-size: 21px;
font-weight: 300;
}
#main-row .amount {
color: #222;
font-size: 30px;
font-weight: 700;
line-height: 1.1;
}
#main-row .amount-col {
padding: 40px 20px;
}
@media (min-width: 1200px) {
#main-row .amount {
font-size: 38px;
}
#main-row > div {
padding: 60px;
}
}
#main-row .amount,
#main-row .amount-label {
position: relative;
z-index: 9;
}
.amount-col .inner {
text-align: center;
}
#main-row i {
width: 56px;
height: 56px;
border-radius: 50%;
background-color: #42d165;
position: absolute;
top: -20px;
margin-left: -28px;
text-align: center;
padding: 13px;
z-index: 9;
}
#main-row i img {
height: 30px;
}
#total-invoiced-col:before,
#paidtodate-col:before,
#balance-col:before {
content: '';
background: #dbd9d9;
width: 1px;
position: absolute;
height: 100%;
top: 0;
margin-left: -20px;
}
#total-invoiced-col:before {
width: 67px;
background: transparent;
background: -webkit-linear-gradient(0deg, #f8f8f8 0%, #ffffff 100%);
background: -moz-linear-gradient(0deg, #f8f8f8 0%, #ffffff 100%);
background: -o-linear-gradient(0deg, #f8f8f8 0%, #ffffff 100%);
background: -ms-linear-gradient(0deg, #f8f8f8 0%, #ffffff 100%);
background: linear-gradient(90deg, #f8f8f8 0%, #ffffff 100%);
}
@media (max-width: 991px) {
#main-row .amount-col {
position: relative;
}
#total-invoiced-col:before,
#paidtodate-col:before,
#balance-col:before {
width: 100%;
top: auto;
height: 1px;
margin-top: -40px;
}
#main-row i {
left: -20px;
top: 50%;
margin-top: -28px;
margin-left: 0;
}
#total-invoiced-col:before {
background: -webkit-linear-gradient(270deg, #f8f8f8 0%, #ffffff 100%);
background: -moz-linear-gradient(270deg, #f8f8f8 0%, #ffffff 100%);
background: -o-linear-gradient(270deg, #f8f8f8 0%, #ffffff 100%);
background: -ms-linear-gradient(270deg, #f8f8f8 0%, #ffffff 100%);
background: linear-gradient(180deg, #f8f8f8 0%, #ffffff 100%);
height: 50px;
}
}
@media (max-width: 815px) {
#main-row i {
left: 30px;
}
}
@media (max-width: 400px) {
#main-row i {
display: none
}
}
.invoices-from {
color: #424343;
font-weight: 700;
letter-spacing: 1px;
font-size: 13px;
text-transform: uppercase;
}
div.logo img {
max-width:300px;
max-height:200px;
max-width: 100%;
max-height: 75px;
}
div.address-details {
color: #666666;
font-size: 15px;
line-height: 1.8em;
#account-row > div {
padding: 20px 50px 20px 110px;
}
div.col-md-4-left {
padding-left: 15px;
padding-right: 6px;
}
div.col-md-4-center {
padding-left: 6px;
padding-right: 6px;
}
div.col-md-4-right {
padding-left: 6px;
padding-right: 15px;
#account-row .invoices-from {
padding-left: 0;
}
div.well {
background-color: white;
color: #0b4d78;
text-transform: uppercase;
text-align: center;
font-weight: 600;
padding-top: 40px;
padding-bottom: 40px;
#account-row .phone-web-details {
padding-right: 0;
}
div.well .fa {
color: green;
font-size: 18px;
margin-bottom: 6px;
#account-row .phone-web-details .inner {
text-align: right;
}
div.well .amount {
margin-top: 10px;
font-size: 32px;
font-weight: 300;
color: black;
#account-row > div:before {
content: '';
border-left: 1px solid #dbd9d9;
position: absolute;
height: 100%;
top: 0;
margin-left: -80px;
}
#account-row .logo {
padding-left: 70px;
}
#account-row .invoices-from:before {
content: none;
}
@media (max-width: 1199px) {
#account-row .logo,
#account-row > div {
padding-left: 40px;
padding-right: 5px;
}
#account-row > div:before {
margin-left: -25px;
}
}
@media (max-width: 991px) {
#account-row,
#account-row .phone-web-details .inner {
text-align: center;
}
#account-row > div {
padding: 15px 30px !important;
}
#account-row > div:before {
content: none;
}
}
table.dataTable thead > tr > th, table.invoice-table thead > tr > th {
background-color: {{ $color }} !important;
}
@ -92,8 +280,98 @@
<div class="container main-container">
<div class="row">
<div class="col-md-6 logo">
<div class="row" id="main-row">
<div class="col-md-3" id="contact-details">
<h3>{{$client->name}}</h3>
@if ($contact->first_name || $contact->last_name)
{{ $contact->first_name.' '.$contact->last_name }}<br>
@endif
@if ($client->address1)
{{ $client->address1 }}<br/>
@endif
@if ($client->address2)
{{ $client->address2 }}<br/>
@endif
@if ($client->getCityState())
{{ $client->getCityState() }}<br/>
@endif
@if ($client->country)
{{ $client->country->name }}<br/>
@endif
<br>
@if ($contact->email)
{!! HTML::mailto($contact->email, $contact->email) !!}<br>
@endif
@if ($client->website)
{!! HTML::link($client->website, $client->website) !!}<br>
@endif
@if ($contact->phone)
{{ $contact->phone }}<br>
@endif
</div>
<div class="col-md-3 amount-col" id="total-invoiced-col">
<div class="inner">
<i><img src="{{asset('images/icon-total-invoiced.svg')}}"></i>
<div class="amount-label">
{{ trans('texts.total_invoiced') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->paid_to_date + $client->balance, $client->currency_id ?: $account->currency_id) }}
</div>
</div>
</div>
<div class="col-md-3 amount-col" id="paidtodate-col">
<div class="inner">
<i><img src="{{asset('images/icon-paidtodate.svg')}}"></i>
<div class="amount-label">
{{ trans('texts.paid_to_date') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->paid_to_date, $client->currency_id ?: $account->currency_id) }}
</div>
</div>
</div>
<div class="col-md-3 amount-col" id="balance-col">
<div class="inner">
<i><img src="{{asset('images/icon-balance.svg')}}"></i>
<div class="amount-label">
{{ trans('texts.open_balance') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->balance, $client->currency_id ?: $account->currency_id) }}
</div>
</div>
</div>
</div>
@if (!empty($account->getTokenGatewayId()))
<div class="row">
<div class="col-xs-12">
@include('payments.paymentmethods_list')
</div>
</div>
@endif
<div style="min-height: 550px" class="hide">
{!! Datatable::table()
->addColumn(
trans('texts.date'),
trans('texts.message'),
trans('texts.balance'),
trans('texts.adjustment'))
->setUrl(route('api.client.activity'))
->setOptions('bFilter', false)
->setOptions('aaSorting', [['0', 'desc']])
->setOptions('sPaginationType', 'bootstrap')
->render('datatable') !!}
</div>
<div class="row" id="account-row">
<div class="col-md-2 invoices-from">
{{trans('texts.invoice_from')}}
</div>
<div class="col-md-4 logo">
@if ($account->hasLogo())
{!! HTML::image($account->getLogoURL()) !!}
@else
@ -114,74 +392,20 @@
{{ $account->country->name }}
@endif
</div>
<div class="col-md-3 address-details">
@if ($account->website)
<i class="fa fa-globe" style="width: 20px"></i><a href="{{ Utils::addHttp($account->website) }}" target="_blank">{{ $account->website }}</a><br/>
@endif
@if ($account->work_phone)
<i class="fa fa-phone" style="width: 20px"></i>{{ $account->work_phone }}<br/>
@endif
@if ($account->work_email)
<i class="fa fa-envelope" style="width: 20px"></i>{!! HTML::mailto($account->work_email, $account->work_email) !!}<br/>
@endif
</div>
</div>
<div class="row">
<div class="col-md-4 col-md-4-left">
<div class="well">
<div class="fa fa-file-text-o"></div>
<div>
{{ trans('texts.total_invoiced') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->paid_to_date + $client->balance, $client->currency_id ?: $account->currency_id) }}
</div>
<div class="col-md-3 phone-web-details">
<div class="inner">
@if ($account->work_phone)
{{ $account->work_phone }}<br/>
@endif
@if ($account->website)
<a href="{{ Utils::addHttp($account->website) }}" target="_blank">{{ $account->website }}</a>
<br/>
@endif
@if ($account->work_email)
{!! HTML::mailto($account->work_email, $account->work_email) !!}<br/>
@endif
</div>
</div>
<div class="col-md-4 col-md-4-center">
<div class="well">
<div class="fa fa-credit-card"></div>
<div>
{{ trans('texts.paid_to_date') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->paid_to_date, $client->currency_id ?: $account->currency_id) }}
</div>
</div>
</div>
<div class="col-md-4 col-md-4-right">
<div class="well">
<div class="fa fa-server"></div>
<div>
{{ trans('texts.open_balance') }}
</div>
<div class="amount">
{{ Utils::formatMoney($client->balance, $client->currency_id ?: $account->currency_id) }}
</div>
</div>
</div>
</div>
@if (!empty($account->getTokenGatewayId()))
<div class="row">
<div class="col-xs-12">
@include('payments.paymentmethods_list')
</div>
</div>
@endif
<div style="min-height: 550px">
{!! Datatable::table()
->addColumn(
trans('texts.date'),
trans('texts.message'),
trans('texts.balance'),
trans('texts.adjustment'))
->setUrl(route('api.client.activity'))
->setOptions('bFilter', false)
->setOptions('aaSorting', [['0', 'desc']])
->setOptions('sPaginationType', 'bootstrap')
->render('datatable') !!}
</div>
<p>&nbsp;</p>

View File

@ -0,0 +1,33 @@
@extends('master')
@section('head')
@if (!empty($clientauth) && $fontsUrl = Utils::getAccountFontsUrl())
<link href="{!! $fontsUrl !!}" rel="stylesheet" type="text/css">
@endif
<link href="{{ asset('css/built.public.css') }}?no_cache={{ NINJA_VERSION }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/bootstrap.min.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/built.css') }}" rel="stylesheet" type="text/css"/>
<link href="{{ asset('css/built.login.css') }}" rel="stylesheet" type="text/css"/>
@if (!empty($clientauth))
<style type="text/css">{!! Utils::clientViewCSS() !!}</style>
@endif
@endsection
@section('body')
@if (!Utils::isWhiteLabel() || empty($clientauth))
<div class="container-fluid">
<div class="row header">
<div class="col-md-6 col-xs-12 text-center">
<a><img width="231" src="{{ asset('images/invoiceninja-logox53.png') }}"/></a>
</div>
<div class="col-md-6 text-right visible-lg">
<p>{{trans('texts.ninja_tagline')}}</p>
</div>
</div>
</div>
@endif
@yield('form')
@endsection

View File

@ -125,7 +125,7 @@ header h3 em {
}
.secure h3 {
color: #36b855;
color: #42d165;
font-size: 30px;
margin-bottom: 8px;
margin-top: 0px;

View File

@ -43,11 +43,16 @@
}
$(function() {
// check that the footer appears at the bottom of the screen
var height = $(window).height() - ($('#header').height() + $('#footer').height());
if ($('#mainContent').height() < height) {
$('#mainContent').height(height);
function positionFooter() {
// check that the footer appears at the bottom of the screen
var height = $(window).height() - ($('#header').height() + $('#footer').height());
if ($('#mainContent').height() < height) {
$('#mainContent').css('min-height', height);
}
}
positionFooter();
$(window).resize(positionFooter);
})
</script>
@ -65,7 +70,8 @@
</button>
@if (!isset($account) || !$account->hasFeature(FEATURE_WHITE_LABEL))
{{-- Per our license, please do not remove or modify this link. --}}
<a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:20px"></a>
<a class="navbar-brand" href="{{ URL::to(NINJA_WEB_URL) }}" target="_blank"><img
src="{{ asset('images/invoiceninja-logo.png') }}" style="height:27px"></a>
@endif
</div>
<div id="navbar" class="collapse navbar-collapse">