@devtron-labs/devtron-fe-common-lib 0.0.48-beta-8 → 0.0.48-beta-9
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/.eslintrc.js +16 -84
- package/.github/workflows/release-package.yml +3 -2
- package/dist/Common/BreadCrumb/BreadCrumb.d.ts +1 -1
- package/dist/Common/BreadCrumb/BreadcrumbStore.d.ts +2 -2
- package/dist/Common/Constants.d.ts +5 -1
- package/dist/Common/CustomInput/CustomInput.d.ts +1 -1
- package/dist/Common/CustomInput/Types.d.ts +2 -2
- package/dist/Common/CustomTagSelector/ResizableTagTextArea.d.ts +1 -1
- package/dist/Common/DeleteComponentModal/DeleteComponent.d.ts +1 -1
- package/dist/Common/DevtronProgressing/DevtronProgressing.d.ts +1 -1
- package/dist/Common/Dialogs/ConfirmationDialog.d.ts +6 -6
- package/dist/Common/Dialogs/DeleteDialog.d.ts +1 -1
- package/dist/Common/Dialogs/ForceDeleteDialog.d.ts +1 -1
- package/dist/Common/Dialogs/Types.d.ts +1 -1
- package/dist/Common/EmptyState/EmptyState.d.ts +17 -20
- package/dist/Common/EmptyState/GenericEmptyState.d.ts +1 -1
- package/dist/Common/Error.d.ts +1 -2
- package/dist/Common/ErrorScreenNotFound.d.ts +1 -1
- package/dist/Common/Helper.d.ts +1 -1
- package/dist/Common/ImageTags.d.ts +1 -1
- package/dist/Common/InfoColorBar/InfoColourbar.d.ts +1 -1
- package/dist/Common/Modals/Modal.d.ts +2 -2
- package/dist/Common/Modals/OpaqueModal.d.ts +3 -3
- package/dist/Common/Modals/VisibleModal.d.ts +3 -3
- package/dist/Common/Modals/VisibleModal2.d.ts +3 -3
- package/dist/Common/MultiSelectCustomization.d.ts +1 -1
- package/dist/Common/Policy.Types.d.ts +2 -2
- package/dist/Common/PopupMenu.d.ts +5 -5
- package/dist/Common/Progressing.d.ts +2 -2
- package/dist/Common/RadioGroup/RadioGroup.d.ts +1 -1
- package/dist/Common/ResizableTextarea.d.ts +1 -1
- package/dist/Common/TippyCustomized.d.ts +1 -1
- package/dist/Common/ToastBody.d.ts +5 -5
- package/dist/index.d.ts +1 -1
- package/dist/index.js +351 -266
- package/package.json +2 -19
- package/src/Common/AddCDButton/AddCDButton.tsx +2 -1
- package/src/Common/Api.ts +26 -21
- package/src/Common/AppStatus/AppStatus.tsx +12 -12
- package/src/Common/AppStatus/utils.ts +5 -6
- package/src/Common/BreadCrumb/BreadCrumb.tsx +28 -32
- package/src/Common/BreadCrumb/BreadcrumbStore.tsx +2 -2
- package/src/Common/BreadCrumb/Types.ts +12 -11
- package/src/Common/Checkbox.tsx +19 -17
- package/src/Common/ClipboardButton/ClipboardButton.tsx +1 -1
- package/src/Common/ClipboardButton/__tests__/ClipboardButton.test.tsx +1 -0
- package/src/Common/Common.service.ts +64 -59
- package/src/Common/Constants.ts +14 -9
- package/src/Common/CustomInput/CustomInput.tsx +29 -22
- package/src/Common/CustomInput/Types.ts +4 -4
- package/src/Common/CustomInput/index.ts +1 -1
- package/src/Common/CustomTagSelector/PropagateTagInfo.tsx +18 -15
- package/src/Common/CustomTagSelector/ResizableTagTextArea.tsx +9 -9
- package/src/Common/CustomTagSelector/TagDetails.tsx +3 -9
- package/src/Common/CustomTagSelector/TagLabelSelect.tsx +9 -7
- package/src/Common/CustomTagSelector/TagLabelValueSelector.tsx +35 -31
- package/src/Common/CustomTagSelector/TagSelector.utils.ts +3 -2
- package/src/Common/CustomTagSelector/Types.ts +1 -1
- package/src/Common/CustomTagSelector/ValidationRules.ts +22 -18
- package/src/Common/CustomTagSelector/index.ts +2 -2
- package/src/Common/DebouncedSearch/DebouncedSearch.tsx +1 -2
- package/src/Common/DebouncedSearch/__tests__/DebouncedSearch.test.tsx +1 -0
- package/src/Common/DeleteComponentModal/DeleteComponent.tsx +32 -27
- package/src/Common/DeleteComponentModal/types.ts +1 -1
- package/src/Common/DevtronProgressing/DevtronProgressing.tsx +8 -5
- package/src/Common/Dialogs/ConfirmationDialog.tsx +24 -24
- package/src/Common/Dialogs/DeleteDialog.tsx +5 -3
- package/src/Common/Dialogs/DialogForm.tsx +35 -31
- package/src/Common/Dialogs/ForceDeleteDialog.tsx +7 -13
- package/src/Common/Dialogs/Types.ts +12 -12
- package/src/Common/Dialogs/index.ts +1 -1
- package/src/Common/Drawer/Drawer.tsx +1 -1
- package/src/Common/EmptyState/EmptyState.tsx +17 -13
- package/src/Common/EmptyState/GenericEmptyState.tsx +21 -7
- package/src/Common/Error.tsx +5 -5
- package/src/Common/ErrorScreenNotFound.tsx +12 -9
- package/src/Common/Grid/Grid.tsx +2 -1
- package/src/Common/Helper.tsx +24 -23
- package/src/Common/Hooks/UseClickOutside/UseClickOutside.tsx +1 -1
- package/src/Common/Hooks/UseSuperAdmin/UseSuperAdmin.tsx +1 -1
- package/src/Common/ImageTags.Types.ts +3 -2
- package/src/Common/ImageTags.tsx +66 -61
- package/src/Common/InfoColorBar/InfoColourbar.tsx +5 -10
- package/src/Common/Modals/Modal.tsx +3 -3
- package/src/Common/Modals/OpaqueModal.tsx +18 -25
- package/src/Common/Modals/VisibleModal.tsx +3 -7
- package/src/Common/Modals/VisibleModal2.tsx +15 -20
- package/src/Common/MultiSelectCustomization.tsx +13 -9
- package/src/Common/Policy.Types.ts +38 -38
- package/src/Common/PopupMenu.tsx +9 -10
- package/src/Common/Progressing.tsx +18 -15
- package/src/Common/RJSF/Form.tsx +1 -0
- package/src/Common/RJSF/common/FieldRow.tsx +1 -0
- package/src/Common/RJSF/config.ts +1 -0
- package/src/Common/RJSF/templates/ArrayFieldItemTemplate.tsx +1 -1
- package/src/Common/RJSF/templates/ArrayFieldTemplate.tsx +1 -0
- package/src/Common/RJSF/templates/BaseInput.tsx +1 -0
- package/src/Common/RJSF/templates/ButtonTemplates/AddButton.tsx +1 -0
- package/src/Common/RJSF/templates/ButtonTemplates/RemoveButton.tsx +1 -0
- package/src/Common/RJSF/templates/ButtonTemplates/SubmitButton.tsx +6 -1
- package/src/Common/RJSF/templates/Description.tsx +1 -0
- package/src/Common/RJSF/templates/Field.tsx +3 -14
- package/src/Common/RJSF/templates/FieldErrorTemplate.tsx +9 -6
- package/src/Common/RJSF/templates/ObjectFieldTemplate.tsx +7 -5
- package/src/Common/RJSF/templates/TitleField.tsx +1 -0
- package/src/Common/RJSF/templates/WrapIfAdditionalTemplate.tsx +1 -0
- package/src/Common/RJSF/utils.ts +57 -53
- package/src/Common/RJSF/widgets/Checkbox.tsx +2 -2
- package/src/Common/RJSF/widgets/Select.tsx +1 -0
- package/src/Common/RadioGroup/RadioGroup.tsx +23 -18
- package/src/Common/RadioGroup.tsx +23 -24
- package/src/Common/Reload.tsx +1 -0
- package/src/Common/ResizableTextarea.tsx +17 -18
- package/src/Common/Security/ScanVulnerabilitiesTable.tsx +34 -29
- package/src/Common/ServerError.ts +1 -5
- package/src/Common/TippyCustomized.tsx +38 -41
- package/src/Common/ToastBody.tsx +7 -6
- package/src/Common/Toggle/Toggle.tsx +3 -3
- package/src/Common/Types.ts +12 -12
- package/src/custom.d.ts +7 -7
- package/src/index.ts +1 -1
- package/.eslintignore +0 -75
- package/.github/pull_request_template.md +0 -25
- package/.github/workflows/ci.yml +0 -31
- package/.husky/pre-commit +0 -5
- package/.lintstagedrc +0 -3
- package/.nvmrc +0 -1
package/package.json
CHANGED
|
@@ -1,16 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devtron-labs/devtron-fe-common-lib",
|
|
3
|
-
"version": "0.0.48-beta-
|
|
3
|
+
"version": "0.0.48-beta-9",
|
|
4
4
|
"description": "Supporting common component library",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"scripts": {
|
|
7
|
-
"prepare": "husky install",
|
|
8
|
-
"lint": "tsc --noEmit && eslint 'src/**/*.{js,jsx,ts,tsx}' --max-warnings 0",
|
|
9
|
-
"lint-fix": "eslint 'src/**/*.{js,jsx,ts,tsx}' --fix",
|
|
10
7
|
"test": "exit 0",
|
|
11
8
|
"build-lib": "rollup -c --bundleConfigAsCjs",
|
|
12
|
-
"build-watch": "rollup -c --bundleConfigAsCjs -w"
|
|
13
|
-
"lint-staged": "lint-staged"
|
|
9
|
+
"build-watch": "rollup -c --bundleConfigAsCjs -w"
|
|
14
10
|
},
|
|
15
11
|
"repository": {
|
|
16
12
|
"type": "git",
|
|
@@ -34,20 +30,7 @@
|
|
|
34
30
|
"@types/react": "17.0.39",
|
|
35
31
|
"@types/react-dom": "17.0.13",
|
|
36
32
|
"@types/react-router-dom": "^5.3.3",
|
|
37
|
-
"@typescript-eslint/eslint-plugin": "^6.17.0",
|
|
38
|
-
"@typescript-eslint/parser": "^6.17.0",
|
|
39
|
-
"eslint": "^8.56.0",
|
|
40
|
-
"eslint-config-airbnb": "^19.0.4",
|
|
41
|
-
"eslint-config-prettier": "^9.1.0",
|
|
42
|
-
"eslint-plugin-import": "^2.29.1",
|
|
43
|
-
"eslint-plugin-jsx-a11y": "^6.8.0",
|
|
44
|
-
"eslint-plugin-prettier": "^5.1.2",
|
|
45
|
-
"eslint-plugin-react": "^7.33.2",
|
|
46
|
-
"eslint-plugin-react-hooks": "^4.6.0",
|
|
47
|
-
"husky": "^7.0.4",
|
|
48
|
-
"lint-staged": "^12.5.0",
|
|
49
33
|
"moment": "^2.29.4",
|
|
50
|
-
"prettier": "^3.1.1",
|
|
51
34
|
"react-select": "5.2.2",
|
|
52
35
|
"react-toastify": "^8.2.0",
|
|
53
36
|
"rollup": "^3.10.0",
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import React from 'react'
|
|
1
2
|
import Tippy from '@tippyjs/react'
|
|
2
3
|
import { AddCDButtonProps, TooltipContentProps } from './types'
|
|
3
4
|
import { AddCDPositions } from '../Types'
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
function TooltipContent({ tooltipContent }: TooltipContentProps) {
|
|
6
7
|
if (tooltipContent) {
|
|
7
8
|
return (
|
|
8
9
|
<div className="dc__white-space-pre-wrap">
|
package/src/Common/Api.ts
CHANGED
|
@@ -79,12 +79,12 @@ function handleLogout() {
|
|
|
79
79
|
}
|
|
80
80
|
|
|
81
81
|
async function handleServerError(contentType, response) {
|
|
82
|
-
//
|
|
83
|
-
|
|
82
|
+
//Test for HTTP Status Code
|
|
83
|
+
let code: number = response.status
|
|
84
84
|
let status: string = response.statusText || responseMessages[code]
|
|
85
|
-
|
|
85
|
+
let serverError = new ServerErrors({ code, errors: [] })
|
|
86
86
|
if (contentType !== 'application/json') {
|
|
87
|
-
//
|
|
87
|
+
//used for better debugging,
|
|
88
88
|
status = `${responseMessages[code]}. Please try again.`
|
|
89
89
|
} else {
|
|
90
90
|
const responseBody = await response.json()
|
|
@@ -105,12 +105,12 @@ async function fetchAPI(
|
|
|
105
105
|
preventAutoLogout = false,
|
|
106
106
|
isMultipartRequest?: boolean,
|
|
107
107
|
): Promise<ResponseType> {
|
|
108
|
-
|
|
108
|
+
let options = {
|
|
109
109
|
method: type,
|
|
110
110
|
signal,
|
|
111
111
|
body: data ? JSON.stringify(data) : undefined,
|
|
112
|
-
credentials: 'include' as RequestCredentials,
|
|
113
112
|
}
|
|
113
|
+
options['credentials'] = 'include' as RequestCredentials
|
|
114
114
|
return fetch(
|
|
115
115
|
`${Host}/${url}`,
|
|
116
116
|
!isMultipartRequest
|
|
@@ -121,7 +121,7 @@ async function fetchAPI(
|
|
|
121
121
|
} as RequestInit),
|
|
122
122
|
).then(
|
|
123
123
|
async (response) => {
|
|
124
|
-
|
|
124
|
+
let contentType = response.headers.get('Content-Type')
|
|
125
125
|
if (response.status === 401) {
|
|
126
126
|
if (preventAutoLogout) {
|
|
127
127
|
throw new ServerErrors({
|
|
@@ -140,23 +140,22 @@ async function fetchAPI(
|
|
|
140
140
|
if (contentType === 'application/json') {
|
|
141
141
|
return response.json().then((responseBody) => {
|
|
142
142
|
if (responseBody.code >= 300 && responseBody.code <= 599) {
|
|
143
|
-
//
|
|
143
|
+
//Test Code in Response Body, despite successful HTTP Response Code
|
|
144
144
|
throw new ServerErrors({ code: responseBody.code, errors: responseBody.errors })
|
|
145
145
|
} else {
|
|
146
|
-
//
|
|
146
|
+
//Successfull Response. Expected Response Type {code, result, status}
|
|
147
147
|
return responseBody
|
|
148
148
|
}
|
|
149
149
|
})
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// used in getArtifact() API only
|
|
150
|
+
} else if (contentType === 'octet-stream' || contentType === 'application/octet-stream') {
|
|
151
|
+
//used in getArtifact() API only
|
|
153
152
|
return response
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
},
|
|
157
156
|
(error) => {
|
|
158
|
-
//
|
|
159
|
-
|
|
157
|
+
//Network call fails. Handle Failed to Fetch
|
|
158
|
+
let err = {
|
|
160
159
|
code: 0,
|
|
161
160
|
userMessage: error.message,
|
|
162
161
|
internalMessage: error.message,
|
|
@@ -177,7 +176,7 @@ function fetchInTime(
|
|
|
177
176
|
const controller = new AbortController()
|
|
178
177
|
const { signal } = controller
|
|
179
178
|
const timeoutPromise: Promise<ResponseType> = new Promise((resolve, reject) => {
|
|
180
|
-
|
|
179
|
+
let timeout = options?.timeout ? options.timeout : RequestTimeout
|
|
181
180
|
setTimeout(() => {
|
|
182
181
|
controller.abort()
|
|
183
182
|
reject({
|
|
@@ -212,12 +211,18 @@ export const post = (
|
|
|
212
211
|
data: object,
|
|
213
212
|
options?: APIOptions,
|
|
214
213
|
isMultipartRequest?: boolean,
|
|
215
|
-
): Promise<ResponseType> =>
|
|
214
|
+
): Promise<ResponseType> => {
|
|
215
|
+
return fetchInTime(url, 'POST', data, options, isMultipartRequest)
|
|
216
|
+
}
|
|
216
217
|
|
|
217
|
-
export const put = (url: string, data: object, options?: APIOptions): Promise<ResponseType> =>
|
|
218
|
-
fetchInTime(url, 'PUT', data, options)
|
|
218
|
+
export const put = (url: string, data: object, options?: APIOptions): Promise<ResponseType> => {
|
|
219
|
+
return fetchInTime(url, 'PUT', data, options)
|
|
220
|
+
}
|
|
219
221
|
|
|
220
|
-
export const get = (url: string, options?: APIOptions): Promise<ResponseType> =>
|
|
222
|
+
export const get = (url: string, options?: APIOptions): Promise<ResponseType> => {
|
|
223
|
+
return fetchInTime(url, 'GET', null, options)
|
|
224
|
+
}
|
|
221
225
|
|
|
222
|
-
export const trash = (url: string, data?: object, options?: APIOptions): Promise<ResponseType> =>
|
|
223
|
-
fetchInTime(url, 'DELETE', data, options)
|
|
226
|
+
export const trash = (url: string, data?: object, options?: APIOptions): Promise<ResponseType> => {
|
|
227
|
+
return fetchInTime(url, 'DELETE', data, options)
|
|
228
|
+
}
|
|
@@ -25,24 +25,24 @@ export default function AppStatus({
|
|
|
25
25
|
const renderIcon = () => {
|
|
26
26
|
if (iconClass) {
|
|
27
27
|
return <span className={`dc__app-summary__icon icon-dim-16 ${iconClass} ${iconClass}--node`} />
|
|
28
|
-
}
|
|
29
|
-
if (isVirtualEnv) {
|
|
28
|
+
} else if (isVirtualEnv) {
|
|
30
29
|
return (
|
|
31
30
|
<span
|
|
32
31
|
className={`dc__app-summary__icon icon-dim-16 ${StatusConstants.NOT_DEPLOYED.lowerCase} ${StatusConstants.NOT_DEPLOYED.lowerCase}--node`}
|
|
33
32
|
/>
|
|
34
33
|
)
|
|
34
|
+
} else {
|
|
35
|
+
return (
|
|
36
|
+
<Tippy
|
|
37
|
+
className="default-tt w-200"
|
|
38
|
+
arrow={false}
|
|
39
|
+
placement="top"
|
|
40
|
+
content="To fetch app status for GitOps based deployments open the app detail page"
|
|
41
|
+
>
|
|
42
|
+
<InfoIcon className="icon-dim-16 fcn-6" />
|
|
43
|
+
</Tippy>
|
|
44
|
+
)
|
|
35
45
|
}
|
|
36
|
-
return (
|
|
37
|
-
<Tippy
|
|
38
|
-
className="default-tt w-200"
|
|
39
|
-
arrow={false}
|
|
40
|
-
placement="top"
|
|
41
|
-
content="To fetch app status for GitOps based deployments open the app detail page"
|
|
42
|
-
>
|
|
43
|
-
<InfoIcon className="icon-dim-16 fcn-6" />
|
|
44
|
-
</Tippy>
|
|
45
|
-
)
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
return hideStatusMessage ? (
|
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { TIMELINE_STATUS } from './constants'
|
|
2
2
|
|
|
3
3
|
export const triggerStatus = (triggerDetailStatus: string): string => {
|
|
4
|
-
|
|
4
|
+
let triggerStatus = triggerDetailStatus?.toUpperCase()
|
|
5
5
|
if (triggerStatus === TIMELINE_STATUS.ABORTED || triggerStatus === TIMELINE_STATUS.DEGRADED) {
|
|
6
6
|
return 'Failed'
|
|
7
|
-
}
|
|
8
|
-
if (triggerStatus === TIMELINE_STATUS.HEALTHY) {
|
|
7
|
+
} else if (triggerStatus === TIMELINE_STATUS.HEALTHY) {
|
|
9
8
|
return 'Succeeded'
|
|
10
|
-
}
|
|
11
|
-
if (triggerStatus === TIMELINE_STATUS.INPROGRESS) {
|
|
9
|
+
} else if (triggerStatus === TIMELINE_STATUS.INPROGRESS) {
|
|
12
10
|
return 'Inprogress'
|
|
11
|
+
} else {
|
|
12
|
+
return triggerDetailStatus
|
|
13
13
|
}
|
|
14
|
-
return triggerDetailStatus
|
|
15
14
|
}
|
|
@@ -1,14 +1,12 @@
|
|
|
1
|
-
import { useMemo, useEffect } from 'react'
|
|
2
|
-
import * as React from 'react'
|
|
1
|
+
import React, { useMemo, useEffect } from 'react'
|
|
3
2
|
import { Link, useRouteMatch, useParams } from 'react-router-dom'
|
|
4
3
|
import { useBreadcrumbContext } from './BreadcrumbStore'
|
|
5
4
|
import { ConditionalWrap } from '../Helper'
|
|
6
5
|
import { Breadcrumb, Breadcrumbs, UseBreadcrumbOptionalProps, UseBreadcrumbState } from './Types'
|
|
7
|
-
|
|
8
6
|
export const BreadcrumbContext = React.createContext(null)
|
|
9
7
|
|
|
10
8
|
export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]): UseBreadcrumbState {
|
|
11
|
-
|
|
9
|
+
let sep = props?.sep || '/'
|
|
12
10
|
deps = deps || []
|
|
13
11
|
const { url, path } = useRouteMatch()
|
|
14
12
|
const params = useParams()
|
|
@@ -32,7 +30,7 @@ export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]):
|
|
|
32
30
|
setState((state) => ({ ...state, alias: tempAlias }))
|
|
33
31
|
}
|
|
34
32
|
|
|
35
|
-
|
|
33
|
+
let levels: Breadcrumb[] = useMemo(() => {
|
|
36
34
|
const paths = path.split('/').filter(Boolean)
|
|
37
35
|
const urls = url.split('/').filter(Boolean)
|
|
38
36
|
return paths.map((path, idx) => {
|
|
@@ -43,31 +41,29 @@ export function useBreadcrumb(props?: UseBreadcrumbOptionalProps, deps?: any[]):
|
|
|
43
41
|
return crumb
|
|
44
42
|
})
|
|
45
43
|
}, [path, url])
|
|
46
|
-
const { res: breadcrumbs } = useMemo(
|
|
47
|
-
(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
name
|
|
58
|
-
|
|
59
|
-
? state.alias[name]
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
[levels, state],
|
|
70
|
-
)
|
|
44
|
+
const { res: breadcrumbs } = useMemo(() => {
|
|
45
|
+
return levels.reduce(
|
|
46
|
+
(agg, curr, idx) => {
|
|
47
|
+
const { res, prefix } = agg
|
|
48
|
+
const { to, name } = curr
|
|
49
|
+
res.push({
|
|
50
|
+
to:
|
|
51
|
+
!state.alias[name]?.component || (state.alias[name]?.component && state.alias[name]?.linked)
|
|
52
|
+
? `${prefix}${to}`
|
|
53
|
+
: null,
|
|
54
|
+
name:
|
|
55
|
+
typeof state.alias[name] === 'object'
|
|
56
|
+
? !!state.alias[name]?.component
|
|
57
|
+
? state.alias[name].component
|
|
58
|
+
: null
|
|
59
|
+
: state.alias[name] || name,
|
|
60
|
+
className: curr.className || '',
|
|
61
|
+
})
|
|
62
|
+
return { res, prefix: `${prefix}${curr.to}${sep}` }
|
|
63
|
+
},
|
|
64
|
+
{ res: [], prefix: '/' },
|
|
65
|
+
)
|
|
66
|
+
}, [levels, state])
|
|
71
67
|
|
|
72
68
|
return { breadcrumbs, setCrumb, resetCrumb }
|
|
73
69
|
}
|
|
@@ -80,7 +76,7 @@ export const BreadCrumb: React.FC<Breadcrumbs> = ({
|
|
|
80
76
|
const { url } = useRouteMatch()
|
|
81
77
|
const filteredCrumbs = breadcrumbs.filter((crumb) => !!crumb.name)
|
|
82
78
|
return (
|
|
83
|
-
|
|
79
|
+
<React.Fragment>
|
|
84
80
|
{filteredCrumbs.map((breadcrumb, idx) => (
|
|
85
81
|
<React.Fragment key={idx}>
|
|
86
82
|
<ConditionalWrap
|
|
@@ -104,6 +100,6 @@ export const BreadCrumb: React.FC<Breadcrumbs> = ({
|
|
|
104
100
|
)}
|
|
105
101
|
</React.Fragment>
|
|
106
102
|
))}
|
|
107
|
-
|
|
103
|
+
</React.Fragment>
|
|
108
104
|
)
|
|
109
105
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import React, { createContext, useState } from 'react'
|
|
2
2
|
|
|
3
3
|
const initialState = {
|
|
4
4
|
alias: {},
|
|
@@ -15,7 +15,7 @@ export const BreadcrumbContext = createContext({
|
|
|
15
15
|
})
|
|
16
16
|
|
|
17
17
|
export function useBreadcrumbContext() {
|
|
18
|
-
const context = useContext(BreadcrumbContext)
|
|
18
|
+
const context = React.useContext(BreadcrumbContext)
|
|
19
19
|
if (!context) {
|
|
20
20
|
throw new Error(`breadcrumb components cannot be used outside Breadcrumb context`)
|
|
21
21
|
}
|
|
@@ -1,23 +1,24 @@
|
|
|
1
|
+
|
|
1
2
|
export interface Breadcrumb {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
to: string
|
|
4
|
+
name: string
|
|
5
|
+
className?: string
|
|
5
6
|
}
|
|
6
7
|
|
|
7
8
|
export interface UseBreadcrumbState {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
breadcrumbs: Breadcrumb[]
|
|
10
|
+
setCrumb: (props: { [key: string]: any }) => void
|
|
11
|
+
resetCrumb: (props: string[]) => void
|
|
11
12
|
}
|
|
12
13
|
|
|
13
14
|
export interface AdvancedAlias {
|
|
14
|
-
|
|
15
|
-
|
|
15
|
+
component: any
|
|
16
|
+
linked: boolean
|
|
16
17
|
}
|
|
17
18
|
|
|
18
19
|
export interface UseBreadcrumbProps {
|
|
19
|
-
|
|
20
|
-
|
|
20
|
+
sep?: string
|
|
21
|
+
alias?: { [key: string]: AdvancedAlias | any }
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
export interface Breadcrumbs {
|
|
@@ -26,4 +27,4 @@ export interface Breadcrumbs {
|
|
|
26
27
|
className?: string
|
|
27
28
|
}
|
|
28
29
|
|
|
29
|
-
export type UseBreadcrumbOptionalProps = UseBreadcrumbProps | null
|
|
30
|
+
export type UseBreadcrumbOptionalProps = UseBreadcrumbProps | null
|
package/src/Common/Checkbox.tsx
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Component } from 'react'
|
|
1
|
+
import React, { Component } from 'react'
|
|
2
2
|
import { CheckboxProps } from './Types'
|
|
3
3
|
|
|
4
4
|
/*
|
|
@@ -12,23 +12,25 @@ Valid States of Checkbox:
|
|
|
12
12
|
*/
|
|
13
13
|
export class Checkbox extends Component<CheckboxProps> {
|
|
14
14
|
render() {
|
|
15
|
-
|
|
15
|
+
let rootClassName = `${this.props.rootClassName ? this.props.rootClassName : ''}`
|
|
16
16
|
return (
|
|
17
|
-
|
|
18
|
-
<
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
17
|
+
<>
|
|
18
|
+
<label className={`dc__position-rel flex left cursor ${rootClassName}`} onClick={this.props?.onClick}>
|
|
19
|
+
<input
|
|
20
|
+
type="checkbox"
|
|
21
|
+
className={'form__checkbox'}
|
|
22
|
+
disabled={this.props.disabled}
|
|
23
|
+
value={this.props.value}
|
|
24
|
+
onChange={this.props.onChange}
|
|
25
|
+
tabIndex={this.props.tabIndex}
|
|
26
|
+
checked={this.props.isChecked}
|
|
27
|
+
id={this.props.id}
|
|
28
|
+
data-testid={this.props.dataTestId}
|
|
29
|
+
/>
|
|
30
|
+
<span className="form__checkbox-container" data-testid={`${this.props.dataTestId}-chk-span`}></span>
|
|
31
|
+
<span className={`form__checkbox-label`}>{this.props.children}</span>
|
|
32
|
+
</label>
|
|
33
|
+
</>
|
|
32
34
|
)
|
|
33
35
|
}
|
|
34
36
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import moment from 'moment'
|
|
2
|
-
import {
|
|
1
|
+
import moment from 'moment';
|
|
2
|
+
import {get, post} from './Api';
|
|
3
3
|
import { ROUTES } from './Constants'
|
|
4
|
-
import { sortCallback } from './Helper'
|
|
4
|
+
import { sortCallback } from './Helper';
|
|
5
5
|
import {
|
|
6
6
|
TeamList,
|
|
7
7
|
ResponseType,
|
|
@@ -17,21 +17,23 @@ import {
|
|
|
17
17
|
} from './Types'
|
|
18
18
|
|
|
19
19
|
export const getTeamListMin = (): Promise<TeamList> => {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
20
|
+
// ignore active field
|
|
21
|
+
const URL = `${ROUTES.PROJECT_LIST_MIN}`;
|
|
22
|
+
return get(URL).then(response => {
|
|
23
|
+
let list = [];
|
|
24
|
+
if (response && response.result && Array.isArray(response.result)) {
|
|
25
|
+
list = response.result;
|
|
26
|
+
}
|
|
27
|
+
list = list.sort((a, b) => {
|
|
28
|
+
return sortCallback('name', a, b);
|
|
29
|
+
});
|
|
30
|
+
return {
|
|
31
|
+
code: response.code,
|
|
32
|
+
status: response.status,
|
|
33
|
+
result: list,
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
};
|
|
35
37
|
|
|
36
38
|
interface UserRole extends ResponseType {
|
|
37
39
|
result?: {
|
|
@@ -57,12 +59,14 @@ export function getUserRole(appName?: string): Promise<UserRole> {
|
|
|
57
59
|
return get(`${ROUTES.USER_CHECK_ROLE}${appName ? `?appName=${appName}` : ''}`)
|
|
58
60
|
}
|
|
59
61
|
|
|
60
|
-
export function setImageTags(request, pipelineId: number, artifactId: number)
|
|
61
|
-
return post(`${ROUTES.IMAGE_TAGGING}/${pipelineId}/${artifactId}`,
|
|
62
|
+
export function setImageTags(request, pipelineId: number, artifactId: number){
|
|
63
|
+
return post(`${ROUTES.IMAGE_TAGGING}/${pipelineId}/${artifactId}`,request )
|
|
62
64
|
}
|
|
63
65
|
|
|
64
66
|
const processURL = (url: string, params: object) => {
|
|
65
|
-
const validParams = Object.keys(params).filter((key) =>
|
|
67
|
+
const validParams = Object.keys(params).filter((key) => {
|
|
68
|
+
return params[key] != null
|
|
69
|
+
})
|
|
66
70
|
|
|
67
71
|
if (!validParams.length) {
|
|
68
72
|
return url
|
|
@@ -71,11 +75,11 @@ const processURL = (url: string, params: object) => {
|
|
|
71
75
|
const queryString = validParams
|
|
72
76
|
.map((key) => {
|
|
73
77
|
if (Array.isArray(params[key])) {
|
|
74
|
-
return `${key}=${params[key].join(',')}`
|
|
78
|
+
return `${key}=${params[key].join(',')}`
|
|
75
79
|
}
|
|
76
80
|
return `${key}=${params[key]}`
|
|
77
81
|
})
|
|
78
|
-
.join('&')
|
|
82
|
+
.join('&')
|
|
79
83
|
|
|
80
84
|
return `${url}?${queryString}`
|
|
81
85
|
}
|
|
@@ -132,23 +136,25 @@ const cdMaterialListModal = (artifacts: any[], offset: number, artifactId?: numb
|
|
|
132
136
|
// It is going to be null but required in type so can't remove
|
|
133
137
|
lastExecution: material.lastExecution,
|
|
134
138
|
materialInfo: material.material_info
|
|
135
|
-
? material.material_info.map((mat) =>
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
139
|
+
? material.material_info.map((mat) => {
|
|
140
|
+
return {
|
|
141
|
+
modifiedTime: mat.modifiedTime
|
|
142
|
+
? moment(mat.modifiedTime).format('ddd, DD MMM YYYY, hh:mm A')
|
|
143
|
+
: '',
|
|
144
|
+
commitLink: createGitCommitUrl(mat.url, mat.revision),
|
|
145
|
+
author: mat.author || '',
|
|
146
|
+
message: mat.message || '',
|
|
147
|
+
revision: mat.revision || '',
|
|
148
|
+
tag: mat.tag || '',
|
|
149
|
+
webhookData: mat.webhookData || '',
|
|
150
|
+
url: mat.url || '',
|
|
151
|
+
branch:
|
|
152
|
+
(material.ciConfigureSourceType === SourceTypeMap.WEBHOOK
|
|
153
|
+
? material.ciConfigureSourceValue
|
|
154
|
+
: mat.branch) || '',
|
|
155
|
+
type: material.ciConfigureSourceType || '',
|
|
156
|
+
}
|
|
157
|
+
})
|
|
152
158
|
: [],
|
|
153
159
|
filterState,
|
|
154
160
|
appliedFiltersTimestamp: material.appliedFiltersTimestamp ?? '',
|
|
@@ -231,7 +237,9 @@ const processCDMaterialServiceResponse = (
|
|
|
231
237
|
// TODO: On update of service would remove from here
|
|
232
238
|
const filteredMaterials =
|
|
233
239
|
filter && filter === CDMaterialFilterQuery.RESOURCE
|
|
234
|
-
? materials.filter((material) =>
|
|
240
|
+
? materials.filter((material) => {
|
|
241
|
+
return material.filterState === FilterStates.ALLOWED
|
|
242
|
+
})
|
|
235
243
|
: materials
|
|
236
244
|
|
|
237
245
|
return {
|
|
@@ -255,7 +263,7 @@ export const genericCDMaterialsService = (
|
|
|
255
263
|
): Promise<CDMaterialResponseType> => {
|
|
256
264
|
// TODO: On update of service would remove from here
|
|
257
265
|
const manipulatedParams = getSanitizedQueryParams(queryParams)
|
|
258
|
-
|
|
266
|
+
|
|
259
267
|
let URL
|
|
260
268
|
switch (serviceType) {
|
|
261
269
|
case CDMaterialServiceEnum.ROLLBACK:
|
|
@@ -264,16 +272,13 @@ export const genericCDMaterialsService = (
|
|
|
264
272
|
|
|
265
273
|
// Meant for handling getCDMaterialList
|
|
266
274
|
default:
|
|
267
|
-
URL = processURL(`${ROUTES.CD_MATERIAL_GET}/${cdMaterialID}/material`, {
|
|
268
|
-
...manipulatedParams,
|
|
269
|
-
stage: stageMap[stage],
|
|
270
|
-
})
|
|
275
|
+
URL = processURL(`${ROUTES.CD_MATERIAL_GET}/${cdMaterialID}/material`, { ...manipulatedParams, stage: stageMap[stage] })
|
|
271
276
|
break
|
|
272
277
|
}
|
|
273
278
|
|
|
274
|
-
return get(URL, { signal }).then((response) =>
|
|
275
|
-
processCDMaterialServiceResponse(response.result, stage, queryParams.offset, queryParams.filter)
|
|
276
|
-
)
|
|
279
|
+
return get(URL, { signal }).then((response) => {
|
|
280
|
+
return processCDMaterialServiceResponse(response.result, stage, queryParams.offset, queryParams.filter)
|
|
281
|
+
})
|
|
277
282
|
}
|
|
278
283
|
|
|
279
284
|
export function extractImage(image: string): string {
|
|
@@ -282,25 +287,25 @@ export function extractImage(image: string): string {
|
|
|
282
287
|
|
|
283
288
|
export function createGitCommitUrl(url: string, revision: string): string {
|
|
284
289
|
if (!url || !revision) {
|
|
285
|
-
return
|
|
290
|
+
return "NA"
|
|
286
291
|
}
|
|
287
|
-
if (url.indexOf(
|
|
288
|
-
|
|
292
|
+
if (url.indexOf("gitlab") > 0 || url.indexOf("github") > 0 || url.indexOf("azure") > 0) {
|
|
293
|
+
let urlpart = url.split("@")
|
|
289
294
|
if (urlpart.length > 1) {
|
|
290
|
-
return
|
|
295
|
+
return "https://" + urlpart[1].split(".git")[0] + "/commit/" + revision
|
|
291
296
|
}
|
|
292
297
|
if (urlpart.length == 1) {
|
|
293
|
-
return
|
|
298
|
+
return urlpart[0].split(".git")[0] + "/commit/" + revision
|
|
294
299
|
}
|
|
295
300
|
}
|
|
296
|
-
if (url.indexOf(
|
|
297
|
-
|
|
301
|
+
if (url.indexOf("bitbucket") > 0) {
|
|
302
|
+
let urlpart = url.split("@")
|
|
298
303
|
if (urlpart.length > 1) {
|
|
299
|
-
return
|
|
304
|
+
return "https://" + urlpart[1].split(".git")[0] + "/commits/" + revision
|
|
300
305
|
}
|
|
301
306
|
if (urlpart.length == 1) {
|
|
302
|
-
return
|
|
307
|
+
return urlpart[0].split(".git")[0] + "/commits/" + revision
|
|
303
308
|
}
|
|
304
309
|
}
|
|
305
|
-
return
|
|
310
|
+
return "NA"
|
|
306
311
|
}
|