Skip to content

Commit b504402

Browse files
author
Tanner Harrison
committed
this is my first attempt
1 parent ef3f269 commit b504402

File tree

6 files changed

+161
-40
lines changed

6 files changed

+161
-40
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
},
1414
"dependencies": {
1515
"obsidian": "obsidianmd/obsidian-api#master",
16-
"obsidian-calendar-ui": "0.3.12",
17-
"obsidian-daily-notes-interface": "0.9.0",
16+
"obsidian-calendar-ui": "0.4.0",
17+
"obsidian-daily-notes-interface": "0.9.4",
1818
"svelte": "3.35.0",
1919
"tslib": "2.1.0"
2020
},

src/io/dailyNotes.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export async function tryToCreateDailyNote(
3636
cta: "Create",
3737
onAccept: createFile,
3838
text: `File ${filename} does not exist. Would you like to create it?`,
39-
title: "New Daily Note",
39+
title: "New Daily Note basd;lfajskd",
4040
});
4141
} else {
4242
await createFile();

src/io/periodicNotes.ts

+100
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
import type { Moment } from "moment";
2+
import type { TFile } from "obsidian";
3+
import {
4+
createDailyNote,
5+
createWeeklyNote,
6+
createMonthlyNote,
7+
createYearlyNote,
8+
getDailyNoteSettings,
9+
getWeeklyNoteSettings,
10+
getMonthlyNoteSettings,
11+
getYearlyNoteSettings,
12+
} from "obsidian-daily-notes-interface";
13+
14+
import type { ISettings } from "src/settings";
15+
import { createConfirmationDialog } from "src/ui/modal";
16+
17+
export enum Period {
18+
Daily = "Daily",
19+
Weekly = "Weekly",
20+
Monthly = "Monthly",
21+
Yearly = "Yearly"
22+
}
23+
24+
export const getDateForPeriodicNote = (date: Moment, noteType: Period) => {
25+
switch (noteType) {
26+
case Period.Daily:
27+
return date;
28+
case Period.Weekly:
29+
return date.startOf("week");
30+
case Period.Monthly:
31+
return date.startOf("month");
32+
case Period.Yearly:
33+
return date.startOf("year");
34+
}
35+
}
36+
const getCreateNoteFunction = (noteType: Period) => {
37+
switch (noteType) {
38+
case Period.Daily:
39+
return createDailyNote;
40+
case Period.Weekly:
41+
return createWeeklyNote;
42+
case Period.Monthly:
43+
return createMonthlyNote;
44+
case Period.Yearly:
45+
return createYearlyNote;
46+
}
47+
};
48+
49+
const getNoteSettingsGetter = (noteType: Period) => {
50+
switch (noteType) {
51+
case Period.Daily:
52+
return getDailyNoteSettings;
53+
case Period.Weekly:
54+
return getWeeklyNoteSettings;
55+
case Period.Monthly:
56+
return getMonthlyNoteSettings;
57+
case Period.Yearly:
58+
return getYearlyNoteSettings;
59+
}
60+
};
61+
62+
/**
63+
* Create a Daily Note for a given date.
64+
*/
65+
export async function tryToCreatePeriodicNote(
66+
date: Moment,
67+
inNewSplit: boolean,
68+
settings: ISettings,
69+
noteType: Period,
70+
cb?: (newFile: TFile) => void
71+
): Promise<void> {
72+
const noteCreator = getCreateNoteFunction(noteType);
73+
const noteSettingsGetter = getNoteSettingsGetter(noteType);
74+
75+
const { workspace } = window.app;
76+
const { format } = noteSettingsGetter();
77+
const filename = date.format(format);
78+
79+
80+
const createFile = async () => {
81+
const note = await noteCreator(date);
82+
const leaf = inNewSplit
83+
? workspace.splitActiveLeaf()
84+
: workspace.getUnpinnedLeaf();
85+
86+
await leaf.openFile(note, { active: true });
87+
cb?.(note);
88+
};
89+
90+
if (settings.shouldConfirmBeforeCreate) {
91+
createConfirmationDialog({
92+
cta: "Create",
93+
onAccept: createFile,
94+
text: `File ${filename} does not exist. Would you like to create it?`,
95+
title: `New ${noteType} Note test`,
96+
});
97+
} else {
98+
await createFile();
99+
}
100+
}

src/ui/Calendar.svelte

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
export let onHoverWeek: (date: Moment, targetEl: EventTarget) => boolean;
2323
export let onClickDay: (date: Moment, isMetaPressed: boolean) => boolean;
2424
export let onClickWeek: (date: Moment, isMetaPressed: boolean) => boolean;
25+
export let onClickMonth: (date: Moment, isMetaPressed: boolean) => boolean;
2526
export let onContextMenuDay: (date: Moment, event: MouseEvent) => boolean;
2627
export let onContextMenuWeek: (date: Moment, event: MouseEvent) => boolean;
2728
@@ -62,6 +63,7 @@
6263
{onContextMenuWeek}
6364
{onClickDay}
6465
{onClickWeek}
66+
{onClickMonth}
6567
bind:displayedMonth
6668
localeData={today.localeData()}
6769
selectedId={$activeFile}

src/view.ts

+33-33
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,7 @@ import { FileView, TFile, ItemView, WorkspaceLeaf } from "obsidian";
1010
import { get } from "svelte/store";
1111

1212
import { TRIGGER_ON_OPEN, VIEW_TYPE_CALENDAR } from "src/constants";
13-
import { tryToCreateDailyNote } from "src/io/dailyNotes";
14-
import { tryToCreateWeeklyNote } from "src/io/weeklyNotes";
13+
import { getDateForPeriodicNote, tryToCreatePeriodicNote, Period } from "src/io/periodicNotes";
1514
import type { ISettings } from "src/settings";
1615

1716
import Calendar from "./ui/Calendar.svelte";
@@ -33,6 +32,7 @@ export default class CalendarView extends ItemView {
3332

3433
this.openOrCreateDailyNote = this.openOrCreateDailyNote.bind(this);
3534
this.openOrCreateWeeklyNote = this.openOrCreateWeeklyNote.bind(this);
35+
this.openOrCreateMonthlyNote = this.openOrCreateMonthlyNote.bind(this);
3636

3737
this.onNoteSettingsUpdate = this.onNoteSettingsUpdate.bind(this);
3838
this.onFileCreated = this.onFileCreated.bind(this);
@@ -105,6 +105,7 @@ export default class CalendarView extends ItemView {
105105
props: {
106106
onClickDay: this.openOrCreateDailyNote,
107107
onClickWeek: this.openOrCreateWeeklyNote,
108+
onClickMonth: this.openOrCreateMonthlyNote,
108109
onHoverDay: this.onHoverDay,
109110
onHoverWeek: this.onHoverWeek,
110111
onContextMenuDay: this.onContextMenuDay,
@@ -255,45 +256,21 @@ export default class CalendarView extends ItemView {
255256
}
256257
}
257258

258-
async openOrCreateWeeklyNote(
259-
date: Moment,
260-
inNewSplit: boolean
261-
): Promise<void> {
262-
const { workspace } = this.app;
263-
264-
const startOfWeek = date.clone().startOf("week");
265-
266-
const existingFile = getWeeklyNote(date, get(weeklyNotes));
267-
268-
if (!existingFile) {
269-
// File doesn't exist
270-
tryToCreateWeeklyNote(startOfWeek, inNewSplit, this.settings, (file) => {
271-
activeFile.setFile(file);
272-
});
273-
return;
274-
}
275-
276-
const leaf = inNewSplit
277-
? workspace.splitActiveLeaf()
278-
: workspace.getUnpinnedLeaf();
279-
await leaf.openFile(existingFile);
280-
281-
activeFile.setFile(existingFile);
282-
workspace.setActiveLeaf(leaf, true, true)
283-
}
284-
285-
async openOrCreateDailyNote(
259+
async openOrCreatePeriodicNote(
260+
noteType: Period,
286261
date: Moment,
287-
inNewSplit: boolean
262+
inNewSplit: boolean,
288263
): Promise<void> {
289264
const { workspace } = this.app;
290-
const existingFile = getDailyNote(date, get(dailyNotes));
265+
const periodicNoteDate = getDateForPeriodicNote(date, noteType);
266+
const existingFile = getDailyNote(periodicNoteDate, get(dailyNotes));
291267
if (!existingFile) {
292268
// File doesn't exist
293-
tryToCreateDailyNote(
269+
tryToCreatePeriodicNote(
294270
date,
295271
inNewSplit,
296272
this.settings,
273+
Period.Daily,
297274
(dailyNote: TFile) => {
298275
activeFile.setFile(dailyNote);
299276
}
@@ -310,4 +287,27 @@ export default class CalendarView extends ItemView {
310287

311288
activeFile.setFile(existingFile);
312289
}
290+
291+
async openOrCreateDailyNote(
292+
date: Moment,
293+
inNewSplit: boolean
294+
) {
295+
this.openOrCreatePeriodicNote(Period.Daily, date, inNewSplit);
296+
}
297+
298+
async openOrCreateWeeklyNote(
299+
date: Moment,
300+
inNewSplit: boolean
301+
) {
302+
this.openOrCreatePeriodicNote(Period.Weekly, date, inNewSplit);
303+
}
304+
305+
async openOrCreateMonthlyNote(
306+
date: Moment,
307+
inNewSplit: boolean
308+
) {
309+
this.openOrCreatePeriodicNote(Period.Monthly, date, inNewSplit);
310+
}
311+
312+
313313
}

yarn.lock

+23-4
Original file line numberDiff line numberDiff line change
@@ -602,6 +602,13 @@
602602
dependencies:
603603
"@types/tern" "*"
604604

605+
"@types/codemirror@5.60.8":
606+
version "5.60.8"
607+
resolved "https://registry.yarnpkg.com/@types/codemirror/-/codemirror-5.60.8.tgz#b647d04b470e8e1836dd84b2879988fc55c9de68"
608+
integrity sha512-VjFgDF/eB+Aklcy15TtOTLQeMjTo07k7KAjql8OK5Dirr7a6sJY4T1uVBDuTVG9VEmn1uUsohOpYnVfgC6/jyw==
609+
dependencies:
610+
"@types/tern" "*"
611+
605612
"@types/estree@*":
606613
version "0.0.47"
607614
resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.47.tgz#d7a51db20f0650efec24cd04994f523d93172ed4"
@@ -3074,6 +3081,11 @@ moment@*, moment@2.29.1:
30743081
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.1.tgz#b2be769fa31940be9eeea6469c075e35006fa3d3"
30753082
integrity sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==
30763083

3084+
moment@2.29.4:
3085+
version "2.29.4"
3086+
resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108"
3087+
integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
3088+
30773089
ms@2.0.0:
30783090
version "2.0.0"
30793091
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -3219,14 +3231,21 @@ obsidian-daily-notes-interface@0.8.4:
32193231
obsidian obsidianmd/obsidian-api#master
32203232
tslib "2.1.0"
32213233

3222-
obsidian-daily-notes-interface@0.9.0:
3223-
version "0.9.0"
3224-
resolved "https://registry.yarnpkg.com/obsidian-daily-notes-interface/-/obsidian-daily-notes-interface-0.9.0.tgz#6a8996917899097c99ed62264a28e231a297d3c6"
3225-
integrity sha512-vzqOLgjTJi+jeT654eRgyEA2PfqeNI23Fe955VwqnRpAjkarr6qcllpC9cs1XBgpjmRm/XRIqXFdLsO+1z1RGg==
3234+
obsidian-daily-notes-interface@0.9.4:
3235+
version "0.9.4"
3236+
resolved "https://registry.yarnpkg.com/obsidian-daily-notes-interface/-/obsidian-daily-notes-interface-0.9.4.tgz#df085c5aa4c8c2b2b810185d4d9dc24344cb7604"
3237+
integrity sha512-PILoRtZUB5wEeGnDQAPMlkVlXwDYoxkLR8Wl4STU2zLNwhcq9kKvQexiXi7sfjGlpTnL+LeAOfEVWyeVndneKg==
32263238
dependencies:
32273239
obsidian obsidianmd/obsidian-api#master
32283240
tslib "2.1.0"
32293241

3242+
"obsidian@github:obsidianmd/obsidian-api#master":
3243+
version "1.5.7"
3244+
resolved "https://codeload.github.com/obsidianmd/obsidian-api/tar.gz/8b2eda0f24285636c8aa116972643e5233a23dc1"
3245+
dependencies:
3246+
"@types/codemirror" "5.60.8"
3247+
moment "2.29.4"
3248+
32303249
obsidian@obsidianmd/obsidian-api#master:
32313250
version "0.11.11"
32323251
resolved "https://codeload.github.com/obsidianmd/obsidian-api/tar.gz/dbfa19ad7aa6557f0ecff962065c3f540bc77e27"

0 commit comments

Comments
 (0)