Skip to content

Commit

Permalink
Refactor data source connection table
Browse files Browse the repository at this point in the history
Signed-off-by: Lin Wang <[email protected]>
  • Loading branch information
wanglam committed Sep 4, 2024
1 parent 439c4d8 commit 2b4362a
Show file tree
Hide file tree
Showing 7 changed files with 179 additions and 163 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ import { i18n } from '@osd/i18n';
import { FormattedMessage } from 'react-intl';
import { DataSource, DataSourceConnection, DataSourceConnectionType } from '../../../common/types';
import { WorkspaceClient } from '../../workspace_client';
import { DataSourceConnectionTable } from './data_source_connection_table';
import { WorkspaceDetailConnectionTable } from './workspace_detail_connection_table';
import { AssociationDataSourceModal } from './association_data_source_modal';
import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public';
import {
Expand Down Expand Up @@ -244,7 +244,7 @@ export const SelectDataSourceDetailPanel = ({
return noAssociationMessage;
}
return (
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={isDashboardAdmin}
connectionType={toggleIdSelected}
dataSourceConnections={assignedDataSourceConnections}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
import { fireEvent, render } from '@testing-library/react';
import { DataSourceConnectionType } from '../../../common/types';
import React from 'react';
import { DataSourceConnectionTable } from './data_source_connection_table';
import { AssociationDataSourceModalMode } from '../../../common/constants';
import { useOpenSearchDashboards } from '../../../../opensearch_dashboards_react/public';
import { WorkspaceDetailConnectionTable } from './workspace_detail_connection_table';

jest.mock('../../../../opensearch_dashboards_react/public', () => ({
...jest.requireActual('../../../../opensearch_dashboards_react/public'),
Expand Down Expand Up @@ -62,7 +62,7 @@ const dataSourceConnectionsMock = [
},
];

describe('DataSourceConnectionTable', () => {
describe('WorkspaceDetailConnectionTable', () => {
beforeEach(() => {
const mockHttp = {
basePath: {
Expand All @@ -81,7 +81,7 @@ describe('DataSourceConnectionTable', () => {
describe('OpenSearch connections', () => {
it('renders the table with OpenSearch connections', () => {
const { getByText, queryByText } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={true}
connectionType={AssociationDataSourceModalMode.OpenSearchConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand All @@ -101,7 +101,7 @@ describe('DataSourceConnectionTable', () => {

it('should show dqc popover when click the Related connections number ', () => {
const { getByText } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={true}
connectionType={AssociationDataSourceModalMode.OpenSearchConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand All @@ -117,7 +117,7 @@ describe('DataSourceConnectionTable', () => {

it('should remove selected OpenSearch connections by dashboard admin', () => {
const { getByText, queryByTestId, getAllByRole, getByRole } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={true}
connectionType={AssociationDataSourceModalMode.OpenSearchConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand All @@ -139,7 +139,7 @@ describe('DataSourceConnectionTable', () => {

it('should remove single OpenSearch connections by dashboard admin', () => {
const { queryAllByTestId, getByText, getByRole } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={true}
connectionType={AssociationDataSourceModalMode.OpenSearchConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand All @@ -159,7 +159,7 @@ describe('DataSourceConnectionTable', () => {

it('should hide remove action iif user is not dashboard admin', () => {
const { queryByText, queryByTestId, getAllByRole } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={false}
connectionType={AssociationDataSourceModalMode.OpenSearchConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand All @@ -177,7 +177,7 @@ describe('DataSourceConnectionTable', () => {
describe('Direct query connections', () => {
it('renders the table with Direct query connections', () => {
const { getByText, queryByText, getByTestId } = render(
<DataSourceConnectionTable
<WorkspaceDetailConnectionTable
isDashboardAdmin={true}
connectionType={AssociationDataSourceModalMode.DirectQueryConnections}
dataSourceConnections={dataSourceConnectionsMock}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,125 @@
/*
* Copyright OpenSearch Contributors
* SPDX-License-Identifier: Apache-2.0
*/

import React, { useCallback, useEffect, useMemo, useState } from 'react';
import { EuiConfirmModal, EuiSearchBarProps, EuiSmallButton } from '@elastic/eui';
import { i18n } from '@osd/i18n';
import { DataSourceConnection, DataSourceConnectionType } from '../../../common/types';
import { AssociationDataSourceModalMode } from '../../../common/constants';
import { DataSourceConnectionTable } from '../workspace_form';

interface DataSourceConnectionTableProps {
isDashboardAdmin: boolean;
connectionType: string;
dataSourceConnections: DataSourceConnection[];
handleUnassignDataSources: (dataSources: DataSourceConnection[]) => void;
}

export const WorkspaceDetailConnectionTable = ({
isDashboardAdmin,
connectionType,
dataSourceConnections,
handleUnassignDataSources,
}: DataSourceConnectionTableProps) => {
const [selectedItems, setSelectedItems] = useState<DataSourceConnection[]>([]);
const [modalVisible, setModalVisible] = useState(false);

useEffect(() => {
// Reset selected items when connectionType changes
setSelectedItems([]);
}, [connectionType]);

const openSearchConnections = useMemo(() => {
return dataSourceConnections.filter((dsc) =>
connectionType === AssociationDataSourceModalMode.OpenSearchConnections
? dsc.connectionType === DataSourceConnectionType.OpenSearchConnection
: dsc?.relatedConnections && dsc.relatedConnections?.length > 0
);
}, [connectionType, dataSourceConnections]);

const renderToolsLeft = useCallback(() => {
return selectedItems.length > 0 && !modalVisible
? [
<EuiSmallButton
color="danger"
onClick={() => setModalVisible(true)}
data-test-subj="workspace-detail-dataSources-table-bulkRemove"
>
{i18n.translate('workspace.detail.dataSources.table.remove.button', {
defaultMessage: 'Remove {numberOfSelect} association(s)',
values: { numberOfSelect: selectedItems.length },
})}
</EuiSmallButton>,
]
: [];
}, [selectedItems, modalVisible]);

const search: EuiSearchBarProps = {
toolsLeft: renderToolsLeft(),
box: {
incremental: true,
},
filters: [
{
type: 'field_value_selection',
field: 'type',
name: 'Type',
multiSelect: 'or',
options: Array.from(
new Set(openSearchConnections.map(({ type }) => type).filter(Boolean))
).map((type) => ({
value: type!,
name: type!,
})),
},
],
};

return (
<>
{
<DataSourceConnectionTable
isDashboardAdmin={isDashboardAdmin}
items={openSearchConnections}
search={search}
connectionType={connectionType}
pagination={{
initialPageSize: 10,
pageSizeOptions: [10, 20, 30],
}}
onUnlinkDataSource={(item) => {
setSelectedItems([item]);
setModalVisible(true);
}}
onSelectionChange={setSelectedItems}
/>
}
{modalVisible && (
<EuiConfirmModal
data-test-subj="workspaceForm-cancelModal"
title={i18n.translate('workspace.detail.dataSources.modal.title', {
defaultMessage: 'Remove data source(s)',
})}
onCancel={() => {
setModalVisible(false);
setSelectedItems([]);
}}
onConfirm={() => {
setModalVisible(false);
handleUnassignDataSources(selectedItems);
}}
cancelButtonText={i18n.translate('workspace.detail.dataSources.modal.cancelButton', {
defaultMessage: 'Cancel',
})}
confirmButtonText={i18n.translate('workspace.detail.dataSources.Modal.confirmButton', {
defaultMessage: 'Remove data source(s)',
})}
buttonColor="danger"
defaultFocusedButton="confirm"
/>
)}
</>
);
};
Loading

0 comments on commit 2b4362a

Please sign in to comment.