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

bug fixes

This commit is contained in:
Hillel Coren 2013-12-31 01:19:17 +02:00
parent 2b5f42e5ac
commit b271a71586
12 changed files with 145 additions and 82 deletions

View File

@ -68,7 +68,7 @@ class AccountController extends \BaseController {
if ($section == ACCOUNT_DETAILS)
{
$account = Account::with('users')->findOrFail(Auth::user()->account_id);
$countries = Country::orderBy('name')->get();
$countries = Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get();
return View::make('accounts.details', array('account'=>$account, 'countries'=>$countries));
}
@ -88,11 +88,11 @@ class AccountController extends \BaseController {
'account' => $account,
'accountGateway' => $accountGateway,
'config' => json_decode($config),
'gateways' => Gateway::all(),
'timezones' => Timezone::orderBy('location')->get(),
'dateFormats' => DateFormat::all(),
'datetimeFormats' => DatetimeFormat::all(),
'currencies' => Currency::orderBy('name')->get(),
'gateways' => Gateway::remember(DEFAULT_QUERY_CACHE)->get(),
'timezones' => Timezone::remember(DEFAULT_QUERY_CACHE)->orderBy('location')->get(),
'dateFormats' => DateFormat::remember(DEFAULT_QUERY_CACHE)->get(),
'datetimeFormats' => DatetimeFormat::remember(DEFAULT_QUERY_CACHE)->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
];
foreach ($data['gateways'] as $gateway)

View File

@ -86,10 +86,10 @@ class ClientController extends \BaseController {
'method' => 'POST',
'url' => 'clients',
'title' => '- New Client',
'clientSizes' => ClientSize::orderBy('id')->get(),
'clientIndustries' => ClientIndustry::orderBy('name')->get(),
'currencies' => Currency::orderBy('name')->get(),
'countries' => Country::orderBy('name')->get());
'clientSizes' => ClientSize::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
'clientIndustries' => ClientIndustry::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get());
return View::make('clients.edit', $data);
}
@ -138,10 +138,10 @@ class ClientController extends \BaseController {
'method' => 'PUT',
'url' => 'clients/' . $publicId,
'title' => '- ' . $client->name,
'clientSizes' => ClientSize::orderBy('id')->get(),
'clientIndustries' => ClientIndustry::orderBy('name')->get(),
'currencies' => Currency::orderBy('name')->get(),
'countries' => Country::orderBy('name')->get());
'clientSizes' => ClientSize::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
'clientIndustries' => ClientIndustry::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get());
return View::make('clients.edit', $data);
}

View File

@ -76,7 +76,7 @@ class CreditController extends \BaseController {
'method' => 'POST',
'url' => 'credits',
'title' => '- New Credit',
'currencies' => Currency::orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clients' => Client::scope()->with('contacts')->orderBy('name')->get());
return View::make('credits.edit', $data);
@ -91,7 +91,7 @@ class CreditController extends \BaseController {
'method' => 'PUT',
'url' => 'credits/' . $publicId,
'title' => '- Edit Credit',
'currencies' => Currency::orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clients' => Client::scope()->with('contacts')->orderBy('name')->get());
return View::make('credit.edit', $data);
}

View File

@ -310,8 +310,6 @@ class InvoiceController extends \BaseController {
'invoice' => $invoice,
'method' => 'PUT',
'invitationContactIds' => $contactIds,
'clientSizes' => ClientSize::orderBy('id')->get(),
'clientIndustries' => ClientIndustry::orderBy('name')->get(),
'url' => 'invoices/' . $publicId,
'title' => '- ' . $invoice->invoice_number,
'client' => $invoice->client);
@ -335,8 +333,6 @@ class InvoiceController extends \BaseController {
'invoiceNumber' => $invoiceNumber,
'method' => 'POST',
'url' => 'invoices',
'clientSizes' => ClientSize::orderBy('id')->get(),
'clientIndustries' => ClientIndustry::orderBy('name')->get(),
'title' => '- New Invoice',
'client' => $client,
'items' => json_decode(Input::old('items')));
@ -349,10 +345,12 @@ class InvoiceController extends \BaseController {
return [
'account' => Auth::user()->account,
'products' => Product::scope()->get(array('product_key','notes','cost','qty')),
'countries' => Country::orderBy('name')->get(),
'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clients' => Client::scope()->with('contacts')->orderBy('name')->get(),
'taxRates' => TaxRate::scope()->orderBy('name')->get(),
'currencies' => Currency::orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clientSizes' => ClientSize::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
'clientIndustries' => ClientIndustry::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'frequencies' => array(
1 => 'Weekly',
2 => 'Two weeks',

View File

@ -80,7 +80,7 @@ class PaymentController extends \BaseController
'method' => 'POST',
'url' => 'payments',
'title' => '- New Payment',
'currencies' => Currency::orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clients' => Client::scope()->with('contacts')->orderBy('name')->get());
return View::make('payments.edit', $data);
@ -97,7 +97,7 @@ class PaymentController extends \BaseController
'method' => 'PUT',
'url' => 'payments/' . $publicId,
'title' => '- Edit Payment',
'currencies' => Currency::orderBy('name')->get(),
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
'clients' => Client::scope()->with('contacts')->orderBy('name')->get());
return View::make('payments.edit', $data);
}

View File

@ -54,6 +54,18 @@ class Client extends EntityModel
return $this->name;
}
public function getDisplayName()
{
if ($this->name)
{
return $this->name;
}
$contact = $this->contacts()->first();
return $contact->getFullName();
}
public function getEntityType()
{
return ENTITY_CLIENT;

View File

@ -180,3 +180,5 @@ define('DEFAULT_CURRENCY', 1); // US Dollar
define('DEFAULT_DATE_FORMAT', 'M j, Y');
define('DEFAULT_DATE_PICKER_FORMAT', 'yyyy-mm-dd');
define('DEFAULT_DATETIME_FORMAT', 'F j, Y, g:i a');
define('DEFAULT_QUERY_CACHE', 120);

View File

@ -151,7 +151,7 @@
</div>
<div class="container">
<div class="footer">
<div class="footer" style="padding-top: 32px">
<div class="pull-right">
{{ Former::open('user/setTheme')->addClass('themeForm') }}
<div style="display:none">
@ -160,11 +160,11 @@
</div>
<div class="btn-group tr-action dropup">
<button type="button" class="btn btn-xs btn-default dropdown-toggle" data-toggle="dropdown">
Theme <span class="caret"></span>
Site Theme <span class="caret"></span>
</button>
<ul class="dropdown-menu" role="menu">
<li><a href="#" onclick="setTheme(0)">Default</a></li>
@foreach (Theme::all() as $theme)
@foreach (Theme::remember(DEFAULT_QUERY_CACHE)->get() as $theme)
<li><a href="#" onclick="setTheme({{ $theme->id }})">{{ ucwords($theme->name) }}</a></li>
@endforeach
</ul>
@ -172,7 +172,7 @@
{{ Former::close() }}
</div>
Powered by {{ link_to('https://github.com/hillelcoren/invoice-ninja', 'InvoiceNinja', array('target'=>'_blank')) }}
Want something changed? We're {{ link_to('https://github.com/hillelcoren/invoice-ninja', 'open source', array('target'=>'_blank')) }}, email us at {{ link_to('mailto:contact@invoiceninja.com', 'contact@invoiceninja.com') }}.
<p class="text-danger">This is a demo site, the data is erased.</p>
</div>

View File

@ -19,6 +19,17 @@
<div class="row" style="min-height:195px" onkeypress="formEnterClick(event)">
<div class="col-md-5" id="col_1">
@if ($invoice && $invoice->isSent())
<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: 7px">
<a href="#" data-bind="click: showClientForm">{{ $client->getDisplayName() }}</a>
</div>
</div>
<div style="display:none">
@endif
{{ Former::select('client')->addOption('', '')->data_bind("dropdown: client")
->addGroupClass('client_select closer-row') }}
@ -28,12 +39,16 @@
</div>
</div>
@if ($invoice && $invoice->isSent())
</div>
@endif
<div data-bind="with: client">
<div class="form-group" data-bind="visible: contacts().length > 1, foreach: contacts">
<div class="col-lg-8 col-lg-offset-4">
<label for="test" class="checkbox" data-bind="attr: {for: $index() + '_check'}">
<input type="checkbox" value="1" data-bind="checked: send_invoice, attr: {id: $index() + '_check'}">
<span data-bind="text: fullName"/>
<span data-bind="text: displayName"/>
</label>
</div>
</div>
@ -111,13 +126,13 @@
<textarea data-bind="value: wrapped_notes, valueUpdate: 'afterkeydown'" rows="1" cols="60" style="resize: none;" class="form-control word-wrap" onchange="refreshPDF()"></textarea>
</td>
<td style="width:100px">
<input onkeyup="onItemChange()" data-bind="value: cost, valueUpdate: 'afterkeydown'" style="text-align: right" class="form-control" onchange="refreshPDF()"//>
<input onkeyup="onItemChange()" data-bind="value: prettyCost, valueUpdate: 'afterkeydown'" style="text-align: right" class="form-control" onchange="refreshPDF()"//>
</td>
<td style="width:80px">
<input onkeyup="onItemChange()" data-bind="value: prettyQty, valueUpdate: 'afterkeydown'" style="text-align: right" class="form-control" onchange="refreshPDF()"//>
</td>
<td style="width:120px; vertical-align:middle" data-bind="visible: $parent.tax_rates().length > 1">
<select class="form-control" style="width:100%" data-bind="value: tax, options: $parent.tax_rates, optionsText: 'displayName'"></select>
<select class="form-control" style="width:100%" data-bind="value: tax, options: $parent.tax_rates, optionsText: 'displayName'" onchange="refreshPDF()"></select>
</td>
<td style="width:100px;text-align: right;padding-top:9px !important">
<span data-bind="text: total"></span>
@ -187,7 +202,7 @@
<!-- <textarea rows="20" cols="120" id="pdfText" onkeyup="runCode()"></textarea> -->
<!-- <iframe frameborder="1" width="100%" height="600" style="display:block;margin: 0 auto"></iframe> -->
<iframe id="theIFrame" frameborder="1" width="100%" height="500"></iframe>
<iframe id="theFrame" style="display:none" frameborder="1" width="100%" height="500"></iframe>
<canvas id="theCanvas" style="display:none;width:100%;border:solid 1px #CCCCCC;"></canvas>
@ -196,7 +211,7 @@
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
<h4 class="modal-title" id="clientModalLabel">New Client</h4>
<h4 class="modal-title" id="clientModalLabel">Client</h4>
</div>
<div class="container" style="width: 100%">
@ -321,8 +336,6 @@
$(function() {
//$('form').change(refreshPDF);
$('#country_id').combobox();
$('[rel=tooltip]').tooltip();
@ -365,7 +378,7 @@
@if ($client)
$('#invoice_number').focus();
@else
//$('[name="client_combobox"]').focus();
$('.client_select input.form-control').focus();
@endif
$('#clientModal').on('shown.bs.modal', function () {
@ -392,7 +405,6 @@
$('label.radio').addClass('radio-inline');
applyComboboxListeners();
refreshPDF();
});
function applyComboboxListeners() {
@ -437,28 +449,28 @@
console.log("refreshPDF");
var invoice = createInvoiceModel();
var doc = generatePDF(invoice);
/*
var string = doc.output('dataurlstring');
var pdfAsArray = convertDataURIToBinary(string);
PDFJS.getDocument(pdfAsArray).then(function getPdfHelloWorld(pdf) {
pdf.getPage(1).then(function getPageHelloWorld(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
var canvas = document.getElementById('theCanvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
page.render({canvasContext: context, viewport: viewport});
});
});
*/
var string = doc.output('datauristring');
$('#theIFrame').attr('src', string);
if (isFirefox || isChrome) {
$('#theFrame').attr('src', string).show();
} else {
var pdfAsArray = convertDataURIToBinary(string);
PDFJS.getDocument(pdfAsArray).then(function getPdfHelloWorld(pdf) {
pdf.getPage(1).then(function getPageHelloWorld(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
var canvas = document.getElementById('theCanvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
page.render({canvasContext: context, viewport: viewport});
$('#theCanvas').show();
});
});
}
}
function onDownloadClick() {
@ -496,11 +508,12 @@
}
function formEnterClick(event) {
console.log('form enter click');
if (event.keyCode === 13){
if (event.target.type == 'textarea') {
return;
}
event.preventDefault();
$('.main_form').submit();
return false;
@ -508,6 +521,7 @@
}
function clientModalEnterClick(event) {
console.log('client form enter click');
if (event.keyCode === 13){
event.preventDefault();
model.clientFormComplete();
@ -516,6 +530,7 @@
}
function taxModalEnterClick(event) {
console.log('tax form enter click');
if (event.keyCode === 13){
event.preventDefault();
model.taxFormComplete();
@ -777,8 +792,8 @@
ko.mapping.fromJS(data, {}, this);
}
self.fullName = ko.computed(function() {
return self.first_name() + ' ' + self.last_name();
self.displayName = ko.computed(function() {
return self.first_name() + ' ' + self.last_name() + ' - ' + self.email();
});
}
@ -828,8 +843,8 @@
var self = this;
this.product_key = ko.observable('');
this.notes = ko.observable('');
this.cost = ko.observable();
this.qty = ko.observable();
this.cost = ko.observable(0);
this.qty = ko.observable(0);
this.tax = ko.observable();
this.actionsVisible = ko.observable(false);
@ -843,6 +858,16 @@
owner: this
});
this.prettyCost = ko.computed({
read: function () {
return this.cost() ? this.cost() : '';
},
write: function (value) {
this.cost(value);
},
owner: this
});
if (data) {
ko.mapping.fromJS(data, {}, this);
if (this.cost()) this.cost(formatMoney(this.cost(), model.currency_id(), true));

View File

@ -17,8 +17,8 @@
</div>
<div class="clearfix"></div><p>&nbsp;</p>
<!-- <iframe frameborder="1" width="100%" height="650" style="display:block;margin: 0 auto"></iframe> -->
<canvas id="the-canvas" style="width:100%;border:solid 1px #CCCCCC;"></canvas>
<iframe id="theFrame" frameborder="1" width="100%" height="650" style="display:none;margin: 0 auto"></iframe>
<canvas id="theCanvas" style="display:none;width:100%;border:solid 1px #CCCCCC;"></canvas>
<script type="text/javascript">
@ -31,24 +31,29 @@
@endif
var doc = generatePDF(invoice);
var string = doc.output('datauristring');
//$('iframe').attr('src', string);
alert(isFirefox);
alert(isChrome);
if (isFirefox || isChrome) {
$('#theFrame').attr('src', string).show();
} else {
alert(1);
var pdfAsArray = convertDataURIToBinary(string);
PDFJS.getDocument(pdfAsArray).then(function getPdfHelloWorld(pdf) {
//console.log(string);
var pdfAsArray = convertDataURIToBinary(string);
PDFJS.getDocument(pdfAsArray).then(function getPdfHelloWorld(pdf) {
pdf.getPage(1).then(function getPageHelloWorld(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
pdf.getPage(1).then(function getPageHelloWorld(page) {
var scale = 1.5;
var viewport = page.getViewport(scale);
var canvas = document.getElementById('theCanvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
var canvas = document.getElementById('the-canvas');
var context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
page.render({canvasContext: context, viewport: viewport});
});
});
page.render({canvasContext: context, viewport: viewport});
$('#theCanvas').show();
});
});
}
});
function onDownloadClick() {

View File

@ -23,6 +23,20 @@
{{ Former::actions( Button::primary_submit('Generate') ) }}
{{ Former::close() }}
<p>&nbsp;</p>
<div style="padding-bottom:8px">
<div style="float:left; height:22px; width:60px; background-color:rgba(78,205,196,.5); border: 1px solid rgba(78,205,196,1)"></div>
<div style="vertical-align: middle">&nbsp;Invoices</div>
</div>
<div style="padding-bottom:8px; clear:both">
<div style="float:left; height:22px; width:60px; background-color:rgba(255,107,107,.5); border: 1px solid rgba(255,107,107,1)"></div>
<div style="vertical-align: middle">&nbsp;Payments</div>
</div>
<div style="clear:both">
<div style="float:left; height:22px; width:60px; background-color:rgba(199,244,100,.5); border: 1px solid rgba(199,244,100,1)"></div>
<div style="vertical-align: middle">&nbsp;Credits</div>
</div>
</div>
<div class="col-lg-9">
<canvas id="monthly-reports" width="850" height="400"></canvas>

View File

@ -1,3 +1,10 @@
// http://stackoverflow.com/questions/9847580/how-to-detect-safari-chrome-ie-firefox-and-opera-browser
var isOpera = !!window.opera || navigator.userAgent.indexOf(' OPR/') >= 0;
var isFirefox = typeof InstallTrigger !== 'undefined'; // Firefox 1.0+
var isSafari = Object.prototype.toString.call(window.HTMLElement).indexOf('Constructor') > 0;
var isChrome = !!window.chrome && !isOpera; // Chrome 1+
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6
function generatePDF(invoice) {
var currencyId = invoice.currency_id;
var invoiceNumber = invoice.invoice_number;
@ -52,8 +59,8 @@ function generatePDF(invoice) {
doc.setFillColor(230,230,230);
var x1 = headerLeft - 6;
var y1 = headerTop + rowHeight + 4;
var x2 = headerRight - headerLeft + 12;
var y2 = rowHeight + 2;
var x2 = headerRight - headerLeft + 11;
var y2 = rowHeight + 1;
if (invoice.po_number) {
y1 += rowHeight;
}