Skip to content
Snippets Groups Projects
Commit 406be16b authored by Eirik Morland's avatar Eirik Morland
Browse files

Issue #3447432 by eiriksm: make it possible to change roles of members of a team

parent 6ee71e7c
No related branches found
No related tags found
1 merge request!55Add an edit form and the functionality we need
Pipeline #175957 passed with warnings
......@@ -53,6 +53,7 @@ final class MembersController extends ControllerBase {
'#theme' => 'violinist_teams_team_member_row',
'#user' => $admin,
'#role' => $this->t('Administrator'),
'#team' => $team,
];
}
foreach ($members as $member) {
......@@ -63,12 +64,14 @@ final class MembersController extends ControllerBase {
'#theme' => 'violinist_teams_team_member_row',
'#user' => $member,
'#role' => $this->t('Member'),
'#team' => $team,
];
}
$build['members'] = [
'#theme' => 'violinist_teams_team_members_table',
'#rows' => $rows,
'#has_edit' => $team->isAdmin($this->currentUser),
];
return $build;
}
......
<?php
declare(strict_types=1);
namespace Drupal\violinist_teams\Form;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormBase;
use Drupal\Core\Form\FormStateInterface;
use Drupal\user\UserInterface;
use Drupal\violinist_teams\TeamNode;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Provides a Violinist teams form.
*/
final class EditRoleForm extends FormBase {
public function __construct(
private EntityTypeManagerInterface $entityTypeManager,
) {}
/**
* {@inheritdoc}
*/
public static function create(ContainerInterface $container) {
return new static(
$container->get('entity_type.manager')
);
}
/**
* {@inheritdoc}
*/
public function getFormId(): string {
return 'violinist_teams_edit_role';
}
/**
* {@inheritdoc}
*/
public function buildForm(array $form, FormStateInterface $form_state, TeamNode $team = NULL, $uid = NULL): array {
if (!$team instanceof TeamNode || !$uid) {
return $form;
}
// Let's find out if this uid is even in the team.
if (!in_array($uid, $team->getMemberIds()) && !in_array($uid, $team->getAdministratorIds())) {
return $form;
}
$form['team'] = [
'#type' => 'value',
'#value' => $team,
];
$form['uid'] = [
'#type' => 'value',
'#value' => $uid,
];
$options = [
'member' => $this->t('Member'),
'admin' => $this->t('Administrator'),
];
$default_value = 'member';
if (in_array($uid, $team->getAdministratorIds())) {
$default_value = 'admin';
}
$form['role'] = [
'#type' => 'select',
'#title' => $this->t('Role'),
'#options' => $options,
'#default_value' => $default_value,
];
$form['actions'] = [
'#type' => 'actions',
'submit' => [
'#type' => 'submit',
'#value' => $this->t('Save'),
],
];
return $form;
}
/**
* {@inheritdoc}
*/
public function validateForm(array &$form, FormStateInterface $form_state): void {
$team = $form_state->getValue('team');
if (!$team instanceof TeamNode) {
$form_state->setErrorByName('team', $this->t('Invalid team'));
}
$uid = $form_state->getValue('uid');
$user = $this->entityTypeManager->getStorage('user')->load($uid);
if (!$user instanceof UserInterface) {
$form_state->setErrorByName('uid', $this->t('Invalid user'));
}
}
/**
* {@inheritdoc}
*/
public function submitForm(array &$form, FormStateInterface $form_state): void {
// Find the new role they should have.
$role = $form_state->getValue('role');
$team = $form_state->getValue('team');
if (!$team instanceof TeamNode) {
// Not sure how that would be remotely possible.
return;
}
$uid = $form_state->getValue('uid');
$user = $this->entityTypeManager->getStorage('user')->load($uid);
if (!$user instanceof UserInterface) {
// Not sure how that would be remotely possible.
return;
}
if ($role === 'admin') {
// It's fine if they are both a memeber and an admin.
$team->appendAdmin($user);
}
else {
// Make sure we remove their admin role, should they have one.
$admins = $team->getAdministrators();
$admins = array_filter($admins, function (UserInterface $admin) use ($user) {
return $admin->id() !== $user->id();
});
$team->setAdmins($admins);
$team->appendMember($user);
}
$team->save();
$form_state->setRedirect('violinist_teams.team_members', ['team' => $form_state->getValue('team')->id()]);
}
}
......@@ -8,7 +8,9 @@
<td class="px-6 py-4">
{{ role }}
</td>
{# <td class="px-6 py-4">#}
{# #}{# todo: Fix the edit link #}
{# </td>#}
{% if edit %}
<td class="px-6 py-4 edit-role-link">
{{ edit }}
</td>
{% endif %}
</tr>
......@@ -9,6 +9,11 @@
<th scope="col" class="px-6 py-3">
Role
</th>
{% if has_edit %}
<th scope="col" class="px-6 py-3">
Edit
</th>
{% endif %}
</tr>
</thead>
<tbody>
......
......@@ -6,6 +6,7 @@
*/
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Link;
use Drupal\user\UserInterface;
use Drupal\violinist_projects\ProjectNode;
use Drupal\violinist_teams\TeamNode;
......@@ -46,10 +47,12 @@ function violinist_teams_theme($existing, $type, $theme, $path) {
'violinist_teams_team_members_table' => [
'variables' => [
'rows' => [],
'has_edit' => FALSE,
],
],
'violinist_teams_team_member_row' => [
'variables' => [
'team' => NULL,
'user' => NULL,
'role' => 'member',
],
......@@ -103,6 +106,23 @@ function violinist_teams_preprocess_violinist_teams_team_member_row(&$variables)
}
$variables['name'] = $user->getDisplayName();
$variables['mail'] = $user->getEmail();
$current_user = \Drupal::currentUser();
$team = $variables['team'];
if (!$team instanceof TeamNode) {
return;
}
if ($team->isAdmin($current_user)) {
$variables['edit'] = Link::createFromRoute(t('Edit'), 'violinist_teams.edit_role', [
'team' => $team->id(),
'uid' => $user->id(),
], [
'attributes' => [
'class' => ['use-ajax'],
'data-dialog-type' => 'modal',
],
]);
}
}
/**
......
......@@ -65,3 +65,15 @@ violinist_teams.invite_accept:
_controller: '\Drupal\violinist_teams\Controller\InviteController'
requirements:
_permission: 'access content'
violinist_teams.edit_role:
path: '/violinist-teams/{team}/edit-role/{uid}'
options:
parameters:
team:
type: entity:node
defaults:
_title: 'Edit Role'
_form: 'Drupal\violinist_teams\Form\EditRoleForm'
requirements:
_violinist_teams_access: 'admin'
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment