Skip to content
This repository was archived by the owner on Feb 6, 2024. It is now read-only.

Commit 181e3b7

Browse files
fix: slide navigation and selection from new aside menu (#1316)
* fix: slide navigation from aside menu * refactor: use utils selector
1 parent 6b1f8e7 commit 181e3b7

File tree

12 files changed

+65
-24
lines changed

12 files changed

+65
-24
lines changed

studio/src/app/components/editor/actions/app-breadcrumbs/app-breadcrumbs.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ import editorStore from '../../../../stores/editor.store';
55

66
import {BreadcrumbsStep} from '../../../../types/editor/breadcrumbs-step';
77

8+
import {deckSelector, selectSlide} from '../../../../utils/editor/deck.utils';
9+
810
@Component({
911
tag: 'app-breadcrumbs',
1012
styleUrl: 'app-breadcrumbs.scss',
@@ -25,15 +27,11 @@ export class AppBreadcrumbs {
2527
if (step === BreadcrumbsStep.DECK) {
2628
this.stepTo.emit(undefined);
2729
} else {
28-
const deck = document.querySelector('main > deckgo-deck');
29-
30-
if (!deck) {
31-
return;
32-
}
30+
const deck: HTMLDeckgoDeckElement = document.querySelector(deckSelector);
3331

34-
const index = await (deck as any).getActiveIndex();
32+
const index = await deck?.getActiveIndex();
3533

36-
const slideElement: HTMLElement = deck.querySelector('.deckgo-slide-container:nth-child(' + (index + 1) + ')');
34+
const slideElement: HTMLElement | null = selectSlide({deck, index});
3735

3836
if (!slideElement) {
3937
return;

studio/src/app/components/editor/actions/app-slides-aside/app-slides-aside.tsx

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import {ItemReorderEventDetail} from '@ionic/core';
55
import {debounce} from '@deckdeckgo/utils';
66

77
import {isSlide} from '../../../../../../../utils/deck/src';
8-
import {deckSelector, slideTo} from '../../../../utils/editor/deck.utils';
8+
import {deckSelector, slideTo, selectDeckSlide} from '../../../../utils/editor/deck.utils';
99
import {SlideUtils} from '../../../../utils/editor/slide.utils';
1010

1111
@Component({
@@ -30,6 +30,9 @@ export class AppSlidesAside {
3030
@Event()
3131
private reorder: EventEmitter<ItemReorderEventDetail>;
3232

33+
@Event()
34+
private stepTo: EventEmitter<HTMLElement | undefined>;
35+
3336
@State()
3437
private reorderDetail: ItemReorderEventDetail | undefined = undefined;
3538

@@ -187,6 +190,14 @@ export class AppSlidesAside {
187190
this.reorderDetail = undefined;
188191
}
189192

193+
private async slideTo(index: number) {
194+
const slide: HTMLElement | null = selectDeckSlide(index);
195+
196+
this.stepTo.emit(slide);
197+
198+
await slideTo(index);
199+
}
200+
190201
render() {
191202
return (
192203
<Host ref={(el) => (this.hostRef = el as HTMLAppSlidesAsideElement)}>
@@ -225,7 +236,7 @@ export class AppSlidesAside {
225236
return (
226237
<app-slide-thumbnail
227238
custom-tappable
228-
onClick={async () => await slideTo(index)}
239+
onClick={async () => await this.slideTo(index)}
229240
key={slide.getAttribute('slide_id')}
230241
slide={slide}
231242
deck={this.deckRef}

studio/src/app/components/editor/actions/deck/app-actions-deck/app-actions-deck.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,8 @@ import i18n from '../../../../../stores/i18n.store';
1414

1515
import {MoreAction} from '../../../../../types/editor/more-action';
1616

17+
import {selectDeckSlide} from '../../../../../utils/editor/deck.utils';
18+
1719
import {BackupOfflineService} from '../../../../../services/editor/backup/backup.offline.service';
1820

1921
import {AppIcon} from '../../../../core/app-icon/app-icon';
@@ -46,6 +48,9 @@ export class AppActionsDeck {
4648
@Event()
4749
private selectDeck: EventEmitter<void>;
4850

51+
@Event()
52+
private stepTo: EventEmitter<HTMLElement | undefined>;
53+
4954
private destroyListener;
5055

5156
// Drag and drop is not supported on iOS and Firefox on Android
@@ -75,6 +80,14 @@ export class AppActionsDeck {
7580
cssClass: 'popover-menu popover-menu-wide'
7681
});
7782

83+
popover.onDidDismiss().then(async ({data}: OverlayEventDetail) => {
84+
if (data !== undefined) {
85+
const slide: HTMLElement | null = selectDeckSlide(data);
86+
87+
this.stepTo.emit(slide);
88+
}
89+
});
90+
7891
await popover.present();
7992
}
8093

studio/src/app/components/editor/actions/footer/app-actions-editor/app-actions-editor.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,8 @@ export class AppActionsEditor {
209209
toggleFullScreen={this.toggleFullScreen}
210210
actionPublish={this.actionPublish}
211211
deckDidChange={this.deckDidChange}
212-
onSelectDeck={() => this.selectDeck()}></app-actions-deck>
212+
onSelectDeck={() => this.selectDeck()}
213+
onStepTo={($event: CustomEvent<HTMLElement>) => this.selectStep($event?.detail)}></app-actions-deck>
213214
);
214215
}
215216

studio/src/app/components/editor/slide/app-slide-preview/app-slide-preview.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {isSlide} from '@deckdeckgo/deck-utils';
44
import {debounce, isIOS, isLandscape} from '@deckdeckgo/utils';
55

66
import {SlotUtils} from '../../../../utils/editor/slot.utils';
7+
import {selectSlide} from '../../../../utils/editor/deck.utils';
78

89
@Component({
910
tag: 'app-slide-preview',
@@ -95,7 +96,7 @@ export class AppSlidePreview {
9596
return;
9697
}
9798

98-
const slideElement: HTMLElement | undefined = this.deckRef?.querySelector('.deckgo-slide-container:nth-child(' + (index + 1) + ')');
99+
const slideElement: HTMLElement | undefined = selectSlide({deck: this.deckRef, index});
99100

100101
await this.updateSlide(slideElement);
101102
}

studio/src/app/components/editor/slide/app-slide-warning/app-slide-warning.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ import settingsStore from '../../../../stores/settings.store';
1111
import {ContrastUtils} from '../../../../utils/editor/contrast.utils';
1212
import {NodeUtils} from '../../../../utils/editor/node.utils';
1313
import {SlotUtils} from '../../../../utils/editor/slot.utils';
14+
import {selectSlide} from '../../../../utils/editor/deck.utils';
1415

15-
import { AppIcon } from '../../../core/app-icon/app-icon';
16+
import {AppIcon} from '../../../core/app-icon/app-icon';
1617

1718
@Component({
1819
tag: 'app-slide-warning',
@@ -186,7 +187,7 @@ export class AppSlideWarning {
186187
}
187188

188189
private async getCurrentSlide(): Promise<{deck: HTMLElement | null; slide: HTMLElement | null}> {
189-
const deck: HTMLElement = document.querySelector('main > deckgo-deck');
190+
const deck: HTMLDeckgoDeckElement = document.querySelector('main > deckgo-deck');
190191

191192
if (!deck) {
192193
return {
@@ -195,11 +196,11 @@ export class AppSlideWarning {
195196
};
196197
}
197198

198-
const index = await (deck as any).getActiveIndex();
199+
const index: number = await deck.getActiveIndex();
199200

200201
return {
201202
deck,
202-
slide: deck.querySelector('.deckgo-slide-container:nth-child(' + (index + 1) + ')') as HTMLElement | null
203+
slide: selectSlide({deck, index})
203204
};
204205
}
205206

studio/src/app/handlers/editor/events/deck/deck-events.handler.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ import {Utils} from '../../../../utils/core/utils';
3030
import {SlotUtils} from '../../../../utils/editor/slot.utils';
3131
import {ParseElementsUtils} from '../../../../utils/editor/parse-elements.utils';
3232
import {SlideUtils} from '../../../../utils/editor/slide.utils';
33+
import {selectSlide} from '../../../../utils/editor/deck.utils';
3334

3435
import {DeckService} from '../../../../services/data/deck/deck.service';
3536
import {SlideService} from '../../../../services/data/slide/slide.service';
@@ -926,15 +927,15 @@ export class DeckEventsHandler {
926927
}
927928

928929
async toggleSlideEditable(editable: boolean) {
929-
const deck: HTMLElement = this.mainRef.querySelector('deckgo-deck');
930+
const deck: HTMLDeckgoDeckElement = this.mainRef.querySelector('deckgo-deck');
930931

931932
if (!deck) {
932933
return;
933934
}
934935

935-
const index: number = await (deck as HTMLDeckgoDeckElement).getActiveIndex();
936+
const index: number = await deck.getActiveIndex();
936937

937-
const slideElement: HTMLElement = deck.querySelector('.deckgo-slide-container:nth-child(' + (index + 1) + ')');
938+
const slideElement: HTMLElement = selectSlide({deck, index});
938939

939940
if (!slideElement) {
940941
return;

studio/src/app/handlers/editor/events/remote/remote-events.handler.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import {ConnectionState, DeckdeckgoDeckDefinition, DeckdeckgoEventDeckRequest, D
99
import {EnvironmentDeckDeckGoConfig} from '../../../../types/core/environment-config';
1010
import {EnvironmentConfigService} from '../../../../services/environment/environment-config.service';
1111

12-
import {deckSelector} from '../../../../utils/editor/deck.utils';
12+
import {deckSelector, selectSlide} from '../../../../utils/editor/deck.utils';
1313

1414
import {RemoteService} from '../../../../services/editor/remote/remote.service';
1515

@@ -244,7 +244,7 @@ export class RemoteEventsHandler {
244244

245245
const index = await deck.getActiveIndex();
246246

247-
const youtubeSlideElement: any = this.el.querySelector('.deckgo-slide-container:nth-child(' + (index + 1) + ')');
247+
const youtubeSlideElement: HTMLDeckgoSlideYoutubeElement | null = selectSlide({deck, index}) as HTMLDeckgoSlideYoutubeElement | null;
248248

249249
if (!youtubeSlideElement || youtubeSlideElement.tagName !== 'deckgo-slide-youtube'.toUpperCase()) {
250250
resolve();

studio/src/app/pages/editor/app-editor/app-editor.tsx

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -852,7 +852,12 @@ export class AppEditor {
852852
return undefined;
853853
}
854854

855-
return <app-slides-aside deckRef={this.deckRef} activeIndex={this.activeIndex}></app-slides-aside>;
855+
return (
856+
<app-slides-aside
857+
deckRef={this.deckRef}
858+
activeIndex={this.activeIndex}
859+
onStepTo={($event: CustomEvent<HTMLElement>) => this.selectStep($event)}></app-slides-aside>
860+
);
856861
}
857862

858863
private renderSlidePreview() {

studio/src/app/popovers/editor/app-slide-navigate/app-slide-navigate.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ export class AppSlideNavigate {
2828
}
2929

3030
async jumpToSlide(index: number) {
31-
await slideTo(index);
31+
await (this.el.closest('ion-popover') as HTMLIonPopoverElement).dismiss(index);
3232

33-
await (this.el.closest('ion-popover') as HTMLIonPopoverElement).dismiss();
33+
await slideTo(index);
3434
}
3535

3636
private onReorder($event: CustomEvent<ItemReorderEventDetail>) {

studio/src/app/utils/editor/deck.utils.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,13 @@ export const deckSelector: string = 'app-editor > ion-content div.deck > main >
22

33
export const slideTo = async (index: number) => {
44
const deck: HTMLDeckgoDeckElement | undefined = document.querySelector(deckSelector);
5-
await deck.slideTo(index);
5+
await deck?.slideTo(index);
6+
};
7+
8+
export const selectSlide = ({deck, index}: {deck: HTMLDeckgoDeckElement | null; index: number}): HTMLElement | null =>
9+
deck?.querySelector(':scope > .deckgo-slide-container:nth-child(' + (index + 1) + ')');
10+
11+
export const selectDeckSlide = (index: number): HTMLElement | null => {
12+
const deck: HTMLDeckgoDeckElement | null = document.querySelector(deckSelector);
13+
return selectSlide({deck, index});
614
};

studio/src/components.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1312,6 +1312,7 @@ declare namespace LocalJSX {
13121312
"deckDidChange"?: EventEmitter;
13131313
"fullscreen"?: boolean;
13141314
"onSelectDeck"?: (event: CustomEvent<void>) => void;
1315+
"onStepTo"?: (event: CustomEvent<HTMLElement | undefined>) => void;
13151316
"slides"?: JSX.IntrinsicElements[];
13161317
"toggleFullScreen"?: EventEmitter;
13171318
}
@@ -1683,6 +1684,7 @@ declare namespace LocalJSX {
16831684
"activeIndex"?: number;
16841685
"deckRef": HTMLDeckgoDeckElement;
16851686
"onReorder"?: (event: CustomEvent<ItemReorderEventDetail>) => void;
1687+
"onStepTo"?: (event: CustomEvent<HTMLElement | undefined>) => void;
16861688
}
16871689
interface AppSlotType {
16881690
"onSelectType"?: (event: CustomEvent<SlotType | null>) => void;

0 commit comments

Comments
 (0)