mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Add secondary domain choice
This commit is contained in:
parent
1c010084d6
commit
0095cdf7dd
@ -464,7 +464,6 @@ if (!defined('APP_NAME'))
|
||||
define('FEATURE_MORE_CLIENTS', 'more_clients'); // No trial allowed
|
||||
|
||||
// Whitelabel
|
||||
define('FEATURE_CLIENT_PORTAL_CSS', 'client_portal_css');
|
||||
define('FEATURE_WHITE_LABEL', 'feature_white_label');
|
||||
|
||||
// Enterprise
|
||||
|
24
app/Constants/Domain.php
Normal file
24
app/Constants/Domain.php
Normal file
@ -0,0 +1,24 @@
|
||||
<?php namespace App\Constants;
|
||||
|
||||
class Domain
|
||||
{
|
||||
const INVOICENINJA_COM = 1;
|
||||
const INVOICE_SERVICES = 2;
|
||||
|
||||
public static function getDomainFromId($id)
|
||||
{
|
||||
switch ($id) {
|
||||
case static::INVOICENINJA_COM:
|
||||
return 'invoiceninja.com';
|
||||
case static::INVOICE_SERVICES:
|
||||
return 'invoice.services';
|
||||
}
|
||||
|
||||
return 'invoiceninja.com';
|
||||
}
|
||||
|
||||
public static function getLinkFromId($id)
|
||||
{
|
||||
return 'https://app.' . static::getDomainFromId($id);
|
||||
}
|
||||
}
|
@ -792,6 +792,8 @@ class AccountController extends BaseController
|
||||
{
|
||||
$account = $request->user()->account;
|
||||
$account->fill($request->all());
|
||||
$account->subdomain = $request->subdomain;
|
||||
$account->iframe_url = $request->iframe_url;
|
||||
$account->save();
|
||||
|
||||
return redirect('settings/' . ACCOUNT_CLIENT_PORTAL)
|
||||
@ -805,6 +807,7 @@ class AccountController extends BaseController
|
||||
{
|
||||
$account = $request->user()->account;
|
||||
$account->fill($request->all());
|
||||
$account->bcc_email = $request->bcc_email;
|
||||
$account->save();
|
||||
|
||||
return redirect('settings/' . ACCOUNT_EMAIL_SETTINGS)
|
||||
|
@ -85,10 +85,8 @@ class Account extends Eloquent
|
||||
'pdf_email_attachment',
|
||||
'document_email_attachment',
|
||||
'email_design_id',
|
||||
'bcc_email',
|
||||
'enable_email_markup',
|
||||
'subdomain',
|
||||
'iframe_url',
|
||||
'domain_id',
|
||||
];
|
||||
|
||||
/**
|
||||
@ -475,6 +473,17 @@ class Account extends Eloquent
|
||||
return $this->date_format ? $this->date_format->format : DEFAULT_DATE_FORMAT;
|
||||
}
|
||||
|
||||
|
||||
public function getSampleLink()
|
||||
{
|
||||
$invitation = new Invitation();
|
||||
$invitation->account = $this;
|
||||
$invitation->invitation_key = '...';
|
||||
|
||||
return $invitation->getLink();
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param $amount
|
||||
* @param null $client
|
||||
@ -994,7 +1003,6 @@ class Account extends Eloquent
|
||||
return false;
|
||||
}
|
||||
// Fallthrough
|
||||
case FEATURE_CLIENT_PORTAL_CSS:
|
||||
case FEATURE_REMOVE_CREATED_BY:
|
||||
return !empty($planDetails);// A plan is required even for self-hosted users
|
||||
|
||||
@ -1556,9 +1564,7 @@ class Account extends Eloquent
|
||||
if ($headerFont != $bodyFont) {
|
||||
$css .= 'h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{'.$headerFont.'}';
|
||||
}
|
||||
}
|
||||
if ($this->hasFeature(FEATURE_CLIENT_PORTAL_CSS)) {
|
||||
// For self-hosted users, a white-label license is required for custom CSS
|
||||
|
||||
$css .= $this->client_view_css;
|
||||
}
|
||||
|
||||
@ -1707,6 +1713,15 @@ class Account extends Eloquent
|
||||
|
||||
return $invoice->isQuote() ? $this->require_quote_signature : $this->require_invoice_signature;
|
||||
}
|
||||
|
||||
public function emailMarkupEnabled()
|
||||
{
|
||||
if ( ! Utils::isNinja()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->enable_email_markup;
|
||||
}
|
||||
}
|
||||
|
||||
Account::updated(function ($account)
|
||||
|
@ -68,14 +68,19 @@ class Invitation extends EntityModel
|
||||
$this->load('account');
|
||||
}
|
||||
|
||||
$account = $this->account;
|
||||
$iframe_url = $account->iframe_url;
|
||||
$url = trim(SITE_URL, '/');
|
||||
$iframe_url = $this->account->iframe_url;
|
||||
|
||||
if ($this->account->hasFeature(FEATURE_CUSTOM_URL)) {
|
||||
if ($account->hasFeature(FEATURE_CUSTOM_URL)) {
|
||||
if (Utils::isNinja()) {
|
||||
$url = $account->present()->clientPortalLink();
|
||||
}
|
||||
|
||||
if ($iframe_url && !$forceOnsite) {
|
||||
return "{$iframe_url}?{$this->invitation_key}";
|
||||
} elseif ($this->account->subdomain) {
|
||||
$url = Utils::replaceSubdomain($url, $this->account->subdomain);
|
||||
$url = Utils::replaceSubdomain($url, $account->subdomain);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -108,7 +108,7 @@ class Mailer
|
||||
if (! $response) {
|
||||
$error = trans('texts.postmark_error', ['link' => link_to('https://status.postmarkapp.com/')]);
|
||||
Utils::logError($error);
|
||||
|
||||
|
||||
// TODO throw the exception once all emails are sent using the queue
|
||||
return $error;
|
||||
}
|
||||
@ -124,7 +124,7 @@ class Mailer
|
||||
$invitation = $data['invitation'];
|
||||
$invitation->email_error = $emailError;
|
||||
$invitation->save();
|
||||
} elseif ( ! Utils::isNinja()) {
|
||||
} elseif ( ! Utils::isNinjaProd()) {
|
||||
Utils::logError(Utils::getErrorString($exception));
|
||||
}
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
use stdClass;
|
||||
use Utils;
|
||||
use Domain;
|
||||
use Laracasts\Presenter\Presenter;
|
||||
|
||||
/**
|
||||
@ -36,6 +37,11 @@ class AccountPresenter extends Presenter
|
||||
return $currency->code;
|
||||
}
|
||||
|
||||
public function clientPortalLink()
|
||||
{
|
||||
return Domain::getLinkFromId($this->entity->domain_id);
|
||||
}
|
||||
|
||||
public function industry()
|
||||
{
|
||||
return $this->entity->industry ? $this->entity->industry->name : '';
|
||||
|
@ -263,6 +263,7 @@ return [
|
||||
|
||||
'Utils' => App\Libraries\Utils::class,
|
||||
'HTMLUtils' => App\Libraries\HTMLUtils::class,
|
||||
'Domain' => App\Constants\Domain::class,
|
||||
],
|
||||
|
||||
];
|
||||
|
@ -33,6 +33,7 @@ class AddInclusiveTaxes extends Migration
|
||||
$table->text('client_number_prefix')->nullable();
|
||||
$table->integer('client_number_counter')->default(0)->nullable();
|
||||
$table->text('client_number_pattern')->nullable();
|
||||
$table->tinyInteger('domain_id')->default(1)->nullable();
|
||||
});
|
||||
|
||||
Schema::table('activities', function ($table)
|
||||
@ -65,6 +66,7 @@ class AddInclusiveTaxes extends Migration
|
||||
$table->dropColumn('client_number_prefix');
|
||||
$table->dropColumn('client_number_counter');
|
||||
$table->dropColumn('client_number_pattern');
|
||||
$table->dropColumn('domain_id');
|
||||
});
|
||||
|
||||
Schema::table('activities', function ($table)
|
||||
|
@ -849,7 +849,7 @@ $LANG = array(
|
||||
'light' => 'Light',
|
||||
'dark' => 'Dark',
|
||||
'industry_help' => 'Used to provide comparisons against the averages of companies of similar size and industry.',
|
||||
'subdomain_help' => 'Customize the invoice link subdomain or display the invoice on your own website.',
|
||||
'subdomain_help' => 'Set the subdomain or display the invoice on your own website.',
|
||||
'invoice_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the invoice number.',
|
||||
'quote_number_help' => 'Specify a prefix or use a custom pattern to dynamically set the quote number.',
|
||||
'custom_client_fields_helps' => 'Add a field when creating a client and display the label and value on the PDF.',
|
||||
@ -2313,7 +2313,11 @@ $LANG = array(
|
||||
'emailed_invoices' => 'Successfully emailed invoices',
|
||||
'emailed_quotes' => 'Successfully emailed quotes',
|
||||
'website_url' => 'Website URL',
|
||||
|
||||
'domain' => 'Domain',
|
||||
'domain_help' => 'Used in the client portal and when sending emails.',
|
||||
'domain_help_website' => 'Used when sending emails.',
|
||||
'preview' => 'Preview',
|
||||
|
||||
);
|
||||
|
||||
return $LANG;
|
||||
|
@ -11,6 +11,9 @@
|
||||
.checkbox-inline input[type="checkbox"] {
|
||||
margin-left:-20px !important;
|
||||
}
|
||||
.iframe_url {
|
||||
display: none;
|
||||
}
|
||||
</style>
|
||||
|
||||
@stop
|
||||
@ -35,14 +38,6 @@
|
||||
{!! Former::populateField('require_invoice_signature', intval($account->require_invoice_signature)) !!}
|
||||
{!! Former::populateField('require_quote_signature', intval($account->require_quote_signature)) !!}
|
||||
|
||||
@if (!Utils::isNinja() && !Auth::user()->account->hasFeature(FEATURE_WHITE_LABEL))
|
||||
<div class="alert alert-warning" style="font-size:larger;">
|
||||
<center>
|
||||
{!! trans('texts.white_label_custom_css', ['price' => WHITE_LABEL_PRICE, 'link'=>'<a href="#" onclick="$(\'#whiteLabelModal\').modal(\'show\');">'.trans('texts.white_label_purchase_link').'</a>']) !!}
|
||||
</center>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
@include('accounts.nav', ['selected' => ACCOUNT_CLIENT_PORTAL])
|
||||
|
||||
<div class="row">
|
||||
@ -53,42 +48,91 @@
|
||||
<h3 class="panel-title">{!! trans('texts.settings') !!}</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="col-md-10 col-md-offset-1">
|
||||
|
||||
{!! Former::inline_radios('custom_invoice_link')
|
||||
->onchange('onCustomLinkChange()')
|
||||
->label(trans('texts.website_url'))
|
||||
->radios([
|
||||
trans('texts.subdomain') => ['value' => 'subdomain', 'name' => 'custom_link'],
|
||||
trans('texts.website') => ['value' => 'website', 'name' => 'custom_link'],
|
||||
])->check($account->iframe_url ? 'website' : 'subdomain') !!}
|
||||
{{ Former::setOption('capitalize_translations', false) }}
|
||||
<div role="tabpanel">
|
||||
<ul class="nav nav-tabs" role="tablist" style="border: none">
|
||||
<li role="presentation" class="active">
|
||||
<a href="#link" aria-controls="link" role="tab" data-toggle="tab">{{ trans('texts.link') }}</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="#navigation" aria-controls="navigation" role="tab" data-toggle="tab">{{ trans('texts.navigation') }}</a>
|
||||
</li>
|
||||
<li role="presentation">
|
||||
<a href="#custom_css" aria-controls="custom_css" role="tab" data-toggle="tab">{{ trans('texts.custom_css') }}</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
{!! Former::text('subdomain')
|
||||
->placeholder(trans('texts.www'))
|
||||
->onchange('onSubdomainChange()')
|
||||
->addGroupClass('subdomain')
|
||||
->label(' ')
|
||||
->help(trans('texts.subdomain_help')) !!}
|
||||
<div class="tab-content">
|
||||
<div role="tabpanel" class="tab-pane active" id="link">
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::text('iframe_url')
|
||||
->placeholder('https://www.example.com/invoice')
|
||||
->appendIcon('question-sign')
|
||||
->addGroupClass('iframe_url')
|
||||
->label(' ')
|
||||
->help(trans('texts.subdomain_help')) !!}
|
||||
@if (Utils::isNinja() && ! Utils::isReseller())
|
||||
{!! Former::inline_radios('domain_id')
|
||||
->label(trans('texts.domain'))
|
||||
->radios([
|
||||
'invoiceninja.com' => ['value' => \Domain::INVOICENINJA_COM, 'name' => 'domain_id'],
|
||||
'invoice.services' => ['value' => \Domain::INVOICE_SERVICES, 'name' => 'domain_id'],
|
||||
])->check($account->domain_id)
|
||||
->help($account->iframe_url ? 'domain_help_website' : 'domain_help') !!}
|
||||
@endif
|
||||
|
||||
{!! Former::inline_radios('custom_invoice_link')
|
||||
->onchange('onCustomLinkChange()')
|
||||
->label(trans('texts.customize'))
|
||||
->radios([
|
||||
trans('texts.subdomain') => ['value' => 'subdomain', 'name' => 'custom_link'],
|
||||
trans('texts.website') => ['value' => 'website', 'name' => 'custom_link'],
|
||||
])->check($account->iframe_url ? 'website' : 'subdomain') !!}
|
||||
{{ Former::setOption('capitalize_translations', false) }}
|
||||
|
||||
{!! Former::text('subdomain')
|
||||
->placeholder(Utils::isNinja() ? 'app' : trans('texts.www'))
|
||||
->onchange('onSubdomainChange()')
|
||||
->addGroupClass('subdomain')
|
||||
->label(' ')
|
||||
->help(trans('texts.subdomain_help')) !!}
|
||||
|
||||
{!! Former::text('iframe_url')
|
||||
->placeholder('https://www.example.com/invoice')
|
||||
->appendIcon('question-sign')
|
||||
->addGroupClass('iframe_url')
|
||||
->label(' ')
|
||||
->help(trans('texts.subdomain_help')) !!}
|
||||
|
||||
{!! Former::plaintext('preview')
|
||||
->value($account->getSampleLink()) !!}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="navigation">
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::checkbox('enable_client_portal')
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_help'))
|
||||
->value(1) !!}
|
||||
|
||||
|
||||
{!! Former::checkbox('enable_client_portal')
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_help'))
|
||||
->value(1) !!}
|
||||
{!! Former::checkbox('enable_client_portal_dashboard')
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_dashboard_help'))
|
||||
->value(1) !!}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<div role="tabpanel" class="tab-pane" id="custom_css">
|
||||
<div class="panel-body">
|
||||
|
||||
{!! Former::checkbox('enable_client_portal_dashboard')
|
||||
->text(trans('texts.enable'))
|
||||
->help(trans('texts.enable_client_portal_dashboard_help'))
|
||||
->value(1) !!}
|
||||
{!! Former::textarea('client_view_css')
|
||||
->label(trans('texts.custom_css'))
|
||||
->rows(10)
|
||||
->raw()
|
||||
->maxlength(60000)
|
||||
->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!}
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -252,23 +296,6 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@if (Utils::hasFeature(FEATURE_CLIENT_PORTAL_CSS))
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading">
|
||||
<h3 class="panel-title">{!! trans('texts.custom_css') !!}</h3>
|
||||
</div>
|
||||
<div class="panel-body">
|
||||
<div class="col-md-10 col-md-offset-1">
|
||||
{!! Former::textarea('client_view_css')
|
||||
->label(trans('texts.custom_css'))
|
||||
->rows(10)
|
||||
->raw()
|
||||
->maxlength(60000)
|
||||
->style("min-width:100%;max-width:100%;font-family:'Roboto Mono', 'Lucida Console', Monaco, monospace;font-size:14px;'") !!}
|
||||
</div>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.client_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.client_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.client_view_action')
|
||||
@endif
|
||||
{!! $body !!}
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master_user')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.user_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master_user')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.user_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master_user')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.user_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master_user')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.user_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
@ -4,7 +4,7 @@
|
||||
<meta charset="utf-8">
|
||||
</head>
|
||||
<body>
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.client_view_action', ['link' => $link])
|
||||
@endif
|
||||
{!! $body !!}
|
||||
|
@ -1,7 +1,7 @@
|
||||
@extends('emails.master_user')
|
||||
|
||||
@section('markup')
|
||||
@if ($account->enable_email_markup)
|
||||
@if ($account->emailMarkupEnabled())
|
||||
@include('emails.partials.user_view_action')
|
||||
@endif
|
||||
@stop
|
||||
|
Loading…
x
Reference in New Issue
Block a user