REAL SHOWCASE SOURCEchart-range-slider-lab

1 个文件 · 79 行 · TypeScript

// ===== showcase/src/examples/components/chart_range_slider.ts ===== import {  RenderButton,  RenderChartRangeSlider,  RenderLineChart,  RenderPageHeader,  RenderStackPanel,  RenderText,  RenderWrapPanel,  type ChartSeries,} from 'ds-ui' const start = new Date('2026-07-14T00:00:00').getTime()const hour = 60 * 60 * 1000const series: ChartSeries[] = [  {    name: '检验完成量',    data: Array.from({ length: 49 }, (_, index) => ({      x: new Date(start + index * hour),      y: 18 + Math.round(Math.sin(index / 4) * 8) + (index % 7),    })),  },] export function createChartRangeSliderExample(): RenderStackPanel {  const status = new RenderText('当前查看最近 24 小时;拖动滑块手柄或中间窗口调整范围。', { role: 'secondary' })  const initialViewport = { min: start + 24 * hour, max: start + 48 * hour }  const chart = new RenderLineChart({    series,    xAxisType: 'time',    xViewport: initialViewport,    yAxis: { unit: '项', min: 0, tickCount: 4 },    area: true,    showLegend: false,    enablePan: true,    enableWheelZoom: true,    height: 260,  })  const slider = new RenderChartRangeSlider({    series,    xAxisType: 'time',    viewport: initialViewport,    minSpan: 6 * hour,    onViewportChange: event => {      chart.setXViewport(event.viewport, event.reason)      const spanHours = Math.round((event.viewport.max - event.viewport.min) / hour)      status.text = `当前窗口 ${spanHours} 小时 · 变更原因 ${event.reason}`    },  })  chart.onViewportChange = event => slider.setViewport(event.viewport, event.reason)   const actions = new RenderWrapPanel({ spacing: 8, runSpacing: 8 })  actions.addChild(new RenderButton({    label: '最近 12 小时',    onClick: () => slider.setViewport({ min: start + 36 * hour, max: start + 48 * hour }, 'api'),  }))  actions.addChild(new RenderButton({    label: '最近 24 小时',    variant: 'primary',    onClick: () => slider.setViewport(initialViewport, 'api'),  }))  actions.addChild(new RenderButton({    label: '全部 48 小时',    onClick: () => slider.setViewport({ min: start, max: start + 48 * hour }, 'api'),  }))   const panel = new RenderStackPanel({ orientation: 'vertical', spacing: 12, crossAxisAlignment: 'stretch' })  panel.addChild(new RenderPageHeader({    title: 'ChartRangeSlider 检验趋势范围',    description: '范围选择器与折线图双向同步,支持拖动手柄、平移窗口、轨道跳转和 API 快捷范围。',  }))  panel.addChild(actions)  panel.addChild(chart, 1)  panel.addChild(slider)  panel.addChild(status)  panel.padding = 18  return panel}