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

Commit edbc6fd

Browse files
feat: persist deck attributes
1 parent 53ab080 commit edbc6fd

File tree

4 files changed

+78
-7
lines changed

4 files changed

+78
-7
lines changed

studio/src/app/components/editor/app-editor-toolbar/app-editor-toolbar.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export class AppEditorToolbar {
3939
@Event() private slideDelete: EventEmitter<HTMLElement>;
4040

4141
@Event() private slideDidChange: EventEmitter<HTMLElement>;
42+
@Event() private deckDidChange: EventEmitter<HTMLElement>;
4243

4344
private subscription: Subscription;
4445
private deckBusyService: DeckBusyService;
@@ -425,7 +426,7 @@ export class AppEditorToolbar {
425426
this.selectedElement.style.color = $event.target.value;
426427
}
427428

428-
await this.emitSlideChange();
429+
await this.emitChange();
429430
};
430431

431432
// Background
@@ -490,7 +491,7 @@ export class AppEditorToolbar {
490491
this.selectedElement.style.background = $event.target.value;
491492
}
492493

493-
await this.emitSlideChange();
494+
await this.emitChange();
494495
};
495496

496497
private async openSlotType($event: UIEvent) {
@@ -542,21 +543,26 @@ export class AppEditorToolbar {
542543

543544
await this.initSelectedElement(element);
544545

545-
await this.emitSlideChange();
546+
await this.emitChange();
546547

547548
resolve();
548549
});
549550
}
550551

551-
private emitSlideChange(): Promise<void> {
552+
private emitChange(): Promise<void> {
552553
return new Promise<void>((resolve) => {
553554
if (!this.selectedElement || !this.selectedElement.parentElement) {
554555
resolve();
555556
return;
556557
}
557558

558-
// If not deck or slide, then parent is the container slide
559-
this.slideDidChange.emit(this.deckOrSlide ? this.selectedElement : this.selectedElement.parentElement);
559+
if (this.applyToAllDeck) {
560+
const deckElement: HTMLElement = this.deckOrSlide ? this.selectedElement.parentElement : this.selectedElement.parentElement.parentElement;
561+
this.deckDidChange.emit(deckElement);
562+
} else {
563+
// If not deck or slide, then parent is the container slide
564+
this.slideDidChange.emit(this.deckOrSlide ? this.selectedElement : this.selectedElement.parentElement);
565+
}
560566

561567
resolve();
562568
});

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

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import {debounceTime, filter, take} from 'rxjs/operators';
33

44
import {Slide, SlideAttributes, SlideTemplate} from '../../../models/slide';
55
import {User} from '../../../models/user';
6-
import {Deck} from '../../../models/deck';
6+
import {Deck, DeckAttributes} from '../../../models/deck';
77

88
import {Utils} from '../../../utils/core/utils';
99

@@ -48,6 +48,7 @@ export class DeckEventsHandler {
4848
this.el = el;
4949

5050
this.el.addEventListener('input', this.onSlideInputChange, false);
51+
this.el.addEventListener('deckDidChange', this.onDeckChange, false);
5152
this.el.addEventListener('slideDidChange', this.onSlideChange, false);
5253
this.el.addEventListener('slideDidLoad', this.onSlideDidLoad, false);
5354
this.el.addEventListener('slideDelete', this.onSlideDelete, false);
@@ -59,6 +60,7 @@ export class DeckEventsHandler {
5960

6061
destroy() {
6162
this.el.removeEventListener('input', this.onSlideInputChange, true);
63+
this.el.removeEventListener('deckDidChange', this.onDeckChange, true);
6264
this.el.removeEventListener('slideDidChange', this.onSlideChange, true);
6365
this.el.removeEventListener('slideDidLoad', this.onSlideDidLoad, true);
6466
this.el.removeEventListener('slideDelete', this.onSlideDelete, true);
@@ -80,6 +82,14 @@ export class DeckEventsHandler {
8082
}
8183
};
8284

85+
private onDeckChange = async ($event: CustomEvent) => {
86+
if (!$event || !$event.detail) {
87+
return;
88+
}
89+
90+
await this.updateDeck($event.detail);
91+
};
92+
8393
private onSlideChange = async ($event: CustomEvent) => {
8494
if (!$event || !$event.detail) {
8595
return;
@@ -208,6 +218,43 @@ export class DeckEventsHandler {
208218
});
209219
}
210220

221+
private updateDeck(deck: HTMLElement): Promise<void> {
222+
return new Promise<void>(async (resolve) => {
223+
try {
224+
if (!deck) {
225+
resolve();
226+
return;
227+
}
228+
229+
this.deckBusyService.busy(true);
230+
231+
this.deckEditorService.watch().pipe(take(1)).subscribe(async (currentDeck: Deck) => {
232+
if (!currentDeck) {
233+
resolve();
234+
return;
235+
}
236+
237+
const attributes: DeckAttributes = await this.getDeckAttributes(deck);
238+
239+
if (attributes && Object.keys(attributes).length > 0) {
240+
currentDeck.attributes = attributes;
241+
}
242+
243+
const updatedDeck: Deck = await this.deckService.put(currentDeck);
244+
this.deckEditorService.next(updatedDeck);
245+
246+
this.deckBusyService.busy(false);
247+
248+
resolve();
249+
});
250+
} catch (err) {
251+
this.errorService.error(err);
252+
this.deckBusyService.busy(false);
253+
resolve();
254+
}
255+
});
256+
}
257+
211258
private updateSlide(slide: HTMLElement): Promise<void> {
212259
return new Promise<void>(async (resolve) => {
213260
try {
@@ -323,6 +370,18 @@ export class DeckEventsHandler {
323370
})
324371
}
325372

373+
private getDeckAttributes(deck: HTMLElement): Promise<DeckAttributes> {
374+
return new Promise<DeckAttributes>((resolve) => {
375+
let attributes: DeckAttributes = {};
376+
377+
if (deck.getAttribute('style')) {
378+
attributes.style = deck.getAttribute('style');
379+
}
380+
381+
resolve(attributes);
382+
})
383+
}
384+
326385
private cleanSlideContent(content: string): Promise<string> {
327386
return new Promise<string>((resolve) => {
328387
if (!content || content.length <= 0) {

studio/src/app/models/deck.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1+
export interface DeckAttributes {
2+
style?: string;
3+
}
4+
15
export interface Deck {
26
id?: string;
37
slides: string[];
48
name: string;
59
owner_id: string;
10+
attributes?: DeckAttributes;
611
}

studio/src/components.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,7 @@ export namespace Components {
7777
}
7878
interface AppEditorToolbarAttributes extends StencilHTMLAttributes {
7979
'onBlockSlide'?: (event: CustomEvent<boolean>) => void;
80+
'onDeckDidChange'?: (event: CustomEvent<HTMLElement>) => void;
8081
'onSlideDelete'?: (event: CustomEvent<HTMLElement>) => void;
8182
'onSlideDidChange'?: (event: CustomEvent<HTMLElement>) => void;
8283
}

0 commit comments

Comments
 (0)