Skip to content

Commit 6dcb177

Browse files
committed
add icons to existing integration items
1 parent beb83af commit 6dcb177

File tree

5 files changed

+112
-45
lines changed

5 files changed

+112
-45
lines changed

src/webviews/webview-side/integrations/IntegrationItem.tsx

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import * as React from 'react';
22
import { getLocString } from '../react-common/locReactSide';
33
import { ConfigurableDatabaseIntegrationType, IntegrationWithStatus } from './types';
4+
import { integrationTypeIcons } from './integrationUtils';
45

56
export interface IIntegrationItemProps {
67
integration: IntegrationWithStatus;
@@ -66,14 +67,24 @@ export const IntegrationItem: React.FC<IIntegrationItemProps> = ({ integration,
6667
// Get the type: prefer config type, then integration type from project
6768
const type = integration.config?.type || integration.integrationType;
6869

69-
// Build display name with type
70-
const displayName = type ? `${name} (${getIntegrationTypeLabel(type)})` : name;
70+
// Get the type label and icon
71+
const typeLabel = type ? getIntegrationTypeLabel(type) : undefined;
72+
const typeIcon = type ? integrationTypeIcons[type] : undefined;
7173

7274
return (
7375
<div className="integration-item">
76+
{typeIcon && (
77+
<div className="integration-item-icon">
78+
<img src={typeIcon} alt={typeLabel || ''} />
79+
</div>
80+
)}
7481
<div className="integration-info">
75-
<div className="integration-name">{displayName}</div>
76-
<div className={`integration-status ${statusClass}`}>{statusText}</div>
82+
<div className="integration-name">{name}</div>
83+
<div className="integration-meta">
84+
{typeLabel && <span className="integration-type">{typeLabel}</span>}
85+
{typeLabel && <span className="integration-meta-separator"></span>}
86+
<span className={`integration-status ${statusClass}`}>{statusText}</span>
87+
</div>
7788
</div>
7889
<div className="integration-actions">
7990
<button type="button" onClick={() => onConfigure(integration.id)}>

src/webviews/webview-side/integrations/IntegrationPanel.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import * as React from 'react';
2+
3+
import { generateUuid } from '../../../platform/common/uuid';
24
import { IVsCodeApi } from '../react-common/postOffice';
35
import { getLocString, storeLocStrings } from '../react-common/locReactSide';
46
import { IntegrationList } from './IntegrationList';
@@ -191,7 +193,7 @@ export const IntegrationPanel: React.FC<IIntegrationPanelProps> = ({ baseTheme,
191193

192194
const handleSelectIntegrationType = (type: ConfigurableDatabaseIntegrationType) => {
193195
// Generate a new UUID for the integration
194-
const newId = crypto.randomUUID();
196+
const newId = generateUuid();
195197

196198
// Set up the form for creating a new integration
197199
setSelectedIntegrationId(newId);

src/webviews/webview-side/integrations/IntegrationTypeSelector.tsx

Lines changed: 18 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,7 @@
11
import * as React from 'react';
22
import { getLocString } from '../react-common/locReactSide';
33
import { ConfigurableDatabaseIntegrationType } from './types';
4-
import { integrationTypeLabels } from './integrationUtils';
5-
6-
// Import integration logos
7-
/* eslint-disable @typescript-eslint/no-require-imports */
8-
const postgresqlLogo: string = require('./icons/postgresql.svg');
9-
const mysqlLogo: string = require('./icons/mysql.svg');
10-
const mariadbLogo: string = require('./icons/mariadb.svg');
11-
const mongodbLogo: string = require('./icons/mongodb.svg');
12-
const sqlServerLogo: string = require('./icons/sql-server.svg');
13-
const bigqueryLogo: string = require('./icons/bigquery.svg');
14-
const snowflakeLogo: string = require('./icons/snowflake.svg');
15-
const alloydbLogo: string = require('./icons/alloydb.svg');
16-
const spannerLogo: string = require('./icons/spanner.svg');
17-
const materializeLogo: string = require('./icons/materialize.svg');
18-
const clickhouseLogo: string = require('./icons/clickhouse.svg');
19-
const athenaLogo: string = require('./icons/athena.svg');
20-
const redshiftLogo: string = require('./icons/redshift.svg');
21-
const databricksLogo: string = require('./icons/databricks.svg');
22-
const dremioLogo: string = require('./icons/dremio.svg');
23-
const mindsdbLogo: string = require('./icons/mindsdb.svg');
24-
const trinoLogo: string = require('./icons/trino.svg');
25-
/* eslint-enable @typescript-eslint/no-require-imports */
4+
import { integrationTypeLabels, integrationTypeIcons } from './integrationUtils';
265

276
export interface IIntegrationTypeSelectorProps {
287
onSelectType: (type: ConfigurableDatabaseIntegrationType) => void;
@@ -39,42 +18,42 @@ const WAREHOUSE_INTEGRATION_TYPES: IntegrationTypeInfo[] = [
3918
{
4019
type: 'clickhouse',
4120
label: integrationTypeLabels['clickhouse'],
42-
icon: clickhouseLogo
21+
icon: integrationTypeIcons['clickhouse']
4322
},
4423
{
4524
type: 'redshift',
4625
label: integrationTypeLabels['redshift'],
47-
icon: redshiftLogo
26+
icon: integrationTypeIcons['redshift']
4827
},
4928
{
5029
type: 'athena',
5130
label: integrationTypeLabels['athena'],
52-
icon: athenaLogo
31+
icon: integrationTypeIcons['athena']
5332
},
5433
{
5534
type: 'big-query',
5635
label: integrationTypeLabels['big-query'],
57-
icon: bigqueryLogo
36+
icon: integrationTypeIcons['big-query']
5837
},
5938
{
6039
type: 'snowflake',
6140
label: integrationTypeLabels['snowflake'],
62-
icon: snowflakeLogo
41+
icon: integrationTypeIcons['snowflake']
6342
},
6443
{
6544
type: 'databricks',
6645
label: integrationTypeLabels['databricks'],
67-
icon: databricksLogo
46+
icon: integrationTypeIcons['databricks']
6847
},
6948
{
7049
type: 'dremio',
7150
label: integrationTypeLabels['dremio'],
72-
icon: dremioLogo
51+
icon: integrationTypeIcons['dremio']
7352
},
7453
{
7554
type: 'trino',
7655
label: integrationTypeLabels['trino'],
77-
icon: trinoLogo
56+
icon: integrationTypeIcons['trino']
7857
}
7958
];
8059

@@ -83,47 +62,47 @@ const DATABASE_INTEGRATION_TYPES: IntegrationTypeInfo[] = [
8362
{
8463
type: 'mongodb',
8564
label: integrationTypeLabels['mongodb'],
86-
icon: mongodbLogo
65+
icon: integrationTypeIcons['mongodb']
8766
},
8867
{
8968
type: 'pgsql',
9069
label: integrationTypeLabels['pgsql'],
91-
icon: postgresqlLogo
70+
icon: integrationTypeIcons['pgsql']
9271
},
9372
{
9473
type: 'mysql',
9574
label: integrationTypeLabels['mysql'],
96-
icon: mysqlLogo
75+
icon: integrationTypeIcons['mysql']
9776
},
9877
{
9978
type: 'mariadb',
10079
label: integrationTypeLabels['mariadb'],
101-
icon: mariadbLogo
80+
icon: integrationTypeIcons['mariadb']
10281
},
10382
{
10483
type: 'sql-server',
10584
label: integrationTypeLabels['sql-server'],
106-
icon: sqlServerLogo
85+
icon: integrationTypeIcons['sql-server']
10786
},
10887
{
10988
type: 'alloydb',
11089
label: integrationTypeLabels['alloydb'],
111-
icon: alloydbLogo
90+
icon: integrationTypeIcons['alloydb']
11291
},
11392
{
11493
type: 'spanner',
11594
label: integrationTypeLabels['spanner'],
116-
icon: spannerLogo
95+
icon: integrationTypeIcons['spanner']
11796
},
11897
{
11998
type: 'materialize',
12099
label: integrationTypeLabels['materialize'],
121-
icon: materializeLogo
100+
icon: integrationTypeIcons['materialize']
122101
},
123102
{
124103
type: 'mindsdb',
125104
label: integrationTypeLabels['mindsdb'],
126-
icon: mindsdbLogo
105+
icon: integrationTypeIcons['mindsdb']
127106
}
128107
];
129108

src/webviews/webview-side/integrations/integrationUtils.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,27 @@
11
import { getLocString } from '../react-common/locReactSide';
22
import { ConfigurableDatabaseIntegrationType } from './types';
33

4+
// Import integration logos
5+
/* eslint-disable @typescript-eslint/no-require-imports */
6+
const postgresqlLogo: string = require('./icons/postgresql.svg');
7+
const mysqlLogo: string = require('./icons/mysql.svg');
8+
const mariadbLogo: string = require('./icons/mariadb.svg');
9+
const mongodbLogo: string = require('./icons/mongodb.svg');
10+
const sqlServerLogo: string = require('./icons/sql-server.svg');
11+
const bigqueryLogo: string = require('./icons/bigquery.svg');
12+
const snowflakeLogo: string = require('./icons/snowflake.svg');
13+
const alloydbLogo: string = require('./icons/alloydb.svg');
14+
const spannerLogo: string = require('./icons/spanner.svg');
15+
const materializeLogo: string = require('./icons/materialize.svg');
16+
const clickhouseLogo: string = require('./icons/clickhouse.svg');
17+
const athenaLogo: string = require('./icons/athena.svg');
18+
const redshiftLogo: string = require('./icons/redshift.svg');
19+
const databricksLogo: string = require('./icons/databricks.svg');
20+
const dremioLogo: string = require('./icons/dremio.svg');
21+
const mindsdbLogo: string = require('./icons/mindsdb.svg');
22+
const trinoLogo: string = require('./icons/trino.svg');
23+
/* eslint-enable @typescript-eslint/no-require-imports */
24+
425
// Localized labels for integration types (duplicated from sqlCellStatusBarProvider.ts due to import restrictions)
526
export const integrationTypeLabels: Record<ConfigurableDatabaseIntegrationType, string> = {
627
alloydb: 'AlloyDB',
@@ -22,6 +43,27 @@ export const integrationTypeLabels: Record<ConfigurableDatabaseIntegrationType,
2243
trino: 'Trino'
2344
};
2445

46+
// Icon mapping for integration types
47+
export const integrationTypeIcons: Record<ConfigurableDatabaseIntegrationType, string> = {
48+
alloydb: alloydbLogo,
49+
athena: athenaLogo,
50+
'big-query': bigqueryLogo,
51+
clickhouse: clickhouseLogo,
52+
databricks: databricksLogo,
53+
dremio: dremioLogo,
54+
mariadb: mariadbLogo,
55+
materialize: materializeLogo,
56+
mindsdb: mindsdbLogo,
57+
mongodb: mongodbLogo,
58+
mysql: mysqlLogo,
59+
pgsql: postgresqlLogo,
60+
redshift: redshiftLogo,
61+
snowflake: snowflakeLogo,
62+
spanner: spannerLogo,
63+
'sql-server': sqlServerLogo,
64+
trino: trinoLogo
65+
};
66+
2567
/**
2668
* Get the default name for a new integration
2769
* @param type The integration type

src/webviews/webview-side/integrations/integrations.css

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,23 +51,55 @@
5151
display: flex;
5252
justify-content: space-between;
5353
align-items: center;
54+
gap: 16px;
5455
padding: 16px;
5556
background-color: var(--vscode-editor-background);
5657
border: 1px solid var(--vscode-panel-border);
5758
border-radius: 4px;
5859
}
5960

61+
.integration-item-icon {
62+
width: 32px;
63+
height: 32px;
64+
flex-shrink: 0;
65+
display: flex;
66+
align-items: center;
67+
justify-content: center;
68+
}
69+
70+
.integration-item-icon img {
71+
width: 100%;
72+
height: 100%;
73+
object-fit: contain;
74+
}
75+
6076
.integration-info {
6177
flex: 1;
78+
min-width: 0;
6279
}
6380

6481
.integration-name {
6582
font-weight: 600;
6683
margin-bottom: 4px;
6784
}
6885

69-
.integration-status {
86+
.integration-meta {
87+
display: flex;
88+
align-items: center;
7089
font-size: 0.9em;
90+
color: var(--vscode-descriptionForeground);
91+
}
92+
93+
.integration-type {
94+
color: var(--vscode-foreground);
95+
}
96+
97+
.integration-meta-separator {
98+
margin: 0 4px;
99+
}
100+
101+
.integration-status {
102+
font-size: inherit;
71103
}
72104

73105
.status-connected {
@@ -81,6 +113,7 @@
81113
.integration-actions {
82114
display: flex;
83115
gap: 8px;
116+
flex-shrink: 0;
84117
}
85118

86119
/* Buttons */

0 commit comments

Comments
 (0)