Merge branch 'mai/kahn/phase-5j-views-redesign' (phase 5j slice A: paliad-shape schema redesign)
This commit is contained in:
@@ -152,7 +152,7 @@ func New(s *store.Store, logger *slog.Logger) (*Server, error) {
|
||||
},
|
||||
}
|
||||
pages := map[string]*template.Template{}
|
||||
for _, name := range []string{"new", "classify", "caldav_admin", "caldav_disabled", "error", "views", "view_edit"} {
|
||||
for _, name := range []string{"new", "classify", "caldav_admin", "caldav_disabled", "error"} {
|
||||
t, err := template.New(name).Funcs(funcs).ParseFS(templatesFS,
|
||||
"templates/layout.tmpl",
|
||||
"templates/"+name+".tmpl",
|
||||
@@ -383,11 +383,9 @@ func (s *Server) Routes() http.Handler {
|
||||
mux.HandleFunc("GET /admin/caldav", s.handleCalDAVAdmin)
|
||||
mux.HandleFunc("POST /admin/caldav/link", s.handleCalDAVLink)
|
||||
mux.HandleFunc("POST /admin/caldav/unlink", s.handleCalDAVUnlink)
|
||||
mux.HandleFunc("GET /views", s.handleViewsIndex)
|
||||
mux.HandleFunc("POST /views", s.handleViewCreate)
|
||||
mux.HandleFunc("GET /views/{id}/edit", s.handleViewEdit)
|
||||
mux.HandleFunc("GET /views/", s.handleViewRedirect)
|
||||
mux.HandleFunc("POST /views/", s.handleViewWrite)
|
||||
// /views routes land in slice B (paliad-shape: GET /views, GET
|
||||
// /views/{slug}, GET /views/new, GET /views/{slug}/edit, plus POST CRUD).
|
||||
// Between slice A and slice B these URLs 404 by design.
|
||||
mux.HandleFunc("GET /login", s.handleLoginForm)
|
||||
mux.HandleFunc("POST /login", s.handleLoginSubmit)
|
||||
mux.HandleFunc("POST /logout", s.handleLogout)
|
||||
@@ -452,30 +450,11 @@ func (s *Server) handleTree(w http.ResponseWriter, r *http.Request) {
|
||||
filter := ParseTreeFilter(r.URL.Query())
|
||||
viewSet := PageViewTypes("/")
|
||||
view := ParseViewType(r.URL.Query(), viewSet)
|
||||
var defaultBanner *store.View
|
||||
// Phase 5i Slice D: ?view=<uuid> resolves a saved view's filter +
|
||||
// view_type into the current request, overriding URL-only chip state.
|
||||
// Resolution failure (deleted view, malformed payload) is logged and
|
||||
// silently falls back to the URL-derived filter — the page stays
|
||||
// renderable rather than 500ing.
|
||||
if saved, err := s.applySavedView(r, &filter, &view); err == nil && saved != nil {
|
||||
// Re-validate view_type against the route catalog so a saved
|
||||
// kanban-view URL opened on / (before slice C ships kanban) lands on
|
||||
// the default with the chip showing the wanted view as locked.
|
||||
view = viewSet.Resolve(view)
|
||||
} else if err != nil {
|
||||
s.Logger.Warn("applySavedView", "id", r.URL.Query().Get("view"), "err", err)
|
||||
} else {
|
||||
// Phase 5i Slice E: no explicit ?view= → check for a page default.
|
||||
// applyDefaultView returns nil unless the URL is "clean" (no chip
|
||||
// state) AND a default exists for this page.
|
||||
if def, err := s.applyDefaultView(r, "tree", &filter, &view); err == nil && def != nil {
|
||||
view = viewSet.Resolve(view)
|
||||
defaultBanner = def
|
||||
} else if err != nil {
|
||||
s.Logger.Warn("applyDefaultView", "page", "tree", "err", err)
|
||||
}
|
||||
}
|
||||
// Phase 5j: ?view= overlay + is_default_for resolution deleted with the
|
||||
// 5i shape. /views/{slug} (slice B+) renders saved views as their own
|
||||
// pages; legacy ?view=<uuid> URLs are 302-redirected from a dedicated
|
||||
// handler (slice C). handleTree stays focused on the tree-as-tree
|
||||
// surface and no longer hijacks itself based on a query param.
|
||||
roots, orphans, total, orphanN, matched := applyTreeFilter(items, filter, linkKinds)
|
||||
counts := computeChipCounts(items, filter, linkKinds, tags)
|
||||
// Phase 5i Slice B: the card view renders a flat grid of matched items
|
||||
@@ -505,7 +484,6 @@ func (s *Server) handleTree(w http.ResponseWriter, r *http.Request) {
|
||||
"Kanban": kanban,
|
||||
"GroupBy": groupBy,
|
||||
"GroupByChips": groupByChips,
|
||||
"DefaultBanner": defaultBanner,
|
||||
// ActiveTags kept for backwards-compat with the old template path; removed
|
||||
// after the template migrates fully.
|
||||
"ActiveTags": filter.Tags,
|
||||
|
||||
Reference in New Issue
Block a user