@@ -42,6 +42,7 @@ import * as CodeHighlighter from '../../ui/components/code_highlighter/code_high
4242import * as IconButton from '../../ui/components/icon_button/icon_button.js' ;
4343import * as IssueCounter from '../../ui/components/issue_counter/issue_counter.js' ;
4444import * as UI from '../../ui/legacy/legacy.js' ;
45+ import { html , nothing , render } from '../../ui/lit/lit.js' ;
4546import * as VisualLogging from '../../ui/visual_logging/visual_logging.js' ;
4647
4748import * as ElementsComponents from './components/components.js' ;
@@ -71,6 +72,10 @@ const UIStrings = {
7172 *@description Link text content in Elements Tree Outline of the Elements panel
7273 */
7374 reveal : 'reveal' ,
75+ /**
76+ * @description Text for popover that directs to Issues panel
77+ */
78+ viewIssue : 'View Issue:' ,
7479} as const ;
7580const str_ = i18n . i18n . registerUIStrings ( 'panels/elements/ElementsTreeOutline.ts' , UIStrings ) ;
7681const i18nString = i18n . i18n . getLocalizedString . bind ( undefined , str_ ) ;
@@ -106,7 +111,7 @@ export class ElementsTreeOutline extends
106111 #topLayerContainerByParent = new Map < UI . TreeOutline . TreeElement , TopLayerContainer > ( ) ;
107112 #issuesManager?: IssuesManager . IssuesManager . IssuesManager ;
108113 #popupHelper?: UI . PopoverHelper . PopoverHelper ;
109- #nodeElementToIssue = new Map < Element , IssuesManager . Issue . Issue > ( ) ;
114+ #nodeElementToIssues = new Map < Element , IssuesManager . Issue . Issue [ ] > ( ) ;
110115
111116 constructor ( omitRootDOMNode ?: boolean , selectEnabled ?: boolean , hideGutter ?: boolean ) {
112117 super ( ) ;
@@ -194,40 +199,34 @@ export class ElementsTreeOutline extends
194199 return null ;
195200 }
196201
197- const issue = this . #nodeElementToIssue. get ( hoveredNode ) ;
198- if ( ! issue ) {
199- return null ;
200- }
201- const elementIssueDetails = getElementIssueDetails ( issue ) ;
202- if ( ! elementIssueDetails ) {
202+ const issues = this . #nodeElementToIssues. get ( hoveredNode ) ;
203+ if ( ! issues ) {
203204 return null ;
204205 }
205- const issueKindIcon = new IconButton . Icon . Icon ( ) ;
206- issueKindIcon . data = IssueCounter . IssueCounter . getIssueKindIconData ( issue . getKind ( ) ) ;
207- issueKindIcon . style . cursor = 'pointer' ;
208- const viewIssueElement = document . createElement ( 'a' ) ;
209- viewIssueElement . href = '#' ;
210- viewIssueElement . textContent = 'View issue:' ;
211-
212- const issueTitle = document . createElement ( 'span' ) ;
213- issueTitle . textContent = elementIssueDetails . tooltip ;
214-
215- const element = document . createElement ( 'div' ) ;
216- element . appendChild ( issueKindIcon ) ;
217- element . appendChild ( viewIssueElement ) ;
218- element . appendChild ( issueTitle ) ;
219- element . style . display = 'flex' ;
220- element . style . alignItems = 'center' ;
221- element . style . gap = '5px' ;
222206
223207 return {
224208 box : hoveredNode . boxInWindow ( ) ,
225209 show : async ( popover : UI . GlassPane . GlassPane ) => {
226210 popover . setIgnoreLeftMargin ( true ) ;
227- const openIssueEvent = ( ) : Promise < void > => Common . Revealer . reveal ( issue ) ;
228- viewIssueElement . addEventListener ( 'click' , ( ) => openIssueEvent ( ) ) ;
229- issueKindIcon . addEventListener ( 'click' , ( ) => openIssueEvent ( ) ) ;
230- popover . contentElement . appendChild ( element ) ;
211+ // clang-format off
212+ render ( html `
213+ < div class ="squiggles-content ">
214+ ${ issues . map ( issue => {
215+ const elementIssueDetails = getElementIssueDetails ( issue ) ;
216+ if ( ! elementIssueDetails ) {
217+ // This shouldn't happen, but add this if check to pass ts check.
218+ return nothing ;
219+ }
220+ const issueKindIconData = IssueCounter . IssueCounter . getIssueKindIconData ( issue . getKind ( ) ) ;
221+ const openIssueEvent = ( ) : Promise < void > => Common . Revealer . reveal ( issue ) ;
222+ return html `
223+ < div class ="squiggles-content-item ">
224+ < devtools-icon .data =${ issueKindIconData } @click =${ openIssueEvent } > </ devtools-icon >
225+ < x-link class ="link " @click =${ openIssueEvent } > ${ i18nString ( UIStrings . viewIssue ) } </ x-link >
226+ < span > ${ elementIssueDetails . tooltip } </ span >
227+ </ div > ` ; } ) }
228+ </ div > ` , popover . contentElement ) ;
229+ // clang-format on
231230 return true ;
232231 } ,
233232 } ;
@@ -276,7 +275,7 @@ export class ElementsTreeOutline extends
276275 const treeElementNodeElementsToIssue = treeElement . issuesByNodeElement ;
277276 // This element could be the treeElement tags name or an attribute.
278277 for ( const [ element , issue ] of treeElementNodeElementsToIssue ) {
279- this . #nodeElementToIssue . set ( element , issue ) ;
278+ this . #nodeElementToIssues . set ( element , issue ) ;
280279 }
281280 }
282281 }
0 commit comments