Skip to content

Commit

Permalink
Added ban reason and scope
Browse files Browse the repository at this point in the history
  • Loading branch information
danieljames-dj committed Jun 22, 2024
1 parent 1e2d8f8 commit 26bb1cb
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 12 deletions.
40 changes: 30 additions & 10 deletions app/controllers/api/v0/user_roles_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,10 @@ def create
case changed_key
when 'end_date'
'End Date'
when 'ban_reason'
'Ban reason'
when 'scope'
'Ban scope'
else
nil
end
Expand All @@ -166,6 +170,19 @@ def create
changed_value.nil? ? 'None' : changed_value
end

private def push_previous_changes_to_changes(previous_changes, changes)
previous_changes&.each do |changed_key, values|
changed_parameter = changed_key_to_human_readable(changed_key)
if changed_parameter.present?
changes << UserRole::UserRoleChange.new(
changed_parameter: changed_parameter,
previous_value: changed_value_to_human_readable(values[0]),
new_value: changed_value_to_human_readable(values[1]),
)
end
end
end

# update method is written in a way that at a time, only one parameter can be changed. If multiple
# values needs to be changed, then they need to be sent as separate APIs from the client.
def update
Expand Down Expand Up @@ -281,17 +298,20 @@ def update
role.end_date = params.require(:endDate)
end

role.save!
role.previous_changes.each do |changed_key, values|
changed_parameter = changed_key_to_human_readable(changed_key)
if changed_parameter.present?
changes << UserRole::UserRoleChange.new(
changed_parameter: changed_parameter,
previous_value: changed_value_to_human_readable(values[0]),
new_value: changed_value_to_human_readable(values[1]),
)
end
if params.key?(:banReason)
role.metadata.ban_reason = params.require(:banReason)
end

if params.key?(:scope)
role.metadata.scope = params.require(:scope)
end

ActiveRecord::Base.transaction do
role.metadata&.save!
role.save!
end
push_previous_changes_to_changes(role.metadata&.previous_changes, changes)
push_previous_changes_to_changes(role.previous_changes, changes)
else
return render status: :unprocessable_entity, json: { error: "Invalid group type" }
end
Expand Down
4 changes: 4 additions & 0 deletions app/models/roles_metadata_banned_competitors.rb
Original file line number Diff line number Diff line change
@@ -1,4 +1,8 @@
# frozen_string_literal: true

class RolesMetadataBannedCompetitors < ApplicationRecord
enum :scope, {
competing_only: "competing_only",
competing_and_attending: "competing_and_attending",
}
end
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
import React, { useState } from 'react';
import { Form } from 'semantic-ui-react';
import { apiV0Urls } from '../../../../lib/requests/routes.js.erb';
import { groupTypes } from '../../../../lib/wca-data.js.erb';
import { groupTypes, banScopes } from '../../../../lib/wca-data.js.erb';
import WcaSearch from '../../../SearchWidget/WcaSearch';
import SEARCH_MODELS from '../../../SearchWidget/SearchModel';
import UtcDatePicker from '../../../wca/UtcDatePicker';
import useSaveAction from '../../../../lib/hooks/useSaveAction';
import Loading from '../../../Requests/Loading';
import Errored from '../../../Requests/Errored';
import I18n from '../../../../lib/i18n';

const banScopeOptions = Object.keys(banScopes).map((option) => ({
key: option,
text: I18n.t(`enums.user_roles.ban_scope.${option}`),
value: option,
}));

export default function BanendCompetitorForm({
sync, banAction, banActionRole, closeForm,
}) {
const [formValues, setFormValues] = useState({
user: null,
endDate: banActionRole?.end_date,
banReason: banActionRole?.metadata.ban_reason,
scope: banActionRole?.metadata.scope,
});
const [formError, setFormError] = useState();
const { save, saving } = useSaveAction();
Expand All @@ -35,6 +44,8 @@ export default function BanendCompetitorForm({
const editBannedCompetitor = () => {
save(apiV0Urls.userRoles.update(banActionRole.id), {
endDate: formValues?.endDate,
banReason: formValues?.banReason,
scope: formValues?.scope,
}, () => {
sync();
closeForm();
Expand Down Expand Up @@ -72,6 +83,19 @@ export default function BanendCompetitorForm({
value: date,
})}
/>
<Form.Input
label="Ban Reason"
name="banReason"
value={formValues?.banReason}
onChange={handleFormChange}
/>
<Form.Dropdown
label="Ban Scope"
name="scope"
value={formValues?.scope}
onChange={handleFormChange}
options={banScopeOptions}
/>
<Form.Button onClick={closeForm}>Cancel</Form.Button>
<Form.Button type="submit">Save</Form.Button>
</Form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ export default function BannedCompetitors({
<Table.HeaderCell width={5}>User</Table.HeaderCell>
<Table.HeaderCell width={2}>Start date</Table.HeaderCell>
<Table.HeaderCell width={2}>End date</Table.HeaderCell>
<Table.HeaderCell width={2}>Ban reason</Table.HeaderCell>
<Table.HeaderCell width={2}>Ban scope</Table.HeaderCell>
{canEditBannedCompetitors && <Table.HeaderCell width={2}>Edit</Table.HeaderCell>}
</Table.Row>
</Table.Header>
Expand All @@ -37,6 +39,8 @@ export default function BannedCompetitors({
</Table.Cell>
<Table.Cell>{role.start_date}</Table.Cell>
<Table.Cell>{role.end_date}</Table.Cell>
<Table.Cell>{role.metadata.ban_reason}</Table.Cell>
<Table.Cell>{role.metadata.scope}</Table.Cell>
{canEditBannedCompetitors && (
<Table.Cell>
<Icon
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ export default function BannedCompetitorsPage() {
{pastBannedCompetitorRoles.length > 0 && (
<>
<Header>Past Banned Competitors</Header>
<BannedCompetitors bannedCompetitorRoles={pastBannedCompetitorRoles} />
<BannedCompetitors
bannedCompetitorRoles={pastBannedCompetitorRoles}
canEditBannedCompetitors={canEditBannedCompetitors}
/>
</>
)}
</>
Expand Down
2 changes: 2 additions & 0 deletions app/webpacker/lib/wca-data.js.erb
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,8 @@ export const delegateRegionsStatus = <%= RolesMetadataDelegateRegions.statuses.t

export const officersStatus = <%= RolesMetadataOfficers.statuses.to_json %>;

export const banScopes = <%= RolesMetadataBannedCompetitors.scopes.to_json %>

// ----- PANEL LIST -----

export const PANEL_LIST = <%= PanelController.panel_list.to_json.html_safe %>;
Expand Down
3 changes: 3 additions & 0 deletions config/locales/en.yml
Original file line number Diff line number Diff line change
Expand Up @@ -412,6 +412,9 @@ en:
secretary: "WCA Secretary"
vice_chair: "WCA Vice-Chair"
treasurer: "WCA Treasurer"
ban_scope:
competing_only: "Competing Only"
competing_and_attending: "Competing & Attending"
competition_medium:
status:
accepted: "Accepted"
Expand Down

0 comments on commit 26bb1cb

Please sign in to comment.