Skip to content

Commit c6344a7

Browse files
Merge branch 'main' into guoda-improve-toolbar
2 parents 8b14f59 + 4bbfb0e commit c6344a7

14 files changed

Lines changed: 628 additions & 1246 deletions

File tree

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@cloudoperators/juno-app-greenhouse": patch
3+
"@cloudoperators/juno-app-heureka": patch
4+
---
5+
6+
Improve ErrorMessage type safety.

apps/greenhouse/src/components/admin/common/ErrorBoundary/ErrorMessage.test.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,18 @@ describe("ErrorMessage", () => {
3131
const errorText = screen.getByText("TestError: Something went wrong")
3232
expect(errorText).toBeInTheDocument()
3333
})
34+
35+
it("renders error from string", () => {
36+
const error = "Failed to load data"
37+
render(<ErrorMessage error={error} />)
38+
const errorText = screen.getByText("Error: Failed to load data")
39+
expect(errorText).toBeInTheDocument()
40+
})
41+
42+
it("renders default message for unknown error types", () => {
43+
const error = { someOtherProperty: "value" }
44+
render(<ErrorMessage error={error} />)
45+
const errorText = screen.getByText("Error: Something went wrong")
46+
expect(errorText).toBeInTheDocument()
47+
})
3448
})

apps/greenhouse/src/components/admin/common/ErrorBoundary/ErrorMessage.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,37 @@
44
*/
55

66
import React from "react"
7-
import { FallbackProps } from "react-error-boundary"
87
import { Icon, Stack } from "@cloudoperators/juno-ui-components"
98

10-
type ErrorMessageProps =
11-
| {
12-
error: Error
9+
function getErrorInfo(error: unknown): { name: string; message: string } {
10+
const defaultError = { name: "Error", message: "Something went wrong" }
11+
12+
if (error instanceof Error) {
13+
return {
14+
name: error.name || defaultError.name,
15+
message: error.message || defaultError.message,
1316
}
14-
| FallbackProps
17+
}
18+
19+
if (typeof error === "string") {
20+
return { name: defaultError.name, message: error }
21+
}
22+
23+
return defaultError
24+
}
25+
26+
export interface ErrorMessageProps {
27+
error: unknown
28+
}
1529

1630
export const ErrorMessage = ({ error }: ErrorMessageProps) => {
17-
// Handle both direct Error prop and FallbackProps from react-error-boundary
18-
const errorObj = error as Error
19-
const errorName = errorObj.name ? `${errorObj.name}: ` : "Error: "
20-
const errorMessage = errorObj.message || "Something went wrong"
31+
const { name, message } = getErrorInfo(error)
2132

2233
return (
2334
<Stack gap="2" alignment="center">
2435
<Icon icon="danger" className="text-theme-danger" />
2536
<span>
26-
{errorName}
27-
{errorMessage}
37+
{name}: {message}
2838
</span>
2939
</Stack>
3040
)

apps/greenhouse/src/components/admin/common/YamlViewer.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ export default function YamlViewer({ value, ...props }: YamlViewerProps) {
3636
return (
3737
<div ref={containerRef} className="overflow-x-auto max-w-full">
3838
{error ? (
39-
<ErrorMessage error={new Error(error)} />
39+
<ErrorMessage error={error} />
4040
) : (
4141
<CodeMirror
4242
value={yamlContent}

apps/greenhouse/src/components/admin/common/getErrorDataRow.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const getErrorDataRowComponent = ({ colspan }: { colspan: number }) => {
1313
const ErrorDataRow = ({ error }: FallbackProps) => (
1414
<EmptyDataGridRow colSpan={colspan}>
1515
<Stack gap="2" alignment="center">
16-
<ErrorMessage error={error as Error} />
16+
<ErrorMessage error={error} />
1717
</Stack>
1818
</EmptyDataGridRow>
1919
)

apps/heureka/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,10 @@
3939
"devDependencies": {
4040
"@apollo/client": "4.1.5",
4141
"@cloudoperators/juno-config": "workspace:*",
42-
"@graphql-codegen/cli": "5.0.7",
43-
"@graphql-codegen/typescript": "4.1.6",
44-
"@graphql-codegen/typescript-operations": "4.6.1",
45-
"@graphql-codegen/typescript-react-apollo": "4.4.0",
42+
"@graphql-codegen/cli": "6.1.3",
43+
"@graphql-codegen/typescript": "5.0.9",
44+
"@graphql-codegen/typescript-operations": "5.0.9",
45+
"@graphql-codegen/typescript-react-apollo": "4.4.1",
4646
"@tanstack/router-plugin": "1.161.3",
4747
"@tailwindcss/vite": "4.2.0",
4848
"@testing-library/jest-dom": "6.9.1",

apps/heureka/src/components/common/ErrorBoundary/ErrorMessage.test.tsx

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,4 +31,18 @@ describe("ErrorMessage", () => {
3131
const errorText = screen.getByText("TestError: Something went wrong")
3232
expect(errorText).toBeInTheDocument()
3333
})
34+
35+
it("renders error from string", () => {
36+
const error = "Failed to load data"
37+
render(<ErrorMessage error={error} />)
38+
const errorText = screen.getByText("Error: Failed to load data")
39+
expect(errorText).toBeInTheDocument()
40+
})
41+
42+
it("renders default message for unknown error types", () => {
43+
const error = { someOtherProperty: "value" }
44+
render(<ErrorMessage error={error} />)
45+
const errorText = screen.getByText("Error: Something went wrong")
46+
expect(errorText).toBeInTheDocument()
47+
})
3448
})

apps/heureka/src/components/common/ErrorBoundary/ErrorMessage.tsx

Lines changed: 21 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,27 +4,37 @@
44
*/
55

66
import React from "react"
7-
import { FallbackProps } from "react-error-boundary"
87
import { Icon, Stack } from "@cloudoperators/juno-ui-components"
98

10-
type ErrorMessageProps =
11-
| {
12-
error: Error
9+
function getErrorInfo(error: unknown): { name: string; message: string } {
10+
const defaultError = { name: "Error", message: "Something went wrong" }
11+
12+
if (error instanceof Error) {
13+
return {
14+
name: error.name || defaultError.name,
15+
message: error.message || defaultError.message,
1316
}
14-
| FallbackProps
17+
}
18+
19+
if (typeof error === "string") {
20+
return { name: defaultError.name, message: error }
21+
}
22+
23+
return defaultError
24+
}
25+
26+
export interface ErrorMessageProps {
27+
error: unknown
28+
}
1529

1630
export const ErrorMessage = ({ error }: ErrorMessageProps) => {
17-
// Handle both direct Error prop and FallbackProps from react-error-boundary
18-
const errorObj = error as Error
19-
const errorName = errorObj.name ? `${errorObj.name}: ` : "Error: "
20-
const errorMessage = errorObj.message || "Something went wrong"
31+
const { name, message } = getErrorInfo(error)
2132

2233
return (
2334
<Stack gap="2" alignment="center">
2435
<Icon icon="danger" className="text-theme-danger" />
2536
<span>
26-
{errorName}
27-
{errorMessage}
37+
{name}: {message}
2838
</span>
2939
</Stack>
3040
)

apps/heureka/src/components/common/Filters/PlaceHolderFilterSelect.tsx

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,30 @@ import { Stack, InputGroup, Select, ComboBox } from "@cloudoperators/juno-ui-com
88

99
export type PlaceHolderFilterSelectProps = {
1010
loading?: boolean
11-
error?: Error
11+
error?: unknown
1212
}
1313

14-
export const PlaceHolderFilterSelect = ({ loading, error }: PlaceHolderFilterSelectProps) => (
15-
<Stack alignment="center" gap="8">
16-
<InputGroup>
17-
<Select
18-
loading={loading}
19-
className="filter-label-select w-64 mb-0"
20-
name="filter"
21-
data-testid="select-filterValue"
22-
label="Filter"
23-
errortext={error ? error.message || "Error loading filters" : undefined}
24-
></Select>
25-
<ComboBox
26-
disabled
27-
className="filter-value-select w-64 bg-theme-background-lvl-0"
28-
name="filterValue"
29-
data-testid="combobox-filterValue"
30-
></ComboBox>
31-
</InputGroup>
32-
</Stack>
33-
)
14+
export const PlaceHolderFilterSelect = ({ loading, error }: PlaceHolderFilterSelectProps) => {
15+
const errorMessage = error instanceof Error ? error.message : "Error loading filters"
16+
17+
return (
18+
<Stack alignment="center" gap="8">
19+
<InputGroup>
20+
<Select
21+
loading={loading}
22+
className="filter-label-select w-64 mb-0"
23+
name="filter"
24+
data-testid="select-filterValue"
25+
label="Filter"
26+
errortext={error ? errorMessage : undefined}
27+
></Select>
28+
<ComboBox
29+
disabled
30+
className="filter-value-select w-64 bg-theme-background-lvl-0"
31+
name="filterValue"
32+
data-testid="combobox-filterValue"
33+
></ComboBox>
34+
</InputGroup>
35+
</Stack>
36+
)
37+
}

apps/heureka/src/components/common/Filters/index.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ export const Filters = ({ filtersPromise, filterSettings, onFilterChange, search
3737
<InputGroup>
3838
<ErrorBoundary
3939
displayErrorMessage
40-
fallbackRender={(props) => <PlaceHolderFilterSelect error={props.error as Error} />}
40+
fallbackRender={(props) => <PlaceHolderFilterSelect error={props.error} />}
4141
>
4242
<Suspense fallback={<PlaceHolderFilterSelect loading />}>
4343
<FilterSelect

0 commit comments

Comments
 (0)