Commit Graph

39 Commits

Author SHA1 Message Date
7d8dcf85ce Fix tree filter and URL canonicality for filter state
- Root entries in tree view filtered strictly by entry_matches_filter;
  a parent no longer appears just because a descendant matches
- Expanded children always shown unfiltered (tree navigation intent)
- build_url always writes ?status=<val> so URL is fully canonical;
  apply_search falls back to open for absent/empty param (old URLs)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 16:21:46 +00:00
8596f539c7 Fix status filter: strict tree filtering and URL param handling
- render_tree_node now applies entry_matches_filter directly; parent
  entries no longer bleed through when only a descendant matches
- Filter dropdowns use set_filter() to persist state in URL query params
- apply_search() reads filter state from URL on init and popstate
- build_url() encodes filter state; uses ?status=all for "all statuses"
  to distinguish from absent param (which defaults to open)
- apply_search() treats absent or empty status param as 'open'

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 16:14:15 +00:00
40722310ae Fix type changes, tag navigation, and routing cleanup
- set_entry removes entry from old bucket when type changes (fixes duplicates)
- PUT /api/entries/:id now accepts type field
- Tag clicks navigate via URL (#type/x/tag/y or #tag/y) instead of mutating state
- Replace magic 'all' hash with empty hash as the all-entries route
- Clickable tags in entry detail view
- Tag filter dropdown updates URL

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:56:42 +00:00
25c8f98b7f Fix keyboard shortcut scoping; add tab switching with Ctrl+Alt+PgUp/Down
- Use sentinel element to properly clean up detail view Ctrl+E listener
- Single document listener per view handles all shortcuts regardless of focus
- Ctrl+S/D now work from preview tab and title input without separate listeners
- Ctrl+Alt+PageUp/Down switches Write/Preview tabs

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:30:42 +00:00
877bc2049e Add keyboard shortcuts: Ctrl+E to edit, Ctrl+S to save, Ctrl+D to discard
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:21:21 +00:00
6058c22b6c Replace textarea with CodeMirror 6 editor
- Add CodeMirror 6 with oneDark theme and markdown language support
- Bundle via esbuild into public/vendor/ (built on deploy, not committed)
- Add codemirror-entry.mjs as bundle entry point
- Fix SPA fallback to only serve index.html for /, not all paths
- Fix mime type handling by mutating mime-types registry
- Add Write/Preview tabs; preview renders on tab switch only
- Multi-cursor via Shift+Alt+Up/Down; Alt+Click adds cursor
- gitignore package-lock.json and public/vendor/

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 15:08:36 +00:00
dbef6605c9 Replace entry dialog with full-page edit view
- Remove Entry_Dialog class; edit/new now navigate to #edit/<id> and #new/...
- render_edit_view() builds a full-page layout: header with title input,
  Write/Preview tabs, and a metadata sidebar
- Tab key inserts a literal tab character in the editor
- Ctrl+S saves from both title input and textarea
- Body/main element uses flex column layout so edit view fills viewport

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-24 14:25:36 +00:00
ea4b767f0b Fix #2: arrange entry metadata in 2x2 grid instead of single column
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-23 20:03:03 +00:00
1d25c5e1c4 Update README to reflect current state
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:18:33 +00:00
5e3e30b64c Tree mode: show all children unfiltered once a node is expanded
Filters apply to roots only — expanding a node reveals full context
regardless of child status/priority/tag/search.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 23:15:20 +00:00
bad1467f0f Allow any type for sub entries; add creation timestamp to rows
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:43:52 +00:00
3b646a1b0f Remove body from entry row template instead of removing it in JS
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:40:47 +00:00
8718cdda25 Remove body from entry list rows
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:40:22 +00:00
e88af98b2b Fix grid column misalignment caused by hidden expand button
display:none removes element from grid flow, shifting other columns.
Use visibility:hidden instead so the expand button always holds its cell.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:35:23 +00:00
4b5c3a3725 Redesign entry row layout: 3-column grid with stacked meta
- expand | meta (type/id/status/priority stacked) | main (title/body/footer)
- Tags and actions in a .task-footer row inside .task-main
- Title now gets full remaining width

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:32:57 +00:00
5b54b58625 Fix type chip showing when hidden; make tags clickable to filter
- [hidden] { display: none !important } prevents CSS display overriding
  the hidden attribute
- Clicking a tag chip in an entry row filters by that tag

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:27:53 +00:00
23d5011e56 Highlight task rows on hover
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:19:44 +00:00
3514d57b00 Add entry detail view and #id URL routing
- #<number> navigates to a full detail view (rendered title + body,
  meta badges, parent link, children list, edit/delete/sub buttons)
- Clicking entry row main area navigates to detail instead of opening edit
- Edit dialog remains for editing, delete redirects back to list

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:19:02 +00:00
c5a5966318 Reflect navigation state in URL hash
#all, #type/<id>, #manage-types — back/forward works via popstate,
deep links work on load via apply_hash(location.hash)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:14:19 +00:00
b1221b06a8 Comment out BIND_ADDRESS, keep as example
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:07:32 +00:00
e9934b50ee Bind service to 0.0.0.0 so it's reachable from the network
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:06:50 +00:00
270fd4083c Remove -v from rsync, -P is sufficient
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:02:50 +00:00
f6563ca4c7 Revert "Revert -v from rsync, -P already shows per-file progress"
This reverts commit 2609e74e2a.
2026-05-17 22:02:37 +00:00
2609e74e2a Revert -v from rsync, -P already shows per-file progress
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:02:12 +00:00
ae22e7abf0 Add -v to rsync so transferred files are always visible
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 22:01:35 +00:00
71fb7aee55 Move chown -R into sync target so it always runs
rsync --chown only applies to transferred files; a separate chown -R
ensures ownership is correct even when no files needed updating.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:58:45 +00:00
31ec2e639e Fix sync not setting owner/group on copied files
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:57:48 +00:00
730be15b76 Add Makefile with deploy target
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:56:02 +00:00
0a985c591b Refactor tasks to configurable entry types
- Storage: nested object buckets per type, integrated next_id into meta,
  migration from old flat task:N key format, seeded default types (task/idea/note)
- Server: /api/entry-types CRUD + /api/entries replacing /api/tasks, type
  validation, blocks deletion if entries exist
- Frontend: dynamic nav per type, Entry_Type_Dialog, Entry_Dialog with type
  selector, type chip in All view, Manage Types view

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:53:39 +00:00
5a1ff7aaeb Document concrete /srv/task-inventory deployment scenario 2026-05-17 21:28:33 +00:00
576edd2d22 Use realpath and sudo in systemctl enable command 2026-05-17 21:25:54 +00:00
410b9a07dc Fix systemd setup instructions — enable by path, no manual copy 2026-05-17 21:24:35 +00:00
15107e8850 Add deployment service file and document system service setup
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 21:18:04 +00:00
59f3b69470 Add README
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 19:23:33 +00:00
8c78bc5e2c Remove depth indentation from flat mode
Flat mode is now truly flat — no --depth CSS variable set on rows
and the flat-mode padding-left rule removed.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 19:17:44 +00:00
fa2b5bda18 Improve mode toggle and flat mode row layout
- Segmented control (Tree | Flat) replaces the toggle button
- Expand arrow hidden in flat mode
- Arrow listener only attached in tree mode

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 19:10:05 +00:00
b7ee5006d2 Add hierarchical tasks with tree and flat mode
- parent_id on tasks; roots shown by default, others expandable
- Expand/collapse per node with expand/collapse button
- Sub button creates subtask directly from the row
- Make subtask of button in edit dialog with searchable picker
- Remove parent clears the parent link in the dialog
- Flat mode toggle shows all tasks indented by depth
- Tree filter shows nodes whose descendants match, not only direct matches
- Deletion blocked if task has subtasks (client + server)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 18:55:14 +00:00
444b51794a Add Gitea markdown rendering and Edit/Preview tabs
- New /api/render-markdown proxy to Gitea (configured via config.yaml)
- lib/config.mjs loads config.yaml with yaml-js
- Edit/Preview tabs on the body field in the task dialog
- Title and body rendered as markdown inline in the task list
- Gitea markup+chroma CSS extracted and vendored to public/gitea-markup.css
- Markdown cached in memory per text string

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 18:19:29 +00:00
1100720b03 Initial project setup for task-inventory
Node.js + Express 5 backend with flat NDJSON key-value store (borrowed from
electronics-inventory). Sequential integer IDs per namespace. Vanilla JS SPA
with filters for status, priority, and tags.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-05-17 18:05:30 +00:00