Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -156,3 +156,18 @@ This plugin uses [FullCalendar.io](https://fullcalendar.io/) for its calendar co
## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.

---

## Feature Tweaks & Fixes

- Angle-bracket markdown links resolve correctly across filters, overlays, projects, and dependencies.
- Kanban column headers show configured status/priority labels.
- Property-based task identification no longer injects or mutates `task`/`Task` tags unless explicitly set.
- Project folder icon toggles subtasks (chevron removed on task cards).
- Project titles are bold on task cards; subtasks remain normal weight.
- Subtasks inherit visible properties (including custom fields) and use Bases sort rules with caching.
- Status color shows as dot when visible, or as a right-edge stripe when hidden.
- Manual sorting for Kanban columns and project subtasks with persisted rank fields.
- Project cards refresh after subtask changes and deletes.

38 changes: 38 additions & 0 deletions docs/releases/4.1.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# TaskNotes 4.1.4

This fork release consolidates all changes since upstream 4.1.3 into a single 4.1.4 patch. It focuses on link correctness, kanban usability, project/subtask handling, and quality fixes.

## Highlights

- Full support for markdown links with angle brackets in all key parsing paths: `[Title](<path>)` is treated like `[Title](path)`.
- Kanban columns now use configured status/priority labels instead of raw values.
- Manual sorting for Kanban columns and project subtasks, with persisted ranks.
- Project/subtask UX improvements (folder icon toggle, bold project titles, custom fields on subtasks).

## Added

- Manual sorting in Kanban when the only sort rule is `rankByColumn` (drag handle + persisted `rankByColumn` ranks).
- Manual subtask ordering in the edit dialog when the only sort rule is `rankByColumn` (persisted `rankByProject`).

## Improved

- Project folder icon is now the expand/collapse toggle for subtasks (no separate chevron).
- Project titles render bold on task cards (subtasks remain normal weight).
- Subtask cards inherit the same visible properties as their parent cards, including custom fields.
- Subtask lists reuse the active Bases sort rules and stay consistent even when focus changes.
- Kanban project cards refresh immediately after adding subtasks and after external deletes.
- Kanban status/priority headers use user-configured labels.

## Fixed

- Angle-bracket markdown links resolve correctly across projects, subtasks, dependency badges, overlays, and filters.
- Blocked/Blocking relationships resolve and render correctly with markdown links.
- Property-based task identification no longer injects or modifies `task`/`Task` tags when tags are not explicitly set.
- Status color now shows as a stripe on the right edge when the status property is hidden.

## Refactors / Quality

- Centralized project display-name parsing to reduce duplication and ensure consistent link handling.
- Removed verbose Bases rendering logs for better performance.
- Removed license validation console logging to avoid leaking sensitive data.

3 changes: 3 additions & 0 deletions generate-release-notes-import.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,9 @@ const versionsWithDates = versionsToBundle.map(version => ({
version,
date: getVersionDate(version)
})).sort((a, b) => {
// Always show the current version first
if (a.version === currentVersion && b.version !== currentVersion) return -1;
if (b.version === currentVersion && a.version !== currentVersion) return 1;
// Versions without dates go to the end
if (!a.date && !b.date) return 0;
if (!a.date) return 1;
Expand Down
4 changes: 2 additions & 2 deletions manifest.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
{
"id": "tasknotes",
"name": "TaskNotes",
"version": "4.1.3",
"minAppVersion": "1.10.1",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"author": "Callum Alpass",
"authorUrl": "https://github.com/callumalpass",
"isDesktopOnly": false
"isDesktopOnly": false,
"version": "4.1.4"
}
32 changes: 30 additions & 2 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "tasknotes",
"version": "4.1.3",
"version": "4.1.4",
"description": "Note-based task management with calendar, pomodoro and time-tracking integration.",
"main": "main.js",
"scripts": {
Expand Down
36 changes: 24 additions & 12 deletions src/bases/BasesViewBase.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Component, App, setIcon } from "obsidian";
import TaskNotesPlugin from "../main";
import { BasesDataAdapter } from "./BasesDataAdapter";
import { PropertyMappingService } from "./PropertyMappingService";
import { TaskInfo, EVENT_TASK_UPDATED } from "../types";
import { TaskInfo, EVENT_TASK_UPDATED, EVENT_TASK_DELETED } from "../types";
import { convertInternalToUserProperties } from "../utils/propertyMapping";
import { DEFAULT_INTERNAL_VISIBLE_PROPERTIES } from "../settings/defaults";
import { SearchBox } from "./components/SearchBox";
Expand All @@ -25,7 +25,8 @@ export abstract class BasesViewBase extends Component {
protected propertyMapper: PropertyMappingService;
protected containerEl: HTMLElement;
protected rootElement: HTMLElement | null = null;
protected taskUpdateListener: any = null;
protected taskUpdateListener: any = null;
protected taskDeleteListener: any = null;
protected updateDebounceTimer: number | null = null;
protected dataUpdateDebounceTimer: number | null = null;
protected relevantPathsCache: Set<string> = new Set();
Expand Down Expand Up @@ -282,8 +283,8 @@ export abstract class BasesViewBase extends Component {
* Setup listener for real-time task updates.
* Uses Component.register() for automatic cleanup on unload.
*/
protected setupTaskUpdateListener(): void {
if (this.taskUpdateListener) return;
protected setupTaskUpdateListener(): void {
if (this.taskUpdateListener) return;

this.taskUpdateListener = this.plugin.emitter.on(EVENT_TASK_UPDATED, async (eventData: any) => {
try {
Expand All @@ -305,14 +306,25 @@ export abstract class BasesViewBase extends Component {
}
});

// Register cleanup using Component lifecycle
this.register(() => {
if (this.taskUpdateListener) {
this.plugin.emitter.offref(this.taskUpdateListener);
this.taskUpdateListener = null;
}
});
}
// Register cleanup using Component lifecycle
this.register(() => {
if (this.taskUpdateListener) {
this.plugin.emitter.offref(this.taskUpdateListener);
this.taskUpdateListener = null;
}
if (this.taskDeleteListener) {
this.plugin.emitter.offref(this.taskDeleteListener);
this.taskDeleteListener = null;
}
});

this.taskDeleteListener = this.plugin.emitter.on(EVENT_TASK_DELETED, () => {
if (!this.rootElement?.isConnected) return;
// Ensure subtasks/project indices are up to date
this.plugin.projectSubtasksService?.invalidateIndex();
this.debouncedRefresh();
});
}

/**
* Debounced refresh to prevent multiple rapid re-renders.
Expand Down
Loading