mirror of
https://github.com/tiennm99/coolify.git
synced 2026-04-19 11:20:56 +00:00
Complete Livewire legacy model binding migration (25+ components)
This completes the migration from Livewire's legacy `id="model.property"` pattern to explicit properties with manual synchronization. This allows disabling the `legacy_model_binding` feature flag. **Components Migrated (Final Session - 9 components):** - Server/Proxy.php (1 field) - Service/EditDomain.php (1 field) - Fixed Collection/string bug & parent sync - Application/Previews.php (2 fields - array handling) - Service/EditCompose.php (4 fields) - Service/FileStorage.php (6 fields) - Service/Database.php (7 fields) - Service/ServiceApplicationView.php (10 fields) - Application/General.php (53 fields) - LARGEST migration - Application/PreviewsCompose.php (1 field) **Total Migration Summary:** - 25+ components migrated across all phases - 150+ explicit properties added - 0 legacy bindings remaining (verified via grep) - All wire:model, id, @entangle bindings updated - All updater hooks renamed (updatedApplicationX → updatedX) **Technical Changes:** - Added explicit public properties (camelCase) - Implemented syncData(bool $toModel) bidirectional sync - Updated validation rules (removed model. prefix) - Updated all action methods (mount, submit, instantSave) - Fixed updater hooks: updatedBuildPack, updatedBaseDirectory, updatedIsStatic - Updated Blade views (id & wire:model bindings) - Applied Collection/string confusion fixes - Added model refresh + re-sync pattern **Critical Fixes:** - EditDomain.php Collection/string confusion (use intermediate variables) - EditDomain.php parent component sync (refresh + re-sync after save) - General.php domain field empty (syncData at end of mount) - General.php wire:model bindings (application.* → property) - General.php updater hooks (wrong naming convention) **Files Modified:** 34 files - 17 PHP Livewire components - 17 Blade view templates - 1 MIGRATION_REPORT.md (documentation) **Ready to disable legacy_model_binding flag in config/livewire.php** 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
<div class="flex items-center gap-2">
|
||||
<h2>Healthchecks</h2>
|
||||
<x-forms.button canGate="update" :canResource="$resource" type="submit">Save</x-forms.button>
|
||||
@if (!$resource->health_check_enabled)
|
||||
@if (!$healthCheckEnabled)
|
||||
<x-modal-confirmation title="Confirm Healthcheck Enable?" buttonTitle="Enable Healthcheck"
|
||||
submitAction="toggleHealthcheck" :actions="['Enable healthcheck for this resource.']"
|
||||
warningMessage="If the health check fails, your application will become inaccessible. Please review the <a href='https://coolify.io/docs/knowledge-base/health-checks' target='_blank' class='underline text-white'>Health Checks</a> guide before proceeding!"
|
||||
@@ -15,37 +15,37 @@
|
||||
</div>
|
||||
<div class="mt-1 pb-4">Define how your resource's health should be checked.</div>
|
||||
<div class="flex flex-col gap-4">
|
||||
@if ($resource->custom_healthcheck_found)
|
||||
@if ($customHealthcheckFound)
|
||||
<x-callout type="warning" title="Caution">
|
||||
<p>A custom health check has been detected. If you enable this health check, it will disable the custom one and use this instead.</p>
|
||||
</x-callout>
|
||||
@endif
|
||||
<div class="flex gap-2">
|
||||
<x-forms.select canGate="update" :canResource="$resource" id="resource.health_check_method" label="Method" required>
|
||||
<x-forms.select canGate="update" :canResource="$resource" id="healthCheckMethod" label="Method" required>
|
||||
<option value="GET">GET</option>
|
||||
<option value="POST">POST</option>
|
||||
</x-forms.select>
|
||||
<x-forms.select canGate="update" :canResource="$resource" id="resource.health_check_scheme" label="Scheme" required>
|
||||
<x-forms.select canGate="update" :canResource="$resource" id="healthCheckScheme" label="Scheme" required>
|
||||
<option value="http">http</option>
|
||||
<option value="https">https</option>
|
||||
</x-forms.select>
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="resource.health_check_host" placeholder="localhost" label="Host" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="resource.health_check_port"
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="healthCheckHost" placeholder="localhost" label="Host" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="healthCheckPort"
|
||||
helper="If no port is defined, the first exposed port will be used." placeholder="80" label="Port" />
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="resource.health_check_path" placeholder="/health" label="Path" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="healthCheckPath" placeholder="/health" label="Path" required />
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="resource.health_check_return_code" placeholder="200" label="Return Code"
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="healthCheckReturnCode" placeholder="200" label="Return Code"
|
||||
required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="resource.health_check_response_text" placeholder="OK" label="Response Text" />
|
||||
<x-forms.input canGate="update" :canResource="$resource" id="healthCheckResponseText" placeholder="OK" label="Response Text" />
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input canGate="update" :canResource="$resource" min="1" type="number" id="resource.health_check_interval" placeholder="30"
|
||||
<x-forms.input canGate="update" :canResource="$resource" min="1" type="number" id="healthCheckInterval" placeholder="30"
|
||||
label="Interval (s)" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="resource.health_check_timeout" placeholder="30" label="Timeout (s)"
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="healthCheckTimeout" placeholder="30" label="Timeout (s)"
|
||||
required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="resource.health_check_retries" placeholder="3" label="Retries" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" min=1 type="number" id="resource.health_check_start_period" placeholder="30"
|
||||
<x-forms.input canGate="update" :canResource="$resource" type="number" id="healthCheckRetries" placeholder="3" label="Retries" required />
|
||||
<x-forms.input canGate="update" :canResource="$resource" min=1 type="number" id="healthCheckStartPeriod" placeholder="30"
|
||||
label="Start Period (s)" required />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -9,32 +9,32 @@
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input canGate="update" :canResource="$resource" placeholder="1.5"
|
||||
helper="0 means use all CPUs. Floating point number, like 0.002 or 1.5. More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/engine/reference/run/#cpu-share-constraint'>here</a>."
|
||||
label="Number of CPUs" id="resource.limits_cpus" />
|
||||
label="Number of CPUs" id="limitsCpus" />
|
||||
<x-forms.input canGate="update" :canResource="$resource" placeholder="0-2"
|
||||
helper="Empty means, use all CPU sets. 0-2 will use CPU 0, CPU 1 and CPU 2. More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/engine/reference/run/#cpu-share-constraint'>here</a>."
|
||||
label="CPU sets to use" id="resource.limits_cpuset" />
|
||||
label="CPU sets to use" id="limitsCpuset" />
|
||||
<x-forms.input canGate="update" :canResource="$resource" placeholder="1024"
|
||||
helper="More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/engine/reference/run/#cpu-share-constraint'>here</a>."
|
||||
label="CPU Weight" id="resource.limits_cpu_shares" />
|
||||
label="CPU Weight" id="limitsCpuShares" />
|
||||
</div>
|
||||
<h3 class="pt-4">Limit Memory</h3>
|
||||
<div class="flex flex-col gap-2">
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input canGate="update" :canResource="$resource"
|
||||
helper="Examples: 69b (byte) or 420k (kilobyte) or 1337m (megabyte) or 1g (gigabyte).<br>More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/compose/compose-file/05-services/#mem_reservation'>here</a>."
|
||||
label="Soft Memory Limit" id="resource.limits_memory_reservation" />
|
||||
label="Soft Memory Limit" id="limitsMemoryReservation" />
|
||||
<x-forms.input canGate="update" :canResource="$resource"
|
||||
helper="0-100.<br>More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/compose/compose-file/05-services/#mem_swappiness'>here</a>."
|
||||
type="number" min="0" max="100" label="Swappiness"
|
||||
id="resource.limits_memory_swappiness" />
|
||||
id="limitsMemorySwappiness" />
|
||||
</div>
|
||||
<div class="flex gap-2">
|
||||
<x-forms.input canGate="update" :canResource="$resource"
|
||||
helper="Examples: 69b (byte) or 420k (kilobyte) or 1337m (megabyte) or 1g (gigabyte).<br>More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/compose/compose-file/05-services/#mem_limit'>here</a>."
|
||||
label="Maximum Memory Limit" id="resource.limits_memory" />
|
||||
label="Maximum Memory Limit" id="limitsMemory" />
|
||||
<x-forms.input canGate="update" :canResource="$resource"
|
||||
helper="Examples:69b (byte) or 420k (kilobyte) or 1337m (megabyte) or 1g (gigabyte).<br>More info <a class='underline dark:text-white' target='_blank' href='https://docs.docker.com/compose/compose-file/05-services/#memswap_limit'>here</a>."
|
||||
label="Maximum Swap Limit" id="resource.limits_memory_swap" />
|
||||
label="Maximum Swap Limit" id="limitsMemorySwap" />
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -9,47 +9,47 @@
|
||||
@if (
|
||||
$storage->resource_type === 'App\Models\ServiceApplication' ||
|
||||
$storage->resource_type === 'App\Models\ServiceDatabase')
|
||||
<x-forms.input id="storage.name" label="Volume Name" required readonly
|
||||
<x-forms.input id="name" label="Volume Name" required readonly
|
||||
helper="Warning: Changing the volume name after the initial start could cause problems. Only use it when you know what are you doing." />
|
||||
@else
|
||||
<x-forms.input id="storage.name" label="Volume Name" required readonly
|
||||
<x-forms.input id="name" label="Volume Name" required readonly
|
||||
helper="Warning: Changing the volume name after the initial start could cause problems. Only use it when you know what are you doing." />
|
||||
@endif
|
||||
@if ($isService || $startedAt)
|
||||
<x-forms.input id="storage.host_path" readonly helper="Directory on the host system."
|
||||
<x-forms.input id="hostPath" readonly helper="Directory on the host system."
|
||||
label="Source Path"
|
||||
helper="Warning: Changing the source path after the initial start could cause problems. Only use it when you know what are you doing." />
|
||||
<x-forms.input id="storage.mount_path" label="Destination Path"
|
||||
<x-forms.input id="mountPath" label="Destination Path"
|
||||
helper="Directory inside the container." required readonly />
|
||||
@else
|
||||
<x-forms.input id="storage.host_path" readonly helper="Directory on the host system."
|
||||
<x-forms.input id="hostPath" readonly helper="Directory on the host system."
|
||||
label="Source Path"
|
||||
helper="Warning: Changing the source path after the initial start could cause problems. Only use it when you know what are you doing." />
|
||||
<x-forms.input id="storage.mount_path" label="Destination Path"
|
||||
<x-forms.input id="mountPath" label="Destination Path"
|
||||
helper="Directory inside the container." required readonly />
|
||||
@endif
|
||||
</div>
|
||||
@else
|
||||
<div class="flex gap-2 items-end w-full">
|
||||
<x-forms.input id="storage.name" required readonly />
|
||||
<x-forms.input id="storage.host_path" readonly />
|
||||
<x-forms.input id="storage.mount_path" required readonly />
|
||||
<x-forms.input id="name" required readonly />
|
||||
<x-forms.input id="hostPath" readonly />
|
||||
<x-forms.input id="mountPath" required readonly />
|
||||
</div>
|
||||
@endif
|
||||
@else
|
||||
@can('update', $resource)
|
||||
@if ($isFirst)
|
||||
<div class="flex gap-2 items-end w-full">
|
||||
<x-forms.input id="storage.name" label="Volume Name" required />
|
||||
<x-forms.input id="storage.host_path" helper="Directory on the host system." label="Source Path" />
|
||||
<x-forms.input id="storage.mount_path" label="Destination Path"
|
||||
<x-forms.input id="name" label="Volume Name" required />
|
||||
<x-forms.input id="hostPath" helper="Directory on the host system." label="Source Path" />
|
||||
<x-forms.input id="mountPath" label="Destination Path"
|
||||
helper="Directory inside the container." required />
|
||||
</div>
|
||||
@else
|
||||
<div class="flex gap-2 items-end w-full">
|
||||
<x-forms.input id="storage.name" required />
|
||||
<x-forms.input id="storage.host_path" />
|
||||
<x-forms.input id="storage.mount_path" required />
|
||||
<x-forms.input id="name" required />
|
||||
<x-forms.input id="hostPath" />
|
||||
<x-forms.input id="mountPath" required />
|
||||
</div>
|
||||
@endif
|
||||
<div class="flex gap-2">
|
||||
@@ -67,17 +67,17 @@
|
||||
@else
|
||||
@if ($isFirst)
|
||||
<div class="flex gap-2 items-end w-full">
|
||||
<x-forms.input id="storage.name" label="Volume Name" required disabled />
|
||||
<x-forms.input id="storage.host_path" helper="Directory on the host system." label="Source Path"
|
||||
<x-forms.input id="name" label="Volume Name" required disabled />
|
||||
<x-forms.input id="hostPath" helper="Directory on the host system." label="Source Path"
|
||||
disabled />
|
||||
<x-forms.input id="storage.mount_path" label="Destination Path"
|
||||
<x-forms.input id="mountPath" label="Destination Path"
|
||||
helper="Directory inside the container." required disabled />
|
||||
</div>
|
||||
@else
|
||||
<div class="flex gap-2 items-end w-full">
|
||||
<x-forms.input id="storage.name" required disabled />
|
||||
<x-forms.input id="storage.host_path" disabled />
|
||||
<x-forms.input id="storage.mount_path" required disabled />
|
||||
<x-forms.input id="name" required disabled />
|
||||
<x-forms.input id="hostPath" disabled />
|
||||
<x-forms.input id="mountPath" required disabled />
|
||||
</div>
|
||||
@endif
|
||||
@endcan
|
||||
|
||||
Reference in New Issue
Block a user