Skip to content

Commit 1813205

Browse files
committed
feat: improve sidebar with collapsible panels
1 parent 58c751b commit 1813205

4 files changed

Lines changed: 67 additions & 33 deletions

File tree

src/App.jsx

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ function App() {
252252
>
253253
{sidebarVisible && (
254254
<aside
255-
className="xl:col-span-1 space-y-3"
255+
className="xl:col-span-1 space-y-3 overflow-y-auto max-h-screen"
256256
role="complementary"
257257
aria-label="控制面板"
258258
>
@@ -304,7 +304,14 @@ function App() {
304304
</div>
305305

306306
<FileUpload onFilesUploaded={handleFilesUploaded} />
307-
307+
308+
<FileList
309+
files={uploadedFiles}
310+
onFileRemove={handleFileRemove}
311+
onFileToggle={handleFileToggle}
312+
onFileConfig={handleFileConfig}
313+
/>
314+
308315
<RegexControls
309316
globalParsingConfig={globalParsingConfig}
310317
onGlobalParsingConfigChange={handleGlobalParsingConfigChange}
@@ -313,13 +320,6 @@ function App() {
313320
onXRangeChange={setXRange}
314321
maxStep={maxStep}
315322
/>
316-
317-
<FileList
318-
files={uploadedFiles}
319-
onFileRemove={handleFileRemove}
320-
onFileToggle={handleFileToggle}
321-
onFileConfig={handleFileConfig}
322-
/>
323323

324324
{uploadedFiles.filter(file => file.enabled).length === 2 && (
325325
<ComparisonControls
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import React, { useState } from 'react';
2+
import { ChevronDown } from 'lucide-react';
3+
4+
export function CollapsibleSection({ title, defaultOpen = true, action = null, children }) {
5+
const [open, setOpen] = useState(defaultOpen);
6+
const id = `section-${title}`.replace(/\s+/g, '-');
7+
return (
8+
<section className="bg-white rounded-lg shadow-md" aria-labelledby={id}>
9+
<button
10+
type="button"
11+
onClick={() => setOpen(!open)}
12+
className="w-full flex items-center justify-between p-3 focus:outline-none"
13+
aria-expanded={open}
14+
>
15+
<h3 id={id} className="text-base font-semibold text-gray-800">
16+
{title}
17+
</h3>
18+
<span className="flex items-center gap-1">
19+
{action}
20+
<ChevronDown
21+
size={16}
22+
className={`text-gray-600 transition-transform ${open ? 'transform rotate-180' : ''}`}
23+
aria-hidden="true"
24+
/>
25+
</span>
26+
</button>
27+
{open && <div className="p-3 border-t">{children}</div>}
28+
</section>
29+
);
30+
}
31+
32+
export default CollapsibleSection;

src/components/FileUpload.jsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useCallback, useState } from 'react';
22
import { Upload, FileText } from 'lucide-react';
3+
import CollapsibleSection from './CollapsibleSection.jsx';
34

45
export function FileUpload({ onFilesUploaded }) {
56
const [isDragOver, setIsDragOver] = useState(false);
@@ -63,13 +64,7 @@ export function FileUpload({ onFilesUploaded }) {
6364
}, [processFiles]);
6465

6566
return (
66-
<div className="bg-white rounded-lg shadow-md p-3">
67-
<h3
68-
id="file-upload-heading"
69-
className="text-base font-semibold text-gray-800 mb-2"
70-
>
71-
📁 文件上传
72-
</h3>
67+
<CollapsibleSection title="📁 文件上传">
7368
<div
7469
className={`drag-area border-2 border-dashed rounded-lg p-4 text-center cursor-pointer ${
7570
isDragOver ? 'border-blue-500 bg-blue-50' : 'border-gray-300 hover:border-gray-400'
@@ -81,7 +76,7 @@ export function FileUpload({ onFilesUploaded }) {
8176
onClick={() => document.getElementById('fileInput').click()}
8277
role="button"
8378
tabIndex={0}
84-
aria-labelledby="file-upload-heading"
79+
aria-label="上传日志文件"
8580
aria-describedby="file-upload-description"
8681
onKeyDown={(e) => {
8782
if (e.key === 'Enter' || e.key === ' ') {
@@ -113,6 +108,6 @@ export function FileUpload({ onFilesUploaded }) {
113108
aria-label="选择日志文件,支持所有文本格式"
114109
/>
115110
</div>
116-
</div>
111+
</CollapsibleSection>
117112
);
118113
}

src/components/RegexControls.jsx

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import React, { useState, useEffect, useCallback } from 'react';
2-
import { Settings, Zap, Eye, ChevronDown, ChevronUp, Target, Code, ZoomIn } from 'lucide-react';
2+
import { Settings, Zap, Eye, Target, Code, ZoomIn } from 'lucide-react';
3+
import CollapsibleSection from './CollapsibleSection.jsx';
34
import { METRIC_PRESETS } from '../metricPresets.js';
45

56
// 匹配模式枚举
@@ -450,20 +451,26 @@ export function RegexControls({
450451

451452
<div className="space-y-4">
452453
{globalParsingConfig.metrics.map((cfg, idx) => (
453-
<div key={idx} className="border rounded-lg p-3 relative">
454-
<button
455-
onClick={() => removeMetric(idx)}
456-
className="absolute top-1 right-1 text-red-500"
457-
title="删除配置"
458-
>
459-
×
460-
</button>
461-
<h4 className="text-sm font-medium text-gray-800 mb-2 flex items-center gap-1">
462-
<span className="w-3 h-3 bg-blue-500 rounded-full"></span>
463-
{getMetricTitle(cfg, idx)} 解析配置
464-
</h4>
465-
{renderConfigPanel(`metric-${idx}`, cfg, (field, value) => handleMetricChange(idx, field, value), idx)}
466-
</div>
454+
<CollapsibleSection
455+
key={idx}
456+
title={`${getMetricTitle(cfg, idx)} 解析配置`}
457+
action={
458+
<button
459+
onClick={() => removeMetric(idx)}
460+
className="text-red-500"
461+
title="删除配置"
462+
>
463+
×
464+
</button>
465+
}
466+
>
467+
{renderConfigPanel(
468+
`metric-${idx}`,
469+
cfg,
470+
(field, value) => handleMetricChange(idx, field, value),
471+
idx
472+
)}
473+
</CollapsibleSection>
467474
))}
468475
<button
469476
onClick={addMetric}

0 commit comments

Comments
 (0)