Update form Sumary
This commit is contained in:
parent
36a67c5b2d
commit
4bc27938be
|
|
@ -1958,14 +1958,48 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
const skipReason = this.config.reasonSkipPhysical || snapshot?.reason || ''
|
||||
const isSkipped = typeof skipReason === 'string' && skipReason.trim().length > 0
|
||||
|
||||
const verdictPass = missing.length === 0 && !isSkipped
|
||||
const verdictLabel = verdictPass ? 'PASSED' : 'NEEDS REVIEW'
|
||||
const verdictMsg = verdictPass
|
||||
? 'All tests passed — Ready for deployment'
|
||||
: 'Issues detected — review required before deployment'
|
||||
const verdictBg = verdictPass ? '#ecfdf5' : '#fef2f2'
|
||||
const verdictBd = verdictPass ? '#a7f3d0' : '#fecaca'
|
||||
const verdictTx = verdictPass ? '#065f46' : '#991b1b'
|
||||
const aiIssue = issues.length > 0 ? issues.join('\n') : ''
|
||||
let summaryStatus = 'PASS'
|
||||
const match = aiIssue.match(/^RESULT:\s*(PASS WITH WARNING|PASS|FAIL|INSUFFICIENT DATA)/im)
|
||||
if (match) {
|
||||
const status = match[1]
|
||||
summaryStatus = status
|
||||
}
|
||||
|
||||
// Verdict based on both physical tests & AI analysis
|
||||
const physicalPass = missing.length === 0 && !isSkipped
|
||||
const aiPass = summaryStatus === 'PASS' || summaryStatus === 'PASS WITH WARNING'
|
||||
const verdictPass = physicalPass && aiPass
|
||||
|
||||
// Determine verdict status & messaging based on failures
|
||||
let verdictLabel = 'PASSED'
|
||||
let verdictMsg = 'All tests passed'
|
||||
let verdictBg = '#ecfdf5'
|
||||
let verdictBd = '#a7f3d0'
|
||||
let verdictTx = '#065f46'
|
||||
|
||||
if (!physicalPass && !aiPass) {
|
||||
verdictLabel = 'CRITICAL ISSUES'
|
||||
verdictMsg = 'Physical failures + AI detected problems'
|
||||
verdictBg = '#fef2f2'
|
||||
verdictBd = '#fecaca'
|
||||
verdictTx = '#991b1b'
|
||||
} else if (!physicalPass) {
|
||||
verdictLabel = 'PHYSICAL INCOMPLETE'
|
||||
verdictMsg = `${missing.length} port(s) untested${isSkipped ? ' — testing skipped' : ''}`
|
||||
verdictBg = '#fef2f2'
|
||||
verdictBd = '#fecaca'
|
||||
verdictTx = '#991b1b'
|
||||
} else if (!aiPass) {
|
||||
verdictLabel = `AI: ${summaryStatus}`
|
||||
verdictMsg =
|
||||
summaryStatus === 'FAIL'
|
||||
? 'AI analysis failed — review required'
|
||||
: 'AI detected warnings — verify results'
|
||||
verdictBg = summaryStatus === 'FAIL' ? '#fef2f2' : '#fffbeb'
|
||||
verdictBd = summaryStatus === 'FAIL' ? '#fecaca' : '#fde68a'
|
||||
verdictTx = summaryStatus === 'FAIL' ? '#991b1b' : '#92400e'
|
||||
}
|
||||
|
||||
const reportId = `RPT-${momentTZ().tz(timeZone).format('YYYY-MMDD')}`
|
||||
const reportDate = momentTZ().tz(timeZone).format('DD MMM YYYY')
|
||||
|
|
@ -1995,7 +2029,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
.slice(0, 1)
|
||||
.map(
|
||||
(issue) =>
|
||||
`<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#f5f3ff;border:1px solid #c4b5fd;border-radius:6px;margin-bottom:5px;border-collapse:separate;"><tr><td style="padding:7px 12px;font-size:12px;color:#5f6978;font-weight:500;"><span style="display:inline-block;background:#7c3aed;color:#fff;font-size:9px;font-weight:700;letter-spacing:.5px;padding:2px 6px;border-radius:4px;vertical-align:middle;">★ AI</span><span style="margin-left:8px;vertical-align:middle;">${escapeHtml(issue)}</span></td><td align="right" style="padding:7px 12px;width:90px;"><span style="display:inline-block;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;">Investigate</span></td></tr></table>`
|
||||
`<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#f5f3ff;border:1px solid #c4b5fd;border-radius:6px;margin-bottom:5px;border-collapse:separate;"><tr><td style="padding:7px 12px;font-size:12px;color:#5f6978;font-weight:500;"><span style="display:inline-block;background:#7c3aed;color:#fff;font-size:9px;font-weight:700;letter-spacing:.5px;padding:2px 6px;border-radius:4px;vertical-align:middle;">★ AI</span><span style="margin-left:8px;vertical-align:middle;">${escapeHtml(issue)}</span></td><td align="right" style="padding:7px 12px;width:90px;"></td></tr></table>`
|
||||
)
|
||||
.join('')
|
||||
: `<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#f5f3ff;border:1px solid #c4b5fd;border-radius:6px;margin-bottom:5px;border-collapse:separate;"><tr><td style="padding:7px 12px;font-size:12px;color:#5f6978;font-weight:500;"><span style="display:inline-block;background:#7c3aed;color:#fff;font-size:9px;font-weight:700;letter-spacing:.5px;padding:2px 6px;border-radius:4px;vertical-align:middle;">★ AI</span><span style="margin-left:8px;vertical-align:middle;">Potential intermittent power instability. PSU #1 POST logs show 3 retries before handshake.</span></td><td align="right" style="padding:7px 12px;width:90px;"><span style="display:inline-block;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;">Investigate</span></td></tr></table>`
|
||||
|
|
@ -2096,7 +2130,6 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
</table>
|
||||
</td>
|
||||
<td align="right" style="vertical-align:middle;">
|
||||
<span style="font-size:12px;font-weight:700;color:#3b82f6;font-family:'Courier New',monospace;display:block;">#${escapeHtml(reportId)}</span>
|
||||
<span style="font-size:11px;color:#9ca3af;">${escapeHtml(reportDate)}</span>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -2121,24 +2154,20 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
<table cellpadding="0" cellspacing="0" border="0" width="100%">
|
||||
<tr>
|
||||
<td width="50%" valign="top" style="padding-right:5px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" height="265px" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate; font-size:14px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" height="170px" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate; font-size:14px;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:#9ca3af;padding-bottom:7px;border-bottom:1px solid #f0f1f3;margin-bottom:8px;">Product Info</div>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%">
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;width:68px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">Name</td><td style="padding:3px 0;font-weight:500;vertical-align:top;font-size:14px;"><strong>${productName}</strong></td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">P/N</td><td style="padding:3px 0;font-weight:500;vertical-align:top;font-size:12px;"><strong>${productPN}</strong></td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">S/N</td><td style="padding:3px 0;font-weight:500;vertical-align:top;font-size:12px;"><strong>${productSN}</strong></td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">MAC</td><td style="padding:3px 0;font-weight:500;vertical-align:top;font-size:12px;">${macAddress}</td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">Type</td><td style="padding:3px 0;vertical-align:top;font-weight:500;font-size:12px;">-<span style="display:none;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;">-</span></td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">Cond.</td><td style="padding:3px 0;vertical-align:top;font-weight:500;font-size:12px;">-<span style="display:none;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0;">-</span></td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">Supplier</td><td style="padding:3px 0;vertical-align:top;font-weight:500;font-size:12px;">-</td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">Warranty</td><td style="padding:3px 0;vertical-align:top;font-weight:500;font-size:12px;">-</td></tr>
|
||||
<tr><td style="font-size:10px;font-weight:600;color:#9ca3af;text-transform:uppercase;letter-spacing:.4px;padding:3px 8px 3px 0;white-space:nowrap;vertical-align:top;">MAC</td><td style="padding:3px 0;font-weight:500;vertical-align:top;font-size:12px;">${macAddress || '-'}</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td>
|
||||
<td width="50%" valign="top" style="padding-left:5px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" height="265px" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" height="170px" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:#9ca3af;padding-bottom:7px;border-bottom:1px solid #f0f1f3;margin-bottom:8px;">Technical Specs</div>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="font-size:11px;">
|
||||
|
|
@ -2150,32 +2179,17 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
<tr>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:600;color:#5f6978;">IOS-XE Version</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:700;font-family:Consolas,monospace;">${iosVersion}</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;">-</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;font-style:italic;">${'N/A'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:600;color:#5f6978;">System RAM</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:700;font-family:Consolas,monospace;">${memDisplay}</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;">${configRam?.ram || '-'}</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace; font-style:${configRam?.ram ? 'normal' : 'italic'};">${configRam?.ram || 'N/A'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:600;color:#5f6978;">Flash Storage</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:700;font-family:Consolas,monospace;">${flashDisplay}</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;">${configRam?.flash || '-'}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:600;color:#5f6978;">Uplink Module</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:700;font-family:Consolas,monospace;">-</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-style:italic;color:#cbd5e1;font-family:Consolas,monospace;">-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:600;color:#5f6978;">PSU Model</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:700;font-family:Consolas,monospace;">-</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;">-</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td style="padding:6px 0;font-weight:600;color:#5f6978;">PoE Budget</td>
|
||||
<td style="padding:6px 0;font-weight:700;font-family:Consolas,monospace;">-</td>
|
||||
<td style="padding:6px 0;font-weight:500;color:#9ca3af;font-family:Consolas,monospace;">-</td>
|
||||
<td style="padding:6px 0;border-bottom:1px dashed #f0f1f3;font-weight:500;color:#9ca3af;font-family:Consolas,monospace; font-style:${configRam?.flash ? 'normal' : 'italic'};">${configRam?.flash || 'N/A'}</td>
|
||||
</tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
|
@ -2191,25 +2205,12 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
<tr><td style="padding:16px 20px;">
|
||||
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:#9ca3af;padding-bottom:7px;border-bottom:1px solid #f0f1f3;margin-bottom:10px;">Issues Found</div>
|
||||
${aiIssueRowsHtml}
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#fffbeb;border:1px solid #fde68a;border-radius:6px;margin-bottom:5px;border-collapse:separate;">
|
||||
<tr>
|
||||
<td style="padding:7px 12px;font-size:12px;color:#5f6978;font-weight:500;"><span style="display:inline-block;font-size:9px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;padding:2px 6px;border-radius:4px;background:#fef3c7;color:#92400e;vertical-align:middle;">COSMETIC</span><span style="margin-left:8px;vertical-align:middle;">Minor scratch on top chassis (2cm) — non-functional</span></td>
|
||||
<td align="right" style="padding:7px 12px;width:90px;"><span style="display:inline-block;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#ecfdf5;color:#065f46;border:1px solid #a7f3d0;">Accepted</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#fffbeb;border:1px solid #fde68a;border-radius:6px;margin-bottom:6px;border-collapse:separate;">
|
||||
<tr>
|
||||
<td style="padding:7px 12px;font-size:12px;color:#5f6978;font-weight:500;"><span style="display:inline-block;font-size:9px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;padding:2px 6px;border-radius:4px;background:#ffedd5;color:#9a3412;vertical-align:middle;">MINOR</span><span style="margin-left:8px;vertical-align:middle;">Fan #2 at 48dB under stress (spec 45dB) — within rack tolerance</span></td>
|
||||
<td align="right" style="padding:7px 12px;width:90px;"><span style="display:inline-block;padding:1px 7px;border-radius:50px;font-size:11px;font-weight:600;background:#eff6ff;color:#1d4ed8;border:1px solid #bfdbfe;">Monitor</span></td>
|
||||
</tr>
|
||||
</table>
|
||||
<div style="text-align:center;font-size:11px;color:#9ca3af;padding-top:6px;border-top:1px solid #f0f1f3;"><b>0</b> Critical · <b>0</b> Major · <b>1</b> Minor · <b>1</b> Cosmetic</div>
|
||||
</td></tr>
|
||||
</td></tr>
|
||||
</table>
|
||||
</td></tr>
|
||||
|
||||
<!-- Receiving & Inspection Notes -->
|
||||
<tr><td style="padding-bottom:10px;">
|
||||
<tr><td style="display: none; padding-bottom:10px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<div style="font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.8px;color:#9ca3af;padding-bottom:7px;border-bottom:1px solid #f0f1f3;margin-bottom:10px;">Receiving & Inspection Notes</div>
|
||||
|
|
@ -2254,7 +2255,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
<div style="display:inline-block;width:26px;height:26px;background:#fff;border:2px solid #10b981;border-radius:50%;color:#10b981;font-size:14px;font-weight:800;line-height:22px;text-align:center;margin-top:-14px;margin-bottom:8px;">
|
||||
✓
|
||||
</div>
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;">
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;letter-spacing:0.5px;">
|
||||
Received
|
||||
</div>
|
||||
<div style="font-size:11px;font-weight:600;color:#1a1d23;">
|
||||
|
|
@ -2269,7 +2270,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
<div style="display:inline-block;width:26px;height:26px;background:#fff;border:2px solid #10b981;border-radius:50%;color:#10b981;font-size:14px;font-weight:800;line-height:22px;text-align:center;margin-top:-14px;margin-bottom:8px;">
|
||||
✓
|
||||
</div>
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;">
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;letter-spacing:0.5px;">
|
||||
Software Test
|
||||
</div>
|
||||
<div style="font-size:11px;font-weight:600;color:#1a1d23;">
|
||||
|
|
@ -2285,7 +2286,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
✓
|
||||
</div>
|
||||
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;">
|
||||
<div style="font-size:10px;font-weight:700;text-transform:uppercase;color:#5f6978;margin-bottom:2px;letter-spacing:0.5px;">
|
||||
Physical Check
|
||||
</div>
|
||||
<div style="font-size:11px;font-weight:600;color:#1a1d23;">
|
||||
|
|
@ -2313,7 +2314,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
</td></tr>
|
||||
|
||||
<!-- Physical Check section -->
|
||||
<tr><td style="padding-bottom:10px;">
|
||||
<tr><td style="display: none; padding-bottom:10px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#fff;border:1px solid #e5e7eb;border-radius:10px;border-collapse:separate;">
|
||||
<tr><td style="padding:16px 20px;">
|
||||
<table cellpadding="0" cellspacing="0" border="0" width="100%" style="background:#f0fdf4;border:1px solid #bbf7d0;border-radius:6px;margin-bottom:12px;border-collapse:separate;">
|
||||
|
|
@ -2370,7 +2371,7 @@ Ports Missing/Down: ${missing.length}\n\n`
|
|||
this.config?.inventory?.listInventory
|
||||
?.map(
|
||||
(item: any) => `
|
||||
<tr><td style="padding:2px 0;border-bottom:1px solid #f0f1f3;font-weight:600;color:#5f6978;">${item.pid}</td><td style="padding:2px 0;border-bottom:1px solid #f0f1f3;font-family:Consolas,monospace;color:#9ca3af;text-align:right;">${item.sn}</td></tr>`
|
||||
<tr><td style="margin-top:4px;padding:4px 0;border-bottom:1px solid #f0f1f3;font-weight:600;color:#5f6978;">${item.pid}</td><td style="padding:2px 0;border-bottom:1px solid #f0f1f3;font-family:Consolas,monospace;color:#9ca3af;text-align:right;">${item.sn}</td></tr>`
|
||||
)
|
||||
.join('') || ''
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,7 +96,7 @@ export default function ModalConfig({ opened, onClose, onSave }: Props) {
|
|||
}
|
||||
setIsDisabled(true);
|
||||
try {
|
||||
const url = editingId ? "/api/prompt-ai/update" : "/api/prompt-ai/create";
|
||||
const url = editingId ? "api/prompt-ai/update" : "api/prompt-ai/create";
|
||||
const payload = editingId ? { id: editingId, ...formData } : formData;
|
||||
|
||||
const response = await axios.post(apiUrl + url, payload);
|
||||
|
|
@ -114,6 +114,7 @@ export default function ModalConfig({ opened, onClose, onSave }: Props) {
|
|||
setEditingId(null);
|
||||
fetchPrompts();
|
||||
setIsDisabled(false);
|
||||
setModalEditing(false);
|
||||
} else {
|
||||
notifications.show({
|
||||
title: "Error",
|
||||
|
|
|
|||
Loading…
Reference in New Issue