1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-18 00:53:10 +01:00

Minor dashboard improvements

This commit is contained in:
Hillel Coren 2015-05-08 11:21:29 +03:00
parent b368e5589c
commit ef6e930f1b
31 changed files with 172 additions and 96 deletions

View File

@ -2,18 +2,18 @@ APP_ENV=development
APP_DEBUG=true
APP_URL=http://ninja.dev
APP_CIPHER=rijndael-128
APP_KEY=
APP_KEY
DB_TYPE=mysql
DB_HOST=localhost
DB_DATABASE=ninja
DB_USERNAME=
DB_PASSWORD=
DB_USERNAME
DB_PASSWORD
MAIL_DRIVER=smtp
MAIL_PORT=587
MAIL_ENCRYPTION=tls
MAIL_HOST=
MAIL_USERNAME=
MAIL_FROM_NAME=
MAIL_PASSWORD=
MAIL_HOST
MAIL_USERNAME
MAIL_FROM_NAME
MAIL_PASSWORD

View File

@ -0,0 +1,57 @@
<?php namespace App\Console\Commands;
use DB;
use DateTime;
use Illuminate\Console\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputArgument;
use App\Models\Account;
use App\Ninja\Mailers\ContactMailer as Mailer;
use App\Ninja\Repositories\AccountRepository;
class SendRenewalInvoices extends Command
{
protected $name = 'ninja:send-renewals';
protected $description = 'Send renewal invoices';
protected $mailer;
protected $accountRepo;
public function __construct(Mailer $mailer, AccountRepository $repo)
{
parent::__construct();
$this->mailer = $mailer;
$this->accountRepo = $repo;
}
public function fire()
{
$this->info(date('Y-m-d').' Running SendRenewalInvoices...');
$today = new DateTime();
$accounts = Account::whereRaw('datediff(curdate(), pro_plan_paid) = 355')->get();
$this->info(count($accounts).' accounts found');
dd(0);
foreach ($accounts as $account) {
$client = $this->accountRepo->getNinjaClient($account);
$invitation = $this->accountRepo->createNinjaInvoice($client);
$this->mailer->sendInvoice($invitation->invoice);
}
$this->info('Done');
}
protected function getArguments()
{
return array(
//array('example', InputArgument::REQUIRED, 'An example argument.'),
);
}
protected function getOptions()
{
return array(
//array('example', null, InputOption::VALUE_OPTIONAL, 'An example option.', null),
);
}
}

View File

@ -16,6 +16,7 @@ class Kernel extends ConsoleKernel {
'App\Console\Commands\ResetData',
'App\Console\Commands\ImportTimesheetData',
'App\Console\Commands\CheckData',
'App\Console\Commands\SendRenewalInvoices',
];
/**

View File

@ -27,6 +27,7 @@ class Handler extends ExceptionHandler {
{
Utils::logError(Utils::getErrorString($e));
return false;
//return parent::report($e);
}

View File

@ -572,7 +572,7 @@ class AccountController extends BaseController
}
$subdomain = preg_replace('/[^a-zA-Z0-9_\-]/', '', substr(strtolower(Input::get('subdomain')), 0, MAX_SUBDOMAIN_LENGTH));
if (in_array($subdomain, ['www', 'app', 'mail'])) {
if (!$subdomain || in_array($subdomain, ['www', 'app', 'mail', 'admin', 'blog'])) {
$subdomain = null;
}
if ($subdomain) {

View File

@ -9,6 +9,7 @@ use Exception;
use Input;
use Utils;
use View;
use Session;
use App\Models\User;
use App\Ninja\Mailers\Mailer;
use App\Ninja\Repositories\AccountRepository;

View File

@ -52,7 +52,7 @@ class DashboardController extends BaseController
$activities = Activity::where('activities.account_id', '=', Auth::user()->account_id)
->where('activity_type_id', '>', 0)
->orderBy('created_at', 'desc')->take(6)->get();
->orderBy('created_at', 'desc')->take(14)->get();
$pastDue = Invoice::scope()
->where('due_date', '<', date('Y-m-d'))
@ -73,7 +73,7 @@ class DashboardController extends BaseController
$data = [
'paidToDate' => $paidToDate,
'averageInvoice' => $averageInvoice,
'billedClients' => $metrics ? $metrics->billed_clients : 0,
//'billedClients' => $metrics ? $metrics->billed_clients : 0,
'invoicesSent' => $metrics ? $metrics->invoices_sent : 0,
'activeClients' => $metrics ? $metrics->active_clients : 0,
'activities' => $activities,

View File

@ -13,6 +13,8 @@ use CreditCard;
use URL;
use Cache;
use Event;
use DateTime;
use App\Models\Account;
use App\Models\Invoice;
use App\Models\Invitation;
use App\Models\Client;
@ -20,6 +22,7 @@ use App\Models\PaymentType;
use App\Models\Country;
use App\Models\License;
use App\Models\Payment;
use App\Models\Affiliate;
use App\Models\AccountGatewayToken;
use App\Ninja\Repositories\PaymentRepository;
use App\Ninja\Repositories\InvoiceRepository;
@ -610,7 +613,12 @@ class PaymentController extends BaseController
if ($invoice->account->account_key == NINJA_ACCOUNT_KEY) {
$account = Account::find($invoice->client->public_id);
$account->pro_plan_paid = date_create()->format('Y-m-d');
if ($account->pro_plan_paid) {
$date = DateTime::createFromFormat('Y-m-d', $account->pro_plan_paid);
$account->pro_plan_paid = $date->modify('+1 year')->format('Y-m-d');
} else {
$account->pro_plan_paid = date_create()->format('Y-m-d');
}
$account->save();
}

View File

@ -10,6 +10,7 @@ use Cache;
use Session;
use Event;
use App\Models\Language;
use App\Models\InvoiceDesign;
use App\Events\UserSettingsChanged;
class StartupCheck
@ -124,7 +125,7 @@ class StartupCheck
$licenseKey = Input::get('license_key');
$productId = Input::get('product_id');
$data = trim(file_get_contents((Utils::isNinjaDev() ? 'http://ninja.dev' : NINJA_APP_URL)."/claim_license?license_key={$licenseKey}&product_id={$productId}"));
$data = trim(file_get_contents((Utils::isNinjaDev() ? 'http://www.ninja.dev' : NINJA_APP_URL)."/claim_license?license_key={$licenseKey}&product_id={$productId}"));
if ($productId == PRODUCT_INVOICE_DESIGNS) {
if ($data = json_decode($data)) {

View File

@ -84,7 +84,7 @@ Route::post('user/reset', 'UserController@do_reset_password');
Route::get('logout', 'UserController@logout');
*/
if (\App\Libraries\Utils::isNinja()) {
if (Utils::isNinja()) {
Route::post('/signup/register', 'AccountController@doRegister');
Route::get('/news_feed/{user_type}/{version}/', 'HomeController@newsFeed');
Route::get('/demo', 'AccountController@demo');
@ -350,7 +350,7 @@ define('EVENT_CREATE_PAYMENT', 4);
define('REQUESTED_PRO_PLAN', 'REQUESTED_PRO_PLAN');
define('DEMO_ACCOUNT_ID', 'DEMO_ACCOUNT_ID');
define('NINJA_ACCOUNT_KEY', 'zg4ylmzDkdkPOT8yoKQw9LTWaoZJx79h');
define('NINJA_GATEWAY_ID', GATEWAY_AUTHORIZE_NET);
define('NINJA_GATEWAY_ID', GATEWAY_STRIPE);
define('NINJA_GATEWAY_CONFIG', '');
define('NINJA_WEB_URL', 'https://www.invoiceninja.com');
define('NINJA_APP_URL', 'https://app.invoiceninja.com');
@ -507,7 +507,7 @@ Validator::extend('has_credit', function($attribute, $value, $parameters) {
$publicClientId = $parameters[0];
$amount = $parameters[1];
$client = Client::scope($publicClientId)->firstOrFail();
$client = \App\Models\Client::scope($publicClientId)->firstOrFail();
$credit = $client->getTotalCredit();
return $credit >= $amount;

View File

@ -109,18 +109,18 @@ class AccountRepository
return false;
}
$ninjaAccount = $this->getNinjaAccount();
$lastInvoice = Invoice::withTrashed()->whereAccountId($ninjaAccount->id)->orderBy('public_id', 'DESC')->first();
$publicId = $lastInvoice ? ($lastInvoice->public_id + 1) : 1;
$ninjaClient = $this->getNinjaClient($ninjaAccount);
$invitation = $this->createNinjaInvoice($publicId, $ninjaAccount, $ninjaClient);
$client = $this->getNinjaClient(Auth::user()->account);
$invitation = $this->createNinjaInvoice($client);
return $invitation;
}
private function createNinjaInvoice($publicId, $account, $client)
public function createNinjaInvoice($client)
{
$account = $this->getNinjaAccount();
$lastInvoice = Invoice::withTrashed()->whereAccountId($account->id)->orderBy('public_id', 'DESC')->first();
$publicId = $lastInvoice ? ($lastInvoice->public_id + 1) : 1;
$invoice = new Invoice();
$invoice->account_id = $account->id;
$invoice->user_id = $account->users()->first()->id;
@ -174,7 +174,6 @@ class AccountRepository
$user->confirmed = true;
$user->email = 'contact@invoiceninja.com';
$user->password = $random;
$user->password_confirmation = $random;
$user->username = $random;
$user->first_name = 'Invoice';
$user->last_name = 'Ninja';
@ -193,27 +192,29 @@ class AccountRepository
return $account;
}
private function getNinjaClient($ninjaAccount)
public function getNinjaClient($account)
{
$client = Client::whereAccountId($ninjaAccount->id)->wherePublicId(Auth::user()->account_id)->first();
$account->load('users');
$ninjaAccount = $this->getNinjaAccount();
$client = Client::whereAccountId($ninjaAccount->id)->wherePublicId($account->id)->first();
if (!$client) {
$client = new Client();
$client->public_id = Auth::user()->account_id;
$client->public_id = $account->id;
$client->user_id = $ninjaAccount->users()->first()->id;
$client->currency_id = 1;
foreach (['name', 'address1', 'address2', 'city', 'state', 'postal_code', 'country_id', 'work_phone'] as $field) {
$client->$field = Auth::user()->account->$field;
$client->$field = $account->$field;
}
$ninjaAccount->clients()->save($client);
$contact = new Contact();
$contact->user_id = $ninjaAccount->users()->first()->id;
$contact->account_id = $ninjaAccount->id;
$contact->public_id = Auth::user()->account_id;
$contact->public_id = $account->id;
$contact->is_primary = true;
foreach (['first_name', 'last_name', 'email', 'phone'] as $field) {
$contact->$field = Auth::user()->$field;
$contact->$field = $account->users()->first()->$field;
}
$client->contacts()->save($contact);
}
@ -223,13 +224,13 @@ class AccountRepository
public function registerUser($user)
{
$url = NINJA_APP_URL.'/signup/register';
$url = (Utils::isNinjaDev() ? '' : NINJA_APP_URL) . '/signup/register';
$data = '';
$fields = [
'first_name' => urlencode($user->first_name),
'last_name' => urlencode($user->last_name),
'email' => urlencode($user->email),
];
'first_name' => urlencode($user->first_name),
'last_name' => urlencode($user->last_name),
'email' => urlencode($user->email),
];
foreach ($fields as $key => $value) {
$data .= $key.'='.$value.'&';

View File

@ -95,7 +95,7 @@ return [
|
*/
'log' => 'daily',
'log' => 'single',
/*
|--------------------------------------------------------------------------

View File

@ -29,7 +29,7 @@ return [
|
*/
'lifetime' => 120,
'lifetime' => 360,
'expire_on_close' => false,

View File

@ -2388,7 +2388,7 @@ body { background: #f8f8f8 !important;
}
.bold { font-weight: 700; }
a {color:#0b4d78;}
a:hover { text-decoration: none; color: #0a3857;}
/*a:hover { text-decoration: none; color: #0a3857;}*/
.breadcrumb {
padding: 8px 0!important;
}

View File

@ -4,7 +4,7 @@ body { background: #f8f8f8 !important;
}
.bold { font-weight: 700; }
a {color:#0b4d78;}
a:hover { text-decoration: none; color: #0a3857;}
/*a:hover { text-decoration: none; color: #0a3857;}*/
.breadcrumb {
padding: 8px 0!important;
}

View File

@ -31941,7 +31941,7 @@ function isValidEmailAddress(emailAddress) {
$(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});

View File

@ -391,7 +391,7 @@ function isValidEmailAddress(emailAddress) {
$(function() {
$.ajaxSetup({
headers: {
'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content')
'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
}
});
});

View File

@ -263,7 +263,7 @@ return array(
'payment_message' => 'Tak for din betaling pålydende :amount.',
'email_salutation' => 'Kære :name,',
'email_signature' => 'Med venlig hilsen,',
'email_from' => 'The InvoiceNinja Team',
'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'For at justere varslingsindstillingene venligst besøg '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'Hvis du vil se din klientfaktura klik på linket under:',
'notification_invoice_paid_subject' => 'Faktura :invoice betalt af :client',

View File

@ -261,7 +261,7 @@ return array(
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client',

View File

@ -261,7 +261,7 @@ return array(
'payment_message' => 'Thank you for your payment of :amount.',
'email_salutation' => 'Dear :name,',
'email_signature' => 'Regards,',
'email_from' => 'The InvoiceNinja Team',
'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'To adjust your email notification settings please visit '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'To view your client invoice click the link below:',
'notification_invoice_paid_subject' => 'Invoice :invoice was paid by :client',

View File

@ -261,7 +261,7 @@ return array(
'payment_message' => 'Fakk for din betaling p&#229;lydende :amount.',
'email_salutation' => 'Kj&#230;re :name,',
'email_signature' => 'Med vennlig hilsen,',
'email_from' => 'The InvoiceNinja Team',
'email_from' => 'The Invoice Ninja Team',
'user_email_footer' => 'For &#229; justere varslingsinnstillingene vennligst bes&#248;k '.SITE_URL.'/company/notifications',
'invoice_link_message' => 'Hvis du vil se din klientfaktura klikk p&#229; linken under:',
'notification_invoice_paid_subject' => 'Faktura :invoice betalt av :client',

View File

@ -9,7 +9,7 @@
@if (!Auth::user()->account->isPro())
<center>
<div style="font-size:larger;" class="col-md-8 col-md-offset-2">{!! trans('texts.pro_plan_advanced_settings', ['link'=>'<a href="#" onclick="showProPlan(\''.$feature.'\')">'.trans('texts.pro_plan.remove_logo_link').'</a>']) !!}</div>
<div style="font-size:larger;" class="col-md-8 col-md-offset-2">{!! trans('texts.pro_plan_advanced_settings', ['link'=>'<a href="#" onclick="submitProPlan(\''.$feature.'\')">'.trans('texts.pro_plan.remove_logo_link').'</a>']) !!}</div>
&nbsp;<p/>&nbsp;
</center>
@endif

View File

@ -47,6 +47,14 @@
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
@ -59,8 +67,11 @@
{{ Former::populateField('remember', 'true') }}
<div class="modal-header">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.account_login') }}</h4></div>
<a href="{{ NINJA_WEB_URL }}" target="_blank">
<img src="{{ asset('images/icon-login.png') }}" />
<h4>Invoice Ninja | {{ trans('texts.account_login') }}</h4>
</a>
</div>
<div class="inner">
<p>
{!! Former::text('email')->placeholder(trans('texts.email_address'))->raw() !!}

View File

@ -26,11 +26,13 @@
<div class="panel panel-default">
<div class="panel-body">
<img src="{{ asset('images/clients.png') }}" class="in-image"/>
<div class="in-bold">
{{ $billedClients }}
</div>
<div class="in-thin">
{{ Utils::pluralize('billed_client', $billedClients) }}
{{ trans('texts.average_invoice') }}
</div>
<div class="in-bold">
@foreach ($averageInvoice as $item)
{{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}<br/>
@endforeach
</div>
</div>
</div>
@ -55,7 +57,7 @@
<div class="row">
<div class="col-md-6">
<div class="panel panel-default dashboard" style="min-height:320px">
<div class="panel panel-default dashboard" style="min-height:660px">
<div class="panel-heading" style="background-color:#0b4d78 !important">
<h3 class="panel-title in-bold-white">
<i class="glyphicon glyphicon-exclamation-sign"></i> {{ trans('texts.notifications') }}
@ -101,11 +103,6 @@
</table>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default dashboard" style="min-height:320px;">
<div class="panel-heading" style="margin:0; background-color: #f5f5f5 !important;">
<h3 class="panel-title" style="color: black !important">
@ -135,25 +132,14 @@
</table>
</div>
</div>
</div>
<div class="col-md-3">
<div class="active-clients">
<div class="in-bold in-white" style="font-size:42px">{{ $activeClients }}</div>
<div class="in-thin in-white">{{ Utils::pluralize('active_client', $activeClients) }}</div>
</div>
</div>
<div class="col-md-3">
<div class="average-invoice">
<div><b>{{ trans('texts.average_invoice') }}</b></div>
<div class="in-bold in-white" style="font-size:42px">
@foreach ($averageInvoice as $item)
{{ Utils::formatMoney($item->invoice_avg, $item->currency_id) }}<br/>
@endforeach
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
</div>
</div>
@stop

View File

@ -149,15 +149,8 @@
}
@if (Auth::check() && !Auth::user()->isPro())
var proPlanFeature = false;
function showProPlan(feature) {
proPlanFeature = feature;
$('#proPlanModal').modal('show');
trackUrl('/view_pro_plan/' + feature);
}
function submitProPlan() {
trackUrl('/submit_pro_plan/' + proPlanFeature);
function submitProPlan(feature) {
trackUrl('/submit_pro_plan/' + feature);
if (NINJA.isRegistered) {
$('#proPlanDiv, #proPlanFooter').hide();
$('#proPlanWorking').show();
@ -167,7 +160,7 @@
url: '{{ URL::to('account/go_pro') }}',
success: function(result) {
NINJA.formIsChanged = false;
window.location = '{{ Utils::isNinjaDev() ? '' : NINJA_APP_URL }}/view/' + result;
window.location = '/view/' + result;
}
});
} else {
@ -319,7 +312,7 @@
@if (!Auth::user()->registered)
{!! Button::success(trans('texts.sign_up'))->withAttributes(array('id' => 'signUpButton', 'data-toggle'=>'modal', 'data-target'=>'#signUpModal'))->small() !!} &nbsp;
@elseif (!Auth::user()->isPro())
{!! Button::success(trans('texts.go_pro'))->withAttributes(array('id' => 'proPlanButton', 'data-toggle'=>'modal', 'data-target'=>'#proPlanModal'))->small() !!} &nbsp;
{!! Button::success(trans('texts.go_pro'))->withAttributes(array('id' => 'proPlanButton', 'onclick' => 'submitProPlan("")'))->small() !!} &nbsp;
@endif
@endif

View File

@ -40,8 +40,10 @@
@if ($invoice && $invoice->id)
<div class="form-group">
<label for="client" class="control-label col-lg-4 col-sm-4">Client</label>
<div class="col-lg-8 col-sm-8" style="padding-top: 10px">
<a id="editClientLink" class="pointer" data-bind="click: $root.showClientForm, text: getClientDisplayName(ko.toJS(client()))"></a>
<div class="col-lg-8 col-sm-8">
<h4><div data-bind="text: getClientDisplayName(ko.toJS(client()))"></div></h4>
<a id="editClientLink" class="pointer" data-bind="click: $root.showClientForm">{{ trans('texts.edit_client') }}</a> |
{!! link_to('/clients/'.$invoice->client->public_id, trans('texts.view_client'), ['target' => '_blank']) !!}
</div>
</div>
<div style="display:none">
@ -52,6 +54,9 @@
<div class="form-group" style="margin-bottom: 8px">
<div class="col-lg-8 col-sm-8 col-lg-offset-4 col-sm-offset-4">
<a id="createClientLink" class="pointer" data-bind="click: $root.showClientForm, text: $root.clientLinkText"></a>
<span data-bind="visible: $root.invoice().client().public_id() > 0">|
<a data-bind="attr: {href: '{{ url('/clients') }}/' + $root.invoice().client().public_id()}" target="_blank">{{ trans('texts.view_client') }}</a>
</span>
</div>
</div>
@ -384,7 +389,7 @@
@if (!Auth::user()->account->isPro())
<div style="font-size:larger">
{!! trans('texts.pro_plan.remove_logo', ['link'=>'<a href="#" onclick="showProPlan(\'remove_logo\')">'.trans('texts.pro_plan.remove_logo_link').'</a>']) !!}
{!! trans('texts.pro_plan.remove_logo', ['link'=>'<a href="#" onclick="submitProPlan(\'remove_logo\')">'.trans('texts.pro_plan.remove_logo_link').'</a>']) !!}
</div>
@endif
@ -1089,7 +1094,7 @@
self.clientLinkText = ko.computed(function() {
if (self.invoice().client().public_id())
{
return "{{ trans('texts.edit_client_details') }}";
return "{{ trans('texts.edit_client') }}";
}
else
{

View File

@ -35,7 +35,7 @@
<button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('texts.cancel') }}</button>
@if (Utils::isNinjaProd())
<button type="button" class="btn btn-primary" onclick="showProPlan('invoice_designs')">{{ trans('texts.go_pro') }}</button>
<button type="button" class="btn btn-primary" onclick="submitProPlan('invoice_designs')">{{ trans('texts.go_pro') }}</button>
@else
<button type="button" class="btn btn-primary" onclick="buyProduct('{{ INVOICE_DESIGNS_AFFILIATE_KEY }}', '{{ PRODUCT_INVOICE_DESIGNS }}')">{{ trans('texts.buy') }}</button>
@endif

View File

@ -53,6 +53,10 @@ body {
padding: 28px 0;
}
#footer .bottom a {
color: #636262;
}
#footer .menu-item-31 a:before {
content: '';
display: inline-block;
@ -241,7 +245,7 @@ table.table thead .sorting_desc_disabled:after { content: '' !important }
<div class="bottom">
<div class="wrap">
<div class="copy">Copyright &copy;2015 InvoiceNinja. All rights reserved.</div>
<div class="copy">Copyright &copy;2015 <a href="{{ NINJA_WEB_URL }}" target="_blank">Invoice Ninja</a>. All rights reserved.</div>
</div><!-- .wrap -->
</div><!-- .bottom -->
</footer><!-- #footer -->

View File

@ -50,8 +50,8 @@
<p>&nbsp;</p>
{!! Former::checkbox('enable_chart')->text(trans('texts.enable')) !!}
{!! Former::select('chart_type')->options($chartTypes, $chartType) !!}
{!! Former::select('group_by')->options($dateTypes, $groupBy) !!}
{!! Former::select('chart_type')->options($chartTypes, $chartType) !!}
<p>&nbsp;</p>
@if (Auth::user()->isPro())

View File

@ -6,6 +6,13 @@
<meta name="csrf-token" content="<?= csrf_token() ?>">
<script src="{{ asset('js/built.js') }}?no_cache={{ NINJA_VERSION }}" type="text/javascript"></script>
<link href="{{ asset('css/built.public.css') }}?no_cache={{ NINJA_VERSION }}" rel="stylesheet" type="text/css"/>
<style type="text/css">
body {
background-color: #f8f8f8;
}
</style>
</head>
<body>
@ -23,7 +30,7 @@
@if (!extension_loaded('fileinfo'))
<div class="alert alert-warning">Warning: The <a href="http://php.net/manual/en/book.fileinfo.php" target="_blank">fileinfo</a> extension needs to be installed and enabled.</div>
@endif
@if (!@fopen(base_path()."/.env", 'w'))
@if (!@fopen(base_path()."/.env", 'a'))
<div class="alert alert-warning">Warning: Permission denied to write config file
<pre>sudo chown yourname:www-data /path/to/ninja</pre>
</div>