From e1f54e12e3d8fbd87d972b8f2d3af7b26fa6cf83 Mon Sep 17 00:00:00 2001 From: Wotuu Date: Mon, 29 Apr 2019 18:04:45 +0200 Subject: [PATCH] #77 You can now delete teams. Also got rid of 'prompt' dialogs, replaced with Noty instead. --- app/Http/Controllers/TeamController.php | 25 ++++++++++-- app/Models/Team.php | 31 ++++++++++++--- .../js/custom/inline/dungeonroute/table.js | 4 +- .../assets/js/custom/inline/layouts/app.js | 32 +++++++++++++++ resources/lang/en/js.php | 10 ++++- resources/views/team/edit.blade.php | 39 +++++++++++++++---- routes/web.php | 1 + 7 files changed, 123 insertions(+), 19 deletions(-) diff --git a/app/Http/Controllers/TeamController.php b/app/Http/Controllers/TeamController.php index 120138678..99c2020f3 100644 --- a/app/Http/Controllers/TeamController.php +++ b/app/Http/Controllers/TeamController.php @@ -61,8 +61,10 @@ public function store($request, Team $team = null) } } - // If saving team + logo was successful, save our own user as its first member - $team->addMember(Auth::user(), 'admin'); + if ($new) { + // If saving team + logo was successful, save our own user as its first member + $team->addMember(Auth::user(), 'admin'); + } } return $team; @@ -86,6 +88,23 @@ public function edit(Request $request, Team $team) return view('team.edit', ['model' => $team]); } + /** + * @param Request $request + * @param Team $team + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View + */ + public function delete(Request $request, Team $team) + { + if ($team->isUserMember(Auth::user()) && $team->getUserRole(Auth::user()) === 'admin') { + try { + $team->delete(); + } catch (\Exception $ex) { + abort(500); + } + } + return redirect()->route('team.list'); + } + /** * @param TeamFormRequest $request * @param Team $team @@ -128,7 +147,7 @@ public function savenew(TeamFormRequest $request) public function list() { $user = Auth::user(); - return view('team.list', ['models' => $user->teams()->where('user_id', $user->id)->get()]); + return view('team.list', ['models' => $user->teams]); } /** diff --git a/app/Models/Team.php b/app/Models/Team.php index b66edd02e..c6e1fbd85 100644 --- a/app/Models/Team.php +++ b/app/Models/Team.php @@ -216,11 +216,14 @@ public function isUserMember($user) */ public function addMember($user, $role) { - $teamUser = new TeamUser(); - $teamUser->team_id = $this->id; - $teamUser->user_id = $user->id; - $teamUser->role = $role; - $teamUser->save(); + // Prevent duplicate member listings + if (!$this->isUserMember($user)) { + $teamUser = new TeamUser(); + $teamUser->team_id = $this->id; + $teamUser->user_id = $user->id; + $teamUser->role = $role; + $teamUser->save(); + } } /** @@ -239,4 +242,22 @@ public static function generateRandomInviteCode() return $newKey; } + + public static function boot() + { + parent::boot(); + + // Delete route properly if it gets deleted + static::deleting(function ($item) { + /** @var $item Team */ + + // Delete icons + $item->iconfile->delete(); + + // Remove all users associated with this team + TeamUser::where('team_id', $item->id)->delete(); + // Unassign all routes from this team + DungeonRoute::where('team_id', $item->id)->update(['team_id' => -1]); + }); + } } diff --git a/resources/assets/js/custom/inline/dungeonroute/table.js b/resources/assets/js/custom/inline/dungeonroute/table.js index b67e8c91e..801d851d0 100644 --- a/resources/assets/js/custom/inline/dungeonroute/table.js +++ b/resources/assets/js/custom/inline/dungeonroute/table.js @@ -341,7 +341,7 @@ class DungeonrouteTable extends InlineCode { * @private */ _promptDeleteDungeonRoute(clickEvent) { - if (confirm(lang.get('messages.route_delete_confirm'))) { + showConfirmYesCancel(lang.get('messages.route_delete_confirm'), function () { let publicKey = $(clickEvent.target).data('publickey'); $.ajax({ @@ -354,7 +354,7 @@ class DungeonrouteTable extends InlineCode { $('#dungeonroute_filter').trigger('click'); } }); - } + }); // Prevent clicking delete from opening the route after it returns clickEvent.preventDefault(); diff --git a/resources/assets/js/custom/inline/layouts/app.js b/resources/assets/js/custom/inline/layouts/app.js index 300d6a27b..6bdcbef74 100644 --- a/resources/assets/js/custom/inline/layouts/app.js +++ b/resources/assets/js/custom/inline/layouts/app.js @@ -206,6 +206,38 @@ function _showNotification(opts) { }, opts)).show(); } +function _showConfirm(opts) { + let n = new Noty($.extend({ + theme: 'bootstrap-v4', + layout: 'center', + modal: true + }, opts)); + n.show(); +} + +function showConfirmYesCancel(text, yesCallback, noCallback, opts = {}) { + _showConfirm($.extend({ + type: 'info', + text: text, + buttons: [ + Noty.button(lang.get('messages.yes_label'), 'btn btn-success', function (n) { + if (typeof yesCallback === 'function') { + yesCallback(); + } + n.close(); + }, {id: 'yes-button', 'data-status': 'ok'}), + + Noty.button(lang.get('messages.cancel_label'), 'btn btn-danger', function (n) { + if (typeof noCallback === 'function') { + noCallback(); + } + n.close(); + }) + ] + }, opts) + ); +} + /** * Shows a success notification message. * @param text The text to display. diff --git a/resources/lang/en/js.php b/resources/lang/en/js.php index c2983185e..edb3b1636 100644 --- a/resources/lang/en/js.php +++ b/resources/lang/en/js.php @@ -174,6 +174,9 @@ 'team_member' => 'View routes', 'remove_label' => 'Remove', + 'team_add_route_successful' => 'Route added to team successfully', + 'team_remove_route_successful' => 'Route removed from team successfully', + // Dungeonroute table headers 'preview_label' => 'Preview', 'title_label' => 'Title', @@ -190,6 +193,9 @@ 'add_route_label' => 'Add', 'remove_route_label' => 'Remove', - 'team_add_route_successful' => 'Route added to team successfully', - 'team_remove_route_successful' => 'Route removed from team successfully', + 'yes_label' => 'Yes', + 'no_label' => 'No', + 'cancel_label' => 'Cancel', + + 'delete_team_confirm_label' => 'Are you sure you want to IRREVERSIBLY delete this team and its user/route associations?' ]; diff --git a/resources/views/team/edit.blade.php b/resources/views/team/edit.blade.php index e9d94ce35..e5f1cd484 100644 --- a/resources/views/team/edit.blade.php +++ b/resources/views/team/edit.blade.php @@ -37,7 +37,7 @@ $(function () { let code = _inlineManager.getInlineCode('dungeonroute/table'); // Add route to team button - $('#add_route_btn').bind('click', function(){ + $('#add_route_btn').bind('click', function () { let tableView = code.getTableView(); tableView.setAddMode(true); @@ -47,7 +47,7 @@ }); // Cancel button when done adding routes - $('#view_existing_routes').bind('click', function(){ + $('#view_existing_routes').bind('click', function () { let tableView = code.getTableView(); tableView.setAddMode(false); @@ -56,6 +56,17 @@ $('#add_route_btn').show(); }); + $('#delete_team').bind('click', function(clickEvent){ + showConfirmYesCancel(lang.get('messages.delete_team_confirm_label'), function(){ + // Change the method to DELETE + $('#details [name="_method"]').val('DELETE'); + // Submit the form + $('#details form').submit(); + }, null, {type: 'error'}); + + clickEvent.preventDefault(); + }); + let columns = [{ 'targets': 2, @@ -221,8 +232,10 @@ function _getIcon(roleName) { @isset($model)
- - + +
@@ -245,7 +258,7 @@ function _getIcon(roleName) { ['id' => 'team_members_invite_link', 'class' => 'form-control', 'readonly' => 'readonly']) !!}
@@ -277,7 +290,8 @@ function _getIcon(roleName) {
@endisset -
+
@isset($model) {{ Form::model($model, ['route' => ['team.update', $model->id], 'method' => 'patch', 'files' => true]) }} @else @@ -306,7 +320,18 @@ function _getIcon(roleName) {
@endif - {!! Form::submit(isset($model) ? __('Save') : __('Submit'), ['class' => 'btn btn-info']) !!} +
+
+ {!! Form::submit(isset($model) ? __('Save') : __('Submit'), ['class' => 'btn btn-info']) !!} +
+
+ @if($model->getUserRole(Auth::user()) === 'admin') + + @endif +
+
{!! Form::close() !!}
diff --git a/routes/web.php b/routes/web.php index 3c8f2595d..402043c4e 100644 --- a/routes/web.php +++ b/routes/web.php @@ -132,6 +132,7 @@ Route::get('teams', 'TeamController@list')->name('team.list'); Route::get('team/new', 'TeamController@new')->name('team.new'); Route::get('team/{team}', 'TeamController@edit')->name('team.edit'); + Route::get('team/{team}', 'TeamController@delete')->name('team.delete'); Route::post('team/new', 'TeamController@savenew')->name('team.savenew'); Route::patch('team/{team}', 'TeamController@update')->name('team.update');