Skip to content

Commit 7d37484

Browse files
init
1 parent 63bfe1f commit 7d37484

File tree

2 files changed

+118
-2
lines changed

2 files changed

+118
-2
lines changed

src/resources/lang/en/crud.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
// Bulk actions
6363
'bulk_no_entries_selected_title' => 'No entries selected',
6464
'bulk_no_entries_selected_message' => 'Please select one or more items to perform a bulk action on them.',
65+
'bulk_operation_are_you_sure' => 'Are you sure you want to perform this action on these :number entries?',
6566

6667
// Bulk delete
6768
'bulk_delete_are_you_sure' => 'Are you sure you want to delete these :number entries?',

src/resources/views/crud/buttons/quick.blade.php

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,29 @@
2525
$wrapper['class'] = $wrapper['class'] ?? $defaultClass;
2626
//if ajax enabled
2727
$buttonAjaxConfiguration = $button->meta['ajax'] ?? false;
28+
$bulkConfiguration = $button->meta['bulk'] ?? false;
2829
if($buttonAjaxConfiguration) {
2930
$wrapper['data-route'] = $wrapper['href'];
3031
$wrapper['data-method'] = $button->meta['ajax']['method'] ?? 'GET';
3132
$wrapper['data-refresh-table'] = $button->meta['ajax']['refreshCrudTable'] ?? false;
3233
3334
$wrapper['href'] = 'javascript:void(0)';
34-
$wrapper['onclick'] = 'sendQuickButtonAjaxRequest(this)';
35-
$wrapper['data-button-type'] = 'quick-ajax';
35+
36+
// Check if this is a bulk button
37+
if($bulkConfiguration) {
38+
$wrapper['onclick'] = 'sendQuickBulkButtonAjaxRequest(this)';
39+
$wrapper['data-button-type'] = 'quick-bulk-ajax';
40+
$wrapper['class'] = $wrapper['class'] . ' bulk-button';
41+
42+
// Bulk-specific messages
43+
$wrapper['data-bulk-no-entries-title'] = $button->meta['bulk']['no_entries_title'] ?? trans('backpack::crud.bulk_no_entries_selected_title');
44+
$wrapper['data-bulk-no-entries-message'] = $button->meta['bulk']['no_entries_message'] ?? trans('backpack::crud.bulk_no_entries_selected_message');
45+
$wrapper['data-bulk-confirm-title'] = $button->meta['bulk']['confirm_title'] ?? trans('backpack::base.warning');
46+
$wrapper['data-bulk-confirm-message'] = $button->meta['bulk']['confirm_message'] ?? trans('backpack::crud.bulk_operation_are_you_sure');
47+
} else {
48+
$wrapper['onclick'] = 'sendQuickButtonAjaxRequest(this)';
49+
$wrapper['data-button-type'] = 'quick-ajax';
50+
}
3651
3752
//success message
3853
$wrapper['data-success-title'] = $button->meta['ajax']['success_title'] ?? trans('backpack::crud.quick_button_ajax_success_title');
@@ -117,6 +132,106 @@ function sendQuickButtonAjaxRequest(button) {
117132
});
118133
}
119134
}
135+
136+
if (typeof sendQuickBulkButtonAjaxRequest != 'function') {
137+
$("[data-button-type=quick-bulk-ajax]").unbind('click');
138+
139+
function sendQuickBulkButtonAjaxRequest(button) {
140+
// Check if items are selected
141+
if (typeof crud.checkedItems === 'undefined' || crud.checkedItems.length == 0) {
142+
let noEntriesTitle = $(button).attr('data-bulk-no-entries-title');
143+
let noEntriesMessage = $(button).attr('data-bulk-no-entries-message');
144+
145+
new Noty({
146+
type: "warning",
147+
text: `<strong>${noEntriesTitle}</strong><br/>${noEntriesMessage}`
148+
}).show();
149+
150+
return;
151+
}
152+
153+
let route = $(button).attr('data-route');
154+
let confirmTitle = $(button).attr('data-bulk-confirm-title');
155+
let confirmMessage = $(button).attr('data-bulk-confirm-message').replace(':number', crud.checkedItems.length);
156+
157+
const defaultButtonMessage = function(button, type) {
158+
let buttonTitle = button.getAttribute(`data-${type}-title`);
159+
let buttonMessage = button.getAttribute(`data-${type}-message`);
160+
return `<strong>${buttonTitle}</strong><br/>${buttonMessage}`;
161+
}
162+
163+
// Show confirmation dialog
164+
swal({
165+
title: confirmTitle,
166+
text: confirmMessage,
167+
icon: "warning",
168+
buttons: {
169+
cancel: {
170+
text: "{{ trans('backpack::crud.no') }}",
171+
value: null,
172+
visible: true,
173+
className: "bg-secondary",
174+
closeModal: true,
175+
},
176+
confirm: {
177+
text: "{{ trans('backpack::crud.yes') }}",
178+
value: true,
179+
visible: true,
180+
className: "bg-primary",
181+
}
182+
},
183+
}).then((value) => {
184+
if (value) {
185+
// Submit AJAX request with selected items
186+
$.ajax({
187+
url: route,
188+
type: $(button).attr('data-method'),
189+
data: { entries: crud.checkedItems },
190+
success: function(result) {
191+
if($(button).attr('data-refresh-table') && typeof crud != 'undefined' && typeof crud.table != 'undefined'){
192+
// Move to previous page if all items on current page were processed
193+
if(crud.table.rows().count() === crud.checkedItems.length) {
194+
crud.table.page("previous");
195+
}
196+
197+
// Clear selections and refresh table
198+
crud.checkedItems = [];
199+
crud.table.draw(false);
200+
}
201+
202+
let message;
203+
// If message is returned from the API use that message
204+
if(result.message){
205+
message = result.message;
206+
} else {
207+
message = defaultButtonMessage(button, 'success');
208+
}
209+
210+
new Noty({
211+
type: "success",
212+
text: message,
213+
}).show();
214+
},
215+
error: function(result) {
216+
let message;
217+
218+
// If message is returned from the API use that message
219+
if(result.responseJSON && result.responseJSON.message){
220+
message = result.responseJSON.message;
221+
} else {
222+
message = defaultButtonMessage(button, 'error');
223+
}
224+
225+
new Noty({
226+
type: "error",
227+
text: message,
228+
}).show();
229+
}
230+
});
231+
}
232+
});
233+
}
234+
}
120235
</script>
121236
@endBassetBlock
122237
@if (!request()->ajax()) @endpush @endif

0 commit comments

Comments
 (0)