mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-06-23 20:00:33 -04:00
Working on custom fields for pro plan
This commit is contained in:
parent
0d912373e7
commit
01ec2cb838
@ -132,13 +132,14 @@ class AccountController extends \BaseController {
|
|||||||
);
|
);
|
||||||
$recommendedGatewayArray[$recommendedGateway->name] = $arrayItem;
|
$recommendedGatewayArray[$recommendedGateway->name] = $arrayItem;
|
||||||
}
|
}
|
||||||
$otherItem = array(
|
|
||||||
'value' => 1000000,
|
$otherItem = array(
|
||||||
'other' => 'true',
|
'value' => 1000000,
|
||||||
'data-imageUrl' => '',
|
'other' => 'true',
|
||||||
'data-siteUrl' => ''
|
'data-imageUrl' => '',
|
||||||
);
|
'data-siteUrl' => ''
|
||||||
$recommendedGatewayArray['Other Options'] = $otherItem;
|
);
|
||||||
|
$recommendedGatewayArray['Other Options'] = $otherItem;
|
||||||
|
|
||||||
$data = [
|
$data = [
|
||||||
'account' => $account,
|
'account' => $account,
|
||||||
@ -180,6 +181,14 @@ class AccountController extends \BaseController {
|
|||||||
{
|
{
|
||||||
return View::make('accounts.import_export');
|
return View::make('accounts.import_export');
|
||||||
}
|
}
|
||||||
|
else if ($section == ACCOUNT_CUSTOM_FIELDS)
|
||||||
|
{
|
||||||
|
$data = [
|
||||||
|
'account' => Auth::user()->account
|
||||||
|
];
|
||||||
|
|
||||||
|
return View::make('accounts.custom_fields', $data);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function doSection($section = ACCOUNT_DETAILS)
|
public function doSection($section = ACCOUNT_DETAILS)
|
||||||
@ -208,6 +217,26 @@ class AccountController extends \BaseController {
|
|||||||
{
|
{
|
||||||
return AccountController::export();
|
return AccountController::export();
|
||||||
}
|
}
|
||||||
|
else if ($section == ACCOUNT_CUSTOM_FIELDS)
|
||||||
|
{
|
||||||
|
return AccountController::saveCustomFields();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private function saveCustomFields()
|
||||||
|
{
|
||||||
|
$account = Auth::user()->account;
|
||||||
|
|
||||||
|
$account->custom_label1 = Input::get('custom_label1');
|
||||||
|
$account->custom_value1 = Input::get('custom_value1');
|
||||||
|
$account->custom_label2 = Input::get('custom_label2');
|
||||||
|
$account->custom_value2 = Input::get('custom_value2');
|
||||||
|
$account->custom_client_label1 = Input::get('custom_client_label1');
|
||||||
|
$account->custom_client_label2 = Input::get('custom_client_label2');
|
||||||
|
$account->save();
|
||||||
|
|
||||||
|
Session::flash('message', trans('texts.updated_settings'));
|
||||||
|
return Redirect::to('company/custom_fields');
|
||||||
}
|
}
|
||||||
|
|
||||||
private function export()
|
private function export()
|
||||||
@ -466,7 +495,7 @@ class AccountController extends \BaseController {
|
|||||||
|
|
||||||
private function saveNotifications()
|
private function saveNotifications()
|
||||||
{
|
{
|
||||||
$account = Account::findOrFail(Auth::user()->account_id);
|
$account = Auth::user()->account;
|
||||||
$account->invoice_terms = Input::get('invoice_terms');
|
$account->invoice_terms = Input::get('invoice_terms');
|
||||||
$account->email_footer = Input::get('email_footer');
|
$account->email_footer = Input::get('email_footer');
|
||||||
$account->save();
|
$account->save();
|
||||||
|
@ -60,31 +60,7 @@ class ClientController extends \BaseController {
|
|||||||
->make();
|
->make();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Show the form for creating a new resource.
|
|
||||||
*
|
|
||||||
* @return Response
|
|
||||||
*/
|
|
||||||
public function create()
|
|
||||||
{
|
|
||||||
if (Client::scope()->count() > Auth::user()->getMaxNumClients())
|
|
||||||
{
|
|
||||||
return View::make('error', ['error' => "Sorry, you've exceeded the limit of " . Auth::user()->getMaxNumClients() . " clients"]);
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array(
|
|
||||||
'client' => null,
|
|
||||||
'method' => 'POST',
|
|
||||||
'url' => 'clients',
|
|
||||||
'title' => '- New Client',
|
|
||||||
'sizes' => Size::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
|
||||||
'industries' => Industry::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
|
||||||
'paymentTerms' => PaymentTerm::remember(DEFAULT_QUERY_CACHE)->orderBy('num_days')->get(['name', 'num_days']),
|
|
||||||
'currencies' => Currency::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
|
|
||||||
'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get());
|
|
||||||
|
|
||||||
return View::make('clients.edit', $data);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Store a newly created resource in storage.
|
* Store a newly created resource in storage.
|
||||||
@ -118,6 +94,29 @@ class ClientController extends \BaseController {
|
|||||||
return View::make('clients.show', $data);
|
return View::make('clients.show', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the form for creating a new resource.
|
||||||
|
*
|
||||||
|
* @return Response
|
||||||
|
*/
|
||||||
|
public function create()
|
||||||
|
{
|
||||||
|
if (Client::scope()->count() > Auth::user()->getMaxNumClients())
|
||||||
|
{
|
||||||
|
return View::make('error', ['error' => "Sorry, you've exceeded the limit of " . Auth::user()->getMaxNumClients() . " clients"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
$data = [
|
||||||
|
'client' => null,
|
||||||
|
'method' => 'POST',
|
||||||
|
'url' => 'clients',
|
||||||
|
'title' => '- New Client'
|
||||||
|
];
|
||||||
|
|
||||||
|
$data = array_merge($data, self::getViewModel());
|
||||||
|
return View::make('clients.edit', $data);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Show the form for editing the specified resource.
|
* Show the form for editing the specified resource.
|
||||||
*
|
*
|
||||||
@ -127,18 +126,29 @@ class ClientController extends \BaseController {
|
|||||||
public function edit($publicId)
|
public function edit($publicId)
|
||||||
{
|
{
|
||||||
$client = Client::scope($publicId)->with('contacts')->firstOrFail();
|
$client = Client::scope($publicId)->with('contacts')->firstOrFail();
|
||||||
$data = array(
|
$data = [
|
||||||
'client' => $client,
|
'client' => $client,
|
||||||
'method' => 'PUT',
|
'method' => 'PUT',
|
||||||
'url' => 'clients/' . $publicId,
|
'url' => 'clients/' . $publicId,
|
||||||
'title' => '- ' . $client->name,
|
'title' => '- ' . $client->name
|
||||||
|
];
|
||||||
|
|
||||||
|
$data = array_merge($data, self::getViewModel());
|
||||||
|
return View::make('clients.edit', $data);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static function getViewModel()
|
||||||
|
{
|
||||||
|
return [
|
||||||
'sizes' => Size::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
'sizes' => Size::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
||||||
'paymentTerms' => PaymentTerm::remember(DEFAULT_QUERY_CACHE)->orderBy('num_days')->get(['name', 'num_days']),
|
'paymentTerms' => PaymentTerm::remember(DEFAULT_QUERY_CACHE)->orderBy('num_days')->get(['name', 'num_days']),
|
||||||
'industries' => Industry::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
'industries' => Industry::remember(DEFAULT_QUERY_CACHE)->orderBy('id')->get(),
|
||||||
'currencies' => Currency::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());
|
'countries' => Country::remember(DEFAULT_QUERY_CACHE)->orderBy('name')->get(),
|
||||||
return View::make('clients.edit', $data);
|
'customLabel1' => Auth::user()->account->custom_client_label1,
|
||||||
}
|
'customLabel2' => Auth::user()->account->custom_client_label2,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update the specified resource in storage.
|
* Update the specified resource in storage.
|
||||||
@ -178,6 +188,8 @@ class ClientController extends \BaseController {
|
|||||||
|
|
||||||
$client->name = trim(Input::get('name'));
|
$client->name = trim(Input::get('name'));
|
||||||
$client->work_phone = trim(Input::get('work_phone'));
|
$client->work_phone = trim(Input::get('work_phone'));
|
||||||
|
$client->custom_value1 = trim(Input::get('custom_value1'));
|
||||||
|
$client->custom_value2 = trim(Input::get('custom_value2'));
|
||||||
$client->address1 = trim(Input::get('address1'));
|
$client->address1 = trim(Input::get('address1'));
|
||||||
$client->address2 = trim(Input::get('address2'));
|
$client->address2 = trim(Input::get('address2'));
|
||||||
$client->city = trim(Input::get('city'));
|
$client->city = trim(Input::get('city'));
|
||||||
|
@ -182,7 +182,7 @@ class InvoiceController extends \BaseController {
|
|||||||
'url' => 'invoices/' . $publicId,
|
'url' => 'invoices/' . $publicId,
|
||||||
'title' => '- ' . $invoice->invoice_number,
|
'title' => '- ' . $invoice->invoice_number,
|
||||||
'client' => $invoice->client);
|
'client' => $invoice->client);
|
||||||
$data = array_merge($data, InvoiceController::getViewModel());
|
$data = array_merge($data, self::getViewModel());
|
||||||
return View::make('invoices.edit', $data);
|
return View::make('invoices.edit', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,11 +206,11 @@ class InvoiceController extends \BaseController {
|
|||||||
'url' => 'invoices',
|
'url' => 'invoices',
|
||||||
'title' => '- New Invoice',
|
'title' => '- New Invoice',
|
||||||
'client' => $client);
|
'client' => $client);
|
||||||
$data = array_merge($data, InvoiceController::getViewModel());
|
$data = array_merge($data, self::getViewModel());
|
||||||
return View::make('invoices.edit', $data);
|
return View::make('invoices.edit', $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function getViewModel()
|
private static function getViewModel()
|
||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'account' => Auth::user()->account,
|
'account' => Auth::user()->account,
|
||||||
|
@ -0,0 +1,60 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddCustomFields extends Migration {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
Schema::table('accounts', function($table)
|
||||||
|
{
|
||||||
|
$table->string('custom_label1');
|
||||||
|
$table->string('custom_value1');
|
||||||
|
|
||||||
|
$table->string('custom_label2');
|
||||||
|
$table->string('custom_value2');
|
||||||
|
|
||||||
|
$table->string('custom_client_label1');
|
||||||
|
$table->string('custom_client_label2');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('clients', function($table)
|
||||||
|
{
|
||||||
|
$table->string('custom_value1');
|
||||||
|
$table->string('custom_value2');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reverse the migrations.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
Schema::table('accounts', function($table)
|
||||||
|
{
|
||||||
|
$table->dropColumn('custom_label1');
|
||||||
|
$table->dropColumn('custom_value1');
|
||||||
|
|
||||||
|
$table->dropColumn('custom_label2');
|
||||||
|
$table->dropColumn('custom_value2');
|
||||||
|
|
||||||
|
$table->dropColumn('custom_client_label1');
|
||||||
|
$table->dropColumn('custom_client_label2');
|
||||||
|
});
|
||||||
|
|
||||||
|
Schema::table('clients', function($table)
|
||||||
|
{
|
||||||
|
$table->dropColumn('custom_value1');
|
||||||
|
$table->dropColumn('custom_value2');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -311,5 +311,11 @@ return array(
|
|||||||
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
'pro_plan_success' => 'Thanks for joining! Once the invoice is paid your Pro Plan membership will begin.',
|
||||||
|
|
||||||
'unsaved_changes' => 'You have unsaved changes',
|
'unsaved_changes' => 'You have unsaved changes',
|
||||||
|
'custom_fields' => 'Custom fields',
|
||||||
|
'company_fields' => 'Company Fields',
|
||||||
|
'client_fields' => 'Client Fields',
|
||||||
|
'field_label' => 'Field Label',
|
||||||
|
'field_value' => 'Field Value',
|
||||||
|
'edit' => 'Edit',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
@ -12,6 +12,11 @@ class Utils
|
|||||||
return App::environment() == ENV_PRODUCTION;
|
return App::environment() == ENV_PRODUCTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function isNinja()
|
||||||
|
{
|
||||||
|
return self::isNinjaProd() || self::isNinjaDev();
|
||||||
|
}
|
||||||
|
|
||||||
public static function isNinjaProd()
|
public static function isNinjaProd()
|
||||||
{
|
{
|
||||||
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
|
return $_SERVER['SERVER_NAME'] == 'www.invoiceninja.com';
|
||||||
@ -22,6 +27,20 @@ class Utils
|
|||||||
return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV'];
|
return isset($_ENV['NINJA_DEV']) && $_ENV['NINJA_DEV'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static function getProLabel($feature)
|
||||||
|
{
|
||||||
|
if (Auth::check()
|
||||||
|
&& !Auth::user()->isPro()
|
||||||
|
&& $feature == 'custom_fields')
|
||||||
|
{
|
||||||
|
return ' <sup class="pro-label">PRO</sup>';
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public static function basePath()
|
public static function basePath()
|
||||||
{
|
{
|
||||||
return substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/') + 1);
|
return substr($_SERVER['SCRIPT_NAME'], 0, strrpos($_SERVER['SCRIPT_NAME'], '/') + 1);
|
||||||
|
@ -215,6 +215,11 @@ class Account extends Eloquent
|
|||||||
|
|
||||||
public function isPro()
|
public function isPro()
|
||||||
{
|
{
|
||||||
|
if (Utils::isNinja())
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->account_key == NINJA_ACCOUNT_KEY)
|
if ($this->account_key == NINJA_ACCOUNT_KEY)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
@ -155,6 +155,24 @@ class Client extends EntityModel
|
|||||||
return $str;
|
return $str;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getCustomFields()
|
||||||
|
{
|
||||||
|
$str = '';
|
||||||
|
$account = $this->account;
|
||||||
|
|
||||||
|
if ($account->custom_client_label1 && $this->custom_value1)
|
||||||
|
{
|
||||||
|
$str .= "{$account->custom_client_label1}: {$this->custom_value1}<br/>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($account->custom_client_label2 && $this->custom_value2)
|
||||||
|
{
|
||||||
|
$str .= "{$account->custom_client_label2}: {$this->custom_value2}<br/>";
|
||||||
|
}
|
||||||
|
|
||||||
|
return $str;
|
||||||
|
}
|
||||||
|
|
||||||
public function getWebsite()
|
public function getWebsite()
|
||||||
{
|
{
|
||||||
if (!$this->website)
|
if (!$this->website)
|
||||||
|
@ -46,8 +46,11 @@ class ClientRepository
|
|||||||
$contact = $client->contacts()->where('is_primary', '=', true)->firstOrFail();
|
$contact = $client->contacts()->where('is_primary', '=', true)->firstOrFail();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
$client->name = trim($data['name']);
|
$client->name = trim($data['name']);
|
||||||
$client->work_phone = trim($data['work_phone']);
|
$client->work_phone = trim($data['work_phone']);
|
||||||
|
$client->custom_value1 = trim($data['custom_value1']);
|
||||||
|
$client->custom_value2 = trim($data['custom_value2']);
|
||||||
$client->address1 = trim($data['address1']);
|
$client->address1 = trim($data['address1']);
|
||||||
$client->address2 = trim($data['address2']);
|
$client->address2 = trim($data['address2']);
|
||||||
$client->city = trim($data['city']);
|
$client->city = trim($data['city']);
|
||||||
|
156
app/routes.php
156
app/routes.php
@ -99,80 +99,9 @@ Route::group(array('before' => 'auth'), function()
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
HTML::macro('nav_link', function($url, $text, $url2 = '', $extra = '') {
|
|
||||||
$class = ( Request::is($url) || Request::is($url.'/*') || Request::is($url2) ) ? ' class="active"' : '';
|
|
||||||
return '<li'.$class.'><a href="'.URL::to($url).'" '.$extra.'>'.trans("texts.$text").'</a></li>';
|
|
||||||
});
|
|
||||||
|
|
||||||
HTML::macro('tab_link', function($url, $text, $active = false) {
|
|
||||||
$class = $active ? ' class="active"' : '';
|
|
||||||
return '<li'.$class.'><a href="'.URL::to($url).'" data-toggle="tab">'.$text.'</a></li>';
|
|
||||||
});
|
|
||||||
|
|
||||||
HTML::macro('menu_link', function($type) {
|
|
||||||
$types = $type.'s';
|
|
||||||
$Type = ucfirst($type);
|
|
||||||
$Types = ucfirst($types);
|
|
||||||
$class = ( Request::is($types) || Request::is('*'.$type.'*')) ? ' active' : '';
|
|
||||||
|
|
||||||
return '<li class="dropdown '.$class.'">
|
|
||||||
<a href="'.URL::to($types).'" class="dropdown-toggle">'.trans("texts.$types").'</a>
|
|
||||||
<ul class="dropdown-menu" id="menu1">
|
|
||||||
<li><a href="'.URL::to($types.'/create').'">'.trans("texts.new_$type").'</a></li>
|
|
||||||
</ul>
|
|
||||||
</li>';
|
|
||||||
});
|
|
||||||
|
|
||||||
HTML::macro('image_data', function($imagePath) {
|
|
||||||
return 'data:image/jpeg;base64,' . base64_encode(file_get_contents($imagePath));
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
HTML::macro('breadcrumbs', function() {
|
|
||||||
$str = '<ol class="breadcrumb">';
|
|
||||||
|
|
||||||
// Get the breadcrumbs by exploding the current path.
|
|
||||||
$basePath = Utils::basePath();
|
|
||||||
$parts = explode('?', $_SERVER['REQUEST_URI']);
|
|
||||||
$path = $parts[0];
|
|
||||||
|
|
||||||
if ($basePath != '/')
|
|
||||||
{
|
|
||||||
$path = str_replace($basePath, '', $path);
|
|
||||||
}
|
|
||||||
$crumbs = explode('/', $path);
|
|
||||||
|
|
||||||
foreach ($crumbs as $key => $val)
|
|
||||||
{
|
|
||||||
if (is_numeric($val))
|
|
||||||
{
|
|
||||||
unset($crumbs[$key]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$crumbs = array_values($crumbs);
|
|
||||||
for ($i=0; $i<count($crumbs); $i++) {
|
|
||||||
$crumb = trim($crumbs[$i]);
|
|
||||||
if (!$crumb) continue;
|
|
||||||
if ($crumb == 'company') return '';
|
|
||||||
$name = trans("texts.$crumb");
|
|
||||||
if ($i==count($crumbs)-1)
|
|
||||||
{
|
|
||||||
$str .= "<li class='active'>$name</li>";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
$str .= '<li>'.link_to($crumb, $name).'</li>';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $str . '</ol>';
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
define('CONTACT_EMAIL', 'contact@invoiceninja.com');
|
define('CONTACT_EMAIL', 'contact@invoiceninja.com');
|
||||||
define('CONTACT_NAME', 'Invoice Ninja');
|
define('CONTACT_NAME', 'Invoice Ninja');
|
||||||
|
define('NINJA_URL', 'https://www.invoiceninja.com');
|
||||||
|
|
||||||
define('ENV_DEVELOPMENT', 'local');
|
define('ENV_DEVELOPMENT', 'local');
|
||||||
define('ENV_STAGING', 'staging');
|
define('ENV_STAGING', 'staging');
|
||||||
@ -194,6 +123,7 @@ define('ACCOUNT_IMPORT_EXPORT', 'import_export');
|
|||||||
define('ACCOUNT_PAYMENTS', 'payments');
|
define('ACCOUNT_PAYMENTS', 'payments');
|
||||||
define('ACCOUNT_MAP', 'import_map');
|
define('ACCOUNT_MAP', 'import_map');
|
||||||
define('ACCOUNT_EXPORT', 'export');
|
define('ACCOUNT_EXPORT', 'export');
|
||||||
|
define('ACCOUNT_CUSTOM_FIELDS', 'custom_fields');
|
||||||
|
|
||||||
define('DEFAULT_INVOICE_NUMBER', '0001');
|
define('DEFAULT_INVOICE_NUMBER', '0001');
|
||||||
define('RECENTLY_VIEWED_LIMIT', 8);
|
define('RECENTLY_VIEWED_LIMIT', 8);
|
||||||
@ -259,6 +189,84 @@ define('GATEWAY_GOOGLE', 33);
|
|||||||
define('GATEWAY_QUICKBOOKS', 35);
|
define('GATEWAY_QUICKBOOKS', 35);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
HTML::macro('nav_link', function($url, $text, $url2 = '', $extra = '') {
|
||||||
|
$class = ( Request::is($url) || Request::is($url.'/*') || Request::is($url2) ) ? ' class="active"' : '';
|
||||||
|
$title = ucwords(trans("texts.$text")) . Utils::getProLabel($text);
|
||||||
|
return '<li'.$class.'><a href="'.URL::to($url).'" '.$extra.'>'.$title.'</a></li>';
|
||||||
|
});
|
||||||
|
|
||||||
|
HTML::macro('tab_link', function($url, $text, $active = false) {
|
||||||
|
$class = $active ? ' class="active"' : '';
|
||||||
|
return '<li'.$class.'><a href="'.URL::to($url).'" data-toggle="tab">'.$text.'</a></li>';
|
||||||
|
});
|
||||||
|
|
||||||
|
HTML::macro('menu_link', function($type) {
|
||||||
|
$types = $type.'s';
|
||||||
|
$Type = ucfirst($type);
|
||||||
|
$Types = ucfirst($types);
|
||||||
|
$class = ( Request::is($types) || Request::is('*'.$type.'*')) ? ' active' : '';
|
||||||
|
|
||||||
|
return '<li class="dropdown '.$class.'">
|
||||||
|
<a href="'.URL::to($types).'" class="dropdown-toggle">'.trans("texts.$types").'</a>
|
||||||
|
<ul class="dropdown-menu" id="menu1">
|
||||||
|
<li><a href="'.URL::to($types.'/create').'">'.trans("texts.new_$type").'</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>';
|
||||||
|
});
|
||||||
|
|
||||||
|
HTML::macro('image_data', function($imagePath) {
|
||||||
|
return 'data:image/jpeg;base64,' . base64_encode(file_get_contents($imagePath));
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
HTML::macro('breadcrumbs', function() {
|
||||||
|
$str = '<ol class="breadcrumb">';
|
||||||
|
|
||||||
|
// Get the breadcrumbs by exploding the current path.
|
||||||
|
$basePath = Utils::basePath();
|
||||||
|
$parts = explode('?', $_SERVER['REQUEST_URI']);
|
||||||
|
$path = $parts[0];
|
||||||
|
|
||||||
|
if ($basePath != '/')
|
||||||
|
{
|
||||||
|
$path = str_replace($basePath, '', $path);
|
||||||
|
}
|
||||||
|
$crumbs = explode('/', $path);
|
||||||
|
|
||||||
|
foreach ($crumbs as $key => $val)
|
||||||
|
{
|
||||||
|
if (is_numeric($val))
|
||||||
|
{
|
||||||
|
unset($crumbs[$key]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$crumbs = array_values($crumbs);
|
||||||
|
for ($i=0; $i<count($crumbs); $i++) {
|
||||||
|
$crumb = trim($crumbs[$i]);
|
||||||
|
if (!$crumb) continue;
|
||||||
|
if ($crumb == 'company') return '';
|
||||||
|
$name = trans("texts.$crumb");
|
||||||
|
if ($i==count($crumbs)-1)
|
||||||
|
{
|
||||||
|
$str .= "<li class='active'>$name</li>";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
$str .= '<li>'.link_to($crumb, $name).'</li>';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $str . '</ol>';
|
||||||
|
});
|
||||||
|
|
||||||
|
function uctrans($text)
|
||||||
|
{
|
||||||
|
return ucwords(trans($text));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
if (Auth::check() && !Session::has(SESSION_TIMEZONE))
|
if (Auth::check() && !Session::has(SESSION_TIMEZONE))
|
||||||
{
|
{
|
||||||
Event::fire('user.refresh');
|
Event::fire('user.refresh');
|
||||||
@ -276,8 +284,8 @@ Validator::extend('has_credit', function($attribute, $value, $parameters)
|
|||||||
|
|
||||||
$client = Client::scope($publicClientId)->firstOrFail();
|
$client = Client::scope($publicClientId)->firstOrFail();
|
||||||
$credit = $client->getTotalCredit();
|
$credit = $client->getTotalCredit();
|
||||||
|
|
||||||
return $credit >= $amount;
|
return $credit >= $amount;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
33
app/views/accounts/custom_fields.blade.php
Normal file
33
app/views/accounts/custom_fields.blade.php
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
@extends('accounts.nav')
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
@parent
|
||||||
|
|
||||||
|
{{ Former::open()->addClass('col-md-8 col-md-offset-2 warn-on-exit') }}
|
||||||
|
{{ Former::populate($account) }}
|
||||||
|
|
||||||
|
{{ Former::legend('company_fields') }}
|
||||||
|
{{ Former::text('custom_label1')->label(trans('texts.field_label')) }}
|
||||||
|
{{ Former::text('custom_value1')->label(trans('texts.field_value')) }}
|
||||||
|
<p> </p>
|
||||||
|
{{ Former::text('custom_label2')->label(trans('texts.field_label')) }}
|
||||||
|
{{ Former::text('custom_value2')->label(trans('texts.field_value')) }}
|
||||||
|
|
||||||
|
{{ Former::legend('client_fields') }}
|
||||||
|
{{ Former::text('custom_client_label1')->label(trans('texts.field_label')) }}
|
||||||
|
{{ Former::text('custom_client_label2')->label(trans('texts.field_label')) }}
|
||||||
|
|
||||||
|
@if (Auth::user()->isPro())
|
||||||
|
{{ Former::actions( Button::lg_success_submit(trans('texts.save'))->append_with_icon('floppy-disk') ) }}
|
||||||
|
@else
|
||||||
|
<script>
|
||||||
|
$(function() {
|
||||||
|
$('form.warn-on-exit input').prop('disabled', true);
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
@endif
|
||||||
|
|
||||||
|
{{ Former::close() }}
|
||||||
|
|
||||||
|
|
||||||
|
@stop
|
@ -14,7 +14,7 @@
|
|||||||
{{ Former::open_for_files()->addClass('col-md-10 col-md-offset-1 warn-on-exit')->rules(array(
|
{{ Former::open_for_files()->addClass('col-md-10 col-md-offset-1 warn-on-exit')->rules(array(
|
||||||
'name' => 'required',
|
'name' => 'required',
|
||||||
'email' => 'email|required'
|
'email' => 'email|required'
|
||||||
)); }}
|
)) }}
|
||||||
|
|
||||||
{{ Former::populate($account) }}
|
{{ Former::populate($account) }}
|
||||||
{{ Former::populateField('first_name', $account->users()->first()->first_name) }}
|
{{ Former::populateField('first_name', $account->users()->first()->first_name) }}
|
||||||
|
@ -5,8 +5,9 @@
|
|||||||
<ul class="nav nav-tabs nav nav-justified">
|
<ul class="nav nav-tabs nav nav-justified">
|
||||||
{{ HTML::nav_link('company/details', 'company_details') }}
|
{{ HTML::nav_link('company/details', 'company_details') }}
|
||||||
{{ HTML::nav_link('company/payments', 'online_payments') }}
|
{{ HTML::nav_link('company/payments', 'online_payments') }}
|
||||||
{{ HTML::nav_link('company/notifications', 'notifications') }}
|
{{ HTML::nav_link('company/notifications', 'notifications') }}
|
||||||
{{ HTML::nav_link('company/import_export', 'import_export', 'company/import_map') }}
|
{{ HTML::nav_link('company/import_export', 'import_export', 'company/import_map') }}
|
||||||
|
{{-- HTML::nav_link('company/custom_fields', 'custom_fields') --}}
|
||||||
</ul>
|
</ul>
|
||||||
<p> </p>
|
<p> </p>
|
||||||
|
|
||||||
|
@ -25,7 +25,15 @@
|
|||||||
{{ Former::text('name')->data_bind("attr { placeholder: placeholderName }") }}
|
{{ Former::text('name')->data_bind("attr { placeholder: placeholderName }") }}
|
||||||
{{ Former::text('website') }}
|
{{ Former::text('website') }}
|
||||||
{{ Former::text('work_phone') }}
|
{{ Former::text('work_phone') }}
|
||||||
|
|
||||||
|
@if (Auth::user()->isPro())
|
||||||
|
@if ($customLabel1)
|
||||||
|
{{ Former::text('custom_value1')->label($customLabel1) }}
|
||||||
|
@endif
|
||||||
|
@if ($customLabel2)
|
||||||
|
{{ Former::text('custom_value2')->label($customLabel2) }}
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
{{ Former::legend('address') }}
|
{{ Former::legend('address') }}
|
||||||
{{ Former::text('address1') }}
|
{{ Former::text('address1') }}
|
||||||
|
@ -48,6 +48,7 @@
|
|||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<h3>{{ trans('texts.details') }}</h3>
|
<h3>{{ trans('texts.details') }}</h3>
|
||||||
<p>{{ $client->getAddress() }}</p>
|
<p>{{ $client->getAddress() }}</p>
|
||||||
|
<p>{{ $client->getCustomFields() }}</p>
|
||||||
<p>{{ $client->getPhone() }}</p>
|
<p>{{ $client->getPhone() }}</p>
|
||||||
<p>{{ $client->getNotes() }}</p>
|
<p>{{ $client->getNotes() }}</p>
|
||||||
<p>{{ $client->getIndustry() }}</p>
|
<p>{{ $client->getIndustry() }}</p>
|
||||||
|
@ -1,7 +1,6 @@
|
|||||||
@extends('master')
|
@extends('master')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@section('head')
|
@section('head')
|
||||||
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
<meta name="csrf-token" content="<?= csrf_token() ?>">
|
||||||
|
|
||||||
@ -90,7 +89,7 @@
|
|||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
<span class="icon-bar"></span>
|
<span class="icon-bar"></span>
|
||||||
</button>
|
</button>
|
||||||
<a href="{{ URL::to('/') }}" class='navbar-brand'>
|
<a href="{{ Utils::isNinja() || Auth::check() ? URL::to('/') : NINJA_URL }}" class='navbar-brand'>
|
||||||
<img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:18px;width:auto"/>
|
<img src="{{ asset('images/invoiceninja-logo.png') }}" style="height:18px;width:auto"/>
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
@ -139,10 +138,11 @@
|
|||||||
<span class="caret"></span>
|
<span class="caret"></span>
|
||||||
</button>
|
</button>
|
||||||
<ul class="dropdown-menu" role="menu">
|
<ul class="dropdown-menu" role="menu">
|
||||||
<li>{{ link_to('company/details', trans('texts.company_details')) }}</li>
|
<li>{{ link_to('company/details', uctrans('texts.company_details')) }}</li>
|
||||||
<li>{{ link_to('company/payments', trans('texts.online_payments')) }}</li>
|
<li>{{ link_to('company/payments', uctrans('texts.online_payments')) }}</li>
|
||||||
<li>{{ link_to('company/notifications', trans('texts.notifications')) }}</li>
|
<li>{{ link_to('company/notifications', uctrans('texts.notifications')) }}</li>
|
||||||
<li>{{ link_to('company/import_export', trans('texts.import_export')) }}</li>
|
<li>{{ link_to('company/import_export', uctrans('texts.import_export')) }}</li>
|
||||||
|
<!--<li><a href="{{ url('company/custom_fields') }}">{{ uctrans('texts.custom_fields') . Utils::getProLabel(ACCOUNT_CUSTOM_FIELDS) }}</a></li>-->
|
||||||
|
|
||||||
<li class="divider"></li>
|
<li class="divider"></li>
|
||||||
<li>{{ link_to('#', trans('texts.logout'), array('onclick'=>'logout()')) }}</li>
|
<li>{{ link_to('#', trans('texts.logout'), array('onclick'=>'logout()')) }}</li>
|
||||||
|
@ -294,7 +294,17 @@
|
|||||||
{{ Former::text('name')->data_bind("value: name, valueUpdate: 'afterkeydown', attr { placeholder: name.placeholder }") }}
|
{{ Former::text('name')->data_bind("value: name, valueUpdate: 'afterkeydown', attr { placeholder: name.placeholder }") }}
|
||||||
{{ Former::text('website')->data_bind("value: website, valueUpdate: 'afterkeydown'") }}
|
{{ Former::text('website')->data_bind("value: website, valueUpdate: 'afterkeydown'") }}
|
||||||
{{ Former::text('work_phone')->data_bind("value: work_phone, valueUpdate: 'afterkeydown'") }}
|
{{ Former::text('work_phone')->data_bind("value: work_phone, valueUpdate: 'afterkeydown'") }}
|
||||||
|
|
||||||
|
@if (Auth::user()->isPro())
|
||||||
|
@if ($account->custom_client_label1)
|
||||||
|
{{ Former::text('custom_value1')->label($account->custom_client_label1)
|
||||||
|
->data_bind("value: custom_value1, valueUpdate: 'afterkeydown'") }}
|
||||||
|
@endif
|
||||||
|
@if ($account->custom_client_label2)
|
||||||
|
{{ Former::text('custom_value2')->label($account->custom_client_label2)
|
||||||
|
->data_bind("value: custom_value2, valueUpdate: 'afterkeydown'") }}
|
||||||
|
@endif
|
||||||
|
@endif
|
||||||
|
|
||||||
{{ Former::legend('address') }}
|
{{ Former::legend('address') }}
|
||||||
{{ Former::text('address1')->data_bind("value: address1, valueUpdate: 'afterkeydown'") }}
|
{{ Former::text('address1')->data_bind("value: address1, valueUpdate: 'afterkeydown'") }}
|
||||||
@ -1217,6 +1227,8 @@
|
|||||||
self.public_id = ko.observable(0);
|
self.public_id = ko.observable(0);
|
||||||
self.name = ko.observable('');
|
self.name = ko.observable('');
|
||||||
self.work_phone = ko.observable('');
|
self.work_phone = ko.observable('');
|
||||||
|
self.custom_value1 = ko.observable('');
|
||||||
|
self.custom_value2 = ko.observable('');
|
||||||
self.private_notes = ko.observable('');
|
self.private_notes = ko.observable('');
|
||||||
self.address1 = ko.observable('');
|
self.address1 = ko.observable('');
|
||||||
self.address2 = ko.observable('');
|
self.address2 = ko.observable('');
|
||||||
|
@ -70,16 +70,17 @@
|
|||||||
var NINJA = NINJA || {};
|
var NINJA = NINJA || {};
|
||||||
NINJA.formIsChanged = false;
|
NINJA.formIsChanged = false;
|
||||||
$(function() {
|
$(function() {
|
||||||
$('form.warn-on-exit input, form.warn-on-exit textarea, form.warn-on-exit select').on('change', function() {
|
$('form.warn-on-exit input, form.warn-on-exit textarea, form.warn-on-exit select').change(function() {
|
||||||
NINJA.formIsChanged = true;
|
NINJA.formIsChanged = true;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
$('form').submit(function() {
|
||||||
|
NINJA.formIsChanged = false;
|
||||||
|
});
|
||||||
$(window).on('beforeunload', function() {
|
$(window).on('beforeunload', function() {
|
||||||
/*
|
|
||||||
if (NINJA.formIsChanged) {
|
if (NINJA.formIsChanged) {
|
||||||
return "{{ trans('texts.unsaved_changes') }}";
|
return "{{ trans('texts.unsaved_changes') }}";
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
});
|
});
|
||||||
//$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
|
//$('a[rel!=ext]').click(function() { $(window).off('beforeunload') });
|
||||||
</script>
|
</script>
|
||||||
|
@ -637,6 +637,9 @@ div.fb_iframe_widget {
|
|||||||
div.fb_iframe_widget > span {
|
div.fb_iframe_widget > span {
|
||||||
vertical-align: top !important;
|
vertical-align: top !important;
|
||||||
}
|
}
|
||||||
|
.pro-label {
|
||||||
|
font-size:9px;
|
||||||
|
}
|
||||||
|
|
||||||
@media (max-width: 767px) {
|
@media (max-width: 767px) {
|
||||||
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
|
.navbar-default .navbar-nav .open .dropdown-menu > li > a {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user