Merge branch 'main' into dev

This commit is contained in:
Svilen Markov 2025-02-17 23:27:42 +00:00
commit c33fe45d4c
5 changed files with 71 additions and 22 deletions

View file

@ -97,9 +97,9 @@ Including config files from within your main config file is supported. This is d
```yaml
pages:
!include home.yml
!include videos.yml
!include homelab.yml
!include: home.yml
!include: videos.yml
!include: homelab.yml
```
The file you are including should not have any additional indentation, its values should be at the top level and the appropriate amount of indentation will be added automatically depending on where the file is included. Example:
@ -112,14 +112,14 @@ pages:
columns:
- size: full
widgets:
!include rss.yml
!include: rss.yml
- name: News
columns:
- size: full
widgets:
- type: group
widgets:
!include rss.yml
!include: rss.yml
- type: reddit
subreddit: news
```
@ -1672,7 +1672,7 @@ For services with multiple containers you can specify a `glance.id` on the "main
<br>
```yaml
servies:
services:
immich-server:
image: ghcr.io/immich-app/immich-server
labels:
@ -1852,11 +1852,29 @@ Whether to hide the swap usage.
| Name | Type | Required | Default |
| ---- | ---- | -------- | ------- |
| cpu-temp-sensor | string | no | |
| hide-mointpoints-by-default | boolean | no | false |
| mountpoints | map\[string\]object | no | |
###### `cpu-temp-sensor`
The name of the sensor to use for the CPU temperature. When not provided the widget will attempt to find the correct one, if it fails to do so the temperature will not be displayed. To view the available sensors you can use `sensors` command.
###### `hide-mountpoints-by-default`
If set to `true` you'll have to manually make each mountpoint visible by adding a `hide: false` property to it like so:
```yaml
- type: server-stats
servers:
- type: local
hide-mountpoints-by-default: true
mountpoints:
"/":
hide: false
"/mnt/data":
hide: false
```
This is useful if you're running Glance inside of a container which usually mounts a lot of irrelevant filesystems.
###### `mountpoints`
A map of mountpoints to display disk usage for. The key is the path to the mountpoint and the value is an object with optional properties. Example:

View file

@ -152,9 +152,9 @@ func newCustomIconField(value string) customIconField {
}
if prefix == "di" {
field.URL = "https://cdn.jsdelivr.net/gh/walkxcode/dashboard-icons@master/" + ext + "/" + basename + "." + ext
field.URL = "https://cdn.jsdelivr.net/gh/homarr-labs/dashboard-icons/" + ext + "/" + basename + "." + ext
} else {
field.URL = "https://cdn.jsdelivr.net/gh/selfhst/icons@main/" + ext + "/" + basename + "." + ext
field.URL = "https://cdn.jsdelivr.net/gh/selfhst/icons/" + ext + "/" + basename + "." + ext
}
default:
field.URL = value

View file

@ -98,7 +98,6 @@ function showPopover() {
}
contentElement.style.maxWidth = contentMaxWidth;
containerElement.style.display = "block";
activeTarget.classList.add("popover-active");
document.addEventListener("keydown", handleHidePopoverOnEscape);
window.addEventListener("resize", queueRepositionContainer);
@ -106,6 +105,8 @@ function showPopover() {
}
function repositionContainer() {
containerElement.style.display = "block";
const targetBounds = activeTarget.dataset.popoverAnchor !== undefined
? activeTarget.querySelector(activeTarget.dataset.popoverAnchor).getBoundingClientRect()
: activeTarget.getBoundingClientRect();

View file

@ -52,10 +52,11 @@ func (widget *videosWidget) initialize() error {
// playlists are separate things rather than specifying a list of channels and some of
// them awkwardly have a "playlist:" prefix
if len(widget.Playlists) > 0 {
initialLen := len(widget.Channels)
widget.Channels = append(widget.Channels, make([]string, len(widget.Playlists))...)
for i := range widget.Playlists {
widget.Channels[len(widget.Channels)-1+i] = "playlist:" + widget.Playlists[i]
widget.Channels[initialLen+i] = "playlist:" + widget.Playlists[i]
}
}

View file

@ -3,6 +3,7 @@ package sysinfo
import (
"fmt"
"math"
"os"
"runtime"
"sort"
"strconv"
@ -73,24 +74,52 @@ type MountpointInfo struct {
}
type SystemInfoRequest struct {
CPUTempSensor string `yaml:"cpu-temp-sensor"`
Mountpoints map[string]MointpointRequest `yaml:"mountpoints"`
CPUTempSensor string `yaml:"cpu-temp-sensor"`
HideMountpointsByDefault bool `yaml:"hide-mountpoints-by-default"`
Mountpoints map[string]MointpointRequest `yaml:"mountpoints"`
}
type MointpointRequest struct {
Name string `yaml:"name"`
Hide bool `yaml:"hide"`
Hide *bool `yaml:"hide"`
}
// Currently caches hostname indefinitely which isn't ideal
// Potential issue with caching boot time as it may not initially get reported correctly:
// https://github.com/shirou/gopsutil/issues/842#issuecomment-1908972344
var cachedHostInfo = struct {
type cacheableHostInfo struct {
available bool
hostname string
platform string
bootTime timestampJSON
}{}
}
var cachedHostInfo cacheableHostInfo
func getHostInfo() (cacheableHostInfo, error) {
var err error
info := cacheableHostInfo{}
info.hostname, err = os.Hostname()
if err != nil {
return info, err
}
info.platform, _, _, err = host.PlatformInformation()
if err != nil {
return info, err
}
bootTime, err := host.BootTime()
if err != nil {
return info, err
}
info.bootTime = timestampJSON{time.Unix(int64(bootTime), 0)}
info.available = true
return info, nil
}
func Collect(req *SystemInfoRequest) (*SystemInfo, []error) {
if req == nil {
@ -117,13 +146,9 @@ func Collect(req *SystemInfoRequest) (*SystemInfo, []error) {
if cachedHostInfo.available {
applyCachedHostInfo()
} else {
hostInfo, err := host.Info()
hostInfo, err := getHostInfo()
if err == nil {
cachedHostInfo.available = true
cachedHostInfo.bootTime = timestampJSON{time.Unix(int64(hostInfo.BootTime), 0)}
cachedHostInfo.hostname = hostInfo.Hostname
cachedHostInfo.platform = hostInfo.Platform
cachedHostInfo = hostInfo
applyCachedHostInfo()
} else {
addErr(fmt.Errorf("getting host info: %v", err))
@ -205,7 +230,11 @@ func Collect(req *SystemInfoRequest) (*SystemInfo, []error) {
if err == nil {
for _, fs := range filesystems {
mpReq, ok := req.Mountpoints[fs.Mountpoint]
if ok && mpReq.Hide {
isHidden := req.HideMountpointsByDefault
if ok && mpReq.Hide != nil {
isHidden = *mpReq.Hide
}
if isHidden {
continue
}