Skip to content

Commit 4904b58

Browse files
committed
refactor(tile): Use SlotController
1 parent 1adc67f commit 4904b58

File tree

1 file changed

+37
-52
lines changed

1 file changed

+37
-52
lines changed

src/components/tile-manager/tile.ts

Lines changed: 37 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
import { html, LitElement, nothing } from 'lit';
2-
import {
3-
property,
4-
query,
5-
queryAssignedElements,
6-
state,
7-
} from 'lit/decorators.js';
2+
import { property, query, state } from 'lit/decorators.js';
83
import { createRef, ref } from 'lit/directives/ref.js';
94
import { startViewTransition } from '../../animations/player.js';
105
import { addThemingController } from '../../theming/theming-controller.js';
@@ -19,17 +14,12 @@ import {
1914
type DragCallbackParameters,
2015
} from '../common/controllers/drag.js';
2116
import { addFullscreenController } from '../common/controllers/fullscreen.js';
17+
import { addSlotController, setSlots } from '../common/controllers/slot.js';
2218
import { registerComponent } from '../common/definitions/register.js';
2319
import type { Constructor } from '../common/mixins/constructor.js';
2420
import { EventEmitterMixin } from '../common/mixins/event-emitter.js';
2521
import { partMap } from '../common/part-map.js';
26-
import {
27-
asNumber,
28-
createCounter,
29-
findElementFromEventPath,
30-
isEmpty,
31-
isLTR,
32-
} from '../common/util.js';
22+
import { asNumber, findElementFromEventPath, isLTR } from '../common/util.js';
3323
import IgcDividerComponent from '../divider/divider.js';
3424
import IgcResizeContainerComponent from '../resize-container/resize-container.js';
3525
import type { ResizeCallbackParams } from '../resize-container/types.js';
@@ -60,6 +50,17 @@ export interface IgcTileComponentEventMap {
6050
igcTileResizeCancel: CustomEvent<IgcTileComponent>;
6151
}
6252

53+
let nextId = 1;
54+
const Slots = setSlots(
55+
'title',
56+
'maximize-action',
57+
'fullscreen-action',
58+
'actions',
59+
'side-adorner',
60+
'corner-adorner',
61+
'bottom-adorner'
62+
);
63+
6364
/**
6465
* The tile component is used within the `igc-tile-manager` as a container
6566
* for displaying various types of information.
@@ -101,7 +102,7 @@ export default class IgcTileComponent extends EventEmitterMixin<
101102
public static styles = [styles, shared];
102103

103104
/* blazorSuppress */
104-
public static register() {
105+
public static register(): void {
105106
registerComponent(
106107
IgcTileComponent,
107108
IgcIconButtonComponent,
@@ -110,9 +111,9 @@ export default class IgcTileComponent extends EventEmitterMixin<
110111
);
111112
}
112113

113-
private static readonly increment = createCounter();
114+
private readonly _slots = addSlotController(this, { slots: Slots });
114115

115-
private _dragController = addDragController(this, {
116+
private readonly _dragController = addDragController(this, {
116117
skip: this._skipDrag,
117118
matchTarget: this._match,
118119
ghost: this._createDragGhost,
@@ -122,26 +123,19 @@ export default class IgcTileComponent extends EventEmitterMixin<
122123
cancel: this._handleDragCancel,
123124
});
124125

125-
private _fullscreenController = addFullscreenController(this, {
126+
private readonly _fullscreenController = addFullscreenController(this, {
126127
enter: this._emitFullScreenEvent,
127128
exit: this._emitFullScreenEvent,
128129
});
129130

131+
private readonly _resizeState = createTileResizeState();
132+
private readonly _dragStack = createTileDragStack();
133+
130134
private _colSpan = 1;
131135
private _rowSpan = 1;
132136
private _colStart: number | null = null;
133137
private _rowStart: number | null = null;
134138
private _position = -1;
135-
private _resizeState = createTileResizeState();
136-
private _dragStack = createTileDragStack();
137-
138-
private _customAdorners = new Map<string, boolean>(
139-
Object.entries({
140-
side: false,
141-
corner: false,
142-
bottom: false,
143-
})
144-
);
145139

146140
// Tile manager context properties and helpers
147141

@@ -159,7 +153,7 @@ export default class IgcTileComponent extends EventEmitterMixin<
159153
});
160154
};
161155

162-
private _context = createAsyncContext(
156+
private readonly _context = createAsyncContext(
163157
this,
164158
tileManagerContext,
165159
this._setDragConfiguration
@@ -184,16 +178,10 @@ export default class IgcTileComponent extends EventEmitterMixin<
184178
return this._tileManager?.resizeMode ?? 'none';
185179
}
186180

187-
protected _headerRef = createRef<HTMLElement>();
188-
189-
@queryAssignedElements({ slot: 'title' })
190-
private _titleElements!: HTMLElement[];
191-
192-
@queryAssignedElements({ slot: 'actions' })
193-
private _actionsElements!: HTMLElement[];
181+
protected readonly _headerRef = createRef<HTMLElement>();
194182

195183
@query(IgcResizeContainerComponent.tagName)
196-
protected _resizeContainer?: IgcResizeContainerComponent;
184+
protected readonly _resizeContainer?: IgcResizeContainerComponent;
197185

198186
@query('[part~="base"]', true)
199187
public _tileContent!: HTMLElement;
@@ -374,7 +362,7 @@ export default class IgcTileComponent extends EventEmitterMixin<
374362
/** @internal */
375363
public override connectedCallback(): void {
376364
super.connectedCallback();
377-
this.id = this.id || `tile-${IgcTileComponent.increment()}`;
365+
this.id = this.id || `tile-${nextId++}`;
378366

379367
this.style.viewTransitionName =
380368
this.style.viewTransitionName || `tile-transition-${this.id}`;
@@ -632,11 +620,13 @@ export default class IgcTileComponent extends EventEmitterMixin<
632620
}
633621

634622
protected _renderHeader() {
623+
const hasNoContent = !(
624+
this._slots.hasAssignedElements('title') &&
625+
this._slots.hasAssignedElements('actions')
626+
);
627+
635628
const hideHeader =
636-
isEmpty(this._titleElements) &&
637-
isEmpty(this._actionsElements) &&
638-
this.disableMaximize &&
639-
this.disableFullscreen;
629+
hasNoContent && this.disableMaximize && this.disableFullscreen;
640630

641631
const hasMaximizeSlot = !(this.disableMaximize || this.fullscreen);
642632
const hasFullscreenSlot = !this.disableFullscreen;
@@ -692,14 +682,7 @@ export default class IgcTileComponent extends EventEmitterMixin<
692682
}
693683

694684
private _renderAdornerSlot(name: AdornerType) {
695-
return html`
696-
<slot
697-
@slotchange=${() => this._customAdorners.set(name, true)}
698-
name="${name}-adorner"
699-
slot="${name}-adorner"
700-
>
701-
</slot>
702-
`;
685+
return html`<slot name="${name}-adorner" slot="${name}-adorner"></slot>`;
703686
}
704687

705688
protected override render() {
@@ -711,9 +694,11 @@ export default class IgcTileComponent extends EventEmitterMixin<
711694
<igc-resize
712695
part=${partMap({
713696
resize: true,
714-
'side-adorner': this._customAdorners.get('side')!,
715-
'corner-adorner': this._customAdorners.get('corner')!,
716-
'bottom-adorner': this._customAdorners.get('bottom')!,
697+
'side-adorner': this._slots.hasAssignedElements('side-adorner'),
698+
'corner-adorner':
699+
this._slots.hasAssignedElements('corner-adorner'),
700+
'bottom-adorner':
701+
this._slots.hasAssignedElements('bottom-adorner'),
717702
})}
718703
exportparts="trigger-side, trigger, trigger-bottom"
719704
mode="deferred"

0 commit comments

Comments
 (0)