Add CSV export of the logs matching the current filters
- GET /api/export.csv streams every stored log matching the filters (newest first, up to EXPORT_MAX rows, 100000 by default) straight from VictoriaLogs, with dates in the time zone chosen in Settings. - Export button with two variants: CSV (comma, UTF-8) and CSV for Excel (semicolon + BOM, formula injection neutralized). - Store.QueryStream streams query results without buffering them. - Mobile: filter bar keeps two selects per row, count next to Export. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
84e71f741c
commit
328384032b
10 files changed
+316
-23
No files matched your search
+21
-2
@@ -199,6 +199,25 @@ body.busy .progress::after {
|
||||
.spacer { flex: 1; }
|
||||
#count { font-size: 12.5px; font-variant-numeric: tabular-nums; }
|
||||
|
||||
/* Export button and menu */
|
||||
.export { position: relative; }
|
||||
.btn.tool { height: 32px; padding: 0 10px; font-size: 13px; }
|
||||
.btn.tool svg { width: 16px; height: 16px; }
|
||||
.menu {
|
||||
position: absolute; right: 0; top: calc(100% + 6px); z-index: 40;
|
||||
width: 290px; padding: 6px;
|
||||
background: var(--panel); border: 1px solid var(--border); border-radius: 12px;
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
.menu button {
|
||||
display: flex; flex-direction: column; align-items: flex-start; gap: 1px; width: 100%;
|
||||
padding: 8px 10px; border: 0; border-radius: 8px; background: transparent; text-align: left;
|
||||
}
|
||||
.menu button:hover, .menu button:focus-visible { background: var(--panel-2); outline: 0; }
|
||||
.menu strong { font-size: 13px; font-weight: 600; }
|
||||
.menu small { font-size: 12px; color: var(--muted); }
|
||||
.menu-note { margin: 4px 0 0; padding: 8px 10px 4px; border-top: 1px solid var(--border); font-size: 11.5px; color: var(--muted); }
|
||||
|
||||
/* ---------- Histogram ---------- */
|
||||
.histo { padding: 0 20px 6px; }
|
||||
.histo .bars {
|
||||
@@ -441,9 +460,9 @@ select.field:focus { outline: 0; border-color: var(--accent); box-shadow: 0 0 0
|
||||
.search { order: 3; flex-basis: 100%; max-width: none; }
|
||||
.live .lbl { display: none; }
|
||||
.filters { padding: 10px 16px 6px; }
|
||||
.filters select { flex: 1 1 calc(50% - 8px); max-width: none; }
|
||||
.filters select { flex: 1 1 calc(50% - 8px); max-width: none; min-width: 0; }
|
||||
.spacer { display: none; }
|
||||
#count { flex-basis: 100%; }
|
||||
#count { flex: 1 1 50%; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
|
||||
.histo { padding: 0 16px 6px; }
|
||||
.list, .error-banner { margin-left: 16px; margin-right: 16px; }
|
||||
.row {
|
||||
|
||||
Reference in new issue
Block a user