Skip to content

Commit 271c8a8

Browse files
authored
Merge pull request #5835 from Laravel-Backpack/delete-button-redirect-option
Delete button redirect option
2 parents 56e071e + ed4ea40 commit 271c8a8

File tree

5 files changed

+156
-96
lines changed

5 files changed

+156
-96
lines changed

src/app/Http/Controllers/Operations/DeleteOperation.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,18 @@ protected function setupDeleteDefaults()
3737
LifecycleHook::hookInto(['list:before_setup', 'show:before_setup'], function () {
3838
$this->crud->addButton('line', 'delete', 'view', 'crud::buttons.delete', 'end');
3939
});
40+
41+
// setup the default redirect to where user will be redirected after delete
42+
// if user has access to list, redirect to list, otherwise redirect to previous page
43+
LifecycleHook::hookInto('show:before_setup', function () {
44+
$this->crud->setOperationSetting('deleteButtonRedirect', function () {
45+
if ($this->crud->hasAccess('list')) {
46+
return url($this->crud->route);
47+
}
48+
49+
return url()->previous();
50+
});
51+
});
4052
}
4153

4254
/**

src/app/Library/CrudPanel/CrudButton.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,9 +295,11 @@ public function section($stack)
295295
* The HTML itself of the button.
296296
*
297297
* @param object|null $entry The eloquent Model for the current entry or null if no current entry.
298+
* @param \Backpack\CRUD\app\Library\CrudPanel\CrudPanel|null $crud The CRUD panel instance.
299+
* @param string|null $crudTableId The ID of the DataTable for multi-table support.
298300
* @return \Illuminate\Contracts\View\View
299301
*/
300-
public function getHtml($entry = null, ?CrudPanel $crud = null)
302+
public function getHtml($entry = null, ?CrudPanel $crud = null, ?string $crudTableId = null)
301303
{
302304
$button = $this;
303305
$crud = $crud ?? $this->crud();
@@ -311,7 +313,7 @@ public function getHtml($entry = null, ?CrudPanel $crud = null)
311313
}
312314

313315
if ($this->type == 'view') {
314-
return view($button->getFinalViewPath(), compact('button', 'crud', 'entry'));
316+
return view($button->getFinalViewPath(), compact('button', 'crud', 'entry', 'crudTableId'));
315317
}
316318

317319
abort(500, 'Unknown button type', ['developer-error-exception']);

src/app/Library/CrudPanel/Traits/Search.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,10 +265,13 @@ public function getRowViews($entry, $rowNumber = false)
265265

266266
// add the buttons as the last column
267267
if ($this->buttons()->where('stack', 'line')->count()) {
268+
$crudTableId = request()->input('datatable_id', 'crudTable');
269+
268270
$row_items[] = \View::make('crud::inc.button_stack', ['stack' => 'line'])
269271
->with('crud', $this)
270272
->with('entry', $entry)
271273
->with('row_number', $rowNumber)
274+
->with('crudTableId', $crudTableId)
272275
->render();
273276
}
274277

Lines changed: 136 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,22 @@
1+
2+
@php
3+
$redirectUrl = $crud->getOperationSetting('deleteButtonRedirect');
4+
if($redirectUrl && $redirectUrl instanceof \Closure){
5+
$redirectUrl = $redirectUrl();
6+
}
7+
$redirectUrl = filter_var($redirectUrl, FILTER_VALIDATE_URL) ? $redirectUrl : null;
8+
@endphp
9+
110
@if ($crud->hasAccess('delete', $entry))
2-
<a href="javascript:void(0)" onclick="deleteEntry(this)" bp-button="delete" data-route="{{ url($crud->route.'/'.$entry->getKey()) }}" class="btn btn-sm btn-link" data-button-type="delete">
11+
<a href="javascript:void(0)"
12+
onclick="deleteEntry(this)"
13+
bp-button="delete"
14+
data-redirect-route="{{ $redirectUrl }}"
15+
data-route="{{ url($crud->route.'/'.$entry->getKey()) }}"
16+
data-table-id="{{ isset($crudTableId) ? $crudTableId : 'crudTable' }}"
17+
class="btn btn-sm btn-link"
18+
data-button-type="delete"
19+
>
320
<i class="la la-trash"></i> <span>{{ trans('backpack::crud.delete') }}</span>
421
</a>
522
@endif
@@ -11,103 +28,129 @@
1128
@bassetBlock('backpack/crud/buttons/delete-button-'.app()->getLocale().'.js')
1229
<script>
1330
14-
if (typeof deleteEntry != 'function') {
15-
$("[data-button-type=delete]").unbind('click');
31+
if (typeof deleteEntry != 'function') {
32+
$("[data-button-type=delete]").unbind('click');
1633
17-
function deleteEntry(button) {
18-
// ask for confirmation before deleting an item
19-
// e.preventDefault();
20-
var route = $(button).attr('data-route');
34+
function deleteEntry(button) {
35+
// ask for confirmation before deleting an item
36+
// e.preventDefault();
37+
var route = $(button).attr('data-route');
2138
22-
swal({
23-
title: "{!! trans('backpack::base.warning') !!}",
24-
text: "{!! trans('backpack::crud.delete_confirm') !!}",
25-
icon: "warning",
26-
buttons: {
27-
cancel: {
28-
text: "{!! trans('backpack::crud.cancel') !!}",
29-
value: null,
30-
visible: true,
31-
className: "bg-secondary",
32-
closeModal: true,
33-
},
34-
delete: {
35-
text: "{!! trans('backpack::crud.delete') !!}",
36-
value: true,
37-
visible: true,
38-
className: "bg-danger",
39-
},
40-
},
41-
dangerMode: true,
42-
}).then((value) => {
43-
if (value) {
44-
$.ajax({
45-
url: route,
46-
type: 'DELETE',
47-
success: function(result) {
48-
if (result == 1) {
49-
// Redraw the table
50-
if (typeof crud != 'undefined' && typeof crud.table != 'undefined') {
51-
// Move to previous page in case of deleting the only item in table
52-
if(crud.table.rows().count() === 1) {
53-
crud.table.page("previous");
54-
}
39+
swal({
40+
title: "{!! trans('backpack::base.warning') !!}",
41+
text: "{!! trans('backpack::crud.delete_confirm') !!}",
42+
icon: "warning",
43+
buttons: {
44+
cancel: {
45+
text: "{!! trans('backpack::crud.cancel') !!}",
46+
value: null,
47+
visible: true,
48+
className: "bg-secondary",
49+
closeModal: true,
50+
},
51+
delete: {
52+
text: "{!! trans('backpack::crud.delete') !!}",
53+
value: true,
54+
visible: true,
55+
className: "bg-danger",
56+
},
57+
},
58+
dangerMode: true,
59+
}).then((value) => {
60+
function showDeleteNotyAlert() {
61+
// Show a success notification bubble
62+
new Noty({
63+
type: "success",
64+
text: "{!! '<strong>'.trans('backpack::crud.delete_confirmation_title').'</strong><br>'.trans('backpack::crud.delete_confirmation_message') !!}"
65+
}).show();
66+
}
67+
if (value) {
68+
$.ajax({
69+
url: route,
70+
type: 'DELETE',
71+
success: function(result) {
72+
if (result == 1) {
73+
// Get the table ID from the button's data attribute
74+
let tableId = $(button).data('table-id') || 'crudTable';
75+
76+
// Check if we have a specific DataTable instance
77+
if (typeof window.crud !== 'undefined' &&
78+
typeof window.crud.tables !== 'undefined' &&
79+
window.crud.tables[tableId]) {
80+
81+
let table = window.crud.tables[tableId];
82+
83+
// Move to previous page in case of deleting the only item in table
84+
if(table.rows().count() === 1) {
85+
table.page("previous");
86+
}
87+
// Hide the modal, if any is displayed
88+
$('.dtr-modal-close').click();
5589
56-
crud.table.draw(false);
57-
}
90+
showDeleteNotyAlert();
91+
table.draw(false);
92+
} else {
93+
// there is no crud table in the current page, so we will redirect the user to the defined button redirect route in data-redirect-url
94+
let redirectRoute = $(button).data('redirect-route');
95+
if(redirectRoute){
96+
// queue the alert in localstorage to show it after the redirect
97+
localStorage.setItem('backpack_alerts', JSON.stringify({
98+
'success': [
99+
"{!! '<strong>'.trans('backpack::crud.delete_confirmation_title').'</strong><br>'.trans('backpack::crud.delete_confirmation_message') !!}"
100+
]
101+
}));
102+
window.location.href = redirectRoute;
103+
} else {
104+
// Show a success notification bubble, keep the previous behaviour of not redirecting
105+
// and keeping the entry open after deletion
106+
showDeleteNotyAlert();
107+
}
108+
}
109+
} else {
110+
// if the result is an array, it means
111+
// we have notification bubbles to show
112+
if (result instanceof Object) {
113+
// trigger one or more bubble notifications
114+
Object.entries(result).forEach(function(entry, index) {
115+
var type = entry[0];
116+
entry[1].forEach(function(message, i) {
117+
new Noty({
118+
type: type,
119+
text: message
120+
}).show();
121+
});
122+
});
123+
} else {
124+
// Show an error alert
125+
swal({
126+
title: "{!! trans('backpack::crud.delete_confirmation_not_title') !!}",
127+
text: "{!! trans('backpack::crud.delete_confirmation_not_message') !!}",
128+
icon: "error",
129+
timer: 4000,
130+
buttons: false,
131+
});
132+
}
133+
}
134+
},
135+
error: function(result) {
136+
// Show an alert with the result
137+
swal({
138+
title: "{!! trans('backpack::crud.delete_confirmation_not_title') !!}",
139+
text: "{!! trans('backpack::crud.delete_confirmation_not_message') !!}",
140+
icon: "error",
141+
timer: 4000,
142+
buttons: false,
143+
});
144+
}
145+
});
146+
}
147+
});
58148
59-
// Show a success notification bubble
60-
new Noty({
61-
type: "success",
62-
text: "{!! '<strong>'.trans('backpack::crud.delete_confirmation_title').'</strong><br>'.trans('backpack::crud.delete_confirmation_message') !!}"
63-
}).show();
64-
65-
// Hide the modal, if any
66-
$('.modal').modal('hide');
67-
} else {
68-
// if the result is an array, it means
69-
// we have notification bubbles to show
70-
if (result instanceof Object) {
71-
// trigger one or more bubble notifications
72-
Object.entries(result).forEach(function(entry, index) {
73-
var type = entry[0];
74-
entry[1].forEach(function(message, i) {
75-
new Noty({
76-
type: type,
77-
text: message
78-
}).show();
79-
});
80-
});
81-
} else {// Show an error alert
82-
swal({
83-
title: "{!! trans('backpack::crud.delete_confirmation_not_title') !!}",
84-
text: "{!! trans('backpack::crud.delete_confirmation_not_message') !!}",
85-
icon: "error",
86-
timer: 4000,
87-
buttons: false,
88-
});
89-
}
90-
}
91-
},
92-
error: function(result) {
93-
// Show an alert with the result
94-
swal({
95-
title: "{!! trans('backpack::crud.delete_confirmation_not_title') !!}",
96-
text: "{!! trans('backpack::crud.delete_confirmation_not_message') !!}",
97-
icon: "error",
98-
timer: 4000,
99-
buttons: false,
100-
});
101-
}
102-
});
103-
}
104-
});
105-
106-
}
107-
}
149+
}
150+
}
108151
109-
// make it so that the function above is run after each DataTable draw event
110-
// crud.addFunctionToDataTablesDrawEventQueue('deleteEntry');
152+
// make it so that the function above is run after each DataTable draw event
153+
// crud.addFunctionToDataTablesDrawEventQueue('deleteEntry');
111154
</script>
112155
@endBassetBlock
113156
@if (!request()->ajax()) @endpush @endif
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
@if ($crud->buttons()->where('stack', $stack)->count())
22
@foreach ($crud->buttons()->where('stack', $stack) as $button)
3-
{!! $button->getHtml($entry ?? null, $crud) !!}
3+
{!! $button->getHtml($entry ?? null, $crud, $crudTableId ?? null) !!}
44
@endforeach
55
@endif

0 commit comments

Comments
 (0)