Skip to content

Commit 1b008af

Browse files
committed
fix #501
1 parent a0762a7 commit 1b008af

File tree

10 files changed

+88
-49
lines changed

10 files changed

+88
-49
lines changed

exampleVault/note1.md

Lines changed: 0 additions & 6 deletions
This file was deleted.

exampleVault/note2.md

Lines changed: 0 additions & 9 deletions
This file was deleted.

packages/core/src/api/InternalAPI.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -267,23 +267,31 @@ export abstract class InternalAPI<Plugin extends IPlugin> {
267267
this.createSearchModal(new SuggesterSelectModal(this.plugin, selectCallback, inputField)).open();
268268
}
269269

270-
openImageSuggesterModal(inputField: ImageSuggesterLikeIPF, selectCallback: (selected: string) => void): void {
270+
openImageSuggesterModal(
271+
inputField: ImageSuggesterLikeIPF,
272+
canSelectNone: boolean,
273+
selectCallback: (selected: string | undefined) => void,
274+
): void {
271275
this.createModal(
272276
new SvelteModalContent((modal, targetEl) => {
273277
return mount(ImageSuggesterModalComponent, {
274278
target: targetEl,
275279
props: {
276280
plugin: this.plugin,
277281
options: this.getImageSuggesterOptions(inputField),
278-
onSelect: (item: string): void => {
282+
canSelectNone: canSelectNone,
283+
onSelect: (item: string | undefined): void => {
279284
selectCallback(item);
280285
modal.closeModal();
281286
},
287+
onCancel: () => {
288+
modal.closeModal();
289+
},
282290
},
283291
});
284292
}),
285293
{
286-
title: 'Meta Bind image suggester',
294+
title: 'Select an image from your Vault',
287295
classes: ['mb-image-suggester-modal'],
288296
},
289297
).open();

packages/core/src/fields/inputFields/fields/ImageListSuggester/ImageListSuggesterComponent.svelte

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,10 +85,12 @@
8585
<div class="mb-image-card-grid">
8686
{#each value as image, i}
8787
<div class="mb-image-card" oncontextmenu={e => openContextMenuForElement(e, i)} role="listitem">
88-
<img class="mb-image-card-image" src={props.plugin.internal.imagePathToUri(image)} alt={image} />
89-
<div class="mb-image-card-footer">
90-
<span>{image}</span>
91-
</div>
88+
<img
89+
class="mb-image-card-image"
90+
src={props.plugin.internal.imagePathToUri(image)}
91+
alt={image}
92+
aria-label={image}
93+
/>
9294
</div>
9395
{/each}
9496
</div>

packages/core/src/fields/inputFields/fields/ImageListSuggester/ImageListSuggesterIPF.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,10 @@ export class ImageListSuggesterIPF extends AbstractInputField<MBLiteral[], strin
3737
}
3838

3939
openModal(): void {
40-
this.mountable.plugin.internal.openImageSuggesterModal(this, (selected: string) => {
41-
this.svelteWrapper.getInstance()?.pushValue(selected);
40+
this.mountable.plugin.internal.openImageSuggesterModal(this, false, (selected: string | undefined) => {
41+
if (selected !== undefined) {
42+
this.svelteWrapper.getInstance()?.pushValue(selected);
43+
}
4244
});
4345
}
4446
}

packages/core/src/fields/inputFields/fields/ImageSuggester/ImageSuggesterComponent.svelte

Lines changed: 37 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,37 +3,58 @@
33
import type { InputFieldSvelteProps } from 'packages/core/src/fields/inputFields/InputFieldSvelteWrapper';
44
import Button from 'packages/core/src/utils/components/Button.svelte';
55
import Icon from 'packages/core/src/utils/components/Icon.svelte';
6+
import type { ContextMenuItemDefinition } from 'packages/core/src/utils/IContextMenu';
67
7-
const props: InputFieldSvelteProps<string> & {
8+
const props: InputFieldSvelteProps<string | undefined> & {
89
showSuggester: () => void;
10+
clear: () => void;
911
} = $props();
1012
1113
let value = $state(props.value);
1214
13-
export function setValue(v: string): void {
15+
export function setValue(v: string | undefined): void {
1416
value = v;
1517
}
1618
17-
function openSuggester(): void {
18-
props.showSuggester();
19+
function showContextMenu(e: MouseEvent): void {
20+
const menuActions: ContextMenuItemDefinition[] = [];
21+
22+
menuActions.push({
23+
name: 'Edit',
24+
icon: 'pencil',
25+
onclick: () => {
26+
props.showSuggester();
27+
},
28+
});
29+
30+
menuActions.push({
31+
name: 'Remove',
32+
icon: 'x',
33+
warning: true,
34+
onclick: () => props.clear(),
35+
});
36+
37+
props.plugin.internal.createContextMenu(menuActions).showWithEvent(e);
1938
}
2039
</script>
2140

22-
<div class="mb-image-card">
23-
{#if value}
41+
{#if value}
42+
<!-- svelte-ignore a11y_no_static_element_interactions -->
43+
<div class="mb-image-card" oncontextmenu={e => showContextMenu(e)}>
2444
<img
2545
class="mb-image-card-image"
2646
src={props.plugin.internal.imagePathToUri(value)}
2747
alt={value}
2848
aria-label={value}
2949
/>
30-
{/if}
31-
<Button
32-
variant={ButtonStyleType.PLAIN}
33-
onclick={openSuggester}
34-
classes="mb-image-card-button"
35-
tooltip="Change image"
36-
>
37-
<Icon iconName="pencil" plugin={props.plugin} />
38-
</Button>
39-
</div>
50+
<Button variant={ButtonStyleType.PLAIN} onclick={e => showContextMenu(e)} classes="mb-image-card-button">
51+
<Icon iconName="ellipsis-vertical" plugin={props.plugin} />
52+
</Button>
53+
</div>
54+
{:else}
55+
<div class="mb-image-empty">
56+
<Button variant={ButtonStyleType.PLAIN} onclick={() => props.showSuggester()} tooltip="Select image">
57+
No image selected. Click to select.
58+
</Button>
59+
</div>
60+
{/if}

packages/core/src/fields/inputFields/fields/ImageSuggester/ImageSuggesterIPF.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import type { InputFieldSvelteComponent } from 'packages/core/src/fields/inputFi
44
import type { MBLiteral } from 'packages/core/src/utils/Literal';
55
import { isLiteral, stringifyLiteral } from 'packages/core/src/utils/Literal';
66

7-
export class ImageSuggesterIPF extends AbstractInputField<MBLiteral, string> {
7+
export class ImageSuggesterIPF extends AbstractInputField<MBLiteral, string | undefined> {
88
protected filterValue(value: unknown): MBLiteral | undefined {
99
return isLiteral(value) ? value : undefined;
1010
}
1111

12-
protected getFallbackDefaultValue(): string {
13-
return '';
12+
protected getFallbackDefaultValue(): string | undefined {
13+
return undefined;
1414
}
1515

16-
protected getSvelteComponent(): InputFieldSvelteComponent<string> {
16+
protected getSvelteComponent(): InputFieldSvelteComponent<string | undefined> {
1717
// @ts-ignore
1818
return ImageSuggesterComponent;
1919
}
@@ -29,11 +29,12 @@ export class ImageSuggesterIPF extends AbstractInputField<MBLiteral, string> {
2929
protected getMountArgs(): Record<string, unknown> {
3030
return {
3131
showSuggester: () => this.openModal(),
32+
clear: () => this.setInternalValue(undefined),
3233
};
3334
}
3435

3536
openModal(): void {
36-
this.mountable.plugin.internal.openImageSuggesterModal(this, (selected: string) =>
37+
this.mountable.plugin.internal.openImageSuggesterModal(this, true, (selected: string | undefined) =>
3738
this.setInternalValue(selected),
3839
);
3940
}

packages/core/src/modals/modalContents/ImageSuggesterModalComponent.svelte

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
11
<script lang="ts">
2-
import ImageSuggesterCard from 'packages/core/src/fields/inputFields/fields/ImageSuggester/ImageSuggesterCard.svelte';
2+
import ImageSuggesterCard from 'packages/core/src/modals/modalContents/ImageSuggesterModalCard.svelte';
33
import type { SuggesterOption } from 'packages/core/src/fields/inputFields/fields/Suggester/SuggesterHelper';
44
import type { IPlugin } from 'packages/core/src/IPlugin';
5+
import Button from '../../utils/components/Button.svelte';
6+
import { ButtonStyleType } from '../../config/ButtonConfig';
7+
import ModalButtonGroup from '../../utils/components/ModalButtonGroup.svelte';
58
69
const {
710
plugin,
811
options,
12+
canSelectNone,
913
onSelect,
14+
onCancel,
1015
}: {
1116
plugin: IPlugin;
1217
options: SuggesterOption<string>[];
13-
onSelect: (item: string) => void;
18+
canSelectNone: boolean;
19+
onSelect: (item: string | undefined) => void;
20+
onCancel: () => void;
1421
} = $props();
1522
1623
let search = $state('');
@@ -27,11 +34,18 @@
2734
});
2835
</script>
2936

30-
<div class="mb-image-search-container">
37+
<div class="mb-image-modal-header">
3138
<input type="text" bind:value={search} placeholder="Search images..." />
3239
</div>
3340
<div class="mb-image-card-grid">
3441
{#each filteredOptions as option}
3542
<ImageSuggesterCard plugin={plugin} image={option.value} onSelect={onSelect}></ImageSuggesterCard>
3643
{/each}
3744
</div>
45+
46+
<ModalButtonGroup>
47+
{#if canSelectNone}
48+
<Button variant={ButtonStyleType.PRIMARY} onclick={() => onSelect(undefined)}>Select none</Button>
49+
{/if}
50+
<Button onclick={() => onCancel()}>Cancel</Button>
51+
</ModalButtonGroup>

styles.css

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -439,7 +439,7 @@ div.mb-view-wrapper {
439439
}
440440

441441
/* Image */
442-
.mb-image-search-container {
442+
.mb-image-modal-header {
443443
margin-bottom: var(--size-4-4);
444444
}
445445

@@ -504,6 +504,12 @@ div.mb-view-wrapper {
504504
width: 100%;
505505
}
506506

507+
.mb-image-empty {
508+
display: flex;
509+
flex-direction: column;
510+
align-items: center;
511+
}
512+
507513
/* Time Input */
508514

509515
.mb-input-type-time {

0 commit comments

Comments
 (0)