From 1313003bdb334dba5f86d971d42e7a983e206af7 Mon Sep 17 00:00:00 2001 From: Jin <22962980+JYC333@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:57:52 +0200 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20add=20create=20week=20no?= =?UTF-8?q?te=20func?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/tpl/anonymize-database.sql | 4 +- src/routes/api/special_notes.ts | 7 ++- src/services/builtin_attributes.ts | 2 + src/services/date_notes.ts | 71 ++++++++++++++++++++++++++++++ 4 files changed, 80 insertions(+), 4 deletions(-) diff --git a/bin/tpl/anonymize-database.sql b/bin/tpl/anonymize-database.sql index 48317fce4..e558bdb5b 100644 --- a/bin/tpl/anonymize-database.sql +++ b/bin/tpl/anonymize-database.sql @@ -14,7 +14,7 @@ UPDATE attributes SET name = 'name', value = 'value' WHERE type = 'label' 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', - 'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'monthPattern', 'pageSize', 'viewType', 'mapRootNoteId', + 'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'weekPattern', 'enableWeekNote', 'monthPattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', @@ -31,7 +31,7 @@ UPDATE attributes SET name = 'name' WHERE type = 'relation' 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', - 'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'monthPattern', 'pageSize', 'viewType', 'mapRootNoteId', + 'workspaceSearchHome', 'sqlConsoleHome', 'datePattern', 'weekPattern', 'enableWeekNote', 'monthPattern', 'pageSize', 'viewType', 'mapRootNoteId', 'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top', 'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', diff --git a/src/routes/api/special_notes.ts b/src/routes/api/special_notes.ts index 2c68d3db9..f2c77a68c 100644 --- a/src/routes/api/special_notes.ts +++ b/src/routes/api/special_notes.ts @@ -1,5 +1,3 @@ -"use strict"; - import dateNoteService from "../../services/date_notes.js"; import sql from "../../services/sql.js"; import cls from "../../services/cls.js"; @@ -19,6 +17,10 @@ function getWeekFirstDayNote(req: Request) { return dateNoteService.getWeekFirstDayNote(req.params.date); } +function getWeekNote(req: Request) { + return dateNoteService.getWeekNote(req.params.week); +} + function getMonthNote(req: Request) { return dateNoteService.getMonthNote(req.params.month); } @@ -102,6 +104,7 @@ export default { getInboxNote, getDayNote, getWeekFirstDayNote, + getWeekNote, getMonthNote, getYearNote, getDayNotesForMonth, diff --git a/src/services/builtin_attributes.ts b/src/services/builtin_attributes.ts index 791c16db6..6a54ad6e4 100644 --- a/src/services/builtin_attributes.ts +++ b/src/services/builtin_attributes.ts @@ -36,6 +36,8 @@ export default [ { type: "label", name: "workspaceSearchHome" }, { type: "label", name: "sqlConsoleHome" }, { type: "label", name: "datePattern" }, + { type: "label", name: "weekPattern" }, + { type: "label", name: "enableWeekNote" }, { type: "label", name: "monthPattern" }, { type: "label", name: "pageSize" }, { type: "label", name: "viewType" }, diff --git a/src/services/date_notes.ts b/src/services/date_notes.ts index b078d3316..52c125962 100644 --- a/src/services/date_notes.ts +++ b/src/services/date_notes.ts @@ -236,10 +236,81 @@ function getWeekFirstDayNote(dateStr: string, options: WeekNoteOpts = {}, rootNo return getDayNote(dateStr, rootNote); } +function getWeekStartDate(date: Date, startOfWeek: StartOfWeek): Date { + const day = date.getDay(); + let diff; + + if (startOfWeek === "monday") { + diff = date.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday + } else if (startOfWeek === "sunday") { + diff = date.getDate() - day; + } else { + throw new Error(`Unrecognized start of the week ${startOfWeek}`); + } + + const startDate = new Date(date); + startDate.setDate(diff); + return startDate; +} + +function getWeekNoteTitle(rootNote: BNote, weekNumber: number) { + const pattern = rootNote.getOwnedLabelValue("weekPattern") || "Week {weekNumber}"; + + return pattern + .replace(/{weekNumber}/g, weekNumber.toString()); +} + +function getWeekNote(weekStr: string, options: WeekNoteOpts = {}, _rootNote: BNote | null = null): BNote | null { + const rootNote = _rootNote || getRootCalendarNote(); + if (!rootNote.hasLabel('enableWeekNote')) { + return null; + } + + weekStr = weekStr.trim().substring(0, 8); + + let weekNote = searchService.findFirstNoteWithQuery(`#${WEEK_LABEL}="${weekStr}"`, new SearchContext({ ancestorNoteId: rootNote.noteId })); + + if (weekNote) { + return weekNote; + } + + const [yearStr, weekNumStr] = weekStr.trim().split('-W'); + + const year = parseInt(yearStr); + const weekNumber = parseInt(weekNumStr); + + const firstDayOfYear = new Date(year, 0, 1); + const weekStartDate = new Date(firstDayOfYear); + weekStartDate.setDate(firstDayOfYear.getDate() + (weekNumber - 1) * 7); + + const startDate = getWeekStartDate(weekStartDate, options.startOfTheWeek || "monday"); + const monthNote = getMonthNote(dateUtils.utcDateStr(startDate), rootNote); + + const noteTitle = getWeekNoteTitle(rootNote, weekNumber); + + sql.transactional(() => { + weekNote = createNote(monthNote, noteTitle); + + attributeService.createLabel(weekNote.noteId, WEEK_LABEL, weekStr); + attributeService.createLabel(weekNote.noteId, "sorted"); + + const weekTemplateAttr = rootNote.getOwnedAttribute("relation", "weekTemplate"); + console.log("weekTemplateAttr", weekTemplateAttr); + + if (weekTemplateAttr) { + console.log("weekTemplateAttr.value", weekTemplateAttr.value); + attributeService.createRelation(weekNote.noteId, "template", weekTemplateAttr.value); + } + }); + + return weekNote as unknown as BNote; +} + export default { getRootCalendarNote, getYearNote, getMonthNote, + getWeekNote, getWeekFirstDayNote, getDayNote, getTodayNote