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

Working on invoice fields

This commit is contained in:
Hillel Coren 2016-09-05 15:28:59 +03:00
parent 03cc5035c5
commit d14cf5f9ed
13 changed files with 428 additions and 220 deletions

View File

@ -543,6 +543,8 @@ class AccountController extends BaseController
$invoice->terms = trim($account->invoice_terms);
$invoice->invoice_footer = trim($account->invoice_footer);
$contact->first_name = 'Test';
$contact->last_name = 'Contact';
$contact->email = 'contact@gmail.com';
$client->contacts = [$contact];
@ -1026,7 +1028,7 @@ class AccountController extends BaseController
$labels[$field] = Input::get("labels_{$field}");
}
$account->invoice_labels = json_encode($labels);
$account->invoice_fields = Input::get('invoice_fields');
$account->invoice_fields = Input::get('invoice_fields_json');
$account->save();

View File

@ -825,7 +825,7 @@ if (!defined('CONTACT_EMAIL')) {
define('INVOICE_FIELDS_CLIENT', 'client_fields');
define('INVOICE_FIELDS_INVOICE', 'invoice_fields');
define('INVOICE_FIELDS_COMPANY', 'company_fields');
define('INVOICE_FIELDS_ACCOUNT', 'account_fields');
$creditCards = [
1 => ['card' => 'images/credit_cards/Test-Visa-Icon.png', 'text' => 'Visa'],

View File

@ -721,6 +721,7 @@ class Invoice extends EntityModel implements BalanceAffecting
'invoice_embed_documents',
'page_size',
'include_item_taxes_inline',
'invoice_fields',
]);
foreach ($this->invoice_items as $invoiceItem) {

View File

@ -9,63 +9,69 @@ trait PresentsInvoice
{
if ($this->invoice_fields) {
$fields = json_decode($this->invoice_fields, true);
return $this->applyLabels($fields);
} else {
$fields = [
INVOICE_FIELDS_INVOICE => [
'invoice_number',
'po_number',
'invoice_date',
'due_date',
'balance_due',
'partial_due',
],
INVOICE_FIELDS_CLIENT => [
'client_name',
'id_number',
'vat_number',
'address1',
'address2',
'city_state_postal',
'country',
'email',
],
'company_fields1' => [
'company_name',
'id_number',
'vat_number',
'website',
'email',
'phone',
],
'company_fields2' => [
'address1',
'address2',
'city_state_postal',
'country',
],
];
if ($this->custom_invoice_text_label1) {
$fields[INVOICE_FIELDS_INVOICE][] = 'custom_invoice_text_label1';
}
if ($this->custom_invoice_text_label2) {
$fields[INVOICE_FIELDS_INVOICE][] = 'custom_invoice_text_label2';
}
if ($this->custom_client_label1) {
$fields[INVOICE_FIELDS_CLIENT][] = 'custom_client_label1';
}
if ($this->custom_client_label2) {
$fields[INVOICE_FIELDS_CLIENT][] = 'custom_client_label2';
}
if ($this->custom_label1) {
$fields['company_fields2'][] = 'custom_label1';
}
if ($this->custom_label2) {
$fields['company_fields2'][] = 'custom_label2';
}
return $this->getDefaultInvoiceFields();
}
}
public function getDefaultInvoiceFields()
{
$fields = [
INVOICE_FIELDS_INVOICE => [
'invoice.invoice_number',
'invoice.po_number',
'invoice.invoice_date',
'invoice.due_date',
'invoice.balance_due',
'invoice.partial_due',
],
INVOICE_FIELDS_CLIENT => [
'client.client_name',
'client.id_number',
'client.vat_number',
'client.address1',
'client.address2',
'client.city_state_postal',
'client.country',
'client.email',
],
'account_fields1' => [
'account.company_name',
'account.id_number',
'account.vat_number',
'account.website',
'account.email',
'account.phone',
],
'account_fields2' => [
'account.address1',
'account.address2',
'account.city_state_postal',
'account.country',
],
];
if ($this->custom_invoice_text_label1) {
$fields[INVOICE_FIELDS_INVOICE][] = 'invoice.custom_text_value1';
}
if ($this->custom_invoice_text_label2) {
$fields[INVOICE_FIELDS_INVOICE][] = 'invoice.custom_text_value2';
}
if ($this->custom_client_label1) {
$fields[INVOICE_FIELDS_CLIENT][] = 'client.custom_value1';
}
if ($this->custom_client_label2) {
$fields[INVOICE_FIELDS_CLIENT][] = 'client.custom_value2';
}
if ($this->custom_label1) {
$fields['account_fields2'][] = 'account.custom_value1';
}
if ($this->custom_label2) {
$fields['account_fields2'][] = 'account.custom_value2';
}
return $this->applyLabels($fields);
}
@ -73,41 +79,41 @@ trait PresentsInvoice
{
$fields = [
INVOICE_FIELDS_INVOICE => [
'invoice_number',
'po_number',
'invoice_date',
'due_date',
'balance_due',
'partial_due',
'custom_invoice_text_label1',
'custom_invoice_text_label2',
'invoice.invoice_number',
'invoice.po_number',
'invoice.invoice_date',
'invoice.due_date',
'invoice.balance_due',
'invoice.partial_due',
'invoice.custom_text_value1',
'invoice.custom_text_value2',
],
INVOICE_FIELDS_CLIENT => [
'client_name',
'id_number',
'vat_number',
'address1',
'address2',
'city_state_postal',
'country',
'email',
'contact_name',
'custom_client_label1',
'custom_client_label2',
'client.client_name',
'client.id_number',
'client.vat_number',
'client.address1',
'client.address2',
'client.city_state_postal',
'client.country',
'client.email',
'client.contact_name',
'client.custom_value1',
'client.custom_value2',
],
INVOICE_FIELDS_COMPANY => [
'company_name',
'id_number',
'vat_number',
'website',
'email',
'phone',
'address1',
'address2',
'city_state_postal',
'country',
'custom_label1',
'custom_label2',
INVOICE_FIELDS_ACCOUNT => [
'account.company_name',
'account.id_number',
'account.vat_number',
'account.website',
'account.email',
'account.phone',
'account.address1',
'account.address2',
'account.city_state_postal',
'account.country',
'account.custom_value1',
'account.custom_value2',
]
];
@ -120,7 +126,12 @@ trait PresentsInvoice
foreach ($fields as $section => $sectionFields) {
foreach ($sectionFields as $index => $field) {
$fields[$section][$field] = $labels[$field];
list($entityType, $fieldName) = explode('.', $field);
if (substr($fieldName, 0, 6) == 'custom') {
$fields[$section][$field] = $labels[$field];
} else {
$fields[$section][$field] = $labels[$fieldName];
}
unset($fields[$section][$index]);
}
}
@ -200,14 +211,14 @@ trait PresentsInvoice
}
foreach ([
'custom_label1',
'custom_label2',
'custom_client_label1',
'custom_client_label2',
'custom_invoice_text_label1',
'custom_invoice_text_label2',
] as $field) {
$data[$field] = $this->$field ?: trans('texts.custom_field');
'invoice.custom_text_value1' => 'custom_invoice_text_label1',
'invoice.custom_text_value2' => 'custom_invoice_text_label2',
'client.custom_value1' => 'custom_client_label1',
'client.custom_value2' => 'custom_client_label2',
'account.custom_value1' => 'custom_label1',
'account.custom_value2' => 'custom_label2'
] as $field => $property) {
$data[$field] = $this->$property ?: trans('texts.custom_field');
}
return $data;

View File

@ -204,6 +204,7 @@ class AccountRepository
['custom_fields', '/settings/invoice_settings'],
['invoice_number', '/settings/invoice_settings'],
['buy_now_buttons', '/settings/client_portal#buyNow'],
['invoice_fields', '/settings/invoice_design#invoice_fields'],
]);
$settings = array_merge(Account::$basicSettings, Account::$advancedSettings);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -563,122 +563,254 @@ NINJA.subtotalsBalance = function(invoice) {
NINJA.accountDetails = function(invoice) {
var account = invoice.account;
var data = [
{text:account.name, style: ['accountName']},
{text:account.id_number, style: ['idNumber']},
{text:account.vat_number, style: ['vatNumber']},
{text:account.website, style: ['website']},
{text:account.work_email, style: ['email']},
{text:account.work_phone, style: ['phone']}
];
if (invoice.features.invoice_settings && account.invoice_fields) {
var fields = JSON.parse(account.invoice_fields);
} else {
var fields = [
'account.company_name',
'account.id_number',
'account.vat_number',
'account.website',
'account.email',
'account.phone',
];
}
var data = [];
for (var i=0; i < fields.account_fields1.length; i++) {
var field = fields.account_fields1[i];
var value = NINJA.renderClientOrAccountField(invoice, field);
if (value) {
data.push(value);
}
}
return NINJA.prepareDataList(data, 'accountDetails');
}
NINJA.accountAddress = function(invoice) {
var account = invoice.account;
var cityStatePostal = '';
if (account.city || account.state || account.postal_code) {
var swap = account.country && account.country.swap_postal_code;
cityStatePostal = formatAddress(account.city, account.state, account.postal_code, swap);
if (invoice.features.invoice_settings && account.invoice_fields) {
var fields = JSON.parse(account.invoice_fields);
} else {
var fields = [
'account.address1',
'account.address2',
'account.city_state_postal',
'account.country',
'account.custom_value1',
'account.custom_value2',
]
}
var data = [
{text: account.address1},
{text: account.address2},
{text: cityStatePostal},
{text: account.country ? account.country.name : ''},
];
if (invoice.features.invoice_settings) {
data.push({text: invoice.account.custom_value1 ? invoice.account.custom_label1 + ' ' + invoice.account.custom_value1 : false});
data.push({text: invoice.account.custom_value2 ? invoice.account.custom_label2 + ' ' + invoice.account.custom_value2 : false});
var data = [];
for (var i=0; i < fields.account_fields2.length; i++) {
var field = fields.account_fields2[i];
var value = NINJA.renderClientOrAccountField(invoice, field);
if (value) {
data.push(value);
}
}
return NINJA.prepareDataList(data, 'accountAddress');
}
NINJA.renderInvoiceField = function(invoice, field) {
var account = invoice.account;
if (field == 'invoice.invoice_number') {
return [
{text: (invoice.is_quote ? invoiceLabels.quote_number : invoiceLabels.invoice_number), style: ['invoiceNumberLabel']},
{text: invoice.invoice_number, style: ['invoiceNumber']}
];
} else if (field == 'invoice.po_number') {
return [
{text: invoiceLabels.po_number},
{text: invoice.po_number}
];
} else if (field == 'invoice.invoice_date') {
return [
{text: (invoice.is_quote ? invoiceLabels.quote_date : invoiceLabels.invoice_date)},
{text: invoice.invoice_date}
];
} else if (field == 'invoice.due_date') {
return [
{text: (invoice.is_quote ? invoiceLabels.valid_until : invoiceLabels.due_date)},
{text: invoice.is_recurring ? false : invoice.due_date}
];
} else if (field == 'invoice.custom_text_value1') {
if (invoice.custom_text_value1 && account.custom_invoice_text_label1) {
return [
{text: invoice.account.custom_invoice_text_label1},
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value1) : invoice.custom_text_value1}
];
} else {
return false;
}
} else if (field == 'invoice.custom_text_value2') {
if (invoice.custom_text_value2 && account.custom_invoice_text_label2) {
return [
{text: invoice.account.custom_invoice_text_label2},
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value2) : invoice.custom_text_value2}
];
} else {
return false;
}
} else if (field == 'invoice.balance_due') {
return [
{text: invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.total_amount, invoice), style: ['invoiceDetailBalanceDue']}
];
} else if (field == invoice.partial_due) {
if (NINJA.parseFloat(invoice.partial)) {
return [
{text: invoiceLabels.partial_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
];
} else {
return false;
}
}
}
NINJA.invoiceDetails = function(invoice) {
var data = [
[
{text: (invoice.is_quote ? invoiceLabels.quote_number : invoiceLabels.invoice_number), style: ['invoiceNumberLabel']},
{text: invoice.invoice_number, style: ['invoiceNumber']}
],
[
{text: invoiceLabels.po_number},
{text: invoice.po_number}
],
[
{text: (invoice.is_quote ? invoiceLabels.quote_date : invoiceLabels.invoice_date)},
{text: invoice.invoice_date}
],
[
{text: (invoice.is_quote ? invoiceLabels.valid_until : invoiceLabels.due_date)},
{text: invoice.is_recurring ? false : invoice.due_date}
]
];
if (invoice.custom_text_value1) {
data.push([
{text: invoice.account.custom_invoice_text_label1},
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value1) : invoice.custom_text_value1}
])
}
if (invoice.custom_text_value2) {
data.push([
{text: invoice.account.custom_invoice_text_label2},
{text: invoice.is_recurring ? processVariables(invoice.custom_text_value2) : invoice.custom_text_value2}
])
var account = invoice.account;
if (invoice.features.invoice_settings && account.invoice_fields) {
var fields = JSON.parse(account.invoice_fields);
} else {
var fields = [
'invoice.invoice_number',
'invoice.po_number',
'invoice.invoice_date',
'invoice.due_date',
'invoice.balance_due',
'invoice.partial_due',
'invoice.custom_text_value1',
'invoice.custom_text_value2',
];
}
var data = [];
data.push([
{text: invoiceLabels.balance_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.total_amount, invoice), style: ['invoiceDetailBalanceDue']}
])
if (NINJA.parseFloat(invoice.partial)) {
data.push([
{text: invoiceLabels.partial_due, style: ['invoiceDetailBalanceDueLabel']},
{text: formatMoneyInvoice(invoice.balance_amount, invoice), style: ['invoiceDetailBalanceDue']}
])
for (var i=0; i < fields.invoice_fields.length; i++) {
var field = fields.invoice_fields[i];
var value = NINJA.renderInvoiceField(invoice, field);
if (value) {
data.push(value);
}
}
return NINJA.prepareDataPairs(data, 'invoiceDetails');
}
NINJA.clientDetails = function(invoice) {
NINJA.renderClientOrAccountField = function(invoice, field) {
var client = invoice.client;
var data;
if (!client) {
return;
return false;
}
var account = invoice.account;
var contact = client.contacts[0];
var clientName = client.name || (contact.first_name || contact.last_name ? (contact.first_name + ' ' + contact.last_name) : contact.email);
var clientEmail = client.contacts[0].email == clientName ? '' : client.contacts[0].email;
var cityStatePostal = '';
if (client.city || client.state || client.postal_code) {
var swap = client.country && client.country.swap_postal_code;
cityStatePostal = formatAddress(client.city, client.state, client.postal_code, swap);
if (field == 'client.client_name') {
var clientName = client.name || (contact.first_name || contact.last_name ? (contact.first_name + ' ' + contact.last_name) : contact.email);
return {text:clientName || ' ', style: ['clientName']};
} else if (field == 'client.contact_name') {
return (contact.first_name || contact.last_name) ? {text:contact.first_name + ' ' + contact.last_name} : false;
} else if (field == 'client.id_number') {
return {text:client.id_number};
} else if (field == 'client.vat_number') {
return {text:client.vat_number};
} else if (field == 'client.address1') {
return {text:client.address1};
} else if (field == 'client.address2') {
return {text:client.address2};
} else if (field == 'client.city_state_postal') {
var cityStatePostal = '';
if (client.city || client.state || client.postal_code) {
var swap = client.country && client.country.swap_postal_code;
cityStatePostal = formatAddress(client.city, client.state, client.postal_code, swap);
}
return {text:cityStatePostal};
} else if (field == 'client.country') {
return {text:client.country ? client.country.name : ''};
} else if (field == 'client.email') {
var clientEmail = contact.email == clientName ? '' : contact.email;
return {text:clientEmail};
} else if (field == 'client.custom_value1') {
return {text: account.custom_client_label1 && client.custom_value1 ? account.custom_client_label1 + ' ' + client.custom_value1 : false};
} else if (field == 'client.custom_value2') {
return {text: account.custom_client_label2 && client.custom_value2 ? account.custom_client_label2 + ' ' + client.custom_value2 : false};
}
// if a custom field is used in the invoice/quote number then we'll hide it from the PDF
var pattern = invoice.is_quote ? account.quote_number_pattern : account.invoice_number_pattern;
var custom1InPattern = (pattern && pattern.indexOf('{$custom1}') >= 0);
var custom2InPattern = (pattern && pattern.indexOf('{$custom2}') >= 0);
if (field == 'account.company_name') {
return {text:account.name, style: ['accountName']};
} else if (field == 'account.id_number') {
return {text:account.id_number, style: ['idNumber']};
} else if (field == 'account.vat_number') {
return {text:account.vat_number, style: ['vatNumber']};
} else if (field == 'account.website') {
return {text:account.website, style: ['website']};
} else if (field == 'account.email') {
return {text:account.work_email, style: ['email']};
} else if (field == 'account.phone') {
return {text:account.work_phone, style: ['phone']};
} else if (field == 'account.address1') {
return {text: account.address1};
} else if (field == 'account.address2') {
return {text: account.address2};
} else if (field == 'account.city_state_postal') {
var cityStatePostal = '';
if (account.city || account.state || account.postal_code) {
var swap = account.country && account.country.swap_postal_code;
cityStatePostal = formatAddress(account.city, account.state, account.postal_code, swap);
}
return {text: cityStatePostal};
} else if (field == 'account.country') {
return account.country ? {text: account.country.name} : false;
} else if (field == 'account.custom_value1') {
if (invoice.features.invoice_settings) {
return invoice.account.custom_label1 && invoice.account.custom_value1 ? {text: invoice.account.custom_label1 + ' ' + invoice.account.custom_value1} : false;
}
} else if (field == 'account.custom_value2') {
if (invoice.features.invoice_settings) {
return invoice.account.custom_label2 && invoice.account.custom_value2 ? {text: invoice.account.custom_label2 + ' ' + invoice.account.custom_value2} : false;
}
}
data = [
{text:clientName || ' ', style: ['clientName']},
{text:client.id_number},
{text:client.vat_number},
{text:client.address1},
{text:client.address2},
{text:cityStatePostal},
{text:client.country ? client.country.name : ''},
{text:clientEmail},
{text: client.custom_value1 && !custom1InPattern ? account.custom_client_label1 + ' ' + client.custom_value1 : false},
{text: client.custom_value2 && !custom2InPattern ? account.custom_client_label2 + ' ' + client.custom_value2 : false}
];
return false;
}
NINJA.clientDetails = function(invoice) {
var account = invoice.account;
if (invoice.features.invoice_settings && account.invoice_fields) {
var fields = JSON.parse(account.invoice_fields);
} else {
var fields = [
'client.client_name',
'client.id_number',
'client.vat_number',
'client.address1',
'client.address2',
'client.city_state_postal',
'client.country',
'client.email',
'client.custom_value1',
'client.custom_value2',
];
}
var data = [];
for (var i=0; i < fields.client_fields.length; i++) {
var field = fields.client_fields[i];
var value = NINJA.renderClientOrAccountField(invoice, field);
if (value) {
data.push(value);
}
}
return NINJA.prepareDataList(data, 'clientDetails');
}

View File

@ -2094,6 +2094,7 @@ $LANG = array(
'contact_name' => 'Contact Name',
'city_state_postal' => 'City/State/Postal',
'custom_field' => 'Custom Field',
'account_fields' => 'Company Fields',
);

View File

@ -58,6 +58,7 @@
invoice.account.hide_paid_to_date = $('#hide_paid_to_date').is(":checked");
invoice.invoice_design_id = $('#invoice_design_id').val();
invoice.account.page_size = $('#page_size option:selected').text();
invoice.account.invoice_fields = ko.mapping.toJSON(model);
NINJA.primaryColor = $('#primary_color').val();
NINJA.secondaryColor = $('#secondary_color').val();
@ -105,7 +106,6 @@
$('#header_font_id').change(function(){loadFont($('#header_font_id').val())});
$('#body_font_id').change(function(){loadFont($('#body_font_id').val())});
refreshPDF();
});
@ -136,7 +136,7 @@
@endforeach
<div style="display:none">
{!! Former::text('invoice_fields')->data_bind('value: ko.mapping.toJSON(model)') !!}
{!! Former::text('invoice_fields_json')->data_bind('value: ko.mapping.toJSON(model)') !!}
</div>
@ -145,18 +145,18 @@
<h3 class="panel-title">{!! trans('texts.invoice_design') !!}</h3>
</div>
<div class="panel-body form-padding-right">
<div class="panel-body">
<div role="tabpanel">
<ul class="nav nav-tabs" role="tablist" style="border: none">
<li role="presentation" class="active"><a href="#generalSettings" aria-controls="generalSettings" role="tab" data-toggle="tab">{{ trans('texts.general_settings') }}</a></li>
<li role="presentation"><a href="#invoiceLabels" aria-controls="invoiceLabels" role="tab" data-toggle="tab">{{ trans('texts.invoice_labels') }}</a></li>
<li role="presentation"><a href="#invoiceFields" aria-controls="invoiceFields" role="tab" data-toggle="tab">{{ trans('texts.invoice_fields') }}</a></li>
<li role="presentation"><a href="#invoiceOptions" aria-controls="invoiceOptions" role="tab" data-toggle="tab">{{ trans('texts.invoice_options') }}</a></li>
<li role="presentation"><a href="#headerFooter" aria-controls="headerFooter" role="tab" data-toggle="tab">{{ trans('texts.header_footer') }}</a></li>
<li role="presentation" class="active"><a href="#general_settings" aria-controls="general_settings" role="tab" data-toggle="tab">{{ trans('texts.general_settings') }}</a></li>
<li role="presentation"><a href="#invoice_labels" aria-controls="invoice_labels" role="tab" data-toggle="tab">{{ trans('texts.invoice_labels') }}</a></li>
<li role="presentation"><a href="#invoice_fields" aria-controls="invoice_fields" role="tab" data-toggle="tab">{{ trans('texts.invoice_fields') }}</a></li>
<li role="presentation"><a href="#invoice_options" aria-controls="invoice_options" role="tab" data-toggle="tab">{{ trans('texts.invoice_options') }}</a></li>
<li role="presentation"><a href="#header_footer" aria-controls="header_footer" role="tab" data-toggle="tab">{{ trans('texts.header_footer') }}</a></li>
</ul>
</div>
<div class="tab-content">
<div role="tabpanel" class="tab-pane active" id="generalSettings">
<div role="tabpanel" class="tab-pane active" id="general_settings">
<div class="panel-body">
<div class="row">
@ -207,7 +207,7 @@
</div>
</div>
<div role="tabpanel" class="tab-pane" id="invoiceLabels">
<div role="tabpanel" class="tab-pane" id="invoice_labels">
<div class="panel-body">
<div class="row">
@ -231,17 +231,26 @@
</div>
</div>
<div role="tabpanel" class="tab-pane" id="invoiceFields">
<div role="tabpanel" class="tab-pane" id="invoice_fields">
<div class="panel-body">
<div class="row">
@include('accounts.partials.invoice_fields_selector', ['section' => 'invoice_fields', 'fields' => INVOICE_FIELDS_INVOICE])
@include('accounts.partials.invoice_fields_selector', ['section' => 'client_fields', 'fields' => INVOICE_FIELDS_CLIENT])
@include('accounts.partials.invoice_fields_selector', ['section' => 'company_fields1', 'fields' => INVOICE_FIELDS_COMPANY])
@include('accounts.partials.invoice_fields_selector', ['section' => 'company_fields2', 'fields' => INVOICE_FIELDS_COMPANY])
@include('accounts.partials.invoice_fields_selector', ['section' => 'account_fields1', 'fields' => INVOICE_FIELDS_ACCOUNT])
@include('accounts.partials.invoice_fields_selector', ['section' => 'account_fields2', 'fields' => INVOICE_FIELDS_ACCOUNT])
</div>
<div class="row">
<div class="pull-right" style="padding-top:18px;padding-right:14px">
{!! Button::normal(trans('texts.reset'))
->withAttributes(['onclick' => 'sweetConfirm(function() {
resetFields();
})'])
->small() !!}
</div>
</div>
</div>
</div>
<div role="tabpanel" class="tab-pane" id="invoiceOptions">
<div role="tabpanel" class="tab-pane" id="invoice_options">
<div class="panel-body">
{!! Former::checkbox('hide_quantity')->text(trans('texts.hide_quantity_help')) !!}
@ -250,7 +259,7 @@
</div>
</div>
<div role="tabpanel" class="tab-pane" id="headerFooter">
<div role="tabpanel" class="tab-pane" id="header_footer">
<div class="panel-body">
{!! Former::inline_radios('all_pages_header')

View File

@ -5,26 +5,43 @@ function ViewModel(data) {
self.invoice_fields = ko.observableArray();
self.client_fields = ko.observableArray();
self.company_fields1 = ko.observableArray();
self.company_fields2 = ko.observableArray();
self.account_fields1 = ko.observableArray();
self.account_fields2 = ko.observableArray();
window.field_map = [];
self.addField = function(section, field, label) {
self[section].push(field);
window.field_map[field] = label;
if (self[section].indexOf(field) < 0) {
self[section].push(field);
}
}
self.resetFields = function() {
console.log('herey');
self.invoice_fields.removeAll();
self.client_fields.removeAll();
self.account_fields1.removeAll();
self.account_fields2.removeAll();
}
self.onDragged = function() {
refreshPDF();
}
self.removeInvoiceFields = function(item) {
self.invoice_fields.remove(item);
refreshPDF();
}
self.removeClientFields = function(item) {
self.client_fields.remove(item);
refreshPDF();
}
self.removeCompanyFields1 = function(item) {
self.company_fields1.remove(item);
self.removeAccountFields1 = function(item) {
self.account_fields1.remove(item);
refreshPDF();
}
self.removeCompanyFields2 = function(item) {
self.company_fields2.remove(item);
self.removeAccountFields2 = function(item) {
self.account_fields2.remove(item);
refreshPDF();
}
}
@ -40,6 +57,38 @@ $(function() {
window.model = new ViewModel();
var selectedFields = {!! json_encode($account->getInvoiceFields()) !!};
var allFields = {!! json_encode($account->getAllInvoiceFields()) !!};
loadFields(selectedFields);
loadMap(allFields);
ko.applyBindings(model);
})
function resetFields() {
var defaultFields = {!! json_encode($account->getDefaultInvoiceFields()) !!};
window.model.resetFields();
loadFields(defaultFields);
}
function loadMap(allFields) {
for (var section in allFields) {
if ( ! allFields.hasOwnProperty(section)) {
continue;
}
var fields = allFields[section];
for (var field in fields) {
if ( ! fields.hasOwnProperty(field)) {
continue;
}
var label = fields[field];
window.field_map[field] = label;
}
}
}
function loadFields(selectedFields)
{
for (var section in selectedFields) {
if ( ! selectedFields.hasOwnProperty(section)) {
continue;
@ -53,12 +102,7 @@ $(function() {
model.addField(section, field, label);
}
}
console.log(selectedFields);
ko.applyBindings(model);
})
}
</script>
@ -89,7 +133,8 @@ $(function() {
.field-list td div {
float: left;
width: 146px;
xwidth: 146px;
width: 100%;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
@ -103,7 +148,6 @@ $(function() {
width: 120px;
}
.field-list .fa {
visibility: hidden;
}

View File

@ -1,4 +1,4 @@
<div class="col-md-3">
<div class="col-lg-3 col-md-6">
{!! Former::select("{$section}_select")
->placeholder(trans("texts.{$fields}"))
@ -7,11 +7,11 @@
->raw() !!}
<table class="field-list">
<tbody data-bind="sortable: { data: {{ $section }}, as: 'field' }">
<tbody data-bind="sortable: { data: {{ $section }}, as: 'field', afterMove: onDragged }">
<tr>
<td>
<i class="fa fa-close" data-bind="click: $root.{{ Utils::toCamelCase('remove' . ucwords($section)) }}"></i>
<div data-bind="text: window.field_map[field]"></div>
<span data-bind="text: window.field_map[field]"></span>
<i class="fa fa-bars"></i>
</td>
</tr>

View File

@ -489,6 +489,13 @@ thead th {
$.get('{{ url('save_sidebar_state') }}?show_right=' + toggled);
});
if (window.location.hash) {
setTimeout(function() {
$('.nav-tabs a[href="' + window.location.hash + '"]').tab('show');
}, 1);
}
});
</script>