Conversation
The composer's cap on a note's length always pluralised the summary line, so a note that trimmed exactly one entry read "and 1 more entries". Pluralise only when more than one entry was dropped.
…e AI bubble The floating launcher covered the bottom of long settings pages, such as the status editor, with no way to see past it. It now hides on /admin/settings/... routes, tracked through the host router's afterEach rather than a prop that was never wired through. It also lifts clear of the AI assistant module's own launcher button when one is on the page, checked once at mount and again on every company switch through the overlay's existing remount key.
POST tasks/bulk answers with updated as the list of ids it changed, but the frontend typed and read it as a count, so a partial bulk change rendered the id array where a number belonged and the "nothing changed" branch could never trigger. The partial notify now also names the ids the endpoint refused, instead of only how many.
The general settings card described the default rate, the week start day and who may see other members' time, but only ever rendered a link to the host form, not one of the three values. It now lists them next to the link, the same way the behaviour and invoice-line cards already do.
Rewrite the user-facing sections for the rebuilt UI: the Projects and Tasks sidebar entries, the Tasks screen's List, Board and Week views, starting and stopping time from a row, a card, a task's own page or the floating launcher, the task time log, invoicing a task, a selection or a project into the host's invoice editor, the unbilled time page, every setting, and the abilities catalogue.
The host's module settings form translates a section's title and a field's label and hands a select's options through as they were registered, so the rounding direction offered three translation keys instead of Nearest, Up and Down. The registration now resolves them, and the harness loads the module's own translations the way its provider does, so a test can see the difference.
The server's own message states the rule for whoever called the API, so a locked task reported a generic failure at the form and the task page. Both now prefer the module's own sentence for that one code and keep the server's for everything else.
A count reached the reader through a message that only had a plural form, so one entry was reported as "1 entries" on the unbilled cards and the default rounding increment read "1 minutes" on the settings page. The host's translator picks a form when the message offers two, so the counted lines now offer both.
The quick-start button looked for the AI assistant once, at mount, and the host renders that module's header action from a script it loads alongside this one, so the look never found it. It also could not tell a header action from a floating bubble, and only the second one is in the way. The probe now asks the layout whether any assistant launcher is fixed, and runs again on every navigation.
The host names the module card and its settings modal after the entry registered under the module slug, which was Projects. Tasks is the module root, so it carries the slug now and Projects moves to a secondary key.
gdarko
force-pushed
the
feat/task-centric-polish
branch
from
September 15, 2026 11:29
f7eb6c8 to
3599686
Compare
Contributor
Author
|
Superseded by #14, which carries this stack consolidated into three commits on top of main. |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
PR 4 of the task-centric rework: polish and documentation, on top of
feat/task-centric-invoicing-ui./admin/settings/...routes (tracked through the host router'safterEach) and lifts clear of the AI assistant module's own launcher button when one is present on the page.POST tasks/bulkreturnsupdatedas the list of changed ids, but the frontend typed and used it as a count, so a partial bulk change rendered the raw id array in place of a number and the "nothing changed" branch was unreachable. The partial-failure notify now also lists the ids the endpoint refused.hide_invoiced_on_boardalready hides invoiced cards client-side offGET settings; the/timeredirect already lands on the Week view, and noTIME_PATHconstant exists anywhere to remove.README.mdto describe the task-centric flow: the Projects and Tasks sidebar entries, the Tasks screen's List/Board/Week views, starting and stopping time from a row, a card, a task's own page or the floating launcher, the task time log, invoicing a task/selection/project into the host's invoice editor, the unbilled time page, every setting, and the abilities catalogue.specs/tasks-projects.md("UI surface" rewritten task-centric, "API surface" table gained the new routes) and appended a datedDECISIONS.mdentry, committed and pushed toInvoiceShelf/specsdirectly (private repo, separate from this PR).What was already done (verified, not changed)
/timeforwarding page (PR 2) already lands on the Week view.hide_invoiced_on_board(PR 1/2) is already read fromGET settingsand applied client-side on the board.TIME_PATHconstant exists in the codebase.Test plan
vendor/bin/pint --testcomposer run lint && composer run test(313 tests, 1303 assertions)pnpm run lintpnpm exec tsc --noEmitpnpm run build(exactly onewindow.__invoiceshelf_vue, zerofrom "vue")vendor/bin/invoiceshelf-module validate-module module.jsonvendor/bin/invoiceshelf-module validate-package .https://claude.ai/code/session_01DCf36XDKprZifej8dc2r1E