mirror of
				https://github.com/TriliumNext/Notes.git
				synced 2025-11-04 15:11:31 +08:00 
			
		
		
		
	feat: 🎸 create day note under week note
This commit is contained in:
		
							parent
							
								
									3fe83e0ab4
								
							
						
					
					
						commit
						198842de31
					
				@ -15,6 +15,7 @@ import "../../../stylesheets/calendar.css";
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
dayjs.extend(utc);
 | 
					dayjs.extend(utc);
 | 
				
			||||||
dayjs.extend(isSameOrAfter);
 | 
					dayjs.extend(isSameOrAfter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const MONTHS = [
 | 
					const MONTHS = [
 | 
				
			||||||
    t("calendar.january"),
 | 
					    t("calendar.january"),
 | 
				
			||||||
    t("calendar.febuary"),
 | 
					    t("calendar.febuary"),
 | 
				
			||||||
 | 
				
			|||||||
@ -9,6 +9,11 @@ import hoistedNoteService from "./hoisted_note.js";
 | 
				
			|||||||
import type BNote from "../becca/entities/bnote.js";
 | 
					import type BNote from "../becca/entities/bnote.js";
 | 
				
			||||||
import optionService from "./options.js";
 | 
					import optionService from "./options.js";
 | 
				
			||||||
import { t } from "i18next";
 | 
					import { t } from "i18next";
 | 
				
			||||||
 | 
					import dayjs from "dayjs";
 | 
				
			||||||
 | 
					import type { Dayjs } from "dayjs";
 | 
				
			||||||
 | 
					import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					dayjs.extend(isSameOrAfter);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const CALENDAR_ROOT_LABEL = "calendarRoot";
 | 
					const CALENDAR_ROOT_LABEL = "calendarRoot";
 | 
				
			||||||
const YEAR_LABEL = "yearNote";
 | 
					const YEAR_LABEL = "yearNote";
 | 
				
			||||||
@ -180,7 +185,14 @@ function getDayNote(dateStr: string, _rootNote: BNote | null = null): BNote {
 | 
				
			|||||||
        return dateNote;
 | 
					        return dateNote;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const monthNote = getMonthNote(dateStr, rootNote);
 | 
					    let dateParentNote;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (checkWeekNoteEnabled(rootNote)) {
 | 
				
			||||||
 | 
					        dateParentNote = getWeekNote(getWeekNumberStr(dayjs(dateStr)), rootNote);
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					        dateParentNote = getMonthNote(dateStr, rootNote);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const dayNumber = dateStr.substring(8, 10);
 | 
					    const dayNumber = dateStr.substring(8, 10);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const dateObj = dateUtils.parseLocalDate(dateStr);
 | 
					    const dateObj = dateUtils.parseLocalDate(dateStr);
 | 
				
			||||||
@ -188,7 +200,7 @@ function getDayNote(dateStr: string, _rootNote: BNote | null = null): BNote {
 | 
				
			|||||||
    const noteTitle = getDayNoteTitle(rootNote, dayNumber, dateObj);
 | 
					    const noteTitle = getDayNoteTitle(rootNote, dayNumber, dateObj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    sql.transactional(() => {
 | 
					    sql.transactional(() => {
 | 
				
			||||||
        dateNote = createNote(monthNote, noteTitle);
 | 
					        dateNote = createNote(dateParentNote as BNote, noteTitle);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        attributeService.createLabel(dateNote.noteId, DATE_LABEL, dateStr.substring(0, 10));
 | 
					        attributeService.createLabel(dateNote.noteId, DATE_LABEL, dateStr.substring(0, 10));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -206,23 +218,6 @@ function getTodayNote(rootNote: BNote | null = null) {
 | 
				
			|||||||
    return getDayNote(dateUtils.localNowDate(), rootNote);
 | 
					    return getDayNote(dateUtils.localNowDate(), rootNote);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getWeekFirstDayNote(dateStr: string, rootNote: BNote | null = null) {
 | 
					 | 
				
			||||||
    const startOfWeek = optionService.getOption("firstDayOfWeek") === '0' ? 'sunday' : 'monday';
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    const dateObj = getWeekStartDate(dateUtils.parseLocalDate(dateStr), startOfWeek);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    dateStr = dateUtils.utcDateTimeStr(dateObj);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    return getDayNote(dateStr, rootNote);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function checkWeekNoteEnabled(rootNote: BNote) {
 | 
					 | 
				
			||||||
    if (!rootNote.hasLabel('enableWeekNote')) {
 | 
					 | 
				
			||||||
        return false;
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    return true;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function getWeekStartDate(date: Date, startOfWeek: string): Date {
 | 
					function getWeekStartDate(date: Date, startOfWeek: string): Date {
 | 
				
			||||||
    const day = date.getDay();
 | 
					    const day = date.getDay();
 | 
				
			||||||
    let diff;
 | 
					    let diff;
 | 
				
			||||||
@ -240,6 +235,93 @@ function getWeekStartDate(date: Date, startOfWeek: string): Date {
 | 
				
			|||||||
    return startDate;
 | 
					    return startDate;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// TODO: Duplicated with getWeekNumber in src/public/app/widgets/buttons/calendar.ts
 | 
				
			||||||
 | 
					// Maybe can be merged later in monorepo setup
 | 
				
			||||||
 | 
					function getWeekNumberStr(date: Dayjs): string {
 | 
				
			||||||
 | 
					    const year = date.year();
 | 
				
			||||||
 | 
					    const dayOfWeek = (day: number) => (day - parseInt(optionService.getOption("firstDayOfWeek")) + 7) % 7;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Get first day of the year and adjust to first week start
 | 
				
			||||||
 | 
					    const jan1 = date.clone().year(year).month(0).date(1);
 | 
				
			||||||
 | 
					    const jan1Weekday = jan1.day();
 | 
				
			||||||
 | 
					    const dayOffset = dayOfWeek(jan1Weekday);
 | 
				
			||||||
 | 
					    let firstWeekStart = jan1.clone().subtract(dayOffset, 'day');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Adjust based on week rule
 | 
				
			||||||
 | 
					    switch (parseInt(optionService.getOption("firstWeekOfYear"))) {
 | 
				
			||||||
 | 
					        case 1: { // ISO 8601: first week contains Thursday
 | 
				
			||||||
 | 
					            const thursday = firstWeekStart.clone().add(3, 'day'); // Monday + 3 = Thursday
 | 
				
			||||||
 | 
					            if (thursday.year() < year) {
 | 
				
			||||||
 | 
					                firstWeekStart = firstWeekStart.add(7, 'day');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case 2: { // minDaysInFirstWeek rule
 | 
				
			||||||
 | 
					            const daysInFirstWeek = 7 - dayOffset;
 | 
				
			||||||
 | 
					            if (daysInFirstWeek < parseInt(optionService.getOption("minDaysInFirstWeek"))) {
 | 
				
			||||||
 | 
					                firstWeekStart = firstWeekStart.add(7, 'day');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        // default case 0: week containing Jan 1 → already handled
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const diffDays = date.startOf('day').diff(firstWeekStart.startOf('day'), 'day');
 | 
				
			||||||
 | 
					    const weekNumber = Math.floor(diffDays / 7) + 1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Handle case when date is before first week start → belongs to last week of previous year
 | 
				
			||||||
 | 
					    if (weekNumber <= 0) {
 | 
				
			||||||
 | 
					        return getWeekNumberStr(date.subtract(1, 'day'));
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Handle case when date belongs to first week of next year
 | 
				
			||||||
 | 
					    const nextYear = year + 1;
 | 
				
			||||||
 | 
					    const jan1Next = date.clone().year(nextYear).month(0).date(1);
 | 
				
			||||||
 | 
					    const jan1WeekdayNext = jan1Next.day();
 | 
				
			||||||
 | 
					    const offsetNext = dayOfWeek(jan1WeekdayNext);
 | 
				
			||||||
 | 
					    let nextYearWeekStart = jan1Next.clone().subtract(offsetNext, 'day');
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    switch (parseInt(optionService.getOption("firstWeekOfYear"))) {
 | 
				
			||||||
 | 
					        case 1: {
 | 
				
			||||||
 | 
					            const thursday = nextYearWeekStart.clone().add(3, 'day');
 | 
				
			||||||
 | 
					            if (thursday.year() < nextYear) {
 | 
				
			||||||
 | 
					                nextYearWeekStart = nextYearWeekStart.add(7, 'day');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        case 2: {
 | 
				
			||||||
 | 
					            const daysInFirstWeek = 7 - offsetNext;
 | 
				
			||||||
 | 
					            if (daysInFirstWeek < parseInt(optionService.getOption("minDaysInFirstWeek"))) {
 | 
				
			||||||
 | 
					                nextYearWeekStart = nextYearWeekStart.add(7, 'day');
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            break;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (date.isSameOrAfter(nextYearWeekStart)) {
 | 
				
			||||||
 | 
					        return `${nextYear}-W01`;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return `${year}-W${weekNumber.toString().padStart(2, '0')}`;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function getWeekFirstDayNote(dateStr: string, rootNote: BNote | null = null) {
 | 
				
			||||||
 | 
					    const startOfWeek = optionService.getOption("firstDayOfWeek") === '0' ? 'sunday' : 'monday';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    const dateObj = getWeekStartDate(dateUtils.parseLocalDate(dateStr), startOfWeek);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    dateStr = dateUtils.utcDateTimeStr(dateObj);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return getDayNote(dateStr, rootNote);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function checkWeekNoteEnabled(rootNote: BNote) {
 | 
				
			||||||
 | 
					    if (!rootNote.hasLabel('enableWeekNote')) {
 | 
				
			||||||
 | 
					        return false;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    return true;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function getWeekNoteTitle(rootNote: BNote, weekNumber: number) {
 | 
					function getWeekNoteTitle(rootNote: BNote, weekNumber: number) {
 | 
				
			||||||
    const pattern = rootNote.getOwnedLabelValue("weekPattern") || "Week {weekNumber}";
 | 
					    const pattern = rootNote.getOwnedLabelValue("weekPattern") || "Week {weekNumber}";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -282,10 +364,8 @@ function getWeekNote(weekStr: string, _rootNote: BNote | null = null): BNote | n
 | 
				
			|||||||
        attributeService.createLabel(weekNote.noteId, "sorted");
 | 
					        attributeService.createLabel(weekNote.noteId, "sorted");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const weekTemplateAttr = rootNote.getOwnedAttribute("relation", "weekTemplate");
 | 
					        const weekTemplateAttr = rootNote.getOwnedAttribute("relation", "weekTemplate");
 | 
				
			||||||
        console.log("weekTemplateAttr", weekTemplateAttr);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (weekTemplateAttr) {
 | 
					        if (weekTemplateAttr) {
 | 
				
			||||||
            console.log("weekTemplateAttr.value", weekTemplateAttr.value);
 | 
					 | 
				
			||||||
            attributeService.createRelation(weekNote.noteId, "template", weekTemplateAttr.value);
 | 
					            attributeService.createRelation(weekNote.noteId, "template", weekTemplateAttr.value);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    });
 | 
					    });
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user