Skip to content

Commit dd50659

Browse files
committed
add memorization to the metadata manager
1 parent 8cd6002 commit dd50659

37 files changed

+249
-122
lines changed

exampleVault/View Fields/JS View Field.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,4 +51,4 @@ return [...classes.values()];
5151
{Other Note#text} as text
5252
---
5353
return context.bound.text
54-
```
54+
```

exampleVault/View Fields/View Field.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ object:
1212
key: value
1313
file: Example Note with Embeds
1414
image: Other/Images/subfolder/img_frozen_branch.jpg
15-
someInputValue: 1
16-
someComputedValue: 2
15+
someInputValue:
16+
someComputedValue: 0
1717
images:
1818
- Other/Images/img_flower.webp
1919
- Other/Images/img_butterfly.webp

packages/core/src/api/InternalAPI.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import type { Moment } from 'moment';
22
import type { LifecycleHook } from 'packages/core/src/api/API';
33
import type { FileAPI } from 'packages/core/src/api/FileAPI';
44
import DatePickerInput from 'packages/core/src/fields/inputFields/fields/DatePicker/DatePicker.svelte';
5-
import type { DatePickerIPF } from 'packages/core/src/fields/inputFields/fields/DatePicker/DatePickerIPF';
65
import type {
76
ImageSuggesterLikeIPF,
87
SuggesterLikeIFP,
@@ -297,15 +296,15 @@ export abstract class InternalAPI<Plugin extends IPlugin> {
297296
).open();
298297
}
299298

300-
openDatePickerModal(inputField: DatePickerIPF): void {
299+
openDatePickerModal(value: Moment | null, setValue: (value: Moment | null) => void): void {
301300
this.createModal(
302301
new SvelteModalContent((modal, targetEl) => {
303302
return mount(DatePickerInput, {
304303
target: targetEl,
305304
props: {
306-
selectedDate: inputField.getInternalValue(),
305+
selectedDate: value,
307306
dateChangeCallback: (value: Moment | null): void => {
308-
inputField.setInternalValue(value);
307+
setValue(value);
309308
modal.closeModal();
310309
},
311310
},

packages/core/src/fields/inputFields/AbstractInputField.ts

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,9 @@ export abstract class AbstractInputField<
1414
> extends Mountable {
1515
readonly plugin: IPlugin;
1616
readonly mountable: InputFieldMountable;
17-
readonly svelteWrapper: InputFieldSvelteWrapper<ComponentValueType, SvelteExports>;
18-
readonly inputSignal: MappedSignal<unknown, MetadataValueType>;
17+
18+
svelteWrapper?: InputFieldSvelteWrapper<ComponentValueType, SvelteExports>;
19+
inputSignal?: MappedSignal<unknown, MetadataValueType>;
1920

2021
private metadataSubscription?: MetadataSubscription;
2122
private mountTarget?: HTMLElement;
@@ -25,26 +26,6 @@ export abstract class AbstractInputField<
2526

2627
this.mountable = mountable;
2728
this.plugin = mountable.plugin;
28-
this.svelteWrapper = new InputFieldSvelteWrapper<ComponentValueType, SvelteExports>(
29-
this.plugin,
30-
this.getSvelteComponent(),
31-
value => {
32-
this.updateDataAttributes(value);
33-
this.notifySubscription(this.mapValue(value));
34-
},
35-
);
36-
37-
this.inputSignal = new MappedSignal<unknown, MetadataValueType>(
38-
undefined,
39-
(value: unknown): MetadataValueType => {
40-
const filteredValue = this.filterValue(value);
41-
if (filteredValue !== undefined) {
42-
return filteredValue;
43-
} else {
44-
return this.getDefaultValue();
45-
}
46-
},
47-
);
4829
}
4930

5031
protected abstract getSvelteComponent(): InputFieldSvelteComponent<ComponentValueType, SvelteExports>;
@@ -87,6 +68,9 @@ export abstract class AbstractInputField<
8768
* Get the metadata value that the input field currently has.
8869
*/
8970
public getValue(): MetadataValueType {
71+
if (!this.inputSignal) {
72+
return this.getDefaultValue();
73+
}
9074
return this.inputSignal.get();
9175
}
9276

@@ -103,7 +87,7 @@ export abstract class AbstractInputField<
10387
* @param value
10488
*/
10589
public setValue(value: MetadataValueType): void {
106-
this.inputSignal.setDirect(value);
90+
this.inputSignal?.setDirect(value);
10791
this.notifySubscription(value);
10892
}
10993

@@ -152,9 +136,30 @@ export abstract class AbstractInputField<
152136
protected onMount(targetEl: HTMLElement): void {
153137
this.mountTarget = targetEl;
154138

139+
this.svelteWrapper = new InputFieldSvelteWrapper<ComponentValueType, SvelteExports>(
140+
this.plugin,
141+
this.getSvelteComponent(),
142+
value => {
143+
this.updateDataAttributes(value);
144+
this.notifySubscription(this.mapValue(value));
145+
},
146+
);
147+
148+
this.inputSignal = new MappedSignal<unknown, MetadataValueType>(
149+
undefined,
150+
(value: unknown): MetadataValueType => {
151+
const filteredValue = this.filterValue(value);
152+
if (filteredValue !== undefined) {
153+
return filteredValue;
154+
} else {
155+
return this.getDefaultValue();
156+
}
157+
},
158+
);
159+
155160
// listener to update the svelte component
156161
this.inputSignal.registerListener({
157-
callback: value => this.svelteWrapper.setValue(this.reverseMapValue(value)),
162+
callback: value => this.svelteWrapper?.setValue(this.reverseMapValue(value)),
158163
});
159164

160165
// listener to update data attributes on the target element
@@ -181,9 +186,9 @@ export abstract class AbstractInputField<
181186
protected onUnmount(): void {
182187
this.mountTarget = undefined;
183188

184-
this.inputSignal.unregisterAllListeners();
189+
this.inputSignal?.unregisterAllListeners();
185190
this.metadataSubscription?.unsubscribe();
186191

187-
this.svelteWrapper.unmount();
192+
this.svelteWrapper?.unmount();
188193
}
189194
}

packages/core/src/fields/inputFields/fields/Date/DateComponent.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
}
1111
</script>
1212

13-
<input type="date" bind:value={value} oninput={() => props.onValueChange(value)} />
13+
<input type="date" bind:value={value} oninput={() => props.onValueChange($state.snapshot(value))} />

packages/core/src/fields/inputFields/fields/DatePicker/DatePickerIPF.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,9 @@ export class DatePickerIPF extends AbstractInputField<string | null, Moment | nu
6565
return {
6666
dateFormat: this.mountable.plugin.settings.preferredDateFormat,
6767
showDatePicker: (): void => {
68-
this.mountable.plugin.internal.openDatePickerModal(this);
68+
this.mountable.plugin.internal.openDatePickerModal(this.getInternalValue(), (value: Moment | null) =>
69+
this.setInternalValue(value),
70+
);
6971
},
7072
};
7173
}

packages/core/src/fields/inputFields/fields/DateTime/DateTimeComponent.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,4 @@
1010
}
1111
</script>
1212

13-
<input type="datetime-local" bind:value={value} oninput={() => props.onValueChange(value)} />
13+
<input type="datetime-local" bind:value={value} oninput={() => props.onValueChange($state.snapshot(value))} />

packages/core/src/fields/inputFields/fields/Editor/EditorComponent.svelte

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,10 @@
3737
tabindex="0"
3838
>
3939
{#if editing}
40-
<textarea bind:value={value} onfocusout={() => focusOut()} oninput={() => props.onValueChange(value)}
40+
<textarea
41+
bind:value={value}
42+
onfocusout={() => focusOut()}
43+
oninput={() => props.onValueChange($state.snapshot(value))}
4144
></textarea>
4245
{:else}
4346
<MarkdownRenderComponent value={value} plugin={props.plugin} filePath={props.filePath}

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@
1616
1717
export function pushValue(v: string): void {
1818
value.push(v);
19-
props.onValueChange(value);
19+
props.onValueChange($state.snapshot(value));
2020
}
2121
2222
function remove(i: number): void {
2323
value.splice(i, 1);
24-
props.onValueChange(value);
24+
props.onValueChange($state.snapshot(value));
2525
}
2626
2727
function openContextMenuForElement(e: MouseEvent, index: number): void {
@@ -35,7 +35,7 @@
3535
const temp = value[index - 1];
3636
value[index - 1] = value[index];
3737
value[index] = temp;
38-
props.onValueChange(value);
38+
props.onValueChange($state.snapshot(value));
3939
},
4040
});
4141
}
@@ -48,7 +48,7 @@
4848
const temp = value[index + 1];
4949
value[index + 1] = value[index];
5050
value[index] = temp;
51-
props.onValueChange(value);
51+
props.onValueChange($state.snapshot(value));
5252
},
5353
});
5454
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ export class ImageListSuggesterIPF extends AbstractInputField<MBLiteral[], strin
3939
openModal(): void {
4040
this.mountable.plugin.internal.openImageSuggesterModal(this, false, (selected: string | undefined) => {
4141
if (selected !== undefined) {
42-
this.svelteWrapper.getInstance()?.pushValue(selected);
42+
this.svelteWrapper?.getInstance()?.pushValue(selected);
4343
}
4444
});
4545
}

0 commit comments

Comments
 (0)