Introduce ToolbarItem as a better base type instead of DynamicSvelteComponent

This commit is contained in:
Henrik Giesel 2021-04-09 18:59:57 +02:00
parent b364ae5542
commit 432e0a5079
9 changed files with 42 additions and 48 deletions

View file

@ -1,5 +1,5 @@
<script lang="typescript"> <script lang="typescript">
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
import ButtonGroup from "./ButtonGroup.svelte"; import ButtonGroup from "./ButtonGroup.svelte";
export let id = ""; export let id = "";
@ -9,7 +9,7 @@
return `dropdown-menu bg-transparent border-0 ${className}`; return `dropdown-menu bg-transparent border-0 ${className}`;
} }
export let buttons: DynamicSvelteComponent[]; export let buttons: ToolbarItem[];
</script> </script>
<ButtonGroup {id} className={extendClassName(className)} {buttons} {...$$restProps} /> <ButtonGroup {id} className={extendClassName(className)} {buttons} {...$$restProps} />

View file

@ -1,7 +1,7 @@
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
export interface ButtonGroupProps { export interface ButtonGroupProps {
id: string; id: string;
className?: string; className?: string;
buttons: DynamicSvelteComponent[]; buttons: ToolbarItem[];
} }

View file

@ -1,18 +1,11 @@
<script lang="typescript"> <script lang="typescript">
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
interface Hidden {
hidden: boolean;
}
export let id; export let id;
export let className = ""; export let className = "";
export let buttons: DynamicSvelteComponent<Hidden>[]; export let buttons: ToolbarItem[];
function filterHidden({ function filterHidden({ hidden, ...props }) {
hidden,
...props
}: DynamicSvelteComponent & Hidden): DynamicSvelteComponent {
return props; return props;
} }
</script> </script>

View file

@ -1,6 +1,6 @@
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
export interface DropdownMenuProps { export interface DropdownMenuProps {
id: string; id: string;
menuItems: DynamicSvelteComponent[]; menuItems: ToolbarItem[];
} }

View file

@ -14,14 +14,14 @@
<script lang="typescript"> <script lang="typescript">
import type { Readable } from "svelte/store"; import type { Readable } from "svelte/store";
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
import { setContext } from "svelte"; import { setContext } from "svelte";
import { disabledKey, nightModeKey } from "./contextKeys"; import { disabledKey, nightModeKey } from "./contextKeys";
import ButtonGroup from "./ButtonGroup.svelte"; import ButtonGroup from "./ButtonGroup.svelte";
export let buttons: Readable<DynamicSvelteComponent[]>; export let buttons: Readable<ToolbarItem[]>;
export let menus: Readable<DynamicSvelteComponent[]>; export let menus: Readable<ToolbarItem[]>;
$: _buttons = $buttons; $: _buttons = $buttons;
$: _menus = $menus; $: _menus = $menus;

View file

@ -1,6 +1,6 @@
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
export interface WithDropdownMenuProps { export interface WithDropdownMenuProps {
button: DynamicSvelteComponent; button: ToolbarItem;
menuId: string; menuId: string;
} }

View file

@ -1,7 +1,7 @@
<script lang="typescript"> <script lang="typescript">
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
export let button: DynamicSvelteComponent; export let button: ToolbarItem;
export let menuId: string; export let menuId: string;
function extend({ function extend({

View file

@ -1,5 +1,5 @@
import type { SvelteComponent } from "svelte"; import type { SvelteComponentDev } from "svelte/internal";
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent"; import type { ToolbarItem } from "./types";
import ButtonGroup from "./ButtonGroup.svelte"; import ButtonGroup from "./ButtonGroup.svelte";
import type { ButtonGroupProps } from "./ButtonGroup"; import type { ButtonGroupProps } from "./ButtonGroup";
@ -38,12 +38,10 @@ function toggleComponent(component: Hideable) {
const buttonGroup = dynamicComponent<typeof ButtonGroup, ButtonGroupProps>(ButtonGroup); const buttonGroup = dynamicComponent<typeof ButtonGroup, ButtonGroupProps>(ButtonGroup);
class EditorToolbar extends HTMLElement { class EditorToolbar extends HTMLElement {
component?: SvelteComponent; component?: SvelteComponentDev;
buttons?: Writable< buttons?: Writable<(ToolbarItem<typeof ButtonGroup> & ButtonGroupProps)[]>;
(DynamicSvelteComponent<typeof ButtonGroup> & ButtonGroupProps)[] menus?: Writable<ToolbarItem[]>;
>;
menus?: Writable<DynamicSvelteComponent[]>;
connectedCallback(): void { connectedCallback(): void {
setupI18n({ modules: [ModuleName.EDITING] }).then(() => { setupI18n({ modules: [ModuleName.EDITING] }).then(() => {
@ -68,7 +66,7 @@ class EditorToolbar extends HTMLElement {
updateButtonGroup<T>( updateButtonGroup<T>(
update: ( update: (
component: DynamicSvelteComponent<typeof ButtonGroup> & ButtonGroupProps & T component: ToolbarItem<typeof ButtonGroup> & ButtonGroupProps & T
) => void, ) => void,
group: string | number group: string | number
): void { ): void {
@ -77,9 +75,7 @@ class EditorToolbar extends HTMLElement {
if (foundGroup) { if (foundGroup) {
update( update(
foundGroup as DynamicSvelteComponent<typeof ButtonGroup> & foundGroup as ToolbarItem<typeof ButtonGroup> & ButtonGroupProps & T
ButtonGroupProps &
T
); );
} }
@ -113,43 +109,40 @@ class EditorToolbar extends HTMLElement {
}); });
} }
updateButton<T>( updateButton(
update: (component: DynamicSvelteComponent & T) => void, update: (component: ToolbarItem) => void,
group: string | number, group: string | number,
button: string | number button: string | number
): void { ): void {
this.updateButtonGroup((foundGroup) => { this.updateButtonGroup((foundGroup) => {
const foundButton = search( const foundButton = search(foundGroup.buttons, button);
foundGroup.buttons as (DynamicSvelteComponent & Identifiable)[],
button
);
if (foundButton) { if (foundButton) {
update(foundButton as DynamicSvelteComponent & T); update(foundButton);
} }
}, group); }, group);
} }
showButton(group: string | number, button: string | number): void { showButton(group: string | number, button: string | number): void {
this.updateButton<Hideable>(showComponent, group, button); this.updateButton(showComponent, group, button);
} }
hideButton(group: string | number, button: string | number): void { hideButton(group: string | number, button: string | number): void {
this.updateButton<Hideable>(hideComponent, group, button); this.updateButton(hideComponent, group, button);
} }
toggleButton(group: string | number, button: string | number): void { toggleButton(group: string | number, button: string | number): void {
this.updateButton<Hideable>(toggleComponent, group, button); this.updateButton(toggleComponent, group, button);
} }
insertButton( insertButton(
newButton: DynamicSvelteComponent & Identifiable, newButton: ToolbarItem & Identifiable,
group: string | number, group: string | number,
button: string | number = 0 button: string | number = 0
) { ) {
this.updateButtonGroup((component) => { this.updateButtonGroup((component) => {
component.buttons = insert( component.buttons = insert(
component.buttons as (DynamicSvelteComponent & Identifiable)[], component.buttons as (ToolbarItem & Identifiable)[],
newButton, newButton,
button button
); );
@ -157,13 +150,13 @@ class EditorToolbar extends HTMLElement {
} }
addButton( addButton(
newButton: DynamicSvelteComponent & Identifiable, newButton: ToolbarItem & Identifiable,
group: string | number, group: string | number,
button: string | number = -1 button: string | number = -1
) { ) {
this.updateButtonGroup((component) => { this.updateButtonGroup((component) => {
component.buttons = add( component.buttons = add(
component.buttons as (DynamicSvelteComponent & Identifiable)[], component.buttons as (ToolbarItem & Identifiable)[],
newButton, newButton,
button button
); );

8
ts/editor-toolbar/types.d.ts vendored Normal file
View file

@ -0,0 +1,8 @@
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
import type { SvelteComponentDev } from "svelte/internal";
interface ToolbarItem<T extends typeof SvelteComponentDev = typeof SvelteComponentDev>
extends DynamicSvelteComponent<T> {
id?: string;
hidden?: boolean;
}