@backstage-community/plugin-cicd-statistics 0.12.1 → 0.13.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @backstage-community/plugin-cicd-statistics
|
|
2
2
|
|
|
3
|
+
## 0.13.1
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 33e38a5: Replaces global JSX reference with React.JSX import
|
|
8
|
+
|
|
9
|
+
## 0.13.0
|
|
10
|
+
|
|
11
|
+
### Minor Changes
|
|
12
|
+
|
|
13
|
+
- 060f3b1: Backstage version bump to v1.45.1
|
|
14
|
+
|
|
3
15
|
## 0.12.1
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/alpha.d.ts
CHANGED
|
@@ -10,7 +10,7 @@ import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api'
|
|
|
10
10
|
declare const _default: _backstage_frontend_plugin_api.OverridableFrontendPlugin<{
|
|
11
11
|
entityContent: _backstage_frontend_plugin_api.RouteRef<undefined>;
|
|
12
12
|
}, {}, {
|
|
13
|
-
"entity-content:cicd-statistics/entity": _backstage_frontend_plugin_api.
|
|
13
|
+
"entity-content:cicd-statistics/entity": _backstage_frontend_plugin_api.OverridableExtensionDefinition<{
|
|
14
14
|
kind: "entity-content";
|
|
15
15
|
name: "entity";
|
|
16
16
|
config: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"button-switch.esm.js","sources":["../../src/components/button-switch.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, MouseEvent } from 'react';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Zoom from '@material-ui/core/Zoom';\n\nexport interface SwitchValueDetails<T extends string> {\n value: T;\n tooltip?: string;\n text?: string | JSX.Element;\n}\n\nexport type SwitchValue<T extends string> = T | SwitchValueDetails<T>;\n\nexport interface ButtonSwitchPropsBase<T extends string> {\n values: ReadonlyArray<SwitchValue<T>>;\n vertical?: boolean;\n}\nexport interface ButtonSwitchPropsSingle<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi?: false;\n selection: T;\n onChange: (selected: T) => void;\n}\nexport interface ButtonSwitchPropsMulti<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi: true;\n selection: ReadonlyArray<T>;\n onChange: (selected: Array<T>) => void;\n}\n\nexport type ButtonSwitchProps<T extends string> =\n | ButtonSwitchPropsSingle<T>\n | ButtonSwitchPropsMulti<T>;\n\nfunction switchValue<T extends string>(value: SwitchValue<T>): T {\n return typeof value === 'object' ? value.value : value;\n}\n\nfunction switchText<T extends string>(\n value: SwitchValue<T>,\n): string | JSX.Element {\n return typeof value === 'object' ? value.text ?? value.value : value;\n}\n\nfunction findParent(tagName: string, elem: HTMLElement): HTMLElement {\n let node: HTMLElement | null = elem;\n while (node.tagName !== tagName) {\n node = node.parentElement;\n if (!node) {\n throw new Error(`Couldn't find ${tagName} parent`);\n }\n }\n return node;\n}\n\nexport function ButtonSwitch<T extends string>(props: ButtonSwitchProps<T>) {\n const { values, vertical = false } = props;\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLSpanElement>) => {\n const btn = findParent('BUTTON', ev.target as HTMLElement);\n const index = [...btn.parentElement!.children].findIndex(\n child => child === btn,\n );\n const value = switchValue(values[index]);\n\n if (props.multi) {\n props.onChange(\n props.selection.includes(value as T)\n ? props.selection.filter(val => val !== value)\n : [...props.selection, value as T],\n );\n } else {\n props.onChange(value as T);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [values, props.selection, props.multi, props.onChange],\n );\n\n const hasSelection = (value: T) => {\n if (props.multi) {\n return props.selection.includes(value);\n }\n return props.selection === value;\n };\n\n const tooltipify = (value: SwitchValue<T>, elem: JSX.Element) =>\n typeof value === 'object' && value.tooltip ? (\n <Tooltip\n key={value.value}\n TransitionComponent={Zoom}\n title={value.tooltip}\n arrow\n >\n {elem}\n </Tooltip>\n ) : (\n elem\n );\n\n return (\n <ButtonGroup\n disableElevation\n orientation={vertical ? 'vertical' : 'horizontal'}\n variant=\"outlined\"\n size=\"small\"\n >\n {values.map(value =>\n tooltipify(\n value,\n <Button\n key={switchValue(value)}\n color={hasSelection(switchValue(value)) ? 'primary' : 'default'}\n variant={\n hasSelection(switchValue(value)) ? 'contained' : 'outlined'\n }\n onClick={onClick}\n >\n {switchText(value)}\n </Button>,\n ),\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAmDA,SAAS,YAA8B,KAA0B,EAAA;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAW,GAAA,KAAA,CAAM,KAAQ,GAAA,KAAA;AACnD;AAEA,SAAS,WACP,KACsB,EAAA;AACtB,EAAA,OAAO,OAAO,KAAU,KAAA,QAAA,GAAW,KAAM,CAAA,IAAA,IAAQ,MAAM,KAAQ,GAAA,KAAA;AACjE;AAEA,SAAS,UAAA,CAAW,SAAiB,IAAgC,EAAA;AACnE,EAAA,IAAI,IAA2B,GAAA,IAAA;AAC/B,EAAO,OAAA,IAAA,CAAK,YAAY,OAAS,EAAA;AAC/B,IAAA,IAAA,GAAO,IAAK,CAAA,aAAA;AACZ,IAAA,IAAI,CAAC,IAAM,EAAA;AACT,MAAA,MAAM,IAAI,KAAA,CAAM,CAAiB,cAAA,EAAA,OAAO,CAAS,OAAA,CAAA,CAAA;AAAA;AACnD;AAEF,EAAO,OAAA,IAAA;AACT;AAEO,SAAS,aAA+B,KAA6B,EAAA;AAC1E,EAAA,MAAM,EAAE,MAAA,EAAQ,QAAW,GAAA,KAAA,EAAU,GAAA,KAAA;AAErC,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,EAAoC,KAAA;AACnC,MAAA,MAAM,GAAM,GAAA,UAAA,CAAW,QAAU,EAAA,EAAA,CAAG,MAAqB,CAAA;AACzD,MAAA,MAAM,QAAQ,CAAC,GAAG,GAAI,CAAA,aAAA,CAAe,QAAQ,CAAE,CAAA,SAAA;AAAA,QAC7C,WAAS,KAAU,KAAA;AAAA,OACrB;AACA,MAAA,MAAM,KAAQ,GAAA,WAAA,CAAY,MAAO,CAAA,KAAK,CAAC,CAAA;AAEvC,MAAA,IAAI,MAAM,KAAO,EAAA;AACf,QAAM,KAAA,CAAA,QAAA;AAAA,UACJ,MAAM,SAAU,CAAA,QAAA,CAAS,KAAU,CAAA,GAC/B,MAAM,SAAU,CAAA,MAAA,CAAO,CAAO,GAAA,KAAA,GAAA,KAAQ,KAAK,CAC3C,GAAA,CAAC,GAAG,KAAA,CAAM,WAAW,KAAU;AAAA,SACrC;AAAA,OACK,MAAA;AACL,QAAA,KAAA,CAAM,SAAS,KAAU,CAAA;AAAA;AAC3B,KACF;AAAA;AAAA,IAEA,CAAC,MAAQ,EAAA,KAAA,CAAM,WAAW,KAAM,CAAA,KAAA,EAAO,MAAM,QAAQ;AAAA,GACvD;AAEA,EAAM,MAAA,YAAA,GAAe,CAAC,KAAa,KAAA;AACjC,IAAA,IAAI,MAAM,KAAO,EAAA;AACf,MAAO,OAAA,KAAA,CAAM,SAAU,CAAA,QAAA,CAAS,KAAK,CAAA;AAAA;AAEvC,IAAA,OAAO,MAAM,SAAc,KAAA,KAAA;AAAA,GAC7B;AAEA,EAAM,MAAA,UAAA,GAAa,CAAC,KAAuB,EAAA,IAAA,KACzC,OAAO,KAAU,KAAA,QAAA,IAAY,MAAM,OACjC,mBAAA,GAAA;AAAA,IAAC,OAAA;AAAA,IAAA;AAAA,MAEC,mBAAqB,EAAA,IAAA;AAAA,MACrB,OAAO,KAAM,CAAA,OAAA;AAAA,MACb,KAAK,EAAA,IAAA;AAAA,MAEJ,QAAA,EAAA;AAAA,KAAA;AAAA,IALI,KAAM,CAAA;AAAA,GAQb,GAAA,IAAA;AAGJ,EACE,uBAAA,GAAA;AAAA,IAAC,WAAA;AAAA,IAAA;AAAA,MACC,gBAAgB,EAAA,IAAA;AAAA,MAChB,WAAA,EAAa,WAAW,UAAa,GAAA,YAAA;AAAA,MACrC,OAAQ,EAAA,UAAA;AAAA,MACR,IAAK,EAAA,OAAA;AAAA,MAEJ,QAAO,EAAA,MAAA,CAAA,GAAA;AAAA,QAAI,CACV,KAAA,KAAA,UAAA;AAAA,UACE,KAAA;AAAA,0BACA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cAEC,OAAO,YAAa,CAAA,WAAA,CAAY,KAAK,CAAC,IAAI,SAAY,GAAA,SAAA;AAAA,cACtD,SACE,YAAa,CAAA,WAAA,CAAY,KAAK,CAAC,IAAI,WAAc,GAAA,UAAA;AAAA,cAEnD,OAAA;AAAA,cAEC,qBAAW,KAAK;AAAA,aAAA;AAAA,YAPZ,YAAY,KAAK;AAAA;AAQxB;AACF;AACF;AAAA,GACF;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"button-switch.esm.js","sources":["../../src/components/button-switch.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { useCallback, MouseEvent, JSX } from 'react';\nimport ButtonGroup from '@material-ui/core/ButtonGroup';\nimport Button from '@material-ui/core/Button';\nimport Tooltip from '@material-ui/core/Tooltip';\nimport Zoom from '@material-ui/core/Zoom';\n\nexport interface SwitchValueDetails<T extends string> {\n value: T;\n tooltip?: string;\n text?: string | JSX.Element;\n}\n\nexport type SwitchValue<T extends string> = T | SwitchValueDetails<T>;\n\nexport interface ButtonSwitchPropsBase<T extends string> {\n values: ReadonlyArray<SwitchValue<T>>;\n vertical?: boolean;\n}\nexport interface ButtonSwitchPropsSingle<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi?: false;\n selection: T;\n onChange: (selected: T) => void;\n}\nexport interface ButtonSwitchPropsMulti<T extends string>\n extends ButtonSwitchPropsBase<T> {\n multi: true;\n selection: ReadonlyArray<T>;\n onChange: (selected: Array<T>) => void;\n}\n\nexport type ButtonSwitchProps<T extends string> =\n | ButtonSwitchPropsSingle<T>\n | ButtonSwitchPropsMulti<T>;\n\nfunction switchValue<T extends string>(value: SwitchValue<T>): T {\n return typeof value === 'object' ? value.value : value;\n}\n\nfunction switchText<T extends string>(\n value: SwitchValue<T>,\n): string | JSX.Element {\n return typeof value === 'object' ? value.text ?? value.value : value;\n}\n\nfunction findParent(tagName: string, elem: HTMLElement): HTMLElement {\n let node: HTMLElement | null = elem;\n while (node.tagName !== tagName) {\n node = node.parentElement;\n if (!node) {\n throw new Error(`Couldn't find ${tagName} parent`);\n }\n }\n return node;\n}\n\nexport function ButtonSwitch<T extends string>(props: ButtonSwitchProps<T>) {\n const { values, vertical = false } = props;\n\n const onClick = useCallback(\n (ev: MouseEvent<HTMLSpanElement>) => {\n const btn = findParent('BUTTON', ev.target as HTMLElement);\n const index = [...btn.parentElement!.children].findIndex(\n child => child === btn,\n );\n const value = switchValue(values[index]);\n\n if (props.multi) {\n props.onChange(\n props.selection.includes(value as T)\n ? props.selection.filter(val => val !== value)\n : [...props.selection, value as T],\n );\n } else {\n props.onChange(value as T);\n }\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [values, props.selection, props.multi, props.onChange],\n );\n\n const hasSelection = (value: T) => {\n if (props.multi) {\n return props.selection.includes(value);\n }\n return props.selection === value;\n };\n\n const tooltipify = (value: SwitchValue<T>, elem: JSX.Element) =>\n typeof value === 'object' && value.tooltip ? (\n <Tooltip\n key={value.value}\n TransitionComponent={Zoom}\n title={value.tooltip}\n arrow\n >\n {elem}\n </Tooltip>\n ) : (\n elem\n );\n\n return (\n <ButtonGroup\n disableElevation\n orientation={vertical ? 'vertical' : 'horizontal'}\n variant=\"outlined\"\n size=\"small\"\n >\n {values.map(value =>\n tooltipify(\n value,\n <Button\n key={switchValue(value)}\n color={hasSelection(switchValue(value)) ? 'primary' : 'default'}\n variant={\n hasSelection(switchValue(value)) ? 'contained' : 'outlined'\n }\n onClick={onClick}\n >\n {switchText(value)}\n </Button>,\n ),\n )}\n </ButtonGroup>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"progress.esm.js","sources":["../../src/components/progress.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CSSProperties, DependencyList } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Timeline from '@material-ui/lab/Timeline';\nimport TimelineItem from '@material-ui/lab/TimelineItem';\nimport TimelineSeparator from '@material-ui/lab/TimelineSeparator';\nimport TimelineConnector from '@material-ui/lab/TimelineConnector';\nimport TimelineContent from '@material-ui/lab/TimelineContent';\nimport TimelineOppositeContent from '@material-ui/lab/TimelineOppositeContent';\nimport TimelineDot, { TimelineDotProps } from '@material-ui/lab/TimelineDot';\nimport Alert from '@material-ui/lab/Alert';\nimport { useApp } from '@backstage/core-plugin-api';\n\nconst stepProgressStyle: CSSProperties = {\n marginTop: 6,\n};\n\n// Matching react-use, only has loading/error/value\ntype AsyncState<T> =\n | {\n loading: boolean;\n error?: undefined;\n value?: undefined;\n }\n | {\n loading: true;\n error?: Error | undefined;\n value?: T;\n }\n | {\n loading: false;\n error: Error;\n value?: undefined;\n }\n | {\n loading: false;\n error?: undefined;\n value: T;\n };\n\nexport interface ProgressStep extends ProgessAsSingle {\n title: string;\n}\nexport interface ProgessAsSteps {\n steps: Array<ProgressStep>;\n}\nexport interface ProgessAsSingle<T = number> {\n progress?: T;\n progressBuffer?: T;\n}\n\nexport type ProgessState<T = number> =\n | ProgessAsSingle<T>\n | (T extends number ? ProgessAsSteps : { steps?: undefined });\n\nexport type ProgressAsLoading = ProgessState & {\n loading: true;\n error?: undefined;\n value?: undefined;\n};\nexport type ProgressAsError = ProgessState<undefined> & {\n loading?: false | undefined;\n error: Error;\n value?: undefined;\n};\nexport type ProgressAsValue<T> = ProgessState<undefined> & {\n loading?: false | undefined;\n error?: undefined;\n value: T;\n};\n\n/**\n * An AsyncState but with the addition of progress (decimal 0-1) to allow\n * rendering a progress bar while waiting.\n */\nexport type ProgressType<T> =\n | ProgressAsLoading\n | ProgressAsError\n | ProgressAsValue<T>;\n\nconst sentry = Symbol();\n\n/**\n * Casts an AsyncState or Progress into its non-succeeded sub types\n */\ntype Unsuccessful<S extends ProgressType<any> | AsyncState<any>> =\n S extends ProgressType<any>\n ? ProgressAsLoading | ProgressAsError\n : Omit<AsyncState<any>, 'value'>;\n\n/**\n * Similar to useAsync except it \"waits\" for a dependent (upstream) async state\n * to finish first, otherwise it forwards the dependent pending state.\n *\n * When/if the dependent state has settled successfully, the callback will be\n * invoked for a new layer of async state with the dependent (upstream) success\n * result as argument.\n */\nexport function useAsyncChain<S extends ProgressType<any> | AsyncState<any>, R>(\n parentState: S,\n fn: (value: NonNullable<S['value']>) => Promise<R>,\n deps: DependencyList,\n): Unsuccessful<S> | AsyncState<R> {\n const childState = useAsync(\n async () => (!parentState.value ? sentry : fn(parentState.value)),\n [!parentState.error, !parentState.loading, parentState.value, ...deps],\n );\n\n if (!parentState.value) {\n return parentState as Unsuccessful<S>;\n } else if (childState.value === sentry) {\n return { loading: true };\n }\n return childState as AsyncState<R>;\n}\n\nexport function renderFallbacks<T>(\n state: ProgressType<T> | AsyncState<T>,\n success: (value: T) => JSX.Element,\n): JSX.Element {\n if (state.loading) {\n return <ViewProgress state={state} />;\n } else if (state.error) {\n return <Alert severity=\"error\">{state.error.stack}</Alert>;\n }\n\n return success(state.value!);\n}\n\nexport function ViewProgress({\n state,\n}: {\n state: ProgressAsLoading | { loading: boolean };\n}) {\n const { Progress } = useApp().getComponents();\n\n const stateAsSingleProgress = state as ProgessAsSingle;\n const stateAsStepProgress = state as ProgessAsSteps;\n\n if (\n !stateAsSingleProgress.progress &&\n !stateAsSingleProgress.progressBuffer &&\n !stateAsStepProgress.steps\n ) {\n // Simple spinner\n return <Progress />;\n } else if (stateAsSingleProgress.progress !== undefined) {\n // Simple _single_ progress\n return (\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"buffer\"\n value={(stateAsSingleProgress.progress ?? 0) * 100}\n valueBuffer={(stateAsSingleProgress.progressBuffer ?? 0) * 100}\n />\n </Box>\n );\n }\n\n // Multi-step progresses\n\n return (\n <Box sx={{ width: '100%' }}>\n <Timeline>\n {stateAsStepProgress.steps.map((step, index) => (\n <TimelineItem key={index}>\n <TimelineOppositeContent>{step.title}</TimelineOppositeContent>\n <TimelineSeparator>\n <TimelineDot color={getDotColor(step)} />\n {index < stateAsStepProgress.steps.length - 1 ? (\n <TimelineConnector />\n ) : null}\n </TimelineSeparator>\n <TimelineContent>\n {!step.progress && !step.progressBuffer ? null : (\n <LinearProgress\n style={stepProgressStyle}\n variant=\"buffer\"\n value={(step.progress ?? 0) * 100}\n valueBuffer={(step.progressBuffer ?? 0) * 100}\n />\n )}\n </TimelineContent>\n </TimelineItem>\n ))}\n </Timeline>\n </Box>\n );\n}\n\nfunction getDotColor(step: ProgressStep): TimelineDotProps['color'] {\n const progress = step.progress ?? 0;\n\n if (progress >= 1) {\n return 'primary';\n } else if (progress > 0) {\n return 'secondary';\n }\n return 'grey';\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"progress.esm.js","sources":["../../src/components/progress.tsx"],"sourcesContent":["/*\n * Copyright 2022 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CSSProperties, DependencyList, JSX } from 'react';\nimport useAsync from 'react-use/esm/useAsync';\nimport Box from '@material-ui/core/Box';\nimport LinearProgress from '@material-ui/core/LinearProgress';\nimport Timeline from '@material-ui/lab/Timeline';\nimport TimelineItem from '@material-ui/lab/TimelineItem';\nimport TimelineSeparator from '@material-ui/lab/TimelineSeparator';\nimport TimelineConnector from '@material-ui/lab/TimelineConnector';\nimport TimelineContent from '@material-ui/lab/TimelineContent';\nimport TimelineOppositeContent from '@material-ui/lab/TimelineOppositeContent';\nimport TimelineDot, { TimelineDotProps } from '@material-ui/lab/TimelineDot';\nimport Alert from '@material-ui/lab/Alert';\nimport { useApp } from '@backstage/core-plugin-api';\n\nconst stepProgressStyle: CSSProperties = {\n marginTop: 6,\n};\n\n// Matching react-use, only has loading/error/value\ntype AsyncState<T> =\n | {\n loading: boolean;\n error?: undefined;\n value?: undefined;\n }\n | {\n loading: true;\n error?: Error | undefined;\n value?: T;\n }\n | {\n loading: false;\n error: Error;\n value?: undefined;\n }\n | {\n loading: false;\n error?: undefined;\n value: T;\n };\n\nexport interface ProgressStep extends ProgessAsSingle {\n title: string;\n}\nexport interface ProgessAsSteps {\n steps: Array<ProgressStep>;\n}\nexport interface ProgessAsSingle<T = number> {\n progress?: T;\n progressBuffer?: T;\n}\n\nexport type ProgessState<T = number> =\n | ProgessAsSingle<T>\n | (T extends number ? ProgessAsSteps : { steps?: undefined });\n\nexport type ProgressAsLoading = ProgessState & {\n loading: true;\n error?: undefined;\n value?: undefined;\n};\nexport type ProgressAsError = ProgessState<undefined> & {\n loading?: false | undefined;\n error: Error;\n value?: undefined;\n};\nexport type ProgressAsValue<T> = ProgessState<undefined> & {\n loading?: false | undefined;\n error?: undefined;\n value: T;\n};\n\n/**\n * An AsyncState but with the addition of progress (decimal 0-1) to allow\n * rendering a progress bar while waiting.\n */\nexport type ProgressType<T> =\n | ProgressAsLoading\n | ProgressAsError\n | ProgressAsValue<T>;\n\nconst sentry = Symbol();\n\n/**\n * Casts an AsyncState or Progress into its non-succeeded sub types\n */\ntype Unsuccessful<S extends ProgressType<any> | AsyncState<any>> =\n S extends ProgressType<any>\n ? ProgressAsLoading | ProgressAsError\n : Omit<AsyncState<any>, 'value'>;\n\n/**\n * Similar to useAsync except it \"waits\" for a dependent (upstream) async state\n * to finish first, otherwise it forwards the dependent pending state.\n *\n * When/if the dependent state has settled successfully, the callback will be\n * invoked for a new layer of async state with the dependent (upstream) success\n * result as argument.\n */\nexport function useAsyncChain<S extends ProgressType<any> | AsyncState<any>, R>(\n parentState: S,\n fn: (value: NonNullable<S['value']>) => Promise<R>,\n deps: DependencyList,\n): Unsuccessful<S> | AsyncState<R> {\n const childState = useAsync(\n async () => (!parentState.value ? sentry : fn(parentState.value)),\n [!parentState.error, !parentState.loading, parentState.value, ...deps],\n );\n\n if (!parentState.value) {\n return parentState as Unsuccessful<S>;\n } else if (childState.value === sentry) {\n return { loading: true };\n }\n return childState as AsyncState<R>;\n}\n\nexport function renderFallbacks<T>(\n state: ProgressType<T> | AsyncState<T>,\n success: (value: T) => JSX.Element,\n): JSX.Element {\n if (state.loading) {\n return <ViewProgress state={state} />;\n } else if (state.error) {\n return <Alert severity=\"error\">{state.error.stack}</Alert>;\n }\n\n return success(state.value!);\n}\n\nexport function ViewProgress({\n state,\n}: {\n state: ProgressAsLoading | { loading: boolean };\n}) {\n const { Progress } = useApp().getComponents();\n\n const stateAsSingleProgress = state as ProgessAsSingle;\n const stateAsStepProgress = state as ProgessAsSteps;\n\n if (\n !stateAsSingleProgress.progress &&\n !stateAsSingleProgress.progressBuffer &&\n !stateAsStepProgress.steps\n ) {\n // Simple spinner\n return <Progress />;\n } else if (stateAsSingleProgress.progress !== undefined) {\n // Simple _single_ progress\n return (\n <Box sx={{ width: '100%' }}>\n <LinearProgress\n variant=\"buffer\"\n value={(stateAsSingleProgress.progress ?? 0) * 100}\n valueBuffer={(stateAsSingleProgress.progressBuffer ?? 0) * 100}\n />\n </Box>\n );\n }\n\n // Multi-step progresses\n\n return (\n <Box sx={{ width: '100%' }}>\n <Timeline>\n {stateAsStepProgress.steps.map((step, index) => (\n <TimelineItem key={index}>\n <TimelineOppositeContent>{step.title}</TimelineOppositeContent>\n <TimelineSeparator>\n <TimelineDot color={getDotColor(step)} />\n {index < stateAsStepProgress.steps.length - 1 ? (\n <TimelineConnector />\n ) : null}\n </TimelineSeparator>\n <TimelineContent>\n {!step.progress && !step.progressBuffer ? null : (\n <LinearProgress\n style={stepProgressStyle}\n variant=\"buffer\"\n value={(step.progress ?? 0) * 100}\n valueBuffer={(step.progressBuffer ?? 0) * 100}\n />\n )}\n </TimelineContent>\n </TimelineItem>\n ))}\n </Timeline>\n </Box>\n );\n}\n\nfunction getDotColor(step: ProgressStep): TimelineDotProps['color'] {\n const progress = step.progress ?? 0;\n\n if (progress >= 1) {\n return 'primary';\n } else if (progress > 0) {\n return 'secondary';\n }\n return 'grey';\n}\n"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
/// <reference types="react" />
|
|
2
|
+
import * as react from 'react';
|
|
2
3
|
import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
|
|
3
4
|
import { Entity } from '@backstage/catalog-model';
|
|
4
5
|
|
|
5
6
|
/** @public */
|
|
6
|
-
declare function EntityPageCicdCharts(): JSX.Element;
|
|
7
|
+
declare function EntityPageCicdCharts(): react.JSX.Element;
|
|
7
8
|
|
|
8
9
|
/** @public */
|
|
9
10
|
declare const rootCatalogCicdStatsRouteRef: _backstage_core_plugin_api.RouteRef<undefined>;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-cicd-statistics",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.13.1",
|
|
4
4
|
"description": "A frontend plugin visualizing CI/CD pipeline statistics (build time)",
|
|
5
5
|
"backstage": {
|
|
6
6
|
"role": "frontend-plugin",
|
|
@@ -65,11 +65,11 @@
|
|
|
65
65
|
"test": "backstage-cli package test"
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
|
-
"@backstage/catalog-model": "^1.7.
|
|
69
|
-
"@backstage/core-compat-api": "^0.5.
|
|
70
|
-
"@backstage/core-plugin-api": "^1.
|
|
71
|
-
"@backstage/frontend-plugin-api": "^0.
|
|
72
|
-
"@backstage/plugin-catalog-react": "^1.21.
|
|
68
|
+
"@backstage/catalog-model": "^1.7.6",
|
|
69
|
+
"@backstage/core-compat-api": "^0.5.4",
|
|
70
|
+
"@backstage/core-plugin-api": "^1.12.0",
|
|
71
|
+
"@backstage/frontend-plugin-api": "^0.13.1",
|
|
72
|
+
"@backstage/plugin-catalog-react": "^1.21.3",
|
|
73
73
|
"@date-io/luxon": "^1.3.13",
|
|
74
74
|
"@material-ui/core": "^4.12.2",
|
|
75
75
|
"@material-ui/icons": "^4.9.1",
|
|
@@ -83,9 +83,9 @@
|
|
|
83
83
|
"recharts": "^2.5.0"
|
|
84
84
|
},
|
|
85
85
|
"devDependencies": {
|
|
86
|
-
"@backstage/cli": "^0.34.
|
|
87
|
-
"@backstage/dev-utils": "^1.1.
|
|
88
|
-
"@backstage/plugin-catalog": "^1.
|
|
86
|
+
"@backstage/cli": "^0.34.5",
|
|
87
|
+
"@backstage/dev-utils": "^1.1.17",
|
|
88
|
+
"@backstage/plugin-catalog": "^1.32.0",
|
|
89
89
|
"@testing-library/dom": "^10.0.0",
|
|
90
90
|
"@testing-library/jest-dom": "^6.0.0",
|
|
91
91
|
"@testing-library/react": "^15.0.0",
|