Skip to content

Commit 7e9a67d

Browse files
committed
refactor(nav-drawer): Use SlotController and code clean-up
1 parent f791738 commit 7e9a67d

File tree

2 files changed

+27
-39
lines changed

2 files changed

+27
-39
lines changed

src/components/nav-drawer/nav-drawer-item.ts

Lines changed: 17 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,7 @@
11
import { html, LitElement } from 'lit';
2-
import {
3-
property,
4-
queryAssignedElements,
5-
queryAssignedNodes,
6-
state,
7-
} from 'lit/decorators.js';
8-
2+
import { property, state } from 'lit/decorators.js';
93
import { addThemingController } from '../../theming/theming-controller.js';
4+
import { addSlotController, setSlots } from '../common/controllers/slot.js';
105
import { registerComponent } from '../common/definitions/register.js';
116
import { partMap } from '../common/part-map.js';
127
import { styles } from './themes/item.base.css.js';
@@ -30,10 +25,18 @@ export default class IgcNavDrawerItemComponent extends LitElement {
3025
public static override styles = [styles, shared];
3126

3227
/* blazorSuppress */
33-
public static register() {
28+
public static register(): void {
3429
registerComponent(IgcNavDrawerItemComponent);
3530
}
3631

32+
private readonly _slots = addSlotController(this, {
33+
slots: setSlots('content', 'icon'),
34+
onChange: this._handleSlotChange,
35+
});
36+
37+
@state()
38+
private _hasContent = true;
39+
3740
/**
3841
* Determines whether the drawer is disabled.
3942
* @attr
@@ -48,33 +51,21 @@ export default class IgcNavDrawerItemComponent extends LitElement {
4851
@property({ type: Boolean, reflect: true })
4952
public active = false;
5053

51-
@state()
52-
private _textLength!: number;
53-
54-
@queryAssignedElements({ slot: 'content' })
55-
private _text!: Array<HTMLElement>;
56-
57-
@queryAssignedNodes({ slot: 'icon', flatten: true })
58-
protected navdrawerIcon!: Array<Node>;
59-
6054
constructor() {
6155
super();
6256
addThemingController(this, all);
6357
}
6458

65-
protected override createRenderRoot() {
66-
const root = super.createRenderRoot();
67-
root.addEventListener('slotchange', () => {
68-
this._textLength = this._text.length;
69-
});
70-
71-
return root;
59+
protected _handleSlotChange(): void {
60+
this._hasContent = this._slots.hasAssignedElements('content');
7261
}
7362

7463
protected override render() {
64+
const hasNoIcon = !this._slots.hasAssignedNodes('icon', true);
65+
7566
return html`
76-
<div part=${partMap({ base: true, mini: this._textLength < 1 })}>
77-
<span part="icon" .hidden="${this.navdrawerIcon.length === 0}">
67+
<div part=${partMap({ base: true, mini: !this._hasContent })}>
68+
<span part="icon" ?hidden=${hasNoIcon}>
7869
<slot name="icon"></slot>
7970
</span>
8071
<span part="content">

src/components/nav-drawer/nav-drawer.ts

Lines changed: 10 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import { html, LitElement } from 'lit';
2-
import { property, queryAssignedElements } from 'lit/decorators.js';
3-
2+
import { property } from 'lit/decorators.js';
43
import { addThemingController } from '../../theming/theming-controller.js';
4+
import { addSlotController, setSlots } from '../common/controllers/slot.js';
55
import { registerComponent } from '../common/definitions/register.js';
66
import { partMap } from '../common/part-map.js';
7-
import { isEmpty } from '../common/util.js';
87
import type { NavDrawerPosition } from '../types.js';
98
import IgcNavDrawerHeaderItemComponent from './nav-drawer-header-item.js';
109
import IgcNavDrawerItemComponent from './nav-drawer-item.js';
@@ -30,16 +29,17 @@ export default class IgcNavDrawerComponent extends LitElement {
3029
public static override styles = [styles, shared];
3130

3231
/* blazorSuppress */
33-
public static register() {
32+
public static register(): void {
3433
registerComponent(
3534
IgcNavDrawerComponent,
3635
IgcNavDrawerHeaderItemComponent,
3736
IgcNavDrawerItemComponent
3837
);
3938
}
4039

41-
@queryAssignedElements({ slot: 'mini' })
42-
private _miniSlotElements!: Array<HTMLElement>;
40+
private readonly _slots = addSlotController(this, {
41+
slots: setSlots('mini'),
42+
});
4343

4444
/**
4545
* The position of the drawer.
@@ -60,12 +60,6 @@ export default class IgcNavDrawerComponent extends LitElement {
6060
addThemingController(this, all);
6161
}
6262

63-
protected override createRenderRoot() {
64-
const root = super.createRenderRoot();
65-
root.addEventListener('slotchange', () => this.requestUpdate());
66-
return root;
67-
}
68-
6963
private _waitTransitions() {
7064
return new Promise<Event>((resolve) => {
7165
this.renderRoot.addEventListener('transitionend', resolve, {
@@ -114,7 +108,10 @@ export default class IgcNavDrawerComponent extends LitElement {
114108
</div>
115109
116110
<div
117-
part=${partMap({ mini: true, hidden: isEmpty(this._miniSlotElements) })}
111+
part=${partMap({
112+
mini: true,
113+
hidden: !this._slots.hasAssignedElements('mini'),
114+
})}
118115
>
119116
<slot name="mini"></slot>
120117
</div>

0 commit comments

Comments
 (0)