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

Commit 3d30dec

Browse files
feat: apply color and background to a slide or the all deck
1 parent fdd8184 commit 3d30dec

File tree

4 files changed

+82
-8
lines changed

4 files changed

+82
-8
lines changed

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

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ export class AppEditorToolbar {
3333
@State()
3434
private deckOrSlide: boolean = false;
3535

36+
private applyToAllDeck: boolean = false;
37+
3638
@Event() private blockSlide: EventEmitter<boolean>;
3739

3840
@Event() private slideDelete: EventEmitter<HTMLElement>;
@@ -321,7 +323,7 @@ export class AppEditorToolbar {
321323
});
322324
}
323325

324-
private openColorPicker(): Promise<void> {
326+
private openColorPicker = (): Promise<void> => {
325327
return new Promise<void>((resolve) => {
326328
const colorPicker: HTMLInputElement = this.el.querySelector('input[name=\'color-picker\']');
327329

@@ -334,7 +336,7 @@ export class AppEditorToolbar {
334336

335337
resolve();
336338
});
337-
}
339+
};
338340

339341
private selectColor = async ($event) => {
340342
if (!this.selectedElement) {
@@ -344,7 +346,9 @@ export class AppEditorToolbar {
344346
this.color = $event.target.value;
345347

346348
if (this.deckOrSlide) {
347-
this.selectedElement.style.setProperty('--color', $event.target.value);
349+
const element: HTMLElement = this.applyToAllDeck ? this.selectedElement.parentElement : this.selectedElement;
350+
351+
element.style.setProperty('--color', $event.target.value);
348352
} else {
349353
this.selectedElement.style.color = $event.target.value;
350354
}
@@ -374,7 +378,7 @@ export class AppEditorToolbar {
374378
});
375379
}
376380

377-
private openBackgroundPicker(): Promise<void> {
381+
private openBackgroundPicker = (): Promise<void> => {
378382
return new Promise<void>((resolve) => {
379383
const backgroundPicker: HTMLInputElement = this.el.querySelector('input[name=\'background-picker\']');
380384

@@ -387,7 +391,7 @@ export class AppEditorToolbar {
387391

388392
resolve();
389393
});
390-
}
394+
};
391395

392396
private selectBackground = async ($event) => {
393397
if (!this.selectedElement) {
@@ -397,7 +401,9 @@ export class AppEditorToolbar {
397401
this.background = $event.target.value;
398402

399403
if (this.deckOrSlide) {
400-
this.selectedElement.style.setProperty('--background', $event.target.value);
404+
const element: HTMLElement = this.applyToAllDeck ? this.selectedElement.parentElement : this.selectedElement;
405+
406+
element.style.setProperty('--background', $event.target.value);
401407
} else {
402408
this.selectedElement.style.background = $event.target.value;
403409
}
@@ -483,6 +489,28 @@ export class AppEditorToolbar {
483489
});
484490
}
485491

492+
private async openForDeckOrSlide($event: UIEvent, myFunction: Function) {
493+
if (!this.deckOrSlide) {
494+
myFunction();
495+
return;
496+
}
497+
498+
const popover: HTMLIonPopoverElement = await this.popoverController.create({
499+
component: 'app-deck-or-slide',
500+
event: $event,
501+
mode: 'ios'
502+
});
503+
504+
popover.onDidDismiss().then(async (detail: OverlayEventDetail) => {
505+
if (detail.data) {
506+
this.applyToAllDeck = detail.data.deck;
507+
myFunction();
508+
}
509+
});
510+
511+
await popover.present();
512+
}
513+
486514
render() {
487515
return [
488516
<div class={this.displayed ? "editor-toolbar displayed" : "editor-toolbar"}>
@@ -506,10 +534,10 @@ export class AppEditorToolbar {
506534
return [<a onClick={() => this.deleteElement()} class={this.deckBusy && this.deckOrSlide ? "disabled" : undefined}>
507535
<ion-icon name="trash"></ion-icon>
508536
</a>,
509-
<a onClick={() => this.openColorPicker()}>
537+
<a onClick={(e: UIEvent) => this.openForDeckOrSlide(e, this.openColorPicker)}>
510538
<ion-label style={styleColor}>A</ion-label>
511539
</a>,
512-
<a onClick={() => this.openBackgroundPicker()}>
540+
<a onClick={(e: UIEvent) => this.openForDeckOrSlide(e, this.openBackgroundPicker)}>
513541
<ion-label style={styleBackground}>Bg</ion-label>
514542
</a>
515543
]
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
app-deck-or-slide {
2+
a {
3+
color: inherit;
4+
cursor: pointer;
5+
6+
&:hover {
7+
color: var(--ion-color-tertiary);
8+
}
9+
}
10+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import {Component, Element} from '@stencil/core';
2+
3+
@Component({
4+
tag: 'app-deck-or-slide',
5+
styleUrl: 'app-deck-or-slide.scss'
6+
})
7+
export class AppDeckOrSlide {
8+
9+
@Element() el: HTMLElement;
10+
11+
async closePopover(deck: boolean) {
12+
await (this.el.closest('ion-popover') as HTMLIonModalElement).dismiss({
13+
deck: deck
14+
});
15+
}
16+
17+
render() {
18+
return <div padding>
19+
<a onClick={() => this.closePopover(true)}><p>Apply to the all deck</p></a>
20+
<a onClick={() => this.closePopover(false)}><p>Just to this slide</p></a>
21+
</div>
22+
}
23+
}

studio/src/components.d.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,9 @@ export namespace Components {
100100
interface AppHome {}
101101
interface AppHomeAttributes extends StencilHTMLAttributes {}
102102

103+
interface AppDeckOrSlide {}
104+
interface AppDeckOrSlideAttributes extends StencilHTMLAttributes {}
105+
103106
interface AppSlideType {}
104107
interface AppSlideTypeAttributes extends StencilHTMLAttributes {}
105108

@@ -130,6 +133,7 @@ declare global {
130133
'AppTerms': Components.AppTerms;
131134
'AppEditor': Components.AppEditor;
132135
'AppHome': Components.AppHome;
136+
'AppDeckOrSlide': Components.AppDeckOrSlide;
133137
'AppSlideType': Components.AppSlideType;
134138
'AppSlotType': Components.AppSlotType;
135139
}
@@ -152,6 +156,7 @@ declare global {
152156
'app-terms': Components.AppTermsAttributes;
153157
'app-editor': Components.AppEditorAttributes;
154158
'app-home': Components.AppHomeAttributes;
159+
'app-deck-or-slide': Components.AppDeckOrSlideAttributes;
155160
'app-slide-type': Components.AppSlideTypeAttributes;
156161
'app-slot-type': Components.AppSlotTypeAttributes;
157162
}
@@ -259,6 +264,12 @@ declare global {
259264
new (): HTMLAppHomeElement;
260265
};
261266

267+
interface HTMLAppDeckOrSlideElement extends Components.AppDeckOrSlide, HTMLStencilElement {}
268+
var HTMLAppDeckOrSlideElement: {
269+
prototype: HTMLAppDeckOrSlideElement;
270+
new (): HTMLAppDeckOrSlideElement;
271+
};
272+
262273
interface HTMLAppSlideTypeElement extends Components.AppSlideType, HTMLStencilElement {}
263274
var HTMLAppSlideTypeElement: {
264275
prototype: HTMLAppSlideTypeElement;
@@ -289,6 +300,7 @@ declare global {
289300
'app-terms': HTMLAppTermsElement
290301
'app-editor': HTMLAppEditorElement
291302
'app-home': HTMLAppHomeElement
303+
'app-deck-or-slide': HTMLAppDeckOrSlideElement
292304
'app-slide-type': HTMLAppSlideTypeElement
293305
'app-slot-type': HTMLAppSlotTypeElement
294306
}
@@ -311,6 +323,7 @@ declare global {
311323
'app-terms': HTMLAppTermsElement;
312324
'app-editor': HTMLAppEditorElement;
313325
'app-home': HTMLAppHomeElement;
326+
'app-deck-or-slide': HTMLAppDeckOrSlideElement;
314327
'app-slide-type': HTMLAppSlideTypeElement;
315328
'app-slot-type': HTMLAppSlotTypeElement;
316329
}

0 commit comments

Comments
 (0)