Skip to content

Commit 0918c6e

Browse files
authored
Merge pull request #27 from webfactor/delete-button
Delete button
2 parents 511caeb + 176f1eb commit 0918c6e

File tree

11 files changed

+228
-23
lines changed

11 files changed

+228
-23
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ Updates should follow the [Keep a CHANGELOG](http://keepachangelog.com/) princip
2121
### Security
2222
- Nothing
2323

24+
## 2.1.0 - 2019-02-10
25+
26+
### Added
27+
- delete button!
28+
- edit/delete buttons will be disabled if no entry is selected
29+
2430
## 2.0.0 - 2019-02-08
2531

2632
### Added

README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
[![Quality Score][ico-code-quality]][link-code-quality]
99
[![Total Downloads][ico-downloads]][link-downloads]
1010

11-
This is a package for [Laravel Backpack](https://laravel-backpack.readme.io/docs) and provides CRUD field types which allow to create and edit a related CRUD entity on-the-fly while adding/editing another.
11+
This is a package for [Laravel Backpack](https://laravel-backpack.readme.io/docs) and provides CRUD field types which allow to create and edit a related CRUD entity on-the-fly while adding/editing/deleting another.
1212

1313
![Screenshot](https://webfactor.de/files/modal_1.png)
1414

@@ -58,9 +58,8 @@ CRUD::resource('entity', 'EntityCrudController')->with(function () {
5858
The trait/route will handle the following requests for you:
5959

6060
- search on triggered entity
61-
- retrieve the HTML for the create and edit modal
62-
- store entity from modal
63-
- update entity from modal
61+
- retrieve the HTML for the create/edit/delete modal
62+
- store/update/destroy foreign entity
6463

6564
### Available Fields
6665

@@ -69,7 +68,10 @@ There are two field types available in this package which allow you an instant c
6968
- [select2_from_ajax](https://laravel-backpack.readme.io/docs/crud-fields#section-select2_from_ajax)
7069
- [select2_from_ajax_multiple](https://laravel-backpack.readme.io/docs/crud-fields#section-select2_from_ajax_multiple)
7170

72-
For `select2_from_ajax` also "edit" is available.
71+
> **Attention:**
72+
>
73+
> Edit and delete buttons are only available for `select2_from_ajax`
74+
> Please consider your database constraints when using the delete button!
7375
7476
### Field Definition
7577

@@ -120,6 +122,7 @@ Example:
120122
121123
'create' => false
122124
'edit' => false
125+
'delete' => false
123126
'create_modal' => 'path to custom create modal'
124127
'edit_modal' => 'path to custom edit modal'
125128
'attribute' => '...' // see auto-fill below in readme

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "webfactor/laravel-backpack-instant-fields",
33
"type": "library",
4-
"description": "Instant fields to create related entities on the fly in Laravel Backpack",
4+
"description": "Instant fields to create/edit/delete related entities on the fly in Laravel Backpack",
55
"keywords": [
66
"webfactor",
77
"laravel",
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>

0 commit comments

Comments
 (0)