mirror of
https://github.com/callumalpass/tasknotes.git
synced 2026-07-22 12:50:26 +00:00
Rename ChronoSync Plugin to TaskNotes Plugin and Remove Legacy Daily Metadata Commands
• Renamed the main plugin class from ChronoSyncPlugin to TaskNotesPlugin and updated all related types, settings, and UI elements accordingly. • Updated settings interface and default folder paths from "ChronoSync" to "TaskNotes", and renamed ChronoSyncSettingTab to TaskNotesSettingTab. • Modified all ribbon icon labels, command names, group identifiers, and user notices to reflect the new "TaskNotes" branding. • In view types (CalendarView, NotesView, TaskListView), updated container classes and hover sources from "chronosync-*" to "tasknotes-*" for consistent styling and identification. • Changed the view type constants in types.ts to use "tasknotes" prefixes. • In task creation modal and helper functions, adjusted import and instance type to reference TaskNotesPlugin. • Removed legacy daily note metadata commands (incrementPomodoros, toggle-workout, toggle-meditate, and associated update logic) from the main plugin as they are no longer part of TaskNotes functionality. • Cleaned up YAML frontmatter generation in helpers by removing default values for pomodoros, workout, and meditate. This commit ensures branding consistency across the codebase and removes unused functionality, paving the way for continued development of TaskNotes features.
This commit is contained in:
parent
6c6184d402
commit
1be4fb0329
13 changed files with 121 additions and 203 deletions
51
README.md
51
README.md
|
|
@ -1,12 +1,12 @@
|
|||
# ChronoSync for Obsidian
|
||||
# TaskNotes for Obsidian
|
||||
|
||||
ChronoSync is a comprehensive diary, task, note, and time management plugin for Obsidian. It integrates calendar views, task management, daily notes, and timeblocking into a seamless workflow.
|
||||
TaskNotes is a comprehensive task and note management plugin for Obsidian with integrated calendar views, daily notes, and timeblocking.
|
||||
|
||||
## Why ChronoSync?
|
||||
## Why TaskNotes?
|
||||
|
||||
With the introduction of Obsidian's new Bases core plugin, structured YAML frontmatter has become a standard way to manage data in Obsidian. ChronoSync uses YAML metadata extensively to store task properties, daily note information, and time tracking data. This means all your tasks and notes remain as plain Markdown files with structured frontmatter that can be queried and viewed in Bases tables.
|
||||
With the introduction of Obsidian's new Bases core plugin, structured YAML frontmatter has become a standard way to manage data in Obsidian. TaskNotes uses YAML metadata extensively to store task properties, daily note information, and time tracking data. This means all your tasks and notes remain as plain Markdown files with structured frontmatter that can be queried and viewed in Bases tables.
|
||||
|
||||
ChronoSync focuses on time-based organization and task management, storing all data as YAML properties. While Bases provides database views of your notes, ChronoSync handles the day-to-day workflow of creating tasks, tracking time, managing recurring items, and organizing your daily activities. The structured data ChronoSync creates can then be analyzed and visualized using Bases or other data query tools.
|
||||
TaskNotes focuses on time-based organization and task management, storing all data as YAML properties. While Bases provides database views of your notes, TaskNotes handles the day-to-day workflow of creating tasks, tracking time, managing recurring items, and organizing your daily activities. The structured data TaskNotes creates can then be analyzed and visualized using Bases or other data query tools.
|
||||
|
||||
## Features
|
||||
|
||||
|
|
@ -20,15 +20,14 @@ ChronoSync focuses on time-based organization and task management, storing all d
|
|||
|
||||
### Calendar Integration
|
||||
- Month view with agenda display showing tasks and notes
|
||||
- Visual indicators for daily notes, due tasks, and daily metadata (pomodoros, workout, meditation)
|
||||
- Visual indicators for daily notes and due tasks
|
||||
- Keyboard navigation and date selection synchronized across all views
|
||||
- Color coding based on priority, note presence, or daily activities
|
||||
|
||||
### Daily Notes
|
||||
- Automatic creation with configurable templates
|
||||
- YAML frontmatter tracking: date, pomodoros, workout, meditation, important flag
|
||||
- YAML frontmatter tracking: date, tags, important flag
|
||||
- Timeblock tables with configurable intervals (15, 30, or 60 minutes)
|
||||
- Quick commands to update daily metadata without opening the note
|
||||
|
||||
### Time Management
|
||||
- Integrated time tracking for tasks with start/stop functionality
|
||||
|
|
@ -61,27 +60,27 @@ All data is stored as YAML frontmatter in Markdown files, making it:
|
|||
|
||||
1. Open Obsidian Settings
|
||||
2. Go to Community Plugins and turn off Safe Mode
|
||||
3. Click Browse and search for "ChronoSync"
|
||||
3. Click Browse and search for "TaskNotes"
|
||||
4. Install the plugin and enable it
|
||||
|
||||
### Manual Installation
|
||||
|
||||
1. Download the latest release from the GitHub releases page
|
||||
2. Extract the files to your Obsidian vault's plugins folder: `<vault>/.obsidian/plugins/chronosync/`
|
||||
2. Extract the files to your Obsidian vault's plugins folder: `<vault>/.obsidian/plugins/tasknotes/`
|
||||
3. Reload Obsidian
|
||||
4. Go to Settings > Community Plugins and enable "ChronoSync"
|
||||
4. Go to Settings > Community Plugins and enable "TaskNotes"
|
||||
|
||||
## Usage
|
||||
|
||||
### Getting Started
|
||||
|
||||
1. After installation, click the calendar icon in the ribbon to open the ChronoSync dashboard
|
||||
2. Configure the plugin settings in Settings > ChronoSync
|
||||
1. After installation, click the calendar icon in the ribbon to open the TaskNotes dashboard
|
||||
2. Configure the plugin settings in Settings > TaskNotes
|
||||
3. Create your first task or navigate to today's daily note
|
||||
|
||||
### Task Management and Interaction
|
||||
|
||||
ChronoSync provides intuitive controls to interact with your tasks directly from the task list view:
|
||||
TaskNotes provides intuitive controls to interact with your tasks directly from the task list view:
|
||||
|
||||
- Change a task's status (Open, In Progress, Done) using the status dropdown
|
||||
- Adjust task priority (High, Normal, Low) using the priority dropdown
|
||||
|
|
@ -90,7 +89,7 @@ ChronoSync provides intuitive controls to interact with your tasks directly from
|
|||
|
||||
### Task Archiving
|
||||
|
||||
ChronoSync allows you to archive tasks to keep your task list clean while preserving task history:
|
||||
TaskNotes allows you to archive tasks to keep your task list clean while preserving task history:
|
||||
|
||||
- To archive a task, click the "Archive" button in the task controls
|
||||
- Archived tasks are tagged with the "archive" tag in their YAML frontmatter
|
||||
|
|
@ -100,25 +99,20 @@ ChronoSync allows you to archive tasks to keep your task list clean while preser
|
|||
|
||||
### Commands
|
||||
|
||||
ChronoSync adds several commands to Obsidian's command palette:
|
||||
TaskNotes adds several commands to Obsidian's command palette:
|
||||
|
||||
- **Open Dashboard/Calendar View**: Opens the main ChronoSync dashboard
|
||||
- **Open Dashboard/Calendar View**: Opens the main TaskNotes dashboard
|
||||
- **Create New Task**: Opens a modal to create a new task
|
||||
- **Go to Today's Note**: Navigates to or creates today's daily note
|
||||
- **Open Home Note**: Navigates to or creates your home note
|
||||
- **Increment Daily Pomodoros**: Adds 1 to the pomodoro count in today's note
|
||||
- **Toggle Daily Workout**: Toggles the workout flag in today's note
|
||||
- **Toggle Daily Meditation**: Toggles the meditation flag in today's note
|
||||
- **Toggle Daily Important Flag**: Toggles the important flag in today's note
|
||||
|
||||
### Folder Structure
|
||||
|
||||
ChronoSync uses the following folder structure by default (configurable in settings):
|
||||
TaskNotes uses the following folder structure by default (configurable in settings):
|
||||
|
||||
- `ChronoSync/Daily/`: Daily notes (YYYY-MM-DD.md)
|
||||
- `ChronoSync/Tasks/`: Task files
|
||||
- `ChronoSync/Notes/`: General notes
|
||||
- `ChronoSync/Home.md`: Home note
|
||||
- `TaskNotes/Daily/`: Daily notes (YYYY-MM-DD.md)
|
||||
- `TaskNotes/Tasks/`: Task files
|
||||
- `TaskNotes/Notes/`: General notes
|
||||
- `TaskNotes/Home.md`: Home note
|
||||
|
||||
## YAML Structure Examples
|
||||
|
||||
|
|
@ -145,9 +139,6 @@ timeEntries:
|
|||
### Daily Note
|
||||
```yaml
|
||||
date: "2024-01-15"
|
||||
pomodoros: 6
|
||||
workout: true
|
||||
meditate: true
|
||||
tags: ["daily"]
|
||||
important: false
|
||||
```
|
||||
|
|
|
|||
4
main.ts
4
main.ts
|
|
@ -1,2 +1,2 @@
|
|||
import ChronoSyncPlugin from './src/main';
|
||||
export default ChronoSyncPlugin;
|
||||
import TaskNotesPlugin from './src/main';
|
||||
export default TaskNotesPlugin;
|
||||
|
|
@ -1,9 +1,9 @@
|
|||
{
|
||||
"id": "chronosync",
|
||||
"name": "ChronoSync",
|
||||
"id": "tasknotes",
|
||||
"name": "TaskNotes",
|
||||
"version": "0.6.3",
|
||||
"minAppVersion": "1.0.0",
|
||||
"description": "Comprehensive diary, task, note, and time management for Obsidian.",
|
||||
"description": "Comprehensive task and note management with calendar integration for Obsidian.",
|
||||
"author": "Callum Alpass",
|
||||
"authorUrl": "https://github.com/callumalpass",
|
||||
"isDesktopOnly": false
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "chronosync",
|
||||
"name": "tasknotes",
|
||||
"version": "0.6.3",
|
||||
"description": "Comprehensive diary, task, note, and time management for Obsidian",
|
||||
"description": "Comprehensive task and note management with calendar integration for Obsidian",
|
||||
"main": "main.js",
|
||||
"scripts": {
|
||||
"dev": "node esbuild.config.mjs",
|
||||
|
|
|
|||
99
src/main.ts
99
src/main.ts
|
|
@ -2,9 +2,9 @@ import { Notice, Plugin, TFile, WorkspaceLeaf, normalizePath, Platform } from 'o
|
|||
import { format } from 'date-fns';
|
||||
import * as YAML from 'yaml';
|
||||
import {
|
||||
ChronoSyncSettings,
|
||||
TaskNotesSettings,
|
||||
DEFAULT_SETTINGS,
|
||||
ChronoSyncSettingTab
|
||||
TaskNotesSettingTab
|
||||
} from './settings/settings';
|
||||
import {
|
||||
CALENDAR_VIEW_TYPE,
|
||||
|
|
@ -32,8 +32,8 @@ import { EventEmitter } from './utils/EventEmitter';
|
|||
import { FileIndexer } from './utils/FileIndexer';
|
||||
import { YAMLCache } from './utils/YAMLCache';
|
||||
|
||||
export default class ChronoSyncPlugin extends Plugin {
|
||||
settings: ChronoSyncSettings;
|
||||
export default class TaskNotesPlugin extends Plugin {
|
||||
settings: TaskNotesSettings;
|
||||
|
||||
// Shared state between views
|
||||
selectedDate: Date = new Date();
|
||||
|
|
@ -70,17 +70,17 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
);
|
||||
|
||||
// Add ribbon icon
|
||||
this.addRibbonIcon('calendar-days', 'ChronoSync', async () => {
|
||||
this.addRibbonIcon('calendar-days', 'TaskNotes', async () => {
|
||||
await this.activateLinkedViews();
|
||||
});
|
||||
|
||||
// Add ribbon icon for a side-by-side layout
|
||||
this.addRibbonIcon('layout-grid', 'ChronoSync Grid Layout', async () => {
|
||||
this.addRibbonIcon('layout-grid', 'TaskNotes Grid Layout', async () => {
|
||||
await this.createGridLayout();
|
||||
});
|
||||
|
||||
// Add ribbon icon for a tabs layout
|
||||
this.addRibbonIcon('layout-tabs', 'ChronoSync Tabs Layout', async () => {
|
||||
this.addRibbonIcon('layout-tabs', 'TaskNotes Tabs Layout', async () => {
|
||||
await this.createTabsLayout();
|
||||
});
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
this.addCommands();
|
||||
|
||||
// Add settings tab
|
||||
this.addSettingTab(new ChronoSyncSettingTab(this.app, this));
|
||||
this.addSettingTab(new TaskNotesSettingTab(this.app, this));
|
||||
}
|
||||
|
||||
// Methods for updating shared state and emitting events
|
||||
|
|
@ -216,7 +216,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
|
||||
this.addCommand({
|
||||
id: 'open-grid-layout',
|
||||
name: 'Open ChronoSync in grid layout',
|
||||
name: 'Open TaskNotes in grid layout',
|
||||
callback: async () => {
|
||||
await this.createGridLayout();
|
||||
}
|
||||
|
|
@ -224,7 +224,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
|
||||
this.addCommand({
|
||||
id: 'open-tabs-layout',
|
||||
name: 'Open ChronoSync in tabs layout',
|
||||
name: 'Open TaskNotes in tabs layout',
|
||||
callback: async () => {
|
||||
await this.createTabsLayout();
|
||||
}
|
||||
|
|
@ -275,30 +275,6 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
}
|
||||
});
|
||||
|
||||
// Daily note metadata commands
|
||||
this.addCommand({
|
||||
id: 'increment-pomodoros',
|
||||
name: 'Increment daily pomodoros',
|
||||
callback: async () => {
|
||||
await this.incrementPomodoros();
|
||||
}
|
||||
});
|
||||
|
||||
this.addCommand({
|
||||
id: 'toggle-workout',
|
||||
name: 'Toggle daily workout',
|
||||
callback: async () => {
|
||||
await this.toggleDailyMetadata('workout');
|
||||
}
|
||||
});
|
||||
|
||||
this.addCommand({
|
||||
id: 'toggle-meditate',
|
||||
name: 'Toggle daily meditation',
|
||||
callback: async () => {
|
||||
await this.toggleDailyMetadata('meditate');
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// Helper method to create or activate a view of specific type
|
||||
|
|
@ -397,7 +373,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
});
|
||||
|
||||
// Group these leaves together for synchronized date selection
|
||||
const groupName = 'chronosync-views';
|
||||
const groupName = 'tasknotes-views';
|
||||
calendarLeaf.setGroup(groupName);
|
||||
tasksLeaf.setGroup(groupName);
|
||||
notesLeaf.setGroup(groupName);
|
||||
|
|
@ -405,7 +381,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
// Make calendar the active view
|
||||
workspace.setActiveLeaf(calendarLeaf, { focus: true });
|
||||
|
||||
new Notice('ChronoSync views created. You can drag and rearrange these tabs as needed.');
|
||||
new Notice('TaskNotes views created. You can drag and rearrange these tabs as needed.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -443,7 +419,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
});
|
||||
|
||||
// Group these leaves together
|
||||
const groupName = 'chronosync-grid';
|
||||
const groupName = 'tasknotes-grid';
|
||||
calendarLeaf.setGroup(groupName);
|
||||
tasksLeaf.setGroup(groupName);
|
||||
notesLeaf.setGroup(groupName);
|
||||
|
|
@ -452,7 +428,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
workspace.setActiveLeaf(calendarLeaf, { focus: true });
|
||||
|
||||
// Show a notice to let the user know they can rearrange the tabs
|
||||
new Notice('ChronoSync views created in grid layout. You can drag and rearrange these tabs freely.');
|
||||
new Notice('TaskNotes views created in grid layout. You can drag and rearrange these tabs freely.');
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -494,7 +470,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
});
|
||||
|
||||
// Group these views for synchronized date selection
|
||||
const groupName = 'chronosync-tabs';
|
||||
const groupName = 'tasknotes-tabs';
|
||||
firstLeaf.setGroup(groupName);
|
||||
secondLeaf.setGroup(groupName);
|
||||
thirdLeaf.setGroup(groupName);
|
||||
|
|
@ -502,7 +478,7 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
// Make the calendar view active
|
||||
workspace.setActiveLeaf(firstLeaf, { focus: true });
|
||||
|
||||
new Notice('ChronoSync tabs created. You can now freely drag and rearrange these tabs.');
|
||||
new Notice('TaskNotes tabs created. You can now freely drag and rearrange these tabs.');
|
||||
}
|
||||
|
||||
getLeafOfType(viewType: string): WorkspaceLeaf | null {
|
||||
|
|
@ -563,49 +539,6 @@ export default class ChronoSyncPlugin extends Plugin {
|
|||
}
|
||||
}
|
||||
|
||||
async incrementPomodoros() {
|
||||
await this.updateDailyNoteMetadata('pomodoros', (val) => {
|
||||
const current = typeof val === 'number' ? val : 0;
|
||||
return current + 1;
|
||||
});
|
||||
}
|
||||
|
||||
async toggleDailyMetadata(key: 'workout' | 'meditate') {
|
||||
await this.updateDailyNoteMetadata(key, (val) => {
|
||||
return typeof val === 'boolean' ? !val : true;
|
||||
});
|
||||
}
|
||||
|
||||
async updateDailyNoteMetadata(key: string, updateFn: (val: any) => any) {
|
||||
// Get the current daily note file
|
||||
const date = new Date();
|
||||
const dailyNoteFileName = format(date, 'yyyy-MM-dd') + '.md';
|
||||
const dailyNotePath = normalizePath(`${this.settings.dailyNotesFolder}/${dailyNoteFileName}`);
|
||||
|
||||
// Check if the daily note exists, if not create it
|
||||
const fileExists = await this.app.vault.adapter.exists(dailyNotePath);
|
||||
|
||||
if (!fileExists) {
|
||||
await this.navigateToCurrentDailyNote();
|
||||
}
|
||||
|
||||
// Get the file and update its metadata
|
||||
const file = this.app.vault.getAbstractFileByPath(dailyNotePath);
|
||||
if (file instanceof TFile) {
|
||||
try {
|
||||
// Process the frontmatter using FileManager.processFrontMatter for safer modification
|
||||
await this.app.fileManager.processFrontMatter(file, (frontmatter) => {
|
||||
frontmatter[key] = updateFn(frontmatter[key]);
|
||||
});
|
||||
|
||||
// Show notice
|
||||
new Notice(`Updated ${key} in daily note`);
|
||||
} catch (error) {
|
||||
console.error('Error updating daily note metadata:', error);
|
||||
new Notice('Error updating daily note metadata');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
generateDailyNoteTemplate(date: Date): string {
|
||||
const startTime = parseTime(this.settings.timeblockStartTime);
|
||||
|
|
|
|||
|
|
@ -1,12 +1,12 @@
|
|||
import { App, Modal, Notice, TFile } from 'obsidian';
|
||||
import { format } from 'date-fns';
|
||||
import * as YAML from 'yaml';
|
||||
import ChronoSyncPlugin from '../main';
|
||||
import TaskNotesPlugin from '../main';
|
||||
import { ensureFolderExists } from '../utils/helpers';
|
||||
import { CALENDAR_VIEW_TYPE, TaskFrontmatter, TaskInfo, TimeEntry } from '../types';
|
||||
|
||||
export class TaskCreationModal extends Modal {
|
||||
plugin: ChronoSyncPlugin;
|
||||
plugin: TaskNotesPlugin;
|
||||
title: string = '';
|
||||
details: string = '';
|
||||
dueDate: string = '';
|
||||
|
|
@ -20,7 +20,7 @@ export class TaskCreationModal extends Modal {
|
|||
dayOfMonth: string = '';
|
||||
monthOfYear: string = '';
|
||||
|
||||
constructor(app: App, plugin: ChronoSyncPlugin) {
|
||||
constructor(app: App, plugin: TaskNotesPlugin) {
|
||||
super(app);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
import { App, PluginSettingTab, Setting } from 'obsidian';
|
||||
import ChronoSyncPlugin from '../main';
|
||||
import TaskNotesPlugin from '../main';
|
||||
|
||||
export interface ChronoSyncSettings {
|
||||
export interface TaskNotesSettings {
|
||||
dailyNotesFolder: string;
|
||||
tasksFolder: string; // Now just a default location for new tasks
|
||||
taskTag: string; // The tag that identifies tasks
|
||||
|
|
@ -15,9 +15,9 @@ export interface ChronoSyncSettings {
|
|||
taskOrgFiltersCollapsed: boolean; // Save collapse state of task organization filters
|
||||
}
|
||||
|
||||
export const DEFAULT_SETTINGS: ChronoSyncSettings = {
|
||||
dailyNotesFolder: 'ChronoSync/Daily',
|
||||
tasksFolder: 'ChronoSync/Tasks',
|
||||
export const DEFAULT_SETTINGS: TaskNotesSettings = {
|
||||
dailyNotesFolder: 'TaskNotes/Daily',
|
||||
tasksFolder: 'TaskNotes/Tasks',
|
||||
taskTag: 'task',
|
||||
excludedFolders: '', // Default to no excluded folders
|
||||
defaultTaskPriority: 'normal',
|
||||
|
|
@ -29,10 +29,10 @@ export const DEFAULT_SETTINGS: ChronoSyncSettings = {
|
|||
taskOrgFiltersCollapsed: false // Default to expanded
|
||||
};
|
||||
|
||||
export class ChronoSyncSettingTab extends PluginSettingTab {
|
||||
plugin: ChronoSyncPlugin;
|
||||
export class TaskNotesSettingTab extends PluginSettingTab {
|
||||
plugin: TaskNotesPlugin;
|
||||
|
||||
constructor(app: App, plugin: ChronoSyncPlugin) {
|
||||
constructor(app: App, plugin: TaskNotesPlugin) {
|
||||
super(app, plugin);
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
|
@ -46,7 +46,7 @@ export class ChronoSyncSettingTab extends PluginSettingTab {
|
|||
.setName('Daily notes folder')
|
||||
.setDesc('Folder where daily notes will be stored')
|
||||
.addText(text => text
|
||||
.setPlaceholder('ChronoSync/Daily')
|
||||
.setPlaceholder('TaskNotes/Daily')
|
||||
.setValue(this.plugin.settings.dailyNotesFolder)
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.dailyNotesFolder = value;
|
||||
|
|
@ -57,7 +57,7 @@ export class ChronoSyncSettingTab extends PluginSettingTab {
|
|||
.setName('Default tasks folder')
|
||||
.setDesc('Default folder for new tasks (tasks are identified by tag, not folder)')
|
||||
.addText(text => text
|
||||
.setPlaceholder('ChronoSync/Tasks')
|
||||
.setPlaceholder('TaskNotes/Tasks')
|
||||
.setValue(this.plugin.settings.tasksFolder)
|
||||
.onChange(async (value) => {
|
||||
this.plugin.settings.tasksFolder = value;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
// View types
|
||||
export const CALENDAR_VIEW_TYPE = 'chronosync-calendar-view';
|
||||
export const TASK_LIST_VIEW_TYPE = 'chronosync-task-list-view';
|
||||
export const NOTES_VIEW_TYPE = 'chronosync-notes-view';
|
||||
export const CALENDAR_VIEW_TYPE = 'tasknotes-calendar-view';
|
||||
export const TASK_LIST_VIEW_TYPE = 'tasknotes-task-list-view';
|
||||
export const NOTES_VIEW_TYPE = 'tasknotes-notes-view';
|
||||
|
||||
// Event types
|
||||
export const EVENT_DATE_SELECTED = 'date-selected';
|
||||
|
|
@ -85,9 +85,6 @@ export interface IndexedFile {
|
|||
// YAML Frontmatter types
|
||||
export interface DailyNoteFrontmatter {
|
||||
date?: string;
|
||||
pomodoros?: number;
|
||||
workout?: boolean;
|
||||
meditate?: boolean;
|
||||
tags?: string[];
|
||||
important?: boolean;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -142,9 +142,6 @@ export function generateDailyNoteTemplate(date: Date, timeblockStartTime: TimeIn
|
|||
// Create the YAML frontmatter
|
||||
const yaml = {
|
||||
date: dateStr,
|
||||
pomodoros: 0,
|
||||
workout: false,
|
||||
meditate: false,
|
||||
tags: ['daily']
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { Notice, TFile, ItemView, WorkspaceLeaf, normalizePath } from 'obsidian';
|
||||
import { format } from 'date-fns';
|
||||
import ChronoSyncPlugin from '../main';
|
||||
import TaskNotesPlugin from '../main';
|
||||
import {
|
||||
CALENDAR_VIEW_TYPE,
|
||||
EVENT_DATA_CHANGED,
|
||||
|
|
@ -22,14 +22,14 @@ export class CalendarView extends ItemView {
|
|||
// Static property to track initialization status for daily notes
|
||||
static dailyNotesInitialized: boolean = false;
|
||||
|
||||
plugin: ChronoSyncPlugin;
|
||||
plugin: TaskNotesPlugin;
|
||||
displayMode: CalendarDisplayMode = 'month';
|
||||
colorizeMode: ColorizeMode = 'tasks';
|
||||
|
||||
// Event listeners
|
||||
private listeners: (() => void)[] = [];
|
||||
|
||||
constructor(leaf: WorkspaceLeaf, plugin: ChronoSyncPlugin) {
|
||||
constructor(leaf: WorkspaceLeaf, plugin: TaskNotesPlugin) {
|
||||
super(leaf);
|
||||
this.plugin = plugin;
|
||||
|
||||
|
|
@ -67,7 +67,7 @@ export class CalendarView extends ItemView {
|
|||
contentEl.empty();
|
||||
|
||||
// Add a container for our view content
|
||||
const container = contentEl.createDiv({ cls: 'chronosync-container calendar-view-container' });
|
||||
const container = contentEl.createDiv({ cls: 'tasknotes-container calendar-view-container' });
|
||||
|
||||
// Show loading indicator while loading initial data
|
||||
this.showLoadingIndicator();
|
||||
|
|
@ -348,7 +348,7 @@ export class CalendarView extends ItemView {
|
|||
this.showLoadingIndicator();
|
||||
|
||||
try {
|
||||
const container = this.contentEl.querySelector('.chronosync-container') as HTMLElement;
|
||||
const container = this.contentEl.querySelector('.tasknotes-container') as HTMLElement;
|
||||
if (container) {
|
||||
// Simply render the view and get fresh data from FileIndexer
|
||||
this.renderView(container);
|
||||
|
|
@ -388,7 +388,7 @@ export class CalendarView extends ItemView {
|
|||
|
||||
// Show a loading indicator while building cache
|
||||
private showLoadingIndicator() {
|
||||
const container = this.contentEl.querySelector('.chronosync-container');
|
||||
const container = this.contentEl.querySelector('.tasknotes-container');
|
||||
if (!container) return;
|
||||
|
||||
// Check if indicator already exists
|
||||
|
|
@ -515,7 +515,7 @@ export class CalendarView extends ItemView {
|
|||
// Today button
|
||||
const todayButton = navContainer.createEl('button', {
|
||||
text: 'Today',
|
||||
cls: 'today-button chronosync-button chronosync-button-primary',
|
||||
cls: 'today-button tasknotes-button tasknotes-button-primary',
|
||||
attr: {
|
||||
'aria-label': 'Go to today',
|
||||
'title': 'Go to today (T key)'
|
||||
|
|
@ -1029,7 +1029,7 @@ export class CalendarView extends ItemView {
|
|||
// Show preview for the daily note only
|
||||
this.app.workspace.trigger('hover-link', {
|
||||
event,
|
||||
source: 'chronosync-calendar',
|
||||
source: 'tasknotes-calendar',
|
||||
hoverParent: this,
|
||||
targetEl: targetEl,
|
||||
linktext: dailyNotePath,
|
||||
|
|
@ -1171,7 +1171,7 @@ export class CalendarView extends ItemView {
|
|||
if (file) {
|
||||
this.app.workspace.trigger('hover-link', {
|
||||
event,
|
||||
source: 'chronosync-agenda',
|
||||
source: 'tasknotes-agenda',
|
||||
hoverParent: this,
|
||||
targetEl: item,
|
||||
linktext: task.path,
|
||||
|
|
@ -1208,7 +1208,7 @@ export class CalendarView extends ItemView {
|
|||
if (file) {
|
||||
this.app.workspace.trigger('hover-link', {
|
||||
event,
|
||||
source: 'chronosync-agenda',
|
||||
source: 'tasknotes-agenda',
|
||||
hoverParent: this,
|
||||
targetEl: item,
|
||||
linktext: note.path,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { Notice, TFile, ItemView, WorkspaceLeaf } from 'obsidian';
|
||||
import { format } from 'date-fns';
|
||||
import ChronoSyncPlugin from '../main';
|
||||
import TaskNotesPlugin from '../main';
|
||||
import {
|
||||
NOTES_VIEW_TYPE,
|
||||
NoteInfo,
|
||||
|
|
@ -9,7 +9,7 @@ import {
|
|||
} from '../types';
|
||||
|
||||
export class NotesView extends ItemView {
|
||||
plugin: ChronoSyncPlugin;
|
||||
plugin: TaskNotesPlugin;
|
||||
|
||||
// UI elements
|
||||
private loadingIndicator: HTMLElement | null = null;
|
||||
|
|
@ -25,7 +25,7 @@ export class NotesView extends ItemView {
|
|||
// Event listeners
|
||||
private listeners: (() => void)[] = [];
|
||||
|
||||
constructor(leaf: WorkspaceLeaf, plugin: ChronoSyncPlugin) {
|
||||
constructor(leaf: WorkspaceLeaf, plugin: TaskNotesPlugin) {
|
||||
super(leaf);
|
||||
this.plugin = plugin;
|
||||
|
||||
|
|
@ -88,7 +88,7 @@ export class NotesView extends ItemView {
|
|||
}
|
||||
|
||||
async render() {
|
||||
const container = this.contentEl.createDiv({ cls: 'chronosync-container notes-view-container' });
|
||||
const container = this.contentEl.createDiv({ cls: 'tasknotes-container notes-view-container' });
|
||||
|
||||
// Create header with current date information
|
||||
this.createHeader(container);
|
||||
|
|
@ -110,7 +110,7 @@ export class NotesView extends ItemView {
|
|||
// Add refresh button
|
||||
const refreshButton = actionsContainer.createEl('button', {
|
||||
text: 'Refresh',
|
||||
cls: 'refresh-notes-button chronosync-button chronosync-button-secondary',
|
||||
cls: 'refresh-notes-button tasknotes-button tasknotes-button-secondary',
|
||||
attr: {
|
||||
'aria-label': 'Refresh notes list',
|
||||
'title': 'Refresh notes list'
|
||||
|
|
@ -162,10 +162,10 @@ export class NotesView extends ItemView {
|
|||
notes.forEach(note => {
|
||||
const noteItem = document.createElement('div');
|
||||
const isDailyNote = note.path.startsWith(this.plugin.settings.dailyNotesFolder);
|
||||
noteItem.className = `note-item chronosync-card ${isDailyNote ? 'daily-note-item' : ''}`;
|
||||
noteItem.className = `note-item tasknotes-card ${isDailyNote ? 'daily-note-item' : ''}`;
|
||||
|
||||
const titleEl = document.createElement('div');
|
||||
titleEl.className = 'note-item-title chronosync-card-header';
|
||||
titleEl.className = 'note-item-title tasknotes-card-header';
|
||||
|
||||
// Add indicator for daily notes
|
||||
if (isDailyNote) {
|
||||
|
|
@ -180,7 +180,7 @@ export class NotesView extends ItemView {
|
|||
noteItem.appendChild(titleEl);
|
||||
|
||||
const contentContainer = document.createElement('div');
|
||||
contentContainer.className = 'chronosync-card-content';
|
||||
contentContainer.className = 'tasknotes-card-content';
|
||||
|
||||
// Add created date if available
|
||||
if (note.createdDate) {
|
||||
|
|
@ -198,7 +198,7 @@ export class NotesView extends ItemView {
|
|||
// Add tags as footer
|
||||
if (note.tags && note.tags.length > 0) {
|
||||
const tagContainer = document.createElement('div');
|
||||
tagContainer.className = 'note-item-tags chronosync-card-footer';
|
||||
tagContainer.className = 'note-item-tags tasknotes-card-footer';
|
||||
|
||||
note.tags.forEach(tag => {
|
||||
const tagEl = document.createElement('span');
|
||||
|
|
@ -221,7 +221,7 @@ export class NotesView extends ItemView {
|
|||
if (file) {
|
||||
this.app.workspace.trigger('hover-link', {
|
||||
event,
|
||||
source: 'chronosync-notes',
|
||||
source: 'tasknotes-notes',
|
||||
hoverParent: this,
|
||||
targetEl: noteItem,
|
||||
linktext: note.path,
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
import { Notice, TFile, ItemView, WorkspaceLeaf } from 'obsidian';
|
||||
import { format } from 'date-fns';
|
||||
import ChronoSyncPlugin from '../main';
|
||||
import TaskNotesPlugin from '../main';
|
||||
import {
|
||||
TASK_LIST_VIEW_TYPE,
|
||||
TaskInfo,
|
||||
|
|
@ -17,7 +17,7 @@ import {
|
|||
} from '../utils/helpers';
|
||||
|
||||
export class TaskListView extends ItemView {
|
||||
plugin: ChronoSyncPlugin;
|
||||
plugin: TaskNotesPlugin;
|
||||
|
||||
// UI elements
|
||||
private taskListContainer: HTMLElement | null = null;
|
||||
|
|
@ -45,7 +45,7 @@ export class TaskListView extends ItemView {
|
|||
// Event listeners
|
||||
private listeners: (() => void)[] = [];
|
||||
|
||||
constructor(leaf: WorkspaceLeaf, plugin: ChronoSyncPlugin) {
|
||||
constructor(leaf: WorkspaceLeaf, plugin: TaskNotesPlugin) {
|
||||
super(leaf);
|
||||
this.plugin = plugin;
|
||||
|
||||
|
|
@ -117,7 +117,7 @@ export class TaskListView extends ItemView {
|
|||
}
|
||||
|
||||
async render() {
|
||||
const container = this.contentEl.createDiv({ cls: 'chronosync-container task-list-view-container' });
|
||||
const container = this.contentEl.createDiv({ cls: 'tasknotes-container task-list-view-container' });
|
||||
|
||||
// Create header with current date information
|
||||
this.createHeader(container);
|
||||
|
|
@ -138,7 +138,7 @@ export class TaskListView extends ItemView {
|
|||
|
||||
const addTaskButton = actionsContainer.createEl('button', {
|
||||
text: 'New Task',
|
||||
cls: 'add-task-button chronosync-button chronosync-button-primary',
|
||||
cls: 'add-task-button tasknotes-button tasknotes-button-primary',
|
||||
attr: {
|
||||
'aria-label': 'Create new task',
|
||||
'title': 'Create new task'
|
||||
|
|
@ -180,7 +180,7 @@ export class TaskListView extends ItemView {
|
|||
// Refresh button in primary row
|
||||
const refreshButton = primaryFiltersRow.createEl('button', {
|
||||
text: 'Refresh',
|
||||
cls: 'refresh-tasks-button chronosync-button chronosync-button-secondary',
|
||||
cls: 'refresh-tasks-button tasknotes-button tasknotes-button-secondary',
|
||||
attr: {
|
||||
'aria-label': 'Refresh task list',
|
||||
'title': 'Refresh task list'
|
||||
|
|
@ -438,7 +438,7 @@ export class TaskListView extends ItemView {
|
|||
: task.status;
|
||||
|
||||
const taskItem = container.createDiv({
|
||||
cls: `task-item priority-${task.priority} ${isDueOnSelectedDate ? 'task-due-today' : ''} ${task.archived ? 'task-archived' : ''} ${task.recurrence ? 'task-recurring' : ''} chronosync-card`
|
||||
cls: `task-item priority-${task.priority} ${isDueOnSelectedDate ? 'task-due-today' : ''} ${task.archived ? 'task-archived' : ''} ${task.recurrence ? 'task-recurring' : ''} tasknotes-card`
|
||||
});
|
||||
|
||||
// Store reference to this task element for future updates
|
||||
|
|
@ -446,7 +446,7 @@ export class TaskListView extends ItemView {
|
|||
this.taskElements.set(task.path, taskItem);
|
||||
|
||||
// Create header row (title and metadata)
|
||||
const taskHeader = taskItem.createDiv({ cls: 'task-header chronosync-card-header' });
|
||||
const taskHeader = taskItem.createDiv({ cls: 'task-header tasknotes-card-header' });
|
||||
|
||||
// Create info section (left side)
|
||||
const taskInfo = taskHeader.createDiv({ cls: 'task-info' });
|
||||
|
|
@ -801,7 +801,7 @@ export class TaskListView extends ItemView {
|
|||
if (file) {
|
||||
this.app.workspace.trigger('hover-link', {
|
||||
event,
|
||||
source: 'chronosync-tasks',
|
||||
source: 'tasknotes-tasks',
|
||||
hoverParent: this,
|
||||
targetEl: taskInfo,
|
||||
linktext: task.path,
|
||||
|
|
@ -1135,7 +1135,7 @@ export class TaskListView extends ItemView {
|
|||
(updatedTask.recurrence && isRecurringTaskDueOn(updatedTask, this.plugin.selectedDate))
|
||||
);
|
||||
|
||||
taskElement.className = `task-item priority-${updatedTask.priority} ${isDueOnSelectedDate ? 'task-due-today' : ''} ${updatedTask.archived ? 'task-archived' : ''} ${updatedTask.recurrence ? 'task-recurring' : ''} chronosync-card`;
|
||||
taskElement.className = `task-item priority-${updatedTask.priority} ${isDueOnSelectedDate ? 'task-due-today' : ''} ${updatedTask.archived ? 'task-archived' : ''} ${updatedTask.recurrence ? 'task-recurring' : ''} tasknotes-card`;
|
||||
|
||||
// Add visual feedback for the update
|
||||
taskElement.classList.add('task-updated');
|
||||
|
|
|
|||
62
styles.css
62
styles.css
|
|
@ -70,7 +70,7 @@ button.processing::after {
|
|||
|
||||
/* Accessibility - Focus Styles */
|
||||
.calendar-day:focus,
|
||||
.chronosync-tab:focus,
|
||||
.tasknotes-tab:focus,
|
||||
.task-toggle-button:focus,
|
||||
.calendar-nav button:focus,
|
||||
.add-task-button:focus,
|
||||
|
|
@ -101,7 +101,7 @@ button.processing::after {
|
|||
}
|
||||
|
||||
/* Main container for all views - denser layout */
|
||||
.chronosync-container {
|
||||
.tasknotes-container {
|
||||
padding: var(--cs-spacing-sm);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
|
@ -666,7 +666,7 @@ button.processing::after {
|
|||
}
|
||||
|
||||
/* Main Content Area with Tabs */
|
||||
.chronosync-main-content {
|
||||
.tasknotes-main-content {
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 6px;
|
||||
overflow: hidden;
|
||||
|
|
@ -676,13 +676,13 @@ button.processing::after {
|
|||
box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
|
||||
}
|
||||
|
||||
.chronosync-tabs {
|
||||
.tasknotes-tabs {
|
||||
display: flex;
|
||||
background-color: var(--background-secondary);
|
||||
border-bottom: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.chronosync-tab {
|
||||
.tasknotes-tab {
|
||||
padding: 0.5rem 1rem;
|
||||
cursor: pointer;
|
||||
background: none;
|
||||
|
|
@ -695,17 +695,17 @@ button.processing::after {
|
|||
text-align: center;
|
||||
}
|
||||
|
||||
.chronosync-tab:hover {
|
||||
.tasknotes-tab:hover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.chronosync-tab.active {
|
||||
.tasknotes-tab.active {
|
||||
background-color: var(--background-primary);
|
||||
color: var(--text-accent);
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.chronosync-tab.active::after {
|
||||
.tasknotes-tab.active::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
|
|
@ -716,7 +716,7 @@ button.processing::after {
|
|||
transition: transform 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.chronosync-content-area {
|
||||
.tasknotes-content-area {
|
||||
padding: 1rem;
|
||||
background-color: var(--background-primary);
|
||||
flex-grow: 1;
|
||||
|
|
@ -923,7 +923,7 @@ button.processing::after {
|
|||
}
|
||||
|
||||
/* Unified Card Styles - more compact and consistent */
|
||||
.chronosync-card {
|
||||
.tasknotes-card {
|
||||
padding: var(--cs-spacing-sm);
|
||||
border-radius: var(--cs-radius-sm);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
|
|
@ -932,13 +932,13 @@ button.processing::after {
|
|||
transition: all var(--cs-transition-fast);
|
||||
}
|
||||
|
||||
.chronosync-card:hover {
|
||||
.tasknotes-card:hover {
|
||||
background-color: var(--background-modifier-hover);
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.chronosync-card-header {
|
||||
.tasknotes-card-header {
|
||||
font-weight: 500;
|
||||
font-size: var(--cs-text-sm);
|
||||
margin-bottom: var(--cs-spacing-xs);
|
||||
|
|
@ -949,12 +949,12 @@ button.processing::after {
|
|||
align-items: center;
|
||||
}
|
||||
|
||||
.chronosync-card-content {
|
||||
.tasknotes-card-content {
|
||||
color: var(--text-normal);
|
||||
font-size: var(--cs-text-sm);
|
||||
}
|
||||
|
||||
.chronosync-card-footer {
|
||||
.tasknotes-card-footer {
|
||||
margin-top: var(--cs-spacing-xs);
|
||||
padding-top: var(--cs-spacing-xs);
|
||||
border-top: 1px solid var(--background-modifier-border);
|
||||
|
|
@ -1283,7 +1283,7 @@ button.processing::after {
|
|||
@media (pointer: coarse) {
|
||||
/* Improvements for touch interfaces */
|
||||
.calendar-day,
|
||||
.chronosync-tab,
|
||||
.tasknotes-tab,
|
||||
.task-toggle-button,
|
||||
.refresh-tasks-button,
|
||||
.add-task-button,
|
||||
|
|
@ -1833,7 +1833,7 @@ button.processing::after {
|
|||
}
|
||||
|
||||
/* Unified Button Styles */
|
||||
.chronosync-button {
|
||||
.tasknotes-button {
|
||||
padding: 0.35rem 0.7rem;
|
||||
border-radius: 4px;
|
||||
font-size: 0.9rem;
|
||||
|
|
@ -1846,41 +1846,41 @@ button.processing::after {
|
|||
transition: background-color 0.2s, transform 0.1s, box-shadow 0.2s;
|
||||
}
|
||||
|
||||
.chronosync-button:hover {
|
||||
.tasknotes-button:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 3px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.chronosync-button:active {
|
||||
.tasknotes-button:active {
|
||||
transform: translateY(0);
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
.chronosync-button-primary {
|
||||
.tasknotes-button-primary {
|
||||
background-color: var(--interactive-accent);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.chronosync-button-primary:hover {
|
||||
.tasknotes-button-primary:hover {
|
||||
background-color: var(--interactive-accent-hover);
|
||||
}
|
||||
|
||||
.chronosync-button-secondary {
|
||||
.tasknotes-button-secondary {
|
||||
background-color: var(--background-secondary);
|
||||
color: var(--text-normal);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
}
|
||||
|
||||
.chronosync-button-secondary:hover {
|
||||
.tasknotes-button-secondary:hover {
|
||||
background-color: var(--background-secondary-alt);
|
||||
}
|
||||
|
||||
.chronosync-button-small {
|
||||
.tasknotes-button-small {
|
||||
padding: 0.2rem 0.4rem;
|
||||
font-size: 0.8rem;
|
||||
}
|
||||
|
||||
.chronosync-button-icon {
|
||||
.tasknotes-button-icon {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
|
|
@ -2433,7 +2433,7 @@ button.processing::after {
|
|||
}
|
||||
|
||||
/* Status Messages */
|
||||
.chronosync-status-message {
|
||||
.tasknotes-status-message {
|
||||
position: fixed;
|
||||
bottom: 20px;
|
||||
right: 20px;
|
||||
|
|
@ -2457,17 +2457,17 @@ button.processing::after {
|
|||
flex: 1;
|
||||
}
|
||||
|
||||
.chronosync-status-success {
|
||||
.tasknotes-status-success {
|
||||
background-color: var(--background-modifier-success);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.chronosync-status-error {
|
||||
.tasknotes-status-error {
|
||||
background-color: var(--background-modifier-error);
|
||||
color: var(--text-on-accent);
|
||||
}
|
||||
|
||||
.chronosync-status-warning {
|
||||
.tasknotes-status-warning {
|
||||
background-color: var(--background-modifier-error-hover);
|
||||
color: var(--text-normal);
|
||||
}
|
||||
|
|
@ -2479,7 +2479,7 @@ button.processing::after {
|
|||
|
||||
/* Responsive adjustments - maintaining compact design */
|
||||
@media (max-width: 768px) {
|
||||
.chronosync-container {
|
||||
.tasknotes-container {
|
||||
padding: var(--cs-spacing-xs);
|
||||
}
|
||||
|
||||
|
|
@ -2526,11 +2526,11 @@ button.processing::after {
|
|||
font-size: var(--cs-text-xs);
|
||||
}
|
||||
|
||||
.chronosync-tabs {
|
||||
.tasknotes-tabs {
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.chronosync-tab {
|
||||
.tasknotes-tab {
|
||||
padding: var(--cs-spacing-sm);
|
||||
font-size: var(--cs-text-xs);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue