Add Users list/detail with ACL toggles and library people update/status APIs. Fix project table layout and ANSI-safe cell rendering, and decode array responses from people/status so saves no longer fail on JSON unmarshal. Co-authored-by: Cursor <cursoragent@cursor.com>
107 lines
2.6 KiB
Go
107 lines
2.6 KiB
Go
package model
|
|
|
|
// ProjectLifecycle is the OnlyOffice project status string accepted by the API.
|
|
type ProjectLifecycle string
|
|
|
|
const (
|
|
ProjectLifecycleOpen ProjectLifecycle = "open"
|
|
ProjectLifecyclePaused ProjectLifecycle = "paused"
|
|
ProjectLifecycleClosed ProjectLifecycle = "closed"
|
|
)
|
|
|
|
// ProjectStatusFromAny maps API status (int or string) to a lifecycle value.
|
|
func ProjectStatusFromAny(v any) ProjectLifecycle {
|
|
switch x := v.(type) {
|
|
case string:
|
|
switch ProjectLifecycle(x) {
|
|
case ProjectLifecycleOpen, ProjectLifecyclePaused, ProjectLifecycleClosed:
|
|
return ProjectLifecycle(x)
|
|
}
|
|
case float64:
|
|
return projectStatusFromInt(int(x))
|
|
case int:
|
|
return projectStatusFromInt(x)
|
|
case int64:
|
|
return projectStatusFromInt(int(x))
|
|
}
|
|
return ProjectLifecycleOpen
|
|
}
|
|
|
|
func projectStatusFromInt(n int) ProjectLifecycle {
|
|
switch n {
|
|
case 1:
|
|
return ProjectLifecyclePaused
|
|
case 2:
|
|
return ProjectLifecycleClosed
|
|
default:
|
|
return ProjectLifecycleOpen
|
|
}
|
|
}
|
|
|
|
// ProjectStatusLabel returns a short UI label for list cells.
|
|
func ProjectStatusLabel(raw map[string]any) string {
|
|
if raw == nil {
|
|
return "Open"
|
|
}
|
|
return ProjectStatusFromAny(raw["status"]).Label()
|
|
}
|
|
|
|
// ProjectStatusIcon returns the list-cell emoji for a project lifecycle state.
|
|
func (s ProjectLifecycle) Icon() string {
|
|
switch s {
|
|
case ProjectLifecycleClosed:
|
|
return "🔴"
|
|
case ProjectLifecyclePaused:
|
|
return "🟡"
|
|
default:
|
|
return "🟢"
|
|
}
|
|
}
|
|
|
|
// ProjectStatusCell returns emoji and label on one line for project table cells.
|
|
func ProjectStatusCell(raw map[string]any) string {
|
|
if raw == nil {
|
|
return ProjectLifecycleOpen.Icon() + " Open"
|
|
}
|
|
s := ProjectStatusFromAny(raw["status"])
|
|
return s.Icon() + " " + s.Label()
|
|
}
|
|
|
|
// ProjectIsOpen is true when the project is not closed.
|
|
func ProjectIsOpen(raw map[string]any) bool {
|
|
if raw == nil {
|
|
return true
|
|
}
|
|
return ProjectStatusFromAny(raw["status"]) != ProjectLifecycleClosed
|
|
}
|
|
|
|
// Label returns a human-readable status name.
|
|
func (s ProjectLifecycle) Label() string {
|
|
switch s {
|
|
case ProjectLifecycleClosed:
|
|
return "Closed"
|
|
case ProjectLifecyclePaused:
|
|
return "Paused"
|
|
default:
|
|
return "Open"
|
|
}
|
|
}
|
|
|
|
// ToggleOpenClosed flips between open and closed (paused maps to closed on toggle).
|
|
func (s ProjectLifecycle) ToggleOpenClosed() ProjectLifecycle {
|
|
if s == ProjectLifecycleClosed {
|
|
return ProjectLifecycleOpen
|
|
}
|
|
return ProjectLifecycleClosed
|
|
}
|
|
|
|
// Next cycles open → closed → open for keyboard toggling.
|
|
func (s ProjectLifecycle) Next() ProjectLifecycle {
|
|
return s.ToggleOpenClosed()
|
|
}
|
|
|
|
// Prev cycles closed → open → closed.
|
|
func (s ProjectLifecycle) Prev() ProjectLifecycle {
|
|
return s.ToggleOpenClosed()
|
|
}
|