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