Update AppImage

This commit is contained in:
MacRimi
2025-10-11 19:43:15 +02:00
parent 6d87ab08e2
commit 4a5c1ed582
3 changed files with 50 additions and 51 deletions

View File

@@ -102,18 +102,17 @@ export function SystemLogs() {
const [selectedLog, setSelectedLog] = useState<SystemLog | null>(null) const [selectedLog, setSelectedLog] = useState<SystemLog | null>(null)
const [selectedEvent, setSelectedEvent] = useState<Event | null>(null) const [selectedEvent, setSelectedEvent] = useState<Event | null>(null)
const [selectedBackup, setSelectedBackup] = useState<Backup | null>(null) const [selectedBackup, setSelectedBackup] = useState<Backup | null>(null)
const [selectedNotification, setSelectedNotification] = useState<Notification | null>(null) const [selectedNotification, setSelectedNotification] = useState<Notification | null>(null) // Added
const [isLogModalOpen, setIsLogModalOpen] = useState(false) const [isLogModalOpen, setIsLogModalOpen] = useState(false)
const [isEventModalOpen, setIsEventModalOpen] = useState(false) const [isEventModalOpen, setIsEventModalOpen] = useState(false)
const [isBackupModalOpen, setIsBackupModalOpen] = useState(false) const [isBackupModalOpen, setIsBackupModalOpen] = useState(false)
const [isNotificationModalOpen, setIsNotificationModalOpen] = useState(false) const [isNotificationModalOpen, setIsNotificationModalOpen] = useState(false) // Added
const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false) const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false)
const [dateFilter, setDateFilter] = useState("now") const [dateFilter, setDateFilter] = useState("now")
const [customDays, setCustomDays] = useState("1") const [customDays, setCustomDays] = useState("1")
const [dateRange, setDateRange] = useState<DateRange | undefined>(undefined) const [dateRange, setDateRange] = useState<DateRange | undefined>(undefined)
const [isCalendarOpen, setIsCalendarOpen] = useState(false)
const getApiUrl = (endpoint: string) => { const getApiUrl = (endpoint: string) => {
if (typeof window !== "undefined") { if (typeof window !== "undefined") {
@@ -129,9 +128,8 @@ export function SystemLogs() {
useEffect(() => { useEffect(() => {
if (dateFilter !== "now" && dateFilter !== "custom") { if (dateFilter !== "now" && dateFilter !== "custom") {
console.log("[v0] Date filter changed to:", dateFilter) console.log("[v0] Date filter changed to:", dateFilter)
fetchSystemLogs().then((logsData) => { fetchSystemLogs({ since_days: Number(dateFilter) }).then((newLogs) => {
console.log("[v0] Fetched logs:", logsData.length) setLogs(newLogs)
setLogs(logsData)
}) })
} }
}, [dateFilter]) }, [dateFilter])
@@ -172,42 +170,30 @@ export function SystemLogs() {
} }
} }
const handleApplyDateRange = async () => { const fetchSystemLogs = async (params?: {
if (dateRange?.from && dateRange?.to) { since_days?: number
console.log("[v0] Applying date range:", dateRange) from_date?: string
setIsCalendarOpen(false) to_date?: string
setLoading(true) }): Promise<SystemLog[]> => {
const logsRes = await fetchSystemLogs()
console.log("[v0] Fetched logs for date range:", logsRes.length)
setLogs(logsRes)
setLoading(false)
}
}
const fetchSystemLogs = async (): Promise<SystemLog[]> => {
try { try {
let apiUrl = getApiUrl("/api/logs") let apiUrl = getApiUrl("/api/logs")
const params = new URLSearchParams() // Add date parameters if provided
const queryParams = new URLSearchParams()
if (dateFilter === "custom" && dateRange?.from && dateRange?.to) { if (params?.since_days) {
const fromDate = format(dateRange.from, "yyyy-MM-dd") queryParams.append("since_days", params.since_days.toString())
const toDate = format(dateRange.to, "yyyy-MM-dd") console.log("[v0] Fetching logs with since_days:", params.since_days)
params.append("from_date", fromDate) }
params.append("to_date", toDate) if (params?.from_date && params?.to_date) {
console.log("[v0] Fetching logs with custom date range:", fromDate, "to", toDate) queryParams.append("from_date", params.from_date)
} else if (dateFilter !== "now") { queryParams.append("to_date", params.to_date)
const daysAgo = Number.parseInt(dateFilter) console.log("[v0] Fetching logs with date range:", params.from_date, "to", params.to_date)
params.append("since_days", daysAgo.toString())
console.log("[v0] Fetching logs from", daysAgo, "days ago")
} }
if (params.toString()) { if (queryParams.toString()) {
apiUrl += `?${params.toString()}` apiUrl += `?${queryParams.toString()}`
} }
console.log("[v0] Fetching logs from:", apiUrl)
const response = await fetch(apiUrl, { const response = await fetch(apiUrl, {
method: "GET", method: "GET",
headers: { headers: {
@@ -228,6 +214,18 @@ export function SystemLogs() {
} }
} }
const handleApplyDateRange = async () => {
if (dateRange?.from && dateRange?.to) {
console.log("[v0] Applying date range filter:", dateRange.from, "to", dateRange.to)
setLoading(true)
const fromDate = format(dateRange.from, "yyyy-MM-dd")
const toDate = format(dateRange.to, "yyyy-MM-dd")
const newLogs = await fetchSystemLogs({ from_date: fromDate, to_date: toDate })
setLogs(newLogs)
setLoading(false)
}
}
const handleDownloadLogs = async (type = "system") => { const handleDownloadLogs = async (type = "system") => {
try { try {
let hours = 48 let hours = 48
@@ -669,7 +667,7 @@ export function SystemLogs() {
</Select> </Select>
{dateFilter === "custom" && ( {dateFilter === "custom" && (
<Popover open={isCalendarOpen && activeTab === "logs"} onOpenChange={setIsCalendarOpen}> <Popover>
<PopoverTrigger asChild> <PopoverTrigger asChild>
<Button <Button
variant="outline" variant="outline"
@@ -702,10 +700,17 @@ export function SystemLogs() {
<div className="p-3 border-t border-border"> <div className="p-3 border-t border-border">
<Button <Button
onClick={handleApplyDateRange} onClick={handleApplyDateRange}
disabled={!dateRange?.from || !dateRange?.to} disabled={!dateRange?.from || !dateRange?.to || loading}
className="w-full" className="w-full"
> >
Apply Filter {loading ? (
<>
<RefreshCw className="h-4 w-4 mr-2 animate-spin" />
Loading...
</>
) : (
"Apply Filter"
)}
</Button> </Button>
</div> </div>
</PopoverContent> </PopoverContent>

View File

@@ -22,7 +22,7 @@ function Calendar({ className, classNames, showOutsideDays = true, ...props }: C
nav: "space-x-1 flex items-center", nav: "space-x-1 flex items-center",
nav_button: cn( nav_button: cn(
buttonVariants({ variant: "outline" }), buttonVariants({ variant: "outline" }),
"h-7 w-7 bg-transparent p-0 opacity-100 hover:bg-accent hover:text-accent-foreground border-border", "h-7 w-7 bg-transparent p-0 opacity-50 hover:opacity-100",
), ),
nav_button_previous: "absolute left-1", nav_button_previous: "absolute left-1",
nav_button_next: "absolute right-1", nav_button_next: "absolute right-1",

View File

@@ -3408,20 +3408,14 @@ def api_logs_download():
level = request.args.get('level', 'all') level = request.args.get('level', 'all')
service = request.args.get('service', 'all') service = request.args.get('service', 'all')
since_days = request.args.get('since_days', None) since_days = request.args.get('since_days', None)
from_date = request.args.get('from_date', None)
to_date = request.args.get('to_date', None)
if since_days: if from_date and to_date:
# Date format expected: YYYY-MM-DD
cmd = ['journalctl', '--since', from_date, '--until', f'{to_date} 23:59:59', '--no-pager']
elif since_days:
days = int(since_days) days = int(since_days)
# Original code: cmd = ['journalctl', '--since', f'{days} days ago', '--until', f'{days - 1} days ago', '--no-pager']
# This logic seems incorrect if we want logs FROM since_days ago.
# Correct logic: logs from 'days' ago until 'now' (or 'days-1' ago for a specific 24h period)
# For simplicity and to keep the original intent of filtering *from* X days ago, let's use '--since'.
# If 'since_days' is 1, it means logs from yesterday until now.
# If 'since_days' is 2, it means logs from the day before yesterday until now.
# Let's assume 'since_days' means the number of *full 24-hour periods* to go back.
# So, if since_days = 1, we want logs from 24 hours ago.
# If since_days = 2, we want logs from 48 hours ago.
# The original '--until' logic was problematic. Let's simplify.
# If 'since_days' is provided, use it as the primary time filter.
cmd = ['journalctl', '--since', f'{days} days ago', '--no-pager'] cmd = ['journalctl', '--since', f'{days} days ago', '--no-pager']
else: else:
cmd = ['journalctl', '--since', f'{hours} hours ago', '--no-pager'] cmd = ['journalctl', '--since', f'{hours} hours ago', '--no-pager']