Skip to content

feat: add Duration field to tasks - #3768

Open
rmartin wants to merge 20 commits into
obsidian-tasks-group:mainfrom
rmartin:feat/add-duration-field
Open

feat: add Duration field to tasks#3768
rmartin wants to merge 20 commits into
obsidian-tasks-group:mainfrom
rmartin:feat/add-duration-field

Conversation

@rmartin

@rmartin rmartin commented Feb 23, 2026

Copy link
Copy Markdown

Types of changes

Internal changes:

  • Tests (prefix: test - additions and improvements to unit tests and the smoke tests)

Description

Implements an estimated duration field for tasks, as requested in issue #1649.

This PR is a continuation of the work started in #3464, rebased onto the current main branch and fully rounded out per the requirements listed in #1649 (comment).

What was added

Core storage and parsing

  • New Duration class (src/Task/Duration.ts) — immutable value object with normalisation (e.g. 90m1h30m), a Duration.None sentinel, and fromText / toText / fromTotalMinutes helpers
  • Serialiser support in both Tasks emoji format () and Dataview inline field format ([duration:: ...])
  • Task class extended with duration, durationHours, and durationMinutes properties

Query language

  • DurationField supporting: has duration, no duration, duration is <value>, duration above <value>, duration below <value>
  • sort by duration / sort by duration reverse — tasks with no duration sort after tasks with a duration
  • group by duration / group by duration reverse — tasks with no duration group as No duration
  • hide duration / show duration layout instructions
  • Duration added to the hide_non_date_fields preset

Edit modal

  • New DurationEditor.svelte component with real-time validation and normalised preview
  • Duration field is togglable via modal show/hide settings

Auto-suggest

  • Duration symbol registered in the suggestor trigger regex for both formats
  • Common presets offered: 15m, 30m, 45m, 1h, 1h30m, 2h, 3h, 4h

Documentation

  • New standalone page: docs/Getting Started/Duration.md
  • Duration sections added to Filters, Sorting, Grouping, Quick Reference, and Presets docs

How has this been tested?

New automated tests added.

Manual testing completed on Desktop (macOS) and Mobile (iOS) — videos to follow:

  • Task creation and editing via the modal in both Tasks emoji and Dataview formats
  • All filter instructions (has duration, no duration, duration is, duration above, duration below) verified against a test vault with boundary and normalisation tasks
  • Sort order (ascending, descending, no-duration-last) verified visually
  • Group by duration (including No duration group) verified visually
  • Auto-suggest in both Tasks emoji and Dataview formats confirmed working
  • Edit modal validation (valid input, normalisation preview, invalid input red highlight) verified on desktop and mobile
  • 0h1200m confirmed to normalise to 20h

Screenshots / Videos

Checklist

  • My code changes are on a branch, and not on the main branch.
  • My code follows the code style of this project and passes yarn run lint
  • My change requires a change to the documentation
  • I have updated the documentation accordingly
  • My change has adequate unit test coverage

Terms

Implements estimated duration as a new task field, addressing the
feature request in issue obsidian-tasks-group#1649.

## What was added

**Core storage and parsing**
- New `Duration` class (`src/Task/Duration.ts`): immutable value object
  storing hours and minutes, with normalisation (90m → 1h30m), a
  `Duration.None` sentinel, and `fromText`/`toText`/`fromTotalMinutes`
  helpers
- Serialiser support in both Tasks emoji format (⏱) and Dataview inline
  field format (`[duration:: ...]`)
- `Task` class extended with `duration`, `durationHours`, and
  `durationMinutes` properties

**Query language**
- New `DurationField` filter supporting `has duration`, `no duration`,
  `duration is <value>`, `duration above <value>`, `duration below <value>`
- `sort by duration` / `sort by duration reverse` — tasks with no
  duration sort after tasks with a duration
- `group by duration` / `group by duration reverse` — tasks with no
  duration group as "No duration"
- `hide duration` / `show duration` layout instructions

**Edit modal**
- New `DurationEditor.svelte` component with real-time validation and
  normalised preview; duration field is togglable via modal settings

**Auto-suggest**
- Duration symbol added to the suggestor trigger regex
- Common presets suggested: 15m, 30m, 45m, 1h, 1h30m, 2h, 3h, 4h
- Works in both Tasks emoji and Dataview formats

**Documentation**
- New standalone page: `docs/Getting Started/Duration.md`
- Duration sections added to Filters, Sorting, Grouping, and Quick
  Reference docs

## Testing

All 4703 existing tests continue to pass. New tests added:

- `tests/Task/Duration.test.ts` — Duration class: parsing, normalisation,
  edge cases, `toText`, `totalMinutes`, `fromTotalMinutes`
- `tests/Query/Filter/DurationField.test.ts` — all filter keywords,
  boundary conditions, sort order (including no-duration-last), grouping,
  and `canCreateFilterForLine`
- `tests/ui/DurationEditor.test.ts` — Svelte component: empty input,
  valid input, normalisation (90m→1h30m), invalid input error state,
  initial value pre-population
- `tests/ui/EditableTask.test.ts` — `parseAndValidateDuration()`: all
  valid formats, normalisation, and invalid input error messages
- `tests/Query/Query.test.ts` — wire-up tests for all duration
  instructions
- Approval tests updated for renderer, suggestor, and serialiser snapshots

Manual testing completed on desktop and mobile (videos recorded):
- Task creation and editing via the modal in both emoji and Dataview formats
- All filter instructions verified against a test vault
- Auto-suggest in Dataview format confirmed working
- Sort and group by duration verified visually

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@rmartin

rmartin commented Feb 23, 2026

Copy link
Copy Markdown
Author

Please find the testing validation for the various scenarios on desktop and mobile including the emoji rendering

Desktop Emoji Edit

obsidian-task-plugin-testing-desktop-emoji-small-edit.mov

Desktop Emoji Report

obsidian-task-plugin-testing-desktop-emoji-small-report.mov

Desktop Dataview Edit

obsidian-task-plugin-testing-desktop-dataview-small-edit.mov

Desktop Dataview Report

obsidian-task-plugin-testing-desktop-dataview-small-report.mov

Mobile Emoji Edit

obsidian-task-plugin-testing-mobile-emoji-small-edit.mov

Mobile Dataview Edit

obsidian-task-plugin-testing-mobile-dataview-small-edit.mov

Mobile Emoji / Dataview Report

obsidian-task-plugin-testing-mobile-emoji-small-report.mov

…bsidian-tasks-group#3767)

PR obsidian-tasks-group#3767 (fix-mutable-dates) made Task date fields private (`_createdDate`
etc.) with public getters using a `resolveDate()` helper to support safe
spreading.

Conflicts resolved in three files:

- `src/Task/Task.ts`: kept `duration` as a public readonly field alongside
  the new private date fields; added `duration` to the constructor
  destructuring and used `this.duration = duration ?? Duration.None` in
  the body alongside the `resolveDate()` calls
- `src/TaskSerializer/DefaultTaskSerializer.ts`: replaced the old
  hand-rolled match blocks (which our branch still had) with a single
  `this.extractField(state, durationRegex, ...)` call matching the new
  refactored pattern
- `tests/ui/EditableTask.test.ts`: updated inline snapshot to use the
  new private field names (`_doneDate`, `_dueDate`, etc.) while keeping
  the `duration: Duration { hours: 1, minutes: 30 }` entry

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@claremacrae

Copy link
Copy Markdown
Member

Many thanks for doing this.

I'm curious - The PR seems to have been created from the old template, as it doesn't not have the branch checkbox... and it does not list all the changes made (docs and tests, for example...).

How could that happen?

@claremacrae

Copy link
Copy Markdown
Member

FYI I am going to push a few changes to your branch. I will let you know when I have finished.

@claremacrae

Copy link
Copy Markdown
Member

FYI I am going to push a few changes to your branch. I will let you know when I have finished.

I've finished pushing for now.

@claremacrae claremacrae added the type: enhancement New feature or request label Feb 23, 2026
@rmartin

rmartin commented Feb 23, 2026

Copy link
Copy Markdown
Author

thanks @claremacrae - I went back and made sure the PR description included everything that you outlined in #1649 (comment) . And I see the changes that you added. Is there anything else that you'd like to see and test before moving forward or is that pending a more exhaustive review?

@claremacrae

claremacrae commented Feb 23, 2026

Copy link
Copy Markdown
Member

The PR Description

thanks @claremacrae - I went back and made sure the PR description included everything that you outlined in #1649 (comment) .

I was unclear. I have edited the description to add the missing checkboxes (docs and vault updated, and a branch has been created) - those were the things missing from the PR template...

By all means list the user-visible feature changes (things like the new instructions).

It's a good if a plugin user can read the description and see what is provided.

But I would prefer the PR description not to list the finer points of everything that has changed.

So please do not list the individual documentation and test changes. They should be visible in the code, and the code is the source of truth there.

It's a waste of time maintaining and reading detailed lists of internal changes.

What next

(I edited this section a bit for readability)

Is there anything else that you'd like to see and test before moving forward or is that pending a more exhaustive review?

Yes, lots. Too many for it to be feasible to record them all in one code review - it would be unmanageable for you to implement them, and it would be unmanageable for us both to track all the requests.

So there won't be a "more exhaustive review".

So when I am confident of my requested changes, I will pick a reasonably well-bounded initial set of feedback and ask you to address those.

Then we can rinse and repeat.

As a very wild guess, there might be between 5 and 10 small-ish cycles like this, as we address one topic, decision, or area of change - and iterate towards something that is reliable, robust, logical, maintainable and releasable....

@claremacrae

Copy link
Copy Markdown
Member

Just for info, I'm going to be pairing with @ilandikov shortly, and we will have a look at the position of the Duration field in the Edit task modal.

I am sure that the new location can be improved - the Duration field is nothing to do with the Status, Created, Done and Cancelled - but less sure of where exactly to move it to...

So I expect I will be pushing another change to your branch soon....

image

@claremacrae

Copy link
Copy Markdown
Member

I'm going to edit the PR description to shorten it - I appreciate the care that you or an AI took, but I want to keep the PR readable.

Later, once I start doing code reviews, we will track progress on what needs to be done using GitHub's 'Resolve conversation' facility. More about that nearer the time...

claremacrae and others added 2 commits February 23, 2026 11:54
It was previously between Status and Created Date - which didn't seem logical.

It is now between Priorities and Recurrence, in the Dates section...

Co-Authored-By: Ilyas Landikov <93825870+ilandikov@users.noreply.github.com>
It was previously between Start and Before this - which didn't seem logical.

It is now between Priorities and Recurrence, in the Dates section,
consistent with the (new) order of fields in the modal itself.

Co-Authored-By: Ilyas Landikov <93825870+ilandikov@users.noreply.github.com>
@claremacrae

Copy link
Copy Markdown
Member

Just for info, I'm going to be pairing with @ilandikov shortly, and we will have a look at the position of the Duration field in the Edit task modal.

I am sure that the new location can be improved - the Duration field is nothing to do with the Status, Created, Done and Cancelled - but less sure of where exactly to move it to...

So I expect I will be pushing another change to your branch soon....

Done.

The changes are:

image image

@claremacrae claremacrae left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @rmartin, thank you again for working on this.

My first set of comments is around the conceptual order/positioning of the duration field throughout the code base...

Some of these changes will be noticeable to users, including the position of the new field in task lines.

Others are about consistency within the code - where Duration should not be mixed in the middle of date-related code.

Making these changes

DO NOT put all these changes in a single commit. I want to be able to review the changes in manageable chunks, one commit at a time.

So, for example, you could start by

  1. making the requested changes to the Serialiazer code
  2. get the tests to pass
  3. and then commit those changes

And then continue to another area, such as TaskLayout and TaskLayoutOptions (or perhaps have them as two separate commits...)

DO NOT mark conversations as resolved, please. As I review the new commits, I will resolve conversations myself.

Problem with order of fields

The original code that you copied was obviously written by:

  1. searching for all uses of a particular date field
  2. duplicating the code
  3. changing the duplicate to do Duration instead.

This had resulted in a bit of a mess

Requested order

Having experimented with the code, and done exploratory testing, it generally feels logical to me for the Duration to appear after the Priority.

The one exception is in Auto Suggest, where I propose moving Duration lower down the list, based on my estimate of likely frequency of use.

Comment thread docs/Editing/Auto-Suggest.md Outdated
Comment thread docs/Quick Reference.md Outdated
Comment thread src/Layout/TaskLayoutOptions.ts Outdated
Comment thread src/Query/FilterParser.ts Outdated
Comment thread src/Renderer/TaskFieldRenderer.ts
Comment thread tests/CustomMatchers/CustomMatchersForTaskSerializer.ts Outdated
Comment thread tests/Renderer/TaskLineRenderer.test.ts Outdated
Comment thread tests/TaskSerializer/TaskSerializer.test.ts Outdated
Comment thread tests/TestingTools/TaskBuilder.ts Outdated
@claremacrae claremacrae added the status: ready to review PR code, tests and user docs are complete enough for testing and code review to begin. label Feb 23, 2026
@rmartin

rmartin commented Feb 23, 2026

Copy link
Copy Markdown
Author

Sounds good, I appreciate the diligence and thought going into the reviews and comments. I'll review further throughout the week to address these in the logical groupings in small commits to address your feedback. Looking forward to collaborating and learning from this process myself and getting this feature ready for myself and others. Thank you.

@claremacrae claremacrae removed the status: ready to review PR code, tests and user docs are complete enough for testing and code review to begin. label Feb 26, 2026
@claremacrae

Copy link
Copy Markdown
Member

Hi @rmartin, how are you getting on with this?

@rmartin
rmartin force-pushed the feat/add-duration-field branch from d629dd5 to dcdedd3 Compare March 9, 2026 05:17
@rmartin

rmartin commented Mar 9, 2026

Copy link
Copy Markdown
Author

Hi @claremacrae, apologies for the delay — I had some unexpected additional commitments at home and work that took priority. I understand you're starting the larger refactor, and I'm fully committed to working with you to get this feature included.

I've addressed all 17 inline review comments from your first round of feedback. Per your instructions, the changes are split into atomic commits by logical area:

  1. Serializer codea2b4c72 Move Duration below Priority in DefaultTaskSerializer, DataviewTaskSerializer, and index.ts
  2. Task model & TaskBuilder29e58092 Move Duration field, getters, and identicalTo check below Priority
  3. Layout & Renderer91d623a Move Duration in TaskLayoutComponent enum and TaskFieldRenderer below Priority
  4. FilterParser42644b2 Move DurationField registration below PriorityField
  5. Edit Task UI9877c4d Move Duration below Priority in EditableTask and EditTask.svelte
  6. Auto-Suggest4685269 Move Duration suggestions after Recurring, before Created (per your frequency-of-use estimate)
  7. Quick Reference & CustomMatchersdcdedd3 Move Duration section and test helpers below Priority

All 4730 tests pass at each commit. I have not resolved any conversations — leaving that to you as requested.

@rmartin
rmartin requested a review from claremacrae March 9, 2026 05:27
@claremacrae

Copy link
Copy Markdown
Member

Many thanks.

I'm a bit confused, did you force-push?

@claremacrae

Copy link
Copy Markdown
Member

Many thanks.

I'm a bit confused, did you force-push?

Yes, all the commits on this PR are now dated 7th March or 8th March.

May I know the reason for force-pushing please?

I had expected only to have to review the differences in the commits made since my original review - but now I need to re-review all the initial commits too.

As we go through later rounds of code review, please do not force-push.

You do not need to worry about merging in main (in case that was a concern) - I will take care of that myself, as I am familiar with any changes made by others during the life-time of this PR.

@claremacrae

Copy link
Copy Markdown
Member

Moving @beauraines's comments from #1649 (comment):

@claremacrae @rmartin I've been following PR #3768 and the review feedback. It looks like the branch is in a difficult state after the force-push, and I noticed Clare's recent comment about progress.

@rmartin — if you don't have bandwidth to continue, I could pick this up with AI assistance (GitHub Copilot). I'd reimplement on a fresh branch from main using your implementation as the foundation, but with the field ordering correct from the start (Duration after Priority, not mixed with dates). I'd structure it as incremental TDD commits so each one builds and passes tests independently.

@claremacrae — would you be open to that, or would you prefer to give rmartin more time? Happy to wait either way.

@claremacrae

Copy link
Copy Markdown
Member

Moving @beauraines's comments from #1649 (comment):

@rmartin — if you don't have bandwidth to continue, I could pick this up with AI assistance (GitHub Copilot). I'd reimplement on a fresh branch from main using your implementation as the foundation, but with the field ordering correct from the start (Duration after Priority, not mixed with dates). I'd structure it as incremental TDD commits so each one builds and passes tests independently.

No, I actively absolutely do not want more AI used to start this again from scratch, please.

In no way should reordering some lines of code require the use of an AI, and it absolutely is not worth the climate-change-inducing/water-sapping technology to do it. Not does it require restarting the whole process again.

@claremacrae — would you be open to that, or would you prefer to give rmartin more time? Happy to wait either way.

I'll leave a few more days for @rmartin to reply.

If I don't hear back, I'll force-push the previous commit to here, and fix the line ordering myself. And then I'll make some more suggestions.

But the remaining issues in the originally-pushed code are requiring testing and decisions about desirable behaviour, based on actually using the feature, not things that an AI can drive forward.

rmartin added 7 commits March 26, 2026 22:58
Move duration-related declarations, symbols, regex patterns, extraction
logic, and return values to appear after priority (instead of mixed in
with date fields) in DefaultTaskSerializer, DataviewTaskSerializer,
and TaskSerializer index.
Move duration field declaration, constructor parameter, assignment, and
identicalTo check to appear after priority. Move durationHours/durationMinutes
getters to after urgency. Update TaskBuilder field, method, and build ordering.
Move Duration in TaskLayoutComponent enum to after Priority, which
changes the rendering and serialization order. Reorder taskFieldHTMLData
entries to match. Update expected test arrays, snapshots, and approval files.
Move DurationField registration to after PriorityField in the
fieldCreators array.
Move duration field declarations, constructor parameters, assignments,
and fromTask/applyEdits ordering to after priority in EditableTask.
Move DurationEditor section from inside dates to after priority in
EditTask.svelte. Reorder formIsValid conditions.
Move duration suggestion to appear after recurring (instead of after
scheduled date) per frequency-of-use ordering. Update approval files.
Move Duration section after Priority in Quick Reference docs. Move
duration field below priority in CustomMatchers helper functions.
@rmartin
rmartin force-pushed the feat/add-duration-field branch from dcdedd3 to 2bfc133 Compare March 30, 2026 21:10
@rmartin

rmartin commented Mar 30, 2026

Copy link
Copy Markdown
Author

Hi @claremacrae, apologies for the delay — I had some unexpected additional commitments at home and work that took longer than expected.

I've reset the branch back to d629dd5 as you asked and remade all the fix commits fresh. Each commit has been individually verified to pass the full test suite (4715 tests) and lint. Here's the updated commit history:

  1. 6b9b376 fix: Move Duration field below Priority in Serializer code
  2. f03d6af fix: Move Duration field below Priority in Task model and TaskBuilder
  3. 1283eea fix: Move Duration field below Priority in Layout and Renderer
  4. 381541e (not 3815414) fix: Move Duration field below Priority in FilterParser
  5. c9c6d8b fix: Move Duration field below Priority in Edit Task UI
  6. 1e5381a fix: Move Duration suggestions after Recurring in Auto-Suggest
  7. 2bfc133 fix: Move Duration below Priority in Quick Reference and CustomMatchers

Every intermediate commit passes yarn test and yarn lint individually, so git bisect should work correctly this time.

@claremacrae claremacrae added the status: ready to review PR code, tests and user docs are complete enough for testing and code review to begin. label Mar 31, 2026
@claremacrae

Copy link
Copy Markdown
Member

Here's the updated commit history:

A tip is not top put commit ids in backticks - as then the GitHub web ui actually links directly to the commits, which is really useful.

It also shows when a commit id was mistyped (instead of copied-and-pasted)

I've adjusted that message to remove the backticks, and fixed the broken link, just for convenience....

@claremacrae

Copy link
Copy Markdown
Member

I've merged main in to this branch, and am pushing it now...

@claremacrae

Copy link
Copy Markdown
Member

I've merged main in to this branch, and am pushing it now...

This will allow me to trigger the checks to run on the branch.

@sonarqubecloud

Copy link
Copy Markdown

@claremacrae

Copy link
Copy Markdown
Member

I'd appreciate any thoughts on the following:

Non-support of zero-length durations

From reviewing the code and experimenting using the feature, the current design does not allow a user to say a duration is zero. 0h, 0m, and 0h0m are all interpreted as no duration.

Ignoring the implementation for now, I'm interested in user-facing thoughts about this behaviour.

An example of a zero-length task might be:

- [ ] #task Some other person X needs to do thing Y ⏱ 0m

Currently as soon as that task is modified by Tasks, the 0m is deleted, as it is counted as no duration.

The workaround at the moment is this:

- [ ] #task Some other person X needs to do thing Y ⏱ 1m

My feeling is that this is:

  • a bit of a pitfall, as users get no feedback if they type 0m it will be lost
  • a bit of a limitation, as 0m logically is a valid duration.

My inclination is to leave it as-is now, as it is already rather a large change - and then have a separate PR to enable support of 0-length durations.

@rmartin

rmartin commented Apr 4, 2026

Copy link
Copy Markdown
Author

That's a really good point about zero-cost estimates I hadn't considered that use case. Tracking tasks where someone else does the work (costing you 0 time) is a perfectly valid scenario, and silently deleting the 0m is definitely a pitfall.

I agree with your inclination to leave it as-is for this PR and address it separately. Happy to raise an issue and follow-up PR for zero-duration support after this one is merged, if that works for you.

@claremacrae claremacrae left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NEW_TASK_FIELD_EDIT_REQUIRED

This page in the Contributing guide records the need to search for, and review, all occurrences of NEW_TASK_FIELD_EDIT_REQUIRED throughout the code base.

I suspect this hasn't been done fully, as the file Styling.md has 3 of them, and hasn't been updated.

So please could you

  1. update all 3 locations in Styling.md
  2. find and review all the NEW_TASK_FIELD_EDIT_REQUIRED strings to see if anything else was missed out.

I've done some testing of the Edit Task modal changes, and made comments in this review on the appearance...

Also, a few niggles around confusing edits that are just a bit harder to review because of the moving around of code...

Comment on lines +176 to 190
priority: new TaskFieldHTMLData('task-priority', 'taskPriority', (_component, task) => {
return PriorityTools.priorityNameUsingNormal(task.priority).toLocaleLowerCase();
}),
duration: new TaskFieldHTMLData('task-duration', 'taskDuration', (_component, task) => {
return task.duration.toText();
}),

createdDate: createDateField('task-created', 'taskCreated'),
dueDate: createDateField('task-due', 'taskDue'),
startDate: createDateField('task-start', 'taskStart'),
scheduledDate: createDateField('task-scheduled', 'taskScheduled'),
dueDate: createDateField('task-due', 'taskDue'),
doneDate: createDateField('task-done', 'taskDone'),
cancelledDate: createDateField('task-cancelled', 'taskCancelled'),

priority: new TaskFieldHTMLData('task-priority', 'taskPriority', (_component, task) => {
return PriorityTools.priorityNameUsingNormal(task.priority).toLocaleLowerCase();
}),

description: createFieldWithoutDataAttributes('task-description'),

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are more diffs here than I expected, for what would have been adding a new field.
Can you remember the reason why?

Comment thread src/Task/Task.ts
Comment on lines +661 to +673
/**
* Return the hours component of the task's duration, or null if no duration is set.
*/
public get durationHours(): number | null {
return this.duration === Duration.None ? null : this.duration.hours;
}

/**
* Return the minutes component of the task's duration, or null if no duration is set.
*/
public get durationMinutes(): number | null {
return this.duration === Duration.None ? null : this.duration.minutes;
}

@claremacrae claremacrae Mar 31, 2026

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think it would be best to delete durationHours() and durationMinutes().

When I comment them out, both yarn lint and jest still pass - so they are unused and un-tested.

I would rather that behaviour was contained without in the Duration class.

Comment thread src/ui/EditTask.svelte
Comment on lines 56 to 65
$: formIsValid =
isDueDateValid &&
isDescriptionValid &&
isDurationValid &&
isRecurrenceValid &&
isScheduledDateValid &&
isStartDateValid &&
isDescriptionValid &&
isScheduledDateValid &&
isDueDateValid &&
isCancelledDateValid &&
isCreatedDateValid &&
isDoneDateValid;

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The diff is hard to spot because of the reordering of existing lines...

Comment thread src/ui/EditTask.svelte
{/if}

<!-- --------------------------------------------------------------------------- -->
<!-- Dates and times -->

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What was the reason for adding 'and times'? Best to leave it as just Dates for now, please.

Comment thread src/ui/EditTask.svelte
<!-- --------------------------------------------------------------------------- -->
{#if isShownInEditModal.duration}
<DurationEditor {editableTask} bind:isDurationValid />
{/if}

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. It would be really helpful if the Duration Edit field could align with the date fields below it.
  2. And it would be good for it to have a keyboard accelerator. There is a comment block in EditTask.svelte that lists all the available and used characters - looking at that list, there are no obvious ones, so I suggest using Q - arbitrarily - as it is the one least likely to be useful for other new fields... However the (x) and (-) are displayed on Done and Cancelled should show how to do this - and please do update the comment listing characters that are used, as well.
Image

@claremacrae claremacrae removed the status: ready to review PR code, tests and user docs are complete enough for testing and code review to begin. label Apr 21, 2026
@theluxaz

Copy link
Copy Markdown

This functionality would be super useful for me! Thank you guys for working on it. If progress goes stale for a while, I can try to pick it up later to finish it up

@claremacrae

Copy link
Copy Markdown
Member

@rmartin Thanks for what you have done so far. How are you feeling about responding to the second set of feedback above?

If you are unable to continue, that's fine, please do say.

I would then pick it up myself, when I have time - rather than having to start again with someone else on a third branch...

@claremacrae

Copy link
Copy Markdown
Member

This functionality would be super useful for me! Thank you guys for working on it. If progress goes stale for a while, I can try to pick it up later to finish it up

@theluxaz Hi, thanks for the offer, but please don't spend your time on it...

@rmartin

rmartin commented Apr 29, 2026 via email

Copy link
Copy Markdown
Author

@claremacrae

Copy link
Copy Markdown
Member

Hi Clare, Thanks for the feedback, I will look into this in the coming days and address this. I want to hand-review this to ensure I understand the details. I will get back to you with my findings over the next few days. Thank you! Cheers, Roy

@rmartin, Hi, I hope you are OK.

Please may I have an update on the likelihood of your having enough time over the next few weeks, realistically, to be able to work with me to finish this off?

@claremacrae claremacrae added the needs-reply May be closed soon if no reply received. label Jul 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

needs-reply May be closed soon if no reply received. type: enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants