mirror of
https://github.com/MacRimi/ProxMenux.git
synced 2025-11-18 03:26:17 +00:00
Update AppImage
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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']
|
||||||
|
|||||||
Reference in New Issue
Block a user