Skip to content

Commit 4796f55

Browse files
committed
Handle Stimulus classes
1 parent d5a89d2 commit 4796f55

File tree

3 files changed

+61
-1
lines changed

3 files changed

+61
-1
lines changed

src/browser_panel/page/stimulus_observer.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ export default class StimulusObserver {
6161
}
6262

6363
buildStimulusElementData(element, identifier) {
64-
const controller = window.Stimulus.getControllerForElementAndIdentifier(element, identifier)
64+
const controller = window.Stimulus?.getControllerForElementAndIdentifier(element, identifier)
6565
return {
6666
id: element.id,
6767
uuid: getUUIDFromElement(element),
@@ -75,6 +75,7 @@ export default class StimulusObserver {
7575
values: this.buildControllerValues(controller),
7676
targets: this.buildControllerTargets(controller),
7777
outlets: this.buildControllerOutlets(controller),
78+
classes: this.buildControllerClasses(controller),
7879
children: [],
7980
element,
8081
}
@@ -139,6 +140,23 @@ export default class StimulusObserver {
139140
})
140141
}
141142

143+
buildControllerClasses(controller) {
144+
if (!controller) return []
145+
146+
const keys = Object.keys(Object.getOwnPropertyDescriptors(Object.getPrototypeOf(controller)))
147+
const classKeys = keys.filter((key) => key.endsWith("Class") && !key.startsWith("has"))
148+
return classKeys.map((classKey) => {
149+
const classes = controller[`has${capitalizeFirstChar(classKey)}`] ? controller[`${classKey}es`] : []
150+
const key = classKey.replace("Class", "")
151+
return {
152+
name: classKey,
153+
key: key,
154+
htmlAttribute: `${controller.classes.getAttributeName(key)}=""`,
155+
classes: Array.from(classes),
156+
}
157+
})
158+
}
159+
142160
getStimulusData() {
143161
const buildStimulusTree = () => {
144162
const root = []

src/browser_panel/panel/tabs/StimulusTab.svelte

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import ValueTreeItem from "$src/components/Stimulus/ValueTreeItem.svelte"
66
import TargetTreeItem from "$src/components/Stimulus/TargetTreeItem.svelte"
77
import OutletTreeItem from "$src/components/Stimulus/OutletTreeItem.svelte"
8+
import ClassTreeItem from "$src/components/Stimulus/ClassTreeItem.svelte"
89
import InspectButton from "$components/InspectButton.svelte"
910
import HTMLRenderer from "$src/browser_panel/HTMLRenderer.svelte"
1011
import ScrollIntoViewButton from "$components/ScrollIntoViewButton.svelte"
@@ -202,6 +203,10 @@
202203
{#each selected.controller.outlets.sort((a, b) => a.elements?.length < b.elements?.length) as outlet (selected.uuid + outlet.name)}
203204
<OutletTreeItem {outlet} {selected} />
204205
{/each}
206+
<div class="pane-section-heading">Classes</div>
207+
{#each selected.controller.classes.sort((a, b) => a.classes?.length < b.classes?.length) as klass (selected.uuid + klass.name)}
208+
<ClassTreeItem {klass} {selected} />
209+
{/each}
205210
</div>
206211
</div>
207212
{:else}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
<script>
2+
import CopyButton from "$components/CopyButton.svelte"
3+
4+
let { klass, selected } = $props()
5+
</script>
6+
7+
<div class="d-flex gap-2 mb-2">
8+
<wa-tree>
9+
<wa-tree-item expanded>
10+
<span class="code-key">{klass.key}</span>
11+
{#if klass.classes.length === 0}
12+
<span class="text-muted">(0)</span>
13+
{:else}
14+
{#each klass.classes as value}
15+
<wa-tree-item>
16+
<div class="d-flex justify-content-between align-items-center">
17+
<span>{value}</span>
18+
<CopyButton {value} />
19+
</div>
20+
</wa-tree-item>
21+
{/each}
22+
{/if}
23+
<wa-button id={`rich-tooltip-${klass.key}`} variant="neutral" appearance="plain" size="small" class="small-icon-button">
24+
<wa-icon name="info" label="Info"></wa-icon>
25+
</wa-button>
26+
</wa-tree-item>
27+
</wa-tree>
28+
29+
<wa-tooltip for={`rich-tooltip-${klass.key}`} trigger="click" style="--max-width: 100%;">
30+
<div>
31+
<div class="d-flex justify-content-between align-items-center">
32+
<span>{klass.htmlAttribute}</span>
33+
<CopyButton value={klass.htmlAttribute} />
34+
</div>
35+
</div>
36+
</wa-tooltip>
37+
</div>

0 commit comments

Comments
 (0)