Skip to content

Commit bf110ae

Browse files
Vonngclaude
andcommitted
fix(console): give selectable tables a visible-rows select-all
Replaces the mds vendor "Select" header text (untranslatable and shown whenever onSelectAll is absent) with a working select-all checkbox on all seven selectable tables. The toggle operates on the currently visible rows only and preserves selections hidden by an active filter, so the header state can no longer imply a different set than what a bulk action would target. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent 9b60148 commit bf110ae

7 files changed

Lines changed: 83 additions & 42 deletions

File tree

web-app/src/screens/Console/Account/Account.tsx

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -287,13 +287,19 @@ const Account = () => {
287287
customEmptyMessage={t("There are no Access Keys yet.")}
288288
columns={accountTableColumns(t)}
289289
onSelect={(e) => selectSAs(e, setSelectedSAs, selectedSAs)}
290-
onSelectAll={() =>
290+
onSelectAll={() => {
291+
// Toggle the visible rows only; selections hidden by the
292+
// current filter are preserved.
293+
const visible = filteredRecords.map((r) => `${r.accessKey}`);
294+
const allVisible =
295+
visible.length > 0 &&
296+
visible.every((v) => selectedSAs.includes(v));
291297
setSelectedSAs(
292-
selectedSAs.length === filteredRecords.length
293-
? []
294-
: filteredRecords.map((r) => `${r.accessKey}`),
295-
)
296-
}
298+
allVisible
299+
? selectedSAs.filter((v) => !visible.includes(v))
300+
: Array.from(new Set([...selectedSAs, ...visible])),
301+
);
302+
}}
297303
selectedItems={selectedSAs}
298304
isLoading={loading}
299305
records={filteredRecords}

web-app/src/screens/Console/Buckets/BucketDetails/AddEvent.tsx

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,14 @@ const AddEvent = ({
222222
idField={"value"}
223223
records={events}
224224
onSelect={handleClick}
225-
onSelectAll={() =>
225+
onSelectAll={() => {
226+
const allSelected =
227+
events.length > 0 &&
228+
events.every((ev) => selectedEvents.includes(ev.value));
226229
setSelectedEvents(
227-
selectedEvents.length === events.length
228-
? []
229-
: events.map((ev) => ev.value),
230-
)
231-
}
230+
allSelected ? [] : events.map((ev) => ev.value),
231+
);
232+
}}
232233
selectedItems={selectedEvents}
233234
noBackground
234235
customPaperHeight={"260px"}

web-app/src/screens/Console/Groups/Groups.tsx

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -325,13 +325,25 @@ const Groups = () => {
325325
}
326326
onSelectAll={
327327
deleteGroup || getGroup
328-
? () =>
328+
? () => {
329+
const allVisible =
330+
filteredRecords.length > 0 &&
331+
filteredRecords.every((g) =>
332+
checkedGroups.includes(g),
333+
);
329334
setCheckedGroups(
330-
checkedGroups.length ===
331-
filteredRecords.length
332-
? []
333-
: [...filteredRecords],
334-
)
335+
allVisible
336+
? checkedGroups.filter(
337+
(g) => !filteredRecords.includes(g),
338+
)
339+
: Array.from(
340+
new Set([
341+
...checkedGroups,
342+
...filteredRecords,
343+
]),
344+
),
345+
);
346+
}
335347
: undefined
336348
}
337349
records={filteredRecords}

web-app/src/screens/Console/Groups/UsersSelectors.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -117,13 +117,17 @@ const UsersSelectors = ({
117117
<DataTable
118118
columns={[{ label: t("Access Key"), elementKey: "accessKey" }]}
119119
onSelect={selectionChanged}
120-
onSelectAll={() =>
120+
onSelectAll={() => {
121+
const visible = filteredRecords.map((r) => `${r.accessKey}`);
122+
const allVisible =
123+
visible.length > 0 &&
124+
visible.every((v) => selUsers.includes(v));
121125
setSelectedUsers(
122-
selUsers.length === filteredRecords.length
123-
? []
124-
: filteredRecords.map((r) => `${r.accessKey}`),
125-
)
126-
}
126+
allVisible
127+
? selUsers.filter((v) => !visible.includes(v))
128+
: Array.from(new Set([...selUsers, ...visible])),
129+
);
130+
}}
127131
selectedItems={selUsers}
128132
isLoading={loading}
129133
records={filteredRecords}

web-app/src/screens/Console/Policies/PolicySelectors.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -114,15 +114,19 @@ const PolicySelectors = ({ noTitle = false }: ISelectPolicyProps) => {
114114
<DataTable
115115
columns={[{ label: t("Policy"), elementKey: "name" }]}
116116
onSelect={selectionChanged}
117-
onSelectAll={() =>
117+
onSelectAll={() => {
118+
const visible = filteredRecords.map((r) => `${r.name}`);
119+
const allVisible =
120+
visible.length > 0 &&
121+
visible.every((v) => currentPolicies.includes(v));
118122
dispatch(
119123
setSelectedPolicies(
120-
currentPolicies.length === filteredRecords.length
121-
? []
122-
: filteredRecords.map((r) => `${r.name}`),
124+
allVisible
125+
? currentPolicies.filter((v) => !visible.includes(v))
126+
: Array.from(new Set([...currentPolicies, ...visible])),
123127
),
124-
)
125-
}
128+
);
129+
}}
126130
selectedItems={currentPolicies}
127131
isLoading={loading}
128132
records={filteredRecords}

web-app/src/screens/Console/Users/ListUsers.tsx

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -350,14 +350,25 @@ const ListUsers = () => {
350350
}
351351
onSelectAll={
352352
addUserToGroup || deleteUser
353-
? () =>
353+
? () => {
354+
const visible = filteredRecords.map(
355+
(r) => `${r.accessKey}`,
356+
);
357+
const allVisible =
358+
visible.length > 0 &&
359+
visible.every((v) =>
360+
checkedUsers.includes(v),
361+
);
354362
setCheckedUsers(
355-
checkedUsers.length === filteredRecords.length
356-
? []
357-
: filteredRecords.map(
358-
(r) => `${r.accessKey}`,
363+
allVisible
364+
? checkedUsers.filter(
365+
(v) => !visible.includes(v),
366+
)
367+
: Array.from(
368+
new Set([...checkedUsers, ...visible]),
359369
),
360-
)
370+
);
371+
}
361372
: undefined
362373
}
363374
selectedItems={checkedUsers}

web-app/src/screens/Console/Users/UserServiceAccountsPanel.tsx

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -256,13 +256,16 @@ const UserServiceAccountsPanel = ({
256256
customEmptyMessage={t("There are no Access Keys yet.")}
257257
columns={accountTableColumns(t)}
258258
onSelect={(e) => selectSAs(e, setSelectedSAs, selectedSAs)}
259-
onSelectAll={() =>
259+
onSelectAll={() => {
260+
const visible = records.map((r) => `${r.accessKey}`);
261+
const allVisible =
262+
visible.length > 0 && visible.every((v) => selectedSAs.includes(v));
260263
setSelectedSAs(
261-
selectedSAs.length === records.length
262-
? []
263-
: records.map((r) => `${r.accessKey}`),
264-
)
265-
}
264+
allVisible
265+
? selectedSAs.filter((v) => !visible.includes(v))
266+
: Array.from(new Set([...selectedSAs, ...visible])),
267+
);
268+
}}
266269
selectedItems={selectedSAs}
267270
isLoading={loading}
268271
records={records}

0 commit comments

Comments
 (0)