Skip to content

Commit 8957908

Browse files
SpicyPeteclaude
andauthored
UX-1275 - RPCN template gallery (#2474)
* starting template connect work * Allow local overrides of feature flags * More progress * hover states * More over states * Latest registry dialog component * More tempalte work * lots more progress * Some dialog consistency improvements * Fixing some grammar * consistency * Better tab buttons * Improving another dialogs consistency * Adding iceberg logo * Latest registry tooltip * Iceberg logo * Dialog dont close on backdrop * comment branch cleanup pass * improving the config step more * slot polish * Secret select after creation * Lots of topic improvements * Bring in latest dialog improvements * More consistency improvements * Adding a few more logos * latest dialog * Updated registry components * Use schemas for pipeline templates * Icon improvements * Dialog info improvements * Dev debugger * Improve noisy logs * Debug menu progress * Improve debug dialog example * More progress on debug menu * Improving debug dialog a bit * Fixing connect config change * Improve pipeline cache invalidation * Pipeline visualizer icon sizing * More icon usage in connect visualize panel * Some visualization improvements * Quick add secret improvements * More icons * better empty detection * More connect page enhancements * scroll fix * cleanup pass * SOme polishing * secret and user dialog improvement * Code cleanup pass * Test improvements * route tree * Comment reduction pass * Some more cleanup * More polishing * Lots more meta pipeline improvements * Moving edit button * more pipeline page polish * Cleanup pass * frontend: remove dev debugger dialog Moved to the pz/dev-debugger-dialog-tool branch to keep this PR smaller and more focused. Reverts the debug-helper component, connect-config fixtures, feature-flag overrides, and their wiring in __root.tsx and app.tsx. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * Using fewer classnames * updates from registry * undo one registry update * Some polishing * Narrow some logo props * reduce a test flake * improving inline edit name * reducing some lines * confirm on pipeline stop * confirmation dialogs improved * lint fix * lint fix 2 * Adjustmets from the feedback meeting 2 * lint format * test fix * Some of the PR feedback * More comments from PR * a few more comments * Small pipeline header adjustment * moving bang * using label * lint fix * some comment reduction * icon consistency * test fix on icon --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 5eb20e4 commit 8957908

55 files changed

Lines changed: 5630 additions & 1899 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

frontend/src/assets/connectors/component-logo-map.tsx

Lines changed: 95 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,38 +10,71 @@ import {
1010
SiNeo4j,
1111
SiOllama,
1212
SiOpenai,
13+
SiSalesforce,
1314
SiSplunk,
1415
SiTrino,
1516
} from '@icons-pack/react-simple-icons';
1617
import { RedpandaUILetterIcon } from 'components/redpanda-ui/components/icons';
1718
import {
1819
Activity,
1920
Archive,
21+
ArrowRightLeft,
22+
Ban,
2023
BarChart3,
24+
Bomb,
25+
BookOpen,
26+
Boxes,
27+
Braces,
2128
CircleSlash,
29+
Columns3,
2230
Command,
2331
Cpu,
2432
Database,
33+
Eraser,
2534
File,
2635
FileArchive,
2736
FileInput,
37+
FileJson,
2838
FileOutput,
2939
FileSearch,
3040
FileSpreadsheet,
3141
FileText,
42+
Filter,
3243
Folder,
3344
FolderOpen,
45+
FolderUp,
3446
GitBranch,
47+
GitFork,
3548
Globe,
49+
HardDrive,
50+
Layers,
51+
LifeBuoy,
52+
ListOrdered,
53+
MemoryStick,
54+
Moon,
55+
MousePointer,
3656
Network,
3757
Package,
58+
PlusSquare,
59+
Radio,
3860
RefreshCw,
61+
Regex,
62+
Repeat,
63+
Replace,
64+
Reply,
65+
Ruler,
66+
Scissors,
3967
ScrollText,
4068
Server,
4169
Settings,
70+
Share2,
71+
Shield,
72+
Sparkles,
4273
Terminal,
4374
Type,
75+
Wand2,
4476
Workflow,
77+
Zap,
4578
} from 'lucide-react';
4679
import type { SVGProps } from 'react';
4780

@@ -68,6 +101,7 @@ import {
68101
GoogleDriveLogo,
69102
GoogleProtocolBuffersLogo,
70103
HadoopLogo,
104+
IcebergLogo,
71105
InfluxDBLogo,
72106
JavaScriptLogo,
73107
JqLogo,
@@ -105,13 +139,16 @@ export const componentLogoMap = {
105139
custom: Settings,
106140
amqp_0_9: RabbitMQLogo,
107141
amqp_1: ApacheactivemqLogo,
142+
arc: BarChart3,
108143
archive: Archive,
109144
avro: ApacheavroLogo,
110145
awk: GnuLogo,
111146
aws_bedrock_chat: AmazonWebServicesLogo,
112147
aws_bedrock_embeddings: AmazonWebServicesLogo,
113148
aws_cloudwatch: AWSCloudWatchLogo,
149+
aws_cloudwatch_logs: AWSCloudWatchLogo,
114150
aws_dynamodb: AWSDynamoDbLogo,
151+
aws_dynamodb_cdc: AWSDynamoDbLogo,
115152
aws_dynamodb_partiql: AWSDynamoDbLogo,
116153
aws_kinesis: AWSKinesisLogo,
117154
aws_kinesis_firehose: AWSKinesisLogo,
@@ -128,35 +165,35 @@ export const componentLogoMap = {
128165
beanstalkd: BeanstalkdLogo,
129166
benchmark: Activity,
130167
bloblang: RedpandaLetterLogo,
131-
bounds_check: undefined,
132-
branch: undefined,
133-
broker: undefined,
168+
bounds_check: Ruler,
169+
branch: GitFork,
170+
broker: Share2,
134171
cache: Database,
135172
cached: Database,
136173
cassandra: CassandraLogo,
137-
catch: undefined,
138-
chunker: undefined,
174+
catch: Shield,
175+
chunker: Scissors,
139176
cockroachdb_changefeed: SiCockroachlabs,
140177
cohere_chat: CohereLogo,
141178
cohere_embeddings: CohereLogo,
142179
cohere_rerank: CohereLogo,
143180
command: Command,
144181
compress: FileArchive,
145182
couchbase: CouchbaseLogo,
146-
crash: undefined,
183+
crash: Bomb,
147184
csv: FileSpreadsheet,
148-
cyborgdb: undefined,
185+
cyborgdb: Database,
149186
cypher: SiNeo4j,
150187
decompress: FolderOpen,
151-
dedupe: undefined,
188+
dedupe: Filter,
152189
discord: DiscordLogo,
153-
drop: undefined,
154-
drop_on: undefined,
155-
dynamic: undefined,
190+
drop: Ban,
191+
drop_on: Ban,
192+
dynamic: Zap,
156193
elasticsearch_v8: ElasticsearchLogo,
157-
fallback: undefined,
194+
fallback: LifeBuoy,
158195
file: File,
159-
for_each: undefined,
196+
for_each: Repeat,
160197
gateway: Network,
161198
gcp_bigquery: GoogleCloudLogo,
162199
gcp_bigquery_select: GoogleCloudLogo,
@@ -166,24 +203,25 @@ export const componentLogoMap = {
166203
gcp_spanner_cdc: GoogleCloudLogo,
167204
gcp_vertex_ai_chat: GoogleCloudLogo,
168205
gcp_vertex_ai_embeddings: GoogleCloudLogo,
169-
generate: undefined,
206+
generate: Sparkles,
170207
git: GitBranch,
171208
google_drive_download: GoogleDriveLogo,
172209
google_drive_list_labels: GoogleDriveLogo,
173210
google_drive_search: GoogleDriveLogo,
174211
grok: ElasticsearchLogo,
175-
group_by: undefined,
176-
group_by_value: undefined,
212+
group_by: Layers,
213+
group_by_value: Layers,
177214
hdfs: HadoopLogo,
178215
http: Globe,
179216
http_client: Globe,
180217
http_server: Server,
218+
iceberg: IcebergLogo,
181219
influxdb: InfluxDBLogo,
182-
inproc: undefined,
183-
insert_part: undefined,
220+
inproc: Cpu,
221+
insert_part: PlusSquare,
184222
jaeger: SiJaeger,
185223
javascript: JavaScriptLogo,
186-
jmespath: undefined,
224+
jmespath: Braces,
187225
jq: JqLogo,
188226
json_api: JSONLogo,
189227
json_array: JSONLogo,
@@ -195,18 +233,18 @@ export const componentLogoMap = {
195233
local: Folder,
196234
log: ScrollText,
197235
logger: ScrollText,
198-
lru: undefined,
199-
mapping: undefined,
236+
lru: HardDrive,
237+
mapping: ArrowRightLeft,
200238
memcached: MemcachedLogo,
201-
memory: undefined,
239+
memory: MemoryStick,
202240
metric: BarChart3,
203241
microsoft_sql_server_cdc: MicrosoftsqlserverLogo,
204242
mongodb: MongoDBLogo,
205243
mongodb_cdc: MongoDBLogo,
206244
mqtt: SiMqtt,
207-
msgpack: undefined,
208-
multilevel: undefined,
209-
mutation: undefined,
245+
msgpack: Package,
246+
multilevel: Boxes,
247+
mutation: Wand2,
210248
mysql_cdc: MySQLLogo,
211249
nanomsg: NanomsgLogo,
212250
nats: NatsLogo,
@@ -229,24 +267,28 @@ export const componentLogoMap = {
229267
openai_transcription: SiOpenai,
230268
openai_translation: SiOpenai,
231269
opensearch: OpenSearchLogo,
232-
parallel: undefined,
270+
oracledb_cdc: OracleLogo,
271+
otlp_grpc: OpenTelemetryLogo,
272+
otlp_http: OpenTelemetryLogo,
273+
parallel: Columns3,
233274
parquet: SiApacheparquet,
234275
parquet_decode: SiApacheparquet,
235276
parquet_encode: SiApacheparquet,
236277
parse_log: FileSearch,
237278
pg_stream: PostgreSQLLogo,
238279
pinecone: PineconeLogo,
280+
postgres: PostgreSQLLogo,
239281
postgres_cdc: PostgreSQLLogo,
240282
processors: Cpu,
241283
prometheus: PrometheusLogo,
242284
protobuf: GoogleProtocolBuffersLogo,
243285
pulsar: SiApachepulsar,
244286
pusher: PusherLogo,
245287
qdrant: QdrantLogo,
246-
questdb: undefined,
288+
questdb: Database,
247289
rate_limit: Activity,
248-
re_match: undefined,
249-
read_until: undefined,
290+
re_match: Regex,
291+
read_until: BookOpen,
250292
redis: RedisLogo,
251293
redis_hash: RedisLogo,
252294
redis_list: RedisLogo,
@@ -260,31 +302,35 @@ export const componentLogoMap = {
260302
redpanda_migrator: RedpandaLetterLogo,
261303
redpanda_migrator_bundle: RedpandaLetterLogo,
262304
redpanda_migrator_offsets: RedpandaLetterLogo,
263-
reject: undefined,
264-
reject_errored: undefined,
305+
reject: Ban,
306+
reject_errored: Ban,
265307
resource: Package,
266308
retry: RefreshCw,
267309
ristretto: SiDgraph,
268-
schema_registry: undefined,
269-
schema_registry_decode: undefined,
270-
schema_registry_encode: undefined,
271-
select_parts: undefined,
310+
salesforce: SiSalesforce,
311+
salesforce_cdc: SiSalesforce,
312+
salesforce_graphql: SiSalesforce,
313+
salesforce_sink: SiSalesforce,
314+
schema_registry: FileJson,
315+
schema_registry_decode: FileJson,
316+
schema_registry_encode: FileJson,
317+
select_parts: MousePointer,
272318
sentry_capture: SentryLogo,
273-
sequence: undefined,
274-
sftp: undefined,
275-
skip_bom: undefined,
319+
sequence: ListOrdered,
320+
sftp: FolderUp,
321+
skip_bom: Eraser,
276322
slack: SlackLogo,
277323
slack_post: SlackLogo,
278324
slack_reaction: SlackLogo,
279325
slack_thread: SlackLogo,
280326
slack_users: SlackLogo,
281-
sleep: undefined,
327+
sleep: Moon,
282328
snowflake_put: SnowflakeLogo,
283329
snowflake_streaming: SnowflakeLogo,
284330
socket: Network,
285331
socket_server: Server,
286332
spicedb_watch: AuthzedLogo,
287-
split: undefined,
333+
split: Scissors,
288334
splunk: SiSplunk,
289335
splunk_hec: SiSplunk,
290336
sql: Database,
@@ -297,21 +343,25 @@ export const componentLogoMap = {
297343
sql_driver_snowflake: SnowflakeLogo,
298344
sql_driver_sqlite: MySQLLogo,
299345
sql_driver_trino: SiTrino,
346+
sql_raw: Database,
347+
sql_select: Database,
300348
stdin: FileInput,
301349
stdout: FileOutput,
302350
subprocess: Terminal,
303-
switch: undefined,
304-
sync_response: undefined,
351+
switch: Replace,
352+
sync_response: Reply,
305353
tcp: Network,
306354
tcp_server: Server,
307355
text: Type,
308-
try: undefined,
356+
timeplus: Database,
357+
tracer: OpenTelemetryLogo,
358+
try: Shield,
309359
unarchive: FolderOpen,
310360
websocket: WebSocketLogo,
311-
while: undefined,
361+
while: Repeat,
312362
workflow: Workflow,
313363
xml: XmlLogo,
314-
zmq4: undefined,
364+
zmq4: Radio,
315365
} as const;
316366

317367
export type ComponentName = keyof typeof componentLogoMap;
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import type { CSSProperties, SVGProps } from 'react';
2+
3+
import IcebergMark from '../iceberg.png';
4+
5+
// Wraps the bundled raster mark with the same prop shape as the inline-SVG
6+
// logos so it drops into componentLogoMap unchanged. Swap for a real SVG once
7+
// the official brand-kit vector is available.
8+
export const IcebergLogo = ({ className, style }: Pick<SVGProps<SVGSVGElement>, 'className' | 'style'>) => (
9+
<img
10+
alt="Apache Iceberg"
11+
className={className}
12+
src={IcebergMark}
13+
style={{ objectFit: 'contain', ...(style as CSSProperties) }}
14+
/>
15+
);

frontend/src/assets/connectors/logos/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export { GoogleCloudLogo } from './google-cloud-logo';
2121
export { GoogleDriveLogo } from './google-drive-logo';
2222
export { GoogleProtocolBuffersLogo } from './google-protocol-buffers-logo';
2323
export { HadoopLogo } from './hadoop-logo';
24+
export { IcebergLogo } from './iceberg-logo';
2425
export { InfluxDBLogo } from './influx-db-logo';
2526
export { JavaScriptLogo } from './java-script-logo';
2627
export { JqLogo } from './jq-logo';

frontend/src/components/constants.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export const FEATURE_FLAGS = {
99
enableKnowledgeBaseInConsoleUi: false,
1010
enableRemoteMcpInConsole: false,
1111
enableRpcnTiles: false,
12+
enableRpcnTemplateGallery: false,
1213
enableServerlessOnboardingWizard: false,
1314
enableApiKeyConfigurationAgent: false,
1415
enableDataplaneObservabilityServerless: false,
@@ -29,11 +30,16 @@ export const CLOUD_MANAGED_TAG_KEYS = {
2930
SECRET_ID: 'rp_cloud_secret_id',
3031
} as const;
3132

32-
// Helper function to check if a tag key is cloud-managed
3333
export const isCloudManagedTagKey = (key: string): boolean =>
3434
Object.values(CLOUD_MANAGED_TAG_KEYS).includes(
3535
key as (typeof CLOUD_MANAGED_TAG_KEYS)[keyof typeof CLOUD_MANAGED_TAG_KEYS]
3636
);
3737

3838
/** Returns true if the tag key is a system tag that should be hidden from users. */
3939
export const isSystemTag = (key: string): boolean => key.startsWith('__') || isCloudManagedTagKey(key);
40+
41+
/** User-visible tags (system tags filtered out) as `{ key, value }` entries. */
42+
export const getUserTagEntries = (tags: Record<string, string>): { key: string; value: string }[] =>
43+
Object.entries(tags)
44+
.filter(([k]) => !isSystemTag(k))
45+
.map(([key, value]) => ({ key, value }));

frontend/src/components/misc/user-preferences.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ export const UserPreferencesDialog: FC<{ isOpen: boolean; onClose: () => void }>
6060
<DialogHeader>
6161
<DialogTitle>User Preferences</DialogTitle>
6262
</DialogHeader>
63-
<DialogBody>
63+
<DialogBody padding="none">
6464
<Tabs onValueChange={(value) => setActiveTab(value as SettingsTabKeys)} value={activeTab}>
6565
<TabsList variant="underline">
6666
{tabEntries.map(([key, { name }]) => (
@@ -70,7 +70,7 @@ export const UserPreferencesDialog: FC<{ isOpen: boolean; onClose: () => void }>
7070
))}
7171
</TabsList>
7272
{tabEntries.map(([key, { component: TabComponent }]) => (
73-
<TabsContent key={key} value={key}>
73+
<TabsContent className="p-4" key={key} value={key}>
7474
<TabComponent />
7575
</TabsContent>
7676
))}

frontend/src/components/pages/rp-connect/onboarding/add-connector-dialog.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export const AddConnectorDialog = ({
6262
</DialogHeader>
6363
<DialogBody>
6464
<ConnectTiles
65-
className="px-0 pt-0"
65+
className="px-0 py-0"
6666
components={components}
6767
componentTypeFilter={typeFilter}
6868
gridCols={3}

0 commit comments

Comments
 (0)