Skip to content

Commit a67e911

Browse files
authored
Merge pull request #160 from PRO-Robotech/feature/dev
White Labels + Border fix
2 parents 322462f + 9cd116c commit a67e911

File tree

13 files changed

+278
-69
lines changed

13 files changed

+278
-69
lines changed

.env

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
VITE_TITLE_TEXT="OpenAPI UI"
2+
VITE_LOGO_TEXT="In-Cloud"
3+
VITE_FOOTER_TEXT="PRO Robotech"
4+
VITE_CUSTOM_LOGO_SVG=
5+
VITE_CUSTOM_TENANT_TEXT=
6+
17
VITE_CUSTOMIZATION_API_GROUP=incloud.io
28
VITE_CUSTOMIZATION_API_VERSION=v1alpha
39

@@ -39,3 +45,7 @@ VITE_BASE_FACTORY_CLUSTERSCOPED_API_KEY=base-factory-clusterscoped-api
3945
VITE_BASE_FACTORY_NAMESPACED_BUILTIN_KEY=base-factory-namespaced-builtin
4046
VITE_BASE_FACTORY_CLUSTERSCOPED_BUILTIN_KEY=base-factory-clusterscoped-builtin
4147
VITE_BASE_NAMESPACE_FACTORY_KEY=base-factory-clusterscoped-builtin
48+
49+
VITE_CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP=
50+
VITE_CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION=
51+
VITE_CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME=

.env.options.dist

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
TITLE_TEXT=
2+
LOGO_TEXT=
3+
FOOTER_TEXT=
4+
CUSTOM_LOGO_SVG=
5+
CUSTOM_TENANT_TEXT=
6+
17
KUBE_API_URL=
28

39
CUSTOMIZATION_API_GROUP=
@@ -41,3 +47,7 @@ BASE_FACTORY_CLUSTERSCOPED_API_KEY=
4147
BASE_FACTORY_NAMESPACED_BUILTIN_KEY=
4248
BASE_FACTORY_CLUSTERSCOPED_BUILTIN_KEY=
4349
BASE_NAMESPACE_FACTORY_KEY=
50+
51+
CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP=
52+
CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION=
53+
CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME=

README.md

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,43 @@ Define interfaces in YAML; the app discovers CRDs, watches their objects, and bu
99

1010
This app can be configured through environment variables.
1111

12-
| Variable | Type | Description |
13-
| ---------------------------------------- | --------- | --------------------------------------------------------------------------------------- |
14-
| `BASEPREFIX` | `string` | Base URL for the app. `/openapi-ui` |
15-
| `KUBE_API_URL` | `string` | URL for the Kubernetes API. `http://api.incloud-web.svc.default.in-cloud.internal:8081` |
16-
| `BFF_URL` | `string` | URL for the BFF |
17-
| `LOGIN_URL` | `string` | Login endpoint. `/oauth/token` |
18-
| `LOGOUT_URL` | `string` | Logout endpoint. `/oauth/logout` |
19-
| `LOGIN_USERNAME_FIELD` | `string` | Field from login endpoint response. `name` |
20-
| `CUSTOMIZATION_API_GROUP` | `string` | API group for customization resources. `front.in-cloud.io` |
21-
| `CUSTOMIZATION_API_VERSION` | `string` | API version for customization resources. `v1alpha1` |
22-
| `CUSTOMIZATION_NAVIGATION_RESOURCE_NAME` | `string` | Resource plural name for navigation settings. `navigations` |
23-
| `CUSTOMIZATION_NAVIGATION_RESOURCE` | `string` | Resource name for navigation settings. `navigation` |
24-
| `USE_NAMESPACE_NAV` | `boolean` | Use namespaces instead of project/instances. `true` |
25-
| `NAVIGATE_FROM_CLUSTERLIST` | `string` | Location to be navigated after selecting cluster. `/openapi-ui/clusters/~recordValue~` |
26-
| `PROJECTS_API_GROUP` | `string` | API group for projects resources. If not using namespace nav. |
27-
| `PROJECTS_VERSION` | `string` | API version for projects resources. If not using namespace nav. |
28-
| `PROJECTS_RESOURCE_NAME` | `string` | Plural name for projects resources. If not using namespace nav. |
29-
| `INSTANCES_API_GROUP` | `string` | API group for instances resources. If not using namespace nav. |
30-
| `INSTANCES_VERSION` | `string` | API version for instances resources. If not using namespace nav. |
31-
| `INSTANCES_RESOURCE_NAME` | `string` | Plural name for instances resources. If not using namespace nav. |
32-
| `MARKETPLACE_RESOURCE_NAME` | `string` | Plural name for marketplace resources for related factory component. |
33-
| `MARKETPLACE_KIND` | `string` | Kind name for marketplace resources for related factory component. |
34-
| `NODE_TERMINAL_DEFAULT_PROFILE` | `string` | Default profile for node terminal component. `baseline` |
35-
| `REMOVE_BACKLINK` | `boolean` | Remove backlink arrow from right-side navigation |
36-
| `REMOVE_BACKLINK_TEXT` | `boolean` | Remove backlink text from right-side navigation |
37-
| `DOCS_URL` | `string` | URL to navigate from question mark |
38-
| `SEARCH_TABLE_CUSTOMIZATION_PREFIX` | `string` | Search tables Customization id prefix |
12+
| Variable | Type | Description |
13+
| --------------------------------------------- | --------- | --------------------------------------------------------------------------------------- |
14+
| `BASEPREFIX` | `string` | Base URL for the app. `/openapi-ui` |
15+
| `KUBE_API_URL` | `string` | URL for the Kubernetes API. `http://api.incloud-web.svc.default.in-cloud.internal:8081` |
16+
| `BFF_URL` | `string` | URL for the BFF |
17+
| `TITLE_TEXT` | `string` | Page title |
18+
| `LOGO_TEXT` | `string` | Logo text |
19+
| `FOOTER_TEXT` | `string` | Footer text |
20+
| `CUSTOM_LOGO_SVG` | `string` | Base64 encoded svg |
21+
| `CUSTOM_TENANT_TEXT` | `string` | Custom tenant text override |
22+
| `LOGIN_URL` | `string` | Login endpoint. `/oauth/token` |
23+
| `LOGOUT_URL` | `string` | Logout endpoint. `/oauth/logout` |
24+
| `LOGIN_USERNAME_FIELD` | `string` | Field from login endpoint response. `name` |
25+
| `CUSTOMIZATION_API_GROUP` | `string` | API group for customization resources. `front.in-cloud.io` |
26+
| `CUSTOMIZATION_API_VERSION` | `string` | API version for customization resources. `v1alpha1` |
27+
| `CUSTOMIZATION_NAVIGATION_RESOURCE_NAME` | `string` | Resource plural name for navigation settings. `navigations` |
28+
| `CUSTOMIZATION_NAVIGATION_RESOURCE` | `string` | Resource name for navigation settings. `navigation` |
29+
| `USE_NAMESPACE_NAV` | `boolean` | Use namespaces instead of project/instances. `true` |
30+
| `NAVIGATE_FROM_CLUSTERLIST` | `string` | Location to be navigated after selecting cluster. `/openapi-ui/clusters/~recordValue~` |
31+
| `PROJECTS_API_GROUP` | `string` | API group for projects resources. If not using namespace nav. |
32+
| `PROJECTS_VERSION` | `string` | API version for projects resources. If not using namespace nav. |
33+
| `PROJECTS_RESOURCE_NAME` | `string` | Plural name for projects resources. If not using namespace nav. |
34+
| `INSTANCES_API_GROUP` | `string` | API group for instances resources. If not using namespace nav. |
35+
| `INSTANCES_VERSION` | `string` | API version for instances resources. If not using namespace nav. |
36+
| `INSTANCES_RESOURCE_NAME` | `string` | Plural name for instances resources. If not using namespace nav. |
37+
| `MARKETPLACE_RESOURCE_NAME` | `string` | Plural name for marketplace resources for related factory component. |
38+
| `MARKETPLACE_KIND` | `string` | Kind name for marketplace resources for related factory component. |
39+
| `NODE_TERMINAL_DEFAULT_PROFILE` | `string` | Default profile for node terminal component. `baseline` |
40+
| `REMOVE_BACKLINK` | `boolean` | Remove backlink arrow from right-side navigation |
41+
| `REMOVE_BACKLINK_TEXT` | `boolean` | Remove backlink text from right-side navigation |
42+
| `DOCS_URL` | `string` | URL to navigate from question mark |
43+
| `SEARCH_TABLE_CUSTOMIZATION_PREFIX` | `string` | Search tables Customization id prefix |
44+
| `BASE_FACTORY_NAMESPACED_API_KEY` | `string` | Base factory key for namespaced API resources |
45+
| `BASE_FACTORY_CLUSTERSCOPED_API_KEY` | `string` | Base factory key for clusterscoped API resources |
46+
| `BASE_FACTORY_NAMESPACED_BUILTIN_KEY` | `string` | Base factory key for namespaced builtin (v1) resources |
47+
| `BASE_FACTORY_CLUSTERSCOPED_BUILTIN_KEY` | `string` | Base factory key for clusterscoped builtin (v1) resources |
48+
| `BASE_NAMESPACE_FACTORY_KEY` | `string` | Base factory key for namespaces |
49+
| `CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP` | `string` | Custom namespace resource: api group |
50+
| `CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION` | `string` | Custom namespace resource: api version |
51+
| `CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME` | `string` | Custom namespace resource: resource name |

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
"@ant-design/icons": "5.6.0",
2121
"@monaco-editor/react": "4.6.0",
2222
"@originjs/vite-plugin-federation": "1.3.6",
23-
"@prorobotech/openapi-k8s-toolkit": "0.0.1-alpha.154",
23+
"@prorobotech/openapi-k8s-toolkit": "0.0.1-alpha.156",
2424
"@readme/openapi-parser": "4.0.0",
2525
"@reduxjs/toolkit": "2.2.5",
2626
"@tanstack/react-query": "5.62.2",

server/getDynamicIndex.ts

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,23 @@ export const getDynamicIndex = (baseprefix: string): string => {
22
try {
33
const mainJs = 'index-react.js'
44
const mainCss = 'style.css'
5+
const titleText = process.env.TITLE_TEXT || 'OpenAPI UI'
6+
const iconSvg = process.env.ICON_SVG || ''
7+
8+
// Generate favicon from SVG if provided
9+
const generateFavicon = (): string => {
10+
if (!iconSvg) {
11+
return ''
12+
}
13+
try {
14+
const decodedSvg = Buffer.from(iconSvg, 'base64').toString('utf-8')
15+
const dataUri = `data:image/svg+xml;base64,${decodedSvg}`
16+
return `<link rel="icon" type="image/svg+xml" href="${dataUri}">`
17+
} catch (error) {
18+
console.error('Error processing icon SVG:', error)
19+
return ''
20+
}
21+
}
522

623
return `<html>
724
<head>
@@ -14,7 +31,8 @@ export const getDynamicIndex = (baseprefix: string): string => {
1431
href="https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,700;0,900;1,100;1,300;1,400;1,700;1,900&display=swap"
1532
rel="stylesheet"
1633
/>
17-
<title>OpenAPI UI</title>
34+
<title>${titleText}</title>
35+
${generateFavicon()}
1836
<script src="${baseprefix}/env.js"></script>
1937
<script type="module" crossorigin src="${baseprefix}/${mainJs}"></script>
2038
<link rel="stylesheet" crossorigin href="${baseprefix}/${mainCss}">

server/index.ts

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ if (process.env.LOCAL === 'true') {
1818

1919
const KUBE_API_URL = process.env.LOCAL === 'true' ? options?.KUBE_API_URL : process.env.KUBE_API_URL
2020

21+
const TITLE_TEXT = process.env.LOCAL === 'true' ? options?.TITLE_TEXT : process.env.TITLE_TEXT
22+
const LOGO_TEXT = process.env.LOCAL === 'true' ? options?.LOGO_TEXT : process.env.LOGO_TEXT
23+
const FOOTER_TEXT = process.env.LOCAL === 'true' ? options?.FOOTER_TEXT : process.env.FOOTER_TEXT
24+
const CUSTOM_LOGO_SVG = process.env.LOCAL === 'true' ? options?.CUSTOM_LOGO_SVG : process.env.CUSTOM_LOGO_SVG
25+
const CUSTOM_TENANT_TEXT = process.env.LOCAL === 'true' ? options?.CUSTOM_TENANT_TEXT : process.env.CUSTOM_TENANT_TEXT
26+
2127
const CUSTOMIZATION_API_GROUP =
2228
process.env.LOCAL === 'true' ? options?.CUSTOMIZATION_API_GROUP : process.env.CUSTOMIZATION_API_GROUP
2329
const CUSTOMIZATION_API_VERSION =
@@ -90,6 +96,19 @@ const BASE_FACTORY_CLUSTERSCOPED_BUILTIN_KEY =
9096
const BASE_NAMESPACE_FACTORY_KEY =
9197
process.env.LOCAL === 'true' ? options?.BASE_NAMESPACE_FACTORY_KEY : process.env.BASE_NAMESPACE_FACTORY_KEY
9298

99+
const CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP =
100+
process.env.LOCAL === 'true'
101+
? options?.CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP
102+
: process.env.CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP
103+
const CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION =
104+
process.env.LOCAL === 'true'
105+
? options?.CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION
106+
: process.env.CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION
107+
const CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME =
108+
process.env.LOCAL === 'true'
109+
? options?.CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME
110+
: process.env.CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME
111+
93112
const healthcheck = require('express-healthcheck')
94113
const promBundle = require('express-prom-bundle')
95114

@@ -193,11 +212,31 @@ app.get(`${basePrefix ? basePrefix : ''}/env.js`, (_, res) => {
193212
`
194213
window._env_ = {
195214
${basePrefix ? ` BASEPREFIX: "${basePrefix}",` : ''}
215+
TITLE_TEXT: ${JSON.stringify(TITLE_TEXT) || '"check envs"'},
216+
LOGO_TEXT: ${JSON.stringify(LOGO_TEXT) || '"check envs"'},
217+
FOOTER_TEXT: ${JSON.stringify(FOOTER_TEXT) || '"check envs"'},
218+
${CUSTOM_LOGO_SVG ? ` CUSTOM_LOGO_SVG: "${CUSTOM_LOGO_SVG}",` : ''}
219+
${CUSTOM_TENANT_TEXT ? ` CUSTOM_TENANT_TEXT: "${CUSTOM_TENANT_TEXT}",` : ''}
196220
CUSTOMIZATION_API_GROUP: ${JSON.stringify(CUSTOMIZATION_API_GROUP) || '"check envs"'},
197221
CUSTOMIZATION_API_VERSION: ${JSON.stringify(CUSTOMIZATION_API_VERSION) || '"check envs"'},
198222
CUSTOMIZATION_NAVIGATION_RESOURCE_NAME: ${
199223
JSON.stringify(CUSTOMIZATION_NAVIGATION_RESOURCE_NAME) || '"check envs"'
200224
},
225+
${
226+
CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP
227+
? ` CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP: "${CUSTOM_NAMESPACE_API_RESOURCE_API_GROUP}",`
228+
: ''
229+
}
230+
${
231+
CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION
232+
? ` CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION: "${CUSTOM_NAMESPACE_API_RESOURCE_API_VERSION}",`
233+
: ''
234+
}
235+
${
236+
CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME
237+
? ` CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME: "${CUSTOM_NAMESPACE_API_RESOURCE_RESOURCE_NAME}",`
238+
: ''
239+
}
201240
CUSTOMIZATION_NAVIGATION_RESOURCE: ${JSON.stringify(CUSTOMIZATION_NAVIGATION_RESOURCE) || '"check envs"'},
202241
USE_NAMESPACE_NAV: ${USE_NAMESPACE_NAV ? JSON.stringify(USE_NAMESPACE_NAV).toLowerCase() : '"false"'},
203242
NAVIGATE_FROM_CLUSTERLIST: ${JSON.stringify(NAVIGATE_FROM_CLUSTERLIST) || '"check envs"'},

src/components/molecules/ManageableSidebar/styled.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ const Container = styled.div<TContainerProps>`
1818
direction: rtl;
1919
max-height: ${({ $maxHeight }) => $maxHeight || 'initial'};
2020
user-select: none;
21+
border-top-right-radius: 12px;
2122
2223
& ul {
2324
direction: ltr;
Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import React, { FC } from 'react'
22
import { Typography } from 'antd'
3+
import { FOOTER_TEXT } from 'constants/customizationApiGroupAndVersion'
34
import { Styled } from './styled'
45

56
export const Footer: FC = () => {
67
return (
78
<Styled.Container>
8-
<Typography.Text type="secondary">PRO Robotech © {new Date().getFullYear()}</Typography.Text>
9+
<Typography.Text type="secondary">
10+
{FOOTER_TEXT} © {new Date().getFullYear()}
11+
</Typography.Text>
912
</Styled.Container>
1013
)
1114
}

0 commit comments

Comments
 (0)