Notes: sync templates, fix Create layout, repair direct children, ListItems+ListNotes merge

=== Breaking ===
- CreateNote for unsupported parents (file/note/action/secret/worklog/link) -> error
- EnsureNotesFolder validates parent supports notes before creating Notes/

=== Templates (system_templates.json) ===
- folder.default: +notes module, +Notes folder in default_folders
- document.default: +notes module, +Notes folder, +Overview.md default file
- recipe.default: +Notes folder in default_folders
All container types now consistently declare notes support.

=== CreateNodeFromTemplate layout fix ===
- DefaultFolders created BEFORE DefaultFiles (so Notes/ exists)
- DefaultFile nodes now parented inside Notes folder, not the container
- File path, file record, notes record all canonical: Notes/Overview.md
- No root-level Overview.md created

=== ListItems (Files tab) ===
- bindings_files.go: ListItems now includes TypeNote (not just TypeFolder+TypeFile)
- Notes folder visible in Files tab tree
- Overview.md inside Notes shown with type='note', Mime='text/markdown'

=== ListNotes merge ===
- Collects from both Notes folder (canonical) and direct TypeNote children (compat)
- Duplicates excluded via seen set
- Canonical layout takes priority

=== RepairNotesLayout ===
- Moves direct TypeNote children into Notes folder via nodes.Move
- Updates files.path/files.filename for moved notes
- Skips non-container parents (file/note/etc)

=== Tests ===
- note_repair_test.go: 37 tests (24 old + 13 new)
  - SupportsNotes for containers/non-containers
  - EnsureNotesFolder rejects for unsupported parents
  - Create for file/note parent -> error, no state leak
  - Repair: skips non-containers, creates Notes folder, moves notes
  - Files tab: Notes folder visible, Overview content preserved after repair
- vault_layout_notes_files_test.go: 3 new ListItems/repair tests
  - ListItems shows Notes folder
  - ListItems inside Notes shows Overview with FileID
  - Repair moves direct children, ListItems reflects new layout
- Updated: suggest_test.go, trash_test.go, vault_layout_test.go expectations

=== Misc ===
- nodes/repository.go: ListByType helper for test use
- bindings_files.go: TypeNote in ListItems, Mime=text/markdown
This commit is contained in:
2026-06-15 17:24:56 +08:00
parent 2cbb2986c1
commit fec35f55b8
11 changed files with 2218 additions and 71 deletions
+22
View File
@@ -478,6 +478,28 @@ func (r *Repository) MetaList(nodeID string) ([]Meta, error) {
return out, rows.Err()
}
// ListByType returns all active non-deleted nodes of the given types.
func (r *Repository) ListByType(types ...string) ([]Node, error) {
if len(types) == 0 {
return nil, errors.New("at least one type required")
}
placeholders := make([]string, len(types))
args := make([]interface{}, len(types))
for i, t := range types {
placeholders[i] = "?"
args[i] = t
}
q := `SELECT ` + nodeColumns + ` FROM nodes
WHERE deleted_at IS NULL AND type IN (` + strings.Join(placeholders, ",") + `)
ORDER BY sort_order, title`
rows, err := r.db.Query(q, args...)
if err != nil {
return nil, err
}
defer rows.Close()
return scanNodes(rows)
}
// --- scanning helpers ---
type scanner interface {