Skip to content

Commit 5790c0d

Browse files
committed
fix(resize): add slot attribute and remove mutation observer
1 parent 2255e09 commit 5790c0d

File tree

6 files changed

+87
-95
lines changed

6 files changed

+87
-95
lines changed

src/components/resize-container/resize-container.ts

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -194,27 +194,23 @@ export default class IgcResizeContainerComponent extends EventEmitterMixin<
194194
this.emitEvent('igcResizeCancel', { bubbles: false, cancelable: false });
195195
}
196196

197+
protected _renderAdorner(name: 'side' | 'corner' | 'bottom', part: string) {
198+
return html`
199+
<slot ${ref(this._adorners[name])} part=${part} name="${name}-adorner">
200+
<div part="adorner-indicator"></div>
201+
</slot>
202+
`;
203+
}
204+
197205
protected _renderAdorners() {
198206
if (!this._isActive && !this.active) {
199207
return nothing;
200208
}
201209

202210
return html`
203-
<slot
204-
${ref(this._adorners.side)}
205-
part="trigger-side"
206-
name="side-adorner"
207-
></slot>
208-
<slot
209-
${ref(this._adorners.corner)}
210-
part="trigger"
211-
name="corner-adorner"
212-
></slot>
213-
<slot
214-
${ref(this._adorners.bottom)}
215-
part="trigger-bottom"
216-
name="bottom-adorner"
217-
></slot>
211+
${this._renderAdorner('side', 'trigger-side')}
212+
${this._renderAdorner('corner', 'trigger')}
213+
${this._renderAdorner('bottom', 'trigger-bottom')}
218214
`;
219215
}
220216

src/components/resize-container/themes/resize-container.base.scss

Lines changed: 17 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,23 @@
1717
--igx-icon-size: #{$icon-size};
1818
}
1919

20-
&::after {
21-
content: '';
22-
position: absolute;
23-
inset: 0;
24-
width: var(--_size);
25-
height: var(--_size);
26-
border-radius: 50%;
27-
z-index: 1;
28-
}
20+
// &::after {
21+
// content: '';
22+
// position: absolute;
23+
// inset: 0;
24+
// width: var(--_size);
25+
// height: var(--_size);
26+
// border-radius: 50%;
27+
// z-index: 1;
28+
// }
29+
}
30+
31+
[part='adorner-indicator'] {
32+
width: 11px;
33+
height: 11px;
34+
border-radius: 50%;
35+
background-color: grey;
36+
z-index: 11111;
2937
}
3038

3139
:host {

src/components/tile-manager/themes/tile.base.scss

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,4 +123,12 @@
123123
// ::slotted([slot='actions']) {
124124
// padding-block: var(--pad-block);
125125
// padding-inline: var(--pad-inline);
126-
// }
126+
// }
127+
128+
[part='adorner-indicator'] {
129+
width: 11px;
130+
height: 11px;
131+
border-radius: 50%;
132+
background-color: grey;
133+
z-index: 11111;
134+
}

src/components/tile-manager/tile-manager.spec.ts

Lines changed: 38 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -432,25 +432,44 @@ describe('Tile Manager component', () => {
432432
`);
433433
});
434434

435-
it('should correctly project adorners into the igc-resize component and not render in igc-tile', async () => {
436-
const tile1 = tileManager.tiles[0];
437-
const resize = tile1.shadowRoot?.querySelector(
438-
'igc-resize'
439-
) as HTMLElement;
440-
441-
const sideAdorner = resize.querySelector('[slot="side-adorner"]');
442-
const cornerAdorner = resize.querySelector('[slot="corner-adorner"]');
443-
const bottomAdorner = resize.querySelector('[slot="bottom-adorner"]');
444-
445-
// Assert the adorners are projected inside igc-resize
446-
expect(sideAdorner?.textContent).to.equal('Side Adorner');
447-
expect(cornerAdorner?.textContent).to.equal('Corner Adorner');
448-
expect(bottomAdorner?.textContent).to.equal('Bottom Adorner');
449-
450-
// Assert that the adorners are not rendered in the igc-tile itself
451-
expect(tile1.querySelector('[slot="side-adorner"]')).to.be.null;
452-
expect(tile1.querySelector('[slot="corner-adorner"]')).to.be.null;
453-
expect(tile1.querySelector('[slot="bottom-adorner"]')).to.be.null;
435+
const adornerTests: { slotName: string; expectedText: string }[] = [
436+
{ slotName: 'side-adorner', expectedText: 'Side Adorner' },
437+
{ slotName: 'corner-adorner', expectedText: 'Corner Adorner' },
438+
{ slotName: 'bottom-adorner', expectedText: 'Bottom Adorner' },
439+
];
440+
441+
adornerTests.forEach(({ slotName, expectedText }) => {
442+
it(`should assign content to the ${slotName} slot`, () => {
443+
const slot =
444+
tileManager.tiles[0].shadowRoot!.querySelector<HTMLSlotElement>(
445+
`slot[name="${slotName}"]`
446+
);
447+
expect(slot).to.exist;
448+
expect(
449+
slot!
450+
.assignedNodes()
451+
.some((node) => node.textContent?.trim() === expectedText)
452+
).to.be.true;
453+
});
454+
});
455+
456+
adornerTests.forEach(({ slotName, expectedText }) => {
457+
it(`should correctly project adorners into the igc-resize ${slotName} slot`, async () => {
458+
const tile1 = tileManager.tiles[0];
459+
const resize = tile1.shadowRoot?.querySelector(
460+
'igc-resize'
461+
) as HTMLElement;
462+
const resizeSlot = resize.shadowRoot!.querySelector<HTMLSlotElement>(
463+
`slot[name="${slotName}"]`
464+
);
465+
expect(resizeSlot).to.exist;
466+
expect(
467+
resizeSlot!
468+
.assignedNodes({ flatten: true })
469+
.some((node) => node.textContent?.trim() === expectedText)
470+
).to.be.true;
471+
expect(resizeSlot!.assignedNodes()).lengthOf(1);
472+
});
454473
});
455474

456475
it('should hide igc-resize component and not render adorners in igc-tile when resize mode is "none"', async () => {

src/components/tile-manager/tile.ts

Lines changed: 11 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,6 @@ export default class IgcTileComponent extends EventEmitterMixin<
121121
private _position = -1;
122122
private _resizeState = createTileResizeState();
123123
private _dragStack = createTileDragStack();
124-
private _mutationObserver: MutationObserver | null = null;
125124

126125
// Tile manager context properties and helpers
127126

@@ -352,42 +351,6 @@ export default class IgcTileComponent extends EventEmitterMixin<
352351

353352
this.style.viewTransitionName =
354353
this.style.viewTransitionName || `tile-transition-${this.tileId}`;
355-
356-
this._observeResizeElement();
357-
}
358-
359-
/** @internal */
360-
public override disconnectedCallback() {
361-
super.disconnectedCallback();
362-
this._mutationObserver?.disconnect();
363-
}
364-
365-
private _observeResizeElement() {
366-
if (!this.shadowRoot) return;
367-
368-
this._mutationObserver = new MutationObserver(() => {
369-
const resize = this.shadowRoot?.querySelector('igc-resize');
370-
if (resize) {
371-
this._assignAdornersToResize();
372-
}
373-
});
374-
375-
this._mutationObserver.observe(this.shadowRoot, {
376-
childList: true, // Detects when `igc-resize` is added or removed
377-
subtree: true,
378-
});
379-
}
380-
381-
private _assignAdornersToResize() {
382-
const resize = this.shadowRoot?.querySelector('igc-resize');
383-
if (!resize) return;
384-
385-
['side-adorner', 'corner-adorner', 'bottom-adorner'].forEach((slotName) => {
386-
const assigned = this.querySelector(`[slot="${slotName}"]`);
387-
if (assigned) {
388-
resize.appendChild(assigned); // Move the adorner inside `igc-resize`
389-
}
390-
});
391354
}
392355

393356
private _setDragState(state = true) {
@@ -621,6 +584,14 @@ export default class IgcTileComponent extends EventEmitterMixin<
621584
`;
622585
}
623586

587+
private _renderAdornerSlot(name: 'side' | 'corner' | 'bottom') {
588+
return html`
589+
<slot name="${name}-adorner" slot="${name}-adorner">
590+
<div part="adorner-indicator"></div>
591+
</slot>
592+
`;
593+
}
594+
624595
protected _renderResizeContainer() {
625596
return html`
626597
<igc-resize
@@ -633,19 +604,9 @@ export default class IgcTileComponent extends EventEmitterMixin<
633604
@igcResizeEnd=${this._handleResizeEnd}
634605
@igcResizeCancel=${this._handleResizeCancel}
635606
>
636-
${this._renderContent()}
637-
<slot
638-
name="side-adorner"
639-
@slotchange=${this._assignAdornersToResize}
640-
></slot>
641-
<slot
642-
name="corner-adorner"
643-
@slotchange=${this._assignAdornersToResize}
644-
></slot>
645-
<slot
646-
name="bottom-adorner"
647-
@slotchange=${this._assignAdornersToResize}
648-
></slot>
607+
${this._renderContent()} ${this._renderAdornerSlot('side')}
608+
${this._renderAdornerSlot('corner')}
609+
${this._renderAdornerSlot('bottom')}
649610
</igc-resize>
650611
`;
651612
}

stories/tile-manager.stories.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -858,7 +858,7 @@ export const CustomActions: Story = {
858858
>
859859
<igc-tile disable-fullscreen disable-maximize>
860860
<h3 slot="title">Custom Actions</h3>
861-
<!-- <div slot="side-adorner">🟨</div> -->
861+
<div slot="side-adorner">🟨</div>
862862
<div slot="corner-adorner">🟩</div>
863863
<div slot="bottom-adorner">🟦</div>
864864

0 commit comments

Comments
 (0)