Skip to content

Commit 4cfbb08

Browse files
committed
add delete button
1 parent b64cd1f commit 4cfbb08

File tree

8 files changed

+213
-17
lines changed

8 files changed

+213
-17
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<span class="input-group-btn">
2+
<button
3+
href="#"
4+
type="button"
5+
class="btn btn-danger {{ $field['value'] ?: 'disabled'}}"
6+
style="border-radius: 0px"
7+
data-toggle="modal"
8+
data-id="{{ $field['value'] ?? '' }}"
9+
data-target="#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_delete_modal"
10+
data-load-url="{{ $field['on_the_fly']['delete_modal'] ?? backpack_url($field['on_the_fly']['entity']).'/ajax/delete?field_name='.$field['name'].'&attribute='.($field['on_the_fly']['attribute'] ?? 'name') }}">
11+
<i class="fa fa-trash"></i>
12+
</button>
13+
</span>
14+
<div class="modal fade"
15+
id="{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_delete_modal"
16+
tabindex="-1"
17+
role="dialog"
18+
aria-labelledby="{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_delete_modal"
19+
aria-hidden="true">
20+
<div class="modal-dialog" role="document">
21+
<div class="modal-content"></div>
22+
</div>
23+
</div>
24+

resources/views/fields/inc/button-edit.blade.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<button
33
href="#"
44
type="button"
5-
class="btn btn-warning"
5+
class="btn btn-warning {{ $field['value'] ?: 'disabled'}}"
66
style="border-radius: 0px"
77
data-toggle="modal"
88
data-id="{{ $field['value'] ?? '' }}"

resources/views/fields/select2_from_ajax.blade.php

Lines changed: 39 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ class="form-control"
4545
@if ($field['on_the_fly']['edit'] ?? true)
4646
@include('webfactor::fields.inc.button-edit')
4747
@endif
48+
49+
@if ($field['on_the_fly']['delete'] ?? true)
50+
@include('webfactor::fields.inc.button-delete')
51+
@endif
4852
</div>
4953

5054
{{-- HINT --}}
@@ -93,20 +97,42 @@ class="form-control"
9397
// load create modal content
9498
$("#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_create_modal").on('show.bs.modal', function (e) {
9599
var loadurl = $(e.relatedTarget).data('load-url');
100+
96101
$(this).find('.modal-content').load(loadurl);
97102
});
98103
99-
// load edit modal content
100-
$("#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_edit_modal").on('show.bs.modal', function (e) {
101-
var loadurl = $(e.relatedTarget).data('load-url');
102-
var id = $(e.relatedTarget).data('id');
103-
$(this).find('.modal-content').load(loadurl + '&id=' + id);
104+
// load edit/delete modal content
105+
$(
106+
"#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_edit_modal," +
107+
"#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_delete_modal"
108+
).on('show.bs.modal', function (e) {
109+
var button = e.relatedTarget;
110+
111+
if ($(button).hasClass('disabled')) {
112+
e.preventDefault();
113+
e.stopImmediatePropagation();
114+
} else {
115+
var loadurl = $(button).data('load-url');
116+
var id = $(button).data('id');
117+
118+
$(this).find('.modal-content').load(loadurl + '&id=' + id);
119+
}
104120
});
105121
106-
// update id for edit modal url
122+
// update id for edit/delete modal url
107123
$("#select2_ajax_{{ $field['name'] }}").change(function (e) {
108-
$("[data-target='#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_edit_modal']")
109-
.data("id", $("#select2_ajax_{{ $field['name'] }}").select2('data')[0].id);
124+
var entry = $("#select2_ajax_{{ $field['name'] }}").select2('data')[0];
125+
var editButton = $("[data-target='#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_edit_modal']");
126+
var deleteButton = $("[data-target='#{{ $field['on_the_fly']['entity'] ?? 'ajax_entity' }}_delete_modal']");
127+
128+
if (entry) {
129+
editButton.data("id", entry.id).removeClass('disabled');
130+
deleteButton.data("id", entry.id).removeClass('disabled');
131+
} else {
132+
editButton.data("id", "").addClass('disabled');
133+
deleteButton.data("id", "").addClass('disabled');
134+
}
135+
110136
})
111137
112138
// trigger select2 for each untriggered select2 box
@@ -170,11 +196,11 @@ class="form-control"
170196
});
171197
172198
@if (isset($field['dependencies']))
173-
@foreach (array_wrap($field['dependencies']) as $dependency)
174-
$('input[name={{ $dependency }}], select[name={{ $dependency }}], checkbox[name={{ $dependency }}], radio[name={{ $dependency }}], textarea[name={{ $dependency }}]').change(function () {
175-
$("#select2_ajax_{{ $field['name'] }}").val(null).trigger("change");
176-
});
177-
@endforeach
199+
@foreach (array_wrap($field['dependencies']) as $dependency)
200+
$('input[name={{ $dependency }}], select[name={{ $dependency }}], checkbox[name={{ $dependency }}], radio[name={{ $dependency }}], textarea[name={{ $dependency }}]').change(function () {
201+
$("#select2_ajax_{{ $field['name'] }}").val(null).trigger("change");
202+
});
203+
@endforeach
178204
@endif
179205
});
180206
</script>
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
@extends('webfactor::modal.delete_layout')
2+
3+
@section('header')
4+
<h3 class="box-title">{{ trans('backpack::crud.delete') }} {{ $crud->entity_name }}</h3>
5+
@endsection
6+
7+
@section('content')
8+
<div class="row">
9+
<div class="col-md-10 col-md-offset-1">
10+
@include('crud::inc.grouped_errors')
11+
12+
{{ trans('backpack::crud.delete_confirm') }}<br><br>
13+
14+
{{ $entry->{$attribute} }}
15+
16+
</div>
17+
</div>
18+
@endsection
19+
20+
@section('footer')
21+
@include('webfactor::modal.inc.delete_form_buttons')
22+
@endsection
23+
24+
@push('crud_fields_scripts')
25+
<script>
26+
$("#delete_{{ $entity }}").submit(function (e) {
27+
28+
$.ajax({
29+
type: "DELETE",
30+
url: "/{{ ltrim($crud->route . '/ajax', '/') }}",
31+
data: { id: "{{ $id }}"},
32+
success: function (data) {
33+
new PNotify({
34+
type: "success",
35+
title: "{{ trans('backpack::base.success') }}",
36+
text: "{{ trans('backpack::crud.delete_success') }}"
37+
});
38+
39+
$("#{{ $entity }}_delete_modal").modal('hide');
40+
41+
// Clear select
42+
$("#select2_ajax_{{ $field_name }}").val(null).trigger('change');
43+
},
44+
error: function (data) {
45+
new PNotify({
46+
type: "error",
47+
title: "{{ trans('backpack::base.error') }}",
48+
text: "{{ trans('backpack::base.error') }}: " + data.responseJSON
49+
});
50+
}
51+
});
52+
53+
e.preventDefault(); // avoid to execute the actual submit of the form.
54+
});
55+
</script>
56+
57+
@endpush
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
@stack('crud_fields_styles')
2+
<form method="post" id="{{ 'delete_'.$entity }}" accept-charset="UTF-8">
3+
{{ csrf_field() }}
4+
<div class="modal-header">
5+
<button type="button" class="close" data-toggle="modal" data-target="#{{ $entity }}_delete_modal" aria-label="Close">
6+
<span aria-hidden="true">&times;</span>
7+
</button>
8+
@yield('header')
9+
</div>
10+
<div class="modal-body" id="modal-body">
11+
@yield('content')
12+
</div>
13+
14+
<div class="modal-footer">
15+
@yield('footer')
16+
</div>
17+
</form>
18+
@stack('crud_fields_scripts')
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<div id="deleteActions" class="form-group">
2+
3+
<button type="submit" class="btn btn-danger">
4+
<span class="fa fa-trash" role="presentation" aria-hidden="true"></span> &nbsp;
5+
<span data-value="delete">{{ trans('backpack::crud.delete') }}</span>
6+
</button>
7+
8+
<button class="btn btn-default" type="button" data-toggle="modal" data-target="#{{ $entity }}_delete_modal">
9+
<span class="fa fa-ban"></span> {{ trans('backpack::crud.cancel') }}
10+
</button>
11+
</div>

resources/views/modal/inc/edit_form_save_buttons.blade.php

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
<div id="saveActions" class="form-group">
22

3-
<input type="hidden" name="save_action" value="{{ $saveAction['active']['value'] }}">
4-
53
<button type="submit" class="btn btn-success">
64
<span class="fa fa-save" role="presentation" aria-hidden="true"></span> &nbsp;
75
<span data-value="save_and_back">{{ trans('backpack::crud.save') }}</span>

src/Traits/HandlesAjaxRequest.php

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ public function handleAjaxRequest(Request $request, $mode = null)
2424
return $this->ajaxEdit();
2525
}
2626

27+
if ($mode == 'delete') {
28+
return $this->ajaxDelete();
29+
}
30+
2731
if (strtolower($request->method()) == 'put') {
2832
return $this->ajaxStore($request);
2933
}
@@ -32,6 +36,10 @@ public function handleAjaxRequest(Request $request, $mode = null)
3236
return $this->ajaxUpdate($request);
3337
}
3438

39+
if (strtolower($request->method()) == 'delete') {
40+
return $this->ajaxDestroy($request->input('id'));
41+
}
42+
3543
return $this->ajaxIndex($request);
3644
}
3745

@@ -89,14 +97,33 @@ public function ajaxEdit()
8997
->with('id', request()->input('id'))
9098
->with('entity', $this->getAjaxEntity())
9199
->with('crud', $this->crud)
92-
->with('saveAction', $this->getSaveAction())
93100
->with('fields', $this->crud->getUpdateFields(request()->input('id')))
94101
->with('title', trans('backpack::crud.add') . ' ' . $this->crud->entity_name)
95102
->with('field_name', request()->input('field_name'))
96103
->with('attribute', request()->input('attribute'))
97104
->render();
98105
}
99106

107+
/**
108+
* Returns the HTML that is used for displaying the on-the-fly modal of the deleting an entity
109+
* @return string
110+
*/
111+
public function ajaxDelete()
112+
{
113+
$this->crud->hasAccessOrFail('delete');
114+
115+
return \View::make('webfactor::modal.delete')
116+
->with('action', 'delete')
117+
->with('id', request()->input('id'))
118+
->with('entry', $this->crud->model::find(request()->input('id')))
119+
->with('entity', $this->getAjaxEntity())
120+
->with('crud', $this->crud)
121+
->with('title', trans('backpack::crud.add') . ' ' . $this->crud->entity_name)
122+
->with('field_name', request()->input('field_name'))
123+
->with('attribute', request()->input('attribute'))
124+
->render();
125+
}
126+
100127
/**
101128
* Checks permission and tries to store on-the-fly entity. If you want to enable request validation,
102129
* please set your StoreRequest class by using setAjaxStoreRequest() in your EntityCrudController
@@ -149,6 +176,27 @@ public function ajaxUpdate(Request $request)
149176
return $this->ajaxRespondError();
150177
}
151178

179+
/**
180+
* Checks permission and tries to delete on-the-fly entity.
181+
*
182+
* @param int $id
183+
* @return \Illuminate\Http\JsonResponse
184+
*/
185+
public function ajaxDestroy(int $id)
186+
{
187+
if (!$this->crud->hasAccess('delete')) {
188+
return $this->ajaxRespondNoPermission();
189+
}
190+
191+
try {
192+
$this->crud->delete($id);
193+
} catch (\Exception $exception) {
194+
return response()->json($this->ajaxFormatMessage($exception), 422);
195+
}
196+
197+
return $this->ajaxRespondDeleted();
198+
}
199+
152200
/**
153201
* Validates the request and returns an error bag if it fails
154202
*
@@ -195,6 +243,16 @@ private function ajaxRespondUpdated()
195243
return response()->json([], 204);
196244
}
197245

246+
/**
247+
* Responses 204 No Content
248+
*
249+
* @return \Illuminate\Http\JsonResponse
250+
*/
251+
private function ajaxRespondDeleted()
252+
{
253+
return response()->json([], 204);
254+
}
255+
198256
/**
199257
* Responses 422 Error
200258
*
@@ -224,6 +282,10 @@ private function ajaxFormatMessage($message)
224282
return $validationErrors;
225283
}
226284

285+
if ($message instanceof \Exception) {
286+
return $message->getMessage();
287+
}
288+
227289
return $message;
228290
}
229291
}

0 commit comments

Comments
 (0)