mirror of
https://github.com/ankitects/anki.git
synced 2025-09-24 08:46:37 -04:00
Introduce ToolbarItem as a better base type instead of DynamicSvelteComponent
This commit is contained in:
parent
b364ae5542
commit
432e0a5079
9 changed files with 42 additions and 48 deletions
|
@ -1,5 +1,5 @@
|
|||
<script lang="typescript">
|
||||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { ToolbarItem } from "./types";
|
||||
import ButtonGroup from "./ButtonGroup.svelte";
|
||||
|
||||
export let id = "";
|
||||
|
@ -9,7 +9,7 @@
|
|||
return `dropdown-menu bg-transparent border-0 ${className}`;
|
||||
}
|
||||
|
||||
export let buttons: DynamicSvelteComponent[];
|
||||
export let buttons: ToolbarItem[];
|
||||
</script>
|
||||
|
||||
<ButtonGroup {id} className={extendClassName(className)} {buttons} {...$$restProps} />
|
||||
|
|
4
ts/editor-toolbar/ButtonGroup.d.ts
vendored
4
ts/editor-toolbar/ButtonGroup.d.ts
vendored
|
@ -1,7 +1,7 @@
|
|||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { ToolbarItem } from "./types";
|
||||
|
||||
export interface ButtonGroupProps {
|
||||
id: string;
|
||||
className?: string;
|
||||
buttons: DynamicSvelteComponent[];
|
||||
buttons: ToolbarItem[];
|
||||
}
|
||||
|
|
|
@ -1,18 +1,11 @@
|
|||
<script lang="typescript">
|
||||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
|
||||
interface Hidden {
|
||||
hidden: boolean;
|
||||
}
|
||||
import type { ToolbarItem } from "./types";
|
||||
|
||||
export let id;
|
||||
export let className = "";
|
||||
export let buttons: DynamicSvelteComponent<Hidden>[];
|
||||
export let buttons: ToolbarItem[];
|
||||
|
||||
function filterHidden({
|
||||
hidden,
|
||||
...props
|
||||
}: DynamicSvelteComponent & Hidden): DynamicSvelteComponent {
|
||||
function filterHidden({ hidden, ...props }) {
|
||||
return props;
|
||||
}
|
||||
</script>
|
||||
|
|
4
ts/editor-toolbar/DropdownMenu.d.ts
vendored
4
ts/editor-toolbar/DropdownMenu.d.ts
vendored
|
@ -1,6 +1,6 @@
|
|||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { ToolbarItem } from "./types";
|
||||
|
||||
export interface DropdownMenuProps {
|
||||
id: string;
|
||||
menuItems: DynamicSvelteComponent[];
|
||||
menuItems: ToolbarItem[];
|
||||
}
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
|
||||
<script lang="typescript">
|
||||
import type { Readable } from "svelte/store";
|
||||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { ToolbarItem } from "./types";
|
||||
import { setContext } from "svelte";
|
||||
import { disabledKey, nightModeKey } from "./contextKeys";
|
||||
|
||||
import ButtonGroup from "./ButtonGroup.svelte";
|
||||
|
||||
export let buttons: Readable<DynamicSvelteComponent[]>;
|
||||
export let menus: Readable<DynamicSvelteComponent[]>;
|
||||
export let buttons: Readable<ToolbarItem[]>;
|
||||
export let menus: Readable<ToolbarItem[]>;
|
||||
|
||||
$: _buttons = $buttons;
|
||||
$: _menus = $menus;
|
||||
|
|
4
ts/editor-toolbar/WithDropdownMenu.d.ts
vendored
4
ts/editor-toolbar/WithDropdownMenu.d.ts
vendored
|
@ -1,6 +1,6 @@
|
|||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { ToolbarItem } from "./types";
|
||||
|
||||
export interface WithDropdownMenuProps {
|
||||
button: DynamicSvelteComponent;
|
||||
button: ToolbarItem;
|
||||
menuId: string;
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<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;
|
||||
|
||||
function extend({
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import type { SvelteComponent } from "svelte";
|
||||
import type { DynamicSvelteComponent } from "sveltelib/dynamicComponent";
|
||||
import type { SvelteComponentDev } from "svelte/internal";
|
||||
import type { ToolbarItem } from "./types";
|
||||
|
||||
import ButtonGroup from "./ButtonGroup.svelte";
|
||||
import type { ButtonGroupProps } from "./ButtonGroup";
|
||||
|
@ -38,12 +38,10 @@ function toggleComponent(component: Hideable) {
|
|||
const buttonGroup = dynamicComponent<typeof ButtonGroup, ButtonGroupProps>(ButtonGroup);
|
||||
|
||||
class EditorToolbar extends HTMLElement {
|
||||
component?: SvelteComponent;
|
||||
component?: SvelteComponentDev;
|
||||
|
||||
buttons?: Writable<
|
||||
(DynamicSvelteComponent<typeof ButtonGroup> & ButtonGroupProps)[]
|
||||
>;
|
||||
menus?: Writable<DynamicSvelteComponent[]>;
|
||||
buttons?: Writable<(ToolbarItem<typeof ButtonGroup> & ButtonGroupProps)[]>;
|
||||
menus?: Writable<ToolbarItem[]>;
|
||||
|
||||
connectedCallback(): void {
|
||||
setupI18n({ modules: [ModuleName.EDITING] }).then(() => {
|
||||
|
@ -68,7 +66,7 @@ class EditorToolbar extends HTMLElement {
|
|||
|
||||
updateButtonGroup<T>(
|
||||
update: (
|
||||
component: DynamicSvelteComponent<typeof ButtonGroup> & ButtonGroupProps & T
|
||||
component: ToolbarItem<typeof ButtonGroup> & ButtonGroupProps & T
|
||||
) => void,
|
||||
group: string | number
|
||||
): void {
|
||||
|
@ -77,9 +75,7 @@ class EditorToolbar extends HTMLElement {
|
|||
|
||||
if (foundGroup) {
|
||||
update(
|
||||
foundGroup as DynamicSvelteComponent<typeof ButtonGroup> &
|
||||
ButtonGroupProps &
|
||||
T
|
||||
foundGroup as ToolbarItem<typeof ButtonGroup> & ButtonGroupProps & T
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -113,43 +109,40 @@ class EditorToolbar extends HTMLElement {
|
|||
});
|
||||
}
|
||||
|
||||
updateButton<T>(
|
||||
update: (component: DynamicSvelteComponent & T) => void,
|
||||
updateButton(
|
||||
update: (component: ToolbarItem) => void,
|
||||
group: string | number,
|
||||
button: string | number
|
||||
): void {
|
||||
this.updateButtonGroup((foundGroup) => {
|
||||
const foundButton = search(
|
||||
foundGroup.buttons as (DynamicSvelteComponent & Identifiable)[],
|
||||
button
|
||||
);
|
||||
const foundButton = search(foundGroup.buttons, button);
|
||||
|
||||
if (foundButton) {
|
||||
update(foundButton as DynamicSvelteComponent & T);
|
||||
update(foundButton);
|
||||
}
|
||||
}, group);
|
||||
}
|
||||
|
||||
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 {
|
||||
this.updateButton<Hideable>(hideComponent, group, button);
|
||||
this.updateButton(hideComponent, group, button);
|
||||
}
|
||||
|
||||
toggleButton(group: string | number, button: string | number): void {
|
||||
this.updateButton<Hideable>(toggleComponent, group, button);
|
||||
this.updateButton(toggleComponent, group, button);
|
||||
}
|
||||
|
||||
insertButton(
|
||||
newButton: DynamicSvelteComponent & Identifiable,
|
||||
newButton: ToolbarItem & Identifiable,
|
||||
group: string | number,
|
||||
button: string | number = 0
|
||||
) {
|
||||
this.updateButtonGroup((component) => {
|
||||
component.buttons = insert(
|
||||
component.buttons as (DynamicSvelteComponent & Identifiable)[],
|
||||
component.buttons as (ToolbarItem & Identifiable)[],
|
||||
newButton,
|
||||
button
|
||||
);
|
||||
|
@ -157,13 +150,13 @@ class EditorToolbar extends HTMLElement {
|
|||
}
|
||||
|
||||
addButton(
|
||||
newButton: DynamicSvelteComponent & Identifiable,
|
||||
newButton: ToolbarItem & Identifiable,
|
||||
group: string | number,
|
||||
button: string | number = -1
|
||||
) {
|
||||
this.updateButtonGroup((component) => {
|
||||
component.buttons = add(
|
||||
component.buttons as (DynamicSvelteComponent & Identifiable)[],
|
||||
component.buttons as (ToolbarItem & Identifiable)[],
|
||||
newButton,
|
||||
button
|
||||
);
|
||||
|
|
8
ts/editor-toolbar/types.d.ts
vendored
Normal file
8
ts/editor-toolbar/types.d.ts
vendored
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue