1- import { useCallback , useMemo } from 'react'
1+ import { useCallback , useMemo , useState } from 'react'
22import { createColumnHelper } from '@tanstack/react-table'
3+ import * as yaml from 'js-yaml'
4+ import { CustomResourceDefinition } from 'kubernetes-types/apiextensions/v1'
35import { get } from 'lodash'
6+ import { Eye } from 'lucide-react'
47import { Link , useParams } from 'react-router-dom'
58
69import { CustomResource , ResourceType } from '@/types/api'
710import { useResource } from '@/lib/api'
811import { formatDate } from '@/lib/utils'
12+ import { Button } from '@/components/ui/button'
13+ import {
14+ Dialog ,
15+ DialogContent ,
16+ DialogHeader ,
17+ DialogTitle ,
18+ } from '@/components/ui/dialog'
919import { ResourceTable } from '@/components/resource-table'
20+ import { YamlEditor } from '@/components/yaml-editor'
1021
1122export function CRListPage ( ) {
23+ const [ isYamlDialogOpen , setIsYamlDialogOpen ] = useState ( false )
24+ const [ yamlContent , setYamlContent ] = useState ( '' )
1225 const { crd } = useParams < { crd : string } > ( )
1326 const { data : crdData , isLoading : isLoadingCRD } = useResource ( 'crds' , crd ! )
1427
1528 const columnHelper = createColumnHelper < CustomResource > ( )
16-
29+ const handleViewYaml = useCallback ( ( crd : CustomResourceDefinition ) => {
30+ setYamlContent ( yaml . dump ( crd , { indent : 2 } ) )
31+ setIsYamlDialogOpen ( true )
32+ } , [ ] )
33+ const extraToolbars = useMemo ( ( ) => {
34+ return [
35+ < Button
36+ variant = "outline"
37+ size = "default"
38+ onClick = { ( ) => {
39+ handleViewYaml ( crdData as CustomResourceDefinition )
40+ } }
41+ >
42+ < Eye className = "h-4 w-4 mr-1" />
43+ View YAML
44+ </ Button > ,
45+ ]
46+ } , [ crdData , handleViewYaml ] )
1747 const columns = useMemo ( ( ) => {
1848 const baseColumns = [
1949 columnHelper . accessor ( 'metadata.name' , {
@@ -33,7 +63,6 @@ export function CRListPage() {
3363 } ,
3464 } ) ,
3565 ]
36-
3766 const additionalColumns =
3867 crdData ?. spec . versions [ 0 ] . additionalPrinterColumns ?. map (
3968 ( printerColumn ) => {
@@ -91,12 +120,31 @@ export function CRListPage() {
91120 }
92121
93122 return (
94- < ResourceTable
95- resourceName = { crdData . spec . names . kind || 'Custom Resources' }
96- resourceType = { crd as ResourceType }
97- columns = { columns }
98- clusterScope = { crdData . spec . scope === 'Cluster' }
99- searchQueryFilter = { searchQueryFilter }
100- />
123+ < >
124+ < ResourceTable
125+ resourceName = { crdData . spec . names . kind || 'Custom Resources' }
126+ resourceType = { crd as ResourceType }
127+ columns = { columns }
128+ clusterScope = { crdData . spec . scope === 'Cluster' }
129+ searchQueryFilter = { searchQueryFilter }
130+ extraToolbars = { extraToolbars }
131+ />
132+
133+ < Dialog open = { isYamlDialogOpen } onOpenChange = { setIsYamlDialogOpen } >
134+ < DialogContent className = "sm:max-w-4xl max-h-[90vh] overflow-y-auto" >
135+ < DialogHeader >
136+ < DialogTitle >
137+ YAML Configuration: { crdData ?. metadata ?. name ?? 'Unknown' }
138+ </ DialogTitle >
139+ </ DialogHeader >
140+ < YamlEditor
141+ value = { yamlContent }
142+ readOnly = { true }
143+ showControls = { false }
144+ minHeight = { 600 }
145+ />
146+ </ DialogContent >
147+ </ Dialog >
148+ </ >
101149 )
102150}
0 commit comments