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  )