feat: 🎸 add create week note func

This commit is contained in:
Jin 2025-04-01 16:57:52 +02:00
parent 84def1aa30
commit 1313003bdb
4 changed files with 80 additions and 4 deletions

View File

@ -14,7 +14,7 @@ UPDATE attributes SET name = 'name', value = 'value' WHERE type = 'label'
'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled',
'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass',
'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', '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', 'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top',
'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription',
'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', 'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate',
@ -31,7 +31,7 @@ UPDATE attributes SET name = 'name' WHERE type = 'relation'
'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled', 'widget', 'noteInfoWidgetDisabled', 'linkMapWidgetDisabled', 'revisionsWidgetDisabled',
'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass', 'whatLinksHereWidgetDisabled', 'similarNotesWidgetDisabled', 'workspace', 'workspaceIconClass',
'workspaceTabBackgroundColor', 'workspaceCalendarRoot', 'workspaceTemplate', 'searchHome', 'workspaceInbox', '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', 'bookmarkFolder', 'sorted', 'sortDirection', 'sortFoldersFirst', 'sortNatural', 'sortLocale', 'top',
'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription', 'fullContentWidth', 'shareHiddenFromTree', 'shareExternalLink', 'shareOmitDefaultCss', 'shareRoot', 'shareDescription',
'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate', 'shareRaw', 'shareDisallowRobotIndexing', 'shareIndex', 'displayRelations', 'hideRelations', 'titleTemplate',

View File

@ -1,5 +1,3 @@
"use strict";
import dateNoteService from "../../services/date_notes.js"; import dateNoteService from "../../services/date_notes.js";
import sql from "../../services/sql.js"; import sql from "../../services/sql.js";
import cls from "../../services/cls.js"; import cls from "../../services/cls.js";
@ -19,6 +17,10 @@ function getWeekFirstDayNote(req: Request) {
return dateNoteService.getWeekFirstDayNote(req.params.date); return dateNoteService.getWeekFirstDayNote(req.params.date);
} }
function getWeekNote(req: Request) {
return dateNoteService.getWeekNote(req.params.week);
}
function getMonthNote(req: Request) { function getMonthNote(req: Request) {
return dateNoteService.getMonthNote(req.params.month); return dateNoteService.getMonthNote(req.params.month);
} }
@ -102,6 +104,7 @@ export default {
getInboxNote, getInboxNote,
getDayNote, getDayNote,
getWeekFirstDayNote, getWeekFirstDayNote,
getWeekNote,
getMonthNote, getMonthNote,
getYearNote, getYearNote,
getDayNotesForMonth, getDayNotesForMonth,

View File

@ -36,6 +36,8 @@ export default [
{ type: "label", name: "workspaceSearchHome" }, { type: "label", name: "workspaceSearchHome" },
{ type: "label", name: "sqlConsoleHome" }, { type: "label", name: "sqlConsoleHome" },
{ type: "label", name: "datePattern" }, { type: "label", name: "datePattern" },
{ type: "label", name: "weekPattern" },
{ type: "label", name: "enableWeekNote" },
{ type: "label", name: "monthPattern" }, { type: "label", name: "monthPattern" },
{ type: "label", name: "pageSize" }, { type: "label", name: "pageSize" },
{ type: "label", name: "viewType" }, { type: "label", name: "viewType" },

View File

@ -236,10 +236,81 @@ function getWeekFirstDayNote(dateStr: string, options: WeekNoteOpts = {}, rootNo
return getDayNote(dateStr, rootNote); 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 { export default {
getRootCalendarNote, getRootCalendarNote,
getYearNote, getYearNote,
getMonthNote, getMonthNote,
getWeekNote,
getWeekFirstDayNote, getWeekFirstDayNote,
getDayNote, getDayNote,
getTodayNote getTodayNote