This is an automated email from the ASF dual-hosted git repository.
klesh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git
The following commit(s) were added to refs/heads/main by this push:
new f35510da `hotfix` `v0.12.0` config-ui: fix jira blanking on tab-switch
+ entity restrictions (#2586)
f35510da is described below
commit f35510da2b14d12bfce68fd6cd1abf72a5ea8d55
Author: Julien Chinapen <[email protected]>
AuthorDate: Mon Jul 25 02:15:00 2022 -0400
`hotfix` `v0.12.0` config-ui: fix jira blanking on tab-switch + entity
restrictions (#2586)
* fix: enable data entity transform restrictions
* fix: restrict next if offline connection selected
---
.../src/components/blueprints/ConnectionTabs.jsx | 2 +-
.../blueprints/ProviderTransformationSettings.jsx | 24 +-
.../blueprints/create-workflow/DataConnections.jsx | 116 ++--
.../create-workflow/DataTransformations.jsx | 8 +-
config-ui/src/data/BlueprintWorkflow.js | 16 -
config-ui/src/data/Providers.js | 4 +-
config-ui/src/images/integrations/github.svg | 2 +-
config-ui/src/images/integrations/gitlab.svg | 2 +-
config-ui/src/images/integrations/jenkins.svg | 8 +-
config-ui/src/images/integrations/jira.svg | 4 +-
.../src/pages/blueprints/create-blueprint.jsx | 19 +-
.../pages/configure/connections/ConnectionForm.jsx | 2 +-
config-ui/src/pages/configure/settings/github.jsx | 426 ++++++------
config-ui/src/pages/configure/settings/gitlab.jsx | 2 +
config-ui/src/pages/configure/settings/jenkins.jsx | 3 +-
config-ui/src/pages/configure/settings/jira.jsx | 738 +++++++++++----------
16 files changed, 709 insertions(+), 667 deletions(-)
diff --git a/config-ui/src/components/blueprints/ConnectionTabs.jsx
b/config-ui/src/components/blueprints/ConnectionTabs.jsx
index eaa95cd2..d0d7e5eb 100644
--- a/config-ui/src/components/blueprints/ConnectionTabs.jsx
+++ b/config-ui/src/components/blueprints/ConnectionTabs.jsx
@@ -56,7 +56,7 @@ const ConnectionTabs = (props) => {
<Icon
icon='warning-sign'
size={10}
- color={Colors.ORANGE4}
+ color={Colors.GRAY4}
/>
</span>
</>
diff --git
a/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
b/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
index c87c77b5..d92dbaa0 100644
--- a/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
+++ b/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
@@ -32,12 +32,13 @@ import GithubSettings from
'@/pages/configure/settings/github'
const ProviderTransformationSettings = (props) => {
const {
provider,
- configuredConnection,
+ connection,
configuredProject,
configuredBoard,
transformation = {},
newTransformation = {},
boards = [],
+ entities = {},
issueTypes = [],
fields = [],
onSettingsChange = () => {},
@@ -48,21 +49,16 @@ const ProviderTransformationSettings = (props) => {
isFetchingJIRA = false
} = props
- useEffect(() => {
- console.log('>>> newTransformation?', newTransformation)
- }, [newTransformation])
- // }, [transformation, boards, issueTypes, fields, configuredBoard])
-
return (
<div className='transformation-settings' data-provider={provider?.id}>
{provider?.id === Providers.GITHUB && (
<GithubSettings
provider={provider}
- connection={configuredConnection}
+ connection={connection}
configuredProject={configuredProject}
transformation={transformation}
onSettingsChange={onSettingsChange}
- entity={DataEntityTypes.TICKET}
+ entities={entities[connection?.id]}
isSaving={isSaving}
isSavingConnection={isSavingConnection}
/>
@@ -71,11 +67,11 @@ const ProviderTransformationSettings = (props) => {
{provider?.id === Providers.GITLAB && (
<GitlabSettings
provider={provider}
- connection={configuredConnection}
+ connection={connection}
configuredProject={configuredProject}
transformation={transformation}
onSettingsChange={onSettingsChange}
- entity={DataEntityTypes.TICKET}
+ entities={entities[connection?.id]}
isSaving={isSaving}
isSavingConnection={isSavingConnection}
/>
@@ -84,7 +80,7 @@ const ProviderTransformationSettings = (props) => {
{provider?.id === Providers.JIRA && (
<JiraSettings
provider={provider}
- connection={configuredConnection}
+ connection={connection}
configuredBoard={configuredBoard}
boards={boards}
issueTypes={issueTypes}
@@ -92,7 +88,7 @@ const ProviderTransformationSettings = (props) => {
transformation={transformation}
newTransformation={newTransformation}
onSettingsChange={onSettingsChange}
- entity={DataEntityTypes.TICKET}
+ entities={entities[connection?.id]}
isSaving={isSaving}
isSavingConnection={isSavingConnection}
jiraProxyError={jiraProxyError}
@@ -103,10 +99,10 @@ const ProviderTransformationSettings = (props) => {
{provider?.id === Providers.JENKINS && (
<JenkinsSettings
provider={provider}
- connection={configuredConnection}
+ connection={connection}
transformation={transformation}
onSettingsChange={onSettingsChange}
- entity={DataEntityTypes.TICKET}
+ entities={entities[connection?.id]}
isSaving={isSaving}
isSavingConnection={isSavingConnection}
/>
diff --git
a/config-ui/src/components/blueprints/create-workflow/DataConnections.jsx
b/config-ui/src/components/blueprints/create-workflow/DataConnections.jsx
index f49e1f72..44cd0772 100644
--- a/config-ui/src/components/blueprints/create-workflow/DataConnections.jsx
+++ b/config-ui/src/components/blueprints/create-workflow/DataConnections.jsx
@@ -112,70 +112,78 @@ const DataConnections = (props) => {
disabled={isSaving}
/>
{blueprintConnections.length > 0 && (
- <Card
- className='selected-connections-list'
- elevation={Elevation.ZERO}
- style={{ padding: 0, marginTop: '10px' }}
- >
- {blueprintConnections.map((bC, bcIdx) => (
- <div
- className='connection-entry'
- key={`connection-row-key-${bcIdx}`}
- style={{
- display: 'flex',
- width: '100%',
- height: '32px',
- lineHeight: '100%',
- justifyContent: 'space-between',
- // margin: '8px 0',
- padding: '8px 12px',
- borderBottom: '1px solid #f0f0f0',
- }}
- >
- <div>
- <div className='connection-name' style={{ fontWeight: 600 }}>
- {bC.title}
- </div>
- </div>
+ <>
+ <Card
+ className='selected-connections-list'
+ elevation={Elevation.ZERO}
+ style={{ padding: 0, marginTop: '10px' }}
+ >
+ {blueprintConnections.map((bC, bcIdx) => (
<div
+ className='connection-entry'
+ key={`connection-row-key-${bcIdx}`}
style={{
display: 'flex',
- alignContent: 'center',
+ width: '100%',
+ height: '32px',
+ lineHeight: '100%',
+ justifyContent: 'space-between',
+ // margin: '8px 0',
+ padding: '8px 12px',
+ borderBottom: '1px solid #f0f0f0',
}}
>
- <div
- className='connection-status'
- style={{ textTransform: 'capitalize' }}
- >
- {(bC.statusResponse &&
displayOnlineStatus(bC.statusResponse)) || <><span style={{ display:
'inline-block', marginRight: '5px', width: '12px', height: '12px', float:
'left' }}><Spinner size={12} color={Colors.GRAY3} /></span> Testing</>}
+ <div>
+ <div className='connection-name' style={{ display: 'flex',
alignItems: 'center', fontWeight: 600 }}>
+ {bC.title}
+ </div>
</div>
<div
- className='connection-actions'
- style={{ paddingLeft: '20px' }}
+ style={{
+ display: 'flex',
+ alignContent: 'center',
+ alignItems: 'center'
+ }}
>
- <Button
- className='connection-action-settings'
- icon={
- <Icon
- icon='cog'
- size={12}
- color={Colors.BLUE4}
- onClick={() => manageConnection(bC)}
- />
- }
- color={Colors.BLUE3}
- small
- minimal
- style={{
- minWidth: '18px',
- minHeight: '18px',
- }}
- />
+ <div
+ className='connection-status'
+ style={{ textTransform: 'capitalize' }}
+ >
+ {(bC.statusResponse &&
displayOnlineStatus(bC.statusResponse)) || <><span style={{ display:
'inline-block', marginRight: '5px', width: '12px', height: '12px', float:
'left' }}><Spinner size={12} color={Colors.GRAY3} /></span> Testing</>}
+ </div>
+ <div
+ className='connection-actions'
+ style={{ paddingLeft: '20px' }}
+ >
+ <Button
+ className='connection-action-settings'
+ icon={
+ <Icon
+ icon='cog'
+ size={12}
+ color={Colors.BLUE4}
+ onClick={() => manageConnection(bC)}
+ />
+ }
+ color={Colors.BLUE3}
+ small
+ minimal
+ style={{
+ minWidth: '18px',
+ minHeight: '18px',
+ }}
+ />
+ </div>
</div>
</div>
- </div>
- ))}
- </Card>
+ ))}
+ </Card>
+ {blueprintConnections.some(c => c.status !== 200) && (
+ <p style={{ margin: '10px 0', color: Colors.RED4 }}>
+ Please fix the offline connection.
+ </p>
+ )}
+ </>
)}
</Card>
diff --git
a/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
b/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
index ade20daa..05194e06 100644
---
a/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
+++
b/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
@@ -35,6 +35,9 @@ import {
ConnectionStatusLabels,
} from '@/data/Providers'
import { DataEntities, DataEntityTypes } from '@/data/DataEntities'
+import {
+ DEFAULT_DATA_ENTITIES
+} from '@/data/BlueprintWorkflow'
import ConnectionTabs from '@/components/blueprints/ConnectionTabs'
import NoData from '@/components/NoData'
@@ -225,7 +228,7 @@ const DataTransformations = (props) => {
(dataEntities[configuredConnection.id]?.length ===
0 && <p>(No Data Entities Selected)</p>)}
{dataEntities[configuredConnection.id]?.find(
- (e) => e.value === DataEntityTypes.TICKET
+ (e) => DEFAULT_DATA_ENTITIES.some(dE => dE.value ===
e.value)
) && (
<ProviderTransformationSettings
provider={integrationsData.find(i => i.id ===
configuredConnection?.provider)}
@@ -235,6 +238,7 @@ const DataTransformations = (props) => {
issueTypes={issueTypes}
fields={fields}
boards={boards}
+ entities={dataEntities}
transformation={activeTransformation}
newTransformation={newTransformation}
setNewTransformation={setNewTransformation}
@@ -270,7 +274,7 @@ const DataTransformations = (props) => {
intent={Intent.PRIMARY}
small
outlined
- onClick={() =>
onSave(newTransformation[configuredBoard?.id], configuredBoard?.id)}
+ onClick={() => onSave()}
disabled={[Providers.GITLAB].includes(configuredConnection?.provider)}
style={{ marginLeft: '5px' }}
/>
diff --git a/config-ui/src/data/BlueprintWorkflow.js
b/config-ui/src/data/BlueprintWorkflow.js
index 314fa810..cb065880 100644
--- a/config-ui/src/data/BlueprintWorkflow.js
+++ b/config-ui/src/data/BlueprintWorkflow.js
@@ -115,22 +115,6 @@ const DEFAULT_DATA_ENTITIES = [
]
const DEFAULT_BOARDS = [
- {
- id: 1,
- name: 'scrum-lake',
- title: 'DEVLAKE BOARD',
- value: 'scrum-lake',
- type: 'scrum',
- self: 'https://your-domain.atlassian.net/rest/agile/1.0/board/1',
- },
- {
- id: 2,
- name: 'scrum-stream',
- title: 'DEVSTREAM BOARD',
- value: 'scrum-stream',
- type: 'scrum',
- self: 'https://your-domain.atlassian.net/rest/agile/1.0/board/2',
- },
]
export { WorkflowSteps, WorkflowAdvancedSteps, DEFAULT_DATA_ENTITIES,
DEFAULT_BOARDS }
diff --git a/config-ui/src/data/Providers.js b/config-ui/src/data/Providers.js
index 0174d57d..cf7b0f3c 100644
--- a/config-ui/src/data/Providers.js
+++ b/config-ui/src/data/Providers.js
@@ -214,13 +214,15 @@ const ProviderIcons = {
const ConnectionStatus = {
OFFLINE: 0,
ONLINE: 1,
- DISCONNECTED: 2
+ DISCONNECTED: 2,
+ TESTING: 3
}
const ConnectionStatusLabels = {
[ConnectionStatus.OFFLINE]: 'Offline',
[ConnectionStatus.ONLINE]: 'Online',
[ConnectionStatus.DISCONNECTED]: 'Disconnected',
+ [ConnectionStatus.TESTING]: 'Testing'
}
export {
diff --git a/config-ui/src/images/integrations/github.svg
b/config-ui/src/images/integrations/github.svg
index 989c6554..5f12876c 100644
--- a/config-ui/src/images/integrations/github.svg
+++ b/config-ui/src/images/integrations/github.svg
@@ -1,3 +1,3 @@
<svg width="100" height="100" viewBox="0 0 36 36" fill="none"
xmlns="http://www.w3.org/2000/svg">
-<path d="M18 3C9.7125 3 3 9.7125 3 18C2.9983 21.1489 3.98822 24.2184 5.82933
26.773C7.67043 29.3276 10.2692 31.2376 13.257 32.232C14.007 32.3625 14.2875
31.9125 14.2875 31.518C14.2875 31.1625 14.268 29.982 14.268 28.725C10.5 29.4195
9.525 27.807 9.225 26.9625C9.0555 26.5305 8.325 25.2 7.6875 24.843C7.1625
24.5625 6.4125 23.868 7.668 23.85C8.85 23.8305 9.693 24.9375 9.975
25.3875C11.325 27.6555 13.482 27.018 14.343 26.625C14.475 25.65 14.868 24.9945
15.3 24.6195C11.9625 24.2445 8.475 22.9 [...]
+<path d="M18 3C9.7125 3 3 9.7125 3 18C2.9983 21.1489 3.98822 24.2184 5.82933
26.773C7.67043 29.3276 10.2692 31.2376 13.257 32.232C14.007 32.3625 14.2875
31.9125 14.2875 31.518C14.2875 31.1625 14.268 29.982 14.268 28.725C10.5 29.4195
9.525 27.807 9.225 26.9625C9.0555 26.5305 8.325 25.2 7.6875 24.843C7.1625
24.5625 6.4125 23.868 7.668 23.85C8.85 23.8305 9.693 24.9375 9.975
25.3875C11.325 27.6555 13.482 27.018 14.343 26.625C14.475 25.65 14.868 24.9945
15.3 24.6195C11.9625 24.2445 8.475 22.9 [...]
</svg>
diff --git a/config-ui/src/images/integrations/gitlab.svg
b/config-ui/src/images/integrations/gitlab.svg
index a553e252..15b89f06 100644
--- a/config-ui/src/images/integrations/gitlab.svg
+++ b/config-ui/src/images/integrations/gitlab.svg
@@ -1,3 +1,3 @@
<svg width="100" height="100" viewBox="0 0 36 36" fill="none"
xmlns="http://www.w3.org/2000/svg">
-<path d="M8.80197 4.12524L12 15.0002H24L27.198 4.12524C27.2339 4.00187 27.3085
3.8933 27.4108 3.81551C27.5131 3.73772 27.6377 3.69483 27.7662 3.69315C27.8947
3.69147 28.0203 3.73109 28.1246 3.80618C28.2289 3.88126 28.3063 3.98785 28.3455
4.11024L33.588 20.4962C33.6352 20.6437 33.6356 20.8022 33.5891 20.9499C33.5426
21.0976 33.4516 21.2273 33.3285 21.3212L18 33.0002L2.66997 21.3212C2.5471
21.2272 2.45635 21.0974 2.41016 20.9497C2.36397 20.8019 2.3646 20.6436 2.41197
20.4962L7.65447 4.1102 [...]
+<path d="M8.80197 4.12524L12 15.0002H24L27.198 4.12524C27.2339 4.00187 27.3085
3.8933 27.4108 3.81551C27.5131 3.73772 27.6377 3.69483 27.7662 3.69315C27.8947
3.69147 28.0203 3.73109 28.1246 3.80618C28.2289 3.88126 28.3063 3.98785 28.3455
4.11024L33.588 20.4962C33.6352 20.6437 33.6356 20.8022 33.5891 20.9499C33.5426
21.0976 33.4516 21.2273 33.3285 21.3212L18 33.0002L2.66997 21.3212C2.5471
21.2272 2.45635 21.0974 2.41016 20.9497C2.36397 20.8019 2.3646 20.6436 2.41197
20.4962L7.65447 4.1102 [...]
</svg>
diff --git a/config-ui/src/images/integrations/jenkins.svg
b/config-ui/src/images/integrations/jenkins.svg
index ff34a1e7..53fdcea3 100644
--- a/config-ui/src/images/integrations/jenkins.svg
+++ b/config-ui/src/images/integrations/jenkins.svg
@@ -1,6 +1,6 @@
<svg width="100" height="100" viewBox="0 0 36 36" fill="none"
xmlns="http://www.w3.org/2000/svg">
-<path d="M25.2912 2.67189C23.4918 1.74972 21.1902 1 18.4387 1C5.88829 1
5.42346 9.33694 5.42346 9.33694C5.42346 9.33694 3.3992 10.0417 2.79942
13.2055C2.43206 15.1248 2.91188 16.4968 3.34672 17.284C2.92688 17.7338 2.57451
18.2662 2.30461 18.8659C1.66734 20.2829 1.5174 21.9548 1.89226 23.5817C2.26712
25.2086 3.11431 26.6256 4.28388 27.5702C5.54341 28.5899 7.08785 28.9572 8.51232
28.5899C8.5873 28.5749 8.65477 28.5524 8.72974 28.5299C11.4288 32.6159 15.5372
35 20.0131 35C27.8927 35 34.3103 [...]
-<path d="M22.0673 25.2461C23.7317 25.6809 24.9313 25.591 24.9313
25.591L24.9613 23.8666C24.9613 23.8666 24.0691 23.8891 22.4047 23.6942C20.7403
23.4992 19.1359 22.9744 19.1359 22.9744C19.1359 22.9744 19.8557 24.6763 22.0598
25.2536L22.0673 25.2461Z" fill="#ED6A45"/>
-<path d="M21.4376 27.0079C18.5961 26.3557 16.4369 22.9669 16.4369
22.9669C16.4369 22.9669 15.7322 27.4203 20.7478 29.0172C24.4215 30.1868 26.1758
26.8805 26.1758 26.8805C26.1758 26.8805 24.279 27.6602 21.4376 27.0079Z"
fill="#ED6A45"/>
-<path d="M19.3308 10.2816C19.3308 10.2816 19.4433 11.6386 20.8153
13.183C22.1873 14.7275 22.9295 14.7499 22.5022 15.6646C22.0748 16.5793 20.1705
17.0966 18.5811 16.9466C15.7547 16.6842 15.6422 15.2373 15.6422 15.2373C15.6422
15.2373 17.8014 15.4847 18.6261 15.2373C19.4508 14.9899 19.6907 14.2926 19.4508
13.7078C18.6861 11.871 19.3233 10.2816 19.3233 10.2816H19.3308Z"
fill="#ED6A45"/>
+<path d="M25.2912 2.67189C23.4918 1.74972 21.1902 1 18.4387 1C5.88829 1
5.42346 9.33694 5.42346 9.33694C5.42346 9.33694 3.3992 10.0417 2.79942
13.2055C2.43206 15.1248 2.91188 16.4968 3.34672 17.284C2.92688 17.7338 2.57451
18.2662 2.30461 18.8659C1.66734 20.2829 1.5174 21.9548 1.89226 23.5817C2.26712
25.2086 3.11431 26.6256 4.28388 27.5702C5.54341 28.5899 7.08785 28.9572 8.51232
28.5899C8.5873 28.5749 8.65477 28.5524 8.72974 28.5299C11.4288 32.6159 15.5372
35 20.0131 35C27.8927 35 34.3103 [...]
+<path d="M22.0673 25.2461C23.7317 25.6809 24.9313 25.591 24.9313
25.591L24.9613 23.8666C24.9613 23.8666 24.0691 23.8891 22.4047 23.6942C20.7403
23.4992 19.1359 22.9744 19.1359 22.9744C19.1359 22.9744 19.8557 24.6763 22.0598
25.2536L22.0673 25.2461Z" fill="#7497F7"/>
+<path d="M21.4376 27.0079C18.5961 26.3557 16.4369 22.9669 16.4369
22.9669C16.4369 22.9669 15.7322 27.4203 20.7478 29.0172C24.4215 30.1868 26.1758
26.8805 26.1758 26.8805C26.1758 26.8805 24.279 27.6602 21.4376 27.0079Z"
fill="#7497F7"/>
+<path d="M19.3308 10.2816C19.3308 10.2816 19.4433 11.6386 20.8153
13.183C22.1873 14.7275 22.9295 14.7499 22.5022 15.6646C22.0748 16.5793 20.1705
17.0966 18.5811 16.9466C15.7547 16.6842 15.6422 15.2373 15.6422 15.2373C15.6422
15.2373 17.8014 15.4847 18.6261 15.2373C19.4508 14.9899 19.6907 14.2926 19.4508
13.7078C18.6861 11.871 19.3233 10.2816 19.3233 10.2816H19.3308Z"
fill="#7497F7"/>
</svg>
diff --git a/config-ui/src/images/integrations/jira.svg
b/config-ui/src/images/integrations/jira.svg
index d656df7f..06d05042 100644
--- a/config-ui/src/images/integrations/jira.svg
+++ b/config-ui/src/images/integrations/jira.svg
@@ -1,4 +1,4 @@
<svg width="100" height="100" viewBox="0 0 36 36" fill="none"
xmlns="http://www.w3.org/2000/svg">
-<path d="M16.5952 12.2857L10.881 18L18.0873 25.2064C21.0714 28.1905 21.0714
33.0238 18.0873 36L3.35714 21.2698C1.54762 19.4603 1.54762 16.5317 3.35714
14.7302L13.8095 4.26984C13.4762 7.11905 14.4048 10.0952 16.5952
12.2778V12.2857Z" fill="#ED6A45"/>
-<path d="M19.5714 23.7143L25.2857 18L18.0794 10.7937C15.0952 7.80952 15.0952
2.97619 18.0794 0L32.8095 14.7302C34.6191 16.5397 34.6191 19.4683 32.8095
21.2698L22.3571 31.7222C22.6905 28.873 21.7619 25.8968 19.5714 23.7143Z"
fill="#ED6A45"/>
+<path d="M16.5952 12.2857L10.881 18L18.0873 25.2064C21.0714 28.1905 21.0714
33.0238 18.0873 36L3.35714 21.2698C1.54762 19.4603 1.54762 16.5317 3.35714
14.7302L13.8095 4.26984C13.4762 7.11905 14.4048 10.0952 16.5952
12.2778V12.2857Z" fill="#7497F7"/>
+<path d="M19.5714 23.7143L25.2857 18L18.0794 10.7937C15.0952 7.80952 15.0952
2.97619 18.0794 0L32.8095 14.7302C34.6191 16.5397 34.6191 19.4683 32.8095
21.2698L22.3571 31.7222C22.6905 28.873 21.7619 25.8968 19.5714 23.7143Z"
fill="#7497F7"/>
</svg>
diff --git a/config-ui/src/pages/blueprints/create-blueprint.jsx
b/config-ui/src/pages/blueprints/create-blueprint.jsx
index 81975560..85b86745 100644
--- a/config-ui/src/pages/blueprints/create-blueprint.jsx
+++ b/config-ui/src/pages/blueprints/create-blueprint.jsx
@@ -286,6 +286,7 @@ const CreateBlueprint = (props) => {
errors: connectionErrors,
isSaving: isSavingConnection,
isTesting: isTestingConnection,
+ isFetching: isFetchingConnection,
showError,
testStatus,
name: connectionName,
@@ -448,7 +449,7 @@ const CreateBlueprint = (props) => {
setActiveConnection,
setAllTestResponses,
setInitialTokenStore,
- setSaveConnectionComplete,
+ // setSaveConnectionComplete,
setTestResponse,
setTestStatus
])
@@ -583,10 +584,12 @@ const CreateBlueprint = (props) => {
const addProjectTransformation = useCallback((project) => {
setConfiguredProject(project)
+ ToastNotification.clear()
}, [])
const addBoardTransformation = useCallback((board) => {
setConfiguredBoard(board)
+ ToastNotification.clear()
}, [])
const addConnection = useCallback(() => {
@@ -688,6 +691,7 @@ const CreateBlueprint = (props) => {
status:
ConnectionStatusLabels[c.status] ||
ConnectionStatusLabels[ConnectionStatus.OFFLINE],
+ statusResponse: null,
provider: c.provider,
plugin: c.provider,
}))
@@ -1032,7 +1036,7 @@ const CreateBlueprint = (props) => {
blueprintConnections,
testSelectedConnections,
handleConnectionDialogClose,
- saveConnectionComplete
+ setSaveConnectionComplete
])
useEffect(() => {
@@ -1044,6 +1048,15 @@ const CreateBlueprint = (props) => {
})))
}, [onlineStatus, blueprintConnections])
+ useEffect(() => {
+ setConnectionsList(cList => cList.map((c, cIdx) => ({
+ ...c,
+ statusResponse: dataConnections.find(dC => dC.id === c.id && dC.provider
=== c.provider),
+ status: dataConnections.find(dC => dC.id === c.id && dC.provider ===
c.provider)?.status
+ })))
+ setCanAdvanceNext(dataConnections.every(dC => dC.status === 200))
+ }, [dataConnections])
+
return (
<>
<div className='container'>
@@ -1210,7 +1223,7 @@ const CreateBlueprint = (props) => {
onPrev={prevStep}
onSave={handleBlueprintSave}
onSaveAndRun={handleBlueprintSaveAndRun}
- isLoading={isSaving}
+ isLoading={isSaving || isFetchingJIRA || isFetchingConnection ||
isTestingConnection}
isValid={advancedMode ? isValidBlueprint && isValidPipeline :
isValidBlueprint}
canGoNext={canAdvanceNext}
/>
diff --git a/config-ui/src/pages/configure/connections/ConnectionForm.jsx
b/config-ui/src/pages/configure/connections/ConnectionForm.jsx
index ef482a99..d9ffa847 100644
--- a/config-ui/src/pages/configure/connections/ConnectionForm.jsx
+++ b/config-ui/src/pages/configure/connections/ConnectionForm.jsx
@@ -309,7 +309,7 @@ export default function ConnectionForm (props) {
<InputGroup
id='connection-name'
autoComplete='false'
- autoFocus='true'
+ autoFocus={true}
inputRef={connectionNameRef}
disabled={isTesting || isSaving || isLocked}
// readOnly={[Providers.JENKINS].includes(activeProvider.id)}
diff --git a/config-ui/src/pages/configure/settings/github.jsx
b/config-ui/src/pages/configure/settings/github.jsx
index 95ab8e46..b60bf47a 100644
--- a/config-ui/src/pages/configure/settings/github.jsx
+++ b/config-ui/src/pages/configure/settings/github.jsx
@@ -17,6 +17,7 @@
*/
import React, { useEffect, useState, useCallback } from 'react'
import { FormGroup, Checkbox, InputGroup, NumericInput, Tag } from
'@blueprintjs/core'
+import { DataEntityTypes } from '@/data/DataEntities'
import '@/styles/integration.scss'
import '@/styles/connections.scss'
@@ -25,6 +26,7 @@ export default function GithubSettings (props) {
const {
// eslint-disable-next-line no-unused-vars
connection,
+ entities = [],
transformation = {},
isSaving,
isSavingConnection,
@@ -44,7 +46,7 @@ export default function GithubSettings (props) {
const handleAdditionalSettings = useCallback((setting) => {
setEnableAdditionalCalculations(setting)
onSettingsChange({ refdiff: setting ? { tagsOrder: '', tagsPattern: '',
tagsLimit: 10, } : null }, configuredProject)
- }, [setEnableAdditionalCalculations, onSettingsChange])
+ }, [setEnableAdditionalCalculations, configuredProject, onSettingsChange])
useEffect(() => {
console.log('>>>> TRANSFORMATION SETTINGS OBJECT....', transformation)
@@ -60,243 +62,259 @@ export default function GithubSettings (props) {
return (
<>
- <h5>Issue Tracking{' '} <Tag
className='bp3-form-helper-text'>RegExp</Tag></h5>
- <p className=''>Map your issue labels with each category
- to view corresponding metrics in the
- dashboard.
- </p>
- <div style={{ }}>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Severity'
- labelFor='github-issue-severity'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-severity'
- placeholder='severity/(.*)$'
- // defaultValue={transformation?.issueSeverity}
- value={transformation?.issueSeverity}
- onChange={(e) => onSettingsChange({ issueSeverity:
e.target.value }, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- autoFocus={true}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Component'
- labelFor='github-issue-component'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-component'
- placeholder='component/(.*)$'
- value={transformation?.issueComponent}
- onChange={(e) => onSettingsChange({ issueComponent:
e.target.value }, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Priority'
- labelFor='github-issue-priority'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-priority'
- placeholder='(highest|high|medium|low)$'
- value={transformation?.issuePriority}
- onChange={(e) => onSettingsChange({ issuePriority:
e.target.value }, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Type/Requirement'
- labelFor='github-issue-requirement'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-requirement'
- placeholder='(feat|feature|proposal|requirement)$'
- value={transformation?.issueTypeRequirement}
- onChange={(e) => onSettingsChange({ issueTypeRequirement:
e.target.value }, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Type/Bug'
- labelFor='github-issue-bug'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-bug'
- placeholder='(bug|broken)$'
- value={transformation?.issueTypeBug}
- onChange={(e) => onSettingsChange({ issueTypeBug: e.target.value
}, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Type/Incident'
- labelFor='github-issue-incident'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-issue-incident'
- placeholder='(incident|p0|p1|p2)$'
- value={transformation?.issueTypeIncident}
- onChange={(e) => onSettingsChange({ issueTypeIncident:
e.target.value }, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- </div>
-
- <h5>Code Review{' '} <Tag
className='bp3-form-helper-text'>RegExp</Tag></h5>
- <p className=''>Map your pull requests labels with each category to view
corresponding metrics in the dashboard.</p>
-
- <div style={{ }}>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Type'
- labelFor='github-pr-type'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-pr-type'
- placeholder='type/(.*)$'
- value={transformation?.prType}
- onChange={(e) => onSettingsChange({ prType: e.target.value },
configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- <div className='formContainer'>
- <FormGroup
- disabled={isSaving || isSavingConnection}
- inline={true}
- label='Component'
- labelFor='github-pr-component'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <InputGroup
- id='github-pr-type'
- placeholder='component/(.*)$'
- value={transformation?.prComponent}
- onChange={(e) => onSettingsChange({ prComponent: e.target.value
}, configuredProject)}
- disabled={isSaving || isSavingConnection}
- className='input'
- maxLength={255}
- />
- </FormGroup>
- </div>
- </div>
-
- <h5>Additional Settings</h5>
- <div>
- <Checkbox checked={enableAdditionalCalculations} label='Enable
calculation of commit and issue difference' onChange={(e) =>
handleAdditionalSettings(!enableAdditionalCalculations)} />
- {enableAdditionalCalculations && (
- <>
- <div className='additional-settings-refdiff'>
+ {entities.some(e => e.value === DataEntityTypes.TICKET) && (
+ <><h5>Issue Tracking{' '} <Tag
className='bp3-form-helper-text'>RegExp</Tag></h5>
+ <p className=''>Map your issue labels with each category
+ to view corresponding metrics in the
+ dashboard.
+ </p>
+ <div style={{ }}>
+ <div className='formContainer'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Severity'
+ labelFor='github-issue-severity'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='github-issue-severity'
+ placeholder='severity/(.*)$'
+ // defaultValue={transformation?.issueSeverity}
+ value={transformation?.issueSeverity}
+ onChange={(e) => onSettingsChange({ issueSeverity:
e.target.value }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ autoFocus={true}
+ />
+ </FormGroup>
+ </div>
+ <div className='formContainer'>
<FormGroup
disabled={isSaving || isSavingConnection}
inline={true}
- label='Tags Limit'
+ label='Component'
+ labelFor='github-issue-component'
className='formGroup'
contentClassName='formGroupContent'
>
- <NumericInput
- id='refdiff-tags-limit'
- fill={true}
- placeholder='10'
- allowNumericCharactersOnly={true}
- onValueChange={(tagsLimitNumeric) => onSettingsChange({
refdiff: { ...transformation?.refdiff, tagsLimit: tagsLimitNumeric } },
configuredProject)}
- value={transformation?.refdiff?.tagsLimit}
+ <InputGroup
+ id='github-issue-component'
+ placeholder='component/(.*)$'
+ value={transformation?.issueComponent}
+ onChange={(e) => onSettingsChange({ issueComponent:
e.target.value }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
/>
</FormGroup>
+ </div>
+ <div className='formContainer'>
<FormGroup
disabled={isSaving || isSavingConnection}
inline={true}
- label='Tags Pattern'
+ label='Priority'
+ labelFor='github-issue-priority'
className='formGroup'
contentClassName='formGroupContent'
>
<InputGroup
- id='refdiff-tags-pattern'
- placeholder='(regex)$'
- value={transformation?.refdiff?.tagsPattern}
- onChange={(e) => onSettingsChange({ refdiff: {
...transformation?.refdiff, tagsPattern: e.target.value } }, configuredProject)}
+ id='github-issue-priority'
+ placeholder='(highest|high|medium|low)$'
+ value={transformation?.issuePriority}
+ onChange={(e) => onSettingsChange({ issuePriority:
e.target.value }, configuredProject)}
disabled={isSaving || isSavingConnection}
className='input'
maxLength={255}
/>
</FormGroup>
+ </div>
+ <div className='formContainer'>
<FormGroup
disabled={isSaving || isSavingConnection}
inline={true}
- label='Tags Order'
+ label='Type/Requirement'
+ labelFor='github-issue-requirement'
className='formGroup'
contentClassName='formGroupContent'
>
<InputGroup
- id='refdiff-tags-order'
- placeholder='reverse semver'
- value={transformation?.refdiff?.tagsOrder}
- onChange={(e) => onSettingsChange({ refdiff: {
...transformation?.refdiff, tagsOrder: e.target.value } }, configuredProject)}
+ id='github-issue-requirement'
+ placeholder='(feat|feature|proposal|requirement)$'
+ value={transformation?.issueTypeRequirement}
+ onChange={(e) => onSettingsChange({ issueTypeRequirement:
e.target.value }, configuredProject)}
disabled={isSaving || isSavingConnection}
className='input'
maxLength={255}
/>
</FormGroup>
</div>
+ <div className='formContainer'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Type/Bug'
+ labelFor='github-issue-bug'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='github-issue-bug'
+ placeholder='(bug|broken)$'
+ value={transformation?.issueTypeBug}
+ onChange={(e) => onSettingsChange({ issueTypeBug:
e.target.value }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ </div>
+ <div className='formContainer'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Type/Incident'
+ labelFor='github-issue-incident'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='github-issue-incident'
+ placeholder='(incident|p0|p1|p2)$'
+ value={transformation?.issueTypeIncident}
+ onChange={(e) => onSettingsChange({ issueTypeIncident:
e.target.value }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ </div>
+ </div>
+ </>
+ )}
+
+ {entities.some(e => e.value === DataEntityTypes.CODE_REVIEW) && (
+ <><h5>Code Review{' '} <Tag
className='bp3-form-helper-text'>RegExp</Tag></h5>
+ <p className=''>Map your pull requests labels with each category to
view corresponding metrics in the dashboard.</p>
+
+ <div style={{ }}>
+ <div className='formContainer'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Type'
+ labelFor='github-pr-type'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='github-pr-type'
+ placeholder='type/(.*)$'
+ value={transformation?.prType}
+ onChange={(e) => onSettingsChange({ prType: e.target.value
}, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ </div>
+ <div className='formContainer'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Component'
+ labelFor='github-pr-component'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='github-pr-type'
+ placeholder='component/(.*)$'
+ value={transformation?.prComponent}
+ onChange={(e) => onSettingsChange({ prComponent:
e.target.value }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ </div>
+ </div>
+
+ <h5>Additional Settings</h5>
+ <div>
+ <Checkbox checked={enableAdditionalCalculations} label='Enable
calculation of commit and issue difference' onChange={(e) =>
handleAdditionalSettings(!enableAdditionalCalculations)} />
+ {enableAdditionalCalculations && (
+ <>
+ <div className='additional-settings-refdiff'>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Tags Limit'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <NumericInput
+ id='refdiff-tags-limit'
+ fill={true}
+ placeholder='10'
+ allowNumericCharactersOnly={true}
+ onValueChange={(tagsLimitNumeric) => onSettingsChange({
refdiff: { ...transformation?.refdiff, tagsLimit: tagsLimitNumeric } },
configuredProject)}
+ value={transformation?.refdiff?.tagsLimit}
+ />
+ </FormGroup>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Tags Pattern'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='refdiff-tags-pattern'
+ placeholder='(regex)$'
+ value={transformation?.refdiff?.tagsPattern}
+ onChange={(e) => onSettingsChange({ refdiff: {
...transformation?.refdiff, tagsPattern: e.target.value } }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ <FormGroup
+ disabled={isSaving || isSavingConnection}
+ inline={true}
+ label='Tags Order'
+ className='formGroup'
+ contentClassName='formGroupContent'
+ >
+ <InputGroup
+ id='refdiff-tags-order'
+ placeholder='reverse semver'
+ value={transformation?.refdiff?.tagsOrder}
+ onChange={(e) => onSettingsChange({ refdiff: {
...transformation?.refdiff, tagsOrder: e.target.value } }, configuredProject)}
+ disabled={isSaving || isSavingConnection}
+ className='input'
+ maxLength={255}
+ />
+ </FormGroup>
+ </div>
+
+ </>
+ )}
+ </div>
+ </>
+ )}
+
+ {(entities?.length === 0 || entities.some(e => e.value ===
DataEntityTypes.CROSSDOMAIN)) && (
+ <div className='headlineContainer'>
+ <h5>No Data Entities</h5>
+ <p className='description'>
+ You have not selected entities that require configuration.
+ </p>
+ </div>
+ )}
- </>
- )}
- </div>
</>
)
}
diff --git a/config-ui/src/pages/configure/settings/gitlab.jsx
b/config-ui/src/pages/configure/settings/gitlab.jsx
index c43d49b2..7f479047 100644
--- a/config-ui/src/pages/configure/settings/gitlab.jsx
+++ b/config-ui/src/pages/configure/settings/gitlab.jsx
@@ -17,6 +17,7 @@
*/
import React, { useEffect } from 'react'
import { useHistory } from 'react-router-dom'
+import { DataEntityTypes } from '@/data/DataEntities'
import '@/styles/integration.scss'
import '@/styles/connections.scss'
@@ -24,6 +25,7 @@ import '@/styles/connections.scss'
export default function GitlabSettings (props) {
const {
connection,
+ entities = [],
// eslint-disable-next-line max-len
transformation = {},
provider,
diff --git a/config-ui/src/pages/configure/settings/jenkins.jsx
b/config-ui/src/pages/configure/settings/jenkins.jsx
index 873ed364..ef027770 100644
--- a/config-ui/src/pages/configure/settings/jenkins.jsx
+++ b/config-ui/src/pages/configure/settings/jenkins.jsx
@@ -20,12 +20,13 @@ import {
useParams,
useHistory
} from 'react-router-dom'
+import { DataEntityTypes } from '@/data/DataEntities'
import '@/styles/integration.scss'
import '@/styles/connections.scss'
export default function JenkinsSettings (props) {
- const { provider, onSettingsChange = () => {} } = props
+ const { provider, connection, entities = [], onSettingsChange = () => {} } =
props
const history = useHistory()
const { providerId, connectionId } = useParams()
diff --git a/config-ui/src/pages/configure/settings/jira.jsx
b/config-ui/src/pages/configure/settings/jira.jsx
index bb816b42..bba1fb94 100644
--- a/config-ui/src/pages/configure/settings/jira.jsx
+++ b/config-ui/src/pages/configure/settings/jira.jsx
@@ -30,6 +30,7 @@ import {
Tag,
} from '@blueprintjs/core'
import { MultiSelect, Select } from '@blueprintjs/select'
+import { DataEntityTypes } from '@/data/DataEntities'
import '@/styles/integration.scss'
import '@/styles/connections.scss'
@@ -53,6 +54,7 @@ const createTypeMapObject = (customType, standardType) => {
export default function JiraSettings (props) {
const {
connection,
+ entities = [],
configuredBoard,
// eslint-disable-next-line no-unused-vars
configuredProject,
@@ -83,9 +85,9 @@ export default function JiraSettings (props) {
// eslint-disable-next-line no-unused-vars
const [remoteLinkCommitSha, setRemoteLinkCommitSha] = useState('')
- const [requirementTags, setRequirementTags] =
useState([...transformation?.requirementTags])
- const [bugTags, setBugTags] = useState([...transformation?.bugTags])
- const [incidentTags, setIncidentTags] =
useState([...transformation?.incidentTags])
+ const [requirementTags, setRequirementTags] =
useState(Array.isArray(transformation?.requirementTags) ?
[...transformation?.requirementTags] : [])
+ const [bugTags, setBugTags] =
useState(Array.isArray(transformation?.bugTags) ? [...transformation?.bugTags]
: [])
+ const [incidentTags, setIncidentTags] =
useState(Array.isArray(transformation?.incidentTags) ?
[...transformation?.incidentTags] : [])
const [requirementTagsList, setRequirementTagsList] = useState([])
const [bugTagsList, setBugTagsList] = useState([])
@@ -175,384 +177,396 @@ export default function JiraSettings (props) {
return (
<>
- <h5>Issue Tracking</h5>
- <p className=''>Map your issue labels with each category
- to view corresponding metrics in the
- dashboard.
- </p>
+ {entities.some(e => e.value === DataEntityTypes.TICKET) && (
+ <><h5>Issue Tracking</h5>
+ <p className=''>Map your issue labels with each category
+ to view corresponding metrics in the
+ dashboard.
+ </p>
- <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
- <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
- <label>Requirement</label>
- </div>
- <div className='issue-type-multiselect-selector' style={{ minWidth:
'200px', width: '100%' }}>
- <MultiSelect
- disabled={isSaving}
- resetOnSelect={true}
- placeholder='Select...'
- popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true, fill: true, style: { width:
'100%' } }}
- className='multiselector-requirement-type'
- inline={true}
- fill={true}
- items={requirementTagsList}
- selectedItems={requirementTags}
- activeItem={null}
- itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
- itemRenderer={(item, { handleClick, modifiers }) => (
- <MenuItem
- active={modifiers.active || requirementTags?.includes(item)}
- disabled={requirementTags?.includes(item)}
- key={item.value}
- label={<span style={{ marginLeft: '20px' }}>{item.description
|| item.value}</span>}
- onClick={handleClick}
- text={requirementTags?.includes(item)
- ? (
- <>
- <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
- </>
- )
- : (
- <span style={{ fontWeight: 700 }}>
- <img src={item.iconUrl} width={12} height={12} />
{item.title}
- </span>
- )}
- style={{ marginBottom: '2px', fontWeight:
requirementTags?.includes(item) ? 700 : 'normal' }}
+ <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
+ <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
+ <label>Requirement</label>
+ </div>
+ <div className='issue-type-multiselect-selector' style={{
minWidth: '200px', width: '100%' }}>
+ <MultiSelect
+ disabled={isSaving}
+ resetOnSelect={true}
+ placeholder='Select...'
+ popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true, fill: true, style: { width:
'100%' } }}
+ className='multiselector-requirement-type'
+ inline={true}
+ fill={true}
+ items={requirementTagsList}
+ selectedItems={requirementTags}
+ activeItem={null}
+ itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
+ itemRenderer={(item, { handleClick, modifiers }) => (
+ <MenuItem
+ active={modifiers.active ||
requirementTags?.includes(item)}
+ disabled={requirementTags?.includes(item)}
+ key={item.value}
+ label={<span style={{ marginLeft: '20px'
}}>{item.description || item.value}</span>}
+ onClick={handleClick}
+ text={requirementTags?.includes(item)
+ ? (
+ <>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
+ </>
+ )
+ : (
+ <span style={{ fontWeight: 700 }}>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title}
+ </span>
+ )}
+ style={{ marginBottom: '2px', fontWeight:
requirementTags?.includes(item) ? 700 : 'normal' }}
+ />
+ )}
+ tagRenderer={(item) => item.title}
+ tagInputProps={{
+ tagProps: {
+ intent: Intent.NONE,
+ color: Colors.RED3,
+ minimal: true
+ },
+ }}
+ noResults={<MenuItem disabled={true} text='No results.' />}
+ onRemove={(item) => {
+ setRequirementTags((rT) => rT.filter(t => t.id !== item.id))
+ }}
+ onItemSelect={(item) => {
+ setRequirementTags((rT) => !rT.includes(item) ? [...rT,
item] : [...rT])
+ }}
/>
- )}
- tagRenderer={(item) => item.title}
- tagInputProps={{
- tagProps: {
- intent: Intent.NONE,
- color: Colors.RED3,
- minimal: true
- },
- }}
- noResults={<MenuItem disabled={true} text='No results.' />}
- onRemove={(item) => {
- setRequirementTags((rT) => rT.filter(t => t.id !== item.id))
- }}
- onItemSelect={(item) => {
- setRequirementTags((rT) => !rT.includes(item) ? [...rT, item] :
[...rT])
- }}
- />
- </div>
- <div className='multiselect-clear-action' style={{ marginLeft: '0' }}>
- <Button
- icon='eraser'
- disabled={requirementTags?.length === 0 || isSaving}
- intent={Intent.NONE} minimal={false} onClick={() =>
setRequirementTags([])}
- style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
- />
- </div>
- </div>
+ </div>
+ <div className='multiselect-clear-action' style={{ marginLeft: '0'
}}>
+ <Button
+ icon='eraser'
+ disabled={requirementTags?.length === 0 || isSaving}
+ intent={Intent.NONE} minimal={false} onClick={() =>
setRequirementTags([])}
+ style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
+ />
+ </div>
+ </div>
- <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
- <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
- <label>Bug</label>
- </div>
- <div className='issue-type-multiselect-selector' style={{ minWidth:
'200px', width: '100%' }}>
- <MultiSelect
- disabled={isSaving}
- resetOnSelect={true}
- placeholder='Select...'
- popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true }}
- className='multiselector-bug-type'
- inline={true}
- fill={true}
- items={bugTagsList}
- selectedItems={bugTags}
- activeItem={null}
- itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
- itemRenderer={(item, { handleClick, modifiers }) => (
- <MenuItem
- active={modifiers.active || bugTags.includes(item)}
- disabled={bugTags.includes(item)}
- key={item.value}
- label={<span style={{ marginLeft: '20px' }}>{item.description
|| item.value}</span>}
- onClick={handleClick}
- text={bugTags.includes(item)
- ? (
- <>
- <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
- </>
- )
- : (
- <span style={{ fontWeight: 700 }}>
- <img src={item.iconUrl} width={12} height={12} />
{item.title}
- </span>
- )}
- style={{ marginBottom: '2px', fontWeight:
bugTags.includes(item) ? 700 : 'normal' }}
+ <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
+ <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
+ <label>Bug</label>
+ </div>
+ <div className='issue-type-multiselect-selector' style={{
minWidth: '200px', width: '100%' }}>
+ <MultiSelect
+ disabled={isSaving}
+ resetOnSelect={true}
+ placeholder='Select...'
+ popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true }}
+ className='multiselector-bug-type'
+ inline={true}
+ fill={true}
+ items={bugTagsList}
+ selectedItems={bugTags}
+ activeItem={null}
+ itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
+ itemRenderer={(item, { handleClick, modifiers }) => (
+ <MenuItem
+ active={modifiers.active || bugTags.includes(item)}
+ disabled={bugTags.includes(item)}
+ key={item.value}
+ label={<span style={{ marginLeft: '20px'
}}>{item.description || item.value}</span>}
+ onClick={handleClick}
+ text={bugTags.includes(item)
+ ? (
+ <>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
+ </>
+ )
+ : (
+ <span style={{ fontWeight: 700 }}>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title}
+ </span>
+ )}
+ style={{ marginBottom: '2px', fontWeight:
bugTags.includes(item) ? 700 : 'normal' }}
+ />
+ )}
+ tagRenderer={(item) => item.title}
+ tagInputProps={{
+ tagProps: {
+ intent: Intent.NONE,
+ color: Colors.RED3,
+ minimal: true
+ },
+ }}
+ noResults={<MenuItem disabled={true} text='No results.' />}
+ onRemove={(item) => {
+ setBugTags((rT) => rT.filter(t => t.id !== item.id))
+ }}
+ onItemSelect={(item) => {
+ setBugTags((rT) => !rT.includes(item) ? [...rT, item] :
[...rT])
+ }}
/>
- )}
- tagRenderer={(item) => item.title}
- tagInputProps={{
- tagProps: {
- intent: Intent.NONE,
- color: Colors.RED3,
- minimal: true
- },
- }}
- noResults={<MenuItem disabled={true} text='No results.' />}
- onRemove={(item) => {
- setBugTags((rT) => rT.filter(t => t.id !== item.id))
- }}
- onItemSelect={(item) => {
- setBugTags((rT) => !rT.includes(item) ? [...rT, item] : [...rT])
- }}
- />
- </div>
- <div className='multiselect-clear-action' style={{ marginLeft: '0' }}>
- <Button
- icon='eraser'
- disabled={bugTags.length === 0 || isSaving}
- intent={Intent.NONE} minimal={false} onClick={() => setBugTags([])}
- style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
- />
- </div>
- </div>
+ </div>
+ <div className='multiselect-clear-action' style={{ marginLeft: '0'
}}>
+ <Button
+ icon='eraser'
+ disabled={bugTags.length === 0 || isSaving}
+ intent={Intent.NONE} minimal={false} onClick={() =>
setBugTags([])}
+ style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
+ />
+ </div>
+ </div>
- <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
- <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
- <label>Incident</label>
- </div>
- <div className='issue-type-multiselect-selector' style={{ minWidth:
'200px', width: '100%' }}>
- <MultiSelect
- disabled={isSaving}
- resetOnSelect={true}
- placeholder='Select...'
- popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true }}
- className='multiselector-incident-type'
- inline={true}
- fill={true}
- items={incidentTagsList}
- selectedItems={incidentTags}
- activeItem={null}
- itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
- itemRenderer={(item, { handleClick, modifiers }) => (
- <MenuItem
- active={modifiers.active || incidentTags.includes(item)}
- disabled={incidentTags.includes(item)}
- key={item.value}
- label={<span style={{ marginLeft: '20px' }}>{item.description
|| item.value}</span>}
- onClick={handleClick}
- text={incidentTags.includes(item)
- ? (
- <>
- <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
- </>
- )
- : (
- <span style={{ fontWeight: 700 }}>
- <img src={item.iconUrl} width={12} height={12} />
{item.title}
- </span>
- )}
- style={{ marginBottom: '2px', fontWeight:
incidentTags.includes(item) ? 700 : 'normal' }}
+ <div className='issue-type-multiselect' style={{ display: 'flex',
marginBottom: '10px' }}>
+ <div className='issue-type-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
+ <label>Incident</label>
+ </div>
+ <div className='issue-type-multiselect-selector' style={{
minWidth: '200px', width: '100%' }}>
+ <MultiSelect
+ disabled={isSaving}
+ resetOnSelect={true}
+ placeholder='Select...'
+ popoverProps={{ usePortal: false, popoverClassName:
'transformation-select-popover', minimal: true }}
+ className='multiselector-incident-type'
+ inline={true}
+ fill={true}
+ items={incidentTagsList}
+ selectedItems={incidentTags}
+ activeItem={null}
+ itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
+ itemRenderer={(item, { handleClick, modifiers }) => (
+ <MenuItem
+ active={modifiers.active || incidentTags.includes(item)}
+ disabled={incidentTags.includes(item)}
+ key={item.value}
+ label={<span style={{ marginLeft: '20px'
}}>{item.description || item.value}</span>}
+ onClick={handleClick}
+ text={incidentTags.includes(item)
+ ? (
+ <>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title} <Icon icon='small-tick' color={Colors.GREEN5} />
+ </>
+ )
+ : (
+ <span style={{ fontWeight: 700 }}>
+ <img src={item.iconUrl} width={12} height={12} />
{item.title}
+ </span>
+ )}
+ style={{ marginBottom: '2px', fontWeight:
incidentTags.includes(item) ? 700 : 'normal' }}
+ />
+ )}
+ tagRenderer={(item) => item.title}
+ tagInputProps={{
+ tagProps: {
+ intent: Intent.NONE,
+ color: Colors.RED3,
+ minimal: true
+ },
+ }}
+ noResults={<MenuItem disabled={true} text='No results.' />}
+ onRemove={(item) => {
+ setIncidentTags((rT) => rT.filter(t => t.id !== item.id))
+ }}
+ onItemSelect={(item) => {
+ setIncidentTags((rT) => !rT.includes(item) ? [...rT, item] :
[...rT])
+ }}
/>
- )}
- tagRenderer={(item) => item.title}
- tagInputProps={{
- tagProps: {
- intent: Intent.NONE,
- color: Colors.RED3,
- minimal: true
- },
- }}
- noResults={<MenuItem disabled={true} text='No results.' />}
- onRemove={(item) => {
- setIncidentTags((rT) => rT.filter(t => t.id !== item.id))
- }}
- onItemSelect={(item) => {
- setIncidentTags((rT) => !rT.includes(item) ? [...rT, item] :
[...rT])
- }}
- />
- </div>
- <div className='multiselect-clear-action' style={{ marginLeft: '0' }}>
- <Button
- icon='eraser'
- disabled={incidentTags.length === 0 || isSaving}
- intent={Intent.NONE} minimal={false} onClick={() =>
setIncidentTags([])}
- style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
- />
- </div>
- </div>
+ </div>
+ <div className='multiselect-clear-action' style={{ marginLeft: '0'
}}>
+ <Button
+ icon='eraser'
+ disabled={incidentTags.length === 0 || isSaving}
+ intent={Intent.NONE} minimal={false} onClick={() =>
setIncidentTags([])}
+ style={{ borderTopLeftRadius: 0, borderBottomLeftRadius: 0,
marginLeft: '-2px' }}
+ />
+ </div>
+ </div>
- <div className='epic-key-select' style={{ display: 'flex', marginBottom:
'10px' }}>
- <div className='epick-key-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
- <label>Epic Link</label>
- </div>
- <div style={{ display: 'flex', minWidth: '260px' }}>
- <ButtonGroup disabled={isSaving} fill={true}>
- <Select
- disabled={isSaving || fieldsList.length === 0}
- className='select-epic-key'
- inline={true}
- fill={true}
- items={fieldsList}
- activeItem={jiraIssueEpicKeyField}
- itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
- itemRenderer={(item, { handleClick, modifiers }) => (
- <MenuItem
- disabled={jiraIssueStoryPointField?.value === item.value}
- active={false}
- intent={modifiers.active ? Intent.NONE : Intent.NONE}
- key={item.value}
- label={item.value}
- onClick={handleClick}
- text={
- <>
- <span>{item.title}</span>{' '}
- <Tag minimal intent={Intent.PRIMARY} style={{ fontSize:
'9px' }}>{item.type}</Tag>{' '}
- {modifiers.active && (<Icon icon='small-tick'
color={Colors.GREEN5} size={14} />)}
- </>
- }
- style={{
- fontSize: '11px',
- fontWeight: modifiers.active ? 800 : 'normal',
- backgroundColor: modifiers.active ? Colors.LIGHT_GRAY4 :
'none'
+ <div className='epic-key-select' style={{ display: 'flex',
marginBottom: '10px' }}>
+ <div className='epick-key-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
+ <label>Epic Link</label>
+ </div>
+ <div style={{ display: 'flex', minWidth: '260px' }}>
+ <ButtonGroup disabled={isSaving} fill={true}>
+ <Select
+ disabled={isSaving || fieldsList.length === 0}
+ className='select-epic-key'
+ inline={true}
+ fill={true}
+ items={fieldsList}
+ activeItem={jiraIssueEpicKeyField}
+ itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
+ itemRenderer={(item, { handleClick, modifiers }) => (
+ <MenuItem
+ disabled={jiraIssueStoryPointField?.value === item.value}
+ active={false}
+ intent={modifiers.active ? Intent.NONE : Intent.NONE}
+ key={item.value}
+ label={item.value}
+ onClick={handleClick}
+ text={
+ <>
+ <span>{item.title}</span>{' '}
+ <Tag minimal intent={Intent.PRIMARY} style={{
fontSize: '9px' }}>{item.type}</Tag>{' '}
+ {modifiers.active && (<Icon icon='small-tick'
color={Colors.GREEN5} size={14} />)}
+ </>
+ }
+ style={{
+ fontSize: '11px',
+ fontWeight: modifiers.active ? 800 : 'normal',
+ backgroundColor: modifiers.active ? Colors.LIGHT_GRAY4
: 'none'
+ }}
+ />
+ )}
+ noResults={<MenuItem disabled={true} text='No epic results.'
/>}
+ onItemSelect={(item) => {
+ setJiraIssueEpicKeyField(item)
+ onSettingsChange({ epicKeyField: item?.value },
configuredBoard?.id)
+ }}
+ popoverProps={{
+ position: Position.TOP
+ }}
+ >
+ <Button
+ intent={Intent.NONE}
+ disabled={isSaving || fieldsList.length === 0}
+ fill={true}
+ style={{ justifyContent: 'space-between', display: 'flex',
minWidth: '260px', maxWidth: '100%' }}
+ text={jiraIssueEpicKeyField ?
`${jiraIssueEpicKeyField.title}` : 'Select...'}
+ rightIcon='double-caret-vertical'
+ outlined
+ />
+ </Select>
+ <Button
+ disabled={!jiraIssueEpicKeyField || isSaving}
+ icon='eraser'
+ intent={jiraIssueEpicKeyField ? Intent.NONE : Intent.NONE}
minimal={false} onClick={() => {
+ setJiraIssueEpicKeyField('')
+ onSettingsChange({ epicKeyField: '' }, configuredBoard?.id)
}}
/>
- )}
- noResults={<MenuItem disabled={true} text='No epic results.' />}
- onItemSelect={(item) => {
- setJiraIssueEpicKeyField(item)
- onSettingsChange({ epicKeyField: item?.value },
configuredBoard?.id)
- }}
- popoverProps={{
- position: Position.TOP
- }}
- >
- <Button
- intent={Intent.NONE}
- disabled={isSaving || fieldsList.length === 0}
- fill={true}
- style={{ justifyContent: 'space-between', display: 'flex',
minWidth: '260px', maxWidth: '100%' }}
- text={jiraIssueEpicKeyField ? `${jiraIssueEpicKeyField.title}`
: 'Select...'}
- rightIcon='double-caret-vertical'
- outlined
- />
- </Select>
- <Button
- disabled={!jiraIssueEpicKeyField || isSaving}
- icon='eraser'
- intent={jiraIssueEpicKeyField ? Intent.NONE : Intent.NONE}
minimal={false} onClick={() => {
- setJiraIssueEpicKeyField('')
- onSettingsChange({ epicKeyField: '' }, configuredBoard?.id)
- }}
- />
- </ButtonGroup>
- <div style={{ marginLeft: '10px' }}>
- {jiraProxyError && (
- <p style={{ color: Colors.GRAY4 }}>
- <Icon icon='warning-sign' color={Colors.RED5} size={12}
style={{ marginBottom: '2px' }} />{' '}
- {jiraProxyError.toString() || 'JIRA API not accessible.'}
- </p>
- )}
+ </ButtonGroup>
+ <div style={{ marginLeft: '10px' }}>
+ {jiraProxyError && (
+ <p style={{ color: Colors.GRAY4 }}>
+ <Icon icon='warning-sign' color={Colors.RED5} size={12}
style={{ marginBottom: '2px' }} />{' '}
+ {jiraProxyError.toString() || 'JIRA API not accessible.'}
+ </p>
+ )}
+ </div>
+ </div>
</div>
- </div>
- </div>
- <div className='story-point-select' style={{ display: 'flex',
marginBottom: '10px' }}>
- <div className='story-point-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
- <label>Story Point</label>
- </div>
- <div style={{ display: 'flex', minWidth: '260px' }}>
- <ButtonGroup disabled={isSaving}>
- <Select
- disabled={isSaving || fieldsList.length === 0}
- className='select-story-key'
- inline={true}
- fill={true}
- items={fieldsList}
- activeItem={jiraIssueStoryPointField}
- itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
- itemRenderer={(item, { handleClick, modifiers }) => (
- <MenuItem
- disabled={jiraIssueEpicKeyField?.value === item.value}
- active={false}
- intent={modifiers.active ? Intent.NONE : Intent.NONE}
- key={item.value}
- label={item.value}
- onClick={handleClick}
- text={
- <>
- {item.title}{' '}
- <Tag minimal intent={Intent.PRIMARY} style={{ fontSize:
'9px' }}>{item.type}</Tag>{' '}
- {modifiers.active && (<Icon icon='small-tick'
color={Colors.GREEN5} size={14} />)}
- </>
- }
- style={{
- fontSize: '11px',
- fontWeight: modifiers.active ? 800 : 'normal',
- backgroundColor: modifiers.active ? Colors.LIGHT_GRAY4 :
'none'
+ <div className='story-point-select' style={{ display: 'flex',
marginBottom: '10px' }}>
+ <div className='story-point-label' style={{ minWidth: '120px',
paddingRight: '10px', paddingTop: '3px' }}>
+ <label>Story Point</label>
+ </div>
+ <div style={{ display: 'flex', minWidth: '260px' }}>
+ <ButtonGroup disabled={isSaving}>
+ <Select
+ disabled={isSaving || fieldsList.length === 0}
+ className='select-story-key'
+ inline={true}
+ fill={true}
+ items={fieldsList}
+ activeItem={jiraIssueStoryPointField}
+ itemPredicate={(query, item) =>
item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0}
+ itemRenderer={(item, { handleClick, modifiers }) => (
+ <MenuItem
+ disabled={jiraIssueEpicKeyField?.value === item.value}
+ active={false}
+ intent={modifiers.active ? Intent.NONE : Intent.NONE}
+ key={item.value}
+ label={item.value}
+ onClick={handleClick}
+ text={
+ <>
+ {item.title}{' '}
+ <Tag minimal intent={Intent.PRIMARY} style={{
fontSize: '9px' }}>{item.type}</Tag>{' '}
+ {modifiers.active && (<Icon icon='small-tick'
color={Colors.GREEN5} size={14} />)}
+ </>
+ }
+ style={{
+ fontSize: '11px',
+ fontWeight: modifiers.active ? 800 : 'normal',
+ backgroundColor: modifiers.active ? Colors.LIGHT_GRAY4
: 'none'
+ }}
+ />
+ )}
+ noResults={<MenuItem disabled={true} text='No epic results.'
/>}
+ onItemSelect={(item) => {
+ setJiraIssueStoryPointField(item)
+ onSettingsChange({ storyPointField: item?.value },
configuredBoard?.id)
+ }}
+ popoverProps={{
+ position: Position.TOP
}}
+ >
+ <Button
+ // loading={isFetchingJIRA}
+ disabled={isSaving || fieldsList.length === 0}
+ fill={true}
+ style={{ justifyContent: 'space-between', display: 'flex',
minWidth: '260px', maxWidth: '300px' }}
+ text={jiraIssueStoryPointField ?
`${jiraIssueStoryPointField.title}` : 'Select...'}
+ rightIcon='double-caret-vertical'
+ outlined
+ />
+ </Select>
+ <Button
+ loading={isFetchingJIRA}
+ disabled={!jiraIssueStoryPointField || isSaving}
+ icon='eraser'
+ intent={jiraIssueStoryPointField
+ ? Intent.NONE
+ : Intent.NONE} minimal={false} onClick={() => {
+ setJiraIssueStoryPointField('')
+ onSettingsChange({ storyPointField: '' },
configuredBoard?.id)
+ }}
/>
- )}
- noResults={<MenuItem disabled={true} text='No epic results.' />}
- onItemSelect={(item) => {
- setJiraIssueStoryPointField(item)
- onSettingsChange({ storyPointField: item?.value },
configuredBoard?.id)
- }}
- popoverProps={{
- position: Position.TOP
- }}
+ </ButtonGroup>
+ <div style={{ marginLeft: '10px' }}>
+ {jiraProxyError && (
+ <p style={{ color: Colors.GRAY4 }}>
+ <Icon icon='warning-sign' color={Colors.RED5} size={12}
style={{ marginBottom: '2px' }} />{' '}
+ {jiraProxyError.toString() || 'JIRA API not accessible.'}
+ </p>
+ )}
+ </div>
+ </div>
+ </div>
+ <div className='headlineContainer'>
+ <h5>Additional Settings</h5>
+ </div>
+ <div className='formContainer' style={{ maxWidth: '550px' }}>
+ <FormGroup
+ disabled={isSaving}
+ // label={<></>}
+ labelFor='jira-remotelink-sha'
+ className='formGroup'
+ contentClassName='formGroupContent'
>
- <Button
- // loading={isFetchingJIRA}
- disabled={isSaving || fieldsList.length === 0}
+ <label>Remotelink Commit SHA</label>
+ <p>Issue Weblink <strong>Commit SHA Pattern</strong> (Add
weblink to jira for gitlab.)</p>
+ <InputGroup
+ id='jira-remotelink-sha'
fill={true}
- style={{ justifyContent: 'space-between', display: 'flex',
minWidth: '260px', maxWidth: '300px' }}
- text={jiraIssueStoryPointField ?
`${jiraIssueStoryPointField.title}` : 'Select...'}
- rightIcon='double-caret-vertical'
- outlined
+ placeholder='/commit/([0-9a-f]{40})$'
+ value={transformation?.remotelinkCommitShaPattern}
+ onChange={(e) => onSettingsChange({
remotelinkCommitShaPattern: e.target.value }, configuredBoard?.id)}
+ disabled={isSaving}
+ className='input'
/>
- </Select>
- <Button
- loading={isFetchingJIRA}
- disabled={!jiraIssueStoryPointField || isSaving}
- icon='eraser'
- intent={jiraIssueStoryPointField
- ? Intent.NONE
- : Intent.NONE} minimal={false} onClick={() => {
- setJiraIssueStoryPointField('')
- onSettingsChange({ storyPointField: '' },
configuredBoard?.id)
- }}
- />
- </ButtonGroup>
- <div style={{ marginLeft: '10px' }}>
- {jiraProxyError && (
- <p style={{ color: Colors.GRAY4 }}>
- <Icon icon='warning-sign' color={Colors.RED5} size={12}
style={{ marginBottom: '2px' }} />{' '}
- {jiraProxyError.toString() || 'JIRA API not accessible.'}
- </p>
- )}
+ </FormGroup>
</div>
+ </>
+ )}
+
+ {(entities?.length === 0 || entities.some(e => e.value ===
DataEntityTypes.CROSSDOMAIN)) && (
+ <div className='headlineContainer'>
+ <h5>No Data Entities</h5>
+ <p className='description'>
+ You have not selected entities that require configuration.
+ </p>
</div>
- </div>
- <div className='headlineContainer'>
- <h5>Additional Settings</h5>
- </div>
- <div className='formContainer' style={{ maxWidth: '550px' }}>
- <FormGroup
- disabled={isSaving}
- // label={<></>}
- labelFor='jira-remotelink-sha'
- className='formGroup'
- contentClassName='formGroupContent'
- >
- <label>Remotelink Commit SHA</label>
- <p>Issue Weblink <strong>Commit SHA Pattern</strong> (Add weblink to
jira for gitlab.)</p>
- <InputGroup
- id='jira-remotelink-sha'
- fill={true}
- placeholder='/commit/([0-9a-f]{40})$'
- value={transformation?.remotelinkCommitShaPattern}
- onChange={(e) => onSettingsChange({ remotelinkCommitShaPattern:
e.target.value }, configuredBoard?.id)}
- disabled={isSaving}
- className='input'
- />
- </FormGroup>
+ )}
- </div>
</>
)
}