@@ -3290,69 +3290,35 @@ const toSetupAssistantDisplayText = (value, fallback = '-') => {
32903290 return text || fallback ;
32913291} ;
32923292
3293+ const markSetupAssistantSwalModal = ( ) => {
3294+ setTimeout ( ( ) => {
3295+ $ ( '.sweet-alert:visible' ) . addClass ( 'fv-setup-swal-modal' ) ;
3296+ } , 0 ) ;
3297+ } ;
3298+
32933299const renderSetupAssistantSwalSummaryHtml = ( {
32943300 metaRows = [ ] ,
32953301 detailRows = [ ] ,
32963302 warningLines = [ ] ,
32973303 failureLines = [ ] ,
32983304 footerText = ''
32993305} = { } ) => {
3300- const rowDivider = 'border-bottom:1px solid rgba(148, 170, 196, 0.18);' ;
33013306 const metaHtml = metaRows . length
3302- ? `
3303- <div style="display:flex;flex-wrap:wrap;gap:6px 8px;margin-bottom:10px;">
3304- ${ metaRows . map ( ( row ) => `
3305- <span style="display:inline-flex;align-items:center;padding:3px 8px;border-radius:999px;border:1px solid rgba(148,170,196,0.3);background:rgba(18,28,42,0.72);font-size:12px;line-height:1.2;">
3306- <strong style="margin-right:5px;">${ escapeHtml ( row . label ) } :</strong>${ escapeHtml ( row . value ) }
3307- </span>
3308- ` ) . join ( '' ) }
3309- </div>
3310- `
3307+ ? `<div class="fv-setup-swal-meta">${ metaRows . map ( ( row ) => `<span class="fv-setup-swal-chip"><strong>${ escapeHtml ( row . label ) } :</strong><span>${ escapeHtml ( row . value ) } </span></span>` ) . join ( '' ) } </div>`
33113308 : '' ;
33123309 const detailHtml = detailRows . length
3313- ? `
3314- <div style="border:1px solid rgba(148,170,196,0.28);border-radius:10px;background:rgba(9,16,24,0.74);overflow:hidden;">
3315- ${ detailRows . map ( ( row , index ) => `
3316- <div style="display:flex;align-items:flex-start;justify-content:space-between;gap:14px;padding:7px 10px;${ index < detailRows . length - 1 ? rowDivider : '' } ">
3317- <span style="font-weight:600;color:#d9e5f6;">${ escapeHtml ( row . label ) } </span>
3318- <span style="text-align:right;color:#eaf2ff;">${ escapeHtml ( row . value ) } </span>
3319- </div>
3320- ` ) . join ( '' ) }
3321- </div>
3322- `
3310+ ? `<div class="fv-setup-swal-table">${ detailRows . map ( ( row ) => `<div class="fv-setup-swal-row"><span class="fv-setup-swal-row-label">${ escapeHtml ( row . label ) } </span><span class="fv-setup-swal-row-value">${ escapeHtml ( row . value ) } </span></div>` ) . join ( '' ) } </div>`
33233311 : '' ;
33243312 const warningHtml = warningLines . length
3325- ? `
3326- <div style="margin-top:10px;padding:8px 10px;border-radius:9px;border:1px solid rgba(255,193,94,0.42);background:rgba(255,193,94,0.1);text-align:left;">
3327- <div style="font-weight:700;margin-bottom:4px;color:#ffd494;">Warnings</div>
3328- <ul style="margin:0 0 0 18px;padding:0;line-height:1.35;">
3329- ${ warningLines . map ( ( line ) => `<li style="margin:2px 0;">${ escapeHtml ( line ) } </li>` ) . join ( '' ) }
3330- </ul>
3331- </div>
3332- `
3313+ ? `<div class="fv-setup-swal-listbox is-warning"><div class="fv-setup-swal-list-title">Warnings</div><ul class="fv-setup-swal-list">${ warningLines . map ( ( line ) => `<li>${ escapeHtml ( line ) } </li>` ) . join ( '' ) } </ul></div>`
33333314 : '' ;
33343315 const failureHtml = failureLines . length
3335- ? `
3336- <div style="margin-top:10px;padding:8px 10px;border-radius:9px;border:1px solid rgba(255,116,116,0.48);background:rgba(255,116,116,0.1);text-align:left;">
3337- <div style="font-weight:700;margin-bottom:4px;color:#ffb4b4;">Failed tasks</div>
3338- <ul style="margin:0 0 0 18px;padding:0;line-height:1.35;">
3339- ${ failureLines . map ( ( line ) => `<li style="margin:2px 0;">${ escapeHtml ( line ) } </li>` ) . join ( '' ) }
3340- </ul>
3341- </div>
3342- `
3316+ ? `<div class="fv-setup-swal-listbox is-failure"><div class="fv-setup-swal-list-title">Failed tasks</div><ul class="fv-setup-swal-list">${ failureLines . map ( ( line ) => `<li>${ escapeHtml ( line ) } </li>` ) . join ( '' ) } </ul></div>`
33433317 : '' ;
33443318 const footerHtml = footerText
3345- ? `<div style="margin-top:10px;font-weight:600;color:#d7e6fb; ">${ escapeHtml ( footerText ) } </div>`
3319+ ? `<div class="fv-setup-swal-footer ">${ escapeHtml ( footerText ) } </div>`
33463320 : '' ;
3347- return `
3348- <div style="max-width:560px;margin:0 auto;text-align:left;line-height:1.35;">
3349- ${ metaHtml }
3350- ${ detailHtml }
3351- ${ warningHtml }
3352- ${ failureHtml }
3353- ${ footerHtml }
3354- </div>
3355- ` ;
3321+ return `<div class="fv-setup-swal">${ metaHtml } ${ detailHtml } ${ warningHtml } ${ failureHtml } ${ footerHtml } </div>` ;
33563322} ;
33573323
33583324const buildSetupAssistantVerificationReport = ( importOutcomes , templateOutcomes , ruleOutcomes , validationWarnings = [ ] ) => {
@@ -3642,12 +3608,14 @@ const confirmSetupAssistantApply = async (impactSummary, reviewValidation) => (
36423608 title : setupAssistantState . dryRunOnly ? 'Run setup dry run?' : 'Apply setup assistant changes?' ,
36433609 text : html ,
36443610 html : true ,
3611+ customClass : 'fv-setup-swal-modal' ,
36453612 type : hasDeletes && setupAssistantState . dryRunOnly !== true ? 'warning' : 'info' ,
36463613 showCancelButton : true ,
36473614 confirmButtonText : setupAssistantState . dryRunOnly ? 'Run dry run' : 'Apply now' ,
36483615 cancelButtonText : 'Keep editing' ,
36493616 closeOnConfirm : true
36503617 } , ( isConfirm ) => resolve ( isConfirm === true ) ) ;
3618+ markSetupAssistantSwalModal ( ) ;
36513619 } )
36523620) ;
36533621
@@ -3713,18 +3681,43 @@ const retrySetupAssistantFailures = async (failures = []) => {
37133681 } ;
37143682} ;
37153683
3716- const confirmSetupAssistantUndo = async ( summaryText , canUndo = true ) => (
3684+ const confirmSetupAssistantUndo = async ( summaryPayload , canUndo = true ) => (
37173685 new Promise ( ( resolve ) => {
3686+ const html = typeof summaryPayload === 'string'
3687+ ? renderSetupAssistantSwalSummaryHtml ( {
3688+ detailRows : summaryPayload
3689+ . split ( '\n' )
3690+ . map ( ( line ) => String ( line || '' ) . trim ( ) )
3691+ . filter ( Boolean )
3692+ . map ( ( line ) => {
3693+ const separator = line . indexOf ( ':' ) ;
3694+ if ( separator <= 0 ) {
3695+ return { label : 'Info' , value : line } ;
3696+ }
3697+ return {
3698+ label : line . slice ( 0 , separator ) . trim ( ) ,
3699+ value : line . slice ( separator + 1 ) . trim ( )
3700+ } ;
3701+ } ) ,
3702+ footerText : canUndo ? 'Undo this setup now?' : ''
3703+ } )
3704+ : renderSetupAssistantSwalSummaryHtml ( {
3705+ ...( summaryPayload && typeof summaryPayload === 'object' ? summaryPayload : { } ) ,
3706+ footerText : canUndo ? 'Undo this setup now?' : ''
3707+ } ) ;
37183708 swal ( {
37193709 title : 'Setup assistant complete' ,
3720- text : canUndo ? `${ summaryText } \n\nUndo this setup now?` : summaryText ,
3710+ text : html ,
3711+ html : true ,
3712+ customClass : 'fv-setup-swal-modal' ,
37213713 type : 'success' ,
37223714 showCancelButton : canUndo === true ,
37233715 confirmButtonText : canUndo ? 'Undo setup' : 'Done' ,
37243716 cancelButtonText : 'Done' ,
37253717 showLoaderOnConfirm : canUndo === true ,
37263718 closeOnConfirm : canUndo !== true
37273719 } , ( undoNow ) => resolve ( undoNow === true ) ) ;
3720+ markSetupAssistantSwalModal ( ) ;
37283721 } )
37293722) ;
37303723
@@ -4022,13 +4015,15 @@ const applySetupAssistantPlan = async () => {
40224015 title : 'Setup applied with partial failures' ,
40234016 text : failureSummaryHtml ,
40244017 html : true ,
4018+ customClass : 'fv-setup-swal-modal' ,
40254019 type : 'warning' ,
40264020 showCancelButton : true ,
40274021 confirmButtonText : 'Retry failures' ,
40284022 cancelButtonText : 'Done' ,
40294023 showLoaderOnConfirm : true ,
40304024 closeOnConfirm : false
40314025 } , ( isConfirm ) => resolve ( isConfirm === true ) ) ;
4026+ markSetupAssistantSwalModal ( ) ;
40324027 } ) ;
40334028
40344029 if ( retryNow ) {
@@ -4051,7 +4046,29 @@ const applySetupAssistantPlan = async () => {
40514046 return ;
40524047 }
40534048
4054- const undoNow = await confirmSetupAssistantUndo ( summaryLines . join ( '\n' ) , rollbackCreated ) ;
4049+ const undoNow = await confirmSetupAssistantUndo ( {
4050+ metaRows : [
4051+ { label : 'Mode' , value : toSetupAssistantDisplayText ( setupAssistantState . mode ) } ,
4052+ { label : 'Route' , value : toSetupAssistantDisplayText ( setupAssistantState . route ) } ,
4053+ { label : 'Wizard detail' , value : normalizeSetupAssistantExperienceMode ( setupAssistantState . experienceMode ) } ,
4054+ { label : 'Safety mode' , value : safetyMode }
4055+ ] ,
4056+ detailRows : [
4057+ { label : 'Profile defaults' , value : setupAssistantState . applyProfileDefaults ? setupAssistantState . profile : 'not applied' } ,
4058+ { label : 'Environment defaults' , value : setupAssistantState . applyEnvironmentDefaults ? ( SETUP_ASSISTANT_ENV_PRESETS [ setupAssistantState . environmentPreset ] ?. label || 'Home Lab' ) : 'not applied' } ,
4059+ { label : 'Docker imports' , value : `${ importOutcomes . docker } ` } ,
4060+ { label : 'VM imports' , value : `${ importOutcomes . vm } ` } ,
4061+ { label : 'Docker starter folders' , value : `${ templateOutcomes . docker . created } created, ${ templateOutcomes . docker . skippedExisting } skipped, ${ Number ( templateOutcomes . docker . assignment ?. matched ) || 0 } auto-assigned` } ,
4062+ { label : 'VM starter folders' , value : `${ templateOutcomes . vm . created } created, ${ templateOutcomes . vm . skippedExisting } skipped, ${ Number ( templateOutcomes . vm . assignment ?. matched ) || 0 } auto-assigned` } ,
4063+ { label : 'Docker starter rules' , value : `${ ruleOutcomes . docker . created } added` } ,
4064+ { label : 'VM starter rules' , value : `${ ruleOutcomes . vm . created } added` } ,
4065+ { label : 'Preference changes' , value : `${ impactSummary . prefs . totalChanges } ` } ,
4066+ { label : 'Verification' , value : `${ verification . passed } /${ verification . total } checks passed` } ,
4067+ { label : 'Rollback checkpoint' , value : setupAssistantState . rollbackCheckpointName || ( rollbackCreated ? 'created' : 'skipped (Fast mode)' ) } ,
4068+ { label : 'Duration' , value : `${ durationSeconds } s` }
4069+ ] ,
4070+ warningLines : validationWarnings . slice ( 0 , 5 )
4071+ } , rollbackCreated ) ;
40554072 if ( ! undoNow || ! rollbackCreated ) {
40564073 return ;
40574074 }
0 commit comments