Library management: - Redesign admin_library page with expandable rows that load detail panels via HTMX (LibraryList, LibraryPanel, FolderBrowserContent partials) - Add create/edit/delete library modals using data-* attributes - Add folder browser modal with inline add/remove via HTMX - Add user visibility checkboxes toggled via HTMX - New endpoints in admin_library.go: create, update, delete, panel, folders add/remove, browse, visibility - New template types: FolderData, DirEntry, UserVisibilityData, AdminStats; extend LibraryData with TypeValue and FolderCount Admin dashboard: - Rewrite admin.templ to show 4-stat grid (libraries, media, users, devices) - Add getAdminStats helper querying library/user/media/device counts - Pass AdminStats to template from both /admin and /admin/ handlers
249 lines
4.7 KiB
Go
249 lines
4.7 KiB
Go
package templates
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/a-h/templ"
|
|
)
|
|
|
|
type User struct {
|
|
ID string
|
|
Username string
|
|
Email string
|
|
Role string
|
|
Theme string
|
|
FirstName string
|
|
LastName string
|
|
CreatedAt time.Time
|
|
Token string
|
|
Timezone string
|
|
}
|
|
|
|
type PageData struct {
|
|
User User
|
|
CurrentPage string
|
|
}
|
|
|
|
type CollectionData struct {
|
|
ID string
|
|
Name string
|
|
Description string
|
|
Color string
|
|
Icon string
|
|
IsSystem bool
|
|
}
|
|
|
|
type LibraryData struct {
|
|
ID string
|
|
Name string
|
|
Description string
|
|
TypeName string
|
|
TypeValue string
|
|
MediaCount int64
|
|
FolderCount int
|
|
}
|
|
|
|
type FolderData struct {
|
|
FolderPath string
|
|
}
|
|
|
|
type DirEntry struct {
|
|
Name string
|
|
Path string
|
|
}
|
|
|
|
type UserVisibilityData struct {
|
|
UserID string
|
|
Username string
|
|
Email string
|
|
IsVisible bool
|
|
}
|
|
|
|
type AdminStats struct {
|
|
LibraryCount int
|
|
MediaCount int
|
|
UserCount int
|
|
DeviceCount int
|
|
}
|
|
|
|
type SeriesCardData struct {
|
|
Name string
|
|
BookCount int64
|
|
TotalInSeries int
|
|
CoverPaths []string
|
|
}
|
|
|
|
type PendingRegistrationData struct {
|
|
RegistrationID string
|
|
DeviceName string
|
|
DeviceType string
|
|
ExpiresAt string
|
|
}
|
|
|
|
type ConflictData struct {
|
|
ID string
|
|
MediaItemID string
|
|
MediaItemTitle string
|
|
ConflictType string
|
|
ResolutionStatus string
|
|
CreatedAt string
|
|
ResolutionData map[string]interface{}
|
|
ResolvedBy string
|
|
ResolvedAt string
|
|
}
|
|
|
|
type QueueItemData struct {
|
|
ID string
|
|
DeviceID string
|
|
DeviceName string
|
|
DeviceType string
|
|
SyncType string
|
|
Status string
|
|
Priority int32
|
|
Attempts int32
|
|
CreatedAt string
|
|
}
|
|
|
|
type DeviceShelfMappingData struct {
|
|
ID string
|
|
CollectionID string
|
|
CollectionName string
|
|
DeviceShelfName string
|
|
SyncDirection string
|
|
CreatedAt string
|
|
}
|
|
|
|
type UnlinkedBookData struct {
|
|
ProgressID string
|
|
DeviceID string
|
|
DeviceType string
|
|
DeviceName string
|
|
FilePath string
|
|
SHA256 string
|
|
TitleFromDevice string
|
|
LastSyncTime string
|
|
ConfidenceScore float64
|
|
PotentialMatches []PotentialMatchData
|
|
}
|
|
|
|
type PotentialMatchData struct {
|
|
MediaItemID string
|
|
Title string
|
|
Author string
|
|
CoverImagePath string
|
|
MatchMethod string
|
|
Confidence float64
|
|
}
|
|
|
|
// Documentation types
|
|
type Navigation struct {
|
|
Sections []NavSection
|
|
}
|
|
|
|
type NavSection struct {
|
|
Title string
|
|
Items []NavItem
|
|
Collapsed bool
|
|
}
|
|
|
|
type NavItem struct {
|
|
Title string
|
|
URL string
|
|
Icon string
|
|
}
|
|
|
|
type Document struct {
|
|
Title string
|
|
Content string
|
|
TOC []TOCItem
|
|
Breadcrumb []BreadcrumbItem
|
|
Category string
|
|
SourceFile string
|
|
}
|
|
|
|
type TOCItem struct {
|
|
Level int
|
|
Title string
|
|
Anchor string
|
|
}
|
|
|
|
type BreadcrumbItem struct {
|
|
Title string
|
|
URL string
|
|
}
|
|
|
|
// UnsafeHTML is used for rendering raw HTML (like rendered markdown)
|
|
type UnsafeHTML string
|
|
|
|
// ToComponent converts UnsafeHTML to a templ Component
|
|
func (u UnsafeHTML) ToComponent() templ.Component {
|
|
return templ.Raw(string(u))
|
|
}
|
|
|
|
// Reader types
|
|
type ReaderMetadata struct {
|
|
MediaItemID string `json:"media_item_id"`
|
|
Title string `json:"title"`
|
|
Author string `json:"author"`
|
|
CoverImagePath string `json:"cover_image_path"`
|
|
LibraryType string `json:"library_type"`
|
|
MimeType string `json:"mime_type"`
|
|
FilePath string `json:"file_path"`
|
|
TotalPages int `json:"total_pages"`
|
|
ChapterCount int `json:"chapter_count"`
|
|
FormatGroup string `json:"format_group"`
|
|
MangaType string `json:"manga_type"`
|
|
ReadingDirection string `json:"reading_direction"`
|
|
FileURL string `json:"file_url"`
|
|
LibraryID string `json:"library_id"`
|
|
TotalCharacters int64 `json:"total_characters"`
|
|
EstimatedPages int `json:"estimated_pages"`
|
|
}
|
|
|
|
type ReadingProgress struct {
|
|
ID string
|
|
MediaItemID string
|
|
UserID string
|
|
CurrentPage int
|
|
TotalPages int
|
|
Percentage float64
|
|
EpubCfi string
|
|
LastReadAt time.Time
|
|
Chapter int
|
|
ChapterProgress float64
|
|
FormatGroup string
|
|
}
|
|
|
|
type Bookmark struct {
|
|
ID string
|
|
MediaItemID string
|
|
UserID string
|
|
PageNumber *int
|
|
ChapterNumber *int
|
|
CfiPosition string
|
|
Title string
|
|
Position string
|
|
Notes string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
// ProcessingIssueData - Processing issue types
|
|
type ProcessingIssueData struct {
|
|
ID string
|
|
MediaItemID string
|
|
Title string
|
|
FilePath string
|
|
FormatGroup string
|
|
LibraryTypeName string
|
|
IssueType string
|
|
IssueDescription string
|
|
Severity string
|
|
CreatedAt time.Time
|
|
}
|
|
|
|
type IssueStats struct {
|
|
ErrorCount int64
|
|
WarningCount int64
|
|
InfoCount int64
|
|
}
|