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

likyh 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 0a43e9cd7 refactor(config-ui): simplify the selection and change of 
data scope (#4281)
0a43e9cd7 is described below

commit 0a43e9cd763b284cb530540926f8f087378fe5cd
Author: 青湛 <[email protected]>
AuthorDate: Tue Jan 31 23:22:21 2023 +0800

    refactor(config-ui): simplify the selection and change of data scope (#4281)
    
    * refactor(config-ui): simplify the selection and change of data scope
    
    * fix(config-ui): operator supports hidden toast
---
 config-ui/package-lock.json                        |  6 +--
 config-ui/package.json                             |  2 +-
 .../src/pages/blueprint/create/step-two/index.tsx  | 13 +----
 .../blueprint/create/step-two/use-columns.tsx      | 15 ++----
 .../pages/blueprint/detail/panel/configuration.tsx | 21 ++------
 .../plugins/components/data-scope-list/index.tsx   | 15 ++----
 .../src/plugins/components/data-scope/index.tsx    | 41 ++++------------
 .../components/data-scope/use-data-scope.ts        | 27 +++++------
 .../github/components/miller-columns/index.tsx     | 48 +++++++------------
 .../src/plugins/register/github/data-scope.tsx     | 17 ++-----
 .../gitlab/components/miller-columns/index.tsx     | 56 ++++++++--------------
 .../gitlab/components/project-selector/index.tsx   |  8 ++--
 .../src/plugins/register/gitlab/data-scope.tsx     | 17 ++-----
 .../jenkins/components/miller-columns/index.tsx    | 19 +++-----
 .../src/plugins/register/jenkins/data-scope.tsx    | 10 +---
 .../jira/components/miller-columns/index.tsx       | 19 +++-----
 config-ui/src/plugins/register/jira/data-scope.tsx | 10 +---
 config-ui/src/utils/operator.ts                    | 27 ++++++-----
 18 files changed, 117 insertions(+), 254 deletions(-)

diff --git a/config-ui/package-lock.json b/config-ui/package-lock.json
index b0ea5216f..187d74be7 100644
--- a/config-ui/package-lock.json
+++ b/config-ui/package-lock.json
@@ -10247,9 +10247,9 @@
       }
     },
     "miller-columns-select": {
-      "version": "1.0.0-alpha.9",
-      "resolved": 
"https://registry.npmjs.org/miller-columns-select/-/miller-columns-select-1.0.0-alpha.9.tgz";,
-      "integrity": 
"sha512-ZYM7iKN/2MFaj5c9hNhbZXtUSFoKiJxrDwmK0VGWRSrUe09HiSoKrBxM3MipdgxPJyAnRKMZS0WaxComl+jXXQ==",
+      "version": "1.0.0-beta.0",
+      "resolved": 
"https://registry.npmjs.org/miller-columns-select/-/miller-columns-select-1.0.0-beta.0.tgz";,
+      "integrity": 
"sha512-CyC8daCoxlbXKpgRRA08HiYvlhsz/snzidJTtkhQIh6HLwa+tBL2N42BPkfz7ZEyW4K8WB/GP4l0bq3zun0APA==",
       "requires": {
         "classnames": "^2.3.2",
         "react-infinite-scroll-component": "^6.1.0",
diff --git a/config-ui/package.json b/config-ui/package.json
index 0670321fe..ea2fa3304 100644
--- a/config-ui/package.json
+++ b/config-ui/package.json
@@ -35,7 +35,7 @@
     "dotenv": "^10.0.0",
     "dotenv-webpack": "^7.0.3",
     "file-saver": "^2.0.5",
-    "miller-columns-select": "^1.0.0-alpha.9",
+    "miller-columns-select": "^1.0.0-beta.0",
     "react": "17.0.2",
     "react-copy-to-clipboard": "^5.1.0",
     "react-dom": "17.0.2",
diff --git a/config-ui/src/pages/blueprint/create/step-two/index.tsx 
b/config-ui/src/pages/blueprint/create/step-two/index.tsx
index 82609fdf1..1d0389cfd 100644
--- a/config-ui/src/pages/blueprint/create/step-two/index.tsx
+++ b/config-ui/src/pages/blueprint/create/step-two/index.tsx
@@ -44,15 +44,6 @@ export const StepTwo = () => {
     onChangeShowDetail(false);
   };
 
-  const handleDeleteScope = (plugin: string, connectionId: ID, scopeId: ID) => 
{
-    const unique = `${plugin}-${connectionId}`;
-
-    onChangeScopeMap({
-      ...scopeMap,
-      [`${unique}`]: scopeMap[unique].filter((sc: any) => sc.id !== scopeId),
-    });
-  };
-
   const handleSave = (scope: any) => {
     if (!connection) return;
     onChangeScopeMap({
@@ -62,7 +53,7 @@ export const StepTwo = () => {
     handleBack();
   };
 
-  const columns = useColumns({ onDetail: handleGoDetail, onDelete: 
handleDeleteScope });
+  const columns = useColumns({ onDetail: handleGoDetail });
   const dataSource = useMemo(
     () =>
       uniqueList.map((unique) => {
@@ -84,7 +75,7 @@ export const StepTwo = () => {
         <Icon icon="arrow-left" size={14} />
         <span>Cancel and Go Back to the Data Scope List</span>
       </div>
-      <h2>Add Data Scope</h2>
+      <h2>Set Data Scope</h2>
       <Divider />
       <div className="connection">
         <img src={connection.icon} width={24} alt="" />
diff --git a/config-ui/src/pages/blueprint/create/step-two/use-columns.tsx 
b/config-ui/src/pages/blueprint/create/step-two/use-columns.tsx
index 75889231c..b10fc2867 100644
--- a/config-ui/src/pages/blueprint/create/step-two/use-columns.tsx
+++ b/config-ui/src/pages/blueprint/create/step-two/use-columns.tsx
@@ -28,10 +28,9 @@ import * as S from './styled';
 
 interface Props {
   onDetail: (connection: BPConnectionItemType) => void;
-  onDelete: (plugin: string, connectionId: ID, scopeId: ID) => void;
 }
 
-export const useColumns = ({ onDetail, onDelete }: Props) => {
+export const useColumns = ({ onDetail }: Props) => {
   return useMemo(
     () =>
       [
@@ -51,13 +50,7 @@ export const useColumns = ({ onDetail, onDelete }: Props) => 
{
           dataIndex: ['plugin', 'id', 'scopeIds'],
           key: 'unique',
           render: ({ plugin, id, scopeIds }: Pick<BPConnectionItemType, 
'plugin' | 'id' | 'scopeIds'>) => (
-            <DataScopeList
-              groupByTs={false}
-              plugin={plugin}
-              connectionId={id}
-              scopeIds={scopeIds}
-              onDelete={onDelete}
-            />
+            <DataScopeList groupByTs={false} plugin={plugin} connectionId={id} 
scopeIds={scopeIds} />
           ),
         },
         {
@@ -70,12 +63,12 @@ export const useColumns = ({ onDetail, onDelete }: Props) 
=> {
               minimal
               intent={Intent.PRIMARY}
               icon="add"
-              text="Add Scope"
+              text="Set Data Scope"
               onClick={() => onDetail(connection)}
             />
           ),
         },
       ] as ColumnType<BPConnectionItemType>,
-    [onDetail, onDelete],
+    [onDetail],
   );
 };
diff --git a/config-ui/src/pages/blueprint/detail/panel/configuration.tsx 
b/config-ui/src/pages/blueprint/detail/panel/configuration.tsx
index 3369a067f..81d3901f8 100644
--- a/config-ui/src/pages/blueprint/detail/panel/configuration.tsx
+++ b/config-ui/src/pages/blueprint/detail/panel/configuration.tsx
@@ -136,27 +136,14 @@ export const Configuration = ({ blueprint, operating, 
onUpdate, onRefresh }: Pro
         },
         {
           title: 'Data Scope and Transformation',
-          dataIndex: ['plugin', 'connectionId', 'scopeIds', 'scope'],
+          dataIndex: ['plugin', 'connectionId', 'scopeIds'],
           key: 'sopce',
           render: ({
             plugin,
             connectionId,
             scopeIds,
-            scope,
-          }: Pick<ConfigConnectionItemType, 'plugin' | 'connectionId' | 
'scopeIds' | 'scope'>) => (
-            <DataScopeList
-              groupByTs
-              plugin={plugin}
-              connectionId={connectionId}
-              scopeIds={scopeIds}
-              onDelete={(plugin: string, connectionId: ID, scopeId: ID) =>
-                handleUpdateConnection({
-                  plugin,
-                  connectionId,
-                  scopes: scope.filter((sc) => sc.id !== scopeId),
-                })
-              }
-            />
+          }: Pick<ConfigConnectionItemType, 'plugin' | 'connectionId' | 
'scopeIds'>) => (
+            <DataScopeList groupByTs plugin={plugin} 
connectionId={connectionId} scopeIds={scopeIds} />
           ),
         },
         {
@@ -173,7 +160,7 @@ export const Configuration = ({ blueprint, operating, 
onUpdate, onRefresh }: Pro
                 }}
               >
                 <Icon icon="add" color={Colors.BLUE2} />
-                <span>Add Data Scope</span>
+                <span>Change Data Scope</span>
               </div>
               <div
                 className="item"
diff --git a/config-ui/src/plugins/components/data-scope-list/index.tsx 
b/config-ui/src/plugins/components/data-scope-list/index.tsx
index 0f3eed8ed..aad93209e 100644
--- a/config-ui/src/plugins/components/data-scope-list/index.tsx
+++ b/config-ui/src/plugins/components/data-scope-list/index.tsx
@@ -17,10 +17,10 @@
  */
 
 import React from 'react';
-import { Button, Icon, Intent, Position } from '@blueprintjs/core';
+import { Icon, Position } from '@blueprintjs/core';
 import { Tooltip2 } from '@blueprintjs/popover2';
 
-import { Loading, DeleteButton } from '@/components';
+import { Loading } from '@/components';
 
 import type { UseDataScopeList } from './use-data-scope-list';
 import { useDataScopeList } from './use-data-scope-list';
@@ -29,10 +29,9 @@ import * as S from './styled';
 interface Props extends UseDataScopeList {
   groupByTs: boolean;
   scopeIds: string[];
-  onDelete?: (plugin: string, connectionId: ID, scopeId: ID) => void;
 }
 
-export const DataScopeList = ({ groupByTs, scopeIds, onDelete, ...props }: 
Props) => {
+export const DataScopeList = ({ groupByTs, scopeIds, ...props }: Props) => {
   const { loading, scope, scopeTsMap } = useDataScopeList({ scopeIds, ...props 
});
 
   if (!scope.length) {
@@ -49,9 +48,6 @@ export const DataScopeList = ({ groupByTs, scopeIds, 
onDelete, ...props }: Props
         scope.map((sc) => (
           <S.ScopeItem key={sc.id}>
             <span>{sc.name}</span>
-            <DeleteButton onDelete={() => onDelete?.(props.plugin, 
props.connectionId, sc.id)}>
-              <Button small minimal intent={Intent.PRIMARY} icon="cross" />
-            </DeleteButton>
           </S.ScopeItem>
         ))}
 
@@ -68,11 +64,6 @@ export const DataScopeList = ({ groupByTs, scopeIds, 
onDelete, ...props }: Props
                   <Tooltip2 className="name" content={sc.name} 
position={Position.TOP}>
                     <span>{sc.name}</span>
                   </Tooltip2>
-                  {onDelete && scopeIds.length > 1 && (
-                    <DeleteButton onDelete={() => onDelete(props.plugin, 
props.connectionId, sc.id)}>
-                      <Button small minimal intent={Intent.PRIMARY} 
icon="cross" />
-                    </DeleteButton>
-                  )}
                 </li>
               ))}
             </ul>
diff --git a/config-ui/src/plugins/components/data-scope/index.tsx 
b/config-ui/src/plugins/components/data-scope/index.tsx
index 3253bba20..75f92a3fe 100644
--- a/config-ui/src/plugins/components/data-scope/index.tsx
+++ b/config-ui/src/plugins/components/data-scope/index.tsx
@@ -35,51 +35,30 @@ interface Props extends UseDataScope {
 }
 
 export const DataScope = ({ plugin, connectionId, entities, onCancel, ...props 
}: Props) => {
-  const { saving, disabledScope, selectedScope, selectedEntities, 
onChangeScope, onChangeEntites, onSave } =
-    useDataScope({
-      ...props,
-      plugin,
-      connectionId,
-      entities,
-    });
+  const { saving, selectedScope, selectedEntities, onChangeScope, 
onChangeEntites, onSave } = useDataScope({
+    ...props,
+    plugin,
+    connectionId,
+    entities,
+  });
 
   return (
     <S.Wrapper>
       <div className="block">
         {plugin === 'github' && (
-          <GitHubDataScope
-            connectionId={connectionId}
-            disabledItems={disabledScope}
-            selectedItems={selectedScope}
-            onChangeItems={onChangeScope}
-          />
+          <GitHubDataScope connectionId={connectionId} 
selectedItems={selectedScope} onChangeItems={onChangeScope} />
         )}
 
         {plugin === 'jira' && (
-          <JIRADataScope
-            connectionId={connectionId}
-            disabledItems={disabledScope}
-            selectedItems={selectedScope}
-            onChangeItems={onChangeScope}
-          />
+          <JIRADataScope connectionId={connectionId} 
selectedItems={selectedScope} onChangeItems={onChangeScope} />
         )}
 
         {plugin === 'gitlab' && (
-          <GitLabDataScope
-            connectionId={connectionId}
-            disabledItems={disabledScope}
-            selectedItems={selectedScope}
-            onChangeItems={onChangeScope}
-          />
+          <GitLabDataScope connectionId={connectionId} 
selectedItems={selectedScope} onChangeItems={onChangeScope} />
         )}
 
         {plugin === 'jenkins' && (
-          <JenkinsDataScope
-            connectionId={connectionId}
-            disabledItems={disabledScope}
-            selectedItems={selectedScope}
-            onChangeItems={onChangeScope}
-          />
+          <JenkinsDataScope connectionId={connectionId} 
selectedItems={selectedScope} onChangeItems={onChangeScope} />
         )}
       </div>
 
diff --git a/config-ui/src/plugins/components/data-scope/use-data-scope.ts 
b/config-ui/src/plugins/components/data-scope/use-data-scope.ts
index 7632315b6..0c4cf3cf3 100644
--- a/config-ui/src/plugins/components/data-scope/use-data-scope.ts
+++ b/config-ui/src/plugins/components/data-scope/use-data-scope.ts
@@ -37,17 +37,16 @@ export interface UseDataScope {
 
 export const useDataScope = ({ plugin, connectionId, entities, initialValues, 
onSave }: UseDataScope) => {
   const [saving, setSaving] = useState(false);
-  const [disabledScope, setDisabledScope] = useState<any>([]);
   const [selectedScope, setSelectedScope] = useState<any>([]);
   const [selectedEntities, setSelectedEntities] = useState<any>([]);
 
-  const handleSetDisabledScope = async (disabledScope: any) => {
-    const scope = await Promise.all(disabledScope.map((sc: any) => 
API.getDataScope(plugin, connectionId, sc.id)));
-    setDisabledScope(scope);
-  };
-
   useEffect(() => {
-    handleSetDisabledScope(initialValues?.scope ?? []);
+    (async () => {
+      const scope = await Promise.all(
+        (initialValues?.scope ?? []).map((sc: any) => API.getDataScope(plugin, 
connectionId, sc.id)),
+      );
+      setSelectedScope(scope);
+    })();
   }, [initialValues?.scope]);
 
   useEffect(() => {
@@ -89,33 +88,29 @@ export const useDataScope = ({ plugin, connectionId, 
entities, initialValues, on
         }),
       {
         setOperating: setSaving,
+        hideToast: true,
       },
     );
 
     if (success) {
-      onSave?.([
-        ...(initialValues?.scope ?? []).map((it: any) => ({
-          id: `${it.id}`,
-          entities: selectedEntities.map((it: any) => it.value),
-        })),
-        ...res.map((it: any) => ({
+      onSave?.(
+        res.map((it: any) => ({
           id: `${getPluginId(it)}`,
           entities: selectedEntities.map((it: any) => it.value),
         })),
-      ]);
+      );
     }
   };
 
   return useMemo(
     () => ({
       saving,
-      disabledScope,
       selectedScope,
       selectedEntities,
       onChangeScope: setSelectedScope,
       onChangeEntites: setSelectedEntities,
       onSave: handleSave,
     }),
-    [saving, disabledScope, selectedScope, selectedEntities],
+    [saving, selectedScope, selectedEntities],
   );
 };
diff --git 
a/config-ui/src/plugins/register/github/components/miller-columns/index.tsx 
b/config-ui/src/plugins/register/github/components/miller-columns/index.tsx
index 4c8fda4a1..51510fe75 100644
--- a/config-ui/src/plugins/register/github/components/miller-columns/index.tsx
+++ b/config-ui/src/plugins/register/github/components/miller-columns/index.tsx
@@ -17,7 +17,6 @@
  */
 
 import React, { useState, useEffect } from 'react';
-import { uniqWith, isEqual } from 'lodash';
 import type { ID, ColumnType } from 'miller-columns-select';
 import MillerColumnsSelect from 'miller-columns-select';
 
@@ -29,13 +28,11 @@ import { useMillerColumns, UseMillerColumnsProps } from 
'./use-miller-columns';
 import * as S from './styled';
 
 interface Props extends UseMillerColumnsProps {
-  disabledItems?: ScopeItemType[];
-  selectedItems?: ScopeItemType[];
-  onChangeItems?: (selectedItems: ScopeItemType[]) => void;
+  selectedItems: ScopeItemType[];
+  onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const MillerColumns = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
-  const [disabledIds, setDisabledIds] = useState<ID[]>([]);
+export const MillerColumns = ({ connectionId, selectedItems, onChangeItems }: 
Props) => {
   const [selectedIds, setSelectedIds] = useState<ID[]>([]);
 
   const { items, getHasMore, onExpandItem, onScrollColumn } = 
useMillerColumns({
@@ -43,34 +40,24 @@ export const MillerColumns = ({ connectionId, 
disabledItems, selectedItems, onCh
   });
 
   useEffect(() => {
-    setDisabledIds((disabledItems ?? []).map((it) => it.githubId));
-  }, [disabledItems]);
-
-  useEffect(() => {
-    setSelectedIds((selectedItems ?? []).map((it) => it.githubId));
+    setSelectedIds(selectedItems.map((it) => it.githubId));
   }, [selectedItems]);
 
   const handleChangeItems = (selectedIds: ID[]) => {
-    const result = uniqWith(
-      [
-        ...items
-          .filter((it) => it.type === 'repo')
-          .map((it) => ({
-            connectionId,
-            githubId: it.githubId,
-            name: it.name,
-            ownerId: it.ownerId,
-            language: it.language,
-            description: it.description,
-            cloneUrl: it.cloneUrl,
-            HTMLUrl: it.HTMLUrl,
-          })),
-        ...(selectedItems ?? []),
-      ],
-      isEqual,
-    ).filter((it) => selectedIds.includes(it.githubId));
+    const result = items
+      .filter((it) => (selectedIds.length ? selectedIds.includes(it.id) : 
false))
+      .map((it) => ({
+        connectionId,
+        githubId: it.githubId,
+        name: it.name,
+        ownerId: it.ownerId,
+        language: it.language,
+        description: it.description,
+        cloneUrl: it.cloneUrl,
+        HTMLUrl: it.HTMLUrl,
+      }));
 
-    onChangeItems?.(result);
+    onChangeItems(result);
   };
 
   const renderTitle = (column: ColumnType<any>) => {
@@ -91,7 +78,6 @@ export const MillerColumns = ({ connectionId, disabledItems, 
selectedItems, onCh
       renderLoading={renderLoading}
       items={items}
       selectedIds={selectedIds}
-      disabledIds={disabledIds}
       onSelectItemIds={handleChangeItems}
       onExpandItem={onExpandItem}
       onScrollColumn={onScrollColumn}
diff --git a/config-ui/src/plugins/register/github/data-scope.tsx 
b/config-ui/src/plugins/register/github/data-scope.tsx
index 9fc7ad763..5101e3619 100644
--- a/config-ui/src/plugins/register/github/data-scope.tsx
+++ b/config-ui/src/plugins/register/github/data-scope.tsx
@@ -24,12 +24,11 @@ import { MillerColumns, RepoSelector } from './components';
 
 interface Props {
   connectionId: ID;
-  disabledItems: ScopeItemType[];
   selectedItems: ScopeItemType[];
   onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const GitHubDataScope = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
+export const GitHubDataScope = ({ connectionId, selectedItems, onChangeItems 
}: Props) => {
   const handleChangeItems = (scope: ScopeItemType[]) => {
     onChangeItems(scope);
   };
@@ -38,20 +37,10 @@ export const GitHubDataScope = ({ connectionId, 
disabledItems, selectedItems, on
     <>
       <h3>Repositories *</h3>
       <p>Select the repositories you would like to sync.</p>
-      <MillerColumns
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={handleChangeItems}
-      />
+      <MillerColumns connectionId={connectionId} selectedItems={selectedItems} 
onChangeItems={handleChangeItems} />
       <h4>Add repositories outside of your organizations</h4>
       <p>Search for repositories and add to them</p>
-      <RepoSelector
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={handleChangeItems}
-      />
+      <RepoSelector connectionId={connectionId} selectedItems={selectedItems} 
onChangeItems={handleChangeItems} />
     </>
   );
 };
diff --git 
a/config-ui/src/plugins/register/gitlab/components/miller-columns/index.tsx 
b/config-ui/src/plugins/register/gitlab/components/miller-columns/index.tsx
index 70045ffd7..93ae0f2a0 100644
--- a/config-ui/src/plugins/register/gitlab/components/miller-columns/index.tsx
+++ b/config-ui/src/plugins/register/gitlab/components/miller-columns/index.tsx
@@ -17,7 +17,6 @@
  */
 
 import React, { useEffect, useState } from 'react';
-import { uniqWith, isEqual } from 'lodash';
 import MillerColumnsSelect from 'miller-columns-select';
 
 import { Loading } from '@/components';
@@ -29,13 +28,11 @@ import { useMillerColumns } from './use-miller-columns';
 import * as S from './styled';
 
 interface Props extends UseMillerColumnsProps {
-  disabledItems?: ScopeItemType[];
-  selectedItems?: ScopeItemType[];
-  onChangeItems?: (selectedItems: ScopeItemType[]) => void;
+  selectedItems: ScopeItemType[];
+  onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const MillerColumns = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
-  const [disabledIds, setDisabledIds] = useState<ID[]>([]);
+export const MillerColumns = ({ connectionId, selectedItems, onChangeItems }: 
Props) => {
   const [selectedIds, setSelectedIds] = useState<ID[]>([]);
 
   const { items, getHasMore, onExpandItem, onScrollColumn } = 
useMillerColumns({
@@ -43,38 +40,28 @@ export const MillerColumns = ({ connectionId, 
disabledItems, selectedItems, onCh
   });
 
   useEffect(() => {
-    setDisabledIds((disabledItems ?? []).map((it) => it.gitlabId));
-  }, [disabledItems]);
-
-  useEffect(() => {
-    setSelectedIds((selectedItems ?? []).map((it) => it.gitlabId));
+    setSelectedIds(selectedItems.map((it) => it.gitlabId));
   }, [selectedItems]);
 
   const handleChangeItems = (selectedIds: ID[]) => {
-    const result = uniqWith(
-      [
-        ...items
-          .filter((it) => it.type === 'project')
-          .map((it) => ({
-            connectionId,
-            gitlabId: it.id,
-            name: it.name,
-            pathWithNamespace: it.pathWithNamespace,
-            creatorId: it.creatorId,
-            defaultBranch: it.defaultBranch,
-            description: it.description,
-            openIssuesCount: it.openIssuesCount,
-            starCount: it.starCount,
-            visibility: it.visibility,
-            webUrl: it.webUrl,
-            httpUrlToRepo: it.httpUrlToRepo,
-          })),
-        ...(selectedItems ?? []),
-      ],
-      isEqual,
-    ).filter((it) => selectedIds.includes(it.gitlabId));
+    const result = items
+      .filter((it) => (selectedIds.length ? selectedIds.includes(it.id) : 
false))
+      .map((it) => ({
+        connectionId,
+        gitlabId: it.id,
+        name: it.name,
+        pathWithNamespace: it.pathWithNamespace,
+        creatorId: it.creatorId,
+        defaultBranch: it.defaultBranch,
+        description: it.description,
+        openIssuesCount: it.openIssuesCount,
+        starCount: it.starCount,
+        visibility: it.visibility,
+        webUrl: it.webUrl,
+        httpUrlToRepo: it.httpUrlToRepo,
+      }));
 
-    onChangeItems?.(result);
+    onChangeItems(result);
   };
 
   const renderTitle = (column: GitLabColumnType) => {
@@ -94,7 +81,6 @@ export const MillerColumns = ({ connectionId, disabledItems, 
selectedItems, onCh
       renderTitle={renderTitle}
       renderLoading={renderLoading}
       items={items}
-      disabledIds={disabledIds}
       selectedIds={selectedIds}
       onSelectItemIds={handleChangeItems}
       onExpandItem={onExpandItem}
diff --git 
a/config-ui/src/plugins/register/gitlab/components/project-selector/index.tsx 
b/config-ui/src/plugins/register/gitlab/components/project-selector/index.tsx
index d4c141ddc..93ecdfa1e 100644
--- 
a/config-ui/src/plugins/register/gitlab/components/project-selector/index.tsx
+++ 
b/config-ui/src/plugins/register/gitlab/components/project-selector/index.tsx
@@ -28,12 +28,11 @@ import { useProjectSelector } from './use-project-selector';
 import * as S from './styled';
 
 interface Props extends UseProjectSelectorProps {
-  disabledItems?: ScopeItemType[];
-  selectedItems?: ScopeItemType[];
-  onChangeItems?: (selectedItems: ScopeItemType[]) => void;
+  selectedItems: ScopeItemType[];
+  onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const ProjectSelector = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
+export const ProjectSelector = ({ connectionId, selectedItems, onChangeItems 
}: Props) => {
   const { loading, items, membership, onSearch, onChangeMembership } = 
useProjectSelector({
     connectionId,
   });
@@ -45,7 +44,6 @@ export const ProjectSelector = ({ connectionId, 
disabledItems, selectedItems, on
         items={items}
         getKey={(it) => `${it.gitlabId}`}
         getName={(it) => it.name}
-        disabledItems={disabledItems}
         selectedItems={selectedItems}
         onChangeItems={onChangeItems}
         loading={loading}
diff --git a/config-ui/src/plugins/register/gitlab/data-scope.tsx 
b/config-ui/src/plugins/register/gitlab/data-scope.tsx
index 03f2e72ca..c8465e21d 100644
--- a/config-ui/src/plugins/register/gitlab/data-scope.tsx
+++ b/config-ui/src/plugins/register/gitlab/data-scope.tsx
@@ -24,12 +24,11 @@ import { MillerColumns, ProjectSelector } from 
'./components';
 
 interface Props {
   connectionId: ID;
-  disabledItems: ScopeItemType[];
   selectedItems: ScopeItemType[];
   onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const GitLabDataScope = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
+export const GitLabDataScope = ({ connectionId, selectedItems, onChangeItems 
}: Props) => {
   const handleChangeItems = (scope: ScopeItemType[]) => {
     onChangeItems(scope);
   };
@@ -38,20 +37,10 @@ export const GitLabDataScope = ({ connectionId, 
disabledItems, selectedItems, on
     <>
       <h4>Projects *</h4>
       <p>Select the project you would like to sync.</p>
-      <MillerColumns
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={handleChangeItems}
-      />
+      <MillerColumns connectionId={connectionId} selectedItems={selectedItems} 
onChangeItems={handleChangeItems} />
       <h5>Add repositories outside of your projects</h5>
       <p>Search for repositories and add to them</p>
-      <ProjectSelector
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={handleChangeItems}
-      />
+      <ProjectSelector connectionId={connectionId} 
selectedItems={selectedItems} onChangeItems={handleChangeItems} />
     </>
   );
 };
diff --git 
a/config-ui/src/plugins/register/jenkins/components/miller-columns/index.tsx 
b/config-ui/src/plugins/register/jenkins/components/miller-columns/index.tsx
index 29554141f..b3a413008 100644
--- a/config-ui/src/plugins/register/jenkins/components/miller-columns/index.tsx
+++ b/config-ui/src/plugins/register/jenkins/components/miller-columns/index.tsx
@@ -27,13 +27,11 @@ import type { UseMillerColumnsProps } from 
'./use-miller-columns';
 import { useMillerColumns } from './use-miller-columns';
 
 interface Props extends UseMillerColumnsProps {
-  disabledItems?: ScopeItemType[];
-  selectedItems?: ScopeItemType[];
-  onChangeItems?: (selectedItems: ScopeItemType[]) => void;
+  selectedItems: ScopeItemType[];
+  onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const MillerColumns = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
-  const [disabledIds, setDisabledIds] = useState<ID[]>([]);
+export const MillerColumns = ({ connectionId, selectedItems, onChangeItems }: 
Props) => {
   const [selectedIds, setSelectedIds] = useState<ID[]>([]);
 
   const { items, getHasMore, onExpandItem } = useMillerColumns({
@@ -41,23 +39,19 @@ export const MillerColumns = ({ connectionId, 
disabledItems, selectedItems, onCh
   });
 
   useEffect(() => {
-    setDisabledIds((disabledItems ?? []).map((it) => it.jobFullName));
-  }, [disabledItems]);
-
-  useEffect(() => {
-    setSelectedIds((selectedItems ?? []).map((it) => it.jobFullName));
+    setSelectedIds(selectedItems.map((it) => it.jobFullName));
   }, [selectedItems]);
 
   const handleChangeItems = (selectedIds: ID[]) => {
     const result = items
-      .filter((it) => selectedIds.includes(it.id) && it.type !== 'folder')
+      .filter((it) => (selectedIds.length ? selectedIds.includes(it.id) : 
false))
       .map((it: any) => ({
         connectionId,
         jobFullName: it.id,
         name: it.id,
       }));
 
-    onChangeItems?.(result);
+    onChangeItems(result);
   };
 
   const renderLoading = () => {
@@ -72,7 +66,6 @@ export const MillerColumns = ({ connectionId, disabledItems, 
selectedItems, onCh
       getHasMore={getHasMore}
       renderLoading={renderLoading}
       items={items}
-      disabledIds={disabledIds}
       selectedIds={selectedIds}
       onSelectItemIds={handleChangeItems}
       onExpandItem={onExpandItem}
diff --git a/config-ui/src/plugins/register/jenkins/data-scope.tsx 
b/config-ui/src/plugins/register/jenkins/data-scope.tsx
index a8232d8ba..ff64d6d08 100644
--- a/config-ui/src/plugins/register/jenkins/data-scope.tsx
+++ b/config-ui/src/plugins/register/jenkins/data-scope.tsx
@@ -24,22 +24,16 @@ import { MillerColumns } from './components';
 
 interface Props {
   connectionId: ID;
-  disabledItems: ScopeItemType[];
   selectedItems: ScopeItemType[];
   onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const JenkinsDataScope = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
+export const JenkinsDataScope = ({ connectionId, selectedItems, onChangeItems 
}: Props) => {
   return (
     <>
       <h3>Jobs *</h3>
       <p>Select the jobs you would like to sync.</p>
-      <MillerColumns
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={onChangeItems}
-      />
+      <MillerColumns connectionId={connectionId} selectedItems={selectedItems} 
onChangeItems={onChangeItems} />
     </>
   );
 };
diff --git 
a/config-ui/src/plugins/register/jira/components/miller-columns/index.tsx 
b/config-ui/src/plugins/register/jira/components/miller-columns/index.tsx
index 87a5de378..f1ef8d6c2 100644
--- a/config-ui/src/plugins/register/jira/components/miller-columns/index.tsx
+++ b/config-ui/src/plugins/register/jira/components/miller-columns/index.tsx
@@ -27,13 +27,11 @@ import type { UseMillerColumnsProps } from 
'./use-miller-columns';
 import { useMillerColumns } from './use-miller-columns';
 
 interface Props extends UseMillerColumnsProps {
-  disabledItems?: ScopeItemType[];
-  selectedItems?: ScopeItemType[];
-  onChangeItems?: (selectedItems: ScopeItemType[]) => void;
+  selectedItems: ScopeItemType[];
+  onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const MillerColumns = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
-  const [disabledIds, setDisabledIds] = useState<ID[]>([]);
+export const MillerColumns = ({ connectionId, selectedItems, onChangeItems }: 
Props) => {
   const [selectedIds, setSelectedIds] = useState<ID[]>([]);
 
   const { items, getHasMore, onScrollColumn } = useMillerColumns({
@@ -41,16 +39,12 @@ export const MillerColumns = ({ connectionId, 
disabledItems, selectedItems, onCh
   });
 
   useEffect(() => {
-    setDisabledIds((disabledItems ?? []).map((it) => it.boardId));
-  }, [disabledItems]);
-
-  useEffect(() => {
-    setSelectedIds((selectedItems ?? []).map((it) => it.boardId));
+    setSelectedIds(selectedItems.map((it) => it.boardId));
   }, [selectedItems]);
 
   const handleChangeItems = (selectedIds: ID[]) => {
     const result = items
-      .filter((it) => selectedIds.includes(it.id))
+      .filter((it) => (selectedIds.length ? selectedIds.includes(it.id) : 
false))
       .map((it) => ({
         connectionId,
         boardId: it.boardId,
@@ -60,7 +54,7 @@ export const MillerColumns = ({ connectionId, disabledItems, 
selectedItems, onCh
         projectId: it.projectId,
       }));
 
-    onChangeItems?.(result);
+    onChangeItems(result);
   };
 
   const renderLoading = () => {
@@ -74,7 +68,6 @@ export const MillerColumns = ({ connectionId, disabledItems, 
selectedItems, onCh
       getHasMore={getHasMore}
       renderLoading={renderLoading}
       items={items}
-      disabledIds={disabledIds}
       selectedIds={selectedIds}
       onSelectItemIds={handleChangeItems}
       onScrollColumn={onScrollColumn}
diff --git a/config-ui/src/plugins/register/jira/data-scope.tsx 
b/config-ui/src/plugins/register/jira/data-scope.tsx
index d0855bf71..de8a3c384 100644
--- a/config-ui/src/plugins/register/jira/data-scope.tsx
+++ b/config-ui/src/plugins/register/jira/data-scope.tsx
@@ -24,22 +24,16 @@ import { MillerColumns } from './components/miller-columns';
 
 interface Props {
   connectionId: ID;
-  disabledItems: ScopeItemType[];
   selectedItems: ScopeItemType[];
   onChangeItems: (selectedItems: ScopeItemType[]) => void;
 }
 
-export const JIRADataScope = ({ connectionId, disabledItems, selectedItems, 
onChangeItems }: Props) => {
+export const JIRADataScope = ({ connectionId, selectedItems, onChangeItems }: 
Props) => {
   return (
     <>
       <h3>Boards *</h3>
       <p>Select the boards you would like to sync.</p>
-      <MillerColumns
-        connectionId={connectionId}
-        disabledItems={disabledItems}
-        selectedItems={selectedItems}
-        onChangeItems={onChangeItems}
-      />
+      <MillerColumns connectionId={connectionId} selectedItems={selectedItems} 
onChangeItems={onChangeItems} />
     </>
   );
 };
diff --git a/config-ui/src/utils/operator.ts b/config-ui/src/utils/operator.ts
index 4bc4eb507..5a63584bd 100644
--- a/config-ui/src/utils/operator.ts
+++ b/config-ui/src/utils/operator.ts
@@ -24,6 +24,7 @@ export type OperateConfig = {
   setOperating?: (success: boolean) => void;
   formatMessage?: () => string;
   formatReason?: (err: unknown) => string;
+  hideToast?: boolean;
 };
 
 /**
@@ -42,20 +43,24 @@ export const operator = async <T>(request: () => 
Promise<T>, config?: OperateCon
     setOperating?.(true);
     const res = await request();
     const message = formatMessage?.() ?? 'Operation successfully completed';
-    Toast.show({
-      intent: Intent.SUCCESS,
-      message,
-      icon: 'endorsed',
-    });
+    if (!config?.hideToast) {
+      Toast.show({
+        intent: Intent.SUCCESS,
+        message,
+        icon: 'endorsed',
+      });
+    }
     return [true, res];
   } catch (err) {
-    console.error('Operation failed.', err)
+    console.error('Operation failed.', err);
     const reason = formatReason?.(err) ?? 'Operation failed.';
-    Toast.show({
-      intent: Intent.DANGER,
-      message: reason,
-      icon: 'error',
-    });
+    if (!config?.hideToast) {
+      Toast.show({
+        intent: Intent.DANGER,
+        message: reason,
+        icon: 'error',
+      });
+    }
 
     return [false];
   } finally {


Reply via email to