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  )