mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-31 09:34:33 -04:00
Merge pull request #4358 from beganovich/v5-improve-setup-experience
(v5) Improve setup experience
This commit is contained in:
commit
aec46148cf
@ -53,64 +53,60 @@ class SetupController extends Controller
|
|||||||
|
|
||||||
public function doSetup(StoreSetupRequest $request)
|
public function doSetup(StoreSetupRequest $request)
|
||||||
{
|
{
|
||||||
$check = SystemHealth::check(false);
|
try {
|
||||||
|
$check = SystemHealth::check(false);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
info(['message' => $e->getMessage(), 'action' => 'SetupController::doSetup()']);
|
||||||
|
|
||||||
|
return response()->json(['message' => $e->getMessage()], 400);
|
||||||
|
}
|
||||||
|
|
||||||
if ($check['system_health'] === false) {
|
if ($check['system_health'] === false) {
|
||||||
info($check);
|
info($check);
|
||||||
|
|
||||||
return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but jic. */
|
return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but just in case. */
|
||||||
}
|
}
|
||||||
|
|
||||||
$mail_driver = $request->input('mail_driver');
|
$mail_driver = $request->input('mail_driver');
|
||||||
|
|
||||||
if (! $this->failsafeMailCheck($request)) {
|
if (!$this->failsafeMailCheck($request)) {
|
||||||
$mail_driver = 'log';
|
$mail_driver = 'log';
|
||||||
}
|
}
|
||||||
|
|
||||||
$url = $request->input('url');
|
$url = $request->input('url');
|
||||||
|
|
||||||
if (substr($url, -1) != '/')
|
if (substr($url, -1) != '/') {
|
||||||
$url = $url . '/';
|
$url = $url . '/';
|
||||||
|
}
|
||||||
|
|
||||||
$_ENV['APP_KEY'] = config('app.key');
|
$env_values = [
|
||||||
$_ENV['APP_URL'] = $url;
|
'APP_URL' => $url,
|
||||||
$_ENV['APP_DEBUG'] = $request->input('debug') ? 'true' : 'false';
|
'REQUIRE_HTTPS' => $request->input('https') ? 'true' : 'false',
|
||||||
$_ENV['REQUIRE_HTTPS'] = $request->input('https') ? 'true' : 'false';
|
'APP_DEBUG' => $request->input('debug') ? 'true' : 'false',
|
||||||
$_ENV['DB_TYPE'] = 'mysql';
|
|
||||||
$_ENV['DB_HOST1'] = $request->input('host');
|
|
||||||
$_ENV['DB_DATABASE1'] = $request->input('database');
|
|
||||||
$_ENV['DB_USERNAME1'] = $request->input('db_username');
|
|
||||||
$_ENV['DB_PASSWORD1'] = $request->input('db_password');
|
|
||||||
$_ENV['MAIL_MAILER'] = $mail_driver;
|
|
||||||
$_ENV['MAIL_PORT'] = $request->input('mail_port');
|
|
||||||
$_ENV['MAIL_ENCRYPTION'] = $request->input('encryption');
|
|
||||||
$_ENV['MAIL_HOST'] = $request->input('mail_host');
|
|
||||||
$_ENV['MAIL_USERNAME'] = $request->input('mail_username');
|
|
||||||
$_ENV['MAIL_FROM_NAME'] = $request->input('mail_name');
|
|
||||||
$_ENV['MAIL_FROM_ADDRESS'] = $request->input('mail_address');
|
|
||||||
$_ENV['MAIL_PASSWORD'] = $request->input('mail_password');
|
|
||||||
$_ENV['NINJA_ENVIRONMENT'] = 'selfhost';
|
|
||||||
$_ENV['DB_CONNECTION'] = 'db-ninja-01';
|
|
||||||
|
|
||||||
$config = '';
|
'DB_HOST1' => $request->input('host'),
|
||||||
|
'DB_DATABASE1' => $request->input('database'),
|
||||||
|
'DB_USERNAME1' => $request->input('db_username'),
|
||||||
|
'DB_PASSWORD1' => $request->input('db_password'),
|
||||||
|
|
||||||
|
'MAIL_MAILER' => $mail_driver,
|
||||||
|
'MAIL_PORT' => $request->input('mail_port'),
|
||||||
|
'MAIL_ENCRYPTION' => $request->input('encryption'),
|
||||||
|
'MAIL_HOST' => $request->input('mail_host'),
|
||||||
|
'MAIL_USERNAME' => $request->input('mail_username'),
|
||||||
|
'MAIL_FROM_NAME' => $request->input('mail_name'),
|
||||||
|
'MAIL_FROM_ADDRESS' => $request->input('mail_address'),
|
||||||
|
'MAIL_PASSWORD' => $request->input('mail_password'),
|
||||||
|
|
||||||
|
'NINJA_ENVIRONMENT' => 'selfhost',
|
||||||
|
'DB_CONNECTION' => 'db-ninja-01',
|
||||||
|
];
|
||||||
|
|
||||||
try {
|
try {
|
||||||
foreach ($_ENV as $key => $val) {
|
foreach ($env_values as $property => $value) {
|
||||||
if (is_array($val)) {
|
$this->updateEnvironmentProperty($property, $value);
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (preg_match('/\s/', $val)) {
|
|
||||||
$val = "'{$val}'";
|
|
||||||
}
|
|
||||||
$config .= "{$key}={$val}\n";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Write the .env file */
|
|
||||||
$filePath = base_path() . '/.env';
|
|
||||||
$fp = fopen($filePath, 'w');
|
|
||||||
fwrite($fp, $config);
|
|
||||||
fclose($fp);
|
|
||||||
|
|
||||||
/* We need this in some environments that do not have STDIN defined */
|
/* We need this in some environments that do not have STDIN defined */
|
||||||
define('STDIN', fopen('php://stdin', 'r'));
|
define('STDIN', fopen('php://stdin', 'r'));
|
||||||
|
|
||||||
@ -130,7 +126,7 @@ class SetupController extends Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
VersionCheck::dispatchNow();
|
VersionCheck::dispatchNow();
|
||||||
|
|
||||||
$this->buildCache(true);
|
$this->buildCache(true);
|
||||||
|
|
||||||
return redirect('/');
|
return redirect('/');
|
||||||
@ -151,13 +147,19 @@ class SetupController extends Controller
|
|||||||
*/
|
*/
|
||||||
public function checkDB(CheckDatabaseRequest $request): Response
|
public function checkDB(CheckDatabaseRequest $request): Response
|
||||||
{
|
{
|
||||||
$status = SystemHealth::dbCheck($request);
|
try {
|
||||||
|
$status = SystemHealth::dbCheck($request);
|
||||||
|
|
||||||
if (is_array($status) && $status['success'] === true) {
|
if (is_array($status) && $status['success'] === true) {
|
||||||
return response([], 200);
|
return response([], 200);
|
||||||
|
}
|
||||||
|
|
||||||
|
return response($status, 400);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
info(['message' => $e->getMessage(), 'action' => 'SetupController::checkDB()']);
|
||||||
|
|
||||||
|
return response()->json(['message' => $e->getMessage()], 400);
|
||||||
}
|
}
|
||||||
|
|
||||||
return response($status, 400);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,15 +33,17 @@ class CheckMailRequest extends Request
|
|||||||
*/
|
*/
|
||||||
public function rules()
|
public function rules()
|
||||||
{
|
{
|
||||||
|
info($this->driver);
|
||||||
|
|
||||||
return [
|
return [
|
||||||
'driver' => ['required', 'in:smtp,mail,sendmail'],
|
'driver' => ['required', 'in:smtp,mail,sendmail,log'],
|
||||||
'from_name' => ['required'],
|
'from_name' => ['required_unless:driver,log'],
|
||||||
'from_address' => ['required'],
|
'from_address' => ['required_unless:driver,log'],
|
||||||
'username' => ['required'],
|
'username' => ['required_unless:driver,log'],
|
||||||
'host' => ['required'],
|
'host' => ['required_unless:driver,log'],
|
||||||
'port' => ['required'],
|
'port' => ['required_unless:driver,log'],
|
||||||
'encryption' => ['required'],
|
'encryption' => ['required_unless:driver,log'],
|
||||||
'password' => ['required'],
|
'password' => ['required_unless:driver,log'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,12 +37,12 @@ class StoreSetupRequest extends Request
|
|||||||
'db_password' => '',
|
'db_password' => '',
|
||||||
/*Mail driver*/
|
/*Mail driver*/
|
||||||
'mail_driver' => 'required',
|
'mail_driver' => 'required',
|
||||||
'encryption' => 'required',
|
'encryption' => 'required_unless:mail_driver,log',
|
||||||
'mail_host' => 'required',
|
'mail_host' => 'required_unless:mail_driver,log',
|
||||||
'mail_username' => 'required',
|
'mail_username' => 'required_unless:mail_driver,log',
|
||||||
'mail_name' => 'required',
|
'mail_name' => 'required_unless:mail_driver,log',
|
||||||
'mail_address' => 'required',
|
'mail_address' => 'required_unless:mail_driver,log',
|
||||||
'mail_password' => 'required',
|
'mail_password' => 'required_unless:mail_driver,log',
|
||||||
/*user registration*/
|
/*user registration*/
|
||||||
'privacy_policy' => 'required',
|
'privacy_policy' => 'required',
|
||||||
'terms_of_service' => 'required',
|
'terms_of_service' => 'required',
|
||||||
|
@ -196,6 +196,10 @@ class SystemHealth
|
|||||||
|
|
||||||
public static function testMailServer($request = null)
|
public static function testMailServer($request = null)
|
||||||
{
|
{
|
||||||
|
if ($request->driver == 'log') {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
if ($request && $request instanceof CheckMailRequest) {
|
if ($request && $request instanceof CheckMailRequest) {
|
||||||
config(['mail.driver' => $request->input('driver')]);
|
config(['mail.driver' => $request->input('driver')]);
|
||||||
config(['mail.host' => $request->input('host')]);
|
config(['mail.host' => $request->input('host')]);
|
||||||
@ -225,7 +229,7 @@ class SystemHealth
|
|||||||
return Mail::failures();
|
return Mail::failures();
|
||||||
}
|
}
|
||||||
|
|
||||||
return response()->json(['message'=>'Success'], 200);
|
return response()->json(['message' => 'Success'], 200);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static function checkEnvWritable()
|
private static function checkEnvWritable()
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invoice Ninja (https://invoiceninja.com).
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
*
|
*
|
||||||
@ -16,6 +17,7 @@ use App\Utils\Ninja;
|
|||||||
use App\Utils\SystemHealth;
|
use App\Utils\SystemHealth;
|
||||||
use Illuminate\Support\Facades\Cache;
|
use Illuminate\Support\Facades\Cache;
|
||||||
use Illuminate\Support\Facades\Schema;
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
trait AppSetup
|
trait AppSetup
|
||||||
{
|
{
|
||||||
@ -35,10 +37,10 @@ trait AppSetup
|
|||||||
$cached_tables = config('ninja.cached_tables');
|
$cached_tables = config('ninja.cached_tables');
|
||||||
|
|
||||||
foreach ($cached_tables as $name => $class) {
|
foreach ($cached_tables as $name => $class) {
|
||||||
if (request()->has('clear_cache') || ! Cache::has($name) || $force) {
|
if (request()->has('clear_cache') || !Cache::has($name) || $force) {
|
||||||
|
|
||||||
// check that the table exists in case the migration is pending
|
// check that the table exists in case the migration is pending
|
||||||
if (! Schema::hasTable((new $class())->getTable())) {
|
if (!Schema::hasTable((new $class())->getTable())) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if ($name == 'payment_terms') {
|
if ($name == 'payment_terms') {
|
||||||
@ -58,7 +60,7 @@ trait AppSetup
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*Build template cache*/
|
/*Build template cache*/
|
||||||
if (request()->has('clear_cache') || ! Cache::has('templates'))
|
if (request()->has('clear_cache') || !Cache::has('templates'))
|
||||||
$this->buildTemplates();
|
$this->buildTemplates();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,49 +69,77 @@ trait AppSetup
|
|||||||
{
|
{
|
||||||
$data = [
|
$data = [
|
||||||
|
|
||||||
'invoice' => [
|
'invoice' => [
|
||||||
'subject' => EmailTemplateDefaults::emailInvoiceSubject(),
|
'subject' => EmailTemplateDefaults::emailInvoiceSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailInvoiceTemplate(),
|
'body' => EmailTemplateDefaults::emailInvoiceTemplate(),
|
||||||
],
|
],
|
||||||
|
|
||||||
'quote' => [
|
'quote' => [
|
||||||
'subject' => EmailTemplateDefaults::emailQuoteSubject(),
|
'subject' => EmailTemplateDefaults::emailQuoteSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailQuoteTemplate(),
|
'body' => EmailTemplateDefaults::emailQuoteTemplate(),
|
||||||
],
|
],
|
||||||
'payment' => [
|
'payment' => [
|
||||||
'subject' => EmailTemplateDefaults::emailPaymentSubject(),
|
'subject' => EmailTemplateDefaults::emailPaymentSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailPaymentTemplate(),
|
'body' => EmailTemplateDefaults::emailPaymentTemplate(),
|
||||||
],
|
],
|
||||||
'payment_partial' => [
|
'payment_partial' => [
|
||||||
'subject' => EmailTemplateDefaults::emailPaymentPartialSubject(),
|
'subject' => EmailTemplateDefaults::emailPaymentPartialSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailPaymentPartialTemplate(),
|
'body' => EmailTemplateDefaults::emailPaymentPartialTemplate(),
|
||||||
],
|
],
|
||||||
'reminder1' => [
|
'reminder1' => [
|
||||||
'subject' => EmailTemplateDefaults::emailReminder1Subject(),
|
'subject' => EmailTemplateDefaults::emailReminder1Subject(),
|
||||||
'body' => EmailTemplateDefaults::emailReminder1Template(),
|
'body' => EmailTemplateDefaults::emailReminder1Template(),
|
||||||
],
|
],
|
||||||
'reminder2' => [
|
'reminder2' => [
|
||||||
'subject' => EmailTemplateDefaults::emailReminder2Subject(),
|
'subject' => EmailTemplateDefaults::emailReminder2Subject(),
|
||||||
'body' => EmailTemplateDefaults::emailReminder2Template(),
|
'body' => EmailTemplateDefaults::emailReminder2Template(),
|
||||||
],
|
],
|
||||||
'reminder3' => [
|
'reminder3' => [
|
||||||
'subject' => EmailTemplateDefaults::emailReminder3Subject(),
|
'subject' => EmailTemplateDefaults::emailReminder3Subject(),
|
||||||
'body' => EmailTemplateDefaults::emailReminder3Template(),
|
'body' => EmailTemplateDefaults::emailReminder3Template(),
|
||||||
],
|
],
|
||||||
'reminder_endless' => [
|
'reminder_endless' => [
|
||||||
'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(),
|
'subject' => EmailTemplateDefaults::emailReminderEndlessSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(),
|
'body' => EmailTemplateDefaults::emailReminderEndlessTemplate(),
|
||||||
],
|
],
|
||||||
'statement' => [
|
'statement' => [
|
||||||
'subject' => EmailTemplateDefaults::emailStatementSubject(),
|
'subject' => EmailTemplateDefaults::emailStatementSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailStatementTemplate(),
|
'body' => EmailTemplateDefaults::emailStatementTemplate(),
|
||||||
],
|
],
|
||||||
'credit' => [
|
'credit' => [
|
||||||
'subject' => EmailTemplateDefaults::emailCreditSubject(),
|
'subject' => EmailTemplateDefaults::emailCreditSubject(),
|
||||||
'body' => EmailTemplateDefaults::emailCreditTemplate(),
|
'body' => EmailTemplateDefaults::emailCreditTemplate(),
|
||||||
],
|
],
|
||||||
];
|
];
|
||||||
|
|
||||||
Cache::forever($name, $data);
|
Cache::forever($name, $data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function updateEnvironmentProperty(string $property, $value): void
|
||||||
|
{
|
||||||
|
$env = file(base_path('.env'));
|
||||||
|
|
||||||
|
$position = null;
|
||||||
|
|
||||||
|
foreach ((array) $env as $key => $variable) {
|
||||||
|
if (Str::startsWith($variable, $property)) {
|
||||||
|
$position = $key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This should never happen, but this is login just in case.
|
||||||
|
// Variables that will be replaced (updated with different content) should already be in .env file.
|
||||||
|
|
||||||
|
if (is_null($position)) {
|
||||||
|
$env[] = "{$property}=" . $value . "\n";
|
||||||
|
} else {
|
||||||
|
$env[$position] = "{$property}=" . $value . "\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
file_put_contents(base_path('.env'), $env);
|
||||||
|
} catch (\Exception $e) {
|
||||||
|
info($e->getMessage());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -3227,7 +3227,7 @@ return [
|
|||||||
'bank_account_not_linked' => 'To pay with bank account, first you have to add it as payment method.',
|
'bank_account_not_linked' => 'To pay with bank account, first you have to add it as payment method.',
|
||||||
|
|
||||||
'application_settings_label' => 'Let\'s store basic information about your Invoice Ninja!',
|
'application_settings_label' => 'Let\'s store basic information about your Invoice Ninja!',
|
||||||
'recommended_in_production' => 'Recommended in production',
|
'recommended_in_production' => 'Highly recommended in production',
|
||||||
'enable_only_for_development' => 'Enable only for development',
|
'enable_only_for_development' => 'Enable only for development',
|
||||||
|
|
||||||
'test_pdf' => 'Test PDF',
|
'test_pdf' => 'Test PDF',
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
<div class="bg-white shadow overflow-hidden rounded-lg mt-6">
|
<div class="bg-white shadow overflow-hidden rounded-lg mt-6" x-data="{ option: 'log' }">
|
||||||
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
|
||||||
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
<h3 class="text-lg leading-6 font-medium text-gray-900">
|
||||||
{{ ctrans('texts.email_settings') }}
|
{{ ctrans('texts.email_settings') }}
|
||||||
@ -14,14 +14,15 @@
|
|||||||
{{ ctrans('texts.driver') }}
|
{{ ctrans('texts.driver') }}
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
<select name="mail_driver" class="input w-full form-select">
|
<select name="mail_driver" class="input w-full form-select" x-model="option">
|
||||||
|
<option value="log">Log</option>
|
||||||
<option value="smtp">SMTP</option>
|
<option value="smtp">SMTP</option>
|
||||||
<option value="mail">Mail</option>
|
<option value="mail">Mail</option>
|
||||||
<option value="sendmail">Sendmail</option>
|
<option value="sendmail">Sendmail</option>
|
||||||
</select>
|
</select>
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.from_name') }}
|
{{ ctrans('texts.from_name') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -29,7 +30,7 @@
|
|||||||
<input type="text" class="input w-full" name="mail_name" value="{{ old('mail_name') }}">
|
<input type="text" class="input w-full" name="mail_name" value="{{ old('mail_name') }}">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.from_address') }}
|
{{ ctrans('texts.from_address') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -37,15 +38,15 @@
|
|||||||
<input type="email" class="input w-full" name="mail_address" value="{{ old('mail_address') }}">
|
<input type="email" class="input w-full" name="mail_address" value="{{ old('mail_address') }}">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.username') }}
|
{{ ctrans('texts.username') }}
|
||||||
</dt>
|
</dt>
|
||||||
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
|
||||||
<input type="text" class="input w-full" name="mail_username" value="{{ old('mail_username') }}">
|
<input type="text" class="input w-full" name="mail_username" value="{{ old('mail_username') }}" x-show="option != 'log'">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.host') }}
|
{{ ctrans('texts.host') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -53,7 +54,7 @@
|
|||||||
<input type="text" class="input w-full" name="mail_host" value="{{ old('mail_host') }}">
|
<input type="text" class="input w-full" name="mail_host" value="{{ old('mail_host') }}">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.port') }}
|
{{ ctrans('texts.port') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -61,7 +62,7 @@
|
|||||||
<input type="text" class="input w-full" name="mail_port" value="{{ old('mail_port') }}">
|
<input type="text" class="input w-full" name="mail_port" value="{{ old('mail_port') }}">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.encryption') }}
|
{{ ctrans('texts.encryption') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -72,7 +73,7 @@
|
|||||||
</select>
|
</select>
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
{{ ctrans('texts.password') }}
|
{{ ctrans('texts.password') }}
|
||||||
</dt>
|
</dt>
|
||||||
@ -80,7 +81,7 @@
|
|||||||
<input type="password" class="input w-full" name="mail_password">
|
<input type="password" class="input w-full" name="mail_password">
|
||||||
</dd>
|
</dd>
|
||||||
</div>
|
</div>
|
||||||
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
|
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center" x-show="option != 'log'">
|
||||||
<dt class="text-sm leading-5 font-medium text-gray-500">
|
<dt class="text-sm leading-5 font-medium text-gray-500">
|
||||||
<button type="button" class="button button-primary bg-blue-600 py-2 px-3 text-xs" id="test-smtp-connection">
|
<button type="button" class="button button-primary bg-blue-600 py-2 px-3 text-xs" id="test-smtp-connection">
|
||||||
{{ ctrans('texts.send_test_email') }}
|
{{ ctrans('texts.send_test_email') }}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user