2023-05-16 11:11:05 +00:00
< div >
2023-05-30 13:52:17 +00:00
< livewire : project . application . preview . form : application = " $application " />
2024-02-11 16:29:14 +00:00
@ if ( count ( $application -> additional_servers ) > 0 )
< div class = " pb-4 " > Previews will be deployed on < span
2024-03-25 09:41:44 +00:00
class = " dark:text-warning " > {{ $application -> destination -> server -> name }} </ span >.</ div >
2024-02-11 16:29:14 +00:00
@ endif
2023-05-30 13:52:17 +00:00
< div >
2024-01-29 09:43:18 +00:00
@ if ( $application -> is_github_based ())
< div class = " flex items-center gap-2 " >
2025-08-26 08:27:31 +00:00
@ can ( 'update' , $application )
< h3 > Pull Requests on Git </ h3 >
< x - forms . button wire : click = " load_prs " > Load Pull Requests
</ x - forms . button >
@ endcan
2024-01-29 09:43:18 +00:00
</ div >
@ endif
2023-05-30 13:52:17 +00:00
@ isset ( $rate_limit_remaining )
2025-07-14 12:53:34 +00:00
< div class = " pt-1 pb-4 " > Requests remaining till rate limited by Git : {{ $rate_limit_remaining }} </ div >
2023-05-30 13:52:17 +00:00
@ endisset
2024-03-19 10:05:02 +00:00
< div wire : loading . remove wire : target = 'load_prs' >
@ if ( $pull_requests -> count () > 0 )
2023-06-05 10:07:55 +00:00
< div class = " overflow-x-auto table-md " >
2023-06-12 19:12:07 +00:00
< table >
2023-06-05 10:07:55 +00:00
< thead >
2023-06-12 19:12:07 +00:00
< tr >
2023-06-05 10:07:55 +00:00
< th > PR Number </ th >
< th > PR Title </ th >
< th > Git </ th >
< th > Actions </ th >
</ tr >
</ thead >
< tbody >
@ foreach ( $pull_requests as $pull_request )
2023-06-12 19:12:07 +00:00
< tr >
2023-06-05 10:07:55 +00:00
< th > {{ data_get ( $pull_request , 'number' ) }} </ th >
< td > {{ data_get ( $pull_request , 'title' ) }} </ td >
< td >
< a target = " _blank " class = " text-xs "
href = " { { data_get( $pull_request , 'html_url') }} " > Open PR on
Git
< x - external - link />
</ a >
</ td >
2024-05-30 10:28:29 +00:00
< td class = " flex flex-col gap-1 md:flex-row " >
2025-08-26 08:27:31 +00:00
@ can ( 'update' , $application )
< x - forms . button
wire : click = " add(' { { data_get( $pull_request , 'number') }}', ' { { data_get( $pull_request , 'html_url') }}') " >
Configure
</ x - forms . button >
@ endcan
@ can ( 'deploy' , $application )
< x - forms . button
wire : click = " add_and_deploy(' { { data_get( $pull_request , 'number') }}', ' { { data_get( $pull_request , 'html_url') }}') " >
< svg xmlns = " http://www.w3.org/2000/svg " class = " w-5 h-5 dark:text-warning "
viewBox = " 0 0 24 24 " stroke - width = " 1.5 " stroke = " currentColor "
fill = " none " stroke - linecap = " round " stroke - linejoin = " round " >
< path stroke = " none " d = " M0 0h24v24H0z " fill = " none " />
< path d = " M7 4v16l13 -8z " />
</ svg > Deploy
</ x - forms . button >
@ endcan
2023-06-05 10:07:55 +00:00
</ td >
</ tr >
@ endforeach
</ tbody >
</ table >
</ div >
2024-03-19 10:05:02 +00:00
@ endif
</ div >
2023-05-16 12:11:55 +00:00
</ div >
2023-05-30 13:52:17 +00:00
@ if ( $application -> previews -> count () > 0 )
2024-06-05 13:32:56 +00:00
< h3 class = " py-4 " > Deployments </ h3 >
2024-05-30 10:28:29 +00:00
< div class = " flex flex-wrap w-full gap-4 " >
@ foreach ( data_get ( $application , 'previews' ) as $previewName => $preview )
2025-08-17 13:34:41 +00:00
< div class = " flex flex-col w-full p-4 border dark:border-coolgray-200 "
wire : key = " preview-container- { { $preview->pull_request_id }} " >
2023-06-05 10:07:55 +00:00
< div class = " flex gap-2 " > PR #{{ data_get($preview, 'pull_request_id') }} |
2024-06-25 08:37:10 +00:00
@ if ( str ( data_get ( $preview , 'status' )) -> startsWith ( 'running' ))
2023-10-01 10:02:44 +00:00
< x - status . running : status = " data_get( $preview , 'status') " />
2024-06-25 08:37:10 +00:00
@ elseif ( str ( data_get ( $preview , 'status' )) -> startsWith ( 'restarting' ))
2023-10-01 10:02:44 +00:00
< x - status . restarting : status = " data_get( $preview , 'status') " />
2023-06-05 10:07:55 +00:00
@ else
2023-10-01 10:02:44 +00:00
< x - status . stopped : status = " data_get( $preview , 'status') " />
2023-06-05 10:07:55 +00:00
@ endif
2023-05-30 13:52:17 +00:00
@ if ( data_get ( $preview , 'status' ) !== 'exited' )
| < a target = " _blank " href = " { { data_get( $preview , 'fqdn') }} " > Open Preview
< x - external - link />
</ a >
@ endif
2023-05-31 08:19:29 +00:00
|
2023-12-07 18:06:32 +00:00
< a target = " _blank " href = " { { data_get( $preview , 'pull_request_html_url') }} " > Open
PR on Git
2023-05-31 08:19:29 +00:00
< x - external - link />
</ a >
2025-08-17 13:34:41 +00:00
@ if ( count ( $parameters ) > 0 )
|
< a
href = " { { route('project.application.deployment.index', [... $parameters , 'pull_request_id' => data_get( $preview , 'pull_request_id')]) }} " >
Deployment Logs
</ a >
|
< a
href = " { { route('project.application.logs', [... $parameters , 'pull_request_id' => data_get( $preview , 'pull_request_id')]) }} " >
Application Logs
</ a >
@ endif
2023-05-30 13:52:17 +00:00
</ div >
2024-06-05 13:14:44 +00:00
@ if ( $application -> build_pack === 'dockercompose' )
< div class = " flex flex-col gap-4 pt-4 " >
2024-06-05 13:29:00 +00:00
@ if ( collect ( json_decode ( $preview -> docker_compose_domains )) -> count () === 0 )
< form wire : submit = " save_preview(' { { $preview->id }}') "
class = " flex items-end gap-2 pt-4 " >
< x - forms . input label = " Domain " helper = " One domain per preview. "
2025-08-26 08:27:31 +00:00
id = " application.previews. { { $previewName }}.fqdn " canGate = " update " : canResource = " $application " ></ x - forms . input >
@ can ( 'update' , $application )
< x - forms . button type = " submit " > Save </ x - forms . button >
< x - forms . button wire : click = " generate_preview(' { { $preview->id }}') " > Generate
Domain </ x - forms . button >
@ endcan
2024-06-05 13:29:00 +00:00
</ form >
@ else
@ foreach ( collect ( json_decode ( $preview -> docker_compose_domains )) as $serviceName => $service )
2025-08-17 13:34:41 +00:00
< livewire : project . application . previews - compose
wire : key = " preview- { { $preview->pull_request_id }}- { { $serviceName }} "
2024-06-05 13:29:00 +00:00
: service = " $service " : serviceName = " $serviceName " : preview = " $preview " />
@ endforeach
@ endif
2024-06-05 13:14:44 +00:00
</ div >
@ else
< form wire : submit = " save_preview(' { { $preview->id }}') " class = " flex items-end gap-2 pt-4 " >
< x - forms . input label = " Domain " helper = " One domain per preview. "
2025-08-26 08:27:31 +00:00
id = " application.previews. { { $previewName }}.fqdn " canGate = " update " : canResource = " $application " ></ x - forms . input >
@ can ( 'update' , $application )
< x - forms . button type = " submit " > Save </ x - forms . button >
< x - forms . button wire : click = " generate_preview(' { { $preview->id }}') " > Generate
Domain </ x - forms . button >
@ endcan
2024-06-05 13:14:44 +00:00
</ form >
@ endif
2025-08-17 13:34:41 +00:00
< div class = " flex flex-col xl:flex-row xl:items-center gap-2 pt-6 " >
2024-05-30 10:28:29 +00:00
< div class = " flex-1 " ></ div >
2025-08-26 08:27:31 +00:00
@ can ( 'deploy' , $application )
< x - forms . button
wire : click = " force_deploy_without_cache( { { data_get( $preview , 'pull_request_id') }}) " >
< svg xmlns = " http://www.w3.org/2000/svg " class = " w-5 h-5 " viewBox = " 0 0 24 24 "
stroke - width = " 1.5 " stroke = " currentColor " fill = " none " stroke - linecap = " round "
stroke - linejoin = " round " >
2024-06-05 13:14:44 +00:00
< path stroke = " none " d = " M0 0h24v24H0z " fill = " none " />
< path
2025-08-26 08:27:31 +00:00
d = " M12.983 8.978c3.955 -.182 7.017 -1.446 7.017 -2.978c0 -1.657 -3.582 -3 -8 -3c-1.661 0 -3.204 .19 -4.483 .515m-2.783 1.228c-.471 .382 -.734 .808 -.734 1.257c0 1.22 1.944 2.271 4.734 2.74 " />
< path
d = " M4 6v6c0 1.657 3.582 3 8 3c.986 0 1.93 -.067 2.802 -.19m3.187 -.82c1.251 -.53 2.011 -1.228 2.011 -1.99v-6 " />
< path d = " M4 12v6c0 1.657 3.582 3 8 3c3.217 0 5.991 -.712 7.261 -1.74m.739 -3.26v-4 " />
< path d = " M3 3l18 18 " />
</ svg >
Force deploy ( without
cache )
</ x - forms . button >
< x - forms . button wire : click = " deploy( { { data_get( $preview , 'pull_request_id') }}) " >
@ if ( data_get ( $preview , 'status' ) === 'exited' )
< svg xmlns = " http://www.w3.org/2000/svg " class = " w-5 h-5 dark:text-warning "
viewBox = " 0 0 24 24 " stroke - width = " 1.5 " stroke = " currentColor " fill = " none "
stroke - linecap = " round " stroke - linejoin = " round " >
< path stroke = " none " d = " M0 0h24v24H0z " fill = " none " />
< path d = " M7 4v16l13 -8z " />
</ svg >
Deploy
@ else
< svg xmlns = " http://www.w3.org/2000/svg " class = " w-5 h-5 dark:text-orange-400 "
2024-05-30 10:28:29 +00:00
viewBox = " 0 0 24 24 " stroke - width = " 2 " stroke = " currentColor " fill = " none "
stroke - linecap = " round " stroke - linejoin = " round " >
< path stroke = " none " d = " M0 0h24v24H0z " fill = " none " ></ path >
< path
2025-08-26 08:27:31 +00:00
d = " M10.09 4.01l.496 -.495a2 2 0 0 1 2.828 0l7.071 7.07a2 2 0 0 1 0 2.83l-7.07 7.07a2 2 0 0 1 -2.83 0l-7.07 -7.07a2 2 0 0 1 0 -2.83l3.535 -3.535h-3.988 " >
2024-05-30 10:28:29 +00:00
</ path >
2025-08-26 08:27:31 +00:00
< path d = " M7.05 11.038v-3.988 " ></ path >
</ svg > Redeploy
@ endif
</ x - forms . button >
@ endcan
@ if ( data_get ( $preview , 'status' ) !== 'exited' )
@ can ( 'deploy' , $application )
< x - modal - confirmation title = " Confirm Preview Deployment Stopping? " buttonTitle = " Stop "
submitAction = " stop( { { data_get( $preview , 'pull_request_id') }}) " : actions = " [
'This preview deployment will be stopped.' ,
'If the preview deployment is currently in use data could be lost.' ,
'All non-persistent data of this preview deployment (containers, networks, unused images) will be deleted (don\'t worry, no data is lost and you can start the preview deployment again).' ,
] "
: confirmWithText = " false " : confirmWithPassword = " false " step2ButtonText = " Stop Preview Deployment " >
< x - slot : customButton >
< svg xmlns = " http://www.w3.org/2000/svg " class = " w-5 h-5 text-error "
viewBox = " 0 0 24 24 " stroke - width = " 2 " stroke = " currentColor " fill = " none "
stroke - linecap = " round " stroke - linejoin = " round " >
< path stroke = " none " d = " M0 0h24v24H0z " fill = " none " ></ path >
< path
d = " M6 5m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z " >
</ path >
< path
d = " M14 5m0 1a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1v12a1 1 0 0 1 -1 1h-2a1 1 0 0 1 -1 -1z " >
</ path >
</ svg >
Stop
</ x - slot : customButton >
</ x - modal - confirmation >
@ endcan
2024-05-30 10:28:29 +00:00
@ endif
2025-08-26 08:27:31 +00:00
@ can ( 'delete' , $application )
< x - modal - confirmation title = " Confirm Preview Deployment Deletion? " buttonTitle = " Delete "
isErrorButton submitAction = " delete( { { data_get( $preview , 'pull_request_id') }}) "
: actions = " [
'All containers of this preview deployment will be stopped and permanently deleted.' ,
] " confirmationText= " {{ data_get ( $preview , 'fqdn' ) . '/' }} "
confirmationLabel = " Please confirm the execution of the actions by entering the Preview Deployment name below "
shortConfirmationLabel = " Preview Deployment Name " : confirmWithPassword = " false " />
@ endcan
2023-05-30 13:52:17 +00:00
</ div >
</ div >
@ endforeach
</ div >
@ endif
2025-08-28 08:52:41 +00:00
< x - domain - conflict - modal
: conflicts = " $domainConflicts "
: showModal = " $showDomainConflictModal "
confirmAction = " confirmDomainUsage " >
The preview deployment domain is already in use by other resources . Using the same domain for multiple resources can cause routing conflicts and unpredictable behavior .
< x - slot : consequences >
< ul class = " mt-2 ml-4 list-disc " >
< li > The preview deployment may not be accessible </ li >
< li > Conflicts with production or other preview deployments </ li >
< li > SSL certificates might not work correctly </ li >
< li > Unpredictable routing behavior </ li >
</ ul >
</ x - slot : consequences >
</ x - domain - conflict - modal >
2023-05-16 11:11:05 +00:00
</ div >