@@ -23,7 +23,14 @@ const PIE_COLORS = [
2323] ;
2424
2525type OverviewMeta = { page : number ; pageSize : number ; totalModels : number ; totalPages : number } ;
26- type OverviewAPIResponse = { overview : UsageOverview | null ; empty : boolean ; days : number ; timezone ?: string ; meta ?: OverviewMeta ; filters ?: { models : string [ ] ; routes : string [ ] ; sources : string [ ] } } ;
26+ type OverviewAPIResponse = {
27+ overview : UsageOverview | null ;
28+ empty : boolean ;
29+ days : number ;
30+ timezone ?: string ;
31+ meta ?: OverviewMeta ;
32+ filters ?: { models : string [ ] ; routes : string [ ] ; sources : string [ ] ; names : string [ ] } ;
33+ } ;
2734
2835type PriceForm = {
2936 model : string ;
@@ -185,12 +192,15 @@ export default function DashboardPage() {
185192 const [ modelOptions , setModelOptions ] = useState < string [ ] > ( [ ] ) ;
186193 const [ routeOptions , setRouteOptions ] = useState < string [ ] > ( [ ] ) ;
187194 const [ sourceOptions , setSourceOptions ] = useState < string [ ] > ( [ ] ) ;
195+ const [ nameOptions , setNameOptions ] = useState < string [ ] > ( [ ] ) ;
188196 const [ filterModelInput , setFilterModelInput ] = useState ( "" ) ;
189197 const [ filterRouteInput , setFilterRouteInput ] = useState ( "" ) ;
190198 const [ filterSourceInput , setFilterSourceInput ] = useState ( "" ) ;
199+ const [ filterNameInput , setFilterNameInput ] = useState ( "" ) ;
191200 const [ filterModel , setFilterModel ] = useState < string | undefined > ( undefined ) ;
192201 const [ filterRoute , setFilterRoute ] = useState < string | undefined > ( undefined ) ;
193202 const [ filterSource , setFilterSource ] = useState < string | undefined > ( undefined ) ;
203+ const [ filterName , setFilterName ] = useState < string | undefined > ( undefined ) ;
194204 const [ page , setPage ] = useState ( 1 ) ;
195205 const [ form , setForm ] = useState < PriceForm > ( { model : "" , inputPricePer1M : "" , cachedInputPricePer1M : "" , outputPricePer1M : "" } ) ;
196206 const [ status , setStatus ] = useState < string | null > ( null ) ;
@@ -720,6 +730,7 @@ export default function DashboardPage() {
720730 if ( filterModel ) params . set ( "model" , filterModel ) ;
721731 if ( filterRoute ) params . set ( "route" , filterRoute ) ;
722732 if ( filterSource ) params . set ( "source" , filterSource ) ;
733+ if ( filterName ) params . set ( "name" , filterName ) ;
723734 params . set ( "page" , String ( page ) ) ;
724735 params . set ( "pageSize" , "500" ) ;
725736
@@ -747,6 +758,7 @@ export default function DashboardPage() {
747758 setModelOptions ( Array . from ( new Set ( data . filters ?. models ?? [ ] ) ) ) ;
748759 setRouteOptions ( Array . from ( new Set ( data . filters ?. routes ?? [ ] ) ) ) ;
749760 setSourceOptions ( Array . from ( new Set ( data . filters ?. sources ?? [ ] ) ) ) ;
761+ setNameOptions ( Array . from ( new Set ( data . filters ?. names ?? [ ] ) ) ) ;
750762 setAppliedDays ( data . days ?? rangeDays ) ;
751763 } catch ( err ) {
752764 if ( ! active ) return ;
@@ -763,7 +775,7 @@ export default function DashboardPage() {
763775 active = false ;
764776 controller . abort ( ) ;
765777 } ;
766- } , [ rangeMode , customStart , customEnd , rangeDays , filterModel , filterRoute , filterSource , page , refreshTrigger , ready ] ) ;
778+ } , [ rangeMode , customStart , customEnd , rangeDays , filterModel , filterRoute , filterSource , filterName , page , refreshTrigger , ready ] ) ;
767779
768780 const overviewData = overview ;
769781 const showEmpty = overviewEmpty || ! overview ;
@@ -882,6 +894,7 @@ export default function DashboardPage() {
882894 setFilterModel ( filterModelInput . trim ( ) || undefined ) ;
883895 setFilterRoute ( filterRouteInput . trim ( ) || undefined ) ;
884896 setFilterSource ( filterSourceInput . trim ( ) || undefined ) ;
897+ setFilterName ( filterNameInput . trim ( ) || undefined ) ;
885898 } ;
886899
887900 const applyModelOption = ( val : string ) => {
@@ -902,6 +915,12 @@ export default function DashboardPage() {
902915 setPage ( 1 ) ;
903916 } ;
904917
918+ const applyNameOption = ( val : string ) => {
919+ setFilterNameInput ( val ) ;
920+ setFilterName ( val . trim ( ) || undefined ) ;
921+ setPage ( 1 ) ;
922+ } ;
923+
905924 const handleSubmit = async ( event : FormEvent < HTMLFormElement > ) => {
906925 event . preventDefault ( ) ;
907926 setStatus ( null ) ;
@@ -1269,21 +1288,36 @@ export default function DashboardPage() {
12691288 setPage ( 1 ) ;
12701289 } }
12711290 />
1291+ < ComboBox
1292+ value = { filterNameInput }
1293+ onChange = { setFilterNameInput }
1294+ options = { nameOptions }
1295+ placeholder = "按凭证名过滤"
1296+ darkMode = { darkMode }
1297+ onSelectOption = { applyNameOption }
1298+ onClear = { ( ) => {
1299+ setFilterNameInput ( "" ) ;
1300+ setFilterName ( undefined ) ;
1301+ setPage ( 1 ) ;
1302+ } }
1303+ />
12721304 < button
12731305 onClick = { applyFilters }
12741306 className = { `rounded-lg border px-3 py-1.5 text-sm font-semibold transition ${ darkMode ? "border-slate-700 bg-slate-800 text-slate-300 hover:border-slate-500" : "border-slate-300 bg-white text-slate-700 hover:border-slate-400" } ` }
12751307 >
12761308 应用筛选
12771309 </ button >
1278- { ( filterModel || filterRoute || filterSource ) ? (
1310+ { ( filterModel || filterRoute || filterSource || filterName ) ? (
12791311 < button
12801312 onClick = { ( ) => {
12811313 setFilterModelInput ( "" ) ;
12821314 setFilterRouteInput ( "" ) ;
12831315 setFilterSourceInput ( "" ) ;
1316+ setFilterNameInput ( "" ) ;
12841317 setFilterModel ( undefined ) ;
12851318 setFilterRoute ( undefined ) ;
12861319 setFilterSource ( undefined ) ;
1320+ setFilterName ( undefined ) ;
12871321 setPage ( 1 ) ;
12881322 } }
12891323 className = { `rounded-lg border px-3 py-1.5 text-sm transition ${ darkMode ? "border-slate-700 bg-slate-800 text-slate-400 hover:border-slate-500" : "border-slate-300 bg-white text-slate-600 hover:border-slate-400" } ` }
0 commit comments