github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/web/src/OverviewResourcePane.stories.tsx (about) 1 import { StylesProvider } from "@material-ui/core/styles" 2 import React from "react" 3 import { MemoryRouter } from "react-router" 4 import Features, { FeaturesTestProvider, Flag } from "./feature" 5 import LogStore, { LogStoreProvider } from "./LogStore" 6 import OverviewResourcePane from "./OverviewResourcePane" 7 import { ResourceGroupsContextProvider } from "./ResourceGroupsContext" 8 import { ResourceListOptionsProvider } from "./ResourceListOptionsContext" 9 import { ResourceNavProvider } from "./ResourceNav" 10 import { SidebarContextProvider } from "./SidebarContext" 11 import { TiltSnackbarProvider } from "./Snackbar" 12 import { StarredResourceMemoryProvider } from "./StarredResourcesContext" 13 import { 14 nButtonView, 15 nResourceView, 16 nResourceWithLabelsView, 17 tenResourceView, 18 twoResourceView, 19 } from "./testdata" 20 21 export default { 22 title: "New UI/OverviewResourcePane", 23 decorators: [ 24 (Story: any, context: any) => { 25 const features = new Features({ 26 [Flag.Labels]: context?.args?.labelsEnabled ?? true, 27 }) 28 return ( 29 <MemoryRouter initialEntries={["/"]}> 30 <TiltSnackbarProvider> 31 <FeaturesTestProvider value={features}> 32 <ResourceGroupsContextProvider> 33 <ResourceListOptionsProvider> 34 <StarredResourceMemoryProvider> 35 <div style={{ margin: "-1rem", height: "80vh" }}> 36 <StylesProvider injectFirst> 37 <Story /> 38 </StylesProvider> 39 </div> 40 </StarredResourceMemoryProvider> 41 </ResourceListOptionsProvider> 42 </ResourceGroupsContextProvider> 43 </FeaturesTestProvider> 44 </TiltSnackbarProvider> 45 </MemoryRouter> 46 ) 47 }, 48 ], 49 argTypes: { 50 labelsEnabled: { 51 name: "Group resources by label enabled", 52 control: { 53 type: "boolean", 54 }, 55 defaultValue: true, 56 }, 57 }, 58 } 59 60 function OverviewResourcePaneHarness(props: { 61 name: string 62 view: Proto.webviewView 63 sidebarClosed?: boolean 64 }) { 65 let { name, view } = props 66 let entry = name ? `/r/${props.name}/overview` : `/overview` 67 let resources = view?.uiResources || [] 68 let validateResource = (name: string) => 69 resources.some((res) => res.metadata?.name == name) 70 return ( 71 <MemoryRouter initialEntries={[entry]}> 72 <ResourceNavProvider validateResource={validateResource}> 73 <SidebarContextProvider sidebarClosedForTesting={props.sidebarClosed}> 74 <OverviewResourcePane view={view} isSocketConnected={true} /> 75 </SidebarContextProvider> 76 </ResourceNavProvider> 77 </MemoryRouter> 78 ) 79 } 80 81 export const TwoResources = () => ( 82 <OverviewResourcePaneHarness name={"vigoda"} view={twoResourceView()} /> 83 ) 84 85 export const TenResources = () => ( 86 <OverviewResourcePaneHarness name="vigoda_1" view={tenResourceView()} /> 87 ) 88 89 export const TenResourcesSidebarCollapsed = () => ( 90 <OverviewResourcePaneHarness 91 name="vigoda_1" 92 view={tenResourceView()} 93 sidebarClosed={true} 94 /> 95 ) 96 97 export const TwoStarredResources = () => ( 98 <StarredResourceMemoryProvider initialValueForTesting={["_1", "_2"]}> 99 <OverviewResourcePaneHarness name="vigoda_1" view={tenResourceView()} /> 100 </StarredResourceMemoryProvider> 101 ) 102 103 export const TenResourcesLongNames = () => { 104 let view = tenResourceView() 105 view.uiResources.forEach((r, n) => { 106 r.metadata!.name = "elastic-beanstalk-search-stream-" + n 107 }) 108 return <OverviewResourcePaneHarness name="vigoda_1" view={view} /> 109 } 110 111 export const TenResourcesWithLabels = () => ( 112 <OverviewResourcePaneHarness 113 name="vigoda_1" 114 view={nResourceWithLabelsView(10)} 115 /> 116 ) 117 118 export const TwoButtons = () => { 119 const view = nButtonView(2) 120 return <OverviewResourcePaneHarness name="vigoda" view={view} /> 121 } 122 123 export const TwoButtonsWithEndpoint = () => { 124 const view = nButtonView(2) 125 view.uiResources[0].status!.endpointLinks = [{ name: "endpoint", url: "foo" }] 126 return <OverviewResourcePaneHarness name="vigoda" view={view} /> 127 } 128 129 export const TwoButtonsWithPodID = () => { 130 const view = nButtonView(2) 131 view.uiResources[0].status!.k8sResourceInfo = { podName: "abcdefg" } 132 return <OverviewResourcePaneHarness name="vigoda" view={view} /> 133 } 134 135 export const TwoButtonsWithEndpointAndPodID = () => { 136 const view = nButtonView(2) 137 view.uiResources[0].status!.k8sResourceInfo = { podName: "abcdefg" } 138 view.uiResources[0].status!.endpointLinks = [{ name: "endpoint", url: "foo" }] 139 return <OverviewResourcePaneHarness name="vigoda" view={view} /> 140 } 141 142 export const TenButtons = () => ( 143 <OverviewResourcePaneHarness name="vigoda" view={nButtonView(10)} /> 144 ) 145 146 export const DisabledButton = () => { 147 const view = nButtonView(1) 148 view.uiButtons[0].spec!.disabled = true 149 return <OverviewResourcePaneHarness name="vigoda" view={view} /> 150 } 151 152 export const FullResourceBar = () => { 153 let view = tenResourceView() 154 let res = view.uiResources[1] 155 res.status = res.status || {} 156 res.status.endpointLinks = [ 157 { url: "http://localhost:4001" }, 158 { url: "http://localhost:4002" }, 159 { url: "http://localhost:4003" }, 160 ] 161 res.status.k8sResourceInfo = { podName: "my-pod-deadbeef" } 162 return <OverviewResourcePaneHarness name="vigoda_1" view={view} /> 163 } 164 165 export const TenResourcesWithLogStore = () => { 166 let logStore = new LogStore() 167 let segments = [] 168 for (let i = 0; i < 100; i++) { 169 segments.push({ 170 spanId: "build:1", 171 text: `Vigoda build line ${i}\n`, 172 time: new Date().toString(), 173 }) 174 } 175 logStore.append({ 176 spans: { 177 "build:1": { manifestName: "vigoda_1" }, 178 }, 179 segments: segments, 180 }) 181 182 return ( 183 <LogStoreProvider value={logStore}> 184 <OverviewResourcePaneHarness name="vigoda_1" view={tenResourceView()} /> 185 </LogStoreProvider> 186 ) 187 } 188 189 export const TenResourcesWithLongLogLines = () => { 190 let logStore = new LogStore() 191 let segments = [] 192 for (let i = 0; i < 100; i++) { 193 let text = [] 194 for (let j = 0; j < 10; j++) { 195 text.push(`Vigoda build line ${i}`) 196 } 197 198 segments.push({ 199 spanId: "build:1", 200 text: text.join(", ") + "\n", 201 time: new Date().toString(), 202 }) 203 } 204 logStore.append({ 205 spans: { 206 "build:1": { manifestName: "vigoda_1" }, 207 }, 208 segments: segments, 209 }) 210 211 return ( 212 <LogStoreProvider value={logStore}> 213 <OverviewResourcePaneHarness name={"vigoda_1"} view={tenResourceView()} /> 214 </LogStoreProvider> 215 ) 216 } 217 218 export const TenResourcesWithBuildLogAndPodLog = () => { 219 let logStore = new LogStore() 220 let segments = [] 221 for (let i = 0; i < 10; i++) { 222 segments.push({ 223 spanId: "build:1", 224 text: `Vigoda build line ${i}\n`, 225 time: new Date().toString(), 226 }) 227 } 228 for (let i = 0; i < 10; i++) { 229 segments.push({ 230 spanId: "pod:1", 231 text: `Vigoda pod line ${i}\n`, 232 time: new Date().toString(), 233 }) 234 } 235 logStore.append({ 236 spans: { 237 "build:1": { manifestName: "vigoda_1" }, 238 "pod:1": { manifestName: "vigoda_1" }, 239 }, 240 segments: segments, 241 }) 242 243 return ( 244 <LogStoreProvider value={logStore}> 245 <OverviewResourcePaneHarness name="vigoda_1" view={tenResourceView()} /> 246 </LogStoreProvider> 247 ) 248 } 249 250 export const OneHundredResources = () => ( 251 <OverviewResourcePaneHarness name="vigoda_1" view={nResourceView(100)} /> 252 ) 253 254 export const NotFound = () => ( 255 <OverviewResourcePaneHarness name="does-not-exist" view={twoResourceView()} /> 256 )