Skip to content

Commit 79f9691

Browse files
committed
change date and time inputs, add date time input
1 parent d7f2566 commit 79f9691

File tree

14 files changed

+167
-248
lines changed

14 files changed

+167
-248
lines changed

exampleVault/Input Fields/Date and Time.md

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
---
2-
time: 21:03
3-
date2: 2024-03-05
4-
date1: 2023-01-01
2+
time: 13:05
3+
date2: 2024-01-22
4+
date1: 2024-03-07
5+
dateTime: 2024-03-13T15:07
56
---
67

78
### Date
@@ -23,3 +24,9 @@ INPUT[datePicker(showcase, defaultValue(null)):date3]
2324
```meta-bind
2425
INPUT[time(showcase):time]
2526
```
27+
28+
29+
### Date Time
30+
```meta-bind
31+
INPUT[dateTime(showcase):dateTime]
32+
```

packages/core/src/Settings.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ export interface MetaBindPluginSettings {
6363
devMode: boolean;
6464
ignoreCodeBlockRestrictions: boolean;
6565
preferredDateFormat: string;
66-
useUsDateInputOrder: boolean;
6766
firstWeekday: Weekday;
6867
syncInterval: number;
6968
maxSyncInterval: number;
@@ -90,7 +89,6 @@ export const DEFAULT_SETTINGS: MetaBindPluginSettings = {
9089
devMode: false,
9190
ignoreCodeBlockRestrictions: false,
9291
preferredDateFormat: 'YYYY-MM-DD',
93-
useUsDateInputOrder: false,
9492
firstWeekday: weekdays[1],
9593
syncInterval: 200,
9694
minSyncInterval: 50,

packages/core/src/config/FieldConfigs.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export enum InputFieldType {
4444
INLINE_LIST_SUGGESTER = 'inlineListSuggester',
4545
INLINE_LIST = 'inlineList',
4646
IMAGE_LIST_SUGGESTER = 'imageListSuggester',
47+
DATE_TIME = 'dateTime',
4748

4849
INVALID = 'invalid',
4950
}
@@ -177,6 +178,11 @@ export const InputFieldConfigs: Record<InputFieldType, InputFieldConfig> = {
177178
allowInBlock: true,
178179
allowInline: false,
179180
},
181+
[InputFieldType.DATE_TIME]: {
182+
type: InputFieldType.DATE_TIME,
183+
allowInBlock: true,
184+
allowInline: true,
185+
},
180186
[InputFieldType.INVALID]: {
181187
type: InputFieldType.INVALID,
182188
allowInBlock: false,

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import { DocsUtils } from 'packages/core/src/utils/DocsUtils';
2929
import { ErrorLevel, MetaBindParsingError } from 'packages/core/src/utils/errors/MetaBindErrors';
3030
import { expectType } from 'packages/core/src/utils/Utils';
3131
import { ImageListSuggesterIPF } from 'packages/core/src/fields/inputFields/fields/ImageListSuggester/ImageListSuggesterIPF';
32+
import { DateTimeIPF } from 'packages/core/src/fields/inputFields/fields/DateTime/DateTimeIPF';
3233

3334
export type InputField =
3435
| ToggleIPF
@@ -50,7 +51,8 @@ export type InputField =
5051
| TimeIPF
5152
| InlineListSuggesterIPF
5253
| InlineListIPF
53-
| ImageListSuggesterIPF;
54+
| ImageListSuggesterIPF
55+
| DateTimeIPF;
5456

5557
export class InputFieldFactory {
5658
plugin: IPlugin;
@@ -109,6 +111,8 @@ export class InputFieldFactory {
109111
return new InlineListIPF(base);
110112
} else if (type === InputFieldType.IMAGE_LIST_SUGGESTER) {
111113
return new ImageListSuggesterIPF(base);
114+
} else if (type === InputFieldType.DATE_TIME) {
115+
return new DateTimeIPF(base);
112116
}
113117

114118
expectType<InputFieldType.INVALID>(type);
Lines changed: 4 additions & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,131 +1,10 @@
11
<script lang="ts">
2-
import { Moment } from 'moment';
3-
import { onMount } from 'svelte';
4-
import { DateParser } from '../../../../parsers/DateParser';
5-
import { IPlugin } from '../../../../IPlugin';
2+
export let value: string;
3+
export let onValueChange: (value: string) => void;
64
7-
export let plugin: IPlugin;
8-
export let value: Moment;
9-
export let useUsInputOrder: boolean;
10-
export let onValueChange: (value: Moment) => void;
11-
12-
let months: Record<string, string> = {};
13-
let days: Record<string, string> = {};
14-
15-
let year: string;
16-
let month: string;
17-
let day: string;
18-
19-
onMount(() => {
20-
months = {
21-
'0': 'January',
22-
'1': 'February',
23-
'2': 'March',
24-
'3': 'April',
25-
'4': 'May',
26-
'5': 'June',
27-
'6': 'July',
28-
'7': 'August',
29-
'8': 'September',
30-
'9': 'October',
31-
'10': 'November',
32-
'11': 'December',
33-
};
34-
35-
for (let i = 1; i <= 31; i++) {
36-
days[i.toString()] = i.toString();
37-
}
38-
39-
year = value.year().toString();
40-
month = value.month().toString();
41-
day = value.date().toString();
42-
});
43-
44-
export function setValue(v: Moment): void {
5+
export function setValue(v: string): void {
456
value = v;
46-
47-
year = value.year().toString();
48-
month = value.month().toString();
49-
day = value.date().toString();
50-
}
51-
52-
function onYearChange(): void {
53-
const parseRes = Number.parseInt(year);
54-
const yearNumber = Number.isNaN(parseRes) ? DateParser.getDefaultYear() : parseRes;
55-
56-
value.year(yearNumber);
57-
// year = yearNumber.toString();
58-
59-
onValueChange(value);
60-
}
61-
62-
function onMonthChange(): void {
63-
value.month(month);
64-
65-
const clampedDay = clampDay(value.date());
66-
67-
value.date(clampedDay);
68-
day = clampedDay.toString();
69-
70-
onValueChange(value);
71-
}
72-
73-
function onDayChange(): void {
74-
const parseRes = Number.parseInt(day);
75-
const clampedDay = clampDay(parseRes);
76-
77-
value.date(clampedDay);
78-
day = clampedDay.toString();
79-
80-
onValueChange(value);
81-
}
82-
83-
function clampDay(day: number): number {
84-
if (Number.isNaN(day)) {
85-
return DateParser.getDefaultDay();
86-
} else if (day < 1) {
87-
return 1;
88-
} else if (day > value.daysInMonth()) {
89-
return value.daysInMonth();
90-
}
91-
return day;
927
}
938
</script>
949

95-
<div class="mb-input-element-group">
96-
{#if useUsInputOrder}
97-
<select class="dropdown mb-input-element-group-element" bind:value={month} on:change={() => onMonthChange()}>
98-
{#each Object.entries(months) as [_month, _monthName]}
99-
<option value={_month}>{_monthName}</option>
100-
{/each}
101-
</select>
102-
103-
<select class="dropdown mb-input-element-group-element" bind:value={day} on:change={() => onDayChange()}>
104-
{#each Object.values(days) as _day}
105-
<option value={_day}>{_day}</option>
106-
{/each}
107-
</select>
108-
{:else}
109-
<select class="dropdown mb-input-element-group-element" bind:value={day} on:change={() => onDayChange()}>
110-
{#each Object.values(days) as _day}
111-
<option value={_day}>{_day}</option>
112-
{/each}
113-
</select>
114-
115-
<select class="dropdown mb-input-element-group-element" bind:value={month} on:change={() => onMonthChange()}>
116-
{#each Object.entries(months) as [_month, _monthName]}
117-
<option value={_month}>{_monthName}</option>
118-
{/each}
119-
</select>
120-
{/if}
121-
122-
<input
123-
class="mb-date-input-year-input mb-input-element-group-element"
124-
type="number"
125-
tabindex="0"
126-
bind:value={year}
127-
on:input={() => onYearChange()}
128-
max="9999"
129-
min="0"
130-
/>
131-
</div>
10+
<input type="date" bind:value={value} on:input={() => onValueChange(value)} />
Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,28 @@
1-
import { type Moment } from 'moment';
21
import { AbstractInputField } from 'packages/core/src/fields/inputFields/AbstractInputField';
32
import DateComponent from 'packages/core/src/fields/inputFields/fields/Date/DateComponent.svelte';
43
import { DateParser } from 'packages/core/src/parsers/DateParser';
54
import { type SvelteComponent } from 'svelte';
5+
import { parseUnknownToString } from 'packages/core/src/utils/Literal';
66

7-
export class DateIPF extends AbstractInputField<string, Moment> {
7+
export class DateIPF extends AbstractInputField<string, string> {
88
protected filterValue(value: unknown): string | undefined {
9-
if (value === null || value === undefined || typeof value !== 'string') {
10-
return undefined;
11-
}
12-
const date = DateParser.parse(value);
13-
if (date.isValid()) {
14-
return DateParser.stringify(date);
15-
} else {
16-
return undefined;
17-
}
9+
return parseUnknownToString(value);
1810
}
1911

20-
protected getFallbackDefaultValue(): Moment {
21-
return DateParser.getDefaultDate();
12+
protected getFallbackDefaultValue(): string {
13+
return DateParser.stringify(DateParser.getDefaultDate());
2214
}
2315

2416
protected getSvelteComponent(): typeof SvelteComponent {
2517
// @ts-ignore
2618
return DateComponent;
2719
}
2820

29-
protected rawMapValue(value: Moment): string {
30-
return DateParser.stringify(value);
21+
protected rawMapValue(value: string): string {
22+
return value;
3123
}
3224

33-
protected rawReverseMapValue(value: string): Moment | undefined {
34-
return DateParser.parse(value);
35-
}
36-
37-
protected getMountArgs(): Record<string, unknown> {
38-
return {
39-
useUsInputOrder: this.base.plugin.settings.useUsDateInputOrder,
40-
};
25+
protected rawReverseMapValue(value: string): string | undefined {
26+
return value;
4127
}
4228
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<script lang="ts">
2+
export let value: string;
3+
export let onValueChange: (value: string) => void;
4+
5+
export function setValue(v: string): void {
6+
value = v;
7+
}
8+
</script>
9+
10+
<input type="datetime-local" bind:value={value} on:input={() => onValueChange(value)} />
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { AbstractInputField } from 'packages/core/src/fields/inputFields/AbstractInputField';
2+
import { parseUnknownToString } from 'packages/core/src/utils/Literal';
3+
import { DateParser } from 'packages/core/src/parsers/DateParser';
4+
import type { SvelteComponent } from 'svelte';
5+
import DateTimeComponent from 'packages/core/src/fields/inputFields/fields/DateTime/DateTimeComponent.svelte';
6+
7+
export class DateTimeIPF extends AbstractInputField<string, string> {
8+
protected filterValue(value: unknown): string | undefined {
9+
return parseUnknownToString(value);
10+
}
11+
12+
protected getFallbackDefaultValue(): string {
13+
return DateParser.stringify(DateParser.getDefaultDate());
14+
}
15+
16+
protected getSvelteComponent(): typeof SvelteComponent {
17+
// @ts-ignore
18+
return DateTimeComponent;
19+
}
20+
21+
protected rawMapValue(value: string): string {
22+
return value;
23+
}
24+
25+
protected rawReverseMapValue(value: string): string | undefined {
26+
return value;
27+
}
28+
}
Lines changed: 4 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -1,59 +1,10 @@
11
<script lang="ts">
2-
import { onMount } from 'svelte';
3-
import { Time } from '../../../../parsers/TimeParser';
2+
export let value: string;
3+
export let onValueChange: (value: string) => void;
44
5-
export let value: Time;
6-
export let onValueChange: (value: Time) => void;
7-
8-
let hours: Record<string, string> = {};
9-
let minutes: Record<string, string> = {};
10-
11-
let hour: string;
12-
let minute: string;
13-
14-
onMount(() => {
15-
for (let i = 0; i <= 24; i++) {
16-
hours[i.toString()] = i.toString().padStart(2, '0');
17-
}
18-
19-
for (let i = 0; i <= 59; i++) {
20-
minutes[i.toString()] = i.toString().padStart(2, '0');
21-
}
22-
23-
minute = value.getMinute().toString();
24-
hour = value.getHour().toString();
25-
});
26-
27-
export function setValue(v: Time): void {
5+
export function setValue(v: string): void {
286
value = v;
29-
30-
minute = value.getMinute().toString();
31-
hour = value.getHour().toString();
32-
}
33-
34-
function onMinuteChange(): void {
35-
value.setMinuteFromString(minute);
36-
37-
onValueChange(value);
38-
}
39-
40-
function onHourChange(): void {
41-
value.setHourFromString(hour);
42-
43-
onValueChange(value);
447
}
458
</script>
469

47-
<div class="mb-input-element-group">
48-
<select class="dropdown mb-input-element-group-element" bind:value={hour} on:change={() => onHourChange()}>
49-
{#each Object.entries(hours) as [_hour, _hourName]}
50-
<option value={_hour}>{_hourName}</option>
51-
{/each}
52-
</select>
53-
54-
<select class="dropdown mb-input-element-group-element" bind:value={minute} on:change={() => onMinuteChange()}>
55-
{#each Object.entries(minutes) as [_minute, _minuteName]}
56-
<option value={_minute}>{_minuteName}</option>
57-
{/each}
58-
</select>
59-
</div>
10+
<input type="time" bind:value={value} on:input={() => onValueChange(value)} />

0 commit comments

Comments
 (0)