The earlier refreshStatus fix kept user-typed values intact but Livewire still absorbed deferred wire:model values into the snapshot on every broadcast- triggered roundtrip, clearing the unsaved-changes indicator and making the form look auto-saved. Move all status-derived display (DB URLs, SSL toggle/mode, cert expiry) out of each DB General form into a sibling StatusInfo Livewire component, so the form never roundtrips on broadcasts. Shared scaffolding lives in App\Traits\HasDatabaseStatusInfo plus an x-database- status-info Blade component, leaving each per-DB StatusInfo class as a ~20-50 line declaration of label, SSL mode options, and SSL save hooks. Parents dispatch databaseUpdated from save methods so the sibling refreshes after writes. Tests cover the architecture (no DB form subscribes to status broadcasts) and the sibling's refresh-on-status-change behavior.
94 lines
4.8 KiB
PHP
94 lines
4.8 KiB
PHP
@props([
|
|
'database',
|
|
'label',
|
|
'dbUrl' => null,
|
|
'dbUrlPublic' => null,
|
|
'supportsSsl' => true,
|
|
'enableSsl' => false,
|
|
'sslMode' => null,
|
|
'sslModeOptions' => null,
|
|
'sslModeHelper' => null,
|
|
'certificateValidUntil' => null,
|
|
'isExited' => false,
|
|
'showPublicUrlPlaceholder' => false,
|
|
])
|
|
|
|
@php
|
|
$urlHelper = 'If you change the user/password/port, this could be different. This is with the default values.';
|
|
@endphp
|
|
|
|
<div class="flex flex-col gap-2">
|
|
<x-forms.input :label="$label . ' URL (internal)'" :helper="$urlHelper" type="password" readonly
|
|
wire:model="dbUrl" canGate="update" :canResource="$database" />
|
|
@if ($dbUrlPublic)
|
|
<x-forms.input :label="$label . ' URL (public)'" :helper="$urlHelper" type="password" readonly
|
|
wire:model="dbUrlPublic" canGate="update" :canResource="$database" />
|
|
@elseif ($showPublicUrlPlaceholder)
|
|
<x-forms.input :label="$label . ' URL (public)'" :helper="$urlHelper" readonly
|
|
value="Starting the database will generate this." canGate="update" :canResource="$database" />
|
|
@endif
|
|
|
|
@if ($supportsSsl)
|
|
<div class="flex flex-col gap-2 pt-4">
|
|
<div class="flex items-center justify-between py-2">
|
|
<div class="flex items-center justify-between w-full">
|
|
<h3>SSL Configuration</h3>
|
|
@if ($enableSsl && $certificateValidUntil)
|
|
<x-modal-confirmation title="Regenerate SSL Certificates"
|
|
buttonTitle="Regenerate SSL Certificates" :actions="[
|
|
'The SSL certificate of this database will be regenerated.',
|
|
'You must restart the database after regenerating the certificate to start using the new certificate.',
|
|
]"
|
|
submitAction="regenerateSslCertificate" :confirmWithText="false" :confirmWithPassword="false" />
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@if ($enableSsl && $certificateValidUntil)
|
|
<span class="text-sm">Valid until:
|
|
@if (now()->gt($certificateValidUntil))
|
|
<span class="text-red-500">{{ $certificateValidUntil->format('d.m.Y H:i:s') }} - Expired</span>
|
|
@elseif(now()->addDays(30)->gt($certificateValidUntil))
|
|
<span class="text-red-500">{{ $certificateValidUntil->format('d.m.Y H:i:s') }} - Expiring
|
|
soon</span>
|
|
@else
|
|
<span>{{ $certificateValidUntil->format('d.m.Y H:i:s') }}</span>
|
|
@endif
|
|
</span>
|
|
@endif
|
|
<div class="flex flex-col gap-2">
|
|
<div class="w-64" wire:key="enable_ssl">
|
|
@if ($isExited)
|
|
<x-forms.checkbox id="enableSsl" label="Enable SSL" wire:model.live="enableSsl"
|
|
instantSave="instantSaveSSL" canGate="update" :canResource="$database" />
|
|
@else
|
|
<x-forms.checkbox id="enableSsl" label="Enable SSL" wire:model.live="enableSsl"
|
|
instantSave="instantSaveSSL" disabled
|
|
helper="Database should be stopped to change this settings." canGate="update"
|
|
:canResource="$database" />
|
|
@endif
|
|
</div>
|
|
@if ($sslModeOptions && $enableSsl)
|
|
<div class="mx-2">
|
|
@if ($isExited)
|
|
<x-forms.select id="sslMode" label="SSL Mode" wire:model.live="sslMode"
|
|
instantSave="instantSaveSSL" :helper="$sslModeHelper" canGate="update"
|
|
:canResource="$database">
|
|
@foreach ($sslModeOptions as $value => $option)
|
|
<option value="{{ $value }}" title="{{ $option['title'] ?? '' }}">{{ $option['label'] }}</option>
|
|
@endforeach
|
|
</x-forms.select>
|
|
@else
|
|
<x-forms.select id="sslMode" label="SSL Mode" instantSave="instantSaveSSL" disabled
|
|
helper="Database should be stopped to change this settings." canGate="update"
|
|
:canResource="$database">
|
|
@foreach ($sslModeOptions as $value => $option)
|
|
<option value="{{ $value }}" title="{{ $option['title'] ?? '' }}">{{ $option['label'] }}</option>
|
|
@endforeach
|
|
</x-forms.select>
|
|
@endif
|
|
</div>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
@endif
|
|
</div>
|