d3d085d614
Build and Push Docker Image / build (push) Successful in 1m29s
Docs Check / Markdown lint (push) Successful in 1m51s
Licence Check / Licence compatibility and copyright header verification (push) Failing after 2m3s
CI / Security audit (push) Successful in 2m54s
CI / Swagger Validation & Coverage (push) Successful in 3m6s
Docs Check / Mermaid diagram parse check (push) Successful in 3m13s
CI / Tests & coverage (push) Successful in 3m31s
- Add request filters UI (type, status, sort, search) - Implement dual-layer filtering (server + client) - Add ombiFilters utility for consistent filtering logic - Persist filter preferences in localStorage - Add SSE support for real-time Ombi request updates - Add webhook endpoints for Ombi integration - Update OpenAPI spec for new endpoints - Add unit tests for filter logic and UI - Add integration tests for Ombi routes
128 lines
3.9 KiB
JavaScript
128 lines
3.9 KiB
JavaScript
// Copyright (c) 2026 Gordon Bolton. MIT License.
|
|
|
|
import { state } from '../state.js';
|
|
|
|
// Migration from old single-select to new multi-select format
|
|
(function migrateDownloadClientFilter() {
|
|
const oldSelection = localStorage.getItem('sofarr-download-client');
|
|
if (oldSelection && oldSelection !== 'all') {
|
|
try {
|
|
state.selectedDownloadClients = [oldSelection];
|
|
localStorage.setItem('sofarr-download-clients', JSON.stringify(state.selectedDownloadClients));
|
|
localStorage.removeItem('sofarr-download-client');
|
|
} catch (e) {
|
|
console.error('[Migration] Failed to migrate download client filter:', e);
|
|
}
|
|
} else {
|
|
try {
|
|
const newSelection = localStorage.getItem('sofarr-download-clients');
|
|
state.selectedDownloadClients = newSelection ? JSON.parse(newSelection) : [];
|
|
} catch (e) {
|
|
console.error('[Migration] Failed to load download client filter:', e);
|
|
state.selectedDownloadClients = [];
|
|
}
|
|
}
|
|
})();
|
|
|
|
// Load history days from localStorage
|
|
(function loadHistorySettings() {
|
|
try {
|
|
const savedDays = localStorage.getItem('sofarr-history-days');
|
|
if (savedDays) {
|
|
state.historyDays = parseInt(savedDays, 10) || 7;
|
|
}
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load history days:', e);
|
|
}
|
|
})();
|
|
|
|
// Load ignore available setting from localStorage
|
|
(function loadIgnoreAvailable() {
|
|
try {
|
|
const saved = localStorage.getItem('sofarr-ignore-available');
|
|
state.ignoreAvailable = saved === 'true';
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load ignore available:', e);
|
|
}
|
|
})();
|
|
|
|
// Load request filter preferences from localStorage
|
|
(function loadRequestFilters() {
|
|
try {
|
|
const savedTypes = localStorage.getItem('sofarr-request-types');
|
|
if (savedTypes) state.selectedRequestTypes = JSON.parse(savedTypes);
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load request types:', e);
|
|
state.selectedRequestTypes = ['movie', 'tv'];
|
|
}
|
|
|
|
try {
|
|
const savedStatuses = localStorage.getItem('sofarr-request-statuses');
|
|
if (savedStatuses) state.selectedRequestStatuses = JSON.parse(savedStatuses);
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load request statuses:', e);
|
|
state.selectedRequestStatuses = [];
|
|
}
|
|
|
|
try {
|
|
const savedSort = localStorage.getItem('sofarr-request-sort');
|
|
if (savedSort) state.requestSortMode = savedSort;
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load request sort:', e);
|
|
state.requestSortMode = 'requestedDate_desc';
|
|
}
|
|
|
|
try {
|
|
const savedSearch = localStorage.getItem('sofarr-request-search');
|
|
if (savedSearch !== null) state.requestSearchQuery = savedSearch;
|
|
} catch (e) {
|
|
console.error('[Storage] Failed to load request search:', e);
|
|
state.requestSearchQuery = '';
|
|
}
|
|
})();
|
|
|
|
// Export helper functions for localStorage operations
|
|
export function saveHistoryDays(days) {
|
|
localStorage.setItem('sofarr-history-days', days);
|
|
}
|
|
|
|
export function saveIgnoreAvailable(value) {
|
|
localStorage.setItem('sofarr-ignore-available', value);
|
|
}
|
|
|
|
export function saveDownloadClients(clients) {
|
|
localStorage.setItem('sofarr-download-clients', JSON.stringify(clients));
|
|
}
|
|
|
|
export function getTheme() {
|
|
return localStorage.getItem('sofarr-theme') || 'light';
|
|
}
|
|
|
|
export function saveTheme(theme) {
|
|
localStorage.setItem('sofarr-theme', theme);
|
|
}
|
|
|
|
export function getActiveTab() {
|
|
return localStorage.getItem('sofarr-active-tab') || 'downloads';
|
|
}
|
|
|
|
export function saveActiveTab(tab) {
|
|
localStorage.setItem('sofarr-active-tab', tab);
|
|
}
|
|
|
|
export function saveRequestTypes(types) {
|
|
localStorage.setItem('sofarr-request-types', JSON.stringify(types));
|
|
}
|
|
|
|
export function saveRequestStatuses(statuses) {
|
|
localStorage.setItem('sofarr-request-statuses', JSON.stringify(statuses));
|
|
}
|
|
|
|
export function saveRequestSort(sort) {
|
|
localStorage.setItem('sofarr-request-sort', sort);
|
|
}
|
|
|
|
export function saveRequestSearch(query) {
|
|
localStorage.setItem('sofarr-request-search', query);
|
|
}
|