Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Roles now are a taglike field #999

Merged
merged 4 commits into from
Jan 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions app/Http/Controllers/Campaign/MemberController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
use App\Exceptions\TranslatableException;
use App\Facades\Identity;
use App\Http\Controllers\Controller;
use App\Http\Requests\UpdateUserRoles;
use App\Models\Campaign;
use App\Models\CampaignRole;
use App\Models\CampaignUser;
use App\Models\Entity;
use App\Services\Campaign\MemberService;
Expand Down Expand Up @@ -65,15 +65,14 @@ public function back(Campaign $campaign)
/**
* @throws \Illuminate\Auth\Access\AuthorizationException
*/
public function updateRoles(Campaign $campaign, CampaignUser $campaignUser, CampaignRole $campaignRole)
public function updateRoles(UpdateUserRoles $request, Campaign $campaign, CampaignUser $campaignUser)
{
$this->authorize('update', $campaignUser);
if (request()->ajax()) {
return response()->json();
}

try {
$added = $this->service->update($campaignUser, $campaignRole);
$added = $this->service->campaign($campaign)->update($campaignUser, $request->get('roles', []));
} catch (TranslatableException $e) {
return redirect()
->route('campaign_users.index', $campaign)
Expand All @@ -82,9 +81,8 @@ public function updateRoles(Campaign $campaign, CampaignUser $campaignUser, Camp

return redirect()
->route('campaign_users.index', $campaign)
->with('success', __('campaigns.members.updates.' . ($added ? 'added' : 'removed'), [
->with('success', __('campaigns.members.updates.roles', [
'user' => $campaignUser->user->name,
'role' => $campaignRole->name
]));
}

Expand Down
2 changes: 2 additions & 0 deletions app/Http/Controllers/Campaign/RoleController.php
Original file line number Diff line number Diff line change
Expand Up @@ -230,6 +230,8 @@ public function search(Request $request, Campaign $campaign)
$term = $request->get('q', null);
if (empty($term)) {
$members = $campaign->roles()->where('is_admin', 0)->where('is_public', 0)->orderBy('name', 'asc')->limit(5)->get();
} elseif ($request->get('with-admin', null)) {
$members = $campaign->roles()->where('is_public', 0)->where('name', 'like', '%' . $term . '%')->limit(5)->get();
} else {
$members = $campaign->roles()->where('is_admin', 0)->where('is_public', 0)->where('name', 'like', '%' . $term . '%')->limit(5)->get();
}
Expand Down
32 changes: 32 additions & 0 deletions app/Http/Requests/UpdateUserRoles.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class UpdateUserRoles extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
$rules = [
'roles' => 'array',
'roles.*' => 'required|exists:campaign_roles,id'
];
return $rules;
}
}
2 changes: 1 addition & 1 deletion app/Models/Entity.php
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ class Entity extends Model
use Searchable;
use SoftDeletes;
use SortableTrait;
use Templatable;
use Taggable;
use Templatable;

protected $fillable = [
'campaign_id',
Expand Down
44 changes: 27 additions & 17 deletions app/Services/Campaign/MemberService.php
Original file line number Diff line number Diff line change
Expand Up @@ -42,20 +42,23 @@ public function fromRequest(UpdateUserRole $request): self

/**
*/
public function update(CampaignUser $user, CampaignRole $campaignRole): bool
public function update(CampaignUser $user, array $roles): bool
{
$currentRoles = $user->roles->pluck('id')->toArray();
$roleUsers = CampaignRoleUser::where('user_id', $user->user_id)
->whereIn('campaign_role_id', $currentRoles)
->whereNotIn('campaign_role_id', $roles)
->with('campaignRole')
->get();

$deletedRoles = [];
/** @var ?CampaignRoleUser $role */
$role = CampaignRoleUser::where('user_id', $user->user_id)
->where('campaign_role_id', $campaignRole->id)
->first();

// Admin role being switched? Forget the cache
if ($campaignRole->isAdmin()) {
CampaignCache::campaign($campaignRole->campaign)->clear();
}

// Deleting an existing role
if ($role) {
foreach ($roleUsers as $role) {
spitfire305 marked this conversation as resolved.
Show resolved Hide resolved
// Admin role being switched? Forget the cache
if ($role->campaignRole->isAdmin()) {
CampaignCache::campaign($this->campaign)->clear();
}
// When trying to delete an admin role check if it was created recently
if ($role->campaignRole->isAdmin() && !$role->recentlyCreated()) {
throw (new TranslatableException(
'campaigns.roles.users.errors.cant_kick_admins'
Expand All @@ -65,14 +68,21 @@ public function update(CampaignUser $user, CampaignRole $campaignRole): bool
'email' => '<a href="mailto:' . config('app.email') . '">' . config('app.email') . '</a>',
]);
}
}

//Now actually delete the roles
foreach ($roleUsers as $role) {
$deletedRoles[] = $role->id;
$role->delete();
return false;
}

CampaignRoleUser::create([
'campaign_role_id' => $campaignRole->id,
'user_id' => $user->user_id
]);
$rolesToCreate = array_diff_key($roles, $currentRoles);
foreach ($rolesToCreate as $role) {
CampaignRoleUser::create([
'campaign_role_id' => $role,
'user_id' => $user->user_id
]);
}
return true;
}

Expand Down
3 changes: 1 addition & 2 deletions lang/en/campaigns.php
Original file line number Diff line number Diff line change
Expand Up @@ -197,8 +197,7 @@
'switch_back_success' => 'Switched back to your account.',
'title' => 'Members - :name',
'updates' => [
'added' => 'Role :role added to :user.',
'removed' => 'Role :role removed from :user.',
'roles' => 'Roles successfully updated for :user',
],
],
'mentions' => [
Expand Down
21 changes: 8 additions & 13 deletions resources/views/campaigns/members/_form.blade.php
Original file line number Diff line number Diff line change
@@ -1,15 +1,10 @@
<x-grid type="1/1">
@foreach($roles as $role)
<x-form :action="['campaign_users.update-roles', $campaign, $campaignUser, $role]">
<button class='btn2 btn-block btn-feedback @if($campaignUser->user->hasCampaignRole($role->id)) btn-error btn-outline @endif'>
@if($campaignUser->user->hasCampaignRole($role->id))
<x-icon class="trash" />
{!! $role->name !!}
@else
<x-icon class="plus" />
{!! $role->name !!}
@endif
</button>
</x-form>
@endforeach
<input type="hidden" name="save_roles" value="1">
<x-forms.field field="roles" :label="__('crud.permissions.fields.role')">
@include('components.form.role', ['options' => [
'multiple' => true,
'model' => $campaignUser,
'roles' => $roles ?? false
]])
</x-forms.field>
</x-grid>
15 changes: 7 additions & 8 deletions resources/views/campaigns/members/update.blade.php
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
<div class="formless">
<x-dialog.header>
{{ __('campaigns.members.manage_roles') }} - {!! $campaignUser->user->name !!}
</x-dialog.header>
<article class="max-w-2xl">
@include('campaigns.members._form')
</article>
</div>
<x-form :action="['campaign_users.update-roles', $campaign, $campaignUser]">
@include('partials.forms.form', [
'title' => __('campaigns.members.manage_roles') . ' - ' . $campaignUser->user->name,
'content' => 'campaigns.members._form',
'dialog' => true,
])
</x-form>
21 changes: 20 additions & 1 deletion resources/views/components/form/role.blade.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,31 @@
* We want to pre-load the data from the model, or what has been sent with the form.
*/
$selectedOption = [];
$model = Arr::get($options, 'model');
$roles = Arr::get($options, 'roles', false);

// Try to load what was sent with the form first, in case there was a form validation error
$previous = old('userRoles[]');
$fieldUniqIdentifier = 'user_roles_' . uniqid();

if(!empty($model) && !empty($roles)) {
foreach ($roles as $role) {
if ($campaignUser->user->hasCampaignRole($role->id)) {
$selectedOption[$role->id] = strip_tags($role->name);
}
}
}

$dropdownParent = Arr::get($options, 'dropdownParent');
$multiple = Arr::get($options, 'multiple');
?>
<select name="{{ $multiple ? 'roles[]' : 'role'}}" id="{{ $multiple ? 'roles' : 'role'}}"
class="select2 form-role w-100"
@if (isset($multiple) && $multiple) multiple @endif
data-url="{{ route('roles.find', $campaign) }}"
data-url="{{ route('roles.find', ['campaign' => $campaign, 'with-admin' => true]) }}"
@if (!empty($dropdownParent)) data-dropdown-parent="{{ $dropdownParent }}" @endif>

@foreach ($selectedOption as $key => $val)
<option value="{{ $key }}" selected="selected">{{ $val }}</option>
@endforeach
</select>
2 changes: 1 addition & 1 deletion routes/campaigns/campaign.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@
Route::get('/w/{campaign}/members/switch/{campaign_user}/{entity}', 'Campaign\MemberController@switch')->name('identity.switch-entity');


Route::post('/w/{campaign}/campaign_users/{campaign_user}/update-role/{campaign_role}', 'Campaign\MemberController@updateRoles')->name('campaign_users.update-roles');
Route::post('/w/{campaign}/campaign_users/{campaign_user}/update-roles/', 'Campaign\MemberController@updateRoles')->name('campaign_users.update-roles');
Route::get('/w/{campaign}/campaign_users/{campaign_user}/delete', [App\Http\Controllers\Campaign\MemberController::class, 'delete'])->name('campaign_users.delete');
Route::get('/w/{campaign}/campaign_user_roles/{campaign_user}', [App\Http\Controllers\Campaign\Members\RoleController::class, 'index'])->name('campaign.members.roles');

Expand Down
2 changes: 1 addition & 1 deletion routes/campaigns/entities.php
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@

Route::get('/w/{campaign}/dice_rolls/{dice_roll}/roll', 'Crud\DiceRollController@roll')->name('dice_rolls.roll');
Route::delete('/w/{campaign}/dice_rolls/{dice_roll}/roll/{dice_roll_result}/destroy', 'Crud\DiceRollController@destroyRoll')->name('dice_rolls.destroy_roll');
Route::get('/w/{campaign}/dice_rolls/results', [\App\Http\Controllers\DiceRolls\ResultsController::class, 'index'])->name('dice_rolls.results');
Route::get('/w/{campaign}/dice_rolls/results', [App\Http\Controllers\DiceRolls\ResultsController::class, 'index'])->name('dice_rolls.results');

// Locations
Route::get('/w/{campaign}/locations/{location}/characters', 'Locations\CharacterController@index')->name('locations.characters');
Expand Down
Loading