Skip to content

Commit 309401a

Browse files
frontend: apply console best practices
1 parent c5f454e commit 309401a

File tree

22 files changed

+710
-155
lines changed

22 files changed

+710
-155
lines changed

frontend/src/components/pages/acls/acl-list.tsx

Lines changed: 9 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ import { api, rolesApi } from '../../../state/backend-api';
7373
import { AclRequestDefault } from '../../../state/rest-interfaces';
7474
import { Features } from '../../../state/supported-features';
7575
import { uiState } from '../../../state/ui-state';
76+
import { getSearchRegex } from '../../../utils/regex';
7677
import { Code as CodeEl, DefaultSkeleton } from '../../../utils/tsx-utils';
7778
import { FeatureLicenseNotification } from '../../license/feature-license-notification';
7879
import { NullFallbackBoundary } from '../../misc/null-fallback-boundary';
@@ -284,17 +285,10 @@ const PermissionsListTab = () => {
284285
}
285286

286287
const usersFiltered = users.filter((u) => {
287-
const filter = searchQuery;
288-
if (!filter) {
288+
if (!searchQuery) {
289289
return true;
290290
}
291-
292-
try {
293-
const quickSearchRegExp = new RegExp(filter, 'i');
294-
return u.name.match(quickSearchRegExp);
295-
} catch {
296-
return false;
297-
}
291+
return u.name.match(getSearchRegex(searchQuery));
298292
});
299293

300294
return (
@@ -384,17 +378,10 @@ const UsersTab = ({ isAdminApiConfigured }: { isAdminApiConfigured: boolean }) =
384378
}));
385379

386380
const usersFiltered = users.filter((u) => {
387-
const filter = searchQuery;
388-
if (!filter) {
381+
if (!searchQuery) {
389382
return true;
390383
}
391-
392-
try {
393-
const quickSearchRegExp = new RegExp(filter, 'i');
394-
return u.name.match(quickSearchRegExp);
395-
} catch {
396-
return false;
397-
}
384+
return u.name.match(getSearchRegex(searchQuery));
398385
});
399386

400387
if (isError && error) {
@@ -568,16 +555,10 @@ const RolesTab = () => {
568555
const [searchQuery, setSearchQuery] = useState('');
569556

570557
const roles = (rolesApi.roles ?? []).filter((u) => {
571-
const filter = searchQuery;
572-
if (!filter) {
558+
if (!searchQuery) {
573559
return true;
574560
}
575-
try {
576-
const quickSearchRegExp = new RegExp(filter, 'i');
577-
return u.match(quickSearchRegExp);
578-
} catch {
579-
return false;
580-
}
561+
return u.match(getSearchRegex(searchQuery));
581562
});
582563

583564
const rolesWithMembers = roles.map((r) => {
@@ -730,11 +711,8 @@ const AclsTab = (_: { principalGroups: AclPrincipalGroup[] }) => {
730711

731712
let groups = principalGroups?.filter((g) => g.principalType === 'User') || [];
732713

733-
try {
734-
const quickSearchRegExp = new RegExp(searchQuery, 'i');
735-
groups = groups?.filter((aclGroup) => aclGroup.principalName.match(quickSearchRegExp));
736-
} catch (_e) {
737-
// Invalid regex, skip filtering
714+
if (searchQuery) {
715+
groups = groups.filter((aclGroup) => aclGroup.principalName.match(getSearchRegex(searchQuery)));
738716
}
739717

740718
if (isError && error) {

frontend/src/components/pages/acls/role-details.tsx

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { AclPrincipalGroupPermissionsTable } from './user-details';
2020
import { appGlobal } from '../../../state/app-global';
2121
import { api, type RolePrincipal, rolesApi } from '../../../state/backend-api';
2222
import { AclRequestDefault } from '../../../state/rest-interfaces';
23+
import { getSearchRegex } from '../../../utils/regex';
2324
import { DefaultSkeleton } from '../../../utils/tsx-utils';
2425
import PageContent from '../../misc/page-content';
2526
import { PageComponent, type PageInitHelper, type PageProps } from '../page';
@@ -85,12 +86,8 @@ class RoleDetailsPage extends PageComponent<{ roleName: string }> {
8586
);
8687

8788
let members = rolesApi.roleMembers.get(this.roleName) ?? [];
88-
try {
89-
const quickSearchRegExp = new RegExp(this.principalSearch, 'i');
90-
members = members.filter(({ name }) => name.match(quickSearchRegExp));
91-
} catch (_e) {
92-
// biome-ignore lint/suspicious/noConsole: warning for invalid user input
93-
console.warn('Invalid expression');
89+
if (this.principalSearch) {
90+
members = members.filter(({ name }) => name.match(getSearchRegex(this.principalSearch)));
9491
}
9592

9693
const numberOfPrincipals = rolesApi.roleMembers.get(this.roleName)?.length ?? 0;

frontend/src/components/pages/admin/admin-users.tsx

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { UserCircleIcon } from 'components/icons';
2121
import { makeObservable, observable } from 'mobx';
2222

2323
import { RoleComponent } from './admin-roles';
24+
import { getSearchRegex } from '../../../utils/regex';
2425
import { DefaultSkeleton } from '../../../utils/tsx-utils';
2526

2627
@observer
@@ -39,14 +40,9 @@ export class AdminUsers extends Component<Record<string, never>> {
3940

4041
let users = api.adminInfo.users;
4142

42-
try {
43-
const quickSearchRegExp = new RegExp(this.quickSearch, 'i');
44-
users = users.filter(
45-
(u) => u.internalIdentifier.match(quickSearchRegExp) || u.oauthUserId.match(quickSearchRegExp)
46-
);
47-
} catch (_e) {
48-
// biome-ignore lint/suspicious/noConsole: intentional console usage
49-
console.warn('Invalid expression');
43+
if (this.quickSearch) {
44+
const searchRegex = getSearchRegex(this.quickSearch);
45+
users = users.filter((u) => u.internalIdentifier.match(searchRegex) || u.oauthUserId.match(searchRegex));
5046
}
5147

5248
const table = (

frontend/src/components/pages/agents/details/ai-agent-configuration-tab.tsx

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -318,12 +318,7 @@ export const AIAgentConfigurationTab = () => {
318318
const [expandedSubagent, setExpandedSubagent] = useState<string | undefined>(undefined);
319319

320320
// Get available MCP servers
321-
const availableMcpServers = useMemo(() => {
322-
if (!mcpServersData?.mcpServers || mcpServersData.mcpServers.length === 0) {
323-
return [];
324-
}
325-
return mcpServersData.mcpServers;
326-
}, [mcpServersData]);
321+
const availableMcpServers = mcpServersData?.mcpServers ?? [];
327322

328323
// Get available secrets for API key dropdown
329324
const availableSecrets = useMemo(() => {
@@ -1176,10 +1171,7 @@ export const AIAgentConfigurationTab = () => {
11761171
value={displayData.model}
11771172
/>
11781173
) : (
1179-
<Select
1180-
onValueChange={(value) => updateField({ model: value })}
1181-
value={displayData.model}
1182-
>
1174+
<Select onValueChange={(value) => updateField({ model: value })} value={displayData.model}>
11831175
<SelectTrigger>
11841176
<SelectValue>
11851177
{Boolean(displayData.model) && detectProvider(displayData.model) ? (

frontend/src/components/pages/connect/cluster-details.tsx

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { appGlobal } from '../../../state/app-global';
2020
import { api } from '../../../state/backend-api';
2121
import type { ClusterAdditionalInfo, ClusterConnectorInfo } from '../../../state/rest-interfaces';
2222
import { uiSettings } from '../../../state/ui';
23+
import { getSearchRegex } from '../../../utils/regex';
2324
import { DefaultSkeleton } from '../../../utils/tsx-utils';
2425
import PageContent from '../../misc/page-content';
2526
import SearchBar from '../../misc/search-bar';
@@ -53,15 +54,9 @@ class KafkaClusterDetails extends PageComponent<{ clusterName: string }> {
5354
api.refreshClusterAdditionalInfo(clusterName, force);
5455
}
5556

56-
isFilterMatch(filter: string, item: ClusterConnectorInfo): boolean {
57-
try {
58-
const quickSearchRegExp = new RegExp(uiSettings.connectorsList.quickSearch, 'i');
59-
return Boolean(item.name.match(quickSearchRegExp)) || Boolean(item.class.match(quickSearchRegExp));
60-
} catch (_e) {
61-
// biome-ignore lint/suspicious/noConsole: intentional console usage
62-
console.warn('Invalid expression');
63-
return item.name.toLowerCase().includes(filter.toLowerCase());
64-
}
57+
isFilterMatch(_filter: string, item: ClusterConnectorInfo): boolean {
58+
const searchRegex = getSearchRegex(uiSettings.connectorsList.quickSearch);
59+
return Boolean(item.name.match(searchRegex)) || Boolean(item.class.match(searchRegex));
6560
}
6661

6762
render() {

frontend/src/components/pages/connect/overview.tsx

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ import { api, rpcnSecretManagerApi } from '../../../state/backend-api';
3535
import type { ClusterConnectorInfo, ClusterConnectors, ClusterConnectorTaskInfo } from '../../../state/rest-interfaces';
3636
import { Features } from '../../../state/supported-features';
3737
import { uiSettings } from '../../../state/ui';
38+
import { getSearchRegex } from '../../../utils/regex';
3839
import { Code, DefaultSkeleton } from '../../../utils/tsx-utils';
3940
import PageContent from '../../misc/page-content';
4041
import SearchBar from '../../misc/search-bar';
@@ -289,13 +290,9 @@ const TabConnectors = observer(() => {
289290
filteredResults: [],
290291
}));
291292

292-
const isFilterMatch = (filter: string, item: ConnectorType): boolean => {
293-
try {
294-
const quickSearchRegExp = new RegExp(uiSettings.clusterOverview.connectorsList.quickSearch, 'i');
295-
return Boolean(item.name.match(quickSearchRegExp)) || Boolean(item.class.match(quickSearchRegExp));
296-
} catch (_e) {
297-
return item.name.toLowerCase().includes(filter.toLowerCase());
298-
}
293+
const isFilterMatch = (_filter: string, item: ConnectorType): boolean => {
294+
const searchRegex = getSearchRegex(uiSettings.clusterOverview.connectorsList.quickSearch);
295+
return Boolean(item.name.match(searchRegex)) || Boolean(item.class.match(searchRegex));
299296
};
300297

301298
return (

frontend/src/components/pages/consumers/group-list.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { api } from '../../../state/backend-api';
2020
import type { GroupDescription } from '../../../state/rest-interfaces';
2121
import { uiSettings } from '../../../state/ui';
2222
import { editQuery } from '../../../utils/query-helper';
23+
import { getSearchRegex } from '../../../utils/regex';
2324
import { DefaultSkeleton } from '../../../utils/tsx-utils';
2425
import { BrokerList } from '../../misc/broker-list';
2526
import PageContent from '../../misc/page-content';
@@ -75,15 +76,12 @@ class GroupList extends PageComponent {
7576

7677
let groups = Array.from(api.consumerGroups.values());
7778

78-
try {
79-
const quickSearchRegExp = new RegExp(uiSettings.consumerGroupList.quickSearch, 'i');
79+
if (uiSettings.consumerGroupList.quickSearch) {
80+
const searchRegex = getSearchRegex(uiSettings.consumerGroupList.quickSearch);
8081
groups = groups.filter(
8182
(groupDescription) =>
82-
groupDescription.groupId.match(quickSearchRegExp) || groupDescription.protocol.match(quickSearchRegExp)
83+
groupDescription.groupId.match(searchRegex) || groupDescription.protocol.match(searchRegex)
8384
);
84-
} catch (_e) {
85-
// biome-ignore lint/suspicious/noConsole: intentional console usage
86-
console.warn('Invalid expression');
8785
}
8886

8987
const stateGroups = groups.groupInto((g) => g.state);

frontend/src/components/pages/rp-connect/pipelines-list.tsx

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { appGlobal } from '../../../state/app-global';
2323
import { pipelinesApi } from '../../../state/backend-api';
2424
import { Features } from '../../../state/supported-features';
2525
import { uiSettings } from '../../../state/ui';
26+
import { getSearchRegex } from '../../../utils/regex';
2627
import { DefaultSkeleton } from '../../../utils/tsx-utils';
2728
import { encodeURIComponentPercents } from '../../../utils/utils';
2829
import PageContent from '../../misc/page-content';
@@ -165,25 +166,15 @@ class RpConnectPipelinesList extends PageComponent<{}> {
165166
return DefaultSkeleton;
166167
}
167168

169+
const filter = uiSettings.pipelinesList.quickSearch;
168170
const filteredPipelines = (pipelinesApi.pipelines ?? [])
169171
?.filter((pipeline) => pipeline?.tags?.__redpanda_cloud_pipeline_type !== 'agent') // Ensure we do not show the agents
170172
.filter((u) => {
171-
const filter = uiSettings.pipelinesList.quickSearch;
172173
if (!filter) {
173174
return true;
174175
}
175-
try {
176-
const quickSearchRegExp = new RegExp(filter, 'i');
177-
if (u.id.match(quickSearchRegExp)) {
178-
return true;
179-
}
180-
if (u.displayName.match(quickSearchRegExp)) {
181-
return true;
182-
}
183-
return false;
184-
} catch {
185-
return false;
186-
}
176+
const searchRegex = getSearchRegex(filter);
177+
return u.id.match(searchRegex) || u.displayName.match(searchRegex);
187178
});
188179

189180
return (

frontend/src/components/pages/rp-connect/secrets/secrets-list.tsx

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { appGlobal } from '../../../../state/app-global';
2525
import { rpcnSecretManagerApi } from '../../../../state/backend-api';
2626
import { Features } from '../../../../state/supported-features';
2727
import { uiSettings } from '../../../../state/ui';
28+
import { getSearchRegex } from '../../../../utils/regex';
2829
import PageContent from '../../../misc/page-content';
2930
import Section from '../../../misc/section';
3031
import { PageComponent, type PageInitHelper } from '../../page';
@@ -86,20 +87,12 @@ class RpConnectSecretsList extends PageComponent {
8687
}
8788

8889
render() {
90+
const filter = uiSettings.rpcnSecretList.quickSearch;
8991
const filteredSecrets = (rpcnSecretManagerApi.secrets ?? []).filter((u) => {
90-
const filter = uiSettings.rpcnSecretList.quickSearch;
9192
if (!filter) {
9293
return true;
9394
}
94-
try {
95-
const quickSearchRegExp = new RegExp(filter, 'i');
96-
if (u.id.match(quickSearchRegExp)) {
97-
return true;
98-
}
99-
return false;
100-
} catch {
101-
return false;
102-
}
95+
return u.id.match(getSearchRegex(filter));
10396
});
10497

10598
return (

frontend/src/components/pages/rp-connect/utils/yaml.ts

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,16 @@ const mergeCacheResource = (doc: Document.Parsed, newConfigObject: Partial<Conne
3333
let newResource = cacheConfigObj?.cache_resources?.[0] as Record<string, unknown> | undefined;
3434

3535
if (newResource) {
36-
const existingLabels = Array.isArray(cacheResources)
37-
? (cacheResources as Record<string, unknown>[]).map((r) => r?.label).filter(Boolean)
38-
: [];
36+
const existingLabelsSet = new Set(
37+
Array.isArray(cacheResources)
38+
? (cacheResources as Record<string, unknown>[]).map((r) => r?.label).filter(Boolean)
39+
: []
40+
);
3941

40-
if (existingLabels.includes(newResource.label as string)) {
42+
if (existingLabelsSet.has(newResource.label as string)) {
4143
let counter = 1;
4244
let uniqueLabel = `${newResource.label}_${counter}`;
43-
while (existingLabels.includes(uniqueLabel)) {
45+
while (existingLabelsSet.has(uniqueLabel)) {
4446
counter += 1;
4547
uniqueLabel = `${newResource.label}_${counter}`;
4648
}
@@ -60,14 +62,16 @@ const mergeRateLimitResource = (doc: Document.Parsed, newConfigObject: Partial<C
6062
let newResource = rateLimitConfigObj?.rate_limit_resources?.[0] as Record<string, unknown> | undefined;
6163

6264
if (newResource) {
63-
const existingLabels = Array.isArray(rateLimitResources)
64-
? (rateLimitResources as Record<string, unknown>[]).map((r) => r?.label).filter(Boolean)
65-
: [];
65+
const existingLabelsSet = new Set(
66+
Array.isArray(rateLimitResources)
67+
? (rateLimitResources as Record<string, unknown>[]).map((r) => r?.label).filter(Boolean)
68+
: []
69+
);
6670

67-
if (existingLabels.includes(newResource.label as string)) {
71+
if (existingLabelsSet.has(newResource.label as string)) {
6872
let counter = 1;
6973
let uniqueLabel = `${newResource.label}_${counter}`;
70-
while (existingLabels.includes(uniqueLabel)) {
74+
while (existingLabelsSet.has(uniqueLabel)) {
7175
counter += 1;
7276
uniqueLabel = `${newResource.label}_${counter}`;
7377
}

0 commit comments

Comments
 (0)