[MM-64630] Fix an issue where multiple channels can't be removed from policies (#32164)

* Fix an issue where multiple channels can't be removed from policies

* actually fix the issue

* use hardcoded limit

* simplify removal
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2025-07-01 20:48:57 +02:00
коммит произвёл GitHub
родитель d8758f8984
Коммит 0809ce7a62
5 изменённых файлов: 18 добавлений и 35 удалений

Просмотреть файл

@@ -183,6 +183,7 @@ func (a *App) UnassignPoliciesFromChannels(rctx request.CTX, policyID string, ch
cps, _, err := a.Srv().Store().AccessControlPolicy().SearchPolicies(rctx, model.AccessControlPolicySearch{ cps, _, err := a.Srv().Store().AccessControlPolicy().SearchPolicies(rctx, model.AccessControlPolicySearch{
Type: model.AccessControlPolicyTypeChannel, Type: model.AccessControlPolicyTypeChannel,
ParentID: policyID, ParentID: policyID,
Limit: 1000,
}) })
if err != nil { if err != nil {
return model.NewAppError("UnassignPoliciesFromChannels", "app.pap.unassign_access_control_policy_from_channels.app_error", nil, err.Error(), http.StatusInternalServerError) return model.NewAppError("UnassignPoliciesFromChannels", "app.pap.unassign_access_control_policy_from_channels.app_error", nil, err.Error(), http.StatusInternalServerError)

Просмотреть файл

@@ -341,7 +341,7 @@ func TestAssignAccessControlPolicyToChannels(t *testing.T) {
}) })
} }
func TestUnAssignPoliciesFromChannels(t *testing.T) { func TestUnassignPoliciesFromChannels(t *testing.T) {
th := Setup(t).InitBasic() th := Setup(t).InitBasic()
defer th.TearDown() defer th.TearDown()

Просмотреть файл

@@ -142,7 +142,6 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
channelsToAdd={Object {}} channelsToAdd={Object {}}
channelsToRemove={Object {}} channelsToRemove={Object {}}
onRemoveCallback={[Function]} onRemoveCallback={[Function]}
onUndoRemoveCallback={[Function]}
policyId="policy1" policyId="policy1"
/> />
</CardBody> </CardBody>
@@ -346,7 +345,6 @@ exports[`components/admin_console/access_control/policy_details/PolicyDetails sh
channelsToAdd={Object {}} channelsToAdd={Object {}}
channelsToRemove={Object {}} channelsToRemove={Object {}}
onRemoveCallback={[Function]} onRemoveCallback={[Function]}
onUndoRemoveCallback={[Function]}
policyId="" policyId=""
/> />
</CardBody> </CardBody>

Просмотреть файл

@@ -30,7 +30,6 @@ type Props = {
filters: ChannelSearchOpts; filters: ChannelSearchOpts;
policyId?: string; policyId?: string;
onRemoveCallback: (channel: ChannelWithTeamData) => void; onRemoveCallback: (channel: ChannelWithTeamData) => void;
onUndoRemoveCallback: (channel: ChannelWithTeamData) => void;
channelsToRemove: Record<string, ChannelWithTeamData>; channelsToRemove: Record<string, ChannelWithTeamData>;
channelsToAdd: Record<string, ChannelWithTeamData>; channelsToAdd: Record<string, ChannelWithTeamData>;
actions: { actions: {
@@ -196,16 +195,9 @@ export default class ChannelList extends React.PureComponent<Props, State> {
}; };
private removeChannel = (channel: ChannelWithTeamData) => { private removeChannel = (channel: ChannelWithTeamData) => {
const {channelsToRemove, onRemoveCallback, onUndoRemoveCallback} = this.props; const {onRemoveCallback} = this.props;
const {page} = this.state; const {page} = this.state;
// Toggle between adding and removing the channel
if (channelsToRemove[channel.id] === channel) {
// If the channel is already marked for removal, undo it
onUndoRemoveCallback(channel);
return;
}
// If the channel is not marked for removal, mark it // If the channel is not marked for removal, mark it
onRemoveCallback(channel); onRemoveCallback(channel);

Просмотреть файл

@@ -279,38 +279,31 @@ function PolicyDetails({
} }
}; };
const handleChannelChanges = (channels: ChannelWithTeamData[], isAdding: boolean) => { const addToNewChannels = (channels: ChannelWithTeamData[]) => {
setChannelChanges((prev) => { setChannelChanges((prev) => {
const newChanges = cloneDeep(prev); const newChanges = cloneDeep(prev);
channels.forEach((channel: ChannelWithTeamData) => {
channels.forEach((channel) => { if (newChanges.removed[channel.id]?.id === channel.id) {
if (isAdding) { delete newChanges.removed[channel.id];
if (newChanges.removed[channel.id]) { newChanges.removedCount--;
delete newChanges.removed[channel.id]; } else {
newChanges.removedCount--; newChanges.added[channel.id] = channel;
} else {
newChanges.added[channel.id] = channel;
}
} else if (newChanges.added[channel.id]) {
delete newChanges.added[channel.id];
} else if (!newChanges.removed[channel.id]) {
newChanges.removedCount++;
newChanges.removed[channel.id] = channel;
} }
}); });
return newChanges; return newChanges;
}); });
setSaveNeeded(true); setSaveNeeded(true);
actions.setNavigationBlocked(true); actions.setNavigationBlocked(true);
}; };
const handleUndoRemove = (channel: ChannelWithTeamData) => { const addToRemovedChannels = (channel: ChannelWithTeamData) => {
setChannelChanges((prev) => { setChannelChanges((prev) => {
const newChanges = cloneDeep(prev); const newChanges = cloneDeep(prev);
if (newChanges.removed[channel.id]) { if (newChanges.added[channel.id]?.id === channel.id) {
delete newChanges.removed[channel.id]; delete newChanges.added[channel.id];
newChanges.removedCount--; } else if (newChanges.removed[channel.id]?.id !== channel.id) {
newChanges.removedCount++;
newChanges.removed[channel.id] = channel;
} }
return newChanges; return newChanges;
}); });
@@ -518,8 +511,7 @@ function PolicyDetails({
</Card.Header> </Card.Header>
<Card.Body expanded={true}> <Card.Body expanded={true}>
<ChannelList <ChannelList
onRemoveCallback={(channel) => handleChannelChanges([channel], false)} onRemoveCallback={(channel) => addToRemovedChannels(channel)}
onUndoRemoveCallback={handleUndoRemove}
channelsToRemove={channelChanges.removed} channelsToRemove={channelChanges.removed}
channelsToAdd={channelChanges.added} channelsToAdd={channelChanges.added}
policyId={policyId} policyId={policyId}
@@ -575,7 +567,7 @@ function PolicyDetails({
{addChannelOpen && ( {addChannelOpen && (
<ChannelSelectorModal <ChannelSelectorModal
onModalDismissed={() => setAddChannelOpen(false)} onModalDismissed={() => setAddChannelOpen(false)}
onChannelsSelected={(channels) => handleChannelChanges(channels, true)} onChannelsSelected={(channels) => addToNewChannels(channels)}
groupID={''} groupID={''}
alreadySelected={Object.values(channelChanges.added).map((channel) => channel.id)} alreadySelected={Object.values(channelChanges.added).map((channel) => channel.id)}
excludeAccessControlPolicyEnforced={true} excludeAccessControlPolicyEnforced={true}