This is an automated email from the ASF dual-hosted git repository.

e2corporation 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 79d2ff18 add transformations hook to write all logic about it in one 
file. (#3371)
79d2ff18 is described below

commit 79d2ff18727fbe31e66e866ed3626228b318724d
Author: Likyh <[email protected]>
AuthorDate: Mon Oct 17 11:07:59 2022 +0800

    add transformations hook to write all logic about it in one file. (#3371)
    
    * fix: delete unused code
    
    * fix: change a unappropriate function name
    
    * refactor: move setting default value to a hook
    
    * refactor: move all transformation logic to one hook
    
    * fix: rename initializeDefaultTransformationSettingsIfNotExist to 
initializeDefaultTransformation
    
    * fix: fix for review
    
    * refactor: change a name and delete unused configuredProject
    
    * refactor: delete `configuredBoard` in the detail page and fix some bugs
    
    * fix: fix for review (move changeCurrentProjectXXX to hook)
    
    * fix: fix for review
    
    Co-authored-by: linyh <[email protected]>
---
 .../blueprints/BlueprintDataScopesDialog.jsx       |  18 +-
 .../blueprints/ProviderTransformationSettings.jsx  |  24 --
 .../components/blueprints/StandardStackedList.jsx  |   1 -
 .../create-workflow/DataTransformations.jsx        |  88 ++---
 .../blueprints/transformations/CICD/Deployment.jsx |  28 +-
 .../hooks/data-scope/useTransformationsManager.jsx | 236 ++++++++++++
 config-ui/src/hooks/useDataScopesManager.jsx       | 369 +++++++------------
 .../src/pages/blueprints/blueprint-settings.jsx    |  52 +--
 .../src/pages/blueprints/create-blueprint.jsx      | 139 +++----
 config-ui/src/pages/configure/settings/github.jsx  | 162 +++------
 config-ui/src/pages/configure/settings/gitlab.jsx  |  13 +-
 config-ui/src/pages/configure/settings/jenkins.jsx |  30 +-
 config-ui/src/pages/configure/settings/jira.jsx    | 402 +++++----------------
 config-ui/src/pages/configure/settings/tapd.jsx    |  16 -
 14 files changed, 595 insertions(+), 983 deletions(-)

diff --git a/config-ui/src/components/blueprints/BlueprintDataScopesDialog.jsx 
b/config-ui/src/components/blueprints/BlueprintDataScopesDialog.jsx
index 44e5e733..48d13c61 100644
--- a/config-ui/src/components/blueprints/BlueprintDataScopesDialog.jsx
+++ b/config-ui/src/components/blueprints/BlueprintDataScopesDialog.jsx
@@ -67,7 +67,6 @@ const BlueprintDataScopesDialog = (props) => {
     configuredConnection,
     configuredProject,
     configuredBoard,
-    configurationKey,
     scopeConnection,
     dataEntitiesList = [],
     boardsList = [],
@@ -100,9 +99,10 @@ const BlueprintDataScopesDialog = (props) => {
     setProjects = () => {},
     setBoards = () => {},
     setEntities = () => {},
-    setConfiguredProject = () => {},
-    setConfiguredBoard = () => {},
-    setTransformationSettings = () => {},
+    checkTransformationHasChanged = () => false,
+    changeTransformationSettings = () => {},
+    checkConfiguredProjectTransformationHasChanged = () => false,
+    changeConfiguredProjectTransformationSettings = () => {},
     addBoardTransformation = () => {},
     addProjectTransformation = () => {},
     fieldHasError = () => {},
@@ -231,11 +231,17 @@ const BlueprintDataScopesDialog = (props) => {
                 configuredConnection={configuredConnection}
                 configuredProject={configuredProject}
                 configuredBoard={configuredBoard}
-                configurationKey={configurationKey}
                 addBoardTransformation={addBoardTransformation}
                 addProjectTransformation={addProjectTransformation}
                 isSaving={isSaving}
-                setTransformationSettings={setTransformationSettings}
+                checkTransformationHasChanged={checkTransformationHasChanged}
+                changeTransformationSettings={changeTransformationSettings}
+                checkConfiguredProjectTransformationHasChanged={
+                  checkConfiguredProjectTransformationHasChanged
+                }
+                changeConfiguredProjectTransformationSettings={
+                  changeConfiguredProjectTransformationSettings
+                }
                 // onSave={handleTransformationSave}
                 // onCancel={handleTransformationCancel}
                 // onClear={handleTransformationClear}
diff --git 
a/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx 
b/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
index a211e2c9..c8a40abe 100644
--- a/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
+++ b/config-ui/src/components/blueprints/ProviderTransformationSettings.jsx
@@ -35,38 +35,25 @@ const ProviderTransformationSettings = (props) => {
     provider,
     blueprint,
     connection,
-    configuredProject,
-    configuredBoard,
-    transformations = {},
     transformation = {},
-    entityIdKey,
-    newTransformation = {},
     boards = {},
-    projects = {},
     entities = {},
     issueTypes = [],
     fields = [],
     onSettingsChange = () => {},
-    changeTransformation = () => {},
     isSaving = false,
     isSavingConnection = false,
     jiraProxyError,
     isFetchingJIRA = false
   } = props
 
-  useEffect(() => {
-    console.log('OVER HERE!!!', entityIdKey)
-  }, [entityIdKey])
-
   return (
     <div className='transformation-settings' data-provider={provider?.id}>
       {provider?.id === Providers.GITHUB && (
         <GithubSettings
           provider={provider}
           connection={connection}
-          configuredProject={configuredProject}
           transformation={transformation}
-          entityIdKey={entityIdKey}
           onSettingsChange={onSettingsChange}
           entities={entities[connection?.id]}
           isSaving={isSaving}
@@ -78,9 +65,7 @@ const ProviderTransformationSettings = (props) => {
         <GitlabSettings
           provider={provider}
           connection={connection}
-          configuredProject={configuredProject}
           transformation={transformation}
-          entityIdKey={entityIdKey}
           onSettingsChange={onSettingsChange}
           entities={entities[connection?.id]}
           isSaving={isSaving}
@@ -91,15 +76,10 @@ const ProviderTransformationSettings = (props) => {
       {provider?.id === Providers.JIRA && (
         <JiraSettings
           provider={provider}
-          blueprint={blueprint}
           connection={connection}
-          configuredBoard={configuredBoard}
-          boards={boards}
           issueTypes={issueTypes}
           fields={fields}
           transformation={transformation}
-          entityIdKey={entityIdKey}
-          transformations={transformations}
           onSettingsChange={onSettingsChange}
           entities={entities[connection?.id]}
           isSaving={isSaving}
@@ -113,9 +93,7 @@ const ProviderTransformationSettings = (props) => {
         <JenkinsSettings
           provider={provider}
           connection={connection}
-          configuredProject={configuredProject}
           transformation={transformation}
-          entityIdKey={entityIdKey}
           onSettingsChange={onSettingsChange}
           entities={entities[connection?.id]}
           isSaving={isSaving}
@@ -126,8 +104,6 @@ const ProviderTransformationSettings = (props) => {
         <TapdSettings
           provider={provider}
           connection={connection}
-          transformation={transformation}
-          entityIdKey={entityIdKey}
           onSettingsChange={onSettingsChange}
           entities={entities[connection?.id]}
           isSaving={isSaving}
diff --git a/config-ui/src/components/blueprints/StandardStackedList.jsx 
b/config-ui/src/components/blueprints/StandardStackedList.jsx
index fd21d415..7e9fb793 100644
--- a/config-ui/src/components/blueprints/StandardStackedList.jsx
+++ b/config-ui/src/components/blueprints/StandardStackedList.jsx
@@ -30,7 +30,6 @@ import {
 const StandardStackedList = (props) => {
   const {
     items = [],
-    transformations = {},
     className = 'selected-items-list',
     connection,
     activeItem,
diff --git 
a/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx 
b/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
index f929cb3c..5c97401f 100644
--- 
a/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
+++ 
b/config-ui/src/components/blueprints/create-workflow/DataTransformations.jsx
@@ -15,38 +15,20 @@
  * limitations under the License.
  *
  */
-import React, {
-  Fragment,
-  useEffect,
-  useState,
-  useCallback,
-  useMemo
-} from 'react'
-import { isEqual } from 'lodash'
+import React, { useCallback, useEffect, useMemo, useState } from 'react'
 import {
   Button,
-  Icon,
-  Intent,
-  InputGroup,
-  MenuItem,
+  Card,
   Divider,
   Elevation,
-  Card,
-  Colors,
-  Spinner,
-  Tooltip,
-  Position
+  Icon,
+  Intent,
+  MenuItem
 } from '@blueprintjs/core'
 import { Select } from '@blueprintjs/select'
 import { integrationsData } from '@/data/integrations'
-import {
-  Providers,
-  ProviderTypes,
-  ProviderIcons,
-  ConnectionStatus,
-  ConnectionStatusLabels
-} from '@/data/Providers'
-import { DataEntities, DataEntityTypes } from '@/data/DataEntities'
+import { ProviderIcons, Providers } from '@/data/Providers'
+import { DataEntityTypes } from '@/data/DataEntities'
 import { DEFAULT_DATA_ENTITIES } from '@/data/BlueprintWorkflow'
 
 import ConnectionTabs from '@/components/blueprints/ConnectionTabs'
@@ -66,18 +48,18 @@ const DataTransformations = (props) => {
     boards = {},
     issueTypes = [],
     fields = [],
-    transformations = {},
     configuredConnection,
     configuredProject,
     configuredBoard,
-    configurationKey,
     handleConnectionTabChange = () => {},
     prevStep = () => {},
     addBoardTransformation = () => {},
     addProjectTransformation = () => {},
     activeTransformation = {},
-    setTransformations = () => {},
-    setTransformationSettings = () => {},
+    checkTransformationHasChanged = () => false,
+    changeTransformationSettings = () => {},
+    checkConfiguredProjectTransformationHasChanged = () => false,
+    changeConfiguredProjectTransformationSettings = () => {},
     onSave = () => {},
     onCancel = () => {},
     onClear = () => {},
@@ -96,13 +78,6 @@ const DataTransformations = (props) => {
     cardStyle = {}
   } = props
 
-  // Used to determine whether to display edit transformation or add 
transformation
-  const [initializeTransformations, setInitializeTransformations] = 
useState({})
-
-  useEffect(() => {
-    setInitializeTransformations(transformations)
-  }, [])
-
   const noTransformationsAvailable = useMemo(
     () =>
       [Providers.TAPD].includes(configuredConnection?.provider) ||
@@ -136,19 +111,6 @@ const DataTransformations = (props) => {
   )
   const [activeEntity, setActiveEntity] = useState()
 
-  const transformationHasChanged = useCallback(
-    (item) => {
-      const initializeTransform = initializeTransformations[item?.id]
-      const storedTransform = transformations[item?.id]
-      return (
-        initializeTransform &&
-        storedTransform &&
-        !isEqual(initializeTransform, storedTransform)
-      )
-    },
-    [initializeTransformations, transformations]
-  )
-
   useEffect(() => {
     console.log('>>> PROJECT/BOARD SELECT LIST DATA...', entityList)
     setActiveEntity(Array.isArray(entityList) ? entityList[0] : null)
@@ -162,6 +124,7 @@ const DataTransformations = (props) => {
           addBoardTransformation(activeEntity?.entity)
           break
         case 'project':
+        default:
           addProjectTransformation(activeEntity?.entity)
           break
       }
@@ -173,13 +136,6 @@ const DataTransformations = (props) => {
     useDropdownSelector
   ])
 
-  useEffect(() => {
-    console.log(
-      '>>> DATA TRANSFORMATIONS: DSM $configurationKey',
-      configurationKey
-    )
-  }, [configurationKey])
-
   return (
     <div
       className='workflow-step workflow-step-add-transformation'
@@ -330,13 +286,14 @@ const DataTransformations = (props) => {
                       <>
                         <StandardStackedList
                           items={projects}
-                          transformations={transformations}
                           className='selected-items-list 
selected-projects-list'
                           connection={configuredConnection}
                           activeItem={configuredProject}
                           onAdd={addProjectTransformation}
                           onChange={addProjectTransformation}
-                          isEditing={transformationHasChanged}
+                          isEditing={
+                            checkConfiguredProjectTransformationHasChanged
+                          }
                         />
                         {projects[configuredConnection.id].length === 0 && (
                           <NoData
@@ -355,13 +312,14 @@ const DataTransformations = (props) => {
                       <>
                         <StandardStackedList
                           items={boards}
-                          transformations={transformations}
                           className='selected-items-list selected-boards-list'
                           connection={configuredConnection}
                           activeItem={configuredBoard}
                           onAdd={addBoardTransformation}
                           onChange={addBoardTransformation}
-                          isEditing={transformationHasChanged}
+                          isEditing={
+                            checkConfiguredProjectTransformationHasChanged
+                          }
                         />
                         {boards[configuredConnection.id].length === 0 && (
                           <NoData
@@ -406,22 +364,20 @@ const DataTransformations = (props) => {
                         DEFAULT_DATA_ENTITIES.some((dE) => dE.value === 
e.value)
                       ) && (
                         <ProviderTransformationSettings
+                          key={configuredProject?.id || configuredBoard?.id}
                           provider={integrationsData.find(
                             (i) => i.id === configuredConnection?.provider
                           )}
                           blueprint={blueprint}
                           connection={configuredConnection}
-                          configuredProject={configuredProject}
-                          configuredBoard={configuredBoard}
-                          entityIdKey={configurationKey}
                           issueTypes={issueTypes}
                           fields={fields}
                           boards={boards}
-                          projects={projects}
                           entities={dataEntities}
                           transformation={activeTransformation}
-                          transformations={transformations}
-                          onSettingsChange={setTransformationSettings}
+                          onSettingsChange={
+                            changeConfiguredProjectTransformationSettings
+                          }
                           isSaving={isSaving}
                           isFetchingJIRA={isFetchingJIRA}
                           isSavingConnection={isSavingConnection}
diff --git 
a/config-ui/src/components/blueprints/transformations/CICD/Deployment.jsx 
b/config-ui/src/components/blueprints/transformations/CICD/Deployment.jsx
index b14069d2..15b46884 100644
--- a/config-ui/src/components/blueprints/transformations/CICD/Deployment.jsx
+++ b/config-ui/src/components/blueprints/transformations/CICD/Deployment.jsx
@@ -30,7 +30,6 @@ const Deployment = (props) => {
   const {
     provider,
     transformation,
-    entityIdKey,
     isSaving = false,
     onSettingsChange = () => {}
   } = props
@@ -49,16 +48,13 @@ const Deployment = (props) => {
   }, [transformation?.deploymentPattern, transformation?.productionPattern])
 
   const handleChangeSelectValue = (sv) => {
-    if (entityIdKey && sv === 0) {
-      onSettingsChange(
-        { deploymentPattern: undefined, productionPattern: undefined },
-        entityIdKey
-      )
-    } else if (entityIdKey && sv === 1) {
-      onSettingsChange(
-        { deploymentPattern: '', productionPattern: '' },
-        entityIdKey
-      )
+    if (sv === 0) {
+      onSettingsChange({
+        deploymentPattern: undefined,
+        productionPattern: undefined
+      })
+    } else if (sv === 1) {
+      onSettingsChange({ deploymentPattern: '', productionPattern: '' })
     }
     setSelectValue(sv)
   }
@@ -164,10 +160,7 @@ const Deployment = (props) => {
                   placeholder='(?i)deploy'
                   value={transformation?.deploymentPattern}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { deploymentPattern: e.target.value },
-                      entityIdKey
-                    )
+                    onSettingsChange({ deploymentPattern: e.target.value })
                   }
                   disabled={isSaving}
                   className='input'
@@ -196,10 +189,7 @@ const Deployment = (props) => {
                 placeholder='(?i)production'
                 value={transformation?.productionPattern}
                 onChange={(e) =>
-                  onSettingsChange(
-                    { productionPattern: e.target.value },
-                    entityIdKey
-                  )
+                  onSettingsChange({ productionPattern: e.target.value })
                 }
                 disabled={isSaving}
                 className='input'
diff --git a/config-ui/src/hooks/data-scope/useTransformationsManager.jsx 
b/config-ui/src/hooks/data-scope/useTransformationsManager.jsx
new file mode 100644
index 00000000..c846ca99
--- /dev/null
+++ b/config-ui/src/hooks/data-scope/useTransformationsManager.jsx
@@ -0,0 +1,236 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+import { useCallback, useState } from 'react'
+import { Providers } from '@/data/Providers'
+import TransformationSettings from '@/models/TransformationSettings'
+import { isEqual } from 'lodash'
+
+// TODO separate to each plugin
+const getDefaultTransformations = (provider) => {
+  let transforms = {}
+  switch (provider) {
+    case Providers.GITHUB:
+      transforms = {
+        prType: '',
+        prComponent: '',
+        prBodyClosePattern: '',
+        issueSeverity: '',
+        issueComponent: '',
+        issuePriority: '',
+        issueTypeRequirement: '',
+        issueTypeBug: '',
+        issueTypeIncident: '',
+        refdiff: null,
+        productionPattern: '',
+        deploymentPattern: ''
+        // stagingPattern: '',
+        // testingPattern: ''
+      }
+      break
+    case Providers.JIRA:
+      transforms = {
+        epicKeyField: '',
+        typeMappings: {},
+        storyPointField: '',
+        remotelinkCommitShaPattern: '',
+        bugTags: [],
+        incidentTags: [],
+        requirementTags: [],
+        // @todo: verify if jira utilizes deploy tag(s)?
+        productionPattern: '',
+        deploymentPattern: ''
+        // stagingPattern: '',
+        // testingPattern: ''
+      }
+      break
+    case Providers.JENKINS:
+      transforms = {
+        productionPattern: '',
+        deploymentPattern: ''
+        // stagingPattern: '',
+        // testingPattern: ''
+      }
+      break
+    case Providers.GITLAB:
+      transforms = {
+        productionPattern: '',
+        deploymentPattern: ''
+        // stagingPattern: '',
+        // testingPattern: ''
+      }
+      break
+    case Providers.TAPD:
+      // @todo: complete tapd transforms #2673
+      transforms = {
+        issueTypeRequirement: '',
+        issueTypeBug: '',
+        issueTypeIncident: '',
+        productionPattern: '',
+        deploymentPattern: ''
+        // stagingPattern: '',
+        // testingPattern: ''
+      }
+      break
+  }
+  return transforms
+}
+
+// manage transformations in one place
+const useTransformationsManager = () => {
+  const [transformations, setTransformations] = useState({})
+
+  const generateKey = (
+    connectionProvider,
+    connectionId,
+    projectNameOrBoard
+  ) => {
+    let key = `not-distinguished`
+    switch (connectionProvider) {
+      case Providers.GITHUB:
+      case Providers.GITLAB:
+      case Providers.JENKINS:
+        key = projectNameOrBoard?.id
+        break
+      case Providers.JIRA:
+        key = projectNameOrBoard?.id
+        break
+    }
+    return `${connectionProvider}/${connectionId}/${key}`
+  }
+
+  // change some setting in specific connection's specific transformation
+  const changeTransformationSettings = useCallback(
+    (connectionProvider, connectionId, projectNameOrBoard, settings) => {
+      const key = generateKey(
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      console.info(
+        '>> SETTING TRANSFORMATION SETTINGS PROJECT/BOARD...',
+        key,
+        settings
+      )
+      setTransformations((existingTransformations) => ({
+        ...existingTransformations,
+        [key]: new TransformationSettings({
+          ...existingTransformations[key],
+          ...settings
+        })
+      }))
+    },
+    [setTransformations]
+  )
+
+  // set a default value for connection's specific transformation
+  const initializeDefaultTransformation = useCallback(
+    (connectionProvider, connectionId, projectNameOrBoard) => {
+      const key = generateKey(
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      console.info(
+        '>> INIT DEFAULT TRANSFORMATION SETTINGS PROJECT/BOARD...',
+        key
+      )
+      if (!transformations[key]) {
+        setTransformations((old) => ({
+          ...old,
+          [key]: new TransformationSettings(
+            getDefaultTransformations(connectionProvider)
+          )
+        }))
+      }
+    },
+    [setTransformations, transformations]
+  )
+
+  // get specific connection's specific transformation
+  const getTransformation = useCallback(
+    (connectionProvider, connectionId, projectNameOrBoard) => {
+      const key = generateKey(
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      console.debug(
+        '>> useTransformationsManager.getTransformation...',
+
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      return transformations[key]
+    },
+    [transformations]
+  )
+
+  // clear connection's transformation
+  const clearTransformationSettings = useCallback(
+    (connectionProvider, connectionId, projectNameOrBoard) => {
+      if (!projectNameOrBoard) {
+        return
+      }
+      const key = generateKey(
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      console.info('>> CLEAR TRANSFORMATION SETTINGS PROJECT/BOARD...', key)
+      setTransformations((existingTransformations) => ({
+        ...existingTransformations,
+        [key]: null
+      }))
+    },
+    [setTransformations]
+  )
+
+  // check connection's transformation is changed
+  const checkTransformationHasChanged = useCallback(
+    (connectionProvider, connectionId, projectNameOrBoard) => {
+      const key = generateKey(
+        connectionProvider,
+        connectionId,
+        projectNameOrBoard
+      )
+      const storedTransform = transformations[key]
+      const defaultTransform = new TransformationSettings(
+        getDefaultTransformations(connectionProvider)
+      )
+      console.debug(
+        '>> useTransformationsManager.checkTransformationHasChanged ...',
+        key,
+        storedTransform,
+        defaultTransform
+      )
+      return !isEqual(defaultTransform, storedTransform)
+    },
+    [transformations]
+  )
+
+  return {
+    getTransformation,
+    changeTransformationSettings,
+    initializeDefaultTransformation,
+    clearTransformationSettings,
+    checkTransformationHasChanged
+  }
+}
+
+export default useTransformationsManager
diff --git a/config-ui/src/hooks/useDataScopesManager.jsx 
b/config-ui/src/hooks/useDataScopesManager.jsx
index 71577c51..c7b84b9e 100644
--- a/config-ui/src/hooks/useDataScopesManager.jsx
+++ b/config-ui/src/hooks/useDataScopesManager.jsx
@@ -26,6 +26,7 @@ import GitlabProject from '@/models/GitlabProject'
 import { ProviderIcons, ProviderLabels, Providers } from '@/data/Providers'
 import { DataScopeModes } from '@/data/DataScopes'
 import JenkinsJob from '@/models/JenkinsJob'
+import useTransformationsManager from 
'@/hooks/data-scope/useTransformationsManager'
 
 function useDataScopesManager({
   mode = DataScopeModes.CREATE,
@@ -50,37 +51,17 @@ function useDataScopesManager({
   const [boards, setBoards] = useState({})
   const [projects, setProjects] = useState({})
   const [entities, setEntities] = useState({})
-  const [transformations, setTransformations] = useState({})
+  const {
+    getTransformation,
+    changeTransformationSettings,
+    initializeDefaultTransformation,
+    clearTransformationSettings,
+    checkTransformationHasChanged
+  } = useTransformationsManager()
   const [enabledProviders, setEnabledProviders] = useState([])
 
   const [configuredProject, setConfiguredProject] = useState(null)
   const [configuredBoard, setConfiguredBoard] = useState(null)
-  const configurationKey = useMemo(() => {
-    let key = `C#${connection?.id}`
-    switch (connection?.providerId) {
-      case Providers.GITHUB:
-      case Providers.GITLAB:
-      case Providers.JENKINS:
-        key = configuredProject?.id
-        break
-      case Providers.JIRA:
-        key = configuredBoard?.id
-        break
-      case 'default':
-        key = `C#${connection?.id}`
-        break
-    }
-    console.log('>>> DSM: Active Configuration Key ===', key)
-    return key
-  }, [
-    connection?.providerId,
-    connection?.id,
-    configuredProject?.id,
-    configuredBoard?.id
-  ])
-
-  const activeProject = useMemo(() => configuredProject, [configuredProject])
-  const activeBoard = useMemo(() => configuredBoard, [configuredBoard])
 
   const selectedProjects = useMemo(
     () => projects[connection?.id]?.map((p) => p && p?.id),
@@ -91,120 +72,20 @@ function useDataScopesManager({
     [boards, connection?.id]
   )
 
-  const storedProjectTransformation = useMemo(
-    () =>
-      connection?.transformations &&
-      connection?.transformations[
-        connection?.projects?.findIndex((p) => p === configuredProject?.id)
-      ],
-    [connection, configuredProject?.id]
-  )
-  const storedBoardTransformation = useMemo(
-    () =>
-      connection?.transformations &&
-      connection?.transformations[
-        connection?.boardIds?.findIndex((b) => b === configuredBoard?.id)
-      ],
-    [connection, configuredBoard?.id]
-  )
-
-  const activeProjectTransformation = useMemo(
-    () => transformations[activeProject?.id],
-    [transformations, activeProject?.id]
-  )
-  const activeBoardTransformation = useMemo(
-    () => transformations[activeBoard?.id],
-    [transformations, activeBoard?.id]
-  )
   const activeTransformation = useMemo(
-    () => transformations[configurationKey],
-    [configurationKey, transformations]
-  )
-  // eslint-disable-next-line max-len
-  // const activeTransformation = useMemo(() => 
transformations[connection?.providerId === Providers.JIRA ? configuredBoard?.id 
: configuredProject?.id], [transformations, configuredProject?.id, 
configuredBoard?.id, connection?.providerId])
-
-  const getDefaultTransformations = useCallback((providerId) => {
-    let transforms = {}
-    switch (providerId) {
-      case Providers.GITHUB:
-        transforms = {
-          prType: '',
-          prComponent: '',
-          prBodyClosePattern: '',
-          issueSeverity: '',
-          issueComponent: '',
-          issuePriority: '',
-          issueTypeRequirement: '',
-          issueTypeBug: '',
-          issueTypeIncident: '',
-          refdiff: null,
-          productionPattern: '',
-          deploymentPattern: ''
-          // stagingPattern: '',
-          // testingPattern: ''
-        }
-        break
-      case Providers.JIRA:
-        transforms = {
-          epicKeyField: '',
-          typeMappings: {},
-          storyPointField: '',
-          remotelinkCommitShaPattern: '',
-          bugTags: [],
-          incidentTags: [],
-          requirementTags: [],
-          // @todo: verify if jira utilizes deploy tag(s)?
-          productionPattern: '',
-          deploymentPattern: ''
-          // stagingPattern: '',
-          // testingPattern: ''
-        }
-        break
-      case Providers.JENKINS:
-        transforms = {
-          productionPattern: '',
-          deploymentPattern: ''
-          // stagingPattern: '',
-          // testingPattern: ''
-        }
-        break
-      case Providers.GITLAB:
-        transforms = {
-          productionPattern: '',
-          deploymentPattern: ''
-          // stagingPattern: '',
-          // testingPattern: ''
-        }
-        break
-      case Providers.TAPD:
-        // @todo: complete tapd transforms #2673
-        transforms = {
-          issueTypeRequirement: '',
-          issueTypeBug: '',
-          issueTypeIncident: '',
-          productionPattern: '',
-          deploymentPattern: ''
-          // stagingPattern: '',
-          // testingPattern: ''
-        }
-        break
-    }
-    console.log(
-      '>>>>> DATA SCOPES MANAGER: Getting Default Transformation Values for 
PROVIDER Type ',
-      providerId,
-      transforms
-    )
-    return transforms
-  }, [])
-
-  const initializeTransformations = useCallback(
-    (pV, cV, iDx) => ({
-      ...pV,
-      [cV]: new TransformationSettings(
-        getDefaultTransformations(connection?.providerId, iDx)
-      )
-    }),
-    [connection?.providerId, getDefaultTransformations]
+    () =>
+      getTransformation(
+        connection?.providerId,
+        connection?.id,
+        configuredProject || configuredBoard
+      ),
+    [
+      connection?.providerId,
+      connection?.id,
+      configuredProject,
+      configuredBoard,
+      getTransformation
+    ]
   )
 
   // @todo: generate scopes dynamically from $integrationsData (in future 
Integrations Hook [plugin registry])
@@ -216,7 +97,6 @@ function useDataScopesManager({
       entities = {},
       boards = {},
       projects = {},
-      transformations = {},
       defaultScope = { transformation: {}, options: {}, entities: [] }
     ) => {
       console.log(
@@ -238,7 +118,9 @@ function useDataScopesManager({
               // @todo: verify initial value of since date for jira provider
               // since: new Date(),
             },
-            transformation: { ...transformations[b?.id] }
+            transformation: {
+              ...getTransformation(connection?.providerId, connection?.id, b)
+            }
           }))
           break
         case Providers.GITLAB:
@@ -248,7 +130,9 @@ function useDataScopesManager({
               projectId: Number(p.value),
               title: p.title
             },
-            transformation: { ...transformations[p?.id] }
+            transformation: {
+              ...getTransformation(connection?.providerId, connection?.id, p)
+            }
           }))
           break
         case Providers.JENKINS:
@@ -257,7 +141,9 @@ function useDataScopesManager({
             options: {
               jobName: p.value
             },
-            transformation: { ...transformations[p?.id] }
+            transformation: {
+              ...getTransformation(connection?.providerId, connection?.id, p)
+            }
           }))
           break
         case Providers.GITHUB:
@@ -267,7 +153,9 @@ function useDataScopesManager({
               owner: p.value.split('/')[0],
               repo: p.value.split('/')[1]
             },
-            transformation: { ...transformations[p?.id] }
+            transformation: {
+              ...getTransformation(connection?.providerId, connection?.id, p)
+            }
           }))
           break
         case Providers.TAPD:
@@ -281,7 +169,7 @@ function useDataScopesManager({
       }
       return Array.isArray(newScope) ? newScope.flat() : [newScope]
     },
-    []
+    [getTransformation]
   )
 
   const createProviderConnections = useCallback(
@@ -299,12 +187,11 @@ function useDataScopesManager({
           cIdx,
           entities,
           boards,
-          projects,
-          transformations
+          projects
         )
       }))
     },
-    [boards, projects, entities, transformations, createProviderScopes]
+    [boards, projects, entities, createProviderScopes]
   )
 
   const modifyConnectionSettings = useCallback(() => {
@@ -333,34 +220,11 @@ function useDataScopesManager({
     boards,
     projects,
     entities,
-    transformations,
     blueprint?.settings?.connections,
     setSettings,
     createProviderConnections
   ])
 
-  const setTransformationSettings = useCallback(
-    (settings, configuredEntity) => {
-      console.log(
-        '>>>>> DATA SCOPES MANAGER: SETTING TRANSFORMATION SETTINGS 
PROJECT/BOARD...',
-        configuredEntity,
-        settings
-      )
-      setTransformations((existingTransformations) =>
-        configuredEntity
-          ? {
-              ...existingTransformations,
-              [configuredEntity]: new TransformationSettings({
-                ...existingTransformations[configuredEntity],
-                ...settings
-              })
-            }
-          : existingTransformations
-      )
-    },
-    [setTransformations]
-  )
-
   const getGithubProjects = useCallback(
     (c) =>
       c.scope.map(
@@ -661,16 +525,46 @@ function useDataScopesManager({
     ]
   )
 
+  const checkConfiguredProjectTransformationHasChanged = useCallback(
+    (item) => {
+      return checkTransformationHasChanged(
+        configuredConnection?.provider,
+        configuredConnection?.id,
+        item
+      )
+    },
+    [
+      configuredConnection?.provider,
+      configuredConnection?.id,
+      checkTransformationHasChanged
+    ]
+  )
+
+  const changeConfiguredProjectTransformationSettings = useCallback(
+    (settings) => {
+      return changeTransformationSettings(
+        configuredConnection?.provider,
+        configuredConnection?.id,
+        configuredBoard || configuredProject,
+        settings
+      )
+    },
+    [
+      configuredConnection?.provider,
+      configuredConnection?.id,
+      configuredBoard,
+      configuredProject,
+      changeTransformationSettings
+    ]
+  )
+
   useEffect(() => {
     console.log(
       '>>>>> DATA SCOPES MANAGER: INITIALIZING TRANSFORMATION RULES...',
-      selectedProjects
-    )
-    console.log(
-      '>>>>> DATA SCOPES MANAGER: INITIALIZING TRANSFORMATION RULES...',
+      selectedProjects,
       selectedBoards
     )
-  }, [selectedProjects, selectedBoards, initializeTransformations])
+  }, [selectedProjects, selectedBoards])
 
   useEffect(() => {
     console.log('>>>>> DATA SCOPES MANAGER: CONFIGURED CONNECTION', connection)
@@ -687,7 +581,12 @@ function useDataScopesManager({
           [connection?.id]: connection?.entityList || []
         }))
         connection?.projects.forEach((p, pIdx) =>
-          setTransformationSettings(connection.transformations[pIdx], p?.id)
+          changeTransformationSettings(
+            connection?.provider?.id,
+            connection?.id,
+            p,
+            connection.transformations[pIdx]
+          )
         )
         break
       case Providers.JIRA:
@@ -702,67 +601,66 @@ function useDataScopesManager({
           ...e,
           [connection?.id]: connection?.entityList || []
         }))
-        connection?.boardIds.forEach((bId, bIdx) =>
-          setTransformationSettings(connection.transformations[bIdx], bId)
+        connection?.boardsList.forEach((b, bIdx) =>
+          changeTransformationSettings(
+            connection?.provider?.id,
+            connection?.id,
+            b,
+            connection.transformations[bIdx]
+          )
         )
         break
     }
-  }, [connection, setTransformationSettings])
+  }, [connection, changeTransformationSettings])
 
   useEffect(() => {
     console.log('>>>>> DATA SCOPES MANAGER: Connection List...', connections)
     modifyConnectionSettings()
-  }, [
-    connections,
-    entities,
-    projects,
-    boards,
-    transformations,
-    modifyConnectionSettings
-  ])
+  }, [connections, entities, projects, boards, modifyConnectionSettings])
 
   useEffect(() => {
     console.log('>>>>> DATA SCOPES MANAGER: INITIALIZE BOARDS...', boards)
-    const boardTransformations = boards[connection?.id]
-    if (
-      Array.isArray(boardTransformations) &&
-      boardTransformations?.length > 0
-    ) {
-      setTransformations((cT) => ({
-        ...boardTransformations.reduce(initializeTransformations, {}),
-        // Spread Current/Existing Transformations Settings
-        ...cT
-      }))
+    // FIXME: boards is board[][], rename it to boardsMap
+    const boardArray = boards[connection?.id]
+    if (Array.isArray(boardArray)) {
+      for (const board of boardArray) {
+        initializeDefaultTransformation(
+          connection?.providerId,
+          connection?.id,
+          board
+        )
+      }
     }
-  }, [boards, connection?.id, initializeTransformations])
+  }, [
+    boards,
+    connection?.providerId,
+    connection?.id,
+    initializeDefaultTransformation
+  ])
 
   useEffect(() => {
     console.log('>>>>> DATA SCOPES MANAGER: INITIALIZE PROJECTS...', projects)
-    const projectTransformations = projects[connection?.id]
-    if (Array.isArray(projectTransformations)) {
-      setTransformations((cT) => ({
-        ...projectTransformations.reduce(initializeTransformations, {}),
-        // Spread Current/Existing Transformations Settings
-        ...cT
-      }))
+    const projectArray = projects[connection?.id]
+    if (Array.isArray(projectArray)) {
+      for (const project of projectArray) {
+        initializeDefaultTransformation(
+          connection?.providerId,
+          connection?.id,
+          project
+        )
+      }
     }
-  }, [projects, connection?.id, initializeTransformations])
-
-  useEffect(() => {
-    console.log('>>>>> DATA SCOPES MANAGER: DATA ENTITIES...', entities)
-  }, [entities])
+  }, [
+    projects,
+    connection?.providerId,
+    connection?.id,
+    initializeDefaultTransformation
+  ])
 
   useEffect(() => {
     console.log('>>>>> DATA SCOPES MANAGER: DATA ENTITIES...', entities)
   }, [entities])
 
-  useEffect(() => {
-    console.log(
-      '>>>>> DATA SCOPES MANAGER: TRANSFORMATIONS...',
-      transformations
-    )
-  }, [transformations])
-
   useEffect(() => {
     console.log(
       '>>>>> DATA SCOPES MANAGER: CURRENT BLUEPRINT SETTINGS...',
@@ -777,20 +675,6 @@ function useDataScopesManager({
     )
   }, [activeTransformation])
 
-  useEffect(() => {
-    console.log(
-      '>>>>> DATA SCOPES MANAGER: ACTIVE PROJECT TRANSFORMATION RULES...',
-      activeProjectTransformation
-    )
-  }, [activeProjectTransformation])
-
-  useEffect(() => {
-    console.log(
-      '>>>>> DATA SCOPES MANAGER: ACTIVE BOARD TRANSFORMATION RULES...',
-      activeBoardTransformation
-    )
-  }, [activeBoardTransformation])
-
   useEffect(() => {
     console.log(
       '>>>>> DATA SCOPES MANAGER: MEMOIZED ACTIVE CONNECTION...',
@@ -805,19 +689,12 @@ function useDataScopesManager({
     boards,
     projects,
     entities,
-    transformations,
     configuredConnection,
     configuredBoard,
     configuredProject,
-    configurationKey,
-    storedProjectTransformation,
-    storedBoardTransformation,
-    activeBoardTransformation,
-    activeProjectTransformation,
     activeTransformation,
     scopeConnection,
     enabledProviders,
-    // setActiveTransformation,
     setNewConnections,
     setConnections,
     setScopeConnection,
@@ -828,17 +705,19 @@ function useDataScopesManager({
     setBoards,
     setProjects,
     setEntities,
-    setTransformations,
-    setTransformationSettings,
-    initializeTransformations,
-    getDefaultTransformations,
+    getTransformation,
+    changeTransformationSettings,
+    initializeDefaultTransformation,
+    clearTransformationSettings,
+    checkTransformationHasChanged,
+    checkConfiguredProjectTransformationHasChanged,
+    changeConfiguredProjectTransformationSettings,
     createProviderConnections,
     createProviderScopes,
     getJiraMappedBoards,
     getDefaultEntities,
     createNormalConnection,
     createAdvancedConnection,
-    modifyConnectionSettings,
     setEnabledProviders
   }
 }
diff --git a/config-ui/src/pages/blueprints/blueprint-settings.jsx 
b/config-ui/src/pages/blueprints/blueprint-settings.jsx
index 5095047a..ae4d47d7 100644
--- a/config-ui/src/pages/blueprints/blueprint-settings.jsx
+++ b/config-ui/src/pages/blueprints/blueprint-settings.jsx
@@ -170,15 +170,11 @@ const BlueprintSettings = (props) => {
     boards,
     projects,
     entities,
-    transformations,
     scopeConnection,
-    activeBoardTransformation,
-    activeProjectTransformation,
     activeTransformation,
     configuredConnection,
     configuredBoard,
     configuredProject,
-    configurationKey,
     enabledProviders,
     setConfiguredConnection,
     setConfiguredBoard,
@@ -186,14 +182,17 @@ const BlueprintSettings = (props) => {
     setBoards,
     setProjects,
     setEntities,
-    setTransformations,
-    setTransformationSettings,
+    getTransformation,
+    changeTransformationSettings,
+    clearTransformationSettings,
+    checkTransformationHasChanged,
+    checkConfiguredProjectTransformationHasChanged,
+    changeConfiguredProjectTransformationSettings,
     // setActiveTransformation,
     setConnections,
     setScopeConnection,
     setEnabledProviders,
     createProviderConnections,
-    createProviderScopes,
     createNormalConnection,
     createAdvancedConnection,
     getJiraMappedBoards,
@@ -367,24 +366,7 @@ const BlueprintSettings = (props) => {
     )
     setBlueprintScopesDialogIsOpen(false)
     setScopeConnection(null)
-    // restore/revert data scope + settings on close (cancel)
-    // setTransformations({})
-    // switch (scopeConnection?.provider?.id) {
-    //   case Providers.GITHUB:
-    //     setActiveTransformation(activeProjectTransformation)
-    //     setProjects(p => ({ ...p, [configuredConnection?.id]: 
scopeConnection?.projects }))
-    //     setEntities(e => ({ ...e, [configuredConnection?.id]: 
scopeConnection?.entityList }))
-    //     break
-    //   case Providers.JIRA:
-    //     setActiveTransformation(activeBoardTransformation)
-    //     setBoards(b => ({...b, [configuredConnection?.id]: 
scopeConnection?.boardsList }))
-    //     setEntities(e => ({ ...e, [configuredConnection?.id]: 
scopeConnection?.entityList }))
-    //     break
-    // }
   }, [
-    // activeProjectTransformation,
-    // activeBoardTransformation,
-    // configuredConnection,
     setScopeConnection
     // scopeConnection
   ])
@@ -836,7 +818,6 @@ const BlueprintSettings = (props) => {
     activeSetting?.id,
     getCronPreset,
     blueprintSettings,
-    transformations,
     runTasksAdvanced
   ])
 
@@ -899,24 +880,8 @@ const BlueprintSettings = (props) => {
     // isFetchingJIRA,
     // jiraApiBoards,
     scopeConnection
-    // configuredProject, configuredBoard
   ])
 
-  // useEffect(() => {
-  //   if (allJiraResources?.boards?.length > 0) {
-  //     // setBlueprintScopesDialogIsOpen(true)
-  //   }
-  // }, [allJiraResources])
-
-  // useEffect(() => {
-  //   console.log('>>> CONFIGURING / MODIFYING CONNECTION', 
configuredConnection)
-  //   if (configuredConnection?.id) {
-  //     // setBoards({ [configuredConnection?.id]: [] })
-  //     // setProjects({ [configuredConnection?.id]: [] })
-  //     // setEntities({ [configuredConnection?.id]: [] })
-  //   }
-  // }, [configuredConnection])
-
   useEffect(() => {
     if (
       scopeConnection?.providerId === Providers.JIRA &&
@@ -1456,7 +1421,6 @@ const BlueprintSettings = (props) => {
         configuredConnection={configuredConnection}
         configuredProject={configuredProject}
         configuredBoard={configuredBoard}
-        configurationKey={configurationKey}
         scopeConnection={scopeConnection}
         activeTransformation={activeTransformation}
         addProjectTransformation={addProjectTransformation}
@@ -1479,12 +1443,12 @@ const BlueprintSettings = (props) => {
         jenkinsJobs={jenkinsJobs}
         isFetchingJenkins={isFetchingJenkins}
         jenkinsProxyError={jenkinsProxyError}
-        setConfiguredProject={setConfiguredProject}
         setConfiguredBoard={setConfiguredBoard}
         setBoards={setBoards}
         setProjects={setProjects}
         setEntities={setEntities}
-        setTransformationSettings={setTransformationSettings}
+        checkTransformationHasChanged={checkTransformationHasChanged}
+        changeTransformationSettings={changeTransformationSettings}
         onOpening={handleBlueprintScopesDialogOpening}
         onSave={handleBlueprintSave}
         isSaving={isSaving}
diff --git a/config-ui/src/pages/blueprints/create-blueprint.jsx 
b/config-ui/src/pages/blueprints/create-blueprint.jsx
index 3aa214f7..4a21cb63 100644
--- a/config-ui/src/pages/blueprints/create-blueprint.jsx
+++ b/config-ui/src/pages/blueprints/create-blueprint.jsx
@@ -192,7 +192,6 @@ const CreateBlueprint = (props) => {
     boards,
     projects,
     entities: dataEntities,
-    transformations,
     activeTransformation,
     setNewConnections: setBlueprintConnections,
     setConfiguredConnection,
@@ -201,17 +200,18 @@ const CreateBlueprint = (props) => {
     setBoards,
     setProjects,
     setEntities: setDataEntities,
-    setTransformations,
-    setTransformationSettings,
+    getTransformation,
+    changeTransformationSettings,
+    clearTransformationSettings,
+    checkTransformationHasChanged,
+    checkConfiguredProjectTransformationHasChanged,
+    changeConfiguredProjectTransformationSettings,
     configuredConnection,
     configuredProject,
     configuredBoard,
-    configurationKey,
     createProviderScopes,
     createProviderConnections,
-    getDefaultTransformations,
-    getDefaultEntities,
-    initializeTransformations
+    getDefaultEntities
   } = useDataScopesManager({ settings: blueprintSettings })
 
   const {
@@ -397,18 +397,6 @@ const CreateBlueprint = (props) => {
     password
   })
 
-  // const [configuredProject, setConfiguredProject] = useState(
-  //   // projects.length > 0 ? projects[0] : null
-  //   null
-  // )
-  // const [configuredBoard, setConfiguredBoard] = useState(
-  //   // boards.length > 0 ? boards[0] : null
-  //   null
-  // )
-
-  // eslint-disable-next-line max-len
-  // const activeTransformation = useMemo(() => 
transformations[configuredProject?.id || configuredBoard?.id], 
[transformations, configuredProject?.id, configuredBoard?.id])
-
   // eslint-disable-next-line no-unused-vars
   const isValidStep = useCallback((stepId) => {}, [])
 
@@ -530,15 +518,22 @@ const CreateBlueprint = (props) => {
       '==> BOARD =',
       configuredBoard
     )
-    setTransformations((existingTransformations) => ({
-      ...existingTransformations,
-      [configuredProject?.id]: {},
-      [configuredBoard?.id]: {}
-    }))
+    clearTransformationSettings(
+      configuredConnection?.provider,
+      configuredConnection?.id,
+      configuredProject
+    )
+    clearTransformationSettings(
+      configuredConnection?.provider,
+      configuredConnection?.id,
+      configuredBoard
+    )
     setConfiguredProject(null)
     setConfiguredBoard(null)
   }, [
-    setTransformations,
+    configuredConnection?.provider,
+    configuredConnection?.id,
+    clearTransformationSettings,
     setConfiguredBoard,
     setConfiguredProject,
     configuredProject,
@@ -613,30 +608,13 @@ const CreateBlueprint = (props) => {
     setConnectionDialogIsOpen(true)
   }, [])
 
-  // @note: replaced by definition in dsm hook!
-  // const setTransformationSettings = useCallback(
-  //   (settings, configuredEntity) => {
-  //     console.log(
-  //       '>> SETTING TRANSFORMATION SETTINGS PROJECT/BOARD...',
-  //       configuredEntity,
-  //       settings
-  //     )
-  //     setTransformations((existingTransformations) => ({
-  //       ...existingTransformations,
-  //       [configuredEntity]: {
-  //         ...existingTransformations[configuredEntity],
-  //         ...settings,
-  //       },
-  //     }))
-  //   },
-  //   [setTransformations]
-  // )
-
   const handleTransformationSave = useCallback(
     (settings, entity) => {
-      console.log('>> SAVING / CLOSING Transformation Settings')
-      // manual @save disabled, reactive auto-saving writes settings to 
transform object...
-      // setTransformationSettings(settings, entity)
+      console.log(
+        '>> SAVING / CLOSING Transformation Settings',
+        settings,
+        entity
+      )
       setConfiguredProject(null)
       setConfiguredBoard(null)
       ToastNotification.clear()
@@ -846,7 +824,6 @@ const CreateBlueprint = (props) => {
           setDataEntitiesList(
             DEFAULT_DATA_ENTITIES.filter((d) => d.name !== 'ci-cd')
           )
-          // setConfiguredProject(projects.length > 0 ? projects[0] : null)
           break
         case Providers.JIRA:
           setDataEntitiesList(
@@ -893,8 +870,7 @@ const CreateBlueprint = (props) => {
           cIdx,
           dataEntities,
           boards,
-          projects,
-          transformations
+          projects
         )
       }))
     }))
@@ -904,57 +880,18 @@ const CreateBlueprint = (props) => {
     dataEntities,
     boards,
     projects,
-    transformations,
     validatePipeline,
     createProviderScopes,
     setBlueprintSettings
   ])
 
-  useEffect(() => {
-    console.log('>> PROJECTS LIST', projects)
-    console.log('>> BOARDS LIST', boards)
-
-    const projectTransformation = projects[configuredConnection?.id]?.map(
-      (p) => p.id
-    )
-    const boardTransformation = boards[configuredConnection?.id]?.map(
-      (b) => b.id
-    )
-    if (projectTransformation) {
-      setTransformations((cT) => ({
-        ...projectTransformation.reduce(initializeTransformations, {}),
-        // Spread Current/Existing Transformations Settings
-        ...cT
-      }))
-    }
-    if (boardTransformation) {
-      setTransformations((cT) => ({
-        ...boardTransformation.reduce(initializeTransformations, {}),
-        // Spread Current/Existing Transformations Settings
-        ...cT
-      }))
-    }
-  }, [
-    projects,
-    boards,
-    configuredConnection,
-    initializeTransformations,
-    setTransformations
-  ])
-
   useEffect(() => {
     console.log('>>> SELECTED PROJECT TO CONFIGURE...', configuredProject)
-    // setActiveTransformation((aT) =>
-    //   configuredProject !== null ? transformations[configuredProject] : {}
-    // )
     setCanAdvanceNext(!configuredProject)
   }, [configuredProject, setCanAdvanceNext])
 
   useEffect(() => {
-    console.log('>>> SELECTED BOARD TO CONFIGURE...', configuredBoard?.id)
-    // setActiveTransformation((aT) =>
-    //   configuredBoard ? transformations[configuredBoard?.id] : aT
-    // )
+    console.log('>>> SELECTED BOARD TO CONFIGURE...', configuredBoard)
     setCanAdvanceNext(!configuredBoard)
   }, [configuredBoard, setCanAdvanceNext])
 
@@ -1198,21 +1135,29 @@ const CreateBlueprint = (props) => {
                       configuredConnection={configuredConnection}
                       configuredProject={configuredProject}
                       configuredBoard={configuredBoard}
-                      configurationKey={configurationKey}
                       handleConnectionTabChange={handleConnectionTabChange}
                       prevStep={prevStep}
                       addBoardTransformation={addBoardTransformation}
                       addProjectTransformation={addProjectTransformation}
-                      transformations={transformations}
                       activeTransformation={activeTransformation}
-                      setTransformations={setTransformations}
-                      setTransformationSettings={setTransformationSettings}
-                      isSaving={isSaving}
-                      isSavingConnection={isSavingConnection}
-                      isRunning={isRunning}
+                      checkTransformationHasChanged={
+                        checkTransformationHasChanged
+                      }
+                      changeTransformationSettings={
+                        changeTransformationSettings
+                      }
+                      checkConfiguredProjectTransformationHasChanged={
+                        checkConfiguredProjectTransformationHasChanged
+                      }
+                      changeConfiguredProjectTransformationSettings={
+                        changeConfiguredProjectTransformationSettings
+                      }
                       onSave={handleTransformationSave}
                       onCancel={handleTransformationCancel}
                       onClear={handleTransformationClear}
+                      isSaving={isSaving}
+                      isSavingConnection={isSavingConnection}
+                      isRunning={isRunning}
                       fieldHasError={fieldHasError}
                       getFieldError={getFieldError}
                       jiraProxyError={jiraProxyError}
diff --git a/config-ui/src/pages/configure/settings/github.jsx 
b/config-ui/src/pages/configure/settings/github.jsx
index 525afd73..b9ef32d9 100644
--- a/config-ui/src/pages/configure/settings/github.jsx
+++ b/config-ui/src/pages/configure/settings/github.jsx
@@ -41,39 +41,23 @@ export default function GithubSettings(props) {
     connection,
     entities = [],
     transformation = {},
-    entityIdKey,
     isSaving,
     isSavingConnection,
-    onSettingsChange = () => {},
-    configuredProject
+    onSettingsChange = () => {}
   } = props
-
-  // eslint-disable-next-line no-unused-vars
-  const [errors, setErrors] = useState([])
   const [enableAdditionalCalculations, setEnableAdditionalCalculations] =
     useState(false)
 
-  // eslint-disable-next-line no-unused-vars
-  const handleSettingsChange = useCallback(
-    (setting) => {
-      onSettingsChange(setting, configuredProject?.id)
-    },
-    [onSettingsChange, configuredProject]
-  )
-
-  const handleAdditionalSettings = useCallback(
-    (setting) => {
-      setEnableAdditionalCalculations(setting)
-      onSettingsChange(
-        {
-          refdiff: setting
-            ? { tagsOrder: '', tagsPattern: '', tagsLimit: 10 }
-            : null
-        },
-        configuredProject?.id
-      )
+  const handleAdditionalEnable = useCallback(
+    (enable) => {
+      setEnableAdditionalCalculations(enable)
+      onSettingsChange({
+        refdiff: enable
+          ? { tagsOrder: '', tagsPattern: '', tagsLimit: 10 }
+          : null
+      })
     },
-    [setEnableAdditionalCalculations, configuredProject, onSettingsChange]
+    [setEnableAdditionalCalculations, onSettingsChange]
   )
 
   useEffect(() => {
@@ -84,16 +68,6 @@ export default function GithubSettings(props) {
     setEnableAdditionalCalculations(!!transformation?.refdiff)
   }, [transformation])
 
-  useEffect(() => {
-    console.log(
-      '>>>> GITHUB: ENABLE GITHUB ADDITIONAL SETTINGS..?',
-      enableAdditionalCalculations
-    )
-    if (enableAdditionalCalculations === 'disabled') {
-      // onSettingsChange({gitextractorCalculation: ''}, configuredProject)
-    }
-  }, [enableAdditionalCalculations])
-
   return (
     <>
       {entities.some((e) => e.value === DataEntityTypes.TICKET) && (
@@ -124,10 +98,7 @@ export default function GithubSettings(props) {
                   // defaultValue={transformation?.issueSeverity}
                   value={transformation?.issueSeverity}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issueSeverity: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issueSeverity: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -150,10 +121,7 @@ export default function GithubSettings(props) {
                   placeholder='component/(.*)$'
                   value={transformation?.issueComponent}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issueComponent: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issueComponent: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -175,10 +143,7 @@ export default function GithubSettings(props) {
                   placeholder='(highest|high|medium|low)$'
                   value={transformation?.issuePriority}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issuePriority: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issuePriority: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -200,10 +165,7 @@ export default function GithubSettings(props) {
                   placeholder='(feat|feature|proposal|requirement)$'
                   value={transformation?.issueTypeRequirement}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issueTypeRequirement: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issueTypeRequirement: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -225,10 +187,7 @@ export default function GithubSettings(props) {
                   placeholder='(bug|broken)$'
                   value={transformation?.issueTypeBug}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issueTypeBug: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issueTypeBug: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -261,10 +220,7 @@ export default function GithubSettings(props) {
                   placeholder='(incident|p0|p1|p2)$'
                   value={transformation?.issueTypeIncident}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { issueTypeIncident: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ issueTypeIncident: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -276,18 +232,16 @@ export default function GithubSettings(props) {
         </>
       )}
 
-      {entities.some((e) => e.value === DataEntityTypes.DEVOPS) &&
-        configuredProject && (
-          <Deployment
-            provider={provider}
-            entities={entities}
-            entityIdKey={entityIdKey}
-            transformation={transformation}
-            connection={connection}
-            onSettingsChange={onSettingsChange}
-            isSaving={isSaving || isSavingConnection}
-          />
-        )}
+      {entities.some((e) => e.value === DataEntityTypes.DEVOPS) && (
+        <Deployment
+          provider={provider}
+          entities={entities}
+          transformation={transformation}
+          connection={connection}
+          onSettingsChange={onSettingsChange}
+          isSaving={isSaving || isSavingConnection}
+        />
+      )}
 
       {entities.some((e) => e.value === DataEntityTypes.CODE_REVIEW) && (
         <>
@@ -316,12 +270,7 @@ export default function GithubSettings(props) {
                   id='github-pr-type'
                   placeholder='type/(.*)$'
                   value={transformation?.prType}
-                  onChange={(e) =>
-                    onSettingsChange(
-                      { prType: e.target.value },
-                      configuredProject?.id
-                    )
-                  }
+                  onChange={(e) => onSettingsChange({ prType: e.target.value 
})}
                   disabled={isSaving || isSavingConnection}
                   className='input'
                   maxLength={255}
@@ -342,10 +291,7 @@ export default function GithubSettings(props) {
                   placeholder='component/(.*)$'
                   value={transformation?.prComponent}
                   onChange={(e) =>
-                    onSettingsChange(
-                      { prComponent: e.target.value },
-                      configuredProject?.id
-                    )
+                    onSettingsChange({ prComponent: e.target.value })
                   }
                   disabled={isSaving || isSavingConnection}
                   className='input'
@@ -433,10 +379,7 @@ export default function GithubSettings(props) {
                 // eslint-disable-next-line max-len
                 
placeholder='(?mi)(fix|close|resolve|fixes|closes|resolves|fixed|closed|resolved)[\s]*.*(((and
 )?(#|https:\/\/github.com\/%s\/%s\/issues\/)\d+[ ]*)+)'
                 onChange={(e) =>
-                  onSettingsChange(
-                    { prBodyClosePattern: e.target.value },
-                    configuredProject?.id
-                  )
+                  onSettingsChange({ prBodyClosePattern: e.target.value })
                 }
                 disabled={isSaving || isSavingConnection}
                 fill
@@ -452,7 +395,7 @@ export default function GithubSettings(props) {
               checked={enableAdditionalCalculations}
               label='Enable calculation of commit and issue difference'
               onChange={(e) =>
-                handleAdditionalSettings(!enableAdditionalCalculations)
+                handleAdditionalEnable(!enableAdditionalCalculations)
               }
             />
             {enableAdditionalCalculations && (
@@ -472,15 +415,12 @@ export default function GithubSettings(props) {
                       placeholder='10'
                       allowNumericCharactersOnly={true}
                       onValueChange={(tagsLimitNumeric) =>
-                        onSettingsChange(
-                          {
-                            refdiff: {
-                              ...transformation?.refdiff,
-                              tagsLimit: tagsLimitNumeric
-                            }
-                          },
-                          configuredProject?.id
-                        )
+                        onSettingsChange({
+                          refdiff: {
+                            ...transformation?.refdiff,
+                            tagsLimit: tagsLimitNumeric
+                          }
+                        })
                       }
                       value={transformation?.refdiff?.tagsLimit}
                     />
@@ -497,15 +437,12 @@ export default function GithubSettings(props) {
                       placeholder='(regex)$'
                       value={transformation?.refdiff?.tagsPattern}
                       onChange={(e) =>
-                        onSettingsChange(
-                          {
-                            refdiff: {
-                              ...transformation?.refdiff,
-                              tagsPattern: e.target.value
-                            }
-                          },
-                          configuredProject?.id
-                        )
+                        onSettingsChange({
+                          refdiff: {
+                            ...transformation?.refdiff,
+                            tagsPattern: e.target.value
+                          }
+                        })
                       }
                       disabled={isSaving || isSavingConnection}
                       className='input'
@@ -524,15 +461,12 @@ export default function GithubSettings(props) {
                       placeholder='reverse semver'
                       value={transformation?.refdiff?.tagsOrder}
                       onChange={(e) =>
-                        onSettingsChange(
-                          {
-                            refdiff: {
-                              ...transformation?.refdiff,
-                              tagsOrder: e.target.value
-                            }
-                          },
-                          configuredProject?.id
-                        )
+                        onSettingsChange({
+                          refdiff: {
+                            ...transformation?.refdiff,
+                            tagsOrder: e.target.value
+                          }
+                        })
                       }
                       disabled={isSaving || isSavingConnection}
                       className='input'
diff --git a/config-ui/src/pages/configure/settings/gitlab.jsx 
b/config-ui/src/pages/configure/settings/gitlab.jsx
index 1af832fc..91de1f9c 100644
--- a/config-ui/src/pages/configure/settings/gitlab.jsx
+++ b/config-ui/src/pages/configure/settings/gitlab.jsx
@@ -28,29 +28,18 @@ export default function GitlabSettings(props) {
     connection,
     entities = [],
     transformation = {},
-    entityIdKey,
     provider,
-    configuredProject,
     isSaving = false,
     isSavingConnection = false,
     onSettingsChange = () => {}
   } = props
 
-  useEffect(() => {
-    console.log(
-      '>>>> GITLAB: TRANSFORMATION SETTINGS OBJECT....',
-      transformation
-    )
-  }, [transformation])
-
   return (
     <>
-      {entities.some((e) => e.value === DataEntityTypes.DEVOPS) &&
-      configuredProject ? (
+      {entities.some((e) => e.value === DataEntityTypes.DEVOPS) ? (
         <Deployment
           provider={provider}
           entities={entities}
-          entityIdKey={entityIdKey}
           transformation={transformation}
           connection={connection}
           onSettingsChange={onSettingsChange}
diff --git a/config-ui/src/pages/configure/settings/jenkins.jsx 
b/config-ui/src/pages/configure/settings/jenkins.jsx
index 9d937571..25174311 100644
--- a/config-ui/src/pages/configure/settings/jenkins.jsx
+++ b/config-ui/src/pages/configure/settings/jenkins.jsx
@@ -43,37 +43,10 @@ export default function JenkinsSettings(props) {
     connection,
     entities = [],
     transformation = {},
-    entityIdKey,
     isSaving = false,
     isSavingConnection = false,
-    onSettingsChange = () => {},
-    configuredProject
+    onSettingsChange = () => {}
   } = props
-  const history = useHistory()
-  const { providerId, connectionId } = useParams()
-
-  // eslint-disable-next-line max-len
-  const [errors, setErrors] = useState([])
-
-  const cancel = () => {
-    history.push(`/integrations/${provider.id}`)
-  }
-
-  // useEffect(() => {
-  //   setErrors(['This integration doesn’t require any configuration.'])
-  // }, [])
-
-  useEffect(() => {
-    onSettingsChange({
-      errors,
-      providerId,
-      connectionId
-    })
-  }, [errors, onSettingsChange, connectionId, providerId])
-
-  useEffect(() => {
-    console.log('>>> JENKINS: DATA ENTITIES...', entities)
-  }, [entities])
 
   return (
     <>
@@ -81,7 +54,6 @@ export default function JenkinsSettings(props) {
         <Deployment
           provider={provider}
           entities={entities}
-          entityIdKey={entityIdKey}
           transformation={transformation}
           connection={connection}
           onSettingsChange={onSettingsChange}
diff --git a/config-ui/src/pages/configure/settings/jira.jsx 
b/config-ui/src/pages/configure/settings/jira.jsx
index 2ec55e15..8c397802 100644
--- a/config-ui/src/pages/configure/settings/jira.jsx
+++ b/config-ui/src/pages/configure/settings/jira.jsx
@@ -55,191 +55,50 @@ export default function JiraSettings(props) {
   const {
     provider,
     connection,
-    blueprint,
-    entities = [],
-    configuredBoard,
+    issueTypes = [],
+    fields: fieldsList = [],
     transformation = {},
-    entityIdKey,
-    transformations = {},
-    isSaving,
     onSettingsChange = () => {},
-    issueTypes = [],
-    fields = [],
-    // eslint-disable-next-line no-unused-vars
-    boards = {},
+    entities = [],
+    isSaving,
+    isSavingConnection = false,
     jiraProxyError,
     isFetchingJIRA = false
   } = props
 
-  const [typeMappingBug, setTypeMappingBug] = useState([])
-  const [typeMappingIncident, setTypeMappingIncident] = useState([])
-  const [typeMappingRequirement, setTypeMappingRequirement] = useState([])
-  const [typeMappingAll, setTypeMappingAll] = useState({})
   // eslint-disable-next-line no-unused-vars
   const [statusMappings, setStatusMappings] = useState()
   const [jiraIssueEpicKeyField, setJiraIssueEpicKeyField] = useState('')
   const [jiraIssueStoryPointField, setJiraIssueStoryPointField] = useState('')
   const [remoteLinkCommitSha, setRemoteLinkCommitSha] = useState('')
 
-  // eslint-disable-next-line max-len
-  // const savedRequirementTags = useMemo(() => 
transformation?.requirementTags || [], [transformation?.requirementTags, 
configuredBoard?.id])
-  // eslint-disable-next-line max-len
-  // const savedBugTags = useMemo(() => transformation?.bugTags || [], 
[transformation?.bugTags, configuredBoard?.id])
-  // eslint-disable-next-line max-len
-  // const savedIncidentTags = useMemo(() => transformation?.incidentTags || 
[], [transformation?.incidentTags, configuredBoard?.id])
-
-  // @todo: lift higher to dsm hook
-  const savedRequirementTags = useMemo(
-    () =>
-      boards[connection?.id]
-        ? boards[connection?.id].reduce(
-            (pV, cV, iDx) => ({
-              ...pV,
-              [cV?.id]: connection?.transformations
-                ? connection?.transformations[iDx]?.requirementTags
-                : transformation?.requirementTags
-            }),
-            {}
-          )
-        : {},
-    [
-      connection?.id,
-      boards,
-      connection?.transformations,
-      transformation?.requirementTags
-    ]
-  )
-  const savedBugTags = useMemo(
-    () =>
-      boards[connection?.id]
-        ? boards[connection?.id].reduce(
-            (pV, cV, iDx) => ({
-              ...pV,
-              [cV?.id]: connection?.transformations
-                ? connection?.transformations[iDx]?.bugTags
-                : transformation?.bugTags
-            }),
-            {}
-          )
-        : {},
-    [
-      connection?.id,
-      boards,
-      connection?.transformations,
-      transformation?.bugTags
-    ]
-  )
-  const savedIncidentTags = useMemo(
-    () =>
-      boards[connection?.id]
-        ? boards[connection?.id].reduce(
-            (pV, cV, iDx) => ({
-              ...pV,
-              [cV?.id]: connection?.transformations
-                ? connection?.transformations[iDx]?.incidentTags
-                : transformation?.incidentTags
-            }),
-            {}
-          )
-        : {},
-    [
-      connection?.id,
-      boards,
-      connection?.transformations,
-      transformation?.incidentTags
-    ]
-  )
-
-  const [requirementTags, setRequirementTags] = useState(savedRequirementTags)
-  const [bugTags, setBugTags] = useState(savedBugTags)
-  const [incidentTags, setIncidentTags] = useState(savedIncidentTags)
+  const [requirementTags, setRequirementTags] = useState([])
+  const [bugTags, setBugTags] = useState([])
+  const [incidentTags, setIncidentTags] = useState([])
   const allChosenTagsInThisBoard = useMemo(
     () => [
-      ...(Array.isArray(requirementTags[configuredBoard?.id])
-        ? requirementTags[configuredBoard?.id]
-        : []),
-      ...(Array.isArray(bugTags[configuredBoard?.id])
-        ? bugTags[configuredBoard?.id]
-        : []),
-      ...(Array.isArray(incidentTags[configuredBoard?.id])
-        ? incidentTags[configuredBoard?.id]
-        : [])
+      ...(Array.isArray(requirementTags) ? requirementTags : []),
+      ...(Array.isArray(bugTags) ? bugTags : []),
+      ...(Array.isArray(incidentTags) ? incidentTags : [])
     ],
-    [configuredBoard?.id, requirementTags, bugTags, incidentTags]
+    [requirementTags, bugTags, incidentTags]
   )
 
-  const [fieldsList, setFieldsList] = useState(fields)
-
-  useEffect(() => {
-    if (configuredBoard?.id) {
-      onSettingsChange({ typeMappings: typeMappingAll }, configuredBoard?.id)
-    }
-  }, [typeMappingAll, onSettingsChange, configuredBoard?.id])
-
-  useEffect(() => {
-    setTypeMappingAll((ma) => ({
-      ...ma,
-      ...(typeMappingBug || [])
-        .map((r) => createTypeMapObject(r.value, MAPPING_TYPES.Bug))
-        .reduce((c, p) => ({ ...c, ...p }), {})
-    }))
-  }, [typeMappingBug])
-
-  useEffect(() => {
-    setTypeMappingAll((ma) => ({
-      ...ma,
-      ...(typeMappingIncident || [])
-        .map((r) => createTypeMapObject(r.value, MAPPING_TYPES.Incident))
-        .reduce((c, p) => ({ ...c, ...p }), {})
-    }))
-  }, [typeMappingIncident])
-
   useEffect(() => {
-    setTypeMappingAll((ma) => ({
-      ...ma,
-      ...(typeMappingRequirement || [])
-        .map((r) => createTypeMapObject(r.value, MAPPING_TYPES.Requirement))
-        .reduce((c, p) => ({ ...c, ...p }), {})
-    }))
-  }, [typeMappingRequirement])
+    console.log('>>> JIRA SETTINGS :: FIELDS LIST DATA CHANGED!', fieldsList)
+  }, [fieldsList])
 
   useEffect(() => {
-    if (configuredBoard?.id) {
-      setTypeMappingAll({})
-      setTypeMappingRequirement(requirementTags[configuredBoard?.id])
-      onSettingsChange(
-        { requirementTags: requirementTags[configuredBoard?.id] },
-        configuredBoard?.id
-      )
-    }
-  }, [requirementTags, configuredBoard?.id, onSettingsChange])
+    setBugTags(transformation?.bugTags || [])
+  }, [transformation?.bugTags])
 
   useEffect(() => {
-    if (configuredBoard?.id) {
-      setTypeMappingAll({})
-      setTypeMappingBug(bugTags[configuredBoard?.id])
-      onSettingsChange(
-        { bugTags: bugTags[configuredBoard?.id] },
-        configuredBoard?.id
-      )
-    }
-  }, [bugTags, configuredBoard?.id, onSettingsChange])
+    setIncidentTags(transformation?.incidentTags || [])
+  }, [transformation?.incidentTags])
 
   useEffect(() => {
-    if (configuredBoard?.id) {
-      setTypeMappingAll({})
-      setTypeMappingIncident(incidentTags[configuredBoard?.id])
-      onSettingsChange(
-        { incidentTags: incidentTags[configuredBoard?.id] },
-        configuredBoard?.id
-      )
-    }
-  }, [incidentTags, configuredBoard?.id, onSettingsChange])
-
-  useEffect(() => {
-    console.log('>>> JIRA SETTINGS :: FIELDS LIST DATA CHANGED!', fields)
-    setFieldsList(fields)
-  }, [fields])
+    setRequirementTags(transformation?.requirementTags || [])
+  }, [transformation?.requirementTags])
 
   useEffect(() => {
     setJiraIssueEpicKeyField(
@@ -255,31 +114,29 @@ export default function JiraSettings(props) {
 
   useEffect(() => {
     setRemoteLinkCommitSha(transformation?.remotelinkCommitShaPattern || '')
-  }, [fieldsList, transformation?.remotelinkCommitShaPattern])
-
-  useEffect(() => {
-    console.log('>>>> CONFIGURING BOARD....', configuredBoard)
-  }, [configuredBoard])
+  }, [transformation?.remotelinkCommitShaPattern])
 
   useEffect(() => {
-    console.log('>>>> MY SAVED JIRA REQUIREMENT TAGS...', savedRequirementTags)
-  }, [savedRequirementTags])
-
-  useEffect(() => {
-    console.log('>>>> MY SAVED JIRA BUG TAGS...', savedBugTags)
-  }, [savedBugTags])
-
-  useEffect(() => {
-    console.log('>>>> MY SAVED JIRA INCIDENT TAGS...', savedIncidentTags)
-  }, [savedIncidentTags])
+    console.log('>>> JIRA SETTINGS :: TRANSFORMATION OBJECT!', transformation)
+  }, [transformation])
 
-  useEffect(() => {
-    console.log('>>> JIRA SETTINGS :: CONNECTION OBJECT!', connection)
-  }, [connection])
+  const typeMappingAll = useMemo(
+    () =>
+      [
+        ...bugTags.map((r) => createTypeMapObject(r.value, MAPPING_TYPES.Bug)),
+        ...(incidentTags || []).map((r) =>
+          createTypeMapObject(r.value, MAPPING_TYPES.Incident)
+        ),
+        ...requirementTags.map((r) =>
+          createTypeMapObject(r.value, MAPPING_TYPES.Requirement)
+        )
+      ].reduce((c, p) => ({ ...c, ...p }), {}),
+    [bugTags, incidentTags, requirementTags]
+  )
 
   useEffect(() => {
-    console.log('>>> JIRA SETTINGS :: TRANSFORMATION OBJECT!', transformation)
-  }, [transformation])
+    onSettingsChange({ typeMappings: typeMappingAll })
+  }, [typeMappingAll, onSettingsChange])
 
   return (
     <>
@@ -324,9 +181,7 @@ export default function JiraSettings(props) {
                 inline={true}
                 fill={true}
                 items={issueTypes}
-                // selectedItems={savedTags}
-                // selectedItems={requirementTags[configuredBoard?.id]}
-                selectedItems={requirementTags[configuredBoard?.id]}
+                selectedItems={requirementTags}
                 activeItem={null}
                 itemPredicate={(query, item) =>
                   item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0
@@ -340,9 +195,7 @@ export default function JiraSettings(props) {
                     key={item.value}
                     onClick={handleClick}
                     text={
-                      requirementTags[configuredBoard?.id]?.some(
-                        (t) => t.value === item.value
-                      ) ? (
+                      requirementTags.some((t) => t.value === item.value) ? (
                         <>
                           <img src={item.iconUrl} width={12} height={12} />{' 
'}
                           {item.title}{' '}
@@ -357,7 +210,7 @@ export default function JiraSettings(props) {
                     }
                     style={{
                       marginBottom: '2px',
-                      fontWeight: requirementTags[configuredBoard?.id]?.some(
+                      fontWeight: requirementTags.some(
                         (t) => t.value === item.value
                       )
                         ? 700
@@ -375,34 +228,18 @@ export default function JiraSettings(props) {
                 }}
                 noResults={<MenuItem disabled={true} text='No results.' />}
                 onRemove={(item) => {
-                  // setRequirementTags((rT) => rT.filter(t => t.id !== 
item.id))
-                  setRequirementTags((rT) => ({
-                    ...rT,
-                    [configuredBoard?.id]: rT[configuredBoard?.id]?.filter(
-                      (t) => t.id !== item.id
-                    )
-                  }))
+                  const newValue = requirementTags.filter(
+                    (t) => t.id !== item.id
+                  )
+                  setRequirementTags(newValue)
+                  onSettingsChange({ requirementTags: newValue })
                 }}
                 onItemSelect={(item) => {
-                  // setRequirementTags((rT) => !rT.includes(item) ? [...rT, 
item] : [...rT])
-                  setRequirementTags((rT) =>
-                    !rT[configuredBoard?.id]?.some(
-                      (t) => t.value === item.value
-                    )
-                      ? {
-                          ...rT,
-                          [configuredBoard?.id]: [
-                            ...(rT[configuredBoard?.id] || []),
-                            item
-                          ]
-                        }
-                      : {
-                          ...rT,
-                          [configuredBoard?.id]: [
-                            ...(rT[configuredBoard?.id] || [])
-                          ]
-                        }
-                  )
+                  const newValue = !requirementTags.includes(item)
+                    ? [...requirementTags, item]
+                    : [...requirementTags]
+                  setRequirementTags(newValue)
+                  onSettingsChange({ requirementTags: newValue })
                 }}
               />
             </div>
@@ -415,12 +252,10 @@ export default function JiraSettings(props) {
                 disabled={requirementTags?.length === 0 || isSaving}
                 intent={Intent.NONE}
                 minimal={false}
-                onClick={() =>
-                  setRequirementTags((rT) => ({
-                    ...rT,
-                    [configuredBoard?.id]: []
-                  }))
-                }
+                onClick={() => {
+                  setRequirementTags([])
+                  onSettingsChange({ requirementTags: [] })
+                }}
                 style={{
                   borderTopLeftRadius: 0,
                   borderBottomLeftRadius: 0,
@@ -461,7 +296,7 @@ export default function JiraSettings(props) {
                 inline={true}
                 fill={true}
                 items={issueTypes}
-                selectedItems={bugTags[configuredBoard?.id]}
+                selectedItems={bugTags}
                 activeItem={null}
                 itemPredicate={(query, item) =>
                   item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0
@@ -475,9 +310,7 @@ export default function JiraSettings(props) {
                     key={item.value}
                     onClick={handleClick}
                     text={
-                      bugTags[configuredBoard?.id]?.some(
-                        (t) => t.value === item.value
-                      ) ? (
+                      bugTags.some((t) => t.value === item.value) ? (
                         <>
                           <img src={item.iconUrl} width={12} height={12} />{' 
'}
                           {item.title}{' '}
@@ -492,9 +325,7 @@ export default function JiraSettings(props) {
                     }
                     style={{
                       marginBottom: '2px',
-                      fontWeight: bugTags[configuredBoard?.id]?.some(
-                        (t) => t.value === item.value
-                      )
+                      fontWeight: bugTags.some((t) => t.value === item.value)
                         ? 700
                         : 'normal'
                     }}
@@ -510,34 +341,16 @@ export default function JiraSettings(props) {
                 }}
                 noResults={<MenuItem disabled={true} text='No results.' />}
                 onRemove={(item) => {
-                  // setBugTags((bT) => bT.filter(t => t.id !== item.id))
-                  setBugTags((bT) => ({
-                    ...bT,
-                    [configuredBoard?.id]: bT[configuredBoard?.id]?.filter(
-                      (t) => t.id !== item.id
-                    )
-                  }))
+                  const newValue = bugTags.filter((t) => t.id !== item.id)
+                  setBugTags(newValue)
+                  onSettingsChange({ bugTags: newValue })
                 }}
                 onItemSelect={(item) => {
-                  // setBugTags((bT) => !bT.includes(item) ? [...bT, item] : 
[...bT])
-                  setBugTags((bT) =>
-                    !bT[configuredBoard?.id]?.some(
-                      (t) => t.value === item.value
-                    )
-                      ? {
-                          ...bT,
-                          [configuredBoard?.id]: [
-                            ...(bT[configuredBoard?.id] || []),
-                            item
-                          ]
-                        }
-                      : {
-                          ...bT,
-                          [configuredBoard?.id]: [
-                            ...(bT[configuredBoard?.id] || [])
-                          ]
-                        }
-                  )
+                  const newValue = !bugTags.includes(item)
+                    ? [...bugTags, item]
+                    : [...bugTags]
+                  setBugTags(newValue)
+                  onSettingsChange({ bugTags: newValue })
                 }}
               />
             </div>
@@ -550,9 +363,10 @@ export default function JiraSettings(props) {
                 disabled={bugTags.length === 0 || isSaving}
                 intent={Intent.NONE}
                 minimal={false}
-                onClick={() =>
-                  setBugTags((bT) => ({ ...bT, [configuredBoard?.id]: [] }))
-                }
+                onClick={() => {
+                  setBugTags([])
+                  onSettingsChange({ bugTags: [] })
+                }}
                 style={{
                   borderTopLeftRadius: 0,
                   borderBottomLeftRadius: 0,
@@ -602,7 +416,7 @@ export default function JiraSettings(props) {
                 inline={true}
                 fill={true}
                 items={issueTypes}
-                selectedItems={incidentTags[configuredBoard?.id]}
+                selectedItems={incidentTags}
                 activeItem={null}
                 itemPredicate={(query, item) =>
                   item?.title.toLowerCase().indexOf(query.toLowerCase()) >= 0
@@ -616,9 +430,7 @@ export default function JiraSettings(props) {
                     key={item.value}
                     onClick={handleClick}
                     text={
-                      incidentTags[configuredBoard?.id]?.some(
-                        (t) => t.value === item.value
-                      ) ? (
+                      incidentTags.some((t) => t.value === item.value) ? (
                         <>
                           <img src={item.iconUrl} width={12} height={12} />{' 
'}
                           {item.title}{' '}
@@ -633,7 +445,7 @@ export default function JiraSettings(props) {
                     }
                     style={{
                       marginBottom: '2px',
-                      fontWeight: incidentTags[configuredBoard?.id]?.some(
+                      fontWeight: incidentTags.some(
                         (t) => t.value === item.value
                       )
                         ? 700
@@ -651,34 +463,16 @@ export default function JiraSettings(props) {
                 }}
                 noResults={<MenuItem disabled={true} text='No results.' />}
                 onRemove={(item) => {
-                  // setIncidentTags((iT) => iT.filter(t => t.id !== item.id))
-                  setIncidentTags((iT) => ({
-                    ...iT,
-                    [configuredBoard?.id]: iT[configuredBoard?.id]?.filter(
-                      (t) => t.id !== item.id
-                    )
-                  }))
+                  const newValue = incidentTags.filter((t) => t.id !== item.id)
+                  setIncidentTags(newValue)
+                  onSettingsChange({ incidentTags: newValue })
                 }}
                 onItemSelect={(item) => {
-                  // setIncidentTags((iT) => !iT.includes(item) ? [...iT, 
item] : [...iT])
-                  setIncidentTags((iT) =>
-                    !iT[configuredBoard?.id]?.some(
-                      (t) => t.value === item.value
-                    )
-                      ? {
-                          ...iT,
-                          [configuredBoard?.id]: [
-                            ...(iT[configuredBoard?.id] || []),
-                            item
-                          ]
-                        }
-                      : {
-                          ...iT,
-                          [configuredBoard?.id]: [
-                            ...(iT[configuredBoard?.id] || [])
-                          ]
-                        }
-                  )
+                  const newValue = !incidentTags.includes(item)
+                    ? [...incidentTags, item]
+                    : incidentTags
+                  setIncidentTags(newValue)
+                  onSettingsChange({ incidentTags: newValue })
                 }}
               />
             </div>
@@ -691,12 +485,10 @@ export default function JiraSettings(props) {
                 disabled={incidentTags.length === 0 || isSaving}
                 intent={Intent.NONE}
                 minimal={false}
-                onClick={() =>
-                  setIncidentTags((iT) => ({
-                    ...iT,
-                    [configuredBoard?.id]: []
-                  }))
-                }
+                onClick={() => {
+                  setIncidentTags([])
+                  onSettingsChange({ incidentTags: [] })
+                }}
                 style={{
                   borderTopLeftRadius: 0,
                   borderBottomLeftRadius: 0,
@@ -773,10 +565,7 @@ export default function JiraSettings(props) {
                   }
                   onItemSelect={(item) => {
                     setJiraIssueEpicKeyField(item)
-                    onSettingsChange(
-                      { epicKeyField: item?.value },
-                      configuredBoard?.id
-                    )
+                    onSettingsChange({ epicKeyField: item?.value })
                   }}
                   popoverProps={{
                     position: Position.TOP
@@ -808,7 +597,7 @@ export default function JiraSettings(props) {
                   minimal={false}
                   onClick={() => {
                     setJiraIssueEpicKeyField('')
-                    onSettingsChange({ epicKeyField: '' }, configuredBoard?.id)
+                    onSettingsChange({ epicKeyField: '' })
                   }}
                 />
               </ButtonGroup>
@@ -895,10 +684,7 @@ export default function JiraSettings(props) {
                   }
                   onItemSelect={(item) => {
                     setJiraIssueStoryPointField(item)
-                    onSettingsChange(
-                      { storyPointField: item?.value },
-                      configuredBoard?.id
-                    )
+                    onSettingsChange({ storyPointField: item?.value })
                   }}
                   popoverProps={{
                     position: Position.TOP
@@ -931,10 +717,7 @@ export default function JiraSettings(props) {
                   minimal={false}
                   onClick={() => {
                     setJiraIssueStoryPointField('')
-                    onSettingsChange(
-                      { storyPointField: '' },
-                      configuredBoard?.id
-                    )
+                    onSettingsChange({ storyPointField: '' })
                   }}
                 />
               </ButtonGroup>
@@ -974,10 +757,9 @@ export default function JiraSettings(props) {
                 placeholder='/commit/([0-9a-f]{40})$'
                 value={remoteLinkCommitSha}
                 onChange={(e) =>
-                  onSettingsChange(
-                    { remotelinkCommitShaPattern: e.target.value },
-                    configuredBoard?.id
-                  )
+                  onSettingsChange({
+                    remotelinkCommitShaPattern: e.target.value
+                  })
                 }
                 disabled={isSaving}
                 className='input'
diff --git a/config-ui/src/pages/configure/settings/tapd.jsx 
b/config-ui/src/pages/configure/settings/tapd.jsx
index 251fe714..3d472a98 100644
--- a/config-ui/src/pages/configure/settings/tapd.jsx
+++ b/config-ui/src/pages/configure/settings/tapd.jsx
@@ -30,27 +30,11 @@ export default function TapdSettings(props) {
     onSettingsChange = () => {}
   } = props
   const history = useHistory()
-  const { providerId, connectionId } = useParams()
-
-  // eslint-disable-next-line max-len
-  const [errors, setErrors] = useState([])
 
   const cancel = () => {
     history.push(`/integrations/${provider.id}`)
   }
 
-  // useEffect(() => {
-  //   setErrors(['This integration doesn’t require any configuration.'])
-  // }, [])
-
-  useEffect(() => {
-    onSettingsChange({
-      errors,
-      providerId,
-      connectionId
-    })
-  }, [errors, onSettingsChange, connectionId, providerId])
-
   return (
     <>
       <div className='headlineContainer'>


Reply via email to