mirror of
https://github.com/yusing/godoxy.git
synced 2026-03-26 11:01:07 +01:00
347 lines
6.7 KiB
Markdown
347 lines
6.7 KiB
Markdown
# Homepage
|
|
|
|
The homepage package provides the GoDoxy WebUI dashboard with support for categories, favorites, widgets, dynamic item configuration, and icon management.
|
|
|
|
## Overview
|
|
|
|
The homepage package implements the WebUI dashboard, managing homepage items, categories, sorting methods, and widget integration for monitoring container status and providing interactive features.
|
|
|
|
### Key Features
|
|
|
|
- Dynamic homepage item management
|
|
- Category-based organization (All, Favorites, Hidden, Others)
|
|
- Multiple sort methods (clicks, alphabetical, custom)
|
|
- Widget support for live data display
|
|
- Icon URL handling with favicon integration
|
|
- Item override configuration
|
|
- Click tracking and statistics
|
|
|
|
## Architecture
|
|
|
|
```mermaid
|
|
graph TD
|
|
A[HomepageMap] --> B{Category Management}
|
|
B --> C[All]
|
|
B --> D[Favorites]
|
|
B --> E[Hidden]
|
|
B --> F[Others]
|
|
|
|
G[Item] --> H[ItemConfig]
|
|
H --> I[Widget Config]
|
|
H --> J[Icon]
|
|
H --> K[Category]
|
|
|
|
L[Widgets] --> M[HTTP Widget]
|
|
N[Sorting] --> O[Clicks]
|
|
N --> P[Alphabetical]
|
|
N --> Q[Custom]
|
|
```
|
|
|
|
## Core Types
|
|
|
|
### Homepage Structure
|
|
|
|
```go
|
|
type HomepageMap struct {
|
|
ordered.Map[string, *Category]
|
|
}
|
|
|
|
type Homepage []*Category
|
|
|
|
type Category struct {
|
|
Items []*Item
|
|
Name string
|
|
}
|
|
|
|
type Item struct {
|
|
ItemConfig
|
|
SortOrder int
|
|
FavSortOrder int
|
|
AllSortOrder int
|
|
Clicks int
|
|
Widgets []Widget
|
|
Alias string
|
|
Provider string
|
|
OriginURL string
|
|
ContainerID string
|
|
}
|
|
|
|
type ItemConfig struct {
|
|
Show bool
|
|
Name string
|
|
Icon *IconURL
|
|
Category string
|
|
Description string
|
|
URL string
|
|
Favorite bool
|
|
WidgetConfig *widgets.Config
|
|
}
|
|
```
|
|
|
|
### Sort Methods
|
|
|
|
```go
|
|
const (
|
|
SortMethodClicks = "clicks"
|
|
SortMethodAlphabetical = "alphabetical"
|
|
SortMethodCustom = "custom"
|
|
)
|
|
```
|
|
|
|
### Categories
|
|
|
|
```go
|
|
const (
|
|
CategoryAll = "All"
|
|
CategoryFavorites = "Favorites"
|
|
CategoryHidden = "Hidden"
|
|
CategoryOthers = "Others"
|
|
)
|
|
```
|
|
|
|
## Public API
|
|
|
|
### Creation
|
|
|
|
```go
|
|
// NewHomepageMap creates a new homepage map with default categories.
|
|
func NewHomepageMap(total int) *HomepageMap
|
|
```
|
|
|
|
### Item Management
|
|
|
|
```go
|
|
// Add adds an item to appropriate categories.
|
|
func (c *HomepageMap) Add(item *Item)
|
|
|
|
// GetOverride returns the override configuration for an item.
|
|
func (cfg Item) GetOverride() Item
|
|
```
|
|
|
|
### Sorting
|
|
|
|
```go
|
|
// Sort sorts a category by the specified method.
|
|
func (c *Category) Sort(method SortMethod)
|
|
```
|
|
|
|
## Usage
|
|
|
|
### Creating a Homepage Map
|
|
|
|
```go
|
|
homepageMap := homepage.NewHomepageMap(100) // Reserve space for 100 items
|
|
```
|
|
|
|
### Adding Items
|
|
|
|
```go
|
|
item := &homepage.Item{
|
|
Alias: "my-app",
|
|
Provider: "docker",
|
|
OriginURL: "http://myapp.local",
|
|
ItemConfig: homepage.ItemConfig{
|
|
Name: "My Application",
|
|
Show: true,
|
|
Favorite: true,
|
|
Category: "Docker",
|
|
Description: "My Docker application",
|
|
},
|
|
}
|
|
|
|
homepageMap.Add(item)
|
|
```
|
|
|
|
### Sorting Categories
|
|
|
|
```go
|
|
allCategory := homepageMap.Get(homepage.CategoryAll)
|
|
if allCategory != nil {
|
|
allCategory.Sort(homepage.SortMethodClicks)
|
|
}
|
|
```
|
|
|
|
### Filtering by Category
|
|
|
|
```go
|
|
favorites := homepageMap.Get(homepage.CategoryFavorites)
|
|
for _, item := range favorites.Items {
|
|
fmt.Printf("Favorite: %s\n", item.Name)
|
|
}
|
|
```
|
|
|
|
## Widgets
|
|
|
|
The homepage supports widgets for each item:
|
|
|
|
```go
|
|
type Widget struct {
|
|
Label string
|
|
Value string
|
|
}
|
|
|
|
type Config struct {
|
|
// Widget configuration
|
|
}
|
|
```
|
|
|
|
### Widget Types
|
|
|
|
Widgets can display various types of information:
|
|
|
|
- **Status**: Container health status
|
|
- **Stats**: Usage statistics
|
|
- **Links**: Quick access links
|
|
- **Custom**: Provider-specific data
|
|
|
|
## Categories
|
|
|
|
### Default Categories
|
|
|
|
| Category | Description |
|
|
| --------- | ------------------------ |
|
|
| All | Contains all items |
|
|
| Favorites | User-favorited items |
|
|
| Hidden | Items with `Show: false` |
|
|
| Others | Uncategorized items |
|
|
|
|
### Custom Categories
|
|
|
|
Custom categories are created dynamically:
|
|
|
|
```go
|
|
// Adding to custom category
|
|
item := &homepage.Item{
|
|
ItemConfig: homepage.ItemConfig{
|
|
Name: "App",
|
|
Category: "Development",
|
|
},
|
|
}
|
|
homepageMap.Add(item)
|
|
// "Development" category is auto-created
|
|
```
|
|
|
|
## Override Configuration
|
|
|
|
Items can have override configurations for customization:
|
|
|
|
```go
|
|
// GetOverride returns the effective configuration
|
|
func (cfg Item) GetOverride() Item {
|
|
return overrideConfigInstance.GetOverride(cfg)
|
|
}
|
|
```
|
|
|
|
## Sorting Methods
|
|
|
|
### Clicks Sort
|
|
|
|
Sorts by click count (most clicked first):
|
|
|
|
```go
|
|
func (c *Category) sortByClicks() {
|
|
slices.SortStableFunc(c.Items, func(a, b *Item) int {
|
|
if a.Clicks > b.Clicks {
|
|
return -1
|
|
}
|
|
if a.Clicks < b.Clicks {
|
|
return 1
|
|
}
|
|
return strings.Compare(title(a.Name), title(b.Name))
|
|
})
|
|
}
|
|
```
|
|
|
|
### Alphabetical Sort
|
|
|
|
Sorts alphabetically by name:
|
|
|
|
```go
|
|
func (c *Category) sortByAlphabetical() {
|
|
slices.SortStableFunc(c.Items, func(a, b *Item) int {
|
|
return strings.Compare(title(a.Name), title(b.Name))
|
|
})
|
|
}
|
|
```
|
|
|
|
### Custom Sort
|
|
|
|
Sorts by predefined sort order:
|
|
|
|
```go
|
|
func (c *Category) sortByCustom() {
|
|
// Uses SortOrder, FavSortOrder, AllSortOrder fields
|
|
}
|
|
```
|
|
|
|
## Data Flow
|
|
|
|
```mermaid
|
|
sequenceDiagram
|
|
participant RouteProvider
|
|
participant HomepageMap
|
|
participant Category
|
|
participant Widget
|
|
|
|
RouteProvider->>HomepageMap: Add(Item)
|
|
HomepageMap->>HomepageMap: Add to All
|
|
HomepageMap->>HomepageMap: Add to Category
|
|
alt Item.Favorite
|
|
HomepageMap->>CategoryFavorites: Add item
|
|
else !Item.Show
|
|
HomepageMap->>CategoryHidden: Add item
|
|
end
|
|
|
|
User->>HomepageMap: Get Category
|
|
HomepageMap-->>User: Items
|
|
|
|
User->>Category: Sort(method)
|
|
Category-->>User: Sorted Items
|
|
|
|
User->>Item: Get Widgets
|
|
Item->>Widget: Fetch Data
|
|
Widget-->>Item: Widget Data
|
|
Item-->>User: Display Widgets
|
|
```
|
|
|
|
## Integration Points
|
|
|
|
The homepage package integrates with:
|
|
|
|
- **Route Provider**: Item discovery from routes
|
|
- **Container**: Container status and metadata
|
|
- **Widgets**: Live data display
|
|
- **API**: Frontend data API
|
|
- **Configuration**: Default and override configs
|
|
|
|
## Configuration
|
|
|
|
### Active Configuration
|
|
|
|
```go
|
|
var ActiveConfig atomic.Pointer[Config]
|
|
```
|
|
|
|
### Configuration Structure
|
|
|
|
```go
|
|
type Config struct {
|
|
UseDefaultCategories bool
|
|
// ... other options
|
|
}
|
|
```
|
|
|
|
## Serialization
|
|
|
|
The package registers default value factories for serialization:
|
|
|
|
```go
|
|
func init() {
|
|
serialization.RegisterDefaultValueFactory(func() *ItemConfig {
|
|
return &ItemConfig{
|
|
Show: true,
|
|
}
|
|
})
|
|
}
|
|
```
|