Wire ConsolidationModal into QueuePanel slide-out on Reporting page

The multi-select consolidated Jira ticket feature was built into a
standalone page that doesn't exist. This wires it into the actual
QueuePanel slide-out where users work. Adds a '+ Jira (N)' button
to the footer action bar that opens the ConsolidationModal when 2+
items are selected, or the single-item Jira modal for 1 item.
This commit is contained in:
Jordan Ramos
2026-05-22 11:29:09 -06:00
parent 76667f65c6
commit c9f93a2a9b

View File

@@ -8,6 +8,7 @@ import AnomalyBanner from './AnomalyBanner';
import CveTooltip from '../CveTooltip'; import CveTooltip from '../CveTooltip';
import RedirectModal from '../RedirectModal'; import RedirectModal from '../RedirectModal';
import AtlasBadge from '../AtlasBadge'; import AtlasBadge from '../AtlasBadge';
import ConsolidationModal from '../ConsolidationModal';
import AtlasSlideOutPanel from '../AtlasSlideOutPanel'; import AtlasSlideOutPanel from '../AtlasSlideOutPanel';
import AtlasIcon from '../AtlasIcon'; import AtlasIcon from '../AtlasIcon';
@@ -1543,6 +1544,9 @@ function QueuePanel({ open, items, onClose, onUpdate, onDelete, onDeleteMany, on
const [createJiraSaving, setCreateJiraSaving] = useState(false); const [createJiraSaving, setCreateJiraSaving] = useState(false);
const [createJiraSummaryError, setCreateJiraSummaryError] = useState(null); const [createJiraSummaryError, setCreateJiraSummaryError] = useState(null);
// Consolidated Jira ticket modal state (multi-item → 1 ticket)
const [showConsolidationModal, setShowConsolidationModal] = useState(false);
// CARD Asset Search state // CARD Asset Search state
const [assetSearchOpen, setAssetSearchOpen] = useState(false); const [assetSearchOpen, setAssetSearchOpen] = useState(false);
const [assetSearchTeam, setAssetSearchTeam] = useState(''); const [assetSearchTeam, setAssetSearchTeam] = useState('');
@@ -2756,6 +2760,37 @@ function QueuePanel({ open, items, onClose, onUpdate, onDelete, onDeleteMany, on
); );
})()} })()}
{/* Delete selected — only shown when items are selected */} {/* Delete selected — only shown when items are selected */}
{selectedIds.size > 0 && (
<button
onClick={() => {
// Get selected pending items for consolidated Jira ticket
const selectedPendingItems = items.filter(i => selectedIds.has(i.id) && i.status === 'pending');
if (selectedPendingItems.length >= 2) {
setShowConsolidationModal(true);
} else if (selectedPendingItems.length === 1) {
openCreateJiraFromQueue(selectedPendingItems[0]);
}
}}
disabled={(() => {
const selectedPendingItems = items.filter(i => selectedIds.has(i.id) && i.status === 'pending');
return selectedPendingItems.length === 0;
})()}
style={{
flex: 1, padding: '0.45rem',
background: 'rgba(14,165,233,0.1)',
border: '1px solid rgba(14,165,233,0.35)',
borderRadius: '0.375rem',
color: '#0EA5E9',
fontFamily: 'monospace', fontSize: '0.72rem', fontWeight: '600',
cursor: 'pointer',
textTransform: 'uppercase', letterSpacing: '0.05em',
transition: 'all 0.12s',
}}
title={`Create a single Jira ticket from ${selectedIds.size} selected item(s)`}
>
+ Jira ({items.filter(i => selectedIds.has(i.id) && i.status === 'pending').length})
</button>
)}
{selectedIds.size > 0 && ( {selectedIds.size > 0 && (
<button <button
onClick={handleDeleteSelected} onClick={handleDeleteSelected}
@@ -3018,6 +3053,19 @@ function QueuePanel({ open, items, onClose, onUpdate, onDelete, onDeleteMany, on
</div> </div>
</div> </div>
)} )}
{/* Consolidated Jira Ticket modal (multi-item → 1 ticket) */}
{showConsolidationModal && (
<ConsolidationModal
items={items.filter(i => selectedIds.has(i.id) && i.status === 'pending')}
onClose={() => setShowConsolidationModal(false)}
onSuccess={() => {
setShowConsolidationModal(false);
setSelectedIds(new Set());
if (onQueueRefresh) onQueueRefresh();
}}
/>
)}
</> </>
); );
} }