@@ -12,19 +12,17 @@ import { KeypairResourcePolicySettingModalFragment$key } from '../__generated__/
1212import { localeCompare , numberSorterWithInfinityValue } from '../helper' ;
1313import { SIGNED_32BIT_MAX_INT } from '../helper/const-vars' ;
1414import { exportCSVWithFormattingRules } from '../helper/csv-util' ;
15- import { useHiddenColumnKeysSetting } from '../hooks/useHiddenColumnKeysSetting ' ;
15+ import { useBAISettingUserState } from '../hooks/useBAISetting ' ;
1616import KeypairResourcePolicyInfoModal from './KeypairResourcePolicyInfoModal' ;
1717import KeypairResourcePolicySettingModal from './KeypairResourcePolicySettingModal' ;
18- import TableColumnsSettingModal from './TableColumnsSettingModal' ;
1918import {
2019 DeleteFilled ,
2120 InfoCircleOutlined ,
2221 PlusOutlined ,
2322 ReloadOutlined ,
2423 SettingOutlined ,
2524} from '@ant-design/icons' ;
26- import { useToggle } from 'ahooks' ;
27- import { App , Button , Dropdown , Tooltip } from 'antd' ;
25+ import { App , Button , Tooltip } from 'antd' ;
2826import { AnyObject } from 'antd/es/_util/type' ;
2927import type { ColumnsType , ColumnType } from 'antd/es/table' ;
3028import {
@@ -38,7 +36,6 @@ import {
3836 BAIDeleteConfirmModal ,
3937} from 'backend.ai-ui' ;
4038import * as _ from 'lodash-es' ;
41- import { EllipsisIcon } from 'lucide-react' ;
4239import React , { Suspense , useState , useTransition } from 'react' ;
4340import { useTranslation } from 'react-i18next' ;
4441import { graphql , useLazyLoadQuery , useMutation } from 'react-relay' ;
@@ -58,8 +55,6 @@ const KeypairResourcePolicyList: React.FC<KeypairResourcePolicyListProps> = (
5855 const [ keypairResourcePolicyFetchKey , updateKeypairResourcePolicyFetchKey ] =
5956 useUpdatableState ( 'initial-fetch' ) ;
6057 const [ isRefetchPending , startRefetchTransition ] = useTransition ( ) ;
61- const [ visibleColumnSettingModal , { toggle : toggleColumnSettingModal } ] =
62- useToggle ( ) ;
6358 const [ isCreatingPolicySetting , setIsCreatingPolicySetting ] = useState ( false ) ;
6459 const [ editingKeypairResourcePolicy , setEditingKeypairResourcePolicy ] =
6560 useState < KeypairResourcePolicySettingModalFragment$key | null > ( ) ;
@@ -263,21 +258,28 @@ const KeypairResourcePolicyList: React.FC<KeypairResourcePolicyListProps> = (
263258 } ,
264259 ] ) ;
265260
266- const [ hiddenColumnKeys , setHiddenColumnKeys ] = useHiddenColumnKeysSetting (
267- 'KeypairResourcePolicyList' ,
261+ const [ columnOverrides , setColumnOverrides ] = useBAISettingUserState (
262+ 'table_column_overrides. KeypairResourcePolicyList' ,
268263 ) ;
269264
270- const handleExportCSV = ( ) => {
265+ const supportedFields = _ . compact (
266+ _ . map ( columns , ( column ) => _ . toString ( column . key ) ) ,
267+ ) ;
268+
269+ const handleExportCSV = ( selectedExportKeys : string [ ] ) => {
270+ if ( selectedExportKeys . length === 0 ) {
271+ message . error ( t ( 'resourcePolicy.NoDataToExport' ) ) ;
272+ return ;
273+ }
271274 if ( ! keypair_resource_policies ) {
272275 message . error ( t ( 'resourcePolicy.NoDataToExport' ) ) ;
273276 return ;
274277 }
275278
276- const columnKeys = _ . map ( columns , ( column ) => _ . toString ( column . key ) ) ;
277279 const responseData = _ . map ( keypair_resource_policies , ( policy ) => {
278280 return _ . pick (
279281 policy ,
280- columnKeys . map ( ( key ) => key as keyof KeypairResourcePolicies ) ,
282+ selectedExportKeys . map ( ( key ) => key as keyof KeypairResourcePolicies ) ,
281283 ) ;
282284 } ) ;
283285
@@ -301,91 +303,47 @@ const KeypairResourcePolicyList: React.FC<KeypairResourcePolicyListProps> = (
301303 return (
302304 < BAIFlex direction = "column" align = "stretch" gap = "sm" { ...props } >
303305 < BAIFlex direction = "row" justify = "end" wrap = "wrap" gap = { 'xs' } >
304- < Dropdown
305- menu = { {
306- items : [
307- {
308- key : 'exportCSV' ,
309- label : t ( 'resourcePolicy.ExportCSV' ) ,
310- onClick : ( ) => {
311- handleExportCSV ( ) ;
312- } ,
313- } ,
314- ] ,
315- } }
316- trigger = { [ 'click' ] }
317- >
318- < Button icon = { < EllipsisIcon /> } />
319- </ Dropdown >
320- < BAIFlex
321- direction = "row"
322- gap = { 'xs' }
323- wrap = "wrap"
324- style = { { flexShrink : 1 } }
325- >
326- < BAIFlex gap = { 'xs' } >
327- < Tooltip title = { t ( 'button.Refresh' ) } >
328- < Button
329- icon = { < ReloadOutlined /> }
330- loading = { isRefetchPending }
331- onClick = { ( ) => {
332- startRefetchTransition ( ( ) =>
333- updateKeypairResourcePolicyFetchKey ( ) ,
334- ) ;
335- } }
336- />
337- </ Tooltip >
306+ < BAIFlex gap = { 'xs' } >
307+ < Tooltip title = { t ( 'button.Refresh' ) } >
338308 < Button
339- type = "primary"
340- icon = { < PlusOutlined /> }
309+ icon = { < ReloadOutlined /> }
310+ loading = { isRefetchPending }
341311 onClick = { ( ) => {
342- setIsCreatingPolicySetting ( true ) ;
312+ startRefetchTransition ( ( ) =>
313+ updateKeypairResourcePolicyFetchKey ( ) ,
314+ ) ;
343315 } }
344- >
345- { t ( 'button.Create' ) }
346- </ Button >
347- </ BAIFlex >
316+ />
317+ </ Tooltip >
318+ < Button
319+ type = "primary"
320+ icon = { < PlusOutlined /> }
321+ onClick = { ( ) => {
322+ setIsCreatingPolicySetting ( true ) ;
323+ } }
324+ >
325+ { t ( 'button.Create' ) }
326+ </ Button >
348327 </ BAIFlex >
349328 </ BAIFlex >
350329 < BAITable
351- columns = {
352- _ . filter (
353- columns ,
354- ( column ) => ! _ . includes ( hiddenColumnKeys , _ . toString ( column ?. key ) ) ,
355- ) as ColumnType < AnyObject > [ ]
356- }
330+ columns = { columns as ColumnType < AnyObject > [ ] }
357331 dataSource = {
358332 keypair_resource_policies as readonly AnyObject [ ] | undefined
359333 }
360334 rowKey = "name"
361335 scroll = { { x : 'max-content' } }
362- pagination = { {
363- extraContent : (
364- < Button
365- type = "text"
366- icon = { < SettingOutlined /> }
367- onClick = { ( ) => {
368- toggleColumnSettingModal ( ) ;
369- } }
370- />
371- ) ,
372- } }
373336 showSorterTooltip = { false }
374- />
375- < TableColumnsSettingModal
376- open = { visibleColumnSettingModal }
377- onRequestClose = { ( values ) => {
378- values ?. selectedColumnKeys &&
379- setHiddenColumnKeys (
380- _ . difference (
381- columns . map ( ( column ) => _ . toString ( column . key ) ) ,
382- values ?. selectedColumnKeys ,
383- ) ,
384- ) ;
385- toggleColumnSettingModal ( ) ;
337+ tableSettings = { {
338+ columnOverrides : columnOverrides ,
339+ onColumnOverridesChange : setColumnOverrides ,
340+ } }
341+ exportSettings = { {
342+ supportedFields,
343+ onExport : async ( selectedExportKeys ) => {
344+ handleExportCSV ( selectedExportKeys ) ;
345+ } ,
386346 } }
387- columns = { columns }
388- hiddenColumnKeys = { hiddenColumnKeys }
389347 />
390348 < Suspense >
391349 < KeypairResourcePolicySettingModal
0 commit comments