Release 2.9.0

This commit is contained in:
2026-08-28 02:53:59 +01:00
parent 9097d45d6a
commit 3de0e89e94
67 changed files with 1767 additions and 98 deletions
+41
View File
@@ -20,6 +20,9 @@
<a class="nav-link" href="#icon-suggestions" data-settings-section-link>
<i class="bi bi-grid-3x3-gap me-2" aria-hidden="true"></i>Icon Suggestions
</a>
<a class="nav-link" href="#weather-providers" data-settings-section-link>
<i class="bi bi-cloud-sun me-2" aria-hidden="true"></i>Weather Providers
</a>
<a class="nav-link" href="#security-sessions" data-settings-section-link>
<i class="bi bi-shield-lock me-2" aria-hidden="true"></i>Security and Sessions
</a>
@@ -146,6 +149,44 @@
</div>
</form>
<form method="post" action="/settings/system" data-async-save data-settings-form="weather">
<input type="hidden" name="settings_section" value="weather">
<div id="weather-providers" class="card settings-section-card" data-settings-section hidden>
<div class="card-header d-flex align-items-start justify-content-between gap-3">
<div class="min-w-0">
<h3 class="h5 mb-1 fw-semibold"><i class="bi bi-cloud-sun me-2 text-primary" aria-hidden="true"></i>Weather Providers</h3>
<p class="text-muted small mb-0">Manage shared credentials used by weather locations.</p>
</div>
</div>
<div class="card-body">
<div class="row g-3">
<div class="col-12"><h4 class="h6 text-uppercase text-muted mb-0">Provider credentials</h4></div>
<div class="col-12 col-xl-6">
<div class="border rounded p-3 h-100">
<div class="d-flex align-items-start justify-content-between gap-2 mb-3"><div><strong>Open-Meteo</strong><div class="small text-body-secondary">Global forecast provider · API key optional</div></div>{{#if mediaSettings.weatherOpenMeteoConfigured}}<span class="badge text-bg-success flex-shrink-0">Configured</span>{{else}}<span class="badge text-bg-secondary flex-shrink-0">Keyless</span>{{/if}}</div>
<label for="settings-open-meteo-key" class="form-label">API key</label>
<input id="settings-open-meteo-key" name="open_meteo_api_key" type="password" class="form-control" autocomplete="off" placeholder="{{#if mediaSettings.weatherOpenMeteoConfigured}}{{mediaSettings.weatherOpenMeteoKeyLabel}}{{else}}Optional API key{{/if}}">
<div class="form-text">Open-Meteo can be used without a key. Leave blank to keep the existing credential.</div>
<a class="small" href="https://open-meteo.com/" target="_blank" rel="noreferrer">open-meteo.com</a>
</div>
</div>
<div class="col-12 col-xl-6">
<div class="border rounded p-3 h-100">
<div class="d-flex align-items-start justify-content-between gap-2 mb-3"><div><strong>Pirate Weather</strong><div class="small text-body-secondary">Global forecast provider · API key required</div></div>{{#if mediaSettings.weatherPirateWeatherConfigured}}<span class="badge text-bg-success flex-shrink-0">Configured</span>{{else}}<span class="badge text-bg-secondary flex-shrink-0">Not configured</span>{{/if}}</div>
<label for="settings-pirate-weather-key" class="form-label">API key</label>
<input id="settings-pirate-weather-key" name="pirate_weather_api_key" type="password" class="form-control" autocomplete="off" placeholder="{{#if mediaSettings.weatherPirateWeatherConfigured}}{{mediaSettings.weatherPirateWeatherKeyLabel}}{{else}}Enter API key{{/if}}">
<div class="form-text">Leave blank to keep the existing credential. One key is shared by all weather locations.</div>
<a class="small" href="https://pirateweather.net/" target="_blank" rel="noreferrer">pirateweather.net</a>
</div>
</div>
</div>
</div>
<div class="card-footer d-flex justify-content-end">
{{#if (hasPermission currentUser 'system-settings.update')}}<button type="submit" class="btn btn-success"><i class="bi bi-check2 me-1"></i>Save</button>{{else}}<button type="button" class="btn btn-outline-success" disabled>Save</button>{{/if}}
</div>
</div>
</form>
<form method="post" action="/settings/system" data-async-save data-settings-form="media">
<input type="hidden" name="settings_section" value="media">
<div id="media-uploads" class="card settings-section-card" data-settings-section hidden>